Leaflet upgrade to 1.7.1
authorThierry Florac <tflorac@ulthar.net>
Wed, 27 Jan 2021 15:39:14 +0100
changeset 75 a430cc4ae715
parent 74 31687784fa16
child 76 f15face86bcc
Leaflet upgrade to 1.7.1
src/pyams_gis/__init__.py
src/pyams_gis/resources/css/leaflet-1.0.3.css
src/pyams_gis/resources/css/leaflet-1.0.3.min.css
src/pyams_gis/resources/css/leaflet-1.7.1.css
src/pyams_gis/resources/css/leaflet-1.7.1.min.css
src/pyams_gis/resources/css/leaflet-draw.css
src/pyams_gis/resources/css/leaflet-draw.min.css
src/pyams_gis/resources/css/leaflet-esri-geocoder.css
src/pyams_gis/resources/css/leaflet-esri-geocoder.min.css
src/pyams_gis/resources/css/leaflet-gesture-handling-1.2.1.css
src/pyams_gis/resources/css/leaflet-gesture-handling-1.2.1.min.css
src/pyams_gis/resources/css/leaflet-gp-2.1.7.css
src/pyams_gis/resources/css/leaflet-gp-2.1.7.min.css
src/pyams_gis/resources/css/leaflet-gp-3.0.2.css
src/pyams_gis/resources/css/leaflet-gp-3.0.2.min.css
src/pyams_gis/resources/css/leaflet-markercluster-1.4.1.css
src/pyams_gis/resources/css/leaflet-markercluster-1.4.1.min.css
src/pyams_gis/resources/css/leaflet-markercluster-default-1.4.1.css
src/pyams_gis/resources/css/leaflet-markercluster-default-1.4.1.min.css
src/pyams_gis/resources/img/spritesheet-2x.png
src/pyams_gis/resources/img/spritesheet.png
src/pyams_gis/resources/img/spritesheet.svg
src/pyams_gis/resources/js/Draw/Control.Draw.js
src/pyams_gis/resources/js/Draw/Control.Draw.min.js
src/pyams_gis/resources/js/Draw/Leaflet.Draw.Event.js
src/pyams_gis/resources/js/Draw/Leaflet.Draw.Event.min.js
src/pyams_gis/resources/js/Draw/Leaflet.draw.js
src/pyams_gis/resources/js/Draw/Leaflet.draw.min.js
src/pyams_gis/resources/js/Draw/Toolbar.js
src/pyams_gis/resources/js/Draw/Toolbar.min.js
src/pyams_gis/resources/js/Draw/Tooltip.js
src/pyams_gis/resources/js/Draw/Tooltip.min.js
src/pyams_gis/resources/js/Draw/copyright.js
src/pyams_gis/resources/js/Draw/copyright.min.js
src/pyams_gis/resources/js/Draw/draw/DrawToolbar.js
src/pyams_gis/resources/js/Draw/draw/DrawToolbar.min.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.Circle.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.Circle.min.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.CircleMarker.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.CircleMarker.min.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.Feature.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.Feature.min.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.Marker.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.Marker.min.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.Polygon.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.Polygon.min.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.Polyline.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.Polyline.min.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.Rectangle.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.Rectangle.min.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.SimpleShape.js
src/pyams_gis/resources/js/Draw/draw/handler/Draw.SimpleShape.min.js
src/pyams_gis/resources/js/Draw/edit/EditToolbar.js
src/pyams_gis/resources/js/Draw/edit/EditToolbar.min.js
src/pyams_gis/resources/js/Draw/edit/handler/Edit.Circle.js
src/pyams_gis/resources/js/Draw/edit/handler/Edit.Circle.min.js
src/pyams_gis/resources/js/Draw/edit/handler/Edit.CircleMarker.js
src/pyams_gis/resources/js/Draw/edit/handler/Edit.CircleMarker.min.js
src/pyams_gis/resources/js/Draw/edit/handler/Edit.Marker.js
src/pyams_gis/resources/js/Draw/edit/handler/Edit.Marker.min.js
src/pyams_gis/resources/js/Draw/edit/handler/Edit.Poly.js
src/pyams_gis/resources/js/Draw/edit/handler/Edit.Poly.min.js
src/pyams_gis/resources/js/Draw/edit/handler/Edit.Rectangle.js
src/pyams_gis/resources/js/Draw/edit/handler/Edit.Rectangle.min.js
src/pyams_gis/resources/js/Draw/edit/handler/Edit.SimpleShape.js
src/pyams_gis/resources/js/Draw/edit/handler/Edit.SimpleShape.min.js
src/pyams_gis/resources/js/Draw/edit/handler/EditToolbar.Delete.js
src/pyams_gis/resources/js/Draw/edit/handler/EditToolbar.Delete.min.js
src/pyams_gis/resources/js/Draw/edit/handler/EditToolbar.Edit.js
src/pyams_gis/resources/js/Draw/edit/handler/EditToolbar.Edit.min.js
src/pyams_gis/resources/js/Draw/ext/GeometryUtil.js
src/pyams_gis/resources/js/Draw/ext/GeometryUtil.min.js
src/pyams_gis/resources/js/Draw/ext/LatLngUtil.js
src/pyams_gis/resources/js/Draw/ext/LatLngUtil.min.js
src/pyams_gis/resources/js/Draw/ext/LineUtil.Intersect.js
src/pyams_gis/resources/js/Draw/ext/LineUtil.Intersect.min.js
src/pyams_gis/resources/js/Draw/ext/Polygon.Intersect.js
src/pyams_gis/resources/js/Draw/ext/Polygon.Intersect.min.js
src/pyams_gis/resources/js/Draw/ext/Polyline.Intersect.js
src/pyams_gis/resources/js/Draw/ext/Polyline.Intersect.min.js
src/pyams_gis/resources/js/Draw/ext/TouchEvents.js
src/pyams_gis/resources/js/Draw/ext/TouchEvents.min.js
src/pyams_gis/resources/js/Edit.Circle.js
src/pyams_gis/resources/js/Edit.Circle.min.js
src/pyams_gis/resources/js/Edit.Marker.js
src/pyams_gis/resources/js/Edit.Marker.min.js
src/pyams_gis/resources/js/Edit.Poly.js
src/pyams_gis/resources/js/Edit.Poly.min.js
src/pyams_gis/resources/js/Edit.Rectangle.js
src/pyams_gis/resources/js/Edit.Rectangle.min.js
src/pyams_gis/resources/js/Edit.SimpleShape.js
src/pyams_gis/resources/js/Edit.SimpleShape.min.js
src/pyams_gis/resources/js/TouchEvents.js
src/pyams_gis/resources/js/TouchEvents.min.js
src/pyams_gis/resources/js/leaflet-1.0.3.js
src/pyams_gis/resources/js/leaflet-1.0.3.min.js
src/pyams_gis/resources/js/leaflet-1.7.1.js
src/pyams_gis/resources/js/leaflet-1.7.1.min.js
src/pyams_gis/resources/js/leaflet-esri-2.0.8.js
src/pyams_gis/resources/js/leaflet-esri-2.0.8.min.js
src/pyams_gis/resources/js/leaflet-esri-2.5.3.js
src/pyams_gis/resources/js/leaflet-esri-2.5.3.min.js
src/pyams_gis/resources/js/leaflet-esri-cluster-2.0.0.js
src/pyams_gis/resources/js/leaflet-esri-cluster-2.0.0.min.js
src/pyams_gis/resources/js/leaflet-esri-cluster-2.1.0.js
src/pyams_gis/resources/js/leaflet-esri-cluster-2.1.0.min.js
src/pyams_gis/resources/js/leaflet-esri-geocoder-2.2.4.js
src/pyams_gis/resources/js/leaflet-esri-geocoder-2.2.4.min.js
src/pyams_gis/resources/js/leaflet-esri-geocoder-2.3.3.js
src/pyams_gis/resources/js/leaflet-esri-geocoder-2.3.3.min.js
src/pyams_gis/resources/js/leaflet-esri-gp-2.0.1.js
src/pyams_gis/resources/js/leaflet-esri-gp-2.0.1.min.js
src/pyams_gis/resources/js/leaflet-esri-gp-2.0.3.js
src/pyams_gis/resources/js/leaflet-esri-gp-2.0.3.min.js
src/pyams_gis/resources/js/leaflet-esri-renderers-2.0.2.js
src/pyams_gis/resources/js/leaflet-esri-renderers-2.0.2.min.js
src/pyams_gis/resources/js/leaflet-esri-renderers-2.1.2.js
src/pyams_gis/resources/js/leaflet-esri-renderers-2.1.2.min.js
src/pyams_gis/resources/js/leaflet-esri-vector-1.0.6.js
src/pyams_gis/resources/js/leaflet-esri-vector-1.0.6.min.js
src/pyams_gis/resources/js/leaflet-esri-vector-2.0.2.js
src/pyams_gis/resources/js/leaflet-esri-vector-2.0.2.min.js
src/pyams_gis/resources/js/leaflet-gesture-handling-1.2.1.js
src/pyams_gis/resources/js/leaflet-gesture-handling-1.2.1.min.js
src/pyams_gis/resources/js/leaflet-google-mutant.js
src/pyams_gis/resources/js/leaflet-google-mutant.min.js
src/pyams_gis/resources/js/leaflet-gp-2.1.7.js
src/pyams_gis/resources/js/leaflet-gp-2.1.7.min.js
src/pyams_gis/resources/js/leaflet-gp-3.0.2.js
src/pyams_gis/resources/js/leaflet-gp-3.0.2.min.js
src/pyams_gis/resources/js/leaflet-markercluster-1.4.1.js
src/pyams_gis/resources/js/leaflet-markercluster-1.4.1.min.js
src/pyams_gis/resources/js/leaflet.Control.Draw.js
src/pyams_gis/resources/js/leaflet.Control.Draw.min.js
src/pyams_gis/resources/js/leaflet.Draw.Event.js
src/pyams_gis/resources/js/leaflet.Draw.Event.min.js
src/pyams_gis/resources/js/leaflet.Draw.js
src/pyams_gis/resources/js/leaflet.Draw.min.js
src/pyams_gis/resources/js/leaflet.DrawToolbar.js
src/pyams_gis/resources/js/leaflet.DrawToolbar.min.js
src/pyams_gis/resources/js/pyams_gis.js
src/pyams_gis/resources/js/pyams_gis.min.js
--- a/src/pyams_gis/__init__.py	Wed Jan 27 15:38:26 2021 +0100
+++ b/src/pyams_gis/__init__.py	Wed Jan 27 15:39:14 2021 +0100
@@ -23,21 +23,21 @@
 
 library = Library('pyams_gis', 'resources')
 
-leaflet_css = Resource(library, 'css/leaflet-1.0.3.css',
-                       minified='css/leaflet-1.0.3.min.css')
+leaflet_css = Resource(library, 'css/leaflet-1.7.1.css',
+                       minified='css/leaflet-1.7.1.min.css')
 
-leaflet = Resource(library, 'js/leaflet-1.0.3.js',
-                   minified='js/leaflet-1.0.3.min.js',
+leaflet = Resource(library, 'js/leaflet-1.7.1.js',
+                   minified='js/leaflet-1.7.1.min.js',
                    depends=[leaflet_css, ],
                    bottom=True)
 
-leaflet_gp = Resource(library, 'js/leaflet-gp-3.0.2.js',
-                      minified='js/leaflet-gp-3.0.2.min.js',
+leaflet_gp = Resource(library, 'js/leaflet-gp-2.1.7.js',
+                      minified='js/leaflet-gp-2.1.7.min.js',
                       depends=[leaflet, ],
                       bottom=True)
 
-leaflet_esri = Resource(library, 'js/leaflet-esri-2.0.8.js',
-                        minified='js/leaflet-esri-2.0.8.min.js',
+leaflet_esri = Resource(library, 'js/leaflet-esri-2.5.3.js',
+                        minified='js/leaflet-esri-2.5.3.min.js',
                         depends=[leaflet, ],
                         bottom=True)
 
--- a/src/pyams_gis/resources/css/leaflet-1.0.3.css	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,624 +0,0 @@
-/* required styles */
-
-.leaflet-pane,
-.leaflet-tile,
-.leaflet-marker-icon,
-.leaflet-marker-shadow,
-.leaflet-tile-container,
-.leaflet-pane > svg,
-.leaflet-pane > canvas,
-.leaflet-zoom-box,
-.leaflet-image-layer,
-.leaflet-layer {
-	position: absolute;
-	left: 0;
-	top: 0;
-	}
-.leaflet-container {
-	overflow: hidden;
-	}
-.leaflet-tile,
-.leaflet-marker-icon,
-.leaflet-marker-shadow {
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	        user-select: none;
-	  -webkit-user-drag: none;
-	}
-/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
-.leaflet-safari .leaflet-tile {
-	image-rendering: -webkit-optimize-contrast;
-	}
-/* hack that prevents hw layers "stretching" when loading new tiles */
-.leaflet-safari .leaflet-tile-container {
-	width: 1600px;
-	height: 1600px;
-	-webkit-transform-origin: 0 0;
-	}
-.leaflet-marker-icon,
-.leaflet-marker-shadow {
-	display: block;
-	}
-/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
-/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
-.leaflet-container .leaflet-overlay-pane svg,
-.leaflet-container .leaflet-marker-pane img,
-.leaflet-container .leaflet-shadow-pane img,
-.leaflet-container .leaflet-tile-pane img,
-.leaflet-container img.leaflet-image-layer {
-	max-width: none !important;
-	}
-
-.leaflet-container.leaflet-touch-zoom {
-	-ms-touch-action: pan-x pan-y;
-	touch-action: pan-x pan-y;
-	}
-.leaflet-container.leaflet-touch-drag {
-	-ms-touch-action: pinch-zoom;
-	}
-.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
-	-ms-touch-action: none;
-	touch-action: none;
-}
-.leaflet-tile {
-	filter: inherit;
-	visibility: hidden;
-	}
-.leaflet-tile-loaded {
-	visibility: inherit;
-	}
-.leaflet-zoom-box {
-	width: 0;
-	height: 0;
-	-moz-box-sizing: border-box;
-	     box-sizing: border-box;
-	z-index: 800;
-	}
-/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
-.leaflet-overlay-pane svg {
-	-moz-user-select: none;
-	}
-
-.leaflet-pane         { z-index: 400; }
-
-.leaflet-tile-pane    { z-index: 200; }
-.leaflet-overlay-pane { z-index: 400; }
-.leaflet-shadow-pane  { z-index: 500; }
-.leaflet-marker-pane  { z-index: 600; }
-.leaflet-tooltip-pane   { z-index: 650; }
-.leaflet-popup-pane   { z-index: 700; }
-
-.leaflet-map-pane canvas { z-index: 100; }
-.leaflet-map-pane svg    { z-index: 200; }
-
-.leaflet-vml-shape {
-	width: 1px;
-	height: 1px;
-	}
-.lvml {
-	behavior: url(#default#VML);
-	display: inline-block;
-	position: absolute;
-	}
-
-
-/* control positioning */
-
-.leaflet-control {
-	position: relative;
-	z-index: 800;
-	pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
-	pointer-events: auto;
-	}
-.leaflet-top,
-.leaflet-bottom {
-	position: absolute;
-	z-index: 1000;
-	pointer-events: none;
-	}
-.leaflet-top {
-	top: 0;
-	}
-.leaflet-right {
-	right: 0;
-	}
-.leaflet-bottom {
-	bottom: 0;
-	}
-.leaflet-left {
-	left: 0;
-	}
-.leaflet-control {
-	float: left;
-	clear: both;
-	}
-.leaflet-right .leaflet-control {
-	float: right;
-	}
-.leaflet-top .leaflet-control {
-	margin-top: 10px;
-	}
-.leaflet-bottom .leaflet-control {
-	margin-bottom: 10px;
-	}
-.leaflet-left .leaflet-control {
-	margin-left: 10px;
-	}
-.leaflet-right .leaflet-control {
-	margin-right: 10px;
-	}
-
-
-/* zoom and fade animations */
-
-.leaflet-fade-anim .leaflet-tile {
-	will-change: opacity;
-	}
-.leaflet-fade-anim .leaflet-popup {
-	opacity: 0;
-	-webkit-transition: opacity 0.2s linear;
-	   -moz-transition: opacity 0.2s linear;
-	     -o-transition: opacity 0.2s linear;
-	        transition: opacity 0.2s linear;
-	}
-.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
-	opacity: 1;
-	}
-.leaflet-zoom-animated {
-	-webkit-transform-origin: 0 0;
-	    -ms-transform-origin: 0 0;
-	        transform-origin: 0 0;
-	}
-.leaflet-zoom-anim .leaflet-zoom-animated {
-	will-change: transform;
-	}
-.leaflet-zoom-anim .leaflet-zoom-animated {
-	-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
-	   -moz-transition:    -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
-	     -o-transition:      -o-transform 0.25s cubic-bezier(0,0,0.25,1);
-	        transition:         transform 0.25s cubic-bezier(0,0,0.25,1);
-	}
-.leaflet-zoom-anim .leaflet-tile,
-.leaflet-pan-anim .leaflet-tile {
-	-webkit-transition: none;
-	   -moz-transition: none;
-	     -o-transition: none;
-	        transition: none;
-	}
-
-.leaflet-zoom-anim .leaflet-zoom-hide {
-	visibility: hidden;
-	}
-
-
-/* cursors */
-
-.leaflet-interactive {
-	cursor: pointer;
-	}
-.leaflet-grab {
-	cursor: -webkit-grab;
-	cursor:    -moz-grab;
-	}
-.leaflet-crosshair,
-.leaflet-crosshair .leaflet-interactive {
-	cursor: crosshair;
-	}
-.leaflet-popup-pane,
-.leaflet-control {
-	cursor: auto;
-	}
-.leaflet-dragging .leaflet-grab,
-.leaflet-dragging .leaflet-grab .leaflet-interactive,
-.leaflet-dragging .leaflet-marker-draggable {
-	cursor: move;
-	cursor: -webkit-grabbing;
-	cursor:    -moz-grabbing;
-	}
-
-/* marker & overlays interactivity */
-.leaflet-marker-icon,
-.leaflet-marker-shadow,
-.leaflet-image-layer,
-.leaflet-pane > svg path,
-.leaflet-tile-container {
-	pointer-events: none;
-	}
-
-.leaflet-marker-icon.leaflet-interactive,
-.leaflet-image-layer.leaflet-interactive,
-.leaflet-pane > svg path.leaflet-interactive {
-	pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
-	pointer-events: auto;
-	}
-
-/* visual tweaks */
-
-.leaflet-container {
-	background: #ddd;
-	outline: 0;
-	}
-.leaflet-container a {
-	color: #0078A8;
-	}
-.leaflet-container a.leaflet-active {
-	outline: 2px solid orange;
-	}
-.leaflet-zoom-box {
-	border: 2px dotted #38f;
-	background: rgba(255,255,255,0.5);
-	}
-
-
-/* general typography */
-.leaflet-container {
-	font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
-	}
-
-
-/* general toolbar styles */
-
-.leaflet-bar {
-	box-shadow: 0 1px 5px rgba(0,0,0,0.65);
-	border-radius: 4px;
-	}
-.leaflet-bar a,
-.leaflet-bar a:hover {
-	background-color: #fff;
-	border-bottom: 1px solid #ccc;
-	width: 26px;
-	height: 26px;
-	line-height: 26px;
-	display: block;
-	text-align: center;
-	text-decoration: none;
-	color: black;
-	}
-.leaflet-bar a,
-.leaflet-control-layers-toggle {
-	background-position: 50% 50%;
-	background-repeat: no-repeat;
-	display: block;
-	}
-.leaflet-bar a:hover {
-	background-color: #f4f4f4;
-	}
-.leaflet-bar a:first-child {
-	border-top-left-radius: 4px;
-	border-top-right-radius: 4px;
-	}
-.leaflet-bar a:last-child {
-	border-bottom-left-radius: 4px;
-	border-bottom-right-radius: 4px;
-	border-bottom: none;
-	}
-.leaflet-bar a.leaflet-disabled {
-	cursor: default;
-	background-color: #f4f4f4;
-	color: #bbb;
-	}
-
-.leaflet-touch .leaflet-bar a {
-	width: 30px;
-	height: 30px;
-	line-height: 30px;
-	}
-
-
-/* zoom control */
-
-.leaflet-control-zoom-in,
-.leaflet-control-zoom-out {
-	font: bold 18px 'Lucida Console', Monaco, monospace;
-	text-indent: 1px;
-	}
-.leaflet-control-zoom-out {
-	font-size: 20px;
-	}
-
-.leaflet-touch .leaflet-control-zoom-in {
-	font-size: 22px;
-	}
-.leaflet-touch .leaflet-control-zoom-out {
-	font-size: 24px;
-	}
-
-
-/* layers control */
-
-.leaflet-control-layers {
-	box-shadow: 0 1px 5px rgba(0,0,0,0.4);
-	background: #fff;
-	border-radius: 5px;
-	}
-.leaflet-control-layers-toggle {
-	background-image: url(../img/layers.png);
-	width: 36px;
-	height: 36px;
-	}
-.leaflet-retina .leaflet-control-layers-toggle {
-	background-image: url(../img/layers-2x.png);
-	background-size: 26px 26px;
-	}
-.leaflet-touch .leaflet-control-layers-toggle {
-	width: 44px;
-	height: 44px;
-	}
-.leaflet-control-layers .leaflet-control-layers-list,
-.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
-	display: none;
-	}
-.leaflet-control-layers-expanded .leaflet-control-layers-list {
-	display: block;
-	position: relative;
-	}
-.leaflet-control-layers-expanded {
-	padding: 6px 10px 6px 6px;
-	color: #333;
-	background: #fff;
-	}
-.leaflet-control-layers-scrollbar {
-	overflow-y: scroll;
-	padding-right: 5px;
-	}
-.leaflet-control-layers-selector {
-	margin-top: 2px;
-	position: relative;
-	top: 1px;
-	}
-.leaflet-control-layers label {
-	display: block;
-	}
-.leaflet-control-layers-separator {
-	height: 0;
-	border-top: 1px solid #ddd;
-	margin: 5px -10px 5px -6px;
-	}
-
-/* Default icon URLs */
-.leaflet-default-icon-path {
-	background-image: url(../img/marker-icon.png);
-	}
-
-
-/* attribution and scale controls */
-
-.leaflet-container .leaflet-control-attribution {
-	background: #fff;
-	background: rgba(255, 255, 255, 0.7);
-	margin: 0;
-	}
-.leaflet-control-attribution,
-.leaflet-control-scale-line {
-	padding: 0 5px;
-	color: #333;
-	}
-.leaflet-control-attribution a {
-	text-decoration: none;
-	}
-.leaflet-control-attribution a:hover {
-	text-decoration: underline;
-	}
-.leaflet-container .leaflet-control-attribution,
-.leaflet-container .leaflet-control-scale {
-	font-size: 11px;
-	}
-.leaflet-left .leaflet-control-scale {
-	margin-left: 5px;
-	}
-.leaflet-bottom .leaflet-control-scale {
-	margin-bottom: 5px;
-	}
-.leaflet-control-scale-line {
-	border: 2px solid #777;
-	border-top: none;
-	line-height: 1.1;
-	padding: 2px 5px 1px;
-	font-size: 11px;
-	white-space: nowrap;
-	overflow: hidden;
-	-moz-box-sizing: border-box;
-	     box-sizing: border-box;
-
-	background: #fff;
-	background: rgba(255, 255, 255, 0.5);
-	}
-.leaflet-control-scale-line:not(:first-child) {
-	border-top: 2px solid #777;
-	border-bottom: none;
-	margin-top: -2px;
-	}
-.leaflet-control-scale-line:not(:first-child):not(:last-child) {
-	border-bottom: 2px solid #777;
-	}
-
-.leaflet-touch .leaflet-control-attribution,
-.leaflet-touch .leaflet-control-layers,
-.leaflet-touch .leaflet-bar {
-	box-shadow: none;
-	}
-.leaflet-touch .leaflet-control-layers,
-.leaflet-touch .leaflet-bar {
-	border: 2px solid rgba(0,0,0,0.2);
-	background-clip: padding-box;
-	}
-
-
-/* popup */
-
-.leaflet-popup {
-	position: absolute;
-	text-align: center;
-	margin-bottom: 20px;
-	}
-.leaflet-popup-content-wrapper {
-	padding: 1px;
-	text-align: left;
-	border-radius: 12px;
-	}
-.leaflet-popup-content {
-	margin: 13px 19px;
-	line-height: 1.4;
-	}
-.leaflet-popup-content p {
-	margin: 18px 0;
-	}
-.leaflet-popup-tip-container {
-	width: 40px;
-	height: 20px;
-	position: absolute;
-	left: 50%;
-	margin-left: -20px;
-	overflow: hidden;
-	pointer-events: none;
-	}
-.leaflet-popup-tip {
-	width: 17px;
-	height: 17px;
-	padding: 1px;
-
-	margin: -10px auto 0;
-
-	-webkit-transform: rotate(45deg);
-	   -moz-transform: rotate(45deg);
-	    -ms-transform: rotate(45deg);
-	     -o-transform: rotate(45deg);
-	        transform: rotate(45deg);
-	}
-.leaflet-popup-content-wrapper,
-.leaflet-popup-tip {
-	background: white;
-	color: #333;
-	box-shadow: 0 3px 14px rgba(0,0,0,0.4);
-	}
-.leaflet-container a.leaflet-popup-close-button {
-	position: absolute;
-	top: 0;
-	right: 0;
-	padding: 4px 4px 0 0;
-	border: none;
-	text-align: center;
-	width: 18px;
-	height: 14px;
-	font: 16px/14px Tahoma, Verdana, sans-serif;
-	color: #c3c3c3;
-	text-decoration: none;
-	font-weight: bold;
-	background: transparent;
-	}
-.leaflet-container a.leaflet-popup-close-button:hover {
-	color: #999;
-	}
-.leaflet-popup-scrolled {
-	overflow: auto;
-	border-bottom: 1px solid #ddd;
-	border-top: 1px solid #ddd;
-	}
-
-.leaflet-oldie .leaflet-popup-content-wrapper {
-	zoom: 1;
-	}
-.leaflet-oldie .leaflet-popup-tip {
-	width: 24px;
-	margin: 0 auto;
-
-	-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
-	filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
-	}
-.leaflet-oldie .leaflet-popup-tip-container {
-	margin-top: -1px;
-	}
-
-.leaflet-oldie .leaflet-control-zoom,
-.leaflet-oldie .leaflet-control-layers,
-.leaflet-oldie .leaflet-popup-content-wrapper,
-.leaflet-oldie .leaflet-popup-tip {
-	border: 1px solid #999;
-	}
-
-
-/* div icon */
-
-.leaflet-div-icon {
-	background: #fff;
-	border: 1px solid #666;
-	}
-
-
-/* Tooltip */
-/* Base styles for the element that has a tooltip */
-.leaflet-tooltip {
-	position: absolute;
-	padding: 6px;
-	background-color: #fff;
-	border: 1px solid #fff;
-	border-radius: 3px;
-	color: #222;
-	white-space: nowrap;
-	-webkit-user-select: none;
-	-moz-user-select: none;
-	-ms-user-select: none;
-	user-select: none;
-	pointer-events: none;
-	box-shadow: 0 1px 3px rgba(0,0,0,0.4);
-	}
-.leaflet-tooltip.leaflet-clickable {
-	cursor: pointer;
-	pointer-events: auto;
-	}
-.leaflet-tooltip-top:before,
-.leaflet-tooltip-bottom:before,
-.leaflet-tooltip-left:before,
-.leaflet-tooltip-right:before {
-	position: absolute;
-	pointer-events: none;
-	border: 6px solid transparent;
-	background: transparent;
-	content: "";
-	}
-
-/* Directions */
-
-.leaflet-tooltip-bottom {
-	margin-top: 6px;
-}
-.leaflet-tooltip-top {
-	margin-top: -6px;
-}
-.leaflet-tooltip-bottom:before,
-.leaflet-tooltip-top:before {
-	left: 50%;
-	margin-left: -6px;
-	}
-.leaflet-tooltip-top:before {
-	bottom: 0;
-	margin-bottom: -12px;
-	border-top-color: #fff;
-	}
-.leaflet-tooltip-bottom:before {
-	top: 0;
-	margin-top: -12px;
-	margin-left: -6px;
-	border-bottom-color: #fff;
-	}
-.leaflet-tooltip-left {
-	margin-left: -6px;
-}
-.leaflet-tooltip-right {
-	margin-left: 6px;
-}
-.leaflet-tooltip-left:before,
-.leaflet-tooltip-right:before {
-	top: 50%;
-	margin-top: -6px;
-	}
-.leaflet-tooltip-left:before {
-	right: 0;
-	margin-right: -12px;
-	border-left-color: #fff;
-	}
-.leaflet-tooltip-right:before {
-	left: 0;
-	margin-left: -12px;
-	border-right-color: #fff;
-	}
--- a/src/pyams_gis/resources/css/leaflet-1.0.3.min.css	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-.leaflet-image-layer,.leaflet-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane,.leaflet-pane>canvas,.leaflet-pane>svg,.leaflet-tile,.leaflet-tile-container,.leaflet-zoom-box{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-overlay-pane svg,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer{max-width:none!important}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-bottom,.leaflet-top{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-tile{will-change:opacity}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;-o-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.leaflet-zoom-anim .leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1);-o-transition:-o-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-pan-anim .leaflet-tile,.leaflet-zoom-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-control,.leaflet-popup-pane{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing}.leaflet-image-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-image-layer.leaflet-interactive,.leaflet-marker-icon.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline:0}.leaflet-container a{color:#0078a8}.leaflet-container a.leaflet-active{outline:2px solid orange}.leaflet-zoom-box{border:2px dotted #38f;background:rgba(255,255,255,.5)}.leaflet-container{font:12px/1.5 "Helvetica Neue",Arial,Helvetica,sans-serif}.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,.65);border-radius:4px}.leaflet-bar a,.leaflet-bar a:hover{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:bold 18px 'Lucida Console',Monaco,monospace;text-indent:1px}.leaflet-control-zoom-out{font-size:20px}.leaflet-touch .leaflet-control-zoom-in{font-size:22px}.leaflet-touch .leaflet-control-zoom-out{font-size:24px}.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAQAAAADQ4RFAAACf0lEQVR4AY1UM3gkARTePdvdoTxXKc+qTl3aU5U6b2Kbkz3Gtq3Zw6ziLGNPzrYx7946Tr6/ee/XeCQ4D3ykPtL5tHno4n0d/h3+xfuWHGLX81cn7r0iTNzjr7LrlxCqPtkbTQEHeqOrTy4Yyt3VCi/IOB0v7rVC7q45Q3Gr5K6jt+3Gl5nCoDD4MtO+j96Wu8atmhGqcNGHObuf8OM/x3AMx38+4Z2sPqzCxRFK2aF2e5Jol56XTLyggAMTL56XOMoS1W4pOyjUcGGQdZxU6qRh7B9Zp+PfpOFlqt0zyDZckPi1ttmIp03jX8gyJ8a/PG2yutpS/Vol7peZIbZcKBAEEheEIAgFbDkz5H6Zrkm2hVWGiXKiF4Ycw0RWKdtC16Q7qe3X4iOMxruonzegJzWaXFrU9utOSsLUmrc0YjeWYjCW4PDMADElpJSSQ0vQvA1Tm6/JlKnqFs1EGyZiFCqnRZTEJJJiKRYzVYzJck2Rm6P4iH+cmSY0YzimYa8l0EtTODFWhcMIMVqdsI2uiTvKmTisIDHJ3od5GILVhBCarCfVRmo4uTjkhrhzkiBV7SsaqS+TzrzM1qpGGUFt28pIySQHR6h7F6KSwGWm97ay+Z+ZqMcEjEWebE7wxCSQwpkhJqoZA5ivCdZDjJepuJ9IQjGGUmuXJdBFUygxVqVsxFsLMbDe8ZbDYVCGKxs+W080max1hFCarCfV+C1KATwcnvE9gRRuMP2prdbWGowm1KB1y+zwMMENkM755cJ2yPDtqhTI6ED1M/82yIDtC/4j4BijjeObflpO9I9MwXTCsSX8jWAFeHr05WoLTJ5G8IQVS/7vwR6ohirYM7f6HzYpogfS3R2OAAAAAElFTkSuQmCC);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAQAAABvcdNgAAAEsklEQVR4AWL4TydIhpZK1kpWOlg0w3ZXP6D2soBtG42jeI6ZmQTHzAxiTbSJsYLjO9HhP+WOmcuhciVnmHVQcJnp7DFvScowZorad/+V/fVzMdMT2g9Cv9guXGv/7pYOrXh2U+RRR3dSd9JRx6bIFc/ekqHI29JC6pJ5ZEh1yWkhkbcFeSjxgx3L2m1cb1C7bceyxA+CNjT/Ifff+/kDk2u/w/33/IeCMOSaWZ4glosqT3DNnNZQ7Cs58/3Ce5HL78iZH/vKVIaYlqzfdLu8Vi7dnvUbEza5Idt36tquZFldl6N5Z/POLof0XLK61mZCmJSWjVF9tEjUluu74IUXvgttuVIHE7YxSkaYhJZam7yiM9Pv82JYfl9nptxZaxMJE4YSPty+vF0+Y2up9d3wwijfjZbabqm/3bZ9ecKHsiGmRflnn1MW4pjHf9oLufyn2z3y1D6n8g8TZhxyzipLNPnAUpsOiuWimg52psrTZYnOWYNDTMuWBWa0tJb4rgq1UvmutpaYEbZlwU3CLJm/ayYjHW5/h7xWLn9Hh1vepDkyf7dE7MtT5LR4e7yYpHrkhOUpEfssBLq2pPhAqoSWKUkk7EDqkmK6RrCEzqDjhNDWNE+XSMvkJRDWlZTmCW0l0PHQGRZY5t1L83kT0Y3l2SItk5JAWHl2dCOBm+fPu3fo5/3v61RMCO9Jx2EEYYhb0rmNQMX/vm7gqOEJLcXTGw3CAuRNeyaPWwjR8PRqKQ1PDA/dpv+on9Shox52WFnx0KY8onHayrJzm87i5h9xGw/tfkev0jGsQizqezUKjk12hBMKJ4kbCqGPVNXudyyrShovGw5CgxsRICxF6aRmSjlBnHRzg7Gx8fKqEubI2rahQYdR1YgDIRQO7JvQyD52hoIQx0mxa0ODtW2Iozn1le2iIRdzwWewedyZzewidueOGqlsn1MvcnQpuVwLGG3/IR1hIKxCjelIDZ8ldqWz25jWAsnldEnK0Zxro19TGVb2ffIZEsIO89EIEDvKMPrzmBOQcKQ+rroye6NgRRxqR4U8EAkz0CL6uSGOm6KQCdWjvjRiSP1BPalCRS5iQYiEIvxuBMJEWgzSoHADcVMuN7IuqqTeyUPq22qFimFtxDyBBJEwNyt6TM88blFHao/6tWWhuuOM4SAK4EI4QmFHA+SEyWlp4EQoJ13cYGzMu7yszEIBOm2rVmHUNqwAIQabISNMRstmdhNWcFLsSm+0tjJH1MdRxO5Nx0WDMhCtgD6OKgZeljJqJKc9po8juskR9XN0Y1lZ3mWjLR9JCO1jRDMd0fpYC2VnvjBSEFg7wBENc0R9HFlb0xvF1+TBEpF68d+DHR6IOWVv2BECtxo46hOFUBd/APU57WIoEwJhIi2CdpyZX0m93BZicktMj1AS9dClteUFAUNUIEygRZCtik5zSxI9MubTBH1GOiHsiLJ3OCoSZkILa9PxiN0EbvhsAo8tdAf9Seepd36lGWHmtNANTv5Jd0z4QYyeo/UEJqxKRpg5LZx6btLPsOaEmdMyxYdlc8LMaJnikDlhclqmPiQnTEpLUIZEwkRagjYkEibQErwhkTAKCLQEbUgkzJQWc/0PstHHcfEdQ+UAAAAASUVORK5CYII=);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=)}.leaflet-container .leaflet-control-attribution{background:#fff;background:rgba(255,255,255,.7);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover{text-decoration:underline}.leaflet-container .leaflet-control-attribution,.leaflet-container .leaflet-control-scale{font-size:11px}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;font-size:11px;white-space:nowrap;overflow:hidden;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;background:rgba(255,255,255,.5)}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers{box-shadow:none}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-layers{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 19px;line-height:1.4}.leaflet-popup-content p{margin:18px 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px rgba(0,0,0,.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;padding:4px 4px 0 0;border:none;text-align:center;width:18px;height:14px;font:16px/14px Tahoma,Verdana,sans-serif;color:#c3c3c3;text-decoration:none;font-weight:700;background:0 0}.leaflet-container a.leaflet-popup-close-button:hover{color:#999}.leaflet-popup-scrolled{overflow:auto;border-bottom:1px solid #ddd;border-top:1px solid #ddd}.leaflet-oldie .leaflet-popup-content-wrapper{zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto}.leaflet-oldie .leaflet-popup-tip-container{margin-top:-1px}.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,.4)}.leaflet-tooltip.leaflet-clickable{cursor:pointer;pointer-events:auto}.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before,.leaflet-tooltip-top:before{position:absolute;pointer-events:none;border:6px solid transparent;background:0 0;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-1.7.1.css	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,640 @@
+/* required styles */
+
+.leaflet-pane,
+.leaflet-tile,
+.leaflet-marker-icon,
+.leaflet-marker-shadow,
+.leaflet-tile-container,
+.leaflet-pane > svg,
+.leaflet-pane > canvas,
+.leaflet-zoom-box,
+.leaflet-image-layer,
+.leaflet-layer {
+	position: absolute;
+	left: 0;
+	top: 0;
+	}
+.leaflet-container {
+	overflow: hidden;
+	}
+.leaflet-tile,
+.leaflet-marker-icon,
+.leaflet-marker-shadow {
+	-webkit-user-select: none;
+	   -moz-user-select: none;
+	        user-select: none;
+	  -webkit-user-drag: none;
+	}
+/* Prevents IE11 from highlighting tiles in blue */
+.leaflet-tile::selection {
+	background: transparent;
+}
+/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
+.leaflet-safari .leaflet-tile {
+	image-rendering: -webkit-optimize-contrast;
+	}
+/* hack that prevents hw layers "stretching" when loading new tiles */
+.leaflet-safari .leaflet-tile-container {
+	width: 1600px;
+	height: 1600px;
+	-webkit-transform-origin: 0 0;
+	}
+.leaflet-marker-icon,
+.leaflet-marker-shadow {
+	display: block;
+	}
+/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
+/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
+.leaflet-container .leaflet-overlay-pane svg,
+.leaflet-container .leaflet-marker-pane img,
+.leaflet-container .leaflet-shadow-pane img,
+.leaflet-container .leaflet-tile-pane img,
+.leaflet-container img.leaflet-image-layer,
+.leaflet-container .leaflet-tile {
+	max-width: none !important;
+	max-height: none !important;
+	}
+
+.leaflet-container.leaflet-touch-zoom {
+	-ms-touch-action: pan-x pan-y;
+	touch-action: pan-x pan-y;
+	}
+.leaflet-container.leaflet-touch-drag {
+	-ms-touch-action: pinch-zoom;
+	/* Fallback for FF which doesn't support pinch-zoom */
+	touch-action: none;
+	touch-action: pinch-zoom;
+}
+.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.leaflet-container {
+	-webkit-tap-highlight-color: transparent;
+}
+.leaflet-container a {
+	-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
+}
+.leaflet-tile {
+	filter: inherit;
+	visibility: hidden;
+	}
+.leaflet-tile-loaded {
+	visibility: inherit;
+	}
+.leaflet-zoom-box {
+	width: 0;
+	height: 0;
+	-moz-box-sizing: border-box;
+	     box-sizing: border-box;
+	z-index: 800;
+	}
+/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
+.leaflet-overlay-pane svg {
+	-moz-user-select: none;
+	}
+
+.leaflet-pane         { z-index: 400; }
+
+.leaflet-tile-pane    { z-index: 200; }
+.leaflet-overlay-pane { z-index: 400; }
+.leaflet-shadow-pane  { z-index: 500; }
+.leaflet-marker-pane  { z-index: 600; }
+.leaflet-tooltip-pane   { z-index: 650; }
+.leaflet-popup-pane   { z-index: 700; }
+
+.leaflet-map-pane canvas { z-index: 100; }
+.leaflet-map-pane svg    { z-index: 200; }
+
+.leaflet-vml-shape {
+	width: 1px;
+	height: 1px;
+	}
+.lvml {
+	behavior: url(#default#VML);
+	display: inline-block;
+	position: absolute;
+	}
+
+
+/* control positioning */
+
+.leaflet-control {
+	position: relative;
+	z-index: 800;
+	pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
+	pointer-events: auto;
+	}
+.leaflet-top,
+.leaflet-bottom {
+	position: absolute;
+	z-index: 1000;
+	pointer-events: none;
+	}
+.leaflet-top {
+	top: 0;
+	}
+.leaflet-right {
+	right: 0;
+	}
+.leaflet-bottom {
+	bottom: 0;
+	}
+.leaflet-left {
+	left: 0;
+	}
+.leaflet-control {
+	float: left;
+	clear: both;
+	}
+.leaflet-right .leaflet-control {
+	float: right;
+	}
+.leaflet-top .leaflet-control {
+	margin-top: 10px;
+	}
+.leaflet-bottom .leaflet-control {
+	margin-bottom: 10px;
+	}
+.leaflet-left .leaflet-control {
+	margin-left: 10px;
+	}
+.leaflet-right .leaflet-control {
+	margin-right: 10px;
+	}
+
+
+/* zoom and fade animations */
+
+.leaflet-fade-anim .leaflet-tile {
+	will-change: opacity;
+	}
+.leaflet-fade-anim .leaflet-popup {
+	opacity: 0;
+	-webkit-transition: opacity 0.2s linear;
+	   -moz-transition: opacity 0.2s linear;
+	        transition: opacity 0.2s linear;
+	}
+.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
+	opacity: 1;
+	}
+.leaflet-zoom-animated {
+	-webkit-transform-origin: 0 0;
+	    -ms-transform-origin: 0 0;
+	        transform-origin: 0 0;
+	}
+.leaflet-zoom-anim .leaflet-zoom-animated {
+	will-change: transform;
+	}
+.leaflet-zoom-anim .leaflet-zoom-animated {
+	-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
+	   -moz-transition:    -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
+	        transition:         transform 0.25s cubic-bezier(0,0,0.25,1);
+	}
+.leaflet-zoom-anim .leaflet-tile,
+.leaflet-pan-anim .leaflet-tile {
+	-webkit-transition: none;
+	   -moz-transition: none;
+	        transition: none;
+	}
+
+.leaflet-zoom-anim .leaflet-zoom-hide {
+	visibility: hidden;
+	}
+
+
+/* cursors */
+
+.leaflet-interactive {
+	cursor: pointer;
+	}
+.leaflet-grab {
+	cursor: -webkit-grab;
+	cursor:    -moz-grab;
+	cursor:         grab;
+	}
+.leaflet-crosshair,
+.leaflet-crosshair .leaflet-interactive {
+	cursor: crosshair;
+	}
+.leaflet-popup-pane,
+.leaflet-control {
+	cursor: auto;
+	}
+.leaflet-dragging .leaflet-grab,
+.leaflet-dragging .leaflet-grab .leaflet-interactive,
+.leaflet-dragging .leaflet-marker-draggable {
+	cursor: move;
+	cursor: -webkit-grabbing;
+	cursor:    -moz-grabbing;
+	cursor:         grabbing;
+	}
+
+/* marker & overlays interactivity */
+.leaflet-marker-icon,
+.leaflet-marker-shadow,
+.leaflet-image-layer,
+.leaflet-pane > svg path,
+.leaflet-tile-container {
+	pointer-events: none;
+	}
+
+.leaflet-marker-icon.leaflet-interactive,
+.leaflet-image-layer.leaflet-interactive,
+.leaflet-pane > svg path.leaflet-interactive,
+svg.leaflet-image-layer.leaflet-interactive path {
+	pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
+	pointer-events: auto;
+	}
+
+/* visual tweaks */
+
+.leaflet-container {
+	background: #ddd;
+	outline: 0;
+	}
+.leaflet-container a {
+	color: #0078A8;
+	}
+.leaflet-container a.leaflet-active {
+	outline: 2px solid orange;
+	}
+.leaflet-zoom-box {
+	border: 2px dotted #38f;
+	background: rgba(255,255,255,0.5);
+	}
+
+
+/* general typography */
+.leaflet-container {
+	font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
+	}
+
+
+/* general toolbar styles */
+
+.leaflet-bar {
+	box-shadow: 0 1px 5px rgba(0,0,0,0.65);
+	border-radius: 4px;
+	}
+.leaflet-bar a,
+.leaflet-bar a:hover {
+	background-color: #fff;
+	border-bottom: 1px solid #ccc;
+	width: 26px;
+	height: 26px;
+	line-height: 26px;
+	display: block;
+	text-align: center;
+	text-decoration: none;
+	color: black;
+	}
+.leaflet-bar a,
+.leaflet-control-layers-toggle {
+	background-position: 50% 50%;
+	background-repeat: no-repeat;
+	display: block;
+	}
+.leaflet-bar a:hover {
+	background-color: #f4f4f4;
+	}
+.leaflet-bar a:first-child {
+	border-top-left-radius: 4px;
+	border-top-right-radius: 4px;
+	}
+.leaflet-bar a:last-child {
+	border-bottom-left-radius: 4px;
+	border-bottom-right-radius: 4px;
+	border-bottom: none;
+	}
+.leaflet-bar a.leaflet-disabled {
+	cursor: default;
+	background-color: #f4f4f4;
+	color: #bbb;
+	}
+
+.leaflet-touch .leaflet-bar a {
+	width: 30px;
+	height: 30px;
+	line-height: 30px;
+	}
+.leaflet-touch .leaflet-bar a:first-child {
+	border-top-left-radius: 2px;
+	border-top-right-radius: 2px;
+	}
+.leaflet-touch .leaflet-bar a:last-child {
+	border-bottom-left-radius: 2px;
+	border-bottom-right-radius: 2px;
+	}
+
+/* zoom control */
+
+.leaflet-control-zoom-in,
+.leaflet-control-zoom-out {
+	font: bold 18px 'Lucida Console', Monaco, monospace;
+	text-indent: 1px;
+	}
+
+.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out  {
+	font-size: 22px;
+	}
+
+
+/* layers control */
+
+.leaflet-control-layers {
+	box-shadow: 0 1px 5px rgba(0,0,0,0.4);
+	background: #fff;
+	border-radius: 5px;
+	}
+.leaflet-control-layers-toggle {
+	background-image: url(images/layers.png);
+	width: 36px;
+	height: 36px;
+	}
+.leaflet-retina .leaflet-control-layers-toggle {
+	background-image: url(images/layers-2x.png);
+	background-size: 26px 26px;
+	}
+.leaflet-touch .leaflet-control-layers-toggle {
+	width: 44px;
+	height: 44px;
+	}
+.leaflet-control-layers .leaflet-control-layers-list,
+.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
+	display: none;
+	}
+.leaflet-control-layers-expanded .leaflet-control-layers-list {
+	display: block;
+	position: relative;
+	}
+.leaflet-control-layers-expanded {
+	padding: 6px 10px 6px 6px;
+	color: #333;
+	background: #fff;
+	}
+.leaflet-control-layers-scrollbar {
+	overflow-y: scroll;
+	overflow-x: hidden;
+	padding-right: 5px;
+	}
+.leaflet-control-layers-selector {
+	margin-top: 2px;
+	position: relative;
+	top: 1px;
+	}
+.leaflet-control-layers label {
+	display: block;
+	}
+.leaflet-control-layers-separator {
+	height: 0;
+	border-top: 1px solid #ddd;
+	margin: 5px -10px 5px -6px;
+	}
+
+/* Default icon URLs */
+.leaflet-default-icon-path {
+	background-image: url(images/marker-icon.png);
+	}
+
+
+/* attribution and scale controls */
+
+.leaflet-container .leaflet-control-attribution {
+	background: #fff;
+	background: rgba(255, 255, 255, 0.7);
+	margin: 0;
+	}
+.leaflet-control-attribution,
+.leaflet-control-scale-line {
+	padding: 0 5px;
+	color: #333;
+	}
+.leaflet-control-attribution a {
+	text-decoration: none;
+	}
+.leaflet-control-attribution a:hover {
+	text-decoration: underline;
+	}
+.leaflet-container .leaflet-control-attribution,
+.leaflet-container .leaflet-control-scale {
+	font-size: 11px;
+	}
+.leaflet-left .leaflet-control-scale {
+	margin-left: 5px;
+	}
+.leaflet-bottom .leaflet-control-scale {
+	margin-bottom: 5px;
+	}
+.leaflet-control-scale-line {
+	border: 2px solid #777;
+	border-top: none;
+	line-height: 1.1;
+	padding: 2px 5px 1px;
+	font-size: 11px;
+	white-space: nowrap;
+	overflow: hidden;
+	-moz-box-sizing: border-box;
+	     box-sizing: border-box;
+
+	background: #fff;
+	background: rgba(255, 255, 255, 0.5);
+	}
+.leaflet-control-scale-line:not(:first-child) {
+	border-top: 2px solid #777;
+	border-bottom: none;
+	margin-top: -2px;
+	}
+.leaflet-control-scale-line:not(:first-child):not(:last-child) {
+	border-bottom: 2px solid #777;
+	}
+
+.leaflet-touch .leaflet-control-attribution,
+.leaflet-touch .leaflet-control-layers,
+.leaflet-touch .leaflet-bar {
+	box-shadow: none;
+	}
+.leaflet-touch .leaflet-control-layers,
+.leaflet-touch .leaflet-bar {
+	border: 2px solid rgba(0,0,0,0.2);
+	background-clip: padding-box;
+	}
+
+
+/* popup */
+
+.leaflet-popup {
+	position: absolute;
+	text-align: center;
+	margin-bottom: 20px;
+	}
+.leaflet-popup-content-wrapper {
+	padding: 1px;
+	text-align: left;
+	border-radius: 12px;
+	}
+.leaflet-popup-content {
+	margin: 13px 19px;
+	line-height: 1.4;
+	}
+.leaflet-popup-content p {
+	margin: 18px 0;
+	}
+.leaflet-popup-tip-container {
+	width: 40px;
+	height: 20px;
+	position: absolute;
+	left: 50%;
+	margin-left: -20px;
+	overflow: hidden;
+	pointer-events: none;
+	}
+.leaflet-popup-tip {
+	width: 17px;
+	height: 17px;
+	padding: 1px;
+
+	margin: -10px auto 0;
+
+	-webkit-transform: rotate(45deg);
+	   -moz-transform: rotate(45deg);
+	    -ms-transform: rotate(45deg);
+	        transform: rotate(45deg);
+	}
+.leaflet-popup-content-wrapper,
+.leaflet-popup-tip {
+	background: white;
+	color: #333;
+	box-shadow: 0 3px 14px rgba(0,0,0,0.4);
+	}
+.leaflet-container a.leaflet-popup-close-button {
+	position: absolute;
+	top: 0;
+	right: 0;
+	padding: 4px 4px 0 0;
+	border: none;
+	text-align: center;
+	width: 18px;
+	height: 14px;
+	font: 16px/14px Tahoma, Verdana, sans-serif;
+	color: #c3c3c3;
+	text-decoration: none;
+	font-weight: bold;
+	background: transparent;
+	}
+.leaflet-container a.leaflet-popup-close-button:hover {
+	color: #999;
+	}
+.leaflet-popup-scrolled {
+	overflow: auto;
+	border-bottom: 1px solid #ddd;
+	border-top: 1px solid #ddd;
+	}
+
+.leaflet-oldie .leaflet-popup-content-wrapper {
+	-ms-zoom: 1;
+	}
+.leaflet-oldie .leaflet-popup-tip {
+	width: 24px;
+	margin: 0 auto;
+
+	-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
+	filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
+	}
+.leaflet-oldie .leaflet-popup-tip-container {
+	margin-top: -1px;
+	}
+
+.leaflet-oldie .leaflet-control-zoom,
+.leaflet-oldie .leaflet-control-layers,
+.leaflet-oldie .leaflet-popup-content-wrapper,
+.leaflet-oldie .leaflet-popup-tip {
+	border: 1px solid #999;
+	}
+
+
+/* div icon */
+
+.leaflet-div-icon {
+	background: #fff;
+	border: 1px solid #666;
+	}
+
+
+/* Tooltip */
+/* Base styles for the element that has a tooltip */
+.leaflet-tooltip {
+	position: absolute;
+	padding: 6px;
+	background-color: #fff;
+	border: 1px solid #fff;
+	border-radius: 3px;
+	color: #222;
+	white-space: nowrap;
+	-webkit-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+	pointer-events: none;
+	box-shadow: 0 1px 3px rgba(0,0,0,0.4);
+	}
+.leaflet-tooltip.leaflet-clickable {
+	cursor: pointer;
+	pointer-events: auto;
+	}
+.leaflet-tooltip-top:before,
+.leaflet-tooltip-bottom:before,
+.leaflet-tooltip-left:before,
+.leaflet-tooltip-right:before {
+	position: absolute;
+	pointer-events: none;
+	border: 6px solid transparent;
+	background: transparent;
+	content: "";
+	}
+
+/* Directions */
+
+.leaflet-tooltip-bottom {
+	margin-top: 6px;
+}
+.leaflet-tooltip-top {
+	margin-top: -6px;
+}
+.leaflet-tooltip-bottom:before,
+.leaflet-tooltip-top:before {
+	left: 50%;
+	margin-left: -6px;
+	}
+.leaflet-tooltip-top:before {
+	bottom: 0;
+	margin-bottom: -12px;
+	border-top-color: #fff;
+	}
+.leaflet-tooltip-bottom:before {
+	top: 0;
+	margin-top: -12px;
+	margin-left: -6px;
+	border-bottom-color: #fff;
+	}
+.leaflet-tooltip-left {
+	margin-left: -6px;
+}
+.leaflet-tooltip-right {
+	margin-left: 6px;
+}
+.leaflet-tooltip-left:before,
+.leaflet-tooltip-right:before {
+	top: 50%;
+	margin-top: -6px;
+	}
+.leaflet-tooltip-left:before {
+	right: 0;
+	margin-right: -12px;
+	border-left-color: #fff;
+	}
+.leaflet-tooltip-right:before {
+	left: 0;
+	margin-left: -12px;
+	border-right-color: #fff;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-1.7.1.min.css	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+.leaflet-image-layer,.leaflet-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane,.leaflet-pane>canvas,.leaflet-pane>svg,.leaflet-tile,.leaflet-tile-container,.leaflet-zoom-box{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-tile::selection{background:0 0}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-overlay-pane svg,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer{max-width:none!important;max-height:none!important}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom;touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-bottom,.leaflet-top{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-tile{will-change:opacity}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.leaflet-zoom-anim .leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-pan-anim .leaflet-tile,.leaflet-zoom-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-control,.leaflet-popup-pane{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.leaflet-image-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-image-layer.leaflet-interactive,.leaflet-marker-icon.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive,svg.leaflet-image-layer.leaflet-interactive path{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline:0}.leaflet-container a{color:#0078a8}.leaflet-container a.leaflet-active{outline:2px solid orange}.leaflet-zoom-box{border:2px dotted #38f;background:rgba(255,255,255,.5)}.leaflet-container{font:12px/1.5 "Helvetica Neue",Arial,Helvetica,sans-serif}.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,.65);border-radius:4px}.leaflet-bar a,.leaflet-bar a:hover{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:bold 18px 'Lucida Console',Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(images/layers.png);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(images/layers-2x.png);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(images/marker-icon.png)}.leaflet-container .leaflet-control-attribution{background:#fff;background:rgba(255,255,255,.7);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover{text-decoration:underline}.leaflet-container .leaflet-control-attribution,.leaflet-container .leaflet-control-scale{font-size:11px}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;font-size:11px;white-space:nowrap;overflow:hidden;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;background:rgba(255,255,255,.5)}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers{box-shadow:none}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-layers{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 19px;line-height:1.4}.leaflet-popup-content p{margin:18px 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px rgba(0,0,0,.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;padding:4px 4px 0 0;border:none;text-align:center;width:18px;height:14px;font:16px/14px Tahoma,Verdana,sans-serif;color:#c3c3c3;text-decoration:none;font-weight:700;background:0 0}.leaflet-container a.leaflet-popup-close-button:hover{color:#999}.leaflet-popup-scrolled{overflow:auto;border-bottom:1px solid #ddd;border-top:1px solid #ddd}.leaflet-oldie .leaflet-popup-content-wrapper{-ms-zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto}.leaflet-oldie .leaflet-popup-tip-container{margin-top:-1px}.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,.4)}.leaflet-tooltip.leaflet-clickable{cursor:pointer;pointer-events:auto}.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before,.leaflet-tooltip-top:before{position:absolute;pointer-events:none;border:6px solid transparent;background:0 0;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}
--- a/src/pyams_gis/resources/css/leaflet-draw.css	Wed Jan 27 15:38:26 2021 +0100
+++ b/src/pyams_gis/resources/css/leaflet-draw.css	Wed Jan 27 15:39:14 2021 +0100
@@ -3,53 +3,53 @@
 /* ================================================================== */
 
 .leaflet-draw-section {
-    position: relative;
+	position: relative;
 }
 
 .leaflet-draw-toolbar {
-    margin-top: 12px;
+	margin-top: 12px;
 }
 
 .leaflet-draw-toolbar-top {
-    margin-top: 0;
+	margin-top: 0;
 }
 
 .leaflet-draw-toolbar-notop a:first-child {
-    border-top-right-radius: 0;
+	border-top-right-radius: 0;
 }
 
 .leaflet-draw-toolbar-nobottom a:last-child {
-    border-bottom-right-radius: 0;
+	border-bottom-right-radius: 0;
 }
 
 .leaflet-draw-toolbar a {
-    background-image: url('images/spritesheet.png');
-    background-image: linear-gradient(transparent, transparent), url('images/spritesheet.svg');
-    background-repeat: no-repeat;
-    background-size: 270px 30px;
-    background-clip: padding-box;
+	background-image: url('../img/spritesheet.png');
+	background-image: linear-gradient(transparent, transparent), url('../img/spritesheet.svg');
+	background-repeat: no-repeat;
+	background-size: 300px 30px;
+	background-clip: padding-box;
 }
 
 .leaflet-retina .leaflet-draw-toolbar a {
-    background-image: url('images/spritesheet-2x.png');
-    background-image: linear-gradient(transparent, transparent), url('images/spritesheet.svg');
+	background-image: url('../img/spritesheet-2x.png');
+	background-image: linear-gradient(transparent, transparent), url('../img/spritesheet.svg');
 }
 
 .leaflet-draw a {
-    display: block;
-    text-align: center;
-    text-decoration: none;
+	display: block;
+	text-align: center;
+	text-decoration: none;
 }
 
 .leaflet-draw a .sr-only {
-  position: absolute;
-  width: 1px;
-  height: 1px;
-  padding: 0;
-  margin: -1px;
-  overflow: hidden;
-  clip: rect(0,0,0,0);
-  border: 0;
+	position: absolute;
+	width: 1px;
+	height: 1px;
+	padding: 0;
+	margin: -1px;
+	overflow: hidden;
+	clip: rect(0, 0, 0, 0);
+	border: 0;
 }
 
 /* ================================================================== */
@@ -57,92 +57,92 @@
 /* ================================================================== */
 
 .leaflet-draw-actions {
-    display: none;
-    list-style: none;
-    margin: 0;
-    padding: 0;
-    position: absolute;
-    left: 26px; /* leaflet-draw-toolbar.left + leaflet-draw-toolbar.width */
-    top: 0;
-    white-space: nowrap;
+	display: none;
+	list-style: none;
+	margin: 0;
+	padding: 0;
+	position: absolute;
+	left: 26px; /* leaflet-draw-toolbar.left + leaflet-draw-toolbar.width */
+	top: 0;
+	white-space: nowrap;
 }
 
 .leaflet-touch .leaflet-draw-actions {
-    left: 32px;
+	left: 32px;
 }
 
 .leaflet-right .leaflet-draw-actions {
-    right: 26px;
-    left: auto;
+	right: 26px;
+	left: auto;
 }
 
 .leaflet-touch .leaflet-right .leaflet-draw-actions {
-    right: 32px;
-    left: auto;
+	right: 32px;
+	left: auto;
 }
 
 .leaflet-draw-actions li {
-    display: inline-block;
+	display: inline-block;
 }
 
 .leaflet-draw-actions li:first-child a {
-    border-left: none;
+	border-left: none;
 }
 
 .leaflet-draw-actions li:last-child a {
-    -webkit-border-radius: 0 4px 4px 0;
-    border-radius: 0 4px 4px 0;
+	-webkit-border-radius: 0 4px 4px 0;
+	border-radius: 0 4px 4px 0;
 }
 
 .leaflet-right .leaflet-draw-actions li:last-child a {
-    -webkit-border-radius: 0;
-    border-radius: 0;
+	-webkit-border-radius: 0;
+	border-radius: 0;
 }
 
 .leaflet-right .leaflet-draw-actions li:first-child a {
-    -webkit-border-radius: 4px 0 0 4px;
-    border-radius: 4px 0 0 4px;
+	-webkit-border-radius: 4px 0 0 4px;
+	border-radius: 4px 0 0 4px;
 }
 
 .leaflet-draw-actions a {
-    background-color: #919187;
-    border-left: 1px solid #AAA;
-    color: #FFF;
-    font: 11px/19px "Helvetica Neue", Arial, Helvetica, sans-serif;
-    line-height: 28px;
-    text-decoration: none;
-    padding-left: 10px;
-    padding-right: 10px;
-    height: 28px;
+	background-color: #919187;
+	border-left: 1px solid #AAA;
+	color: #FFF;
+	font: 11px/19px "Helvetica Neue", Arial, Helvetica, sans-serif;
+	line-height: 28px;
+	text-decoration: none;
+	padding-left: 10px;
+	padding-right: 10px;
+	height: 28px;
 }
 
 .leaflet-touch .leaflet-draw-actions a {
-    font-size: 12px;
-    line-height: 30px;
-    height: 30px;
+	font-size: 12px;
+	line-height: 30px;
+	height: 30px;
 }
 
 .leaflet-draw-actions-bottom {
-    margin-top: 0;
+	margin-top: 0;
 }
 
 .leaflet-draw-actions-top {
-    margin-top: 1px;
+	margin-top: 1px;
 }
 
 .leaflet-draw-actions-top a,
 .leaflet-draw-actions-bottom a {
-    height: 27px;
-    line-height: 27px;
+	height: 27px;
+	line-height: 27px;
 }
 
 .leaflet-draw-actions a:hover {
-    background-color: #A0A098;
+	background-color: #A0A098;
 }
 
 .leaflet-draw-actions-top.leaflet-draw-actions-bottom a {
-    height: 26px;
-    line-height: 26px;
+	height: 26px;
+	line-height: 26px;
 }
 
 /* ================================================================== */
@@ -150,43 +150,51 @@
 /* ================================================================== */
 
 .leaflet-draw-toolbar .leaflet-draw-draw-polyline {
-    background-position: -2px -2px;
+	background-position: -2px -2px;
 }
 
 .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline {
-    background-position: 0 -1px;
+	background-position: 0 -1px;
 }
 
 .leaflet-draw-toolbar .leaflet-draw-draw-polygon {
-    background-position: -31px -2px;
+	background-position: -31px -2px;
 }
 
 .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon {
-    background-position: -29px -1px;
+	background-position: -29px -1px;
 }
 
 .leaflet-draw-toolbar .leaflet-draw-draw-rectangle {
-    background-position: -62px -2px;
+	background-position: -62px -2px;
 }
 
 .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle {
-    background-position: -60px -1px;
+	background-position: -60px -1px;
 }
 
 .leaflet-draw-toolbar .leaflet-draw-draw-circle {
-    background-position: -92px -2px;
+	background-position: -92px -2px;
 }
 
 .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle {
-    background-position: -90px -1px;
+	background-position: -90px -1px;
 }
 
 .leaflet-draw-toolbar .leaflet-draw-draw-marker {
-    background-position: -122px -2px;
+	background-position: -122px -2px;
 }
 
 .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker {
-    background-position: -120px -1px;
+	background-position: -120px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-draw-circlemarker {
+	background-position: -273px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circlemarker {
+	background-position: -271px -1px;
 }
 
 /* ================================================================== */
@@ -194,35 +202,35 @@
 /* ================================================================== */
 
 .leaflet-draw-toolbar .leaflet-draw-edit-edit {
-    background-position: -152px -2px;
+	background-position: -152px -2px;
 }
 
 .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit {
-    background-position: -150px -1px;
+	background-position: -150px -1px;
 }
 
 .leaflet-draw-toolbar .leaflet-draw-edit-remove {
-    background-position: -182px -2px;
+	background-position: -182px -2px;
 }
 
 .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove {
-    background-position: -180px -1px;
+	background-position: -180px -1px;
 }
 
 .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled {
-    background-position: -212px -2px;
+	background-position: -212px -2px;
 }
 
 .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled {
-    background-position: -210px -1px;
+	background-position: -210px -1px;
 }
 
 .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled {
-    background-position: -242px -2px;
+	background-position: -242px -2px;
 }
 
 .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled {
-    background-position: -240px -2px;
+	background-position: -240px -2px;
 }
 
 /* ================================================================== */
@@ -230,62 +238,62 @@
 /* ================================================================== */
 
 .leaflet-mouse-marker {
-    background-color: #fff;
-    cursor: crosshair;
+	background-color: #fff;
+	cursor: crosshair;
 }
 
 .leaflet-draw-tooltip {
-    background: rgb(54, 54, 54);
-    background: rgba(0, 0, 0, 0.5);
-    border: 1px solid transparent;
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-    color: #fff;
-    font: 12px/18px "Helvetica Neue", Arial, Helvetica, sans-serif;
-    margin-left: 20px;
-    margin-top: -21px;
-    padding: 4px 8px;
-    position: absolute;
-    visibility: hidden;
-    white-space: nowrap;
-    z-index: 6;
+	background: rgb(54, 54, 54);
+	background: rgba(0, 0, 0, 0.5);
+	border: 1px solid transparent;
+	-webkit-border-radius: 4px;
+	border-radius: 4px;
+	color: #fff;
+	font: 12px/18px "Helvetica Neue", Arial, Helvetica, sans-serif;
+	margin-left: 20px;
+	margin-top: -21px;
+	padding: 4px 8px;
+	position: absolute;
+	visibility: hidden;
+	white-space: nowrap;
+	z-index: 6;
 }
 
 .leaflet-draw-tooltip:before {
-    border-right: 6px solid black;
-    border-right-color: rgba(0, 0, 0, 0.5);
-    border-top: 6px solid transparent;
-    border-bottom: 6px solid transparent;
-    content: "";
-    position: absolute;
-    top: 7px;
-    left: -7px;
+	border-right: 6px solid black;
+	border-right-color: rgba(0, 0, 0, 0.5);
+	border-top: 6px solid transparent;
+	border-bottom: 6px solid transparent;
+	content: "";
+	position: absolute;
+	top: 7px;
+	left: -7px;
 }
 
 .leaflet-error-draw-tooltip {
-    background-color: #F2DEDE;
-    border: 1px solid #E6B6BD;
-    color: #B94A48;
+	background-color: #F2DEDE;
+	border: 1px solid #E6B6BD;
+	color: #B94A48;
 }
 
 .leaflet-error-draw-tooltip:before {
-    border-right-color: #E6B6BD;
+	border-right-color: #E6B6BD;
 }
 
 .leaflet-draw-tooltip-single {
-    margin-top: -12px
+	margin-top: -12px
 }
 
 .leaflet-draw-tooltip-subtext {
-    color: #f8d5e4;
+	color: #f8d5e4;
 }
 
 .leaflet-draw-guide-dash {
-    font-size: 1%;
-    opacity: 0.6;
-    position: absolute;
-    width: 5px;
-    height: 5px;
+	font-size: 1%;
+	opacity: 0.6;
+	position: absolute;
+	width: 5px;
+	height: 5px;
 }
 
 /* ================================================================== */
@@ -293,19 +301,19 @@
 /* ================================================================== */
 
 .leaflet-edit-marker-selected {
-    background-color: rgba(254, 87, 161, 0.1);
-    border: 4px dashed rgba(254, 87, 161, 0.6);
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-    box-sizing: content-box;
+	background-color: rgba(254, 87, 161, 0.1);
+	border: 4px dashed rgba(254, 87, 161, 0.6);
+	-webkit-border-radius: 4px;
+	border-radius: 4px;
+	box-sizing: content-box;
 }
 
 .leaflet-edit-move {
-    cursor: move;
+	cursor: move;
 }
 
 .leaflet-edit-resize {
-    cursor: pointer;
+	cursor: pointer;
 }
 
 /* ================================================================== */
@@ -313,5 +321,5 @@
 /* ================================================================== */
 
 .leaflet-oldie .leaflet-draw-toolbar {
-    border: 1px solid #999;
-}
\ No newline at end of file
+	border: 1px solid #999;
+}
--- a/src/pyams_gis/resources/css/leaflet-draw.min.css	Wed Jan 27 15:38:26 2021 +0100
+++ b/src/pyams_gis/resources/css/leaflet-draw.min.css	Wed Jan 27 15:39:14 2021 +0100
@@ -1,1 +1,1 @@
-.leaflet-draw-section{position:relative}.leaflet-draw-toolbar{margin-top:12px}.leaflet-draw-toolbar-top{margin-top:0}.leaflet-draw-toolbar-notop a:first-child{border-top-right-radius:0}.leaflet-draw-toolbar-nobottom a:last-child{border-bottom-right-radius:0}.leaflet-draw-toolbar a{background-image:url('images/spritesheet.png');background-image:linear-gradient(transparent,transparent),url('images/spritesheet.svg');background-repeat:no-repeat;background-size:270px 30px;background-clip:padding-box}.leaflet-retina .leaflet-draw-toolbar a{background-image:url('images/spritesheet-2x.png');background-image:linear-gradient(transparent,transparent),url('images/spritesheet.svg')}.leaflet-draw a{display:block;text-align:center;text-decoration:none}.leaflet-draw a .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.leaflet-draw-actions{display:none;list-style:none;margin:0;padding:0;position:absolute;left:26px;top:0;white-space:nowrap}.leaflet-touch .leaflet-draw-actions{left:32px}.leaflet-right .leaflet-draw-actions{right:26px;left:auto}.leaflet-touch .leaflet-right .leaflet-draw-actions{right:32px;left:auto}.leaflet-draw-actions li{display:inline-block}.leaflet-draw-actions li:first-child a{border-left:none}.leaflet-draw-actions li:last-child a{-webkit-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.leaflet-right .leaflet-draw-actions li:last-child a{-webkit-border-radius:0;border-radius:0}.leaflet-right .leaflet-draw-actions li:first-child a{-webkit-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.leaflet-draw-actions a{background-color:#919187;border-left:1px solid #AAA;color:#FFF;font:11px/19px "Helvetica Neue",Arial,Helvetica,sans-serif;line-height:28px;text-decoration:none;padding-left:10px;padding-right:10px;height:28px}.leaflet-touch .leaflet-draw-actions a{font-size:12px;line-height:30px;height:30px}.leaflet-draw-actions-bottom{margin-top:0}.leaflet-draw-actions-top{margin-top:1px}.leaflet-draw-actions-top a,.leaflet-draw-actions-bottom a{height:27px;line-height:27px}.leaflet-draw-actions a:hover{background-color:#a0a098}.leaflet-draw-actions-top.leaflet-draw-actions-bottom a{height:26px;line-height:26px}.leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:-2px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:0 -1px}.leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-31px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-29px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-62px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-60px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-92px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-90px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-122px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-120px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-152px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-150px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-182px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-180px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-212px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-210px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-242px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-240px -2px}.leaflet-mouse-marker{background-color:#fff;cursor:crosshair}.leaflet-draw-tooltip{background:#363636;background:rgba(0,0,0,0.5);border:1px solid transparent;-webkit-border-radius:4px;border-radius:4px;color:#fff;font:12px/18px "Helvetica Neue",Arial,Helvetica,sans-serif;margin-left:20px;margin-top:-21px;padding:4px 8px;position:absolute;visibility:hidden;white-space:nowrap;z-index:6}.leaflet-draw-tooltip:before{border-right:6px solid black;border-right-color:rgba(0,0,0,0.5);border-top:6px solid transparent;border-bottom:6px solid transparent;content:"";position:absolute;top:7px;left:-7px}.leaflet-error-draw-tooltip{background-color:#f2dede;border:1px solid #e6b6bd;color:#b94a48}.leaflet-error-draw-tooltip:before{border-right-color:#e6b6bd}.leaflet-draw-tooltip-single{margin-top:-12px}.leaflet-draw-tooltip-subtext{color:#f8d5e4}.leaflet-draw-guide-dash{font-size:1%;opacity:.6;position:absolute;width:5px;height:5px}.leaflet-edit-marker-selected{background-color:rgba(254,87,161,0.1);border:4px dashed rgba(254,87,161,0.6);-webkit-border-radius:4px;border-radius:4px;box-sizing:content-box}.leaflet-edit-move{cursor:move}.leaflet-edit-resize{cursor:pointer}.leaflet-oldie .leaflet-draw-toolbar{border:1px solid #999}
\ No newline at end of file
+.leaflet-draw-section{position:relative}.leaflet-draw-toolbar{margin-top:12px}.leaflet-draw-toolbar-top{margin-top:0}.leaflet-draw-toolbar-notop a:first-child{border-top-right-radius:0}.leaflet-draw-toolbar-nobottom a:last-child{border-bottom-right-radius:0}.leaflet-draw-toolbar a{background-image:url(data:image/png;base64,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);background-image:linear-gradient(transparent,transparent),url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKCXhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKCXhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCgl4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCgl4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCgl4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKCXhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKCXhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgoJdmlld0JveD0iMCAwIDYwMCA2MCIKCWhlaWdodD0iNjAiCgl3aWR0aD0iNjAwIgoJaWQ9InN2ZzQyMjUiCgl2ZXJzaW9uPSIxLjEiCglpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxIHIxMzcyNSIKCXNvZGlwb2RpOmRvY25hbWU9InNwcml0ZXNoZWV0LnN2ZyIKCWlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvZnB1Z2EvZGV2ZWxvcG1lbnQvdXBzdHJlYW0vaWNhcnRvLkxlYWZsZXQuZHJhdy9zcmMvaW1hZ2VzL3Nwcml0ZXNoZWV0LTJ4LnBuZyIKCWlua3NjYXBlOmV4cG9ydC14ZHBpPSI5MCIKCWlua3NjYXBlOmV4cG9ydC15ZHBpPSI5MCI+Cgk8bWV0YWRhdGEKCQlpZD0ibWV0YWRhdGE0MjU4Ij4KCQk8cmRmOlJERj4KCQkJPGNjOldvcmsKCQkJCXJkZjphYm91dD0iIj4KCQkJCTxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgoJCQkJPGRjOnR5cGUKCQkJCQlyZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+CgkJCQk8ZGM6dGl0bGUvPgoJCQk8L2NjOldvcms+CgkJPC9yZGY6UkRGPgoJPC9tZXRhZGF0YT4KCTxkZWZzCgkJaWQ9ImRlZnM0MjU2Ii8+Cgk8c29kaXBvZGk6bmFtZWR2aWV3CgkJcGFnZWNvbG9yPSIjZmZmZmZmIgoJCWJvcmRlcmNvbG9yPSIjNjY2NjY2IgoJCWJvcmRlcm9wYWNpdHk9IjEiCgkJb2JqZWN0dG9sZXJhbmNlPSIxMCIKCQlncmlkdG9sZXJhbmNlPSIxMCIKCQlndWlkZXRvbGVyYW5jZT0iMTAiCgkJaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCgkJaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKCQlpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCgkJaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTA1NiIKCQlpZD0ibmFtZWR2aWV3NDI1NCIKCQlzaG93Z3JpZD0iZmFsc2UiCgkJaW5rc2NhcGU6em9vbT0iMS4zMTAxODUyIgoJCWlua3NjYXBlOmN4PSIyMzcuNTY5MjgiCgkJaW5rc2NhcGU6Y3k9IjcuMjQxOTYyMSIKCQlpbmtzY2FwZTp3aW5kb3cteD0iMTkyMCIKCQlpbmtzY2FwZTp3aW5kb3cteT0iMjQiCgkJaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKCQlpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmc0MjI1Ii8+Cgk8ZwoJCWlkPSJlbmFibGVkIgoJCXN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiPgoJCTxnCgkJCWlkPSJwb2x5bGluZSIKCQkJc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSI+CgkJCTxwYXRoCgkJCQlkPSJtIDE4LDM2IDAsNiA2LDAgMCwtNiAtNiwwIHogbSA0LDQgLTIsMCAwLC0yIDIsMCAwLDIgeiIKCQkJCWlkPSJwYXRoNDIyOSIKCQkJCWlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCgkJCQlzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIi8+CgkJCTxwYXRoCgkJCQlkPSJtIDM2LDE4IDAsNiA2LDAgMCwtNiAtNiwwIHogbSA0LDQgLTIsMCAwLC0yIDIsMCAwLDIgeiIKCQkJCWlkPSJwYXRoNDIzMSIKCQkJCWlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCgkJCQlzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIi8+CgkJCTxwYXRoCgkJCQlkPSJtIDIzLjE0MiwzOS4xNDUgLTIuMjg1LC0yLjI5IDE2LC0xNS45OTggMi4yODUsMi4yODUgeiIKCQkJCWlkPSJwYXRoNDIzMyIKCQkJCWlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCgkJCQlzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIi8+CgkJPC9nPgoJCTxwYXRoCgkJCWlkPSJwb2x5Z29uIgoJCQlkPSJNIDEwMCwyNC41NjUgOTcuOTA0LDM5LjM5NSA4My4wNyw0MiA3NiwyOC43NzMgODYuNDYzLDE4IFoiCgkJCWlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCgkJCXN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiLz4KCQk8cGF0aAoJCQlpZD0icmVjdGFuZ2xlIgoJCQlkPSJtIDE0MCwyMCAyMCwwIDAsMjAgLTIwLDAgeiIKCQkJaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKCQkJc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIvPgoJCTxwYXRoCgkJCWlkPSJjaXJjbGUiCgkJCWQ9Im0gMjIxLDMwIGMgMCw2LjA3OCAtNC45MjYsMTEgLTExLDExIC02LjA3NCwwIC0xMSwtNC45MjIgLTExLC0xMSAwLC02LjA3NCA0LjkyNiwtMTEgMTEsLTExIDYuMDc0LDAgMTEsNC45MjYgMTEsMTEgeiIKCQkJaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKCQkJc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIvPgoJCTxwYXRoCgkJCWlkPSJtYXJrZXIiCgkJCWQ9Im0gMjcwLDE5IGMgLTQuOTcxLDAgLTksNC4wMjkgLTksOSAwLDQuOTcxIDUuMDAxLDEyIDksMTQgNC4wMDEsLTIgOSwtOS4wMjkgOSwtMTQgMCwtNC45NzEgLTQuMDI5LC05IC05LC05IHogbSAwLDEyLjUgYyAtMi40ODQsMCAtNC41LC0yLjAxNCAtNC41LC00LjUgMCwtMi40ODQgMi4wMTYsLTQuNSA0LjUsLTQuNSAyLjQ4NSwwIDQuNSwyLjAxNiA0LjUsNC41IDAsMi40ODYgLTIuMDE1LDQuNSAtNC41LDQuNSB6IgoJCQlpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgoJCQlzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIi8+CgkJPGcKCQkJaWQ9ImVkaXQiCgkJCXN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiPgoJCQk8cGF0aAoJCQkJZD0ibSAzMzcsMzAuMTU2IDAsMC40MDcgMCw1LjYwNCBjIDAsMS42NTggLTEuMzQ0LDMgLTMsMyBsIC0xMCwwIGMgLTEuNjU1LDAgLTMsLTEuMzQyIC0zLC0zIGwgMCwtMTAgYyAwLC0xLjY1NyAxLjM0NSwtMyAzLC0zIGwgNi4zNDUsMCAzLjE5LC0zLjE3IC05LjUzNSwwIGMgLTMuMzEzLDAgLTYsMi42ODcgLTYsNiBsIDAsMTAgYyAwLDMuMzEzIDIuNjg3LDYgNiw2IGwgMTAsMCBjIDMuMzE0LDAgNiwtMi42ODcgNiwtNiBsIDAsLTguODA5IC0zLDIuOTY4IgoJCQkJaWQ9InBhdGg0MjQwIgoJCQkJaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKCQkJCXN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiLz4KCQkJPHBhdGgKCQkJCWQ9Im0gMzM4LjcyLDI0LjYzNyAtOC44OTIsOC44OTIgLTIuODI4LDAgMCwtMi44MjkgOC44OSwtOC44OSB6IgoJCQkJaWQ9InBhdGg0MjQyIgoJCQkJaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKCQkJCXN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiLz4KCQkJPHBhdGgKCQkJCWQ9Im0gMzM4LjY5NywxNy44MjYgNCwwIDAsNCAtNCwwIHoiCgkJCQl0cmFuc2Zvcm09Im1hdHJpeCgtMC43MDY5ODMzNiwtMC43MDcyMzAxOCwwLjcwNzIzMDE4LC0wLjcwNjk4MzM2LDU2Ny41NTkxNywyNzQuNzgyNzMpIgoJCQkJaWQ9InBhdGg0MjQ0IgoJCQkJaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKCQkJCXN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiLz4KCQk8L2c+CgkJPGcKCQkJaWQ9InJlbW92ZSIKCQkJc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSI+CgkJCTxwYXRoCgkJCQlkPSJtIDM4MSw0MiAxOCwwIDAsLTE4IC0xOCwwIDAsMTggeiBtIDE0LC0xNiAyLDAgMCwxNCAtMiwwIDAsLTE0IHogbSAtNCwwIDIsMCAwLDE0IC0yLDAgMCwtMTQgeiBtIC00LDAgMiwwIDAsMTQgLTIsMCAwLC0xNCB6IG0gLTQsMCAyLDAgMCwxNCAtMiwwIDAsLTE0IHoiCgkJCQlpZD0icGF0aDQyNDciCgkJCQlpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgoJCQkJc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIvPgoJCQk8cGF0aAoJCQkJZD0ibSAzOTUsMjAgMCwtNCAtMTAsMCAwLDQgLTYsMCAwLDIgMjIsMCAwLC0yIC02LDAgeiBtIC0yLDAgLTYsMCAwLC0yIDYsMCAwLDIgeiIKCQkJCWlkPSJwYXRoNDI0OSIKCQkJCWlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCgkJCQlzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIi8+CgkJPC9nPgoJPC9nPgoJPGcKCQlpZD0iZGlzYWJsZWQiCgkJdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIwLDApIgoJCXN0eWxlPSJmaWxsOiNiYmJiYmIiPgoJCTx1c2UKCQkJeGxpbms6aHJlZj0iI2VkaXQiCgkJCWlkPSJlZGl0LWRpc2FibGVkIgoJCQl4PSIwIgoJCQl5PSIwIgoJCQl3aWR0aD0iMTAwJSIKCQkJaGVpZ2h0PSIxMDAlIi8+CgkJPHVzZQoJCQl4bGluazpocmVmPSIjcmVtb3ZlIgoJCQlpZD0icmVtb3ZlLWRpc2FibGVkIgoJCQl4PSIwIgoJCQl5PSIwIgoJCQl3aWR0aD0iMTAwJSIKCQkJaGVpZ2h0PSIxMDAlIi8+Cgk8L2c+Cgk8cGF0aAoJCXN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0NjQ2NDY7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKCQlpZD0iY2lyY2xlLTMiCgkJZD0ibSA1ODEuNjU3MjUsMzAgYyAwLDYuMDc4IC00LjkyNiwxMSAtMTEsMTEgLTYuMDc0LDAgLTExLC00LjkyMiAtMTEsLTExIDAsLTYuMDc0IDQuOTI2LC0xMSAxMSwtMTEgNi4wNzQsMCAxMSw0LjkyNiAxMSwxMSB6IgoJCWlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiLz4KPC9zdmc+Cg==);background-repeat:no-repeat;background-size:300px 30px;background-clip:padding-box}.leaflet-retina .leaflet-draw-toolbar a{background-image:url(data:image/png;base64,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);background-image:linear-gradient(transparent,transparent),url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKCXhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKCXhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCgl4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCgl4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCgl4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKCXhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKCXhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgoJdmlld0JveD0iMCAwIDYwMCA2MCIKCWhlaWdodD0iNjAiCgl3aWR0aD0iNjAwIgoJaWQ9InN2ZzQyMjUiCgl2ZXJzaW9uPSIxLjEiCglpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxIHIxMzcyNSIKCXNvZGlwb2RpOmRvY25hbWU9InNwcml0ZXNoZWV0LnN2ZyIKCWlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvZnB1Z2EvZGV2ZWxvcG1lbnQvdXBzdHJlYW0vaWNhcnRvLkxlYWZsZXQuZHJhdy9zcmMvaW1hZ2VzL3Nwcml0ZXNoZWV0LTJ4LnBuZyIKCWlua3NjYXBlOmV4cG9ydC14ZHBpPSI5MCIKCWlua3NjYXBlOmV4cG9ydC15ZHBpPSI5MCI+Cgk8bWV0YWRhdGEKCQlpZD0ibWV0YWRhdGE0MjU4Ij4KCQk8cmRmOlJERj4KCQkJPGNjOldvcmsKCQkJCXJkZjphYm91dD0iIj4KCQkJCTxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgoJCQkJPGRjOnR5cGUKCQkJCQlyZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+CgkJCQk8ZGM6dGl0bGUvPgoJCQk8L2NjOldvcms+CgkJPC9yZGY6UkRGPgoJPC9tZXRhZGF0YT4KCTxkZWZzCgkJaWQ9ImRlZnM0MjU2Ii8+Cgk8c29kaXBvZGk6bmFtZWR2aWV3CgkJcGFnZWNvbG9yPSIjZmZmZmZmIgoJCWJvcmRlcmNvbG9yPSIjNjY2NjY2IgoJCWJvcmRlcm9wYWNpdHk9IjEiCgkJb2JqZWN0dG9sZXJhbmNlPSIxMCIKCQlncmlkdG9sZXJhbmNlPSIxMCIKCQlndWlkZXRvbGVyYW5jZT0iMTAiCgkJaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCgkJaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKCQlpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCgkJaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTA1NiIKCQlpZD0ibmFtZWR2aWV3NDI1NCIKCQlzaG93Z3JpZD0iZmFsc2UiCgkJaW5rc2NhcGU6em9vbT0iMS4zMTAxODUyIgoJCWlua3NjYXBlOmN4PSIyMzcuNTY5MjgiCgkJaW5rc2NhcGU6Y3k9IjcuMjQxOTYyMSIKCQlpbmtzY2FwZTp3aW5kb3cteD0iMTkyMCIKCQlpbmtzY2FwZTp3aW5kb3cteT0iMjQiCgkJaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKCQlpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmc0MjI1Ii8+Cgk8ZwoJCWlkPSJlbmFibGVkIgoJCXN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiPgoJCTxnCgkJCWlkPSJwb2x5bGluZSIKCQkJc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSI+CgkJCTxwYXRoCgkJCQlkPSJtIDE4LDM2IDAsNiA2LDAgMCwtNiAtNiwwIHogbSA0LDQgLTIsMCAwLC0yIDIsMCAwLDIgeiIKCQkJCWlkPSJwYXRoNDIyOSIKCQkJCWlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCgkJCQlzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIi8+CgkJCTxwYXRoCgkJCQlkPSJtIDM2LDE4IDAsNiA2LDAgMCwtNiAtNiwwIHogbSA0LDQgLTIsMCAwLC0yIDIsMCAwLDIgeiIKCQkJCWlkPSJwYXRoNDIzMSIKCQkJCWlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCgkJCQlzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIi8+CgkJCTxwYXRoCgkJCQlkPSJtIDIzLjE0MiwzOS4xNDUgLTIuMjg1LC0yLjI5IDE2LC0xNS45OTggMi4yODUsMi4yODUgeiIKCQkJCWlkPSJwYXRoNDIzMyIKCQkJCWlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCgkJCQlzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIi8+CgkJPC9nPgoJCTxwYXRoCgkJCWlkPSJwb2x5Z29uIgoJCQlkPSJNIDEwMCwyNC41NjUgOTcuOTA0LDM5LjM5NSA4My4wNyw0MiA3NiwyOC43NzMgODYuNDYzLDE4IFoiCgkJCWlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCgkJCXN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiLz4KCQk8cGF0aAoJCQlpZD0icmVjdGFuZ2xlIgoJCQlkPSJtIDE0MCwyMCAyMCwwIDAsMjAgLTIwLDAgeiIKCQkJaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKCQkJc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIvPgoJCTxwYXRoCgkJCWlkPSJjaXJjbGUiCgkJCWQ9Im0gMjIxLDMwIGMgMCw2LjA3OCAtNC45MjYsMTEgLTExLDExIC02LjA3NCwwIC0xMSwtNC45MjIgLTExLC0xMSAwLC02LjA3NCA0LjkyNiwtMTEgMTEsLTExIDYuMDc0LDAgMTEsNC45MjYgMTEsMTEgeiIKCQkJaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKCQkJc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIvPgoJCTxwYXRoCgkJCWlkPSJtYXJrZXIiCgkJCWQ9Im0gMjcwLDE5IGMgLTQuOTcxLDAgLTksNC4wMjkgLTksOSAwLDQuOTcxIDUuMDAxLDEyIDksMTQgNC4wMDEsLTIgOSwtOS4wMjkgOSwtMTQgMCwtNC45NzEgLTQuMDI5LC05IC05LC05IHogbSAwLDEyLjUgYyAtMi40ODQsMCAtNC41LC0yLjAxNCAtNC41LC00LjUgMCwtMi40ODQgMi4wMTYsLTQuNSA0LjUsLTQuNSAyLjQ4NSwwIDQuNSwyLjAxNiA0LjUsNC41IDAsMi40ODYgLTIuMDE1LDQuNSAtNC41LDQuNSB6IgoJCQlpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgoJCQlzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIi8+CgkJPGcKCQkJaWQ9ImVkaXQiCgkJCXN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiPgoJCQk8cGF0aAoJCQkJZD0ibSAzMzcsMzAuMTU2IDAsMC40MDcgMCw1LjYwNCBjIDAsMS42NTggLTEuMzQ0LDMgLTMsMyBsIC0xMCwwIGMgLTEuNjU1LDAgLTMsLTEuMzQyIC0zLC0zIGwgMCwtMTAgYyAwLC0xLjY1NyAxLjM0NSwtMyAzLC0zIGwgNi4zNDUsMCAzLjE5LC0zLjE3IC05LjUzNSwwIGMgLTMuMzEzLDAgLTYsMi42ODcgLTYsNiBsIDAsMTAgYyAwLDMuMzEzIDIuNjg3LDYgNiw2IGwgMTAsMCBjIDMuMzE0LDAgNiwtMi42ODcgNiwtNiBsIDAsLTguODA5IC0zLDIuOTY4IgoJCQkJaWQ9InBhdGg0MjQwIgoJCQkJaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKCQkJCXN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiLz4KCQkJPHBhdGgKCQkJCWQ9Im0gMzM4LjcyLDI0LjYzNyAtOC44OTIsOC44OTIgLTIuODI4LDAgMCwtMi44MjkgOC44OSwtOC44OSB6IgoJCQkJaWQ9InBhdGg0MjQyIgoJCQkJaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKCQkJCXN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiLz4KCQkJPHBhdGgKCQkJCWQ9Im0gMzM4LjY5NywxNy44MjYgNCwwIDAsNCAtNCwwIHoiCgkJCQl0cmFuc2Zvcm09Im1hdHJpeCgtMC43MDY5ODMzNiwtMC43MDcyMzAxOCwwLjcwNzIzMDE4LC0wLjcwNjk4MzM2LDU2Ny41NTkxNywyNzQuNzgyNzMpIgoJCQkJaWQ9InBhdGg0MjQ0IgoJCQkJaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKCQkJCXN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiLz4KCQk8L2c+CgkJPGcKCQkJaWQ9InJlbW92ZSIKCQkJc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSI+CgkJCTxwYXRoCgkJCQlkPSJtIDM4MSw0MiAxOCwwIDAsLTE4IC0xOCwwIDAsMTggeiBtIDE0LC0xNiAyLDAgMCwxNCAtMiwwIDAsLTE0IHogbSAtNCwwIDIsMCAwLDE0IC0yLDAgMCwtMTQgeiBtIC00LDAgMiwwIDAsMTQgLTIsMCAwLC0xNCB6IG0gLTQsMCAyLDAgMCwxNCAtMiwwIDAsLTE0IHoiCgkJCQlpZD0icGF0aDQyNDciCgkJCQlpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgoJCQkJc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIvPgoJCQk8cGF0aAoJCQkJZD0ibSAzOTUsMjAgMCwtNCAtMTAsMCAwLDQgLTYsMCAwLDIgMjIsMCAwLC0yIC02LDAgeiBtIC0yLDAgLTYsMCAwLC0yIDYsMCAwLDIgeiIKCQkJCWlkPSJwYXRoNDI0OSIKCQkJCWlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCgkJCQlzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIi8+CgkJPC9nPgoJPC9nPgoJPGcKCQlpZD0iZGlzYWJsZWQiCgkJdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIwLDApIgoJCXN0eWxlPSJmaWxsOiNiYmJiYmIiPgoJCTx1c2UKCQkJeGxpbms6aHJlZj0iI2VkaXQiCgkJCWlkPSJlZGl0LWRpc2FibGVkIgoJCQl4PSIwIgoJCQl5PSIwIgoJCQl3aWR0aD0iMTAwJSIKCQkJaGVpZ2h0PSIxMDAlIi8+CgkJPHVzZQoJCQl4bGluazpocmVmPSIjcmVtb3ZlIgoJCQlpZD0icmVtb3ZlLWRpc2FibGVkIgoJCQl4PSIwIgoJCQl5PSIwIgoJCQl3aWR0aD0iMTAwJSIKCQkJaGVpZ2h0PSIxMDAlIi8+Cgk8L2c+Cgk8cGF0aAoJCXN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0NjQ2NDY7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKCQlpZD0iY2lyY2xlLTMiCgkJZD0ibSA1ODEuNjU3MjUsMzAgYyAwLDYuMDc4IC00LjkyNiwxMSAtMTEsMTEgLTYuMDc0LDAgLTExLC00LjkyMiAtMTEsLTExIDAsLTYuMDc0IDQuOTI2LC0xMSAxMSwtMTEgNi4wNzQsMCAxMSw0LjkyNiAxMSwxMSB6IgoJCWlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiLz4KPC9zdmc+Cg==)}.leaflet-draw a{display:block;text-align:center;text-decoration:none}.leaflet-draw a .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.leaflet-draw-actions{display:none;list-style:none;margin:0;padding:0;position:absolute;left:26px;top:0;white-space:nowrap}.leaflet-touch .leaflet-draw-actions{left:32px}.leaflet-right .leaflet-draw-actions{right:26px;left:auto}.leaflet-touch .leaflet-right .leaflet-draw-actions{right:32px;left:auto}.leaflet-draw-actions li{display:inline-block}.leaflet-draw-actions li:first-child a{border-left:none}.leaflet-draw-actions li:last-child a{-webkit-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.leaflet-right .leaflet-draw-actions li:last-child a{-webkit-border-radius:0;border-radius:0}.leaflet-right .leaflet-draw-actions li:first-child a{-webkit-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.leaflet-draw-actions a{background-color:#919187;border-left:1px solid #aaa;color:#fff;font:11px/19px "Helvetica Neue",Arial,Helvetica,sans-serif;line-height:28px;text-decoration:none;padding-left:10px;padding-right:10px;height:28px}.leaflet-touch .leaflet-draw-actions a{font-size:12px;line-height:30px;height:30px}.leaflet-draw-actions-bottom{margin-top:0}.leaflet-draw-actions-top{margin-top:1px}.leaflet-draw-actions-bottom a,.leaflet-draw-actions-top a{height:27px;line-height:27px}.leaflet-draw-actions a:hover{background-color:#a0a098}.leaflet-draw-actions-top.leaflet-draw-actions-bottom a{height:26px;line-height:26px}.leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:-2px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:0 -1px}.leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-31px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-29px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-62px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-60px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-92px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-90px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-122px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-120px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-circlemarker{background-position:-273px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circlemarker{background-position:-271px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-152px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-150px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-182px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-180px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-212px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-210px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-242px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-240px -2px}.leaflet-mouse-marker{background-color:#fff;cursor:crosshair}.leaflet-draw-tooltip{background:#363636;background:rgba(0,0,0,.5);border:1px solid transparent;-webkit-border-radius:4px;border-radius:4px;color:#fff;font:12px/18px "Helvetica Neue",Arial,Helvetica,sans-serif;margin-left:20px;margin-top:-21px;padding:4px 8px;position:absolute;visibility:hidden;white-space:nowrap;z-index:6}.leaflet-draw-tooltip:before{border-right:6px solid #000;border-right-color:rgba(0,0,0,.5);border-top:6px solid transparent;border-bottom:6px solid transparent;content:"";position:absolute;top:7px;left:-7px}.leaflet-error-draw-tooltip{background-color:#f2dede;border:1px solid #e6b6bd;color:#b94a48}.leaflet-error-draw-tooltip:before{border-right-color:#e6b6bd}.leaflet-draw-tooltip-single{margin-top:-12px}.leaflet-draw-tooltip-subtext{color:#f8d5e4}.leaflet-draw-guide-dash{font-size:1%;opacity:.6;position:absolute;width:5px;height:5px}.leaflet-edit-marker-selected{background-color:rgba(254,87,161,.1);border:4px dashed rgba(254,87,161,.6);-webkit-border-radius:4px;border-radius:4px;box-sizing:content-box}.leaflet-edit-move{cursor:move}.leaflet-edit-resize{cursor:pointer}.leaflet-oldie .leaflet-draw-toolbar{border:1px solid #999}
--- a/src/pyams_gis/resources/css/leaflet-esri-geocoder.css	Wed Jan 27 15:38:26 2021 +0100
+++ b/src/pyams_gis/resources/css/leaflet-esri-geocoder.css	Wed Jan 27 15:39:14 2021 +0100
@@ -1,162 +1,1 @@
-.geocoder-control-input {
-	position: absolute;
-	left: 0;
-	top: 0;
-	background-color: white;
-	background-repeat: no-repeat;
-	background-image: url("../esri/search.png");
-	background-size: 26px;
-	border: none;
-	padding: 0;
-	text-indent: 6px;
-	font-size: 13px;
-	line-height: normal;
-	height: auto;
-	padding-top: 5px;
-	padding-bottom: 5px;
-	width: 100%;
-	background-position: right center;
-	cursor: pointer;
-	box-sizing: border-box
-}
-
-.geocoder-control-input-disabled {
-	background-color: #f4f4f4;
-	background-image: url("../img/esri/search-disabled.png")
-}
-
-.geocoder-control {
-	width: 26px;
-	height: 26px;
-	-webkit-transition: width .175s ease-in;
-	-moz-transition: width .175s ease-in;
-	-ms-transition: width .175s ease-in;
-	-o-transition: width .175s ease-in;
-	transition: width .175s ease-in
-}
-
-.geocoder-control-expanded, .leaflet-touch .geocoder-control-expanded {
-	width: 275px
-}
-
-.geocoder-control-input.geocoder-control-loading {
-	background-image: url("../img/esri/loading.gif");
-	background-size: 26px
-}
-
-@media only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2 / 1), only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2) {
-	.geocoder-control-input {
-		background-image: url("../img/esri/search@2x.png")
-	}
-
-	.geocoder-control-input-disabled {
-		background-image: url("../img/esri/search@2x-disabled.png")
-	}
-
-	.geocoder-control-input.geocoder-control-loading {
-		background-image: url("../img/esri/loading@2x.gif")
-	}
-}
-
-.geocoder-control-input:focus {
-	outline: none;
-	cursor: text
-}
-
-.geocoder-control-input::-ms-clear {
-	display: none
-}
-
-.geocoder-control-suggestions {
-	width: 100%;
-	position: absolute;
-	top: 26px;
-	left: 0;
-	margin-top: 10px;
-	overflow: auto;
-	display: none
-}
-
-.geocoder-control-list + .geocoder-control-header {
-	border-top: 1px solid #d5d5d5
-}
-
-.geocoder-control-header {
-	font-size: 10px;
-	font-weight: 700;
-	text-transform: uppercase;
-	letter-spacing: 0.05em;
-	color: #444;
-	background: #F2F2F2;
-	border-bottom: 1px solid #d5d5d5;
-	display: block;
-	padding: .5em
-}
-
-.geocoder-control-list {
-	list-style: none;
-	margin: 0;
-	padding: 0
-}
-
-.geocoder-control-suggestions .geocoder-control-suggestion {
-	font-size: 13px;
-	padding: 7px;
-	background: white;
-	border-top: 1px solid #f1f1f1;
-	white-space: nowrap;
-	overflow: hidden;
-	text-overflow: ellipsis;
-	cursor: pointer
-}
-
-.geocoder-control-suggestions .geocoder-control-suggestion:first-child {
-	border: none
-}
-
-.geocoder-control-suggestions .geocoder-control-suggestion.geocoder-control-selected, .geocoder-control-suggestions .geocoder-control-suggestion:hover {
-	background: #7FDFFF;
-	border-color: #7FDFFF
-}
-
-.leaflet-right .geocoder-control-suggestions {
-	left: auto;
-	right: 0
-}
-
-.leaflet-right .geocoder-control-input {
-	left: auto;
-	right: 0
-}
-
-.leaflet-touch .geocoder-control {
-	width: 34px
-}
-
-.leaflet-touch .geocoder-control.geocoder-control-expanded {
-	width: 275px
-}
-
-.leaflet-touch .geocoder-control-input {
-	height: 34px;
-	line-height: 30px;
-	background-size: 30px
-}
-
-.leaflet-touch .geocoder-control-suggestions {
-	top: 30px;
-	width: 271px
-}
-
-.leaflet-oldie .geocoder-control-input {
-	width: 28px;
-	height: 28px
-}
-
-.leaflet-oldie .geocoder-control-expanded .geocoder-control-input {
-	width: auto
-}
-
-.leaflet-oldie .geocoder-control-input, .leaflet-oldie .geocoder-control-suggestions {
-	border: 1px solid #999
-}
+.geocoder-control-input{position:absolute;left:0;top:0;background-color:white;background-repeat:no-repeat;background-image:url("img/search.png");background-size:26px;border:none;padding:0;text-indent:6px;font-size:13px;line-height:normal;height:auto;padding-top:5px;padding-bottom:5px;width:100%;background-position:right center;cursor:pointer;box-sizing:border-box}.geocoder-control-input-disabled{background-color:#f4f4f4;background-image:url("img/search-disabled.png")}.geocoder-control{width:26px;height:26px;-webkit-transition:width .175s ease-in;-moz-transition:width .175s ease-in;-ms-transition:width .175s ease-in;-o-transition:width .175s ease-in;transition:width .175s ease-in}.geocoder-control-expanded,.leaflet-touch .geocoder-control-expanded{width:275px}.geocoder-control-input.geocoder-control-loading{background-image:url("img/loading.gif");background-size:26px}@media only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2 / 1), only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2){.geocoder-control-input{background-image:url("img/search@2x.png")}.geocoder-control-input-disabled{background-image:url("img/search@2x-disabled.png")}.geocoder-control-input.geocoder-control-loading{background-image:url("img/loading@2x.gif")}}.geocoder-control-input:focus{outline:none;cursor:text}.geocoder-control-input::-ms-clear{display:none}.geocoder-control-suggestions{width:100%;position:absolute;top:26px;left:0;margin-top:10px;overflow:auto;display:none}.geocoder-control-list+.geocoder-control-header{border-top:1px solid #d5d5d5}.geocoder-control-header{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:0.05em;color:#444;background:#F2F2F2;border-bottom:1px solid #d5d5d5;display:block;padding:.5em}.geocoder-control-list{list-style:none;margin:0;padding:0}.geocoder-control-suggestions .geocoder-control-suggestion{font-size:13px;padding:7px;background:white;border-top:1px solid #f1f1f1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.geocoder-control-suggestions .geocoder-control-suggestion:first-child{border:none}.geocoder-control-suggestions .geocoder-control-suggestion.geocoder-control-selected,.geocoder-control-suggestions .geocoder-control-suggestion:hover{background:#7FDFFF;border-color:#7FDFFF}.leaflet-right .geocoder-control-suggestions{left:auto;right:0}.leaflet-right .geocoder-control-input{left:auto;right:0}.leaflet-bottom .geocoder-control-suggestions{margin-top:0;top:0}.leaflet-touch .geocoder-control{width:34px}.leaflet-touch .geocoder-control.geocoder-control-expanded{width:275px}.leaflet-touch .geocoder-control-input{height:34px;line-height:30px;background-size:30px}.leaflet-touch .geocoder-control-suggestions{top:30px;width:271px}.leaflet-oldie .geocoder-control-input{width:28px;height:28px}.leaflet-oldie .geocoder-control-expanded .geocoder-control-input{width:auto}.leaflet-oldie .geocoder-control-input,.leaflet-oldie .geocoder-control-suggestions{border:1px solid #999}
--- a/src/pyams_gis/resources/css/leaflet-esri-geocoder.min.css	Wed Jan 27 15:38:26 2021 +0100
+++ b/src/pyams_gis/resources/css/leaflet-esri-geocoder.min.css	Wed Jan 27 15:39:14 2021 +0100
@@ -1,1 +1,1 @@
-.geocoder-control-input{position:absolute;left:0;top:0;background-color:white;background-repeat:no-repeat;background-image:url("../esri/search.png");background-size:26px;border:0;padding:0;text-indent:6px;font-size:13px;line-height:normal;height:auto;padding-top:5px;padding-bottom:5px;width:100%;background-position:right center;cursor:pointer;box-sizing:border-box}.geocoder-control-input-disabled{background-color:#f4f4f4;background-image:url("../img/esri/search-disabled.png")}.geocoder-control{width:26px;height:26px;-webkit-transition:width .175s ease-in;-moz-transition:width .175s ease-in;-ms-transition:width .175s ease-in;-o-transition:width .175s ease-in;transition:width .175s ease-in}.geocoder-control-expanded,.leaflet-touch .geocoder-control-expanded{width:275px}.geocoder-control-input.geocoder-control-loading{background-image:url("../img/esri/loading.gif");background-size:26px}@media only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2 / 1),only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.geocoder-control-input{background-image:url("../img/esri/search@2x.png")}.geocoder-control-input-disabled{background-image:url("../img/esri/search@2x-disabled.png")}.geocoder-control-input.geocoder-control-loading{background-image:url("../img/esri/loading@2x.gif")}}.geocoder-control-input:focus{outline:0;cursor:text}.geocoder-control-input::-ms-clear{display:none}.geocoder-control-suggestions{width:100%;position:absolute;top:26px;left:0;margin-top:10px;overflow:auto;display:none}.geocoder-control-list+.geocoder-control-header{border-top:1px solid #d5d5d5}.geocoder-control-header{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#444;background:#f2f2f2;border-bottom:1px solid #d5d5d5;display:block;padding:.5em}.geocoder-control-list{list-style:none;margin:0;padding:0}.geocoder-control-suggestions .geocoder-control-suggestion{font-size:13px;padding:7px;background:white;border-top:1px solid #f1f1f1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.geocoder-control-suggestions .geocoder-control-suggestion:first-child{border:0}.geocoder-control-suggestions .geocoder-control-suggestion.geocoder-control-selected,.geocoder-control-suggestions .geocoder-control-suggestion:hover{background:#7fdfff;border-color:#7fdfff}.leaflet-right .geocoder-control-suggestions{left:auto;right:0}.leaflet-right .geocoder-control-input{left:auto;right:0}.leaflet-touch .geocoder-control{width:34px}.leaflet-touch .geocoder-control.geocoder-control-expanded{width:275px}.leaflet-touch .geocoder-control-input{height:34px;line-height:30px;background-size:30px}.leaflet-touch .geocoder-control-suggestions{top:30px;width:271px}.leaflet-oldie .geocoder-control-input{width:28px;height:28px}.leaflet-oldie .geocoder-control-expanded .geocoder-control-input{width:auto}.leaflet-oldie .geocoder-control-input,.leaflet-oldie .geocoder-control-suggestions{border:1px solid #999}
\ No newline at end of file
+.geocoder-control-input{position:absolute;left:0;top:0;background-color:#fff;background-repeat:no-repeat;background-image:url(img/search.png);background-size:26px;border:none;padding:0;text-indent:6px;font-size:13px;line-height:normal;height:auto;padding-top:5px;padding-bottom:5px;width:100%;background-position:right center;cursor:pointer;box-sizing:border-box}.geocoder-control-input-disabled{background-color:#f4f4f4;background-image:url(img/search-disabled.png)}.geocoder-control{width:26px;height:26px;-webkit-transition:width .175s ease-in;-moz-transition:width .175s ease-in;-ms-transition:width .175s ease-in;-o-transition:width .175s ease-in;transition:width .175s ease-in}.geocoder-control-expanded,.leaflet-touch .geocoder-control-expanded{width:275px}.geocoder-control-input.geocoder-control-loading{background-image:url(img/loading.gif);background-size:26px}@media only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2 / 1),only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.geocoder-control-input{background-image:url(img/search@2x.png)}.geocoder-control-input-disabled{background-image:url(img/search@2x-disabled.png)}.geocoder-control-input.geocoder-control-loading{background-image:url(img/loading@2x.gif)}}.geocoder-control-input:focus{outline:0;cursor:text}.geocoder-control-input::-ms-clear{display:none}.geocoder-control-suggestions{width:100%;position:absolute;top:26px;left:0;margin-top:10px;overflow:auto;display:none}.geocoder-control-list+.geocoder-control-header{border-top:1px solid #d5d5d5}.geocoder-control-header{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#444;background:#f2f2f2;border-bottom:1px solid #d5d5d5;display:block;padding:.5em}.geocoder-control-list{list-style:none;margin:0;padding:0}.geocoder-control-suggestions .geocoder-control-suggestion{font-size:13px;padding:7px;background:#fff;border-top:1px solid #f1f1f1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.geocoder-control-suggestions .geocoder-control-suggestion:first-child{border:none}.geocoder-control-suggestions .geocoder-control-suggestion.geocoder-control-selected,.geocoder-control-suggestions .geocoder-control-suggestion:hover{background:#7fdfff;border-color:#7fdfff}.leaflet-right .geocoder-control-suggestions{left:auto;right:0}.leaflet-right .geocoder-control-input{left:auto;right:0}.leaflet-bottom .geocoder-control-suggestions{margin-top:0;top:0}.leaflet-touch .geocoder-control{width:34px}.leaflet-touch .geocoder-control.geocoder-control-expanded{width:275px}.leaflet-touch .geocoder-control-input{height:34px;line-height:30px;background-size:30px}.leaflet-touch .geocoder-control-suggestions{top:30px;width:271px}.leaflet-oldie .geocoder-control-input{width:28px;height:28px}.leaflet-oldie .geocoder-control-expanded .geocoder-control-input{width:auto}.leaflet-oldie .geocoder-control-input,.leaflet-oldie .geocoder-control-suggestions{border:1px solid #999}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-gesture-handling-1.2.1.css	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,47 @@
+@-webkit-keyframes leaflet-gestures-fadein {
+  0% {
+    opacity: 0; }
+  100% {
+    opacity: 1; } }
+
+@keyframes leaflet-gestures-fadein {
+  0% {
+    opacity: 0; }
+  100% {
+    opacity: 1; } }
+
+.leaflet-container:after {
+  -webkit-animation: leaflet-gestures-fadein 0.8s backwards;
+          animation: leaflet-gestures-fadein 0.8s backwards;
+  color: #fff;
+  font-family: "Roboto", Arial, sans-serif;
+  font-size: 22px;
+  -webkit-box-pack: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-box-align: center;
+      -ms-flex-align: center;
+          align-items: center;
+  padding: 15px;
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: rgba(0, 0, 0, 0.5);
+  z-index: 461;
+  pointer-events: none; }
+
+.leaflet-gesture-handling-touch-warning:after,
+.leaflet-gesture-handling-scroll-warning:after {
+  -webkit-animation: leaflet-gestures-fadein 0.8s forwards;
+          animation: leaflet-gestures-fadein 0.8s forwards; }
+
+.leaflet-gesture-handling-touch-warning:after {
+  content: attr(data-gesture-handling-touch-content); }
+
+.leaflet-gesture-handling-scroll-warning:after {
+  content: attr(data-gesture-handling-scroll-content); }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-gesture-handling-1.2.1.min.css	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+@-webkit-keyframes leaflet-gestures-fadein{0%{opacity:0}100%{opacity:1}}@keyframes leaflet-gestures-fadein{0%{opacity:0}100%{opacity:1}}.leaflet-container:after{-webkit-animation:leaflet-gestures-fadein .8s backwards;animation:leaflet-gestures-fadein .8s backwards;color:#fff;font-family:Roboto,Arial,sans-serif;font-size:22px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:15px;position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);z-index:461;pointer-events:none}.leaflet-gesture-handling-scroll-warning:after,.leaflet-gesture-handling-touch-warning:after{-webkit-animation:leaflet-gestures-fadein .8s forwards;animation:leaflet-gestures-fadein .8s forwards}.leaflet-gesture-handling-touch-warning:after{content:attr(data-gesture-handling-touch-content)}.leaflet-gesture-handling-scroll-warning:after{content:attr(data-gesture-handling-scroll-content)}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-gp-2.1.7.css	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,3817 @@
+/*!
+ * @brief French Geoportal Extension for Leaflet
+ *
+ * This software is released under the licence CeCILL-B (Free BSD compatible)
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ * @see http://www.cecill.info/
+ *
+ * @copyright copyright (c) IGN 
+ * @license CeCILL-B
+ * @author IGN
+ * @version 2.1.7
+ * @date 09/12/2020
+ *
+ */
+
+/*!
+ * @overview  Proj4Leaflet - Smooth Proj4js integration with Leaflet
+ * @copyright Copyright (c) 2012, Kartena AB
+ * @license   BSD 2-Clause "Simplified" License
+ *            See https://raw.githubusercontent.com/kartena/Proj4Leaflet/master/LICENSE
+ * @version 1.0.2
+ */
+
+/*!
+ * @overview  leaflet-draw - Vector drawing and editing plugin for Leaflet 
+ * @copyright Copyright (c) 2012-2017 Jon West, Jacob Toye, and Leaflet
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/Leaflet/Leaflet.draw/master/MIT-LICENSE.md
+ * @version   1.0.4
+ */
+
+/*!
+ * Sortable -- JavaScript library for reorderable drag-and-drop lists on modern
+ * browsers and touch devices. No jQuery required. Supports Meteor, AngularJS,
+ * React, Polymer, Vue, Knockout and any CSS library, e.g. Bootstrap.
+ *
+ * Released under MIT LICENSE
+ *
+ * Copyright Lebedev Konstantin <ibnRubaXa@gmail.com>
+ * https://github.com/SortableJS/Sortable
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * @version 1.8.4
+ */
+
+/*!
+ * @overview  es6-promise - a tiny implementation of Promises/A+.
+ * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
+ * @version   v4.2.4
+ */
+
+/*!
+ * @overview   Proj4js - Javascript reprojection library.
+ *
+ * @authors
+ * - Mike Adair madairATdmsolutions.ca
+ * - Richard Greenwood richATgreenwoodmap.com
+ * - Didier Richard didier.richardATign.fr
+ * - Stephen Irons stephen.ironsATclear.net.nz
+ * - Olivier Terral oterralATgmail.com
+ * - Calvin Metcalf cmetcalfATappgeo.com
+ *
+ * @copyright Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons, Olivier Terral and Calvin Metcalf
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/proj4js/proj4js/master/LICENSE.md
+ * @version   ^2.6.2
+ */
+
+/* BOOST RELIEF */
+
+  div[id^=GPboostRelief-] {
+    font-size: 11px;
+    width: 150px;
+  }
+  
+  div[id^=GPboostRelief-] label {
+    display: block;
+  }
+
+  div[id^=GPBoostReliefListContainer-] {
+    position: relative;
+    width: 100%;
+    height: 28px;
+    padding-left: 8px;
+    line-height: 28px;
+  }
+  
+  .GPlayerRelief,
+  .GPlayerReliefValue {
+    position: absolute;
+    top: 0;
+  }
+  
+  .GPlayerRelief {
+    width: calc(100% - 60px);
+    height: 28px;
+    padding-left: 8px;
+  }
+  
+  .GPlayerReliefValue {
+    width: 32px;
+    left: calc(100% - 40px);
+    line-height: 28px;
+    font-size: 10px;
+    font-style: italic;
+    cursor: default;
+  }
+
+  /* Showing/hiding boost relief panel */
+
+  label[id^=GPshowBoostReliefPicto] {
+    display: inline-block;
+  }
+
+  input[id^=GPshowBoostRelief-] + label {
+    display: block;
+  }
+
+  input[id^=GPshowBoostRelief-]:checked + label {
+    display: none;
+  }
+
+  input[id^=GPshowBoostRelief-] + label + div {
+    display: none;
+  }
+
+  input[id^=GPshowBoostRelief-]:checked + label + div {
+    display: block;
+  }
+
+  /* Showing layer advanced tools */
+
+  div[id^=GPboostRelief-] input[type="checkbox"]:checked + label + .GPlayerAdvancedToolsRelief {
+    max-height: 28px;
+    opacity: 1;
+  }
+
+  .GPlayerAdvancedToolsRelief {
+    display: block;
+    position: relative;
+    width: 100%;
+    border-bottom : 1px dotted #CCC;
+    background-color : #FFF;
+  }
+
+  .GPlayerReliefLayerId {
+    position: relative;
+    width: 100px;
+    height: 28px;
+    padding-left: 8px;
+    line-height: 28px;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+  }
+  
+  /* Relief slider : general */
+  
+  .GPlayerRelief input {
+    -webkit-appearance: none;
+    -moz-appearance: none;
+    background: none;
+    display: block;
+    width: 100%;
+    height: 100%;
+    margin: 0;
+    padding: 0;
+    overflow: hidden;
+    cursor: pointer;
+  }
+  
+  .GPlayerRelief input[type="range"]:focus {
+    box-shadow: none;
+    outline: none;
+  }
+  
+  /* Relief slider : Chrome, Safari, Opera */
+  
+  .GPlayerRelief input[type="range"]::-webkit-slider-runnable-track {
+    -webkit-appearance: none;
+    height: 3px;
+  }
+  
+  .GPlayerRelief input[type="range"]::-webkit-slider-thumb:before {
+    position: absolute;
+    top: 0;
+    right: 50%;
+    left: -200px;
+    height: 3px;
+    pointer-events: none;
+  }
+  
+  .GPlayerRelief input[type="range"]::-webkit-slider-thumb {
+    -webkit-appearance: none;
+    width: 9px;
+    height: 17px;
+    -webkit-appearance: none;
+    border: 2px solid #FFF;
+    background-color: #505050;
+    position: relative;
+    top: -7px;
+  }
+  
+  /* Relief slider : Firefox */
+  
+  .GPlayerRelief input[type="range"]::-moz-range-track {
+    width: 80px;
+    height: 3px;
+  }
+  
+  .GPlayerRelief input[type="range"]::-moz-range-thumb {
+    width: 5px;
+    height: 13px;
+    border: 2px solid #FFF;
+    border-radius: 0;
+    box-shadow: 0;
+    background-color: #505050;
+    position: relative;
+  }
+  
+  /* Relief slider : IE */
+  
+  .GPlayerRelief input[type="range"]::-ms-track {
+    border: 0;
+    border-color: transparent;
+    border-radius: 0;
+    border-width: 0;
+    color: transparent;
+    height: 3px;
+    width: 80px;
+  }
+  
+  .GPlayerRelief input[type="range"]::-ms-fill-lower,
+  .GPlayerRelief input[type="range"]::-ms-fill-upper {
+    background: transparent;
+    border-radius: 0;
+  }
+  
+  .GPlayerRelief input[type="range"]::-ms-thumb {
+    width: 5px;
+    height: 13px;
+    border: 2px solid #FFF;
+    background-color: #505050;
+  }
+  
+  .GPlayerRelief input[type="range"]::-ms-tooltip {
+    display: none;
+  }
+/* MOUSE POSITION */
+
+/* Showing/hiding drawing panel */
+
+label[id^=GPshowDrawingPicto-] {
+  display: inline-block;
+}
+
+input[id^=GPshowDrawing-] + label {
+  display: block;
+}
+
+input[id^=GPshowDrawing-]:checked + label {
+  display: none;
+}
+
+input[id^=GPshowDrawing-] + label + div {
+  display: none;
+}
+
+input[id^=GPshowDrawing-]:checked + label + div {
+  display: block;
+}
+
+/* General panels */
+
+div[id^=GPdrawingPanel-] {
+  width: 240px;
+  overflow: hidden;
+}
+
+/* Basic infos */
+
+div[id^=GPdrawingBasicPanel-] {
+  padding: 10px 15px;
+}
+
+.GPdrawingLabel,
+.GPdrawingCoords {
+  display: inline-block;
+  line-height: 20px;
+}
+
+.GPdrawingLabel {
+  width: 80px;
+  font-weight: bold;
+}
+
+.GPdrawingCoords {
+  width: 110px;
+}
+
+/* markers selector */
+.marker-input-radio {
+  display : none ;
+}
+
+input.marker-input-radio:checked + label {
+  border: 1px solid red;
+}
+
+
+div[id^=GPelevationPathPanelInfo] {
+  display: none; /* on n'affiche pas le bouton d'information par defaut */
+}
+
+/* Calc waiting */
+
+.GPelevationPathCalcWaitingContainerVisible,
+.GPelevationPathCalcWaitingContainerHidden {
+  position: absolute;
+  top: 32px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background-color: rgba(255,255,255,0.9);
+  font-size: 1.5em;
+  font-weight: bold;
+  overflow: hidden;
+}
+
+.GPelevationPathInformationsContainerVisible,
+.GPelevationPathInformationsContainerHidden {
+  position: absolute;
+  top: 32px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background-color: rgba(255,255,255,0.9);
+  font-size: 13px;
+  font-weight: bold;
+  overflow: hidden;
+}
+
+.GPelevationPathCalcWaitingContainerVisible {
+  display: -webkit-flex;
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+}
+
+.GPelevationPathInformationsContainerVisible {
+  display: -webkit-flex;
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  flex-direction: column;
+}
+
+.GPelevationPathCalcWaitingContainerHidden,
+.GPelevationPathInformationsContainerHidden {
+  display: none;
+}
+
+.GPelevationPathCalcWaiting,
+.GPelevationPathInformations {
+  margin: auto;
+}
+
+.GPelevationPathInformations {
+  font-size: 0.8em;
+}
+
+.GPelevationPathCalcWaitingContainerVisible,
+.GPelevationPathCalcWaitingContainerHidden,
+.GPelevationPathInformationsContainerVisible,
+.GPelevationPathInformationsContainerHidden {
+  border-radius: 5px;
+}
+
+/* CSS : Raw */
+
+#profileElevationRaw {
+  resize: none;
+  padding: unset;
+}
+
+/* CSS : default */
+
+#profileElevationByDefault {
+  display:-webkit-flex;
+  display:-webkit-box;
+  display:-ms-flexbox;
+  display:flex;
+  -webkit-box-orient:vertical;
+  -webkit-box-direction:normal;
+  -webkit-flex-direction:column;
+      -ms-flex-direction:column;
+          flex-direction:column;
+  height:100%;
+}
+
+.profile-box {
+  height: calc(100% - 15px);
+  display:-webkit-flex;
+  display:-webkit-box;
+  display:-ms-flexbox;
+  display:flex;
+  -webkit-flex:1;
+  -webkit-box-flex:1;
+      -ms-flex:1;
+          flex:1;
+  -webkit-box-orient:horizontal;
+  -webkit-box-direction:normal;
+  -webkit-flex-direction:row;
+      -ms-flex-direction:row;
+          flex-direction:row;
+}
+
+.profile-content {
+  -webkit-flex:1;
+  -webkit-box-flex:1;
+      -ms-flex:1;
+          flex:1;
+  -webkit-justify-content:center;
+  -webkit-box-pack:center;
+      -ms-flex-pack:center;
+          justify-content:center;
+  -webkit-box-align:center;
+  -webkit-align-items:center;
+      -ms-flex-align:center;
+          align-items:center;
+}
+
+.profile-z-vertical,
+.profile-z-vertical ul,
+.profile-x-horizontal,
+.profile-x-horizontal ul {
+  display:-webkit-flex;
+  display:-webkit-box;
+  display:-ms-flexbox;
+  display:flex;
+  /*justify-content:center;*/
+  -webkit-align-items:center;
+  -webkit-box-align:center;
+      -ms-flex-align:center;
+          align-items:center;
+}
+
+
+.profile-z-vertical,
+.profile-z-vertical ul,
+.profile-content
+{
+  -webkit-box-orient:vertical;
+  -webkit-box-direction:normal;
+  -webkit-flex-direction:column;
+      -ms-flex-direction:column;
+          flex-direction:column;
+  height:100%;
+}
+
+.profile-z-vertical ul,
+.profile-x-horizontal ul{
+  /*padding:0;*/
+  margin:0;
+  list-style-type:none;
+}
+
+.profile-z-vertical{
+  /*background:green;*/
+  -webkit-flex:0 1 auto;
+  -webkit-box-flex:0;
+      -ms-flex:0 1 auto;
+          flex:0 1 auto;
+
+}
+.profile-z-vertical ul{
+  /*background:pink;*/
+  -webkit-justify-content:space-between;
+  -webkit-box-pack:justify;
+      -ms-flex-pack:justify;
+          justify-content:space-between;
+  padding:2px 5px 2px 2px;
+  /*border-right:1px solid #888;*/
+}
+.profile-z-vertical .profile-unit{
+  /*background:gray;*/
+  width:100%;
+  text-align:center;
+  /*padding:5px 5px 2px 2px;*/
+}
+.profile-content{
+  /*background:yellow;*/
+  /*flex:1 0 auto;*/
+
+}
+.profile-content ul {
+  background:white;
+  -webkit-flex:1 0 auto;
+  -webkit-box-flex:1;
+      -ms-flex:1 0 auto;
+          flex:1 0 auto;
+  height:100%;
+  width:100%;
+  -webkit-justify-content:flex-start;
+  -webkit-box-pack:start;
+      -ms-flex-pack:start;
+          justify-content:flex-start;
+  -webkit-align-items:flex-end;
+  -webkit-box-align:end;
+      -ms-flex-align:end;
+          align-items:flex-end;
+
+  margin:0;
+  padding:0;
+
+}
+.profile-x-horizontal{
+  /*background:blue;*/
+  -webkit-flex:0 1 auto;
+  -webkit-box-flex:0;
+      -ms-flex:0 1 auto;
+          flex:0 1 auto;;
+  width:100%;
+  height: 15px
+}
+.profile-x-horizontal ul{
+  /*background:orange;*/
+  -webkit-justify-content:space-between;
+  -webkit-box-pack:justify;
+      -ms-flex-pack:justify;
+          justify-content:space-between;
+  /*padding:5px 2px 2px 2px;*/
+  width:100%;
+  /*border-top:1px solid #888;*/
+}
+
+.profile-x-fleche {
+    width: 0;
+    height: 0;
+    border-top: 5px solid transparent;
+    border-bottom: 5px solid transparent;
+    border-left: 5px solid green;
+}
+
+.profile-z-fleche {
+    width: 0;
+    height: 0;
+    border-left: 5px solid transparent;
+    border-right: 5px solid transparent;
+    border-bottom: 5px solid red;
+}
+
+.profile-z-axis {
+    border-right: none;
+    border-left: solid 2px #888;
+    cursor: default;
+}
+
+.profile-x-axis {
+    border-top: none;
+    border-bottom: solid 2px #888;
+    cursor: default;
+}
+
+ul#profile-data li.percent {
+    display: inline-block;
+    vertical-align: bottom;
+    background-color: #C77A04;
+    opacity : 0.3;
+    border-top: solid 1px;
+    border-radius: 2px;
+    cursor: pointer;
+}
+
+li.axe span.bottom-axis {
+    vertical-align: bottom;
+}
+
+ul#profile-data .percent:hover {
+    display: inline-block;
+    vertical-align: bottom;
+    background-color: #f00;
+}
+
+.v0 { height: 0%; }
+.v1 { height: 1%; }
+.v2 { height: 2%; }
+.v3 { height: 3%; }
+.v4 { height: 4%; }
+.v5 { height: 5%; }
+.v6 { height: 6%; }
+.v7 { height: 7%; }
+.v8 { height: 8%; }
+.v9 { height: 9%; }
+.v10 { height: 10%; }
+.v11 { height: 11%; }
+.v12 { height: 12%; }
+.v13 { height: 13%; }
+.v14 { height: 14%; }
+.v15 { height: 15%; }
+.v16 { height: 16%; }
+.v17 { height: 17%; }
+.v18 { height: 18%; }
+.v19 { height: 19%; }
+.v20 { height: 20%; }
+.v21 { height: 21%; }
+.v22 { height: 22%; }
+.v23 { height: 23%; }
+.v24 { height: 24%; }
+.v25 { height: 25%; }
+.v26 { height: 26%; }
+.v27 { height: 27%; }
+.v28 { height: 28%; }
+.v29 { height: 29%; }
+.v30 { height: 30%; }
+.v31 { height: 31%; }
+.v32 { height: 32%; }
+.v33 { height: 33%; }
+.v34 { height: 34%; }
+.v35 { height: 35%; }
+.v36 { height: 36%; }
+.v37 { height: 37%; }
+.v38 { height: 38%; }
+.v39 { height: 39%; }
+.v40 { height: 40%; }
+.v41 { height: 41%; }
+.v42 { height: 42%; }
+.v43 { height: 43%; }
+.v44 { height: 44%; }
+.v45 { height: 45%; }
+.v46 { height: 46%; }
+.v47 { height: 47%; }
+.v48 { height: 48%; }
+.v49 { height: 49%; }
+.v50 { height: 50%; }
+.v51 { height: 51%; }
+.v52 { height: 52%; }
+.v53 { height: 53%; }
+.v54 { height: 54%; }
+.v55 { height: 55%; }
+.v56 { height: 56%; }
+.v57 { height: 57%; }
+.v58 { height: 58%; }
+.v59 { height: 59%; }
+.v60 { height: 60%; }
+.v61 { height: 61%; }
+.v62 { height: 62%; }
+.v63 { height: 63%; }
+.v64 { height: 64%; }
+.v65 { height: 65%; }
+.v66 { height: 66%; }
+.v67 { height: 67%; }
+.v68 { height: 68%; }
+.v69 { height: 69%; }
+.v70 { height: 70%; }
+.v71 { height: 71%; }
+.v72 { height: 72%; }
+.v73 { height: 73%; }
+.v74 { height: 74%; }
+.v75 { height: 75%; }
+.v76 { height: 76%; }
+.v77 { height: 77%; }
+.v78 { height: 78%; }
+.v79 { height: 79%; }
+.v80 { height: 80%; }
+.v81 { height: 81%; }
+.v82 { height: 82%; }
+.v83 { height: 83%; }
+.v84 { height: 84%; }
+.v85 { height: 85%; }
+.v86 { height: 86%; }
+.v87 { height: 87%; }
+.v88 { height: 88%; }
+.v89 { height: 89%; }
+.v90 { height: 90%; }
+.v91 { height: 91%; }
+.v92 { height: 92%; }
+.v93 { height: 93%; }
+.v94 { height: 94%; }
+.v95 { height: 95%; }
+.v96 { height: 96%; }
+.v97 { height: 97%; }
+.v98 { height: 98%; }
+.v99 { height: 99%; }
+.v100 { height: 100%; }
+
+/* CSS : D3 */
+
+.axis-d3 > text {
+  fill: rgb(94, 94, 94);
+  font-family: Verdana;
+  font-size: 10px;
+  opacity: 1;
+  text-anchor: end;
+}
+
+.axis-d3 {
+  fill: none;
+  stroke: #5E5E5E;
+  stroke-width: 1;
+  shape-rendering: crispEdges;
+}
+
+.area-d3 {
+  fill: #C77A04;
+  stroke: #5E5E5E;
+  stroke-width: 0;
+  fill-opacity: 0.4;
+}
+
+.line-d3 {
+  fill: none;
+  stroke: #C77A04;
+  stroke-width: 1px;
+}
+
+.grid-d3 .tick {
+  stroke: lightgrey;
+  opacity: 0.7;
+}
+
+.grid-d3 path {
+  stroke-width: 0;
+}
+
+.grid-d3 .tick {
+  stroke: lightgrey;
+  opacity: 0.7;
+}
+
+.grid-d3 path {
+  stroke-width: 0;
+}
+
+.overlay-d3 {
+  fill: none;
+  pointer-events: all;
+}
+
+.focusLine-d3 {
+  fill: none;
+  stroke: #C77A04;
+  stroke-width: 0.5px;
+}
+
+.focusCircle-d3 {
+  fill: #C77A04;
+}
+
+div.tooltip-d3 {
+    position: inherit;;
+    text-align: left;
+    width: 80px;
+    height: 45px;
+    padding: 5px;
+    font: 8px sans-serif;
+    background: white;
+    border: 0px;
+    border-radius: 8px;
+    pointer-events: none;
+}
+
+/* Widgets : general */
+
+.GPwidget {
+  position: absolute;
+  font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;
+  font-size: 13px;
+  color: #333;
+}
+
+.GPwidget input[type='text'],
+.GPwidget input[type='button'] {
+  -webkit-appearance: none;
+  color: #333333;
+}
+
+.GPwidget input[type="checkbox"] {
+  display: none;
+}
+
+.GPwidget select {
+  padding-left: 3px;
+  border-radius: 3px;
+}
+
+.GPwidget form {
+  margin-bottom: 0;
+}
+
+.GPwidget * {
+  box-sizing: border-box;
+  background-repeat: no-repeat;
+}
+
+/* waiting */
+
+.GPwaiting {
+    background-image : url(data:image/gif;base64,R0lGODlhNAA0AIQSAAFkpSZ5sAGV3k2Ruiao3kOj1/GUBk225pe/B4S83XrK75HH3qrS5szMzNbW1sHe797e3ubm5v///////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAQAfACwAAAAANAA0AAAF5uAnjmRpnmiqrmzrvnAsz3T9FXhh72Ke8zWfDzgT/ogxIw55cjgiJ6XOhKjaII1sNio8Vb8ImnbMXVLBVhl2vI2hvzIHOwt9veGxyLwhu4dlcw59bzVjgjNoPHU2f0yOj5CRkpMocg2HjwaaBitzmZuaKWuGTKCgKHt8SKabqHulrJwno1qYQLGyJ56OrCuWtrChlMPExcbHH4s1ymK1NJZtM4Fxu3mvMXvMLdBj2ip60zG0WoBzENLVJL+66TDj7GQmbOc1EE9N4SURDvSRqcgj/gH8wC0LsGPtAK7pN7Chw4cQSYQAACH5BAUBAB8ALBYABAAaACcAAAVw4PdBTQOJaKquX+k2bJw6b+nIcu3isV7yLFrttioYczWWcVmICYkq5hKolB6pKOsUm9Vyu9JvKiyOls/otHqNQ7gR6ff7LJeX63Mx3n3f0+txeWyDhIVlBmsGiopoi45njo9fkZKTlIhil42RaYsxIQAh+QQFAQAfACwWAAkAGgAnAAAFdOAnjmQZOVCprmTjuikrf289y/Ub32SUuw6e6teICEuO31GVfC1Zxqd0Sq1arYVsAavNUrvdKVgrHm+l5jMazPVe3/C4/IN4I+73Kn5P3fOffn+AgXUqBocGK4QriIiKfoaNjip4LJKTT5eHU5qJnJJWjVUhACH5BAUBAB8ALAkAFgAnABoAAAV04CeOZGmepdM0Duq+5yo3cO2qcwPZPJnLveBvFezhZrsi76cM4lrNqHRKrVpPhmoBZuh2o4VwGOUtK8VoU9lcRKdJazbP/R7Fv236tnQ/If4IJ3pYa36Af4JuLl6Gh4gmYlKOgFclk4+VIpeBmSOTnZaUTSEAIfkEBQEAHwAsBAAWACcAGgAABXfg9xmkIZ5oqq5rWbJwnLqubLP0e+9nTvJAnwnIyxGJtaNyyWw6n1Ao4hmRIa7XpaPBbbCw4OO2y1WBw0Ryt4o6o3cRNdeRcmfTcojZvSr4CytyXntvKH9/gWR6X3cph4crEQ6LSo+IUYaWgJgnmpucIpagjpc3IQAh+QQFAQAfACwEAAkAGgAnAAAFb+AnjqJhkmiamqyhvmjLwrA806p946Tu8isbMNca1ozIpHLJTCKeiCYUupxOlVaqMxvdZqtWqbZJLpvPyEK5wGYz23AlPJ6c0412t9yucjQaDi98KX+FDTBtfYZ/gUmLhUqPf0p+i42Oi00QfxAiIQAh+QQFAQAfACwEAAQAGgAnAAAFc+AnjmRZGqhhrmyasrDounE7o/V64yvi6zuTb4gA0oTEn+lYSg5zSGcROpJOqVUntknc9rzgsHhMLhXOhTEaHV6vwW62N36G09tutbzM7/v/JhFlDYQNDmKFhYdeEYmFYA6OhIJbEJINYZdhlolkEA6UUCEAIfkEAQEAHwAsBAAEACcAGgAABXXgJ45kWSIoYq5sS6apK8swPN9mHeP8p6O9UmG4+qlMhmRryCwUa6uk1LBqMp9A5FQptBKDW2nX6+SFxSRyuXemjpvBz5lljYu2srX9vu/7/4CBgh8NhQ6DK4WKDYgkEIuGjSKQipKElIySj5CHlpSWIw6RoCEAOw==);
+    background-position : center center;
+    background-repeat : no-repeat;
+}
+
+/* General panels */
+
+.GPpanel {
+  background-color: #FFF;
+}
+
+.GPpanelHeader {
+  position: relative;
+  width: 100%;
+}
+
+.GPpanelTitle {
+  width: 100%;
+  height: 100%;
+  text-align: center;
+  font-weight: bold;
+}
+
+.GPpanelClose, .GPpanelReduce, .GPpanelInfo {
+  position: absolute;
+  cursor: pointer;
+}
+
+/* Showing/hiding advanced panels */
+
+.GPshowAdvancedToolPicto {
+  position: relative;
+  box-sizing: border-box;
+  cursor: pointer;
+}
+
+.GPshowAdvancedToolOpen {
+  position: absolute;
+  display: block;
+  box-sizing: border-box;
+}
+
+/* Flex inputs */
+
+.GPflexInput {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+  transition: max-height 0.3s ease-out, opacity 0.3s ease-out;
+}
+
+/* FIXME tempory hack with :not(.GPlocationOriginHidden) !
+.GPflexInput > *:not(.GPlocationOriginHidden) */
+.GPflexInput > * {
+  display: block;
+  height: 28px;
+  line-height: 26px;
+  border: 1px solid #999;
+  border-radius: 0;
+}
+
+.GPflexInput *:not(:last-child) {
+  border-right:none;
+}
+
+.GPflexInput *:first-child {
+  border-radius: 3px 0 0 3px;
+}
+
+.GPflexInput *:last-child {
+  border-radius: 0 3px 3px 0;
+}
+
+.GPflexInput > *:not(input) {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+.GPflexInput > input {
+  -webkit-flex: 1;
+  -webkit-box-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  padding: 0 5px;
+  min-width: 0;
+}
+
+.GPflexInput > select {
+  -webkit-flex: 1;
+  -webkit-box-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  padding-right: 7px;
+}
+
+.GPflexInput > label {
+  background-color:  #F2F2F2;
+  color: #666;
+  padding-left: 7px;
+  padding-right: 9px;
+  cursor: pointer;
+}
+
+/* Particular inputs */
+
+.GPinputSelect {
+  display: block;
+  height: 28px;
+  line-height: 26px;
+  margin: auto;
+  border: 1px solid #999;
+  color: #333;
+  cursor: pointer;
+}
+
+input.GPinputSubmit {
+  display: block;
+  width: 80px;
+  margin: auto;
+  height: 28px;
+  line-height: 26px;
+  padding: 0;
+  background: none;
+  border: none;
+  border-radius: 3px;
+  font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;
+  color: #FFF;
+  font-weight: bold;
+  opacity: 0.8;
+  transition: opacity 0.2s ease-out;
+  cursor: pointer;
+}
+
+input.GPinputSubmit:hover {
+  opacity: 1;
+}
+
+/* Autocomplete/geocode results */
+
+.GPautoCompleteList,
+.GPadvancedAutoCompleteList {
+  z-index: 2;
+  display: none;
+  position: absolute;
+  max-height: 140px;
+  background-color: #FFF;
+  border: 1px solid #999;
+  overflow-y: hidden;
+}
+
+.GPadvancedAutoCompleteList {
+  width: calc(100% - 28px);
+  border-top: none;
+  font-size: 0.9em;
+}
+
+.GPautoCompleteProposal {
+  width: 100%;
+  height: 28px;
+  line-height: 16px;
+  padding: 6px 10px;
+  color: #5E5E5E;
+  font-size: 1.0em;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow:ellipsis;
+  cursor: pointer;
+}
+
+.GPautoCompleteProposal:hover {
+  color: #000000;
+  background-color: #CEDBEF
+}
+
+/* Showing additional hidden options */
+
+.GPshowMoreOptions {
+  display: block;
+  position: absolute;
+  width: 28px;
+  height: 28px;
+  cursor: pointer;
+  transition: all 0.5s ease-out 0s;
+}
+
+input[type="checkbox"]:checked + .GPshowMoreOptions {
+  -webkit-transform: rotateX(180deg);
+  transform: rotateX(180deg);
+  /* bottom: 90px; */
+}
+
+/* GET FEATURE INFO */
+
+label[id^=GPgetFeatureInfoPicto] {
+  display: inline-block;
+}
+
+div[id^=GPgetFeatureInfo-] + label {
+  display: block;
+}
+
+span[id^=GPgetFeatureInfoActivate],
+span[id^=GPgetFeatureInfoDeactivate] {
+  position: absolute;
+  display: block;
+  transition: border-radius 0.5s ease-out 0s, opacity 0.5s ease-out 0s;
+}
+
+span[id^=GPgetFeatureInfoActivate] {
+  background-position: 0 0;
+  opacity: 1;
+}
+
+span[id^=GPgetFeatureInfoDeactivate] {
+  opacity: 0;
+}
+
+div[id^=GPgetFeatureInfo-] input[type="checkbox"]:not(:checked) + label[id^=GPgetFeatureInfoPicto] span[id^=GPgetFeatureInfoDeactivate] {
+  opacity: 1;
+}
+
+/* ISOCHRON */
+
+div[id^=GPisochron-] {
+  top: 140px;
+}
+
+/* Showing/hiding mouse position panel */
+
+label[id^=GPshowIsochronPicto] {
+  display: inline-block;
+}
+
+input[id^=GPshowIsochron-] + label {
+  display: block;
+}
+
+input[id^=GPshowIsochron-]:checked + label {
+  display: none;
+}
+
+input[id^=GPshowIsochron-] + label + div {
+  display: none;
+}
+
+input[id^=GPshowIsochron-]:checked + label + div {
+  display: block;
+}
+
+/* General panels */
+
+div[id^=GPisochronPanel-] {
+  width: 280px;
+}
+
+/* Calc waiting */
+
+.GPisochronCalcWaitingContainerVisible,
+.GPisochronCalcWaitingContainerHidden {
+  position: absolute;
+  top: 32px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background-color: rgba(255,255,255,0.9);
+  font-size: 1.5em;
+  font-weight: bold;
+  overflow: hidden;
+}
+
+.GPisochronCalcWaitingContainerVisible {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+}
+
+.GPisochronCalcWaitingContainerHidden {
+  display: none;
+}
+
+.GPisochronCalcWaiting {
+  margin: auto;
+}
+
+/* Isochron form */
+
+form[id^=GPisochronForm] {
+  padding: 15px;
+}
+
+.GPisochronFormMini {
+  max-height: 58px;
+  overflow: hidden;
+}
+
+.GPisochronFormMini div[id^="GPisochronReset-"],
+.GPisochronFormMini label[id^="GPshowIsoExclusionsPicto-"] {
+    display: none;
+}
+
+.GPisochronOriginVisible {
+  display: block;
+}
+
+.GPisochronOriginHidden {
+  display: none;
+}
+
+.GPisochronOriginPointerImg {
+  width: 28px;
+  background-color: #F2F2F2;
+  cursor: pointer;
+}
+
+input[id^="GPisochronOriginPointer"] + .GPisochronOriginPointerImg {
+  background-position: -1px -1px;
+}
+
+input[id^="GPisochronOriginPointer"]:checked + .GPisochronOriginPointerImg {
+  background-position: -29px -1px;
+}
+
+input[id^=GPisochronSubmit] {
+  margin-top: 5px;
+}
+
+/* Alternative choice */
+
+div[id^=GPisochronChoice] {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+  width: 160px;
+  -webkit-justify-content: space-between;
+  -webkit-box-pack: justify;
+      -ms-flex-pack: justify;
+          justify-content: space-between;
+  margin: auto;
+  margin-top: 15px;
+  margin-bottom: 5px;
+}
+
+.GPisochronChoiceAlt input {
+  display: none;
+}
+
+.GPisochronChoiceAltImg {
+  display: block;
+  width: 28px;
+  height: 28px;
+  margin: auto;
+  cursor: pointer;
+}
+
+input[id^=GPisochronChoiceAltChron] + .GPisochronChoiceAltImg {
+  background-position: -56px 0;
+}
+
+input[id^=GPisochronChoiceAltChron]:checked + .GPisochronChoiceAltImg {
+  background-position: -84px 0;
+}
+
+input[id^=GPisochronChoiceAltDist] + .GPisochronChoiceAltImg {
+  background-position: -112px 0;
+}
+
+input[id^=GPisochronChoiceAltDist]:checked + .GPisochronChoiceAltImg {
+  background-position: -140px 0;
+}
+
+.GPisochronChoiceAlt span {
+  cursor: pointer;
+  display:block;
+  color: #999;
+}
+
+.GPisochronValueHidden {
+  display: none;
+}
+
+div[id^=GPisochronValueChron],
+div[id^=GPisochronValueDist] {
+  width: 220px;
+  margin: auto;
+}
+
+/* Mode choice */
+
+div[id^=GPisochronModeChoice] {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+  -webkit-justify-content: space-between;
+  -webkit-box-pack: justify;
+      -ms-flex-pack: justify;
+          justify-content: space-between;
+  margin: 15px 0;
+}
+
+.GPisochronModeLabel {
+  display: block;
+  text-align: center;
+  margin-bottom: 5px;
+}
+
+div[id^=GPisochronTransportChoice] input {
+  display: none;
+}
+
+.GPisochronTransportImg {
+  display: inline-block;
+  width: 28px;
+  height: 28px;
+  cursor: pointer;
+}
+
+.GPisochronTransportImg:first-of-type {
+    margin-left: 18px;
+    margin-right: 10px;
+}
+
+input[id^=GPisochronTransportCar] + .GPisochronTransportImg {
+  background-position: -168px 0;
+}
+
+input[id^=GPisochronTransportCar]:checked + .GPisochronTransportImg {
+  background-position: -196px 0;
+}
+
+input[id^=GPisochronTransportPedestrian] + .GPisochronTransportImg {
+  background-position: -224px 0;
+}
+
+input[id^=GPisochronTransportPedestrian]:checked + .GPisochronTransportImg {
+  background-position: -252px 0;
+}
+
+select[id^=GPisochronDirectionSelect] {
+  width: 80px;
+}
+
+/* Showing/hiding exclusions */
+
+input[id^=GPshowIsoExclusions] {
+  display: none;
+}
+
+.GPshowIsoExclusionsPicto {
+  top: 250px;
+  right: 0;
+  transition: all 0.5s ease-out 0s;
+}
+
+input[id^=GPshowIsoExclusions] + label + div[id^=GPisoExclusions] {
+  max-height: 0;
+  opacity: 0;
+  margin-bottom: 0;
+}
+
+input[id^=GPshowIsoExclusions]:checked + label + div[id^=GPisoExclusions] {
+  display: block;
+  max-height: 60px;
+  opacity: 1;
+  margin-bottom: 15px;
+}
+
+/* Exclusions */
+
+div[id^=GPisoExclusions] {
+  transition: max-height 0.5s ease-in-out 0.25s, opacity 0.5s ease-in-out 0.25s, margin 0.3s ease-in-out 0.25s;
+  overflow: hidden;
+}
+
+.GPisoExclusionsLabel {
+  display: block;
+  text-align: center;
+  margin-bottom: 10px;
+  font-weight: bold;
+  line-height: 16px;
+}
+
+.GPisoExclusionsOptions {
+  display: -webkit-flex;
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-justify-content: space-around;
+  -ms-flex-pack: distribute;
+      justify-content: space-around;
+}
+
+.GPisoExclusionsOption {
+  display: block;
+  height: 28px;
+  line-height: 26px;
+  color: #A77;
+  background-color: #FEE;
+  padding-left: 28px;
+  padding-right: 5px;
+  border: 1px solid #A77;
+  border-radius: 3px;
+  cursor: pointer;
+}
+
+input:checked + .GPisoExclusionsOption {
+  background-color: #EFE;
+  background-position: 0 -28px;
+  color: #797;
+  border: 1px solid #797;
+}
+
+/* Reset picto */
+div[id^=GPisochronReset] {
+  position: absolute;
+  margin-top: 5px;
+  width: 28px;
+  height: 28px;
+  border-radius: 3px;
+  opacity: 0.8;
+  background-position: -281px 0;
+  transition: opacity 0.2s ease-out;
+  cursor: pointer;
+}
+
+div[id^=GPisochronReset]:hover {
+  opacity: 1;
+}
+
+/* LAYER SWITCHER */
+
+div[id^=GPlayerSwitcher-] {
+  font-size: 11px;
+}
+
+div[id^=GPlayerSwitcher-] [draggable] {
+  -moz-user-select: none;
+  -khtml-user-select: none;
+  -webkit-user-select: none;
+  user-select: none;
+  /* Required to make elements draggable in old WebKit */
+  -khtml-user-drag: element;
+  -webkit-user-drag: element;
+}
+
+/* Manage opening of the components through hiden checkboxes */
+
+div[id^=GPlayerSwitcher-] input[type="checkbox"] + div,
+div[id^=GPlayerSwitcher-] input[type="checkbox"] + label + div {
+  max-height: 0px;
+}
+
+div[id^=GPlayerSwitcher-] label {
+  display: block;
+}
+
+/* Showing/hiding layers list */
+
+label[id^=GPshowLayersListPicto] {
+  position: relative;
+  float: right;
+  display: block;
+  opacity: 1;
+  transition: opacity 0.5s ease-out 0s, box-shadow  0.5s ease-out 0s, border  0.5s ease-out 0s, border-radius  0.5s ease-out 0s;
+  cursor: pointer;
+}
+
+span[id^=GPshowLayersListOpen],
+span[id^=GPshowLayersListClose] {
+  position: absolute;
+  display: block;
+  transition: border-radius 0.5s ease-out 0s, opacity 0.5s ease-out 0s;
+}
+
+span[id^=GPshowLayersListOpen] {
+  background-position: 0 0;
+  opacity: 1;
+}
+
+span[id^=GPshowLayersListClose] {
+  opacity: 0;
+}
+
+div[id^=GPlayerSwitcher-] input[type="checkbox"]:checked + div + label[id^=GPshowLayersListPicto] {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+
+div[id^=GPlayerSwitcher-] input[type="checkbox"]:checked + div + label[id^=GPshowLayersListPicto] span[id^=GPshowLayersListClose] {
+  opacity: 1;
+}
+
+/* Layers list */
+
+div[id^=GPlayersList] {
+  position: relative;
+  width: 180px;
+  border-bottom-right-radius: 0;
+  opacity: 0;
+  overflow: auto;
+  transition: max-height 0.5s ease-out 0s, opacity 0.5s ease-out 0.25s;
+}
+
+div[id^=GPlayerSwitcher-] input[type="checkbox"]:checked + div[id^=GPlayersList] {
+  max-height: 232px;
+  opacity: 1;
+  transition: max-height 0.5s ease-in 0s, opacity 0.25s ease-in 0s;
+}
+
+/* Layer : general */
+
+.GPlayerSwitcher_layer {
+  position: relative;
+  top: 0;
+  background-color: #FFF;
+  border-bottom: 1px dotted #CCC;
+  overflow: hidden;
+}
+
+div[id^=GPlayersList] .GPlayerSwitcher_layer:last-child {
+  border-bottom: none;
+}
+
+.GPlayerBasicTools,
+.GPlayerAdvancedTools {
+  position: relative;
+  width: 100%;
+  height: 28px;
+}
+
+.GPlayerVisibility,
+.GPlayerInfo,
+.GPlayerInfoOpened,
+.GPlayerRemove {
+  width: 28px;
+  height: 28px;
+  cursor: pointer;
+}
+
+.GPlayerVisibility,
+.GPlayerName,
+.GPlayerInfo,
+.GPlayerInfoOpened,
+.GPlayerRemove,
+.GPlayerOpacity,
+.GPlayerOpacityValue {
+  position: absolute;
+  top: 0;
+}
+
+.GPghostLayer {
+  opacity: 0;
+}
+
+/* Layer basic tools */
+
+.GPlayerBasicTools {
+  background-color: #FFF;
+}
+
+.GPlayerVisibility {
+  left: 0;
+  background-position: -28px 0;
+}
+
+input[type="checkbox"]:checked + .GPlayerVisibility {
+  background-position: 0 0;
+}
+
+.GPlayerName {
+  left: 28px;
+  width: calc(100% - 56px);
+  line-height: 28px;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  padding-left: 4px;
+  cursor: move;
+}
+
+.outOfRange .GPlayerName {
+  color: #AAA;
+}
+
+/* Showing layer advanced tools */
+
+.GPshowLayerAdvancedTools {
+  top: 0;
+  right: 0;
+  background-position: -112px 0;
+}
+
+.GPlayerAdvancedTools {
+  display: block;
+  max-height: 0;
+  opacity: 0;
+  transition: max-height 0.5s ease-out 0s, opacity 0.5s ease-out 0s;
+}
+
+div[id^=GPlayerSwitcher-] input[type="checkbox"]:checked + label + .GPlayerAdvancedTools {
+  max-height: 28px;
+  opacity: 1;
+}
+
+/* Layer advanced tools */
+
+.GPlayerInfo {
+  left: 0;
+  background-position: -55px 0;
+}
+
+.GPlayerInfoOpened {
+  left: 0;
+  background-position: -83px 0;
+}
+
+.GPlayerOpacity {
+  left: 28px;
+  width: calc(100% - 100px);
+  height: 28px;
+  padding-left: 8px;
+}
+
+.GPlayerOpacityValue {
+  width: 32px;
+  left: calc(100% - 60px);
+  line-height: 28px;
+  font-size: 10px;
+  font-style: italic;
+  cursor: default;
+}
+
+.GPlayerRemove {
+  right: 0;
+  background-position: -140px 0;
+}
+
+/* Opacity slider : general */
+
+.GPlayerOpacity input {
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  background: none;
+  display: block;
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  overflow: hidden;
+  cursor: pointer;
+}
+
+.GPlayerOpacity input[type="range"]:focus {
+  box-shadow: none;
+  outline: none;
+}
+
+/* Opacity slider : Chrome, Safari, Opera */
+
+.GPlayerOpacity input[type="range"]::-webkit-slider-runnable-track {
+  -webkit-appearance: none;
+  height: 3px;
+}
+
+.GPlayerOpacity input[type="range"]::-webkit-slider-thumb:before {
+  position: absolute;
+  top: 0;
+  right: 50%;
+  left: -200px;
+  height: 3px;
+  pointer-events: none;
+}
+
+.GPlayerOpacity input[type="range"]::-webkit-slider-thumb {
+  width: 9px;
+  height: 17px;
+  -webkit-appearance: none;
+  border: 2px solid #FFF;
+  background-color: #505050;
+  position: relative;
+  top: -7px;
+}
+
+/* Opacity slider : Firefox */
+
+.GPlayerOpacity input[type="range"]::-moz-range-track {
+  width: 80px;
+  height: 3px;
+}
+
+.GPlayerOpacity input[type="range"]::-moz-range-thumb {
+  width: 5px;
+  height: 13px;
+  border: 2px solid #FFF;
+  border-radius: 0;
+  box-shadow: 0;
+  background-color: #505050;
+  position: relative;
+}
+
+/* Opacity slider : IE */
+
+.GPlayerOpacity input[type="range"]::-ms-track {
+  border: 0;
+  border-color: transparent;
+  border-radius: 0;
+  border-width: 0;
+  color: transparent;
+  height: 3px;
+  width: 80px;
+}
+
+.GPlayerOpacity input[type="range"]::-ms-fill-lower,
+.GPlayerOpacity input[type="range"]::-ms-fill-upper {
+  background: transparent;
+  border-radius: 0;
+}
+
+.GPlayerOpacity input[type="range"]::-ms-thumb {
+  width: 5px;
+  height: 13px;
+  border: 2px solid #FFF;
+  background-color: #505050;
+}
+
+.GPlayerOpacity input[type="range"]::-ms-tooltip {
+  display: none;
+}
+
+/* Layer info panel */
+
+div[id^=GPlayerInfoPanel] {
+  position: absolute;
+  top: 0;
+  overflow-y: hidden;
+  padding-top: 10px;
+  padding-bottom: 10px;
+}
+
+.GPlayerInfoPanelOpened {
+  display: block;
+}
+
+.GPlayerInfoPanelClosed {
+  display: none;
+}
+
+div[id^=GPlayerInfoContent] {
+  position: relative;
+  width: 280px;
+  max-height: 200px;
+  overflow-y: auto;
+  padding-left: 10px;
+  padding-right: 10px;
+}
+
+div[id^=GPlayerInfoTitle] {
+  width: calc(100% - 52px);
+  margin: auto;
+  margin-bottom: 10px;
+  padding-bottom: 5px;
+  text-align: center;
+  font-size: 1.1em;
+  font-weight: bold;
+}
+
+div[id^=GPlayerInfoQuicklook] {
+  position: absolute;
+  top: -2px;
+  left: 10px;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+}
+
+div[id^=GPlayerInfoClose] {
+  position: absolute;
+  top: -8px;
+  right: 10px;
+  width: 28px;
+  height: 28px;
+  cursor: pointer;
+}
+
+div[id^=GPlayerInfoDescription] {
+  font-size: 0.9em;
+}
+
+div[id^=GPlayerInfoLegend] {
+
+}
+
+div[id^=GPlayerInfoMetadata] {
+
+}
+
+.GPlayerInfoSubtitle {
+  padding-left: 35px;
+  font-weight: bold;
+  margin-top: 10px;
+  margin-bottom: 4px;
+}
+
+.GPlayerInfoLink,
+.GPlayerInfoPopup {
+  line-height: 20px;
+  padding-left: 23px;
+  white-space: nowrap;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  color: #999999;
+  background-repeat: no-repeat;
+  cursor: pointer;
+}
+
+.GPlayerInfoLink {
+  background-position: 0 -20px;
+}
+
+.GPlayerInfoLink:hover,
+.GPlayerInfoPopup:hover {
+  color: #333;
+}
+
+.GPlayerInfoLink a,
+.GPlayerInfoLink a:visited
+.GPlayerInfoLink a:focus
+.GPlayerInfoLink a:hover {
+  text-decoration: none;
+  color: inherit;
+}
+
+/* Location */
+
+/* Location form */
+
+.GPlocationStageFlexInput {
+  max-height: 28px;
+  opacity: 1;
+}
+
+.GPlocationStageFlexInputHidden {
+  max-height: 0;
+  opacity: 0;
+  overflow: hidden;
+}
+
+.GPlocationOriginVisible {
+  display: block;
+}
+
+.GPlocationOriginHidden {
+  display: none;
+}
+
+label.GPlocationOriginPointerImg[id*="GPlocationOriginPointerImg"] {
+  width: 28px;
+  border-top-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+  border-right: 1px solid #999;
+}
+
+input[id*="GPlocationOriginPointer"] + .GPlocationOriginPointerImg {
+  background-position: -1px -1px;
+}
+
+input[id*="GPlocationOriginPointer"]:checked + .GPlocationOriginPointerImg {
+  background-position: -29px -1px;
+}
+
+.GPlocationStageRemove,
+div[id^=GPlocationStageAdd] {
+  width: 28px;
+  border: none;
+  cursor: pointer;
+}
+
+.GPlocationStageRemove {
+  background-position: -84px 0;
+}
+
+div[id^=GPlocationStageAdd] {
+  background-position: -56px 0;
+}
+
+/* Showing/hiding drawing panel */
+
+label[id^=GPshowMeasureAreaPicto-] {
+  display: inline-block;
+}
+
+input[id^=GPshowMeasureArea-] + label {
+  display: block;
+}
+
+input[id^=GPshowMeasureArea-]:checked + label {
+  display: block;
+  background-color: rgba(0,60,136,0.5);
+}
+
+input[id^=GPshowMeasureArea-] + label + div {
+  display: block;
+}
+
+input[id^=GPshowMeasureArea-]:checked + label + div {
+  display: block;
+}
+
+/* Showing/hiding drawing panel */
+
+label[id^=GPshowMeasureAzimuthPicto-] {
+  display: inline-block;
+}
+
+input[id^=GPshowMeasureAzimuth-] + label {
+  display: block;
+}
+
+input[id^=GPshowMeasureAzimuth-]:checked + label {
+  display: block;
+  background-color: rgba(0,60,136,0.5);
+}
+
+input[id^=GPshowMeasureAzimuth-] + label + div {
+  display: block;
+}
+
+input[id^=GPshowMeasureAzimuth-]:checked + label + div {
+  display: block;
+}
+
+/* Showing/hiding drawing panel */
+
+label[id^=GPshowMeasureLengthPicto-] {
+  display: inline-block;
+}
+
+input[id^=GPshowMeasureLength-] + label {
+  display: block;
+}
+
+input[id^=GPshowMeasureLength-]:checked + label {
+  display: block;
+  background-color: rgba(0,60,136,0.5);
+}
+
+input[id^=GPshowMeasureLength-] + label + div {
+  display: block;
+}
+
+input[id^=GPshowMeasureLength-]:checked + label + div {
+  display: block;
+}
+
+/* MEASURE TOOL */
+
+.GPmeasureTooltip {
+  position: relative;
+  background: rgba(0, 0, 0, 0.5);
+  border-radius: 4px;
+  color: white;
+  padding: 4px 8px;
+  white-space: nowrap;
+}
+
+.GPmeasureTooltip-measure {
+  font-weight: bold;
+}
+
+.GPmeasureTooltip-info {
+  font-size: 0.75em;
+  text-align: center;
+}
+
+.GPmeasureTooltip-static {
+  background-color: #ffcc33;
+  color: black;
+  border: 1px solid white;
+}
+
+.GPmeasureTooltip-hidden {
+  display: none;
+}
+
+.GPmeasureTooltip-measure::before,
+.GPmeasureTooltip-info::before,
+.GPmeasureTooltip-static::before {
+  border-top: 6px solid rgba(0, 0, 0, 0.5);
+  border-right: 6px solid transparent;
+  border-left: 6px solid transparent;
+  content: "";
+  position: absolute;
+  bottom: -6px;
+  margin-left: -7px;
+  left: 50%;
+}
+
+.GPmeasureTooltip-static::before {
+  border-top-color: #ffcc33;
+}
+
+/* MOUSE POSITION */
+
+/* Showing/hiding mouse position panel */
+
+label[id^=GPshowMousePositionPicto] {
+  display: inline-block;
+}
+
+input[id^=GPshowMousePosition-] + label {
+  display: block;
+}
+
+input[id^=GPshowMousePosition-]:checked + label {
+  display: none;
+}
+
+input[id^=GPshowMousePosition-] + label + div {
+  display: none;
+}
+
+input[id^=GPshowMousePosition-]:checked + label + div {
+  display: block;
+}
+
+/* General panels */
+
+div[id^=GPmousePositionPanel-] {
+  width: 300px;
+  overflow: hidden;
+}
+
+/* Basic infos */
+
+div[id^=GPmousePositionBasicPanel] {
+  padding: 10px 15px;
+  position: relative;
+}
+
+.GPmousePositionLabel,
+.GPmousePositionCoords {
+  display: inline-block;
+  line-height: 20px;
+}
+
+.GPmousePositionLabel {
+  width: 80px;
+  font-weight: bold;
+}
+
+.GPmousePositionCoords {
+  width: 110px;
+}
+
+/* Showing settings */
+
+.GPshowMousePositionSettingsPicto {
+  bottom: 5px;
+  right: 0;
+  transition: all 0.5s ease-out 0s;
+}
+
+div[id^=GPmousePosition-] input[type="checkbox"]:checked + .GPshowMousePositionSettingsPicto {
+  bottom: 100px;
+}
+
+div[id^=GPmousePositionSettings-] {
+  display: block;
+  max-height: 0;
+  opacity: 0;
+  transition: max-height 0.5s ease-out 0s, opacity 0.5s ease-out 0s;
+}
+
+div[id^=GPmousePosition-] input[type="checkbox"]:checked + label + div[id^=GPmousePositionSettings-] {
+  max-height: 95px;
+  opacity: 1;
+}
+
+/* Settings */
+
+div[id^=GPmousePositionSettings-] {
+  height: 95px;
+  padding-left: 0 15px;
+  overflow: hidden;
+}
+
+.GPmousePositionSettingsLabel {
+  display: block;
+  margin: auto;
+  text-align: center;
+  font-weight: bold;
+  line-height: 16px;
+}
+
+.GPmousePositionSettingsSelect {
+  width: 180px;
+  margin-top: 5px;
+}
+
+/* General panels */
+
+div[id^=GPmousePositionCoordinate-] input.error {
+    border: 1px solid rgb(255, 0, 0);
+}
+div[id^=GPmousePositionCoordinate-] input[readonly] {
+    border: 1px solid transparent;
+    padding: 2px;
+    text-align: right;
+}
+
+input[id^=GPmousePositionLat-], input[id^=GPmousePositionLon-] {
+    width: 120px;
+}
+
+span[id^=GPmousePositionAlt-] {
+    display: inline-block;
+    padding: 2px;
+    width: 120px;
+    line-height: 20px;
+    text-align: right;
+}
+
+/* sexagesimal coordinates */
+
+.GPSexagesimal, .GPSexagesimalsec {
+    margin:0;
+    border: 1px solid rgb(204, 204, 204);
+    border-radius: 4px;
+}
+
+input:read-only.GPSexagesimal, input:read-only.GPSexagesimalsec {
+    text-align: right;
+}
+
+.GPSexagesimal {
+    width: 30px;
+}
+
+.GPSexagesimalsec {
+    width: 45px;
+}
+.GPmousePositionSexagesimalLabel {
+    font-size: 1.2em;
+    vertical-align: middle;
+    padding: 0;
+}
+
+/* direction N/S ou E/O */
+select.GPmousePositionDirection {
+    border: 1px solid #999;
+    margin-left: 2px;
+}
+
+select.GPmousePositionDirection:disabled{
+    border: none;
+    background: transparent;
+    color: black;
+    /*For FireFox*/
+   -webkit-appearance: none;
+   /*For Chrome*/
+   -moz-appearance: none;
+}
+
+/*For IE10+*/
+select.GPmousePositionDirection:disabled::-ms-expand {
+    display: none;
+}
+select.GPmousePositionDirection:disabled::-ms-value {
+    color: black;
+}
+
+.GPmousePositionUnits,
+.GPmousePositionAltitudeUnits {
+    margin-left: 5px;
+}
+
+/* EDIT COORDINATES TOOLS */
+.GPmousePositionPanelEditTools {
+    position: absolute;
+    top: 20px;
+    right: 5px;
+}
+
+.GPmousePositionEditTool {
+    width: 18px;
+    height: 18px;
+    display: inline-block;
+    cursor: pointer;
+}
+
+span[id^=GPmousePositionCloseEdit] {
+    background-position: -18px 0;
+    margin-left: 5px;
+}
+
+img[id^=GPmousePositionMarker]:hover {
+    cursor: pointer;
+    opacity: 0.7;
+}
+
+/* Map center localisation */
+
+#GPmapCenter {
+  display: none;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 50px;
+  height: 50px;
+  margin-top: -25px;
+  margin-left: -25px;
+}
+
+#GPmapCenter.GPmapCenterVisible {
+  display: block;
+}
+
+/* REVERSE GEOCODING */
+
+[id^="GPreverseGeocoding-"] {
+  top: 180px;
+}
+
+/* Showing/hiding reverse geocoding panel */
+
+[id^="GPshowReverseGeocodingPicto-"] {
+  display: inline-block;
+}
+
+[id^="GPshowReverseGeocoding-"] + label {
+  display: block;
+}
+
+[id^="GPshowReverseGeocoding-"]:checked + label {
+  display: none;
+}
+
+[id^="GPshowReverseGeocoding-"] + label + div {
+  display: none;
+}
+
+[id^="GPshowReverseGeocoding-"]:checked + label + div {
+  display: block;
+}
+
+/* General panels */
+
+div[id^=GPreverseGeocodingResultsClose] {
+  top: 0;
+  right: 0;
+  width: 30px;
+  height: 32px;
+  /*background-position: -26px 0;*/
+}
+
+[id^="GPreverseGeocodingPanel-"] {
+  width: 280px;
+}
+
+.GPreverseGeocodingComponentHidden {
+  display: none;
+}
+
+div[id^="GPreverseGeocodingReturnPicto-"] {
+  position: absolute;
+  width: 26px;
+  height: 26px;
+  border-radius: 3px;
+  opacity: 1;
+  background-position: 0 0;
+  cursor: pointer;
+}
+
+.GPreverseGeocodingReturnPictoHidden {
+    display: none;
+}
+
+/* Calc waiting */
+
+.GPreverseGeocodingCalcWaitingContainerVisible,
+.GPreverseGeocodingCalcWaitingContainerHidden {
+  position: absolute;
+  top: 32px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background-color: rgba(255,255,255,0.9);
+  font-size: 1.5em;
+  font-weight: bold;
+  overflow: hidden;
+}
+
+.GPreverseGeocodingCalcWaitingContainerVisible {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+}
+
+.GPreverseGeocodingCalcWaitingContainerHidden {
+  display: none;
+}
+
+.GPreverseGeocodingCalcWaiting {
+  margin: auto;
+}
+
+/* Search panel */
+
+[id^="GPreverseGeocodingForm-"] {
+  position: relative;
+  max-height: 270px;
+  overflow-y: auto;
+  padding-left: 15px;
+  padding-right: 15px;
+  padding-top: 10px;
+}
+
+.GPreverseGeocodingCodeLabel,
+.GPreverseGeocodingFilterLabel {
+  max-width: 105px;
+}
+
+.GPreverseGeocodingCodeLabel,
+.GPreverseGeocodingCode {
+  margin-top: 5px;
+  margin-bottom: 0;
+}
+
+.GPreverseGeocodingFilterLabel,
+.GPreverseGeocodingFilterInput {
+  margin-bottom: 5px;
+}
+
+input[id^="GPreverseGeocodingSubmit-"] {
+  margin-top: 5px;
+  margin-bottom: 15px;
+  width: 100px;
+}
+
+/* Calc waiting */
+
+/* TODO: waiting  */
+.GPreverseGeocodingCalcWaitingContainerVisible,
+.GPreverseGeocodingCalcWaitingContainerHidden {
+  position: absolute;
+  top: 32px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background-color: rgba(255,255,255,0.9);
+  font-size: 1.5em;
+  font-weight: bold;
+  overflow: hidden;
+}
+
+.GPreverseGeocodingCalcWaitingContainerVisible {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+}
+
+.GPreverseGeocodingCalcWaitingContainerHidden {
+  display: none;
+}
+
+.GPreverseGeocodingCalcWaiting {
+  margin: auto;
+}
+
+/* Result panel */
+
+div[id^=GPreverseGeocodingResultsList-] {
+  position: relative;
+  max-height: 210px;
+  overflow-y: auto;
+}
+
+/* ROUTE */
+
+div[id^=GProute-] {
+   top: 100px;
+}
+
+/* Showing/hiding route panel */
+
+label[id^=GPshowRoutePicto] {
+  display: inline-block;
+}
+
+input[id^=GPshowRoute-] + label {
+  display: block;
+}
+
+input[id^=GPshowRoute-]:checked + label {
+  display: none;
+}
+
+input[id^=GPshowRoute-] + label + div {
+  display: none;
+}
+
+input[id^=GPshowRoute-]:checked + label + div {
+  display: block;
+}
+
+/* General panels */
+
+div[id^=GProutePanel-] {
+  width: 320px;
+}
+
+.GProuteComponentHidden {
+  display: none;
+}
+
+/* Calc waiting */
+
+.GProuteCalcWaitingContainerVisible,
+.GProuteCalcWaitingContainerHidden {
+  position: absolute;
+  top: 32px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background-color: rgba(255,255,255,0.9);
+  font-size: 1.5em;
+  font-weight: bold;
+  overflow: hidden;
+}
+
+.GProuteCalcWaitingContainerVisible {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+}
+
+.GProuteCalcWaitingContainerHidden {
+  display: none;
+}
+
+.GProuteCalcWaiting {
+  margin: auto;
+}
+
+/* Route form */
+
+form[id^=GProuteForm] {
+  padding: 15px;
+}
+
+.GProuteFormMini {
+  max-height: 58px;
+  overflow: hidden;
+  -webkit-transform: translateY(-5px);
+  transform: translateY(-5px);
+}
+
+.GProuteStageFlexInput {
+  max-height: 28px;
+  opacity: 1;
+}
+
+.GProuteStageFlexInputHidden {
+  max-height: 0;
+  opacity: 0;
+  overflow: hidden;
+}
+
+form[id^=GProuteForm] > .GPlocationStageFlexInput {
+  margin-top: 5px;
+}
+
+form[id^=GProuteForm] > .GPlocationStageFlexInputHidden {
+  margin-top: 0;
+}
+
+form[id^=GProuteForm].GProuteFormMini .GPlocationStageFlexInput:first-child {
+  margin-top: 5px;
+}
+
+.GProuteOriginVisible {
+  display: block;
+}
+
+.GProuteOriginHidden {
+  display: none;
+}
+
+label.GProuteOriginPointerImg[id*="GProuteOriginPointerImg"] {
+  width: 28px;
+  border-top-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+  border-right: 1px solid #999;
+}
+
+input[id*="GProuteOriginPointer"] + .GProuteOriginPointerImg {
+  background-position: -1px -1px;
+}
+
+input[id*="GProuteOriginPointer"]:checked + .GProuteOriginPointerImg {
+  background-position: -29px -1px;
+}
+
+.GProuteStageRemove,
+div[id^=GProuteStageAdd] {
+  width: 28px;
+  border: none;
+  cursor: pointer;
+}
+
+.GProuteFormMini .GProuteStageRemove,
+.GProuteFormMini div[id^=GProuteStageAdd] {
+  display: none;
+}
+
+.GProuteStageRemove {
+  background-position: -84px 0;
+}
+
+div[id^=GProuteStageAdd] {
+  background-position: -56px 0;
+}
+
+/* Mode choice */
+
+div[id^=GProuteModeChoice] {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+  -webkit-justify-content: space-around;
+  -ms-flex-pack: distribute;
+      justify-content: space-around;
+  margin: 15px 0;
+}
+
+.GProuteModeLabel {
+  display: block;
+  text-align: center;
+  margin-bottom: 5px;
+}
+
+div[id^=GProuteTransportChoice] input {
+  display: none;
+}
+
+.GProuteTransportImg {
+  display: inline-block;
+  width: 28px;
+  height: 28px;
+  cursor: pointer;
+}
+
+.GProuteTransportImg:first-of-type {
+    margin-left: 18px;
+    margin-right: 10px;
+}
+
+input[id^=GProuteTransportCar] + .GProuteTransportImg {
+  background-position: -112px 0;
+}
+
+input[id^=GProuteTransportCar]:checked + .GProuteTransportImg {
+  background-position: -140px 0;
+}
+
+input[id^=GProuteTransportPedestrian] + .GProuteTransportImg {
+  background-position: -168px 0;
+}
+
+input[id^=GProuteTransportPedestrian]:checked + .GProuteTransportImg {
+  background-position: -196px 0;
+}
+
+select[id^=GProuteComputationSelect] {
+  width: 100px;
+}
+
+/* Showing/hiding exclusions */
+
+input[id^=GPshowRouteExclusions] {
+  display: none;
+}
+
+.GPshowRouteExclusionsPicto {
+  /* top: 185px; */
+  /* bottom: 25px; */
+  right: 0;
+  transition: all 0.3s ease-out 0s;
+}
+
+input[id^=GPshowRouteExclusions] + label + div[id^=GProuteExclusions] {
+  max-height: 0;
+  opacity: 0;
+  margin-bottom: 0;
+}
+
+input[id^=GPshowRouteExclusions]:checked + label + div[id^=GProuteExclusions] {
+  display: block;
+  max-height: 60px;
+  opacity: 1;
+  margin-bottom: 15px;
+}
+
+/* Exclusions */
+
+div[id^=GProuteExclusions] {
+  transition: max-height 0.5s ease-in-out 0.25s, opacity 0.5s ease-in-out 0.25s, margin 0.3s ease-in-out 0.25s;
+  overflow: hidden;
+}
+
+.GProuteExclusionsLabel {
+  display: block;
+  text-align: center;
+  margin-bottom: 10px;
+  font-weight: bold;
+  line-height: 16px;
+}
+
+.GProuteExclusionsOptions {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+  -webkit-justify-content: space-around;
+  -ms-flex-pack: distribute;
+      justify-content: space-around;
+}
+
+.GProuteExclusionsOption {
+  display: block;
+  height: 28px;
+  line-height: 26px;
+  color: #A77;
+  background-color: #FEE;
+  padding-left: 28px;
+  padding-right: 5px;
+  border: 1px solid #A77;
+  border-radius: 3px;
+  cursor: pointer;
+}
+
+input:checked + .GProuteExclusionsOption {
+  background-color: #EFE;
+  background-position: 0 -28px;
+  color: #797;
+  border: 1px solid #797;
+}
+
+/* Reset picto */
+div[id^=GProuteReset] {
+  position: absolute;
+  width: 28px;
+  height: 28px;
+  border-radius: 3px;
+  opacity: 0.8;
+  background-position: -224px 0;
+  transition: opacity 0.2s ease-out;
+  cursor: pointer;
+}
+
+div[id^=GProuteReset]:hover {
+  opacity: 1;
+}
+
+/* Result panel */
+
+div[id^=GProuteResultsPanel] {
+  padding: 15px;
+}
+
+.GProuteResultStage {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+}
+
+div[id^=GProuteResultsStages] {
+  margin-bottom: 15px;
+}
+
+.GProuteResultStageLabel,
+.GProuteResultStageValue,
+.GProuteResultsValueLabel,
+div[id^=GProuteResultsValueDist],
+div[id^=GProuteResultsValueTime] {
+  display: inline-block;
+  line-height: 18px;
+}
+
+.GProuteResultStageLabel,
+.GProuteResultsValueLabel {
+  color: #666;
+}
+
+.GProuteResultStageLabel {
+  width: 60px;
+}
+
+.GProuteResultsValueLabel {
+  width: 65px;
+}
+
+.GProuteResultStageValue {
+  -webkit-flex: 1;
+  -webkit-box-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  overflow-x: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+div[id^=GProuteResultsValueDist],
+div[id^=GProuteResultsValueTime] {
+  width: 80px;
+  font-weight: bold;
+}
+
+div[id^=GProuteResults-] {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: -webkit-box;
+  display: flex;
+  -webkit-justify-content: space-between;
+  -webkit-box-pack: justify;
+      -ms-flex-pack: justify;
+          justify-content: space-between;
+  -webkit-align-items: center;
+  -webkit-box-align: center;
+      -ms-flex-align: center;
+          align-items: center;
+  margin-bottom: 10px;
+}
+
+select[id^=GProuteResultsComputationSelect] {
+  width: 100px;
+}
+
+div[id^=GProuteResultsNew] {
+  width: 28px;
+  height: 28px;
+  border-radius: 3px;
+  opacity: 0.8;
+  background-position: -224px 0;
+  transition: opacity 0.2s ease-out;
+  cursor: pointer;
+}
+
+div[id^=GProuteResultsNew]:hover {
+  opacity: 1;
+}
+
+/* Results details header */
+
+.GPfakeBorder {
+  display: inline-block;
+  height: 14px;
+  width: 60px;
+  border-bottom: 1px solid #999;
+}
+
+.GPfakeBorderLeft {
+  margin-left:15px;
+}
+
+input[id^=GProuteResultsShowDetails] + label,
+input[id^=GProuteResultsShowDetails] + label + label {
+  width: 130px;
+  line-height: 28px;
+  vertical-align: top;
+  text-align: center;
+  font-weight: bold;
+  cursor: pointer;
+  transition: color 0.2s ease-out;
+}
+
+input[id^=GProuteResultsShowDetails] + label,
+input[id^=GProuteResultsShowDetails]:checked + label + label {
+  display: inline-block;
+}
+
+input[id^=GProuteResultsShowDetails]:checked + label,
+input[id^=GProuteResultsShowDetails] + label + label {
+  display: none;
+}
+
+input[id^=GProuteResultsShowDetails] + label + label + div + div[id^=GProuteResultsDetails] {
+  max-height: 0;
+  opacity: 0;
+}
+
+input[id^=GProuteResultsShowDetails]:checked + label + label + div + div[id^=GProuteResultsDetails] {
+  max-height: 200px;
+  opacity: 1;
+}
+
+div[id^=GProuteResultsDetails] {
+  overflow-y: auto;
+  transition: max-height 0.5s ease-in-out 0.25s, opacity 0.5s ease-in-out 0.25s;
+}
+
+.GProuteResultsDetailsNumber,
+.GProuteResultsDetailsInstruction {
+  display: inline-block;
+  margin-top: 4px;
+  line-height: 16px;
+  color: #666;
+}
+
+.GProuteResultsDetailsNumber {
+  font-weight: bold;
+  width: 22px;
+  text-align: right;
+  vertical-align: top;
+}
+
+.GProuteResultsDetailsInstruction {
+  width: calc(100% - 30px);
+  padding-left: 5px;
+}
+
+/* SEARCH ENGINE */
+
+input[id^=GPshowSearchEngine-] + label + form[id^=GPsearchInput-] {
+  max-width: 0px;
+}
+
+/* Showing/hiding search engine input */
+
+input[id^=GPshowSearchEngine-] {
+  display: none;
+}
+
+label[id^=GPshowSearchEnginePicto] {
+  display: inline-block;
+  transition: border-radius 0s ease-out 0s;
+  transition-delay: 0.5s;
+}
+
+input[id^=GPshowSearchEngine-]:checked + label {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+  transition-delay: 0s;
+}
+
+input[id^=GPshowSearchEngine-] + label + form[id^=GPsearchInput-] {
+  max-width: 0px;
+  border: none;
+  transition: max-width 0.5s ease-out 0s;
+}
+
+input[id^=GPshowSearchEngine-]:checked + label + form[id^=GPsearchInput-] {
+  max-width: 280px;
+}
+
+input[id^=GPshowSearchEngine-] + label + form[id^=GPsearchInput-] + div[id^=GPshowAdvancedSearch] {
+  display: none;
+}
+
+input[id^=GPshowSearchEngine-]:checked + label + form[id^=GPsearchInput-] + div[id^=GPshowAdvancedSearch] {
+  display: inline-block;
+}
+
+div[id^=GPautoCompleteList] {
+  display: none;
+}
+
+input[id^=GPshowSearchEngine-]:checked + label + form[id^=GPsearchInput-] + div[id^=GPautoCompleteList] {
+  display: block;
+}
+
+/* Simple search input */
+
+form[id^=GPsearchInput-] {
+  display: inline-block;
+  position: relative;
+  left: -3px;
+  width: 280px;
+  overflow: hidden;
+}
+
+form[id^=GPsearchInput-] input {
+  display: block;
+  width: 100%;
+  height: 100%;
+  border: 1px solid #999;
+  border-top-right-radius: 5px;
+  border-bottom-right-radius: 5px;
+  padding: 0;
+  padding-right: 30px;
+  padding-left: 5px;
+  color: #333;
+  font-size: 1.0em;
+}
+
+form[id^=GPsearchInput-] input:disabled {
+  background-color: #DDD;
+  color: #999;
+}
+
+div[id^=GPsearchInputReset] {
+  position: absolute;
+  top: 0;
+  right: 0;
+  width: 30px;
+  height: 32px;
+  background-position: -30px 0;
+  cursor: pointer;
+}
+
+/* General panels */
+
+div[id^=GPgeocodeResultsClose],
+div[id^=GPadvancedSearchClose] {
+  top: 0;
+  right: 0;
+  width: 30px;
+  height: 32px;
+}
+
+div[id^=GPgeocodeResultsClose] {
+  background-position: 0 0;
+}
+
+div[id^=GPadvancedSearchClose] {
+  background-repeat: no-repeat;
+}
+
+/* Advanced search picto */
+
+div[id^=GPshowAdvancedSearch] {
+  transition: border-radius 0s ease-out 0s;
+  transition-delay: 0.5s;
+}
+
+/* Advanced search panel */
+
+div[id^=GPadvancedSearchPanel] {
+  display: none;
+  width: 280px;
+  vertical-align: top;
+  overflow: hidden;
+}
+
+form[id^=GPadvancedSearchForm] {
+  max-height: 220px;
+  overflow-y: auto;
+  padding-left: 15px;
+  padding-right: 15px;
+}
+
+.GPadvancedSearchCodeLabel,
+.GPadvancedSearchFilterLabel {
+  max-width: 105px;
+}
+
+.GPadvancedSearchCodeLabel,
+.GPadvancedSearchCode,
+ div[id^=GPadvancedSearchFilters] {
+  margin-top: 15px;
+}
+
+.GPadvancedSearchFilterLabel,
+.GPadvancedSearchFilterInput {
+  margin-bottom: 5px;
+}
+
+input[id^=GPadvancedSearchSubmit] {
+  margin-top: 10px;
+  margin-bottom: 15px;
+}
+
+/* Autocomplete list / geocode results */
+
+div[id^=GPautoCompleteList],
+div[id^=GPgeocodeResultsList] {
+  width: 280px;
+}
+
+div[id^=GPautoCompleteList] {
+  top: 35px;
+}
+
+div[id^=GPgeocodeResultsList] {
+  display: none;
+  position: absolute;
+  top: 40px;
+  border-radius: 4px;
+  overflow: hidden;
+}
+
+div[id^=GPgeocodeResults-] {
+  background-color: #FFF;
+  max-height: 140px;
+  overflow-y: auto;
+}
+
+/**
+* Map loading
+* @sample
+* function setMap(map) {
+*   var center = this._createLoadingElement();
+*   map.getViewport().appendChild(center);
+*   center.className = ""; // invisible !
+*   center.className = "GPmapLoadingVisible"; // visible !
+* }
+*
+* function _createLoadingElement() {
+*   var div = document.createElement("div");
+*   div.id = "GPmapLoading";
+*   div.className = "";
+*   return div;
+* }
+*/
+
+#GPmapLoading {
+  display: none;
+  position: absolute;
+  z-index: 50;
+  top: 50%;
+  left: 50%;
+  width: 50px;
+  height: 50px;
+  margin-top: -25px;
+  margin-left: -25px;
+}
+
+#GPmapLoading.GPmapLoadingVisible {
+  display: block;
+}
+
+#GPmapLoading {
+    background-image: url(data:image/gif;base64,R0lGODlhNAA0AIQSAAFkpSZ5sAGV3k2Ruiao3kOj1/GUBk225pe/B4S83XrK75HH3qrS5szMzNbW1sHe797e3ubm5v///////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAQAfACwAAAAANAA0AAAF5uAnjmRpnmiqrmzrvnAsz3T9FXhh72Ke8zWfDzgT/ogxIw55cjgiJ6XOhKjaII1sNio8Vb8ImnbMXVLBVhl2vI2hvzIHOwt9veGxyLwhu4dlcw59bzVjgjNoPHU2f0yOj5CRkpMocg2HjwaaBitzmZuaKWuGTKCgKHt8SKabqHulrJwno1qYQLGyJ56OrCuWtrChlMPExcbHH4s1ymK1NJZtM4Fxu3mvMXvMLdBj2ip60zG0WoBzENLVJL+66TDj7GQmbOc1EE9N4SURDvSRqcgj/gH8wC0LsGPtAK7pN7Chw4cQSYQAACH5BAUBAB8ALBYABAAaACcAAAVw4PdBTQOJaKquX+k2bJw6b+nIcu3isV7yLFrttioYczWWcVmICYkq5hKolB6pKOsUm9Vyu9JvKiyOls/otHqNQ7gR6ff7LJeX63Mx3n3f0+txeWyDhIVlBmsGiopoi45njo9fkZKTlIhil42RaYsxIQAh+QQFAQAfACwWAAkAGgAnAAAFdOAnjmQZOVCprmTjuikrf289y/Ub32SUuw6e6teICEuO31GVfC1Zxqd0Sq1arYVsAavNUrvdKVgrHm+l5jMazPVe3/C4/IN4I+73Kn5P3fOffn+AgXUqBocGK4QriIiKfoaNjip4LJKTT5eHU5qJnJJWjVUhACH5BAUBAB8ALAkAFgAnABoAAAV04CeOZGmepdM0Duq+5yo3cO2qcwPZPJnLveBvFezhZrsi76cM4lrNqHRKrVpPhmoBZuh2o4VwGOUtK8VoU9lcRKdJazbP/R7Fv236tnQ/If4IJ3pYa36Af4JuLl6Gh4gmYlKOgFclk4+VIpeBmSOTnZaUTSEAIfkEBQEAHwAsBAAWACcAGgAABXfg9xmkIZ5oqq5rWbJwnLqubLP0e+9nTvJAnwnIyxGJtaNyyWw6n1Ao4hmRIa7XpaPBbbCw4OO2y1WBw0Ryt4o6o3cRNdeRcmfTcojZvSr4CytyXntvKH9/gWR6X3cph4crEQ6LSo+IUYaWgJgnmpucIpagjpc3IQAh+QQFAQAfACwEAAkAGgAnAAAFb+AnjqJhkmiamqyhvmjLwrA806p946Tu8isbMNca1ozIpHLJTCKeiCYUupxOlVaqMxvdZqtWqbZJLpvPyEK5wGYz23AlPJ6c0412t9yucjQaDi98KX+FDTBtfYZ/gUmLhUqPf0p+i42Oi00QfxAiIQAh+QQFAQAfACwEAAQAGgAnAAAFc+AnjmRZGqhhrmyasrDounE7o/V64yvi6zuTb4gA0oTEn+lYSg5zSGcROpJOqVUntknc9rzgsHhMLhXOhTEaHV6vwW62N36G09tutbzM7/v/JhFlDYQNDmKFhYdeEYmFYA6OhIJbEJINYZdhlolkEA6UUCEAIfkEAQEAHwAsBAAEACcAGgAABXXgJ45kWSIoYq5sS6apK8swPN9mHeP8p6O9UmG4+qlMhmRryCwUa6uk1LBqMp9A5FQptBKDW2nX6+SFxSRyuXemjpvBz5lljYu2srX9vu/7/4CBgh8NhQ6DK4WKDYgkEIuGjSKQipKElIySj5CHlpSWIw6RoCEAOw==);
+}
+
+
+.GPwidget {
+  position: relative; /* overwritten */
+}
+
+
+#GPadvancedToolsPanel {
+  position: initial; /* overwritten */
+}
+
+/* General panels */
+
+.GPpanel {
+  box-shadow: 0 1px 6px #000;
+  border-radius: 5px;
+}
+
+.GPpanelHeader {
+  height: 32px;
+  background-color: #FFF;
+  border-top-left-radius: 5px;
+  border-top-right-radius: 5px;
+}
+
+.GPpanelTitle {
+  width: calc(100% - 60px);
+  margin: auto;
+  line-height: 32px;
+  color: #C77A04;
+  border-bottom: 1px solid #C77A04;
+}
+
+.GPpanelClose {
+  top: 0;
+  right: 0;
+  width: 30px;
+  height: 32px;
+  background-position: -30px 1px;
+}
+
+.GPpanelReduce {
+  top: 0;
+  right: 30px;
+  width: 30px;
+  height: 32px;
+  background-position: -60px 1px;
+}
+
+.GPpanelInfo {
+  top: 0;
+  left: 0px;
+  width: 30px;
+  height: 32px;
+  background-position: -90px 1px;
+}
+
+/* Showing/hiding advanced panel */
+
+.GPshowAdvancedToolPicto {
+  width: 30px;
+  height: 30px;
+  box-shadow: 0 1px 6px #000;
+  background-color: #FFF;
+  border-radius: 5px;
+}
+
+.GPshowAdvancedToolPicto:hover {
+  background-color: #F4F4F4;
+}
+
+.GPshowAdvancedToolOpen {
+  width: 100%;
+  height: 100%;
+}
+
+/* Submit inputs */
+
+input.GPinputSubmit {
+  background-color: #C77A04;
+}
+
+/* Showing additional hidden options */
+
+.GPshowMoreOptionsImage {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAA7klEQVRIx+3UsUtCURTH8e/x3eciSAhC/QnRGIQPHPoTHPJfyLEpyFqcXkGT/0HQ4uBQs4s4VAiO0b/QJKIIcn333QYVnErIt53PeO7hnnv4wQWllMqa7NL0fmu+wPeLeXd10sJun322yE9t0AY5j+Lk+K+7cjs+rAPSmFnTGzQpb4qDJuWZNT2QxqpnTxsCvN0FdfHyBIwllVoaihXnXkGOxPvLyr173utAgI+b8NTn/AtwsC5NJJVa5WE5yizD+ZySC00XIFgmF4UC40wzXBhcFCfVKE6qC4PTDP81EGB4zeF2hmePfOt3ppT61Q8G2258CD5NRAAAAABJRU5ErkJggg==);
+}
+
+div[id^=GPelevationPath-] {
+  top: 0; /*overwritten*/
+}
+
+/* Showing/hiding elevationPath panel */
+
+label[id^=GPshowElevationPathPicto] {
+  display: inline-block;
+}
+
+input[id^=GPshowElevationPath-] + label {
+  display: block;
+}
+
+input[id^=GPshowElevationPath-]:checked + label {
+  /* display: none; */
+}
+
+input[id^=GPshowElevationPath-] + label + div {
+  display: none;
+}
+
+input[id^=GPshowElevationPath-]:checked + label + div {
+  display: block;
+}
+
+span[id^=GPshowElevationPathOpen] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAeCAYAAADnydqVAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOwwAADsMBx2+oZAAAA4VJREFUaN7tmEFv3EQUx3/PHkdIFT3RIk4gAZVAHIrEwUslJM7tsfABQlBLk+ZuL0K+ZPfOpgpRmg+AhLhQPgBFja1euCAObXqlatUL4oDqXe/jkHXj7jqNvesmWZj/xdbYY83Mz/837w1YWVlZWVlZWVk1LjnshTg0Ot7W6gzELt0cqwxq3n7QM6s5cXARYNGpefuL3FvlHaujlXNQ+K0L96VEksD7cid0NzWaHGcuBYkDt7fT9lYszkmZquG6DG4cGs3bi84vts8CF9HvBHGS1HU0yq5IxHACbuj2BFkWVd1pe3y81l+fdyh3Is46qVkVuKjw7ijW3gN+HnqD3oWIx1M7+EWgi3vw+LX5zWN4fn98spSk7roWthQFSUL3hiDLeQ/R4XvzDnen7X7mpGYXaCucB04Bp1A+RPnaSc1uEriXZ8qiqziwCthZXKwgSeB+i0gh9OpNfyG7QoTmzt2fiW75XnZ13OXzBldUvq9Q3aiofu53sx8ac3BduA1kf+p3s1VUCyFXlu6m7mYSuuv/Nbh3Is6KyvY4XH+tj7/Wn1geFdm+HXCmccBHWSaVQc6QJZBrxwU3Do3EoSkmoDL23IlD80rtbDc1q8CrNbqcNmKuz5xknYA6TrWbrd4NXDKRledjl95sCm4cmgj4FHiz4vsAT4GncWj+Ae4Dv7Y6g804NP0pJnqJEuskbe/gLsIl4JvGAB/nIUcmiExu1NKEI1udQT6vT6b4RDq6vg/sju7r/3DK22XNeXguBa2805iDjwtusRQq+YW/SFJXy0qoqirABfgFeKvmJxZG1z8LIVv2hl53qtMsTwOATxRc0S0ZkqrkbbKUpC7TQs4d3OoMosJ+emgW2+oMNA7NG8DrwGvAE+DR6IepvV4CD0ZlUZ1ODxo76DgpcH0vu0qEJoGr+yXU9JCLDi7ca8W+D4GHjcxXuIXWAyzw00xZ9HHuuROlELrhr+0BfJZdoxvFEipJ3d68lklDb9AD/q7R5S+z16f5Ovho5Pz2LFkR3fIXshUpOEtA/U62XCihVHH+mFfAFyIei+riePRI2l5ZgqWoLn4U8eSlnWQdSc0ZeF8hww/8zvNwJ068QncddX5vdfsbzLmSwL2sItvA6YOci+piq5v9WDGMn1zA/1fdDjhjxFwXuAicGzXfE+GW8Qa9Ks49FHATA7U/iZWVlZWVlZWVlZXV/OlfogGsuXT788cAAAAASUVORK5CYII=);
+}
+
+
+/* Panel */
+
+[id^=GPelevationPathPanelClose] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAeCAYAAADnydqVAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOwwAADsMBx2+oZAAAA4VJREFUaN7tmEFv3EQUx3/PHkdIFT3RIk4gAZVAHIrEwUslJM7tsfABQlBLk+ZuL0K+ZPfOpgpRmg+AhLhQPgBFja1euCAObXqlatUL4oDqXe/jkHXj7jqNvesmWZj/xdbYY83Mz/837w1YWVlZWVlZWVk1LjnshTg0Ot7W6gzELt0cqwxq3n7QM6s5cXARYNGpefuL3FvlHaujlXNQ+K0L96VEksD7cid0NzWaHGcuBYkDt7fT9lYszkmZquG6DG4cGs3bi84vts8CF9HvBHGS1HU0yq5IxHACbuj2BFkWVd1pe3y81l+fdyh3Is46qVkVuKjw7ijW3gN+HnqD3oWIx1M7+EWgi3vw+LX5zWN4fn98spSk7roWthQFSUL3hiDLeQ/R4XvzDnen7X7mpGYXaCucB04Bp1A+RPnaSc1uEriXZ8qiqziwCthZXKwgSeB+i0gh9OpNfyG7QoTmzt2fiW75XnZ13OXzBldUvq9Q3aiofu53sx8ac3BduA1kf+p3s1VUCyFXlu6m7mYSuuv/Nbh3Is6KyvY4XH+tj7/Wn1geFdm+HXCmccBHWSaVQc6QJZBrxwU3Do3EoSkmoDL23IlD80rtbDc1q8CrNbqcNmKuz5xknYA6TrWbrd4NXDKRledjl95sCm4cmgj4FHiz4vsAT4GncWj+Ae4Dv7Y6g804NP0pJnqJEuskbe/gLsIl4JvGAB/nIUcmiExu1NKEI1udQT6vT6b4RDq6vg/sju7r/3DK22XNeXguBa2805iDjwtusRQq+YW/SFJXy0qoqirABfgFeKvmJxZG1z8LIVv2hl53qtMsTwOATxRc0S0ZkqrkbbKUpC7TQs4d3OoMosJ+emgW2+oMNA7NG8DrwGvAE+DR6IepvV4CD0ZlUZ1ODxo76DgpcH0vu0qEJoGr+yXU9JCLDi7ca8W+D4GHjcxXuIXWAyzw00xZ9HHuuROlELrhr+0BfJZdoxvFEipJ3d68lklDb9AD/q7R5S+z16f5Ovho5Pz2LFkR3fIXshUpOEtA/U62XCihVHH+mFfAFyIei+riePRI2l5ZgqWoLn4U8eSlnWQdSc0ZeF8hww/8zvNwJ068QncddX5vdfsbzLmSwL2sItvA6YOci+piq5v9WDGMn1zA/1fdDjhjxFwXuAicGzXfE+GW8Qa9Ks49FHATA7U/iZWVlZWVlZWVlZXV/OlfogGsuXT788cAAAAASUVORK5CYII=);
+}
+
+div[id^=GPelevationPathPanelReduce] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAeCAYAAADnydqVAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOwwAADsMBx2+oZAAAA4VJREFUaN7tmEFv3EQUx3/PHkdIFT3RIk4gAZVAHIrEwUslJM7tsfABQlBLk+ZuL0K+ZPfOpgpRmg+AhLhQPgBFja1euCAObXqlatUL4oDqXe/jkHXj7jqNvesmWZj/xdbYY83Mz/837w1YWVlZWVlZWVk1LjnshTg0Ot7W6gzELt0cqwxq3n7QM6s5cXARYNGpefuL3FvlHaujlXNQ+K0L96VEksD7cid0NzWaHGcuBYkDt7fT9lYszkmZquG6DG4cGs3bi84vts8CF9HvBHGS1HU0yq5IxHACbuj2BFkWVd1pe3y81l+fdyh3Is46qVkVuKjw7ijW3gN+HnqD3oWIx1M7+EWgi3vw+LX5zWN4fn98spSk7roWthQFSUL3hiDLeQ/R4XvzDnen7X7mpGYXaCucB04Bp1A+RPnaSc1uEriXZ8qiqziwCthZXKwgSeB+i0gh9OpNfyG7QoTmzt2fiW75XnZ13OXzBldUvq9Q3aiofu53sx8ac3BduA1kf+p3s1VUCyFXlu6m7mYSuuv/Nbh3Is6KyvY4XH+tj7/Wn1geFdm+HXCmccBHWSaVQc6QJZBrxwU3Do3EoSkmoDL23IlD80rtbDc1q8CrNbqcNmKuz5xknYA6TrWbrd4NXDKRledjl95sCm4cmgj4FHiz4vsAT4GncWj+Ae4Dv7Y6g804NP0pJnqJEuskbe/gLsIl4JvGAB/nIUcmiExu1NKEI1udQT6vT6b4RDq6vg/sju7r/3DK22XNeXguBa2805iDjwtusRQq+YW/SFJXy0qoqirABfgFeKvmJxZG1z8LIVv2hl53qtMsTwOATxRc0S0ZkqrkbbKUpC7TQs4d3OoMosJ+emgW2+oMNA7NG8DrwGvAE+DR6IepvV4CD0ZlUZ1ODxo76DgpcH0vu0qEJoGr+yXU9JCLDi7ca8W+D4GHjcxXuIXWAyzw00xZ9HHuuROlELrhr+0BfJZdoxvFEipJ3d68lklDb9AD/q7R5S+z16f5Ovho5Pz2LFkR3fIXshUpOEtA/U62XCihVHH+mFfAFyIei+riePRI2l5ZgqWoLn4U8eSlnWQdSc0ZeF8hww/8zvNwJ068QncddX5vdfsbzLmSwL2sItvA6YOci+piq5v9WDGMn1zA/1fdDjhjxFwXuAicGzXfE+GW8Qa9Ks49FHATA7U/iZWVlZWVlZWVlZXV/OlfogGsuXT788cAAAAASUVORK5CYII=);
+}
+
+div[id^=GPelevationPathPanelInfo] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAeCAYAAADnydqVAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOwwAADsMBx2+oZAAAA4VJREFUaN7tmEFv3EQUx3/PHkdIFT3RIk4gAZVAHIrEwUslJM7tsfABQlBLk+ZuL0K+ZPfOpgpRmg+AhLhQPgBFja1euCAObXqlatUL4oDqXe/jkHXj7jqNvesmWZj/xdbYY83Mz/837w1YWVlZWVlZWVk1LjnshTg0Ot7W6gzELt0cqwxq3n7QM6s5cXARYNGpefuL3FvlHaujlXNQ+K0L96VEksD7cid0NzWaHGcuBYkDt7fT9lYszkmZquG6DG4cGs3bi84vts8CF9HvBHGS1HU0yq5IxHACbuj2BFkWVd1pe3y81l+fdyh3Is46qVkVuKjw7ijW3gN+HnqD3oWIx1M7+EWgi3vw+LX5zWN4fn98spSk7roWthQFSUL3hiDLeQ/R4XvzDnen7X7mpGYXaCucB04Bp1A+RPnaSc1uEriXZ8qiqziwCthZXKwgSeB+i0gh9OpNfyG7QoTmzt2fiW75XnZ13OXzBldUvq9Q3aiofu53sx8ac3BduA1kf+p3s1VUCyFXlu6m7mYSuuv/Nbh3Is6KyvY4XH+tj7/Wn1geFdm+HXCmccBHWSaVQc6QJZBrxwU3Do3EoSkmoDL23IlD80rtbDc1q8CrNbqcNmKuz5xknYA6TrWbrd4NXDKRledjl95sCm4cmgj4FHiz4vsAT4GncWj+Ae4Dv7Y6g804NP0pJnqJEuskbe/gLsIl4JvGAB/nIUcmiExu1NKEI1udQT6vT6b4RDq6vg/sju7r/3DK22XNeXguBa2805iDjwtusRQq+YW/SFJXy0qoqirABfgFeKvmJxZG1z8LIVv2hl53qtMsTwOATxRc0S0ZkqrkbbKUpC7TQs4d3OoMosJ+emgW2+oMNA7NG8DrwGvAE+DR6IepvV4CD0ZlUZ1ODxo76DgpcH0vu0qEJoGr+yXU9JCLDi7ca8W+D4GHjcxXuIXWAyzw00xZ9HHuuROlELrhr+0BfJZdoxvFEipJ3d68lklDb9AD/q7R5S+z16f5Ovho5Pz2LFkR3fIXshUpOEtA/U62XCihVHH+mFfAFyIei+riePRI2l5ZgqWoLn4U8eSlnWQdSc0ZeF8hww/8zvNwJ068QncddX5vdfsbzLmSwL2sItvA6YOci+piq5v9WDGMn1zA/1fdDjhjxFwXuAicGzXfE+GW8Qa9Ks49FHATA7U/iZWVlZWVlZWVlZXV/OlfogGsuXT788cAAAAASUVORK5CYII=);
+}
+
+[id^=GPelevationPathPanel-] {
+  width: 280px;
+}
+
+/* ELEVATION PATH DISPLAY */
+
+[id^=GPelevationPathProfil] {
+  height: 150px;
+  width: inherit;
+  line-height: normal; /* surcharge leaflet container */
+}
+
+/*.GPpanelHeader {
+  padding: unset;
+}*/
+
+/*
+@media (min-width:720px) and (min-height:720px) {
+
+[id^=GPelevationPathPanel] {
+top: 15px;
+left: 15px;
+}
+
+}
+
+@media (min-width:720px) and (min-height:520px) {
+
+[id^=GPelevationPathPanel] {
+width: 460px;
+}
+
+[id^=GPelevationPathProfil] {
+height: 220px;
+}
+
+}
+
+@media (max-width:560px), (max-height:340px) {
+
+[id^=GPelevationPathPanel] {
+display: none !important;
+}
+
+}
+*/
+
+/* ISOCHRON */
+
+div[id^=GPisochron-] {
+   /* left: 10px; */
+  top: 0; /*overwritten*/
+}
+
+/* Showing/hiding isochron panel */
+
+span[id^=GPshowIsochronOpen] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAeCAYAAACsYQl4AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4AUXCjIhczCQjQAABBBJREFUaN7tmE9oI2UYxn/vTCeQHjxou2ULroIHsazYg4ekiiDSk+AtSiyZNqbLtrYUFC8NKwTcbW+LuNm20ubQySGwvfWwe1gvImuDFxXqgqhgPWzp0t1jo0knr4dOutO0tmkTpcV5IJCZL+/Mlx/P93x/IFCgQIECBQoU6L+QnKTItu17QJ93ec9xnNcDlIfLOGFdn+/7awHGFjt6aGjo5Wq1mgIuAe3e7S1gXlUX8vn8ais7tzJpXVKpvhoNuaOSoXrQbxSkOGl+oYbxc9+1SvZMg47FYqFwOPw5cNkbBS7w0Gs+B5iAKyJzW1tbHy8tLZVbARnRuZ336UIk5F6uh60gK2nzhiBjgKrIxGmFbTQI+Q4wCqwDI5ZlnXMcp9txnG7Lss6p6iiwoapj4XD4diwWCzVvgWrvk/7JcLFsZtVnDAUpps2bHmQAEa2+dGYdbdv2jAd5pVKpvFMoFDYP+l08Hu+wLGsZiIrIzcXFxfFmOlaLBER8z9lxNhnU52Tvn+h8xHJH/iliTjVoL5N/ANYrlUpvPeREIpESkQnHcV7xwf4R6FLV3mYz+yDYBrpQhTLIh2cFMkDbYY3exGcAnx3kZBEZ2OGxo0KhsDk4OHhVVWcMw0gBHzXpAtVpd6I4aVKD7SLDe9zRJOSVdNtJzam+a62L41B0avvPhkGLSL+qupZlLdW3DQwMPOUt7a7vcaHqLSCrqv0tGnKq0+7Ed5Mmrsj43iGoCy10cgZ4E3juGDV/eZ8S8AvwDfAlUDmWo1X1ArCRy+Ue27b9PvCsr/kFICQid/w1juM8sm37IXChlUPPFUT2Z4u0KD5rjnzjBPW1FVYP8GstDI4Fum6oXAHqZ/Xf1tbWvj1gJIiqaisA1y3h6l+UKpZN1cz+pd/xXrGrr4Hnj1lfW2E98PGqj5Mjo+MPVX0xlUo9ncvlehrcnj+jqp3A/X8Fsui8VCmr1O7JcLFs0gTsGpSMz1RHjRSNTm3rSrrtPNAFdACbwEZ0alvrITcSHXeBnnK5/C4w12DH3wMMr7blkCOWO0IGLU6a+mQ1cnLYHph6d2uDteve3qK5DYuqLng7vk/j8XjHUQ9LJpOdXsS4hmHkmgFdTJvZvXGhs5FrOyAFNDLtToDO+ow5XCybN87koVI+n18VkTmg27Ks5cNgJ5PJTtd1l4HzwMzi4uJPTXbt+91JRXQ+EnLHxec0AY1MuWOoZnd9gXH/tII+ctb2tuC3gbeAByJyVVVvOY7zqJbJXlxc8SB/VSqV3m7ReccoUr0YmdoLed+mJm1mUWM1Ol2ZPfOHSu3t7ddVdcQ7QKoCG15zl++gaaZUKn3SCsj/62PSRCJxEfhARPp9y6DfVfWuYRi55uMiUKBAgQIFChQoUHP6G9rPw3e7WtEyAAAAAElFTkSuQmCC);
+}
+
+/* General panels */
+
+div[id^=GPisochronPanel-] {
+  left: 10px;
+}
+
+div[id^=GPisochronPanelClose] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAeCAYAAACsYQl4AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4AUXCjIhczCQjQAABBBJREFUaN7tmE9oI2UYxn/vTCeQHjxou2ULroIHsazYg4ekiiDSk+AtSiyZNqbLtrYUFC8NKwTcbW+LuNm20ubQySGwvfWwe1gvImuDFxXqgqhgPWzp0t1jo0knr4dOutO0tmkTpcV5IJCZL+/Mlx/P93x/IFCgQIECBQoU6L+QnKTItu17QJ93ec9xnNcDlIfLOGFdn+/7awHGFjt6aGjo5Wq1mgIuAe3e7S1gXlUX8vn8ais7tzJpXVKpvhoNuaOSoXrQbxSkOGl+oYbxc9+1SvZMg47FYqFwOPw5cNkbBS7w0Gs+B5iAKyJzW1tbHy8tLZVbARnRuZ336UIk5F6uh60gK2nzhiBjgKrIxGmFbTQI+Q4wCqwDI5ZlnXMcp9txnG7Lss6p6iiwoapj4XD4diwWCzVvgWrvk/7JcLFsZtVnDAUpps2bHmQAEa2+dGYdbdv2jAd5pVKpvFMoFDYP+l08Hu+wLGsZiIrIzcXFxfFmOlaLBER8z9lxNhnU52Tvn+h8xHJH/iliTjVoL5N/ANYrlUpvPeREIpESkQnHcV7xwf4R6FLV3mYz+yDYBrpQhTLIh2cFMkDbYY3exGcAnx3kZBEZ2OGxo0KhsDk4OHhVVWcMw0gBHzXpAtVpd6I4aVKD7SLDe9zRJOSVdNtJzam+a62L41B0avvPhkGLSL+qupZlLdW3DQwMPOUt7a7vcaHqLSCrqv0tGnKq0+7Ed5Mmrsj43iGoCy10cgZ4E3juGDV/eZ8S8AvwDfAlUDmWo1X1ArCRy+Ue27b9PvCsr/kFICQid/w1juM8sm37IXChlUPPFUT2Z4u0KD5rjnzjBPW1FVYP8GstDI4Fum6oXAHqZ/Xf1tbWvj1gJIiqaisA1y3h6l+UKpZN1cz+pd/xXrGrr4Hnj1lfW2E98PGqj5Mjo+MPVX0xlUo9ncvlehrcnj+jqp3A/X8Fsui8VCmr1O7JcLFs0gTsGpSMz1RHjRSNTm3rSrrtPNAFdACbwEZ0alvrITcSHXeBnnK5/C4w12DH3wMMr7blkCOWO0IGLU6a+mQ1cnLYHph6d2uDteve3qK5DYuqLng7vk/j8XjHUQ9LJpOdXsS4hmHkmgFdTJvZvXGhs5FrOyAFNDLtToDO+ow5XCybN87koVI+n18VkTmg27Ks5cNgJ5PJTtd1l4HzwMzi4uJPTXbt+91JRXQ+EnLHxec0AY1MuWOoZnd9gXH/tII+ctb2tuC3gbeAByJyVVVvOY7zqJbJXlxc8SB/VSqV3m7ReccoUr0YmdoLed+mJm1mUWM1Ol2ZPfOHSu3t7ddVdcQ7QKoCG15zl++gaaZUKn3SCsj/62PSRCJxEfhARPp9y6DfVfWuYRi55uMiUKBAgQIFChQoUHP6G9rPw3e7WtEyAAAAAElFTkSuQmCC);
+}
+
+div[id^=GPisochronPanelReduce] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAeCAYAAACsYQl4AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4AUXCjIhczCQjQAABBBJREFUaN7tmE9oI2UYxn/vTCeQHjxou2ULroIHsazYg4ekiiDSk+AtSiyZNqbLtrYUFC8NKwTcbW+LuNm20ubQySGwvfWwe1gvImuDFxXqgqhgPWzp0t1jo0knr4dOutO0tmkTpcV5IJCZL+/Mlx/P93x/IFCgQIECBQoU6L+QnKTItu17QJ93ec9xnNcDlIfLOGFdn+/7awHGFjt6aGjo5Wq1mgIuAe3e7S1gXlUX8vn8ais7tzJpXVKpvhoNuaOSoXrQbxSkOGl+oYbxc9+1SvZMg47FYqFwOPw5cNkbBS7w0Gs+B5iAKyJzW1tbHy8tLZVbARnRuZ336UIk5F6uh60gK2nzhiBjgKrIxGmFbTQI+Q4wCqwDI5ZlnXMcp9txnG7Lss6p6iiwoapj4XD4diwWCzVvgWrvk/7JcLFsZtVnDAUpps2bHmQAEa2+dGYdbdv2jAd5pVKpvFMoFDYP+l08Hu+wLGsZiIrIzcXFxfFmOlaLBER8z9lxNhnU52Tvn+h8xHJH/iliTjVoL5N/ANYrlUpvPeREIpESkQnHcV7xwf4R6FLV3mYz+yDYBrpQhTLIh2cFMkDbYY3exGcAnx3kZBEZ2OGxo0KhsDk4OHhVVWcMw0gBHzXpAtVpd6I4aVKD7SLDe9zRJOSVdNtJzam+a62L41B0avvPhkGLSL+qupZlLdW3DQwMPOUt7a7vcaHqLSCrqv0tGnKq0+7Ed5Mmrsj43iGoCy10cgZ4E3juGDV/eZ8S8AvwDfAlUDmWo1X1ArCRy+Ue27b9PvCsr/kFICQid/w1juM8sm37IXChlUPPFUT2Z4u0KD5rjnzjBPW1FVYP8GstDI4Fum6oXAHqZ/Xf1tbWvj1gJIiqaisA1y3h6l+UKpZN1cz+pd/xXrGrr4Hnj1lfW2E98PGqj5Mjo+MPVX0xlUo9ncvlehrcnj+jqp3A/X8Fsui8VCmr1O7JcLFs0gTsGpSMz1RHjRSNTm3rSrrtPNAFdACbwEZ0alvrITcSHXeBnnK5/C4w12DH3wMMr7blkCOWO0IGLU6a+mQ1cnLYHph6d2uDteve3qK5DYuqLng7vk/j8XjHUQ9LJpOdXsS4hmHkmgFdTJvZvXGhs5FrOyAFNDLtToDO+ow5XCybN87koVI+n18VkTmg27Ks5cNgJ5PJTtd1l4HzwMzi4uJPTXbt+91JRXQ+EnLHxec0AY1MuWOoZnd9gXH/tII+ctb2tuC3gbeAByJyVVVvOY7zqJbJXlxc8SB/VSqV3m7ReccoUr0YmdoLed+mJm1mUWM1Ol2ZPfOHSu3t7ddVdcQ7QKoCG15zl++gaaZUKn3SCsj/62PSRCJxEfhARPp9y6DfVfWuYRi55uMiUKBAgQIFChQoUHP6G9rPw3e7WtEyAAAAAElFTkSuQmCC);
+}
+
+/* Calc waiting */
+
+.GPisochronCalcWaitingContainerVisible,
+.GPisochronCalcWaitingContainerHidden {
+  border-radius: 5px;
+}
+
+/* Isochron form */
+
+.GPisochronChoiceAlt input:checked + label + span {
+  color: #C77A04;
+}
+
+.GPisochronOriginPointerImg,
+.GPisochronChoiceAltImg,
+.GPisochronTransportImg {
+  background-image: url(data:image/png;base64,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);
+}
+
+.GPisoExclusionsOption {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAA4CAYAAADuMJi0AAAE60lEQVRYw+2YWWxUZRTHz/fd7y4zzAzTbaAdpgtQWsBiYVxYGpcEMCwRQkx48KHGhKg0WhESNYglwSUgWCKGTaMRBF4MwShpECUshlJqay2U0LCUwrRAp+0Ms997v8UnEl8Gp9Ppg2Z+bzfnn+/knHvud865AFmy/GfZVVZW/vvb9eduNn7Wc+ixGQ3/pm+UcO735VP3/rpsyc39TudHyXQ4maF61cqfZi97ocbjmVi6YGHNxoOeor3JtDskae606uqzFfPmvRqLxFg4EetIpiXJDJqqOHBwEEjIDyXjiVw4t/S1XD34TKs/MX+z4EEAgK0SwhPtjh+qq6tXBjGOtTY11a31D371qEygRxn3F3vWPVE1deN0G82T+m5BbCAIF+8lBttifLoFQeV0Wf7R7XbndsXird19/TUfAhgZeZ8H7eoXHYVWwzdBFTedsmhScfg0wfQPTRF7FfLdmBRRo4Q9RzTS8aeKRaeERAsC8TmRto30HJKqMCrhIcMUMuMcmADQJAQ5GJ4fqUMpFdE2mXgqOe+ewXhJFCHoJNJxu4omz7bhScVMyj/BeFPGUrlZIROOYRT4C0C0S0h8qUhHAAC2yGTFpUka7Skfx9/DZFZGnH2gEHxYwnc6EIguBYnDqtTzT3uDTFb3VdrEcZfWk5GUrgZxaI4QCyyaBAME04sUzTvL+dBD+xnOu8qiwrIgV1leEuf9JxhvTzu6Bgm5ThXkmNcciriaS8R2lXySTHvUqXb/lqsNp3Ju0qstx2Z7sfTZGuKsLAFkV4RK0J5k2s4wXYqYsO6WyYq0HUYN06c9XgX5SxcBuIt4gvJ40sJi7MaVONtVhGHmqIrmyLPzm29tqqf7ilwHUtHvVAjO9tksWbJkyQzehd7xo5ppUqW2tlbzLp380rhxitdB8q/4fD6acnsaKfX19c7Ji+QNJU/at7mmWaaZpklHNSY+irq6urzSxbBBy1PqEoJZfFdYoK2tjY2Jw4aGBpurJvKOmme8xWTTmgjq1DApAwAxoo6fIkieEnoF2+NvUDVqCekRiNIY4ip1eb1ekvEI39/65nOyO7hWtyWc0biOogkDooYOBhhujLEDAIZG4xADAH/4sH796y42ZWBNxBGrCEZMlNBNER1k8fBtdixwwzzY2toaTCtCr9drLXzKthgSiv7ztycfjvQo4O5fpWqR5eGojg2DCX1IBHUf3n2nSey5cOpCXzrfIXp6WZXXMtdYh8pi74JTL3WTijO913tDq2qXVxplA5vijgdTIvE4RO6zYOwO3t5/GhpbTrYMjnh78nq9VlwRfRmVRdewArM6rgJBTLbxErYEAL4J5vetwFJ4jghQxMNSSAyoO42Ttl0Xz58PpzXqS5JE7G5tqrAbM6lMiyljkimoQg1m8VhK7xrFwTpdixcbAaGz2/I+ekba0dzc/iDt3SIUCtH+Lv+lArWwjWPOOeMVJjI1imgRsyXKDas+mxoc83vKUfOC/dO2lst3M7LM3L816LdLBedlTIKU05lUNfJM2ZzEBZORXzuHrtk+vnSu63JGF9LhvmH9/uVAu8s9MUQFnWUSIweHFJ90z7qlq+n6L2OyAQMA918NdLrcrqgwoQrHyAHWqX49PDzMxsohAIAUuZ0YsHJHSO+G5t7eXj+k8ZsEjfCmsQGABgAmAMQBIJEdN7L8//gb3FshBGMt81oAAAAASUVORK5CYII=);
+}
+
+/* Reset picto */
+div[id^=GPisochronReset] {
+  background-color: #C77A04;
+  background-image: url(data:image/png;base64,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);
+}
+
+/* LAYER SWITCHER LEAFLET */
+
+div[id^=GPlayerSwitcher-] {
+  top: 10px;
+  right: 10px;
+}
+
+/* Showing/hiding layers list */
+
+label[id^=GPshowLayersListPicto] {
+  width: 36px;
+  height: 36px;
+}
+
+span[id^=GPshowLayersListOpen],
+span[id^=GPshowLayersListClose] {
+  background-image: url(data:image/png;base64,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);
+}
+
+span[id^=GPshowLayersListClose] {
+  background-position: -36px 0;
+}
+
+div[id^=GPlayerSwitcher-] input[type="checkbox"]:checked + div + label[id^=GPshowLayersListPicto] {
+  box-shadow: 0 2px 2px #000;
+  border-top: 1px solid #CCC;
+}
+
+div[id^=GPlayerSwitcher-] input[type="checkbox"]:checked + div + label[id^=GPshowLayersListPicto] span[id^=GPshowLayersListOpen] {
+  opacity: 0.4;
+}
+
+/* Layers list */
+
+.GPlayerVisibility,
+.GPshowLayerAdvancedTools,
+.GPlayerInfo,
+.GPlayerInfoOpened,
+.GPlayerRemove {
+  background-image: url(data:image/png;base64,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);
+}
+
+/* Opacity slider : Chrome, Safari, Opera */
+
+.GPlayerOpacity input[type="range"]::-webkit-slider-runnable-track {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAECAYAAAAZDrhMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAwSURBVDiNY/z379//v3//Mvz9+5fh379/DITYxKobKWYxMYwCisBoAFIIRgOQQgAADrTuhXfc36kAAAAASUVORK5CYII=);
+}
+
+/* Opacity slider : Firefox */
+
+.GPlayerOpacity input[type="range"]::-moz-range-track {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAECAYAAAAZDrhMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAwSURBVDiNY/z379//v3//Mvz9+5fh379/DITYxKobKWYxMYwCisBoAFIIRgOQQgAADrTuhXfc36kAAAAASUVORK5CYII=);
+}
+
+/* Opacity slider : IE */
+
+.GPlayerOpacity input[type="range"]::-ms-track {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAECAYAAAAZDrhMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAwSURBVDiNY/z379//v3//Mvz9+5fh379/DITYxKobKWYxMYwCisBoAFIIRgOQQgAADrTuhXfc36kAAAAASUVORK5CYII=);
+}
+
+/* Layer info panel */
+
+div[id^=GPlayerInfoPanel] {
+  right: 190px;
+}
+
+div[id^=GPlayerInfoTitle] {
+  color: #C77A04;
+  border-bottom: 1px solid #C77A04;
+}
+
+div[id^=GPlayerInfoQuicklook] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAI9SURBVEiJ7ZZBSxRhGMd/7zi7SGxLg4mWnSIWOoSFKLvbyUN5DtMPUEqfQNLJg0GuJlE3L+UXcA8JHRKDCERmaQOLTnoKXEkhq11nDzm783TIXdZ1d9TdCEL/p3mf9/3/eJ73eeedgWMnVTqYnp42gI7DGLPZrDU0NJQtj+t76Eq1h0KhN4FAwBNm2zarq6vdwDtPIEAwGMQwDE+gpmnV5zydNWhfhuVysxvY76dwNj8A4G/tgtBgbUA3+5Ufc7cQZxu9pROAX19eI6lFjNO9zUcG2skniLNN8OZz/OejAOysL5FeGOTcz7l7QLzc47mHzkYSvaWzCAPwt11Hnb2Gz92+Wsnz15viCfS3dpHbTLKzvlSMOetLyLdlclpwuZJn3x5mMhlc1/0zuHQXSS2SXhiEpt0Ktz4ieoBM4+X52b7Nhv44+apA27aTKysrN0pjZwK3m9vScwO+rc/tAI5mfPp+qvNla3p+qinkuyJjzh01hutV6aFkjeijlqlLwmyYkbI7oXaoqT+yTF0sU39aiNXV5UgsNwo8A7VWd3YnOs6qeMItU5fCsyjpj47n45ap3wcmS9dFYrl9fq+DnVKouIa2tmt+DPLioAyr3tgKZYVjTn9hnBj2dQjSexDwUK9e4oEvLJq8BQwgg5KZuoCuSDcQBDJKqZ7IeH4AeFgzMBrLTShhRCnVEx53EsnhxovKVa8qrT3wu1xQeCJX7HBey08K0keFU/Lv/hwEiSRM32y1uSMDgQu7ZZ3of9dvep7Bwy5Q9Q8AAAAASUVORK5CYII=);
+}
+
+div[id^=GPlayerInfoClose] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAgCAYAAAAFQMh/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAFgSURBVEiJ7ZS7UoNAGIXPYYe8i52FMxKfJ5kEQ+yhSiP2MXhL3gfGxs4ZXyXO8luEyEXIglruaffsfv91ASsrK6tfin1MaehOhfnFeKR9rpC3eQRgFqq1OM7H1e3n5s/gNHSnoDwBcADZeSM9a8IFYBqpe4ILACLkjQnumMBgfl76OMn2aiOVgAVgFqmkgAIAKfmZ6Vkj2It1AJFK9PSzSL3ICs4xU4B+eSxbb6SXxnxMBqDsH8igjFh2ObAHeF2DunreNQeDwW1waV4eAB0EPsJfQ7XWZFC/2D50p2QeroY0wR/RyrAEgIGlrqxMm2NQ1r0yboVSthRJShcn2V49y6rfm0ZTF9Rz9fzyTi8bq9Ybbv65IpXUVgby6MV6wcNgf38gtV2GPIxj3dGSg3qUxXkDir4dPofgCC0iFy/Wi0rmInDeze/2UBq6fhqpRE5UqGhJkoau3+WxsrKy+hd9AZasoFzDGcuhAAAAAElFTkSuQmCC);
+}
+
+.GPlayerInfoLink,
+.GPlayerInfoPopup {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAI9SURBVEiJ7ZZBSxRhGMd/7zi7SGxLg4mWnSIWOoSFKLvbyUN5DtMPUEqfQNLJg0GuJlE3L+UXcA8JHRKDCERmaQOLTnoKXEkhq11nDzm783TIXdZ1d9TdCEL/p3mf9/3/eJ73eeedgWMnVTqYnp42gI7DGLPZrDU0NJQtj+t76Eq1h0KhN4FAwBNm2zarq6vdwDtPIEAwGMQwDE+gpmnV5zydNWhfhuVysxvY76dwNj8A4G/tgtBgbUA3+5Ufc7cQZxu9pROAX19eI6lFjNO9zUcG2skniLNN8OZz/OejAOysL5FeGOTcz7l7QLzc47mHzkYSvaWzCAPwt11Hnb2Gz92+Wsnz15viCfS3dpHbTLKzvlSMOetLyLdlclpwuZJn3x5mMhlc1/0zuHQXSS2SXhiEpt0Ktz4ieoBM4+X52b7Nhv44+apA27aTKysrN0pjZwK3m9vScwO+rc/tAI5mfPp+qvNla3p+qinkuyJjzh01hutV6aFkjeijlqlLwmyYkbI7oXaoqT+yTF0sU39aiNXV5UgsNwo8A7VWd3YnOs6qeMItU5fCsyjpj47n45ap3wcmS9dFYrl9fq+DnVKouIa2tmt+DPLioAyr3tgKZYVjTn9hnBj2dQjSexDwUK9e4oEvLJq8BQwgg5KZuoCuSDcQBDJKqZ7IeH4AeFgzMBrLTShhRCnVEx53EsnhxovKVa8qrT3wu1xQeCJX7HBey08K0keFU/Lv/hwEiSRM32y1uSMDgQu7ZZ3of9dvep7Bwy5Q9Q8AAAAASUVORK5CYII=);
+}
+
+/* Location */
+
+.GPlocationStageFlexInput {
+  margin-bottom: 5px; /*overwritten*/
+}
+
+/* Location form */
+
+.GPlocationOriginPointerImg,
+.GPlocationStageRemove,
+div[id^=GPlocationStageAdd],
+.GPlocationTransportImg {
+  background-image: url(data:image/png;base64,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);
+}
+
+/* MOUSE POSITION */
+
+div[id^=GPmousePosition-] {
+  /* bottom: 10px; */
+  /* left: 10px; */
+}
+
+/* Showing/hiding mouse position panel */
+
+span[id^=GPshowMousePositionOpen] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHjSURBVFiF7ZixctpAEIb/PVk09otkxkUKF8LPc45NwO5RGhqL3jZxHO55InVpMpnxg7iBOf0pLGEQaIREFJj4vhl1dzv7z7+7twA4HI53idaaWmvuO4+6qH0n4HD8XaTpxbx/jTGNY1QRD/0LSnrW7diejJBuOkNAkqF3R6Wez2/nD1UxD7aH46F/AeE3gXxKZt4TR+u5EpA49O4hMhDy7scXf1AV96hpQm06CwCQ9CMgmUjRycybE7YvAIHM2dCbCKSX3xCmH6rCHqzDQWQHIJdKVHpJ6H3nCGrh7JtYQDgNOva6Km5tl8re3jYcz/sTIotSVaBJgRkgnxcHhdPAt1dlfb7MLg6/ZF9rCMBgbG+WnbYQ3VQssEFwcYMq2ahejDEnxpgTFERveX9rctGKfCCKJUlTRyxwwD1cxApkrWdYvyV36eHc2WOgvamdDyiB9EtOmKBjLxuXdA2Os681NooVToWcvJ0SXfZOb6Ldt3QHysQGvr3CCCxO722dPljBcehNVqYx+BhE64vHylsMfu1GtqT0X2lc0u3/HlY/gcyt16VikIsFsukd2f7Sk0VC/a6K2ni1bJtuNDfx0Pch6Wlwuyo2RwBybG+S0FOg+nU+nj/uI1fHf4H7T8vhcDj+AX8AnMTkomeXEcwAAAAASUVORK5CYII=);
+}
+
+div[id^=GPmousePositionPanelClose]  {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHjSURBVFiF7ZixctpAEIb/PVk09otkxkUKF8LPc45NwO5RGhqL3jZxHO55InVpMpnxg7iBOf0pLGEQaIREFJj4vhl1dzv7z7+7twA4HI53idaaWmvuO4+6qH0n4HD8XaTpxbx/jTGNY1QRD/0LSnrW7diejJBuOkNAkqF3R6Wez2/nD1UxD7aH46F/AeE3gXxKZt4TR+u5EpA49O4hMhDy7scXf1AV96hpQm06CwCQ9CMgmUjRycybE7YvAIHM2dCbCKSX3xCmH6rCHqzDQWQHIJdKVHpJ6H3nCGrh7JtYQDgNOva6Km5tl8re3jYcz/sTIotSVaBJgRkgnxcHhdPAt1dlfb7MLg6/ZF9rCMBgbG+WnbYQ3VQssEFwcYMq2ahejDEnxpgTFERveX9rctGKfCCKJUlTRyxwwD1cxApkrWdYvyV36eHc2WOgvamdDyiB9EtOmKBjLxuXdA2Os681NooVToWcvJ0SXfZOb6Ldt3QHysQGvr3CCCxO722dPljBcehNVqYx+BhE64vHylsMfu1GtqT0X2lc0u3/HlY/gcyt16VikIsFsukd2f7Sk0VC/a6K2ni1bJtuNDfx0Pch6Wlwuyo2RwBybG+S0FOg+nU+nj/uI1fHf4H7T8vhcDj+AX8AnMTkomeXEcwAAAAASUVORK5CYII=);
+}
+
+.GPmousePositionEditTool {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QYXCC4cQlf82gAAAvFJREFUSMfllk9PE1EUxc99DDQBxZV8BKGUlkJKQjEK6rIWDQETFy5o17JwQ1s0QEKhbNTA1kLixogkhIBbURL+JDYyFKTtZ9DEgIQEmb7rojNkWmYoG42Jb/fm3rz5zbnn3jdAmbURU3gjpjD+0hL4xxZZPVwbQZ34pQwQEGDAqyeqTFg+kdrUzQl8O+/Q6cE7r2vohy/kCDZhdFTavXsm0qYe4lJuILHywBZofaiij5iSAC7bHHRAzOH2ify8HUyrWH0kiJGVnly/I9hoAUWvIr5tl1DdzECKb7wzoIQFzFsdZkESOo0YM7oYWARQy0Rzm9GKXiugatpvEVSwXINI188cv0+XfDjNRHw7LqG6AYAIqMFP5xkPrY2gTleGwBj0j2s91+PaqhHvmNA+dYxr94kRBUBMlFyN4mopUDiR8mRkS9rYO4Xqmo20ZjA8LAxlnEJ1GfEse7JhR6D5TMk2YsoYgCEAC/5xradM5y0C6AZhzB/Xntn5wym2PMaDnGzO5YGTRrHdZIbprwq6zCU1lywIAJLwslwnMOM5ABDjrl1KKPHZa1bqmtiuLwcDAGQ3Y/zjGhlzyGpvl1+q1GykTa0XWx5zMCvduX5Ht5XZ//wcyoPpDClbj5tiDw0pKhjNktBpNrOlh54qXZBYAWHLH9da7c42WtsqaDcSzAot6b54UvazZSGHGcsXhcmyJ5vJe3eMfYNI188eL+3p3XcWSFZq0wAOCLi3GVUidnfZekyJ6g2wr7E2fVGY/qqgKzSZajYb3QqqqJab0YpeJporCIVFMF4Q4aOOfktXJghAMnFvRzy/UEqTjPh2GoV62k0Z6f0aSqTcANg8GM2zaE96d8OFnGJTt0/k54m4z1DqFKZQphVDGTD3WcEAwCGufJFMp8qEHAGPCUYfCSm3oRQzcITavXMv19UorlYKZQBAAIwWPXOLGctVVdqUbwTfz79cb7+ppoOmcCJVClNU2mTElz7i2t3Hkx8eXrht//v/od8GMV64Yi7NnAAAAABJRU5ErkJggg==);
+}
+
+/* Map center localisation */
+
+#GPmapCenter {
+  background-image: url(data:image/png;base64,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);
+}
+
+/* REVERSE GEOCODING */
+
+[id^="GPreverseGeocoding-"] {
+  /*left: 10px;*/
+  top: 0; /*overwritten*/
+}
+
+/* Showing/hiding reverse geocoding panel */
+
+[id^="GPshowReverseGeocodingOpen-"] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPcSURBVFiF7ZZPaBxVHMc/vxl3UggSwYMGAkVEqwfRQ4VNQRTUSw/2ksWiJZTs27QxaSGe3FRhpXS9qWiyavZPsBRLWal/QBHxIK2QPSiClYAeS8BbygTFkt15Pw87m2w2s91kiQgyn9sM733n9+H93nsDMTExMTExMf8Vsh8hxpj7gCngBeBhoA6sAO+USqVP+81dziYyKvbwqBdMSQ4bNUZBaln3PXWc345cqM/3yryjcDqdnhCRWZoSa8CXqpotl8tr7eOMMb8Aj0UWpPpyuVz+pFchnSxnExlEPwQc0FLSC051SivI8pz7viDTgKrI2V7STpf3kk6nL4tIGXgA+AnYACZF5NfJyckHO6QuAioi3wJ5VX0b+BtARF7dq2yzAvvEVn1iahvuvLYtkILU5tyFULb5KbWP9oq9K+qlMWYCOA587zjOawCNRuO267pHVTVvrV0Cnm5+F1zXLdbr9a+XlpZWWhmZTMZT1RngkT50SeaDmVrWtYjMhD5TtTk3oV5wihwaruzU5gTRYjIRnOmVG9nSxpgbNFf2OeAAgIgoUFfVWWDMWvtkpVL5sVuwMeZz4Bhws1QqHdytaDut/bklDQ5asrAB8sqWhRaTieB0t33eTreWfgi44TiObn5cVVTVcxznOoDruoe6hWYymddpyrbavS8ENPlWcBbVzX0ZIKZfWegufAsYbjQat8OVbWaLaBAE9wOo6q2oicaYN1T1fPj4zfr6+vmocbulJe2oziudLamlvchCF2ER+QI46LruUZpXzGZLi8gUsGatvd45zxjzDPBm+PiZ7/vHqtXqxm6LuROBIDv2n+79Wo0UttbOAX+oal5VZ0XkcRF5XlW/Au5R1TOVSuXPiKljNBfhd9/3j++HbMfVsx2RdG3D/UhzXTt1B5EDy+XymuM4T6nqD8CYqr5rrT0HWOAlERk2xlzO5XKdp/wBmtvh2r8mK1oU1YWtUWL2It2rJSSTyRxW1UPAmud51wqFwl/GmIvACeCS7/snq9VqsGebHnSTTSaC0+TQztO728/JDqF+ikmlUu7Q0FAFGAeujIyMnMjlco3x8fF7BwYGnhWR2uLi4s1+slssz7kL205j9INkPpiW8O5v/XjQfhejhdF8sLP129h177dTrVYD3/cngEvAi6urqyUAz/OuquoVa20tlUq5/WS3lfYzhKslWkx6wUxLFsLTOx9Mt11ZqjgrEUHbU/stJ5Q+CXwMfBe+bv1yDg8ODt7dbzbAaL5eQmUGtJC8EN2qm/c0WkBl+ki+vhCV1TFn/zDGnAOyInK1WCyO72d2TExMTEzM/5B/AE2JsceuwAzdAAAAAElFTkSuQmCC);
+}
+
+/* General panels */
+
+[id^="GPreverseGeocodingPanel-"] {
+  left: 10px;
+}
+
+[id^="GPreverseGeocodingPanelClose-"] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPcSURBVFiF7ZZPaBxVHMc/vxl3UggSwYMGAkVEqwfRQ4VNQRTUSw/2ksWiJZTs27QxaSGe3FRhpXS9qWiyavZPsBRLWal/QBHxIK2QPSiClYAeS8BbygTFkt15Pw87m2w2s91kiQgyn9sM733n9+H93nsDMTExMTExMf8Vsh8hxpj7gCngBeBhoA6sAO+USqVP+81dziYyKvbwqBdMSQ4bNUZBaln3PXWc345cqM/3yryjcDqdnhCRWZoSa8CXqpotl8tr7eOMMb8Aj0UWpPpyuVz+pFchnSxnExlEPwQc0FLSC051SivI8pz7viDTgKrI2V7STpf3kk6nL4tIGXgA+AnYACZF5NfJyckHO6QuAioi3wJ5VX0b+BtARF7dq2yzAvvEVn1iahvuvLYtkILU5tyFULb5KbWP9oq9K+qlMWYCOA587zjOawCNRuO267pHVTVvrV0Cnm5+F1zXLdbr9a+XlpZWWhmZTMZT1RngkT50SeaDmVrWtYjMhD5TtTk3oV5wihwaruzU5gTRYjIRnOmVG9nSxpgbNFf2OeAAgIgoUFfVWWDMWvtkpVL5sVuwMeZz4Bhws1QqHdytaDut/bklDQ5asrAB8sqWhRaTieB0t33eTreWfgi44TiObn5cVVTVcxznOoDruoe6hWYymddpyrbavS8ENPlWcBbVzX0ZIKZfWegufAsYbjQat8OVbWaLaBAE9wOo6q2oicaYN1T1fPj4zfr6+vmocbulJe2oziudLamlvchCF2ER+QI46LruUZpXzGZLi8gUsGatvd45zxjzDPBm+PiZ7/vHqtXqxm6LuROBIDv2n+79Wo0UttbOAX+oal5VZ0XkcRF5XlW/Au5R1TOVSuXPiKljNBfhd9/3j++HbMfVsx2RdG3D/UhzXTt1B5EDy+XymuM4T6nqD8CYqr5rrT0HWOAlERk2xlzO5XKdp/wBmtvh2r8mK1oU1YWtUWL2It2rJSSTyRxW1UPAmud51wqFwl/GmIvACeCS7/snq9VqsGebHnSTTSaC0+TQztO728/JDqF+ikmlUu7Q0FAFGAeujIyMnMjlco3x8fF7BwYGnhWR2uLi4s1+slssz7kL205j9INkPpiW8O5v/XjQfhejhdF8sLP129h177dTrVYD3/cngEvAi6urqyUAz/OuquoVa20tlUq5/WS3lfYzhKslWkx6wUxLFsLTOx9Mt11ZqjgrEUHbU/stJ5Q+CXwMfBe+bv1yDg8ODt7dbzbAaL5eQmUGtJC8EN2qm/c0WkBl+ki+vhCV1TFn/zDGnAOyInK1WCyO72d2TExMTEzM/5B/AE2JsceuwAzdAAAAAElFTkSuQmCC);
+}
+
+/* Calc waiting */
+
+.GPreverseGeocodingCalcWaitingContainerVisible,
+.GPreverseGeocodingCalcWaitingContainerHidden {
+  border-radius: 5px;
+}
+
+/* Results panel */
+
+[id^="GPreverseGeocodingReturnPicto-"] {
+  width: 30px  !important;
+  height: 30px !important;
+  background-color: #C77A04;
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4AYBCQs6x0UYEQAAATZJREFUSMftliFLBFEURs/dVUQURJvYLCaLGESz1T9gUJsoWARBEBRM/obFIFgMygabTQSbVoNgMCqYLMLusawwYVdnZ8bdsHvS8Oab97377p33LvTp09OoJ+qHOt9p0x+28s5XSml6DOwlhuLfjdVD4KDoHRz4w3QfOGryakUdBerAG/AMPEXEexE53bU96uqtuqaWs5rumI87dSJLjmdybtgScNl25GqoFfOz3sojfjEvAadAs49vgIfG8yAwDkwDC8BQQncfEYtZcl1Wz5tEst1CP6aeJXQ1dSproZXVizTGiTRdJ7QbmQ6QiKgBq8BVmoVGhMAm8FVIoaqDarXxvy6n0P8U52URh0pJnUypnW0YP3bjGr1XXzLfTjmoAMPdiHhEfe14xBHxCVS71S7N9ZvG3uQbY/KgCDQBMlkAAAAASUVORK5CYII=);
+}
+
+.GPreverseGeocodedLocationHighlight {
+    background-color: rgba(255,200,0,0.25);
+    color: #222;
+}
+
+/* ROUTE */
+
+div[id^=GProute-] {
+   /* left: 10px; */
+   top: 0; /*overwritten*/
+}
+
+.GProuteStageFlexInput {
+  margin-bottom: 5px; /*overwritten*/
+}
+
+/* Showing/hiding route panel */
+
+span[id^=GPshowRouteOpen] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJySURBVFiF7Za/btNQFMa/z46rRkwIiXdAYmBAwilrxQBvENS7kJZWcbsnSChLk70tKk07OSISDwALf7Y2VhcWhMQjFAmxVklvDkPqNHFtktwmUCH/Nl/rfDlfzp9rICUlJSXlP0MpdaKUOvnXeZiQMYy7PdUs/iKJhpeWlm6QfAvgyeC57/scfFZKSVy8iNSz2axXr9c7psm1Ss6ysHs/N6fXWEE39ncABiV7Syzr+8JmZ2eUphV3qJS6RfIDImYngeTK6enp+3w+f9MkvlVylkF5TXAlaNt7UrmcqwBsle1tkB5Fto5eON4o3VjDAN4AyJkkGmExk8n4RpHs3kM/PxaCtr0jQL+7BGBQtl8RLIYRlO6dUbJJhp8CODJKdJiPZ2dnyiTQrWoPIgMtyrWgbNelAqtfWXDt4rXsu3N6fZRurGHf93+KyCMA70ySBXozPD8//7jZbP4yiScgbk1vREwXjtv2XlC2dwYq2zPr6NWkOY/oTk64qKILbBaESwmkd/48nPQEZgHza6lPZEsfisjLRqPx+aq6IQREanrjuGRDk97wPywHk5gFkmfYlIckP01ZEwCgCV5qJ5m8Q6dt+JDk4jQFwwU1NLMh5LOkKyuJK7f0LOc41ixln120heEZC0HbhlT083Fae9oVnhpJZl1Hrz6o6fXo9h630tfW8KWrB7Lrbvaq2L+yILsX71kI2vb2KN1raxiwvgDnLdr7qPDYu5V6R4C4VV0cqLQIrG+jVK88w7MiV+0ctEqOA3bvupvDZkPCKyso2xbE+rpQ6+zGaQ1ybQ0DQG4MAwQEVV0E9FiapoZ/GMalpKSkpKT8gd85//Z5bfxYOAAAAABJRU5ErkJggg==);
+}
+
+/* General panels */
+
+div[id^=GProutePanel-] {
+  left: 10px;
+}
+
+div[id^=GProutePanelClose] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJySURBVFiF7Za/btNQFMa/z46rRkwIiXdAYmBAwilrxQBvENS7kJZWcbsnSChLk70tKk07OSISDwALf7Y2VhcWhMQjFAmxVklvDkPqNHFtktwmUCH/Nl/rfDlfzp9rICUlJSXlP0MpdaKUOvnXeZiQMYy7PdUs/iKJhpeWlm6QfAvgyeC57/scfFZKSVy8iNSz2axXr9c7psm1Ss6ysHs/N6fXWEE39ncABiV7Syzr+8JmZ2eUphV3qJS6RfIDImYngeTK6enp+3w+f9MkvlVylkF5TXAlaNt7UrmcqwBsle1tkB5Fto5eON4o3VjDAN4AyJkkGmExk8n4RpHs3kM/PxaCtr0jQL+7BGBQtl8RLIYRlO6dUbJJhp8CODJKdJiPZ2dnyiTQrWoPIgMtyrWgbNelAqtfWXDt4rXsu3N6fZRurGHf93+KyCMA70ySBXozPD8//7jZbP4yiScgbk1vREwXjtv2XlC2dwYq2zPr6NWkOY/oTk64qKILbBaESwmkd/48nPQEZgHza6lPZEsfisjLRqPx+aq6IQREanrjuGRDk97wPywHk5gFkmfYlIckP01ZEwCgCV5qJ5m8Q6dt+JDk4jQFwwU1NLMh5LOkKyuJK7f0LOc41ixln120heEZC0HbhlT083Fae9oVnhpJZl1Hrz6o6fXo9h630tfW8KWrB7Lrbvaq2L+yILsX71kI2vb2KN1raxiwvgDnLdr7qPDYu5V6R4C4VV0cqLQIrG+jVK88w7MiV+0ctEqOA3bvupvDZkPCKyso2xbE+rpQ6+zGaQ1ybQ0DQG4MAwQEVV0E9FiapoZ/GMalpKSkpKT8gd85//Z5bfxYOAAAAABJRU5ErkJggg==);
+}
+
+/* Calc waiting */
+
+.GProuteCalcWaitingContainerVisible,
+.GProuteCalcWaitingContainerHidden {
+  border-radius: 5px;
+}
+
+/* Route form */
+
+.GProuteOriginPointerImg,
+.GProuteStageRemove,
+div[id^=GProuteStageAdd],
+.GProuteTransportImg {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPwAAAAcCAYAAABF79LlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAzSSURBVHic7Zx/bFxVdsc/575nl+BAGLWJYmVF1RUI9UfKbqGJHZKFghZVSgiriEQVlbKAnXmTHyTdVNtgJ1mGruNAqw1tQrDfOD8olSLFUNJ0UzVaxI9AcYyEGgQFiSXaKtsfNqTylOA2qvPmnv7xZuzxeH7POCjb+UjWzNx73v3esXzeufec+wwNGjRo0KBBgwYNGjS4hpGvegINGswGfX19i4wxz6vqXGvtpk2bNn0ym3pDO1lkVJ5Hmes4uul3e5hVvWpxv+oJNGgwGxhjfGCliOA4zivAb86qnooPshKBlJVXwM6qXrWYai7yfV9939d6T6YQZ7tdPdvtXjW9Br8Q3J31/jdmX05mVU9Vn1HVpKreWcs4jQifQ/aNzHXdRR0dHf/xVc6nQXWo6lIROQXMBdbMvqBdiphTAnNVbF31VPUZ4E/SH5cA71U7VtkO39fXt8AYsxVYmWnzff+ciJxyXXf/Y489drHaSeTjnTgLzIS7VWBlxgOHu91zKpy6YoP939pLXfWuFolEYoOq3jkyMrIxHo/bfDaqKolEYj/wied5z13lKV7T+L6/GHhRRM4Da6LR6PuzqTe0m8UmZV4EPW+wa5b0Ulc9Vf0hU84ONebdyrrY9/21wGHghgIml1S1IxaLvVzLZDIM7XTWikpRPVHtaNubqoteNrMZ4dPO3k+4lTo0MjLi5Tp92tkPAJsBBbbWy+n37ds3p6Wl5QPgliJmxyKRyPp169alatUb+h5zzBxTVE/h2L9+ateve4mq9fr7+9tF5AfA788YX/X+WCz2arVj5+PdLtox8gNVmaEH5v623qAueqr6JBDPad4iIgerHbPkHj7t7MeBG1T1hKpO7lVE5B4ROQncKCKD/f39D1U7kQxpZz9O6OwnrEztxVS5R+EkcKOKDA53OTXrXU2std9g6nfe2dra+pyqTt50085+kNDZAURVf70e2oODg80tLS2vUNzZAR5OJpN5/pAr46M4zc71UlJP4OFfvdWpSU9Ehsjj7ADGmO/XMnY+VMxQfmcHSNVFT1W7mOnsAKtVdYeqfl9VH1HV5ar6K+WOW9Th+/r6FhBGdgF2xGKxNbFY7K1MfzQaPRONRr8DdAEiIoePHDkyv1zxXN6JsyAd2QVlR3tvsOauPcGk3rK9wZllvcF3REM9FTn8VhdV611tPM/bAmRH642JRCIRj8dNVmTfmOlU1YHR0dHH66GdTCaPUsApclHVjlr1Lk2Yo4WdYjoWW7MesAf4+9xGVf12X1/fkjqMPw2BPaAz9EC+PbSTmvRU9Y+B3gLd9wNPA38GHAXeBj5X1bdU9buq6pSYd2F83+8BdqrqiVgsVjQR4fv+SWC1iPREo9HdxWwLcbbb7QF2Aifae4Oieme73ZPAaoSe9j1BxXoHDx6ce9111834/kEQXMq8F5HbHMcZybXp6Oj4slK9DFn78y2ZNmPMoVQqNSEim7LsBkZHR2OF9vmV4Pv+82TdSMpgoqmp6WvV5mXe7TbPa4V6E2q/Vm1exvf9wPM8t0jl6EPP8367mrHzMdxtgrZe6w53m/x6yodte21Veqq6FfjLGqb3DqEfjuXrLLWkfyD9+helVERkH4Cqrqpoenn0rJTWU2UfgChV6bmuOxIEwaXcn+ka+kk+m8OHDxfKLZRERDQajW4lK9Jbaztn0dmVypwPoPnKlStvV6M33G20QmcHaG4WU5VemvEC7efTr4t9359Xw/iV6QmL39tBtXq3VXldhruAvykU6fNG+EJ3Ss/zJLs/93Mh+1IUqrG39waS3Z/7uZB9Ofi+/yVhyaZiXNe9sZYoD2GkHxgY2K+qW7LbrbWHPvvssxnJvFL4vr9cVZ8SkXtrmVcBxkXk9Pj4+Prt27dfBhjeyXKsPMUs6YGetpd1/bJnuVzK2Pf9nwHfBP4ru91au7SpqWkslUodBZYDRCIRt9aE5HC3+Zmbst8MHDNdT+xSUowZ4xwFXQ7w80+tW0lCMp3TSQCdtcwReFREXshtbNThv0KyE3YZRKTiskt/f3878BMRmVOXic1krqo+1NLSMgZ473bRrmp+gjBreiAPmTkyBtYrZjg4ONicTCbzLV9T1tqPOzs7x4EVvu/7wEO1OvtHcZq/vJJ3uZz63yY+/r09jENqxXC3CfUqrD6IiKqqR+ibj+QxeRX4p/T7JiACfB1oA34pyy4KvDBj/GLivu+/D9yuqndnJ+vy0dfXd48x5g3gnOd5v1PMthBnd7rvo9xuhbuzk3V5bXe592B5A+Fc+56gYr2vag8PM0pv+chbsiuE7/tvMv1k2Wxx0fO8Be92O28qOut6AheX9toF5diml+zZEfdiJBJprUd5MR/v7WBedoQXuHjhU9taS3kxm/SS/K+AP8zpyluWU9V5wH5gfbrJAjeLyL9n2xWN8CLyY1W93RizHSjqgGkbgFPF7ErwY+B2UUrqYdkOoFqd3ubNm/Puw8JAEOI4znitzp1LPmdX1QFgQkQybZ2tra3E4/FynX5xvkYRefWmm25alUwm56hqu4jsBb5RYqxVkUjk9Lp161K+7y8nzAJP/w5oXj3QV29o1lWXLzNnQtx2Y2xJPUFWXfg0dXrdS6SGd7IcrW4v7ziOk0pN87X5Y2NjPwL+qJrxSjExB8dMTH1WmH/zreZHYOuiJyIpVf0uYRRfV4b9F6r6CPDLhIfjDGFG/2i2XdGkXSqVOkB4qOZB3/efyLTnnqVPJBJdhAm3L5qamg6U/a1ysE3BAeCSwIPDXe6kXu5Z+qFud1Iv0KBqvatNIWcfHR2NeZ73ONNLdp2tra1+PB4v53mHf8zTdnx8fPzBZDJ5AfhARO4IgmBFiXHOqOptyWTynO/7HxGuGs5k9advkjpTTzluL+uDX14xF6445gMx9o7LzbaoniBnrOhtN99izg13m49Uzd2CnJkasmBybAbW2n+YMb7ItoMHD1aVpymFmXBm6AHb3ohXlxfKh4ikCCP8K2XaKxADMreiGQnAohF+48aNn/f393eIyCCwN5FItAHPqoa+l17Gb1fVBwArIo/WcsT2rjifD3dph4oMqrB3qNttQ3k2059exm8ndHaroo9+q/faOWLr+/5z2dl4oM/zvM0iovF4HFXdmkgkHKay3J0LFy6coPDSP8MuwjPWCzMNjuPsmjt37gFVzbT1uK47kffqrHFEJDvC9hhj7rPWvgaQPq6KdXSXsbIEndKzanfJ9eYAysL0Pqnn+gkzUeyJJ5XULlHzdmZjKdCDkfuw+lra4nzhq6cYGBi4w1qbqX2fBu4FmgFc191GWKOvG8NPcAfoEgARPa0qk3rXTZhtYOumJyKBqv4B8BKwGvhpCft/U9UXCZN+t+b2l4wesVjsZRFZSzrSq+qbkxeHe/YHgC9UdW00Gj1R0bfJQ9ve1MsiupZ0pBdhUg/LpB6qa5ftSdWsdzURkXOEeytUdWBkZGRL+q6c6ddoNLqZqUivIvJxqXE9z/vQcZwVwF+nm8Y6OzvPq+rDOabRYuNEIpGzuW3z5s07A4yq6uvGmE0Ay37IhzZlVyBTesue5rwo0/S0hN7Pf8oMvQufBGcQRlF93VrdlO+6XFKp1GSlw1r7JPBoVve2ffv21Te5aMykXgp9UpBJPQPbhr5X32SmiFwhfABokYiUc2x3f/r16zPGKlf0yJEj84Mg2KqqKwlLIADnCPfs+z3P+89yxyqHt7qY32Tc8GEdTesJ51Q51dwc7L8zTl31Msz203K+729U1d/yPG+as2ejqpJeDfyz53l91WolEolDOafmujzPe7rE/KbNqdzSKsDZneaQKFN6SlfbXltUL/fwSluvrbhKkZmzMea+DRs2vJ5p7+/vfy1dpjzmeV5u8qtqMnMWY+5b2hNM6g13yWuI3KtwrL3X1k2vGlT1LLBQRH4tu73sslx6qb4b2J1Vh68qG18O4amrYDewe7IOX0U2vlIq+QOvcvw+gFgsVtAmfSMotYwvyfj4+OMtLS2rCfd0L0QikT8v47JdhOUgBzhWiZ7+j33czDGrFSYEXrhw3pbUU9glaT2pUA9gcHDQSSaTAGQ7O4CIHCdc3tetojC4lskDLdnODoAxx1G9V65OxaQUA+Q5ntuow/8Ckz4kU1ZZK4PneXuocs8bHpIpr4yWob3XVq0HkEwmT6bfnsnTfRzwgUXVjp/LzbfKSQgTjrl9bpA6Hjimrno1cBx4Krexqv9443mezHYkzKa9N5BKTtE1+P/BoUOHbiH9QJAx5k9z+z3P+6KeekNPcAukHwgyMkPvzmeoq14tiMh/A3+b296I8A2uWYIgmC8iY8aYpRs2bPiXAmYTIvJ39dBzhPnAGMYuXdpjC+qB1kWvDhwtbdKgQYMGDRo0aNCgQYNriP8DimGotcEqvNwAAAAASUVORK5CYII=);
+}
+
+.GProuteExclusionsOption {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAA4CAYAAADuMJi0AAAE60lEQVRYw+2YWWxUZRTHz/fd7y4zzAzTbaAdpgtQWsBiYVxYGpcEMCwRQkx48KHGhKg0WhESNYglwSUgWCKGTaMRBF4MwShpECUshlJqay2U0LCUwrRAp+0Ms997v8UnEl8Gp9Ppg2Z+bzfnn+/knHvud865AFmy/GfZVVZW/vvb9eduNn7Wc+ixGQ3/pm+UcO735VP3/rpsyc39TudHyXQ4maF61cqfZi97ocbjmVi6YGHNxoOeor3JtDskae606uqzFfPmvRqLxFg4EetIpiXJDJqqOHBwEEjIDyXjiVw4t/S1XD34TKs/MX+z4EEAgK0SwhPtjh+qq6tXBjGOtTY11a31D371qEygRxn3F3vWPVE1deN0G82T+m5BbCAIF+8lBttifLoFQeV0Wf7R7XbndsXird19/TUfAhgZeZ8H7eoXHYVWwzdBFTedsmhScfg0wfQPTRF7FfLdmBRRo4Q9RzTS8aeKRaeERAsC8TmRto30HJKqMCrhIcMUMuMcmADQJAQ5GJ4fqUMpFdE2mXgqOe+ewXhJFCHoJNJxu4omz7bhScVMyj/BeFPGUrlZIROOYRT4C0C0S0h8qUhHAAC2yGTFpUka7Skfx9/DZFZGnH2gEHxYwnc6EIguBYnDqtTzT3uDTFb3VdrEcZfWk5GUrgZxaI4QCyyaBAME04sUzTvL+dBD+xnOu8qiwrIgV1leEuf9JxhvTzu6Bgm5ThXkmNcciriaS8R2lXySTHvUqXb/lqsNp3Ju0qstx2Z7sfTZGuKsLAFkV4RK0J5k2s4wXYqYsO6WyYq0HUYN06c9XgX5SxcBuIt4gvJ40sJi7MaVONtVhGHmqIrmyLPzm29tqqf7ilwHUtHvVAjO9tksWbJkyQzehd7xo5ppUqW2tlbzLp380rhxitdB8q/4fD6acnsaKfX19c7Ji+QNJU/at7mmWaaZpklHNSY+irq6urzSxbBBy1PqEoJZfFdYoK2tjY2Jw4aGBpurJvKOmme8xWTTmgjq1DApAwAxoo6fIkieEnoF2+NvUDVqCekRiNIY4ip1eb1ekvEI39/65nOyO7hWtyWc0biOogkDooYOBhhujLEDAIZG4xADAH/4sH796y42ZWBNxBGrCEZMlNBNER1k8fBtdixwwzzY2toaTCtCr9drLXzKthgSiv7ztycfjvQo4O5fpWqR5eGojg2DCX1IBHUf3n2nSey5cOpCXzrfIXp6WZXXMtdYh8pi74JTL3WTijO913tDq2qXVxplA5vijgdTIvE4RO6zYOwO3t5/GhpbTrYMjnh78nq9VlwRfRmVRdewArM6rgJBTLbxErYEAL4J5vetwFJ4jghQxMNSSAyoO42Ttl0Xz58PpzXqS5JE7G5tqrAbM6lMiyljkimoQg1m8VhK7xrFwTpdixcbAaGz2/I+ekba0dzc/iDt3SIUCtH+Lv+lArWwjWPOOeMVJjI1imgRsyXKDas+mxoc83vKUfOC/dO2lst3M7LM3L816LdLBedlTIKU05lUNfJM2ZzEBZORXzuHrtk+vnSu63JGF9LhvmH9/uVAu8s9MUQFnWUSIweHFJ90z7qlq+n6L2OyAQMA918NdLrcrqgwoQrHyAHWqX49PDzMxsohAIAUuZ0YsHJHSO+G5t7eXj+k8ZsEjfCmsQGABgAmAMQBIJEdN7L8//gb3FshBGMt81oAAAAASUVORK5CYII=);
+}
+
+/* Results panel */
+
+div[id^=GProuteResultsValueDist],
+div[id^=GProuteResultsValueTime] {
+  color: #C77A04;
+}
+
+div[id^=GProuteResultsNew] {
+  background-color: #C77A04;
+  background-image: url(data:image/png;base64,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);
+}
+
+input[id^=GProuteResultsShowDetails] + label:hover,
+input[id^=GProuteResultsShowDetails] + label + label:hover {
+  color: #C77A04;
+}
+
+.GProuteResultsDetailsHighlight {
+    background-color: rgba(255,200,0,0.25);
+    color: #222;
+}
+
+/* SEARCH ENGINE */
+
+div[id^=GPsearchEngine-] {
+  /* top: 10px; */
+  /* left: 46px; */
+}
+
+/* Showing/hiding search engine input */
+
+span[id^=GPshowSearchEngineOpen] {
+  background-image: url(data:image/png;base64,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);
+}
+
+/* Simple search input */
+
+form[id^=GPsearchInput-] {
+  height: 30px;
+}
+
+div[id^=GPsearchInputReset] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKPSURBVFiF7Za9ctpAFIXPkQY39oukS+GZyHkeGKOA3YALqNSEFJbsGWzZscX7wKRJlxk/B3JDRntToD9kCUkJnjT7dYgVh2/v7t4FNBqNRqPR/C/YZNBy0ukJ1enZUWTTgSobIwBXE3MuhvHy+evv+0P8uevr6x7J0zAMbcdxynNFeHNzM1dKvVxdXdXm1govJ50eKN8BGIAsrKPovCgtAJdT847gAIAIefmv0rFsnItFGIbnRWkRoed5dwC2uSKXddJGbTLVx2wcu6uNeS+5iRKAq6npx7IAQIr60MKtPJbM5aJ7fHx8LyJZrghd1/WxlY1fYW1urbA1i4YQyc0a7dXUfBYHRlJZgHb2tQTWUXTRyGoPo9FoSDLNJWl7nvfsOI6RVJbMckkGYRjW5jbaw8n+BDlMnhmQhQI2AL9kvyaB1Yn6Vfu8Lcn+FJE0l+RCKbUhs1ySwXq97lft8zyNhIG30lJ8+cCyaW6J9E5sC1mghTCwlf4xMecROdx9sfwwOxQiwtvb27lSqihdepjto/7QKhARfDNL0m7i/gal1NvY3CHWlFZLOtd6yka8S5ULraeMVlVuVOFSWUpAET8bxe5qYz6J037VVOaWyJIMAORy0T05OXlyHKdRbu2gKlmrE/U/fYsuCi3rYNJVsuv1uj8ajS7yLQstpOtvWlPT32k9kEdrFg24PajTi8dOL4Y8nM2iqiXYiPhSkeaKyON4PB6QlPgzXdf1870YwMN4PN6b26ASxk8g3pfbS8UwkQUAAmLNokGu0iIwfjX02keaSzJ4fX0dJrLxM4knIM0leYhcYDnp2Mup6cueFREvfX856dhVY9rieZ7tuq6/7zROKu153sFyNRqNRqPRvA9/AHtLag4LyzlCAAAAAElFTkSuQmCC);
+}
+
+/* General panels */
+
+div[id^=GPgeocodeResultsClose] {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKPSURBVFiF7Za9ctpAFIXPkQY39oukS+GZyHkeGKOA3YALqNSEFJbsGWzZscX7wKRJlxk/B3JDRntToD9kCUkJnjT7dYgVh2/v7t4FNBqNRqPR/C/YZNBy0ukJ1enZUWTTgSobIwBXE3MuhvHy+evv+0P8uevr6x7J0zAMbcdxynNFeHNzM1dKvVxdXdXm1govJ50eKN8BGIAsrKPovCgtAJdT847gAIAIefmv0rFsnItFGIbnRWkRoed5dwC2uSKXddJGbTLVx2wcu6uNeS+5iRKAq6npx7IAQIr60MKtPJbM5aJ7fHx8LyJZrghd1/WxlY1fYW1urbA1i4YQyc0a7dXUfBYHRlJZgHb2tQTWUXTRyGoPo9FoSDLNJWl7nvfsOI6RVJbMckkGYRjW5jbaw8n+BDlMnhmQhQI2AL9kvyaB1Yn6Vfu8Lcn+FJE0l+RCKbUhs1ySwXq97lft8zyNhIG30lJ8+cCyaW6J9E5sC1mghTCwlf4xMecROdx9sfwwOxQiwtvb27lSqihdepjto/7QKhARfDNL0m7i/gal1NvY3CHWlFZLOtd6yka8S5ULraeMVlVuVOFSWUpAET8bxe5qYz6J037VVOaWyJIMAORy0T05OXlyHKdRbu2gKlmrE/U/fYsuCi3rYNJVsuv1uj8ajS7yLQstpOtvWlPT32k9kEdrFg24PajTi8dOL4Y8nM2iqiXYiPhSkeaKyON4PB6QlPgzXdf1870YwMN4PN6b26ASxk8g3pfbS8UwkQUAAmLNokGu0iIwfjX02keaSzJ4fX0dJrLxM4knIM0leYhcYDnp2Mup6cueFREvfX856dhVY9rieZ7tuq6/7zROKu153sFyNRqNRqPRvA9/AHtLag4LyzlCAAAAAElFTkSuQmCC);
+}
+
+div[id^=GPadvancedSearchClose] {
+  background-image: url(data:image/png;base64,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);
+  background-position: -60px 0;
+}
+
+/* Advanced search picto */
+
+span[id^=GPshowAdvancedSearchOpen] {
+  background-image: url(data:image/png;base64,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);
+  background-position: -30px 0;
+}
+
+/* Autocomplete list / geocode results */
+
+div[id^=GPautoCompleteList],
+div[id^=GPgeocodeResultsList] {
+  margin-left: 27px;
+  box-shadow: 0 1px 5px #000;
+}
+
+div[id^=GPgeocodeResultsList] {
+  top: 38px;
+  border-radius: 5px;
+}
+
+/* ================================================================== */
+/* Toolbars
+/* ================================================================== */
+
+.leaflet-draw-section {
+	position: relative;
+}
+
+.leaflet-draw-toolbar {
+	margin-top: 12px;
+}
+
+.leaflet-draw-toolbar-top {
+	margin-top: 0;
+}
+
+.leaflet-draw-toolbar-notop a:first-child {
+	border-top-right-radius: 0;
+}
+
+.leaflet-draw-toolbar-nobottom a:last-child {
+	border-bottom-right-radius: 0;
+}
+
+.leaflet-draw-toolbar a {
+	background-image: url(data:image/png;base64,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);
+	background-image: linear-gradient(transparent, transparent), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZpZXdCb3g9IjAgMCA2MDAgNjAiCiAgIGhlaWdodD0iNjAiCiAgIHdpZHRoPSI2MDAiCiAgIGlkPSJzdmc0MjI1IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJzcHJpdGVzaGVldC5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvZnB1Z2EvZGV2ZWxvcG1lbnQvdXBzdHJlYW0vaWNhcnRvLkxlYWZsZXQuZHJhdy9zcmMvaW1hZ2VzL3Nwcml0ZXNoZWV0LTJ4LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjkwIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iOTAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQyNTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MjU2IiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDU2IgogICAgIGlkPSJuYW1lZHZpZXc0MjU0IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIxLjMxMDE4NTIiCiAgICAgaW5rc2NhcGU6Y3g9IjIzNy41NjkyOCIKICAgICBpbmtzY2FwZTpjeT0iNy4yNDE5NjIxIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzQyMjUiIC8+CiAgPGcKICAgICBpZD0iZW5hYmxlZCIKICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIj4KICAgIDxnCiAgICAgICBpZD0icG9seWxpbmUiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIj4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAxOCwzNiAwLDYgNiwwIDAsLTYgLTYsMCB6IG0gNCw0IC0yLDAgMCwtMiAyLDAgMCwyIHoiCiAgICAgICAgIGlkPSJwYXRoNDIyOSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzNiwxOCAwLDYgNiwwIDAsLTYgLTYsMCB6IG0gNCw0IC0yLDAgMCwtMiAyLDAgMCwyIHoiCiAgICAgICAgIGlkPSJwYXRoNDIzMSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAyMy4xNDIsMzkuMTQ1IC0yLjI4NSwtMi4yOSAxNiwtMTUuOTk4IDIuMjg1LDIuMjg1IHoiCiAgICAgICAgIGlkPSJwYXRoNDIzMyIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDwvZz4KICAgIDxwYXRoCiAgICAgICBpZD0icG9seWdvbiIKICAgICAgIGQ9Ik0gMTAwLDI0LjU2NSA5Ny45MDQsMzkuMzk1IDgzLjA3LDQyIDc2LDI4Ljc3MyA4Ni40NjMsMTggWiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJyZWN0YW5nbGUiCiAgICAgICBkPSJtIDE0MCwyMCAyMCwwIDAsMjAgLTIwLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJjaXJjbGUiCiAgICAgICBkPSJtIDIyMSwzMCBjIDAsNi4wNzggLTQuOTI2LDExIC0xMSwxMSAtNi4wNzQsMCAtMTEsLTQuOTIyIC0xMSwtMTEgMCwtNi4wNzQgNC45MjYsLTExIDExLC0xMSA2LjA3NCwwIDExLDQuOTI2IDExLDExIHoiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0ibWFya2VyIgogICAgICAgZD0ibSAyNzAsMTkgYyAtNC45NzEsMCAtOSw0LjAyOSAtOSw5IDAsNC45NzEgNS4wMDEsMTIgOSwxNCA0LjAwMSwtMiA5LC05LjAyOSA5LC0xNCAwLC00Ljk3MSAtNC4wMjksLTkgLTksLTkgeiBtIDAsMTIuNSBjIC0yLjQ4NCwwIC00LjUsLTIuMDE0IC00LjUsLTQuNSAwLC0yLjQ4NCAyLjAxNiwtNC41IDQuNSwtNC41IDIuNDg1LDAgNC41LDIuMDE2IDQuNSw0LjUgMCwyLjQ4NiAtMi4wMTUsNC41IC00LjUsNC41IHoiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBpZD0iZWRpdCIKICAgICAgIHN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDMzNywzMC4xNTYgMCwwLjQwNyAwLDUuNjA0IGMgMCwxLjY1OCAtMS4zNDQsMyAtMywzIGwgLTEwLDAgYyAtMS42NTUsMCAtMywtMS4zNDIgLTMsLTMgbCAwLC0xMCBjIDAsLTEuNjU3IDEuMzQ1LC0zIDMsLTMgbCA2LjM0NSwwIDMuMTksLTMuMTcgLTkuNTM1LDAgYyAtMy4zMTMsMCAtNiwyLjY4NyAtNiw2IGwgMCwxMCBjIDAsMy4zMTMgMi42ODcsNiA2LDYgbCAxMCwwIGMgMy4zMTQsMCA2LC0yLjY4NyA2LC02IGwgMCwtOC44MDkgLTMsMi45NjgiCiAgICAgICAgIGlkPSJwYXRoNDI0MCIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzMzguNzIsMjQuNjM3IC04Ljg5Miw4Ljg5MiAtMi44MjgsMCAwLC0yLjgyOSA4Ljg5LC04Ljg5IHoiCiAgICAgICAgIGlkPSJwYXRoNDI0MiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzMzguNjk3LDE3LjgyNiA0LDAgMCw0IC00LDAgeiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoLTAuNzA2OTgzMzYsLTAuNzA3MjMwMTgsMC43MDcyMzAxOCwtMC43MDY5ODMzNiw1NjcuNTU5MTcsMjc0Ljc4MjczKSIKICAgICAgICAgaWQ9InBhdGg0MjQ0IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIiAvPgogICAgPC9nPgogICAgPGcKICAgICAgIGlkPSJyZW1vdmUiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIj4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzODEsNDIgMTgsMCAwLC0xOCAtMTgsMCAwLDE4IHogbSAxNCwtMTYgMiwwIDAsMTQgLTIsMCAwLC0xNCB6IG0gLTQsMCAyLDAgMCwxNCAtMiwwIDAsLTE0IHogbSAtNCwwIDIsMCAwLDE0IC0yLDAgMCwtMTQgeiBtIC00LDAgMiwwIDAsMTQgLTIsMCAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDQyNDciCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Im0gMzk1LDIwIDAsLTQgLTEwLDAgMCw0IC02LDAgMCwyIDIyLDAgMCwtMiAtNiwwIHogbSAtMiwwIC02LDAgMCwtMiA2LDAgMCwyIHoiCiAgICAgICAgIGlkPSJwYXRoNDI0OSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDwvZz4KICA8L2c+CiAgPGcKICAgICBpZD0iZGlzYWJsZWQiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIwLDApIgogICAgIHN0eWxlPSJmaWxsOiNiYmJiYmIiPgogICAgPHVzZQogICAgICAgeGxpbms6aHJlZj0iI2VkaXQiCiAgICAgICBpZD0iZWRpdC1kaXNhYmxlZCIKICAgICAgIHg9IjAiCiAgICAgICB5PSIwIgogICAgICAgd2lkdGg9IjEwMCUiCiAgICAgICBoZWlnaHQ9IjEwMCUiIC8+CiAgICA8dXNlCiAgICAgICB4bGluazpocmVmPSIjcmVtb3ZlIgogICAgICAgaWQ9InJlbW92ZS1kaXNhYmxlZCIKICAgICAgIHg9IjAiCiAgICAgICB5PSIwIgogICAgICAgd2lkdGg9IjEwMCUiCiAgICAgICBoZWlnaHQ9IjEwMCUiIC8+CiAgPC9nPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzQ2NDY0NjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJjaXJjbGUtMyIKICAgICBkPSJtIDU4MS42NTcyNSwzMCBjIDAsNi4wNzggLTQuOTI2LDExIC0xMSwxMSAtNi4wNzQsMCAtMTEsLTQuOTIyIC0xMSwtMTEgMCwtNi4wNzQgNC45MjYsLTExIDExLC0xMSA2LjA3NCwwIDExLDQuOTI2IDExLDExIHoiCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KPC9zdmc+Cg==);
+	background-repeat: no-repeat;
+	background-size: 300px 30px;
+	background-clip: padding-box;
+}
+
+.leaflet-retina .leaflet-draw-toolbar a {
+	background-image: url(data:image/png;base64,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);
+	background-image: linear-gradient(transparent, transparent), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZpZXdCb3g9IjAgMCA2MDAgNjAiCiAgIGhlaWdodD0iNjAiCiAgIHdpZHRoPSI2MDAiCiAgIGlkPSJzdmc0MjI1IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJzcHJpdGVzaGVldC5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvZnB1Z2EvZGV2ZWxvcG1lbnQvdXBzdHJlYW0vaWNhcnRvLkxlYWZsZXQuZHJhdy9zcmMvaW1hZ2VzL3Nwcml0ZXNoZWV0LTJ4LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjkwIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iOTAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQyNTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MjU2IiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDU2IgogICAgIGlkPSJuYW1lZHZpZXc0MjU0IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIxLjMxMDE4NTIiCiAgICAgaW5rc2NhcGU6Y3g9IjIzNy41NjkyOCIKICAgICBpbmtzY2FwZTpjeT0iNy4yNDE5NjIxIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzQyMjUiIC8+CiAgPGcKICAgICBpZD0iZW5hYmxlZCIKICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIj4KICAgIDxnCiAgICAgICBpZD0icG9seWxpbmUiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIj4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAxOCwzNiAwLDYgNiwwIDAsLTYgLTYsMCB6IG0gNCw0IC0yLDAgMCwtMiAyLDAgMCwyIHoiCiAgICAgICAgIGlkPSJwYXRoNDIyOSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzNiwxOCAwLDYgNiwwIDAsLTYgLTYsMCB6IG0gNCw0IC0yLDAgMCwtMiAyLDAgMCwyIHoiCiAgICAgICAgIGlkPSJwYXRoNDIzMSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAyMy4xNDIsMzkuMTQ1IC0yLjI4NSwtMi4yOSAxNiwtMTUuOTk4IDIuMjg1LDIuMjg1IHoiCiAgICAgICAgIGlkPSJwYXRoNDIzMyIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDwvZz4KICAgIDxwYXRoCiAgICAgICBpZD0icG9seWdvbiIKICAgICAgIGQ9Ik0gMTAwLDI0LjU2NSA5Ny45MDQsMzkuMzk1IDgzLjA3LDQyIDc2LDI4Ljc3MyA4Ni40NjMsMTggWiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJyZWN0YW5nbGUiCiAgICAgICBkPSJtIDE0MCwyMCAyMCwwIDAsMjAgLTIwLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJjaXJjbGUiCiAgICAgICBkPSJtIDIyMSwzMCBjIDAsNi4wNzggLTQuOTI2LDExIC0xMSwxMSAtNi4wNzQsMCAtMTEsLTQuOTIyIC0xMSwtMTEgMCwtNi4wNzQgNC45MjYsLTExIDExLC0xMSA2LjA3NCwwIDExLDQuOTI2IDExLDExIHoiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0ibWFya2VyIgogICAgICAgZD0ibSAyNzAsMTkgYyAtNC45NzEsMCAtOSw0LjAyOSAtOSw5IDAsNC45NzEgNS4wMDEsMTIgOSwxNCA0LjAwMSwtMiA5LC05LjAyOSA5LC0xNCAwLC00Ljk3MSAtNC4wMjksLTkgLTksLTkgeiBtIDAsMTIuNSBjIC0yLjQ4NCwwIC00LjUsLTIuMDE0IC00LjUsLTQuNSAwLC0yLjQ4NCAyLjAxNiwtNC41IDQuNSwtNC41IDIuNDg1LDAgNC41LDIuMDE2IDQuNSw0LjUgMCwyLjQ4NiAtMi4wMTUsNC41IC00LjUsNC41IHoiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBpZD0iZWRpdCIKICAgICAgIHN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDMzNywzMC4xNTYgMCwwLjQwNyAwLDUuNjA0IGMgMCwxLjY1OCAtMS4zNDQsMyAtMywzIGwgLTEwLDAgYyAtMS42NTUsMCAtMywtMS4zNDIgLTMsLTMgbCAwLC0xMCBjIDAsLTEuNjU3IDEuMzQ1LC0zIDMsLTMgbCA2LjM0NSwwIDMuMTksLTMuMTcgLTkuNTM1LDAgYyAtMy4zMTMsMCAtNiwyLjY4NyAtNiw2IGwgMCwxMCBjIDAsMy4zMTMgMi42ODcsNiA2LDYgbCAxMCwwIGMgMy4zMTQsMCA2LC0yLjY4NyA2LC02IGwgMCwtOC44MDkgLTMsMi45NjgiCiAgICAgICAgIGlkPSJwYXRoNDI0MCIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzMzguNzIsMjQuNjM3IC04Ljg5Miw4Ljg5MiAtMi44MjgsMCAwLC0yLjgyOSA4Ljg5LC04Ljg5IHoiCiAgICAgICAgIGlkPSJwYXRoNDI0MiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzMzguNjk3LDE3LjgyNiA0LDAgMCw0IC00LDAgeiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoLTAuNzA2OTgzMzYsLTAuNzA3MjMwMTgsMC43MDcyMzAxOCwtMC43MDY5ODMzNiw1NjcuNTU5MTcsMjc0Ljc4MjczKSIKICAgICAgICAgaWQ9InBhdGg0MjQ0IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIiAvPgogICAgPC9nPgogICAgPGcKICAgICAgIGlkPSJyZW1vdmUiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIj4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzODEsNDIgMTgsMCAwLC0xOCAtMTgsMCAwLDE4IHogbSAxNCwtMTYgMiwwIDAsMTQgLTIsMCAwLC0xNCB6IG0gLTQsMCAyLDAgMCwxNCAtMiwwIDAsLTE0IHogbSAtNCwwIDIsMCAwLDE0IC0yLDAgMCwtMTQgeiBtIC00LDAgMiwwIDAsMTQgLTIsMCAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDQyNDciCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Im0gMzk1LDIwIDAsLTQgLTEwLDAgMCw0IC02LDAgMCwyIDIyLDAgMCwtMiAtNiwwIHogbSAtMiwwIC02LDAgMCwtMiA2LDAgMCwyIHoiCiAgICAgICAgIGlkPSJwYXRoNDI0OSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDwvZz4KICA8L2c+CiAgPGcKICAgICBpZD0iZGlzYWJsZWQiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIwLDApIgogICAgIHN0eWxlPSJmaWxsOiNiYmJiYmIiPgogICAgPHVzZQogICAgICAgeGxpbms6aHJlZj0iI2VkaXQiCiAgICAgICBpZD0iZWRpdC1kaXNhYmxlZCIKICAgICAgIHg9IjAiCiAgICAgICB5PSIwIgogICAgICAgd2lkdGg9IjEwMCUiCiAgICAgICBoZWlnaHQ9IjEwMCUiIC8+CiAgICA8dXNlCiAgICAgICB4bGluazpocmVmPSIjcmVtb3ZlIgogICAgICAgaWQ9InJlbW92ZS1kaXNhYmxlZCIKICAgICAgIHg9IjAiCiAgICAgICB5PSIwIgogICAgICAgd2lkdGg9IjEwMCUiCiAgICAgICBoZWlnaHQ9IjEwMCUiIC8+CiAgPC9nPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzQ2NDY0NjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJjaXJjbGUtMyIKICAgICBkPSJtIDU4MS42NTcyNSwzMCBjIDAsNi4wNzggLTQuOTI2LDExIC0xMSwxMSAtNi4wNzQsMCAtMTEsLTQuOTIyIC0xMSwtMTEgMCwtNi4wNzQgNC45MjYsLTExIDExLC0xMSA2LjA3NCwwIDExLDQuOTI2IDExLDExIHoiCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KPC9zdmc+Cg==);
+}
+
+.leaflet-draw a {
+	display: block;
+	text-align: center;
+	text-decoration: none;
+}
+
+.leaflet-draw a .sr-only {
+	position: absolute;
+	width: 1px;
+	height: 1px;
+	padding: 0;
+	margin: -1px;
+	overflow: hidden;
+	clip: rect(0, 0, 0, 0);
+	border: 0;
+}
+
+/* ================================================================== */
+/* Toolbar actions menu
+/* ================================================================== */
+
+.leaflet-draw-actions {
+	display: none;
+	list-style: none;
+	margin: 0;
+	padding: 0;
+	position: absolute;
+	left: 26px; /* leaflet-draw-toolbar.left + leaflet-draw-toolbar.width */
+	top: 0;
+	white-space: nowrap;
+}
+
+.leaflet-touch .leaflet-draw-actions {
+	left: 32px;
+}
+
+.leaflet-right .leaflet-draw-actions {
+	right: 26px;
+	left: auto;
+}
+
+.leaflet-touch .leaflet-right .leaflet-draw-actions {
+	right: 32px;
+	left: auto;
+}
+
+.leaflet-draw-actions li {
+	display: inline-block;
+}
+
+.leaflet-draw-actions li:first-child a {
+	border-left: none;
+}
+
+.leaflet-draw-actions li:last-child a {
+	-webkit-border-radius: 0 4px 4px 0;
+	border-radius: 0 4px 4px 0;
+}
+
+.leaflet-right .leaflet-draw-actions li:last-child a {
+	-webkit-border-radius: 0;
+	border-radius: 0;
+}
+
+.leaflet-right .leaflet-draw-actions li:first-child a {
+	-webkit-border-radius: 4px 0 0 4px;
+	border-radius: 4px 0 0 4px;
+}
+
+.leaflet-draw-actions a {
+	background-color: #919187;
+	border-left: 1px solid #AAA;
+	color: #FFF;
+	font: 11px/19px "Helvetica Neue", Arial, Helvetica, sans-serif;
+	line-height: 28px;
+	text-decoration: none;
+	padding-left: 10px;
+	padding-right: 10px;
+	height: 28px;
+}
+
+.leaflet-touch .leaflet-draw-actions a {
+	font-size: 12px;
+	line-height: 30px;
+	height: 30px;
+}
+
+.leaflet-draw-actions-bottom {
+	margin-top: 0;
+}
+
+.leaflet-draw-actions-top {
+	margin-top: 1px;
+}
+
+.leaflet-draw-actions-top a,
+.leaflet-draw-actions-bottom a {
+	height: 27px;
+	line-height: 27px;
+}
+
+.leaflet-draw-actions a:hover {
+	background-color: #A0A098;
+}
+
+.leaflet-draw-actions-top.leaflet-draw-actions-bottom a {
+	height: 26px;
+	line-height: 26px;
+}
+
+/* ================================================================== */
+/* Draw toolbar
+/* ================================================================== */
+
+.leaflet-draw-toolbar .leaflet-draw-draw-polyline {
+	background-position: -2px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline {
+	background-position: 0 -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-draw-polygon {
+	background-position: -31px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon {
+	background-position: -29px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-draw-rectangle {
+	background-position: -62px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle {
+	background-position: -60px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-draw-circle {
+	background-position: -92px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle {
+	background-position: -90px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-draw-marker {
+	background-position: -122px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker {
+	background-position: -120px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-draw-circlemarker {
+	background-position: -273px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circlemarker {
+	background-position: -271px -1px;
+}
+
+/* ================================================================== */
+/* Edit toolbar
+/* ================================================================== */
+
+.leaflet-draw-toolbar .leaflet-draw-edit-edit {
+	background-position: -152px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit {
+	background-position: -150px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-edit-remove {
+	background-position: -182px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove {
+	background-position: -180px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled {
+	background-position: -212px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled {
+	background-position: -210px -1px;
+}
+
+.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled {
+	background-position: -242px -2px;
+}
+
+.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled {
+	background-position: -240px -2px;
+}
+
+/* ================================================================== */
+/* Drawing styles
+/* ================================================================== */
+
+.leaflet-mouse-marker {
+	background-color: #fff;
+	cursor: crosshair;
+}
+
+.leaflet-draw-tooltip {
+	background: rgb(54, 54, 54);
+	background: rgba(0, 0, 0, 0.5);
+	border: 1px solid transparent;
+	-webkit-border-radius: 4px;
+	border-radius: 4px;
+	color: #fff;
+	font: 12px/18px "Helvetica Neue", Arial, Helvetica, sans-serif;
+	margin-left: 20px;
+	margin-top: -21px;
+	padding: 4px 8px;
+	position: absolute;
+	visibility: hidden;
+	white-space: nowrap;
+	z-index: 6;
+}
+
+.leaflet-draw-tooltip:before {
+	border-right: 6px solid black;
+	border-right-color: rgba(0, 0, 0, 0.5);
+	border-top: 6px solid transparent;
+	border-bottom: 6px solid transparent;
+	content: "";
+	position: absolute;
+	top: 7px;
+	left: -7px;
+}
+
+.leaflet-error-draw-tooltip {
+	background-color: #F2DEDE;
+	border: 1px solid #E6B6BD;
+	color: #B94A48;
+}
+
+.leaflet-error-draw-tooltip:before {
+	border-right-color: #E6B6BD;
+}
+
+.leaflet-draw-tooltip-single {
+	margin-top: -12px
+}
+
+.leaflet-draw-tooltip-subtext {
+	color: #f8d5e4;
+}
+
+.leaflet-draw-guide-dash {
+	font-size: 1%;
+	opacity: 0.6;
+	position: absolute;
+	width: 5px;
+	height: 5px;
+}
+
+/* ================================================================== */
+/* Edit styles
+/* ================================================================== */
+
+.leaflet-edit-marker-selected {
+	background-color: rgba(254, 87, 161, 0.1);
+	border: 4px dashed rgba(254, 87, 161, 0.6);
+	-webkit-border-radius: 4px;
+	border-radius: 4px;
+	box-sizing: content-box;
+}
+
+.leaflet-edit-move {
+	cursor: move;
+}
+
+.leaflet-edit-resize {
+	cursor: pointer;
+}
+
+/* ================================================================== */
+/* Old IE styles
+/* ================================================================== */
+
+.leaflet-oldie .leaflet-draw-toolbar {
+	border: 1px solid #999;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-gp-2.1.7.min.css	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,78 @@
+/*!
+ * @brief French Geoportal Extension for Leaflet
+ *
+ * This software is released under the licence CeCILL-B (Free BSD compatible)
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ * @see http://www.cecill.info/
+ *
+ * @copyright copyright (c) IGN 
+ * @license CeCILL-B
+ * @author IGN
+ * @version 2.1.7
+ * @date 09/12/2020
+ *
+ *//*!
+ * @overview  Proj4Leaflet - Smooth Proj4js integration with Leaflet
+ * @copyright Copyright (c) 2012, Kartena AB
+ * @license   BSD 2-Clause "Simplified" License
+ *            See https://raw.githubusercontent.com/kartena/Proj4Leaflet/master/LICENSE
+ * @version 1.0.2
+ *//*!
+ * @overview  leaflet-draw - Vector drawing and editing plugin for Leaflet 
+ * @copyright Copyright (c) 2012-2017 Jon West, Jacob Toye, and Leaflet
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/Leaflet/Leaflet.draw/master/MIT-LICENSE.md
+ * @version   1.0.4
+ *//*!
+ * Sortable -- JavaScript library for reorderable drag-and-drop lists on modern
+ * browsers and touch devices. No jQuery required. Supports Meteor, AngularJS,
+ * React, Polymer, Vue, Knockout and any CSS library, e.g. Bootstrap.
+ *
+ * Released under MIT LICENSE
+ *
+ * Copyright Lebedev Konstantin <ibnRubaXa@gmail.com>
+ * https://github.com/SortableJS/Sortable
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * @version 1.8.4
+ *//*!
+ * @overview  es6-promise - a tiny implementation of Promises/A+.
+ * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
+ * @version   v4.2.4
+ *//*!
+ * @overview   Proj4js - Javascript reprojection library.
+ *
+ * @authors
+ * - Mike Adair madairATdmsolutions.ca
+ * - Richard Greenwood richATgreenwoodmap.com
+ * - Didier Richard didier.richardATign.fr
+ * - Stephen Irons stephen.ironsATclear.net.nz
+ * - Olivier Terral oterralATgmail.com
+ * - Calvin Metcalf cmetcalfATappgeo.com
+ *
+ * @copyright Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons, Olivier Terral and Calvin Metcalf
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/proj4js/proj4js/master/LICENSE.md
+ * @version   ^2.6.2
+ */div[id^=GPboostRelief-]{font-size:11px;width:150px}div[id^=GPboostRelief-] label{display:block}div[id^=GPBoostReliefListContainer-]{position:relative;width:100%;height:28px;padding-left:8px;line-height:28px}.GPlayerRelief,.GPlayerReliefValue{position:absolute;top:0}.GPlayerRelief{width:calc(100% - 60px);height:28px;padding-left:8px}.GPlayerReliefValue{width:32px;left:calc(100% - 40px);line-height:28px;font-size:10px;font-style:italic;cursor:default}label[id^=GPshowBoostReliefPicto]{display:inline-block}input[id^=GPshowBoostRelief-]+label{display:block}input[id^=GPshowBoostRelief-]:checked+label{display:none}input[id^=GPshowBoostRelief-]+label+div{display:none}input[id^=GPshowBoostRelief-]:checked+label+div{display:block}div[id^=GPboostRelief-] input[type=checkbox]:checked+label+.GPlayerAdvancedToolsRelief{max-height:28px;opacity:1}.GPlayerAdvancedToolsRelief{display:block;position:relative;width:100%;border-bottom:1px dotted #ccc;background-color:#fff}.GPlayerReliefLayerId{position:relative;width:100px;height:28px;padding-left:8px;line-height:28px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.GPlayerRelief input{-webkit-appearance:none;-moz-appearance:none;background:0 0;display:block;width:100%;height:100%;margin:0;padding:0;overflow:hidden;cursor:pointer}.GPlayerRelief input[type=range]:focus{box-shadow:none;outline:0}.GPlayerRelief input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;height:3px}.GPlayerRelief input[type=range]::-webkit-slider-thumb:before{position:absolute;top:0;right:50%;left:-200px;height:3px;pointer-events:none}.GPlayerRelief input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:9px;height:17px;-webkit-appearance:none;border:2px solid #fff;background-color:#505050;position:relative;top:-7px}.GPlayerRelief input[type=range]::-moz-range-track{width:80px;height:3px}.GPlayerRelief input[type=range]::-moz-range-thumb{width:5px;height:13px;border:2px solid #fff;border-radius:0;box-shadow:0;background-color:#505050;position:relative}.GPlayerRelief input[type=range]::-ms-track{border:0;border-color:transparent;border-radius:0;border-width:0;color:transparent;height:3px;width:80px}.GPlayerRelief input[type=range]::-ms-fill-lower,.GPlayerRelief input[type=range]::-ms-fill-upper{background:0 0;border-radius:0}.GPlayerRelief input[type=range]::-ms-thumb{width:5px;height:13px;border:2px solid #fff;background-color:#505050}.GPlayerRelief input[type=range]::-ms-tooltip{display:none}label[id^=GPshowDrawingPicto-]{display:inline-block}input[id^=GPshowDrawing-]+label{display:block}input[id^=GPshowDrawing-]:checked+label{display:none}input[id^=GPshowDrawing-]+label+div{display:none}input[id^=GPshowDrawing-]:checked+label+div{display:block}div[id^=GPdrawingPanel-]{width:240px;overflow:hidden}div[id^=GPdrawingBasicPanel-]{padding:10px 15px}.GPdrawingCoords,.GPdrawingLabel{display:inline-block;line-height:20px}.GPdrawingLabel{width:80px;font-weight:700}.GPdrawingCoords{width:110px}.marker-input-radio{display:none}input.marker-input-radio:checked+label{border:1px solid red}div[id^=GPelevationPathPanelInfo]{display:none}.GPelevationPathCalcWaitingContainerHidden,.GPelevationPathCalcWaitingContainerVisible{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,.9);font-size:1.5em;font-weight:700;overflow:hidden}.GPelevationPathInformationsContainerHidden,.GPelevationPathInformationsContainerVisible{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,.9);font-size:13px;font-weight:700;overflow:hidden}.GPelevationPathCalcWaitingContainerVisible{display:-webkit-flex;display:-webkit-box;display:-ms-flexbox;display:flex}.GPelevationPathInformationsContainerVisible{display:-webkit-flex;display:-webkit-box;display:-ms-flexbox;display:flex;flex-direction:column}.GPelevationPathCalcWaitingContainerHidden,.GPelevationPathInformationsContainerHidden{display:none}.GPelevationPathCalcWaiting,.GPelevationPathInformations{margin:auto}.GPelevationPathInformations{font-size:.8em}.GPelevationPathCalcWaitingContainerHidden,.GPelevationPathCalcWaitingContainerVisible,.GPelevationPathInformationsContainerHidden,.GPelevationPathInformationsContainerVisible{border-radius:5px}#profileElevationRaw{resize:none;padding:unset}#profileElevationByDefault{display:-webkit-flex;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%}.profile-box{height:calc(100% - 15px);display:-webkit-flex;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.profile-content{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-justify-content:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.profile-x-horizontal,.profile-x-horizontal ul,.profile-z-vertical,.profile-z-vertical ul{display:-webkit-flex;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.profile-content,.profile-z-vertical,.profile-z-vertical ul{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%}.profile-x-horizontal ul,.profile-z-vertical ul{margin:0;list-style-type:none}.profile-z-vertical{-webkit-flex:0 1 auto;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.profile-z-vertical ul{-webkit-justify-content:space-between;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:2px 5px 2px 2px}.profile-z-vertical .profile-unit{width:100%;text-align:center}.profile-content ul{background:#fff;-webkit-flex:1 0 auto;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;height:100%;width:100%;-webkit-justify-content:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-align-items:flex-end;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;margin:0;padding:0}.profile-x-horizontal{-webkit-flex:0 1 auto;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:100%;height:15px}.profile-x-horizontal ul{-webkit-justify-content:space-between;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;width:100%}.profile-x-fleche{width:0;height:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid green}.profile-z-fleche{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid red}.profile-z-axis{border-right:none;border-left:solid 2px #888;cursor:default}.profile-x-axis{border-top:none;border-bottom:solid 2px #888;cursor:default}ul#profile-data li.percent{display:inline-block;vertical-align:bottom;background-color:#c77a04;opacity:.3;border-top:solid 1px;border-radius:2px;cursor:pointer}li.axe span.bottom-axis{vertical-align:bottom}ul#profile-data .percent:hover{display:inline-block;vertical-align:bottom;background-color:red}.v0{height:0%}.v1{height:1%}.v2{height:2%}.v3{height:3%}.v4{height:4%}.v5{height:5%}.v6{height:6%}.v7{height:7%}.v8{height:8%}.v9{height:9%}.v10{height:10%}.v11{height:11%}.v12{height:12%}.v13{height:13%}.v14{height:14%}.v15{height:15%}.v16{height:16%}.v17{height:17%}.v18{height:18%}.v19{height:19%}.v20{height:20%}.v21{height:21%}.v22{height:22%}.v23{height:23%}.v24{height:24%}.v25{height:25%}.v26{height:26%}.v27{height:27%}.v28{height:28%}.v29{height:29%}.v30{height:30%}.v31{height:31%}.v32{height:32%}.v33{height:33%}.v34{height:34%}.v35{height:35%}.v36{height:36%}.v37{height:37%}.v38{height:38%}.v39{height:39%}.v40{height:40%}.v41{height:41%}.v42{height:42%}.v43{height:43%}.v44{height:44%}.v45{height:45%}.v46{height:46%}.v47{height:47%}.v48{height:48%}.v49{height:49%}.v50{height:50%}.v51{height:51%}.v52{height:52%}.v53{height:53%}.v54{height:54%}.v55{height:55%}.v56{height:56%}.v57{height:57%}.v58{height:58%}.v59{height:59%}.v60{height:60%}.v61{height:61%}.v62{height:62%}.v63{height:63%}.v64{height:64%}.v65{height:65%}.v66{height:66%}.v67{height:67%}.v68{height:68%}.v69{height:69%}.v70{height:70%}.v71{height:71%}.v72{height:72%}.v73{height:73%}.v74{height:74%}.v75{height:75%}.v76{height:76%}.v77{height:77%}.v78{height:78%}.v79{height:79%}.v80{height:80%}.v81{height:81%}.v82{height:82%}.v83{height:83%}.v84{height:84%}.v85{height:85%}.v86{height:86%}.v87{height:87%}.v88{height:88%}.v89{height:89%}.v90{height:90%}.v91{height:91%}.v92{height:92%}.v93{height:93%}.v94{height:94%}.v95{height:95%}.v96{height:96%}.v97{height:97%}.v98{height:98%}.v99{height:99%}.v100{height:100%}.axis-d3>text{fill:#5e5e5e;font-family:Verdana;font-size:10px;opacity:1;text-anchor:end}.axis-d3{fill:none;stroke:#5e5e5e;stroke-width:1;shape-rendering:crispEdges}.area-d3{fill:#c77a04;stroke:#5e5e5e;stroke-width:0;fill-opacity:.4}.line-d3{fill:none;stroke:#c77a04;stroke-width:1px}.grid-d3 .tick{stroke:#d3d3d3;opacity:.7}.grid-d3 path{stroke-width:0}.grid-d3 .tick{stroke:#d3d3d3;opacity:.7}.grid-d3 path{stroke-width:0}.overlay-d3{fill:none;pointer-events:all}.focusLine-d3{fill:none;stroke:#c77a04;stroke-width:.5px}.focusCircle-d3{fill:#c77a04}div.tooltip-d3{position:inherit;text-align:left;width:80px;height:45px;padding:5px;font:8px sans-serif;background:#fff;border:0;border-radius:8px;pointer-events:none}.GPwidget{position:absolute;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;font-size:13px;color:#333}.GPwidget input[type=button],.GPwidget input[type=text]{-webkit-appearance:none;color:#333}.GPwidget input[type=checkbox]{display:none}.GPwidget select{padding-left:3px;border-radius:3px}.GPwidget form{margin-bottom:0}.GPwidget *{box-sizing:border-box;background-repeat:no-repeat}.GPwaiting{background-image:url(data:image/gif;base64,R0lGODlhNAA0AIQSAAFkpSZ5sAGV3k2Ruiao3kOj1/GUBk225pe/B4S83XrK75HH3qrS5szMzNbW1sHe797e3ubm5v///////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAQAfACwAAAAANAA0AAAF5uAnjmRpnmiqrmzrvnAsz3T9FXhh72Ke8zWfDzgT/ogxIw55cjgiJ6XOhKjaII1sNio8Vb8ImnbMXVLBVhl2vI2hvzIHOwt9veGxyLwhu4dlcw59bzVjgjNoPHU2f0yOj5CRkpMocg2HjwaaBitzmZuaKWuGTKCgKHt8SKabqHulrJwno1qYQLGyJ56OrCuWtrChlMPExcbHH4s1ymK1NJZtM4Fxu3mvMXvMLdBj2ip60zG0WoBzENLVJL+66TDj7GQmbOc1EE9N4SURDvSRqcgj/gH8wC0LsGPtAK7pN7Chw4cQSYQAACH5BAUBAB8ALBYABAAaACcAAAVw4PdBTQOJaKquX+k2bJw6b+nIcu3isV7yLFrttioYczWWcVmICYkq5hKolB6pKOsUm9Vyu9JvKiyOls/otHqNQ7gR6ff7LJeX63Mx3n3f0+txeWyDhIVlBmsGiopoi45njo9fkZKTlIhil42RaYsxIQAh+QQFAQAfACwWAAkAGgAnAAAFdOAnjmQZOVCprmTjuikrf289y/Ub32SUuw6e6teICEuO31GVfC1Zxqd0Sq1arYVsAavNUrvdKVgrHm+l5jMazPVe3/C4/IN4I+73Kn5P3fOffn+AgXUqBocGK4QriIiKfoaNjip4LJKTT5eHU5qJnJJWjVUhACH5BAUBAB8ALAkAFgAnABoAAAV04CeOZGmepdM0Duq+5yo3cO2qcwPZPJnLveBvFezhZrsi76cM4lrNqHRKrVpPhmoBZuh2o4VwGOUtK8VoU9lcRKdJazbP/R7Fv236tnQ/If4IJ3pYa36Af4JuLl6Gh4gmYlKOgFclk4+VIpeBmSOTnZaUTSEAIfkEBQEAHwAsBAAWACcAGgAABXfg9xmkIZ5oqq5rWbJwnLqubLP0e+9nTvJAnwnIyxGJtaNyyWw6n1Ao4hmRIa7XpaPBbbCw4OO2y1WBw0Ryt4o6o3cRNdeRcmfTcojZvSr4CytyXntvKH9/gWR6X3cph4crEQ6LSo+IUYaWgJgnmpucIpagjpc3IQAh+QQFAQAfACwEAAkAGgAnAAAFb+AnjqJhkmiamqyhvmjLwrA806p946Tu8isbMNca1ozIpHLJTCKeiCYUupxOlVaqMxvdZqtWqbZJLpvPyEK5wGYz23AlPJ6c0412t9yucjQaDi98KX+FDTBtfYZ/gUmLhUqPf0p+i42Oi00QfxAiIQAh+QQFAQAfACwEAAQAGgAnAAAFc+AnjmRZGqhhrmyasrDounE7o/V64yvi6zuTb4gA0oTEn+lYSg5zSGcROpJOqVUntknc9rzgsHhMLhXOhTEaHV6vwW62N36G09tutbzM7/v/JhFlDYQNDmKFhYdeEYmFYA6OhIJbEJINYZdhlolkEA6UUCEAIfkEAQEAHwAsBAAEACcAGgAABXXgJ45kWSIoYq5sS6apK8swPN9mHeP8p6O9UmG4+qlMhmRryCwUa6uk1LBqMp9A5FQptBKDW2nX6+SFxSRyuXemjpvBz5lljYu2srX9vu/7/4CBgh8NhQ6DK4WKDYgkEIuGjSKQipKElIySj5CHlpSWIw6RoCEAOw==);background-position:center center;background-repeat:no-repeat}.GPpanel{background-color:#fff}.GPpanelHeader{position:relative;width:100%}.GPpanelTitle{width:100%;height:100%;text-align:center;font-weight:700}.GPpanelClose,.GPpanelInfo,.GPpanelReduce{position:absolute;cursor:pointer}.GPshowAdvancedToolPicto{position:relative;box-sizing:border-box;cursor:pointer}.GPshowAdvancedToolOpen{position:absolute;display:block;box-sizing:border-box}.GPflexInput{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;transition:max-height .3s ease-out,opacity .3s ease-out}.GPflexInput>*{display:block;height:28px;line-height:26px;border:1px solid #999;border-radius:0}.GPflexInput :not(:last-child){border-right:none}.GPflexInput :first-child{border-radius:3px 0 0 3px}.GPflexInput :last-child{border-radius:0 3px 3px 0}.GPflexInput>:not(input){overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.GPflexInput>input{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 5px;min-width:0}.GPflexInput>select{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1;padding-right:7px}.GPflexInput>label{background-color:#f2f2f2;color:#666;padding-left:7px;padding-right:9px;cursor:pointer}.GPinputSelect{display:block;height:28px;line-height:26px;margin:auto;border:1px solid #999;color:#333;cursor:pointer}input.GPinputSubmit{display:block;width:80px;margin:auto;height:28px;line-height:26px;padding:0;background:0 0;border:none;border-radius:3px;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;color:#fff;font-weight:700;opacity:.8;transition:opacity .2s ease-out;cursor:pointer}input.GPinputSubmit:hover{opacity:1}.GPadvancedAutoCompleteList,.GPautoCompleteList{z-index:2;display:none;position:absolute;max-height:140px;background-color:#fff;border:1px solid #999;overflow-y:hidden}.GPadvancedAutoCompleteList{width:calc(100% - 28px);border-top:none;font-size:.9em}.GPautoCompleteProposal{width:100%;height:28px;line-height:16px;padding:6px 10px;color:#5e5e5e;font-size:1em;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;cursor:pointer}.GPautoCompleteProposal:hover{color:#000;background-color:#cedbef}.GPshowMoreOptions{display:block;position:absolute;width:28px;height:28px;cursor:pointer;transition:all .5s ease-out 0s}input[type=checkbox]:checked+.GPshowMoreOptions{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}label[id^=GPgetFeatureInfoPicto]{display:inline-block}div[id^=GPgetFeatureInfo-]+label{display:block}span[id^=GPgetFeatureInfoActivate],span[id^=GPgetFeatureInfoDeactivate]{position:absolute;display:block;transition:border-radius .5s ease-out 0s,opacity .5s ease-out 0s}span[id^=GPgetFeatureInfoActivate]{background-position:0 0;opacity:1}span[id^=GPgetFeatureInfoDeactivate]{opacity:0}div[id^=GPgetFeatureInfo-] input[type=checkbox]:not(:checked)+label[id^=GPgetFeatureInfoPicto] span[id^=GPgetFeatureInfoDeactivate]{opacity:1}div[id^=GPisochron-]{top:140px}label[id^=GPshowIsochronPicto]{display:inline-block}input[id^=GPshowIsochron-]+label{display:block}input[id^=GPshowIsochron-]:checked+label{display:none}input[id^=GPshowIsochron-]+label+div{display:none}input[id^=GPshowIsochron-]:checked+label+div{display:block}div[id^=GPisochronPanel-]{width:280px}.GPisochronCalcWaitingContainerHidden,.GPisochronCalcWaitingContainerVisible{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,.9);font-size:1.5em;font-weight:700;overflow:hidden}.GPisochronCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GPisochronCalcWaitingContainerHidden{display:none}.GPisochronCalcWaiting{margin:auto}form[id^=GPisochronForm]{padding:15px}.GPisochronFormMini{max-height:58px;overflow:hidden}.GPisochronFormMini div[id^=GPisochronReset-],.GPisochronFormMini label[id^=GPshowIsoExclusionsPicto-]{display:none}.GPisochronOriginVisible{display:block}.GPisochronOriginHidden{display:none}.GPisochronOriginPointerImg{width:28px;background-color:#f2f2f2;cursor:pointer}input[id^=GPisochronOriginPointer]+.GPisochronOriginPointerImg{background-position:-1px -1px}input[id^=GPisochronOriginPointer]:checked+.GPisochronOriginPointerImg{background-position:-29px -1px}input[id^=GPisochronSubmit]{margin-top:5px}div[id^=GPisochronChoice]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;width:160px;-webkit-justify-content:space-between;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:auto;margin-top:15px;margin-bottom:5px}.GPisochronChoiceAlt input{display:none}.GPisochronChoiceAltImg{display:block;width:28px;height:28px;margin:auto;cursor:pointer}input[id^=GPisochronChoiceAltChron]+.GPisochronChoiceAltImg{background-position:-56px 0}input[id^=GPisochronChoiceAltChron]:checked+.GPisochronChoiceAltImg{background-position:-84px 0}input[id^=GPisochronChoiceAltDist]+.GPisochronChoiceAltImg{background-position:-112px 0}input[id^=GPisochronChoiceAltDist]:checked+.GPisochronChoiceAltImg{background-position:-140px 0}.GPisochronChoiceAlt span{cursor:pointer;display:block;color:#999}.GPisochronValueHidden{display:none}div[id^=GPisochronValueChron],div[id^=GPisochronValueDist]{width:220px;margin:auto}div[id^=GPisochronModeChoice]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-between;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:15px 0}.GPisochronModeLabel{display:block;text-align:center;margin-bottom:5px}div[id^=GPisochronTransportChoice] input{display:none}.GPisochronTransportImg{display:inline-block;width:28px;height:28px;cursor:pointer}.GPisochronTransportImg:first-of-type{margin-left:18px;margin-right:10px}input[id^=GPisochronTransportCar]+.GPisochronTransportImg{background-position:-168px 0}input[id^=GPisochronTransportCar]:checked+.GPisochronTransportImg{background-position:-196px 0}input[id^=GPisochronTransportPedestrian]+.GPisochronTransportImg{background-position:-224px 0}input[id^=GPisochronTransportPedestrian]:checked+.GPisochronTransportImg{background-position:-252px 0}select[id^=GPisochronDirectionSelect]{width:80px}input[id^=GPshowIsoExclusions]{display:none}.GPshowIsoExclusionsPicto{top:250px;right:0;transition:all .5s ease-out 0s}input[id^=GPshowIsoExclusions]+label+div[id^=GPisoExclusions]{max-height:0;opacity:0;margin-bottom:0}input[id^=GPshowIsoExclusions]:checked+label+div[id^=GPisoExclusions]{display:block;max-height:60px;opacity:1;margin-bottom:15px}div[id^=GPisoExclusions]{transition:max-height .5s ease-in-out .25s,opacity .5s ease-in-out .25s,margin .3s ease-in-out .25s;overflow:hidden}.GPisoExclusionsLabel{display:block;text-align:center;margin-bottom:10px;font-weight:700;line-height:16px}.GPisoExclusionsOptions{display:-webkit-flex;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.GPisoExclusionsOption{display:block;height:28px;line-height:26px;color:#a77;background-color:#fee;padding-left:28px;padding-right:5px;border:1px solid #a77;border-radius:3px;cursor:pointer}input:checked+.GPisoExclusionsOption{background-color:#efe;background-position:0 -28px;color:#797;border:1px solid #797}div[id^=GPisochronReset]{position:absolute;margin-top:5px;width:28px;height:28px;border-radius:3px;opacity:.8;background-position:-281px 0;transition:opacity .2s ease-out;cursor:pointer}div[id^=GPisochronReset]:hover{opacity:1}div[id^=GPlayerSwitcher-]{font-size:11px}div[id^=GPlayerSwitcher-] [draggable]{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;user-select:none;-khtml-user-drag:element;-webkit-user-drag:element}div[id^=GPlayerSwitcher-] input[type=checkbox]+div,div[id^=GPlayerSwitcher-] input[type=checkbox]+label+div{max-height:0}div[id^=GPlayerSwitcher-] label{display:block}label[id^=GPshowLayersListPicto]{position:relative;float:right;display:block;opacity:1;transition:opacity .5s ease-out 0s,box-shadow .5s ease-out 0s,border .5s ease-out 0s,border-radius .5s ease-out 0s;cursor:pointer}span[id^=GPshowLayersListClose],span[id^=GPshowLayersListOpen]{position:absolute;display:block;transition:border-radius .5s ease-out 0s,opacity .5s ease-out 0s}span[id^=GPshowLayersListOpen]{background-position:0 0;opacity:1}span[id^=GPshowLayersListClose]{opacity:0}div[id^=GPlayerSwitcher-] input[type=checkbox]:checked+div+label[id^=GPshowLayersListPicto]{border-top-left-radius:0;border-top-right-radius:0}div[id^=GPlayerSwitcher-] input[type=checkbox]:checked+div+label[id^=GPshowLayersListPicto] span[id^=GPshowLayersListClose]{opacity:1}div[id^=GPlayersList]{position:relative;width:180px;border-bottom-right-radius:0;opacity:0;overflow:auto;transition:max-height .5s ease-out 0s,opacity .5s ease-out .25s}div[id^=GPlayerSwitcher-] input[type=checkbox]:checked+div[id^=GPlayersList]{max-height:232px;opacity:1;transition:max-height .5s ease-in 0s,opacity .25s ease-in 0s}.GPlayerSwitcher_layer{position:relative;top:0;background-color:#fff;border-bottom:1px dotted #ccc;overflow:hidden}div[id^=GPlayersList] .GPlayerSwitcher_layer:last-child{border-bottom:none}.GPlayerAdvancedTools,.GPlayerBasicTools{position:relative;width:100%;height:28px}.GPlayerInfo,.GPlayerInfoOpened,.GPlayerRemove,.GPlayerVisibility{width:28px;height:28px;cursor:pointer}.GPlayerInfo,.GPlayerInfoOpened,.GPlayerName,.GPlayerOpacity,.GPlayerOpacityValue,.GPlayerRemove,.GPlayerVisibility{position:absolute;top:0}.GPghostLayer{opacity:0}.GPlayerBasicTools{background-color:#fff}.GPlayerVisibility{left:0;background-position:-28px 0}input[type=checkbox]:checked+.GPlayerVisibility{background-position:0 0}.GPlayerName{left:28px;width:calc(100% - 56px);line-height:28px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-left:4px;cursor:move}.outOfRange .GPlayerName{color:#aaa}.GPshowLayerAdvancedTools{top:0;right:0;background-position:-112px 0}.GPlayerAdvancedTools{display:block;max-height:0;opacity:0;transition:max-height .5s ease-out 0s,opacity .5s ease-out 0s}div[id^=GPlayerSwitcher-] input[type=checkbox]:checked+label+.GPlayerAdvancedTools{max-height:28px;opacity:1}.GPlayerInfo{left:0;background-position:-55px 0}.GPlayerInfoOpened{left:0;background-position:-83px 0}.GPlayerOpacity{left:28px;width:calc(100% - 100px);height:28px;padding-left:8px}.GPlayerOpacityValue{width:32px;left:calc(100% - 60px);line-height:28px;font-size:10px;font-style:italic;cursor:default}.GPlayerRemove{right:0;background-position:-140px 0}.GPlayerOpacity input{-webkit-appearance:none;-moz-appearance:none;background:0 0;display:block;width:100%;height:100%;margin:0;padding:0;overflow:hidden;cursor:pointer}.GPlayerOpacity input[type=range]:focus{box-shadow:none;outline:0}.GPlayerOpacity input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;height:3px}.GPlayerOpacity input[type=range]::-webkit-slider-thumb:before{position:absolute;top:0;right:50%;left:-200px;height:3px;pointer-events:none}.GPlayerOpacity input[type=range]::-webkit-slider-thumb{width:9px;height:17px;-webkit-appearance:none;border:2px solid #fff;background-color:#505050;position:relative;top:-7px}.GPlayerOpacity input[type=range]::-moz-range-track{width:80px;height:3px}.GPlayerOpacity input[type=range]::-moz-range-thumb{width:5px;height:13px;border:2px solid #fff;border-radius:0;box-shadow:0;background-color:#505050;position:relative}.GPlayerOpacity input[type=range]::-ms-track{border:0;border-color:transparent;border-radius:0;border-width:0;color:transparent;height:3px;width:80px}.GPlayerOpacity input[type=range]::-ms-fill-lower,.GPlayerOpacity input[type=range]::-ms-fill-upper{background:0 0;border-radius:0}.GPlayerOpacity input[type=range]::-ms-thumb{width:5px;height:13px;border:2px solid #fff;background-color:#505050}.GPlayerOpacity input[type=range]::-ms-tooltip{display:none}div[id^=GPlayerInfoPanel]{position:absolute;top:0;overflow-y:hidden;padding-top:10px;padding-bottom:10px}.GPlayerInfoPanelOpened{display:block}.GPlayerInfoPanelClosed{display:none}div[id^=GPlayerInfoContent]{position:relative;width:280px;max-height:200px;overflow-y:auto;padding-left:10px;padding-right:10px}div[id^=GPlayerInfoTitle]{width:calc(100% - 52px);margin:auto;margin-bottom:10px;padding-bottom:5px;text-align:center;font-size:1.1em;font-weight:700}div[id^=GPlayerInfoQuicklook]{position:absolute;top:-2px;left:10px;width:20px;height:20px;cursor:pointer}div[id^=GPlayerInfoClose]{position:absolute;top:-8px;right:10px;width:28px;height:28px;cursor:pointer}div[id^=GPlayerInfoDescription]{font-size:.9em}.GPlayerInfoSubtitle{padding-left:35px;font-weight:700;margin-top:10px;margin-bottom:4px}.GPlayerInfoLink,.GPlayerInfoPopup{line-height:20px;padding-left:23px;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;color:#999;background-repeat:no-repeat;cursor:pointer}.GPlayerInfoLink{background-position:0 -20px}.GPlayerInfoLink:hover,.GPlayerInfoPopup:hover{color:#333}.GPlayerInfoLink a,.GPlayerInfoLink a:visited .GPlayerInfoLink a:focus .GPlayerInfoLink a:hover{text-decoration:none;color:inherit}.GPlocationStageFlexInput{max-height:28px;opacity:1}.GPlocationStageFlexInputHidden{max-height:0;opacity:0;overflow:hidden}.GPlocationOriginVisible{display:block}.GPlocationOriginHidden{display:none}label.GPlocationOriginPointerImg[id*=GPlocationOriginPointerImg]{width:28px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-right:1px solid #999}input[id*=GPlocationOriginPointer]+.GPlocationOriginPointerImg{background-position:-1px -1px}input[id*=GPlocationOriginPointer]:checked+.GPlocationOriginPointerImg{background-position:-29px -1px}.GPlocationStageRemove,div[id^=GPlocationStageAdd]{width:28px;border:none;cursor:pointer}.GPlocationStageRemove{background-position:-84px 0}div[id^=GPlocationStageAdd]{background-position:-56px 0}label[id^=GPshowMeasureAreaPicto-]{display:inline-block}input[id^=GPshowMeasureArea-]+label{display:block}input[id^=GPshowMeasureArea-]:checked+label{display:block;background-color:rgba(0,60,136,.5)}input[id^=GPshowMeasureArea-]+label+div{display:block}input[id^=GPshowMeasureArea-]:checked+label+div{display:block}label[id^=GPshowMeasureAzimuthPicto-]{display:inline-block}input[id^=GPshowMeasureAzimuth-]+label{display:block}input[id^=GPshowMeasureAzimuth-]:checked+label{display:block;background-color:rgba(0,60,136,.5)}input[id^=GPshowMeasureAzimuth-]+label+div{display:block}input[id^=GPshowMeasureAzimuth-]:checked+label+div{display:block}label[id^=GPshowMeasureLengthPicto-]{display:inline-block}input[id^=GPshowMeasureLength-]+label{display:block}input[id^=GPshowMeasureLength-]:checked+label{display:block;background-color:rgba(0,60,136,.5)}input[id^=GPshowMeasureLength-]+label+div{display:block}input[id^=GPshowMeasureLength-]:checked+label+div{display:block}.GPmeasureTooltip{position:relative;background:rgba(0,0,0,.5);border-radius:4px;color:#fff;padding:4px 8px;white-space:nowrap}.GPmeasureTooltip-measure{font-weight:700}.GPmeasureTooltip-info{font-size:.75em;text-align:center}.GPmeasureTooltip-static{background-color:#fc3;color:#000;border:1px solid #fff}.GPmeasureTooltip-hidden{display:none}.GPmeasureTooltip-info::before,.GPmeasureTooltip-measure::before,.GPmeasureTooltip-static::before{border-top:6px solid rgba(0,0,0,.5);border-right:6px solid transparent;border-left:6px solid transparent;content:"";position:absolute;bottom:-6px;margin-left:-7px;left:50%}.GPmeasureTooltip-static::before{border-top-color:#fc3}label[id^=GPshowMousePositionPicto]{display:inline-block}input[id^=GPshowMousePosition-]+label{display:block}input[id^=GPshowMousePosition-]:checked+label{display:none}input[id^=GPshowMousePosition-]+label+div{display:none}input[id^=GPshowMousePosition-]:checked+label+div{display:block}div[id^=GPmousePositionPanel-]{width:300px;overflow:hidden}div[id^=GPmousePositionBasicPanel]{padding:10px 15px;position:relative}.GPmousePositionCoords,.GPmousePositionLabel{display:inline-block;line-height:20px}.GPmousePositionLabel{width:80px;font-weight:700}.GPmousePositionCoords{width:110px}.GPshowMousePositionSettingsPicto{bottom:5px;right:0;transition:all .5s ease-out 0s}div[id^=GPmousePosition-] input[type=checkbox]:checked+.GPshowMousePositionSettingsPicto{bottom:100px}div[id^=GPmousePositionSettings-]{display:block;max-height:0;opacity:0;transition:max-height .5s ease-out 0s,opacity .5s ease-out 0s}div[id^=GPmousePosition-] input[type=checkbox]:checked+label+div[id^=GPmousePositionSettings-]{max-height:95px;opacity:1}div[id^=GPmousePositionSettings-]{height:95px;padding-left:0 15px;overflow:hidden}.GPmousePositionSettingsLabel{display:block;margin:auto;text-align:center;font-weight:700;line-height:16px}.GPmousePositionSettingsSelect{width:180px;margin-top:5px}div[id^=GPmousePositionCoordinate-] input.error{border:1px solid red}div[id^=GPmousePositionCoordinate-] input[readonly]{border:1px solid transparent;padding:2px;text-align:right}input[id^=GPmousePositionLat-],input[id^=GPmousePositionLon-]{width:120px}span[id^=GPmousePositionAlt-]{display:inline-block;padding:2px;width:120px;line-height:20px;text-align:right}.GPSexagesimal,.GPSexagesimalsec{margin:0;border:1px solid #ccc;border-radius:4px}input:read-only.GPSexagesimal,input:read-only.GPSexagesimalsec{text-align:right}.GPSexagesimal{width:30px}.GPSexagesimalsec{width:45px}.GPmousePositionSexagesimalLabel{font-size:1.2em;vertical-align:middle;padding:0}select.GPmousePositionDirection{border:1px solid #999;margin-left:2px}select.GPmousePositionDirection:disabled{border:none;background:0 0;color:#000;-webkit-appearance:none;-moz-appearance:none}select.GPmousePositionDirection:disabled::-ms-expand{display:none}select.GPmousePositionDirection:disabled::-ms-value{color:#000}.GPmousePositionAltitudeUnits,.GPmousePositionUnits{margin-left:5px}.GPmousePositionPanelEditTools{position:absolute;top:20px;right:5px}.GPmousePositionEditTool{width:18px;height:18px;display:inline-block;cursor:pointer}span[id^=GPmousePositionCloseEdit]{background-position:-18px 0;margin-left:5px}img[id^=GPmousePositionMarker]:hover{cursor:pointer;opacity:.7}#GPmapCenter{display:none;position:absolute;top:50%;left:50%;width:50px;height:50px;margin-top:-25px;margin-left:-25px}#GPmapCenter.GPmapCenterVisible{display:block}[id^=GPreverseGeocoding-]{top:180px}[id^=GPshowReverseGeocodingPicto-]{display:inline-block}[id^=GPshowReverseGeocoding-]+label{display:block}[id^=GPshowReverseGeocoding-]:checked+label{display:none}[id^=GPshowReverseGeocoding-]+label+div{display:none}[id^=GPshowReverseGeocoding-]:checked+label+div{display:block}div[id^=GPreverseGeocodingResultsClose]{top:0;right:0;width:30px;height:32px}[id^=GPreverseGeocodingPanel-]{width:280px}.GPreverseGeocodingComponentHidden{display:none}div[id^=GPreverseGeocodingReturnPicto-]{position:absolute;width:26px;height:26px;border-radius:3px;opacity:1;background-position:0 0;cursor:pointer}.GPreverseGeocodingReturnPictoHidden{display:none}.GPreverseGeocodingCalcWaitingContainerHidden,.GPreverseGeocodingCalcWaitingContainerVisible{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,.9);font-size:1.5em;font-weight:700;overflow:hidden}.GPreverseGeocodingCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GPreverseGeocodingCalcWaitingContainerHidden{display:none}.GPreverseGeocodingCalcWaiting{margin:auto}[id^=GPreverseGeocodingForm-]{position:relative;max-height:270px;overflow-y:auto;padding-left:15px;padding-right:15px;padding-top:10px}.GPreverseGeocodingCodeLabel,.GPreverseGeocodingFilterLabel{max-width:105px}.GPreverseGeocodingCode,.GPreverseGeocodingCodeLabel{margin-top:5px;margin-bottom:0}.GPreverseGeocodingFilterInput,.GPreverseGeocodingFilterLabel{margin-bottom:5px}input[id^=GPreverseGeocodingSubmit-]{margin-top:5px;margin-bottom:15px;width:100px}.GPreverseGeocodingCalcWaitingContainerHidden,.GPreverseGeocodingCalcWaitingContainerVisible{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,.9);font-size:1.5em;font-weight:700;overflow:hidden}.GPreverseGeocodingCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GPreverseGeocodingCalcWaitingContainerHidden{display:none}.GPreverseGeocodingCalcWaiting{margin:auto}div[id^=GPreverseGeocodingResultsList-]{position:relative;max-height:210px;overflow-y:auto}div[id^=GProute-]{top:100px}label[id^=GPshowRoutePicto]{display:inline-block}input[id^=GPshowRoute-]+label{display:block}input[id^=GPshowRoute-]:checked+label{display:none}input[id^=GPshowRoute-]+label+div{display:none}input[id^=GPshowRoute-]:checked+label+div{display:block}div[id^=GProutePanel-]{width:320px}.GProuteComponentHidden{display:none}.GProuteCalcWaitingContainerHidden,.GProuteCalcWaitingContainerVisible{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,.9);font-size:1.5em;font-weight:700;overflow:hidden}.GProuteCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GProuteCalcWaitingContainerHidden{display:none}.GProuteCalcWaiting{margin:auto}form[id^=GProuteForm]{padding:15px}.GProuteFormMini{max-height:58px;overflow:hidden;-webkit-transform:translateY(-5px);transform:translateY(-5px)}.GProuteStageFlexInput{max-height:28px;opacity:1}.GProuteStageFlexInputHidden{max-height:0;opacity:0;overflow:hidden}form[id^=GProuteForm]>.GPlocationStageFlexInput{margin-top:5px}form[id^=GProuteForm]>.GPlocationStageFlexInputHidden{margin-top:0}form[id^=GProuteForm].GProuteFormMini .GPlocationStageFlexInput:first-child{margin-top:5px}.GProuteOriginVisible{display:block}.GProuteOriginHidden{display:none}label.GProuteOriginPointerImg[id*=GProuteOriginPointerImg]{width:28px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-right:1px solid #999}input[id*=GProuteOriginPointer]+.GProuteOriginPointerImg{background-position:-1px -1px}input[id*=GProuteOriginPointer]:checked+.GProuteOriginPointerImg{background-position:-29px -1px}.GProuteStageRemove,div[id^=GProuteStageAdd]{width:28px;border:none;cursor:pointer}.GProuteFormMini .GProuteStageRemove,.GProuteFormMini div[id^=GProuteStageAdd]{display:none}.GProuteStageRemove{background-position:-84px 0}div[id^=GProuteStageAdd]{background-position:-56px 0}div[id^=GProuteModeChoice]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin:15px 0}.GProuteModeLabel{display:block;text-align:center;margin-bottom:5px}div[id^=GProuteTransportChoice] input{display:none}.GProuteTransportImg{display:inline-block;width:28px;height:28px;cursor:pointer}.GProuteTransportImg:first-of-type{margin-left:18px;margin-right:10px}input[id^=GProuteTransportCar]+.GProuteTransportImg{background-position:-112px 0}input[id^=GProuteTransportCar]:checked+.GProuteTransportImg{background-position:-140px 0}input[id^=GProuteTransportPedestrian]+.GProuteTransportImg{background-position:-168px 0}input[id^=GProuteTransportPedestrian]:checked+.GProuteTransportImg{background-position:-196px 0}select[id^=GProuteComputationSelect]{width:100px}input[id^=GPshowRouteExclusions]{display:none}.GPshowRouteExclusionsPicto{right:0;transition:all .3s ease-out 0s}input[id^=GPshowRouteExclusions]+label+div[id^=GProuteExclusions]{max-height:0;opacity:0;margin-bottom:0}input[id^=GPshowRouteExclusions]:checked+label+div[id^=GProuteExclusions]{display:block;max-height:60px;opacity:1;margin-bottom:15px}div[id^=GProuteExclusions]{transition:max-height .5s ease-in-out .25s,opacity .5s ease-in-out .25s,margin .3s ease-in-out .25s;overflow:hidden}.GProuteExclusionsLabel{display:block;text-align:center;margin-bottom:10px;font-weight:700;line-height:16px}.GProuteExclusionsOptions{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.GProuteExclusionsOption{display:block;height:28px;line-height:26px;color:#a77;background-color:#fee;padding-left:28px;padding-right:5px;border:1px solid #a77;border-radius:3px;cursor:pointer}input:checked+.GProuteExclusionsOption{background-color:#efe;background-position:0 -28px;color:#797;border:1px solid #797}div[id^=GProuteReset]{position:absolute;width:28px;height:28px;border-radius:3px;opacity:.8;background-position:-224px 0;transition:opacity .2s ease-out;cursor:pointer}div[id^=GProuteReset]:hover{opacity:1}div[id^=GProuteResultsPanel]{padding:15px}.GProuteResultStage{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}div[id^=GProuteResultsStages]{margin-bottom:15px}.GProuteResultStageLabel,.GProuteResultStageValue,.GProuteResultsValueLabel,div[id^=GProuteResultsValueDist],div[id^=GProuteResultsValueTime]{display:inline-block;line-height:18px}.GProuteResultStageLabel,.GProuteResultsValueLabel{color:#666}.GProuteResultStageLabel{width:60px}.GProuteResultsValueLabel{width:65px}.GProuteResultStageValue{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-x:hidden;white-space:nowrap;text-overflow:ellipsis}div[id^=GProuteResultsValueDist],div[id^=GProuteResultsValueTime]{width:80px;font-weight:700}div[id^=GProuteResults-]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-between;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:10px}select[id^=GProuteResultsComputationSelect]{width:100px}div[id^=GProuteResultsNew]{width:28px;height:28px;border-radius:3px;opacity:.8;background-position:-224px 0;transition:opacity .2s ease-out;cursor:pointer}div[id^=GProuteResultsNew]:hover{opacity:1}.GPfakeBorder{display:inline-block;height:14px;width:60px;border-bottom:1px solid #999}.GPfakeBorderLeft{margin-left:15px}input[id^=GProuteResultsShowDetails]+label,input[id^=GProuteResultsShowDetails]+label+label{width:130px;line-height:28px;vertical-align:top;text-align:center;font-weight:700;cursor:pointer;transition:color .2s ease-out}input[id^=GProuteResultsShowDetails]+label,input[id^=GProuteResultsShowDetails]:checked+label+label{display:inline-block}input[id^=GProuteResultsShowDetails]+label+label,input[id^=GProuteResultsShowDetails]:checked+label{display:none}input[id^=GProuteResultsShowDetails]+label+label+div+div[id^=GProuteResultsDetails]{max-height:0;opacity:0}input[id^=GProuteResultsShowDetails]:checked+label+label+div+div[id^=GProuteResultsDetails]{max-height:200px;opacity:1}div[id^=GProuteResultsDetails]{overflow-y:auto;transition:max-height .5s ease-in-out .25s,opacity .5s ease-in-out .25s}.GProuteResultsDetailsInstruction,.GProuteResultsDetailsNumber{display:inline-block;margin-top:4px;line-height:16px;color:#666}.GProuteResultsDetailsNumber{font-weight:700;width:22px;text-align:right;vertical-align:top}.GProuteResultsDetailsInstruction{width:calc(100% - 30px);padding-left:5px}input[id^=GPshowSearchEngine-]+label+form[id^=GPsearchInput-]{max-width:0}input[id^=GPshowSearchEngine-]{display:none}label[id^=GPshowSearchEnginePicto]{display:inline-block;transition:border-radius 0s ease-out 0s;transition-delay:.5s}input[id^=GPshowSearchEngine-]:checked+label{border-top-right-radius:0;border-bottom-right-radius:0;transition-delay:0s}input[id^=GPshowSearchEngine-]+label+form[id^=GPsearchInput-]{max-width:0;border:none;transition:max-width .5s ease-out 0s}input[id^=GPshowSearchEngine-]:checked+label+form[id^=GPsearchInput-]{max-width:280px}input[id^=GPshowSearchEngine-]+label+form[id^=GPsearchInput-]+div[id^=GPshowAdvancedSearch]{display:none}input[id^=GPshowSearchEngine-]:checked+label+form[id^=GPsearchInput-]+div[id^=GPshowAdvancedSearch]{display:inline-block}div[id^=GPautoCompleteList]{display:none}input[id^=GPshowSearchEngine-]:checked+label+form[id^=GPsearchInput-]+div[id^=GPautoCompleteList]{display:block}form[id^=GPsearchInput-]{display:inline-block;position:relative;left:-3px;width:280px;overflow:hidden}form[id^=GPsearchInput-] input{display:block;width:100%;height:100%;border:1px solid #999;border-top-right-radius:5px;border-bottom-right-radius:5px;padding:0;padding-right:30px;padding-left:5px;color:#333;font-size:1em}form[id^=GPsearchInput-] input:disabled{background-color:#ddd;color:#999}div[id^=GPsearchInputReset]{position:absolute;top:0;right:0;width:30px;height:32px;background-position:-30px 0;cursor:pointer}div[id^=GPadvancedSearchClose],div[id^=GPgeocodeResultsClose]{top:0;right:0;width:30px;height:32px}div[id^=GPgeocodeResultsClose]{background-position:0 0}div[id^=GPadvancedSearchClose]{background-repeat:no-repeat}div[id^=GPshowAdvancedSearch]{transition:border-radius 0s ease-out 0s;transition-delay:.5s}div[id^=GPadvancedSearchPanel]{display:none;width:280px;vertical-align:top;overflow:hidden}form[id^=GPadvancedSearchForm]{max-height:220px;overflow-y:auto;padding-left:15px;padding-right:15px}.GPadvancedSearchCodeLabel,.GPadvancedSearchFilterLabel{max-width:105px}.GPadvancedSearchCode,.GPadvancedSearchCodeLabel,div[id^=GPadvancedSearchFilters]{margin-top:15px}.GPadvancedSearchFilterInput,.GPadvancedSearchFilterLabel{margin-bottom:5px}input[id^=GPadvancedSearchSubmit]{margin-top:10px;margin-bottom:15px}div[id^=GPautoCompleteList],div[id^=GPgeocodeResultsList]{width:280px}div[id^=GPautoCompleteList]{top:35px}div[id^=GPgeocodeResultsList]{display:none;position:absolute;top:40px;border-radius:4px;overflow:hidden}div[id^=GPgeocodeResults-]{background-color:#fff;max-height:140px;overflow-y:auto}#GPmapLoading{display:none;position:absolute;z-index:50;top:50%;left:50%;width:50px;height:50px;margin-top:-25px;margin-left:-25px}#GPmapLoading.GPmapLoadingVisible{display:block}#GPmapLoading{background-image:url(data:image/gif;base64,R0lGODlhNAA0AIQSAAFkpSZ5sAGV3k2Ruiao3kOj1/GUBk225pe/B4S83XrK75HH3qrS5szMzNbW1sHe797e3ubm5v///////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAQAfACwAAAAANAA0AAAF5uAnjmRpnmiqrmzrvnAsz3T9FXhh72Ke8zWfDzgT/ogxIw55cjgiJ6XOhKjaII1sNio8Vb8ImnbMXVLBVhl2vI2hvzIHOwt9veGxyLwhu4dlcw59bzVjgjNoPHU2f0yOj5CRkpMocg2HjwaaBitzmZuaKWuGTKCgKHt8SKabqHulrJwno1qYQLGyJ56OrCuWtrChlMPExcbHH4s1ymK1NJZtM4Fxu3mvMXvMLdBj2ip60zG0WoBzENLVJL+66TDj7GQmbOc1EE9N4SURDvSRqcgj/gH8wC0LsGPtAK7pN7Chw4cQSYQAACH5BAUBAB8ALBYABAAaACcAAAVw4PdBTQOJaKquX+k2bJw6b+nIcu3isV7yLFrttioYczWWcVmICYkq5hKolB6pKOsUm9Vyu9JvKiyOls/otHqNQ7gR6ff7LJeX63Mx3n3f0+txeWyDhIVlBmsGiopoi45njo9fkZKTlIhil42RaYsxIQAh+QQFAQAfACwWAAkAGgAnAAAFdOAnjmQZOVCprmTjuikrf289y/Ub32SUuw6e6teICEuO31GVfC1Zxqd0Sq1arYVsAavNUrvdKVgrHm+l5jMazPVe3/C4/IN4I+73Kn5P3fOffn+AgXUqBocGK4QriIiKfoaNjip4LJKTT5eHU5qJnJJWjVUhACH5BAUBAB8ALAkAFgAnABoAAAV04CeOZGmepdM0Duq+5yo3cO2qcwPZPJnLveBvFezhZrsi76cM4lrNqHRKrVpPhmoBZuh2o4VwGOUtK8VoU9lcRKdJazbP/R7Fv236tnQ/If4IJ3pYa36Af4JuLl6Gh4gmYlKOgFclk4+VIpeBmSOTnZaUTSEAIfkEBQEAHwAsBAAWACcAGgAABXfg9xmkIZ5oqq5rWbJwnLqubLP0e+9nTvJAnwnIyxGJtaNyyWw6n1Ao4hmRIa7XpaPBbbCw4OO2y1WBw0Ryt4o6o3cRNdeRcmfTcojZvSr4CytyXntvKH9/gWR6X3cph4crEQ6LSo+IUYaWgJgnmpucIpagjpc3IQAh+QQFAQAfACwEAAkAGgAnAAAFb+AnjqJhkmiamqyhvmjLwrA806p946Tu8isbMNca1ozIpHLJTCKeiCYUupxOlVaqMxvdZqtWqbZJLpvPyEK5wGYz23AlPJ6c0412t9yucjQaDi98KX+FDTBtfYZ/gUmLhUqPf0p+i42Oi00QfxAiIQAh+QQFAQAfACwEAAQAGgAnAAAFc+AnjmRZGqhhrmyasrDounE7o/V64yvi6zuTb4gA0oTEn+lYSg5zSGcROpJOqVUntknc9rzgsHhMLhXOhTEaHV6vwW62N36G09tutbzM7/v/JhFlDYQNDmKFhYdeEYmFYA6OhIJbEJINYZdhlolkEA6UUCEAIfkEAQEAHwAsBAAEACcAGgAABXXgJ45kWSIoYq5sS6apK8swPN9mHeP8p6O9UmG4+qlMhmRryCwUa6uk1LBqMp9A5FQptBKDW2nX6+SFxSRyuXemjpvBz5lljYu2srX9vu/7/4CBgh8NhQ6DK4WKDYgkEIuGjSKQipKElIySj5CHlpSWIw6RoCEAOw==)}.GPwidget{position:relative}#GPadvancedToolsPanel{position:initial}.GPpanel{box-shadow:0 1px 6px #000;border-radius:5px}.GPpanelHeader{height:32px;background-color:#fff;border-top-left-radius:5px;border-top-right-radius:5px}.GPpanelTitle{width:calc(100% - 60px);margin:auto;line-height:32px;color:#c77a04;border-bottom:1px solid #c77a04}.GPpanelClose{top:0;right:0;width:30px;height:32px;background-position:-30px 1px}.GPpanelReduce{top:0;right:30px;width:30px;height:32px;background-position:-60px 1px}.GPpanelInfo{top:0;left:0;width:30px;height:32px;background-position:-90px 1px}.GPshowAdvancedToolPicto{width:30px;height:30px;box-shadow:0 1px 6px #000;background-color:#fff;border-radius:5px}.GPshowAdvancedToolPicto:hover{background-color:#f4f4f4}.GPshowAdvancedToolOpen{width:100%;height:100%}input.GPinputSubmit{background-color:#c77a04}.GPshowMoreOptionsImage{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAA7klEQVRIx+3UsUtCURTH8e/x3eciSAhC/QnRGIQPHPoTHPJfyLEpyFqcXkGT/0HQ4uBQs4s4VAiO0b/QJKIIcn333QYVnErIt53PeO7hnnv4wQWllMqa7NL0fmu+wPeLeXd10sJun322yE9t0AY5j+Lk+K+7cjs+rAPSmFnTGzQpb4qDJuWZNT2QxqpnTxsCvN0FdfHyBIwllVoaihXnXkGOxPvLyr173utAgI+b8NTn/AtwsC5NJJVa5WE5yizD+ZySC00XIFgmF4UC40wzXBhcFCfVKE6qC4PTDP81EGB4zeF2hmePfOt3ppT61Q8G2258CD5NRAAAAABJRU5ErkJggg==)}div[id^=GPelevationPath-]{top:0}label[id^=GPshowElevationPathPicto]{display:inline-block}input[id^=GPshowElevationPath-]+label{display:block}input[id^=GPshowElevationPath-]+label+div{display:none}input[id^=GPshowElevationPath-]:checked+label+div{display:block}span[id^=GPshowElevationPathOpen]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAeCAYAAADnydqVAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOwwAADsMBx2+oZAAAA4VJREFUaN7tmEFv3EQUx3/PHkdIFT3RIk4gAZVAHIrEwUslJM7tsfABQlBLk+ZuL0K+ZPfOpgpRmg+AhLhQPgBFja1euCAObXqlatUL4oDqXe/jkHXj7jqNvesmWZj/xdbYY83Mz/837w1YWVlZWVlZWVk1LjnshTg0Ot7W6gzELt0cqwxq3n7QM6s5cXARYNGpefuL3FvlHaujlXNQ+K0L96VEksD7cid0NzWaHGcuBYkDt7fT9lYszkmZquG6DG4cGs3bi84vts8CF9HvBHGS1HU0yq5IxHACbuj2BFkWVd1pe3y81l+fdyh3Is46qVkVuKjw7ijW3gN+HnqD3oWIx1M7+EWgi3vw+LX5zWN4fn98spSk7roWthQFSUL3hiDLeQ/R4XvzDnen7X7mpGYXaCucB04Bp1A+RPnaSc1uEriXZ8qiqziwCthZXKwgSeB+i0gh9OpNfyG7QoTmzt2fiW75XnZ13OXzBldUvq9Q3aiofu53sx8ac3BduA1kf+p3s1VUCyFXlu6m7mYSuuv/Nbh3Is6KyvY4XH+tj7/Wn1geFdm+HXCmccBHWSaVQc6QJZBrxwU3Do3EoSkmoDL23IlD80rtbDc1q8CrNbqcNmKuz5xknYA6TrWbrd4NXDKRledjl95sCm4cmgj4FHiz4vsAT4GncWj+Ae4Dv7Y6g804NP0pJnqJEuskbe/gLsIl4JvGAB/nIUcmiExu1NKEI1udQT6vT6b4RDq6vg/sju7r/3DK22XNeXguBa2805iDjwtusRQq+YW/SFJXy0qoqirABfgFeKvmJxZG1z8LIVv2hl53qtMsTwOATxRc0S0ZkqrkbbKUpC7TQs4d3OoMosJ+emgW2+oMNA7NG8DrwGvAE+DR6IepvV4CD0ZlUZ1ODxo76DgpcH0vu0qEJoGr+yXU9JCLDi7ca8W+D4GHjcxXuIXWAyzw00xZ9HHuuROlELrhr+0BfJZdoxvFEipJ3d68lklDb9AD/q7R5S+z16f5Ovho5Pz2LFkR3fIXshUpOEtA/U62XCihVHH+mFfAFyIei+riePRI2l5ZgqWoLn4U8eSlnWQdSc0ZeF8hww/8zvNwJ068QncddX5vdfsbzLmSwL2sItvA6YOci+piq5v9WDGMn1zA/1fdDjhjxFwXuAicGzXfE+GW8Qa9Ks49FHATA7U/iZWVlZWVlZWVlZXV/OlfogGsuXT788cAAAAASUVORK5CYII=)}[id^=GPelevationPathPanelClose]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAeCAYAAADnydqVAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOwwAADsMBx2+oZAAAA4VJREFUaN7tmEFv3EQUx3/PHkdIFT3RIk4gAZVAHIrEwUslJM7tsfABQlBLk+ZuL0K+ZPfOpgpRmg+AhLhQPgBFja1euCAObXqlatUL4oDqXe/jkHXj7jqNvesmWZj/xdbYY83Mz/837w1YWVlZWVlZWVk1LjnshTg0Ot7W6gzELt0cqwxq3n7QM6s5cXARYNGpefuL3FvlHaujlXNQ+K0L96VEksD7cid0NzWaHGcuBYkDt7fT9lYszkmZquG6DG4cGs3bi84vts8CF9HvBHGS1HU0yq5IxHACbuj2BFkWVd1pe3y81l+fdyh3Is46qVkVuKjw7ijW3gN+HnqD3oWIx1M7+EWgi3vw+LX5zWN4fn98spSk7roWthQFSUL3hiDLeQ/R4XvzDnen7X7mpGYXaCucB04Bp1A+RPnaSc1uEriXZ8qiqziwCthZXKwgSeB+i0gh9OpNfyG7QoTmzt2fiW75XnZ13OXzBldUvq9Q3aiofu53sx8ac3BduA1kf+p3s1VUCyFXlu6m7mYSuuv/Nbh3Is6KyvY4XH+tj7/Wn1geFdm+HXCmccBHWSaVQc6QJZBrxwU3Do3EoSkmoDL23IlD80rtbDc1q8CrNbqcNmKuz5xknYA6TrWbrd4NXDKRledjl95sCm4cmgj4FHiz4vsAT4GncWj+Ae4Dv7Y6g804NP0pJnqJEuskbe/gLsIl4JvGAB/nIUcmiExu1NKEI1udQT6vT6b4RDq6vg/sju7r/3DK22XNeXguBa2805iDjwtusRQq+YW/SFJXy0qoqirABfgFeKvmJxZG1z8LIVv2hl53qtMsTwOATxRc0S0ZkqrkbbKUpC7TQs4d3OoMosJ+emgW2+oMNA7NG8DrwGvAE+DR6IepvV4CD0ZlUZ1ODxo76DgpcH0vu0qEJoGr+yXU9JCLDi7ca8W+D4GHjcxXuIXWAyzw00xZ9HHuuROlELrhr+0BfJZdoxvFEipJ3d68lklDb9AD/q7R5S+z16f5Ovho5Pz2LFkR3fIXshUpOEtA/U62XCihVHH+mFfAFyIei+riePRI2l5ZgqWoLn4U8eSlnWQdSc0ZeF8hww/8zvNwJ068QncddX5vdfsbzLmSwL2sItvA6YOci+piq5v9WDGMn1zA/1fdDjhjxFwXuAicGzXfE+GW8Qa9Ks49FHATA7U/iZWVlZWVlZWVlZXV/OlfogGsuXT788cAAAAASUVORK5CYII=)}div[id^=GPelevationPathPanelReduce]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAeCAYAAADnydqVAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOwwAADsMBx2+oZAAAA4VJREFUaN7tmEFv3EQUx3/PHkdIFT3RIk4gAZVAHIrEwUslJM7tsfABQlBLk+ZuL0K+ZPfOpgpRmg+AhLhQPgBFja1euCAObXqlatUL4oDqXe/jkHXj7jqNvesmWZj/xdbYY83Mz/837w1YWVlZWVlZWVk1LjnshTg0Ot7W6gzELt0cqwxq3n7QM6s5cXARYNGpefuL3FvlHaujlXNQ+K0L96VEksD7cid0NzWaHGcuBYkDt7fT9lYszkmZquG6DG4cGs3bi84vts8CF9HvBHGS1HU0yq5IxHACbuj2BFkWVd1pe3y81l+fdyh3Is46qVkVuKjw7ijW3gN+HnqD3oWIx1M7+EWgi3vw+LX5zWN4fn98spSk7roWthQFSUL3hiDLeQ/R4XvzDnen7X7mpGYXaCucB04Bp1A+RPnaSc1uEriXZ8qiqziwCthZXKwgSeB+i0gh9OpNfyG7QoTmzt2fiW75XnZ13OXzBldUvq9Q3aiofu53sx8ac3BduA1kf+p3s1VUCyFXlu6m7mYSuuv/Nbh3Is6KyvY4XH+tj7/Wn1geFdm+HXCmccBHWSaVQc6QJZBrxwU3Do3EoSkmoDL23IlD80rtbDc1q8CrNbqcNmKuz5xknYA6TrWbrd4NXDKRledjl95sCm4cmgj4FHiz4vsAT4GncWj+Ae4Dv7Y6g804NP0pJnqJEuskbe/gLsIl4JvGAB/nIUcmiExu1NKEI1udQT6vT6b4RDq6vg/sju7r/3DK22XNeXguBa2805iDjwtusRQq+YW/SFJXy0qoqirABfgFeKvmJxZG1z8LIVv2hl53qtMsTwOATxRc0S0ZkqrkbbKUpC7TQs4d3OoMosJ+emgW2+oMNA7NG8DrwGvAE+DR6IepvV4CD0ZlUZ1ODxo76DgpcH0vu0qEJoGr+yXU9JCLDi7ca8W+D4GHjcxXuIXWAyzw00xZ9HHuuROlELrhr+0BfJZdoxvFEipJ3d68lklDb9AD/q7R5S+z16f5Ovho5Pz2LFkR3fIXshUpOEtA/U62XCihVHH+mFfAFyIei+riePRI2l5ZgqWoLn4U8eSlnWQdSc0ZeF8hww/8zvNwJ068QncddX5vdfsbzLmSwL2sItvA6YOci+piq5v9WDGMn1zA/1fdDjhjxFwXuAicGzXfE+GW8Qa9Ks49FHATA7U/iZWVlZWVlZWVlZXV/OlfogGsuXT788cAAAAASUVORK5CYII=)}div[id^=GPelevationPathPanelInfo]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAeCAYAAADnydqVAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOwwAADsMBx2+oZAAAA4VJREFUaN7tmEFv3EQUx3/PHkdIFT3RIk4gAZVAHIrEwUslJM7tsfABQlBLk+ZuL0K+ZPfOpgpRmg+AhLhQPgBFja1euCAObXqlatUL4oDqXe/jkHXj7jqNvesmWZj/xdbYY83Mz/837w1YWVlZWVlZWVk1LjnshTg0Ot7W6gzELt0cqwxq3n7QM6s5cXARYNGpefuL3FvlHaujlXNQ+K0L96VEksD7cid0NzWaHGcuBYkDt7fT9lYszkmZquG6DG4cGs3bi84vts8CF9HvBHGS1HU0yq5IxHACbuj2BFkWVd1pe3y81l+fdyh3Is46qVkVuKjw7ijW3gN+HnqD3oWIx1M7+EWgi3vw+LX5zWN4fn98spSk7roWthQFSUL3hiDLeQ/R4XvzDnen7X7mpGYXaCucB04Bp1A+RPnaSc1uEriXZ8qiqziwCthZXKwgSeB+i0gh9OpNfyG7QoTmzt2fiW75XnZ13OXzBldUvq9Q3aiofu53sx8ac3BduA1kf+p3s1VUCyFXlu6m7mYSuuv/Nbh3Is6KyvY4XH+tj7/Wn1geFdm+HXCmccBHWSaVQc6QJZBrxwU3Do3EoSkmoDL23IlD80rtbDc1q8CrNbqcNmKuz5xknYA6TrWbrd4NXDKRledjl95sCm4cmgj4FHiz4vsAT4GncWj+Ae4Dv7Y6g804NP0pJnqJEuskbe/gLsIl4JvGAB/nIUcmiExu1NKEI1udQT6vT6b4RDq6vg/sju7r/3DK22XNeXguBa2805iDjwtusRQq+YW/SFJXy0qoqirABfgFeKvmJxZG1z8LIVv2hl53qtMsTwOATxRc0S0ZkqrkbbKUpC7TQs4d3OoMosJ+emgW2+oMNA7NG8DrwGvAE+DR6IepvV4CD0ZlUZ1ODxo76DgpcH0vu0qEJoGr+yXU9JCLDi7ca8W+D4GHjcxXuIXWAyzw00xZ9HHuuROlELrhr+0BfJZdoxvFEipJ3d68lklDb9AD/q7R5S+z16f5Ovho5Pz2LFkR3fIXshUpOEtA/U62XCihVHH+mFfAFyIei+riePRI2l5ZgqWoLn4U8eSlnWQdSc0ZeF8hww/8zvNwJ068QncddX5vdfsbzLmSwL2sItvA6YOci+piq5v9WDGMn1zA/1fdDjhjxFwXuAicGzXfE+GW8Qa9Ks49FHATA7U/iZWVlZWVlZWVlZXV/OlfogGsuXT788cAAAAASUVORK5CYII=)}[id^=GPelevationPathPanel-]{width:280px}[id^=GPelevationPathProfil]{height:150px;width:inherit;line-height:normal}div[id^=GPisochron-]{top:0}span[id^=GPshowIsochronOpen]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAeCAYAAACsYQl4AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4AUXCjIhczCQjQAABBBJREFUaN7tmE9oI2UYxn/vTCeQHjxou2ULroIHsazYg4ekiiDSk+AtSiyZNqbLtrYUFC8NKwTcbW+LuNm20ubQySGwvfWwe1gvImuDFxXqgqhgPWzp0t1jo0knr4dOutO0tmkTpcV5IJCZL+/Mlx/P93x/IFCgQIECBQoU6L+QnKTItu17QJ93ec9xnNcDlIfLOGFdn+/7awHGFjt6aGjo5Wq1mgIuAe3e7S1gXlUX8vn8ais7tzJpXVKpvhoNuaOSoXrQbxSkOGl+oYbxc9+1SvZMg47FYqFwOPw5cNkbBS7w0Gs+B5iAKyJzW1tbHy8tLZVbARnRuZ336UIk5F6uh60gK2nzhiBjgKrIxGmFbTQI+Q4wCqwDI5ZlnXMcp9txnG7Lss6p6iiwoapj4XD4diwWCzVvgWrvk/7JcLFsZtVnDAUpps2bHmQAEa2+dGYdbdv2jAd5pVKpvFMoFDYP+l08Hu+wLGsZiIrIzcXFxfFmOlaLBER8z9lxNhnU52Tvn+h8xHJH/iliTjVoL5N/ANYrlUpvPeREIpESkQnHcV7xwf4R6FLV3mYz+yDYBrpQhTLIh2cFMkDbYY3exGcAnx3kZBEZ2OGxo0KhsDk4OHhVVWcMw0gBHzXpAtVpd6I4aVKD7SLDe9zRJOSVdNtJzam+a62L41B0avvPhkGLSL+qupZlLdW3DQwMPOUt7a7vcaHqLSCrqv0tGnKq0+7Ed5Mmrsj43iGoCy10cgZ4E3juGDV/eZ8S8AvwDfAlUDmWo1X1ArCRy+Ue27b9PvCsr/kFICQid/w1juM8sm37IXChlUPPFUT2Z4u0KD5rjnzjBPW1FVYP8GstDI4Fum6oXAHqZ/Xf1tbWvj1gJIiqaisA1y3h6l+UKpZN1cz+pd/xXrGrr4Hnj1lfW2E98PGqj5Mjo+MPVX0xlUo9ncvlehrcnj+jqp3A/X8Fsui8VCmr1O7JcLFs0gTsGpSMz1RHjRSNTm3rSrrtPNAFdACbwEZ0alvrITcSHXeBnnK5/C4w12DH3wMMr7blkCOWO0IGLU6a+mQ1cnLYHph6d2uDteve3qK5DYuqLng7vk/j8XjHUQ9LJpOdXsS4hmHkmgFdTJvZvXGhs5FrOyAFNDLtToDO+ow5XCybN87koVI+n18VkTmg27Ks5cNgJ5PJTtd1l4HzwMzi4uJPTXbt+91JRXQ+EnLHxec0AY1MuWOoZnd9gXH/tII+ctb2tuC3gbeAByJyVVVvOY7zqJbJXlxc8SB/VSqV3m7ReccoUr0YmdoLed+mJm1mUWM1Ol2ZPfOHSu3t7ddVdcQ7QKoCG15zl++gaaZUKn3SCsj/62PSRCJxEfhARPp9y6DfVfWuYRi55uMiUKBAgQIFChQoUHP6G9rPw3e7WtEyAAAAAElFTkSuQmCC)}div[id^=GPisochronPanel-]{left:10px}div[id^=GPisochronPanelClose]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAeCAYAAACsYQl4AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4AUXCjIhczCQjQAABBBJREFUaN7tmE9oI2UYxn/vTCeQHjxou2ULroIHsazYg4ekiiDSk+AtSiyZNqbLtrYUFC8NKwTcbW+LuNm20ubQySGwvfWwe1gvImuDFxXqgqhgPWzp0t1jo0knr4dOutO0tmkTpcV5IJCZL+/Mlx/P93x/IFCgQIECBQoU6L+QnKTItu17QJ93ec9xnNcDlIfLOGFdn+/7awHGFjt6aGjo5Wq1mgIuAe3e7S1gXlUX8vn8ais7tzJpXVKpvhoNuaOSoXrQbxSkOGl+oYbxc9+1SvZMg47FYqFwOPw5cNkbBS7w0Gs+B5iAKyJzW1tbHy8tLZVbARnRuZ336UIk5F6uh60gK2nzhiBjgKrIxGmFbTQI+Q4wCqwDI5ZlnXMcp9txnG7Lss6p6iiwoapj4XD4diwWCzVvgWrvk/7JcLFsZtVnDAUpps2bHmQAEa2+dGYdbdv2jAd5pVKpvFMoFDYP+l08Hu+wLGsZiIrIzcXFxfFmOlaLBER8z9lxNhnU52Tvn+h8xHJH/iliTjVoL5N/ANYrlUpvPeREIpESkQnHcV7xwf4R6FLV3mYz+yDYBrpQhTLIh2cFMkDbYY3exGcAnx3kZBEZ2OGxo0KhsDk4OHhVVWcMw0gBHzXpAtVpd6I4aVKD7SLDe9zRJOSVdNtJzam+a62L41B0avvPhkGLSL+qupZlLdW3DQwMPOUt7a7vcaHqLSCrqv0tGnKq0+7Ed5Mmrsj43iGoCy10cgZ4E3juGDV/eZ8S8AvwDfAlUDmWo1X1ArCRy+Ue27b9PvCsr/kFICQid/w1juM8sm37IXChlUPPFUT2Z4u0KD5rjnzjBPW1FVYP8GstDI4Fum6oXAHqZ/Xf1tbWvj1gJIiqaisA1y3h6l+UKpZN1cz+pd/xXrGrr4Hnj1lfW2E98PGqj5Mjo+MPVX0xlUo9ncvlehrcnj+jqp3A/X8Fsui8VCmr1O7JcLFs0gTsGpSMz1RHjRSNTm3rSrrtPNAFdACbwEZ0alvrITcSHXeBnnK5/C4w12DH3wMMr7blkCOWO0IGLU6a+mQ1cnLYHph6d2uDteve3qK5DYuqLng7vk/j8XjHUQ9LJpOdXsS4hmHkmgFdTJvZvXGhs5FrOyAFNDLtToDO+ow5XCybN87koVI+n18VkTmg27Ks5cNgJ5PJTtd1l4HzwMzi4uJPTXbt+91JRXQ+EnLHxec0AY1MuWOoZnd9gXH/tII+ctb2tuC3gbeAByJyVVVvOY7zqJbJXlxc8SB/VSqV3m7ReccoUr0YmdoLed+mJm1mUWM1Ol2ZPfOHSu3t7ddVdcQ7QKoCG15zl++gaaZUKn3SCsj/62PSRCJxEfhARPp9y6DfVfWuYRi55uMiUKBAgQIFChQoUHP6G9rPw3e7WtEyAAAAAElFTkSuQmCC)}div[id^=GPisochronPanelReduce]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAeCAYAAACsYQl4AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4AUXCjIhczCQjQAABBBJREFUaN7tmE9oI2UYxn/vTCeQHjxou2ULroIHsazYg4ekiiDSk+AtSiyZNqbLtrYUFC8NKwTcbW+LuNm20ubQySGwvfWwe1gvImuDFxXqgqhgPWzp0t1jo0knr4dOutO0tmkTpcV5IJCZL+/Mlx/P93x/IFCgQIECBQoU6L+QnKTItu17QJ93ec9xnNcDlIfLOGFdn+/7awHGFjt6aGjo5Wq1mgIuAe3e7S1gXlUX8vn8ais7tzJpXVKpvhoNuaOSoXrQbxSkOGl+oYbxc9+1SvZMg47FYqFwOPw5cNkbBS7w0Gs+B5iAKyJzW1tbHy8tLZVbARnRuZ336UIk5F6uh60gK2nzhiBjgKrIxGmFbTQI+Q4wCqwDI5ZlnXMcp9txnG7Lss6p6iiwoapj4XD4diwWCzVvgWrvk/7JcLFsZtVnDAUpps2bHmQAEa2+dGYdbdv2jAd5pVKpvFMoFDYP+l08Hu+wLGsZiIrIzcXFxfFmOlaLBER8z9lxNhnU52Tvn+h8xHJH/iliTjVoL5N/ANYrlUpvPeREIpESkQnHcV7xwf4R6FLV3mYz+yDYBrpQhTLIh2cFMkDbYY3exGcAnx3kZBEZ2OGxo0KhsDk4OHhVVWcMw0gBHzXpAtVpd6I4aVKD7SLDe9zRJOSVdNtJzam+a62L41B0avvPhkGLSL+qupZlLdW3DQwMPOUt7a7vcaHqLSCrqv0tGnKq0+7Ed5Mmrsj43iGoCy10cgZ4E3juGDV/eZ8S8AvwDfAlUDmWo1X1ArCRy+Ue27b9PvCsr/kFICQid/w1juM8sm37IXChlUPPFUT2Z4u0KD5rjnzjBPW1FVYP8GstDI4Fum6oXAHqZ/Xf1tbWvj1gJIiqaisA1y3h6l+UKpZN1cz+pd/xXrGrr4Hnj1lfW2E98PGqj5Mjo+MPVX0xlUo9ncvlehrcnj+jqp3A/X8Fsui8VCmr1O7JcLFs0gTsGpSMz1RHjRSNTm3rSrrtPNAFdACbwEZ0alvrITcSHXeBnnK5/C4w12DH3wMMr7blkCOWO0IGLU6a+mQ1cnLYHph6d2uDteve3qK5DYuqLng7vk/j8XjHUQ9LJpOdXsS4hmHkmgFdTJvZvXGhs5FrOyAFNDLtToDO+ow5XCybN87koVI+n18VkTmg27Ks5cNgJ5PJTtd1l4HzwMzi4uJPTXbt+91JRXQ+EnLHxec0AY1MuWOoZnd9gXH/tII+ctb2tuC3gbeAByJyVVVvOY7zqJbJXlxc8SB/VSqV3m7ReccoUr0YmdoLed+mJm1mUWM1Ol2ZPfOHSu3t7ddVdcQ7QKoCG15zl++gaaZUKn3SCsj/62PSRCJxEfhARPp9y6DfVfWuYRi55uMiUKBAgQIFChQoUHP6G9rPw3e7WtEyAAAAAElFTkSuQmCC)}.GPisochronCalcWaitingContainerHidden,.GPisochronCalcWaitingContainerVisible{border-radius:5px}.GPisochronChoiceAlt input:checked+label+span{color:#c77a04}.GPisochronChoiceAltImg,.GPisochronOriginPointerImg,.GPisochronTransportImg{background-image:url(data:image/png;base64,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)}.GPisoExclusionsOption{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAA4CAYAAADuMJi0AAAE60lEQVRYw+2YWWxUZRTHz/fd7y4zzAzTbaAdpgtQWsBiYVxYGpcEMCwRQkx48KHGhKg0WhESNYglwSUgWCKGTaMRBF4MwShpECUshlJqay2U0LCUwrRAp+0Ms997v8UnEl8Gp9Ppg2Z+bzfnn+/knHvud865AFmy/GfZVVZW/vvb9eduNn7Wc+ixGQ3/pm+UcO735VP3/rpsyc39TudHyXQ4maF61cqfZi97ocbjmVi6YGHNxoOeor3JtDskae606uqzFfPmvRqLxFg4EetIpiXJDJqqOHBwEEjIDyXjiVw4t/S1XD34TKs/MX+z4EEAgK0SwhPtjh+qq6tXBjGOtTY11a31D371qEygRxn3F3vWPVE1deN0G82T+m5BbCAIF+8lBttifLoFQeV0Wf7R7XbndsXird19/TUfAhgZeZ8H7eoXHYVWwzdBFTedsmhScfg0wfQPTRF7FfLdmBRRo4Q9RzTS8aeKRaeERAsC8TmRto30HJKqMCrhIcMUMuMcmADQJAQ5GJ4fqUMpFdE2mXgqOe+ewXhJFCHoJNJxu4omz7bhScVMyj/BeFPGUrlZIROOYRT4C0C0S0h8qUhHAAC2yGTFpUka7Skfx9/DZFZGnH2gEHxYwnc6EIguBYnDqtTzT3uDTFb3VdrEcZfWk5GUrgZxaI4QCyyaBAME04sUzTvL+dBD+xnOu8qiwrIgV1leEuf9JxhvTzu6Bgm5ThXkmNcciriaS8R2lXySTHvUqXb/lqsNp3Ju0qstx2Z7sfTZGuKsLAFkV4RK0J5k2s4wXYqYsO6WyYq0HUYN06c9XgX5SxcBuIt4gvJ40sJi7MaVONtVhGHmqIrmyLPzm29tqqf7ilwHUtHvVAjO9tksWbJkyQzehd7xo5ppUqW2tlbzLp380rhxitdB8q/4fD6acnsaKfX19c7Ji+QNJU/at7mmWaaZpklHNSY+irq6urzSxbBBy1PqEoJZfFdYoK2tjY2Jw4aGBpurJvKOmme8xWTTmgjq1DApAwAxoo6fIkieEnoF2+NvUDVqCekRiNIY4ip1eb1ekvEI39/65nOyO7hWtyWc0biOogkDooYOBhhujLEDAIZG4xADAH/4sH796y42ZWBNxBGrCEZMlNBNER1k8fBtdixwwzzY2toaTCtCr9drLXzKthgSiv7ztycfjvQo4O5fpWqR5eGojg2DCX1IBHUf3n2nSey5cOpCXzrfIXp6WZXXMtdYh8pi74JTL3WTijO913tDq2qXVxplA5vijgdTIvE4RO6zYOwO3t5/GhpbTrYMjnh78nq9VlwRfRmVRdewArM6rgJBTLbxErYEAL4J5vetwFJ4jghQxMNSSAyoO42Ttl0Xz58PpzXqS5JE7G5tqrAbM6lMiyljkimoQg1m8VhK7xrFwTpdixcbAaGz2/I+ekba0dzc/iDt3SIUCtH+Lv+lArWwjWPOOeMVJjI1imgRsyXKDas+mxoc83vKUfOC/dO2lst3M7LM3L816LdLBedlTIKU05lUNfJM2ZzEBZORXzuHrtk+vnSu63JGF9LhvmH9/uVAu8s9MUQFnWUSIweHFJ90z7qlq+n6L2OyAQMA918NdLrcrqgwoQrHyAHWqX49PDzMxsohAIAUuZ0YsHJHSO+G5t7eXj+k8ZsEjfCmsQGABgAmAMQBIJEdN7L8//gb3FshBGMt81oAAAAASUVORK5CYII=)}div[id^=GPisochronReset]{background-color:#c77a04;background-image:url(data:image/png;base64,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)}div[id^=GPlayerSwitcher-]{top:10px;right:10px}label[id^=GPshowLayersListPicto]{width:36px;height:36px}span[id^=GPshowLayersListClose],span[id^=GPshowLayersListOpen]{background-image:url(data:image/png;base64,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)}span[id^=GPshowLayersListClose]{background-position:-36px 0}div[id^=GPlayerSwitcher-] input[type=checkbox]:checked+div+label[id^=GPshowLayersListPicto]{box-shadow:0 2px 2px #000;border-top:1px solid #ccc}div[id^=GPlayerSwitcher-] input[type=checkbox]:checked+div+label[id^=GPshowLayersListPicto] span[id^=GPshowLayersListOpen]{opacity:.4}.GPlayerInfo,.GPlayerInfoOpened,.GPlayerRemove,.GPlayerVisibility,.GPshowLayerAdvancedTools{background-image:url(data:image/png;base64,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)}.GPlayerOpacity input[type=range]::-webkit-slider-runnable-track{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAECAYAAAAZDrhMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAwSURBVDiNY/z379//v3//Mvz9+5fh379/DITYxKobKWYxMYwCisBoAFIIRgOQQgAADrTuhXfc36kAAAAASUVORK5CYII=)}.GPlayerOpacity input[type=range]::-moz-range-track{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAECAYAAAAZDrhMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAwSURBVDiNY/z379//v3//Mvz9+5fh379/DITYxKobKWYxMYwCisBoAFIIRgOQQgAADrTuhXfc36kAAAAASUVORK5CYII=)}.GPlayerOpacity input[type=range]::-ms-track{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAECAYAAAAZDrhMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAwSURBVDiNY/z379//v3//Mvz9+5fh379/DITYxKobKWYxMYwCisBoAFIIRgOQQgAADrTuhXfc36kAAAAASUVORK5CYII=)}div[id^=GPlayerInfoPanel]{right:190px}div[id^=GPlayerInfoTitle]{color:#c77a04;border-bottom:1px solid #c77a04}div[id^=GPlayerInfoQuicklook]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAI9SURBVEiJ7ZZBSxRhGMd/7zi7SGxLg4mWnSIWOoSFKLvbyUN5DtMPUEqfQNLJg0GuJlE3L+UXcA8JHRKDCERmaQOLTnoKXEkhq11nDzm783TIXdZ1d9TdCEL/p3mf9/3/eJ73eeedgWMnVTqYnp42gI7DGLPZrDU0NJQtj+t76Eq1h0KhN4FAwBNm2zarq6vdwDtPIEAwGMQwDE+gpmnV5zydNWhfhuVysxvY76dwNj8A4G/tgtBgbUA3+5Ufc7cQZxu9pROAX19eI6lFjNO9zUcG2skniLNN8OZz/OejAOysL5FeGOTcz7l7QLzc47mHzkYSvaWzCAPwt11Hnb2Gz92+Wsnz15viCfS3dpHbTLKzvlSMOetLyLdlclpwuZJn3x5mMhlc1/0zuHQXSS2SXhiEpt0Ktz4ieoBM4+X52b7Nhv44+apA27aTKysrN0pjZwK3m9vScwO+rc/tAI5mfPp+qvNla3p+qinkuyJjzh01hutV6aFkjeijlqlLwmyYkbI7oXaoqT+yTF0sU39aiNXV5UgsNwo8A7VWd3YnOs6qeMItU5fCsyjpj47n45ap3wcmS9dFYrl9fq+DnVKouIa2tmt+DPLioAyr3tgKZYVjTn9hnBj2dQjSexDwUK9e4oEvLJq8BQwgg5KZuoCuSDcQBDJKqZ7IeH4AeFgzMBrLTShhRCnVEx53EsnhxovKVa8qrT3wu1xQeCJX7HBey08K0keFU/Lv/hwEiSRM32y1uSMDgQu7ZZ3of9dvep7Bwy5Q9Q8AAAAASUVORK5CYII=)}div[id^=GPlayerInfoClose]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAgCAYAAAAFQMh/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAFgSURBVEiJ7ZS7UoNAGIXPYYe8i52FMxKfJ5kEQ+yhSiP2MXhL3gfGxs4ZXyXO8luEyEXIglruaffsfv91ASsrK6tfin1MaehOhfnFeKR9rpC3eQRgFqq1OM7H1e3n5s/gNHSnoDwBcADZeSM9a8IFYBqpe4ILACLkjQnumMBgfl76OMn2aiOVgAVgFqmkgAIAKfmZ6Vkj2It1AJFK9PSzSL3ICs4xU4B+eSxbb6SXxnxMBqDsH8igjFh2ObAHeF2DunreNQeDwW1waV4eAB0EPsJfQ7XWZFC/2D50p2QeroY0wR/RyrAEgIGlrqxMm2NQ1r0yboVSthRJShcn2V49y6rfm0ZTF9Rz9fzyTi8bq9Ybbv65IpXUVgby6MV6wcNgf38gtV2GPIxj3dGSg3qUxXkDir4dPofgCC0iFy/Wi0rmInDeze/2UBq6fhqpRE5UqGhJkoau3+WxsrKy+hd9AZasoFzDGcuhAAAAAElFTkSuQmCC)}.GPlayerInfoLink,.GPlayerInfoPopup{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAI9SURBVEiJ7ZZBSxRhGMd/7zi7SGxLg4mWnSIWOoSFKLvbyUN5DtMPUEqfQNLJg0GuJlE3L+UXcA8JHRKDCERmaQOLTnoKXEkhq11nDzm783TIXdZ1d9TdCEL/p3mf9/3/eJ73eeedgWMnVTqYnp42gI7DGLPZrDU0NJQtj+t76Eq1h0KhN4FAwBNm2zarq6vdwDtPIEAwGMQwDE+gpmnV5zydNWhfhuVysxvY76dwNj8A4G/tgtBgbUA3+5Ufc7cQZxu9pROAX19eI6lFjNO9zUcG2skniLNN8OZz/OejAOysL5FeGOTcz7l7QLzc47mHzkYSvaWzCAPwt11Hnb2Gz92+Wsnz15viCfS3dpHbTLKzvlSMOetLyLdlclpwuZJn3x5mMhlc1/0zuHQXSS2SXhiEpt0Ktz4ieoBM4+X52b7Nhv44+apA27aTKysrN0pjZwK3m9vScwO+rc/tAI5mfPp+qvNla3p+qinkuyJjzh01hutV6aFkjeijlqlLwmyYkbI7oXaoqT+yTF0sU39aiNXV5UgsNwo8A7VWd3YnOs6qeMItU5fCsyjpj47n45ap3wcmS9dFYrl9fq+DnVKouIa2tmt+DPLioAyr3tgKZYVjTn9hnBj2dQjSexDwUK9e4oEvLJq8BQwgg5KZuoCuSDcQBDJKqZ7IeH4AeFgzMBrLTShhRCnVEx53EsnhxovKVa8qrT3wu1xQeCJX7HBey08K0keFU/Lv/hwEiSRM32y1uSMDgQu7ZZ3of9dvep7Bwy5Q9Q8AAAAASUVORK5CYII=)}.GPlocationStageFlexInput{margin-bottom:5px}.GPlocationOriginPointerImg,.GPlocationStageRemove,.GPlocationTransportImg,div[id^=GPlocationStageAdd]{background-image:url(data:image/png;base64,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)}span[id^=GPshowMousePositionOpen]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHjSURBVFiF7ZixctpAEIb/PVk09otkxkUKF8LPc45NwO5RGhqL3jZxHO55InVpMpnxg7iBOf0pLGEQaIREFJj4vhl1dzv7z7+7twA4HI53idaaWmvuO4+6qH0n4HD8XaTpxbx/jTGNY1QRD/0LSnrW7diejJBuOkNAkqF3R6Wez2/nD1UxD7aH46F/AeE3gXxKZt4TR+u5EpA49O4hMhDy7scXf1AV96hpQm06CwCQ9CMgmUjRycybE7YvAIHM2dCbCKSX3xCmH6rCHqzDQWQHIJdKVHpJ6H3nCGrh7JtYQDgNOva6Km5tl8re3jYcz/sTIotSVaBJgRkgnxcHhdPAt1dlfb7MLg6/ZF9rCMBgbG+WnbYQ3VQssEFwcYMq2ahejDEnxpgTFERveX9rctGKfCCKJUlTRyxwwD1cxApkrWdYvyV36eHc2WOgvamdDyiB9EtOmKBjLxuXdA2Os681NooVToWcvJ0SXfZOb6Ldt3QHysQGvr3CCCxO722dPljBcehNVqYx+BhE64vHylsMfu1GtqT0X2lc0u3/HlY/gcyt16VikIsFsukd2f7Sk0VC/a6K2ni1bJtuNDfx0Pch6Wlwuyo2RwBybG+S0FOg+nU+nj/uI1fHf4H7T8vhcDj+AX8AnMTkomeXEcwAAAAASUVORK5CYII=)}div[id^=GPmousePositionPanelClose]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHjSURBVFiF7ZixctpAEIb/PVk09otkxkUKF8LPc45NwO5RGhqL3jZxHO55InVpMpnxg7iBOf0pLGEQaIREFJj4vhl1dzv7z7+7twA4HI53idaaWmvuO4+6qH0n4HD8XaTpxbx/jTGNY1QRD/0LSnrW7diejJBuOkNAkqF3R6Wez2/nD1UxD7aH46F/AeE3gXxKZt4TR+u5EpA49O4hMhDy7scXf1AV96hpQm06CwCQ9CMgmUjRycybE7YvAIHM2dCbCKSX3xCmH6rCHqzDQWQHIJdKVHpJ6H3nCGrh7JtYQDgNOva6Km5tl8re3jYcz/sTIotSVaBJgRkgnxcHhdPAt1dlfb7MLg6/ZF9rCMBgbG+WnbYQ3VQssEFwcYMq2ahejDEnxpgTFERveX9rctGKfCCKJUlTRyxwwD1cxApkrWdYvyV36eHc2WOgvamdDyiB9EtOmKBjLxuXdA2Os681NooVToWcvJ0SXfZOb6Ldt3QHysQGvr3CCCxO722dPljBcehNVqYx+BhE64vHylsMfu1GtqT0X2lc0u3/HlY/gcyt16VikIsFsukd2f7Sk0VC/a6K2ni1bJtuNDfx0Pch6Wlwuyo2RwBybG+S0FOg+nU+nj/uI1fHf4H7T8vhcDj+AX8AnMTkomeXEcwAAAAASUVORK5CYII=)}.GPmousePositionEditTool{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QYXCC4cQlf82gAAAvFJREFUSMfllk9PE1EUxc99DDQBxZV8BKGUlkJKQjEK6rIWDQETFy5o17JwQ1s0QEKhbNTA1kLixogkhIBbURL+JDYyFKTtZ9DEgIQEmb7rojNkWmYoG42Jb/fm3rz5zbnn3jdAmbURU3gjpjD+0hL4xxZZPVwbQZ34pQwQEGDAqyeqTFg+kdrUzQl8O+/Q6cE7r2vohy/kCDZhdFTavXsm0qYe4lJuILHywBZofaiij5iSAC7bHHRAzOH2ify8HUyrWH0kiJGVnly/I9hoAUWvIr5tl1DdzECKb7wzoIQFzFsdZkESOo0YM7oYWARQy0Rzm9GKXiugatpvEVSwXINI188cv0+XfDjNRHw7LqG6AYAIqMFP5xkPrY2gTleGwBj0j2s91+PaqhHvmNA+dYxr94kRBUBMlFyN4mopUDiR8mRkS9rYO4Xqmo20ZjA8LAxlnEJ1GfEse7JhR6D5TMk2YsoYgCEAC/5xradM5y0C6AZhzB/Xntn5wym2PMaDnGzO5YGTRrHdZIbprwq6zCU1lywIAJLwslwnMOM5ABDjrl1KKPHZa1bqmtiuLwcDAGQ3Y/zjGhlzyGpvl1+q1GykTa0XWx5zMCvduX5Ht5XZ//wcyoPpDClbj5tiDw0pKhjNktBpNrOlh54qXZBYAWHLH9da7c42WtsqaDcSzAot6b54UvazZSGHGcsXhcmyJ5vJe3eMfYNI188eL+3p3XcWSFZq0wAOCLi3GVUidnfZekyJ6g2wr7E2fVGY/qqgKzSZajYb3QqqqJab0YpeJporCIVFMF4Q4aOOfktXJghAMnFvRzy/UEqTjPh2GoV62k0Z6f0aSqTcANg8GM2zaE96d8OFnGJTt0/k54m4z1DqFKZQphVDGTD3WcEAwCGufJFMp8qEHAGPCUYfCSm3oRQzcITavXMv19UorlYKZQBAAIwWPXOLGctVVdqUbwTfz79cb7+ppoOmcCJVClNU2mTElz7i2t3Hkx8eXrht//v/od8GMV64Yi7NnAAAAABJRU5ErkJggg==)}#GPmapCenter{background-image:url(data:image/png;base64,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)}[id^=GPreverseGeocoding-]{top:0}[id^=GPshowReverseGeocodingOpen-]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPcSURBVFiF7ZZPaBxVHMc/vxl3UggSwYMGAkVEqwfRQ4VNQRTUSw/2ksWiJZTs27QxaSGe3FRhpXS9qWiyavZPsBRLWal/QBHxIK2QPSiClYAeS8BbygTFkt15Pw87m2w2s91kiQgyn9sM733n9+H93nsDMTExMTExMf8Vsh8hxpj7gCngBeBhoA6sAO+USqVP+81dziYyKvbwqBdMSQ4bNUZBaln3PXWc345cqM/3yryjcDqdnhCRWZoSa8CXqpotl8tr7eOMMb8Aj0UWpPpyuVz+pFchnSxnExlEPwQc0FLSC051SivI8pz7viDTgKrI2V7STpf3kk6nL4tIGXgA+AnYACZF5NfJyckHO6QuAioi3wJ5VX0b+BtARF7dq2yzAvvEVn1iahvuvLYtkILU5tyFULb5KbWP9oq9K+qlMWYCOA587zjOawCNRuO267pHVTVvrV0Cnm5+F1zXLdbr9a+XlpZWWhmZTMZT1RngkT50SeaDmVrWtYjMhD5TtTk3oV5wihwaruzU5gTRYjIRnOmVG9nSxpgbNFf2OeAAgIgoUFfVWWDMWvtkpVL5sVuwMeZz4Bhws1QqHdytaDut/bklDQ5asrAB8sqWhRaTieB0t33eTreWfgi44TiObn5cVVTVcxznOoDruoe6hWYymddpyrbavS8ENPlWcBbVzX0ZIKZfWegufAsYbjQat8OVbWaLaBAE9wOo6q2oicaYN1T1fPj4zfr6+vmocbulJe2oziudLamlvchCF2ER+QI46LruUZpXzGZLi8gUsGatvd45zxjzDPBm+PiZ7/vHqtXqxm6LuROBIDv2n+79Wo0UttbOAX+oal5VZ0XkcRF5XlW/Au5R1TOVSuXPiKljNBfhd9/3j++HbMfVsx2RdG3D/UhzXTt1B5EDy+XymuM4T6nqD8CYqr5rrT0HWOAlERk2xlzO5XKdp/wBmtvh2r8mK1oU1YWtUWL2It2rJSSTyRxW1UPAmud51wqFwl/GmIvACeCS7/snq9VqsGebHnSTTSaC0+TQztO728/JDqF+ikmlUu7Q0FAFGAeujIyMnMjlco3x8fF7BwYGnhWR2uLi4s1+slssz7kL205j9INkPpiW8O5v/XjQfhejhdF8sLP129h177dTrVYD3/cngEvAi6urqyUAz/OuquoVa20tlUq5/WS3lfYzhKslWkx6wUxLFsLTOx9Mt11ZqjgrEUHbU/stJ5Q+CXwMfBe+bv1yDg8ODt7dbzbAaL5eQmUGtJC8EN2qm/c0WkBl+ki+vhCV1TFn/zDGnAOyInK1WCyO72d2TExMTEzM/5B/AE2JsceuwAzdAAAAAElFTkSuQmCC)}[id^=GPreverseGeocodingPanel-]{left:10px}[id^=GPreverseGeocodingPanelClose-]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPcSURBVFiF7ZZPaBxVHMc/vxl3UggSwYMGAkVEqwfRQ4VNQRTUSw/2ksWiJZTs27QxaSGe3FRhpXS9qWiyavZPsBRLWal/QBHxIK2QPSiClYAeS8BbygTFkt15Pw87m2w2s91kiQgyn9sM733n9+H93nsDMTExMTExMf8Vsh8hxpj7gCngBeBhoA6sAO+USqVP+81dziYyKvbwqBdMSQ4bNUZBaln3PXWc345cqM/3yryjcDqdnhCRWZoSa8CXqpotl8tr7eOMMb8Aj0UWpPpyuVz+pFchnSxnExlEPwQc0FLSC051SivI8pz7viDTgKrI2V7STpf3kk6nL4tIGXgA+AnYACZF5NfJyckHO6QuAioi3wJ5VX0b+BtARF7dq2yzAvvEVn1iahvuvLYtkILU5tyFULb5KbWP9oq9K+qlMWYCOA587zjOawCNRuO267pHVTVvrV0Cnm5+F1zXLdbr9a+XlpZWWhmZTMZT1RngkT50SeaDmVrWtYjMhD5TtTk3oV5wihwaruzU5gTRYjIRnOmVG9nSxpgbNFf2OeAAgIgoUFfVWWDMWvtkpVL5sVuwMeZz4Bhws1QqHdytaDut/bklDQ5asrAB8sqWhRaTieB0t33eTreWfgi44TiObn5cVVTVcxznOoDruoe6hWYymddpyrbavS8ENPlWcBbVzX0ZIKZfWegufAsYbjQat8OVbWaLaBAE9wOo6q2oicaYN1T1fPj4zfr6+vmocbulJe2oziudLamlvchCF2ER+QI46LruUZpXzGZLi8gUsGatvd45zxjzDPBm+PiZ7/vHqtXqxm6LuROBIDv2n+79Wo0UttbOAX+oal5VZ0XkcRF5XlW/Au5R1TOVSuXPiKljNBfhd9/3j++HbMfVsx2RdG3D/UhzXTt1B5EDy+XymuM4T6nqD8CYqr5rrT0HWOAlERk2xlzO5XKdp/wBmtvh2r8mK1oU1YWtUWL2It2rJSSTyRxW1UPAmud51wqFwl/GmIvACeCS7/snq9VqsGebHnSTTSaC0+TQztO728/JDqF+ikmlUu7Q0FAFGAeujIyMnMjlco3x8fF7BwYGnhWR2uLi4s1+slssz7kL205j9INkPpiW8O5v/XjQfhejhdF8sLP129h177dTrVYD3/cngEvAi6urqyUAz/OuquoVa20tlUq5/WS3lfYzhKslWkx6wUxLFsLTOx9Mt11ZqjgrEUHbU/stJ5Q+CXwMfBe+bv1yDg8ODt7dbzbAaL5eQmUGtJC8EN2qm/c0WkBl+ki+vhCV1TFn/zDGnAOyInK1WCyO72d2TExMTEzM/5B/AE2JsceuwAzdAAAAAElFTkSuQmCC)}.GPreverseGeocodingCalcWaitingContainerHidden,.GPreverseGeocodingCalcWaitingContainerVisible{border-radius:5px}[id^=GPreverseGeocodingReturnPicto-]{width:30px!important;height:30px!important;background-color:#c77a04;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4AYBCQs6x0UYEQAAATZJREFUSMftliFLBFEURs/dVUQURJvYLCaLGESz1T9gUJsoWARBEBRM/obFIFgMygabTQSbVoNgMCqYLMLusawwYVdnZ8bdsHvS8Oab97377p33LvTp09OoJ+qHOt9p0x+28s5XSml6DOwlhuLfjdVD4KDoHRz4w3QfOGryakUdBerAG/AMPEXEexE53bU96uqtuqaWs5rumI87dSJLjmdybtgScNl25GqoFfOz3sojfjEvAadAs49vgIfG8yAwDkwDC8BQQncfEYtZcl1Wz5tEst1CP6aeJXQ1dSproZXVizTGiTRdJ7QbmQ6QiKgBq8BVmoVGhMAm8FVIoaqDarXxvy6n0P8U52URh0pJnUypnW0YP3bjGr1XXzLfTjmoAMPdiHhEfe14xBHxCVS71S7N9ZvG3uQbY/KgCDQBMlkAAAAASUVORK5CYII=)}.GPreverseGeocodedLocationHighlight{background-color:rgba(255,200,0,.25);color:#222}div[id^=GProute-]{top:0}.GProuteStageFlexInput{margin-bottom:5px}span[id^=GPshowRouteOpen]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJySURBVFiF7Za/btNQFMa/z46rRkwIiXdAYmBAwilrxQBvENS7kJZWcbsnSChLk70tKk07OSISDwALf7Y2VhcWhMQjFAmxVklvDkPqNHFtktwmUCH/Nl/rfDlfzp9rICUlJSXlP0MpdaKUOvnXeZiQMYy7PdUs/iKJhpeWlm6QfAvgyeC57/scfFZKSVy8iNSz2axXr9c7psm1Ss6ysHs/N6fXWEE39ncABiV7Syzr+8JmZ2eUphV3qJS6RfIDImYngeTK6enp+3w+f9MkvlVylkF5TXAlaNt7UrmcqwBsle1tkB5Fto5eON4o3VjDAN4AyJkkGmExk8n4RpHs3kM/PxaCtr0jQL+7BGBQtl8RLIYRlO6dUbJJhp8CODJKdJiPZ2dnyiTQrWoPIgMtyrWgbNelAqtfWXDt4rXsu3N6fZRurGHf93+KyCMA70ySBXozPD8//7jZbP4yiScgbk1vREwXjtv2XlC2dwYq2zPr6NWkOY/oTk64qKILbBaESwmkd/48nPQEZgHza6lPZEsfisjLRqPx+aq6IQREanrjuGRDk97wPywHk5gFkmfYlIckP01ZEwCgCV5qJ5m8Q6dt+JDk4jQFwwU1NLMh5LOkKyuJK7f0LOc41ixln120heEZC0HbhlT083Fae9oVnhpJZl1Hrz6o6fXo9h630tfW8KWrB7Lrbvaq2L+yILsX71kI2vb2KN1raxiwvgDnLdr7qPDYu5V6R4C4VV0cqLQIrG+jVK88w7MiV+0ctEqOA3bvupvDZkPCKyso2xbE+rpQ6+zGaQ1ybQ0DQG4MAwQEVV0E9FiapoZ/GMalpKSkpKT8gd85//Z5bfxYOAAAAABJRU5ErkJggg==)}div[id^=GProutePanel-]{left:10px}div[id^=GProutePanelClose]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJySURBVFiF7Za/btNQFMa/z46rRkwIiXdAYmBAwilrxQBvENS7kJZWcbsnSChLk70tKk07OSISDwALf7Y2VhcWhMQjFAmxVklvDkPqNHFtktwmUCH/Nl/rfDlfzp9rICUlJSXlP0MpdaKUOvnXeZiQMYy7PdUs/iKJhpeWlm6QfAvgyeC57/scfFZKSVy8iNSz2axXr9c7psm1Ss6ysHs/N6fXWEE39ncABiV7Syzr+8JmZ2eUphV3qJS6RfIDImYngeTK6enp+3w+f9MkvlVylkF5TXAlaNt7UrmcqwBsle1tkB5Fto5eON4o3VjDAN4AyJkkGmExk8n4RpHs3kM/PxaCtr0jQL+7BGBQtl8RLIYRlO6dUbJJhp8CODJKdJiPZ2dnyiTQrWoPIgMtyrWgbNelAqtfWXDt4rXsu3N6fZRurGHf93+KyCMA70ySBXozPD8//7jZbP4yiScgbk1vREwXjtv2XlC2dwYq2zPr6NWkOY/oTk64qKILbBaESwmkd/48nPQEZgHza6lPZEsfisjLRqPx+aq6IQREanrjuGRDk97wPywHk5gFkmfYlIckP01ZEwCgCV5qJ5m8Q6dt+JDk4jQFwwU1NLMh5LOkKyuJK7f0LOc41ixln120heEZC0HbhlT083Fae9oVnhpJZl1Hrz6o6fXo9h630tfW8KWrB7Lrbvaq2L+yILsX71kI2vb2KN1raxiwvgDnLdr7qPDYu5V6R4C4VV0cqLQIrG+jVK88w7MiV+0ctEqOA3bvupvDZkPCKyso2xbE+rpQ6+zGaQ1ybQ0DQG4MAwQEVV0E9FiapoZ/GMalpKSkpKT8gd85//Z5bfxYOAAAAABJRU5ErkJggg==)}.GProuteCalcWaitingContainerHidden,.GProuteCalcWaitingContainerVisible{border-radius:5px}.GProuteOriginPointerImg,.GProuteStageRemove,.GProuteTransportImg,div[id^=GProuteStageAdd]{background-image:url(data:image/png;base64,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)}.GProuteExclusionsOption{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAA4CAYAAADuMJi0AAAE60lEQVRYw+2YWWxUZRTHz/fd7y4zzAzTbaAdpgtQWsBiYVxYGpcEMCwRQkx48KHGhKg0WhESNYglwSUgWCKGTaMRBF4MwShpECUshlJqay2U0LCUwrRAp+0Ms997v8UnEl8Gp9Ppg2Z+bzfnn+/knHvud865AFmy/GfZVVZW/vvb9eduNn7Wc+ixGQ3/pm+UcO735VP3/rpsyc39TudHyXQ4maF61cqfZi97ocbjmVi6YGHNxoOeor3JtDskae606uqzFfPmvRqLxFg4EetIpiXJDJqqOHBwEEjIDyXjiVw4t/S1XD34TKs/MX+z4EEAgK0SwhPtjh+qq6tXBjGOtTY11a31D371qEygRxn3F3vWPVE1deN0G82T+m5BbCAIF+8lBttifLoFQeV0Wf7R7XbndsXird19/TUfAhgZeZ8H7eoXHYVWwzdBFTedsmhScfg0wfQPTRF7FfLdmBRRo4Q9RzTS8aeKRaeERAsC8TmRto30HJKqMCrhIcMUMuMcmADQJAQ5GJ4fqUMpFdE2mXgqOe+ewXhJFCHoJNJxu4omz7bhScVMyj/BeFPGUrlZIROOYRT4C0C0S0h8qUhHAAC2yGTFpUka7Skfx9/DZFZGnH2gEHxYwnc6EIguBYnDqtTzT3uDTFb3VdrEcZfWk5GUrgZxaI4QCyyaBAME04sUzTvL+dBD+xnOu8qiwrIgV1leEuf9JxhvTzu6Bgm5ThXkmNcciriaS8R2lXySTHvUqXb/lqsNp3Ju0qstx2Z7sfTZGuKsLAFkV4RK0J5k2s4wXYqYsO6WyYq0HUYN06c9XgX5SxcBuIt4gvJ40sJi7MaVONtVhGHmqIrmyLPzm29tqqf7ilwHUtHvVAjO9tksWbJkyQzehd7xo5ppUqW2tlbzLp380rhxitdB8q/4fD6acnsaKfX19c7Ji+QNJU/at7mmWaaZpklHNSY+irq6urzSxbBBy1PqEoJZfFdYoK2tjY2Jw4aGBpurJvKOmme8xWTTmgjq1DApAwAxoo6fIkieEnoF2+NvUDVqCekRiNIY4ip1eb1ekvEI39/65nOyO7hWtyWc0biOogkDooYOBhhujLEDAIZG4xADAH/4sH796y42ZWBNxBGrCEZMlNBNER1k8fBtdixwwzzY2toaTCtCr9drLXzKthgSiv7ztycfjvQo4O5fpWqR5eGojg2DCX1IBHUf3n2nSey5cOpCXzrfIXp6WZXXMtdYh8pi74JTL3WTijO913tDq2qXVxplA5vijgdTIvE4RO6zYOwO3t5/GhpbTrYMjnh78nq9VlwRfRmVRdewArM6rgJBTLbxErYEAL4J5vetwFJ4jghQxMNSSAyoO42Ttl0Xz58PpzXqS5JE7G5tqrAbM6lMiyljkimoQg1m8VhK7xrFwTpdixcbAaGz2/I+ekba0dzc/iDt3SIUCtH+Lv+lArWwjWPOOeMVJjI1imgRsyXKDas+mxoc83vKUfOC/dO2lst3M7LM3L816LdLBedlTIKU05lUNfJM2ZzEBZORXzuHrtk+vnSu63JGF9LhvmH9/uVAu8s9MUQFnWUSIweHFJ90z7qlq+n6L2OyAQMA918NdLrcrqgwoQrHyAHWqX49PDzMxsohAIAUuZ0YsHJHSO+G5t7eXj+k8ZsEjfCmsQGABgAmAMQBIJEdN7L8//gb3FshBGMt81oAAAAASUVORK5CYII=)}div[id^=GProuteResultsValueDist],div[id^=GProuteResultsValueTime]{color:#c77a04}div[id^=GProuteResultsNew]{background-color:#c77a04;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPwAAAAcCAYAAABF79LlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAzSSURBVHic7Zx/bFxVdsc/575nl+BAGLWJYmVF1RUI9UfKbqGJHZKFghZVSgiriEQVlbKAnXmTHyTdVNtgJ1mGruNAqw1tQrDfOD8olSLFUNJ0UzVaxI9AcYyEGgQFiSXaKtsfNqTylOA2qvPmnv7xZuzxeH7POCjb+UjWzNx73v3esXzeufec+wwNGjRo0KBBgwYNGjS4hpGvegINGswGfX19i4wxz6vqXGvtpk2bNn0ym3pDO1lkVJ5Hmes4uul3e5hVvWpxv+oJNGgwGxhjfGCliOA4zivAb86qnooPshKBlJVXwM6qXrWYai7yfV9939d6T6YQZ7tdPdvtXjW9Br8Q3J31/jdmX05mVU9Vn1HVpKreWcs4jQifQ/aNzHXdRR0dHf/xVc6nQXWo6lIROQXMBdbMvqBdiphTAnNVbF31VPUZ4E/SH5cA71U7VtkO39fXt8AYsxVYmWnzff+ciJxyXXf/Y489drHaSeTjnTgLzIS7VWBlxgOHu91zKpy6YoP939pLXfWuFolEYoOq3jkyMrIxHo/bfDaqKolEYj/wied5z13lKV7T+L6/GHhRRM4Da6LR6PuzqTe0m8UmZV4EPW+wa5b0Ulc9Vf0hU84ONebdyrrY9/21wGHghgIml1S1IxaLvVzLZDIM7XTWikpRPVHtaNubqoteNrMZ4dPO3k+4lTo0MjLi5Tp92tkPAJsBBbbWy+n37ds3p6Wl5QPgliJmxyKRyPp169alatUb+h5zzBxTVE/h2L9+ateve4mq9fr7+9tF5AfA788YX/X+WCz2arVj5+PdLtox8gNVmaEH5v623qAueqr6JBDPad4iIgerHbPkHj7t7MeBG1T1hKpO7lVE5B4ROQncKCKD/f39D1U7kQxpZz9O6OwnrEztxVS5R+EkcKOKDA53OTXrXU2std9g6nfe2dra+pyqTt50085+kNDZAURVf70e2oODg80tLS2vUNzZAR5OJpN5/pAr46M4zc71UlJP4OFfvdWpSU9Ehsjj7ADGmO/XMnY+VMxQfmcHSNVFT1W7mOnsAKtVdYeqfl9VH1HV5ar6K+WOW9Th+/r6FhBGdgF2xGKxNbFY7K1MfzQaPRONRr8DdAEiIoePHDkyv1zxXN6JsyAd2QVlR3tvsOauPcGk3rK9wZllvcF3REM9FTn8VhdV611tPM/bAmRH642JRCIRj8dNVmTfmOlU1YHR0dHH66GdTCaPUsApclHVjlr1Lk2Yo4WdYjoWW7MesAf4+9xGVf12X1/fkjqMPw2BPaAz9EC+PbSTmvRU9Y+B3gLd9wNPA38GHAXeBj5X1bdU9buq6pSYd2F83+8BdqrqiVgsVjQR4fv+SWC1iPREo9HdxWwLcbbb7QF2Aifae4Oieme73ZPAaoSe9j1BxXoHDx6ce9111834/kEQXMq8F5HbHMcZybXp6Oj4slK9DFn78y2ZNmPMoVQqNSEim7LsBkZHR2OF9vmV4Pv+82TdSMpgoqmp6WvV5mXe7TbPa4V6E2q/Vm1exvf9wPM8t0jl6EPP8367mrHzMdxtgrZe6w53m/x6yodte21Veqq6FfjLGqb3DqEfjuXrLLWkfyD9+helVERkH4Cqrqpoenn0rJTWU2UfgChV6bmuOxIEwaXcn+ka+kk+m8OHDxfKLZRERDQajW4lK9Jbaztn0dmVypwPoPnKlStvV6M33G20QmcHaG4WU5VemvEC7efTr4t9359Xw/iV6QmL39tBtXq3VXldhruAvykU6fNG+EJ3Ss/zJLs/93Mh+1IUqrG39waS3Z/7uZB9Ofi+/yVhyaZiXNe9sZYoD2GkHxgY2K+qW7LbrbWHPvvssxnJvFL4vr9cVZ8SkXtrmVcBxkXk9Pj4+Prt27dfBhjeyXKsPMUs6YGetpd1/bJnuVzK2Pf9nwHfBP4ru91au7SpqWkslUodBZYDRCIRt9aE5HC3+Zmbst8MHDNdT+xSUowZ4xwFXQ7w80+tW0lCMp3TSQCdtcwReFREXshtbNThv0KyE3YZRKTiskt/f3878BMRmVOXic1krqo+1NLSMgZ473bRrmp+gjBreiAPmTkyBtYrZjg4ONicTCbzLV9T1tqPOzs7x4EVvu/7wEO1OvtHcZq/vJJ3uZz63yY+/r09jENqxXC3CfUqrD6IiKqqR+ibj+QxeRX4p/T7JiACfB1oA34pyy4KvDBj/GLivu+/D9yuqndnJ+vy0dfXd48x5g3gnOd5v1PMthBnd7rvo9xuhbuzk3V5bXe592B5A+Fc+56gYr2vag8PM0pv+chbsiuE7/tvMv1k2Wxx0fO8Be92O28qOut6AheX9toF5diml+zZEfdiJBJprUd5MR/v7WBedoQXuHjhU9taS3kxm/SS/K+AP8zpyluWU9V5wH5gfbrJAjeLyL9n2xWN8CLyY1W93RizHSjqgGkbgFPF7ErwY+B2UUrqYdkOoFqd3ubNm/Puw8JAEOI4znitzp1LPmdX1QFgQkQybZ2tra3E4/FynX5xvkYRefWmm25alUwm56hqu4jsBb5RYqxVkUjk9Lp161K+7y8nzAJP/w5oXj3QV29o1lWXLzNnQtx2Y2xJPUFWXfg0dXrdS6SGd7IcrW4v7ziOk0pN87X5Y2NjPwL+qJrxSjExB8dMTH1WmH/zreZHYOuiJyIpVf0uYRRfV4b9F6r6CPDLhIfjDGFG/2i2XdGkXSqVOkB4qOZB3/efyLTnnqVPJBJdhAm3L5qamg6U/a1ysE3BAeCSwIPDXe6kXu5Z+qFud1Iv0KBqvatNIWcfHR2NeZ73ONNLdp2tra1+PB4v53mHf8zTdnx8fPzBZDJ5AfhARO4IgmBFiXHOqOptyWTynO/7HxGuGs5k9advkjpTTzluL+uDX14xF6445gMx9o7LzbaoniBnrOhtN99izg13m49Uzd2CnJkasmBybAbW2n+YMb7ItoMHD1aVpymFmXBm6AHb3ohXlxfKh4ikCCP8K2XaKxADMreiGQnAohF+48aNn/f393eIyCCwN5FItAHPqoa+l17Gb1fVBwArIo/WcsT2rjifD3dph4oMqrB3qNttQ3k2059exm8ndHaroo9+q/faOWLr+/5z2dl4oM/zvM0iovF4HFXdmkgkHKay3J0LFy6coPDSP8MuwjPWCzMNjuPsmjt37gFVzbT1uK47kffqrHFEJDvC9hhj7rPWvgaQPq6KdXSXsbIEndKzanfJ9eYAysL0Pqnn+gkzUeyJJ5XULlHzdmZjKdCDkfuw+lra4nzhq6cYGBi4w1qbqX2fBu4FmgFc191GWKOvG8NPcAfoEgARPa0qk3rXTZhtYOumJyKBqv4B8BKwGvhpCft/U9UXCZN+t+b2l4wesVjsZRFZSzrSq+qbkxeHe/YHgC9UdW00Gj1R0bfJQ9ve1MsiupZ0pBdhUg/LpB6qa5ftSdWsdzURkXOEeytUdWBkZGRL+q6c6ddoNLqZqUivIvJxqXE9z/vQcZwVwF+nm8Y6OzvPq+rDOabRYuNEIpGzuW3z5s07A4yq6uvGmE0Ay37IhzZlVyBTesue5rwo0/S0hN7Pf8oMvQufBGcQRlF93VrdlO+6XFKp1GSlw1r7JPBoVve2ffv21Te5aMykXgp9UpBJPQPbhr5X32SmiFwhfABokYiUc2x3f/r16zPGKlf0yJEj84Mg2KqqKwlLIADnCPfs+z3P+89yxyqHt7qY32Tc8GEdTesJ51Q51dwc7L8zTl31Msz203K+729U1d/yPG+as2ejqpJeDfyz53l91WolEolDOafmujzPe7rE/KbNqdzSKsDZneaQKFN6SlfbXltUL/fwSluvrbhKkZmzMea+DRs2vJ5p7+/vfy1dpjzmeV5u8qtqMnMWY+5b2hNM6g13yWuI3KtwrL3X1k2vGlT1LLBQRH4tu73sslx6qb4b2J1Vh68qG18O4amrYDewe7IOX0U2vlIq+QOvcvw+gFgsVtAmfSMotYwvyfj4+OMtLS2rCfd0L0QikT8v47JdhOUgBzhWiZ7+j33czDGrFSYEXrhw3pbUU9glaT2pUA9gcHDQSSaTAGQ7O4CIHCdc3tetojC4lskDLdnODoAxx1G9V65OxaQUA+Q5ntuow/8Ckz4kU1ZZK4PneXuocs8bHpIpr4yWob3XVq0HkEwmT6bfnsnTfRzwgUXVjp/LzbfKSQgTjrl9bpA6Hjimrno1cBx4Krexqv9443mezHYkzKa9N5BKTtE1+P/BoUOHbiH9QJAx5k9z+z3P+6KeekNPcAukHwgyMkPvzmeoq14tiMh/A3+b296I8A2uWYIgmC8iY8aYpRs2bPiXAmYTIvJ39dBzhPnAGMYuXdpjC+qB1kWvDhwtbdKgQYMGDRo0aNCgQYNriP8DimGotcEqvNwAAAAASUVORK5CYII=)}input[id^=GProuteResultsShowDetails]+label+label:hover,input[id^=GProuteResultsShowDetails]+label:hover{color:#c77a04}.GProuteResultsDetailsHighlight{background-color:rgba(255,200,0,.25);color:#222}span[id^=GPshowSearchEngineOpen]{background-image:url(data:image/png;base64,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)}form[id^=GPsearchInput-]{height:30px}div[id^=GPsearchInputReset]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKPSURBVFiF7Za9ctpAFIXPkQY39oukS+GZyHkeGKOA3YALqNSEFJbsGWzZscX7wKRJlxk/B3JDRntToD9kCUkJnjT7dYgVh2/v7t4FNBqNRqPR/C/YZNBy0ukJ1enZUWTTgSobIwBXE3MuhvHy+evv+0P8uevr6x7J0zAMbcdxynNFeHNzM1dKvVxdXdXm1govJ50eKN8BGIAsrKPovCgtAJdT847gAIAIefmv0rFsnItFGIbnRWkRoed5dwC2uSKXddJGbTLVx2wcu6uNeS+5iRKAq6npx7IAQIr60MKtPJbM5aJ7fHx8LyJZrghd1/WxlY1fYW1urbA1i4YQyc0a7dXUfBYHRlJZgHb2tQTWUXTRyGoPo9FoSDLNJWl7nvfsOI6RVJbMckkGYRjW5jbaw8n+BDlMnhmQhQI2AL9kvyaB1Yn6Vfu8Lcn+FJE0l+RCKbUhs1ySwXq97lft8zyNhIG30lJ8+cCyaW6J9E5sC1mghTCwlf4xMecROdx9sfwwOxQiwtvb27lSqihdepjto/7QKhARfDNL0m7i/gal1NvY3CHWlFZLOtd6yka8S5ULraeMVlVuVOFSWUpAET8bxe5qYz6J037VVOaWyJIMAORy0T05OXlyHKdRbu2gKlmrE/U/fYsuCi3rYNJVsuv1uj8ajS7yLQstpOtvWlPT32k9kEdrFg24PajTi8dOL4Y8nM2iqiXYiPhSkeaKyON4PB6QlPgzXdf1870YwMN4PN6b26ASxk8g3pfbS8UwkQUAAmLNokGu0iIwfjX02keaSzJ4fX0dJrLxM4knIM0leYhcYDnp2Mup6cueFREvfX856dhVY9rieZ7tuq6/7zROKu153sFyNRqNRqPRvA9/AHtLag4LyzlCAAAAAElFTkSuQmCC)}div[id^=GPgeocodeResultsClose]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAeCAYAAABwmH1PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKPSURBVFiF7Za9ctpAFIXPkQY39oukS+GZyHkeGKOA3YALqNSEFJbsGWzZscX7wKRJlxk/B3JDRntToD9kCUkJnjT7dYgVh2/v7t4FNBqNRqPR/C/YZNBy0ukJ1enZUWTTgSobIwBXE3MuhvHy+evv+0P8uevr6x7J0zAMbcdxynNFeHNzM1dKvVxdXdXm1govJ50eKN8BGIAsrKPovCgtAJdT847gAIAIefmv0rFsnItFGIbnRWkRoed5dwC2uSKXddJGbTLVx2wcu6uNeS+5iRKAq6npx7IAQIr60MKtPJbM5aJ7fHx8LyJZrghd1/WxlY1fYW1urbA1i4YQyc0a7dXUfBYHRlJZgHb2tQTWUXTRyGoPo9FoSDLNJWl7nvfsOI6RVJbMckkGYRjW5jbaw8n+BDlMnhmQhQI2AL9kvyaB1Yn6Vfu8Lcn+FJE0l+RCKbUhs1ySwXq97lft8zyNhIG30lJ8+cCyaW6J9E5sC1mghTCwlf4xMecROdx9sfwwOxQiwtvb27lSqihdepjto/7QKhARfDNL0m7i/gal1NvY3CHWlFZLOtd6yka8S5ULraeMVlVuVOFSWUpAET8bxe5qYz6J037VVOaWyJIMAORy0T05OXlyHKdRbu2gKlmrE/U/fYsuCi3rYNJVsuv1uj8ajS7yLQstpOtvWlPT32k9kEdrFg24PajTi8dOL4Y8nM2iqiXYiPhSkeaKyON4PB6QlPgzXdf1870YwMN4PN6b26ASxk8g3pfbS8UwkQUAAmLNokGu0iIwfjX02keaSzJ4fX0dJrLxM4knIM0leYhcYDnp2Mup6cueFREvfX856dhVY9rieZ7tuq6/7zROKu153sFyNRqNRqPRvA9/AHtLag4LyzlCAAAAAElFTkSuQmCC)}div[id^=GPadvancedSearchClose]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAeCAYAAACsYQl4AAAGbElEQVRo3u2Zf4xUVxXHP+e+mV2QdVdCaaAZagoNbRMxEpeuP0CXbqupURuNVFqzK84OryxIjYJt0vjH9I/+Q0VNy9r17ZsJQrDo1hqNqdEKbECKRQjVxugGS8kyFZDS7UKxu8ube/znTvPcALuZfftHdb7/TO6ZM+/c9z0/7x2ooYYaaqihhv9BZLPZ5q6urtmT0ZUaXdVhzZo1M1Kp1ADwXuDjYRj+7Vr6pkZZdUin098AbhSRwUwmM5BYRHd2dn5CRDYAK4DrgHPAAaA7DMMD0xw53wc+NDY29tkdO3acB+jo6JhTV1f3a+ClKIq+uX379pEk7fq+n46i6F7P8zIjIyPbdu7ceQmgvb191syZM79trd0ENIjIXb29vb+fMtG+76ettU8A666h1pPJZDbm8/lomoh+2y1Pi8guAFX9CjAfYHh4uL6vr28saaKttdvcclhEXnR2W4C7gQ+o6m8KhcJnJvO81EQKqvok8IBbngWettb+0xhzA3A/cD2w7tSpUxbYMA0pulxVK8v5qrp5vE5jY+MKYE+Sdq21N8eWTar6KcdHo4jcBijw1GSf501ULoCKV5+PoujLnue9KiJnPc/7i4g8paq3AgtFZFlzc/Oeo0ePDiYYVS2q+jTQGBO/BVwG6t5JS5G2pUuX/uHYsWOvJWE3l8vdpKo5EZkRE4+KSBlYCcwBBoC3W1pa/nHkyJE3p1Q6crncT4F7gbNRFLWmUql543WiKDqTSqX2A3NVdXehULgvgRd9xJWqTGyPB1R1c6FQOFxxQrlc/q6ILK8kH1ACfhSG4WPV2F27du3d1tpPGmPep6rinHjc87xnenp6TnZ2dt4uIn8EIlXtE5G3RESttW+KyP4wDJ+rdupY4dJld319/RXnRWPMbGC329SKhIL5fmBBnOTh4eE7KyQDBEHw4oULF9qAg7GgWQBU7WhVvV1EZsdJPn78+A96enpOOpWtgKjqFuDP7jciIrOBZVMZ7+a4z1K5XK6/CtH1qlopF3MTqo+fB87HCNh8pWbX19c3ZozZFBOdBz5XrV1jTLeIXHqnrnreM/39/ZGL9i+47PnXyMjIFhHpi5WuS8aY7qkQfd49aIGIjF2FlFERudEtzyVBdLFYPKGqP3bLi/FIHo8gCA67ug2wPQzDV6u1GwTB69baQ245UonkfD6fUtVKOcrv2rXrQhiGJ4FRFwgvBEHw+lSI3u8+V1++fPmNqxA9BKwepz9lGGNsrCRMNIZKJY2nw26pVHoAuA0YMMaEsUhmsnYnIrqSDtenUqknrLWnPc8brUSya4TbKiVDVbuTILmjo2OOm5MBGjo7O5ddo3G2ALPci381m80urNZue3v7LDcnA9SvW7fu/evXr28AvuNkDwdBcNndc9ykqvXOOR/1ff+6qol2J77KrHiXMeZAuVxeba1dZoy5z00bbRWnFAqFg0kQ7U5882OiratWraobr+dkW+M9xRjzy2rtzpgx4+tAU2yiWjU6OvoIMA84FIbhrwBaW1tTIvKlWA+ZZa3dMKW7jkwm86Cq/jDW7B40xmwBNsaaX7cx5rFcLrfH9/0lCXD90n/VBZHlTU1Ne33fr0Sb5HK5jzQ1Ne0DPhYb7wZV9SfVGi2Xy6Vxog+KyCZARWSzi+SFixYt+paILHJ7U+ANa+3hRO46fN9fXi6XN7gRbq5rfPtVtbtQKBzM5XJ7gDuAc8aYtiAIXq72hTdu3Fh/5swZbWxsXCEiO4AbYl9fcvt+T0xWEpEv9vb2/mkq3s3n86n+/n4WL158s6p+TVXvAW4BXhGR59xoVxeL5KF0Ot0TG/+m/5rU9/1brbX7XJpNmezYIeJOVX1+gnHwjmKxuC/JI3gul7sH+IWL5p+p6oUr2P1esVgcmMzzErsmDYLg78aYlcAZYK61NpEy0tDQEK/7r4nIFuBx4HRFePHixYMkDBHpcoH4V2vtIPBba+3vgOGKzokTJ16Z9DST5Oamg+yhoSEFeoAX0un0kt7e3ofDMHxobGxsCXAI6Jk3b16if2Bks9mVqvpp4N/As57nPRqG4bPFYvHno6Ojj4rICWvt/tbW1sk7bjrukH3fX2Kt3eNq+d4wDNt4lyCfz5tSqXQY+DDwUBiGjydyLpiOzQZB8LIxpg3YWy6XV/MuQqlUugVYCAxGUfQkNUwfurq6Zmez2eYaEzXUUEMN/x/4D41MuU8OSr8EAAAAAElFTkSuQmCC);background-position:-60px 0}span[id^=GPshowAdvancedSearchOpen]{background-image:url(data:image/png;base64,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);background-position:-30px 0}div[id^=GPautoCompleteList],div[id^=GPgeocodeResultsList]{margin-left:27px;box-shadow:0 1px 5px #000}div[id^=GPgeocodeResultsList]{top:38px;border-radius:5px}.leaflet-draw-section{position:relative}.leaflet-draw-toolbar{margin-top:12px}.leaflet-draw-toolbar-top{margin-top:0}.leaflet-draw-toolbar-notop a:first-child{border-top-right-radius:0}.leaflet-draw-toolbar-nobottom a:last-child{border-bottom-right-radius:0}.leaflet-draw-toolbar a{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAAeCAYAAACWuCNnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAbvSURBVHic7dtdbBxXFQfw/9nZ3SRKwAP7UFFUQOoHqGnUoEAoNghX9tyxVcpD1X0J+WgiUQmpfUB5ACSgG1qJIKASqBIUIauqAbWseIlqb+bOWHVR6y0FKZBEqdIUQROIREGRx3FFvR/38ODZst3a3nE8Ywfv+T2t7hzdM3fle/bOnWtACCGEEEIIIYQQQgghhBBCCCGEEEIIIcRa0EbfgBDdFItFKwzDAa3175LuWylVAvBIR/MxrXUp6Vxx9dp4VyObVEdKKW591lonXgiVUg6AHzPzk9ls9meVSmUh6RzXkz179uQKhcIgM+8CACI6U6vVnp+enm6knXt4ePiuTCbzWQAwxlSDIHg57ZwroDAMnwKwz3XdBzzPG08hxzsTNprQG2lTjtd13WFmfghAP4A+AJcATFiW9YNKpfL3uP0kUliiX4SG1pqUUpx0wXJd9/PMXAGwPWq6yMyPz8/P/7xarf4nyVwt7QV4JWkU52i8YwBu6bh0wRhzJAiCF5POCQCDg4N2Pp//NYDRjkuTxph9QRCESeYrFov5ubm5R5n5AIAPtV1aYOb7BgYGTpZKJeO67lFmPsbM9/i+/8Ja8y6zylhOYquPXhsvAJRKpczMzMwTAIaJ6LFGo+HNzs5eKRQKNxPRAWb+CoAjWuvn4vS35skWFasxAAdbbUlOYqVUPwAPwI4lLr8J4KeWZT1eqVTmksoZ5d2QghUVKx/AlmVCFph5yPf9l5LMCwBKqUksFqszRHQcAJj5GwB2MfOE7/tfTDKf4zjHiejrAE4CuNhqZ+bf2rY9FYbhGBH92/O8o47j3Oj7/uUk86+3XhsvACilHmPmgW3btn3pxIkTVzuvj4yMfNoY85wxZiQIglPd+lvTZIuq5xiAQwCe6evr218ul5tr6bNd9GiiAbyvS+hFrfVHk8oLbEzBih4Dz+G9K6t3IaLXFhYWdib5eBh911UA8wBu1lq/CQBDQ0M3WJb1OoAdRPQZz/NeSSqnUuofAKpa6/vb26MfwacA7AdwFcCdWuu/JpU3yl1C91VHoquNXhvvyMjIx4wxr1iWtbNSqfxruTjHcR4AcMj3/bu79XnNe1hpFyvHcXYT0QS6FysASHR1tVEKhcIguhQrAGDm23K53BcATCWV27KsAWYGgPOtYgUAU1NT/1RKnQewxxjzOQCJFSwANwI4297QtmLfD+AtZr43m83OJ5iz3bGU+l1OT43XGFNk5mdXKlYAYNv2eBiG31dK3aS1vrRSbOZabqRYLFppFisAIKJxAB+MGf56krk30O64gZlMJnZsHMxsoo8fHxoauqHVHn3+BAAQUaxV57Xq2F54i5nvIaJXm81mYoX5etID491JRH/sFlQul5tEdMoYc3u32FUXrLYvObViBQDM/MQqwi8knX8jEJHpHrXIGJNo8WDm1spph2VZgeu6+5RSX7YsK8D/Xnb8Psmcnebm5h7G4uS9ysxutOH8VQC70sy7UTb7eImImTnWlgkzUyaT6fr3v6qC1fGL8EytVjuQRrECANu2fwHg1TixzPyXNO5hvTHz6VWE/znJ3L7vzxBRa9PzDmb+FYBfArgjajvd39+f9vGGKwACZh5te6mwmc8KburxMvO5TCbzqW5xxWLRArDbsqyu8z32HtZSxSrNM0Hlcrnpum6JmZ+NEb4pHglrtdrz+Xz+AoBbu4Ser9fra37d3YEBfBvAkq+XmfmbpVIp9grwWnie9zSAp9PMcT3Z7OPNZrO/aTQaf1BKfbd9X7RTGIaHmPlcnPNYsVZYSikOw7AB4CAzj/f19e1fjwOMnueVEeMxJJfLbYqCNT093TDGHAGw0qHYBQBH0vj+Pc+bYOb3HFRk5nHf9yeTzgfgMhF9uEvMTQD+71/vR3pqvJOTk28AeBJAeXR09P1LxbiuuxfA9wB8LU6fsVdYrUOhtm0fTusxcAlMRN+KziUt5SqAM3v37r00OZnGfFp/QRC86DjOUCaTGWPm2zoun8fiIbuZtPLX6/UH8/n8rQDuippertfrD6aRKyqOR5VS81ji8Z+IbmfmgwB+mEb+9dZr4wWA/v7+R6rV6k+azeYpx3EezeVyJ7dv335lfn7+lkajcZCZDzPzYd/3/xSnv9gFq3UuaR2LFQDA87xAKVUB8BEAZ6N9nrNEdEZr/TcArLVOPG8aJ9jj8n3/pcHBwZ1btmx5519zmPl0vV5/Ie2V7fT09Nujo6Nus9kcA4CtW7ce1lq/nUYu27a/Mzs7CyI6gMVX/u/CzJeZ+Ue2bcc9pb1aXc8lJZms18YLANE2wkOu694N4OFGo3E8DMMPAHiDiCaY+ZOb4YCsEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhEjYfwGO+b5dFNs4OgAAAABJRU5ErkJggg==);background-image:linear-gradient(transparent,transparent),url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZpZXdCb3g9IjAgMCA2MDAgNjAiCiAgIGhlaWdodD0iNjAiCiAgIHdpZHRoPSI2MDAiCiAgIGlkPSJzdmc0MjI1IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJzcHJpdGVzaGVldC5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvZnB1Z2EvZGV2ZWxvcG1lbnQvdXBzdHJlYW0vaWNhcnRvLkxlYWZsZXQuZHJhdy9zcmMvaW1hZ2VzL3Nwcml0ZXNoZWV0LTJ4LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjkwIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iOTAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQyNTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MjU2IiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDU2IgogICAgIGlkPSJuYW1lZHZpZXc0MjU0IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIxLjMxMDE4NTIiCiAgICAgaW5rc2NhcGU6Y3g9IjIzNy41NjkyOCIKICAgICBpbmtzY2FwZTpjeT0iNy4yNDE5NjIxIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzQyMjUiIC8+CiAgPGcKICAgICBpZD0iZW5hYmxlZCIKICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIj4KICAgIDxnCiAgICAgICBpZD0icG9seWxpbmUiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIj4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAxOCwzNiAwLDYgNiwwIDAsLTYgLTYsMCB6IG0gNCw0IC0yLDAgMCwtMiAyLDAgMCwyIHoiCiAgICAgICAgIGlkPSJwYXRoNDIyOSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzNiwxOCAwLDYgNiwwIDAsLTYgLTYsMCB6IG0gNCw0IC0yLDAgMCwtMiAyLDAgMCwyIHoiCiAgICAgICAgIGlkPSJwYXRoNDIzMSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAyMy4xNDIsMzkuMTQ1IC0yLjI4NSwtMi4yOSAxNiwtMTUuOTk4IDIuMjg1LDIuMjg1IHoiCiAgICAgICAgIGlkPSJwYXRoNDIzMyIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDwvZz4KICAgIDxwYXRoCiAgICAgICBpZD0icG9seWdvbiIKICAgICAgIGQ9Ik0gMTAwLDI0LjU2NSA5Ny45MDQsMzkuMzk1IDgzLjA3LDQyIDc2LDI4Ljc3MyA4Ni40NjMsMTggWiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJyZWN0YW5nbGUiCiAgICAgICBkPSJtIDE0MCwyMCAyMCwwIDAsMjAgLTIwLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJjaXJjbGUiCiAgICAgICBkPSJtIDIyMSwzMCBjIDAsNi4wNzggLTQuOTI2LDExIC0xMSwxMSAtNi4wNzQsMCAtMTEsLTQuOTIyIC0xMSwtMTEgMCwtNi4wNzQgNC45MjYsLTExIDExLC0xMSA2LjA3NCwwIDExLDQuOTI2IDExLDExIHoiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0ibWFya2VyIgogICAgICAgZD0ibSAyNzAsMTkgYyAtNC45NzEsMCAtOSw0LjAyOSAtOSw5IDAsNC45NzEgNS4wMDEsMTIgOSwxNCA0LjAwMSwtMiA5LC05LjAyOSA5LC0xNCAwLC00Ljk3MSAtNC4wMjksLTkgLTksLTkgeiBtIDAsMTIuNSBjIC0yLjQ4NCwwIC00LjUsLTIuMDE0IC00LjUsLTQuNSAwLC0yLjQ4NCAyLjAxNiwtNC41IDQuNSwtNC41IDIuNDg1LDAgNC41LDIuMDE2IDQuNSw0LjUgMCwyLjQ4NiAtMi4wMTUsNC41IC00LjUsNC41IHoiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBpZD0iZWRpdCIKICAgICAgIHN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDMzNywzMC4xNTYgMCwwLjQwNyAwLDUuNjA0IGMgMCwxLjY1OCAtMS4zNDQsMyAtMywzIGwgLTEwLDAgYyAtMS42NTUsMCAtMywtMS4zNDIgLTMsLTMgbCAwLC0xMCBjIDAsLTEuNjU3IDEuMzQ1LC0zIDMsLTMgbCA2LjM0NSwwIDMuMTksLTMuMTcgLTkuNTM1LDAgYyAtMy4zMTMsMCAtNiwyLjY4NyAtNiw2IGwgMCwxMCBjIDAsMy4zMTMgMi42ODcsNiA2LDYgbCAxMCwwIGMgMy4zMTQsMCA2LC0yLjY4NyA2LC02IGwgMCwtOC44MDkgLTMsMi45NjgiCiAgICAgICAgIGlkPSJwYXRoNDI0MCIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzMzguNzIsMjQuNjM3IC04Ljg5Miw4Ljg5MiAtMi44MjgsMCAwLC0yLjgyOSA4Ljg5LC04Ljg5IHoiCiAgICAgICAgIGlkPSJwYXRoNDI0MiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzMzguNjk3LDE3LjgyNiA0LDAgMCw0IC00LDAgeiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoLTAuNzA2OTgzMzYsLTAuNzA3MjMwMTgsMC43MDcyMzAxOCwtMC43MDY5ODMzNiw1NjcuNTU5MTcsMjc0Ljc4MjczKSIKICAgICAgICAgaWQ9InBhdGg0MjQ0IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIiAvPgogICAgPC9nPgogICAgPGcKICAgICAgIGlkPSJyZW1vdmUiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIj4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzODEsNDIgMTgsMCAwLC0xOCAtMTgsMCAwLDE4IHogbSAxNCwtMTYgMiwwIDAsMTQgLTIsMCAwLC0xNCB6IG0gLTQsMCAyLDAgMCwxNCAtMiwwIDAsLTE0IHogbSAtNCwwIDIsMCAwLDE0IC0yLDAgMCwtMTQgeiBtIC00LDAgMiwwIDAsMTQgLTIsMCAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDQyNDciCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Im0gMzk1LDIwIDAsLTQgLTEwLDAgMCw0IC02LDAgMCwyIDIyLDAgMCwtMiAtNiwwIHogbSAtMiwwIC02LDAgMCwtMiA2LDAgMCwyIHoiCiAgICAgICAgIGlkPSJwYXRoNDI0OSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDwvZz4KICA8L2c+CiAgPGcKICAgICBpZD0iZGlzYWJsZWQiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIwLDApIgogICAgIHN0eWxlPSJmaWxsOiNiYmJiYmIiPgogICAgPHVzZQogICAgICAgeGxpbms6aHJlZj0iI2VkaXQiCiAgICAgICBpZD0iZWRpdC1kaXNhYmxlZCIKICAgICAgIHg9IjAiCiAgICAgICB5PSIwIgogICAgICAgd2lkdGg9IjEwMCUiCiAgICAgICBoZWlnaHQ9IjEwMCUiIC8+CiAgICA8dXNlCiAgICAgICB4bGluazpocmVmPSIjcmVtb3ZlIgogICAgICAgaWQ9InJlbW92ZS1kaXNhYmxlZCIKICAgICAgIHg9IjAiCiAgICAgICB5PSIwIgogICAgICAgd2lkdGg9IjEwMCUiCiAgICAgICBoZWlnaHQ9IjEwMCUiIC8+CiAgPC9nPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzQ2NDY0NjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJjaXJjbGUtMyIKICAgICBkPSJtIDU4MS42NTcyNSwzMCBjIDAsNi4wNzggLTQuOTI2LDExIC0xMSwxMSAtNi4wNzQsMCAtMTEsLTQuOTIyIC0xMSwtMTEgMCwtNi4wNzQgNC45MjYsLTExIDExLC0xMSA2LjA3NCwwIDExLDQuOTI2IDExLDExIHoiCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KPC9zdmc+Cg==);background-repeat:no-repeat;background-size:300px 30px;background-clip:padding-box}.leaflet-retina .leaflet-draw-toolbar a{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAA8CAYAAAC6nMS5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAA16SURBVHic7d1/jBxneQfw7zNzvotdn+9sVQkxoRKoammBqqpbk6uT5mLfvHPn42yn1VFRVCEhoFH5IYpoSaUCKi1NcGkcfrbCVRFKEwG2aHLn83pmLvY2CTqT1AmCOBE0EOT4B0nBPw/snb2dp3/sLr6s77i923dud/a+H8ny7tzMo8f3eud99p133gGIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiFYGaXYCRETUPMYYrWe/MAzZX2QQ27d5OpqdABFROxgZGVlz5cqVrzuOc18QBJPNzofsYvvSYrVcgTVftZ2l6npgYODXHMc5oKoHHcfZHQTB2WbnRETpGRkZWVMoFA6IyO2qutX3/R1Z64TnO8fWOwLSzti+mSKDg4M3l0qlnSJyG4CbAFwP4ByAlwE8paoPX3fddcH4+PjP00yk5QqsrDPGvAZAHsBrReRNqvpeY8x/iMg9QRCcaXJ6ZIHv+xtUdReAHQBej/IHGABOAnhORMY6OjoempiYONe0JC3zPM84jjOqqrfi6r/3RQCPAdgXhmHUvOyaa3R01L1w4cJBALdVNq1W1THP87woir7ZzNyocWzf7PA8b4uI7E6S5A9Frqknb6j8eZOIvKNQKPzU9/1/dhznvlwuV0gjn5YbFapW09Vqu/Z9K9u2bdsNruvmUe50axUAfMV13X/I5XInlzcze2x/28lCu1b19fWt7u7u/hCAvwGwboHdL6jq7unp6T1TU1OXlyG9VAwODv5mkiR7Ady6wK6Plkqldz/yyCPfX468bBkaGuqamZm5E8DbReQNANYscMiLIrI1CILnZ280xrwHwL+hck4VkacBDLTS6HVaIxWt/Blm+zauldu3atOmTas2bNjwWRG5s7LplKp+VUQOuq77/bVr17589uzZ9SKy0XGcAVUdFZE/qOx7zHXdXWn0yy31i6sMw/4MyF6BZYy5XlWPiMhvL7BrrKpfcxznE7Uf4ixYqQWW53kbATw060NZr28nSbJzcnLyRBp5pcnzvNtE5CEAvXUecg7ArjAMH00xLWuGhoZuKpVKEwB+p85DXnRd9/ZcLvcDAOjv778un88XAChwtRMWkW+jxTpfYOV1wGxfO1q1fav6+vpWr1u3blxVtwH4uar+/fT09OcW+mJrjBkBcC+AXwdwBoAJw/AZm7m1zC+uUlyNA9g6189buZH7+/t/tbOz8wiANy7isKKqftV13U8eOnToe2nlZttKLLAqJ+qjAF69xBAnZ2Zmbj58+PApm3mlqTJydRTXFldHAUxVXvcBuLnm5+dU9c1RFP1v2jk2YmhoqKtUKj2B+jvfE0mS3D45OflD4OqcHADPh2H4F6h0wp7nva1YLOby+fz5dDKnerB9Vwzxff8BVX0bgFMAdoZheKzeg4eHh9cXi8WvAfAAvOC67ptzudz/WUvOVqBGVO7OmBCR/vn2adWOuL+/v7ezs3MSwKYlhkgAHBSRjwdB8JTF1FKx0gqsymXBxwH8XoOh/ieO41vz+fwVG3mlzRjzKF55WfA8gD8LwzA3ez/P87aLyIMAeqrbVDUfRdHty5Pp0hhjPgDgM9X3qnq/iNwPYM5RCdd1T1RPvLM63+q/ce/sTpiaj+27Mvi+f6eq/iuAi67r9uVyuWcXG6NSjB8B0KeqE1EUvcVWfk3v3OYZuXosjuPt+Xx+ull51WNgYKBHRKIlXDaaS6Kq+6Mo+lMLsVKz0gosz/M+KiKfsBTub8MwvMdSrNQYYzwAYc3m7bXFVZXv+8OqemD2NlUdiKLokbRybJQx5lsANlfefi4Mww/UedyvADgI4I9mbxeRDwdB8C92s0yHrc9wK3922b6Na+X2BYD+/v61nZ2dz6M8cX00DMP9S421ffv2V83MzDwHoNfmucuxEWSpslxcjYyMrHEcZ8xScQUAjoj8vqVYZIHv+xtE5MMWQ941PDy83mK8VIjIW2s2HZ2vuAKAIAgmADyxQIxWM3uu5J56DhgZGVkDYBw1nS+ApwB82VJeZAfbt82tWrXqPSgXV481UlwBwMGDB3+sqncDgIh81EZ+QBMLrKwXV5Uh5NoPYqMyN+m9nanqHVj4bsHF6InjeKfFeKmoLMUw+/2Ct6KLyOM1m2x/NmxbW30RhuGPFtp5jstGVU+JiNdqE57rEYahzB6lWOz7Fsf2be/2hYj8SeXlvTbiFYvFLwK4DOAWY8z1NmI2pcDKcnE1OjraWSgU9uPaD2LDRKSlJwavQCO2A4rIDtsxU7BxsQeoau2Jeak3BDTDL72kUm/n63neaFoJUkPYvm3G9/0NKN9gc7mrq6t2OsOSVGqPSQCuiAzaiLnsBVaWiysAuHDhwn4AQ2nEVtUfpBGXluwNKcRcaBmPVpDMfiMiW+o4pnafZM69MmYxnW9lsj9lCNs3m1T1tSjXL89aXo39WCX+62wEW9YCK+vFVcXLKcbmJcLW8qoUYmZhZOfFmvc3e563fb6djTFvwdUJxfPFyJx6O1/f999a6Xz5ZIwMYftm2o2Vv60+HUVETldeLnoUfy7LVmC1SXEFVf0YgFSeX5QkCQus9tfyIzsicnSObQ/6vj9cu71SXP1nPTGyplAo5FDT+arqk3Ecb5s9J0dV2flmENs3u0REgTmnJjRkVjwrd2Iuy3+adimuACCKotPGmC8A+GvLoZOZmZkXLMekBojIaVX9DcthTy+8S3MlSTIuIu+q2dyjqgeMMU8A+CYAUdUtAOa8izZJkvG081wG19xN5jjO4ByLTLrLlRBZxfbNrjMAICI3LrTjIlVHrqyMjKU+gtVOxVVVHMf/hHkWrGvAiawsQrlSqOqiF61rRkzbOjo6AsxfCG4G8FcAPvhLlih5qVgsWpl42kIyezcZ1YXtmy0/QvlqwG9V1i6zZRMAiIiV+dCpFljtWFwBQOUbzqcth+XlwdZjfRRGRMZsx7St8mT5zzcQ4r52+LKgqp9S1U8B+GTtZSPKPrZvdlXaagrAalU1NmJWCrVtAEqO4xyyETO1S4TtWlxVXbp06b7u7u6/BHCTjXiqygKrxYjIQ6p6L2Y9BqZB51etWtXyBRYAuK77hVKp9H5cnUxarzOu634xjZyWWxRFdzU7B0oP2zfbVPUbIrLFcZwPAfivRuOJyPtUdbWq5m09jzCVEax2L64AYGpq6rKq/qOteI7jsMBqMUEQnFXV3bbiqerdExMT52zFS1Mul7soIovugETkI7lc7mIaORERVRWLxS8BeElVb/F9v6EnR/i+f6Oq3gUAjuPYejSavQLLGKPVP4VC4Wd4ZXF1pKura7Bdiquq3t7efwfwnKVwLLBa0PT09B5U1kZp0BPFYvGzFuIsmyAI7kf5uWz1OhgEwTV3FLaoX5yLKosWLknNsZcayohsYvu2uUo98TEAUNW9vu8vad3CoaGhLlX9BoBeAONBEByxleNyLNPwWBzHOywvBtYS9u3bV1LVj1sKxwKrBU1NTV12XXcXgFMNhDmpqndkcF6SisifAzhRx76n4jh+Byzd3rwMjldfqOqSV+xPkmT2yvzH592RlhvbdwUIw3AvgAcArFPVcHBwcFHPBvZ9f0OpVDqA8qrwL8Rx/E6b+VkvsGqfZ9ROlwXnEkXRfgDfajCMXrx48Yc28iH7crncSVXdrKpPLvZYEXk6SZItURS1/PIMcwmC4KzjOCMAam9dn+0SgJ35fP4ny5SWDQ/Mer3HGLPoTtgYMyIiv3gOmqpmZfRuJWD7rgwax/G7UH7EzcYkSf7bGHNXX1/f6oUO9H1/Z+WcPoDysgw7bJ/DUl8Hq52LqwoVkb9T1WiRx8UoX158RlWfnJqaupxCbmRJFEWn+/r6buvu7v4ggI9g4Ynv50XknkKh8JkMjly9wqFDh77j+/6oqo4BqD1xXRaRPw6CwMZl1GXjuu6XSqXSOwH8LoD1AMaMMecA1PtF53WV4wCUC+menp699jOlpWD7rhz5fP5Kf3//UFdX132q+l4Ad3d3d7/fGPN1EZlQ1e/19PS8dPbs2fWu694kIgOqOqqqm4Dy4rKlUumOw4cPN3KVYk7WVkE1xsx5aSBLT+duhDEmQrkSnssZlIeXnxWRY6p6PI7j41nveFeq4eHh9XEc7xSRnQBej6t3kp5EuWh+OI7jh+dYsDDTfN/frKrjAKpPmv9pkiS7JicnH29mXku1devWV3d0dBxAuRNeMhF5ulgsjqRxgk7DfOfqxWr1czvbtzGt3r5zGRwc7FPV3ap6y0L7ishPAHx63bp1e/bt2xenkQ8LLEuMMZtE5JCqfhfAMwCeSZLkO2vWrDk+NjbGyZHUFjzP2yginwcAVX1fVi99Vo2OjnaeP3/+3SLydgBvBNBd56GXAHxXVR/s7e3dm9YJOg0rqQNm+y5dFtp3HmKM2QxgF8qr9b8GwA0AzgH4MYBjIjJ28eLFkFeOiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIhWgv8Hnffz4dmwY9cAAAAASUVORK5CYII=);background-image:linear-gradient(transparent,transparent),url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZpZXdCb3g9IjAgMCA2MDAgNjAiCiAgIGhlaWdodD0iNjAiCiAgIHdpZHRoPSI2MDAiCiAgIGlkPSJzdmc0MjI1IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJzcHJpdGVzaGVldC5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvZnB1Z2EvZGV2ZWxvcG1lbnQvdXBzdHJlYW0vaWNhcnRvLkxlYWZsZXQuZHJhdy9zcmMvaW1hZ2VzL3Nwcml0ZXNoZWV0LTJ4LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjkwIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iOTAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQyNTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MjU2IiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDU2IgogICAgIGlkPSJuYW1lZHZpZXc0MjU0IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIxLjMxMDE4NTIiCiAgICAgaW5rc2NhcGU6Y3g9IjIzNy41NjkyOCIKICAgICBpbmtzY2FwZTpjeT0iNy4yNDE5NjIxIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzQyMjUiIC8+CiAgPGcKICAgICBpZD0iZW5hYmxlZCIKICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIj4KICAgIDxnCiAgICAgICBpZD0icG9seWxpbmUiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIj4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAxOCwzNiAwLDYgNiwwIDAsLTYgLTYsMCB6IG0gNCw0IC0yLDAgMCwtMiAyLDAgMCwyIHoiCiAgICAgICAgIGlkPSJwYXRoNDIyOSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzNiwxOCAwLDYgNiwwIDAsLTYgLTYsMCB6IG0gNCw0IC0yLDAgMCwtMiAyLDAgMCwyIHoiCiAgICAgICAgIGlkPSJwYXRoNDIzMSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAyMy4xNDIsMzkuMTQ1IC0yLjI4NSwtMi4yOSAxNiwtMTUuOTk4IDIuMjg1LDIuMjg1IHoiCiAgICAgICAgIGlkPSJwYXRoNDIzMyIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDwvZz4KICAgIDxwYXRoCiAgICAgICBpZD0icG9seWdvbiIKICAgICAgIGQ9Ik0gMTAwLDI0LjU2NSA5Ny45MDQsMzkuMzk1IDgzLjA3LDQyIDc2LDI4Ljc3MyA4Ni40NjMsMTggWiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJyZWN0YW5nbGUiCiAgICAgICBkPSJtIDE0MCwyMCAyMCwwIDAsMjAgLTIwLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJjaXJjbGUiCiAgICAgICBkPSJtIDIyMSwzMCBjIDAsNi4wNzggLTQuOTI2LDExIC0xMSwxMSAtNi4wNzQsMCAtMTEsLTQuOTIyIC0xMSwtMTEgMCwtNi4wNzQgNC45MjYsLTExIDExLC0xMSA2LjA3NCwwIDExLDQuOTI2IDExLDExIHoiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0ibWFya2VyIgogICAgICAgZD0ibSAyNzAsMTkgYyAtNC45NzEsMCAtOSw0LjAyOSAtOSw5IDAsNC45NzEgNS4wMDEsMTIgOSwxNCA0LjAwMSwtMiA5LC05LjAyOSA5LC0xNCAwLC00Ljk3MSAtNC4wMjksLTkgLTksLTkgeiBtIDAsMTIuNSBjIC0yLjQ4NCwwIC00LjUsLTIuMDE0IC00LjUsLTQuNSAwLC0yLjQ4NCAyLjAxNiwtNC41IDQuNSwtNC41IDIuNDg1LDAgNC41LDIuMDE2IDQuNSw0LjUgMCwyLjQ4NiAtMi4wMTUsNC41IC00LjUsNC41IHoiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBpZD0iZWRpdCIKICAgICAgIHN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDMzNywzMC4xNTYgMCwwLjQwNyAwLDUuNjA0IGMgMCwxLjY1OCAtMS4zNDQsMyAtMywzIGwgLTEwLDAgYyAtMS42NTUsMCAtMywtMS4zNDIgLTMsLTMgbCAwLC0xMCBjIDAsLTEuNjU3IDEuMzQ1LC0zIDMsLTMgbCA2LjM0NSwwIDMuMTksLTMuMTcgLTkuNTM1LDAgYyAtMy4zMTMsMCAtNiwyLjY4NyAtNiw2IGwgMCwxMCBjIDAsMy4zMTMgMi42ODcsNiA2LDYgbCAxMCwwIGMgMy4zMTQsMCA2LC0yLjY4NyA2LC02IGwgMCwtOC44MDkgLTMsMi45NjgiCiAgICAgICAgIGlkPSJwYXRoNDI0MCIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzMzguNzIsMjQuNjM3IC04Ljg5Miw4Ljg5MiAtMi44MjgsMCAwLC0yLjgyOSA4Ljg5LC04Ljg5IHoiCiAgICAgICAgIGlkPSJwYXRoNDI0MiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzMzguNjk3LDE3LjgyNiA0LDAgMCw0IC00LDAgeiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoLTAuNzA2OTgzMzYsLTAuNzA3MjMwMTgsMC43MDcyMzAxOCwtMC43MDY5ODMzNiw1NjcuNTU5MTcsMjc0Ljc4MjczKSIKICAgICAgICAgaWQ9InBhdGg0MjQ0IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIiAvPgogICAgPC9nPgogICAgPGcKICAgICAgIGlkPSJyZW1vdmUiCiAgICAgICBzdHlsZT0iZmlsbDojNDY0NjQ2O2ZpbGwtb3BhY2l0eToxIj4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSAzODEsNDIgMTgsMCAwLC0xOCAtMTgsMCAwLDE4IHogbSAxNCwtMTYgMiwwIDAsMTQgLTIsMCAwLC0xNCB6IG0gLTQsMCAyLDAgMCwxNCAtMiwwIDAsLTE0IHogbSAtNCwwIDIsMCAwLDE0IC0yLDAgMCwtMTQgeiBtIC00LDAgMiwwIDAsMTQgLTIsMCAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDQyNDciCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiM0NjQ2NDY7ZmlsbC1vcGFjaXR5OjEiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Im0gMzk1LDIwIDAsLTQgLTEwLDAgMCw0IC02LDAgMCwyIDIyLDAgMCwtMiAtNiwwIHogbSAtMiwwIC02LDAgMCwtMiA2LDAgMCwyIHoiCiAgICAgICAgIGlkPSJwYXRoNDI0OSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ2NDY0NjtmaWxsLW9wYWNpdHk6MSIgLz4KICAgIDwvZz4KICA8L2c+CiAgPGcKICAgICBpZD0iZGlzYWJsZWQiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIwLDApIgogICAgIHN0eWxlPSJmaWxsOiNiYmJiYmIiPgogICAgPHVzZQogICAgICAgeGxpbms6aHJlZj0iI2VkaXQiCiAgICAgICBpZD0iZWRpdC1kaXNhYmxlZCIKICAgICAgIHg9IjAiCiAgICAgICB5PSIwIgogICAgICAgd2lkdGg9IjEwMCUiCiAgICAgICBoZWlnaHQ9IjEwMCUiIC8+CiAgICA8dXNlCiAgICAgICB4bGluazpocmVmPSIjcmVtb3ZlIgogICAgICAgaWQ9InJlbW92ZS1kaXNhYmxlZCIKICAgICAgIHg9IjAiCiAgICAgICB5PSIwIgogICAgICAgd2lkdGg9IjEwMCUiCiAgICAgICBoZWlnaHQ9IjEwMCUiIC8+CiAgPC9nPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzQ2NDY0NjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJjaXJjbGUtMyIKICAgICBkPSJtIDU4MS42NTcyNSwzMCBjIDAsNi4wNzggLTQuOTI2LDExIC0xMSwxMSAtNi4wNzQsMCAtMTEsLTQuOTIyIC0xMSwtMTEgMCwtNi4wNzQgNC45MjYsLTExIDExLC0xMSA2LjA3NCwwIDExLDQuOTI2IDExLDExIHoiCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KPC9zdmc+Cg==)}.leaflet-draw a{display:block;text-align:center;text-decoration:none}.leaflet-draw a .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.leaflet-draw-actions{display:none;list-style:none;margin:0;padding:0;position:absolute;left:26px;top:0;white-space:nowrap}.leaflet-touch .leaflet-draw-actions{left:32px}.leaflet-right .leaflet-draw-actions{right:26px;left:auto}.leaflet-touch .leaflet-right .leaflet-draw-actions{right:32px;left:auto}.leaflet-draw-actions li{display:inline-block}.leaflet-draw-actions li:first-child a{border-left:none}.leaflet-draw-actions li:last-child a{-webkit-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.leaflet-right .leaflet-draw-actions li:last-child a{-webkit-border-radius:0;border-radius:0}.leaflet-right .leaflet-draw-actions li:first-child a{-webkit-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.leaflet-draw-actions a{background-color:#919187;border-left:1px solid #aaa;color:#fff;font:11px/19px "Helvetica Neue",Arial,Helvetica,sans-serif;line-height:28px;text-decoration:none;padding-left:10px;padding-right:10px;height:28px}.leaflet-touch .leaflet-draw-actions a{font-size:12px;line-height:30px;height:30px}.leaflet-draw-actions-bottom{margin-top:0}.leaflet-draw-actions-top{margin-top:1px}.leaflet-draw-actions-bottom a,.leaflet-draw-actions-top a{height:27px;line-height:27px}.leaflet-draw-actions a:hover{background-color:#a0a098}.leaflet-draw-actions-top.leaflet-draw-actions-bottom a{height:26px;line-height:26px}.leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:-2px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:0 -1px}.leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-31px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-29px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-62px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-60px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-92px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-90px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-122px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-120px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-circlemarker{background-position:-273px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circlemarker{background-position:-271px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-152px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-150px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-182px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-180px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-212px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-210px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-242px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-240px -2px}.leaflet-mouse-marker{background-color:#fff;cursor:crosshair}.leaflet-draw-tooltip{background:#363636;background:rgba(0,0,0,.5);border:1px solid transparent;-webkit-border-radius:4px;border-radius:4px;color:#fff;font:12px/18px "Helvetica Neue",Arial,Helvetica,sans-serif;margin-left:20px;margin-top:-21px;padding:4px 8px;position:absolute;visibility:hidden;white-space:nowrap;z-index:6}.leaflet-draw-tooltip:before{border-right:6px solid #000;border-right-color:rgba(0,0,0,.5);border-top:6px solid transparent;border-bottom:6px solid transparent;content:"";position:absolute;top:7px;left:-7px}.leaflet-error-draw-tooltip{background-color:#f2dede;border:1px solid #e6b6bd;color:#b94a48}.leaflet-error-draw-tooltip:before{border-right-color:#e6b6bd}.leaflet-draw-tooltip-single{margin-top:-12px}.leaflet-draw-tooltip-subtext{color:#f8d5e4}.leaflet-draw-guide-dash{font-size:1%;opacity:.6;position:absolute;width:5px;height:5px}.leaflet-edit-marker-selected{background-color:rgba(254,87,161,.1);border:4px dashed rgba(254,87,161,.6);-webkit-border-radius:4px;border-radius:4px;box-sizing:content-box}.leaflet-edit-move{cursor:move}.leaflet-edit-resize{cursor:pointer}.leaflet-oldie .leaflet-draw-toolbar{border:1px solid #999}
--- a/src/pyams_gis/resources/css/leaflet-gp-3.0.2.css	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3190 +0,0 @@
-/*!
- * @brief Geoportal Extension for Leaflet
- *
- * This software is released under the licence CeCILL-B (Free BSD compatible)
- * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
- * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
- * @see http://www.cecill.info/
- *
- * copyright CeCILL-B
- * copyright IGN
- * @author IGN
- * @version 0.8.1
- * @date 2016-12-02
- *
- */
-/* MOUSE POSITION */
-
-/* Showing/hiding drawing panel */
-
-label[id^=GPshowDrawingPicto-] {
-  display: inline-block;
-}
-
-input[id^=GPshowDrawing-] + label {
-  display: block;
-}
-
-input[id^=GPshowDrawing-]:checked + label {
-  display: none;
-}
-
-input[id^=GPshowDrawing-] + label + div {
-  display: none;
-}
-
-input[id^=GPshowDrawing-]:checked + label + div {
-  display: block;
-}
-
-/* General panels */
-
-div[^=GPdrawingPanel-] {
-  width: 240px;
-  overflow: hidden;
-}
-
-/* Basic infos */
-
-div[^=GPdrawingBasicPanel-] {
-  padding: 10px 15px;
-}
-
-.GPdrawingLabel,
-.GPdrawingCoords {
-  display: inline-block;
-  line-height: 20px;
-}
-
-.GPdrawingLabel {
-  width: 80px;
-  font-weight: bold;
-}
-
-.GPdrawingCoords {
-  width: 110px;
-}
-
-/* markers selector */
-.marker-input-radio {
-  display : none ;
-}
-
-input.marker-input-radio:checked + label {
-  border: 1px solid red;
-}
-
-
-/* Calc waiting */
-
-.GPelevationPathCalcWaitingContainerVisible,
-.GPelevationPathCalcWaitingContainerHidden {
-  position: absolute;
-  top: 32px;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  background-color: rgba(255,255,255,0.9);
-  font-size: 1.5em;
-  font-weight: bold;
-  overflow: hidden;
-}
-
-.GPelevationPathCalcWaitingContainerVisible {
-  display: -webkit-flex;
-  display: flex;
-}
-
-.GPelevationPathCalcWaitingContainerHidden {
-  display: none;
-}
-
-.GPelevationPathCalcWaiting {
-  margin: auto;
-}
-
-.GPelevationPathCalcWaitingContainerVisible,
-.GPelevationPathCalcWaitingContainerHidden {
-  border-radius: 5px;
-}
-
-/* CSS : Raw */
-
-#profileElevationRaw {
-  resize: none;
-  padding: unset;
-}
-
-/* CSS : default */
-
-/* suppression des puces sur les listes */
-div#profileElevationByDefault {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: -webkit-box;
-  display: flex;
-  flex-direction: column;
-  /*flex-flow: row wrap;*/
-  height: inherit;
-  width: inherit;
-}
-
-div#profileElevationByDefault > * {
-  -webkit-flex: 1;
-  -webkit-box-flex: 1;
-      -ms-flex: 1;
-          flex: 1 100%;
-}
-
-ul#data-default {
-    list-style: none;
-    box-sizing: border-box;
-    padding: 0px;
-    position : relative;
-    margin : 10px;
-    margin-top: auto;
-    margin-bottom: auto;
-    height: 100px;
-    /*width: 100%*/
-}
-
-.z-title-vertical {
-  align-self: flex-start;
-  padding-left: 10px;
-  /*position: absolute;*/
-  /*transform: rotate(-90deg);*/
-}
-
-.x-title-horizontal {
-  align-self: flex-end;
-  padding-right: 10px;
-  /*position: absolute;*/
-  /*transform: translate(120px, -30px);*/
-}
-
-.z-axis {
-    border-right: none;
-    border-left: solid 2px;
-    cursor: default;
-}
-
-.x-axis {
-    border-top: none;
-    border-bottom: solid 2px;
-    cursor: default;
-}
-
-ul#data-default li.percent {
-    display: inline-block;
-    vertical-align: bottom;
-    background-color: #C77A04;
-    opacity : 0.3;
-    border-top: solid 1px;
-    border-radius: 2px;
-    cursor: pointer;
-}
-
-li.axe span.bottom-axis {
-    vertical-align: bottom;
-}
-
-ul#data-default .percent:hover {
-    display: inline-block;
-    /*vertical-align: bottom;*/
-    background-color: #f00;
-}
-
-.v0 { height: 0%; }
-.v1 { height: 1%; }
-.v2 { height: 2%; }
-.v3 { height: 3%; }
-.v4 { height: 4%; }
-.v5 { height: 5%; }
-.v6 { height: 6%; }
-.v7 { height: 7%; }
-.v8 { height: 8%; }
-.v9 { height: 9%; }
-.v10 { height: 10%; }
-.v11 { height: 11%; }
-.v12 { height: 12%; }
-.v13 { height: 13%; }
-.v14 { height: 14%; }
-.v15 { height: 15%; }
-.v16 { height: 16%; }
-.v17 { height: 17%; }
-.v18 { height: 18%; }
-.v19 { height: 19%; }
-.v20 { height: 20%; }
-.v21 { height: 21%; }
-.v22 { height: 22%; }
-.v23 { height: 23%; }
-.v24 { height: 24%; }
-.v25 { height: 25%; }
-.v26 { height: 26%; }
-.v27 { height: 27%; }
-.v28 { height: 28%; }
-.v29 { height: 29%; }
-.v30 { height: 30%; }
-.v31 { height: 31%; }
-.v32 { height: 32%; }
-.v33 { height: 33%; }
-.v34 { height: 34%; }
-.v35 { height: 35%; }
-.v36 { height: 36%; }
-.v37 { height: 37%; }
-.v38 { height: 38%; }
-.v39 { height: 39%; }
-.v40 { height: 40%; }
-.v41 { height: 41%; }
-.v42 { height: 42%; }
-.v43 { height: 43%; }
-.v44 { height: 44%; }
-.v45 { height: 45%; }
-.v46 { height: 46%; }
-.v47 { height: 47%; }
-.v48 { height: 48%; }
-.v49 { height: 49%; }
-.v50 { height: 50%; }
-.v51 { height: 51%; }
-.v52 { height: 52%; }
-.v53 { height: 53%; }
-.v54 { height: 54%; }
-.v55 { height: 55%; }
-.v56 { height: 56%; }
-.v57 { height: 57%; }
-.v58 { height: 58%; }
-.v59 { height: 59%; }
-.v60 { height: 60%; }
-.v61 { height: 61%; }
-.v62 { height: 62%; }
-.v63 { height: 63%; }
-.v64 { height: 64%; }
-.v65 { height: 65%; }
-.v66 { height: 66%; }
-.v67 { height: 67%; }
-.v68 { height: 68%; }
-.v69 { height: 69%; }
-.v70 { height: 70%; }
-.v71 { height: 71%; }
-.v72 { height: 72%; }
-.v73 { height: 73%; }
-.v74 { height: 74%; }
-.v75 { height: 75%; }
-.v76 { height: 76%; }
-.v77 { height: 77%; }
-.v78 { height: 78%; }
-.v79 { height: 79%; }
-.v80 { height: 80%; }
-.v81 { height: 81%; }
-.v82 { height: 82%; }
-.v83 { height: 83%; }
-.v84 { height: 84%; }
-.v85 { height: 85%; }
-.v86 { height: 86%; }
-.v87 { height: 87%; }
-.v88 { height: 88%; }
-.v89 { height: 89%; }
-.v90 { height: 90%; }
-.v91 { height: 91%; }
-.v92 { height: 92%; }
-.v93 { height: 93%; }
-.v94 { height: 94%; }
-.v95 { height: 95%; }
-.v96 { height: 96%; }
-.v97 { height: 97%; }
-.v98 { height: 98%; }
-.v99 { height: 99%; }
-.v100 { height: 100%; }
-
-/* CSS : D3 */
-
-text {
-  fill: rgb(94, 94, 94);
-  font-family: Verdana;
-  font-size: 10px;
-  opacity: 1;
-  text-anchor: end;
-}
-
-.axis-d3 {
-  fill: none;
-  stroke: #5E5E5E;
-  stroke-width: 1;
-  shape-rendering: crispEdges;
-}
-
-.area-d3 {
-  fill: #C77A04;
-  stroke: #5E5E5E;
-  stroke-width: 0;
-  fill-opacity: 0.4;
-}
-
-.line-d3 {
-  fill: none;
-  stroke: #C77A04;
-  stroke-width: 1px;
-}
-
-.grid-d3 .tick {
-  stroke: lightgrey;
-  opacity: 0.7;
-}
-
-.grid-d3 path {
-  stroke-width: 0;
-}
-
-.grid-d3 .tick {
-  stroke: lightgrey;
-  opacity: 0.7;
-}
-
-.grid-d3 path {
-  stroke-width: 0;
-}
-
-.overlay-d3 {
-  fill: none;
-  pointer-events: all;
-}
-
-.focusLine-d3 {
-  fill: none;
-  stroke: #C77A04;
-  stroke-width: 0.5px;
-}
-
-.focusCircle-d3 {
-  fill: #C77A04;
-}
-
-div.tooltip-d3 {
-    position: inherit;;
-    text-align: left;
-    width: 80px;
-    height: 35px;
-    padding: 2px;
-    font: 8px sans-serif;
-    background: lightsteelblue;
-    border: 0px;
-    border-radius: 8px;
-    pointer-events: none;
-}
-
-/* Widgets : general */
-
-.GPwidget {
-  position: absolute;
-  font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;
-  font-size: 13px;
-  color: #333;
-}
-
-.GPwidget input[type='text'],
-.GPwidget input[type='button'] {
-  -webkit-appearance: none;
-  color: #333333;
-}
-
-.GPwidget input[type="checkbox"] {
-  display: none;
-}
-
-.GPwidget select {
-  padding-left: 3px;
-  border-radius: 3px;
-}
-
-.GPwidget form {
-  margin-bottom: 0;
-}
-
-.GPwidget * {
-  box-sizing: border-box;
-  background-repeat: no-repeat;
-}
-
-/* waiting */
-
-.GPwaiting {
-    background-image : url("../img/gp/waiting.gif");
-    background-position : center center;
-    background-repeat : no-repeat;
-}
-
-/* General panels */
-
-.GPpanel {
-  background-color: #FFF;
-}
-
-.GPpanelHeader {
-  position: relative;
-  width: 100%;
-}
-
-.GPpanelTitle {
-  width: 100%;
-  height: 100%;
-  text-align: center;
-  font-weight: bold;
-}
-
-.GPpanelClose, .GPpanelReduce {
-  position: absolute;
-  cursor: pointer;
-}
-
-/* Showing/hiding advanced panels */
-
-.GPshowAdvancedToolPicto {
-  position: relative;
-  box-sizing: border-box;
-  cursor: pointer;
-}
-
-.GPshowAdvancedToolOpen {
-  position: absolute;
-  display: block;
-  box-sizing: border-box;
-}
-
-/* Flex inputs */
-
-.GPflexInput {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: -webkit-box;
-  display: flex;
-  transition: max-height 0.3s ease-out, opacity 0.3s ease-out;
-}
-
-.GPflexInput > * {
-  display: block;
-  height: 28px;
-  line-height: 26px;
-  border: 1px solid #999;
-  border-radius: 0;
-}
-
-.GPflexInput *:not(:last-child) {
-  border-right:none;
-}
-
-.GPflexInput *:first-child {
-  border-radius: 3px 0 0 3px;
-}
-
-.GPflexInput *:last-child {
-  border-radius: 0 3px 3px 0;
-}
-
-.GPflexInput > *:not(input) {
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-}
-
-.GPflexInput > input {
-  -webkit-flex: 1;
-  -webkit-box-flex: 1;
-      -ms-flex: 1;
-          flex: 1;
-  padding: 0 5px;
-  min-width: 0;
-}
-
-.GPflexInput > select {
-  -webkit-flex: 1;
-  -webkit-box-flex: 1;
-      -ms-flex: 1;
-          flex: 1;
-  padding-right: 7px;
-}
-
-.GPflexInput > label {
-  background-color:  #F2F2F2;
-  color: #666;
-  padding-left: 7px;
-  padding-right: 9px;
-  cursor: pointer;
-}
-
-/* Particular inputs */
-
-.GPinputSelect {
-  display: block;
-  height: 28px;
-  line-height: 26px;
-  margin: auto;
-  border: 1px solid #999;
-  color: #333;
-  cursor: pointer;
-}
-
-input.GPinputSubmit {
-  display: block;
-  width: 80px;
-  margin: auto;
-  height: 28px;
-  line-height: 26px;
-  padding: 0;
-  background: none;
-  border: none;
-  border-radius: 3px;
-  font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;
-  color: #FFF;
-  font-weight: bold;
-  opacity: 0.8;
-  transition: opacity 0.2s ease-out;
-  cursor: pointer;
-}
-
-input.GPinputSubmit:hover {
-  opacity: 1;
-}
-
-/* Autocomplete/geocode results */
-
-.GPautoCompleteList,
-.GPadvancedAutoCompleteList {
-  z-index: 2;
-  display: none;
-  position: absolute;
-  max-height: 140px;
-  background-color: #FFF;
-  border: 1px solid #999;
-  overflow-y: hidden;
-}
-
-.GPadvancedAutoCompleteList {
-  width: calc(100% - 28px);
-  border-top: none;
-  font-size: 0.9em;
-}
-
-.GPautoCompleteProposal {
-  width: 100%;
-  height: 28px;
-  line-height: 16px;
-  padding: 6px 10px;
-  color: #5E5E5E;
-  font-size: 1.0em;
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow:ellipsis;
-  cursor: pointer;
-}
-
-.GPautoCompleteProposal:hover {
-  color: #000000;
-  background-color: #CEDBEF
-}
-
-/* Showing additional hidden options */
-
-.GPshowMoreOptions {
-  display: block;
-  position: absolute;
-  width: 28px;
-  height: 28px;
-  cursor: pointer;
-  transition: all 0.5s ease-out 0s;
-}
-
-input[type="checkbox"]:checked + .GPshowMoreOptions {
-  -webkit-transform: rotateX(180deg);
-  transform: rotateX(180deg);
-}
-
-/* ISOCHRON */
-
-div[id^=GPisochron-] {
-  top: 140px;
-}
-
-/* Showing/hiding mouse position panel */
-
-label[id^=GPshowIsochronPicto] {
-  display: inline-block;
-}
-
-input[id^=GPshowIsochron-] + label {
-  display: block;
-}
-
-input[id^=GPshowIsochron-]:checked + label {
-  display: none;
-}
-
-input[id^=GPshowIsochron-] + label + div {
-  display: none;
-}
-
-input[id^=GPshowIsochron-]:checked + label + div {
-  display: block;
-}
-
-/* General panels */
-
-div[id^=GPisochronPanel-] {
-  width: 280px;
-}
-
-/* Calc waiting */
-
-.GPisochronCalcWaitingContainerVisible,
-.GPisochronCalcWaitingContainerHidden {
-  position: absolute;
-  top: 32px;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  background-color: rgba(255,255,255,0.9);
-  font-size: 1.5em;
-  font-weight: bold;
-  overflow: hidden;
-}
-
-.GPisochronCalcWaitingContainerVisible {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: -webkit-box;
-  display: flex;
-}
-
-.GPisochronCalcWaitingContainerHidden {
-  display: none;
-}
-
-.GPisochronCalcWaiting {
-  margin: auto;
-}
-
-/* Isochron form */
-
-form[id^=GPisochronForm] {
-  padding: 15px;
-}
-
-.GPisochronFormMini {
-  max-height: 58px;
-  overflow: hidden;
-}
-
-.GPisochronFormMini div[id^="GPisochronReset-"],
-.GPisochronFormMini label[id^="GPshowIsoExclusionsPicto-"] {
-    display: none;
-}
-
-.GPisochronOriginVisible {
-  display: block;
-}
-
-.GPisochronOriginHidden {
-  display: none;
-}
-
-.GPisochronOriginPointerImg {
-  width: 28px;
-  background-color: #F2F2F2;
-  cursor: pointer;
-}
-
-input[id^="GPisochronOriginPointer"] + .GPisochronOriginPointerImg {
-  background-position: -1px -1px;
-}
-
-input[id^="GPisochronOriginPointer"]:checked + .GPisochronOriginPointerImg {
-  background-position: -29px -1px;
-}
-
-input[id^=GPisochronSubmit] {
-  margin-top: 5px;
-}
-
-/* Alternative choice */
-
-div[id^=GPisochronChoice] {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: -webkit-box;
-  display: flex;
-  width: 160px;
-  -webkit-justify-content: space-between;
-  -webkit-box-pack: justify;
-      -ms-flex-pack: justify;
-          justify-content: space-between;
-  margin: auto;
-  margin-top: 15px;
-  margin-bottom: 5px;
-}
-
-.GPisochronChoiceAlt input {
-  display: none;
-}
-
-.GPisochronChoiceAltImg {
-  display: block;
-  width: 28px;
-  height: 28px;
-  margin: auto;
-  cursor: pointer;
-}
-
-input[id^=GPisochronChoiceAltChron] + .GPisochronChoiceAltImg {
-  background-position: -56px 0;
-}
-
-input[id^=GPisochronChoiceAltChron]:checked + .GPisochronChoiceAltImg {
-  background-position: -84px 0;
-}
-
-input[id^=GPisochronChoiceAltDist] + .GPisochronChoiceAltImg {
-  background-position: -112px 0;
-}
-
-input[id^=GPisochronChoiceAltDist]:checked + .GPisochronChoiceAltImg {
-  background-position: -140px 0;
-}
-
-.GPisochronChoiceAlt span {
-  cursor: pointer;
-  display:block;
-  color: #999;
-}
-
-.GPisochronValueHidden {
-  display: none;
-}
-
-div[id^=GPisochronValueChron],
-div[id^=GPisochronValueDist] {
-  width: 220px;
-  margin: auto;
-}
-
-/* Mode choice */
-
-div[id^=GPisochronModeChoice] {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: -webkit-box;
-  display: flex;
-  -webkit-justify-content: space-between;
-  -webkit-box-pack: justify;
-      -ms-flex-pack: justify;
-          justify-content: space-between;
-  margin: 15px 0;
-}
-
-.GPisochronModeLabel {
-  display: block;
-  text-align: center;
-  margin-bottom: 5px;
-}
-
-div[id^=GPisochronTransportChoice] input {
-  display: none;
-}
-
-.GPisochronTransportImg {
-  display: inline-block;
-  width: 28px;
-  height: 28px;
-  cursor: pointer;
-}
-
-.GPisochronTransportImg:first-of-type {
-    margin-left: 18px;
-    margin-right: 10px;
-}
-
-input[id^=GPisochronTransportCar] + .GPisochronTransportImg {
-  background-position: -168px 0;
-}
-
-input[id^=GPisochronTransportCar]:checked + .GPisochronTransportImg {
-  background-position: -196px 0;
-}
-
-input[id^=GPisochronTransportPedestrian] + .GPisochronTransportImg {
-  background-position: -224px 0;
-}
-
-input[id^=GPisochronTransportPedestrian]:checked + .GPisochronTransportImg {
-  background-position: -252px 0;
-}
-
-select[id^=GPisochronDirectionSelect] {
-  width: 80px;
-}
-
-/* Showing/hiding exclusions */
-
-input[id^=GPshowIsoExclusions] {
-  display: none;
-}
-
-.GPshowIsoExclusionsPicto {
-  top: 250px;
-  right: 0;
-  transition: all 0.5s ease-out 0s;
-}
-
-input[id^=GPshowIsoExclusions] + label + div[id^=GPisoExclusions] {
-  max-height: 0;
-  opacity: 0;
-  margin-bottom: 0;
-}
-
-input[id^=GPshowIsoExclusions]:checked + label + div[id^=GPisoExclusions] {
-  display: block;
-  max-height: 60px;
-  opacity: 1;
-  margin-bottom: 15px;
-}
-
-/* Exclusions */
-
-div[id^=GPisoExclusions] {
-  transition: max-height 0.5s ease-in-out 0.25s, opacity 0.5s ease-in-out 0.25s, margin 0.3s ease-in-out 0.25s;
-  overflow: hidden;
-}
-
-.GPisoExclusionsLabel {
-  display: block;
-  text-align: center;
-  margin-bottom: 10px;
-  font-weight: bold;
-  line-height: 16px;
-}
-
-.GPisoExclusionsOptions {
-  display: -webkit-flex;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-justify-content: space-around;
-  -ms-flex-pack: distribute;
-  justify-content: space-around;
-}
-
-.GPisoExclusionsOption {
-  display: block;
-  height: 28px;
-  line-height: 26px;
-  color: #A77;
-  background-color: #FEE;
-  padding-left: 28px;
-  padding-right: 5px;
-  border: 1px solid #A77;
-  border-radius: 3px;
-  cursor: pointer;
-}
-
-input:checked + .GPisoExclusionsOption {
-  background-color: #EFE;
-  background-position: 0 -28px;
-  color: #797;
-  border: 1px solid #797;
-}
-
-/* Reset picto */
-div[id^=GPisochronReset] {
-  position: absolute;
-  margin-top: 5px;
-  width: 28px;
-  height: 28px;
-  border-radius: 3px;
-  opacity: 0.8;
-  background-position: -281px 0;
-  transition: opacity 0.2s ease-out;
-  cursor: pointer;
-}
-
-div[id^=GPisochronReset]:hover {
-  opacity: 1;
-}
-
-/* LAYER SWITCHER */
-
-#GPlayerSwitcher {
-  font-size: 11px;
-}
-
-#GPlayerSwitcher [draggable] {
-  -moz-user-select: none;
-  -khtml-user-select: none;
-  -webkit-user-select: none;
-  user-select: none;
-  /* Required to make elements draggable in old WebKit */
-  -khtml-user-drag: element;
-  -webkit-user-drag: element;
-}
-
-/* Manage opening of the components through hiden checkboxes */
-
-#GPlayerSwitcher input[type="checkbox"] + div,
-#GPlayerSwitcher input[type="checkbox"] + label + div {
-  max-height: 0px;
-}
-
-#GPlayerSwitcher label {
-  display: block;
-}
-
-/* Showing/hiding layers list */
-
-#GPshowLayersListPicto {
-  position: relative;
-  float: right;
-  display: block;
-  opacity: 1;
-  transition: opacity 0.5s ease-out 0s, box-shadow  0.5s ease-out 0s, border  0.5s ease-out 0s, border-radius  0.5s ease-out 0s;
-  cursor: pointer;
-}
-
-#GPshowLayersListOpen,
-#GPshowLayersListClose {
-  position: absolute;
-  display: block;
-  transition: border-radius 0.5s ease-out 0s, opacity 0.5s ease-out 0s;
-}
-
-#GPshowLayersListOpen {
-  background-position: 0 0;
-  opacity: 1;
-}
-
-#GPshowLayersListClose {
-  opacity: 0;
-}
-
-#GPlayerSwitcher input[type="checkbox"]:checked + div + #GPshowLayersListPicto {
-  border-top-left-radius: 0;
-  border-top-right-radius: 0;
-}
-
-#GPlayerSwitcher input[type="checkbox"]:checked + div + #GPshowLayersListPicto #GPshowLayersListClose {
-  opacity: 1;
-}
-
-/* Layers list */
-
-#GPlayersList {
-  position: relative;
-  width: 180px;
-  border-bottom-right-radius: 0;
-  opacity: 0;
-  overflow: auto;
-  transition: max-height 0.5s ease-out 0s, opacity 0.5s ease-out 0.25s;
-}
-
-#GPlayerSwitcher input[type="checkbox"]:checked + #GPlayersList {
-  max-height: 232px;
-  opacity: 1;
-  transition: max-height 0.5s ease-in 0s, opacity 0.25s ease-in 0s;
-}
-
-/* Layer : general */
-
-.GPlayerSwitcher_layer {
-  position: relative;
-  top: 0;
-  background-color: #FFF;
-  border-bottom: 1px dotted #CCC;
-  overflow: hidden;
-}
-
-#GPlayersList .GPlayerSwitcher_layer:last-child {
-  border-bottom: none;
-}
-
-.GPlayerBasicTools,
-.GPlayerAdvancedTools {
-  position: relative;
-  width: 100%;
-  height: 28px;
-}
-
-.GPlayerVisibility,
-.GPlayerInfo,
-.GPlayerInfoOpened,
-.GPlayerRemove {
-  width: 28px;
-  height: 28px;
-  cursor: pointer;
-}
-
-.GPlayerVisibility,
-.GPlayerName,
-.GPlayerInfo,
-.GPlayerInfoOpened,
-.GPlayerRemove,
-.GPlayerOpacity,
-.GPlayerOpacityValue {
-  position: absolute;
-  top: 0;
-}
-
-.GPghostLayer {
-  opacity: 0;
-}
-
-/* Layer basic tools */
-
-.GPlayerBasicTools {
-  background-color: #FFF;
-}
-
-.GPlayerVisibility {
-  left: 0;
-  background-position: -28px 0;
-}
-
-input[type="checkbox"]:checked + .GPlayerVisibility {
-  background-position: 0 0;
-}
-
-.GPlayerName {
-  left: 28px;
-  width: calc(100% - 56px);
-  line-height: 28px;
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  padding-left: 4px;
-  cursor: move;
-}
-
-.outOfRange .GPlayerName {
-  color: #AAA;
-}
-
-/* Showing layer advanced tools */
-
-.GPshowLayerAdvancedTools {
-  top: 0;
-  right: 0;
-  background-position: -112px 0;
-}
-
-.GPlayerAdvancedTools {
-  display: block;
-  max-height: 0;
-  opacity: 0;
-  transition: max-height 0.5s ease-out 0s, opacity 0.5s ease-out 0s;
-}
-
-#GPlayerSwitcher input[type="checkbox"]:checked + label + .GPlayerAdvancedTools {
-  max-height: 28px;
-  opacity: 1;
-}
-
-/* Layer advanced tools */
-
-.GPlayerInfo {
-  left: 0;
-  background-position: -55px 0;
-}
-
-.GPlayerInfoOpened {
-  left: 0;
-  background-position: -83px 0;
-}
-
-.GPlayerOpacity {
-  left: 28px;
-  width: calc(100% - 100px);
-  height: 28px;
-  padding-left: 8px;
-}
-
-.GPlayerOpacityValue {
-  width: 32px;
-  left: calc(100% - 60px);
-  line-height: 28px;
-  font-size: 10px;
-  font-style: italic;
-  cursor: default;
-}
-
-.GPlayerRemove {
-  right: 0;
-  background-position: -140px 0;
-}
-
-/* Opacity slider : general */
-
-.GPlayerOpacity input {
-  -webkit-appearance: none;
-  -moz-appearance: none;
-  background: none;
-  display: block;
-  width: 100%;
-  height: 100%;
-  margin: 0;
-  padding: 0;
-  overflow: hidden;
-  cursor: pointer;
-}
-
-.GPlayerOpacity input[type="range"]:focus {
-  box-shadow: none;
-  outline: none;
-}
-
-/* Opacity slider : Chrome, Safari, Opera */
-
-.GPlayerOpacity input[type="range"]::-webkit-slider-runnable-track {
-  -webkit-appearance: none;
-  height: 3px;
-}
-
-.GPlayerOpacity input[type="range"]::-webkit-slider-thumb:before {
-  position: absolute;
-  top: 0;
-  right: 50%;
-  left: -200px;
-  height: 3px;
-  pointer-events: none;
-}
-
-.GPlayerOpacity input[type="range"]::-webkit-slider-thumb {
-  width: 9px;
-  height: 17px;
-  -webkit-appearance: none;
-  border: 2px solid #FFF;
-  background-color: #505050;
-  position: relative;
-  top: -7px;
-}
-
-/* Opacity slider : Firefox */
-
-.GPlayerOpacity input[type="range"]::-moz-range-track {
-  width: 80px;
-  height: 3px;
-}
-
-.GPlayerOpacity input[type="range"]::-moz-range-thumb {
-  width: 5px;
-  height: 13px;
-  border: 2px solid #FFF;
-  border-radius: 0;
-  box-shadow: 0;
-  background-color: #505050;
-  position: relative;
-}
-
-/* Opacity slider : IE */
-
-.GPlayerOpacity input[type="range"]::-ms-track {
-  border: 0;
-  border-color: transparent;
-  border-radius: 0;
-  border-width: 0;
-  color: transparent;
-  height: 3px;
-  width: 80px;
-}
-
-.GPlayerOpacity input[type="range"]::-ms-fill-lower,
-.GPlayerOpacity input[type="range"]::-ms-fill-upper {
-  background: transparent;
-  border-radius: 0;
-}
-
-.GPlayerOpacity input[type="range"]::-ms-thumb {
-  width: 5px;
-  height: 13px;
-  border: 2px solid #FFF;
-  background-color: #505050;
-}
-
-.GPlayerOpacity input[type="range"]::-ms-tooltip {
-  display: none;
-}
-
-/* Layer info panel */
-
-#GPlayerInfoPanel {
-  position: absolute;
-  top: 0;
-  overflow-y: hidden;
-  padding-top: 10px;
-  padding-bottom: 10px;
-}
-
-.GPlayerInfoPanelOpened {
-  display: block;
-}
-
-.GPlayerInfoPanelClosed {
-  display: none;
-}
-
-#GPlayerInfoContent {
-  position: relative;
-  width: 280px;
-  max-height: 200px;
-  overflow-y: auto;
-  padding-left: 10px;
-  padding-right: 10px;
-}
-
-#GPlayerInfoTitle {
-  width: calc(100% - 52px);
-  margin: auto;
-  margin-bottom: 10px;
-  padding-bottom: 5px;
-  text-align: center;
-  font-size: 1.1em;
-  font-weight: bold;
-}
-
-#GPlayerInfoQuicklook {
-  position: absolute;
-  top: -2px;
-  left: 10px;
-  width: 20px;
-  height: 20px;
-  cursor: pointer;
-}
-
-#GPlayerInfoClose {
-  position: absolute;
-  top: -8px;
-  right: 10px;
-  width: 28px;
-  height: 28px;
-  cursor: pointer;
-}
-
-#GPlayerInfoDescription {
-  font-size: 0.9em;
-}
-
-.GPlayerInfoSubtitle {
-  padding-left: 35px;
-  font-weight: bold;
-  margin-top: 10px;
-  margin-bottom: 4px;
-}
-
-.GPlayerInfoLink,
-.GPlayerInfoPopup {
-  line-height: 20px;
-  padding-left: 23px;
-  white-space: nowrap;
-  overflow-x: hidden;
-  text-overflow: ellipsis;
-  color: #999999;
-  background-repeat: no-repeat;
-  cursor: pointer;
-}
-
-.GPlayerInfoLink {
-  background-position: 0 -20px;
-}
-
-.GPlayerInfoLink:hover,
-.GPlayerInfoPopup:hover {
-  color: #333;
-}
-
-.GPlayerInfoLink a,
-.GPlayerInfoLink a:visited
-.GPlayerInfoLink a:focus
-.GPlayerInfoLink a:hover {
-  text-decoration: none;
-  color: inherit;
-}
-/* Location */
-
-/* Location form */
-
-.GPlocationStageFlexInput {
-  max-height: 28px;
-  opacity: 1;
-}
-
-.GPlocationStageFlexInputHidden {
-  max-height: 0;
-  opacity: 0;
-  overflow: hidden;
-}
-
-.GPlocationOriginVisible {
-  display: block;
-}
-
-.GPlocationOriginHidden {
-  display: none;
-}
-
-label.GPlocationOriginPointerImg[id*="GPlocationOriginPointerImg"] {
-  width: 28px;
-  border-top-right-radius: 3px;
-  border-bottom-right-radius: 3px;
-  border-right: 1px solid #999;
-}
-
-input[id*="GPlocationOriginPointer"] + .GPlocationOriginPointerImg {
-  background-position: -1px -1px;
-}
-
-input[id*="GPlocationOriginPointer"]:checked + .GPlocationOriginPointerImg {
-  background-position: -29px -1px;
-}
-
-.GPlocationStageRemove,
-div[id^=GPlocationStageAdd] {
-  width: 28px;
-  border: none;
-  cursor: pointer;
-}
-
-.GPlocationStageRemove {
-  background-position: -84px 0;
-}
-
-div[id^=GPlocationStageAdd] {
-  background-position: -56px 0;
-}
-
-/* Showing/hiding drawing panel */
-
-label[id^=GPshowMeasureAreaPicto-] {
-  display: inline-block;
-}
-
-input[id^=GPshowMeasureArea-] + label {
-  display: block;
-}
-
-input[id^=GPshowMeasureArea-]:checked + label {
-  display: block;
-  background-color: rgba(0,60,136,0.5);
-}
-
-input[id^=GPshowMeasureArea-] + label + div {
-  display: block;
-}
-
-input[id^=GPshowMeasureArea-]:checked + label + div {
-  display: block;
-}
-
-/* Showing/hiding drawing panel */
-
-label[id^=GPshowMeasureAzimuthPicto-] {
-  display: inline-block;
-}
-
-input[id^=GPshowMeasureAzimuth-] + label {
-  display: block;
-}
-
-input[id^=GPshowMeasureAzimuth-]:checked + label {
-  display: block;
-  background-color: rgba(0,60,136,0.5);
-}
-
-input[id^=GPshowMeasureAzimuth-] + label + div {
-  display: block;
-}
-
-input[id^=GPshowMeasureAzimuth-]:checked + label + div {
-  display: block;
-}
-
-/* Showing/hiding drawing panel */
-
-label[id^=GPshowMeasureLengthPicto-] {
-  display: inline-block;
-}
-
-input[id^=GPshowMeasureLength-] + label {
-  display: block;
-}
-
-input[id^=GPshowMeasureLength-]:checked + label {
-  display: block;
-  background-color: rgba(0,60,136,0.5);
-}
-
-input[id^=GPshowMeasureLength-] + label + div {
-  display: block;
-}
-
-input[id^=GPshowMeasureLength-]:checked + label + div {
-  display: block;
-}
-
-/* MEASURE TOOL */
-
-.tooltip {
-  position: relative;
-  background: rgba(0, 0, 0, 0.5);
-  border-radius: 4px;
-  color: white;
-  padding: 4px 8px;
-  white-space: nowrap;
-}
-
-.tooltip-measure {
-  font-weight: bold;
-}
-
-.tooltip-info {
-  font-size: 0.75em;
-  text-align: center;
-}
-
-.tooltip-static {
-  background-color: #ffcc33;
-  color: black;
-  border: 1px solid white;
-}
-
-.tooltip-hidden {
-  display: none;
-}
-
-.tooltip-measure::before,
-.tooltip-info::before,
-.tooltip-static::before {
-  border-top: 6px solid rgba(0, 0, 0, 0.5);
-  border-right: 6px solid transparent;
-  border-left: 6px solid transparent;
-  content: "";
-  position: absolute;
-  bottom: -6px;
-  margin-left: -7px;
-  left: 50%;
-}
-
-.tooltip-static::before {
-  border-top-color: #ffcc33;
-}
-
-/* MOUSE POSITION */
-
-/* Showing/hiding mouse position panel */
-
-label[id^=GPshowMousePositionPicto] {
-  display: inline-block;
-}
-
-input[id^=GPshowMousePosition-] + label {
-  display: block;
-}
-
-input[id^=GPshowMousePosition-]:checked + label {
-  display: none;
-}
-
-input[id^=GPshowMousePosition-] + label + div {
-  display: none;
-}
-
-input[id^=GPshowMousePosition-]:checked + label + div {
-  display: block;
-}
-
-/* General panels */
-
-div[id^=GPmousePositionPanel-] {
-  width: 240px;
-  overflow: hidden;
-}
-
-/* Basic infos */
-
-div[id^=GPmousePositionBasicPanel] {
-  padding: 10px 15px;
-}
-
-.GPmousePositionLabel,
-.GPmousePositionCoords {
-  display: inline-block;
-  line-height: 20px;
-}
-
-.GPmousePositionLabel {
-  width: 80px;
-  font-weight: bold;
-}
-
-.GPmousePositionCoords {
-  width: 110px;
-}
-
-/* Showing settings */
-
-.GPshowMousePositionSettingsPicto {
-  bottom: 5px;
-  right: 0;
-  transition: all 0.5s ease-out 0s;
-}
-
-div[id^=GPmousePosition-] input[type="checkbox"]:checked + .GPshowMousePositionSettingsPicto {
-  bottom: 100px;
-}
-
-div[id^=GPmousePositionSettings-] {
-  display: block;
-  max-height: 0;
-  opacity: 0;
-  transition: max-height 0.5s ease-out 0s, opacity 0.5s ease-out 0s;
-}
-
-div[id^=GPmousePosition-] input[type="checkbox"]:checked + label + div[id^=GPmousePositionSettings-] {
-  max-height: 95px;
-  opacity: 1;
-}
-
-/* Settings */
-
-div[id^=GPmousePositionSettings-] {
-  height: 95px;
-  padding-left: 0 15px;
-  overflow: hidden;
-}
-
-.GPmousePositionSettingsLabel {
-  display: block;
-  margin: auto;
-  text-align: center;
-  font-weight: bold;
-  line-height: 16px;
-}
-
-.GPmousePositionSettingsSelect {
-  width: 180px;
-  margin-top: 5px;
-}
-
-/* Map center localisation */
-
-#GPmapCenter {
-  display: none;
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  width: 50px;
-  height: 50px;
-  margin-top: -25px;
-  margin-left: -25px;
-}
-
-#GPmapCenter.GPmapCenterVisible {
-  display: block;
-}
-
-/* REVERSE GEOCODING */
-
-[id^="GPreverseGeocoding-"] {
-  top: 180px;
-}
-
-/* Showing/hiding reverse geocoding panel */
-
-[id^="GPshowReverseGeocodingPicto-"] {
-  display: inline-block;
-}
-
-[id^="GPshowReverseGeocoding-"] + label {
-  display: block;
-}
-
-[id^="GPshowReverseGeocoding-"]:checked + label {
-  display: none;
-}
-
-[id^="GPshowReverseGeocoding-"] + label + div {
-  display: none;
-}
-
-[id^="GPshowReverseGeocoding-"]:checked + label + div {
-  display: block;
-}
-
-/* General panels */
-
-div[id^=GPreverseGeocodingResultsClose] {
-  top: 0;
-  right: 0;
-  width: 30px;
-  height: 32px;
-  /*background-position: -26px 0;*/
-}
-
-[id^="GPreverseGeocodingPanel-"] {
-  width: 280px;
-}
-
-.GPreverseGeocodingComponentHidden {
-  display: none;
-}
-
-div[id^="GPreverseGeocodingReturnPicto-"] {
-  position: absolute;
-  width: 26px;
-  height: 26px;
-  border-radius: 3px;
-  opacity: 1;
-  background-position: 0 0;
-  cursor: pointer;
-}
-
-.GPreverseGeocodingReturnPictoHidden {
-    display: none;
-}
-
-/* Calc waiting */
-
-.GPreverseGeocodingCalcWaitingContainerVisible,
-.GPreverseGeocodingCalcWaitingContainerHidden {
-  position: absolute;
-  top: 32px;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  background-color: rgba(255,255,255,0.9);
-  font-size: 1.5em;
-  font-weight: bold;
-  overflow: hidden;
-}
-
-.GPreverseGeocodingCalcWaitingContainerVisible {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: -webkit-box;
-  display: flex;
-}
-
-.GPreverseGeocodingCalcWaitingContainerHidden {
-  display: none;
-}
-
-.GPreverseGeocodingCalcWaiting {
-  margin: auto;
-}
-
-/* Search panel */
-
-[id^="GPreverseGeocodingForm-"] {
-  position: relative;
-  max-height: 270px;
-  overflow-y: auto;
-  padding-left: 15px;
-  padding-right: 15px;
-  padding-top: 10px;
-}
-
-.GPreverseGeocodingCodeLabel,
-.GPreverseGeocodingFilterLabel {
-  max-width: 105px;
-}
-
-.GPreverseGeocodingCodeLabel,
-.GPreverseGeocodingCode {
-  margin-top: 5px;
-  margin-bottom: 0;
-}
-
-.GPreverseGeocodingFilterLabel,
-.GPreverseGeocodingFilterInput {
-  margin-bottom: 5px;
-}
-
-input[id^="GPreverseGeocodingSubmit-"] {
-  margin-top: 5px;
-  margin-bottom: 15px;
-  width: 100px;
-}
-
-/* Calc waiting */
-
-.GPreverseGeocodingCalcWaitingContainerVisible,
-.GPreverseGeocodingCalcWaitingContainerHidden {
-  position: absolute;
-  top: 32px;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  background-color: rgba(255,255,255,0.9);
-  font-size: 1.5em;
-  font-weight: bold;
-  overflow: hidden;
-}
-
-.GPreverseGeocodingCalcWaitingContainerVisible {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: -webkit-box;
-  display: flex;
-}
-
-.GPreverseGeocodingCalcWaitingContainerHidden {
-  display: none;
-}
-
-.GPreverseGeocodingCalcWaiting {
-  margin: auto;
-}
-
-/* Result panel */
-
-div[id^=GPreverseGeocodingResultsList-] {
-  position: relative;
-  max-height: 210px;
-  overflow-y: auto;
-}
-
-/* ROUTE */
-
-div[id^=GProute-] {
-   top: 100px;
-}
-
-/* Showing/hiding route panel */
-
-label[id^=GPshowRoutePicto] {
-  display: inline-block;
-}
-
-input[id^=GPshowRoute-] + label {
-  display: block;
-}
-
-input[id^=GPshowRoute-]:checked + label {
-  display: none;
-}
-
-input[id^=GPshowRoute-] + label + div {
-  display: none;
-}
-
-input[id^=GPshowRoute-]:checked + label + div {
-  display: block;
-}
-
-/* General panels */
-
-div[id^=GProutePanel-] {
-  width: 320px;
-}
-
-.GProuteComponentHidden {
-  display: none;
-}
-
-/* Calc waiting */
-
-.GProuteCalcWaitingContainerVisible,
-.GProuteCalcWaitingContainerHidden {
-  position: absolute;
-  top: 32px;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  background-color: rgba(255,255,255,0.9);
-  font-size: 1.5em;
-  font-weight: bold;
-  overflow: hidden;
-}
-
-.GProuteCalcWaitingContainerVisible {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: -webkit-box;
-  display: flex;
-}
-
-.GProuteCalcWaitingContainerHidden {
-  display: none;
-}
-
-.GProuteCalcWaiting {
-  margin: auto;
-}
-
-/* Route form */
-
-form[id^=GProuteForm] {
-  padding: 15px;
-}
-
-.GProuteFormMini {
-  max-height: 58px;
-  overflow: hidden;
-  -webkit-transform: translateY(-5px);
-  transform: translateY(-5px);
-}
-
-.GProuteStageFlexInput {
-  max-height: 28px;
-  opacity: 1;
-}
-
-.GProuteStageFlexInputHidden {
-  max-height: 0;
-  opacity: 0;
-  overflow: hidden;
-}
-
-form[id^=GProuteForm] > .GPlocationStageFlexInput {
-  margin-top: 5px;
-}
-
-form[id^=GProuteForm] > .GPlocationStageFlexInputHidden {
-  margin-top: 0;
-}
-
-form[id^=GProuteForm].GProuteFormMini .GPlocationStageFlexInput:first-child {
-  margin-top: 5px;
-}
-
-.GProuteOriginVisible {
-  display: block;
-}
-
-.GProuteOriginHidden {
-  display: none;
-}
-
-label.GProuteOriginPointerImg[id*="GProuteOriginPointerImg"] {
-  width: 28px;
-  border-top-right-radius: 3px;
-  border-bottom-right-radius: 3px;
-  border-right: 1px solid #999;
-}
-
-input[id*="GProuteOriginPointer"] + .GProuteOriginPointerImg {
-  background-position: -1px -1px;
-}
-
-input[id*="GProuteOriginPointer"]:checked + .GProuteOriginPointerImg {
-  background-position: -29px -1px;
-}
-
-.GProuteStageRemove,
-div[id^=GProuteStageAdd] {
-  width: 28px;
-  border: none;
-  cursor: pointer;
-}
-
-.GProuteFormMini .GProuteStageRemove,
-.GProuteFormMini div[id^=GProuteStageAdd] {
-  display: none;
-}
-
-.GProuteStageRemove {
-  background-position: -84px 0;
-}
-
-div[id^=GProuteStageAdd] {
-  background-position: -56px 0;
-}
-
-/* Mode choice */
-
-div[id^=GProuteModeChoice] {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: -webkit-box;
-  display: flex;
-  -webkit-justify-content: space-around;
-  -ms-flex-pack: distribute;
-  justify-content: space-around;
-  margin: 15px 0;
-}
-
-.GProuteModeLabel {
-  display: block;
-  text-align: center;
-  margin-bottom: 5px;
-}
-
-div[id^=GProuteTransportChoice] input {
-  display: none;
-}
-
-.GProuteTransportImg {
-  display: inline-block;
-  width: 28px;
-  height: 28px;
-  cursor: pointer;
-}
-
-.GProuteTransportImg:first-of-type {
-    margin-left: 18px;
-    margin-right: 10px;
-}
-
-input[id^=GProuteTransportCar] + .GProuteTransportImg {
-  background-position: -112px 0;
-}
-
-input[id^=GProuteTransportCar]:checked + .GProuteTransportImg {
-  background-position: -140px 0;
-}
-
-input[id^=GProuteTransportPedestrian] + .GProuteTransportImg {
-  background-position: -168px 0;
-}
-
-input[id^=GProuteTransportPedestrian]:checked + .GProuteTransportImg {
-  background-position: -196px 0;
-}
-
-select[id^=GProuteComputationSelect] {
-  width: 100px;
-}
-
-/* Showing/hiding exclusions */
-
-input[id^=GPshowRouteExclusions] {
-  display: none;
-}
-
-.GPshowRouteExclusionsPicto {
-  top: 185px;
-  right: 0;
-  transition: all 0.3s ease-out 0s;
-}
-
-input[id^=GPshowRouteExclusions] + label + div[id^=GProuteExclusions] {
-  max-height: 0;
-  opacity: 0;
-  margin-bottom: 0;
-}
-
-input[id^=GPshowRouteExclusions]:checked + label + div[id^=GProuteExclusions] {
-  display: block;
-  max-height: 60px;
-  opacity: 1;
-  margin-bottom: 15px;
-}
-
-/* Exclusions */
-
-div[id^=GProuteExclusions] {
-  transition: max-height 0.5s ease-in-out 0.25s, opacity 0.5s ease-in-out 0.25s, margin 0.3s ease-in-out 0.25s;
-  overflow: hidden;
-}
-
-.GProuteExclusionsLabel {
-  display: block;
-  text-align: center;
-  margin-bottom: 10px;
-  font-weight: bold;
-  line-height: 16px;
-}
-
-.GProuteExclusionsOptions {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: -webkit-box;
-  display: flex;
-  -webkit-justify-content: space-around;
-  -ms-flex-pack: distribute;
-  justify-content: space-around;
-}
-
-.GProuteExclusionsOption {
-  display: block;
-  height: 28px;
-  line-height: 26px;
-  color: #A77;
-  background-color: #FEE;
-  padding-left: 28px;
-  padding-right: 5px;
-  border: 1px solid #A77;
-  border-radius: 3px;
-  cursor: pointer;
-}
-
-input:checked + .GProuteExclusionsOption {
-  background-color: #EFE;
-  background-position: 0 -28px;
-  color: #797;
-  border: 1px solid #797;
-}
-
-/* Reset picto */
-div[id^=GProuteReset] {
-  position: absolute;
-  width: 28px;
-  height: 28px;
-  border-radius: 3px;
-  opacity: 0.8;
-  background-position: -224px 0;
-  transition: opacity 0.2s ease-out;
-  cursor: pointer;
-}
-
-div[id^=GProuteReset]:hover {
-  opacity: 1;
-}
-
-/* Result panel */
-
-div[id^=GProuteResultsPanel] {
-  padding: 15px;
-}
-
-.GProuteResultStage {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: -webkit-box;
-  display: flex;
-}
-
-div[id^=GProuteResultsStages] {
-  margin-bottom: 15px;
-}
-
-.GProuteResultStageLabel,
-.GProuteResultStageValue,
-.GProuteResultsValueLabel,
-div[id^=GProuteResultsValueDist],
-div[id^=GProuteResultsValueTime] {
-  display: inline-block;
-  line-height: 18px;
-}
-
-.GProuteResultStageLabel,
-.GProuteResultsValueLabel {
-  color: #666;
-}
-
-.GProuteResultStageLabel {
-  width: 60px;
-}
-
-.GProuteResultsValueLabel {
-  width: 65px;
-}
-
-.GProuteResultStageValue {
-  -webkit-flex: 1;
-  -webkit-box-flex: 1;
-      -ms-flex: 1;
-          flex: 1;
-  overflow-x: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-}
-
-div[id^=GProuteResultsValueDist],
-div[id^=GProuteResultsValueTime] {
-  width: 80px;
-  font-weight: bold;
-}
-
-div[id^=GProuteResults-] {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: -webkit-box;
-  display: flex;
-  -webkit-justify-content: space-between;
-  -webkit-box-pack: justify;
-      -ms-flex-pack: justify;
-          justify-content: space-between;
-  -webkit-align-items: center;
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  margin-bottom: 10px;
-}
-
-select[id^=GProuteResultsComputationSelect] {
-  width: 100px;
-}
-
-div[id^=GProuteResultsNew] {
-  width: 28px;
-  height: 28px;
-  border-radius: 3px;
-  opacity: 0.8;
-  background-position: -224px 0;
-  transition: opacity 0.2s ease-out;
-  cursor: pointer;
-}
-
-div[id^=GProuteResultsNew]:hover {
-  opacity: 1;
-}
-
-/* Results details header */
-
-.GPfakeBorder {
-  display: inline-block;
-  height: 14px;
-  width: 60px;
-  border-bottom: 1px solid #999;
-}
-
-.GPfakeBorderLeft {
-  margin-left:15px;
-}
-
-input[id^=GProuteResultsShowDetails] + label,
-input[id^=GProuteResultsShowDetails] + label + label {
-  width: 130px;
-  line-height: 28px;
-  vertical-align: top;
-  text-align: center;
-  font-weight: bold;
-  cursor: pointer;
-  transition: color 0.2s ease-out;
-}
-
-input[id^=GProuteResultsShowDetails] + label,
-input[id^=GProuteResultsShowDetails]:checked + label + label {
-  display: inline-block;
-}
-
-input[id^=GProuteResultsShowDetails]:checked + label,
-input[id^=GProuteResultsShowDetails] + label + label {
-  display: none;
-}
-
-input[id^=GProuteResultsShowDetails] + label + label + div + div[id^=GProuteResultsDetails] {
-  max-height: 0;
-  opacity: 0;
-}
-
-input[id^=GProuteResultsShowDetails]:checked + label + label + div + div[id^=GProuteResultsDetails] {
-  max-height: 200px;
-  opacity: 1;
-}
-
-div[id^=GProuteResultsDetails] {
-  overflow-y: auto;
-  transition: max-height 0.5s ease-in-out 0.25s, opacity 0.5s ease-in-out 0.25s;
-}
-
-.GProuteResultsDetailsNumber,
-.GProuteResultsDetailsInstruction {
-  display: inline-block;
-  margin-top: 4px;
-  line-height: 16px;
-  color: #666;
-}
-
-.GProuteResultsDetailsNumber {
-  font-weight: bold;
-  width: 22px;
-  text-align: right;
-  vertical-align: top;
-}
-
-.GProuteResultsDetailsInstruction {
-  width: calc(100% - 30px);
-  padding-left: 5px;
-}
-
-/* SEARCH ENGINE */
-
-input[id^=GPshowSearchEngine-] + label + form[id^=GPsearchInput-] {
-  max-width: 0px;
-}
-
-#GPlayerSwitcher label { /* FIXME !? */
-  display: block;
-}
-
-/* Showing/hiding search engine input */
-
-input[id^=GPshowSearchEngine-] {
-  display: none;
-}
-
-label[id^=GPshowSearchEnginePicto] {
-  display: inline-block;
-  transition: border-radius 0s ease-out 0s;
-  transition-delay: 0.5s;
-}
-
-input[id^=GPshowSearchEngine-]:checked + label {
-  border-top-right-radius: 0;
-  border-bottom-right-radius: 0;
-  transition-delay: 0s;
-}
-
-input[id^=GPshowSearchEngine-] + label + form[id^=GPsearchInput-] {
-  max-width: 0px;
-  border: none;
-  transition: max-width 0.5s ease-out 0s;
-}
-
-input[id^=GPshowSearchEngine-]:checked + label + form[id^=GPsearchInput-] {
-  max-width: 280px;
-}
-
-input[id^=GPshowSearchEngine-] + label + form[id^=GPsearchInput-] + div[id^=GPshowAdvancedSearch] {
-  display: none;
-}
-
-input[id^=GPshowSearchEngine-]:checked + label + form[id^=GPsearchInput-] + div[id^=GPshowAdvancedSearch] {
-  display: inline-block;
-}
-
-div[id^=GPautoCompleteList] {
-  display: none;
-}
-
-input[id^=GPshowSearchEngine-]:checked + label + form[id^=GPsearchInput-] + div[id^=GPautoCompleteList] {
-  display: block;
-}
-
-/* Simple search input */
-
-form[id^=GPsearchInput-] {
-  display: inline-block;
-  position: relative;
-  left: -3px;
-  width: 280px;
-  overflow: hidden;
-}
-
-form[id^=GPsearchInput-] input {
-  display: block;
-  width: 100%;
-  height: 100%;
-  border: 1px solid #999;
-  border-top-right-radius: 5px;
-  border-bottom-right-radius: 5px;
-  padding: 0;
-  padding-right: 30px;
-  padding-left: 5px;
-  color: #333;
-  font-size: 1.0em;
-}
-
-form[id^=GPsearchInput-] input:disabled {
-  background-color: #DDD;
-  color: #999;
-}
-
-div[id^=GPsearchInputReset] {
-  position: absolute;
-  top: 0;
-  right: 0;
-  width: 30px;
-  height: 32px;
-  background-position: -30px 0;
-  cursor: pointer;
-}
-
-/* General panels */
-
-div[id^=GPgeocodeResultsClose],
-div[id^=GPadvancedSearchClose] {
-  top: 0;
-  right: 0;
-  width: 30px;
-  height: 32px;
-}
-
-div[id^=GPgeocodeResultsClose] {
-  background-position: 0 0;
-}
-
-div[id^=GPadvancedSearchClose] {
-  background-repeat: no-repeat;
-}
-
-/* Advanced search picto */
-
-div[id^=GPshowAdvancedSearch] {
-  transition: border-radius 0s ease-out 0s;
-  transition-delay: 0.5s;
-}
-
-/* Advanced search panel */
-
-div[id^=GPadvancedSearchPanel] {
-  display: none;
-  width: 280px;
-  vertical-align: top;
-  overflow: hidden;
-}
-
-form[id^=GPadvancedSearchForm] {
-  max-height: 220px;
-  overflow-y: auto;
-  padding-left: 15px;
-  padding-right: 15px;
-}
-
-.GPadvancedSearchCodeLabel,
-.GPadvancedSearchFilterLabel {
-  max-width: 105px;
-}
-
-.GPadvancedSearchCodeLabel,
-.GPadvancedSearchCode,
- div[id^=GPadvancedSearchFilters] {
-  margin-top: 15px;
-}
-
-.GPadvancedSearchFilterLabel,
-.GPadvancedSearchFilterInput {
-  margin-bottom: 5px;
-}
-
-input[id^=GPadvancedSearchSubmit] {
-  margin-top: 10px;
-  margin-bottom: 15px;
-}
-
-/* Autocomplete list / geocode results */
-
-div[id^=GPautoCompleteList],
-div[id^=GPgeocodeResultsList] {
-  width: 280px;
-}
-
-div[id^=GPautoCompleteList] {
-  top: 35px;
-}
-
-div[id^=GPgeocodeResultsList] {
-  display: none;
-  position: absolute;
-  top: 40px;
-  border-radius: 4px;
-  overflow: hidden;
-}
-
-div[id^=GPgeocodeResults-] {
-  background-color: #FFF;
-  max-height: 140px;
-  overflow-y: auto;
-}
-
-
-.GPwidget {
-  position: relative; /* overwritten */
-}
-
-
-#GPadvancedToolsPanel {
-  position: initial; /* overwritten */
-}
-
-/* General panels */
-
-.GPpanel {
-  box-shadow: 0 1px 5px #000;
-  border-radius: 5px;
-}
-
-.GPpanelHeader {
-  height: 32px;
-  background-color: #FFF;
-  border-top-left-radius: 5px;
-  border-top-right-radius: 5px;
-}
-
-.GPpanelTitle {
-  width: calc(100% - 60px);
-  margin: auto;
-  line-height: 32px;
-  color: #C77A04;
-  border-bottom: 1px solid #C77A04;
-}
-
-.GPpanelClose {
-  top: 0;
-  right: 0;
-  width: 30px;
-  height: 32px;
-  background-position: -30px 1px;
-}
-
-.GPpanelReduce {
-  top: 0;
-  right: 30px;
-  width: 30px;
-  height: 32px;
-  background-position: -60px 1px;
-}
-
-/* Showing/hiding advanced panel */
-
-.GPshowAdvancedToolPicto {
-  width: 30px;
-  height: 30px;
-  box-shadow: 0 1px 5px #000;
-  background-color: #FFF;
-  border-radius: 5px;
-}
-
-.GPshowAdvancedToolPicto:hover {
-  background-color: #F4F4F4;
-}
-
-.GPshowAdvancedToolOpen {
-  width: 100%;
-  height: 100%;
-}
-
-/* Submit inputs */
-
-input.GPinputSubmit {
-  background-color: #C77A04;
-}
-
-/* Showing additional hidden options */
-
-.GPshowMoreOptions {
-  background-image: url("../img/gp/GPshowMoreOptions.png");
-}
-
-div[id^=GPelevationPath-] {
-  top: 0; /*overwritten*/
-}
-
-/* Showing/hiding elevationPath panel */
-
-label[id^=GPshowElevationPathPicto] {
-  display: inline-block;
-}
-
-input[id^=GPshowElevationPath-] + label {
-  display: block;
-}
-
-input[id^=GPshowElevationPath-]:checked + label {
-  /* display: none; */
-}
-
-input[id^=GPshowElevationPath-] + label + div {
-  display: none;
-}
-
-input[id^=GPshowElevationPath-]:checked + label + div {
-  display: block;
-}
-
-span[id^=GPshowElevationPathOpen] {
-  background-image: url("../img/gp/GPshowElevationPath.png");
-}
-
-/* Panel */
-
-[id^=GPelevationPathPanelClose] {
-  background-image: url("../img/gp/GPshowElevationPath.png");
-}
-
-div[id^=GPelevationPathPanelReduce] {
-  background-image: url("../img/gp/GPshowElevationPath.png");
-}
-
-[id^=GPelevationPathPanel-] {
-  width: 280px;
-}
-
-/* ELEVATION PATH DISPLAY */
-
-[id^=GPelevationPathProfil] {
-  height: 150px;
-  width: inherit;
-  line-height: normal; /* surcharge leaflet container */
-}
-
-/*.GPpanelHeader {
-  padding: unset;
-}*/
-
-/*
-@media (min-width:720px) and (min-height:720px) {
-
-[id^=GPelevationPathPanel] {
-top: 15px;
-left: 15px;
-}
-
-}
-
-@media (min-width:720px) and (min-height:520px) {
-
-[id^=GPelevationPathPanel] {
-width: 460px;
-}
-
-[id^=GPelevationPathProfil] {
-height: 220px;
-}
-
-}
-
-@media (max-width:560px), (max-height:340px) {
-
-[id^=GPelevationPathPanel] {
-display: none !important;
-}
-
-}
-*/
-
-/* ISOCHRON */
-
-div[id^=GPisochron-] {
-   /* left: 10px; */
-  top: 0; /*overwritten*/
-}
-
-/* Showing/hiding isochron panel */
-
-span[id^=GPshowIsochronOpen] {
-  background-image: url("../img/gp/GPisochronOpen.png");
-}
-
-/* General panels */
-
-div[id^=GPisochronPanel-] {
-  left: 10px;
-}
-
-div[id^=GPisochronPanelClose] {
-  background-image: url("../img/gp/GPisochronOpen.png");
-}
-
-div[id^=GPisochronPanelReduce] {
-  background-image: url("../img/gp/GPisochronOpen.png");
-}
-
-/* Calc waiting */
-
-.GPisochronCalcWaitingContainerVisible,
-.GPisochronCalcWaitingContainerHidden {
-  border-radius: 5px;
-}
-
-/* Isochron form */
-
-.GPisochronChoiceAlt input:checked + label + span {
-  color: #C77A04;
-}
-
-.GPisochronOriginPointerImg,
-.GPisochronChoiceAltImg,
-.GPisochronTransportImg {
-  background-image: url("../img/gp/GPisochronOptions.png");
-}
-
-.GPisoExclusionsOption {
-  background-image: url("../img/gp/GPisochronCheck.png");
-}
-
-/* Reset picto */
-div[id^=GPisochronReset] {
-  background-color: #C77A04;
-  background-image: url("../img/gp/GPisochronOptions.png");
-}
-
-/* LAYER SWITCHER LEAFLET */
-
-#GPlayerSwitcher {
-  top: 10px;
-  right: 10px;
-}
-
-/* Showing/hiding layers list */
-
-#GPshowLayersListPicto {
-  width: 36px;
-  height: 36px;
-}
-
-#GPshowLayersListOpen,
-#GPshowLayersListClose {
-  background-image: url("../img/gp/GPshowLayersList.png");
-}
-
-#GPshowLayersListClose {
-  background-position: -36px 0;
-}
-
-#GPlayerSwitcher input[type="checkbox"]:checked + div + #GPshowLayersListPicto {
-  box-shadow: 0 2px 2px #000;
-  border-top: 1px solid #CCC;
-}
-
-#GPlayerSwitcher input[type="checkbox"]:checked + div + #GPshowLayersListPicto #GPshowLayersListOpen {
-  opacity: 0.4;
-}
-
-/* Layers list */
-
-.GPlayerVisibility,
-.GPshowLayerAdvancedTools,
-.GPlayerInfo,
-.GPlayerInfoOpened,
-.GPlayerRemove {
-  background-image: url("../img/gp/GPlayerTools.png");
-}
-
-/* Opacity slider : Chrome, Safari, Opera */
-
-.GPlayerOpacity input[type="range"]::-webkit-slider-runnable-track {
-  background: url("../img/gp/GPopacitySlider.png");
-}
-
-/* Opacity slider : Firefox */
-
-.GPlayerOpacity input[type="range"]::-moz-range-track {
-  background: url("../img/gp/GPopacitySlider.png");
-}
-
-/* Opacity slider : IE */
-
-.GPlayerOpacity input[type="range"]::-ms-track {
-  background: url("../img/gp/GPopacitySlider.png");
-}
-
-/* Layer info panel */
-
-#GPlayerInfoPanel {
-  right: 190px;
-}
-
-#GPlayerInfoTitle {
-  color: #C77A04;
-  border-bottom: 1px solid #C77A04;
-}
-
-#GPlayerInfoQuicklook {
-  background-image: url("../img/gp/GPlayerInfo.png");
-}
-
-#GPlayerInfoClose {
-  background-image: url("../img/gp/GPlayerInfoClose.png");
-}
-
-.GPlayerInfoLink,
-.GPlayerInfoPopup {
-  background-image: url("../img/gp/GPlayerInfo.png");
-}
-
-/* Location */
-
-.GPlocationStageFlexInput {
-  margin-bottom: 5px; /*overwritten*/
-}
-
-/* Location form */
-
-.GPlocationOriginPointerImg,
-.GPlocationStageRemove,
-div[id^=GPlocationStageAdd],
-.GPlocationTransportImg {
-  background-image: url("../img/gp/GPlocationOptions.png");
-}
-
-/* MOUSE POSITION */
-
-div[id^=GPmousePosition-] {
-  /* bottom: 10px; */
-  /* left: 10px; */
-}
-
-/* Showing/hiding mouse position panel */
-
-span[id^=GPshowMousePositionOpen] {
-  background-image: url("../img/gp/GPmousePositionOpen.png");
-}
-
-/* General panels */
-
-div[id^=GPmousePositionPanelClose] {
-  background-image: url("../img/gp/GPmousePositionOpen.png");
-}
-
-/* Map center localisation */
-
-#GPmapCenter {
-  background-image: url("../img/gp/GPmapCenter.png");
-}
-
-/* REVERSE GEOCODING */
-
-[id^="GPreverseGeocoding-"] {
-  /*left: 10px;*/
-  top: 0; /*overwritten*/
-}
-
-/* Showing/hiding reverse geocoding panel */
-
-[id^="GPshowReverseGeocodingOpen-"] {
-  background-image: url("../img/gp/GPreverseGeocodingOpen.png");
-}
-
-/* General panels */
-
-[id^="GPreverseGeocodingPanel-"] {
-  left: 10px;
-}
-
-[id^="GPreverseGeocodingPanelClose-"] {
-  background-image: url("../img/gp/GPreverseGeocodingOpen.png");
-}
-
-/* Calc waiting */
-
-.GPreverseGeocodingCalcWaitingContainerVisible,
-.GPreverseGeocodingCalcWaitingContainerHidden {
-  border-radius: 5px;
-}
-
-/* Results panel */
-
-[id^="GPreverseGeocodingReturnPicto-"] {
-  width: 30px  !important;
-  height: 30px !important;
-  background-color: #C77A04;
-  background-image: url("../img/gp/GPreturn.png");
-}
-
-.GPreverseGeocodedLocationHighlight {
-    background-color: rgba(255,200,0,0.25);
-    color: #222;
-}
-
-/* ROUTE */
-
-div[id^=GProute-] {
-   /* left: 10px; */
-   top: 0; /*overwritten*/
-}
-
-.GProuteStageFlexInput {
-  margin-bottom: 5px; /*overwritten*/
-}
-
-/* Showing/hiding route panel */
-
-span[id^=GPshowRouteOpen] {
-  background-image: url("../img/gp/GProuteOpen.png");
-}
-
-/* General panels */
-
-div[id^=GProutePanel-] {
-  left: 10px;
-}
-
-div[id^=GProutePanelClose] {
-  background-image: url("../img/gp/GProuteOpen.png");
-}
-
-/* Calc waiting */
-
-.GProuteCalcWaitingContainerVisible,
-.GProuteCalcWaitingContainerHidden {
-  border-radius: 5px;
-}
-
-/* Route form */
-
-.GProuteOriginPointerImg,
-.GProuteStageRemove,
-div[id^=GProuteStageAdd],
-.GProuteTransportImg {
-  background-image: url("../img/gp/GProuteOptions.png");
-}
-
-.GProuteExclusionsOption {
-  background-image: url("../img/gp/GProuteCheck.png");
-}
-
-/* Results panel */
-
-div[id^=GProuteResultsValueDist],
-div[id^=GProuteResultsValueTime] {
-  color: #C77A04;
-}
-
-div[id^=GProuteResultsNew] {
-  background-color: #C77A04;
-  background-image: url("../img/gp/GProuteOptions.png");
-}
-
-input[id^=GProuteResultsShowDetails] + label:hover,
-input[id^=GProuteResultsShowDetails] + label + label:hover {
-  color: #C77A04;
-}
-
-.GProuteResultsDetailsHighlight {
-    background-color: rgba(255,200,0,0.25);
-    color: #222;
-}
-
-/* SEARCH ENGINE */
-
-div[id^=GPsearchEngine-] {
-  /* top: 10px; */
-  /* left: 46px; */
-}
-
-/* Showing/hiding search engine input */
-
-span[id^=GPshowSearchEngineOpen] {
-  background-image: url("../img/gp/GPsearchEngineOpen.png");
-}
-
-/* Simple search input */
-
-form[id^=GPsearchInput-] {
-  height: 30px;
-}
-
-div[id^=GPsearchInputReset] {
-  background-image: url("../img/gp/GPsearchEngineClose.png");
-}
-
-/* General panels */
-
-div[id^=GPgeocodeResultsClose] {
-  background-image: url("../img/gp/GPsearchEngineClose.png");
-}
-
-div[id^=GPadvancedSearchClose] {
-  background-image: url("../img/gp/GPsearchEngineOpen.png");
-  background-position: -60px 0;
-}
-
-/* Advanced search picto */
-
-span[id^=GPshowAdvancedSearchOpen] {
-  background-image: url("../img/gp/GPsearchEngineOpen.png");
-  background-position: -30px 0;
-}
-
-/* Autocomplete list / geocode results */
-
-div[id^=GPautoCompleteList],
-div[id^=GPgeocodeResultsList] {
-  margin-left: 27px;
-  box-shadow: 0 1px 5px #000;
-}
-
-div[id^=GPgeocodeResultsList] {
-  top: 38px;
-  border-radius: 5px;
-}
-
-/* ================================================================== */
-/* Toolbars
-/* ================================================================== */
-
-.leaflet-draw-section {
-	position: relative;
-}
-
-.leaflet-draw-toolbar {
-	margin-top: 12px;
-}
-
-.leaflet-draw-toolbar-top {
-	margin-top: 0;
-}
-
-.leaflet-draw-toolbar-notop a:first-child {
-	border-top-right-radius: 0;
-}
-
-.leaflet-draw-toolbar-nobottom a:last-child {
-	border-bottom-right-radius: 0;
-}
-
-.leaflet-draw-toolbar a {
-	background-image: url('../img/gp/spritesheet.png');
-	background-repeat: no-repeat;
-}
-
-.leaflet-retina .leaflet-draw-toolbar a {
-	background-image: url('../img/gp/spritesheet-2x.png');
-	background-size: 270px 30px;
-}
-
-.leaflet-draw a {
-	display: block;
-	text-align: center;
-	text-decoration: none;
-}
-
-/* ================================================================== */
-/* Toolbar actions menu
-/* ================================================================== */
-
-.leaflet-draw-actions {
-	display: none;
-	list-style: none;
-	margin: 0;
-	padding: 0;
-	position: absolute;
-	left: 26px; /* leaflet-draw-toolbar.left + leaflet-draw-toolbar.width */
-	top: 0;
-	white-space: nowrap;
-}
-
-.leaflet-touch .leaflet-draw-actions {
-	left: 32px;
-}
-
-.leaflet-right .leaflet-draw-actions {
-	right:26px;
-	left:auto;
-}
-
-.leaflet-touch .leaflet-right .leaflet-draw-actions {
-	right:32px;
-	left:auto;
-}
-
-.leaflet-draw-actions li {
-	display: inline-block;
-}
-
-.leaflet-draw-actions li:first-child a {
-	border-left: none;
-}
-
-.leaflet-draw-actions li:last-child a {
-	-webkit-border-radius: 0 4px 4px 0;
-	        border-radius: 0 4px 4px 0;
-}
-
-.leaflet-right .leaflet-draw-actions li:last-child a {
-	-webkit-border-radius: 0;
-	        border-radius: 0;
-}
-
-.leaflet-right .leaflet-draw-actions li:first-child a {
-	-webkit-border-radius: 4px 0 0 4px;
-	        border-radius: 4px 0 0 4px;
-}
-
-.leaflet-draw-actions a {
-	background-color: #919187;
-	border-left: 1px solid #AAA;
-	color: #FFF;
-	font: 11px/19px "Helvetica Neue", Arial, Helvetica, sans-serif;
-	line-height: 28px;
-	text-decoration: none;
-	padding-left: 10px;
-	padding-right: 10px;
-	height: 28px;
-}
-
-.leaflet-touch .leaflet-draw-actions a {
-	font-size: 12px;
-	line-height: 30px;
-	height: 30px;
-}
-
-.leaflet-draw-actions-bottom {
-	margin-top: 0;
-}
-
-.leaflet-draw-actions-top {
-	margin-top: 1px;
-}
-
-.leaflet-draw-actions-top a,
-.leaflet-draw-actions-bottom a {
-	height: 27px;
-	line-height: 27px;
-}
-
-.leaflet-draw-actions a:hover {
-	background-color: #A0A098;
-}
-
-.leaflet-draw-actions-top.leaflet-draw-actions-bottom a {
-	height: 26px;
-	line-height: 26px;
-}
-
-/* ================================================================== */
-/* Draw toolbar
-/* ================================================================== */
-
-.leaflet-draw-toolbar .leaflet-draw-draw-polyline {
-	background-position: -2px -2px;
-}
-
-.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline {
-	background-position: 0 -1px;
-}
-
-.leaflet-draw-toolbar .leaflet-draw-draw-polygon {
-	background-position: -31px -2px;
-}
-
-.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon {
-	background-position: -29px -1px;
-}
-
-.leaflet-draw-toolbar .leaflet-draw-draw-rectangle {
-	background-position: -62px -2px;
-}
-
-.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle {
-	background-position: -60px -1px;
-}
-
-.leaflet-draw-toolbar .leaflet-draw-draw-circle {
-	background-position: -92px -2px;
-}
-
-.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle {
-	background-position: -90px -1px;
-}
-
-.leaflet-draw-toolbar .leaflet-draw-draw-marker {
-	background-position: -122px -2px;
-}
-
-.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker {
-	background-position: -120px -1px;
-}
-
-/* ================================================================== */
-/* Edit toolbar
-/* ================================================================== */
-
-.leaflet-draw-toolbar .leaflet-draw-edit-edit {
-	background-position: -152px -2px;
-}
-
-.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit {
-	background-position: -150px -1px;
-}
-
-.leaflet-draw-toolbar .leaflet-draw-edit-remove {
-	background-position: -182px -2px;
-}
-
-.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove {
-	background-position: -180px -1px;
-}
-
-.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled {
-	background-position: -212px -2px;
-}
-
-.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled {
-	background-position: -210px -1px;
-}
-
-.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled {
-	background-position: -242px -2px;
-}
-
-.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled {
-	background-position: -240px -2px;
-}
-
-/* ================================================================== */
-/* Drawing styles
-/* ================================================================== */
-
-.leaflet-mouse-marker {
-	background-color: #fff;
-	cursor: crosshair;
-}
-
-.leaflet-draw-tooltip {
-	background: rgb(54, 54, 54);
-	background: rgba(0, 0, 0, 0.5);
-	border: 1px solid transparent;
-	-webkit-border-radius: 4px;
-	        border-radius: 4px;
-	color: #fff;
-	font: 12px/18px "Helvetica Neue", Arial, Helvetica, sans-serif;
-	margin-left: 20px;
-	margin-top: -21px;
-	padding: 4px 8px;
-	position: absolute;
-	visibility: hidden;
-	white-space: nowrap;
-	z-index: 6;
-}
-
-.leaflet-draw-tooltip:before {
-	border-right: 6px solid black;
-	border-right-color: rgba(0, 0, 0, 0.5);
-	border-top: 6px solid transparent;
-	border-bottom: 6px solid transparent;
-	content: "";
-	position: absolute;
-	top: 7px;
-	left: -7px;
-}
-
-.leaflet-error-draw-tooltip {
-	background-color: #F2DEDE;
-	border: 1px solid #E6B6BD;
-	color: #B94A48;
-}
-
-.leaflet-error-draw-tooltip:before {
-	border-right-color: #E6B6BD;
-}
-
-.leaflet-draw-tooltip-single {
-	margin-top: -12px
-}
-
-.leaflet-draw-tooltip-subtext {
-	color: #f8d5e4;
-}
-
-.leaflet-draw-guide-dash {
-	font-size: 1%;
-	opacity: 0.6;
-	position: absolute;
-	width: 5px;
-	height: 5px;
-}
-
-/* ================================================================== */
-/* Edit styles
-/* ================================================================== */
-
-.leaflet-edit-marker-selected {
-	background: rgba(254, 87, 161, 0.1);
-	border: 4px dashed rgba(254, 87, 161, 0.6);
-	-webkit-border-radius: 4px;
-	        border-radius: 4px;
-	box-sizing: content-box;
-}
-
-.leaflet-edit-move {
-	cursor: move;
-}
-
-.leaflet-edit-resize {
-	cursor: pointer;
-}
-
-/* ================================================================== */
-/* Old IE styles
-/* ================================================================== */
-
-.leaflet-oldie .leaflet-draw-toolbar {
-	border: 1px solid #999;
-}
--- a/src/pyams_gis/resources/css/leaflet-gp-3.0.2.min.css	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-/*!
- * @brief Geoportal Extension for Leaflet
- *
- * This software is released under the licence CeCILL-B (Free BSD compatible)
- * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
- * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
- * @see http://www.cecill.info/
- *
- * copyright CeCILL-B
- * copyright IGN
- * @author IGN
- * @version 0.8.1
- * @date 2016-12-02
- *
- */label[id^=GPshowDrawingPicto-]{display:inline-block}input[id^=GPshowDrawing-]+label{display:block}input[id^=GPshowDrawing-]:checked+label{display:none}input[id^=GPshowDrawing-]+label+div{display:none}input[id^=GPshowDrawing-]:checked+label+div{display:block}div[^=GPdrawingPanel-]{width:240px;overflow:hidden}div[^=GPdrawingBasicPanel-]{padding:10px 15px}.GPdrawingLabel,.GPdrawingCoords{display:inline-block;line-height:20px}.GPdrawingLabel{width:80px;font-weight:bold}.GPdrawingCoords{width:110px}.marker-input-radio{display:none}input.marker-input-radio:checked+label{border:1px solid red}.GPelevationPathCalcWaitingContainerVisible,.GPelevationPathCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GPelevationPathCalcWaitingContainerVisible{display:-webkit-flex;display:flex}.GPelevationPathCalcWaitingContainerHidden{display:none}.GPelevationPathCalcWaiting{margin:auto}.GPelevationPathCalcWaitingContainerVisible,.GPelevationPathCalcWaitingContainerHidden{border-radius:5px}#profileElevationRaw{resize:none;padding:unset}div#profileElevationByDefault{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;flex-direction:column;height:inherit;width:inherit}div#profileElevationByDefault>*{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1 100%}ul#data-default{list-style:none;box-sizing:border-box;padding:0;position:relative;margin:10px;margin-top:auto;margin-bottom:auto;height:100px}.z-title-vertical{align-self:flex-start;padding-left:10px}.x-title-horizontal{align-self:flex-end;padding-right:10px}.z-axis{border-right:0;border-left:solid 2px;cursor:default}.x-axis{border-top:0;border-bottom:solid 2px;cursor:default}ul#data-default li.percent{display:inline-block;vertical-align:bottom;background-color:#c77a04;opacity:.3;border-top:solid 1px;border-radius:2px;cursor:pointer}li.axe span.bottom-axis{vertical-align:bottom}ul#data-default .percent:hover{display:inline-block;background-color:#f00}.v0{height:0}.v1{height:1%}.v2{height:2%}.v3{height:3%}.v4{height:4%}.v5{height:5%}.v6{height:6%}.v7{height:7%}.v8{height:8%}.v9{height:9%}.v10{height:10%}.v11{height:11%}.v12{height:12%}.v13{height:13%}.v14{height:14%}.v15{height:15%}.v16{height:16%}.v17{height:17%}.v18{height:18%}.v19{height:19%}.v20{height:20%}.v21{height:21%}.v22{height:22%}.v23{height:23%}.v24{height:24%}.v25{height:25%}.v26{height:26%}.v27{height:27%}.v28{height:28%}.v29{height:29%}.v30{height:30%}.v31{height:31%}.v32{height:32%}.v33{height:33%}.v34{height:34%}.v35{height:35%}.v36{height:36%}.v37{height:37%}.v38{height:38%}.v39{height:39%}.v40{height:40%}.v41{height:41%}.v42{height:42%}.v43{height:43%}.v44{height:44%}.v45{height:45%}.v46{height:46%}.v47{height:47%}.v48{height:48%}.v49{height:49%}.v50{height:50%}.v51{height:51%}.v52{height:52%}.v53{height:53%}.v54{height:54%}.v55{height:55%}.v56{height:56%}.v57{height:57%}.v58{height:58%}.v59{height:59%}.v60{height:60%}.v61{height:61%}.v62{height:62%}.v63{height:63%}.v64{height:64%}.v65{height:65%}.v66{height:66%}.v67{height:67%}.v68{height:68%}.v69{height:69%}.v70{height:70%}.v71{height:71%}.v72{height:72%}.v73{height:73%}.v74{height:74%}.v75{height:75%}.v76{height:76%}.v77{height:77%}.v78{height:78%}.v79{height:79%}.v80{height:80%}.v81{height:81%}.v82{height:82%}.v83{height:83%}.v84{height:84%}.v85{height:85%}.v86{height:86%}.v87{height:87%}.v88{height:88%}.v89{height:89%}.v90{height:90%}.v91{height:91%}.v92{height:92%}.v93{height:93%}.v94{height:94%}.v95{height:95%}.v96{height:96%}.v97{height:97%}.v98{height:98%}.v99{height:99%}.v100{height:100%}text{fill:#5e5e5e;font-family:Verdana;font-size:10px;opacity:1;text-anchor:end}.axis-d3{fill:none;stroke:#5e5e5e;stroke-width:1;shape-rendering:crispEdges}.area-d3{fill:#c77a04;stroke:#5e5e5e;stroke-width:0;fill-opacity:.4}.line-d3{fill:none;stroke:#c77a04;stroke-width:1px}.grid-d3 .tick{stroke:lightgrey;opacity:.7}.grid-d3 path{stroke-width:0}.grid-d3 .tick{stroke:lightgrey;opacity:.7}.grid-d3 path{stroke-width:0}.overlay-d3{fill:none;pointer-events:all}.focusLine-d3{fill:none;stroke:#c77a04;stroke-width:.5px}.focusCircle-d3{fill:#c77a04}div.tooltip-d3{position:inherit;text-align:left;width:80px;height:35px;padding:2px;font:8px sans-serif;background:lightsteelblue;border:0;border-radius:8px;pointer-events:none}.GPwidget{position:absolute;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;font-size:13px;color:#333}.GPwidget input[type='text'],.GPwidget input[type='button']{-webkit-appearance:none;color:#333}.GPwidget input[type="checkbox"]{display:none}.GPwidget select{padding-left:3px;border-radius:3px}.GPwidget form{margin-bottom:0}.GPwidget *{box-sizing:border-box;background-repeat:no-repeat}.GPwaiting{background-image:url("../img/gp/waiting.gif");background-position:center center;background-repeat:no-repeat}.GPpanel{background-color:#FFF}.GPpanelHeader{position:relative;width:100%}.GPpanelTitle{width:100%;height:100%;text-align:center;font-weight:bold}.GPpanelClose,.GPpanelReduce{position:absolute;cursor:pointer}.GPshowAdvancedToolPicto{position:relative;box-sizing:border-box;cursor:pointer}.GPshowAdvancedToolOpen{position:absolute;display:block;box-sizing:border-box}.GPflexInput{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;transition:max-height .3s ease-out,opacity .3s ease-out}.GPflexInput>*{display:block;height:28px;line-height:26px;border:1px solid #999;border-radius:0}.GPflexInput *:not(:last-child){border-right:0}.GPflexInput *:first-child{border-radius:3px 0 0 3px}.GPflexInput *:last-child{border-radius:0 3px 3px 0}.GPflexInput>*:not(input){overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.GPflexInput>input{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 5px;min-width:0}.GPflexInput>select{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1;padding-right:7px}.GPflexInput>label{background-color:#f2f2f2;color:#666;padding-left:7px;padding-right:9px;cursor:pointer}.GPinputSelect{display:block;height:28px;line-height:26px;margin:auto;border:1px solid #999;color:#333;cursor:pointer}input.GPinputSubmit{display:block;width:80px;margin:auto;height:28px;line-height:26px;padding:0;background:0;border:0;border-radius:3px;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;color:#FFF;font-weight:bold;opacity:.8;transition:opacity .2s ease-out;cursor:pointer}input.GPinputSubmit:hover{opacity:1}.GPautoCompleteList,.GPadvancedAutoCompleteList{z-index:2;display:none;position:absolute;max-height:140px;background-color:#FFF;border:1px solid #999;overflow-y:hidden}.GPadvancedAutoCompleteList{width:calc(100% - 28px);border-top:0;font-size:.9em}.GPautoCompleteProposal{width:100%;height:28px;line-height:16px;padding:6px 10px;color:#5e5e5e;font-size:1.0em;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;cursor:pointer}.GPautoCompleteProposal:hover{color:#000;background-color:#cedbef}.GPshowMoreOptions{display:block;position:absolute;width:28px;height:28px;cursor:pointer;transition:all .5s ease-out 0s}input[type="checkbox"]:checked+.GPshowMoreOptions{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}div[id^=GPisochron-]{top:140px}label[id^=GPshowIsochronPicto]{display:inline-block}input[id^=GPshowIsochron-]+label{display:block}input[id^=GPshowIsochron-]:checked+label{display:none}input[id^=GPshowIsochron-]+label+div{display:none}input[id^=GPshowIsochron-]:checked+label+div{display:block}div[id^=GPisochronPanel-]{width:280px}.GPisochronCalcWaitingContainerVisible,.GPisochronCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GPisochronCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GPisochronCalcWaitingContainerHidden{display:none}.GPisochronCalcWaiting{margin:auto}form[id^=GPisochronForm]{padding:15px}.GPisochronFormMini{max-height:58px;overflow:hidden}.GPisochronFormMini div[id^="GPisochronReset-"],.GPisochronFormMini label[id^="GPshowIsoExclusionsPicto-"]{display:none}.GPisochronOriginVisible{display:block}.GPisochronOriginHidden{display:none}.GPisochronOriginPointerImg{width:28px;background-color:#f2f2f2;cursor:pointer}input[id^="GPisochronOriginPointer"]+.GPisochronOriginPointerImg{background-position:-1px -1px}input[id^="GPisochronOriginPointer"]:checked+.GPisochronOriginPointerImg{background-position:-29px -1px}input[id^=GPisochronSubmit]{margin-top:5px}div[id^=GPisochronChoice]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;width:160px;-webkit-justify-content:space-between;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:auto;margin-top:15px;margin-bottom:5px}.GPisochronChoiceAlt input{display:none}.GPisochronChoiceAltImg{display:block;width:28px;height:28px;margin:auto;cursor:pointer}input[id^=GPisochronChoiceAltChron]+.GPisochronChoiceAltImg{background-position:-56px 0}input[id^=GPisochronChoiceAltChron]:checked+.GPisochronChoiceAltImg{background-position:-84px 0}input[id^=GPisochronChoiceAltDist]+.GPisochronChoiceAltImg{background-position:-112px 0}input[id^=GPisochronChoiceAltDist]:checked+.GPisochronChoiceAltImg{background-position:-140px 0}.GPisochronChoiceAlt span{cursor:pointer;display:block;color:#999}.GPisochronValueHidden{display:none}div[id^=GPisochronValueChron],div[id^=GPisochronValueDist]{width:220px;margin:auto}div[id^=GPisochronModeChoice]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-between;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:15px 0}.GPisochronModeLabel{display:block;text-align:center;margin-bottom:5px}div[id^=GPisochronTransportChoice] input{display:none}.GPisochronTransportImg{display:inline-block;width:28px;height:28px;cursor:pointer}.GPisochronTransportImg:first-of-type{margin-left:18px;margin-right:10px}input[id^=GPisochronTransportCar]+.GPisochronTransportImg{background-position:-168px 0}input[id^=GPisochronTransportCar]:checked+.GPisochronTransportImg{background-position:-196px 0}input[id^=GPisochronTransportPedestrian]+.GPisochronTransportImg{background-position:-224px 0}input[id^=GPisochronTransportPedestrian]:checked+.GPisochronTransportImg{background-position:-252px 0}select[id^=GPisochronDirectionSelect]{width:80px}input[id^=GPshowIsoExclusions]{display:none}.GPshowIsoExclusionsPicto{top:250px;right:0;transition:all .5s ease-out 0s}input[id^=GPshowIsoExclusions]+label+div[id^=GPisoExclusions]{max-height:0;opacity:0;margin-bottom:0}input[id^=GPshowIsoExclusions]:checked+label+div[id^=GPisoExclusions]{display:block;max-height:60px;opacity:1;margin-bottom:15px}div[id^=GPisoExclusions]{transition:max-height .5s ease-in-out .25s,opacity .5s ease-in-out .25s,margin .3s ease-in-out .25s;overflow:hidden}.GPisoExclusionsLabel{display:block;text-align:center;margin-bottom:10px;font-weight:bold;line-height:16px}.GPisoExclusionsOptions{display:-webkit-flex;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.GPisoExclusionsOption{display:block;height:28px;line-height:26px;color:#A77;background-color:#FEE;padding-left:28px;padding-right:5px;border:1px solid #A77;border-radius:3px;cursor:pointer}input:checked+.GPisoExclusionsOption{background-color:#EFE;background-position:0 -28px;color:#797;border:1px solid #797}div[id^=GPisochronReset]{position:absolute;margin-top:5px;width:28px;height:28px;border-radius:3px;opacity:.8;background-position:-281px 0;transition:opacity .2s ease-out;cursor:pointer}div[id^=GPisochronReset]:hover{opacity:1}#GPlayerSwitcher{font-size:11px}#GPlayerSwitcher [draggable]{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;user-select:none;-khtml-user-drag:element;-webkit-user-drag:element}#GPlayerSwitcher input[type="checkbox"]+div,#GPlayerSwitcher input[type="checkbox"]+label+div{max-height:0}#GPlayerSwitcher label{display:block}#GPshowLayersListPicto{position:relative;float:right;display:block;opacity:1;transition:opacity .5s ease-out 0s,box-shadow .5s ease-out 0s,border .5s ease-out 0s,border-radius .5s ease-out 0s;cursor:pointer}#GPshowLayersListOpen,#GPshowLayersListClose{position:absolute;display:block;transition:border-radius .5s ease-out 0s,opacity .5s ease-out 0s}#GPshowLayersListOpen{background-position:0 0;opacity:1}#GPshowLayersListClose{opacity:0}#GPlayerSwitcher input[type="checkbox"]:checked+div+#GPshowLayersListPicto{border-top-left-radius:0;border-top-right-radius:0}#GPlayerSwitcher input[type="checkbox"]:checked+div+#GPshowLayersListPicto #GPshowLayersListClose{opacity:1}#GPlayersList{position:relative;width:180px;border-bottom-right-radius:0;opacity:0;overflow:auto;transition:max-height .5s ease-out 0s,opacity .5s ease-out .25s}#GPlayerSwitcher input[type="checkbox"]:checked+#GPlayersList{max-height:232px;opacity:1;transition:max-height .5s ease-in 0s,opacity .25s ease-in 0s}.GPlayerSwitcher_layer{position:relative;top:0;background-color:#FFF;border-bottom:1px dotted #CCC;overflow:hidden}#GPlayersList .GPlayerSwitcher_layer:last-child{border-bottom:0}.GPlayerBasicTools,.GPlayerAdvancedTools{position:relative;width:100%;height:28px}.GPlayerVisibility,.GPlayerInfo,.GPlayerInfoOpened,.GPlayerRemove{width:28px;height:28px;cursor:pointer}.GPlayerVisibility,.GPlayerName,.GPlayerInfo,.GPlayerInfoOpened,.GPlayerRemove,.GPlayerOpacity,.GPlayerOpacityValue{position:absolute;top:0}.GPghostLayer{opacity:0}.GPlayerBasicTools{background-color:#FFF}.GPlayerVisibility{left:0;background-position:-28px 0}input[type="checkbox"]:checked+.GPlayerVisibility{background-position:0 0}.GPlayerName{left:28px;width:calc(100% - 56px);line-height:28px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-left:4px;cursor:move}.outOfRange .GPlayerName{color:#AAA}.GPshowLayerAdvancedTools{top:0;right:0;background-position:-112px 0}.GPlayerAdvancedTools{display:block;max-height:0;opacity:0;transition:max-height .5s ease-out 0s,opacity .5s ease-out 0s}#GPlayerSwitcher input[type="checkbox"]:checked+label+.GPlayerAdvancedTools{max-height:28px;opacity:1}.GPlayerInfo{left:0;background-position:-55px 0}.GPlayerInfoOpened{left:0;background-position:-83px 0}.GPlayerOpacity{left:28px;width:calc(100% - 100px);height:28px;padding-left:8px}.GPlayerOpacityValue{width:32px;left:calc(100% - 60px);line-height:28px;font-size:10px;font-style:italic;cursor:default}.GPlayerRemove{right:0;background-position:-140px 0}.GPlayerOpacity input{-webkit-appearance:none;-moz-appearance:none;background:0;display:block;width:100%;height:100%;margin:0;padding:0;overflow:hidden;cursor:pointer}.GPlayerOpacity input[type="range"]:focus{box-shadow:none;outline:0}.GPlayerOpacity input[type="range"]::-webkit-slider-runnable-track{-webkit-appearance:none;height:3px}.GPlayerOpacity input[type="range"]::-webkit-slider-thumb:before{position:absolute;top:0;right:50%;left:-200px;height:3px;pointer-events:none}.GPlayerOpacity input[type="range"]::-webkit-slider-thumb{width:9px;height:17px;-webkit-appearance:none;border:2px solid #FFF;background-color:#505050;position:relative;top:-7px}.GPlayerOpacity input[type="range"]::-moz-range-track{width:80px;height:3px}.GPlayerOpacity input[type="range"]::-moz-range-thumb{width:5px;height:13px;border:2px solid #FFF;border-radius:0;box-shadow:0;background-color:#505050;position:relative}.GPlayerOpacity input[type="range"]::-ms-track{border:0;border-color:transparent;border-radius:0;border-width:0;color:transparent;height:3px;width:80px}.GPlayerOpacity input[type="range"]::-ms-fill-lower,.GPlayerOpacity input[type="range"]::-ms-fill-upper{background:transparent;border-radius:0}.GPlayerOpacity input[type="range"]::-ms-thumb{width:5px;height:13px;border:2px solid #FFF;background-color:#505050}.GPlayerOpacity input[type="range"]::-ms-tooltip{display:none}#GPlayerInfoPanel{position:absolute;top:0;overflow-y:hidden;padding-top:10px;padding-bottom:10px}.GPlayerInfoPanelOpened{display:block}.GPlayerInfoPanelClosed{display:none}#GPlayerInfoContent{position:relative;width:280px;max-height:200px;overflow-y:auto;padding-left:10px;padding-right:10px}#GPlayerInfoTitle{width:calc(100% - 52px);margin:auto;margin-bottom:10px;padding-bottom:5px;text-align:center;font-size:1.1em;font-weight:bold}#GPlayerInfoQuicklook{position:absolute;top:-2px;left:10px;width:20px;height:20px;cursor:pointer}#GPlayerInfoClose{position:absolute;top:-8px;right:10px;width:28px;height:28px;cursor:pointer}#GPlayerInfoDescription{font-size:.9em}.GPlayerInfoSubtitle{padding-left:35px;font-weight:bold;margin-top:10px;margin-bottom:4px}.GPlayerInfoLink,.GPlayerInfoPopup{line-height:20px;padding-left:23px;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;color:#999;background-repeat:no-repeat;cursor:pointer}.GPlayerInfoLink{background-position:0 -20px}.GPlayerInfoLink:hover,.GPlayerInfoPopup:hover{color:#333}.GPlayerInfoLink a,.GPlayerInfoLink a:visited .GPlayerInfoLink a:focus .GPlayerInfoLink a:hover{text-decoration:none;color:inherit}.GPlocationStageFlexInput{max-height:28px;opacity:1}.GPlocationStageFlexInputHidden{max-height:0;opacity:0;overflow:hidden}.GPlocationOriginVisible{display:block}.GPlocationOriginHidden{display:none}label.GPlocationOriginPointerImg[id*="GPlocationOriginPointerImg"]{width:28px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-right:1px solid #999}input[id*="GPlocationOriginPointer"]+.GPlocationOriginPointerImg{background-position:-1px -1px}input[id*="GPlocationOriginPointer"]:checked+.GPlocationOriginPointerImg{background-position:-29px -1px}.GPlocationStageRemove,div[id^=GPlocationStageAdd]{width:28px;border:0;cursor:pointer}.GPlocationStageRemove{background-position:-84px 0}div[id^=GPlocationStageAdd]{background-position:-56px 0}label[id^=GPshowMeasureAreaPicto-]{display:inline-block}input[id^=GPshowMeasureArea-]+label{display:block}input[id^=GPshowMeasureArea-]:checked+label{display:block;background-color:rgba(0,60,136,0.5)}input[id^=GPshowMeasureArea-]+label+div{display:block}input[id^=GPshowMeasureArea-]:checked+label+div{display:block}label[id^=GPshowMeasureAzimuthPicto-]{display:inline-block}input[id^=GPshowMeasureAzimuth-]+label{display:block}input[id^=GPshowMeasureAzimuth-]:checked+label{display:block;background-color:rgba(0,60,136,0.5)}input[id^=GPshowMeasureAzimuth-]+label+div{display:block}input[id^=GPshowMeasureAzimuth-]:checked+label+div{display:block}label[id^=GPshowMeasureLengthPicto-]{display:inline-block}input[id^=GPshowMeasureLength-]+label{display:block}input[id^=GPshowMeasureLength-]:checked+label{display:block;background-color:rgba(0,60,136,0.5)}input[id^=GPshowMeasureLength-]+label+div{display:block}input[id^=GPshowMeasureLength-]:checked+label+div{display:block}.tooltip{position:relative;background:rgba(0,0,0,0.5);border-radius:4px;color:white;padding:4px 8px;white-space:nowrap}.tooltip-measure{font-weight:bold}.tooltip-info{font-size:.75em;text-align:center}.tooltip-static{background-color:#fc3;color:black;border:1px solid white}.tooltip-hidden{display:none}.tooltip-measure::before,.tooltip-info::before,.tooltip-static::before{border-top:6px solid rgba(0,0,0,0.5);border-right:6px solid transparent;border-left:6px solid transparent;content:"";position:absolute;bottom:-6px;margin-left:-7px;left:50%}.tooltip-static::before{border-top-color:#fc3}label[id^=GPshowMousePositionPicto]{display:inline-block}input[id^=GPshowMousePosition-]+label{display:block}input[id^=GPshowMousePosition-]:checked+label{display:none}input[id^=GPshowMousePosition-]+label+div{display:none}input[id^=GPshowMousePosition-]:checked+label+div{display:block}div[id^=GPmousePositionPanel-]{width:240px;overflow:hidden}div[id^=GPmousePositionBasicPanel]{padding:10px 15px}.GPmousePositionLabel,.GPmousePositionCoords{display:inline-block;line-height:20px}.GPmousePositionLabel{width:80px;font-weight:bold}.GPmousePositionCoords{width:110px}.GPshowMousePositionSettingsPicto{bottom:5px;right:0;transition:all .5s ease-out 0s}div[id^=GPmousePosition-] input[type="checkbox"]:checked+.GPshowMousePositionSettingsPicto{bottom:100px}div[id^=GPmousePositionSettings-]{display:block;max-height:0;opacity:0;transition:max-height .5s ease-out 0s,opacity .5s ease-out 0s}div[id^=GPmousePosition-] input[type="checkbox"]:checked+label+div[id^=GPmousePositionSettings-]{max-height:95px;opacity:1}div[id^=GPmousePositionSettings-]{height:95px;padding-left:0 15px;overflow:hidden}.GPmousePositionSettingsLabel{display:block;margin:auto;text-align:center;font-weight:bold;line-height:16px}.GPmousePositionSettingsSelect{width:180px;margin-top:5px}#GPmapCenter{display:none;position:absolute;top:50%;left:50%;width:50px;height:50px;margin-top:-25px;margin-left:-25px}#GPmapCenter.GPmapCenterVisible{display:block}[id^="GPreverseGeocoding-"]{top:180px}[id^="GPshowReverseGeocodingPicto-"]{display:inline-block}[id^="GPshowReverseGeocoding-"]+label{display:block}[id^="GPshowReverseGeocoding-"]:checked+label{display:none}[id^="GPshowReverseGeocoding-"]+label+div{display:none}[id^="GPshowReverseGeocoding-"]:checked+label+div{display:block}div[id^=GPreverseGeocodingResultsClose]{top:0;right:0;width:30px;height:32px}[id^="GPreverseGeocodingPanel-"]{width:280px}.GPreverseGeocodingComponentHidden{display:none}div[id^="GPreverseGeocodingReturnPicto-"]{position:absolute;width:26px;height:26px;border-radius:3px;opacity:1;background-position:0 0;cursor:pointer}.GPreverseGeocodingReturnPictoHidden{display:none}.GPreverseGeocodingCalcWaitingContainerVisible,.GPreverseGeocodingCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GPreverseGeocodingCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GPreverseGeocodingCalcWaitingContainerHidden{display:none}.GPreverseGeocodingCalcWaiting{margin:auto}[id^="GPreverseGeocodingForm-"]{position:relative;max-height:270px;overflow-y:auto;padding-left:15px;padding-right:15px;padding-top:10px}.GPreverseGeocodingCodeLabel,.GPreverseGeocodingFilterLabel{max-width:105px}.GPreverseGeocodingCodeLabel,.GPreverseGeocodingCode{margin-top:5px;margin-bottom:0}.GPreverseGeocodingFilterLabel,.GPreverseGeocodingFilterInput{margin-bottom:5px}input[id^="GPreverseGeocodingSubmit-"]{margin-top:5px;margin-bottom:15px;width:100px}.GPreverseGeocodingCalcWaitingContainerVisible,.GPreverseGeocodingCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GPreverseGeocodingCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GPreverseGeocodingCalcWaitingContainerHidden{display:none}.GPreverseGeocodingCalcWaiting{margin:auto}div[id^=GPreverseGeocodingResultsList-]{position:relative;max-height:210px;overflow-y:auto}div[id^=GProute-]{top:100px}label[id^=GPshowRoutePicto]{display:inline-block}input[id^=GPshowRoute-]+label{display:block}input[id^=GPshowRoute-]:checked+label{display:none}input[id^=GPshowRoute-]+label+div{display:none}input[id^=GPshowRoute-]:checked+label+div{display:block}div[id^=GProutePanel-]{width:320px}.GProuteComponentHidden{display:none}.GProuteCalcWaitingContainerVisible,.GProuteCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GProuteCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GProuteCalcWaitingContainerHidden{display:none}.GProuteCalcWaiting{margin:auto}form[id^=GProuteForm]{padding:15px}.GProuteFormMini{max-height:58px;overflow:hidden;-webkit-transform:translateY(-5px);transform:translateY(-5px)}.GProuteStageFlexInput{max-height:28px;opacity:1}.GProuteStageFlexInputHidden{max-height:0;opacity:0;overflow:hidden}form[id^=GProuteForm]>.GPlocationStageFlexInput{margin-top:5px}form[id^=GProuteForm]>.GPlocationStageFlexInputHidden{margin-top:0}form[id^=GProuteForm].GProuteFormMini .GPlocationStageFlexInput:first-child{margin-top:5px}.GProuteOriginVisible{display:block}.GProuteOriginHidden{display:none}label.GProuteOriginPointerImg[id*="GProuteOriginPointerImg"]{width:28px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-right:1px solid #999}input[id*="GProuteOriginPointer"]+.GProuteOriginPointerImg{background-position:-1px -1px}input[id*="GProuteOriginPointer"]:checked+.GProuteOriginPointerImg{background-position:-29px -1px}.GProuteStageRemove,div[id^=GProuteStageAdd]{width:28px;border:0;cursor:pointer}.GProuteFormMini .GProuteStageRemove,.GProuteFormMini div[id^=GProuteStageAdd]{display:none}.GProuteStageRemove{background-position:-84px 0}div[id^=GProuteStageAdd]{background-position:-56px 0}div[id^=GProuteModeChoice]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin:15px 0}.GProuteModeLabel{display:block;text-align:center;margin-bottom:5px}div[id^=GProuteTransportChoice] input{display:none}.GProuteTransportImg{display:inline-block;width:28px;height:28px;cursor:pointer}.GProuteTransportImg:first-of-type{margin-left:18px;margin-right:10px}input[id^=GProuteTransportCar]+.GProuteTransportImg{background-position:-112px 0}input[id^=GProuteTransportCar]:checked+.GProuteTransportImg{background-position:-140px 0}input[id^=GProuteTransportPedestrian]+.GProuteTransportImg{background-position:-168px 0}input[id^=GProuteTransportPedestrian]:checked+.GProuteTransportImg{background-position:-196px 0}select[id^=GProuteComputationSelect]{width:100px}input[id^=GPshowRouteExclusions]{display:none}.GPshowRouteExclusionsPicto{top:185px;right:0;transition:all .3s ease-out 0s}input[id^=GPshowRouteExclusions]+label+div[id^=GProuteExclusions]{max-height:0;opacity:0;margin-bottom:0}input[id^=GPshowRouteExclusions]:checked+label+div[id^=GProuteExclusions]{display:block;max-height:60px;opacity:1;margin-bottom:15px}div[id^=GProuteExclusions]{transition:max-height .5s ease-in-out .25s,opacity .5s ease-in-out .25s,margin .3s ease-in-out .25s;overflow:hidden}.GProuteExclusionsLabel{display:block;text-align:center;margin-bottom:10px;font-weight:bold;line-height:16px}.GProuteExclusionsOptions{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.GProuteExclusionsOption{display:block;height:28px;line-height:26px;color:#A77;background-color:#FEE;padding-left:28px;padding-right:5px;border:1px solid #A77;border-radius:3px;cursor:pointer}input:checked+.GProuteExclusionsOption{background-color:#EFE;background-position:0 -28px;color:#797;border:1px solid #797}div[id^=GProuteReset]{position:absolute;width:28px;height:28px;border-radius:3px;opacity:.8;background-position:-224px 0;transition:opacity .2s ease-out;cursor:pointer}div[id^=GProuteReset]:hover{opacity:1}div[id^=GProuteResultsPanel]{padding:15px}.GProuteResultStage{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}div[id^=GProuteResultsStages]{margin-bottom:15px}.GProuteResultStageLabel,.GProuteResultStageValue,.GProuteResultsValueLabel,div[id^=GProuteResultsValueDist],div[id^=GProuteResultsValueTime]{display:inline-block;line-height:18px}.GProuteResultStageLabel,.GProuteResultsValueLabel{color:#666}.GProuteResultStageLabel{width:60px}.GProuteResultsValueLabel{width:65px}.GProuteResultStageValue{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-x:hidden;white-space:nowrap;text-overflow:ellipsis}div[id^=GProuteResultsValueDist],div[id^=GProuteResultsValueTime]{width:80px;font-weight:bold}div[id^=GProuteResults-]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-between;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:10px}select[id^=GProuteResultsComputationSelect]{width:100px}div[id^=GProuteResultsNew]{width:28px;height:28px;border-radius:3px;opacity:.8;background-position:-224px 0;transition:opacity .2s ease-out;cursor:pointer}div[id^=GProuteResultsNew]:hover{opacity:1}.GPfakeBorder{display:inline-block;height:14px;width:60px;border-bottom:1px solid #999}.GPfakeBorderLeft{margin-left:15px}input[id^=GProuteResultsShowDetails]+label,input[id^=GProuteResultsShowDetails]+label+label{width:130px;line-height:28px;vertical-align:top;text-align:center;font-weight:bold;cursor:pointer;transition:color .2s ease-out}input[id^=GProuteResultsShowDetails]+label,input[id^=GProuteResultsShowDetails]:checked+label+label{display:inline-block}input[id^=GProuteResultsShowDetails]:checked+label,input[id^=GProuteResultsShowDetails]+label+label{display:none}input[id^=GProuteResultsShowDetails]+label+label+div+div[id^=GProuteResultsDetails]{max-height:0;opacity:0}input[id^=GProuteResultsShowDetails]:checked+label+label+div+div[id^=GProuteResultsDetails]{max-height:200px;opacity:1}div[id^=GProuteResultsDetails]{overflow-y:auto;transition:max-height .5s ease-in-out .25s,opacity .5s ease-in-out .25s}.GProuteResultsDetailsNumber,.GProuteResultsDetailsInstruction{display:inline-block;margin-top:4px;line-height:16px;color:#666}.GProuteResultsDetailsNumber{font-weight:bold;width:22px;text-align:right;vertical-align:top}.GProuteResultsDetailsInstruction{width:calc(100% - 30px);padding-left:5px}input[id^=GPshowSearchEngine-]+label+form[id^=GPsearchInput-]{max-width:0}#GPlayerSwitcher label{display:block}input[id^=GPshowSearchEngine-]{display:none}label[id^=GPshowSearchEnginePicto]{display:inline-block;transition:border-radius 0s ease-out 0s;transition-delay:.5s}input[id^=GPshowSearchEngine-]:checked+label{border-top-right-radius:0;border-bottom-right-radius:0;transition-delay:0s}input[id^=GPshowSearchEngine-]+label+form[id^=GPsearchInput-]{max-width:0;border:0;transition:max-width .5s ease-out 0s}input[id^=GPshowSearchEngine-]:checked+label+form[id^=GPsearchInput-]{max-width:280px}input[id^=GPshowSearchEngine-]+label+form[id^=GPsearchInput-]+div[id^=GPshowAdvancedSearch]{display:none}input[id^=GPshowSearchEngine-]:checked+label+form[id^=GPsearchInput-]+div[id^=GPshowAdvancedSearch]{display:inline-block}div[id^=GPautoCompleteList]{display:none}input[id^=GPshowSearchEngine-]:checked+label+form[id^=GPsearchInput-]+div[id^=GPautoCompleteList]{display:block}form[id^=GPsearchInput-]{display:inline-block;position:relative;left:-3px;width:280px;overflow:hidden}form[id^=GPsearchInput-] input{display:block;width:100%;height:100%;border:1px solid #999;border-top-right-radius:5px;border-bottom-right-radius:5px;padding:0;padding-right:30px;padding-left:5px;color:#333;font-size:1.0em}form[id^=GPsearchInput-] input:disabled{background-color:#DDD;color:#999}div[id^=GPsearchInputReset]{position:absolute;top:0;right:0;width:30px;height:32px;background-position:-30px 0;cursor:pointer}div[id^=GPgeocodeResultsClose],div[id^=GPadvancedSearchClose]{top:0;right:0;width:30px;height:32px}div[id^=GPgeocodeResultsClose]{background-position:0 0}div[id^=GPadvancedSearchClose]{background-repeat:no-repeat}div[id^=GPshowAdvancedSearch]{transition:border-radius 0s ease-out 0s;transition-delay:.5s}div[id^=GPadvancedSearchPanel]{display:none;width:280px;vertical-align:top;overflow:hidden}form[id^=GPadvancedSearchForm]{max-height:220px;overflow-y:auto;padding-left:15px;padding-right:15px}.GPadvancedSearchCodeLabel,.GPadvancedSearchFilterLabel{max-width:105px}.GPadvancedSearchCodeLabel,.GPadvancedSearchCode,div[id^=GPadvancedSearchFilters]{margin-top:15px}.GPadvancedSearchFilterLabel,.GPadvancedSearchFilterInput{margin-bottom:5px}input[id^=GPadvancedSearchSubmit]{margin-top:10px;margin-bottom:15px}div[id^=GPautoCompleteList],div[id^=GPgeocodeResultsList]{width:280px}div[id^=GPautoCompleteList]{top:35px}div[id^=GPgeocodeResultsList]{display:none;position:absolute;top:40px;border-radius:4px;overflow:hidden}div[id^=GPgeocodeResults-]{background-color:#FFF;max-height:140px;overflow-y:auto}.GPwidget{position:relative}#GPadvancedToolsPanel{position:initial}.GPpanel{box-shadow:0 1px 5px #000;border-radius:5px}.GPpanelHeader{height:32px;background-color:#FFF;border-top-left-radius:5px;border-top-right-radius:5px}.GPpanelTitle{width:calc(100% - 60px);margin:auto;line-height:32px;color:#c77a04;border-bottom:1px solid #c77a04}.GPpanelClose{top:0;right:0;width:30px;height:32px;background-position:-30px 1px}.GPpanelReduce{top:0;right:30px;width:30px;height:32px;background-position:-60px 1px}.GPshowAdvancedToolPicto{width:30px;height:30px;box-shadow:0 1px 5px #000;background-color:#FFF;border-radius:5px}.GPshowAdvancedToolPicto:hover{background-color:#f4f4f4}.GPshowAdvancedToolOpen{width:100%;height:100%}input.GPinputSubmit{background-color:#c77a04}.GPshowMoreOptions{background-image:url("../img/gp/GPshowMoreOptions.png")}div[id^=GPelevationPath-]{top:0}label[id^=GPshowElevationPathPicto]{display:inline-block}input[id^=GPshowElevationPath-]+label{display:block}input[id^=GPshowElevationPath-]+label+div{display:none}input[id^=GPshowElevationPath-]:checked+label+div{display:block}span[id^=GPshowElevationPathOpen]{background-image:url("../img/gp/GPshowElevationPath.png")}[id^=GPelevationPathPanelClose]{background-image:url("../img/gp/GPshowElevationPath.png")}div[id^=GPelevationPathPanelReduce]{background-image:url("../img/gp/GPshowElevationPath.png")}[id^=GPelevationPathPanel-]{width:280px}[id^=GPelevationPathProfil]{height:150px;width:inherit;line-height:normal}div[id^=GPisochron-]{top:0}span[id^=GPshowIsochronOpen]{background-image:url("../img/gp/GPisochronOpen.png")}div[id^=GPisochronPanel-]{left:10px}div[id^=GPisochronPanelClose]{background-image:url("../img/gp/GPisochronOpen.png")}div[id^=GPisochronPanelReduce]{background-image:url("../img/gp/GPisochronOpen.png")}.GPisochronCalcWaitingContainerVisible,.GPisochronCalcWaitingContainerHidden{border-radius:5px}.GPisochronChoiceAlt input:checked+label+span{color:#c77a04}.GPisochronOriginPointerImg,.GPisochronChoiceAltImg,.GPisochronTransportImg{background-image:url("../img/gp/GPisochronOptions.png")}.GPisoExclusionsOption{background-image:url("../img/gp/GPisochronCheck.png")}div[id^=GPisochronReset]{background-color:#c77a04;background-image:url("../img/gp/GPisochronOptions.png")}#GPlayerSwitcher{top:10px;right:10px}#GPshowLayersListPicto{width:36px;height:36px}#GPshowLayersListOpen,#GPshowLayersListClose{background-image:url("../img/gp/GPshowLayersList.png")}#GPshowLayersListClose{background-position:-36px 0}#GPlayerSwitcher input[type="checkbox"]:checked+div+#GPshowLayersListPicto{box-shadow:0 2px 2px #000;border-top:1px solid #CCC}#GPlayerSwitcher input[type="checkbox"]:checked+div+#GPshowLayersListPicto #GPshowLayersListOpen{opacity:.4}.GPlayerVisibility,.GPshowLayerAdvancedTools,.GPlayerInfo,.GPlayerInfoOpened,.GPlayerRemove{background-image:url("../img/gp/GPlayerTools.png")}.GPlayerOpacity input[type="range"]::-webkit-slider-runnable-track{background:url("../img/gp/GPopacitySlider.png")}.GPlayerOpacity input[type="range"]::-moz-range-track{background:url("../img/gp/GPopacitySlider.png")}.GPlayerOpacity input[type="range"]::-ms-track{background:url("../img/gp/GPopacitySlider.png")}#GPlayerInfoPanel{right:190px}#GPlayerInfoTitle{color:#c77a04;border-bottom:1px solid #c77a04}#GPlayerInfoQuicklook{background-image:url("../img/gp/GPlayerInfo.png")}#GPlayerInfoClose{background-image:url("../img/gp/GPlayerInfoClose.png")}.GPlayerInfoLink,.GPlayerInfoPopup{background-image:url("../img/gp/GPlayerInfo.png")}.GPlocationStageFlexInput{margin-bottom:5px}.GPlocationOriginPointerImg,.GPlocationStageRemove,div[id^=GPlocationStageAdd],.GPlocationTransportImg{background-image:url("../img/gp/GPlocationOptions.png")}span[id^=GPshowMousePositionOpen]{background-image:url("../img/gp/GPmousePositionOpen.png")}div[id^=GPmousePositionPanelClose]{background-image:url("../img/gp/GPmousePositionOpen.png")}#GPmapCenter{background-image:url("../img/gp/GPmapCenter.png")}[id^="GPreverseGeocoding-"]{top:0}[id^="GPshowReverseGeocodingOpen-"]{background-image:url("../img/gp/GPreverseGeocodingOpen.png")}[id^="GPreverseGeocodingPanel-"]{left:10px}[id^="GPreverseGeocodingPanelClose-"]{background-image:url("../img/gp/GPreverseGeocodingOpen.png")}.GPreverseGeocodingCalcWaitingContainerVisible,.GPreverseGeocodingCalcWaitingContainerHidden{border-radius:5px}[id^="GPreverseGeocodingReturnPicto-"]{width:30px!important;height:30px!important;background-color:#c77a04;background-image:url("../img/gp/GPreturn.png")}.GPreverseGeocodedLocationHighlight{background-color:rgba(255,200,0,0.25);color:#222}div[id^=GProute-]{top:0}.GProuteStageFlexInput{margin-bottom:5px}span[id^=GPshowRouteOpen]{background-image:url("../img/gp/GProuteOpen.png")}div[id^=GProutePanel-]{left:10px}div[id^=GProutePanelClose]{background-image:url("../img/gp/GProuteOpen.png")}.GProuteCalcWaitingContainerVisible,.GProuteCalcWaitingContainerHidden{border-radius:5px}.GProuteOriginPointerImg,.GProuteStageRemove,div[id^=GProuteStageAdd],.GProuteTransportImg{background-image:url("../img/gp/GProuteOptions.png")}.GProuteExclusionsOption{background-image:url("../img/gp/GProuteCheck.png")}div[id^=GProuteResultsValueDist],div[id^=GProuteResultsValueTime]{color:#c77a04}div[id^=GProuteResultsNew]{background-color:#c77a04;background-image:url("../img/gp/GProuteOptions.png")}input[id^=GProuteResultsShowDetails]+label:hover,input[id^=GProuteResultsShowDetails]+label+label:hover{color:#c77a04}.GProuteResultsDetailsHighlight{background-color:rgba(255,200,0,0.25);color:#222}span[id^=GPshowSearchEngineOpen]{background-image:url("../img/gp/GPsearchEngineOpen.png")}form[id^=GPsearchInput-]{height:30px}div[id^=GPsearchInputReset]{background-image:url("../img/gp/GPsearchEngineClose.png")}div[id^=GPgeocodeResultsClose]{background-image:url("../img/gp/GPsearchEngineClose.png")}div[id^=GPadvancedSearchClose]{background-image:url("../img/gp/GPsearchEngineOpen.png");background-position:-60px 0}span[id^=GPshowAdvancedSearchOpen]{background-image:url("../img/gp/GPsearchEngineOpen.png");background-position:-30px 0}div[id^=GPautoCompleteList],div[id^=GPgeocodeResultsList]{margin-left:27px;box-shadow:0 1px 5px #000}div[id^=GPgeocodeResultsList]{top:38px;border-radius:5px}.leaflet-draw-section{position:relative}.leaflet-draw-toolbar{margin-top:12px}.leaflet-draw-toolbar-top{margin-top:0}.leaflet-draw-toolbar-notop a:first-child{border-top-right-radius:0}.leaflet-draw-toolbar-nobottom a:last-child{border-bottom-right-radius:0}.leaflet-draw-toolbar a{background-image:url('../img/gp/spritesheet.png');background-repeat:no-repeat}.leaflet-retina .leaflet-draw-toolbar a{background-image:url('../img/gp/spritesheet-2x.png');background-size:270px 30px}.leaflet-draw a{display:block;text-align:center;text-decoration:none}.leaflet-draw-actions{display:none;list-style:none;margin:0;padding:0;position:absolute;left:26px;top:0;white-space:nowrap}.leaflet-touch .leaflet-draw-actions{left:32px}.leaflet-right .leaflet-draw-actions{right:26px;left:auto}.leaflet-touch .leaflet-right .leaflet-draw-actions{right:32px;left:auto}.leaflet-draw-actions li{display:inline-block}.leaflet-draw-actions li:first-child a{border-left:none}.leaflet-draw-actions li:last-child a{-webkit-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.leaflet-right .leaflet-draw-actions li:last-child a{-webkit-border-radius:0;border-radius:0}.leaflet-right .leaflet-draw-actions li:first-child a{-webkit-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.leaflet-draw-actions a{background-color:#919187;border-left:1px solid #AAA;color:#FFF;font:11px/19px "Helvetica Neue",Arial,Helvetica,sans-serif;line-height:28px;text-decoration:none;padding-left:10px;padding-right:10px;height:28px}.leaflet-touch .leaflet-draw-actions a{font-size:12px;line-height:30px;height:30px}.leaflet-draw-actions-bottom{margin-top:0}.leaflet-draw-actions-top{margin-top:1px}.leaflet-draw-actions-top a,.leaflet-draw-actions-bottom a{height:27px;line-height:27px}.leaflet-draw-actions a:hover{background-color:#a0a098}.leaflet-draw-actions-top.leaflet-draw-actions-bottom a{height:26px;line-height:26px}.leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:-2px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:0 -1px}.leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-31px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-29px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-62px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-60px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-92px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-90px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-122px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-120px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-152px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-150px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-182px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-180px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-212px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-210px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-242px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-240px -2px}.leaflet-mouse-marker{background-color:#fff;cursor:crosshair}.leaflet-draw-tooltip{background:#363636;background:rgba(0,0,0,0.5);border:1px solid transparent;-webkit-border-radius:4px;border-radius:4px;color:#fff;font:12px/18px "Helvetica Neue",Arial,Helvetica,sans-serif;margin-left:20px;margin-top:-21px;padding:4px 8px;position:absolute;visibility:hidden;white-space:nowrap;z-index:6}.leaflet-draw-tooltip:before{border-right:6px solid black;border-right-color:rgba(0,0,0,0.5);border-top:6px solid transparent;border-bottom:6px solid transparent;content:"";position:absolute;top:7px;left:-7px}.leaflet-error-draw-tooltip{background-color:#f2dede;border:1px solid #e6b6bd;color:#b94a48}.leaflet-error-draw-tooltip:before{border-right-color:#e6b6bd}.leaflet-draw-tooltip-single{margin-top:-12px}.leaflet-draw-tooltip-subtext{color:#f8d5e4}.leaflet-draw-guide-dash{font-size:1%;opacity:.6;position:absolute;width:5px;height:5px}.leaflet-edit-marker-selected{background:rgba(254,87,161,0.1);border:4px dashed rgba(254,87,161,0.6);-webkit-border-radius:4px;border-radius:4px;box-sizing:content-box}.leaflet-edit-move{cursor:move}.leaflet-edit-resize{cursor:pointer}.leaflet-oldie .leaflet-draw-toolbar{border:1px solid #999}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-markercluster-1.4.1.css	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,14 @@
+.leaflet-cluster-anim .leaflet-marker-icon, .leaflet-cluster-anim .leaflet-marker-shadow {
+	-webkit-transition: -webkit-transform 0.3s ease-out, opacity 0.3s ease-in;
+	-moz-transition: -moz-transform 0.3s ease-out, opacity 0.3s ease-in;
+	-o-transition: -o-transform 0.3s ease-out, opacity 0.3s ease-in;
+	transition: transform 0.3s ease-out, opacity 0.3s ease-in;
+}
+
+.leaflet-cluster-spider-leg {
+	/* stroke-dashoffset (duration and function) should match with leaflet-marker-icon transform in order to track it exactly */
+	-webkit-transition: -webkit-stroke-dashoffset 0.3s ease-out, -webkit-stroke-opacity 0.3s ease-in;
+	-moz-transition: -moz-stroke-dashoffset 0.3s ease-out, -moz-stroke-opacity 0.3s ease-in;
+	-o-transition: -o-stroke-dashoffset 0.3s ease-out, -o-stroke-opacity 0.3s ease-in;
+	transition: stroke-dashoffset 0.3s ease-out, stroke-opacity 0.3s ease-in;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-markercluster-1.4.1.min.css	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+.leaflet-cluster-anim .leaflet-marker-icon,.leaflet-cluster-anim .leaflet-marker-shadow{-webkit-transition:-webkit-transform .3s ease-out,opacity .3s ease-in;-moz-transition:-moz-transform .3s ease-out,opacity .3s ease-in;-o-transition:-o-transform .3s ease-out,opacity .3s ease-in;transition:transform .3s ease-out,opacity .3s ease-in}.leaflet-cluster-spider-leg{-webkit-transition:-webkit-stroke-dashoffset .3s ease-out,-webkit-stroke-opacity .3s ease-in;-moz-transition:-moz-stroke-dashoffset .3s ease-out,-moz-stroke-opacity .3s ease-in;-o-transition:-o-stroke-dashoffset .3s ease-out,-o-stroke-opacity .3s ease-in;transition:stroke-dashoffset .3s ease-out,stroke-opacity .3s ease-in}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-markercluster-default-1.4.1.css	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,60 @@
+.marker-cluster-small {
+	background-color: rgba(181, 226, 140, 0.6);
+	}
+.marker-cluster-small div {
+	background-color: rgba(110, 204, 57, 0.6);
+	}
+
+.marker-cluster-medium {
+	background-color: rgba(241, 211, 87, 0.6);
+	}
+.marker-cluster-medium div {
+	background-color: rgba(240, 194, 12, 0.6);
+	}
+
+.marker-cluster-large {
+	background-color: rgba(253, 156, 115, 0.6);
+	}
+.marker-cluster-large div {
+	background-color: rgba(241, 128, 23, 0.6);
+	}
+
+	/* IE 6-8 fallback colors */
+.leaflet-oldie .marker-cluster-small {
+	background-color: rgb(181, 226, 140);
+	}
+.leaflet-oldie .marker-cluster-small div {
+	background-color: rgb(110, 204, 57);
+	}
+
+.leaflet-oldie .marker-cluster-medium {
+	background-color: rgb(241, 211, 87);
+	}
+.leaflet-oldie .marker-cluster-medium div {
+	background-color: rgb(240, 194, 12);
+	}
+
+.leaflet-oldie .marker-cluster-large {
+	background-color: rgb(253, 156, 115);
+	}
+.leaflet-oldie .marker-cluster-large div {
+	background-color: rgb(241, 128, 23);
+}
+
+.marker-cluster {
+	background-clip: padding-box;
+	border-radius: 20px;
+	}
+.marker-cluster div {
+	width: 30px;
+	height: 30px;
+	margin-left: 5px;
+	margin-top: 5px;
+
+	text-align: center;
+	border-radius: 15px;
+	font: 12px "Helvetica Neue", Arial, Helvetica, sans-serif;
+	}
+.marker-cluster span {
+	line-height: 30px;
+	}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/css/leaflet-markercluster-default-1.4.1.min.css	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+.marker-cluster-small{background-color:rgba(181,226,140,.6)}.marker-cluster-small div{background-color:rgba(110,204,57,.6)}.marker-cluster-medium{background-color:rgba(241,211,87,.6)}.marker-cluster-medium div{background-color:rgba(240,194,12,.6)}.marker-cluster-large{background-color:rgba(253,156,115,.6)}.marker-cluster-large div{background-color:rgba(241,128,23,.6)}.leaflet-oldie .marker-cluster-small{background-color:#b5e28c}.leaflet-oldie .marker-cluster-small div{background-color:#6ecc39}.leaflet-oldie .marker-cluster-medium{background-color:#f1d357}.leaflet-oldie .marker-cluster-medium div{background-color:#f0c20c}.leaflet-oldie .marker-cluster-large{background-color:#fd9c73}.leaflet-oldie .marker-cluster-large div{background-color:#f18017}.marker-cluster{background-clip:padding-box;border-radius:20px}.marker-cluster div{width:30px;height:30px;margin-left:5px;margin-top:5px;text-align:center;border-radius:15px;font:12px "Helvetica Neue",Arial,Helvetica,sans-serif}.marker-cluster span{line-height:30px}
Binary file src/pyams_gis/resources/img/spritesheet-2x.png has changed
Binary file src/pyams_gis/resources/img/spritesheet.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/img/spritesheet.svg	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+	xmlns:dc="http://purl.org/dc/elements/1.1/"
+	xmlns:cc="http://creativecommons.org/ns#"
+	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+	xmlns="http://www.w3.org/2000/svg"
+	xmlns:xlink="http://www.w3.org/1999/xlink"
+	xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+	xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+	viewBox="0 0 600 60"
+	height="60"
+	width="600"
+	id="svg4225"
+	version="1.1"
+	inkscape:version="0.91 r13725"
+	sodipodi:docname="spritesheet.svg"
+	inkscape:export-filename="/home/fpuga/development/upstream/icarto.Leaflet.draw/src/images/spritesheet-2x.png"
+	inkscape:export-xdpi="90"
+	inkscape:export-ydpi="90">
+	<metadata
+		id="metadata4258">
+		<rdf:RDF>
+			<cc:Work
+				rdf:about="">
+				<dc:format>image/svg+xml</dc:format>
+				<dc:type
+					rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+				<dc:title/>
+			</cc:Work>
+		</rdf:RDF>
+	</metadata>
+	<defs
+		id="defs4256"/>
+	<sodipodi:namedview
+		pagecolor="#ffffff"
+		bordercolor="#666666"
+		borderopacity="1"
+		objecttolerance="10"
+		gridtolerance="10"
+		guidetolerance="10"
+		inkscape:pageopacity="0"
+		inkscape:pageshadow="2"
+		inkscape:window-width="1920"
+		inkscape:window-height="1056"
+		id="namedview4254"
+		showgrid="false"
+		inkscape:zoom="1.3101852"
+		inkscape:cx="237.56928"
+		inkscape:cy="7.2419621"
+		inkscape:window-x="1920"
+		inkscape:window-y="24"
+		inkscape:window-maximized="1"
+		inkscape:current-layer="svg4225"/>
+	<g
+		id="enabled"
+		style="fill:#464646;fill-opacity:1">
+		<g
+			id="polyline"
+			style="fill:#464646;fill-opacity:1">
+			<path
+				d="m 18,36 0,6 6,0 0,-6 -6,0 z m 4,4 -2,0 0,-2 2,0 0,2 z"
+				id="path4229"
+				inkscape:connector-curvature="0"
+				style="fill:#464646;fill-opacity:1"/>
+			<path
+				d="m 36,18 0,6 6,0 0,-6 -6,0 z m 4,4 -2,0 0,-2 2,0 0,2 z"
+				id="path4231"
+				inkscape:connector-curvature="0"
+				style="fill:#464646;fill-opacity:1"/>
+			<path
+				d="m 23.142,39.145 -2.285,-2.29 16,-15.998 2.285,2.285 z"
+				id="path4233"
+				inkscape:connector-curvature="0"
+				style="fill:#464646;fill-opacity:1"/>
+		</g>
+		<path
+			id="polygon"
+			d="M 100,24.565 97.904,39.395 83.07,42 76,28.773 86.463,18 Z"
+			inkscape:connector-curvature="0"
+			style="fill:#464646;fill-opacity:1"/>
+		<path
+			id="rectangle"
+			d="m 140,20 20,0 0,20 -20,0 z"
+			inkscape:connector-curvature="0"
+			style="fill:#464646;fill-opacity:1"/>
+		<path
+			id="circle"
+			d="m 221,30 c 0,6.078 -4.926,11 -11,11 -6.074,0 -11,-4.922 -11,-11 0,-6.074 4.926,-11 11,-11 6.074,0 11,4.926 11,11 z"
+			inkscape:connector-curvature="0"
+			style="fill:#464646;fill-opacity:1"/>
+		<path
+			id="marker"
+			d="m 270,19 c -4.971,0 -9,4.029 -9,9 0,4.971 5.001,12 9,14 4.001,-2 9,-9.029 9,-14 0,-4.971 -4.029,-9 -9,-9 z m 0,12.5 c -2.484,0 -4.5,-2.014 -4.5,-4.5 0,-2.484 2.016,-4.5 4.5,-4.5 2.485,0 4.5,2.016 4.5,4.5 0,2.486 -2.015,4.5 -4.5,4.5 z"
+			inkscape:connector-curvature="0"
+			style="fill:#464646;fill-opacity:1"/>
+		<g
+			id="edit"
+			style="fill:#464646;fill-opacity:1">
+			<path
+				d="m 337,30.156 0,0.407 0,5.604 c 0,1.658 -1.344,3 -3,3 l -10,0 c -1.655,0 -3,-1.342 -3,-3 l 0,-10 c 0,-1.657 1.345,-3 3,-3 l 6.345,0 3.19,-3.17 -9.535,0 c -3.313,0 -6,2.687 -6,6 l 0,10 c 0,3.313 2.687,6 6,6 l 10,0 c 3.314,0 6,-2.687 6,-6 l 0,-8.809 -3,2.968"
+				id="path4240"
+				inkscape:connector-curvature="0"
+				style="fill:#464646;fill-opacity:1"/>
+			<path
+				d="m 338.72,24.637 -8.892,8.892 -2.828,0 0,-2.829 8.89,-8.89 z"
+				id="path4242"
+				inkscape:connector-curvature="0"
+				style="fill:#464646;fill-opacity:1"/>
+			<path
+				d="m 338.697,17.826 4,0 0,4 -4,0 z"
+				transform="matrix(-0.70698336,-0.70723018,0.70723018,-0.70698336,567.55917,274.78273)"
+				id="path4244"
+				inkscape:connector-curvature="0"
+				style="fill:#464646;fill-opacity:1"/>
+		</g>
+		<g
+			id="remove"
+			style="fill:#464646;fill-opacity:1">
+			<path
+				d="m 381,42 18,0 0,-18 -18,0 0,18 z m 14,-16 2,0 0,14 -2,0 0,-14 z m -4,0 2,0 0,14 -2,0 0,-14 z m -4,0 2,0 0,14 -2,0 0,-14 z m -4,0 2,0 0,14 -2,0 0,-14 z"
+				id="path4247"
+				inkscape:connector-curvature="0"
+				style="fill:#464646;fill-opacity:1"/>
+			<path
+				d="m 395,20 0,-4 -10,0 0,4 -6,0 0,2 22,0 0,-2 -6,0 z m -2,0 -6,0 0,-2 6,0 0,2 z"
+				id="path4249"
+				inkscape:connector-curvature="0"
+				style="fill:#464646;fill-opacity:1"/>
+		</g>
+	</g>
+	<g
+		id="disabled"
+		transform="translate(120,0)"
+		style="fill:#bbbbbb">
+		<use
+			xlink:href="#edit"
+			id="edit-disabled"
+			x="0"
+			y="0"
+			width="100%"
+			height="100%"/>
+		<use
+			xlink:href="#remove"
+			id="remove-disabled"
+			x="0"
+			y="0"
+			width="100%"
+			height="100%"/>
+	</g>
+	<path
+		style="fill:none;stroke:#464646;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+		id="circle-3"
+		d="m 581.65725,30 c 0,6.078 -4.926,11 -11,11 -6.074,0 -11,-4.922 -11,-11 0,-6.074 4.926,-11 11,-11 6.074,0 11,4.926 11,11 z"
+		inkscape:connector-curvature="0"/>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/Control.Draw.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,118 @@
+/**
+ * @class L.Control.Draw
+ * @aka L.Draw
+ */
+L.Control.Draw = L.Control.extend({
+
+	// Options
+	options: {
+		position: 'topleft',
+		draw: {},
+		edit: false
+	},
+
+	// @method initialize(): void
+	// Initializes draw control, toolbars from the options
+	initialize: function (options) {
+		if (L.version < '0.7') {
+			throw new Error('Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/');
+		}
+
+		L.Control.prototype.initialize.call(this, options);
+
+		var toolbar;
+
+		this._toolbars = {};
+
+		// Initialize toolbars
+		if (L.DrawToolbar && this.options.draw) {
+			toolbar = new L.DrawToolbar(this.options.draw);
+
+			this._toolbars[L.DrawToolbar.TYPE] = toolbar;
+
+			// Listen for when toolbar is enabled
+			this._toolbars[L.DrawToolbar.TYPE].on('enable', this._toolbarEnabled, this);
+		}
+
+		if (L.EditToolbar && this.options.edit) {
+			toolbar = new L.EditToolbar(this.options.edit);
+
+			this._toolbars[L.EditToolbar.TYPE] = toolbar;
+
+			// Listen for when toolbar is enabled
+			this._toolbars[L.EditToolbar.TYPE].on('enable', this._toolbarEnabled, this);
+		}
+		L.toolbar = this; //set global var for editing the toolbar
+	},
+
+	// @method onAdd(): container
+	// Adds the toolbar container to the map
+	onAdd: function (map) {
+		var container = L.DomUtil.create('div', 'leaflet-draw'),
+			addedTopClass = false,
+			topClassName = 'leaflet-draw-toolbar-top',
+			toolbarContainer;
+
+		for (var toolbarId in this._toolbars) {
+			if (this._toolbars.hasOwnProperty(toolbarId)) {
+				toolbarContainer = this._toolbars[toolbarId].addToolbar(map);
+
+				if (toolbarContainer) {
+					// Add class to the first toolbar to remove the margin
+					if (!addedTopClass) {
+						if (!L.DomUtil.hasClass(toolbarContainer, topClassName)) {
+							L.DomUtil.addClass(toolbarContainer.childNodes[0], topClassName);
+						}
+						addedTopClass = true;
+					}
+
+					container.appendChild(toolbarContainer);
+				}
+			}
+		}
+
+		return container;
+	},
+
+	// @method onRemove(): void
+	// Removes the toolbars from the map toolbar container
+	onRemove: function () {
+		for (var toolbarId in this._toolbars) {
+			if (this._toolbars.hasOwnProperty(toolbarId)) {
+				this._toolbars[toolbarId].removeToolbar();
+			}
+		}
+	},
+
+	// @method setDrawingOptions(options): void
+	// Sets options to all toolbar instances
+	setDrawingOptions: function (options) {
+		for (var toolbarId in this._toolbars) {
+			if (this._toolbars[toolbarId] instanceof L.DrawToolbar) {
+				this._toolbars[toolbarId].setOptions(options);
+			}
+		}
+	},
+
+	_toolbarEnabled: function (e) {
+		var enabledToolbar = e.target;
+
+		for (var toolbarId in this._toolbars) {
+			if (this._toolbars[toolbarId] !== enabledToolbar) {
+				this._toolbars[toolbarId].disable();
+			}
+		}
+	}
+});
+
+L.Map.mergeOptions({
+	drawControlTooltips: true,
+	drawControl: false
+});
+
+L.Map.addInitHook(function () {
+	if (this.options.drawControl) {
+		this.drawControl = new L.Control.Draw();
+		this.addControl(this.drawControl);
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/Control.Draw.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Control.Draw=L.Control.extend({options:{position:"topleft",draw:{},edit:!1},initialize:function(o){if(L.version<"0.7")throw new Error("Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/");var t;L.Control.prototype.initialize.call(this,o),this._toolbars={},L.DrawToolbar&&this.options.draw&&(t=new L.DrawToolbar(this.options.draw),this._toolbars[L.DrawToolbar.TYPE]=t,this._toolbars[L.DrawToolbar.TYPE].on("enable",this._toolbarEnabled,this)),L.EditToolbar&&this.options.edit&&(t=new L.EditToolbar(this.options.edit),this._toolbars[L.EditToolbar.TYPE]=t,this._toolbars[L.EditToolbar.TYPE].on("enable",this._toolbarEnabled,this)),L.toolbar=this},onAdd:function(o){var t,a=L.DomUtil.create("div","leaflet-draw"),r=!1;for(var i in this._toolbars)this._toolbars.hasOwnProperty(i)&&(t=this._toolbars[i].addToolbar(o))&&(r||(L.DomUtil.hasClass(t,"leaflet-draw-toolbar-top")||L.DomUtil.addClass(t.childNodes[0],"leaflet-draw-toolbar-top"),r=!0),a.appendChild(t));return a},onRemove:function(){for(var o in this._toolbars)this._toolbars.hasOwnProperty(o)&&this._toolbars[o].removeToolbar()},setDrawingOptions:function(o){for(var t in this._toolbars)this._toolbars[t]instanceof L.DrawToolbar&&this._toolbars[t].setOptions(o)},_toolbarEnabled:function(o){var t=o.target;for(var a in this._toolbars)this._toolbars[a]!==t&&this._toolbars[a].disable()}}),L.Map.mergeOptions({drawControlTooltips:!0,drawControl:!1}),L.Map.addInitHook((function(){this.options.drawControl&&(this.drawControl=new L.Control.Draw,this.addControl(this.drawControl))}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/Leaflet.Draw.Event.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,177 @@
+/**
+ * ### Events
+ * Once you have successfully added the Leaflet.draw plugin to your map you will want to respond to the different
+ * actions users can initiate. The following events will be triggered on the map:
+ *
+ * @class L.Draw.Event
+ * @aka Draw.Event
+ *
+ * Use `L.Draw.Event.EVENTNAME` constants to ensure events are correct.
+ *
+ * @example
+ * ```js
+ * map.on(L.Draw.Event.CREATED; function (e) {
+ *    var type = e.layerType,
+ *        layer = e.layer;
+ *
+ *    if (type === 'marker') {
+ *        // Do marker specific actions
+ *    }
+ *
+ *    // Do whatever else you need to. (save to db; add to map etc)
+ *    map.addLayer(layer);
+ *});
+ * ```
+ */
+L.Draw.Event = {};
+/**
+ * @event draw:created: PolyLine; Polygon; Rectangle; Circle; Marker | String
+ *
+ * Layer that was just created.
+ * The type of layer this is. One of: `polyline`; `polygon`; `rectangle`; `circle`; `marker`
+ * Triggered when a new vector or marker has been created.
+ *
+ */
+L.Draw.Event.CREATED = 'draw:created';
+
+/**
+ * @event draw:edited: LayerGroup
+ *
+ * List of all layers just edited on the map.
+ *
+ *
+ * Triggered when layers in the FeatureGroup; initialised with the plugin; have been edited and saved.
+ *
+ * @example
+ * ```js
+ *      map.on('draw:edited', function (e) {
+     *          var layers = e.layers;
+     *          layers.eachLayer(function (layer) {
+     *              //do whatever you want; most likely save back to db
+     *          });
+     *      });
+ * ```
+ */
+L.Draw.Event.EDITED = 'draw:edited';
+
+/**
+ * @event draw:deleted: LayerGroup
+ *
+ * List of all layers just removed from the map.
+ *
+ * Triggered when layers have been removed (and saved) from the FeatureGroup.
+ */
+L.Draw.Event.DELETED = 'draw:deleted';
+
+/**
+ * @event draw:drawstart: String
+ *
+ * The type of layer this is. One of:`polyline`; `polygon`; `rectangle`; `circle`; `marker`
+ *
+ * Triggered when the user has chosen to draw a particular vector or marker.
+ */
+L.Draw.Event.DRAWSTART = 'draw:drawstart';
+
+/**
+ * @event draw:drawstop: String
+ *
+ * The type of layer this is. One of: `polyline`; `polygon`; `rectangle`; `circle`; `marker`
+ *
+ * Triggered when the user has finished a particular vector or marker.
+ */
+
+L.Draw.Event.DRAWSTOP = 'draw:drawstop';
+
+/**
+ * @event draw:drawvertex: LayerGroup
+ *
+ * List of all layers just being added from the map.
+ *
+ * Triggered when a vertex is created on a polyline or polygon.
+ */
+L.Draw.Event.DRAWVERTEX = 'draw:drawvertex';
+
+/**
+ * @event draw:editstart: String
+ *
+ * The type of edit this is. One of: `edit`
+ *
+ * Triggered when the user starts edit mode by clicking the edit tool button.
+ */
+
+L.Draw.Event.EDITSTART = 'draw:editstart';
+
+/**
+ * @event draw:editmove: ILayer
+ *
+ *  Layer that was just moved.
+ *
+ * Triggered as the user moves a rectangle; circle or marker.
+ */
+L.Draw.Event.EDITMOVE = 'draw:editmove';
+
+/**
+ * @event draw:editresize: ILayer
+ *
+ * Layer that was just moved.
+ *
+ * Triggered as the user resizes a rectangle or circle.
+ */
+L.Draw.Event.EDITRESIZE = 'draw:editresize';
+
+/**
+ * @event draw:editvertex: LayerGroup
+ *
+ * List of all layers just being edited from the map.
+ *
+ * Triggered when a vertex is edited on a polyline or polygon.
+ */
+L.Draw.Event.EDITVERTEX = 'draw:editvertex';
+
+/**
+ * @event draw:editstop: String
+ *
+ * The type of edit this is. One of: `edit`
+ *
+ * Triggered when the user has finshed editing (edit mode) and saves edits.
+ */
+L.Draw.Event.EDITSTOP = 'draw:editstop';
+
+/**
+ * @event draw:deletestart: String
+ *
+ * The type of edit this is. One of: `remove`
+ *
+ * Triggered when the user starts remove mode by clicking the remove tool button.
+ */
+L.Draw.Event.DELETESTART = 'draw:deletestart';
+
+/**
+ * @event draw:deletestop: String
+ *
+ * The type of edit this is. One of: `remove`
+ *
+ * Triggered when the user has finished removing shapes (remove mode) and saves.
+ */
+L.Draw.Event.DELETESTOP = 'draw:deletestop';
+
+/**
+ * @event draw:toolbaropened: String
+ *
+ * Triggered when a toolbar is opened.
+ */
+L.Draw.Event.TOOLBAROPENED = 'draw:toolbaropened';
+
+/**
+ * @event draw:toolbarclosed: String
+ *
+ * Triggered when a toolbar is closed.
+ */
+L.Draw.Event.TOOLBARCLOSED = 'draw:toolbarclosed';
+
+/**
+ * @event draw:markercontext: String
+ *
+ * Triggered when a marker is right clicked.
+ */
+L.Draw.Event.MARKERCONTEXT = 'draw:markercontext';
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/Leaflet.Draw.Event.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Draw.Event={},L.Draw.Event.CREATED="draw:created",L.Draw.Event.EDITED="draw:edited",L.Draw.Event.DELETED="draw:deleted",L.Draw.Event.DRAWSTART="draw:drawstart",L.Draw.Event.DRAWSTOP="draw:drawstop",L.Draw.Event.DRAWVERTEX="draw:drawvertex",L.Draw.Event.EDITSTART="draw:editstart",L.Draw.Event.EDITMOVE="draw:editmove",L.Draw.Event.EDITRESIZE="draw:editresize",L.Draw.Event.EDITVERTEX="draw:editvertex",L.Draw.Event.EDITSTOP="draw:editstop",L.Draw.Event.DELETESTART="draw:deletestart",L.Draw.Event.DELETESTOP="draw:deletestop",L.Draw.Event.TOOLBAROPENED="draw:toolbaropened",L.Draw.Event.TOOLBARCLOSED="draw:toolbarclosed",L.Draw.Event.MARKERCONTEXT="draw:markercontext";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/Leaflet.draw.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,189 @@
+/**
+ * Leaflet.draw assumes that you have already included the Leaflet library.
+ */
+L.drawVersion = '0.4.2';
+/**
+ * @class L.Draw
+ * @aka Draw
+ *
+ *
+ * To add the draw toolbar set the option drawControl: true in the map options.
+ *
+ * @example
+ * ```js
+ *      var map = L.map('map', {drawControl: true}).setView([51.505, -0.09], 13);
+ *
+ *      L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
+ *          attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
+ *      }).addTo(map);
+ * ```
+ *
+ * ### Adding the edit toolbar
+ * To use the edit toolbar you must initialise the Leaflet.draw control and manually add it to the map.
+ *
+ * ```js
+ *      var map = L.map('map').setView([51.505, -0.09], 13);
+ *
+ *      L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
+ *          attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
+ *      }).addTo(map);
+ *
+ *      // FeatureGroup is to store editable layers
+ *      var drawnItems = new L.FeatureGroup();
+ *      map.addLayer(drawnItems);
+ *
+ *      var drawControl = new L.Control.Draw({
+ *          edit: {
+ *              featureGroup: drawnItems
+ *          }
+ *      });
+ *      map.addControl(drawControl);
+ * ```
+ *
+ * The key here is the featureGroup option. This tells the plugin which FeatureGroup contains the layers that
+ * should be editable. The featureGroup can contain 0 or more features with geometry types Point, LineString, and Polygon.
+ * Leaflet.draw does not work with multigeometry features such as MultiPoint, MultiLineString, MultiPolygon,
+ * or GeometryCollection. If you need to add multigeometry features to the draw plugin, convert them to a
+ * FeatureCollection of non-multigeometries (Points, LineStrings, or Polygons).
+ */
+L.Draw = {};
+
+/**
+ * @class L.drawLocal
+ * @aka L.drawLocal
+ *
+ * The core toolbar class of the API — it is used to create the toolbar ui
+ *
+ * @example
+ * ```js
+ *      var modifiedDraw = L.drawLocal.extend({
+ *          draw: {
+ *              toolbar: {
+ *                  buttons: {
+ *                      polygon: 'Draw an awesome polygon'
+ *                  }
+ *              }
+ *          }
+ *      });
+ * ```
+ *
+ * The default state for the control is the draw toolbar just below the zoom control.
+ *  This will allow map users to draw vectors and markers.
+ *  **Please note the edit toolbar is not enabled by default.**
+ */
+L.drawLocal = {
+	// format: {
+	// 	numeric: {
+	// 		delimiters: {
+	// 			thousands: ',',
+	// 			decimal: '.'
+	// 		}
+	// 	}
+	// },
+	draw: {
+		toolbar: {
+			// #TODO: this should be reorganized where actions are nested in actions
+			// ex: actions.undo  or actions.cancel
+			actions: {
+				title: 'Cancel drawing',
+				text: 'Cancel'
+			},
+			finish: {
+				title: 'Finish drawing',
+				text: 'Finish'
+			},
+			undo: {
+				title: 'Delete last point drawn',
+				text: 'Delete last point'
+			},
+			buttons: {
+				polyline: 'Draw a polyline',
+				polygon: 'Draw a polygon',
+				rectangle: 'Draw a rectangle',
+				circle: 'Draw a circle',
+				marker: 'Draw a marker',
+				circlemarker: 'Draw a circlemarker'
+			}
+		},
+		handlers: {
+			circle: {
+				tooltip: {
+					start: 'Click and drag to draw circle.'
+				},
+				radius: 'Radius'
+			},
+			circlemarker: {
+				tooltip: {
+					start: 'Click map to place circle marker.'
+				}
+			},
+			marker: {
+				tooltip: {
+					start: 'Click map to place marker.'
+				}
+			},
+			polygon: {
+				tooltip: {
+					start: 'Click to start drawing shape.',
+					cont: 'Click to continue drawing shape.',
+					end: 'Click first point to close this shape.'
+				}
+			},
+			polyline: {
+				error: '<strong>Error:</strong> shape edges cannot cross!',
+				tooltip: {
+					start: 'Click to start drawing line.',
+					cont: 'Click to continue drawing line.',
+					end: 'Click last point to finish line.'
+				}
+			},
+			rectangle: {
+				tooltip: {
+					start: 'Click and drag to draw rectangle.'
+				}
+			},
+			simpleshape: {
+				tooltip: {
+					end: 'Release mouse to finish drawing.'
+				}
+			}
+		}
+	},
+	edit: {
+		toolbar: {
+			actions: {
+				save: {
+					title: 'Save changes',
+					text: 'Save'
+				},
+				cancel: {
+					title: 'Cancel editing, discards all changes',
+					text: 'Cancel'
+				},
+				clearAll: {
+					title: 'Clear all layers',
+					text: 'Clear All'
+				}
+			},
+			buttons: {
+				edit: 'Edit layers',
+				editDisabled: 'No layers to edit',
+				remove: 'Delete layers',
+				removeDisabled: 'No layers to delete'
+			}
+		},
+		handlers: {
+			edit: {
+				tooltip: {
+					text: 'Drag handles or markers to edit features.',
+					subtext: 'Click cancel to undo changes.'
+				}
+			},
+			remove: {
+				tooltip: {
+					text: 'Click on a feature to remove.'
+				}
+			}
+		}
+	}
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/Leaflet.draw.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.drawVersion="0.4.2",L.Draw={},L.drawLocal={draw:{toolbar:{actions:{title:"Cancel drawing",text:"Cancel"},finish:{title:"Finish drawing",text:"Finish"},undo:{title:"Delete last point drawn",text:"Delete last point"},buttons:{polyline:"Draw a polyline",polygon:"Draw a polygon",rectangle:"Draw a rectangle",circle:"Draw a circle",marker:"Draw a marker",circlemarker:"Draw a circlemarker"}},handlers:{circle:{tooltip:{start:"Click and drag to draw circle."},radius:"Radius"},circlemarker:{tooltip:{start:"Click map to place circle marker."}},marker:{tooltip:{start:"Click map to place marker."}},polygon:{tooltip:{start:"Click to start drawing shape.",cont:"Click to continue drawing shape.",end:"Click first point to close this shape."}},polyline:{error:"<strong>Error:</strong> shape edges cannot cross!",tooltip:{start:"Click to start drawing line.",cont:"Click to continue drawing line.",end:"Click last point to finish line."}},rectangle:{tooltip:{start:"Click and drag to draw rectangle."}},simpleshape:{tooltip:{end:"Release mouse to finish drawing."}}}},edit:{toolbar:{actions:{save:{title:"Save changes",text:"Save"},cancel:{title:"Cancel editing, discards all changes",text:"Cancel"},clearAll:{title:"Clear all layers",text:"Clear All"}},buttons:{edit:"Edit layers",editDisabled:"No layers to edit",remove:"Delete layers",removeDisabled:"No layers to delete"}},handlers:{edit:{tooltip:{text:"Drag handles or markers to edit features.",subtext:"Click cancel to undo changes."}},remove:{tooltip:{text:"Click on a feature to remove."}}}}};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/Toolbar.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,334 @@
+/**
+ * @class L.Draw.Toolbar
+ * @aka Toolbar
+ *
+ * The toolbar class of the API — it is used to create the ui
+ * This will be depreciated
+ *
+ * @example
+ *
+ * ```js
+ *    var toolbar = L.Toolbar();
+ *    toolbar.addToolbar(map);
+ * ```
+ *
+ * ### Disabling a toolbar
+ *
+ * If you do not want a particular toolbar in your app you can turn it off by setting the toolbar to false.
+ *
+ * ```js
+ *      var drawControl = new L.Control.Draw({
+ *          draw: false,
+ *          edit: {
+ *              featureGroup: editableLayers
+ *          }
+ *      });
+ * ```
+ *
+ * ### Disabling a toolbar item
+ *
+ * If you want to turn off a particular toolbar item, set it to false. The following disables drawing polygons and
+ * markers. It also turns off the ability to edit layers.
+ *
+ * ```js
+ *      var drawControl = new L.Control.Draw({
+ *          draw: {
+ *              polygon: false,
+ *              marker: false
+ *          },
+ *          edit: {
+ *              featureGroup: editableLayers,
+ *              edit: false
+ *          }
+ *      });
+ * ```
+ */
+L.Toolbar = L.Class.extend({
+	// @section Methods for modifying the toolbar
+
+	// @method initialize(options): void
+	// Toolbar constructor
+	initialize: function (options) {
+		L.setOptions(this, options);
+
+		this._modes = {};
+		this._actionButtons = [];
+		this._activeMode = null;
+
+		var version = L.version.split('.');
+		//If Version is >= 1.2.0
+		if (parseInt(version[0], 10) === 1 && parseInt(version[1], 10) >= 2) {
+			L.Toolbar.include(L.Evented.prototype);
+		} else {
+			L.Toolbar.include(L.Mixin.Events);
+		}
+	},
+
+	// @method enabled(): boolean
+	// Gets a true/false of whether the toolbar is enabled
+	enabled: function () {
+		return this._activeMode !== null;
+	},
+
+	// @method disable(): void
+	// Disables the toolbar
+	disable: function () {
+		if (!this.enabled()) {
+			return;
+		}
+
+		this._activeMode.handler.disable();
+	},
+
+	// @method addToolbar(map): L.DomUtil
+	// Adds the toolbar to the map and returns the toolbar dom element
+	addToolbar: function (map) {
+		var container = L.DomUtil.create('div', 'leaflet-draw-section'),
+			buttonIndex = 0,
+			buttonClassPrefix = this._toolbarClass || '',
+			modeHandlers = this.getModeHandlers(map),
+			i;
+
+		this._toolbarContainer = L.DomUtil.create('div', 'leaflet-draw-toolbar leaflet-bar');
+		this._map = map;
+
+		for (i = 0; i < modeHandlers.length; i++) {
+			if (modeHandlers[i].enabled) {
+				this._initModeHandler(
+					modeHandlers[i].handler,
+					this._toolbarContainer,
+					buttonIndex++,
+					buttonClassPrefix,
+					modeHandlers[i].title
+				);
+			}
+		}
+
+		// if no buttons were added, do not add the toolbar
+		if (!buttonIndex) {
+			return;
+		}
+
+		// Save button index of the last button, -1 as we would have ++ after the last button
+		this._lastButtonIndex = --buttonIndex;
+
+		// Create empty actions part of the toolbar
+		this._actionsContainer = L.DomUtil.create('ul', 'leaflet-draw-actions');
+
+		// Add draw and cancel containers to the control container
+		container.appendChild(this._toolbarContainer);
+		container.appendChild(this._actionsContainer);
+
+		return container;
+	},
+
+	// @method removeToolbar(): void
+	// Removes the toolbar and drops the handler event listeners
+	removeToolbar: function () {
+		// Dispose each handler
+		for (var handlerId in this._modes) {
+			if (this._modes.hasOwnProperty(handlerId)) {
+				// Unbind handler button
+				this._disposeButton(
+					this._modes[handlerId].button,
+					this._modes[handlerId].handler.enable,
+					this._modes[handlerId].handler
+				);
+
+				// Make sure is disabled
+				this._modes[handlerId].handler.disable();
+
+				// Unbind handler
+				this._modes[handlerId].handler
+					.off('enabled', this._handlerActivated, this)
+					.off('disabled', this._handlerDeactivated, this);
+			}
+		}
+		this._modes = {};
+
+		// Dispose the actions toolbar
+		for (var i = 0, l = this._actionButtons.length; i < l; i++) {
+			this._disposeButton(
+				this._actionButtons[i].button,
+				this._actionButtons[i].callback,
+				this
+			);
+		}
+		this._actionButtons = [];
+		this._actionsContainer = null;
+	},
+
+	_initModeHandler: function (handler, container, buttonIndex, classNamePredix, buttonTitle) {
+		var type = handler.type;
+
+		this._modes[type] = {};
+
+		this._modes[type].handler = handler;
+
+		this._modes[type].button = this._createButton({
+			type: type,
+			title: buttonTitle,
+			className: classNamePredix + '-' + type,
+			container: container,
+			callback: this._modes[type].handler.enable,
+			context: this._modes[type].handler
+		});
+
+		this._modes[type].buttonIndex = buttonIndex;
+
+		this._modes[type].handler
+			.on('enabled', this._handlerActivated, this)
+			.on('disabled', this._handlerDeactivated, this);
+	},
+
+	/* Detect iOS based on browser User Agent, based on:
+	 * http://stackoverflow.com/a/9039885 */
+	_detectIOS: function () {
+		var iOS = (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream);
+		return iOS;
+	},
+
+	_createButton: function (options) {
+
+		var link = L.DomUtil.create('a', options.className || '', options.container);
+		// Screen reader tag
+		var sr = L.DomUtil.create('span', 'sr-only', options.container);
+
+		link.href = '#';
+		link.appendChild(sr);
+
+		if (options.title) {
+			link.title = options.title;
+			sr.innerHTML = options.title;
+		}
+
+		if (options.text) {
+			link.innerHTML = options.text;
+			sr.innerHTML = options.text;
+		}
+
+		/* iOS does not use click events */
+		var buttonEvent = this._detectIOS() ? 'touchstart' : 'click';
+
+		L.DomEvent
+			.on(link, 'click', L.DomEvent.stopPropagation)
+			.on(link, 'mousedown', L.DomEvent.stopPropagation)
+			.on(link, 'dblclick', L.DomEvent.stopPropagation)
+			.on(link, 'touchstart', L.DomEvent.stopPropagation)
+			.on(link, 'click', L.DomEvent.preventDefault)
+			.on(link, buttonEvent, options.callback, options.context);
+
+		return link;
+	},
+
+	_disposeButton: function (button, callback) {
+		/* iOS does not use click events */
+		var buttonEvent = this._detectIOS() ? 'touchstart' : 'click';
+
+		L.DomEvent
+			.off(button, 'click', L.DomEvent.stopPropagation)
+			.off(button, 'mousedown', L.DomEvent.stopPropagation)
+			.off(button, 'dblclick', L.DomEvent.stopPropagation)
+			.off(button, 'touchstart', L.DomEvent.stopPropagation)
+			.off(button, 'click', L.DomEvent.preventDefault)
+			.off(button, buttonEvent, callback);
+	},
+
+	_handlerActivated: function (e) {
+		// Disable active mode (if present)
+		this.disable();
+
+		// Cache new active feature
+		this._activeMode = this._modes[e.handler];
+
+		L.DomUtil.addClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled');
+
+		this._showActionsToolbar();
+
+		this.fire('enable');
+	},
+
+	_handlerDeactivated: function () {
+		this._hideActionsToolbar();
+
+		L.DomUtil.removeClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled');
+
+		this._activeMode = null;
+
+		this.fire('disable');
+	},
+
+	_createActions: function (handler) {
+		var container = this._actionsContainer,
+			buttons = this.getActions(handler),
+			l = buttons.length,
+			li, di, dl, button;
+
+		// Dispose the actions toolbar (todo: dispose only not used buttons)
+		for (di = 0, dl = this._actionButtons.length; di < dl; di++) {
+			this._disposeButton(this._actionButtons[di].button, this._actionButtons[di].callback);
+		}
+		this._actionButtons = [];
+
+		// Remove all old buttons
+		while (container.firstChild) {
+			container.removeChild(container.firstChild);
+		}
+
+		for (var i = 0; i < l; i++) {
+			if ('enabled' in buttons[i] && !buttons[i].enabled) {
+				continue;
+			}
+
+			li = L.DomUtil.create('li', '', container);
+
+			button = this._createButton({
+				title: buttons[i].title,
+				text: buttons[i].text,
+				container: li,
+				callback: buttons[i].callback,
+				context: buttons[i].context
+			});
+
+			this._actionButtons.push({
+				button: button,
+				callback: buttons[i].callback
+			});
+		}
+	},
+
+	_showActionsToolbar: function () {
+		var buttonIndex = this._activeMode.buttonIndex,
+			lastButtonIndex = this._lastButtonIndex,
+			toolbarPosition = this._activeMode.button.offsetTop - 1;
+
+		// Recreate action buttons on every click
+		this._createActions(this._activeMode.handler);
+
+		// Correctly position the cancel button
+		this._actionsContainer.style.top = toolbarPosition + 'px';
+
+		if (buttonIndex === 0) {
+			L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop');
+			L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-top');
+		}
+
+		if (buttonIndex === lastButtonIndex) {
+			L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom');
+			L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-bottom');
+		}
+
+		this._actionsContainer.style.display = 'block';
+		this._map.fire(L.Draw.Event.TOOLBAROPENED);
+	},
+
+	_hideActionsToolbar: function () {
+		this._actionsContainer.style.display = 'none';
+
+		L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop');
+		L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom');
+		L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-top');
+		L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-bottom');
+		this._map.fire(L.Draw.Event.TOOLBARCLOSED);
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/Toolbar.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Toolbar=L.Class.extend({initialize:function(t){L.setOptions(this,t),this._modes={},this._actionButtons=[],this._activeMode=null;var o=L.version.split(".");1===parseInt(o[0],10)&&parseInt(o[1],10)>=2?L.Toolbar.include(L.Evented.prototype):L.Toolbar.include(L.Mixin.Events)},enabled:function(){return null!==this._activeMode},disable:function(){this.enabled()&&this._activeMode.handler.disable()},addToolbar:function(t){var o,e=L.DomUtil.create("div","leaflet-draw-section"),i=0,a=this._toolbarClass||"",n=this.getModeHandlers(t);for(this._toolbarContainer=L.DomUtil.create("div","leaflet-draw-toolbar leaflet-bar"),this._map=t,o=0;o<n.length;o++)n[o].enabled&&this._initModeHandler(n[o].handler,this._toolbarContainer,i++,a,n[o].title);if(i)return this._lastButtonIndex=--i,this._actionsContainer=L.DomUtil.create("ul","leaflet-draw-actions"),e.appendChild(this._toolbarContainer),e.appendChild(this._actionsContainer),e},removeToolbar:function(){for(var t in this._modes)this._modes.hasOwnProperty(t)&&(this._disposeButton(this._modes[t].button,this._modes[t].handler.enable,this._modes[t].handler),this._modes[t].handler.disable(),this._modes[t].handler.off("enabled",this._handlerActivated,this).off("disabled",this._handlerDeactivated,this));this._modes={};for(var o=0,e=this._actionButtons.length;o<e;o++)this._disposeButton(this._actionButtons[o].button,this._actionButtons[o].callback,this);this._actionButtons=[],this._actionsContainer=null},_initModeHandler:function(t,o,e,i,a){var n=t.type;this._modes[n]={},this._modes[n].handler=t,this._modes[n].button=this._createButton({type:n,title:a,className:i+"-"+n,container:o,callback:this._modes[n].handler.enable,context:this._modes[n].handler}),this._modes[n].buttonIndex=e,this._modes[n].handler.on("enabled",this._handlerActivated,this).on("disabled",this._handlerDeactivated,this)},_detectIOS:function(){return/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream},_createButton:function(t){var o=L.DomUtil.create("a",t.className||"",t.container),e=L.DomUtil.create("span","sr-only",t.container);o.href="#",o.appendChild(e),t.title&&(o.title=t.title,e.innerHTML=t.title),t.text&&(o.innerHTML=t.text,e.innerHTML=t.text);var i=this._detectIOS()?"touchstart":"click";return L.DomEvent.on(o,"click",L.DomEvent.stopPropagation).on(o,"mousedown",L.DomEvent.stopPropagation).on(o,"dblclick",L.DomEvent.stopPropagation).on(o,"touchstart",L.DomEvent.stopPropagation).on(o,"click",L.DomEvent.preventDefault).on(o,i,t.callback,t.context),o},_disposeButton:function(t,o){var e=this._detectIOS()?"touchstart":"click";L.DomEvent.off(t,"click",L.DomEvent.stopPropagation).off(t,"mousedown",L.DomEvent.stopPropagation).off(t,"dblclick",L.DomEvent.stopPropagation).off(t,"touchstart",L.DomEvent.stopPropagation).off(t,"click",L.DomEvent.preventDefault).off(t,e,o)},_handlerActivated:function(t){this.disable(),this._activeMode=this._modes[t.handler],L.DomUtil.addClass(this._activeMode.button,"leaflet-draw-toolbar-button-enabled"),this._showActionsToolbar(),this.fire("enable")},_handlerDeactivated:function(){this._hideActionsToolbar(),L.DomUtil.removeClass(this._activeMode.button,"leaflet-draw-toolbar-button-enabled"),this._activeMode=null,this.fire("disable")},_createActions:function(t){var o,e,i,a,n=this._actionsContainer,s=this.getActions(t),l=s.length;for(e=0,i=this._actionButtons.length;e<i;e++)this._disposeButton(this._actionButtons[e].button,this._actionButtons[e].callback);for(this._actionButtons=[];n.firstChild;)n.removeChild(n.firstChild);for(var r=0;r<l;r++)"enabled"in s[r]&&!s[r].enabled||(o=L.DomUtil.create("li","",n),a=this._createButton({title:s[r].title,text:s[r].text,container:o,callback:s[r].callback,context:s[r].context}),this._actionButtons.push({button:a,callback:s[r].callback}))},_showActionsToolbar:function(){var t=this._activeMode.buttonIndex,o=this._lastButtonIndex,e=this._activeMode.button.offsetTop-1;this._createActions(this._activeMode.handler),this._actionsContainer.style.top=e+"px",0===t&&(L.DomUtil.addClass(this._toolbarContainer,"leaflet-draw-toolbar-notop"),L.DomUtil.addClass(this._actionsContainer,"leaflet-draw-actions-top")),t===o&&(L.DomUtil.addClass(this._toolbarContainer,"leaflet-draw-toolbar-nobottom"),L.DomUtil.addClass(this._actionsContainer,"leaflet-draw-actions-bottom")),this._actionsContainer.style.display="block",this._map.fire(L.Draw.Event.TOOLBAROPENED)},_hideActionsToolbar:function(){this._actionsContainer.style.display="none",L.DomUtil.removeClass(this._toolbarContainer,"leaflet-draw-toolbar-notop"),L.DomUtil.removeClass(this._toolbarContainer,"leaflet-draw-toolbar-nobottom"),L.DomUtil.removeClass(this._actionsContainer,"leaflet-draw-actions-top"),L.DomUtil.removeClass(this._actionsContainer,"leaflet-draw-actions-bottom"),this._map.fire(L.Draw.Event.TOOLBARCLOSED)}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/Tooltip.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,118 @@
+L.Draw = L.Draw || {};
+/**
+ * @class L.Draw.Tooltip
+ * @aka Tooltip
+ *
+ * The tooltip class — it is used to display the tooltip while drawing
+ * This will be depreciated
+ *
+ * @example
+ *
+ * ```js
+ *    var tooltip = L.Draw.Tooltip();
+ * ```
+ *
+ */
+L.Draw.Tooltip = L.Class.extend({
+
+	// @section Methods for modifying draw state
+
+	// @method initialize(map): void
+	// Tooltip constructor
+	initialize: function (map) {
+		this._map = map;
+		this._popupPane = map._panes.popupPane;
+		this._visible = false;
+
+		this._container = map.options.drawControlTooltips ?
+			L.DomUtil.create('div', 'leaflet-draw-tooltip', this._popupPane) : null;
+		this._singleLineLabel = false;
+
+		this._map.on('mouseout', this._onMouseOut, this);
+	},
+
+	// @method dispose(): void
+	// Remove Tooltip DOM and unbind events
+	dispose: function () {
+		this._map.off('mouseout', this._onMouseOut, this);
+
+		if (this._container) {
+			this._popupPane.removeChild(this._container);
+			this._container = null;
+		}
+	},
+
+	// @method updateContent(labelText): this
+	// Changes the tooltip text to string in function call
+	updateContent: function (labelText) {
+		if (!this._container) {
+			return this;
+		}
+		labelText.subtext = labelText.subtext || '';
+
+		// update the vertical position (only if changed)
+		if (labelText.subtext.length === 0 && !this._singleLineLabel) {
+			L.DomUtil.addClass(this._container, 'leaflet-draw-tooltip-single');
+			this._singleLineLabel = true;
+		}
+		else if (labelText.subtext.length > 0 && this._singleLineLabel) {
+			L.DomUtil.removeClass(this._container, 'leaflet-draw-tooltip-single');
+			this._singleLineLabel = false;
+		}
+
+		this._container.innerHTML =
+			(labelText.subtext.length > 0 ?
+				'<span class="leaflet-draw-tooltip-subtext">' + labelText.subtext + '</span>' + '<br />' : '') +
+			'<span>' + labelText.text + '</span>';
+
+		if (!labelText.text && !labelText.subtext) {
+			this._visible = false;
+			this._container.style.visibility = 'hidden';
+		} else {
+			this._visible = true;
+			this._container.style.visibility = 'inherit';
+		}
+
+		return this;
+	},
+
+	// @method updatePosition(latlng): this
+	// Changes the location of the tooltip
+	updatePosition: function (latlng) {
+		var pos = this._map.latLngToLayerPoint(latlng),
+			tooltipContainer = this._container;
+
+		if (this._container) {
+			if (this._visible) {
+				tooltipContainer.style.visibility = 'inherit';
+			}
+			L.DomUtil.setPosition(tooltipContainer, pos);
+		}
+
+		return this;
+	},
+
+	// @method showAsError(): this
+	// Applies error class to tooltip
+	showAsError: function () {
+		if (this._container) {
+			L.DomUtil.addClass(this._container, 'leaflet-error-draw-tooltip');
+		}
+		return this;
+	},
+
+	// @method removeError(): this
+	// Removes the error class from the tooltip
+	removeError: function () {
+		if (this._container) {
+			L.DomUtil.removeClass(this._container, 'leaflet-error-draw-tooltip');
+		}
+		return this;
+	},
+
+	_onMouseOut: function () {
+		if (this._container) {
+			this._container.style.visibility = 'hidden';
+		}
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/Tooltip.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Draw=L.Draw||{},L.Draw.Tooltip=L.Class.extend({initialize:function(t){this._map=t,this._popupPane=t._panes.popupPane,this._visible=!1,this._container=t.options.drawControlTooltips?L.DomUtil.create("div","leaflet-draw-tooltip",this._popupPane):null,this._singleLineLabel=!1,this._map.on("mouseout",this._onMouseOut,this)},dispose:function(){this._map.off("mouseout",this._onMouseOut,this),this._container&&(this._popupPane.removeChild(this._container),this._container=null)},updateContent:function(t){return this._container?(t.subtext=t.subtext||"",0!==t.subtext.length||this._singleLineLabel?t.subtext.length>0&&this._singleLineLabel&&(L.DomUtil.removeClass(this._container,"leaflet-draw-tooltip-single"),this._singleLineLabel=!1):(L.DomUtil.addClass(this._container,"leaflet-draw-tooltip-single"),this._singleLineLabel=!0),this._container.innerHTML=(t.subtext.length>0?'<span class="leaflet-draw-tooltip-subtext">'+t.subtext+"</span><br />":"")+"<span>"+t.text+"</span>",t.text||t.subtext?(this._visible=!0,this._container.style.visibility="inherit"):(this._visible=!1,this._container.style.visibility="hidden"),this):this},updatePosition:function(t){var i=this._map.latLngToLayerPoint(t),e=this._container;return this._container&&(this._visible&&(e.style.visibility="inherit"),L.DomUtil.setPosition(e,i)),this},showAsError:function(){return this._container&&L.DomUtil.addClass(this._container,"leaflet-error-draw-tooltip"),this},removeError:function(){return this._container&&L.DomUtil.removeClass(this._container,"leaflet-error-draw-tooltip"),this},_onMouseOut:function(){this._container&&(this._container.style.visibility="hidden")}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/copyright.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,7 @@
+/*
+ Leaflet.draw {VERSION}, a plugin that adds drawing and editing tools to Leaflet powered maps.
+ (c) 2012-2017, Jacob Toye, Jon West, Smartrak, Leaflet
+
+ https://github.com/Leaflet/Leaflet.draw
+ http://leafletjs.com
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/copyright.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/DrawToolbar.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,110 @@
+/**
+ * @class L.DrawToolbar
+ * @aka Toolbar
+ */
+L.DrawToolbar = L.Toolbar.extend({
+
+	statics: {
+		TYPE: 'draw'
+	},
+
+	options: {
+		polyline: {},
+		polygon: {},
+		rectangle: {},
+		circle: {},
+		marker: {},
+		circlemarker: {}
+	},
+
+	// @method initialize(): void
+	initialize: function (options) {
+		// Ensure that the options are merged correctly since L.extend is only shallow
+		for (var type in this.options) {
+			if (this.options.hasOwnProperty(type)) {
+				if (options[type]) {
+					options[type] = L.extend({}, this.options[type], options[type]);
+				}
+			}
+		}
+
+		this._toolbarClass = 'leaflet-draw-draw';
+		L.Toolbar.prototype.initialize.call(this, options);
+	},
+
+	// @method getModeHandlers(): object
+	// Get mode handlers information
+	getModeHandlers: function (map) {
+		return [
+			{
+				enabled: this.options.polyline,
+				handler: new L.Draw.Polyline(map, this.options.polyline),
+				title: L.drawLocal.draw.toolbar.buttons.polyline
+			},
+			{
+				enabled: this.options.polygon,
+				handler: new L.Draw.Polygon(map, this.options.polygon),
+				title: L.drawLocal.draw.toolbar.buttons.polygon
+			},
+			{
+				enabled: this.options.rectangle,
+				handler: new L.Draw.Rectangle(map, this.options.rectangle),
+				title: L.drawLocal.draw.toolbar.buttons.rectangle
+			},
+			{
+				enabled: this.options.circle,
+				handler: new L.Draw.Circle(map, this.options.circle),
+				title: L.drawLocal.draw.toolbar.buttons.circle
+			},
+			{
+				enabled: this.options.marker,
+				handler: new L.Draw.Marker(map, this.options.marker),
+				title: L.drawLocal.draw.toolbar.buttons.marker
+			},
+			{
+				enabled: this.options.circlemarker,
+				handler: new L.Draw.CircleMarker(map, this.options.circlemarker),
+				title: L.drawLocal.draw.toolbar.buttons.circlemarker
+			}
+		];
+	},
+
+	// @method getActions(): object
+	// Get action information
+	getActions: function (handler) {
+		return [
+			{
+				enabled: handler.completeShape,
+				title: L.drawLocal.draw.toolbar.finish.title,
+				text: L.drawLocal.draw.toolbar.finish.text,
+				callback: handler.completeShape,
+				context: handler
+			},
+			{
+				enabled: handler.deleteLastVertex,
+				title: L.drawLocal.draw.toolbar.undo.title,
+				text: L.drawLocal.draw.toolbar.undo.text,
+				callback: handler.deleteLastVertex,
+				context: handler
+			},
+			{
+				title: L.drawLocal.draw.toolbar.actions.title,
+				text: L.drawLocal.draw.toolbar.actions.text,
+				callback: this.disable,
+				context: this
+			}
+		];
+	},
+
+	// @method setOptions(): void
+	// Sets the options to the toolbar
+	setOptions: function (options) {
+		L.setOptions(this, options);
+
+		for (var type in this._modes) {
+			if (this._modes.hasOwnProperty(type) && options.hasOwnProperty(type)) {
+				this._modes[type].handler.setOptions(options[type]);
+			}
+		}
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/DrawToolbar.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.DrawToolbar=L.Toolbar.extend({statics:{TYPE:"draw"},options:{polyline:{},polygon:{},rectangle:{},circle:{},marker:{},circlemarker:{}},initialize:function(t){for(var e in this.options)this.options.hasOwnProperty(e)&&t[e]&&(t[e]=L.extend({},this.options[e],t[e]));this._toolbarClass="leaflet-draw-draw",L.Toolbar.prototype.initialize.call(this,t)},getModeHandlers:function(t){return[{enabled:this.options.polyline,handler:new L.Draw.Polyline(t,this.options.polyline),title:L.drawLocal.draw.toolbar.buttons.polyline},{enabled:this.options.polygon,handler:new L.Draw.Polygon(t,this.options.polygon),title:L.drawLocal.draw.toolbar.buttons.polygon},{enabled:this.options.rectangle,handler:new L.Draw.Rectangle(t,this.options.rectangle),title:L.drawLocal.draw.toolbar.buttons.rectangle},{enabled:this.options.circle,handler:new L.Draw.Circle(t,this.options.circle),title:L.drawLocal.draw.toolbar.buttons.circle},{enabled:this.options.marker,handler:new L.Draw.Marker(t,this.options.marker),title:L.drawLocal.draw.toolbar.buttons.marker},{enabled:this.options.circlemarker,handler:new L.Draw.CircleMarker(t,this.options.circlemarker),title:L.drawLocal.draw.toolbar.buttons.circlemarker}]},getActions:function(t){return[{enabled:t.completeShape,title:L.drawLocal.draw.toolbar.finish.title,text:L.drawLocal.draw.toolbar.finish.text,callback:t.completeShape,context:t},{enabled:t.deleteLastVertex,title:L.drawLocal.draw.toolbar.undo.title,text:L.drawLocal.draw.toolbar.undo.text,callback:t.deleteLastVertex,context:t},{title:L.drawLocal.draw.toolbar.actions.title,text:L.drawLocal.draw.toolbar.actions.text,callback:this.disable,context:this}]},setOptions:function(t){for(var e in L.setOptions(this,t),this._modes)this._modes.hasOwnProperty(e)&&t.hasOwnProperty(e)&&this._modes[e].handler.setOptions(t[e])}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.Circle.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,83 @@
+/**
+ * @class L.Draw.Circle
+ * @aka Draw.Circle
+ * @inherits L.Draw.SimpleShape
+ */
+L.Draw.Circle = L.Draw.SimpleShape.extend({
+	statics: {
+		TYPE: 'circle'
+	},
+
+	options: {
+		shapeOptions: {
+			stroke: true,
+			color: '#3388ff',
+			weight: 4,
+			opacity: 0.5,
+			fill: true,
+			fillColor: null, //same as color by default
+			fillOpacity: 0.2,
+			clickable: true
+		},
+		showRadius: true,
+		metric: true, // Whether to use the metric measurement system or imperial
+		feet: true, // When not metric, use feet instead of yards for display
+		nautic: false // When not metric, not feet use nautic mile for display
+	},
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.Draw.Circle.TYPE;
+
+		this._initialLabelText = L.drawLocal.draw.handlers.circle.tooltip.start;
+
+		L.Draw.SimpleShape.prototype.initialize.call(this, map, options);
+	},
+
+	_drawShape: function (latlng) {
+		// Calculate the distance based on the version
+		if (L.GeometryUtil.isVersion07x()) {
+			var distance = this._startLatLng.distanceTo(latlng);
+		} else {
+			var distance = this._map.distance(this._startLatLng, latlng);
+		}
+
+		if (!this._shape) {
+			this._shape = new L.Circle(this._startLatLng, distance, this.options.shapeOptions);
+			this._map.addLayer(this._shape);
+		} else {
+			this._shape.setRadius(distance);
+		}
+	},
+
+	_fireCreatedEvent: function () {
+		var circle = new L.Circle(this._startLatLng, this._shape.getRadius(), this.options.shapeOptions);
+		L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, circle);
+	},
+
+	_onMouseMove: function (e) {
+		var latlng = e.latlng,
+			showRadius = this.options.showRadius,
+			useMetric = this.options.metric,
+			radius;
+
+		this._tooltip.updatePosition(latlng);
+		if (this._isDrawing) {
+			this._drawShape(latlng);
+
+			// Get the new radius (rounded to 1 dp)
+			radius = this._shape.getRadius().toFixed(1);
+
+			var subtext = '';
+			if (showRadius) {
+				subtext = L.drawLocal.draw.handlers.circle.radius + ': ' +
+					L.GeometryUtil.readableDistance(radius, useMetric, this.options.feet, this.options.nautic);
+			}
+			this._tooltip.updateContent({
+				text: this._endLabelText,
+				subtext: subtext
+			});
+		}
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.Circle.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Draw.Circle=L.Draw.SimpleShape.extend({statics:{TYPE:"circle"},options:{shapeOptions:{stroke:!0,color:"#3388ff",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},showRadius:!0,metric:!0,feet:!0,nautic:!1},initialize:function(t,i){this.type=L.Draw.Circle.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.circle.tooltip.start,L.Draw.SimpleShape.prototype.initialize.call(this,t,i)},_drawShape:function(t){if(L.GeometryUtil.isVersion07x())var i=this._startLatLng.distanceTo(t);else i=this._map.distance(this._startLatLng,t);this._shape?this._shape.setRadius(i):(this._shape=new L.Circle(this._startLatLng,i,this.options.shapeOptions),this._map.addLayer(this._shape))},_fireCreatedEvent:function(){var t=new L.Circle(this._startLatLng,this._shape.getRadius(),this.options.shapeOptions);L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this,t)},_onMouseMove:function(t){var i,e=t.latlng,a=this.options.showRadius,s=this.options.metric;if(this._tooltip.updatePosition(e),this._isDrawing){this._drawShape(e),i=this._shape.getRadius().toFixed(1);var o="";a&&(o=L.drawLocal.draw.handlers.circle.radius+": "+L.GeometryUtil.readableDistance(i,s,this.options.feet,this.options.nautic)),this._tooltip.updateContent({text:this._endLabelText,subtext:o})}}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.CircleMarker.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,42 @@
+/**
+ * @class L.Draw.CircleMarker
+ * @aka Draw.CircleMarker
+ * @inherits L.Draw.Marker
+ */
+L.Draw.CircleMarker = L.Draw.Marker.extend({
+	statics: {
+		TYPE: 'circlemarker'
+	},
+
+	options: {
+		stroke: true,
+		color: '#3388ff',
+		weight: 4,
+		opacity: 0.5,
+		fill: true,
+		fillColor: null, //same as color by default
+		fillOpacity: 0.2,
+		clickable: true,
+		zIndexOffset: 2000 // This should be > than the highest z-index any markers
+	},
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.Draw.CircleMarker.TYPE;
+
+		this._initialLabelText = L.drawLocal.draw.handlers.circlemarker.tooltip.start;
+
+		L.Draw.Feature.prototype.initialize.call(this, map, options);
+	},
+
+
+	_fireCreatedEvent: function () {
+		var circleMarker = new L.CircleMarker(this._marker.getLatLng(), this.options);
+		L.Draw.Feature.prototype._fireCreatedEvent.call(this, circleMarker);
+	},
+
+	_createMarker: function (latlng) {
+		return new L.CircleMarker(latlng, this.options);
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.CircleMarker.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Draw.CircleMarker=L.Draw.Marker.extend({statics:{TYPE:"circlemarker"},options:{stroke:!0,color:"#3388ff",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0,zIndexOffset:2e3},initialize:function(e,r){this.type=L.Draw.CircleMarker.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.circlemarker.tooltip.start,L.Draw.Feature.prototype.initialize.call(this,e,r)},_fireCreatedEvent:function(){var e=new L.CircleMarker(this._marker.getLatLng(),this.options);L.Draw.Feature.prototype._fireCreatedEvent.call(this,e)},_createMarker:function(e){return new L.CircleMarker(e,this.options)}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.Feature.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,104 @@
+L.Draw = L.Draw || {};
+
+/**
+ * @class L.Draw.Feature
+ * @aka Draw.Feature
+ */
+L.Draw.Feature = L.Handler.extend({
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		this._map = map;
+		this._container = map._container;
+		this._overlayPane = map._panes.overlayPane;
+		this._popupPane = map._panes.popupPane;
+
+		// Merge default shapeOptions options with custom shapeOptions
+		if (options && options.shapeOptions) {
+			options.shapeOptions = L.Util.extend({}, this.options.shapeOptions, options.shapeOptions);
+		}
+		L.setOptions(this, options);
+
+		var version = L.version.split('.');
+		//If Version is >= 1.2.0
+		if (parseInt(version[0], 10) === 1 && parseInt(version[1], 10) >= 2) {
+			L.Draw.Feature.include(L.Evented.prototype);
+		} else {
+			L.Draw.Feature.include(L.Mixin.Events);
+		}
+	},
+
+	// @method enable(): void
+	// Enables this handler
+	enable: function () {
+		if (this._enabled) {
+			return;
+		}
+
+		L.Handler.prototype.enable.call(this);
+
+		this.fire('enabled', {handler: this.type});
+
+		this._map.fire(L.Draw.Event.DRAWSTART, {layerType: this.type});
+	},
+
+	// @method disable(): void
+	disable: function () {
+		if (!this._enabled) {
+			return;
+		}
+
+		L.Handler.prototype.disable.call(this);
+
+		this._map.fire(L.Draw.Event.DRAWSTOP, {layerType: this.type});
+
+		this.fire('disabled', {handler: this.type});
+	},
+
+	// @method addHooks(): void
+	// Add's event listeners to this handler
+	addHooks: function () {
+		var map = this._map;
+
+		if (map) {
+			L.DomUtil.disableTextSelection();
+
+			map.getContainer().focus();
+
+			this._tooltip = new L.Draw.Tooltip(this._map);
+
+			L.DomEvent.on(this._container, 'keyup', this._cancelDrawing, this);
+		}
+	},
+
+	// @method removeHooks(): void
+	// Removes event listeners from this handler
+	removeHooks: function () {
+		if (this._map) {
+			L.DomUtil.enableTextSelection();
+
+			this._tooltip.dispose();
+			this._tooltip = null;
+
+			L.DomEvent.off(this._container, 'keyup', this._cancelDrawing, this);
+		}
+	},
+
+	// @method setOptions(object): void
+	// Sets new options to this handler
+	setOptions: function (options) {
+		L.setOptions(this, options);
+	},
+
+	_fireCreatedEvent: function (layer) {
+		this._map.fire(L.Draw.Event.CREATED, {layer: layer, layerType: this.type});
+	},
+
+	// Cancel drawing when the escape key is pressed
+	_cancelDrawing: function (e) {
+		if (e.keyCode === 27) {
+			this._map.fire('draw:canceled', {layerType: this.type});
+			this.disable();
+		}
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.Feature.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Draw=L.Draw||{},L.Draw.Feature=L.Handler.extend({initialize:function(e,t){this._map=e,this._container=e._container,this._overlayPane=e._panes.overlayPane,this._popupPane=e._panes.popupPane,t&&t.shapeOptions&&(t.shapeOptions=L.Util.extend({},this.options.shapeOptions,t.shapeOptions)),L.setOptions(this,t);var i=L.version.split(".");1===parseInt(i[0],10)&&parseInt(i[1],10)>=2?L.Draw.Feature.include(L.Evented.prototype):L.Draw.Feature.include(L.Mixin.Events)},enable:function(){this._enabled||(L.Handler.prototype.enable.call(this),this.fire("enabled",{handler:this.type}),this._map.fire(L.Draw.Event.DRAWSTART,{layerType:this.type}))},disable:function(){this._enabled&&(L.Handler.prototype.disable.call(this),this._map.fire(L.Draw.Event.DRAWSTOP,{layerType:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var e=this._map;e&&(L.DomUtil.disableTextSelection(),e.getContainer().focus(),this._tooltip=new L.Draw.Tooltip(this._map),L.DomEvent.on(this._container,"keyup",this._cancelDrawing,this))},removeHooks:function(){this._map&&(L.DomUtil.enableTextSelection(),this._tooltip.dispose(),this._tooltip=null,L.DomEvent.off(this._container,"keyup",this._cancelDrawing,this))},setOptions:function(e){L.setOptions(this,e)},_fireCreatedEvent:function(e){this._map.fire(L.Draw.Event.CREATED,{layer:e,layerType:this.type})},_cancelDrawing:function(e){27===e.keyCode&&(this._map.fire("draw:canceled",{layerType:this.type}),this.disable())}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.Marker.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,127 @@
+/**
+ * @class L.Draw.Marker
+ * @aka Draw.Marker
+ * @inherits L.Draw.Feature
+ */
+L.Draw.Marker = L.Draw.Feature.extend({
+	statics: {
+		TYPE: 'marker'
+	},
+
+	options: {
+		icon: new L.Icon.Default(),
+		repeatMode: false,
+		zIndexOffset: 2000 // This should be > than the highest z-index any markers
+	},
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.Draw.Marker.TYPE;
+
+		this._initialLabelText = L.drawLocal.draw.handlers.marker.tooltip.start;
+
+		L.Draw.Feature.prototype.initialize.call(this, map, options);
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler.
+	addHooks: function () {
+		L.Draw.Feature.prototype.addHooks.call(this);
+
+		if (this._map) {
+			this._tooltip.updateContent({text: this._initialLabelText});
+
+			// Same mouseMarker as in Draw.Polyline
+			if (!this._mouseMarker) {
+				this._mouseMarker = L.marker(this._map.getCenter(), {
+					icon: L.divIcon({
+						className: 'leaflet-mouse-marker',
+						iconAnchor: [20, 20],
+						iconSize: [40, 40]
+					}),
+					opacity: 0,
+					zIndexOffset: this.options.zIndexOffset
+				});
+			}
+
+			this._mouseMarker
+				.on('click', this._onClick, this)
+				.addTo(this._map);
+
+			this._map.on('mousemove', this._onMouseMove, this);
+			this._map.on('click', this._onTouch, this);
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler.
+	removeHooks: function () {
+		L.Draw.Feature.prototype.removeHooks.call(this);
+
+		if (this._map) {
+			this._map
+				.off('click', this._onClick, this)
+				.off('click', this._onTouch, this);
+			if (this._marker) {
+				this._marker.off('click', this._onClick, this);
+				this._map
+					.removeLayer(this._marker);
+				delete this._marker;
+			}
+
+			this._mouseMarker.off('click', this._onClick, this);
+			this._map.removeLayer(this._mouseMarker);
+			delete this._mouseMarker;
+
+			this._map.off('mousemove', this._onMouseMove, this);
+		}
+	},
+
+	_onMouseMove: function (e) {
+		var latlng = e.latlng;
+
+		this._tooltip.updatePosition(latlng);
+		this._mouseMarker.setLatLng(latlng);
+
+		if (!this._marker) {
+			this._marker = this._createMarker(latlng);
+			// Bind to both marker and map to make sure we get the click event.
+			this._marker.on('click', this._onClick, this);
+			this._map
+				.on('click', this._onClick, this)
+				.addLayer(this._marker);
+		}
+		else {
+			latlng = this._mouseMarker.getLatLng();
+			this._marker.setLatLng(latlng);
+		}
+	},
+
+	_createMarker: function (latlng) {
+		return new L.Marker(latlng, {
+			icon: this.options.icon,
+			zIndexOffset: this.options.zIndexOffset
+		});
+	},
+
+	_onClick: function () {
+		this._fireCreatedEvent();
+
+		this.disable();
+		if (this.options.repeatMode) {
+			this.enable();
+		}
+	},
+
+	_onTouch: function (e) {
+		// called on click & tap, only really does any thing on tap
+		this._onMouseMove(e); // creates & places marker
+		this._onClick(); // permanently places marker & ends interaction
+	},
+
+	_fireCreatedEvent: function () {
+		var marker = new L.Marker.Touch(this._marker.getLatLng(), {icon: this.options.icon});
+		L.Draw.Feature.prototype._fireCreatedEvent.call(this, marker);
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.Marker.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Draw.Marker=L.Draw.Feature.extend({statics:{TYPE:"marker"},options:{icon:new L.Icon.Default,repeatMode:!1,zIndexOffset:2e3},initialize:function(t,e){this.type=L.Draw.Marker.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.marker.tooltip.start,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._tooltip.updateContent({text:this._initialLabelText}),this._mouseMarker||(this._mouseMarker=L.marker(this._map.getCenter(),{icon:L.divIcon({className:"leaflet-mouse-marker",iconAnchor:[20,20],iconSize:[40,40]}),opacity:0,zIndexOffset:this.options.zIndexOffset})),this._mouseMarker.on("click",this._onClick,this).addTo(this._map),this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onTouch,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._map&&(this._map.off("click",this._onClick,this).off("click",this._onTouch,this),this._marker&&(this._marker.off("click",this._onClick,this),this._map.removeLayer(this._marker),delete this._marker),this._mouseMarker.off("click",this._onClick,this),this._map.removeLayer(this._mouseMarker),delete this._mouseMarker,this._map.off("mousemove",this._onMouseMove,this))},_onMouseMove:function(t){var e=t.latlng;this._tooltip.updatePosition(e),this._mouseMarker.setLatLng(e),this._marker?(e=this._mouseMarker.getLatLng(),this._marker.setLatLng(e)):(this._marker=this._createMarker(e),this._marker.on("click",this._onClick,this),this._map.on("click",this._onClick,this).addLayer(this._marker))},_createMarker:function(t){return new L.Marker(t,{icon:this.options.icon,zIndexOffset:this.options.zIndexOffset})},_onClick:function(){this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable()},_onTouch:function(t){this._onMouseMove(t),this._onClick()},_fireCreatedEvent:function(){var t=new L.Marker.Touch(this._marker.getLatLng(),{icon:this.options.icon});L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.Polygon.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,129 @@
+/**
+ * @class L.Draw.Polygon
+ * @aka Draw.Polygon
+ * @inherits L.Draw.Polyline
+ */
+L.Draw.Polygon = L.Draw.Polyline.extend({
+	statics: {
+		TYPE: 'polygon'
+	},
+
+	Poly: L.Polygon,
+
+	options: {
+		showArea: false,
+		showLength: false,
+		shapeOptions: {
+			stroke: true,
+			color: '#3388ff',
+			weight: 4,
+			opacity: 0.5,
+			fill: true,
+			fillColor: null, //same as color by default
+			fillOpacity: 0.2,
+			clickable: true
+		},
+		// Whether to use the metric measurement system (truthy) or not (falsy).
+		// Also defines the units to use for the metric system as an array of
+		// strings (e.g. `['ha', 'm']`).
+		metric: true,
+		feet: true, // When not metric, to use feet instead of yards for display.
+		nautic: false, // When not metric, not feet use nautic mile for display
+		// Defines the precision for each type of unit (e.g. {km: 2, ft: 0}
+		precision: {}
+	},
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		L.Draw.Polyline.prototype.initialize.call(this, map, options);
+
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.Draw.Polygon.TYPE;
+	},
+
+	_updateFinishHandler: function () {
+		var markerCount = this._markers.length;
+
+		// The first marker should have a click handler to close the polygon
+		if (markerCount === 1) {
+			this._markers[0].on('click', this._finishShape, this);
+		}
+
+		// Add and update the double click handler
+		if (markerCount > 2) {
+			this._markers[markerCount - 1].on('dblclick', this._finishShape, this);
+			// Only need to remove handler if has been added before
+			if (markerCount > 3) {
+				this._markers[markerCount - 2].off('dblclick', this._finishShape, this);
+			}
+		}
+	},
+
+	_getTooltipText: function () {
+		var text, subtext;
+
+		if (this._markers.length === 0) {
+			text = L.drawLocal.draw.handlers.polygon.tooltip.start;
+		} else if (this._markers.length < 3) {
+			text = L.drawLocal.draw.handlers.polygon.tooltip.cont;
+			subtext = this._getMeasurementString();
+		} else {
+			text = L.drawLocal.draw.handlers.polygon.tooltip.end;
+			subtext = this._getMeasurementString();
+		}
+
+		return {
+			text: text,
+			subtext: subtext
+		};
+	},
+
+	_getMeasurementString: function () {
+		var area = this._area,
+			measurementString = '';
+
+
+		if (!area && !this.options.showLength) {
+			return null;
+		}
+
+		if (this.options.showLength) {
+			measurementString = L.Draw.Polyline.prototype._getMeasurementString.call(this);
+		}
+
+		if (area) {
+			measurementString += '<br>' + L.GeometryUtil.readableArea(area, this.options.metric, this.options.precision);
+		}
+
+		return measurementString;
+	},
+
+	_shapeIsValid: function () {
+		return this._markers.length >= 3;
+	},
+
+	_vertexChanged: function (latlng, added) {
+		var latLngs;
+
+		// Check to see if we should show the area
+		if (!this.options.allowIntersection && this.options.showArea) {
+			latLngs = this._poly.getLatLngs();
+
+			this._area = L.GeometryUtil.geodesicArea(latLngs);
+		}
+
+		L.Draw.Polyline.prototype._vertexChanged.call(this, latlng, added);
+	},
+
+	_cleanUpShape: function () {
+		var markerCount = this._markers.length;
+
+		if (markerCount > 0) {
+			this._markers[0].off('click', this._finishShape, this);
+
+			if (markerCount > 2) {
+				this._markers[markerCount - 1].off('dblclick', this._finishShape, this);
+			}
+		}
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.Polygon.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Draw.Polygon=L.Draw.Polyline.extend({statics:{TYPE:"polygon"},Poly:L.Polygon,options:{showArea:!1,showLength:!1,shapeOptions:{stroke:!0,color:"#3388ff",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},metric:!0,feet:!0,nautic:!1,precision:{}},initialize:function(t,i){L.Draw.Polyline.prototype.initialize.call(this,t,i),this.type=L.Draw.Polygon.TYPE},_updateFinishHandler:function(){var t=this._markers.length;1===t&&this._markers[0].on("click",this._finishShape,this),t>2&&(this._markers[t-1].on("dblclick",this._finishShape,this),t>3&&this._markers[t-2].off("dblclick",this._finishShape,this))},_getTooltipText:function(){var t,i;return 0===this._markers.length?t=L.drawLocal.draw.handlers.polygon.tooltip.start:this._markers.length<3?(t=L.drawLocal.draw.handlers.polygon.tooltip.cont,i=this._getMeasurementString()):(t=L.drawLocal.draw.handlers.polygon.tooltip.end,i=this._getMeasurementString()),{text:t,subtext:i}},_getMeasurementString:function(){var t=this._area,i="";return t||this.options.showLength?(this.options.showLength&&(i=L.Draw.Polyline.prototype._getMeasurementString.call(this)),t&&(i+="<br>"+L.GeometryUtil.readableArea(t,this.options.metric,this.options.precision)),i):null},_shapeIsValid:function(){return this._markers.length>=3},_vertexChanged:function(t,i){var e;!this.options.allowIntersection&&this.options.showArea&&(e=this._poly.getLatLngs(),this._area=L.GeometryUtil.geodesicArea(e)),L.Draw.Polyline.prototype._vertexChanged.call(this,t,i)},_cleanUpShape:function(){var t=this._markers.length;t>0&&(this._markers[0].off("click",this._finishShape,this),t>2&&this._markers[t-1].off("dblclick",this._finishShape,this))}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.Polyline.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,592 @@
+/**
+ * @class L.Draw.Polyline
+ * @aka Draw.Polyline
+ * @inherits L.Draw.Feature
+ */
+L.Draw.Polyline = L.Draw.Feature.extend({
+	statics: {
+		TYPE: 'polyline'
+	},
+
+	Poly: L.Polyline,
+
+	options: {
+		allowIntersection: true,
+		repeatMode: false,
+		drawError: {
+			color: '#b00b00',
+			timeout: 2500
+		},
+		icon: new L.DivIcon({
+			iconSize: new L.Point(8, 8),
+			className: 'leaflet-div-icon leaflet-editing-icon'
+		}),
+		touchIcon: new L.DivIcon({
+			iconSize: new L.Point(20, 20),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
+		}),
+		guidelineDistance: 20,
+		maxGuideLineLength: 4000,
+		shapeOptions: {
+			stroke: true,
+			color: '#3388ff',
+			weight: 4,
+			opacity: 0.5,
+			fill: false,
+			clickable: true
+		},
+		metric: true, // Whether to use the metric measurement system or imperial
+		feet: true, // When not metric, to use feet instead of yards for display.
+		nautic: false, // When not metric, not feet use nautic mile for display
+		showLength: true, // Whether to display distance in the tooltip
+		zIndexOffset: 2000, // This should be > than the highest z-index any map layers
+		factor: 1, // To change distance calculation
+		maxPoints: 0 // Once this number of points are placed, finish shape
+	},
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		// if touch, switch to touch icon
+		if (L.Browser.touch) {
+			this.options.icon = this.options.touchIcon;
+		}
+
+		// Need to set this here to ensure the correct message is used.
+		this.options.drawError.message = L.drawLocal.draw.handlers.polyline.error;
+
+		// Merge default drawError options with custom options
+		if (options && options.drawError) {
+			options.drawError = L.Util.extend({}, this.options.drawError, options.drawError);
+		}
+
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.Draw.Polyline.TYPE;
+
+		L.Draw.Feature.prototype.initialize.call(this, map, options);
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler
+	addHooks: function () {
+		L.Draw.Feature.prototype.addHooks.call(this);
+		if (this._map) {
+			this._markers = [];
+
+			this._markerGroup = new L.LayerGroup();
+			this._map.addLayer(this._markerGroup);
+
+			this._poly = new L.Polyline([], this.options.shapeOptions);
+
+			this._tooltip.updateContent(this._getTooltipText());
+
+			// Make a transparent marker that will used to catch click events. These click
+			// events will create the vertices. We need to do this so we can ensure that
+			// we can create vertices over other map layers (markers, vector layers). We
+			// also do not want to trigger any click handlers of objects we are clicking on
+			// while drawing.
+			if (!this._mouseMarker) {
+				this._mouseMarker = L.marker(this._map.getCenter(), {
+					icon: L.divIcon({
+						className: 'leaflet-mouse-marker',
+						iconAnchor: [20, 20],
+						iconSize: [40, 40]
+					}),
+					opacity: 0,
+					zIndexOffset: this.options.zIndexOffset
+				});
+			}
+
+			this._mouseMarker
+				.on('mouseout', this._onMouseOut, this)
+				.on('mousemove', this._onMouseMove, this) // Necessary to prevent 0.8 stutter
+				.on('mousedown', this._onMouseDown, this)
+				.on('mouseup', this._onMouseUp, this) // Necessary for 0.8 compatibility
+				.addTo(this._map);
+
+			this._map
+				.on('mouseup', this._onMouseUp, this) // Necessary for 0.7 compatibility
+				.on('mousemove', this._onMouseMove, this)
+				.on('zoomlevelschange', this._onZoomEnd, this)
+				.on('touchstart', this._onTouch, this)
+				.on('zoomend', this._onZoomEnd, this);
+
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler.
+	removeHooks: function () {
+		L.Draw.Feature.prototype.removeHooks.call(this);
+
+		this._clearHideErrorTimeout();
+
+		this._cleanUpShape();
+
+		// remove markers from map
+		this._map.removeLayer(this._markerGroup);
+		delete this._markerGroup;
+		delete this._markers;
+
+		this._map.removeLayer(this._poly);
+		delete this._poly;
+
+		this._mouseMarker
+			.off('mousedown', this._onMouseDown, this)
+			.off('mouseout', this._onMouseOut, this)
+			.off('mouseup', this._onMouseUp, this)
+			.off('mousemove', this._onMouseMove, this);
+		this._map.removeLayer(this._mouseMarker);
+		delete this._mouseMarker;
+
+		// clean up DOM
+		this._clearGuides();
+
+		this._map
+			.off('mouseup', this._onMouseUp, this)
+			.off('mousemove', this._onMouseMove, this)
+			.off('zoomlevelschange', this._onZoomEnd, this)
+			.off('zoomend', this._onZoomEnd, this)
+			.off('touchstart', this._onTouch, this)
+			.off('click', this._onTouch, this);
+	},
+
+	// @method deleteLastVertex(): void
+	// Remove the last vertex from the polyline, removes polyline from map if only one point exists.
+	deleteLastVertex: function () {
+		if (this._markers.length <= 1) {
+			return;
+		}
+
+		var lastMarker = this._markers.pop(),
+			poly = this._poly,
+			// Replaces .spliceLatLngs()
+			latlngs = poly.getLatLngs(),
+			latlng = latlngs.splice(-1, 1)[0];
+		this._poly.setLatLngs(latlngs);
+
+		this._markerGroup.removeLayer(lastMarker);
+
+		if (poly.getLatLngs().length < 2) {
+			this._map.removeLayer(poly);
+		}
+
+		this._vertexChanged(latlng, false);
+	},
+
+	// @method addVertex(): void
+	// Add a vertex to the end of the polyline
+	addVertex: function (latlng) {
+		var markersLength = this._markers.length;
+		// markersLength must be greater than or equal to 2 before intersections can occur
+		if (markersLength >= 2 && !this.options.allowIntersection && this._poly.newLatLngIntersects(latlng)) {
+			this._showErrorTooltip();
+			return;
+		}
+		else if (this._errorShown) {
+			this._hideErrorTooltip();
+		}
+
+		this._markers.push(this._createMarker(latlng));
+
+		this._poly.addLatLng(latlng);
+
+		if (this._poly.getLatLngs().length === 2) {
+			this._map.addLayer(this._poly);
+		}
+
+		this._vertexChanged(latlng, true);
+	},
+
+	// @method completeShape(): void
+	// Closes the polyline between the first and last points
+	completeShape: function () {
+		if (this._markers.length <= 1 || !this._shapeIsValid()) {
+			return;
+		}
+
+		this._fireCreatedEvent();
+		this.disable();
+
+		if (this.options.repeatMode) {
+			this.enable();
+		}
+	},
+
+	_finishShape: function () {
+		var latlngs = this._poly._defaultShape ? this._poly._defaultShape() : this._poly.getLatLngs();
+		var intersects = this._poly.newLatLngIntersects(latlngs[latlngs.length - 1]);
+
+		if ((!this.options.allowIntersection && intersects) || !this._shapeIsValid()) {
+			this._showErrorTooltip();
+			return;
+		}
+
+		this._fireCreatedEvent();
+		this.disable();
+		if (this.options.repeatMode) {
+			this.enable();
+		}
+	},
+
+	// Called to verify the shape is valid when the user tries to finish it
+	// Return false if the shape is not valid
+	_shapeIsValid: function () {
+		return true;
+	},
+
+	_onZoomEnd: function () {
+		if (this._markers !== null) {
+			this._updateGuide();
+		}
+	},
+
+	_onMouseMove: function (e) {
+		var newPos = this._map.mouseEventToLayerPoint(e.originalEvent);
+		var latlng = this._map.layerPointToLatLng(newPos);
+
+		// Save latlng
+		// should this be moved to _updateGuide() ?
+		this._currentLatLng = latlng;
+
+		this._updateTooltip(latlng);
+
+		// Update the guide line
+		this._updateGuide(newPos);
+
+		// Update the mouse marker position
+		this._mouseMarker.setLatLng(latlng);
+
+		L.DomEvent.preventDefault(e.originalEvent);
+	},
+
+	_vertexChanged: function (latlng, added) {
+		this._map.fire(L.Draw.Event.DRAWVERTEX, {layers: this._markerGroup});
+		this._updateFinishHandler();
+
+		this._updateRunningMeasure(latlng, added);
+
+		this._clearGuides();
+
+		this._updateTooltip();
+	},
+
+	_onMouseDown: function (e) {
+		if (!this._clickHandled && !this._touchHandled && !this._disableMarkers) {
+			this._onMouseMove(e);
+			this._clickHandled = true;
+			this._disableNewMarkers();
+			var originalEvent = e.originalEvent;
+			var clientX = originalEvent.clientX;
+			var clientY = originalEvent.clientY;
+			this._startPoint.call(this, clientX, clientY);
+		}
+	},
+
+	_startPoint: function (clientX, clientY) {
+		this._mouseDownOrigin = L.point(clientX, clientY);
+	},
+
+	_onMouseUp: function (e) {
+		var originalEvent = e.originalEvent;
+		var clientX = originalEvent.clientX;
+		var clientY = originalEvent.clientY;
+		this._endPoint.call(this, clientX, clientY, e);
+		this._clickHandled = null;
+	},
+
+	_endPoint: function (clientX, clientY, e) {
+		if (this._mouseDownOrigin) {
+			var dragCheckDistance = L.point(clientX, clientY)
+				.distanceTo(this._mouseDownOrigin);
+			var lastPtDistance = this._calculateFinishDistance(e.latlng);
+			if (this.options.maxPoints > 1 && this.options.maxPoints == this._markers.length + 1) {
+				this.addVertex(e.latlng);
+				this._finishShape();
+			} else if (lastPtDistance < 10 && L.Browser.touch) {
+				this._finishShape();
+			} else if (Math.abs(dragCheckDistance) < 9 * (window.devicePixelRatio || 1)) {
+				this.addVertex(e.latlng);
+			}
+			this._enableNewMarkers(); // after a short pause, enable new markers
+		}
+		this._mouseDownOrigin = null;
+	},
+
+	// ontouch prevented by clickHandled flag because some browsers fire both click/touch events,
+	// causing unwanted behavior
+	_onTouch: function (e) {
+		var originalEvent = e.originalEvent;
+		var clientX;
+		var clientY;
+		if (originalEvent.touches && originalEvent.touches[0] && !this._clickHandled && !this._touchHandled && !this._disableMarkers) {
+			clientX = originalEvent.touches[0].clientX;
+			clientY = originalEvent.touches[0].clientY;
+			this._disableNewMarkers();
+			this._touchHandled = true;
+			this._startPoint.call(this, clientX, clientY);
+			this._endPoint.call(this, clientX, clientY, e);
+			this._touchHandled = null;
+		}
+		this._clickHandled = null;
+	},
+
+	_onMouseOut: function () {
+		if (this._tooltip) {
+			this._tooltip._onMouseOut.call(this._tooltip);
+		}
+	},
+
+	// calculate if we are currently within close enough distance
+	// of the closing point (first point for shapes, last point for lines)
+	// this is semi-ugly code but the only reliable way i found to get the job done
+	// note: calculating point.distanceTo between mouseDownOrigin and last marker did NOT work
+	_calculateFinishDistance: function (potentialLatLng) {
+		var lastPtDistance;
+		if (this._markers.length > 0) {
+			var finishMarker;
+			if (this.type === L.Draw.Polyline.TYPE) {
+				finishMarker = this._markers[this._markers.length - 1];
+			} else if (this.type === L.Draw.Polygon.TYPE) {
+				finishMarker = this._markers[0];
+			} else {
+				return Infinity;
+			}
+			var lastMarkerPoint = this._map.latLngToContainerPoint(finishMarker.getLatLng()),
+				potentialMarker = new L.Marker(potentialLatLng, {
+					icon: this.options.icon,
+					zIndexOffset: this.options.zIndexOffset * 2
+				});
+			var potentialMarkerPint = this._map.latLngToContainerPoint(potentialMarker.getLatLng());
+			lastPtDistance = lastMarkerPoint.distanceTo(potentialMarkerPint);
+		} else {
+			lastPtDistance = Infinity;
+		}
+		return lastPtDistance;
+	},
+
+	_updateFinishHandler: function () {
+		var markerCount = this._markers.length;
+		// The last marker should have a click handler to close the polyline
+		if (markerCount > 1) {
+			this._markers[markerCount - 1].on('click', this._finishShape, this);
+		}
+
+		// Remove the old marker click handler (as only the last point should close the polyline)
+		if (markerCount > 2) {
+			this._markers[markerCount - 2].off('click', this._finishShape, this);
+		}
+	},
+
+	_createMarker: function (latlng) {
+		var marker = new L.Marker(latlng, {
+			icon: this.options.icon,
+			zIndexOffset: this.options.zIndexOffset * 2
+		});
+
+		this._markerGroup.addLayer(marker);
+
+		return marker;
+	},
+
+	_updateGuide: function (newPos) {
+		var markerCount = this._markers ? this._markers.length : 0;
+
+		if (markerCount > 0) {
+			newPos = newPos || this._map.latLngToLayerPoint(this._currentLatLng);
+
+			// draw the guide line
+			this._clearGuides();
+			this._drawGuide(
+				this._map.latLngToLayerPoint(this._markers[markerCount - 1].getLatLng()),
+				newPos
+			);
+		}
+	},
+
+	_updateTooltip: function (latLng) {
+		var text = this._getTooltipText();
+
+		if (latLng) {
+			this._tooltip.updatePosition(latLng);
+		}
+
+		if (!this._errorShown) {
+			this._tooltip.updateContent(text);
+		}
+	},
+
+	_drawGuide: function (pointA, pointB) {
+		var length = Math.floor(Math.sqrt(Math.pow((pointB.x - pointA.x), 2) + Math.pow((pointB.y - pointA.y), 2))),
+			guidelineDistance = this.options.guidelineDistance,
+			maxGuideLineLength = this.options.maxGuideLineLength,
+			// Only draw a guideline with a max length
+			i = length > maxGuideLineLength ? length - maxGuideLineLength : guidelineDistance,
+			fraction,
+			dashPoint,
+			dash;
+
+		//create the guides container if we haven't yet
+		if (!this._guidesContainer) {
+			this._guidesContainer = L.DomUtil.create('div', 'leaflet-draw-guides', this._overlayPane);
+		}
+
+		//draw a dash every GuildeLineDistance
+		for (; i < length; i += this.options.guidelineDistance) {
+			//work out fraction along line we are
+			fraction = i / length;
+
+			//calculate new x,y point
+			dashPoint = {
+				x: Math.floor((pointA.x * (1 - fraction)) + (fraction * pointB.x)),
+				y: Math.floor((pointA.y * (1 - fraction)) + (fraction * pointB.y))
+			};
+
+			//add guide dash to guide container
+			dash = L.DomUtil.create('div', 'leaflet-draw-guide-dash', this._guidesContainer);
+			dash.style.backgroundColor =
+				!this._errorShown ? this.options.shapeOptions.color : this.options.drawError.color;
+
+			L.DomUtil.setPosition(dash, dashPoint);
+		}
+	},
+
+	_updateGuideColor: function (color) {
+		if (this._guidesContainer) {
+			for (var i = 0, l = this._guidesContainer.childNodes.length; i < l; i++) {
+				this._guidesContainer.childNodes[i].style.backgroundColor = color;
+			}
+		}
+	},
+
+	// removes all child elements (guide dashes) from the guides container
+	_clearGuides: function () {
+		if (this._guidesContainer) {
+			while (this._guidesContainer.firstChild) {
+				this._guidesContainer.removeChild(this._guidesContainer.firstChild);
+			}
+		}
+	},
+
+	_getTooltipText: function () {
+		var showLength = this.options.showLength,
+			labelText, distanceStr;
+		if (this._markers.length === 0) {
+			labelText = {
+				text: L.drawLocal.draw.handlers.polyline.tooltip.start
+			};
+		} else {
+			distanceStr = showLength ? this._getMeasurementString() : '';
+
+			if (this._markers.length === 1) {
+				labelText = {
+					text: L.drawLocal.draw.handlers.polyline.tooltip.cont,
+					subtext: distanceStr
+				};
+			} else {
+				labelText = {
+					text: L.drawLocal.draw.handlers.polyline.tooltip.end,
+					subtext: distanceStr
+				};
+			}
+		}
+		return labelText;
+	},
+
+	_updateRunningMeasure: function (latlng, added) {
+		var markersLength = this._markers.length,
+			previousMarkerIndex, distance;
+
+		if (this._markers.length === 1) {
+			this._measurementRunningTotal = 0;
+		} else {
+			previousMarkerIndex = markersLength - (added ? 2 : 1);
+
+			// Calculate the distance based on the version
+			if (L.GeometryUtil.isVersion07x()) {
+				distance = latlng.distanceTo(this._markers[previousMarkerIndex].getLatLng()) * (this.options.factor || 1);
+			} else {
+				distance = this._map.distance(latlng, this._markers[previousMarkerIndex].getLatLng()) * (this.options.factor || 1);
+			}
+
+			this._measurementRunningTotal += distance * (added ? 1 : -1);
+		}
+	},
+
+	_getMeasurementString: function () {
+		var currentLatLng = this._currentLatLng,
+			previousLatLng = this._markers[this._markers.length - 1].getLatLng(),
+			distance;
+
+		// Calculate the distance from the last fixed point to the mouse position based on the version
+		if (L.GeometryUtil.isVersion07x()) {
+			distance = previousLatLng && currentLatLng && currentLatLng.distanceTo ? this._measurementRunningTotal + currentLatLng.distanceTo(previousLatLng) * (this.options.factor || 1) : this._measurementRunningTotal || 0;
+		} else {
+			distance = previousLatLng && currentLatLng ? this._measurementRunningTotal + this._map.distance(currentLatLng, previousLatLng) * (this.options.factor || 1) : this._measurementRunningTotal || 0;
+		}
+
+		return L.GeometryUtil.readableDistance(distance, this.options.metric, this.options.feet, this.options.nautic, this.options.precision);
+	},
+
+	_showErrorTooltip: function () {
+		this._errorShown = true;
+
+		// Update tooltip
+		this._tooltip
+			.showAsError()
+			.updateContent({text: this.options.drawError.message});
+
+		// Update shape
+		this._updateGuideColor(this.options.drawError.color);
+		this._poly.setStyle({color: this.options.drawError.color});
+
+		// Hide the error after 2 seconds
+		this._clearHideErrorTimeout();
+		this._hideErrorTimeout = setTimeout(L.Util.bind(this._hideErrorTooltip, this), this.options.drawError.timeout);
+	},
+
+	_hideErrorTooltip: function () {
+		this._errorShown = false;
+
+		this._clearHideErrorTimeout();
+
+		// Revert tooltip
+		this._tooltip
+			.removeError()
+			.updateContent(this._getTooltipText());
+
+		// Revert shape
+		this._updateGuideColor(this.options.shapeOptions.color);
+		this._poly.setStyle({color: this.options.shapeOptions.color});
+	},
+
+	_clearHideErrorTimeout: function () {
+		if (this._hideErrorTimeout) {
+			clearTimeout(this._hideErrorTimeout);
+			this._hideErrorTimeout = null;
+		}
+	},
+
+	// disable new markers temporarily;
+	// this is to prevent duplicated touch/click events in some browsers
+	_disableNewMarkers: function () {
+		this._disableMarkers = true;
+	},
+
+	// see _disableNewMarkers
+	_enableNewMarkers: function () {
+		setTimeout(function () {
+			this._disableMarkers = false;
+		}.bind(this), 50);
+	},
+
+	_cleanUpShape: function () {
+		if (this._markers.length > 1) {
+			this._markers[this._markers.length - 1].off('click', this._finishShape, this);
+		}
+	},
+
+	_fireCreatedEvent: function () {
+		var poly = new this.Poly(this._poly.getLatLngs(), this.options.shapeOptions);
+		L.Draw.Feature.prototype._fireCreatedEvent.call(this, poly);
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.Polyline.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Draw.Polyline=L.Draw.Feature.extend({statics:{TYPE:"polyline"},Poly:L.Polyline,options:{allowIntersection:!0,repeatMode:!1,drawError:{color:"#b00b00",timeout:2500},icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"}),guidelineDistance:20,maxGuideLineLength:4e3,shapeOptions:{stroke:!0,color:"#3388ff",weight:4,opacity:.5,fill:!1,clickable:!0},metric:!0,feet:!0,nautic:!1,showLength:!0,zIndexOffset:2e3,factor:1,maxPoints:0},initialize:function(t,i){L.Browser.touch&&(this.options.icon=this.options.touchIcon),this.options.drawError.message=L.drawLocal.draw.handlers.polyline.error,i&&i.drawError&&(i.drawError=L.Util.extend({},this.options.drawError,i.drawError)),this.type=L.Draw.Polyline.TYPE,L.Draw.Feature.prototype.initialize.call(this,t,i)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._markers=[],this._markerGroup=new L.LayerGroup,this._map.addLayer(this._markerGroup),this._poly=new L.Polyline([],this.options.shapeOptions),this._tooltip.updateContent(this._getTooltipText()),this._mouseMarker||(this._mouseMarker=L.marker(this._map.getCenter(),{icon:L.divIcon({className:"leaflet-mouse-marker",iconAnchor:[20,20],iconSize:[40,40]}),opacity:0,zIndexOffset:this.options.zIndexOffset})),this._mouseMarker.on("mouseout",this._onMouseOut,this).on("mousemove",this._onMouseMove,this).on("mousedown",this._onMouseDown,this).on("mouseup",this._onMouseUp,this).addTo(this._map),this._map.on("mouseup",this._onMouseUp,this).on("mousemove",this._onMouseMove,this).on("zoomlevelschange",this._onZoomEnd,this).on("touchstart",this._onTouch,this).on("zoomend",this._onZoomEnd,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._clearHideErrorTimeout(),this._cleanUpShape(),this._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers,this._map.removeLayer(this._poly),delete this._poly,this._mouseMarker.off("mousedown",this._onMouseDown,this).off("mouseout",this._onMouseOut,this).off("mouseup",this._onMouseUp,this).off("mousemove",this._onMouseMove,this),this._map.removeLayer(this._mouseMarker),delete this._mouseMarker,this._clearGuides(),this._map.off("mouseup",this._onMouseUp,this).off("mousemove",this._onMouseMove,this).off("zoomlevelschange",this._onZoomEnd,this).off("zoomend",this._onZoomEnd,this).off("touchstart",this._onTouch,this).off("click",this._onTouch,this)},deleteLastVertex:function(){if(!(this._markers.length<=1)){var t=this._markers.pop(),i=this._poly,e=i.getLatLngs(),o=e.splice(-1,1)[0];this._poly.setLatLngs(e),this._markerGroup.removeLayer(t),i.getLatLngs().length<2&&this._map.removeLayer(i),this._vertexChanged(o,!1)}},addVertex:function(t){this._markers.length>=2&&!this.options.allowIntersection&&this._poly.newLatLngIntersects(t)?this._showErrorTooltip():(this._errorShown&&this._hideErrorTooltip(),this._markers.push(this._createMarker(t)),this._poly.addLatLng(t),2===this._poly.getLatLngs().length&&this._map.addLayer(this._poly),this._vertexChanged(t,!0))},completeShape:function(){this._markers.length<=1||!this._shapeIsValid()||(this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable())},_finishShape:function(){var t=this._poly._defaultShape?this._poly._defaultShape():this._poly.getLatLngs(),i=this._poly.newLatLngIntersects(t[t.length-1]);!this.options.allowIntersection&&i||!this._shapeIsValid()?this._showErrorTooltip():(this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable())},_shapeIsValid:function(){return!0},_onZoomEnd:function(){null!==this._markers&&this._updateGuide()},_onMouseMove:function(t){var i=this._map.mouseEventToLayerPoint(t.originalEvent),e=this._map.layerPointToLatLng(i);this._currentLatLng=e,this._updateTooltip(e),this._updateGuide(i),this._mouseMarker.setLatLng(e),L.DomEvent.preventDefault(t.originalEvent)},_vertexChanged:function(t,i){this._map.fire(L.Draw.Event.DRAWVERTEX,{layers:this._markerGroup}),this._updateFinishHandler(),this._updateRunningMeasure(t,i),this._clearGuides(),this._updateTooltip()},_onMouseDown:function(t){if(!this._clickHandled&&!this._touchHandled&&!this._disableMarkers){this._onMouseMove(t),this._clickHandled=!0,this._disableNewMarkers();var i=t.originalEvent,e=i.clientX,o=i.clientY;this._startPoint.call(this,e,o)}},_startPoint:function(t,i){this._mouseDownOrigin=L.point(t,i)},_onMouseUp:function(t){var i=t.originalEvent,e=i.clientX,o=i.clientY;this._endPoint.call(this,e,o,t),this._clickHandled=null},_endPoint:function(t,i,e){if(this._mouseDownOrigin){var o=L.point(t,i).distanceTo(this._mouseDownOrigin),s=this._calculateFinishDistance(e.latlng);this.options.maxPoints>1&&this.options.maxPoints==this._markers.length+1?(this.addVertex(e.latlng),this._finishShape()):s<10&&L.Browser.touch?this._finishShape():Math.abs(o)<9*(window.devicePixelRatio||1)&&this.addVertex(e.latlng),this._enableNewMarkers()}this._mouseDownOrigin=null},_onTouch:function(t){var i,e,o=t.originalEvent;!o.touches||!o.touches[0]||this._clickHandled||this._touchHandled||this._disableMarkers||(i=o.touches[0].clientX,e=o.touches[0].clientY,this._disableNewMarkers(),this._touchHandled=!0,this._startPoint.call(this,i,e),this._endPoint.call(this,i,e,t),this._touchHandled=null),this._clickHandled=null},_onMouseOut:function(){this._tooltip&&this._tooltip._onMouseOut.call(this._tooltip)},_calculateFinishDistance:function(t){var i;if(this._markers.length>0){var e;if(this.type===L.Draw.Polyline.TYPE)e=this._markers[this._markers.length-1];else{if(this.type!==L.Draw.Polygon.TYPE)return 1/0;e=this._markers[0]}var o=this._map.latLngToContainerPoint(e.getLatLng()),s=new L.Marker(t,{icon:this.options.icon,zIndexOffset:2*this.options.zIndexOffset}),n=this._map.latLngToContainerPoint(s.getLatLng());i=o.distanceTo(n)}else i=1/0;return i},_updateFinishHandler:function(){var t=this._markers.length;t>1&&this._markers[t-1].on("click",this._finishShape,this),t>2&&this._markers[t-2].off("click",this._finishShape,this)},_createMarker:function(t){var i=new L.Marker(t,{icon:this.options.icon,zIndexOffset:2*this.options.zIndexOffset});return this._markerGroup.addLayer(i),i},_updateGuide:function(t){var i=this._markers?this._markers.length:0;i>0&&(t=t||this._map.latLngToLayerPoint(this._currentLatLng),this._clearGuides(),this._drawGuide(this._map.latLngToLayerPoint(this._markers[i-1].getLatLng()),t))},_updateTooltip:function(t){var i=this._getTooltipText();t&&this._tooltip.updatePosition(t),this._errorShown||this._tooltip.updateContent(i)},_drawGuide:function(t,i){var e,o,s,n=Math.floor(Math.sqrt(Math.pow(i.x-t.x,2)+Math.pow(i.y-t.y,2))),r=this.options.guidelineDistance,a=this.options.maxGuideLineLength,h=n>a?n-a:r;for(this._guidesContainer||(this._guidesContainer=L.DomUtil.create("div","leaflet-draw-guides",this._overlayPane));h<n;h+=this.options.guidelineDistance)e=h/n,o={x:Math.floor(t.x*(1-e)+e*i.x),y:Math.floor(t.y*(1-e)+e*i.y)},(s=L.DomUtil.create("div","leaflet-draw-guide-dash",this._guidesContainer)).style.backgroundColor=this._errorShown?this.options.drawError.color:this.options.shapeOptions.color,L.DomUtil.setPosition(s,o)},_updateGuideColor:function(t){if(this._guidesContainer)for(var i=0,e=this._guidesContainer.childNodes.length;i<e;i++)this._guidesContainer.childNodes[i].style.backgroundColor=t},_clearGuides:function(){if(this._guidesContainer)for(;this._guidesContainer.firstChild;)this._guidesContainer.removeChild(this._guidesContainer.firstChild)},_getTooltipText:function(){var t,i,e=this.options.showLength;return 0===this._markers.length?t={text:L.drawLocal.draw.handlers.polyline.tooltip.start}:(i=e?this._getMeasurementString():"",t=1===this._markers.length?{text:L.drawLocal.draw.handlers.polyline.tooltip.cont,subtext:i}:{text:L.drawLocal.draw.handlers.polyline.tooltip.end,subtext:i}),t},_updateRunningMeasure:function(t,i){var e,o,s=this._markers.length;1===this._markers.length?this._measurementRunningTotal=0:(e=s-(i?2:1),o=L.GeometryUtil.isVersion07x()?t.distanceTo(this._markers[e].getLatLng())*(this.options.factor||1):this._map.distance(t,this._markers[e].getLatLng())*(this.options.factor||1),this._measurementRunningTotal+=o*(i?1:-1))},_getMeasurementString:function(){var t,i=this._currentLatLng,e=this._markers[this._markers.length-1].getLatLng();return t=L.GeometryUtil.isVersion07x()?e&&i&&i.distanceTo?this._measurementRunningTotal+i.distanceTo(e)*(this.options.factor||1):this._measurementRunningTotal||0:e&&i?this._measurementRunningTotal+this._map.distance(i,e)*(this.options.factor||1):this._measurementRunningTotal||0,L.GeometryUtil.readableDistance(t,this.options.metric,this.options.feet,this.options.nautic,this.options.precision)},_showErrorTooltip:function(){this._errorShown=!0,this._tooltip.showAsError().updateContent({text:this.options.drawError.message}),this._updateGuideColor(this.options.drawError.color),this._poly.setStyle({color:this.options.drawError.color}),this._clearHideErrorTimeout(),this._hideErrorTimeout=setTimeout(L.Util.bind(this._hideErrorTooltip,this),this.options.drawError.timeout)},_hideErrorTooltip:function(){this._errorShown=!1,this._clearHideErrorTimeout(),this._tooltip.removeError().updateContent(this._getTooltipText()),this._updateGuideColor(this.options.shapeOptions.color),this._poly.setStyle({color:this.options.shapeOptions.color})},_clearHideErrorTimeout:function(){this._hideErrorTimeout&&(clearTimeout(this._hideErrorTimeout),this._hideErrorTimeout=null)},_disableNewMarkers:function(){this._disableMarkers=!0},_enableNewMarkers:function(){setTimeout(function(){this._disableMarkers=!1}.bind(this),50)},_cleanUpShape:function(){this._markers.length>1&&this._markers[this._markers.length-1].off("click",this._finishShape,this)},_fireCreatedEvent:function(){var t=new this.Poly(this._poly.getLatLngs(),this.options.shapeOptions);L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.Rectangle.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,98 @@
+/**
+ * @class L.Draw.Rectangle
+ * @aka Draw.Rectangle
+ * @inherits L.Draw.SimpleShape
+ */
+L.Draw.Rectangle = L.Draw.SimpleShape.extend({
+	statics: {
+		TYPE: 'rectangle'
+	},
+
+	options: {
+		shapeOptions: {
+			stroke: true,
+			color: '#3388ff',
+			weight: 4,
+			opacity: 0.5,
+			fill: true,
+			fillColor: null, //same as color by default
+			fillOpacity: 0.2,
+			clickable: true
+		},
+		showArea: true, //Whether to show the area in the tooltip
+		metric: true // Whether to use the metric measurement system or imperial
+	},
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.Draw.Rectangle.TYPE;
+
+		this._initialLabelText = L.drawLocal.draw.handlers.rectangle.tooltip.start;
+
+		L.Draw.SimpleShape.prototype.initialize.call(this, map, options);
+	},
+
+	// @method disable(): void
+	disable: function () {
+		if (!this._enabled) {
+			return;
+		}
+
+		this._isCurrentlyTwoClickDrawing = false;
+		L.Draw.SimpleShape.prototype.disable.call(this);
+	},
+
+	_onMouseUp: function (e) {
+		if (!this._shape && !this._isCurrentlyTwoClickDrawing) {
+			this._isCurrentlyTwoClickDrawing = true;
+			return;
+		}
+
+		// Make sure closing click is on map
+		if (this._isCurrentlyTwoClickDrawing && !_hasAncestor(e.target, 'leaflet-pane')) {
+			return;
+		}
+
+		L.Draw.SimpleShape.prototype._onMouseUp.call(this);
+	},
+
+	_drawShape: function (latlng) {
+		if (!this._shape) {
+			this._shape = new L.Rectangle(new L.LatLngBounds(this._startLatLng, latlng), this.options.shapeOptions);
+			this._map.addLayer(this._shape);
+		} else {
+			this._shape.setBounds(new L.LatLngBounds(this._startLatLng, latlng));
+		}
+	},
+
+	_fireCreatedEvent: function () {
+		var rectangle = new L.Rectangle(this._shape.getBounds(), this.options.shapeOptions);
+		L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, rectangle);
+	},
+
+	_getTooltipText: function () {
+		var tooltipText = L.Draw.SimpleShape.prototype._getTooltipText.call(this),
+			shape = this._shape,
+			showArea = this.options.showArea,
+			latLngs, area, subtext;
+
+		if (shape) {
+			latLngs = this._shape._defaultShape ? this._shape._defaultShape() : this._shape.getLatLngs();
+			area = L.GeometryUtil.geodesicArea(latLngs);
+			subtext = showArea ? L.GeometryUtil.readableArea(area, this.options.metric) : '';
+		}
+
+		return {
+			text: tooltipText.text,
+			subtext: subtext
+		};
+	}
+});
+
+function _hasAncestor(el, cls) {
+	while ((el = el.parentElement) && !el.classList.contains(cls)) {
+		;
+	}
+	return el;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.Rectangle.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+function _hasAncestor(t,e){for(;(t=t.parentElement)&&!t.classList.contains(e););return t}L.Draw.Rectangle=L.Draw.SimpleShape.extend({statics:{TYPE:"rectangle"},options:{shapeOptions:{stroke:!0,color:"#3388ff",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},showArea:!0,metric:!0},initialize:function(t,e){this.type=L.Draw.Rectangle.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.rectangle.tooltip.start,L.Draw.SimpleShape.prototype.initialize.call(this,t,e)},disable:function(){this._enabled&&(this._isCurrentlyTwoClickDrawing=!1,L.Draw.SimpleShape.prototype.disable.call(this))},_onMouseUp:function(t){this._shape||this._isCurrentlyTwoClickDrawing?this._isCurrentlyTwoClickDrawing&&!_hasAncestor(t.target,"leaflet-pane")||L.Draw.SimpleShape.prototype._onMouseUp.call(this):this._isCurrentlyTwoClickDrawing=!0},_drawShape:function(t){this._shape?this._shape.setBounds(new L.LatLngBounds(this._startLatLng,t)):(this._shape=new L.Rectangle(new L.LatLngBounds(this._startLatLng,t),this.options.shapeOptions),this._map.addLayer(this._shape))},_fireCreatedEvent:function(){var t=new L.Rectangle(this._shape.getBounds(),this.options.shapeOptions);L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this,t)},_getTooltipText:function(){var t,e,i,a=L.Draw.SimpleShape.prototype._getTooltipText.call(this),s=this._shape,n=this.options.showArea;return s&&(t=this._shape._defaultShape?this._shape._defaultShape():this._shape.getLatLngs(),e=L.GeometryUtil.geodesicArea(t),i=n?L.GeometryUtil.readableArea(e,this.options.metric):""),{text:a.text,subtext:i}}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.SimpleShape.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,119 @@
+L.SimpleShape = {};
+/**
+ * @class L.Draw.SimpleShape
+ * @aka Draw.SimpleShape
+ * @inherits L.Draw.Feature
+ */
+L.Draw.SimpleShape = L.Draw.Feature.extend({
+	options: {
+		repeatMode: false
+	},
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		this._endLabelText = L.drawLocal.draw.handlers.simpleshape.tooltip.end;
+
+		L.Draw.Feature.prototype.initialize.call(this, map, options);
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler.
+	addHooks: function () {
+		L.Draw.Feature.prototype.addHooks.call(this);
+		if (this._map) {
+			this._mapDraggable = this._map.dragging.enabled();
+
+			if (this._mapDraggable) {
+				this._map.dragging.disable();
+			}
+
+			//TODO refactor: move cursor to styles
+			this._container.style.cursor = 'crosshair';
+
+			this._tooltip.updateContent({text: this._initialLabelText});
+
+			this._map
+				.on('mousedown', this._onMouseDown, this)
+				.on('mousemove', this._onMouseMove, this)
+				.on('touchstart', this._onMouseDown, this)
+				.on('touchmove', this._onMouseMove, this);
+
+			// we should prevent default, otherwise default behavior (scrolling) will fire,
+			// and that will cause document.touchend to fire and will stop the drawing
+			// (circle, rectangle) in touch mode.
+			// (update): we have to send passive now to prevent scroll, because by default it is {passive: true} now, which means,
+			// handler can't event.preventDefault
+			// check the news https://developers.google.com/web/updates/2016/06/passive-event-listeners
+			document.addEventListener('touchstart', L.DomEvent.preventDefault, {passive: false});
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler.
+	removeHooks: function () {
+		L.Draw.Feature.prototype.removeHooks.call(this);
+		if (this._map) {
+			if (this._mapDraggable) {
+				this._map.dragging.enable();
+			}
+
+			//TODO refactor: move cursor to styles
+			this._container.style.cursor = '';
+
+			this._map
+				.off('mousedown', this._onMouseDown, this)
+				.off('mousemove', this._onMouseMove, this)
+				.off('touchstart', this._onMouseDown, this)
+				.off('touchmove', this._onMouseMove, this);
+
+			L.DomEvent.off(document, 'mouseup', this._onMouseUp, this);
+			L.DomEvent.off(document, 'touchend', this._onMouseUp, this);
+
+			document.removeEventListener('touchstart', L.DomEvent.preventDefault);
+
+			// If the box element doesn't exist they must not have moved the mouse, so don't need to destroy/return
+			if (this._shape) {
+				this._map.removeLayer(this._shape);
+				delete this._shape;
+			}
+		}
+		this._isDrawing = false;
+	},
+
+	_getTooltipText: function () {
+		return {
+			text: this._endLabelText
+		};
+	},
+
+	_onMouseDown: function (e) {
+		this._isDrawing = true;
+		this._startLatLng = e.latlng;
+
+		L.DomEvent
+			.on(document, 'mouseup', this._onMouseUp, this)
+			.on(document, 'touchend', this._onMouseUp, this)
+			.preventDefault(e.originalEvent);
+	},
+
+	_onMouseMove: function (e) {
+		var latlng = e.latlng;
+
+		this._tooltip.updatePosition(latlng);
+		if (this._isDrawing) {
+			this._tooltip.updateContent(this._getTooltipText());
+			this._drawShape(latlng);
+		}
+	},
+
+	_onMouseUp: function () {
+		if (this._shape) {
+			this._fireCreatedEvent();
+		}
+
+		this.disable();
+		if (this.options.repeatMode) {
+			this.enable();
+		}
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/draw/handler/Draw.SimpleShape.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.SimpleShape={},L.Draw.SimpleShape=L.Draw.Feature.extend({options:{repeatMode:!1},initialize:function(t,e){this._endLabelText=L.drawLocal.draw.handlers.simpleshape.tooltip.end,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._mapDraggable=this._map.dragging.enabled(),this._mapDraggable&&this._map.dragging.disable(),this._container.style.cursor="crosshair",this._tooltip.updateContent({text:this._initialLabelText}),this._map.on("mousedown",this._onMouseDown,this).on("mousemove",this._onMouseMove,this).on("touchstart",this._onMouseDown,this).on("touchmove",this._onMouseMove,this),document.addEventListener("touchstart",L.DomEvent.preventDefault,{passive:!1}))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._map&&(this._mapDraggable&&this._map.dragging.enable(),this._container.style.cursor="",this._map.off("mousedown",this._onMouseDown,this).off("mousemove",this._onMouseMove,this).off("touchstart",this._onMouseDown,this).off("touchmove",this._onMouseMove,this),L.DomEvent.off(document,"mouseup",this._onMouseUp,this),L.DomEvent.off(document,"touchend",this._onMouseUp,this),document.removeEventListener("touchstart",L.DomEvent.preventDefault),this._shape&&(this._map.removeLayer(this._shape),delete this._shape)),this._isDrawing=!1},_getTooltipText:function(){return{text:this._endLabelText}},_onMouseDown:function(t){this._isDrawing=!0,this._startLatLng=t.latlng,L.DomEvent.on(document,"mouseup",this._onMouseUp,this).on(document,"touchend",this._onMouseUp,this).preventDefault(t.originalEvent)},_onMouseMove:function(t){var e=t.latlng;this._tooltip.updatePosition(e),this._isDrawing&&(this._tooltip.updateContent(this._getTooltipText()),this._drawShape(e))},_onMouseUp:function(){this._shape&&this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable()}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/EditToolbar.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,194 @@
+/*L.Map.mergeOptions({
+ editControl: true
+ });*/
+/**
+ * @class L.EditToolbar
+ * @aka EditToolbar
+ */
+L.EditToolbar = L.Toolbar.extend({
+	statics: {
+		TYPE: 'edit'
+	},
+
+	options: {
+		edit: {
+			selectedPathOptions: {
+				dashArray: '10, 10',
+
+				fill: true,
+				fillColor: '#fe57a1',
+				fillOpacity: 0.1,
+
+				// Whether to user the existing layers color
+				maintainColor: false
+			}
+		},
+		remove: {},
+		poly: null,
+		featureGroup: null /* REQUIRED! TODO: perhaps if not set then all layers on the map are selectable? */
+	},
+
+	// @method intialize(): void
+	initialize: function (options) {
+		// Need to set this manually since null is an acceptable value here
+		if (options.edit) {
+			if (typeof options.edit.selectedPathOptions === 'undefined') {
+				options.edit.selectedPathOptions = this.options.edit.selectedPathOptions;
+			}
+			options.edit.selectedPathOptions = L.extend({}, this.options.edit.selectedPathOptions, options.edit.selectedPathOptions);
+		}
+
+		if (options.remove) {
+			options.remove = L.extend({}, this.options.remove, options.remove);
+		}
+
+		if (options.poly) {
+			options.poly = L.extend({}, this.options.poly, options.poly);
+		}
+
+		this._toolbarClass = 'leaflet-draw-edit';
+		L.Toolbar.prototype.initialize.call(this, options);
+
+		this._selectedFeatureCount = 0;
+	},
+
+	// @method getModeHandlers(): object
+	// Get mode handlers information
+	getModeHandlers: function (map) {
+		var featureGroup = this.options.featureGroup;
+		return [
+			{
+				enabled: this.options.edit,
+				handler: new L.EditToolbar.Edit(map, {
+					featureGroup: featureGroup,
+					selectedPathOptions: this.options.edit.selectedPathOptions,
+					poly: this.options.poly
+				}),
+				title: L.drawLocal.edit.toolbar.buttons.edit
+			},
+			{
+				enabled: this.options.remove,
+				handler: new L.EditToolbar.Delete(map, {
+					featureGroup: featureGroup
+				}),
+				title: L.drawLocal.edit.toolbar.buttons.remove
+			}
+		];
+	},
+
+	// @method getActions(): object
+	// Get actions information
+	getActions: function (handler) {
+		var actions = [
+			{
+				title: L.drawLocal.edit.toolbar.actions.save.title,
+				text: L.drawLocal.edit.toolbar.actions.save.text,
+				callback: this._save,
+				context: this
+			},
+			{
+				title: L.drawLocal.edit.toolbar.actions.cancel.title,
+				text: L.drawLocal.edit.toolbar.actions.cancel.text,
+				callback: this.disable,
+				context: this
+			}
+		];
+
+		if (handler.removeAllLayers) {
+			actions.push({
+				title: L.drawLocal.edit.toolbar.actions.clearAll.title,
+				text: L.drawLocal.edit.toolbar.actions.clearAll.text,
+				callback: this._clearAllLayers,
+				context: this
+			});
+		}
+
+		return actions;
+	},
+
+	// @method addToolbar(map): L.DomUtil
+	// Adds the toolbar to the map
+	addToolbar: function (map) {
+		var container = L.Toolbar.prototype.addToolbar.call(this, map);
+
+		this._checkDisabled();
+
+		this.options.featureGroup.on('layeradd layerremove', this._checkDisabled, this);
+
+		return container;
+	},
+
+	// @method removeToolbar(): void
+	// Removes the toolbar from the map
+	removeToolbar: function () {
+		this.options.featureGroup.off('layeradd layerremove', this._checkDisabled, this);
+
+		L.Toolbar.prototype.removeToolbar.call(this);
+	},
+
+	// @method disable(): void
+	// Disables the toolbar
+	disable: function () {
+		if (!this.enabled()) {
+			return;
+		}
+
+		this._activeMode.handler.revertLayers();
+
+		L.Toolbar.prototype.disable.call(this);
+	},
+
+	_save: function () {
+		this._activeMode.handler.save();
+		if (this._activeMode) {
+			this._activeMode.handler.disable();
+		}
+	},
+
+	_clearAllLayers: function () {
+		this._activeMode.handler.removeAllLayers();
+		if (this._activeMode) {
+			this._activeMode.handler.disable();
+		}
+	},
+
+	_checkDisabled: function () {
+		var featureGroup = this.options.featureGroup,
+			hasLayers = featureGroup.getLayers().length !== 0,
+			button;
+
+		if (this.options.edit) {
+			button = this._modes[L.EditToolbar.Edit.TYPE].button;
+
+			if (hasLayers) {
+				L.DomUtil.removeClass(button, 'leaflet-disabled');
+			} else {
+				L.DomUtil.addClass(button, 'leaflet-disabled');
+			}
+
+			button.setAttribute(
+				'title',
+				hasLayers ?
+					L.drawLocal.edit.toolbar.buttons.edit
+					: L.drawLocal.edit.toolbar.buttons.editDisabled
+			);
+		}
+
+		if (this.options.remove) {
+			button = this._modes[L.EditToolbar.Delete.TYPE].button;
+
+			if (hasLayers) {
+				L.DomUtil.removeClass(button, 'leaflet-disabled');
+			} else {
+				L.DomUtil.addClass(button, 'leaflet-disabled');
+			}
+
+			button.setAttribute(
+				'title',
+				hasLayers ?
+					L.drawLocal.edit.toolbar.buttons.remove
+					: L.drawLocal.edit.toolbar.buttons.removeDisabled
+			);
+		}
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/EditToolbar.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.EditToolbar=L.Toolbar.extend({statics:{TYPE:"edit"},options:{edit:{selectedPathOptions:{dashArray:"10, 10",fill:!0,fillColor:"#fe57a1",fillOpacity:.1,maintainColor:!1}},remove:{},poly:null,featureGroup:null},initialize:function(t){t.edit&&(void 0===t.edit.selectedPathOptions&&(t.edit.selectedPathOptions=this.options.edit.selectedPathOptions),t.edit.selectedPathOptions=L.extend({},this.options.edit.selectedPathOptions,t.edit.selectedPathOptions)),t.remove&&(t.remove=L.extend({},this.options.remove,t.remove)),t.poly&&(t.poly=L.extend({},this.options.poly,t.poly)),this._toolbarClass="leaflet-draw-edit",L.Toolbar.prototype.initialize.call(this,t),this._selectedFeatureCount=0},getModeHandlers:function(t){var e=this.options.featureGroup;return[{enabled:this.options.edit,handler:new L.EditToolbar.Edit(t,{featureGroup:e,selectedPathOptions:this.options.edit.selectedPathOptions,poly:this.options.poly}),title:L.drawLocal.edit.toolbar.buttons.edit},{enabled:this.options.remove,handler:new L.EditToolbar.Delete(t,{featureGroup:e}),title:L.drawLocal.edit.toolbar.buttons.remove}]},getActions:function(t){var e=[{title:L.drawLocal.edit.toolbar.actions.save.title,text:L.drawLocal.edit.toolbar.actions.save.text,callback:this._save,context:this},{title:L.drawLocal.edit.toolbar.actions.cancel.title,text:L.drawLocal.edit.toolbar.actions.cancel.text,callback:this.disable,context:this}];return t.removeAllLayers&&e.push({title:L.drawLocal.edit.toolbar.actions.clearAll.title,text:L.drawLocal.edit.toolbar.actions.clearAll.text,callback:this._clearAllLayers,context:this}),e},addToolbar:function(t){var e=L.Toolbar.prototype.addToolbar.call(this,t);return this._checkDisabled(),this.options.featureGroup.on("layeradd layerremove",this._checkDisabled,this),e},removeToolbar:function(){this.options.featureGroup.off("layeradd layerremove",this._checkDisabled,this),L.Toolbar.prototype.removeToolbar.call(this)},disable:function(){this.enabled()&&(this._activeMode.handler.revertLayers(),L.Toolbar.prototype.disable.call(this))},_save:function(){this._activeMode.handler.save(),this._activeMode&&this._activeMode.handler.disable()},_clearAllLayers:function(){this._activeMode.handler.removeAllLayers(),this._activeMode&&this._activeMode.handler.disable()},_checkDisabled:function(){var t,e=0!==this.options.featureGroup.getLayers().length;this.options.edit&&(t=this._modes[L.EditToolbar.Edit.TYPE].button,e?L.DomUtil.removeClass(t,"leaflet-disabled"):L.DomUtil.addClass(t,"leaflet-disabled"),t.setAttribute("title",e?L.drawLocal.edit.toolbar.buttons.edit:L.drawLocal.edit.toolbar.buttons.editDisabled)),this.options.remove&&(t=this._modes[L.EditToolbar.Delete.TYPE].button,e?L.DomUtil.removeClass(t,"leaflet-disabled"):L.DomUtil.addClass(t,"leaflet-disabled"),t.setAttribute("title",e?L.drawLocal.edit.toolbar.buttons.remove:L.drawLocal.edit.toolbar.buttons.removeDisabled))}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/Edit.Circle.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,57 @@
+L.Edit = L.Edit || {};
+/**
+ * @class L.Edit.Circle
+ * @aka Edit.Circle
+ * @inherits L.Edit.CircleMarker
+ */
+L.Edit.Circle = L.Edit.CircleMarker.extend({
+
+	_createResizeMarker: function () {
+		var center = this._shape.getLatLng(),
+			resizemarkerPoint = this._getResizeMarkerPoint(center);
+
+		this._resizeMarkers = [];
+		this._resizeMarkers.push(this._createMarker(resizemarkerPoint, this.options.resizeIcon));
+	},
+
+	_getResizeMarkerPoint: function (latlng) {
+		// From L.shape.getBounds()
+		var delta = this._shape._radius * Math.cos(Math.PI / 4),
+			point = this._map.project(latlng);
+		return this._map.unproject([point.x + delta, point.y - delta]);
+	},
+
+	_resize: function (latlng) {
+		var moveLatLng = this._moveMarker.getLatLng();
+
+		// Calculate the radius based on the version
+		if (L.GeometryUtil.isVersion07x()) {
+			radius = moveLatLng.distanceTo(latlng);
+		} else {
+			radius = this._map.distance(moveLatLng, latlng);
+		}
+		this._shape.setRadius(radius);
+
+		if (this._map.editTooltip) {
+			this._map._editTooltip.updateContent({
+				text: L.drawLocal.edit.handlers.edit.tooltip.subtext + '<br />' + L.drawLocal.edit.handlers.edit.tooltip.text,
+				subtext: L.drawLocal.draw.handlers.circle.radius + ': ' +
+				L.GeometryUtil.readableDistance(radius, true, this.options.feet, this.options.nautic)
+			});
+		}
+
+		this._shape.setRadius(radius);
+
+		this._map.fire(L.Draw.Event.EDITRESIZE, {layer: this._shape});
+	}
+});
+
+L.Circle.addInitHook(function () {
+	if (L.Edit.Circle) {
+		this.editing = new L.Edit.Circle(this);
+
+		if (this.options.editable) {
+			this.editing.enable();
+		}
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/Edit.Circle.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Edit=L.Edit||{},L.Edit.Circle=L.Edit.CircleMarker.extend({_createResizeMarker:function(){var t=this._shape.getLatLng(),e=this._getResizeMarkerPoint(t);this._resizeMarkers=[],this._resizeMarkers.push(this._createMarker(e,this.options.resizeIcon))},_getResizeMarkerPoint:function(t){var e=this._shape._radius*Math.cos(Math.PI/4),i=this._map.project(t);return this._map.unproject([i.x+e,i.y-e])},_resize:function(t){var e=this._moveMarker.getLatLng();L.GeometryUtil.isVersion07x()?radius=e.distanceTo(t):radius=this._map.distance(e,t),this._shape.setRadius(radius),this._map.editTooltip&&this._map._editTooltip.updateContent({text:L.drawLocal.edit.handlers.edit.tooltip.subtext+"<br />"+L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.draw.handlers.circle.radius+": "+L.GeometryUtil.readableDistance(radius,!0,this.options.feet,this.options.nautic)}),this._shape.setRadius(radius),this._map.fire(L.Draw.Event.EDITRESIZE,{layer:this._shape})}}),L.Circle.addInitHook((function(){L.Edit.Circle&&(this.editing=new L.Edit.Circle(this),this.options.editable&&this.editing.enable())}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/Edit.CircleMarker.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,53 @@
+L.Edit = L.Edit || {};
+/**
+ * @class L.Edit.CircleMarker
+ * @aka Edit.Circle
+ * @inherits L.Edit.SimpleShape
+ */
+L.Edit.CircleMarker = L.Edit.SimpleShape.extend({
+	_createMoveMarker: function () {
+		var center = this._shape.getLatLng();
+
+		this._moveMarker = this._createMarker(center, this.options.moveIcon);
+	},
+
+	_createResizeMarker: function () {
+		// To avoid an undefined check in L.Edit.SimpleShape.removeHooks
+		this._resizeMarkers = [];
+	},
+
+	_move: function (latlng) {
+		if (this._resizeMarkers.length) {
+			var resizemarkerPoint = this._getResizeMarkerPoint(latlng);
+			// Move the resize marker
+			this._resizeMarkers[0].setLatLng(resizemarkerPoint);
+		}
+
+		// Move the circle
+		this._shape.setLatLng(latlng);
+
+		this._map.fire(L.Draw.Event.EDITMOVE, {layer: this._shape});
+	},
+});
+
+L.CircleMarker.addInitHook(function () {
+	if (L.Edit.CircleMarker) {
+		this.editing = new L.Edit.CircleMarker(this);
+
+		if (this.options.editable) {
+			this.editing.enable();
+		}
+	}
+
+	this.on('add', function () {
+		if (this.editing && this.editing.enabled()) {
+			this.editing.addHooks();
+		}
+	});
+
+	this.on('remove', function () {
+		if (this.editing && this.editing.enabled()) {
+			this.editing.removeHooks();
+		}
+	});
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/Edit.CircleMarker.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Edit=L.Edit||{},L.Edit.CircleMarker=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var e=this._shape.getLatLng();this._moveMarker=this._createMarker(e,this.options.moveIcon)},_createResizeMarker:function(){this._resizeMarkers=[]},_move:function(e){if(this._resizeMarkers.length){var i=this._getResizeMarkerPoint(e);this._resizeMarkers[0].setLatLng(i)}this._shape.setLatLng(e),this._map.fire(L.Draw.Event.EDITMOVE,{layer:this._shape})}}),L.CircleMarker.addInitHook((function(){L.Edit.CircleMarker&&(this.editing=new L.Edit.CircleMarker(this),this.options.editable&&this.editing.enable()),this.on("add",(function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()})),this.on("remove",(function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()}))}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/Edit.Marker.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,84 @@
+L.Edit = L.Edit || {};
+
+/**
+ * @class L.Edit.Marker
+ * @aka Edit.Marker
+ */
+L.Edit.Marker = L.Handler.extend({
+	// @method initialize(): void
+	initialize: function (marker, options) {
+		this._marker = marker;
+		L.setOptions(this, options);
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler
+	addHooks: function () {
+		var marker = this._marker;
+
+		marker.dragging.enable();
+		marker.on('dragend', this._onDragEnd, marker);
+		this._toggleMarkerHighlight();
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler
+	removeHooks: function () {
+		var marker = this._marker;
+
+		marker.dragging.disable();
+		marker.off('dragend', this._onDragEnd, marker);
+		this._toggleMarkerHighlight();
+	},
+
+	_onDragEnd: function (e) {
+		var layer = e.target;
+		layer.edited = true;
+		this._map.fire(L.Draw.Event.EDITMOVE, {layer: layer});
+	},
+
+	_toggleMarkerHighlight: function () {
+		var icon = this._marker._icon;
+
+		// Don't do anything if this layer is a marker but doesn't have an icon. Markers
+		// should usually have icons. If using Leaflet.draw with Leaflet.markercluster there
+		// is a chance that a marker doesn't.
+		if (!icon) {
+			return;
+		}
+
+		// This is quite naughty, but I don't see another way of doing it. (short of setting a new icon)
+		icon.style.display = 'none';
+
+		if (L.DomUtil.hasClass(icon, 'leaflet-edit-marker-selected')) {
+			L.DomUtil.removeClass(icon, 'leaflet-edit-marker-selected');
+			// Offset as the border will make the icon move.
+			this._offsetMarker(icon, -4);
+
+		} else {
+			L.DomUtil.addClass(icon, 'leaflet-edit-marker-selected');
+			// Offset as the border will make the icon move.
+			this._offsetMarker(icon, 4);
+		}
+
+		icon.style.display = '';
+	},
+
+	_offsetMarker: function (icon, offset) {
+		var iconMarginTop = parseInt(icon.style.marginTop, 10) - offset,
+			iconMarginLeft = parseInt(icon.style.marginLeft, 10) - offset;
+
+		icon.style.marginTop = iconMarginTop + 'px';
+		icon.style.marginLeft = iconMarginLeft + 'px';
+	}
+});
+
+L.Marker.addInitHook(function () {
+	if (L.Edit.Marker) {
+		this.editing = new L.Edit.Marker(this);
+
+		if (this.options.editable) {
+			this.editing.enable();
+		}
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/Edit.Marker.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Edit=L.Edit||{},L.Edit.Marker=L.Handler.extend({initialize:function(e,t){this._marker=e,L.setOptions(this,t)},addHooks:function(){var e=this._marker;e.dragging.enable(),e.on("dragend",this._onDragEnd,e),this._toggleMarkerHighlight()},removeHooks:function(){var e=this._marker;e.dragging.disable(),e.off("dragend",this._onDragEnd,e),this._toggleMarkerHighlight()},_onDragEnd:function(e){var t=e.target;t.edited=!0,this._map.fire(L.Draw.Event.EDITMOVE,{layer:t})},_toggleMarkerHighlight:function(){var e=this._marker._icon;e&&(e.style.display="none",L.DomUtil.hasClass(e,"leaflet-edit-marker-selected")?(L.DomUtil.removeClass(e,"leaflet-edit-marker-selected"),this._offsetMarker(e,-4)):(L.DomUtil.addClass(e,"leaflet-edit-marker-selected"),this._offsetMarker(e,4)),e.style.display="")},_offsetMarker:function(e,t){var i=parseInt(e.style.marginTop,10)-t,r=parseInt(e.style.marginLeft,10)-t;e.style.marginTop=i+"px",e.style.marginLeft=r+"px"}}),L.Marker.addInitHook((function(){L.Edit.Marker&&(this.editing=new L.Edit.Marker(this),this.options.editable&&this.editing.enable())}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/Edit.Poly.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,520 @@
+L.Edit = L.Edit || {};
+
+/**
+ * @class L.Edit.Polyline
+ * @aka L.Edit.Poly
+ * @aka Edit.Poly
+ */
+L.Edit.Poly = L.Handler.extend({
+	// @method initialize(): void
+	initialize: function (poly) {
+
+		this.latlngs = [poly._latlngs];
+		if (poly._holes) {
+			this.latlngs = this.latlngs.concat(poly._holes);
+		}
+
+		this._poly = poly;
+
+		this._poly.on('revert-edited', this._updateLatLngs, this);
+	},
+
+	// Compatibility method to normalize Poly* objects
+	// between 0.7.x and 1.0+
+	_defaultShape: function () {
+		if (!L.Polyline._flat) {
+			return this._poly._latlngs;
+		}
+		return L.Polyline._flat(this._poly._latlngs) ? this._poly._latlngs : this._poly._latlngs[0];
+	},
+
+	_eachVertexHandler: function (callback) {
+		for (var i = 0; i < this._verticesHandlers.length; i++) {
+			callback(this._verticesHandlers[i]);
+		}
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler
+	addHooks: function () {
+		this._initHandlers();
+		this._eachVertexHandler(function (handler) {
+			handler.addHooks();
+		});
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler
+	removeHooks: function () {
+		this._eachVertexHandler(function (handler) {
+			handler.removeHooks();
+		});
+	},
+
+	// @method updateMarkers(): void
+	// Fire an update for each vertex handler
+	updateMarkers: function () {
+		this._eachVertexHandler(function (handler) {
+			handler.updateMarkers();
+		});
+	},
+
+	_initHandlers: function () {
+		this._verticesHandlers = [];
+		for (var i = 0; i < this.latlngs.length; i++) {
+			this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(this._poly, this.latlngs[i], this._poly.options.poly));
+		}
+	},
+
+	_updateLatLngs: function (e) {
+		this.latlngs = [e.layer._latlngs];
+		if (e.layer._holes) {
+			this.latlngs = this.latlngs.concat(e.layer._holes);
+		}
+	}
+
+});
+
+/**
+ * @class L.Edit.PolyVerticesEdit
+ * @aka Edit.PolyVerticesEdit
+ */
+L.Edit.PolyVerticesEdit = L.Handler.extend({
+	options: {
+		icon: new L.DivIcon({
+			iconSize: new L.Point(8, 8),
+			className: 'leaflet-div-icon leaflet-editing-icon'
+		}),
+		touchIcon: new L.DivIcon({
+			iconSize: new L.Point(20, 20),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
+		}),
+		drawError: {
+			color: '#b00b00',
+			timeout: 1000
+		}
+
+
+	},
+
+	// @method intialize(): void
+	initialize: function (poly, latlngs, options) {
+		// if touch, switch to touch icon
+		if (L.Browser.touch) {
+			this.options.icon = this.options.touchIcon;
+		}
+		this._poly = poly;
+
+		if (options && options.drawError) {
+			options.drawError = L.Util.extend({}, this.options.drawError, options.drawError);
+		}
+
+		this._latlngs = latlngs;
+
+		L.setOptions(this, options);
+	},
+
+	// Compatibility method to normalize Poly* objects
+	// between 0.7.x and 1.0+
+	_defaultShape: function () {
+		if (!L.Polyline._flat) {
+			return this._latlngs;
+		}
+		return L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0];
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler.
+	addHooks: function () {
+		var poly = this._poly;
+		var path = poly._path;
+
+		if (!(poly instanceof L.Polygon)) {
+			poly.options.fill = false;
+			if (poly.options.editing) {
+				poly.options.editing.fill = false;
+			}
+		}
+
+		if (path) {
+			if (poly.options.editing && poly.options.editing.className) {
+				if (poly.options.original.className) {
+					poly.options.original.className.split(' ').forEach(function (className) {
+						L.DomUtil.removeClass(path, className);
+					});
+				}
+				poly.options.editing.className.split(' ').forEach(function (className) {
+					L.DomUtil.addClass(path, className);
+				});
+			}
+		}
+
+		poly.setStyle(poly.options.editing);
+
+		if (this._poly._map) {
+
+			this._map = this._poly._map; // Set map
+
+			if (!this._markerGroup) {
+				this._initMarkers();
+			}
+			this._poly._map.addLayer(this._markerGroup);
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler.
+	removeHooks: function () {
+		var poly = this._poly;
+		var path = poly._path;
+
+		if (path) {
+			if (poly.options.editing && poly.options.editing.className) {
+				poly.options.editing.className.split(' ').forEach(function (className) {
+					L.DomUtil.removeClass(path, className);
+				});
+				if (poly.options.original.className) {
+					poly.options.original.className.split(' ').forEach(function (className) {
+						L.DomUtil.addClass(path, className);
+					});
+				}
+			}
+		}
+
+		poly.setStyle(poly.options.original);
+
+		if (poly._map) {
+			poly._map.removeLayer(this._markerGroup);
+			delete this._markerGroup;
+			delete this._markers;
+		}
+	},
+
+	// @method updateMarkers(): void
+	// Clear markers and update their location
+	updateMarkers: function () {
+		this._markerGroup.clearLayers();
+		this._initMarkers();
+	},
+
+	_initMarkers: function () {
+		if (!this._markerGroup) {
+			this._markerGroup = new L.LayerGroup();
+		}
+		this._markers = [];
+
+		var latlngs = this._defaultShape(),
+			i, j, len, marker;
+
+		for (i = 0, len = latlngs.length; i < len; i++) {
+
+			marker = this._createMarker(latlngs[i], i);
+			marker.on('click', this._onMarkerClick, this);
+			marker.on('contextmenu', this._onContextMenu, this);
+			this._markers.push(marker);
+		}
+
+		var markerLeft, markerRight;
+
+		for (i = 0, j = len - 1; i < len; j = i++) {
+			if (i === 0 && !(L.Polygon && (this._poly instanceof L.Polygon))) {
+				continue;
+			}
+
+			markerLeft = this._markers[j];
+			markerRight = this._markers[i];
+
+			this._createMiddleMarker(markerLeft, markerRight);
+			this._updatePrevNext(markerLeft, markerRight);
+		}
+	},
+
+	_createMarker: function (latlng, index) {
+		// Extending L.Marker in TouchEvents.js to include touch.
+		var marker = new L.Marker.Touch(latlng, {
+			draggable: true,
+			icon: this.options.icon,
+		});
+
+		marker._origLatLng = latlng;
+		marker._index = index;
+
+		marker
+			.on('dragstart', this._onMarkerDragStart, this)
+			.on('drag', this._onMarkerDrag, this)
+			.on('dragend', this._fireEdit, this)
+			.on('touchmove', this._onTouchMove, this)
+			.on('touchend', this._fireEdit, this)
+			.on('MSPointerMove', this._onTouchMove, this)
+			.on('MSPointerUp', this._fireEdit, this);
+
+		this._markerGroup.addLayer(marker);
+
+		return marker;
+	},
+
+	_onMarkerDragStart: function () {
+		this._poly.fire('editstart');
+	},
+
+	_spliceLatLngs: function () {
+		var latlngs = this._defaultShape();
+		var removed = [].splice.apply(latlngs, arguments);
+		this._poly._convertLatLngs(latlngs, true);
+		this._poly.redraw();
+		return removed;
+	},
+
+	_removeMarker: function (marker) {
+		var i = marker._index;
+
+		this._markerGroup.removeLayer(marker);
+		this._markers.splice(i, 1);
+		this._spliceLatLngs(i, 1);
+		this._updateIndexes(i, -1);
+
+		marker
+			.off('dragstart', this._onMarkerDragStart, this)
+			.off('drag', this._onMarkerDrag, this)
+			.off('dragend', this._fireEdit, this)
+			.off('touchmove', this._onMarkerDrag, this)
+			.off('touchend', this._fireEdit, this)
+			.off('click', this._onMarkerClick, this)
+			.off('MSPointerMove', this._onTouchMove, this)
+			.off('MSPointerUp', this._fireEdit, this);
+	},
+
+	_fireEdit: function () {
+		this._poly.edited = true;
+		this._poly.fire('edit');
+		this._poly._map.fire(L.Draw.Event.EDITVERTEX, {layers: this._markerGroup, poly: this._poly});
+	},
+
+	_onMarkerDrag: function (e) {
+		var marker = e.target;
+		var poly = this._poly;
+
+		var oldOrigLatLng = L.LatLngUtil.cloneLatLng(marker._origLatLng);
+		L.extend(marker._origLatLng, marker._latlng);
+		if (poly.options.poly) {
+			var tooltip = poly._map._editTooltip; // Access the tooltip
+
+			// If we don't allow intersections and the polygon intersects
+			if (!poly.options.poly.allowIntersection && poly.intersects()) {
+				L.extend(marker._origLatLng, oldOrigLatLng);
+				marker.setLatLng(oldOrigLatLng);
+				var originalColor = poly.options.color;
+				poly.setStyle({color: this.options.drawError.color});
+				if (tooltip) {
+					tooltip.updateContent({
+						text: L.drawLocal.draw.handlers.polyline.error
+					});
+				}
+
+				// Reset everything back to normal after a second
+				setTimeout(function () {
+					poly.setStyle({color: originalColor});
+					if (tooltip) {
+						tooltip.updateContent({
+							text: L.drawLocal.edit.handlers.edit.tooltip.text,
+							subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
+						});
+					}
+				}, 1000);
+			}
+		}
+
+		if (marker._middleLeft) {
+			marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
+		}
+		if (marker._middleRight) {
+			marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
+		}
+
+		//refresh the bounds when draging
+		this._poly._bounds._southWest = L.latLng(Infinity, Infinity);
+		this._poly._bounds._northEast = L.latLng(-Infinity, -Infinity);
+		var latlngs = this._poly.getLatLngs();
+		this._poly._convertLatLngs(latlngs, true);
+		this._poly.redraw();
+		this._poly.fire('editdrag');
+	},
+
+	_onMarkerClick: function (e) {
+
+		var minPoints = L.Polygon && (this._poly instanceof L.Polygon) ? 4 : 3,
+			marker = e.target;
+
+		// If removing this point would create an invalid polyline/polygon don't remove
+		if (this._defaultShape().length < minPoints) {
+			return;
+		}
+
+		// remove the marker
+		this._removeMarker(marker);
+
+		// update prev/next links of adjacent markers
+		this._updatePrevNext(marker._prev, marker._next);
+
+		// remove ghost markers near the removed marker
+		if (marker._middleLeft) {
+			this._markerGroup.removeLayer(marker._middleLeft);
+		}
+		if (marker._middleRight) {
+			this._markerGroup.removeLayer(marker._middleRight);
+		}
+
+		// create a ghost marker in place of the removed one
+		if (marker._prev && marker._next) {
+			this._createMiddleMarker(marker._prev, marker._next);
+
+		} else if (!marker._prev) {
+			marker._next._middleLeft = null;
+
+		} else if (!marker._next) {
+			marker._prev._middleRight = null;
+		}
+
+		this._fireEdit();
+	},
+
+	_onContextMenu: function (e) {
+		var marker = e.target;
+		var poly = this._poly;
+		this._poly._map.fire(L.Draw.Event.MARKERCONTEXT, {marker: marker, layers: this._markerGroup, poly: this._poly});
+		L.DomEvent.stopPropagation;
+	},
+
+	_onTouchMove: function (e) {
+
+		var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]),
+			latlng = this._map.layerPointToLatLng(layerPoint),
+			marker = e.target;
+
+		L.extend(marker._origLatLng, latlng);
+
+		if (marker._middleLeft) {
+			marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
+		}
+		if (marker._middleRight) {
+			marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
+		}
+
+		this._poly.redraw();
+		this.updateMarkers();
+	},
+
+	_updateIndexes: function (index, delta) {
+		this._markerGroup.eachLayer(function (marker) {
+			if (marker._index > index) {
+				marker._index += delta;
+			}
+		});
+	},
+
+	_createMiddleMarker: function (marker1, marker2) {
+		var latlng = this._getMiddleLatLng(marker1, marker2),
+			marker = this._createMarker(latlng),
+			onClick,
+			onDragStart,
+			onDragEnd;
+
+		marker.setOpacity(0.6);
+
+		marker1._middleRight = marker2._middleLeft = marker;
+
+		onDragStart = function () {
+			marker.off('touchmove', onDragStart, this);
+			var i = marker2._index;
+
+			marker._index = i;
+
+			marker
+				.off('click', onClick, this)
+				.on('click', this._onMarkerClick, this);
+
+			latlng.lat = marker.getLatLng().lat;
+			latlng.lng = marker.getLatLng().lng;
+			this._spliceLatLngs(i, 0, latlng);
+			this._markers.splice(i, 0, marker);
+
+			marker.setOpacity(1);
+
+			this._updateIndexes(i, 1);
+			marker2._index++;
+			this._updatePrevNext(marker1, marker);
+			this._updatePrevNext(marker, marker2);
+
+			this._poly.fire('editstart');
+		};
+
+		onDragEnd = function () {
+			marker.off('dragstart', onDragStart, this);
+			marker.off('dragend', onDragEnd, this);
+			marker.off('touchmove', onDragStart, this);
+
+			this._createMiddleMarker(marker1, marker);
+			this._createMiddleMarker(marker, marker2);
+		};
+
+		onClick = function () {
+			onDragStart.call(this);
+			onDragEnd.call(this);
+			this._fireEdit();
+		};
+
+		marker
+			.on('click', onClick, this)
+			.on('dragstart', onDragStart, this)
+			.on('dragend', onDragEnd, this)
+			.on('touchmove', onDragStart, this);
+
+		this._markerGroup.addLayer(marker);
+	},
+
+	_updatePrevNext: function (marker1, marker2) {
+		if (marker1) {
+			marker1._next = marker2;
+		}
+		if (marker2) {
+			marker2._prev = marker1;
+		}
+	},
+
+	_getMiddleLatLng: function (marker1, marker2) {
+		var map = this._poly._map,
+			p1 = map.project(marker1.getLatLng()),
+			p2 = map.project(marker2.getLatLng());
+
+		return map.unproject(p1._add(p2)._divideBy(2));
+	}
+});
+
+L.Polyline.addInitHook(function () {
+
+	// Check to see if handler has already been initialized. This is to support versions of Leaflet that still have L.Handler.PolyEdit
+	if (this.editing) {
+		return;
+	}
+
+	if (L.Edit.Poly) {
+
+		this.editing = new L.Edit.Poly(this);
+
+		if (this.options.editable) {
+			this.editing.enable();
+		}
+	}
+
+	this.on('add', function () {
+		if (this.editing && this.editing.enabled()) {
+			this.editing.addHooks();
+		}
+	});
+
+	this.on('remove', function () {
+		if (this.editing && this.editing.enabled()) {
+			this.editing.removeHooks();
+		}
+	});
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/Edit.Poly.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Edit=L.Edit||{},L.Edit.Poly=L.Handler.extend({initialize:function(t){this.latlngs=[t._latlngs],t._holes&&(this.latlngs=this.latlngs.concat(t._holes)),this._poly=t,this._poly.on("revert-edited",this._updateLatLngs,this)},_defaultShape:function(){return L.Polyline._flat?L.Polyline._flat(this._poly._latlngs)?this._poly._latlngs:this._poly._latlngs[0]:this._poly._latlngs},_eachVertexHandler:function(t){for(var i=0;i<this._verticesHandlers.length;i++)t(this._verticesHandlers[i])},addHooks:function(){this._initHandlers(),this._eachVertexHandler((function(t){t.addHooks()}))},removeHooks:function(){this._eachVertexHandler((function(t){t.removeHooks()}))},updateMarkers:function(){this._eachVertexHandler((function(t){t.updateMarkers()}))},_initHandlers:function(){this._verticesHandlers=[];for(var t=0;t<this.latlngs.length;t++)this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(this._poly,this.latlngs[t],this._poly.options.poly))},_updateLatLngs:function(t){this.latlngs=[t.layer._latlngs],t.layer._holes&&(this.latlngs=this.latlngs.concat(t.layer._holes))}}),L.Edit.PolyVerticesEdit=L.Handler.extend({options:{icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"}),drawError:{color:"#b00b00",timeout:1e3}},initialize:function(t,i,e){L.Browser.touch&&(this.options.icon=this.options.touchIcon),this._poly=t,e&&e.drawError&&(e.drawError=L.Util.extend({},this.options.drawError,e.drawError)),this._latlngs=i,L.setOptions(this,e)},_defaultShape:function(){return L.Polyline._flat?L.Polyline._flat(this._latlngs)?this._latlngs:this._latlngs[0]:this._latlngs},addHooks:function(){var t=this._poly,i=t._path;t instanceof L.Polygon||(t.options.fill=!1,t.options.editing&&(t.options.editing.fill=!1)),i&&t.options.editing&&t.options.editing.className&&(t.options.original.className&&t.options.original.className.split(" ").forEach((function(t){L.DomUtil.removeClass(i,t)})),t.options.editing.className.split(" ").forEach((function(t){L.DomUtil.addClass(i,t)}))),t.setStyle(t.options.editing),this._poly._map&&(this._map=this._poly._map,this._markerGroup||this._initMarkers(),this._poly._map.addLayer(this._markerGroup))},removeHooks:function(){var t=this._poly,i=t._path;i&&t.options.editing&&t.options.editing.className&&(t.options.editing.className.split(" ").forEach((function(t){L.DomUtil.removeClass(i,t)})),t.options.original.className&&t.options.original.className.split(" ").forEach((function(t){L.DomUtil.addClass(i,t)}))),t.setStyle(t.options.original),t._map&&(t._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers)},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new L.LayerGroup),this._markers=[];var t,i,e,o,n,s,r=this._defaultShape();for(t=0,e=r.length;t<e;t++)(o=this._createMarker(r[t],t)).on("click",this._onMarkerClick,this),o.on("contextmenu",this._onContextMenu,this),this._markers.push(o);for(t=0,i=e-1;t<e;i=t++)(0!==t||L.Polygon&&this._poly instanceof L.Polygon)&&(n=this._markers[i],s=this._markers[t],this._createMiddleMarker(n,s),this._updatePrevNext(n,s))},_createMarker:function(t,i){var e=new L.Marker.Touch(t,{draggable:!0,icon:this.options.icon});return e._origLatLng=t,e._index=i,e.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._fireEdit,this).on("touchmove",this._onTouchMove,this).on("touchend",this._fireEdit,this).on("MSPointerMove",this._onTouchMove,this).on("MSPointerUp",this._fireEdit,this),this._markerGroup.addLayer(e),e},_onMarkerDragStart:function(){this._poly.fire("editstart")},_spliceLatLngs:function(){var t=this._defaultShape(),i=[].splice.apply(t,arguments);return this._poly._convertLatLngs(t,!0),this._poly.redraw(),i},_removeMarker:function(t){var i=t._index;this._markerGroup.removeLayer(t),this._markers.splice(i,1),this._spliceLatLngs(i,1),this._updateIndexes(i,-1),t.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._fireEdit,this).off("touchmove",this._onMarkerDrag,this).off("touchend",this._fireEdit,this).off("click",this._onMarkerClick,this).off("MSPointerMove",this._onTouchMove,this).off("MSPointerUp",this._fireEdit,this)},_fireEdit:function(){this._poly.edited=!0,this._poly.fire("edit"),this._poly._map.fire(L.Draw.Event.EDITVERTEX,{layers:this._markerGroup,poly:this._poly})},_onMarkerDrag:function(t){var i=t.target,e=this._poly,o=L.LatLngUtil.cloneLatLng(i._origLatLng);if(L.extend(i._origLatLng,i._latlng),e.options.poly){var n=e._map._editTooltip;if(!e.options.poly.allowIntersection&&e.intersects()){L.extend(i._origLatLng,o),i.setLatLng(o);var s=e.options.color;e.setStyle({color:this.options.drawError.color}),n&&n.updateContent({text:L.drawLocal.draw.handlers.polyline.error}),setTimeout((function(){e.setStyle({color:s}),n&&n.updateContent({text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext})}),1e3)}}i._middleLeft&&i._middleLeft.setLatLng(this._getMiddleLatLng(i._prev,i)),i._middleRight&&i._middleRight.setLatLng(this._getMiddleLatLng(i,i._next)),this._poly._bounds._southWest=L.latLng(1/0,1/0),this._poly._bounds._northEast=L.latLng(-1/0,-1/0);var r=this._poly.getLatLngs();this._poly._convertLatLngs(r,!0),this._poly.redraw(),this._poly.fire("editdrag")},_onMarkerClick:function(t){var i=L.Polygon&&this._poly instanceof L.Polygon?4:3,e=t.target;this._defaultShape().length<i||(this._removeMarker(e),this._updatePrevNext(e._prev,e._next),e._middleLeft&&this._markerGroup.removeLayer(e._middleLeft),e._middleRight&&this._markerGroup.removeLayer(e._middleRight),e._prev&&e._next?this._createMiddleMarker(e._prev,e._next):e._prev?e._next||(e._prev._middleRight=null):e._next._middleLeft=null,this._fireEdit())},_onContextMenu:function(t){var i=t.target;this._poly;this._poly._map.fire(L.Draw.Event.MARKERCONTEXT,{marker:i,layers:this._markerGroup,poly:this._poly}),L.DomEvent.stopPropagation},_onTouchMove:function(t){var i=this._map.mouseEventToLayerPoint(t.originalEvent.touches[0]),e=this._map.layerPointToLatLng(i),o=t.target;L.extend(o._origLatLng,e),o._middleLeft&&o._middleLeft.setLatLng(this._getMiddleLatLng(o._prev,o)),o._middleRight&&o._middleRight.setLatLng(this._getMiddleLatLng(o,o._next)),this._poly.redraw(),this.updateMarkers()},_updateIndexes:function(t,i){this._markerGroup.eachLayer((function(e){e._index>t&&(e._index+=i)}))},_createMiddleMarker:function(t,i){var e,o,n,s=this._getMiddleLatLng(t,i),r=this._createMarker(s);r.setOpacity(.6),t._middleRight=i._middleLeft=r,o=function(){r.off("touchmove",o,this);var n=i._index;r._index=n,r.off("click",e,this).on("click",this._onMarkerClick,this),s.lat=r.getLatLng().lat,s.lng=r.getLatLng().lng,this._spliceLatLngs(n,0,s),this._markers.splice(n,0,r),r.setOpacity(1),this._updateIndexes(n,1),i._index++,this._updatePrevNext(t,r),this._updatePrevNext(r,i),this._poly.fire("editstart")},n=function(){r.off("dragstart",o,this),r.off("dragend",n,this),r.off("touchmove",o,this),this._createMiddleMarker(t,r),this._createMiddleMarker(r,i)},e=function(){o.call(this),n.call(this),this._fireEdit()},r.on("click",e,this).on("dragstart",o,this).on("dragend",n,this).on("touchmove",o,this),this._markerGroup.addLayer(r)},_updatePrevNext:function(t,i){t&&(t._next=i),i&&(i._prev=t)},_getMiddleLatLng:function(t,i){var e=this._poly._map,o=e.project(t.getLatLng()),n=e.project(i.getLatLng());return e.unproject(o._add(n)._divideBy(2))}}),L.Polyline.addInitHook((function(){this.editing||(L.Edit.Poly&&(this.editing=new L.Edit.Poly(this),this.options.editable&&this.editing.enable()),this.on("add",(function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()})),this.on("remove",(function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()})))}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/Edit.Rectangle.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,125 @@
+L.Edit = L.Edit || {};
+/**
+ * @class L.Edit.Rectangle
+ * @aka Edit.Rectangle
+ * @inherits L.Edit.SimpleShape
+ */
+L.Edit.Rectangle = L.Edit.SimpleShape.extend({
+	_createMoveMarker: function () {
+		var bounds = this._shape.getBounds(),
+			center = bounds.getCenter();
+
+		this._moveMarker = this._createMarker(center, this.options.moveIcon);
+	},
+
+	_createResizeMarker: function () {
+		var corners = this._getCorners();
+
+		this._resizeMarkers = [];
+
+		for (var i = 0, l = corners.length; i < l; i++) {
+			this._resizeMarkers.push(this._createMarker(corners[i], this.options.resizeIcon));
+			// Monkey in the corner index as we will need to know this for dragging
+			this._resizeMarkers[i]._cornerIndex = i;
+		}
+	},
+
+	_onMarkerDragStart: function (e) {
+		L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e);
+
+		// Save a reference to the opposite point
+		var corners = this._getCorners(),
+			marker = e.target,
+			currentCornerIndex = marker._cornerIndex;
+
+		this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];
+
+		this._toggleCornerMarkers(0, currentCornerIndex);
+	},
+
+	_onMarkerDragEnd: function (e) {
+		var marker = e.target,
+			bounds, center;
+
+		// Reset move marker position to the center
+		if (marker === this._moveMarker) {
+			bounds = this._shape.getBounds();
+			center = bounds.getCenter();
+
+			marker.setLatLng(center);
+		}
+
+		this._toggleCornerMarkers(1);
+
+		this._repositionCornerMarkers();
+
+		L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this, e);
+	},
+
+	_move: function (newCenter) {
+		var latlngs = this._shape._defaultShape ? this._shape._defaultShape() : this._shape.getLatLngs(),
+			bounds = this._shape.getBounds(),
+			center = bounds.getCenter(),
+			offset, newLatLngs = [];
+
+		// Offset the latlngs to the new center
+		for (var i = 0, l = latlngs.length; i < l; i++) {
+			offset = [latlngs[i].lat - center.lat, latlngs[i].lng - center.lng];
+			newLatLngs.push([newCenter.lat + offset[0], newCenter.lng + offset[1]]);
+		}
+
+		this._shape.setLatLngs(newLatLngs);
+
+		// Reposition the resize markers
+		this._repositionCornerMarkers();
+
+		this._map.fire(L.Draw.Event.EDITMOVE, {layer: this._shape});
+	},
+
+	_resize: function (latlng) {
+		var bounds;
+
+		// Update the shape based on the current position of this corner and the opposite point
+		this._shape.setBounds(L.latLngBounds(latlng, this._oppositeCorner));
+
+		// Reposition the move marker
+		bounds = this._shape.getBounds();
+		this._moveMarker.setLatLng(bounds.getCenter());
+
+		this._map.fire(L.Draw.Event.EDITRESIZE, {layer: this._shape});
+	},
+
+	_getCorners: function () {
+		var bounds = this._shape.getBounds(),
+			nw = bounds.getNorthWest(),
+			ne = bounds.getNorthEast(),
+			se = bounds.getSouthEast(),
+			sw = bounds.getSouthWest();
+
+		return [nw, ne, se, sw];
+	},
+
+	_toggleCornerMarkers: function (opacity) {
+		for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
+			this._resizeMarkers[i].setOpacity(opacity);
+		}
+	},
+
+	_repositionCornerMarkers: function () {
+		var corners = this._getCorners();
+
+		for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
+			this._resizeMarkers[i].setLatLng(corners[i]);
+		}
+	}
+});
+
+L.Rectangle.addInitHook(function () {
+	if (L.Edit.Rectangle) {
+		this.editing = new L.Edit.Rectangle(this);
+
+		if (this.options.editable) {
+			this.editing.enable();
+		}
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/Edit.Rectangle.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Edit=L.Edit||{},L.Edit.Rectangle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var e=this._shape.getBounds().getCenter();this._moveMarker=this._createMarker(e,this.options.moveIcon)},_createResizeMarker:function(){var e=this._getCorners();this._resizeMarkers=[];for(var t=0,r=e.length;t<r;t++)this._resizeMarkers.push(this._createMarker(e[t],this.options.resizeIcon)),this._resizeMarkers[t]._cornerIndex=t},_onMarkerDragStart:function(e){L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,e);var t=this._getCorners(),r=e.target._cornerIndex;this._oppositeCorner=t[(r+2)%4],this._toggleCornerMarkers(0,r)},_onMarkerDragEnd:function(e){var t,r=e.target;r===this._moveMarker&&(t=this._shape.getBounds().getCenter(),r.setLatLng(t)),this._toggleCornerMarkers(1),this._repositionCornerMarkers(),L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this,e)},_move:function(e){for(var t,r=this._shape._defaultShape?this._shape._defaultShape():this._shape.getLatLngs(),s=this._shape.getBounds().getCenter(),i=[],a=0,n=r.length;a<n;a++)t=[r[a].lat-s.lat,r[a].lng-s.lng],i.push([e.lat+t[0],e.lng+t[1]]);this._shape.setLatLngs(i),this._repositionCornerMarkers(),this._map.fire(L.Draw.Event.EDITMOVE,{layer:this._shape})},_resize:function(e){var t;this._shape.setBounds(L.latLngBounds(e,this._oppositeCorner)),t=this._shape.getBounds(),this._moveMarker.setLatLng(t.getCenter()),this._map.fire(L.Draw.Event.EDITRESIZE,{layer:this._shape})},_getCorners:function(){var e=this._shape.getBounds();return[e.getNorthWest(),e.getNorthEast(),e.getSouthEast(),e.getSouthWest()]},_toggleCornerMarkers:function(e){for(var t=0,r=this._resizeMarkers.length;t<r;t++)this._resizeMarkers[t].setOpacity(e)},_repositionCornerMarkers:function(){for(var e=this._getCorners(),t=0,r=this._resizeMarkers.length;t<r;t++)this._resizeMarkers[t].setLatLng(e[t])}}),L.Rectangle.addInitHook((function(){L.Edit.Rectangle&&(this.editing=new L.Edit.Rectangle(this),this.options.editable&&this.editing.enable())}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/Edit.SimpleShape.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,229 @@
+L.Edit = L.Edit || {};
+/**
+ * @class L.Edit.SimpleShape
+ * @aka Edit.SimpleShape
+ */
+L.Edit.SimpleShape = L.Handler.extend({
+	options: {
+		moveIcon: new L.DivIcon({
+			iconSize: new L.Point(8, 8),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move'
+		}),
+		resizeIcon: new L.DivIcon({
+			iconSize: new L.Point(8, 8),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize'
+		}),
+		touchMoveIcon: new L.DivIcon({
+			iconSize: new L.Point(20, 20),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon'
+		}),
+		touchResizeIcon: new L.DivIcon({
+			iconSize: new L.Point(20, 20),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon'
+		}),
+	},
+
+	// @method intialize(): void
+	initialize: function (shape, options) {
+		// if touch, switch to touch icon
+		if (L.Browser.touch) {
+			this.options.moveIcon = this.options.touchMoveIcon;
+			this.options.resizeIcon = this.options.touchResizeIcon;
+		}
+
+		this._shape = shape;
+		L.Util.setOptions(this, options);
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler
+	addHooks: function () {
+		var shape = this._shape;
+		if (this._shape._map) {
+			this._map = this._shape._map;
+			shape.setStyle(shape.options.editing);
+
+			if (shape._map) {
+				this._map = shape._map;
+				if (!this._markerGroup) {
+					this._initMarkers();
+				}
+				this._map.addLayer(this._markerGroup);
+			}
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler
+	removeHooks: function () {
+		var shape = this._shape;
+
+		shape.setStyle(shape.options.original);
+
+		if (shape._map) {
+			this._unbindMarker(this._moveMarker);
+
+			for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
+				this._unbindMarker(this._resizeMarkers[i]);
+			}
+			this._resizeMarkers = null;
+
+			this._map.removeLayer(this._markerGroup);
+			delete this._markerGroup;
+		}
+
+		this._map = null;
+	},
+
+	// @method updateMarkers(): void
+	// Remove the edit markers from this layer
+	updateMarkers: function () {
+		this._markerGroup.clearLayers();
+		this._initMarkers();
+	},
+
+	_initMarkers: function () {
+		if (!this._markerGroup) {
+			this._markerGroup = new L.LayerGroup();
+		}
+
+		// Create center marker
+		this._createMoveMarker();
+
+		// Create edge marker
+		this._createResizeMarker();
+	},
+
+	_createMoveMarker: function () {
+		// Children override
+	},
+
+	_createResizeMarker: function () {
+		// Children override
+	},
+
+	_createMarker: function (latlng, icon) {
+		// Extending L.Marker in TouchEvents.js to include touch.
+		var marker = new L.Marker.Touch(latlng, {
+			draggable: true,
+			icon: icon,
+			zIndexOffset: 10
+		});
+
+		this._bindMarker(marker);
+
+		this._markerGroup.addLayer(marker);
+
+		return marker;
+	},
+
+	_bindMarker: function (marker) {
+		marker
+			.on('dragstart', this._onMarkerDragStart, this)
+			.on('drag', this._onMarkerDrag, this)
+			.on('dragend', this._onMarkerDragEnd, this)
+			.on('touchstart', this._onTouchStart, this)
+			.on('touchmove', this._onTouchMove, this)
+			.on('MSPointerMove', this._onTouchMove, this)
+			.on('touchend', this._onTouchEnd, this)
+			.on('MSPointerUp', this._onTouchEnd, this);
+	},
+
+	_unbindMarker: function (marker) {
+		marker
+			.off('dragstart', this._onMarkerDragStart, this)
+			.off('drag', this._onMarkerDrag, this)
+			.off('dragend', this._onMarkerDragEnd, this)
+			.off('touchstart', this._onTouchStart, this)
+			.off('touchmove', this._onTouchMove, this)
+			.off('MSPointerMove', this._onTouchMove, this)
+			.off('touchend', this._onTouchEnd, this)
+			.off('MSPointerUp', this._onTouchEnd, this);
+	},
+
+	_onMarkerDragStart: function (e) {
+		var marker = e.target;
+		marker.setOpacity(0);
+
+		this._shape.fire('editstart');
+	},
+
+	_fireEdit: function () {
+		this._shape.edited = true;
+		this._shape.fire('edit');
+	},
+
+	_onMarkerDrag: function (e) {
+		var marker = e.target,
+			latlng = marker.getLatLng();
+
+		if (marker === this._moveMarker) {
+			this._move(latlng);
+		} else {
+			this._resize(latlng);
+		}
+
+		this._shape.redraw();
+		this._shape.fire('editdrag');
+	},
+
+	_onMarkerDragEnd: function (e) {
+		var marker = e.target;
+		marker.setOpacity(1);
+
+		this._fireEdit();
+	},
+
+	_onTouchStart: function (e) {
+		L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e);
+
+		if (typeof(this._getCorners) === 'function') {
+			// Save a reference to the opposite point
+			var corners = this._getCorners(),
+				marker = e.target,
+				currentCornerIndex = marker._cornerIndex;
+
+			marker.setOpacity(0);
+
+			// Copyed from Edit.Rectangle.js line 23 _onMarkerDragStart()
+			// Latlng is null otherwise.
+			this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];
+			this._toggleCornerMarkers(0, currentCornerIndex);
+		}
+
+		this._shape.fire('editstart');
+	},
+
+	_onTouchMove: function (e) {
+		var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]),
+			latlng = this._map.layerPointToLatLng(layerPoint),
+			marker = e.target;
+
+		if (marker === this._moveMarker) {
+			this._move(latlng);
+		} else {
+			this._resize(latlng);
+		}
+
+		this._shape.redraw();
+
+		// prevent touchcancel in IOS
+		// e.preventDefault();
+		return false;
+	},
+
+	_onTouchEnd: function (e) {
+		var marker = e.target;
+		marker.setOpacity(1);
+		this.updateMarkers();
+		this._fireEdit();
+	},
+
+	_move: function () {
+		// Children override
+	},
+
+	_resize: function () {
+		// Children override
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/Edit.SimpleShape.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Edit=L.Edit||{},L.Edit.SimpleShape=L.Handler.extend({options:{moveIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move"}),resizeIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize"}),touchMoveIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon"}),touchResizeIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon"})},initialize:function(t,e){L.Browser.touch&&(this.options.moveIcon=this.options.touchMoveIcon,this.options.resizeIcon=this.options.touchResizeIcon),this._shape=t,L.Util.setOptions(this,e)},addHooks:function(){var t=this._shape;this._shape._map&&(this._map=this._shape._map,t.setStyle(t.options.editing),t._map&&(this._map=t._map,this._markerGroup||this._initMarkers(),this._map.addLayer(this._markerGroup)))},removeHooks:function(){var t=this._shape;if(t.setStyle(t.options.original),t._map){this._unbindMarker(this._moveMarker);for(var e=0,i=this._resizeMarkers.length;e<i;e++)this._unbindMarker(this._resizeMarkers[e]);this._resizeMarkers=null,this._map.removeLayer(this._markerGroup),delete this._markerGroup}this._map=null},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new L.LayerGroup),this._createMoveMarker(),this._createResizeMarker()},_createMoveMarker:function(){},_createResizeMarker:function(){},_createMarker:function(t,e){var i=new L.Marker.Touch(t,{draggable:!0,icon:e,zIndexOffset:10});return this._bindMarker(i),this._markerGroup.addLayer(i),i},_bindMarker:function(t){t.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._onMarkerDragEnd,this).on("touchstart",this._onTouchStart,this).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onTouchEnd,this).on("MSPointerUp",this._onTouchEnd,this)},_unbindMarker:function(t){t.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._onMarkerDragEnd,this).off("touchstart",this._onTouchStart,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onTouchEnd,this).off("MSPointerUp",this._onTouchEnd,this)},_onMarkerDragStart:function(t){t.target.setOpacity(0),this._shape.fire("editstart")},_fireEdit:function(){this._shape.edited=!0,this._shape.fire("edit")},_onMarkerDrag:function(t){var e=t.target,i=e.getLatLng();e===this._moveMarker?this._move(i):this._resize(i),this._shape.redraw(),this._shape.fire("editdrag")},_onMarkerDragEnd:function(t){t.target.setOpacity(1),this._fireEdit()},_onTouchStart:function(t){if(L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,t),"function"==typeof this._getCorners){var e=this._getCorners(),i=t.target,r=i._cornerIndex;i.setOpacity(0),this._oppositeCorner=e[(r+2)%4],this._toggleCornerMarkers(0,r)}this._shape.fire("editstart")},_onTouchMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent.touches[0]),i=this._map.layerPointToLatLng(e);return t.target===this._moveMarker?this._move(i):this._resize(i),this._shape.redraw(),!1},_onTouchEnd:function(t){t.target.setOpacity(1),this.updateMarkers(),this._fireEdit()},_move:function(){},_resize:function(){}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/EditToolbar.Delete.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,161 @@
+/**
+ * @class L.EditToolbar.Delete
+ * @aka EditToolbar.Delete
+ */
+L.EditToolbar.Delete = L.Handler.extend({
+	statics: {
+		TYPE: 'remove' // not delete as delete is reserved in js
+	},
+
+	// @method intialize(): void
+	initialize: function (map, options) {
+		L.Handler.prototype.initialize.call(this, map);
+
+		L.Util.setOptions(this, options);
+
+		// Store the selectable layer group for ease of access
+		this._deletableLayers = this.options.featureGroup;
+
+		if (!(this._deletableLayers instanceof L.FeatureGroup)) {
+			throw new Error('options.featureGroup must be a L.FeatureGroup');
+		}
+
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.EditToolbar.Delete.TYPE;
+
+		var version = L.version.split('.');
+		//If Version is >= 1.2.0
+		if (parseInt(version[0], 10) === 1 && parseInt(version[1], 10) >= 2) {
+			L.EditToolbar.Delete.include(L.Evented.prototype);
+		} else {
+			L.EditToolbar.Delete.include(L.Mixin.Events);
+		}
+
+	},
+
+	// @method enable(): void
+	// Enable the delete toolbar
+	enable: function () {
+		if (this._enabled || !this._hasAvailableLayers()) {
+			return;
+		}
+		this.fire('enabled', {handler: this.type});
+
+		this._map.fire(L.Draw.Event.DELETESTART, {handler: this.type});
+
+		L.Handler.prototype.enable.call(this);
+
+		this._deletableLayers
+			.on('layeradd', this._enableLayerDelete, this)
+			.on('layerremove', this._disableLayerDelete, this);
+	},
+
+	// @method disable(): void
+	// Disable the delete toolbar
+	disable: function () {
+		if (!this._enabled) {
+			return;
+		}
+
+		this._deletableLayers
+			.off('layeradd', this._enableLayerDelete, this)
+			.off('layerremove', this._disableLayerDelete, this);
+
+		L.Handler.prototype.disable.call(this);
+
+		this._map.fire(L.Draw.Event.DELETESTOP, {handler: this.type});
+
+		this.fire('disabled', {handler: this.type});
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler
+	addHooks: function () {
+		var map = this._map;
+
+		if (map) {
+			map.getContainer().focus();
+
+			this._deletableLayers.eachLayer(this._enableLayerDelete, this);
+			this._deletedLayers = new L.LayerGroup();
+
+			this._tooltip = new L.Draw.Tooltip(this._map);
+			this._tooltip.updateContent({text: L.drawLocal.edit.handlers.remove.tooltip.text});
+
+			this._map.on('mousemove', this._onMouseMove, this);
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler
+	removeHooks: function () {
+		if (this._map) {
+			this._deletableLayers.eachLayer(this._disableLayerDelete, this);
+			this._deletedLayers = null;
+
+			this._tooltip.dispose();
+			this._tooltip = null;
+
+			this._map.off('mousemove', this._onMouseMove, this);
+		}
+	},
+
+	// @method revertLayers(): void
+	// Revert the deleted layers back to their prior state.
+	revertLayers: function () {
+		// Iterate of the deleted layers and add them back into the featureGroup
+		this._deletedLayers.eachLayer(function (layer) {
+			this._deletableLayers.addLayer(layer);
+			layer.fire('revert-deleted', {layer: layer});
+		}, this);
+	},
+
+	// @method save(): void
+	// Save deleted layers
+	save: function () {
+		this._map.fire(L.Draw.Event.DELETED, {layers: this._deletedLayers});
+	},
+
+	// @method removeAllLayers(): void
+	// Remove all delateable layers
+	removeAllLayers: function () {
+		// Iterate of the delateable layers and add remove them
+		this._deletableLayers.eachLayer(function (layer) {
+			this._removeLayer({layer: layer});
+		}, this);
+		this.save();
+	},
+
+	_enableLayerDelete: function (e) {
+		var layer = e.layer || e.target || e;
+
+		layer.on('click', this._removeLayer, this);
+	},
+
+	_disableLayerDelete: function (e) {
+		var layer = e.layer || e.target || e;
+
+		layer.off('click', this._removeLayer, this);
+
+		// Remove from the deleted layers so we can't accidentally revert if the user presses cancel
+		this._deletedLayers.removeLayer(layer);
+	},
+
+	_removeLayer: function (e) {
+		var layer = e.layer || e.target || e;
+
+		this._deletableLayers.removeLayer(layer);
+
+		this._deletedLayers.addLayer(layer);
+
+		layer.fire('deleted');
+	},
+
+	_onMouseMove: function (e) {
+		this._tooltip.updatePosition(e.latlng);
+	},
+
+	_hasAvailableLayers: function () {
+		return this._deletableLayers.getLayers().length !== 0;
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/EditToolbar.Delete.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.EditToolbar.Delete=L.Handler.extend({statics:{TYPE:"remove"},initialize:function(e,t){if(L.Handler.prototype.initialize.call(this,e),L.Util.setOptions(this,t),this._deletableLayers=this.options.featureGroup,!(this._deletableLayers instanceof L.FeatureGroup))throw new Error("options.featureGroup must be a L.FeatureGroup");this.type=L.EditToolbar.Delete.TYPE;var a=L.version.split(".");1===parseInt(a[0],10)&&parseInt(a[1],10)>=2?L.EditToolbar.Delete.include(L.Evented.prototype):L.EditToolbar.Delete.include(L.Mixin.Events)},enable:function(){!this._enabled&&this._hasAvailableLayers()&&(this.fire("enabled",{handler:this.type}),this._map.fire(L.Draw.Event.DELETESTART,{handler:this.type}),L.Handler.prototype.enable.call(this),this._deletableLayers.on("layeradd",this._enableLayerDelete,this).on("layerremove",this._disableLayerDelete,this))},disable:function(){this._enabled&&(this._deletableLayers.off("layeradd",this._enableLayerDelete,this).off("layerremove",this._disableLayerDelete,this),L.Handler.prototype.disable.call(this),this._map.fire(L.Draw.Event.DELETESTOP,{handler:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var e=this._map;e&&(e.getContainer().focus(),this._deletableLayers.eachLayer(this._enableLayerDelete,this),this._deletedLayers=new L.LayerGroup,this._tooltip=new L.Draw.Tooltip(this._map),this._tooltip.updateContent({text:L.drawLocal.edit.handlers.remove.tooltip.text}),this._map.on("mousemove",this._onMouseMove,this))},removeHooks:function(){this._map&&(this._deletableLayers.eachLayer(this._disableLayerDelete,this),this._deletedLayers=null,this._tooltip.dispose(),this._tooltip=null,this._map.off("mousemove",this._onMouseMove,this))},revertLayers:function(){this._deletedLayers.eachLayer((function(e){this._deletableLayers.addLayer(e),e.fire("revert-deleted",{layer:e})}),this)},save:function(){this._map.fire(L.Draw.Event.DELETED,{layers:this._deletedLayers})},removeAllLayers:function(){this._deletableLayers.eachLayer((function(e){this._removeLayer({layer:e})}),this),this.save()},_enableLayerDelete:function(e){(e.layer||e.target||e).on("click",this._removeLayer,this)},_disableLayerDelete:function(e){var t=e.layer||e.target||e;t.off("click",this._removeLayer,this),this._deletedLayers.removeLayer(t)},_removeLayer:function(e){var t=e.layer||e.target||e;this._deletableLayers.removeLayer(t),this._deletedLayers.addLayer(t),t.fire("deleted")},_onMouseMove:function(e){this._tooltip.updatePosition(e.latlng)},_hasAvailableLayers:function(){return 0!==this._deletableLayers.getLayers().length}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/EditToolbar.Edit.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,290 @@
+/**
+ * @class L.EditToolbar.Edit
+ * @aka EditToolbar.Edit
+ */
+L.EditToolbar.Edit = L.Handler.extend({
+	statics: {
+		TYPE: 'edit'
+	},
+
+	// @method intialize(): void
+	initialize: function (map, options) {
+		L.Handler.prototype.initialize.call(this, map);
+
+		L.setOptions(this, options);
+
+		// Store the selectable layer group for ease of access
+		this._featureGroup = options.featureGroup;
+
+		if (!(this._featureGroup instanceof L.FeatureGroup)) {
+			throw new Error('options.featureGroup must be a L.FeatureGroup');
+		}
+
+		this._uneditedLayerProps = {};
+
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.EditToolbar.Edit.TYPE;
+
+		var version = L.version.split('.');
+		//If Version is >= 1.2.0
+		if (parseInt(version[0], 10) === 1 && parseInt(version[1], 10) >= 2) {
+			L.EditToolbar.Edit.include(L.Evented.prototype);
+		} else {
+			L.EditToolbar.Edit.include(L.Mixin.Events);
+		}
+	},
+
+	// @method enable(): void
+	// Enable the edit toolbar
+	enable: function () {
+		if (this._enabled || !this._hasAvailableLayers()) {
+			return;
+		}
+		this.fire('enabled', {handler: this.type});
+		//this disable other handlers
+
+		this._map.fire(L.Draw.Event.EDITSTART, {handler: this.type});
+		//allow drawLayer to be updated before beginning edition.
+
+		L.Handler.prototype.enable.call(this);
+		this._featureGroup
+			.on('layeradd', this._enableLayerEdit, this)
+			.on('layerremove', this._disableLayerEdit, this);
+	},
+
+	// @method disable(): void
+	// Disable the edit toolbar
+	disable: function () {
+		if (!this._enabled) {
+			return;
+		}
+		this._featureGroup
+			.off('layeradd', this._enableLayerEdit, this)
+			.off('layerremove', this._disableLayerEdit, this);
+		L.Handler.prototype.disable.call(this);
+		this._map.fire(L.Draw.Event.EDITSTOP, {handler: this.type});
+		this.fire('disabled', {handler: this.type});
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks for this handler
+	addHooks: function () {
+		var map = this._map;
+
+		if (map) {
+			map.getContainer().focus();
+
+			this._featureGroup.eachLayer(this._enableLayerEdit, this);
+
+			this._tooltip = new L.Draw.Tooltip(this._map);
+			this._tooltip.updateContent({
+				text: L.drawLocal.edit.handlers.edit.tooltip.text,
+				subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
+			});
+
+			// Quickly access the tooltip to update for intersection checking
+			map._editTooltip = this._tooltip;
+
+			this._updateTooltip();
+
+			this._map
+				.on('mousemove', this._onMouseMove, this)
+				.on('touchmove', this._onMouseMove, this)
+				.on('MSPointerMove', this._onMouseMove, this)
+				.on(L.Draw.Event.EDITVERTEX, this._updateTooltip, this);
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks for this handler
+	removeHooks: function () {
+		if (this._map) {
+			// Clean up selected layers.
+			this._featureGroup.eachLayer(this._disableLayerEdit, this);
+
+			// Clear the backups of the original layers
+			this._uneditedLayerProps = {};
+
+			this._tooltip.dispose();
+			this._tooltip = null;
+
+			this._map
+				.off('mousemove', this._onMouseMove, this)
+				.off('touchmove', this._onMouseMove, this)
+				.off('MSPointerMove', this._onMouseMove, this)
+				.off(L.Draw.Event.EDITVERTEX, this._updateTooltip, this);
+		}
+	},
+
+	// @method revertLayers(): void
+	// Revert each layer's geometry changes
+	revertLayers: function () {
+		this._featureGroup.eachLayer(function (layer) {
+			this._revertLayer(layer);
+		}, this);
+	},
+
+	// @method save(): void
+	// Save the layer geometries
+	save: function () {
+		var editedLayers = new L.LayerGroup();
+		this._featureGroup.eachLayer(function (layer) {
+			if (layer.edited) {
+				editedLayers.addLayer(layer);
+				layer.edited = false;
+			}
+		});
+		this._map.fire(L.Draw.Event.EDITED, {layers: editedLayers});
+	},
+
+	_backupLayer: function (layer) {
+		var id = L.Util.stamp(layer);
+
+		if (!this._uneditedLayerProps[id]) {
+			// Polyline, Polygon or Rectangle
+			if (layer instanceof L.Polyline || layer instanceof L.Polygon || layer instanceof L.Rectangle) {
+				this._uneditedLayerProps[id] = {
+					latlngs: L.LatLngUtil.cloneLatLngs(layer.getLatLngs())
+				};
+			} else if (layer instanceof L.Circle) {
+				this._uneditedLayerProps[id] = {
+					latlng: L.LatLngUtil.cloneLatLng(layer.getLatLng()),
+					radius: layer.getRadius()
+				};
+			} else if (layer instanceof L.Marker || layer instanceof L.CircleMarker) { // Marker
+				this._uneditedLayerProps[id] = {
+					latlng: L.LatLngUtil.cloneLatLng(layer.getLatLng())
+				};
+			}
+		}
+	},
+
+	_getTooltipText: function () {
+		return ({
+			text: L.drawLocal.edit.handlers.edit.tooltip.text,
+			subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
+		});
+	},
+
+	_updateTooltip: function () {
+		this._tooltip.updateContent(this._getTooltipText());
+	},
+
+	_revertLayer: function (layer) {
+		var id = L.Util.stamp(layer);
+		layer.edited = false;
+		if (this._uneditedLayerProps.hasOwnProperty(id)) {
+			// Polyline, Polygon or Rectangle
+			if (layer instanceof L.Polyline || layer instanceof L.Polygon || layer instanceof L.Rectangle) {
+				layer.setLatLngs(this._uneditedLayerProps[id].latlngs);
+			} else if (layer instanceof L.Circle) {
+				layer.setLatLng(this._uneditedLayerProps[id].latlng);
+				layer.setRadius(this._uneditedLayerProps[id].radius);
+			} else if (layer instanceof L.Marker || layer instanceof L.CircleMarker) { // Marker or CircleMarker
+				layer.setLatLng(this._uneditedLayerProps[id].latlng);
+			}
+
+			layer.fire('revert-edited', {layer: layer});
+		}
+	},
+
+	_enableLayerEdit: function (e) {
+		var layer = e.layer || e.target || e,
+			pathOptions, poly;
+
+		// Back up this layer (if haven't before)
+		this._backupLayer(layer);
+
+		if (this.options.poly) {
+			poly = L.Util.extend({}, this.options.poly);
+			layer.options.poly = poly;
+		}
+
+		// Set different style for editing mode
+		if (this.options.selectedPathOptions) {
+			pathOptions = L.Util.extend({}, this.options.selectedPathOptions);
+
+			// Use the existing color of the layer
+			if (pathOptions.maintainColor) {
+				pathOptions.color = layer.options.color;
+				pathOptions.fillColor = layer.options.fillColor;
+			}
+
+			layer.options.original = L.extend({}, layer.options);
+			layer.options.editing = pathOptions;
+
+		}
+
+		if (layer instanceof L.Marker) {
+			if (layer.editing) {
+				layer.editing.enable();
+			}
+			layer.dragging.enable();
+			layer
+				.on('dragend', this._onMarkerDragEnd)
+				// #TODO: remove when leaflet finally fixes their draggable so it's touch friendly again.
+				.on('touchmove', this._onTouchMove, this)
+				.on('MSPointerMove', this._onTouchMove, this)
+				.on('touchend', this._onMarkerDragEnd, this)
+				.on('MSPointerUp', this._onMarkerDragEnd, this);
+		} else {
+			layer.editing.enable();
+		}
+	},
+
+	_disableLayerEdit: function (e) {
+		var layer = e.layer || e.target || e;
+
+		layer.edited = false;
+		if (layer.editing) {
+			layer.editing.disable();
+		}
+
+		delete layer.options.editing;
+		delete layer.options.original;
+		// Reset layer styles to that of before select
+		if (this._selectedPathOptions) {
+			if (layer instanceof L.Marker) {
+				this._toggleMarkerHighlight(layer);
+			} else {
+				// reset the layer style to what is was before being selected
+				layer.setStyle(layer.options.previousOptions);
+				// remove the cached options for the layer object
+				delete layer.options.previousOptions;
+			}
+		}
+
+		if (layer instanceof L.Marker) {
+			layer.dragging.disable();
+			layer
+				.off('dragend', this._onMarkerDragEnd, this)
+				.off('touchmove', this._onTouchMove, this)
+				.off('MSPointerMove', this._onTouchMove, this)
+				.off('touchend', this._onMarkerDragEnd, this)
+				.off('MSPointerUp', this._onMarkerDragEnd, this);
+		} else {
+			layer.editing.disable();
+		}
+	},
+
+	_onMouseMove: function (e) {
+		this._tooltip.updatePosition(e.latlng);
+	},
+
+	_onMarkerDragEnd: function (e) {
+		var layer = e.target;
+		layer.edited = true;
+		this._map.fire(L.Draw.Event.EDITMOVE, {layer: layer});
+	},
+
+	_onTouchMove: function (e) {
+		var touchEvent = e.originalEvent.changedTouches[0],
+			layerPoint = this._map.mouseEventToLayerPoint(touchEvent),
+			latlng = this._map.layerPointToLatLng(layerPoint);
+		e.target.setLatLng(latlng);
+	},
+
+	_hasAvailableLayers: function () {
+		return this._featureGroup.getLayers().length !== 0;
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/edit/handler/EditToolbar.Edit.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.EditToolbar.Edit=L.Handler.extend({statics:{TYPE:"edit"},initialize:function(t,e){if(L.Handler.prototype.initialize.call(this,t),L.setOptions(this,e),this._featureGroup=e.featureGroup,!(this._featureGroup instanceof L.FeatureGroup))throw new Error("options.featureGroup must be a L.FeatureGroup");this._uneditedLayerProps={},this.type=L.EditToolbar.Edit.TYPE;var i=L.version.split(".");1===parseInt(i[0],10)&&parseInt(i[1],10)>=2?L.EditToolbar.Edit.include(L.Evented.prototype):L.EditToolbar.Edit.include(L.Mixin.Events)},enable:function(){!this._enabled&&this._hasAvailableLayers()&&(this.fire("enabled",{handler:this.type}),this._map.fire(L.Draw.Event.EDITSTART,{handler:this.type}),L.Handler.prototype.enable.call(this),this._featureGroup.on("layeradd",this._enableLayerEdit,this).on("layerremove",this._disableLayerEdit,this))},disable:function(){this._enabled&&(this._featureGroup.off("layeradd",this._enableLayerEdit,this).off("layerremove",this._disableLayerEdit,this),L.Handler.prototype.disable.call(this),this._map.fire(L.Draw.Event.EDITSTOP,{handler:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(t.getContainer().focus(),this._featureGroup.eachLayer(this._enableLayerEdit,this),this._tooltip=new L.Draw.Tooltip(this._map),this._tooltip.updateContent({text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext}),t._editTooltip=this._tooltip,this._updateTooltip(),this._map.on("mousemove",this._onMouseMove,this).on("touchmove",this._onMouseMove,this).on("MSPointerMove",this._onMouseMove,this).on(L.Draw.Event.EDITVERTEX,this._updateTooltip,this))},removeHooks:function(){this._map&&(this._featureGroup.eachLayer(this._disableLayerEdit,this),this._uneditedLayerProps={},this._tooltip.dispose(),this._tooltip=null,this._map.off("mousemove",this._onMouseMove,this).off("touchmove",this._onMouseMove,this).off("MSPointerMove",this._onMouseMove,this).off(L.Draw.Event.EDITVERTEX,this._updateTooltip,this))},revertLayers:function(){this._featureGroup.eachLayer((function(t){this._revertLayer(t)}),this)},save:function(){var t=new L.LayerGroup;this._featureGroup.eachLayer((function(e){e.edited&&(t.addLayer(e),e.edited=!1)})),this._map.fire(L.Draw.Event.EDITED,{layers:t})},_backupLayer:function(t){var e=L.Util.stamp(t);this._uneditedLayerProps[e]||(t instanceof L.Polyline||t instanceof L.Polygon||t instanceof L.Rectangle?this._uneditedLayerProps[e]={latlngs:L.LatLngUtil.cloneLatLngs(t.getLatLngs())}:t instanceof L.Circle?this._uneditedLayerProps[e]={latlng:L.LatLngUtil.cloneLatLng(t.getLatLng()),radius:t.getRadius()}:(t instanceof L.Marker||t instanceof L.CircleMarker)&&(this._uneditedLayerProps[e]={latlng:L.LatLngUtil.cloneLatLng(t.getLatLng())}))},_getTooltipText:function(){return{text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext}},_updateTooltip:function(){this._tooltip.updateContent(this._getTooltipText())},_revertLayer:function(t){var e=L.Util.stamp(t);t.edited=!1,this._uneditedLayerProps.hasOwnProperty(e)&&(t instanceof L.Polyline||t instanceof L.Polygon||t instanceof L.Rectangle?t.setLatLngs(this._uneditedLayerProps[e].latlngs):t instanceof L.Circle?(t.setLatLng(this._uneditedLayerProps[e].latlng),t.setRadius(this._uneditedLayerProps[e].radius)):(t instanceof L.Marker||t instanceof L.CircleMarker)&&t.setLatLng(this._uneditedLayerProps[e].latlng),t.fire("revert-edited",{layer:t}))},_enableLayerEdit:function(t){var e,i,o=t.layer||t.target||t;this._backupLayer(o),this.options.poly&&(i=L.Util.extend({},this.options.poly),o.options.poly=i),this.options.selectedPathOptions&&((e=L.Util.extend({},this.options.selectedPathOptions)).maintainColor&&(e.color=o.options.color,e.fillColor=o.options.fillColor),o.options.original=L.extend({},o.options),o.options.editing=e),o instanceof L.Marker?(o.editing&&o.editing.enable(),o.dragging.enable(),o.on("dragend",this._onMarkerDragEnd).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onMarkerDragEnd,this).on("MSPointerUp",this._onMarkerDragEnd,this)):o.editing.enable()},_disableLayerEdit:function(t){var e=t.layer||t.target||t;e.edited=!1,e.editing&&e.editing.disable(),delete e.options.editing,delete e.options.original,this._selectedPathOptions&&(e instanceof L.Marker?this._toggleMarkerHighlight(e):(e.setStyle(e.options.previousOptions),delete e.options.previousOptions)),e instanceof L.Marker?(e.dragging.disable(),e.off("dragend",this._onMarkerDragEnd,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onMarkerDragEnd,this).off("MSPointerUp",this._onMarkerDragEnd,this)):e.editing.disable()},_onMouseMove:function(t){this._tooltip.updatePosition(t.latlng)},_onMarkerDragEnd:function(t){var e=t.target;e.edited=!0,this._map.fire(L.Draw.Event.EDITMOVE,{layer:e})},_onTouchMove:function(t){var e=t.originalEvent.changedTouches[0],i=this._map.mouseEventToLayerPoint(e),o=this._map.layerPointToLatLng(i);t.target.setLatLng(o)},_hasAvailableLayers:function(){return 0!==this._featureGroup.getLayers().length}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/ext/GeometryUtil.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,165 @@
+(function () {
+
+	var defaultPrecision = {
+		km: 2,
+		ha: 2,
+		m: 0,
+		mi: 2,
+		ac: 2,
+		yd: 0,
+		ft: 0,
+		nm: 2
+	};
+
+
+	/**
+	 * @class L.GeometryUtil
+	 * @aka GeometryUtil
+	 */
+	L.GeometryUtil = L.extend(L.GeometryUtil || {}, {
+		// Ported from the OpenLayers implementation. See https://github.com/openlayers/openlayers/blob/master/lib/OpenLayers/Geometry/LinearRing.js#L270
+
+		// @method geodesicArea(): number
+		geodesicArea: function (latLngs) {
+			var pointsCount = latLngs.length,
+				area = 0.0,
+				d2r = Math.PI / 180,
+				p1, p2;
+
+			if (pointsCount > 2) {
+				for (var i = 0; i < pointsCount; i++) {
+					p1 = latLngs[i];
+					p2 = latLngs[(i + 1) % pointsCount];
+					area += ((p2.lng - p1.lng) * d2r) *
+						(2 + Math.sin(p1.lat * d2r) + Math.sin(p2.lat * d2r));
+				}
+				area = area * 6378137.0 * 6378137.0 / 2.0;
+			}
+
+			return Math.abs(area);
+		},
+
+		// @method formattedNumber(n, precision): string
+		// Returns n in specified number format (if defined) and precision
+		formattedNumber: function (n, precision) {
+			var formatted = parseFloat(n).toFixed(precision),
+				format = L.drawLocal.format && L.drawLocal.format.numeric,
+				delimiters = format && format.delimiters,
+				thousands = delimiters && delimiters.thousands,
+				decimal = delimiters && delimiters.decimal;
+
+			if (thousands || decimal) {
+				var splitValue = formatted.split('.');
+				formatted = thousands ? splitValue[0].replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + thousands) : splitValue[0];
+				decimal = decimal || '.';
+				if (splitValue.length > 1) {
+					formatted = formatted + decimal + splitValue[1];
+				}
+			}
+
+			return formatted;
+		},
+
+		// @method readableArea(area, isMetric, precision): string
+		// Returns a readable area string in yards or metric.
+		// The value will be rounded as defined by the precision option object.
+		readableArea: function (area, isMetric, precision) {
+			var areaStr,
+				units,
+				precision = L.Util.extend({}, defaultPrecision, precision);
+
+			if (isMetric) {
+				units = ['ha', 'm'];
+				type = typeof isMetric;
+				if (type === 'string') {
+					units = [isMetric];
+				} else if (type !== 'boolean') {
+					units = isMetric;
+				}
+
+				if (area >= 1000000 && units.indexOf('km') !== -1) {
+					areaStr = L.GeometryUtil.formattedNumber(area * 0.000001, precision['km']) + ' km²';
+				} else if (area >= 10000 && units.indexOf('ha') !== -1) {
+					areaStr = L.GeometryUtil.formattedNumber(area * 0.0001, precision['ha']) + ' ha';
+				} else {
+					areaStr = L.GeometryUtil.formattedNumber(area, precision['m']) + ' m²';
+				}
+			} else {
+				area /= 0.836127; // Square yards in 1 meter
+
+				if (area >= 3097600) { //3097600 square yards in 1 square mile
+					areaStr = L.GeometryUtil.formattedNumber(area / 3097600, precision['mi']) + ' mi²';
+				} else if (area >= 4840) { //4840 square yards in 1 acre
+					areaStr = L.GeometryUtil.formattedNumber(area / 4840, precision['ac']) + ' acres';
+				} else {
+					areaStr = L.GeometryUtil.formattedNumber(area, precision['yd']) + ' yd²';
+				}
+			}
+
+			return areaStr;
+		},
+
+		// @method readableDistance(distance, units): string
+		// Converts a metric distance to one of [ feet, nauticalMile, metric or yards ] string
+		//
+		// @alternative
+		// @method readableDistance(distance, isMetric, useFeet, isNauticalMile, precision): string
+		// Converts metric distance to distance string.
+		// The value will be rounded as defined by the precision option object.
+		readableDistance: function (distance, isMetric, isFeet, isNauticalMile, precision) {
+			var distanceStr,
+				units,
+				precision = L.Util.extend({}, defaultPrecision, precision);
+
+			if (isMetric) {
+				units = typeof isMetric == 'string' ? isMetric : 'metric';
+			} else if (isFeet) {
+				units = 'feet';
+			} else if (isNauticalMile) {
+				units = 'nauticalMile';
+			} else {
+				units = 'yards';
+			}
+
+			switch (units) {
+				case 'metric':
+					// show metres when distance is < 1km, then show km
+					if (distance > 1000) {
+						distanceStr = L.GeometryUtil.formattedNumber(distance / 1000, precision['km']) + ' km';
+					} else {
+						distanceStr = L.GeometryUtil.formattedNumber(distance, precision['m']) + ' m';
+					}
+					break;
+				case 'feet':
+					distance *= 1.09361 * 3;
+					distanceStr = L.GeometryUtil.formattedNumber(distance, precision['ft']) + ' ft';
+
+					break;
+				case 'nauticalMile':
+					distance *= 0.53996;
+					distanceStr = L.GeometryUtil.formattedNumber(distance / 1000, precision['nm']) + ' nm';
+					break;
+				case 'yards':
+				default:
+					distance *= 1.09361;
+
+					if (distance > 1760) {
+						distanceStr = L.GeometryUtil.formattedNumber(distance / 1760, precision['mi']) + ' miles';
+					} else {
+						distanceStr = L.GeometryUtil.formattedNumber(distance, precision['yd']) + ' yd';
+					}
+					break;
+			}
+			return distanceStr;
+		},
+
+		// @method isVersion07x(): boolean
+		// Returns true if the Leaflet version is 0.7.x, false otherwise.
+		isVersion07x: function () {
+			var version = L.version.split('.');
+			//If Version is == 0.7.*
+			return parseInt(version[0], 10) === 0 && parseInt(version[1], 10) === 7;
+		},
+	});
+
+})();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/ext/GeometryUtil.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+!function(){var e={km:2,ha:2,m:0,mi:2,ac:2,yd:0,ft:0,nm:2};L.GeometryUtil=L.extend(L.GeometryUtil||{},{geodesicArea:function(e){var t,r,a=e.length,m=0,i=Math.PI/180;if(a>2){for(var o=0;o<a;o++)t=e[o],m+=((r=e[(o+1)%a]).lng-t.lng)*i*(2+Math.sin(t.lat*i)+Math.sin(r.lat*i));m=6378137*m*6378137/2}return Math.abs(m)},formattedNumber:function(e,t){var r=parseFloat(e).toFixed(t),a=L.drawLocal.format&&L.drawLocal.format.numeric,m=a&&a.delimiters,i=m&&m.thousands,o=m&&m.decimal;if(i||o){var n=r.split(".");r=i?n[0].replace(/(\d)(?=(\d{3})+(?!\d))/g,"$1"+i):n[0],o=o||".",n.length>1&&(r=r+o+n[1])}return r},readableArea:function(t,r,a){var m,i;a=L.Util.extend({},e,a);return r?(i=["ha","m"],type=typeof r,"string"===type?i=[r]:"boolean"!==type&&(i=r),m=t>=1e6&&-1!==i.indexOf("km")?L.GeometryUtil.formattedNumber(1e-6*t,a.km)+" km²":t>=1e4&&-1!==i.indexOf("ha")?L.GeometryUtil.formattedNumber(1e-4*t,a.ha)+" ha":L.GeometryUtil.formattedNumber(t,a.m)+" m²"):m=(t/=.836127)>=3097600?L.GeometryUtil.formattedNumber(t/3097600,a.mi)+" mi²":t>=4840?L.GeometryUtil.formattedNumber(t/4840,a.ac)+" acres":L.GeometryUtil.formattedNumber(t,a.yd)+" yd²",m},readableDistance:function(t,r,a,m,i){var o;i=L.Util.extend({},e,i);switch(r?"string"==typeof r?r:"metric":a?"feet":m?"nauticalMile":"yards"){case"metric":o=t>1e3?L.GeometryUtil.formattedNumber(t/1e3,i.km)+" km":L.GeometryUtil.formattedNumber(t,i.m)+" m";break;case"feet":t*=3.28083,o=L.GeometryUtil.formattedNumber(t,i.ft)+" ft";break;case"nauticalMile":t*=.53996,o=L.GeometryUtil.formattedNumber(t/1e3,i.nm)+" nm";break;case"yards":default:o=(t*=1.09361)>1760?L.GeometryUtil.formattedNumber(t/1760,i.mi)+" miles":L.GeometryUtil.formattedNumber(t,i.yd)+" yd"}return o},isVersion07x:function(){var e=L.version.split(".");return 0===parseInt(e[0],10)&&7===parseInt(e[1],10)}})}();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/ext/LatLngUtil.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,28 @@
+/**
+ * @class L.LatLngUtil
+ * @aka LatLngUtil
+ */
+L.LatLngUtil = {
+	// Clones a LatLngs[], returns [][]
+
+	// @method cloneLatLngs(LatLngs[]): L.LatLngs[]
+	// Clone the latLng point or points or nested points and return an array with those points
+	cloneLatLngs: function (latlngs) {
+		var clone = [];
+		for (var i = 0, l = latlngs.length; i < l; i++) {
+			// Check for nested array (Polyline/Polygon)
+			if (Array.isArray(latlngs[i])) {
+				clone.push(L.LatLngUtil.cloneLatLngs(latlngs[i]));
+			} else {
+				clone.push(this.cloneLatLng(latlngs[i]));
+			}
+		}
+		return clone;
+	},
+
+	// @method cloneLatLng(LatLng): L.LatLng
+	// Clone the latLng and return a new LatLng object.
+	cloneLatLng: function (latlng) {
+		return L.latLng(latlng.lat, latlng.lng);
+	}
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/ext/LatLngUtil.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.LatLngUtil={cloneLatLngs:function(n){for(var t=[],a=0,l=n.length;a<l;a++)Array.isArray(n[a])?t.push(L.LatLngUtil.cloneLatLngs(n[a])):t.push(this.cloneLatLng(n[a]));return t},cloneLatLng:function(n){return L.latLng(n.lat,n.lng)}};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/ext/LineUtil.Intersect.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,22 @@
+/**
+ * @class L.LineUtil
+ * @aka Util
+ * @aka L.Utils
+ */
+L.Util.extend(L.LineUtil, {
+
+	// @method segmentsIntersect(): boolean
+	// Checks to see if two line segments intersect. Does not handle degenerate cases.
+	// http://compgeom.cs.uiuc.edu/~jeffe/teaching/373/notes/x06-sweepline.pdf
+	segmentsIntersect: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2, /*Point*/ p3) {
+		return this._checkCounterclockwise(p, p2, p3) !==
+			this._checkCounterclockwise(p1, p2, p3) &&
+			this._checkCounterclockwise(p, p1, p2) !==
+			this._checkCounterclockwise(p, p1, p3);
+	},
+
+	// check to see if points are in counterclockwise order
+	_checkCounterclockwise: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {
+		return (p2.y - p.y) * (p1.x - p.x) > (p1.y - p.y) * (p2.x - p.x);
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/ext/LineUtil.Intersect.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Util.extend(L.LineUtil,{segmentsIntersect:function(e,c,t,n){return this._checkCounterclockwise(e,t,n)!==this._checkCounterclockwise(c,t,n)&&this._checkCounterclockwise(e,c,t)!==this._checkCounterclockwise(e,c,n)},_checkCounterclockwise:function(e,c,t){return(t.y-e.y)*(c.x-e.x)>(c.y-e.y)*(t.x-e.x)}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/ext/Polygon.Intersect.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,33 @@
+/**
+ * @class L.Polygon
+ * @aka Polygon
+ */
+L.Polygon.include({
+
+	// @method intersects(): boolean
+	// Checks a polygon for any intersecting line segments. Ignores holes.
+	intersects: function () {
+		var polylineIntersects,
+			points = this._getProjectedPoints(),
+			len, firstPoint, lastPoint, maxIndex;
+
+		if (this._tooFewPointsForIntersection()) {
+			return false;
+		}
+
+		polylineIntersects = L.Polyline.prototype.intersects.call(this);
+
+		// If already found an intersection don't need to check for any more.
+		if (polylineIntersects) {
+			return true;
+		}
+
+		len = points.length;
+		firstPoint = points[0];
+		lastPoint = points[len - 1];
+		maxIndex = len - 2;
+
+		// Check the line segment between last and first point. Don't need to check the first line segment (minIndex = 1)
+		return this._lineSegmentsIntersectsRange(lastPoint, firstPoint, maxIndex, 1);
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/ext/Polygon.Intersect.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Polygon.include({intersects:function(){var t,e,n,s,i=this._getProjectedPoints();return!this._tooFewPointsForIntersection()&&(!!L.Polyline.prototype.intersects.call(this)||(t=i.length,e=i[0],n=i[t-1],s=t-2,this._lineSegmentsIntersectsRange(n,e,s,1)))}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/ext/Polyline.Intersect.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,106 @@
+/**
+ * @class L.Polyline
+ * @aka Polyline
+ */
+L.Polyline.include({
+
+	// @method intersects(): boolean
+	// Check to see if this polyline has any linesegments that intersect.
+	// NOTE: does not support detecting intersection for degenerate cases.
+	intersects: function () {
+		var points = this._getProjectedPoints(),
+			len = points ? points.length : 0,
+			i, p, p1;
+
+		if (this._tooFewPointsForIntersection()) {
+			return false;
+		}
+
+		for (i = len - 1; i >= 3; i--) {
+			p = points[i - 1];
+			p1 = points[i];
+
+
+			if (this._lineSegmentsIntersectsRange(p, p1, i - 2)) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	// @method newLatLngIntersects(): boolean
+	// Check for intersection if new latlng was added to this polyline.
+	// NOTE: does not support detecting intersection for degenerate cases.
+	newLatLngIntersects: function (latlng, skipFirst) {
+		// Cannot check a polyline for intersecting lats/lngs when not added to the map
+		if (!this._map) {
+			return false;
+		}
+
+		return this.newPointIntersects(this._map.latLngToLayerPoint(latlng), skipFirst);
+	},
+
+	// @method newPointIntersects(): boolean
+	// Check for intersection if new point was added to this polyline.
+	// newPoint must be a layer point.
+	// NOTE: does not support detecting intersection for degenerate cases.
+	newPointIntersects: function (newPoint, skipFirst) {
+		var points = this._getProjectedPoints(),
+			len = points ? points.length : 0,
+			lastPoint = points ? points[len - 1] : null,
+			// The previous previous line segment. Previous line segment doesn't need testing.
+			maxIndex = len - 2;
+
+		if (this._tooFewPointsForIntersection(1)) {
+			return false;
+		}
+
+		return this._lineSegmentsIntersectsRange(lastPoint, newPoint, maxIndex, skipFirst ? 1 : 0);
+	},
+
+	// Polylines with 2 sides can only intersect in cases where points are collinear (we don't support detecting these).
+	// Cannot have intersection when < 3 line segments (< 4 points)
+	_tooFewPointsForIntersection: function (extraPoints) {
+		var points = this._getProjectedPoints(),
+			len = points ? points.length : 0;
+		// Increment length by extraPoints if present
+		len += extraPoints || 0;
+
+		return !points || len <= 3;
+	},
+
+	// Checks a line segment intersections with any line segments before its predecessor.
+	// Don't need to check the predecessor as will never intersect.
+	_lineSegmentsIntersectsRange: function (p, p1, maxIndex, minIndex) {
+		var points = this._getProjectedPoints(),
+			p2, p3;
+
+		minIndex = minIndex || 0;
+
+		// Check all previous line segments (beside the immediately previous) for intersections
+		for (var j = maxIndex; j > minIndex; j--) {
+			p2 = points[j - 1];
+			p3 = points[j];
+
+			if (L.LineUtil.segmentsIntersect(p, p1, p2, p3)) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	_getProjectedPoints: function () {
+		if (!this._defaultShape) {
+			return this._originalPoints;
+		}
+		var points = [],
+			_shape = this._defaultShape();
+
+		for (var i = 0; i < _shape.length; i++) {
+			points.push(this._map.latLngToLayerPoint(_shape[i]));
+		}
+		return points;
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/ext/Polyline.Intersect.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Polyline.include({intersects:function(){var t,e,n,i=this._getProjectedPoints(),r=i?i.length:0;if(this._tooFewPointsForIntersection())return!1;for(t=r-1;t>=3;t--)if(e=i[t-1],n=i[t],this._lineSegmentsIntersectsRange(e,n,t-2))return!0;return!1},newLatLngIntersects:function(t,e){return!!this._map&&this.newPointIntersects(this._map.latLngToLayerPoint(t),e)},newPointIntersects:function(t,e){var n=this._getProjectedPoints(),i=n?n.length:0,r=n?n[i-1]:null,s=i-2;return!this._tooFewPointsForIntersection(1)&&this._lineSegmentsIntersectsRange(r,t,s,e?1:0)},_tooFewPointsForIntersection:function(t){var e=this._getProjectedPoints(),n=e?e.length:0;return!e||(n+=t||0)<=3},_lineSegmentsIntersectsRange:function(t,e,n,i){var r,s,o=this._getProjectedPoints();i=i||0;for(var c=n;c>i;c--)if(r=o[c-1],s=o[c],L.LineUtil.segmentsIntersect(t,e,r,s))return!0;return!1},_getProjectedPoints:function(){if(!this._defaultShape)return this._originalPoints;for(var t=[],e=this._defaultShape(),n=0;n<e.length;n++)t.push(this._map.latLngToLayerPoint(e[n]));return t}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/ext/TouchEvents.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,272 @@
+L.Map.mergeOptions({
+	touchExtend: true
+});
+
+/**
+ * @class L.Map.TouchExtend
+ * @aka TouchExtend
+ */
+L.Map.TouchExtend = L.Handler.extend({
+
+	// @method initialize(): void
+	// Sets TouchExtend private accessor variables
+	initialize: function (map) {
+		this._map = map;
+		this._container = map._container;
+		this._pane = map._panes.overlayPane;
+	},
+
+	// @method addHooks(): void
+	// Adds dom listener events to the map container
+	addHooks: function () {
+		L.DomEvent.on(this._container, 'touchstart', this._onTouchStart, this);
+		L.DomEvent.on(this._container, 'touchend', this._onTouchEnd, this);
+		L.DomEvent.on(this._container, 'touchmove', this._onTouchMove, this);
+		if (this._detectIE()) {
+			L.DomEvent.on(this._container, 'MSPointerDown', this._onTouchStart, this);
+			L.DomEvent.on(this._container, 'MSPointerUp', this._onTouchEnd, this);
+			L.DomEvent.on(this._container, 'MSPointerMove', this._onTouchMove, this);
+			L.DomEvent.on(this._container, 'MSPointerCancel', this._onTouchCancel, this);
+
+		} else {
+			L.DomEvent.on(this._container, 'touchcancel', this._onTouchCancel, this);
+			L.DomEvent.on(this._container, 'touchleave', this._onTouchLeave, this);
+		}
+	},
+
+	// @method removeHooks(): void
+	// Removes dom listener events from the map container
+	removeHooks: function () {
+		L.DomEvent.off(this._container, 'touchstart', this._onTouchStart, this);
+		L.DomEvent.off(this._container, 'touchend', this._onTouchEnd, this);
+		L.DomEvent.off(this._container, 'touchmove', this._onTouchMove, this);
+		if (this._detectIE()) {
+			L.DomEvent.off(this._container, 'MSPointerDown', this._onTouchStart, this);
+			L.DomEvent.off(this._container, 'MSPointerUp', this._onTouchEnd, this);
+			L.DomEvent.off(this._container, 'MSPointerMove', this._onTouchMove, this);
+			L.DomEvent.off(this._container, 'MSPointerCancel', this._onTouchCancel, this);
+		} else {
+			L.DomEvent.off(this._container, 'touchcancel', this._onTouchCancel, this);
+			L.DomEvent.off(this._container, 'touchleave', this._onTouchLeave, this);
+		}
+	},
+
+	_touchEvent: function (e, type) {
+		// #TODO: fix the pageX error that is do a bug in Android where a single touch triggers two click events
+		// _filterClick is what leaflet uses as a workaround.
+		// This is a problem with more things than just android. Another problem is touchEnd has no touches in
+		// its touch list.
+		var touchEvent = {};
+		if (typeof e.touches !== 'undefined') {
+			if (!e.touches.length) {
+				return;
+			}
+			touchEvent = e.touches[0];
+		} else if (e.pointerType === 'touch') {
+			touchEvent = e;
+			if (!this._filterClick(e)) {
+				return;
+			}
+		} else {
+			return;
+		}
+
+		var containerPoint = this._map.mouseEventToContainerPoint(touchEvent),
+			layerPoint = this._map.mouseEventToLayerPoint(touchEvent),
+			latlng = this._map.layerPointToLatLng(layerPoint);
+
+		this._map.fire(type, {
+			latlng: latlng,
+			layerPoint: layerPoint,
+			containerPoint: containerPoint,
+			pageX: touchEvent.pageX,
+			pageY: touchEvent.pageY,
+			originalEvent: e
+		});
+	},
+
+	/** Borrowed from Leaflet and modified for bool ops **/
+	_filterClick: function (e) {
+		var timeStamp = (e.timeStamp || e.originalEvent.timeStamp),
+			elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);
+
+		// are they closer together than 500ms yet more than 100ms?
+		// Android typically triggers them ~300ms apart while multiple listeners
+		// on the same event should be triggered far faster;
+		// or check if click is simulated on the element, and if it is, reject any non-simulated events
+		if ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) {
+			L.DomEvent.stop(e);
+			return false;
+		}
+		L.DomEvent._lastClick = timeStamp;
+		return true;
+	},
+
+	_onTouchStart: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchstart';
+		this._touchEvent(e, type);
+
+	},
+
+	_onTouchEnd: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchend';
+		this._touchEvent(e, type);
+	},
+
+	_onTouchCancel: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchcancel';
+		if (this._detectIE()) {
+			type = 'pointercancel';
+		}
+		this._touchEvent(e, type);
+	},
+
+	_onTouchLeave: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchleave';
+		this._touchEvent(e, type);
+	},
+
+	_onTouchMove: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchmove';
+		this._touchEvent(e, type);
+	},
+
+	_detectIE: function () {
+		var ua = window.navigator.userAgent;
+
+		var msie = ua.indexOf('MSIE ');
+		if (msie > 0) {
+			// IE 10 or older => return version number
+			return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
+		}
+
+		var trident = ua.indexOf('Trident/');
+		if (trident > 0) {
+			// IE 11 => return version number
+			var rv = ua.indexOf('rv:');
+			return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
+		}
+
+		var edge = ua.indexOf('Edge/');
+		if (edge > 0) {
+			// IE 12 => return version number
+			return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
+		}
+
+		// other browser
+		return false;
+	}
+});
+
+L.Map.addInitHook('addHandler', 'touchExtend', L.Map.TouchExtend);
+
+
+/**
+ * @class L.Marker.Touch
+ * @aka Marker.Touch
+ *
+ * This isn't full Touch support. This is just to get markers to also support dom touch events after creation
+ * #TODO: find a better way of getting markers to support touch.
+ */
+L.Marker.Touch = L.Marker.extend({
+
+	_initInteraction: function () {
+		if (!this.addInteractiveTarget) {
+			// 0.7.x support
+			return this._initInteractionLegacy();
+		}
+		// TODO this may need be updated to re-add touch events for 1.0+
+		return L.Marker.prototype._initInteraction.apply(this);
+	},
+
+	// This is an exact copy of https://github.com/Leaflet/Leaflet/blob/v0.7/src/layer/marker/Marker.js
+	// with the addition of the touch events
+	_initInteractionLegacy: function () {
+
+		if (!this.options.clickable) {
+			return;
+		}
+
+		// TODO refactor into something shared with Map/Path/etc. to DRY it up
+
+		var icon = this._icon,
+			events = ['dblclick',
+				'mousedown',
+				'mouseover',
+				'mouseout',
+				'contextmenu',
+				'touchstart',
+				'touchend',
+				'touchmove'];
+		if (this._detectIE) {
+			events.concat(['MSPointerDown',
+				'MSPointerUp',
+				'MSPointerMove',
+				'MSPointerCancel']);
+		} else {
+			events.concat(['touchcancel']);
+		}
+
+		L.DomUtil.addClass(icon, 'leaflet-clickable');
+		L.DomEvent.on(icon, 'click', this._onMouseClick, this);
+		L.DomEvent.on(icon, 'keypress', this._onKeyPress, this);
+
+		for (var i = 0; i < events.length; i++) {
+			L.DomEvent.on(icon, events[i], this._fireMouseEvent, this);
+		}
+
+		if (L.Handler.MarkerDrag) {
+			this.dragging = new L.Handler.MarkerDrag(this);
+
+			if (this.options.draggable) {
+				this.dragging.enable();
+			}
+		}
+	},
+
+	_detectIE: function () {
+		var ua = window.navigator.userAgent;
+
+		var msie = ua.indexOf('MSIE ');
+		if (msie > 0) {
+			// IE 10 or older => return version number
+			return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
+		}
+
+		var trident = ua.indexOf('Trident/');
+		if (trident > 0) {
+			// IE 11 => return version number
+			var rv = ua.indexOf('rv:');
+			return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
+		}
+
+		var edge = ua.indexOf('Edge/');
+		if (edge > 0) {
+			// IE 12 => return version number
+			return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
+		}
+
+		// other browser
+		return false;
+	}
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/Draw/ext/TouchEvents.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+L.Map.mergeOptions({touchExtend:!0}),L.Map.TouchExtend=L.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){L.DomEvent.on(this._container,"touchstart",this._onTouchStart,this),L.DomEvent.on(this._container,"touchend",this._onTouchEnd,this),L.DomEvent.on(this._container,"touchmove",this._onTouchMove,this),this._detectIE()?(L.DomEvent.on(this._container,"MSPointerDown",this._onTouchStart,this),L.DomEvent.on(this._container,"MSPointerUp",this._onTouchEnd,this),L.DomEvent.on(this._container,"MSPointerMove",this._onTouchMove,this),L.DomEvent.on(this._container,"MSPointerCancel",this._onTouchCancel,this)):(L.DomEvent.on(this._container,"touchcancel",this._onTouchCancel,this),L.DomEvent.on(this._container,"touchleave",this._onTouchLeave,this))},removeHooks:function(){L.DomEvent.off(this._container,"touchstart",this._onTouchStart,this),L.DomEvent.off(this._container,"touchend",this._onTouchEnd,this),L.DomEvent.off(this._container,"touchmove",this._onTouchMove,this),this._detectIE()?(L.DomEvent.off(this._container,"MSPointerDown",this._onTouchStart,this),L.DomEvent.off(this._container,"MSPointerUp",this._onTouchEnd,this),L.DomEvent.off(this._container,"MSPointerMove",this._onTouchMove,this),L.DomEvent.off(this._container,"MSPointerCancel",this._onTouchCancel,this)):(L.DomEvent.off(this._container,"touchcancel",this._onTouchCancel,this),L.DomEvent.off(this._container,"touchleave",this._onTouchLeave,this))},_touchEvent:function(t,n){var e={};if(void 0!==t.touches){if(!t.touches.length)return;e=t.touches[0]}else{if("touch"!==t.pointerType)return;if(e=t,!this._filterClick(t))return}var o=this._map.mouseEventToContainerPoint(e),i=this._map.mouseEventToLayerPoint(e),a=this._map.layerPointToLatLng(i);this._map.fire(n,{latlng:a,layerPoint:i,containerPoint:o,pageX:e.pageX,pageY:e.pageY,originalEvent:t})},_filterClick:function(t){var n=t.timeStamp||t.originalEvent.timeStamp,e=L.DomEvent._lastClick&&n-L.DomEvent._lastClick;return e&&e>100&&e<500||t.target._simulatedClick&&!t._simulated?(L.DomEvent.stop(t),!1):(L.DomEvent._lastClick=n,!0)},_onTouchStart:function(t){if(this._map._loaded){this._touchEvent(t,"touchstart")}},_onTouchEnd:function(t){if(this._map._loaded){this._touchEvent(t,"touchend")}},_onTouchCancel:function(t){if(this._map._loaded){var n="touchcancel";this._detectIE()&&(n="pointercancel"),this._touchEvent(t,n)}},_onTouchLeave:function(t){if(this._map._loaded){this._touchEvent(t,"touchleave")}},_onTouchMove:function(t){if(this._map._loaded){this._touchEvent(t,"touchmove")}},_detectIE:function(){var t=window.navigator.userAgent,n=t.indexOf("MSIE ");if(n>0)return parseInt(t.substring(n+5,t.indexOf(".",n)),10);if(t.indexOf("Trident/")>0){var e=t.indexOf("rv:");return parseInt(t.substring(e+3,t.indexOf(".",e)),10)}var o=t.indexOf("Edge/");return o>0&&parseInt(t.substring(o+5,t.indexOf(".",o)),10)}}),L.Map.addInitHook("addHandler","touchExtend",L.Map.TouchExtend),L.Marker.Touch=L.Marker.extend({_initInteraction:function(){return this.addInteractiveTarget?L.Marker.prototype._initInteraction.apply(this):this._initInteractionLegacy()},_initInteractionLegacy:function(){if(this.options.clickable){var t=this._icon,n=["dblclick","mousedown","mouseover","mouseout","contextmenu","touchstart","touchend","touchmove"];this._detectIE?n.concat(["MSPointerDown","MSPointerUp","MSPointerMove","MSPointerCancel"]):n.concat(["touchcancel"]),L.DomUtil.addClass(t,"leaflet-clickable"),L.DomEvent.on(t,"click",this._onMouseClick,this),L.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var e=0;e<n.length;e++)L.DomEvent.on(t,n[e],this._fireMouseEvent,this);L.Handler.MarkerDrag&&(this.dragging=new L.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_detectIE:function(){var t=window.navigator.userAgent,n=t.indexOf("MSIE ");if(n>0)return parseInt(t.substring(n+5,t.indexOf(".",n)),10);if(t.indexOf("Trident/")>0){var e=t.indexOf("rv:");return parseInt(t.substring(e+3,t.indexOf(".",e)),10)}var o=t.indexOf("Edge/");return o>0&&parseInt(t.substring(o+5,t.indexOf(".",o)),10)}});
--- a/src/pyams_gis/resources/js/Edit.Circle.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-L.Edit = L.Edit || {};
-/**
- * @class L.Edit.Circle
- * @aka Edit.Circle
- * @inherits L.Edit.SimpleShape
- */
-L.Edit.Circle = L.Edit.SimpleShape.extend({
-	_createMoveMarker: function () {
-		var center = this._shape.getLatLng();
-
-		this._moveMarker = this._createMarker(center, this.options.moveIcon);
-	},
-
-	_createResizeMarker: function () {
-		var center = this._shape.getLatLng(),
-			resizemarkerPoint = this._getResizeMarkerPoint(center);
-
-		this._resizeMarkers = [];
-		this._resizeMarkers.push(this._createMarker(resizemarkerPoint, this.options.resizeIcon));
-	},
-
-	_getResizeMarkerPoint: function (latlng) {
-		// From L.shape.getBounds()
-		var delta = this._shape._radius * Math.cos(Math.PI / 4),
-			point = this._map.project(latlng);
-		return this._map.unproject([point.x + delta, point.y - delta]);
-	},
-
-	_move: function (latlng) {
-		var resizemarkerPoint = this._getResizeMarkerPoint(latlng);
-
-		// Move the resize marker
-		this._resizeMarkers[0].setLatLng(resizemarkerPoint);
-
-		// Move the circle
-		this._shape.setLatLng(latlng);
-
-		this._map.fire(L.Draw.Event.EDITMOVE, { layer: this._shape });
-	},
-
-	_resize: function (latlng) {
-		var moveLatLng = this._moveMarker.getLatLng(),
-			radius = moveLatLng.distanceTo(latlng);
-
-		this._shape.setRadius(radius);
-
-		this._map.fire(L.Draw.Event.EDITRESIZE, { layer: this._shape });
-	}
-});
-
-L.Circle.addInitHook(function () {
-	if (L.Edit.Circle) {
-		this.editing = new L.Edit.Circle(this);
-
-		if (this.options.editable) {
-			this.editing.enable();
-		}
-	}
-
-	this.on('add', function () {
-		if (this.editing && this.editing.enabled()) {
-			this.editing.addHooks();
-		}
-	});
-
-	this.on('remove', function () {
-		if (this.editing && this.editing.enabled()) {
-			this.editing.removeHooks();
-		}
-	});
-});
\ No newline at end of file
--- a/src/pyams_gis/resources/js/Edit.Circle.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-L.Edit=L.Edit||{};L.Edit.Circle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var a=this._shape.getLatLng();this._moveMarker=this._createMarker(a,this.options.moveIcon)},_createResizeMarker:function(){var a=this._shape.getLatLng(),b=this._getResizeMarkerPoint(a);this._resizeMarkers=[];this._resizeMarkers.push(this._createMarker(b,this.options.resizeIcon))},_getResizeMarkerPoint:function(c){var b=this._shape._radius*Math.cos(Math.PI/4),a=this._map.project(c);return this._map.unproject([a.x+b,a.y-b])},_move:function(b){var a=this._getResizeMarkerPoint(b);this._resizeMarkers[0].setLatLng(a);this._shape.setLatLng(b);this._map.fire(L.Draw.Event.EDITMOVE,{layer:this._shape})},_resize:function(c){var b=this._moveMarker.getLatLng(),a=b.distanceTo(c);this._shape.setRadius(a);this._map.fire(L.Draw.Event.EDITRESIZE,{layer:this._shape})}});L.Circle.addInitHook(function(){if(L.Edit.Circle){this.editing=new L.Edit.Circle(this);if(this.options.editable){this.editing.enable()}}this.on("add",function(){if(this.editing&&this.editing.enabled()){this.editing.addHooks()}});this.on("remove",function(){if(this.editing&&this.editing.enabled()){this.editing.removeHooks()}})});
\ No newline at end of file
--- a/src/pyams_gis/resources/js/Edit.Marker.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-L.Edit = L.Edit || {};
-
-/**
- * @class L.Edit.Marker
- * @aka Edit.Marker
- */
-L.Edit.Marker = L.Handler.extend({
-	// @method initialize(): void
-	initialize: function (marker, options) {
-		this._marker = marker;
-		L.setOptions(this, options);
-	},
-
-	// @method addHooks(): void
-	// Add listener hooks to this handler
-	addHooks: function () {
-		var marker = this._marker;
-
-		marker.dragging.enable();
-		marker.on('dragend', this._onDragEnd, marker);
-		this._toggleMarkerHighlight();
-	},
-
-	// @method removeHooks(): void
-	// Remove listener hooks from this handler
-	removeHooks: function () {
-		var marker = this._marker;
-
-		marker.dragging.disable();
-		marker.off('dragend', this._onDragEnd, marker);
-		this._toggleMarkerHighlight();
-	},
-
-	_onDragEnd: function (e) {
-		var layer = e.target;
-		layer.edited = true;
-		this._map.fire(L.Draw.Event.EDITMOVE, { layer: layer });
-	},
-
-	_toggleMarkerHighlight: function () {
-		var icon = this._marker._icon;
-
-		// Don't do anything if this layer is a marker but doesn't have an icon. Markers
-		// should usually have icons. If using Leaflet.draw with Leaflet.markercluster there
-		// is a chance that a marker doesn't.
-		if (!icon) {
-			return;
-		}
-
-		// This is quite naughty, but I don't see another way of doing it. (short of setting a new icon)
-		icon.style.display = 'none';
-
-		if (L.DomUtil.hasClass(icon, 'leaflet-edit-marker-selected')) {
-			L.DomUtil.removeClass(icon, 'leaflet-edit-marker-selected');
-			// Offset as the border will make the icon move.
-			this._offsetMarker(icon, -4);
-
-		} else {
-			L.DomUtil.addClass(icon, 'leaflet-edit-marker-selected');
-			// Offset as the border will make the icon move.
-			this._offsetMarker(icon, 4);
-		}
-
-		icon.style.display = '';
-	},
-
-	_offsetMarker: function (icon, offset) {
-		var iconMarginTop = parseInt(icon.style.marginTop, 10) - offset,
-			iconMarginLeft = parseInt(icon.style.marginLeft, 10) - offset;
-
-		icon.style.marginTop = iconMarginTop + 'px';
-		icon.style.marginLeft = iconMarginLeft + 'px';
-	}
-});
-
-L.Marker.addInitHook(function () {
-	if (L.Edit.Marker) {
-		this.editing = new L.Edit.Marker(this);
-
-		if (this.options.editable) {
-			this.editing.enable();
-		}
-	}
-});
--- a/src/pyams_gis/resources/js/Edit.Marker.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-L.Edit=L.Edit||{};L.Edit.Marker=L.Handler.extend({initialize:function(a,b){this._marker=a;L.setOptions(this,b)},addHooks:function(){var a=this._marker;a.dragging.enable();a.on("dragend",this._onDragEnd,a);this._toggleMarkerHighlight()},removeHooks:function(){var a=this._marker;a.dragging.disable();a.off("dragend",this._onDragEnd,a);this._toggleMarkerHighlight()},_onDragEnd:function(b){var a=b.target;a.edited=true;this._map.fire(L.Draw.Event.EDITMOVE,{layer:a})},_toggleMarkerHighlight:function(){var a=this._marker._icon;if(!a){return}a.style.display="none";if(L.DomUtil.hasClass(a,"leaflet-edit-marker-selected")){L.DomUtil.removeClass(a,"leaflet-edit-marker-selected");this._offsetMarker(a,-4)}else{L.DomUtil.addClass(a,"leaflet-edit-marker-selected");this._offsetMarker(a,4)}a.style.display=""},_offsetMarker:function(b,d){var c=parseInt(b.style.marginTop,10)-d,a=parseInt(b.style.marginLeft,10)-d;b.style.marginTop=c+"px";b.style.marginLeft=a+"px"}});L.Marker.addInitHook(function(){if(L.Edit.Marker){this.editing=new L.Edit.Marker(this);if(this.options.editable){this.editing.enable()}}});
\ No newline at end of file
--- a/src/pyams_gis/resources/js/Edit.Poly.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,490 +0,0 @@
-L.Edit = L.Edit || {};
-
-/**
- * @class L.Edit.Polyline
- * @aka L.Edit.Poly
- * @aka Edit.Poly
- */
-L.Edit.Poly = L.Handler.extend({
-	options: {},
-
-	// @method initialize(): void
-	initialize: function (poly, options) {
-
-		this.latlngs = [poly._latlngs];
-		if (poly._holes) {
-			this.latlngs = this.latlngs.concat(poly._holes);
-		}
-
-		this._poly = poly;
-		L.setOptions(this, options);
-
-		this._poly.on('revert-edited', this._updateLatLngs, this);
-	},
-
-	// Compatibility method to normalize Poly* objects
-	// between 0.7.x and 1.0+
-	_defaultShape: function () {
-		if (!L.Polyline._flat) {
-			return this._poly._latlngs;
-		}
-		return L.Polyline._flat(this._poly._latlngs) ? this._poly._latlngs : this._poly._latlngs[0];
-	},
-
-	_eachVertexHandler: function (callback) {
-		for (var i = 0; i < this._verticesHandlers.length; i++) {
-			callback(this._verticesHandlers[i]);
-		}
-	},
-
-	// @method addHooks(): void
-	// Add listener hooks to this handler
-	addHooks: function () {
-		this._initHandlers();
-		this._eachVertexHandler(function (handler) {
-			handler.addHooks();
-		});
-	},
-
-	// @method removeHooks(): void
-	// Remove listener hooks from this handler
-	removeHooks: function () {
-		this._eachVertexHandler(function (handler) {
-			handler.removeHooks();
-		});
-	},
-
-	// @method updateMarkers(): void
-	// Fire an update for each vertex handler
-	updateMarkers: function () {
-		this._eachVertexHandler(function (handler) {
-			handler.updateMarkers();
-		});
-	},
-
-	_initHandlers: function () {
-		this._verticesHandlers = [];
-		for (var i = 0; i < this.latlngs.length; i++) {
-			this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(this._poly, this.latlngs[i], this.options));
-		}
-	},
-
-	_updateLatLngs: function (e) {
-		this.latlngs = [e.layer._latlngs];
-		if (e.layer._holes) {
-			this.latlngs = this.latlngs.concat(e.layer._holes);
-		}
-	}
-
-});
-
-/**
- * @class L.Edit.PolyVerticesEdit
- * @aka Edit.PolyVerticesEdit
- */
-L.Edit.PolyVerticesEdit = L.Handler.extend({
-	options: {
-		icon: new L.DivIcon({
-			iconSize: new L.Point(8, 8),
-			className: 'leaflet-div-icon leaflet-editing-icon'
-		}),
-		touchIcon: new L.DivIcon({
-			iconSize: new L.Point(20, 20),
-			className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
-		}),
-		drawError: {
-			color: '#b00b00',
-			timeout: 1000
-		}
-
-
-	},
-
-	// @method intialize(): void
-	initialize: function (poly, latlngs, options) {
-		// if touch, switch to touch icon
-		if (L.Browser.touch) {
-			this.options.icon = this.options.touchIcon;
-		}
-		this._poly = poly;
-
-		if (options && options.drawError) {
-			options.drawError = L.Util.extend({}, this.options.drawError, options.drawError);
-		}
-
-		this._latlngs = latlngs;
-
-		L.setOptions(this, options);
-	},
-
-	// Compatibility method to normalize Poly* objects
-	// between 0.7.x and 1.0+
-	_defaultShape: function () {
-		if (!L.Polyline._flat) {
-			return this._latlngs;
-		}
-		return L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0];
-	},
-
-	// @method addHooks(): void
-	// Add listener hooks to this handler.
-	addHooks: function () {
-		var poly = this._poly;
-
-		if (!(poly instanceof L.Polygon)) {
-			poly.options.fill = false;
-			if (poly.options.editing) {
-				poly.options.editing.fill = false;
-			}
-		}
-
-		poly.setStyle(poly.options.editing);
-
-		if (this._poly._map) {
-
-			this._map = this._poly._map; // Set map
-
-			if (!this._markerGroup) {
-				this._initMarkers();
-			}
-			this._poly._map.addLayer(this._markerGroup);
-		}
-	},
-
-	// @method removeHooks(): void
-	// Remove listener hooks from this handler.
-	removeHooks: function () {
-		var poly = this._poly;
-
-		poly.setStyle(poly.options.original);
-
-		if (poly._map) {
-			poly._map.removeLayer(this._markerGroup);
-			delete this._markerGroup;
-			delete this._markers;
-		}
-	},
-
-	// @method updateMarkers(): void
-	// Clear markers and update their location
-	updateMarkers: function () {
-		this._markerGroup.clearLayers();
-		this._initMarkers();
-	},
-
-	_initMarkers: function () {
-		if (!this._markerGroup) {
-			this._markerGroup = new L.LayerGroup();
-		}
-		this._markers = [];
-
-		var latlngs = this._defaultShape(),
-			i, j, len, marker;
-
-		for (i = 0, len = latlngs.length; i < len; i++) {
-
-			marker = this._createMarker(latlngs[i], i);
-			marker.on('click', this._onMarkerClick, this);
-			this._markers.push(marker);
-		}
-
-		var markerLeft, markerRight;
-
-		for (i = 0, j = len - 1; i < len; j = i++) {
-			if (i === 0 && !(L.Polygon && (this._poly instanceof L.Polygon))) {
-				continue;
-			}
-
-			markerLeft = this._markers[j];
-			markerRight = this._markers[i];
-
-			this._createMiddleMarker(markerLeft, markerRight);
-			this._updatePrevNext(markerLeft, markerRight);
-		}
-	},
-
-	_createMarker: function (latlng, index) {
-		// Extending L.Marker in TouchEvents.js to include touch.
-		var marker = new L.Marker.Touch(latlng, {
-			draggable: true,
-			icon: this.options.icon,
-		});
-
-		marker._origLatLng = latlng;
-		marker._index = index;
-
-		marker
-			.on('dragstart', this._onMarkerDragStart, this)
-			.on('drag', this._onMarkerDrag, this)
-			.on('dragend', this._fireEdit, this)
-			.on('touchmove', this._onTouchMove, this)
-			.on('touchend', this._fireEdit, this)
-			.on('MSPointerMove', this._onTouchMove, this)
-			.on('MSPointerUp', this._fireEdit, this);
-
-		this._markerGroup.addLayer(marker);
-
-		return marker;
-	},
-
-	_onMarkerDragStart: function () {
-		this._poly.fire('editstart');
-	},
-
-	_spliceLatLngs: function () {
-		var latlngs = this._defaultShape();
-		var removed = [].splice.apply(latlngs, arguments);
-		this._poly._convertLatLngs(latlngs, true);
-		this._poly.redraw();
-		return removed;
-	},
-
-	_removeMarker: function (marker) {
-		var i = marker._index;
-
-		this._markerGroup.removeLayer(marker);
-		this._markers.splice(i, 1);
-		this._spliceLatLngs(i, 1);
-		this._updateIndexes(i, -1);
-
-		marker
-			.off('dragstart', this._onMarkerDragStart, this)
-			.off('drag', this._onMarkerDrag, this)
-			.off('dragend', this._fireEdit, this)
-			.off('touchmove', this._onMarkerDrag, this)
-			.off('touchend', this._fireEdit, this)
-			.off('click', this._onMarkerClick, this)
-			.off('MSPointerMove', this._onTouchMove, this)
-			.off('MSPointerUp', this._fireEdit, this);
-	},
-
-	_fireEdit: function () {
-		this._poly.edited = true;
-		this._poly.fire('edit');
-		this._poly._map.fire(L.Draw.Event.EDITVERTEX, { layers: this._markerGroup, poly: this._poly });
-	},
-
-	_onMarkerDrag: function (e) {
-		var marker = e.target;
-		var poly = this._poly;
-
-		L.extend(marker._origLatLng, marker._latlng);
-
-		if (marker._middleLeft) {
-			marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
-		}
-		if (marker._middleRight) {
-			marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
-		}
-
-		if (poly.options.poly) {
-			var tooltip = poly._map._editTooltip; // Access the tooltip
-
-			// If we don't allow intersections and the polygon intersects
-			if (!poly.options.poly.allowIntersection && poly.intersects()) {
-
-				var originalColor = poly.options.color;
-				poly.setStyle({ color: this.options.drawError.color });
-
-				// Manually trigger 'dragend' behavior on marker we are about to remove
-				// WORKAROUND: introduced in 1.0.0-rc2, may be related to #4484
-				if (L.version.indexOf('0.7') !== 0) {
-					marker.dragging._draggable._onUp(e);
-				}
-				this._onMarkerClick(e); // Remove violating marker
-				// FIXME: Reset the marker to it's original position (instead of remove)
-
-				if (tooltip) {
-					tooltip.updateContent({
-						text: L.drawLocal.draw.handlers.polyline.error
-					});
-				}
-
-				// Reset everything back to normal after a second
-				setTimeout(function () {
-					poly.setStyle({ color: originalColor });
-					if (tooltip) {
-						tooltip.updateContent({
-							text: L.drawLocal.edit.handlers.edit.tooltip.text,
-							subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
-						});
-					}
-				}, 1000);
-			}
-		}
-
-		this._poly.redraw();
-		this._poly.fire('editdrag');
-	},
-
-	_onMarkerClick: function (e) {
-
-		var minPoints = L.Polygon && (this._poly instanceof L.Polygon) ? 4 : 3,
-			marker = e.target;
-
-		// If removing this point would create an invalid polyline/polygon don't remove
-		if (this._defaultShape().length < minPoints) {
-			return;
-		}
-
-		// remove the marker
-		this._removeMarker(marker);
-
-		// update prev/next links of adjacent markers
-		this._updatePrevNext(marker._prev, marker._next);
-
-		// remove ghost markers near the removed marker
-		if (marker._middleLeft) {
-			this._markerGroup.removeLayer(marker._middleLeft);
-		}
-		if (marker._middleRight) {
-			this._markerGroup.removeLayer(marker._middleRight);
-		}
-
-		// create a ghost marker in place of the removed one
-		if (marker._prev && marker._next) {
-			this._createMiddleMarker(marker._prev, marker._next);
-
-		} else if (!marker._prev) {
-			marker._next._middleLeft = null;
-
-		} else if (!marker._next) {
-			marker._prev._middleRight = null;
-		}
-
-		this._fireEdit();
-	},
-
-	_onTouchMove: function (e) {
-
-		var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]),
-			latlng = this._map.layerPointToLatLng(layerPoint),
-			marker = e.target;
-
-		L.extend(marker._origLatLng, latlng);
-
-		if (marker._middleLeft) {
-			marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
-		}
-		if (marker._middleRight) {
-			marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
-		}
-
-		this._poly.redraw();
-		this.updateMarkers();
-	},
-
-	_updateIndexes: function (index, delta) {
-		this._markerGroup.eachLayer(function (marker) {
-			if (marker._index > index) {
-				marker._index += delta;
-			}
-		});
-	},
-
-	_createMiddleMarker: function (marker1, marker2) {
-		var latlng = this._getMiddleLatLng(marker1, marker2),
-			marker = this._createMarker(latlng),
-			onClick,
-			onDragStart,
-			onDragEnd;
-
-		marker.setOpacity(0.6);
-
-		marker1._middleRight = marker2._middleLeft = marker;
-
-		onDragStart = function () {
-			marker.off('touchmove', onDragStart, this);
-			var i = marker2._index;
-
-			marker._index = i;
-
-			marker
-				.off('click', onClick, this)
-				.on('click', this._onMarkerClick, this);
-
-			latlng.lat = marker.getLatLng().lat;
-			latlng.lng = marker.getLatLng().lng;
-			this._spliceLatLngs(i, 0, latlng);
-			this._markers.splice(i, 0, marker);
-
-			marker.setOpacity(1);
-
-			this._updateIndexes(i, 1);
-			marker2._index++;
-			this._updatePrevNext(marker1, marker);
-			this._updatePrevNext(marker, marker2);
-
-			this._poly.fire('editstart');
-		};
-
-		onDragEnd = function () {
-			marker.off('dragstart', onDragStart, this);
-			marker.off('dragend', onDragEnd, this);
-			marker.off('touchmove', onDragStart, this);
-
-			this._createMiddleMarker(marker1, marker);
-			this._createMiddleMarker(marker, marker2);
-		};
-
-		onClick = function () {
-			onDragStart.call(this);
-			onDragEnd.call(this);
-			this._fireEdit();
-		};
-
-		marker
-			.on('click', onClick, this)
-			.on('dragstart', onDragStart, this)
-			.on('dragend', onDragEnd, this)
-			.on('touchmove', onDragStart, this);
-
-		this._markerGroup.addLayer(marker);
-	},
-
-	_updatePrevNext: function (marker1, marker2) {
-		if (marker1) {
-			marker1._next = marker2;
-		}
-		if (marker2) {
-			marker2._prev = marker1;
-		}
-	},
-
-	_getMiddleLatLng: function (marker1, marker2) {
-		var map = this._poly._map,
-			p1 = map.project(marker1.getLatLng()),
-			p2 = map.project(marker2.getLatLng());
-
-		return map.unproject(p1._add(p2)._divideBy(2));
-	}
-});
-
-L.Polyline.addInitHook(function () {
-
-	// Check to see if handler has already been initialized. This is to support versions of Leaflet that still have L.Handler.PolyEdit
-	if (this.editing) {
-		return;
-	}
-
-	if (L.Edit.Poly) {
-
-		this.editing = new L.Edit.Poly(this, this.options.poly);
-
-		if (this.options.editable) {
-			this.editing.enable();
-		}
-	}
-
-	this.on('add', function () {
-		if (this.editing && this.editing.enabled()) {
-			this.editing.addHooks();
-		}
-	});
-
-	this.on('remove', function () {
-		if (this.editing && this.editing.enabled()) {
-			this.editing.removeHooks();
-		}
-	});
-});
--- a/src/pyams_gis/resources/js/Edit.Poly.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-L.Edit=L.Edit||{};L.Edit.Poly=L.Handler.extend({options:{},initialize:function(b,a){this.latlngs=[b._latlngs];if(b._holes){this.latlngs=this.latlngs.concat(b._holes)}this._poly=b;L.setOptions(this,a);this._poly.on("revert-edited",this._updateLatLngs,this)},_defaultShape:function(){if(!L.Polyline._flat){return this._poly._latlngs}return L.Polyline._flat(this._poly._latlngs)?this._poly._latlngs:this._poly._latlngs[0]},_eachVertexHandler:function(b){for(var a=0;a<this._verticesHandlers.length;a++){b(this._verticesHandlers[a])}},addHooks:function(){this._initHandlers();this._eachVertexHandler(function(a){a.addHooks()})},removeHooks:function(){this._eachVertexHandler(function(a){a.removeHooks()})},updateMarkers:function(){this._eachVertexHandler(function(a){a.updateMarkers()})},_initHandlers:function(){this._verticesHandlers=[];for(var a=0;a<this.latlngs.length;a++){this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(this._poly,this.latlngs[a],this.options))}},_updateLatLngs:function(a){this.latlngs=[a.layer._latlngs];if(a.layer._holes){this.latlngs=this.latlngs.concat(a.layer._holes)}}});L.Edit.PolyVerticesEdit=L.Handler.extend({options:{icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"}),drawError:{color:"#b00b00",timeout:1000}},initialize:function(c,a,b){if(L.Browser.touch){this.options.icon=this.options.touchIcon}this._poly=c;if(b&&b.drawError){b.drawError=L.Util.extend({},this.options.drawError,b.drawError)}this._latlngs=a;L.setOptions(this,b)},_defaultShape:function(){if(!L.Polyline._flat){return this._latlngs}return L.Polyline._flat(this._latlngs)?this._latlngs:this._latlngs[0]},addHooks:function(){var a=this._poly;if(!(a instanceof L.Polygon)){a.options.fill=false;if(a.options.editing){a.options.editing.fill=false}}a.setStyle(a.options.editing);if(this._poly._map){this._map=this._poly._map;if(!this._markerGroup){this._initMarkers()}this._poly._map.addLayer(this._markerGroup)}},removeHooks:function(){var a=this._poly;a.setStyle(a.options.original);if(a._map){a._map.removeLayer(this._markerGroup);delete this._markerGroup;delete this._markers}},updateMarkers:function(){this._markerGroup.clearLayers();this._initMarkers()},_initMarkers:function(){if(!this._markerGroup){this._markerGroup=new L.LayerGroup()}this._markers=[];var b=this._defaultShape(),g,f,a,c;for(g=0,a=b.length;g<a;g++){c=this._createMarker(b[g],g);c.on("click",this._onMarkerClick,this);this._markers.push(c)}var e,d;for(g=0,f=a-1;g<a;f=g++){if(g===0&&!(L.Polygon&&(this._poly instanceof L.Polygon))){continue}e=this._markers[f];d=this._markers[g];this._createMiddleMarker(e,d);this._updatePrevNext(e,d)}},_createMarker:function(c,b){var a=new L.Marker.Touch(c,{draggable:true,icon:this.options.icon,});a._origLatLng=c;a._index=b;a.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._fireEdit,this).on("touchmove",this._onTouchMove,this).on("touchend",this._fireEdit,this).on("MSPointerMove",this._onTouchMove,this).on("MSPointerUp",this._fireEdit,this);this._markerGroup.addLayer(a);return a},_onMarkerDragStart:function(){this._poly.fire("editstart")},_spliceLatLngs:function(){var a=this._defaultShape();var b=[].splice.apply(a,arguments);this._poly._convertLatLngs(a,true);this._poly.redraw();return b},_removeMarker:function(a){var b=a._index;this._markerGroup.removeLayer(a);this._markers.splice(b,1);this._spliceLatLngs(b,1);this._updateIndexes(b,-1);a.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._fireEdit,this).off("touchmove",this._onMarkerDrag,this).off("touchend",this._fireEdit,this).off("click",this._onMarkerClick,this).off("MSPointerMove",this._onTouchMove,this).off("MSPointerUp",this._fireEdit,this)},_fireEdit:function(){this._poly.edited=true;this._poly.fire("edit");this._poly._map.fire(L.Draw.Event.EDITVERTEX,{layers:this._markerGroup,poly:this._poly})},_onMarkerDrag:function(f){var a=f.target;var d=this._poly;L.extend(a._origLatLng,a._latlng);if(a._middleLeft){a._middleLeft.setLatLng(this._getMiddleLatLng(a._prev,a))}if(a._middleRight){a._middleRight.setLatLng(this._getMiddleLatLng(a,a._next))}if(d.options.poly){var c=d._map._editTooltip;if(!d.options.poly.allowIntersection&&d.intersects()){var b=d.options.color;d.setStyle({color:this.options.drawError.color});if(L.version.indexOf("0.7")!==0){a.dragging._draggable._onUp(f)}this._onMarkerClick(f);if(c){c.updateContent({text:L.drawLocal.draw.handlers.polyline.error})}setTimeout(function(){d.setStyle({color:b});if(c){c.updateContent({text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext})}},1000)}}this._poly.redraw();this._poly.fire("editdrag")},_onMarkerClick:function(c){var b=L.Polygon&&(this._poly instanceof L.Polygon)?4:3,a=c.target;if(this._defaultShape().length<b){return}this._removeMarker(a);this._updatePrevNext(a._prev,a._next);if(a._middleLeft){this._markerGroup.removeLayer(a._middleLeft)}if(a._middleRight){this._markerGroup.removeLayer(a._middleRight)}if(a._prev&&a._next){this._createMiddleMarker(a._prev,a._next)}else{if(!a._prev){a._next._middleLeft=null}else{if(!a._next){a._prev._middleRight=null}}}this._fireEdit()},_onTouchMove:function(c){var b=this._map.mouseEventToLayerPoint(c.originalEvent.touches[0]),d=this._map.layerPointToLatLng(b),a=c.target;L.extend(a._origLatLng,d);if(a._middleLeft){a._middleLeft.setLatLng(this._getMiddleLatLng(a._prev,a))}if(a._middleRight){a._middleRight.setLatLng(this._getMiddleLatLng(a,a._next))}this._poly.redraw();this.updateMarkers()},_updateIndexes:function(a,b){this._markerGroup.eachLayer(function(c){if(c._index>a){c._index+=b}})},_createMiddleMarker:function(f,d){var g=this._getMiddleLatLng(f,d),a=this._createMarker(g),e,c,b;a.setOpacity(0.6);f._middleRight=d._middleLeft=a;c=function(){a.off("touchmove",c,this);var h=d._index;a._index=h;a.off("click",e,this).on("click",this._onMarkerClick,this);g.lat=a.getLatLng().lat;g.lng=a.getLatLng().lng;this._spliceLatLngs(h,0,g);this._markers.splice(h,0,a);a.setOpacity(1);this._updateIndexes(h,1);d._index++;this._updatePrevNext(f,a);this._updatePrevNext(a,d);this._poly.fire("editstart")};b=function(){a.off("dragstart",c,this);a.off("dragend",b,this);a.off("touchmove",c,this);this._createMiddleMarker(f,a);this._createMiddleMarker(a,d)};e=function(){c.call(this);b.call(this);this._fireEdit()};a.on("click",e,this).on("dragstart",c,this).on("dragend",b,this).on("touchmove",c,this);this._markerGroup.addLayer(a)},_updatePrevNext:function(b,a){if(b){b._next=a}if(a){a._prev=b}},_getMiddleLatLng:function(e,c){var b=this._poly._map,d=b.project(e.getLatLng()),a=b.project(c.getLatLng());return b.unproject(d._add(a)._divideBy(2))}});L.Polyline.addInitHook(function(){if(this.editing){return}if(L.Edit.Poly){this.editing=new L.Edit.Poly(this,this.options.poly);if(this.options.editable){this.editing.enable()}}this.on("add",function(){if(this.editing&&this.editing.enabled()){this.editing.addHooks()}});this.on("remove",function(){if(this.editing&&this.editing.enabled()){this.editing.removeHooks()}})});
\ No newline at end of file
--- a/src/pyams_gis/resources/js/Edit.Rectangle.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,125 +0,0 @@
-L.Edit = L.Edit || {};
-/**
- * @class L.Edit.Rectangle
- * @aka Edit.Rectangle
- * @inherits L.Edit.SimpleShape
- */
-L.Edit.Rectangle = L.Edit.SimpleShape.extend({
-	_createMoveMarker: function () {
-		var bounds = this._shape.getBounds(),
-			center = bounds.getCenter();
-
-		this._moveMarker = this._createMarker(center, this.options.moveIcon);
-	},
-
-	_createResizeMarker: function () {
-		var corners = this._getCorners();
-
-		this._resizeMarkers = [];
-
-		for (var i = 0, l = corners.length; i < l; i++) {
-			this._resizeMarkers.push(this._createMarker(corners[i], this.options.resizeIcon));
-			// Monkey in the corner index as we will need to know this for dragging
-			this._resizeMarkers[i]._cornerIndex = i;
-		}
-	},
-
-	_onMarkerDragStart: function (e) {
-		L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e);
-
-		// Save a reference to the opposite point
-		var corners = this._getCorners(),
-			marker = e.target,
-			currentCornerIndex = marker._cornerIndex;
-
-		this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];
-
-		this._toggleCornerMarkers(0, currentCornerIndex);
-	},
-
-	_onMarkerDragEnd: function (e) {
-		var marker = e.target,
-			bounds, center;
-
-		// Reset move marker position to the center
-		if (marker === this._moveMarker) {
-			bounds = this._shape.getBounds();
-			center = bounds.getCenter();
-
-			marker.setLatLng(center);
-		}
-
-		this._toggleCornerMarkers(1);
-
-		this._repositionCornerMarkers();
-
-		L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this, e);
-	},
-
-	_move: function (newCenter) {
-		var latlngs = this._shape._defaultShape ? this._shape._defaultShape() : this._shape.getLatLngs(),
-			bounds = this._shape.getBounds(),
-			center = bounds.getCenter(),
-			offset, newLatLngs = [];
-
-		// Offset the latlngs to the new center
-		for (var i = 0, l = latlngs.length; i < l; i++) {
-			offset = [latlngs[i].lat - center.lat, latlngs[i].lng - center.lng];
-			newLatLngs.push([newCenter.lat + offset[0], newCenter.lng + offset[1]]);
-		}
-
-		this._shape.setLatLngs(newLatLngs);
-
-		// Reposition the resize markers
-		this._repositionCornerMarkers();
-
-		this._map.fire(L.Draw.Event.EDITMOVE, { layer: this._shape });
-	},
-
-	_resize: function (latlng) {
-		var bounds;
-
-		// Update the shape based on the current position of this corner and the opposite point
-		this._shape.setBounds(L.latLngBounds(latlng, this._oppositeCorner));
-
-		// Reposition the move marker
-		bounds = this._shape.getBounds();
-		this._moveMarker.setLatLng(bounds.getCenter());
-
-		this._map.fire(L.Draw.Event.EDITRESIZE, { layer: this._shape });
-	},
-
-	_getCorners: function () {
-		var bounds = this._shape.getBounds(),
-			nw = bounds.getNorthWest(),
-			ne = bounds.getNorthEast(),
-			se = bounds.getSouthEast(),
-			sw = bounds.getSouthWest();
-
-		return [nw, ne, se, sw];
-	},
-
-	_toggleCornerMarkers: function (opacity) {
-		for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
-			this._resizeMarkers[i].setOpacity(opacity);
-		}
-	},
-
-	_repositionCornerMarkers: function () {
-		var corners = this._getCorners();
-
-		for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
-			this._resizeMarkers[i].setLatLng(corners[i]);
-		}
-	}
-});
-
-L.Rectangle.addInitHook(function () {
-	if (L.Edit.Rectangle) {
-		this.editing = new L.Edit.Rectangle(this);
-
-		if (this.options.editable) {
-			this.editing.enable();
-		}
-	}
-});
--- a/src/pyams_gis/resources/js/Edit.Rectangle.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-L.Edit=L.Edit||{};L.Edit.Rectangle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var b=this._shape.getBounds(),a=b.getCenter();this._moveMarker=this._createMarker(a,this.options.moveIcon)},_createResizeMarker:function(){var b=this._getCorners();this._resizeMarkers=[];for(var c=0,a=b.length;c<a;c++){this._resizeMarkers.push(this._createMarker(b[c],this.options.resizeIcon));this._resizeMarkers[c]._cornerIndex=c}},_onMarkerDragStart:function(d){L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,d);var b=this._getCorners(),a=d.target,c=a._cornerIndex;this._oppositeCorner=b[(c+2)%4];this._toggleCornerMarkers(0,c)},_onMarkerDragEnd:function(d){var b=d.target,c,a;if(b===this._moveMarker){c=this._shape.getBounds();a=c.getCenter();b.setLatLng(a)}this._toggleCornerMarkers(1);this._repositionCornerMarkers();L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this,d)},_move:function(d){var b=this._shape._defaultShape?this._shape._defaultShape():this._shape.getLatLngs(),g=this._shape.getBounds(),a=g.getCenter(),h,f=[];for(var e=0,c=b.length;e<c;e++){h=[b[e].lat-a.lat,b[e].lng-a.lng];f.push([d.lat+h[0],d.lng+h[1]])}this._shape.setLatLngs(f);this._repositionCornerMarkers();this._map.fire(L.Draw.Event.EDITMOVE,{layer:this._shape})},_resize:function(b){var a;this._shape.setBounds(L.latLngBounds(b,this._oppositeCorner));a=this._shape.getBounds();this._moveMarker.setLatLng(a.getCenter());this._map.fire(L.Draw.Event.EDITRESIZE,{layer:this._shape})},_getCorners:function(){var c=this._shape.getBounds(),b=c.getNorthWest(),e=c.getNorthEast(),d=c.getSouthEast(),a=c.getSouthWest();return[b,e,d,a]},_toggleCornerMarkers:function(b){for(var c=0,a=this._resizeMarkers.length;c<a;c++){this._resizeMarkers[c].setOpacity(b)}},_repositionCornerMarkers:function(){var b=this._getCorners();for(var c=0,a=this._resizeMarkers.length;c<a;c++){this._resizeMarkers[c].setLatLng(b[c])}}});L.Rectangle.addInitHook(function(){if(L.Edit.Rectangle){this.editing=new L.Edit.Rectangle(this);if(this.options.editable){this.editing.enable()}}});
\ No newline at end of file
--- a/src/pyams_gis/resources/js/Edit.SimpleShape.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,229 +0,0 @@
-L.Edit = L.Edit || {};
-/**
- * @class L.Edit.SimpleShape
- * @aka Edit.SimpleShape
- */
-L.Edit.SimpleShape = L.Handler.extend({
-	options: {
-		moveIcon: new L.DivIcon({
-			iconSize: new L.Point(8, 8),
-			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move'
-		}),
-		resizeIcon: new L.DivIcon({
-			iconSize: new L.Point(8, 8),
-			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize'
-		}),
-		touchMoveIcon: new L.DivIcon({
-			iconSize: new L.Point(20, 20),
-			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon'
-		}),
-		touchResizeIcon: new L.DivIcon({
-			iconSize: new L.Point(20, 20),
-			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon'
-		}),
-	},
-
-	// @method intialize(): void
-	initialize: function (shape, options) {
-		// if touch, switch to touch icon
-		if (L.Browser.touch) {
-			this.options.moveIcon = this.options.touchMoveIcon;
-			this.options.resizeIcon = this.options.touchResizeIcon;
-		}
-
-		this._shape = shape;
-		L.Util.setOptions(this, options);
-	},
-
-	// @method addHooks(): void
-	// Add listener hooks to this handler
-	addHooks: function () {
-		var shape = this._shape;
-		if (this._shape._map) {
-			this._map = this._shape._map;
-			shape.setStyle(shape.options.editing);
-
-			if (shape._map) {
-				this._map = shape._map;
-				if (!this._markerGroup) {
-					this._initMarkers();
-				}
-				this._map.addLayer(this._markerGroup);
-			}
-		}
-	},
-
-	// @method removeHooks(): void
-	// Remove listener hooks from this handler
-	removeHooks: function () {
-		var shape = this._shape;
-
-		shape.setStyle(shape.options.original);
-
-		if (shape._map) {
-			this._unbindMarker(this._moveMarker);
-
-			for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
-				this._unbindMarker(this._resizeMarkers[i]);
-			}
-			this._resizeMarkers = null;
-
-			this._map.removeLayer(this._markerGroup);
-			delete this._markerGroup;
-		}
-
-		this._map = null;
-	},
-
-	// @method updateMarkers(): void
-	// Remove the edit markers from this layer
-	updateMarkers: function () {
-		this._markerGroup.clearLayers();
-		this._initMarkers();
-	},
-
-	_initMarkers: function () {
-		if (!this._markerGroup) {
-			this._markerGroup = new L.LayerGroup();
-		}
-
-		// Create center marker
-		this._createMoveMarker();
-
-		// Create edge marker
-		this._createResizeMarker();
-	},
-
-	_createMoveMarker: function () {
-		// Children override
-	},
-
-	_createResizeMarker: function () {
-		// Children override
-	},
-
-	_createMarker: function (latlng, icon) {
-		// Extending L.Marker in TouchEvents.js to include touch.
-		var marker = new L.Marker.Touch(latlng, {
-			draggable: true,
-			icon: icon,
-			zIndexOffset: 10
-		});
-
-		this._bindMarker(marker);
-
-		this._markerGroup.addLayer(marker);
-
-		return marker;
-	},
-
-	_bindMarker: function (marker) {
-		marker
-			.on('dragstart', this._onMarkerDragStart, this)
-			.on('drag', this._onMarkerDrag, this)
-			.on('dragend', this._onMarkerDragEnd, this)
-			.on('touchstart', this._onTouchStart, this)
-			.on('touchmove', this._onTouchMove, this)
-			.on('MSPointerMove', this._onTouchMove, this)
-			.on('touchend', this._onTouchEnd, this)
-			.on('MSPointerUp', this._onTouchEnd, this);
-	},
-
-	_unbindMarker: function (marker) {
-		marker
-			.off('dragstart', this._onMarkerDragStart, this)
-			.off('drag', this._onMarkerDrag, this)
-			.off('dragend', this._onMarkerDragEnd, this)
-			.off('touchstart', this._onTouchStart, this)
-			.off('touchmove', this._onTouchMove, this)
-			.off('MSPointerMove', this._onTouchMove, this)
-			.off('touchend', this._onTouchEnd, this)
-			.off('MSPointerUp', this._onTouchEnd, this);
-	},
-
-	_onMarkerDragStart: function (e) {
-		var marker = e.target;
-		marker.setOpacity(0);
-
-		this._shape.fire('editstart');
-	},
-
-	_fireEdit: function () {
-		this._shape.edited = true;
-		this._shape.fire('edit');
-	},
-
-	_onMarkerDrag: function (e) {
-		var marker = e.target,
-			latlng = marker.getLatLng();
-
-		if (marker === this._moveMarker) {
-			this._move(latlng);
-		} else {
-			this._resize(latlng);
-		}
-
-		this._shape.redraw();
-		this._shape.fire('editdrag');
-	},
-
-	_onMarkerDragEnd: function (e) {
-		var marker = e.target;
-		marker.setOpacity(1);
-
-		this._fireEdit();
-	},
-
-	_onTouchStart: function (e) {
-		L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e);
-
-		if (typeof(this._getCorners) === 'function') {
-			// Save a reference to the opposite point
-			var corners = this._getCorners(),
-				marker = e.target,
-				currentCornerIndex = marker._cornerIndex;
-
-			marker.setOpacity(0);
-
-			// Copyed from Edit.Rectangle.js line 23 _onMarkerDragStart()
-			// Latlng is null otherwise.
-			this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];
-			this._toggleCornerMarkers(0, currentCornerIndex);
-		}
-
-		this._shape.fire('editstart');
-	},
-
-	_onTouchMove: function (e) {
-		var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]),
-			latlng = this._map.layerPointToLatLng(layerPoint),
-			marker = e.target;
-
-		if (marker === this._moveMarker) {
-			this._move(latlng);
-		} else {
-			this._resize(latlng);
-		}
-
-		this._shape.redraw();
-
-		// prevent touchcancel in IOS
-		// e.preventDefault();
-		return false;
-	},
-
-	_onTouchEnd: function (e) {
-		var marker = e.target;
-		marker.setOpacity(1);
-		this.updateMarkers();
-		this._fireEdit();
-	},
-
-	_move: function () {
-		// Children override
-	},
-
-	_resize: function () {
-		// Children override
-	}
-});
--- a/src/pyams_gis/resources/js/Edit.SimpleShape.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-L.Edit=L.Edit||{};L.Edit.SimpleShape=L.Handler.extend({options:{moveIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move"}),resizeIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize"}),touchMoveIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon"}),touchResizeIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon"}),},initialize:function(a,b){if(L.Browser.touch){this.options.moveIcon=this.options.touchMoveIcon;this.options.resizeIcon=this.options.touchResizeIcon}this._shape=a;L.Util.setOptions(this,b)},addHooks:function(){var a=this._shape;if(this._shape._map){this._map=this._shape._map;a.setStyle(a.options.editing);if(a._map){this._map=a._map;if(!this._markerGroup){this._initMarkers()}this._map.addLayer(this._markerGroup)}}},removeHooks:function(){var b=this._shape;b.setStyle(b.options.original);if(b._map){this._unbindMarker(this._moveMarker);for(var c=0,a=this._resizeMarkers.length;c<a;c++){this._unbindMarker(this._resizeMarkers[c])}this._resizeMarkers=null;this._map.removeLayer(this._markerGroup);delete this._markerGroup}this._map=null},updateMarkers:function(){this._markerGroup.clearLayers();this._initMarkers()},_initMarkers:function(){if(!this._markerGroup){this._markerGroup=new L.LayerGroup()}this._createMoveMarker();this._createResizeMarker()},_createMoveMarker:function(){},_createResizeMarker:function(){},_createMarker:function(c,b){var a=new L.Marker.Touch(c,{draggable:true,icon:b,zIndexOffset:10});this._bindMarker(a);this._markerGroup.addLayer(a);return a},_bindMarker:function(a){a.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._onMarkerDragEnd,this).on("touchstart",this._onTouchStart,this).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onTouchEnd,this).on("MSPointerUp",this._onTouchEnd,this)},_unbindMarker:function(a){a.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._onMarkerDragEnd,this).off("touchstart",this._onTouchStart,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onTouchEnd,this).off("MSPointerUp",this._onTouchEnd,this)},_onMarkerDragStart:function(b){var a=b.target;a.setOpacity(0);this._shape.fire("editstart")},_fireEdit:function(){this._shape.edited=true;this._shape.fire("edit")},_onMarkerDrag:function(b){var a=b.target,c=a.getLatLng();if(a===this._moveMarker){this._move(c)}else{this._resize(c)}this._shape.redraw();this._shape.fire("editdrag")},_onMarkerDragEnd:function(b){var a=b.target;a.setOpacity(1);this._fireEdit()},_onTouchStart:function(d){L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,d);if(typeof(this._getCorners)==="function"){var b=this._getCorners(),a=d.target,c=a._cornerIndex;a.setOpacity(0);this._oppositeCorner=b[(c+2)%4];this._toggleCornerMarkers(0,c)}this._shape.fire("editstart")},_onTouchMove:function(c){var b=this._map.mouseEventToLayerPoint(c.originalEvent.touches[0]),d=this._map.layerPointToLatLng(b),a=c.target;if(a===this._moveMarker){this._move(d)}else{this._resize(d)}this._shape.redraw();return false},_onTouchEnd:function(b){var a=b.target;a.setOpacity(1);this.updateMarkers();this._fireEdit()},_move:function(){},_resize:function(){}});
\ No newline at end of file
--- a/src/pyams_gis/resources/js/TouchEvents.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,272 +0,0 @@
-L.Map.mergeOptions({
-	touchExtend: true
-});
-
-/**
- * @class L.Map.TouchExtend
- * @aka TouchExtend
- */
-L.Map.TouchExtend = L.Handler.extend({
-
-	// @method initialize(): void
-	// Sets TouchExtend private accessor variables
-	initialize: function (map) {
-		this._map = map;
-		this._container = map._container;
-		this._pane = map._panes.overlayPane;
-	},
-
-	// @method addHooks(): void
-	// Adds dom listener events to the map container
-	addHooks: function () {
-		L.DomEvent.on(this._container, 'touchstart', this._onTouchStart, this);
-		L.DomEvent.on(this._container, 'touchend', this._onTouchEnd, this);
-		L.DomEvent.on(this._container, 'touchmove', this._onTouchMove, this);
-		if (this._detectIE()) {
-			L.DomEvent.on(this._container, 'MSPointerDown', this._onTouchStart, this);
-			L.DomEvent.on(this._container, 'MSPointerUp', this._onTouchEnd, this);
-			L.DomEvent.on(this._container, 'MSPointerMove', this._onTouchMove, this);
-			L.DomEvent.on(this._container, 'MSPointerCancel', this._onTouchCancel, this);
-
-		} else {
-			L.DomEvent.on(this._container, 'touchcancel', this._onTouchCancel, this);
-			L.DomEvent.on(this._container, 'touchleave', this._onTouchLeave, this);
-		}
-	},
-
-	// @method removeHooks(): void
-	// Removes dom listener events from the map container
-	removeHooks: function () {
-		L.DomEvent.off(this._container, 'touchstart', this._onTouchStart);
-		L.DomEvent.off(this._container, 'touchend', this._onTouchEnd);
-		L.DomEvent.off(this._container, 'touchmove', this._onTouchMove);
-		if (this._detectIE()) {
-			L.DomEvent.off(this._container, 'MSPointerDowm', this._onTouchStart);
-			L.DomEvent.off(this._container, 'MSPointerUp', this._onTouchEnd);
-			L.DomEvent.off(this._container, 'MSPointerMove', this._onTouchMove);
-			L.DomEvent.off(this._container, 'MSPointerCancel', this._onTouchCancel);
-		} else {
-			L.DomEvent.off(this._container, 'touchcancel', this._onTouchCancel);
-			L.DomEvent.off(this._container, 'touchleave', this._onTouchLeave);
-		}
-	},
-
-	_touchEvent: function (e, type) {
-		// #TODO: fix the pageX error that is do a bug in Android where a single touch triggers two click events
-		// _filterClick is what leaflet uses as a workaround.
-		// This is a problem with more things than just android. Another problem is touchEnd has no touches in
-		// its touch list.
-		var touchEvent = {};
-		if (typeof e.touches !== 'undefined') {
-			if (!e.touches.length) {
-				return;
-			}
-			touchEvent = e.touches[0];
-		} else if (e.pointerType === 'touch') {
-			touchEvent = e;
-			if (!this._filterClick(e)) {
-				return;
-			}
-		} else {
-			return;
-		}
-
-		var containerPoint = this._map.mouseEventToContainerPoint(touchEvent),
-			layerPoint = this._map.mouseEventToLayerPoint(touchEvent),
-			latlng = this._map.layerPointToLatLng(layerPoint);
-
-		this._map.fire(type, {
-			latlng: latlng,
-			layerPoint: layerPoint,
-			containerPoint: containerPoint,
-			pageX: touchEvent.pageX,
-			pageY: touchEvent.pageY,
-			originalEvent: e
-		});
-	},
-
-	/** Borrowed from Leaflet and modified for bool ops **/
-	_filterClick: function (e) {
-		var timeStamp = (e.timeStamp || e.originalEvent.timeStamp),
-			elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);
-
-		// are they closer together than 500ms yet more than 100ms?
-		// Android typically triggers them ~300ms apart while multiple listeners
-		// on the same event should be triggered far faster;
-		// or check if click is simulated on the element, and if it is, reject any non-simulated events
-		if ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) {
-			L.DomEvent.stop(e);
-			return false;
-		}
-		L.DomEvent._lastClick = timeStamp;
-		return true;
-	},
-
-	_onTouchStart: function (e) {
-		if (!this._map._loaded) {
-			return;
-		}
-
-		var type = 'touchstart';
-		this._touchEvent(e, type);
-
-	},
-
-	_onTouchEnd: function (e) {
-		if (!this._map._loaded) {
-			return;
-		}
-
-		var type = 'touchend';
-		this._touchEvent(e, type);
-	},
-
-	_onTouchCancel: function (e) {
-		if (!this._map._loaded) {
-			return;
-		}
-
-		var type = 'touchcancel';
-		if (this._detectIE()) {
-			type = 'pointercancel';
-		}
-		this._touchEvent(e, type);
-	},
-
-	_onTouchLeave: function (e) {
-		if (!this._map._loaded) {
-			return;
-		}
-
-		var type = 'touchleave';
-		this._touchEvent(e, type);
-	},
-
-	_onTouchMove: function (e) {
-		if (!this._map._loaded) {
-			return;
-		}
-
-		var type = 'touchmove';
-		this._touchEvent(e, type);
-	},
-
-	_detectIE: function () {
-		var ua = window.navigator.userAgent;
-
-		var msie = ua.indexOf('MSIE ');
-		if (msie > 0) {
-			// IE 10 or older => return version number
-			return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
-		}
-
-		var trident = ua.indexOf('Trident/');
-		if (trident > 0) {
-			// IE 11 => return version number
-			var rv = ua.indexOf('rv:');
-			return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
-		}
-
-		var edge = ua.indexOf('Edge/');
-		if (edge > 0) {
-			// IE 12 => return version number
-			return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
-		}
-
-		// other browser
-		return false;
-	}
-});
-
-L.Map.addInitHook('addHandler', 'touchExtend', L.Map.TouchExtend);
-
-
-/**
- * @class L.Marker.Touch
- * @aka Marker.Touch
- *
- * This isn't full Touch support. This is just to get markers to also support dom touch events after creation
- * #TODO: find a better way of getting markers to support touch.
- */
-L.Marker.Touch = L.Marker.extend({
-
-	_initInteraction: function () {
-		if (!this.addInteractiveTarget) {
-			// 0.7.x support
-			return this._initInteractionLegacy();
-		}
-		// TODO this may need be updated to re-add touch events for 1.0+
-		return L.Marker.prototype._initInteraction.apply(this);
-	},
-
-	// This is an exact copy of https://github.com/Leaflet/Leaflet/blob/v0.7/src/layer/marker/Marker.js
-	// with the addition of the touch events
-	_initInteractionLegacy: function () {
-
-		if (!this.options.clickable) {
-			return;
-		}
-
-		// TODO refactor into something shared with Map/Path/etc. to DRY it up
-
-		var icon = this._icon,
-			events = ['dblclick',
-					  'mousedown',
-					  'mouseover',
-					  'mouseout',
-					  'contextmenu',
-					  'touchstart',
-					  'touchend',
-					  'touchmove'];
-		if (this._detectIE) {
-			events.concat(['MSPointerDown',
-						   'MSPointerUp',
-						   'MSPointerMove',
-						   'MSPointerCancel']);
-		} else {
-			events.concat(['touchcancel']);
-		}
-
-		L.DomUtil.addClass(icon, 'leaflet-clickable');
-		L.DomEvent.on(icon, 'click', this._onMouseClick, this);
-		L.DomEvent.on(icon, 'keypress', this._onKeyPress, this);
-
-		for (var i = 0; i < events.length; i++) {
-			L.DomEvent.on(icon, events[i], this._fireMouseEvent, this);
-		}
-
-		if (L.Handler.MarkerDrag) {
-			this.dragging = new L.Handler.MarkerDrag(this);
-
-			if (this.options.draggable) {
-				this.dragging.enable();
-			}
-		}
-	},
-
-	_detectIE: function () {
-		var ua = window.navigator.userAgent;
-
-		var msie = ua.indexOf('MSIE ');
-		if (msie > 0) {
-			// IE 10 or older => return version number
-			return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
-		}
-
-		var trident = ua.indexOf('Trident/');
-		if (trident > 0) {
-			// IE 11 => return version number
-			var rv = ua.indexOf('rv:');
-			return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
-		}
-
-		var edge = ua.indexOf('Edge/');
-		if (edge > 0) {
-			// IE 12 => return version number
-			return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
-		}
-
-		// other browser
-		return false;
-	}
-});
--- a/src/pyams_gis/resources/js/TouchEvents.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-L.Map.mergeOptions({touchExtend:true});L.Map.TouchExtend=L.Handler.extend({initialize:function(a){this._map=a;this._container=a._container;this._pane=a._panes.overlayPane},addHooks:function(){L.DomEvent.on(this._container,"touchstart",this._onTouchStart,this);L.DomEvent.on(this._container,"touchend",this._onTouchEnd,this);L.DomEvent.on(this._container,"touchmove",this._onTouchMove,this);if(this._detectIE()){L.DomEvent.on(this._container,"MSPointerDown",this._onTouchStart,this);L.DomEvent.on(this._container,"MSPointerUp",this._onTouchEnd,this);L.DomEvent.on(this._container,"MSPointerMove",this._onTouchMove,this);L.DomEvent.on(this._container,"MSPointerCancel",this._onTouchCancel,this)}else{L.DomEvent.on(this._container,"touchcancel",this._onTouchCancel,this);L.DomEvent.on(this._container,"touchleave",this._onTouchLeave,this)}},removeHooks:function(){L.DomEvent.off(this._container,"touchstart",this._onTouchStart);L.DomEvent.off(this._container,"touchend",this._onTouchEnd);L.DomEvent.off(this._container,"touchmove",this._onTouchMove);if(this._detectIE()){L.DomEvent.off(this._container,"MSPointerDowm",this._onTouchStart);L.DomEvent.off(this._container,"MSPointerUp",this._onTouchEnd);L.DomEvent.off(this._container,"MSPointerMove",this._onTouchMove);L.DomEvent.off(this._container,"MSPointerCancel",this._onTouchCancel)}else{L.DomEvent.off(this._container,"touchcancel",this._onTouchCancel);L.DomEvent.off(this._container,"touchleave",this._onTouchLeave)}},_touchEvent:function(f,d){var a={};if(typeof f.touches!=="undefined"){if(!f.touches.length){return}a=f.touches[0]}else{if(f.pointerType==="touch"){a=f;if(!this._filterClick(f)){return}}else{return}}var c=this._map.mouseEventToContainerPoint(a),b=this._map.mouseEventToLayerPoint(a),g=this._map.layerPointToLatLng(b);this._map.fire(d,{latlng:g,layerPoint:b,containerPoint:c,pageX:a.pageX,pageY:a.pageY,originalEvent:f})},_filterClick:function(c){var b=(c.timeStamp||c.originalEvent.timeStamp),a=L.DomEvent._lastClick&&(b-L.DomEvent._lastClick);if((a&&a>100&&a<500)||(c.target._simulatedClick&&!c._simulated)){L.DomEvent.stop(c);return false}L.DomEvent._lastClick=b;return true},_onTouchStart:function(b){if(!this._map._loaded){return}var a="touchstart";this._touchEvent(b,a)},_onTouchEnd:function(b){if(!this._map._loaded){return}var a="touchend";this._touchEvent(b,a)},_onTouchCancel:function(b){if(!this._map._loaded){return}var a="touchcancel";if(this._detectIE()){a="pointercancel"}this._touchEvent(b,a)},_onTouchLeave:function(b){if(!this._map._loaded){return}var a="touchleave";this._touchEvent(b,a)},_onTouchMove:function(b){if(!this._map._loaded){return}var a="touchmove";this._touchEvent(b,a)},_detectIE:function(){var c=window.navigator.userAgent;var b=c.indexOf("MSIE ");if(b>0){return parseInt(c.substring(b+5,c.indexOf(".",b)),10)}var a=c.indexOf("Trident/");if(a>0){var e=c.indexOf("rv:");return parseInt(c.substring(e+3,c.indexOf(".",e)),10)}var d=c.indexOf("Edge/");if(d>0){return parseInt(c.substring(d+5,c.indexOf(".",d)),10)}return false}});L.Map.addInitHook("addHandler","touchExtend",L.Map.TouchExtend);L.Marker.Touch=L.Marker.extend({_initInteraction:function(){if(!this.addInteractiveTarget){return this._initInteractionLegacy()}return L.Marker.prototype._initInteraction.apply(this)},_initInteractionLegacy:function(){if(!this.options.clickable){return}var c=this._icon,b=["dblclick","mousedown","mouseover","mouseout","contextmenu","touchstart","touchend","touchmove"];if(this._detectIE){b.concat(["MSPointerDown","MSPointerUp","MSPointerMove","MSPointerCancel"])}else{b.concat(["touchcancel"])}L.DomUtil.addClass(c,"leaflet-clickable");L.DomEvent.on(c,"click",this._onMouseClick,this);L.DomEvent.on(c,"keypress",this._onKeyPress,this);for(var a=0;a<b.length;a++){L.DomEvent.on(c,b[a],this._fireMouseEvent,this)}if(L.Handler.MarkerDrag){this.dragging=new L.Handler.MarkerDrag(this);if(this.options.draggable){this.dragging.enable()}}},_detectIE:function(){var c=window.navigator.userAgent;var b=c.indexOf("MSIE ");if(b>0){return parseInt(c.substring(b+5,c.indexOf(".",b)),10)}var a=c.indexOf("Trident/");if(a>0){var e=c.indexOf("rv:");return parseInt(c.substring(e+3,c.indexOf(".",e)),10)}var d=c.indexOf("Edge/");if(d>0){return parseInt(c.substring(d+5,c.indexOf(".",d)),10)}return false}});
\ No newline at end of file
--- a/src/pyams_gis/resources/js/leaflet-1.0.3.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13251 +0,0 @@
-/*
- Leaflet 1.0.3+ed36a04, a JS library for interactive maps. http://leafletjs.com
- (c) 2010-2016 Vladimir Agafonkin, (c) 2010-2011 CloudMade
-*/
-(function (window, document, undefined) {
-var L = {
-	version: "1.0.3+ed36a04"
-};
-
-function expose() {
-	var oldL = window.L;
-
-	L.noConflict = function () {
-		window.L = oldL;
-		return this;
-	};
-
-	window.L = L;
-}
-
-// define Leaflet for Node module pattern loaders, including Browserify
-if (typeof module === 'object' && typeof module.exports === 'object') {
-	module.exports = L;
-
-// define Leaflet as an AMD module
-} else if (typeof define === 'function' && define.amd) {
-	define(L);
-}
-
-// define Leaflet as a global L variable, saving the original L to restore later if needed
-if (typeof window !== 'undefined') {
-	expose();
-}
-
-
-
-/*
- * @namespace Util
- *
- * Various utility functions, used by Leaflet internally.
- */
-
-L.Util = {
-
-	// @function extend(dest: Object, src?: Object): Object
-	// Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut.
-	extend: function (dest) {
-		var i, j, len, src;
-
-		for (j = 1, len = arguments.length; j < len; j++) {
-			src = arguments[j];
-			for (i in src) {
-				dest[i] = src[i];
-			}
-		}
-		return dest;
-	},
-
-	// @function create(proto: Object, properties?: Object): Object
-	// Compatibility polyfill for [Object.create](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/create)
-	create: Object.create || (function () {
-		function F() {}
-		return function (proto) {
-			F.prototype = proto;
-			return new F();
-		};
-	})(),
-
-	// @function bind(fn: Function, …): Function
-	// Returns a new function bound to the arguments passed, like [Function.prototype.bind](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).
-	// Has a `L.bind()` shortcut.
-	bind: function (fn, obj) {
-		var slice = Array.prototype.slice;
-
-		if (fn.bind) {
-			return fn.bind.apply(fn, slice.call(arguments, 1));
-		}
-
-		var args = slice.call(arguments, 2);
-
-		return function () {
-			return fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments);
-		};
-	},
-
-	// @function stamp(obj: Object): Number
-	// Returns the unique ID of an object, assiging it one if it doesn't have it.
-	stamp: function (obj) {
-		/*eslint-disable */
-		obj._leaflet_id = obj._leaflet_id || ++L.Util.lastId;
-		return obj._leaflet_id;
-		/*eslint-enable */
-	},
-
-	// @property lastId: Number
-	// Last unique ID used by [`stamp()`](#util-stamp)
-	lastId: 0,
-
-	// @function throttle(fn: Function, time: Number, context: Object): Function
-	// Returns a function which executes function `fn` with the given scope `context`
-	// (so that the `this` keyword refers to `context` inside `fn`'s code). The function
-	// `fn` will be called no more than one time per given amount of `time`. The arguments
-	// received by the bound function will be any arguments passed when binding the
-	// function, followed by any arguments passed when invoking the bound function.
-	// Has an `L.bind` shortcut.
-	throttle: function (fn, time, context) {
-		var lock, args, wrapperFn, later;
-
-		later = function () {
-			// reset lock and call if queued
-			lock = false;
-			if (args) {
-				wrapperFn.apply(context, args);
-				args = false;
-			}
-		};
-
-		wrapperFn = function () {
-			if (lock) {
-				// called too soon, queue to call later
-				args = arguments;
-
-			} else {
-				// call and lock until later
-				fn.apply(context, arguments);
-				setTimeout(later, time);
-				lock = true;
-			}
-		};
-
-		return wrapperFn;
-	},
-
-	// @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number
-	// Returns the number `num` modulo `range` in such a way so it lies within
-	// `range[0]` and `range[1]`. The returned value will be always smaller than
-	// `range[1]` unless `includeMax` is set to `true`.
-	wrapNum: function (x, range, includeMax) {
-		var max = range[1],
-		    min = range[0],
-		    d = max - min;
-		return x === max && includeMax ? x : ((x - min) % d + d) % d + min;
-	},
-
-	// @function falseFn(): Function
-	// Returns a function which always returns `false`.
-	falseFn: function () { return false; },
-
-	// @function formatNum(num: Number, digits?: Number): Number
-	// Returns the number `num` rounded to `digits` decimals, or to 5 decimals by default.
-	formatNum: function (num, digits) {
-		var pow = Math.pow(10, digits || 5);
-		return Math.round(num * pow) / pow;
-	},
-
-	// @function trim(str: String): String
-	// Compatibility polyfill for [String.prototype.trim](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)
-	trim: function (str) {
-		return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
-	},
-
-	// @function splitWords(str: String): String[]
-	// Trims and splits the string on whitespace and returns the array of parts.
-	splitWords: function (str) {
-		return L.Util.trim(str).split(/\s+/);
-	},
-
-	// @function setOptions(obj: Object, options: Object): Object
-	// Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut.
-	setOptions: function (obj, options) {
-		if (!obj.hasOwnProperty('options')) {
-			obj.options = obj.options ? L.Util.create(obj.options) : {};
-		}
-		for (var i in options) {
-			obj.options[i] = options[i];
-		}
-		return obj.options;
-	},
-
-	// @function getParamString(obj: Object, existingUrl?: String, uppercase?: Boolean): String
-	// Converts an object into a parameter URL string, e.g. `{a: "foo", b: "bar"}`
-	// translates to `'?a=foo&b=bar'`. If `existingUrl` is set, the parameters will
-	// be appended at the end. If `uppercase` is `true`, the parameter names will
-	// be uppercased (e.g. `'?A=foo&B=bar'`)
-	getParamString: function (obj, existingUrl, uppercase) {
-		var params = [];
-		for (var i in obj) {
-			params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));
-		}
-		return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');
-	},
-
-	// @function template(str: String, data: Object): String
-	// Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'`
-	// and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string
-	// `('Hello foo, bar')`. You can also specify functions instead of strings for
-	// data values — they will be evaluated passing `data` as an argument.
-	template: function (str, data) {
-		return str.replace(L.Util.templateRe, function (str, key) {
-			var value = data[key];
-
-			if (value === undefined) {
-				throw new Error('No value provided for variable ' + str);
-
-			} else if (typeof value === 'function') {
-				value = value(data);
-			}
-			return value;
-		});
-	},
-
-	templateRe: /\{ *([\w_\-]+) *\}/g,
-
-	// @function isArray(obj): Boolean
-	// Compatibility polyfill for [Array.isArray](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray)
-	isArray: Array.isArray || function (obj) {
-		return (Object.prototype.toString.call(obj) === '[object Array]');
-	},
-
-	// @function indexOf(array: Array, el: Object): Number
-	// Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)
-	indexOf: function (array, el) {
-		for (var i = 0; i < array.length; i++) {
-			if (array[i] === el) { return i; }
-		}
-		return -1;
-	},
-
-	// @property emptyImageUrl: String
-	// Data URI string containing a base64-encoded empty GIF image.
-	// Used as a hack to free memory from unused images on WebKit-powered
-	// mobile devices (by setting image `src` to this string).
-	emptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='
-};
-
-(function () {
-	// inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/
-
-	function getPrefixed(name) {
-		return window['webkit' + name] || window['moz' + name] || window['ms' + name];
-	}
-
-	var lastTime = 0;
-
-	// fallback for IE 7-8
-	function timeoutDefer(fn) {
-		var time = +new Date(),
-		    timeToCall = Math.max(0, 16 - (time - lastTime));
-
-		lastTime = time + timeToCall;
-		return window.setTimeout(fn, timeToCall);
-	}
-
-	var requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer,
-	    cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') ||
-	               getPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); };
-
-
-	// @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number
-	// Schedules `fn` to be executed when the browser repaints. `fn` is bound to
-	// `context` if given. When `immediate` is set, `fn` is called immediately if
-	// the browser doesn't have native support for
-	// [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame),
-	// otherwise it's delayed. Returns a request ID that can be used to cancel the request.
-	L.Util.requestAnimFrame = function (fn, context, immediate) {
-		if (immediate && requestFn === timeoutDefer) {
-			fn.call(context);
-		} else {
-			return requestFn.call(window, L.bind(fn, context));
-		}
-	};
-
-	// @function cancelAnimFrame(id: Number): undefined
-	// Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame).
-	L.Util.cancelAnimFrame = function (id) {
-		if (id) {
-			cancelFn.call(window, id);
-		}
-	};
-})();
-
-// shortcuts for most used utility functions
-L.extend = L.Util.extend;
-L.bind = L.Util.bind;
-L.stamp = L.Util.stamp;
-L.setOptions = L.Util.setOptions;
-
-
-
-
-// @class Class
-// @aka L.Class
-
-// @section
-// @uninheritable
-
-// Thanks to John Resig and Dean Edwards for inspiration!
-
-L.Class = function () {};
-
-L.Class.extend = function (props) {
-
-	// @function extend(props: Object): Function
-	// [Extends the current class](#class-inheritance) given the properties to be included.
-	// Returns a Javascript function that is a class constructor (to be called with `new`).
-	var NewClass = function () {
-
-		// call the constructor
-		if (this.initialize) {
-			this.initialize.apply(this, arguments);
-		}
-
-		// call all constructor hooks
-		this.callInitHooks();
-	};
-
-	var parentProto = NewClass.__super__ = this.prototype;
-
-	var proto = L.Util.create(parentProto);
-	proto.constructor = NewClass;
-
-	NewClass.prototype = proto;
-
-	// inherit parent's statics
-	for (var i in this) {
-		if (this.hasOwnProperty(i) && i !== 'prototype') {
-			NewClass[i] = this[i];
-		}
-	}
-
-	// mix static properties into the class
-	if (props.statics) {
-		L.extend(NewClass, props.statics);
-		delete props.statics;
-	}
-
-	// mix includes into the prototype
-	if (props.includes) {
-		L.Util.extend.apply(null, [proto].concat(props.includes));
-		delete props.includes;
-	}
-
-	// merge options
-	if (proto.options) {
-		props.options = L.Util.extend(L.Util.create(proto.options), props.options);
-	}
-
-	// mix given properties into the prototype
-	L.extend(proto, props);
-
-	proto._initHooks = [];
-
-	// add method for calling all hooks
-	proto.callInitHooks = function () {
-
-		if (this._initHooksCalled) { return; }
-
-		if (parentProto.callInitHooks) {
-			parentProto.callInitHooks.call(this);
-		}
-
-		this._initHooksCalled = true;
-
-		for (var i = 0, len = proto._initHooks.length; i < len; i++) {
-			proto._initHooks[i].call(this);
-		}
-	};
-
-	return NewClass;
-};
-
-
-// @function include(properties: Object): this
-// [Includes a mixin](#class-includes) into the current class.
-L.Class.include = function (props) {
-	L.extend(this.prototype, props);
-	return this;
-};
-
-// @function mergeOptions(options: Object): this
-// [Merges `options`](#class-options) into the defaults of the class.
-L.Class.mergeOptions = function (options) {
-	L.extend(this.prototype.options, options);
-	return this;
-};
-
-// @function addInitHook(fn: Function): this
-// Adds a [constructor hook](#class-constructor-hooks) to the class.
-L.Class.addInitHook = function (fn) { // (Function) || (String, args...)
-	var args = Array.prototype.slice.call(arguments, 1);
-
-	var init = typeof fn === 'function' ? fn : function () {
-		this[fn].apply(this, args);
-	};
-
-	this.prototype._initHooks = this.prototype._initHooks || [];
-	this.prototype._initHooks.push(init);
-	return this;
-};
-
-
-
-/*
- * @class Evented
- * @aka L.Evented
- * @inherits Class
- *
- * A set of methods shared between event-powered classes (like `Map` and `Marker`). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire `'click'` event).
- *
- * @example
- *
- * ```js
- * map.on('click', function(e) {
- * 	alert(e.latlng);
- * } );
- * ```
- *
- * Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:
- *
- * ```js
- * function onClick(e) { ... }
- *
- * map.on('click', onClick);
- * map.off('click', onClick);
- * ```
- */
-
-
-L.Evented = L.Class.extend({
-
-	/* @method on(type: String, fn: Function, context?: Object): this
-	 * Adds a listener function (`fn`) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. `'click dblclick'`).
-	 *
-	 * @alternative
-	 * @method on(eventMap: Object): this
-	 * Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`
-	 */
-	on: function (types, fn, context) {
-
-		// types can be a map of types/handlers
-		if (typeof types === 'object') {
-			for (var type in types) {
-				// we don't process space-separated events here for performance;
-				// it's a hot path since Layer uses the on(obj) syntax
-				this._on(type, types[type], fn);
-			}
-
-		} else {
-			// types can be a string of space-separated words
-			types = L.Util.splitWords(types);
-
-			for (var i = 0, len = types.length; i < len; i++) {
-				this._on(types[i], fn, context);
-			}
-		}
-
-		return this;
-	},
-
-	/* @method off(type: String, fn?: Function, context?: Object): this
-	 * Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to `on`, you must pass the same context to `off` in order to remove the listener.
-	 *
-	 * @alternative
-	 * @method off(eventMap: Object): this
-	 * Removes a set of type/listener pairs.
-	 *
-	 * @alternative
-	 * @method off: this
-	 * Removes all listeners to all events on the object.
-	 */
-	off: function (types, fn, context) {
-
-		if (!types) {
-			// clear all listeners if called without arguments
-			delete this._events;
-
-		} else if (typeof types === 'object') {
-			for (var type in types) {
-				this._off(type, types[type], fn);
-			}
-
-		} else {
-			types = L.Util.splitWords(types);
-
-			for (var i = 0, len = types.length; i < len; i++) {
-				this._off(types[i], fn, context);
-			}
-		}
-
-		return this;
-	},
-
-	// attach listener (without syntactic sugar now)
-	_on: function (type, fn, context) {
-		this._events = this._events || {};
-
-		/* get/init listeners for type */
-		var typeListeners = this._events[type];
-		if (!typeListeners) {
-			typeListeners = [];
-			this._events[type] = typeListeners;
-		}
-
-		if (context === this) {
-			// Less memory footprint.
-			context = undefined;
-		}
-		var newListener = {fn: fn, ctx: context},
-		    listeners = typeListeners;
-
-		// check if fn already there
-		for (var i = 0, len = listeners.length; i < len; i++) {
-			if (listeners[i].fn === fn && listeners[i].ctx === context) {
-				return;
-			}
-		}
-
-		listeners.push(newListener);
-	},
-
-	_off: function (type, fn, context) {
-		var listeners,
-		    i,
-		    len;
-
-		if (!this._events) { return; }
-
-		listeners = this._events[type];
-
-		if (!listeners) {
-			return;
-		}
-
-		if (!fn) {
-			// Set all removed listeners to noop so they are not called if remove happens in fire
-			for (i = 0, len = listeners.length; i < len; i++) {
-				listeners[i].fn = L.Util.falseFn;
-			}
-			// clear all listeners for a type if function isn't specified
-			delete this._events[type];
-			return;
-		}
-
-		if (context === this) {
-			context = undefined;
-		}
-
-		if (listeners) {
-
-			// find fn and remove it
-			for (i = 0, len = listeners.length; i < len; i++) {
-				var l = listeners[i];
-				if (l.ctx !== context) { continue; }
-				if (l.fn === fn) {
-
-					// set the removed listener to noop so that's not called if remove happens in fire
-					l.fn = L.Util.falseFn;
-
-					if (this._firingCount) {
-						/* copy array in case events are being fired */
-						this._events[type] = listeners = listeners.slice();
-					}
-					listeners.splice(i, 1);
-
-					return;
-				}
-			}
-		}
-	},
-
-	// @method fire(type: String, data?: Object, propagate?: Boolean): this
-	// Fires an event of the specified type. You can optionally provide an data
-	// object — the first argument of the listener function will contain its
-	// properties. The event can optionally be propagated to event parents.
-	fire: function (type, data, propagate) {
-		if (!this.listens(type, propagate)) { return this; }
-
-		var event = L.Util.extend({}, data, {type: type, target: this});
-
-		if (this._events) {
-			var listeners = this._events[type];
-
-			if (listeners) {
-				this._firingCount = (this._firingCount + 1) || 1;
-				for (var i = 0, len = listeners.length; i < len; i++) {
-					var l = listeners[i];
-					l.fn.call(l.ctx || this, event);
-				}
-
-				this._firingCount--;
-			}
-		}
-
-		if (propagate) {
-			// propagate the event to parents (set with addEventParent)
-			this._propagateEvent(event);
-		}
-
-		return this;
-	},
-
-	// @method listens(type: String): Boolean
-	// Returns `true` if a particular event type has any listeners attached to it.
-	listens: function (type, propagate) {
-		var listeners = this._events && this._events[type];
-		if (listeners && listeners.length) { return true; }
-
-		if (propagate) {
-			// also check parents for listeners if event propagates
-			for (var id in this._eventParents) {
-				if (this._eventParents[id].listens(type, propagate)) { return true; }
-			}
-		}
-		return false;
-	},
-
-	// @method once(…): this
-	// Behaves as [`on(…)`](#evented-on), except the listener will only get fired once and then removed.
-	once: function (types, fn, context) {
-
-		if (typeof types === 'object') {
-			for (var type in types) {
-				this.once(type, types[type], fn);
-			}
-			return this;
-		}
-
-		var handler = L.bind(function () {
-			this
-			    .off(types, fn, context)
-			    .off(types, handler, context);
-		}, this);
-
-		// add a listener that's executed once and removed after that
-		return this
-		    .on(types, fn, context)
-		    .on(types, handler, context);
-	},
-
-	// @method addEventParent(obj: Evented): this
-	// Adds an event parent - an `Evented` that will receive propagated events
-	addEventParent: function (obj) {
-		this._eventParents = this._eventParents || {};
-		this._eventParents[L.stamp(obj)] = obj;
-		return this;
-	},
-
-	// @method removeEventParent(obj: Evented): this
-	// Removes an event parent, so it will stop receiving propagated events
-	removeEventParent: function (obj) {
-		if (this._eventParents) {
-			delete this._eventParents[L.stamp(obj)];
-		}
-		return this;
-	},
-
-	_propagateEvent: function (e) {
-		for (var id in this._eventParents) {
-			this._eventParents[id].fire(e.type, L.extend({layer: e.target}, e), true);
-		}
-	}
-});
-
-var proto = L.Evented.prototype;
-
-// aliases; we should ditch those eventually
-
-// @method addEventListener(…): this
-// Alias to [`on(…)`](#evented-on)
-proto.addEventListener = proto.on;
-
-// @method removeEventListener(…): this
-// Alias to [`off(…)`](#evented-off)
-
-// @method clearAllEventListeners(…): this
-// Alias to [`off()`](#evented-off)
-proto.removeEventListener = proto.clearAllEventListeners = proto.off;
-
-// @method addOneTimeEventListener(…): this
-// Alias to [`once(…)`](#evented-once)
-proto.addOneTimeEventListener = proto.once;
-
-// @method fireEvent(…): this
-// Alias to [`fire(…)`](#evented-fire)
-proto.fireEvent = proto.fire;
-
-// @method hasEventListeners(…): Boolean
-// Alias to [`listens(…)`](#evented-listens)
-proto.hasEventListeners = proto.listens;
-
-L.Mixin = {Events: proto};
-
-
-
-/*
- * @namespace Browser
- * @aka L.Browser
- *
- * A namespace with static properties for browser/feature detection used by Leaflet internally.
- *
- * @example
- *
- * ```js
- * if (L.Browser.ielt9) {
- *   alert('Upgrade your browser, dude!');
- * }
- * ```
- */
-
-(function () {
-
-	var ua = navigator.userAgent.toLowerCase(),
-	    doc = document.documentElement,
-
-	    ie = 'ActiveXObject' in window,
-
-	    webkit    = ua.indexOf('webkit') !== -1,
-	    phantomjs = ua.indexOf('phantom') !== -1,
-	    android23 = ua.search('android [23]') !== -1,
-	    chrome    = ua.indexOf('chrome') !== -1,
-	    gecko     = ua.indexOf('gecko') !== -1  && !webkit && !window.opera && !ie,
-
-	    win = navigator.platform.indexOf('Win') === 0,
-
-	    mobile = typeof orientation !== 'undefined' || ua.indexOf('mobile') !== -1,
-	    msPointer = !window.PointerEvent && window.MSPointerEvent,
-	    pointer = window.PointerEvent || msPointer,
-
-	    ie3d = ie && ('transition' in doc.style),
-	    webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23,
-	    gecko3d = 'MozPerspective' in doc.style,
-	    opera12 = 'OTransition' in doc.style;
-
-
-	var touch = !window.L_NO_TOUCH && (pointer || 'ontouchstart' in window ||
-			(window.DocumentTouch && document instanceof window.DocumentTouch));
-
-	L.Browser = {
-
-		// @property ie: Boolean
-		// `true` for all Internet Explorer versions (not Edge).
-		ie: ie,
-
-		// @property ielt9: Boolean
-		// `true` for Internet Explorer versions less than 9.
-		ielt9: ie && !document.addEventListener,
-
-		// @property edge: Boolean
-		// `true` for the Edge web browser.
-		edge: 'msLaunchUri' in navigator && !('documentMode' in document),
-
-		// @property webkit: Boolean
-		// `true` for webkit-based browsers like Chrome and Safari (including mobile versions).
-		webkit: webkit,
-
-		// @property gecko: Boolean
-		// `true` for gecko-based browsers like Firefox.
-		gecko: gecko,
-
-		// @property android: Boolean
-		// `true` for any browser running on an Android platform.
-		android: ua.indexOf('android') !== -1,
-
-		// @property android23: Boolean
-		// `true` for browsers running on Android 2 or Android 3.
-		android23: android23,
-
-		// @property chrome: Boolean
-		// `true` for the Chrome browser.
-		chrome: chrome,
-
-		// @property safari: Boolean
-		// `true` for the Safari browser.
-		safari: !chrome && ua.indexOf('safari') !== -1,
-
-
-		// @property win: Boolean
-		// `true` when the browser is running in a Windows platform
-		win: win,
-
-
-		// @property ie3d: Boolean
-		// `true` for all Internet Explorer versions supporting CSS transforms.
-		ie3d: ie3d,
-
-		// @property webkit3d: Boolean
-		// `true` for webkit-based browsers supporting CSS transforms.
-		webkit3d: webkit3d,
-
-		// @property gecko3d: Boolean
-		// `true` for gecko-based browsers supporting CSS transforms.
-		gecko3d: gecko3d,
-
-		// @property opera12: Boolean
-		// `true` for the Opera browser supporting CSS transforms (version 12 or later).
-		opera12: opera12,
-
-		// @property any3d: Boolean
-		// `true` for all browsers supporting CSS transforms.
-		any3d: !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantomjs,
-
-
-		// @property mobile: Boolean
-		// `true` for all browsers running in a mobile device.
-		mobile: mobile,
-
-		// @property mobileWebkit: Boolean
-		// `true` for all webkit-based browsers in a mobile device.
-		mobileWebkit: mobile && webkit,
-
-		// @property mobileWebkit3d: Boolean
-		// `true` for all webkit-based browsers in a mobile device supporting CSS transforms.
-		mobileWebkit3d: mobile && webkit3d,
-
-		// @property mobileOpera: Boolean
-		// `true` for the Opera browser in a mobile device.
-		mobileOpera: mobile && window.opera,
-
-		// @property mobileGecko: Boolean
-		// `true` for gecko-based browsers running in a mobile device.
-		mobileGecko: mobile && gecko,
-
-
-		// @property touch: Boolean
-		// `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events).
-		// This does not necessarily mean that the browser is running in a computer with
-		// a touchscreen, it only means that the browser is capable of understanding
-		// touch events.
-		touch: !!touch,
-
-		// @property msPointer: Boolean
-		// `true` for browsers implementing the Microsoft touch events model (notably IE10).
-		msPointer: !!msPointer,
-
-		// @property pointer: Boolean
-		// `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx).
-		pointer: !!pointer,
-
-
-		// @property retina: Boolean
-		// `true` for browsers on a high-resolution "retina" screen.
-		retina: (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1
-	};
-
-}());
-
-
-
-/*
- * @class Point
- * @aka L.Point
- *
- * Represents a point with `x` and `y` coordinates in pixels.
- *
- * @example
- *
- * ```js
- * var point = L.point(200, 300);
- * ```
- *
- * All Leaflet methods and options that accept `Point` objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:
- *
- * ```js
- * map.panBy([200, 300]);
- * map.panBy(L.point(200, 300));
- * ```
- */
-
-L.Point = function (x, y, round) {
-	// @property x: Number; The `x` coordinate of the point
-	this.x = (round ? Math.round(x) : x);
-	// @property y: Number; The `y` coordinate of the point
-	this.y = (round ? Math.round(y) : y);
-};
-
-L.Point.prototype = {
-
-	// @method clone(): Point
-	// Returns a copy of the current point.
-	clone: function () {
-		return new L.Point(this.x, this.y);
-	},
-
-	// @method add(otherPoint: Point): Point
-	// Returns the result of addition of the current and the given points.
-	add: function (point) {
-		// non-destructive, returns a new point
-		return this.clone()._add(L.point(point));
-	},
-
-	_add: function (point) {
-		// destructive, used directly for performance in situations where it's safe to modify existing point
-		this.x += point.x;
-		this.y += point.y;
-		return this;
-	},
-
-	// @method subtract(otherPoint: Point): Point
-	// Returns the result of subtraction of the given point from the current.
-	subtract: function (point) {
-		return this.clone()._subtract(L.point(point));
-	},
-
-	_subtract: function (point) {
-		this.x -= point.x;
-		this.y -= point.y;
-		return this;
-	},
-
-	// @method divideBy(num: Number): Point
-	// Returns the result of division of the current point by the given number.
-	divideBy: function (num) {
-		return this.clone()._divideBy(num);
-	},
-
-	_divideBy: function (num) {
-		this.x /= num;
-		this.y /= num;
-		return this;
-	},
-
-	// @method multiplyBy(num: Number): Point
-	// Returns the result of multiplication of the current point by the given number.
-	multiplyBy: function (num) {
-		return this.clone()._multiplyBy(num);
-	},
-
-	_multiplyBy: function (num) {
-		this.x *= num;
-		this.y *= num;
-		return this;
-	},
-
-	// @method scaleBy(scale: Point): Point
-	// Multiply each coordinate of the current point by each coordinate of
-	// `scale`. In linear algebra terms, multiply the point by the
-	// [scaling matrix](https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation)
-	// defined by `scale`.
-	scaleBy: function (point) {
-		return new L.Point(this.x * point.x, this.y * point.y);
-	},
-
-	// @method unscaleBy(scale: Point): Point
-	// Inverse of `scaleBy`. Divide each coordinate of the current point by
-	// each coordinate of `scale`.
-	unscaleBy: function (point) {
-		return new L.Point(this.x / point.x, this.y / point.y);
-	},
-
-	// @method round(): Point
-	// Returns a copy of the current point with rounded coordinates.
-	round: function () {
-		return this.clone()._round();
-	},
-
-	_round: function () {
-		this.x = Math.round(this.x);
-		this.y = Math.round(this.y);
-		return this;
-	},
-
-	// @method floor(): Point
-	// Returns a copy of the current point with floored coordinates (rounded down).
-	floor: function () {
-		return this.clone()._floor();
-	},
-
-	_floor: function () {
-		this.x = Math.floor(this.x);
-		this.y = Math.floor(this.y);
-		return this;
-	},
-
-	// @method ceil(): Point
-	// Returns a copy of the current point with ceiled coordinates (rounded up).
-	ceil: function () {
-		return this.clone()._ceil();
-	},
-
-	_ceil: function () {
-		this.x = Math.ceil(this.x);
-		this.y = Math.ceil(this.y);
-		return this;
-	},
-
-	// @method distanceTo(otherPoint: Point): Number
-	// Returns the cartesian distance between the current and the given points.
-	distanceTo: function (point) {
-		point = L.point(point);
-
-		var x = point.x - this.x,
-		    y = point.y - this.y;
-
-		return Math.sqrt(x * x + y * y);
-	},
-
-	// @method equals(otherPoint: Point): Boolean
-	// Returns `true` if the given point has the same coordinates.
-	equals: function (point) {
-		point = L.point(point);
-
-		return point.x === this.x &&
-		       point.y === this.y;
-	},
-
-	// @method contains(otherPoint: Point): Boolean
-	// Returns `true` if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).
-	contains: function (point) {
-		point = L.point(point);
-
-		return Math.abs(point.x) <= Math.abs(this.x) &&
-		       Math.abs(point.y) <= Math.abs(this.y);
-	},
-
-	// @method toString(): String
-	// Returns a string representation of the point for debugging purposes.
-	toString: function () {
-		return 'Point(' +
-		        L.Util.formatNum(this.x) + ', ' +
-		        L.Util.formatNum(this.y) + ')';
-	}
-};
-
-// @factory L.point(x: Number, y: Number, round?: Boolean)
-// Creates a Point object with the given `x` and `y` coordinates. If optional `round` is set to true, rounds the `x` and `y` values.
-
-// @alternative
-// @factory L.point(coords: Number[])
-// Expects an array of the form `[x, y]` instead.
-
-// @alternative
-// @factory L.point(coords: Object)
-// Expects a plain object of the form `{x: Number, y: Number}` instead.
-L.point = function (x, y, round) {
-	if (x instanceof L.Point) {
-		return x;
-	}
-	if (L.Util.isArray(x)) {
-		return new L.Point(x[0], x[1]);
-	}
-	if (x === undefined || x === null) {
-		return x;
-	}
-	if (typeof x === 'object' && 'x' in x && 'y' in x) {
-		return new L.Point(x.x, x.y);
-	}
-	return new L.Point(x, y, round);
-};
-
-
-
-/*
- * @class Bounds
- * @aka L.Bounds
- *
- * Represents a rectangular area in pixel coordinates.
- *
- * @example
- *
- * ```js
- * var p1 = L.point(10, 10),
- * p2 = L.point(40, 60),
- * bounds = L.bounds(p1, p2);
- * ```
- *
- * All Leaflet methods that accept `Bounds` objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:
- *
- * ```js
- * otherBounds.intersects([[10, 10], [40, 60]]);
- * ```
- */
-
-L.Bounds = function (a, b) {
-	if (!a) { return; }
-
-	var points = b ? [a, b] : a;
-
-	for (var i = 0, len = points.length; i < len; i++) {
-		this.extend(points[i]);
-	}
-};
-
-L.Bounds.prototype = {
-	// @method extend(point: Point): this
-	// Extends the bounds to contain the given point.
-	extend: function (point) { // (Point)
-		point = L.point(point);
-
-		// @property min: Point
-		// The top left corner of the rectangle.
-		// @property max: Point
-		// The bottom right corner of the rectangle.
-		if (!this.min && !this.max) {
-			this.min = point.clone();
-			this.max = point.clone();
-		} else {
-			this.min.x = Math.min(point.x, this.min.x);
-			this.max.x = Math.max(point.x, this.max.x);
-			this.min.y = Math.min(point.y, this.min.y);
-			this.max.y = Math.max(point.y, this.max.y);
-		}
-		return this;
-	},
-
-	// @method getCenter(round?: Boolean): Point
-	// Returns the center point of the bounds.
-	getCenter: function (round) {
-		return new L.Point(
-		        (this.min.x + this.max.x) / 2,
-		        (this.min.y + this.max.y) / 2, round);
-	},
-
-	// @method getBottomLeft(): Point
-	// Returns the bottom-left point of the bounds.
-	getBottomLeft: function () {
-		return new L.Point(this.min.x, this.max.y);
-	},
-
-	// @method getTopRight(): Point
-	// Returns the top-right point of the bounds.
-	getTopRight: function () { // -> Point
-		return new L.Point(this.max.x, this.min.y);
-	},
-
-	// @method getSize(): Point
-	// Returns the size of the given bounds
-	getSize: function () {
-		return this.max.subtract(this.min);
-	},
-
-	// @method contains(otherBounds: Bounds): Boolean
-	// Returns `true` if the rectangle contains the given one.
-	// @alternative
-	// @method contains(point: Point): Boolean
-	// Returns `true` if the rectangle contains the given point.
-	contains: function (obj) {
-		var min, max;
-
-		if (typeof obj[0] === 'number' || obj instanceof L.Point) {
-			obj = L.point(obj);
-		} else {
-			obj = L.bounds(obj);
-		}
-
-		if (obj instanceof L.Bounds) {
-			min = obj.min;
-			max = obj.max;
-		} else {
-			min = max = obj;
-		}
-
-		return (min.x >= this.min.x) &&
-		       (max.x <= this.max.x) &&
-		       (min.y >= this.min.y) &&
-		       (max.y <= this.max.y);
-	},
-
-	// @method intersects(otherBounds: Bounds): Boolean
-	// Returns `true` if the rectangle intersects the given bounds. Two bounds
-	// intersect if they have at least one point in common.
-	intersects: function (bounds) { // (Bounds) -> Boolean
-		bounds = L.bounds(bounds);
-
-		var min = this.min,
-		    max = this.max,
-		    min2 = bounds.min,
-		    max2 = bounds.max,
-		    xIntersects = (max2.x >= min.x) && (min2.x <= max.x),
-		    yIntersects = (max2.y >= min.y) && (min2.y <= max.y);
-
-		return xIntersects && yIntersects;
-	},
-
-	// @method overlaps(otherBounds: Bounds): Boolean
-	// Returns `true` if the rectangle overlaps the given bounds. Two bounds
-	// overlap if their intersection is an area.
-	overlaps: function (bounds) { // (Bounds) -> Boolean
-		bounds = L.bounds(bounds);
-
-		var min = this.min,
-		    max = this.max,
-		    min2 = bounds.min,
-		    max2 = bounds.max,
-		    xOverlaps = (max2.x > min.x) && (min2.x < max.x),
-		    yOverlaps = (max2.y > min.y) && (min2.y < max.y);
-
-		return xOverlaps && yOverlaps;
-	},
-
-	isValid: function () {
-		return !!(this.min && this.max);
-	}
-};
-
-
-// @factory L.bounds(topLeft: Point, bottomRight: Point)
-// Creates a Bounds object from two coordinates (usually top-left and bottom-right corners).
-// @alternative
-// @factory L.bounds(points: Point[])
-// Creates a Bounds object from the points it contains
-L.bounds = function (a, b) {
-	if (!a || a instanceof L.Bounds) {
-		return a;
-	}
-	return new L.Bounds(a, b);
-};
-
-
-
-/*
- * @class Transformation
- * @aka L.Transformation
- *
- * Represents an affine transformation: a set of coefficients `a`, `b`, `c`, `d`
- * for transforming a point of a form `(x, y)` into `(a*x + b, c*y + d)` and doing
- * the reverse. Used by Leaflet in its projections code.
- *
- * @example
- *
- * ```js
- * var transformation = new L.Transformation(2, 5, -1, 10),
- * 	p = L.point(1, 2),
- * 	p2 = transformation.transform(p), //  L.point(7, 8)
- * 	p3 = transformation.untransform(p2); //  L.point(1, 2)
- * ```
- */
-
-
-// factory new L.Transformation(a: Number, b: Number, c: Number, d: Number)
-// Creates a `Transformation` object with the given coefficients.
-L.Transformation = function (a, b, c, d) {
-	this._a = a;
-	this._b = b;
-	this._c = c;
-	this._d = d;
-};
-
-L.Transformation.prototype = {
-	// @method transform(point: Point, scale?: Number): Point
-	// Returns a transformed point, optionally multiplied by the given scale.
-	// Only accepts actual `L.Point` instances, not arrays.
-	transform: function (point, scale) { // (Point, Number) -> Point
-		return this._transform(point.clone(), scale);
-	},
-
-	// destructive transform (faster)
-	_transform: function (point, scale) {
-		scale = scale || 1;
-		point.x = scale * (this._a * point.x + this._b);
-		point.y = scale * (this._c * point.y + this._d);
-		return point;
-	},
-
-	// @method untransform(point: Point, scale?: Number): Point
-	// Returns the reverse transformation of the given point, optionally divided
-	// by the given scale. Only accepts actual `L.Point` instances, not arrays.
-	untransform: function (point, scale) {
-		scale = scale || 1;
-		return new L.Point(
-		        (point.x / scale - this._b) / this._a,
-		        (point.y / scale - this._d) / this._c);
-	}
-};
-
-
-
-/*
- * @namespace DomUtil
- *
- * Utility functions to work with the [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model)
- * tree, used by Leaflet internally.
- *
- * Most functions expecting or returning a `HTMLElement` also work for
- * SVG elements. The only difference is that classes refer to CSS classes
- * in HTML and SVG classes in SVG.
- */
-
-L.DomUtil = {
-
-	// @function get(id: String|HTMLElement): HTMLElement
-	// Returns an element given its DOM id, or returns the element itself
-	// if it was passed directly.
-	get: function (id) {
-		return typeof id === 'string' ? document.getElementById(id) : id;
-	},
-
-	// @function getStyle(el: HTMLElement, styleAttrib: String): String
-	// Returns the value for a certain style attribute on an element,
-	// including computed values or values set through CSS.
-	getStyle: function (el, style) {
-
-		var value = el.style[style] || (el.currentStyle && el.currentStyle[style]);
-
-		if ((!value || value === 'auto') && document.defaultView) {
-			var css = document.defaultView.getComputedStyle(el, null);
-			value = css ? css[style] : null;
-		}
-
-		return value === 'auto' ? null : value;
-	},
-
-	// @function create(tagName: String, className?: String, container?: HTMLElement): HTMLElement
-	// Creates an HTML element with `tagName`, sets its class to `className`, and optionally appends it to `container` element.
-	create: function (tagName, className, container) {
-
-		var el = document.createElement(tagName);
-		el.className = className || '';
-
-		if (container) {
-			container.appendChild(el);
-		}
-
-		return el;
-	},
-
-	// @function remove(el: HTMLElement)
-	// Removes `el` from its parent element
-	remove: function (el) {
-		var parent = el.parentNode;
-		if (parent) {
-			parent.removeChild(el);
-		}
-	},
-
-	// @function empty(el: HTMLElement)
-	// Removes all of `el`'s children elements from `el`
-	empty: function (el) {
-		while (el.firstChild) {
-			el.removeChild(el.firstChild);
-		}
-	},
-
-	// @function toFront(el: HTMLElement)
-	// Makes `el` the last children of its parent, so it renders in front of the other children.
-	toFront: function (el) {
-		el.parentNode.appendChild(el);
-	},
-
-	// @function toBack(el: HTMLElement)
-	// Makes `el` the first children of its parent, so it renders back from the other children.
-	toBack: function (el) {
-		var parent = el.parentNode;
-		parent.insertBefore(el, parent.firstChild);
-	},
-
-	// @function hasClass(el: HTMLElement, name: String): Boolean
-	// Returns `true` if the element's class attribute contains `name`.
-	hasClass: function (el, name) {
-		if (el.classList !== undefined) {
-			return el.classList.contains(name);
-		}
-		var className = L.DomUtil.getClass(el);
-		return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className);
-	},
-
-	// @function addClass(el: HTMLElement, name: String)
-	// Adds `name` to the element's class attribute.
-	addClass: function (el, name) {
-		if (el.classList !== undefined) {
-			var classes = L.Util.splitWords(name);
-			for (var i = 0, len = classes.length; i < len; i++) {
-				el.classList.add(classes[i]);
-			}
-		} else if (!L.DomUtil.hasClass(el, name)) {
-			var className = L.DomUtil.getClass(el);
-			L.DomUtil.setClass(el, (className ? className + ' ' : '') + name);
-		}
-	},
-
-	// @function removeClass(el: HTMLElement, name: String)
-	// Removes `name` from the element's class attribute.
-	removeClass: function (el, name) {
-		if (el.classList !== undefined) {
-			el.classList.remove(name);
-		} else {
-			L.DomUtil.setClass(el, L.Util.trim((' ' + L.DomUtil.getClass(el) + ' ').replace(' ' + name + ' ', ' ')));
-		}
-	},
-
-	// @function setClass(el: HTMLElement, name: String)
-	// Sets the element's class.
-	setClass: function (el, name) {
-		if (el.className.baseVal === undefined) {
-			el.className = name;
-		} else {
-			// in case of SVG element
-			el.className.baseVal = name;
-		}
-	},
-
-	// @function getClass(el: HTMLElement): String
-	// Returns the element's class.
-	getClass: function (el) {
-		return el.className.baseVal === undefined ? el.className : el.className.baseVal;
-	},
-
-	// @function setOpacity(el: HTMLElement, opacity: Number)
-	// Set the opacity of an element (including old IE support).
-	// `opacity` must be a number from `0` to `1`.
-	setOpacity: function (el, value) {
-
-		if ('opacity' in el.style) {
-			el.style.opacity = value;
-
-		} else if ('filter' in el.style) {
-			L.DomUtil._setOpacityIE(el, value);
-		}
-	},
-
-	_setOpacityIE: function (el, value) {
-		var filter = false,
-		    filterName = 'DXImageTransform.Microsoft.Alpha';
-
-		// filters collection throws an error if we try to retrieve a filter that doesn't exist
-		try {
-			filter = el.filters.item(filterName);
-		} catch (e) {
-			// don't set opacity to 1 if we haven't already set an opacity,
-			// it isn't needed and breaks transparent pngs.
-			if (value === 1) { return; }
-		}
-
-		value = Math.round(value * 100);
-
-		if (filter) {
-			filter.Enabled = (value !== 100);
-			filter.Opacity = value;
-		} else {
-			el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';
-		}
-	},
-
-	// @function testProp(props: String[]): String|false
-	// Goes through the array of style names and returns the first name
-	// that is a valid style name for an element. If no such name is found,
-	// it returns false. Useful for vendor-prefixed styles like `transform`.
-	testProp: function (props) {
-
-		var style = document.documentElement.style;
-
-		for (var i = 0; i < props.length; i++) {
-			if (props[i] in style) {
-				return props[i];
-			}
-		}
-		return false;
-	},
-
-	// @function setTransform(el: HTMLElement, offset: Point, scale?: Number)
-	// Resets the 3D CSS transform of `el` so it is translated by `offset` pixels
-	// and optionally scaled by `scale`. Does not have an effect if the
-	// browser doesn't support 3D CSS transforms.
-	setTransform: function (el, offset, scale) {
-		var pos = offset || new L.Point(0, 0);
-
-		el.style[L.DomUtil.TRANSFORM] =
-			(L.Browser.ie3d ?
-				'translate(' + pos.x + 'px,' + pos.y + 'px)' :
-				'translate3d(' + pos.x + 'px,' + pos.y + 'px,0)') +
-			(scale ? ' scale(' + scale + ')' : '');
-	},
-
-	// @function setPosition(el: HTMLElement, position: Point)
-	// Sets the position of `el` to coordinates specified by `position`,
-	// using CSS translate or top/left positioning depending on the browser
-	// (used by Leaflet internally to position its layers).
-	setPosition: function (el, point) { // (HTMLElement, Point[, Boolean])
-
-		/*eslint-disable */
-		el._leaflet_pos = point;
-		/*eslint-enable */
-
-		if (L.Browser.any3d) {
-			L.DomUtil.setTransform(el, point);
-		} else {
-			el.style.left = point.x + 'px';
-			el.style.top = point.y + 'px';
-		}
-	},
-
-	// @function getPosition(el: HTMLElement): Point
-	// Returns the coordinates of an element previously positioned with setPosition.
-	getPosition: function (el) {
-		// this method is only used for elements previously positioned using setPosition,
-		// so it's safe to cache the position for performance
-
-		return el._leaflet_pos || new L.Point(0, 0);
-	}
-};
-
-
-(function () {
-	// prefix style property names
-
-	// @property TRANSFORM: String
-	// Vendor-prefixed fransform style name (e.g. `'webkitTransform'` for WebKit).
-	L.DomUtil.TRANSFORM = L.DomUtil.testProp(
-			['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']);
-
-
-	// webkitTransition comes first because some browser versions that drop vendor prefix don't do
-	// the same for the transitionend event, in particular the Android 4.1 stock browser
-
-	// @property TRANSITION: String
-	// Vendor-prefixed transform style name.
-	var transition = L.DomUtil.TRANSITION = L.DomUtil.testProp(
-			['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);
-
-	L.DomUtil.TRANSITION_END =
-			transition === 'webkitTransition' || transition === 'OTransition' ? transition + 'End' : 'transitionend';
-
-	// @function disableTextSelection()
-	// Prevents the user from generating `selectstart` DOM events, usually generated
-	// when the user drags the mouse through a page with text. Used internally
-	// by Leaflet to override the behaviour of any click-and-drag interaction on
-	// the map. Affects drag interactions on the whole document.
-
-	// @function enableTextSelection()
-	// Cancels the effects of a previous [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection).
-	if ('onselectstart' in document) {
-		L.DomUtil.disableTextSelection = function () {
-			L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);
-		};
-		L.DomUtil.enableTextSelection = function () {
-			L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);
-		};
-
-	} else {
-		var userSelectProperty = L.DomUtil.testProp(
-			['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);
-
-		L.DomUtil.disableTextSelection = function () {
-			if (userSelectProperty) {
-				var style = document.documentElement.style;
-				this._userSelect = style[userSelectProperty];
-				style[userSelectProperty] = 'none';
-			}
-		};
-		L.DomUtil.enableTextSelection = function () {
-			if (userSelectProperty) {
-				document.documentElement.style[userSelectProperty] = this._userSelect;
-				delete this._userSelect;
-			}
-		};
-	}
-
-	// @function disableImageDrag()
-	// As [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection), but
-	// for `dragstart` DOM events, usually generated when the user drags an image.
-	L.DomUtil.disableImageDrag = function () {
-		L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);
-	};
-
-	// @function enableImageDrag()
-	// Cancels the effects of a previous [`L.DomUtil.disableImageDrag`](#domutil-disabletextselection).
-	L.DomUtil.enableImageDrag = function () {
-		L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault);
-	};
-
-	// @function preventOutline(el: HTMLElement)
-	// Makes the [outline](https://developer.mozilla.org/docs/Web/CSS/outline)
-	// of the element `el` invisible. Used internally by Leaflet to prevent
-	// focusable elements from displaying an outline when the user performs a
-	// drag interaction on them.
-	L.DomUtil.preventOutline = function (element) {
-		while (element.tabIndex === -1) {
-			element = element.parentNode;
-		}
-		if (!element || !element.style) { return; }
-		L.DomUtil.restoreOutline();
-		this._outlineElement = element;
-		this._outlineStyle = element.style.outline;
-		element.style.outline = 'none';
-		L.DomEvent.on(window, 'keydown', L.DomUtil.restoreOutline, this);
-	};
-
-	// @function restoreOutline()
-	// Cancels the effects of a previous [`L.DomUtil.preventOutline`]().
-	L.DomUtil.restoreOutline = function () {
-		if (!this._outlineElement) { return; }
-		this._outlineElement.style.outline = this._outlineStyle;
-		delete this._outlineElement;
-		delete this._outlineStyle;
-		L.DomEvent.off(window, 'keydown', L.DomUtil.restoreOutline, this);
-	};
-})();
-
-
-
-/* @class LatLng
- * @aka L.LatLng
- *
- * Represents a geographical point with a certain latitude and longitude.
- *
- * @example
- *
- * ```
- * var latlng = L.latLng(50.5, 30.5);
- * ```
- *
- * All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:
- *
- * ```
- * map.panTo([50, 30]);
- * map.panTo({lon: 30, lat: 50});
- * map.panTo({lat: 50, lng: 30});
- * map.panTo(L.latLng(50, 30));
- * ```
- */
-
-L.LatLng = function (lat, lng, alt) {
-	if (isNaN(lat) || isNaN(lng)) {
-		throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');
-	}
-
-	// @property lat: Number
-	// Latitude in degrees
-	this.lat = +lat;
-
-	// @property lng: Number
-	// Longitude in degrees
-	this.lng = +lng;
-
-	// @property alt: Number
-	// Altitude in meters (optional)
-	if (alt !== undefined) {
-		this.alt = +alt;
-	}
-};
-
-L.LatLng.prototype = {
-	// @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean
-	// Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overriden by setting `maxMargin` to a small number.
-	equals: function (obj, maxMargin) {
-		if (!obj) { return false; }
-
-		obj = L.latLng(obj);
-
-		var margin = Math.max(
-		        Math.abs(this.lat - obj.lat),
-		        Math.abs(this.lng - obj.lng));
-
-		return margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin);
-	},
-
-	// @method toString(): String
-	// Returns a string representation of the point (for debugging purposes).
-	toString: function (precision) {
-		return 'LatLng(' +
-		        L.Util.formatNum(this.lat, precision) + ', ' +
-		        L.Util.formatNum(this.lng, precision) + ')';
-	},
-
-	// @method distanceTo(otherLatLng: LatLng): Number
-	// Returns the distance (in meters) to the given `LatLng` calculated using the [Haversine formula](http://en.wikipedia.org/wiki/Haversine_formula).
-	distanceTo: function (other) {
-		return L.CRS.Earth.distance(this, L.latLng(other));
-	},
-
-	// @method wrap(): LatLng
-	// Returns a new `LatLng` object with the longitude wrapped so it's always between -180 and +180 degrees.
-	wrap: function () {
-		return L.CRS.Earth.wrapLatLng(this);
-	},
-
-	// @method toBounds(sizeInMeters: Number): LatLngBounds
-	// Returns a new `LatLngBounds` object in which each boundary is `sizeInMeters/2` meters apart from the `LatLng`.
-	toBounds: function (sizeInMeters) {
-		var latAccuracy = 180 * sizeInMeters / 40075017,
-		    lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat);
-
-		return L.latLngBounds(
-		        [this.lat - latAccuracy, this.lng - lngAccuracy],
-		        [this.lat + latAccuracy, this.lng + lngAccuracy]);
-	},
-
-	clone: function () {
-		return new L.LatLng(this.lat, this.lng, this.alt);
-	}
-};
-
-
-
-// @factory L.latLng(latitude: Number, longitude: Number, altitude?: Number): LatLng
-// Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
-
-// @alternative
-// @factory L.latLng(coords: Array): LatLng
-// Expects an array of the form `[Number, Number]` or `[Number, Number, Number]` instead.
-
-// @alternative
-// @factory L.latLng(coords: Object): LatLng
-// Expects an plain object of the form `{lat: Number, lng: Number}` or `{lat: Number, lng: Number, alt: Number}` instead.
-
-L.latLng = function (a, b, c) {
-	if (a instanceof L.LatLng) {
-		return a;
-	}
-	if (L.Util.isArray(a) && typeof a[0] !== 'object') {
-		if (a.length === 3) {
-			return new L.LatLng(a[0], a[1], a[2]);
-		}
-		if (a.length === 2) {
-			return new L.LatLng(a[0], a[1]);
-		}
-		return null;
-	}
-	if (a === undefined || a === null) {
-		return a;
-	}
-	if (typeof a === 'object' && 'lat' in a) {
-		return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);
-	}
-	if (b === undefined) {
-		return null;
-	}
-	return new L.LatLng(a, b, c);
-};
-
-
-
-/*
- * @class LatLngBounds
- * @aka L.LatLngBounds
- *
- * Represents a rectangular geographical area on a map.
- *
- * @example
- *
- * ```js
- * var corner1 = L.latLng(40.712, -74.227),
- * corner2 = L.latLng(40.774, -74.125),
- * bounds = L.latLngBounds(corner1, corner2);
- * ```
- *
- * All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:
- *
- * ```js
- * map.fitBounds([
- * 	[40.712, -74.227],
- * 	[40.774, -74.125]
- * ]);
- * ```
- *
- * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range.
- */
-
-L.LatLngBounds = function (corner1, corner2) { // (LatLng, LatLng) or (LatLng[])
-	if (!corner1) { return; }
-
-	var latlngs = corner2 ? [corner1, corner2] : corner1;
-
-	for (var i = 0, len = latlngs.length; i < len; i++) {
-		this.extend(latlngs[i]);
-	}
-};
-
-L.LatLngBounds.prototype = {
-
-	// @method extend(latlng: LatLng): this
-	// Extend the bounds to contain the given point
-
-	// @alternative
-	// @method extend(otherBounds: LatLngBounds): this
-	// Extend the bounds to contain the given bounds
-	extend: function (obj) {
-		var sw = this._southWest,
-		    ne = this._northEast,
-		    sw2, ne2;
-
-		if (obj instanceof L.LatLng) {
-			sw2 = obj;
-			ne2 = obj;
-
-		} else if (obj instanceof L.LatLngBounds) {
-			sw2 = obj._southWest;
-			ne2 = obj._northEast;
-
-			if (!sw2 || !ne2) { return this; }
-
-		} else {
-			return obj ? this.extend(L.latLng(obj) || L.latLngBounds(obj)) : this;
-		}
-
-		if (!sw && !ne) {
-			this._southWest = new L.LatLng(sw2.lat, sw2.lng);
-			this._northEast = new L.LatLng(ne2.lat, ne2.lng);
-		} else {
-			sw.lat = Math.min(sw2.lat, sw.lat);
-			sw.lng = Math.min(sw2.lng, sw.lng);
-			ne.lat = Math.max(ne2.lat, ne.lat);
-			ne.lng = Math.max(ne2.lng, ne.lng);
-		}
-
-		return this;
-	},
-
-	// @method pad(bufferRatio: Number): LatLngBounds
-	// Returns bigger bounds created by extending the current bounds by a given percentage in each direction.
-	pad: function (bufferRatio) {
-		var sw = this._southWest,
-		    ne = this._northEast,
-		    heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,
-		    widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;
-
-		return new L.LatLngBounds(
-		        new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),
-		        new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));
-	},
-
-	// @method getCenter(): LatLng
-	// Returns the center point of the bounds.
-	getCenter: function () {
-		return new L.LatLng(
-		        (this._southWest.lat + this._northEast.lat) / 2,
-		        (this._southWest.lng + this._northEast.lng) / 2);
-	},
-
-	// @method getSouthWest(): LatLng
-	// Returns the south-west point of the bounds.
-	getSouthWest: function () {
-		return this._southWest;
-	},
-
-	// @method getNorthEast(): LatLng
-	// Returns the north-east point of the bounds.
-	getNorthEast: function () {
-		return this._northEast;
-	},
-
-	// @method getNorthWest(): LatLng
-	// Returns the north-west point of the bounds.
-	getNorthWest: function () {
-		return new L.LatLng(this.getNorth(), this.getWest());
-	},
-
-	// @method getSouthEast(): LatLng
-	// Returns the south-east point of the bounds.
-	getSouthEast: function () {
-		return new L.LatLng(this.getSouth(), this.getEast());
-	},
-
-	// @method getWest(): Number
-	// Returns the west longitude of the bounds
-	getWest: function () {
-		return this._southWest.lng;
-	},
-
-	// @method getSouth(): Number
-	// Returns the south latitude of the bounds
-	getSouth: function () {
-		return this._southWest.lat;
-	},
-
-	// @method getEast(): Number
-	// Returns the east longitude of the bounds
-	getEast: function () {
-		return this._northEast.lng;
-	},
-
-	// @method getNorth(): Number
-	// Returns the north latitude of the bounds
-	getNorth: function () {
-		return this._northEast.lat;
-	},
-
-	// @method contains(otherBounds: LatLngBounds): Boolean
-	// Returns `true` if the rectangle contains the given one.
-
-	// @alternative
-	// @method contains (latlng: LatLng): Boolean
-	// Returns `true` if the rectangle contains the given point.
-	contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean
-		if (typeof obj[0] === 'number' || obj instanceof L.LatLng || 'lat' in obj) {
-			obj = L.latLng(obj);
-		} else {
-			obj = L.latLngBounds(obj);
-		}
-
-		var sw = this._southWest,
-		    ne = this._northEast,
-		    sw2, ne2;
-
-		if (obj instanceof L.LatLngBounds) {
-			sw2 = obj.getSouthWest();
-			ne2 = obj.getNorthEast();
-		} else {
-			sw2 = ne2 = obj;
-		}
-
-		return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&
-		       (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);
-	},
-
-	// @method intersects(otherBounds: LatLngBounds): Boolean
-	// Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.
-	intersects: function (bounds) {
-		bounds = L.latLngBounds(bounds);
-
-		var sw = this._southWest,
-		    ne = this._northEast,
-		    sw2 = bounds.getSouthWest(),
-		    ne2 = bounds.getNorthEast(),
-
-		    latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),
-		    lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);
-
-		return latIntersects && lngIntersects;
-	},
-
-	// @method overlaps(otherBounds: Bounds): Boolean
-	// Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.
-	overlaps: function (bounds) {
-		bounds = L.latLngBounds(bounds);
-
-		var sw = this._southWest,
-		    ne = this._northEast,
-		    sw2 = bounds.getSouthWest(),
-		    ne2 = bounds.getNorthEast(),
-
-		    latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat),
-		    lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng);
-
-		return latOverlaps && lngOverlaps;
-	},
-
-	// @method toBBoxString(): String
-	// Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.
-	toBBoxString: function () {
-		return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');
-	},
-
-	// @method equals(otherBounds: LatLngBounds): Boolean
-	// Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds.
-	equals: function (bounds) {
-		if (!bounds) { return false; }
-
-		bounds = L.latLngBounds(bounds);
-
-		return this._southWest.equals(bounds.getSouthWest()) &&
-		       this._northEast.equals(bounds.getNorthEast());
-	},
-
-	// @method isValid(): Boolean
-	// Returns `true` if the bounds are properly initialized.
-	isValid: function () {
-		return !!(this._southWest && this._northEast);
-	}
-};
-
-// TODO International date line?
-
-// @factory L.latLngBounds(corner1: LatLng, corner2: LatLng)
-// Creates a `LatLngBounds` object by defining two diagonally opposite corners of the rectangle.
-
-// @alternative
-// @factory L.latLngBounds(latlngs: LatLng[])
-// Creates a `LatLngBounds` object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with [`fitBounds`](#map-fitbounds).
-L.latLngBounds = function (a, b) {
-	if (a instanceof L.LatLngBounds) {
-		return a;
-	}
-	return new L.LatLngBounds(a, b);
-};
-
-
-
-/*
- * @namespace Projection
- * @section
- * Leaflet comes with a set of already defined Projections out of the box:
- *
- * @projection L.Projection.LonLat
- *
- * Equirectangular, or Plate Carree projection — the most simple projection,
- * mostly used by GIS enthusiasts. Directly maps `x` as longitude, and `y` as
- * latitude. Also suitable for flat worlds, e.g. game maps. Used by the
- * `EPSG:3395` and `Simple` CRS.
- */
-
-L.Projection = {};
-
-L.Projection.LonLat = {
-	project: function (latlng) {
-		return new L.Point(latlng.lng, latlng.lat);
-	},
-
-	unproject: function (point) {
-		return new L.LatLng(point.y, point.x);
-	},
-
-	bounds: L.bounds([-180, -90], [180, 90])
-};
-
-
-
-/*
- * @namespace Projection
- * @projection L.Projection.SphericalMercator
- *
- * Spherical Mercator projection — the most common projection for online maps,
- * used by almost all free and commercial tile providers. Assumes that Earth is
- * a sphere. Used by the `EPSG:3857` CRS.
- */
-
-L.Projection.SphericalMercator = {
-
-	R: 6378137,
-	MAX_LATITUDE: 85.0511287798,
-
-	project: function (latlng) {
-		var d = Math.PI / 180,
-		    max = this.MAX_LATITUDE,
-		    lat = Math.max(Math.min(max, latlng.lat), -max),
-		    sin = Math.sin(lat * d);
-
-		return new L.Point(
-				this.R * latlng.lng * d,
-				this.R * Math.log((1 + sin) / (1 - sin)) / 2);
-	},
-
-	unproject: function (point) {
-		var d = 180 / Math.PI;
-
-		return new L.LatLng(
-			(2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,
-			point.x * d / this.R);
-	},
-
-	bounds: (function () {
-		var d = 6378137 * Math.PI;
-		return L.bounds([-d, -d], [d, d]);
-	})()
-};
-
-
-
-/*
- * @class CRS
- * @aka L.CRS
- * Abstract class that defines coordinate reference systems for projecting
- * geographical points into pixel (screen) coordinates and back (and to
- * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See
- * [spatial reference system](http://en.wikipedia.org/wiki/Coordinate_reference_system).
- *
- * Leaflet defines the most usual CRSs by default. If you want to use a
- * CRS not defined by default, take a look at the
- * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin.
- */
-
-L.CRS = {
-	// @method latLngToPoint(latlng: LatLng, zoom: Number): Point
-	// Projects geographical coordinates into pixel coordinates for a given zoom.
-	latLngToPoint: function (latlng, zoom) {
-		var projectedPoint = this.projection.project(latlng),
-		    scale = this.scale(zoom);
-
-		return this.transformation._transform(projectedPoint, scale);
-	},
-
-	// @method pointToLatLng(point: Point, zoom: Number): LatLng
-	// The inverse of `latLngToPoint`. Projects pixel coordinates on a given
-	// zoom into geographical coordinates.
-	pointToLatLng: function (point, zoom) {
-		var scale = this.scale(zoom),
-		    untransformedPoint = this.transformation.untransform(point, scale);
-
-		return this.projection.unproject(untransformedPoint);
-	},
-
-	// @method project(latlng: LatLng): Point
-	// Projects geographical coordinates into coordinates in units accepted for
-	// this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).
-	project: function (latlng) {
-		return this.projection.project(latlng);
-	},
-
-	// @method unproject(point: Point): LatLng
-	// Given a projected coordinate returns the corresponding LatLng.
-	// The inverse of `project`.
-	unproject: function (point) {
-		return this.projection.unproject(point);
-	},
-
-	// @method scale(zoom: Number): Number
-	// Returns the scale used when transforming projected coordinates into
-	// pixel coordinates for a particular zoom. For example, it returns
-	// `256 * 2^zoom` for Mercator-based CRS.
-	scale: function (zoom) {
-		return 256 * Math.pow(2, zoom);
-	},
-
-	// @method zoom(scale: Number): Number
-	// Inverse of `scale()`, returns the zoom level corresponding to a scale
-	// factor of `scale`.
-	zoom: function (scale) {
-		return Math.log(scale / 256) / Math.LN2;
-	},
-
-	// @method getProjectedBounds(zoom: Number): Bounds
-	// Returns the projection's bounds scaled and transformed for the provided `zoom`.
-	getProjectedBounds: function (zoom) {
-		if (this.infinite) { return null; }
-
-		var b = this.projection.bounds,
-		    s = this.scale(zoom),
-		    min = this.transformation.transform(b.min, s),
-		    max = this.transformation.transform(b.max, s);
-
-		return L.bounds(min, max);
-	},
-
-	// @method distance(latlng1: LatLng, latlng2: LatLng): Number
-	// Returns the distance between two geographical coordinates.
-
-	// @property code: String
-	// Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`)
-	//
-	// @property wrapLng: Number[]
-	// An array of two numbers defining whether the longitude (horizontal) coordinate
-	// axis wraps around a given range and how. Defaults to `[-180, 180]` in most
-	// geographical CRSs. If `undefined`, the longitude axis does not wrap around.
-	//
-	// @property wrapLat: Number[]
-	// Like `wrapLng`, but for the latitude (vertical) axis.
-
-	// wrapLng: [min, max],
-	// wrapLat: [min, max],
-
-	// @property infinite: Boolean
-	// If true, the coordinate space will be unbounded (infinite in both axes)
-	infinite: false,
-
-	// @method wrapLatLng(latlng: LatLng): LatLng
-	// Returns a `LatLng` where lat and lng has been wrapped according to the
-	// CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds.
-	// Only accepts actual `L.LatLng` instances, not arrays.
-	wrapLatLng: function (latlng) {
-		var lng = this.wrapLng ? L.Util.wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng,
-		    lat = this.wrapLat ? L.Util.wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat,
-		    alt = latlng.alt;
-
-		return L.latLng(lat, lng, alt);
-	},
-
-	// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds
-	// Returns a `LatLngBounds` with the same size as the given one, ensuring
-	// that its center is within the CRS's bounds.
-	// Only accepts actual `L.LatLngBounds` instances, not arrays.
-	wrapLatLngBounds: function (bounds) {
-		var center = bounds.getCenter(),
-		    newCenter = this.wrapLatLng(center),
-		    latShift = center.lat - newCenter.lat,
-		    lngShift = center.lng - newCenter.lng;
-
-		if (latShift === 0 && lngShift === 0) {
-			return bounds;
-		}
-
-		var sw = bounds.getSouthWest(),
-		    ne = bounds.getNorthEast(),
-		    newSw = L.latLng({lat: sw.lat - latShift, lng: sw.lng - lngShift}),
-		    newNe = L.latLng({lat: ne.lat - latShift, lng: ne.lng - lngShift});
-
-		return new L.LatLngBounds(newSw, newNe);
-	}
-};
-
-
-
-/*
- * @namespace CRS
- * @crs L.CRS.Simple
- *
- * A simple CRS that maps longitude and latitude into `x` and `y` directly.
- * May be used for maps of flat surfaces (e.g. game maps). Note that the `y`
- * axis should still be inverted (going from bottom to top). `distance()` returns
- * simple euclidean distance.
- */
-
-L.CRS.Simple = L.extend({}, L.CRS, {
-	projection: L.Projection.LonLat,
-	transformation: new L.Transformation(1, 0, -1, 0),
-
-	scale: function (zoom) {
-		return Math.pow(2, zoom);
-	},
-
-	zoom: function (scale) {
-		return Math.log(scale) / Math.LN2;
-	},
-
-	distance: function (latlng1, latlng2) {
-		var dx = latlng2.lng - latlng1.lng,
-		    dy = latlng2.lat - latlng1.lat;
-
-		return Math.sqrt(dx * dx + dy * dy);
-	},
-
-	infinite: true
-});
-
-
-
-/*
- * @namespace CRS
- * @crs L.CRS.Earth
- *
- * Serves as the base for CRS that are global such that they cover the earth.
- * Can only be used as the base for other CRS and cannot be used directly,
- * since it does not have a `code`, `projection` or `transformation`. `distance()` returns
- * meters.
- */
-
-L.CRS.Earth = L.extend({}, L.CRS, {
-	wrapLng: [-180, 180],
-
-	// Mean Earth Radius, as recommended for use by
-	// the International Union of Geodesy and Geophysics,
-	// see http://rosettacode.org/wiki/Haversine_formula
-	R: 6371000,
-
-	// distance between two geographical points using spherical law of cosines approximation
-	distance: function (latlng1, latlng2) {
-		var rad = Math.PI / 180,
-		    lat1 = latlng1.lat * rad,
-		    lat2 = latlng2.lat * rad,
-		    a = Math.sin(lat1) * Math.sin(lat2) +
-		        Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad);
-
-		return this.R * Math.acos(Math.min(a, 1));
-	}
-});
-
-
-
-/*
- * @namespace CRS
- * @crs L.CRS.EPSG3857
- *
- * The most common CRS for online maps, used by almost all free and commercial
- * tile providers. Uses Spherical Mercator projection. Set in by default in
- * Map's `crs` option.
- */
-
-L.CRS.EPSG3857 = L.extend({}, L.CRS.Earth, {
-	code: 'EPSG:3857',
-	projection: L.Projection.SphericalMercator,
-
-	transformation: (function () {
-		var scale = 0.5 / (Math.PI * L.Projection.SphericalMercator.R);
-		return new L.Transformation(scale, 0.5, -scale, 0.5);
-	}())
-});
-
-L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, {
-	code: 'EPSG:900913'
-});
-
-
-
-/*
- * @namespace CRS
- * @crs L.CRS.EPSG4326
- *
- * A common CRS among GIS enthusiasts. Uses simple Equirectangular projection.
- *
- * Leaflet 1.0.x complies with the [TMS coordinate scheme for EPSG:4326](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#global-geodetic),
- * which is a breaking change from 0.7.x behaviour.  If you are using a `TileLayer`
- * with this CRS, ensure that there are two 256x256 pixel tiles covering the
- * whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90),
- * or (-180,-90) for `TileLayer`s with [the `tms` option](#tilelayer-tms) set.
- */
-
-L.CRS.EPSG4326 = L.extend({}, L.CRS.Earth, {
-	code: 'EPSG:4326',
-	projection: L.Projection.LonLat,
-	transformation: new L.Transformation(1 / 180, 1, -1 / 180, 0.5)
-});
-
-
-
-/*
- * @class Map
- * @aka L.Map
- * @inherits Evented
- *
- * The central class of the API — it is used to create a map on a page and manipulate it.
- *
- * @example
- *
- * ```js
- * // initialize the map on the "map" div with a given center and zoom
- * var map = L.map('map', {
- * 	center: [51.505, -0.09],
- * 	zoom: 13
- * });
- * ```
- *
- */
-
-L.Map = L.Evented.extend({
-
-	options: {
-		// @section Map State Options
-		// @option crs: CRS = L.CRS.EPSG3857
-		// The [Coordinate Reference System](#crs) to use. Don't change this if you're not
-		// sure what it means.
-		crs: L.CRS.EPSG3857,
-
-		// @option center: LatLng = undefined
-		// Initial geographic center of the map
-		center: undefined,
-
-		// @option zoom: Number = undefined
-		// Initial map zoom level
-		zoom: undefined,
-
-		// @option minZoom: Number = undefined
-		// Minimum zoom level of the map. Overrides any `minZoom` option set on map layers.
-		minZoom: undefined,
-
-		// @option maxZoom: Number = undefined
-		// Maximum zoom level of the map. Overrides any `maxZoom` option set on map layers.
-		maxZoom: undefined,
-
-		// @option layers: Layer[] = []
-		// Array of layers that will be added to the map initially
-		layers: [],
-
-		// @option maxBounds: LatLngBounds = null
-		// When this option is set, the map restricts the view to the given
-		// geographical bounds, bouncing the user back if the user tries to pan
-		// outside the view. To set the restriction dynamically, use
-		// [`setMaxBounds`](#map-setmaxbounds) method.
-		maxBounds: undefined,
-
-		// @option renderer: Renderer = *
-		// The default method for drawing vector layers on the map. `L.SVG`
-		// or `L.Canvas` by default depending on browser support.
-		renderer: undefined,
-
-
-		// @section Animation Options
-		// @option zoomAnimation: Boolean = true
-		// Whether the map zoom animation is enabled. By default it's enabled
-		// in all browsers that support CSS3 Transitions except Android.
-		zoomAnimation: true,
-
-		// @option zoomAnimationThreshold: Number = 4
-		// Won't animate zoom if the zoom difference exceeds this value.
-		zoomAnimationThreshold: 4,
-
-		// @option fadeAnimation: Boolean = true
-		// Whether the tile fade animation is enabled. By default it's enabled
-		// in all browsers that support CSS3 Transitions except Android.
-		fadeAnimation: true,
-
-		// @option markerZoomAnimation: Boolean = true
-		// Whether markers animate their zoom with the zoom animation, if disabled
-		// they will disappear for the length of the animation. By default it's
-		// enabled in all browsers that support CSS3 Transitions except Android.
-		markerZoomAnimation: true,
-
-		// @option transform3DLimit: Number = 2^23
-		// Defines the maximum size of a CSS translation transform. The default
-		// value should not be changed unless a web browser positions layers in
-		// the wrong place after doing a large `panBy`.
-		transform3DLimit: 8388608, // Precision limit of a 32-bit float
-
-		// @section Interaction Options
-		// @option zoomSnap: Number = 1
-		// Forces the map's zoom level to always be a multiple of this, particularly
-		// right after a [`fitBounds()`](#map-fitbounds) or a pinch-zoom.
-		// By default, the zoom level snaps to the nearest integer; lower values
-		// (e.g. `0.5` or `0.1`) allow for greater granularity. A value of `0`
-		// means the zoom level will not be snapped after `fitBounds` or a pinch-zoom.
-		zoomSnap: 1,
-
-		// @option zoomDelta: Number = 1
-		// Controls how much the map's zoom level will change after a
-		// [`zoomIn()`](#map-zoomin), [`zoomOut()`](#map-zoomout), pressing `+`
-		// or `-` on the keyboard, or using the [zoom controls](#control-zoom).
-		// Values smaller than `1` (e.g. `0.5`) allow for greater granularity.
-		zoomDelta: 1,
-
-		// @option trackResize: Boolean = true
-		// Whether the map automatically handles browser window resize to update itself.
-		trackResize: true
-	},
-
-	initialize: function (id, options) { // (HTMLElement or String, Object)
-		options = L.setOptions(this, options);
-
-		this._initContainer(id);
-		this._initLayout();
-
-		// hack for https://github.com/Leaflet/Leaflet/issues/1980
-		this._onResize = L.bind(this._onResize, this);
-
-		this._initEvents();
-
-		if (options.maxBounds) {
-			this.setMaxBounds(options.maxBounds);
-		}
-
-		if (options.zoom !== undefined) {
-			this._zoom = this._limitZoom(options.zoom);
-		}
-
-		if (options.center && options.zoom !== undefined) {
-			this.setView(L.latLng(options.center), options.zoom, {reset: true});
-		}
-
-		this._handlers = [];
-		this._layers = {};
-		this._zoomBoundLayers = {};
-		this._sizeChanged = true;
-
-		this.callInitHooks();
-
-		// don't animate on browsers without hardware-accelerated transitions or old Android/Opera
-		this._zoomAnimated = L.DomUtil.TRANSITION && L.Browser.any3d && !L.Browser.mobileOpera &&
-				this.options.zoomAnimation;
-
-		// zoom transitions run with the same duration for all layers, so if one of transitionend events
-		// happens after starting zoom animation (propagating to the map pane), we know that it ended globally
-		if (this._zoomAnimated) {
-			this._createAnimProxy();
-			L.DomEvent.on(this._proxy, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this);
-		}
-
-		this._addLayers(this.options.layers);
-	},
-
-
-	// @section Methods for modifying map state
-
-	// @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this
-	// Sets the view of the map (geographical center and zoom) with the given
-	// animation options.
-	setView: function (center, zoom, options) {
-
-		zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);
-		center = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds);
-		options = options || {};
-
-		this._stop();
-
-		if (this._loaded && !options.reset && options !== true) {
-
-			if (options.animate !== undefined) {
-				options.zoom = L.extend({animate: options.animate}, options.zoom);
-				options.pan = L.extend({animate: options.animate, duration: options.duration}, options.pan);
-			}
-
-			// try animating pan or zoom
-			var moved = (this._zoom !== zoom) ?
-				this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :
-				this._tryAnimatedPan(center, options.pan);
-
-			if (moved) {
-				// prevent resize handler call, the view will refresh after animation anyway
-				clearTimeout(this._sizeTimer);
-				return this;
-			}
-		}
-
-		// animation didn't start, just reset the map view
-		this._resetView(center, zoom);
-
-		return this;
-	},
-
-	// @method setZoom(zoom: Number, options: Zoom/pan options): this
-	// Sets the zoom of the map.
-	setZoom: function (zoom, options) {
-		if (!this._loaded) {
-			this._zoom = zoom;
-			return this;
-		}
-		return this.setView(this.getCenter(), zoom, {zoom: options});
-	},
-
-	// @method zoomIn(delta?: Number, options?: Zoom options): this
-	// Increases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).
-	zoomIn: function (delta, options) {
-		delta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1);
-		return this.setZoom(this._zoom + delta, options);
-	},
-
-	// @method zoomOut(delta?: Number, options?: Zoom options): this
-	// Decreases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).
-	zoomOut: function (delta, options) {
-		delta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1);
-		return this.setZoom(this._zoom - delta, options);
-	},
-
-	// @method setZoomAround(latlng: LatLng, zoom: Number, options: Zoom options): this
-	// Zooms the map while keeping a specified geographical point on the map
-	// stationary (e.g. used internally for scroll zoom and double-click zoom).
-	// @alternative
-	// @method setZoomAround(offset: Point, zoom: Number, options: Zoom options): this
-	// Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.
-	setZoomAround: function (latlng, zoom, options) {
-		var scale = this.getZoomScale(zoom),
-		    viewHalf = this.getSize().divideBy(2),
-		    containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),
-
-		    centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),
-		    newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));
-
-		return this.setView(newCenter, zoom, {zoom: options});
-	},
-
-	_getBoundsCenterZoom: function (bounds, options) {
-
-		options = options || {};
-		bounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);
-
-		var paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]),
-		    paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]),
-
-		    zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR));
-
-		zoom = (typeof options.maxZoom === 'number') ? Math.min(options.maxZoom, zoom) : zoom;
-
-		var paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),
-
-		    swPoint = this.project(bounds.getSouthWest(), zoom),
-		    nePoint = this.project(bounds.getNorthEast(), zoom),
-		    center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);
-
-		return {
-			center: center,
-			zoom: zoom
-		};
-	},
-
-	// @method fitBounds(bounds: LatLngBounds, options?: fitBounds options): this
-	// Sets a map view that contains the given geographical bounds with the
-	// maximum zoom level possible.
-	fitBounds: function (bounds, options) {
-
-		bounds = L.latLngBounds(bounds);
-
-		if (!bounds.isValid()) {
-			throw new Error('Bounds are not valid.');
-		}
-
-		var target = this._getBoundsCenterZoom(bounds, options);
-		return this.setView(target.center, target.zoom, options);
-	},
-
-	// @method fitWorld(options?: fitBounds options): this
-	// Sets a map view that mostly contains the whole world with the maximum
-	// zoom level possible.
-	fitWorld: function (options) {
-		return this.fitBounds([[-90, -180], [90, 180]], options);
-	},
-
-	// @method panTo(latlng: LatLng, options?: Pan options): this
-	// Pans the map to a given center.
-	panTo: function (center, options) { // (LatLng)
-		return this.setView(center, this._zoom, {pan: options});
-	},
-
-	// @method panBy(offset: Point): this
-	// Pans the map by a given number of pixels (animated).
-	panBy: function (offset, options) {
-		offset = L.point(offset).round();
-		options = options || {};
-
-		if (!offset.x && !offset.y) {
-			return this.fire('moveend');
-		}
-		// If we pan too far, Chrome gets issues with tiles
-		// and makes them disappear or appear in the wrong place (slightly offset) #2602
-		if (options.animate !== true && !this.getSize().contains(offset)) {
-			this._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom());
-			return this;
-		}
-
-		if (!this._panAnim) {
-			this._panAnim = new L.PosAnimation();
-
-			this._panAnim.on({
-				'step': this._onPanTransitionStep,
-				'end': this._onPanTransitionEnd
-			}, this);
-		}
-
-		// don't fire movestart if animating inertia
-		if (!options.noMoveStart) {
-			this.fire('movestart');
-		}
-
-		// animate pan unless animate: false specified
-		if (options.animate !== false) {
-			L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim');
-
-			var newPos = this._getMapPanePos().subtract(offset).round();
-			this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);
-		} else {
-			this._rawPanBy(offset);
-			this.fire('move').fire('moveend');
-		}
-
-		return this;
-	},
-
-	// @method flyTo(latlng: LatLng, zoom?: Number, options?: Zoom/pan options): this
-	// Sets the view of the map (geographical center and zoom) performing a smooth
-	// pan-zoom animation.
-	flyTo: function (targetCenter, targetZoom, options) {
-
-		options = options || {};
-		if (options.animate === false || !L.Browser.any3d) {
-			return this.setView(targetCenter, targetZoom, options);
-		}
-
-		this._stop();
-
-		var from = this.project(this.getCenter()),
-		    to = this.project(targetCenter),
-		    size = this.getSize(),
-		    startZoom = this._zoom;
-
-		targetCenter = L.latLng(targetCenter);
-		targetZoom = targetZoom === undefined ? startZoom : targetZoom;
-
-		var w0 = Math.max(size.x, size.y),
-		    w1 = w0 * this.getZoomScale(startZoom, targetZoom),
-		    u1 = (to.distanceTo(from)) || 1,
-		    rho = 1.42,
-		    rho2 = rho * rho;
-
-		function r(i) {
-			var s1 = i ? -1 : 1,
-			    s2 = i ? w1 : w0,
-			    t1 = w1 * w1 - w0 * w0 + s1 * rho2 * rho2 * u1 * u1,
-			    b1 = 2 * s2 * rho2 * u1,
-			    b = t1 / b1,
-			    sq = Math.sqrt(b * b + 1) - b;
-
-			    // workaround for floating point precision bug when sq = 0, log = -Infinite,
-			    // thus triggering an infinite loop in flyTo
-			    var log = sq < 0.000000001 ? -18 : Math.log(sq);
-
-			return log;
-		}
-
-		function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }
-		function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }
-		function tanh(n) { return sinh(n) / cosh(n); }
-
-		var r0 = r(0);
-
-		function w(s) { return w0 * (cosh(r0) / cosh(r0 + rho * s)); }
-		function u(s) { return w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2; }
-
-		function easeOut(t) { return 1 - Math.pow(1 - t, 1.5); }
-
-		var start = Date.now(),
-		    S = (r(1) - r0) / rho,
-		    duration = options.duration ? 1000 * options.duration : 1000 * S * 0.8;
-
-		function frame() {
-			var t = (Date.now() - start) / duration,
-			    s = easeOut(t) * S;
-
-			if (t <= 1) {
-				this._flyToFrame = L.Util.requestAnimFrame(frame, this);
-
-				this._move(
-					this.unproject(from.add(to.subtract(from).multiplyBy(u(s) / u1)), startZoom),
-					this.getScaleZoom(w0 / w(s), startZoom),
-					{flyTo: true});
-
-			} else {
-				this
-					._move(targetCenter, targetZoom)
-					._moveEnd(true);
-			}
-		}
-
-		this._moveStart(true);
-
-		frame.call(this);
-		return this;
-	},
-
-	// @method flyToBounds(bounds: LatLngBounds, options?: fitBounds options): this
-	// Sets the view of the map with a smooth animation like [`flyTo`](#map-flyto),
-	// but takes a bounds parameter like [`fitBounds`](#map-fitbounds).
-	flyToBounds: function (bounds, options) {
-		var target = this._getBoundsCenterZoom(bounds, options);
-		return this.flyTo(target.center, target.zoom, options);
-	},
-
-	// @method setMaxBounds(bounds: Bounds): this
-	// Restricts the map view to the given bounds (see the [maxBounds](#map-maxbounds) option).
-	setMaxBounds: function (bounds) {
-		bounds = L.latLngBounds(bounds);
-
-		if (!bounds.isValid()) {
-			this.options.maxBounds = null;
-			return this.off('moveend', this._panInsideMaxBounds);
-		} else if (this.options.maxBounds) {
-			this.off('moveend', this._panInsideMaxBounds);
-		}
-
-		this.options.maxBounds = bounds;
-
-		if (this._loaded) {
-			this._panInsideMaxBounds();
-		}
-
-		return this.on('moveend', this._panInsideMaxBounds);
-	},
-
-	// @method setMinZoom(zoom: Number): this
-	// Sets the lower limit for the available zoom levels (see the [minZoom](#map-minzoom) option).
-	setMinZoom: function (zoom) {
-		this.options.minZoom = zoom;
-
-		if (this._loaded && this.getZoom() < this.options.minZoom) {
-			return this.setZoom(zoom);
-		}
-
-		return this;
-	},
-
-	// @method setMaxZoom(zoom: Number): this
-	// Sets the upper limit for the available zoom levels (see the [maxZoom](#map-maxzoom) option).
-	setMaxZoom: function (zoom) {
-		this.options.maxZoom = zoom;
-
-		if (this._loaded && (this.getZoom() > this.options.maxZoom)) {
-			return this.setZoom(zoom);
-		}
-
-		return this;
-	},
-
-	// @method panInsideBounds(bounds: LatLngBounds, options?: Pan options): this
-	// Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.
-	panInsideBounds: function (bounds, options) {
-		this._enforcingBounds = true;
-		var center = this.getCenter(),
-		    newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds));
-
-		if (!center.equals(newCenter)) {
-			this.panTo(newCenter, options);
-		}
-
-		this._enforcingBounds = false;
-		return this;
-	},
-
-	// @method invalidateSize(options: Zoom/Pan options): this
-	// Checks if the map container size changed and updates the map if so —
-	// call it after you've changed the map size dynamically, also animating
-	// pan by default. If `options.pan` is `false`, panning will not occur.
-	// If `options.debounceMoveend` is `true`, it will delay `moveend` event so
-	// that it doesn't happen often even if the method is called many
-	// times in a row.
-
-	// @alternative
-	// @method invalidateSize(animate: Boolean): this
-	// Checks if the map container size changed and updates the map if so —
-	// call it after you've changed the map size dynamically, also animating
-	// pan by default.
-	invalidateSize: function (options) {
-		if (!this._loaded) { return this; }
-
-		options = L.extend({
-			animate: false,
-			pan: true
-		}, options === true ? {animate: true} : options);
-
-		var oldSize = this.getSize();
-		this._sizeChanged = true;
-		this._lastCenter = null;
-
-		var newSize = this.getSize(),
-		    oldCenter = oldSize.divideBy(2).round(),
-		    newCenter = newSize.divideBy(2).round(),
-		    offset = oldCenter.subtract(newCenter);
-
-		if (!offset.x && !offset.y) { return this; }
-
-		if (options.animate && options.pan) {
-			this.panBy(offset);
-
-		} else {
-			if (options.pan) {
-				this._rawPanBy(offset);
-			}
-
-			this.fire('move');
-
-			if (options.debounceMoveend) {
-				clearTimeout(this._sizeTimer);
-				this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);
-			} else {
-				this.fire('moveend');
-			}
-		}
-
-		// @section Map state change events
-		// @event resize: ResizeEvent
-		// Fired when the map is resized.
-		return this.fire('resize', {
-			oldSize: oldSize,
-			newSize: newSize
-		});
-	},
-
-	// @section Methods for modifying map state
-	// @method stop(): this
-	// Stops the currently running `panTo` or `flyTo` animation, if any.
-	stop: function () {
-		this.setZoom(this._limitZoom(this._zoom));
-		if (!this.options.zoomSnap) {
-			this.fire('viewreset');
-		}
-		return this._stop();
-	},
-
-	// @section Geolocation methods
-	// @method locate(options?: Locate options): this
-	// Tries to locate the user using the Geolocation API, firing a [`locationfound`](#map-locationfound)
-	// event with location data on success or a [`locationerror`](#map-locationerror) event on failure,
-	// and optionally sets the map view to the user's location with respect to
-	// detection accuracy (or to the world view if geolocation failed).
-	// Note that, if your page doesn't use HTTPS, this method will fail in
-	// modern browsers ([Chrome 50 and newer](https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins))
-	// See `Locate options` for more details.
-	locate: function (options) {
-
-		options = this._locateOptions = L.extend({
-			timeout: 10000,
-			watch: false
-			// setView: false
-			// maxZoom: <Number>
-			// maximumAge: 0
-			// enableHighAccuracy: false
-		}, options);
-
-		if (!('geolocation' in navigator)) {
-			this._handleGeolocationError({
-				code: 0,
-				message: 'Geolocation not supported.'
-			});
-			return this;
-		}
-
-		var onResponse = L.bind(this._handleGeolocationResponse, this),
-		    onError = L.bind(this._handleGeolocationError, this);
-
-		if (options.watch) {
-			this._locationWatchId =
-			        navigator.geolocation.watchPosition(onResponse, onError, options);
-		} else {
-			navigator.geolocation.getCurrentPosition(onResponse, onError, options);
-		}
-		return this;
-	},
-
-	// @method stopLocate(): this
-	// Stops watching location previously initiated by `map.locate({watch: true})`
-	// and aborts resetting the map view if map.locate was called with
-	// `{setView: true}`.
-	stopLocate: function () {
-		if (navigator.geolocation && navigator.geolocation.clearWatch) {
-			navigator.geolocation.clearWatch(this._locationWatchId);
-		}
-		if (this._locateOptions) {
-			this._locateOptions.setView = false;
-		}
-		return this;
-	},
-
-	_handleGeolocationError: function (error) {
-		var c = error.code,
-		    message = error.message ||
-		            (c === 1 ? 'permission denied' :
-		            (c === 2 ? 'position unavailable' : 'timeout'));
-
-		if (this._locateOptions.setView && !this._loaded) {
-			this.fitWorld();
-		}
-
-		// @section Location events
-		// @event locationerror: ErrorEvent
-		// Fired when geolocation (using the [`locate`](#map-locate) method) failed.
-		this.fire('locationerror', {
-			code: c,
-			message: 'Geolocation error: ' + message + '.'
-		});
-	},
-
-	_handleGeolocationResponse: function (pos) {
-		var lat = pos.coords.latitude,
-		    lng = pos.coords.longitude,
-		    latlng = new L.LatLng(lat, lng),
-		    bounds = latlng.toBounds(pos.coords.accuracy),
-		    options = this._locateOptions;
-
-		if (options.setView) {
-			var zoom = this.getBoundsZoom(bounds);
-			this.setView(latlng, options.maxZoom ? Math.min(zoom, options.maxZoom) : zoom);
-		}
-
-		var data = {
-			latlng: latlng,
-			bounds: bounds,
-			timestamp: pos.timestamp
-		};
-
-		for (var i in pos.coords) {
-			if (typeof pos.coords[i] === 'number') {
-				data[i] = pos.coords[i];
-			}
-		}
-
-		// @event locationfound: LocationEvent
-		// Fired when geolocation (using the [`locate`](#map-locate) method)
-		// went successfully.
-		this.fire('locationfound', data);
-	},
-
-	// TODO handler.addTo
-	// TODO Appropiate docs section?
-	// @section Other Methods
-	// @method addHandler(name: String, HandlerClass: Function): this
-	// Adds a new `Handler` to the map, given its name and constructor function.
-	addHandler: function (name, HandlerClass) {
-		if (!HandlerClass) { return this; }
-
-		var handler = this[name] = new HandlerClass(this);
-
-		this._handlers.push(handler);
-
-		if (this.options[name]) {
-			handler.enable();
-		}
-
-		return this;
-	},
-
-	// @method remove(): this
-	// Destroys the map and clears all related event listeners.
-	remove: function () {
-
-		this._initEvents(true);
-
-		if (this._containerId !== this._container._leaflet_id) {
-			throw new Error('Map container is being reused by another instance');
-		}
-
-		try {
-			// throws error in IE6-8
-			delete this._container._leaflet_id;
-			delete this._containerId;
-		} catch (e) {
-			/*eslint-disable */
-			this._container._leaflet_id = undefined;
-			/*eslint-enable */
-			this._containerId = undefined;
-		}
-
-		L.DomUtil.remove(this._mapPane);
-
-		if (this._clearControlPos) {
-			this._clearControlPos();
-		}
-
-		this._clearHandlers();
-
-		if (this._loaded) {
-			// @section Map state change events
-			// @event unload: Event
-			// Fired when the map is destroyed with [remove](#map-remove) method.
-			this.fire('unload');
-		}
-
-		for (var i in this._layers) {
-			this._layers[i].remove();
-		}
-
-		return this;
-	},
-
-	// @section Other Methods
-	// @method createPane(name: String, container?: HTMLElement): HTMLElement
-	// Creates a new [map pane](#map-pane) with the given name if it doesn't exist already,
-	// then returns it. The pane is created as a children of `container`, or
-	// as a children of the main map pane if not set.
-	createPane: function (name, container) {
-		var className = 'leaflet-pane' + (name ? ' leaflet-' + name.replace('Pane', '') + '-pane' : ''),
-		    pane = L.DomUtil.create('div', className, container || this._mapPane);
-
-		if (name) {
-			this._panes[name] = pane;
-		}
-		return pane;
-	},
-
-	// @section Methods for Getting Map State
-
-	// @method getCenter(): LatLng
-	// Returns the geographical center of the map view
-	getCenter: function () {
-		this._checkIfLoaded();
-
-		if (this._lastCenter && !this._moved()) {
-			return this._lastCenter;
-		}
-		return this.layerPointToLatLng(this._getCenterLayerPoint());
-	},
-
-	// @method getZoom(): Number
-	// Returns the current zoom level of the map view
-	getZoom: function () {
-		return this._zoom;
-	},
-
-	// @method getBounds(): LatLngBounds
-	// Returns the geographical bounds visible in the current map view
-	getBounds: function () {
-		var bounds = this.getPixelBounds(),
-		    sw = this.unproject(bounds.getBottomLeft()),
-		    ne = this.unproject(bounds.getTopRight());
-
-		return new L.LatLngBounds(sw, ne);
-	},
-
-	// @method getMinZoom(): Number
-	// Returns the minimum zoom level of the map (if set in the `minZoom` option of the map or of any layers), or `0` by default.
-	getMinZoom: function () {
-		return this.options.minZoom === undefined ? this._layersMinZoom || 0 : this.options.minZoom;
-	},
-
-	// @method getMaxZoom(): Number
-	// Returns the maximum zoom level of the map (if set in the `maxZoom` option of the map or of any layers).
-	getMaxZoom: function () {
-		return this.options.maxZoom === undefined ?
-			(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :
-			this.options.maxZoom;
-	},
-
-	// @method getBoundsZoom(bounds: LatLngBounds, inside?: Boolean): Number
-	// Returns the maximum zoom level on which the given bounds fit to the map
-	// view in its entirety. If `inside` (optional) is set to `true`, the method
-	// instead returns the minimum zoom level on which the map view fits into
-	// the given bounds in its entirety.
-	getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number
-		bounds = L.latLngBounds(bounds);
-		padding = L.point(padding || [0, 0]);
-
-		var zoom = this.getZoom() || 0,
-		    min = this.getMinZoom(),
-		    max = this.getMaxZoom(),
-		    nw = bounds.getNorthWest(),
-		    se = bounds.getSouthEast(),
-		    size = this.getSize().subtract(padding),
-		    boundsSize = L.bounds(this.project(se, zoom), this.project(nw, zoom)).getSize(),
-		    snap = L.Browser.any3d ? this.options.zoomSnap : 1;
-
-		var scale = Math.min(size.x / boundsSize.x, size.y / boundsSize.y);
-		zoom = this.getScaleZoom(scale, zoom);
-
-		if (snap) {
-			zoom = Math.round(zoom / (snap / 100)) * (snap / 100); // don't jump if within 1% of a snap level
-			zoom = inside ? Math.ceil(zoom / snap) * snap : Math.floor(zoom / snap) * snap;
-		}
-
-		return Math.max(min, Math.min(max, zoom));
-	},
-
-	// @method getSize(): Point
-	// Returns the current size of the map container (in pixels).
-	getSize: function () {
-		if (!this._size || this._sizeChanged) {
-			this._size = new L.Point(
-				this._container.clientWidth || 0,
-				this._container.clientHeight || 0);
-
-			this._sizeChanged = false;
-		}
-		return this._size.clone();
-	},
-
-	// @method getPixelBounds(): Bounds
-	// Returns the bounds of the current map view in projected pixel
-	// coordinates (sometimes useful in layer and overlay implementations).
-	getPixelBounds: function (center, zoom) {
-		var topLeftPoint = this._getTopLeftPoint(center, zoom);
-		return new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));
-	},
-
-	// TODO: Check semantics - isn't the pixel origin the 0,0 coord relative to
-	// the map pane? "left point of the map layer" can be confusing, specially
-	// since there can be negative offsets.
-	// @method getPixelOrigin(): Point
-	// Returns the projected pixel coordinates of the top left point of
-	// the map layer (useful in custom layer and overlay implementations).
-	getPixelOrigin: function () {
-		this._checkIfLoaded();
-		return this._pixelOrigin;
-	},
-
-	// @method getPixelWorldBounds(zoom?: Number): Bounds
-	// Returns the world's bounds in pixel coordinates for zoom level `zoom`.
-	// If `zoom` is omitted, the map's current zoom level is used.
-	getPixelWorldBounds: function (zoom) {
-		return this.options.crs.getProjectedBounds(zoom === undefined ? this.getZoom() : zoom);
-	},
-
-	// @section Other Methods
-
-	// @method getPane(pane: String|HTMLElement): HTMLElement
-	// Returns a [map pane](#map-pane), given its name or its HTML element (its identity).
-	getPane: function (pane) {
-		return typeof pane === 'string' ? this._panes[pane] : pane;
-	},
-
-	// @method getPanes(): Object
-	// Returns a plain object containing the names of all [panes](#map-pane) as keys and
-	// the panes as values.
-	getPanes: function () {
-		return this._panes;
-	},
-
-	// @method getContainer: HTMLElement
-	// Returns the HTML element that contains the map.
-	getContainer: function () {
-		return this._container;
-	},
-
-
-	// @section Conversion Methods
-
-	// @method getZoomScale(toZoom: Number, fromZoom: Number): Number
-	// Returns the scale factor to be applied to a map transition from zoom level
-	// `fromZoom` to `toZoom`. Used internally to help with zoom animations.
-	getZoomScale: function (toZoom, fromZoom) {
-		// TODO replace with universal implementation after refactoring projections
-		var crs = this.options.crs;
-		fromZoom = fromZoom === undefined ? this._zoom : fromZoom;
-		return crs.scale(toZoom) / crs.scale(fromZoom);
-	},
-
-	// @method getScaleZoom(scale: Number, fromZoom: Number): Number
-	// Returns the zoom level that the map would end up at, if it is at `fromZoom`
-	// level and everything is scaled by a factor of `scale`. Inverse of
-	// [`getZoomScale`](#map-getZoomScale).
-	getScaleZoom: function (scale, fromZoom) {
-		var crs = this.options.crs;
-		fromZoom = fromZoom === undefined ? this._zoom : fromZoom;
-		var zoom = crs.zoom(scale * crs.scale(fromZoom));
-		return isNaN(zoom) ? Infinity : zoom;
-	},
-
-	// @method project(latlng: LatLng, zoom: Number): Point
-	// Projects a geographical coordinate `LatLng` according to the projection
-	// of the map's CRS, then scales it according to `zoom` and the CRS's
-	// `Transformation`. The result is pixel coordinate relative to
-	// the CRS origin.
-	project: function (latlng, zoom) {
-		zoom = zoom === undefined ? this._zoom : zoom;
-		return this.options.crs.latLngToPoint(L.latLng(latlng), zoom);
-	},
-
-	// @method unproject(point: Point, zoom: Number): LatLng
-	// Inverse of [`project`](#map-project).
-	unproject: function (point, zoom) {
-		zoom = zoom === undefined ? this._zoom : zoom;
-		return this.options.crs.pointToLatLng(L.point(point), zoom);
-	},
-
-	// @method layerPointToLatLng(point: Point): LatLng
-	// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),
-	// returns the corresponding geographical coordinate (for the current zoom level).
-	layerPointToLatLng: function (point) {
-		var projectedPoint = L.point(point).add(this.getPixelOrigin());
-		return this.unproject(projectedPoint);
-	},
-
-	// @method latLngToLayerPoint(latlng: LatLng): Point
-	// Given a geographical coordinate, returns the corresponding pixel coordinate
-	// relative to the [origin pixel](#map-getpixelorigin).
-	latLngToLayerPoint: function (latlng) {
-		var projectedPoint = this.project(L.latLng(latlng))._round();
-		return projectedPoint._subtract(this.getPixelOrigin());
-	},
-
-	// @method wrapLatLng(latlng: LatLng): LatLng
-	// Returns a `LatLng` where `lat` and `lng` has been wrapped according to the
-	// map's CRS's `wrapLat` and `wrapLng` properties, if they are outside the
-	// CRS's bounds.
-	// By default this means longitude is wrapped around the dateline so its
-	// value is between -180 and +180 degrees.
-	wrapLatLng: function (latlng) {
-		return this.options.crs.wrapLatLng(L.latLng(latlng));
-	},
-
-	// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds
-	// Returns a `LatLngBounds` with the same size as the given one, ensuring that
-	// its center is within the CRS's bounds.
-	// By default this means the center longitude is wrapped around the dateline so its
-	// value is between -180 and +180 degrees, and the majority of the bounds
-	// overlaps the CRS's bounds.
-	wrapLatLngBounds: function (latlng) {
-		return this.options.crs.wrapLatLngBounds(L.latLngBounds(latlng));
-	},
-
-	// @method distance(latlng1: LatLng, latlng2: LatLng): Number
-	// Returns the distance between two geographical coordinates according to
-	// the map's CRS. By default this measures distance in meters.
-	distance: function (latlng1, latlng2) {
-		return this.options.crs.distance(L.latLng(latlng1), L.latLng(latlng2));
-	},
-
-	// @method containerPointToLayerPoint(point: Point): Point
-	// Given a pixel coordinate relative to the map container, returns the corresponding
-	// pixel coordinate relative to the [origin pixel](#map-getpixelorigin).
-	containerPointToLayerPoint: function (point) { // (Point)
-		return L.point(point).subtract(this._getMapPanePos());
-	},
-
-	// @method layerPointToContainerPoint(point: Point): Point
-	// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),
-	// returns the corresponding pixel coordinate relative to the map container.
-	layerPointToContainerPoint: function (point) { // (Point)
-		return L.point(point).add(this._getMapPanePos());
-	},
-
-	// @method containerPointToLatLng(point: Point): LatLng
-	// Given a pixel coordinate relative to the map container, returns
-	// the corresponding geographical coordinate (for the current zoom level).
-	containerPointToLatLng: function (point) {
-		var layerPoint = this.containerPointToLayerPoint(L.point(point));
-		return this.layerPointToLatLng(layerPoint);
-	},
-
-	// @method latLngToContainerPoint(latlng: LatLng): Point
-	// Given a geographical coordinate, returns the corresponding pixel coordinate
-	// relative to the map container.
-	latLngToContainerPoint: function (latlng) {
-		return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));
-	},
-
-	// @method mouseEventToContainerPoint(ev: MouseEvent): Point
-	// Given a MouseEvent object, returns the pixel coordinate relative to the
-	// map container where the event took place.
-	mouseEventToContainerPoint: function (e) {
-		return L.DomEvent.getMousePosition(e, this._container);
-	},
-
-	// @method mouseEventToLayerPoint(ev: MouseEvent): Point
-	// Given a MouseEvent object, returns the pixel coordinate relative to
-	// the [origin pixel](#map-getpixelorigin) where the event took place.
-	mouseEventToLayerPoint: function (e) {
-		return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));
-	},
-
-	// @method mouseEventToLatLng(ev: MouseEvent): LatLng
-	// Given a MouseEvent object, returns geographical coordinate where the
-	// event took place.
-	mouseEventToLatLng: function (e) { // (MouseEvent)
-		return this.layerPointToLatLng(this.mouseEventToLayerPoint(e));
-	},
-
-
-	// map initialization methods
-
-	_initContainer: function (id) {
-		var container = this._container = L.DomUtil.get(id);
-
-		if (!container) {
-			throw new Error('Map container not found.');
-		} else if (container._leaflet_id) {
-			throw new Error('Map container is already initialized.');
-		}
-
-		L.DomEvent.addListener(container, 'scroll', this._onScroll, this);
-		this._containerId = L.Util.stamp(container);
-	},
-
-	_initLayout: function () {
-		var container = this._container;
-
-		this._fadeAnimated = this.options.fadeAnimation && L.Browser.any3d;
-
-		L.DomUtil.addClass(container, 'leaflet-container' +
-			(L.Browser.touch ? ' leaflet-touch' : '') +
-			(L.Browser.retina ? ' leaflet-retina' : '') +
-			(L.Browser.ielt9 ? ' leaflet-oldie' : '') +
-			(L.Browser.safari ? ' leaflet-safari' : '') +
-			(this._fadeAnimated ? ' leaflet-fade-anim' : ''));
-
-		var position = L.DomUtil.getStyle(container, 'position');
-
-		if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {
-			container.style.position = 'relative';
-		}
-
-		this._initPanes();
-
-		if (this._initControlPos) {
-			this._initControlPos();
-		}
-	},
-
-	_initPanes: function () {
-		var panes = this._panes = {};
-		this._paneRenderers = {};
-
-		// @section
-		//
-		// Panes are DOM elements used to control the ordering of layers on the map. You
-		// can access panes with [`map.getPane`](#map-getpane) or
-		// [`map.getPanes`](#map-getpanes) methods. New panes can be created with the
-		// [`map.createPane`](#map-createpane) method.
-		//
-		// Every map has the following default panes that differ only in zIndex.
-		//
-		// @pane mapPane: HTMLElement = 'auto'
-		// Pane that contains all other map panes
-
-		this._mapPane = this.createPane('mapPane', this._container);
-		L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));
-
-		// @pane tilePane: HTMLElement = 200
-		// Pane for `GridLayer`s and `TileLayer`s
-		this.createPane('tilePane');
-		// @pane overlayPane: HTMLElement = 400
-		// Pane for vector overlays (`Path`s), like `Polyline`s and `Polygon`s
-		this.createPane('shadowPane');
-		// @pane shadowPane: HTMLElement = 500
-		// Pane for overlay shadows (e.g. `Marker` shadows)
-		this.createPane('overlayPane');
-		// @pane markerPane: HTMLElement = 600
-		// Pane for `Icon`s of `Marker`s
-		this.createPane('markerPane');
-		// @pane tooltipPane: HTMLElement = 650
-		// Pane for tooltip.
-		this.createPane('tooltipPane');
-		// @pane popupPane: HTMLElement = 700
-		// Pane for `Popup`s.
-		this.createPane('popupPane');
-
-		if (!this.options.markerZoomAnimation) {
-			L.DomUtil.addClass(panes.markerPane, 'leaflet-zoom-hide');
-			L.DomUtil.addClass(panes.shadowPane, 'leaflet-zoom-hide');
-		}
-	},
-
-
-	// private methods that modify map state
-
-	// @section Map state change events
-	_resetView: function (center, zoom) {
-		L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));
-
-		var loading = !this._loaded;
-		this._loaded = true;
-		zoom = this._limitZoom(zoom);
-
-		this.fire('viewprereset');
-
-		var zoomChanged = this._zoom !== zoom;
-		this
-			._moveStart(zoomChanged)
-			._move(center, zoom)
-			._moveEnd(zoomChanged);
-
-		// @event viewreset: Event
-		// Fired when the map needs to redraw its content (this usually happens
-		// on map zoom or load). Very useful for creating custom overlays.
-		this.fire('viewreset');
-
-		// @event load: Event
-		// Fired when the map is initialized (when its center and zoom are set
-		// for the first time).
-		if (loading) {
-			this.fire('load');
-		}
-	},
-
-	_moveStart: function (zoomChanged) {
-		// @event zoomstart: Event
-		// Fired when the map zoom is about to change (e.g. before zoom animation).
-		// @event movestart: Event
-		// Fired when the view of the map starts changing (e.g. user starts dragging the map).
-		if (zoomChanged) {
-			this.fire('zoomstart');
-		}
-		return this.fire('movestart');
-	},
-
-	_move: function (center, zoom, data) {
-		if (zoom === undefined) {
-			zoom = this._zoom;
-		}
-		var zoomChanged = this._zoom !== zoom;
-
-		this._zoom = zoom;
-		this._lastCenter = center;
-		this._pixelOrigin = this._getNewPixelOrigin(center);
-
-		// @event zoom: Event
-		// Fired repeatedly during any change in zoom level, including zoom
-		// and fly animations.
-		if (zoomChanged || (data && data.pinch)) {	// Always fire 'zoom' if pinching because #3530
-			this.fire('zoom', data);
-		}
-
-		// @event move: Event
-		// Fired repeatedly during any movement of the map, including pan and
-		// fly animations.
-		return this.fire('move', data);
-	},
-
-	_moveEnd: function (zoomChanged) {
-		// @event zoomend: Event
-		// Fired when the map has changed, after any animations.
-		if (zoomChanged) {
-			this.fire('zoomend');
-		}
-
-		// @event moveend: Event
-		// Fired when the center of the map stops changing (e.g. user stopped
-		// dragging the map).
-		return this.fire('moveend');
-	},
-
-	_stop: function () {
-		L.Util.cancelAnimFrame(this._flyToFrame);
-		if (this._panAnim) {
-			this._panAnim.stop();
-		}
-		return this;
-	},
-
-	_rawPanBy: function (offset) {
-		L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));
-	},
-
-	_getZoomSpan: function () {
-		return this.getMaxZoom() - this.getMinZoom();
-	},
-
-	_panInsideMaxBounds: function () {
-		if (!this._enforcingBounds) {
-			this.panInsideBounds(this.options.maxBounds);
-		}
-	},
-
-	_checkIfLoaded: function () {
-		if (!this._loaded) {
-			throw new Error('Set map center and zoom first.');
-		}
-	},
-
-	// DOM event handling
-
-	// @section Interaction events
-	_initEvents: function (remove) {
-		if (!L.DomEvent) { return; }
-
-		this._targets = {};
-		this._targets[L.stamp(this._container)] = this;
-
-		var onOff = remove ? 'off' : 'on';
-
-		// @event click: MouseEvent
-		// Fired when the user clicks (or taps) the map.
-		// @event dblclick: MouseEvent
-		// Fired when the user double-clicks (or double-taps) the map.
-		// @event mousedown: MouseEvent
-		// Fired when the user pushes the mouse button on the map.
-		// @event mouseup: MouseEvent
-		// Fired when the user releases the mouse button on the map.
-		// @event mouseover: MouseEvent
-		// Fired when the mouse enters the map.
-		// @event mouseout: MouseEvent
-		// Fired when the mouse leaves the map.
-		// @event mousemove: MouseEvent
-		// Fired while the mouse moves over the map.
-		// @event contextmenu: MouseEvent
-		// Fired when the user pushes the right mouse button on the map, prevents
-		// default browser context menu from showing if there are listeners on
-		// this event. Also fired on mobile when the user holds a single touch
-		// for a second (also called long press).
-		// @event keypress: KeyboardEvent
-		// Fired when the user presses a key from the keyboard while the map is focused.
-		L.DomEvent[onOff](this._container, 'click dblclick mousedown mouseup ' +
-			'mouseover mouseout mousemove contextmenu keypress', this._handleDOMEvent, this);
-
-		if (this.options.trackResize) {
-			L.DomEvent[onOff](window, 'resize', this._onResize, this);
-		}
-
-		if (L.Browser.any3d && this.options.transform3DLimit) {
-			this[onOff]('moveend', this._onMoveEnd);
-		}
-	},
-
-	_onResize: function () {
-		L.Util.cancelAnimFrame(this._resizeRequest);
-		this._resizeRequest = L.Util.requestAnimFrame(
-		        function () { this.invalidateSize({debounceMoveend: true}); }, this);
-	},
-
-	_onScroll: function () {
-		this._container.scrollTop  = 0;
-		this._container.scrollLeft = 0;
-	},
-
-	_onMoveEnd: function () {
-		var pos = this._getMapPanePos();
-		if (Math.max(Math.abs(pos.x), Math.abs(pos.y)) >= this.options.transform3DLimit) {
-			// https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have
-			// a pixel offset on very high values, see: http://jsfiddle.net/dg6r5hhb/
-			this._resetView(this.getCenter(), this.getZoom());
-		}
-	},
-
-	_findEventTargets: function (e, type) {
-		var targets = [],
-		    target,
-		    isHover = type === 'mouseout' || type === 'mouseover',
-		    src = e.target || e.srcElement,
-		    dragging = false;
-
-		while (src) {
-			target = this._targets[L.stamp(src)];
-			if (target && (type === 'click' || type === 'preclick') && !e._simulated && this._draggableMoved(target)) {
-				// Prevent firing click after you just dragged an object.
-				dragging = true;
-				break;
-			}
-			if (target && target.listens(type, true)) {
-				if (isHover && !L.DomEvent._isExternalTarget(src, e)) { break; }
-				targets.push(target);
-				if (isHover) { break; }
-			}
-			if (src === this._container) { break; }
-			src = src.parentNode;
-		}
-		if (!targets.length && !dragging && !isHover && L.DomEvent._isExternalTarget(src, e)) {
-			targets = [this];
-		}
-		return targets;
-	},
-
-	_handleDOMEvent: function (e) {
-		if (!this._loaded || L.DomEvent._skipped(e)) { return; }
-
-		var type = e.type === 'keypress' && e.keyCode === 13 ? 'click' : e.type;
-
-		if (type === 'mousedown') {
-			// prevents outline when clicking on keyboard-focusable element
-			L.DomUtil.preventOutline(e.target || e.srcElement);
-		}
-
-		this._fireDOMEvent(e, type);
-	},
-
-	_fireDOMEvent: function (e, type, targets) {
-
-		if (e.type === 'click') {
-			// Fire a synthetic 'preclick' event which propagates up (mainly for closing popups).
-			// @event preclick: MouseEvent
-			// Fired before mouse click on the map (sometimes useful when you
-			// want something to happen on click before any existing click
-			// handlers start running).
-			var synth = L.Util.extend({}, e);
-			synth.type = 'preclick';
-			this._fireDOMEvent(synth, synth.type, targets);
-		}
-
-		if (e._stopped) { return; }
-
-		// Find the layer the event is propagating from and its parents.
-		targets = (targets || []).concat(this._findEventTargets(e, type));
-
-		if (!targets.length) { return; }
-
-		var target = targets[0];
-		if (type === 'contextmenu' && target.listens(type, true)) {
-			L.DomEvent.preventDefault(e);
-		}
-
-		var data = {
-			originalEvent: e
-		};
-
-		if (e.type !== 'keypress') {
-			var isMarker = target instanceof L.Marker;
-			data.containerPoint = isMarker ?
-					this.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e);
-			data.layerPoint = this.containerPointToLayerPoint(data.containerPoint);
-			data.latlng = isMarker ? target.getLatLng() : this.layerPointToLatLng(data.layerPoint);
-		}
-
-		for (var i = 0; i < targets.length; i++) {
-			targets[i].fire(type, data, true);
-			if (data.originalEvent._stopped ||
-				(targets[i].options.nonBubblingEvents && L.Util.indexOf(targets[i].options.nonBubblingEvents, type) !== -1)) { return; }
-		}
-	},
-
-	_draggableMoved: function (obj) {
-		obj = obj.dragging && obj.dragging.enabled() ? obj : this;
-		return (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved());
-	},
-
-	_clearHandlers: function () {
-		for (var i = 0, len = this._handlers.length; i < len; i++) {
-			this._handlers[i].disable();
-		}
-	},
-
-	// @section Other Methods
-
-	// @method whenReady(fn: Function, context?: Object): this
-	// Runs the given function `fn` when the map gets initialized with
-	// a view (center and zoom) and at least one layer, or immediately
-	// if it's already initialized, optionally passing a function context.
-	whenReady: function (callback, context) {
-		if (this._loaded) {
-			callback.call(context || this, {target: this});
-		} else {
-			this.on('load', callback, context);
-		}
-		return this;
-	},
-
-
-	// private methods for getting map state
-
-	_getMapPanePos: function () {
-		return L.DomUtil.getPosition(this._mapPane) || new L.Point(0, 0);
-	},
-
-	_moved: function () {
-		var pos = this._getMapPanePos();
-		return pos && !pos.equals([0, 0]);
-	},
-
-	_getTopLeftPoint: function (center, zoom) {
-		var pixelOrigin = center && zoom !== undefined ?
-			this._getNewPixelOrigin(center, zoom) :
-			this.getPixelOrigin();
-		return pixelOrigin.subtract(this._getMapPanePos());
-	},
-
-	_getNewPixelOrigin: function (center, zoom) {
-		var viewHalf = this.getSize()._divideBy(2);
-		return this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round();
-	},
-
-	_latLngToNewLayerPoint: function (latlng, zoom, center) {
-		var topLeft = this._getNewPixelOrigin(center, zoom);
-		return this.project(latlng, zoom)._subtract(topLeft);
-	},
-
-	_latLngBoundsToNewLayerBounds: function (latLngBounds, zoom, center) {
-		var topLeft = this._getNewPixelOrigin(center, zoom);
-		return L.bounds([
-			this.project(latLngBounds.getSouthWest(), zoom)._subtract(topLeft),
-			this.project(latLngBounds.getNorthWest(), zoom)._subtract(topLeft),
-			this.project(latLngBounds.getSouthEast(), zoom)._subtract(topLeft),
-			this.project(latLngBounds.getNorthEast(), zoom)._subtract(topLeft)
-		]);
-	},
-
-	// layer point of the current center
-	_getCenterLayerPoint: function () {
-		return this.containerPointToLayerPoint(this.getSize()._divideBy(2));
-	},
-
-	// offset of the specified place to the current center in pixels
-	_getCenterOffset: function (latlng) {
-		return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());
-	},
-
-	// adjust center for view to get inside bounds
-	_limitCenter: function (center, zoom, bounds) {
-
-		if (!bounds) { return center; }
-
-		var centerPoint = this.project(center, zoom),
-		    viewHalf = this.getSize().divideBy(2),
-		    viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),
-		    offset = this._getBoundsOffset(viewBounds, bounds, zoom);
-
-		// If offset is less than a pixel, ignore.
-		// This prevents unstable projections from getting into
-		// an infinite loop of tiny offsets.
-		if (offset.round().equals([0, 0])) {
-			return center;
-		}
-
-		return this.unproject(centerPoint.add(offset), zoom);
-	},
-
-	// adjust offset for view to get inside bounds
-	_limitOffset: function (offset, bounds) {
-		if (!bounds) { return offset; }
-
-		var viewBounds = this.getPixelBounds(),
-		    newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));
-
-		return offset.add(this._getBoundsOffset(newBounds, bounds));
-	},
-
-	// returns offset needed for pxBounds to get inside maxBounds at a specified zoom
-	_getBoundsOffset: function (pxBounds, maxBounds, zoom) {
-		var projectedMaxBounds = L.bounds(
-		        this.project(maxBounds.getNorthEast(), zoom),
-		        this.project(maxBounds.getSouthWest(), zoom)
-		    ),
-		    minOffset = projectedMaxBounds.min.subtract(pxBounds.min),
-		    maxOffset = projectedMaxBounds.max.subtract(pxBounds.max),
-
-		    dx = this._rebound(minOffset.x, -maxOffset.x),
-		    dy = this._rebound(minOffset.y, -maxOffset.y);
-
-		return new L.Point(dx, dy);
-	},
-
-	_rebound: function (left, right) {
-		return left + right > 0 ?
-			Math.round(left - right) / 2 :
-			Math.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));
-	},
-
-	_limitZoom: function (zoom) {
-		var min = this.getMinZoom(),
-		    max = this.getMaxZoom(),
-		    snap = L.Browser.any3d ? this.options.zoomSnap : 1;
-		if (snap) {
-			zoom = Math.round(zoom / snap) * snap;
-		}
-		return Math.max(min, Math.min(max, zoom));
-	},
-
-	_onPanTransitionStep: function () {
-		this.fire('move');
-	},
-
-	_onPanTransitionEnd: function () {
-		L.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');
-		this.fire('moveend');
-	},
-
-	_tryAnimatedPan: function (center, options) {
-		// difference between the new and current centers in pixels
-		var offset = this._getCenterOffset(center)._floor();
-
-		// don't animate too far unless animate: true specified in options
-		if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }
-
-		this.panBy(offset, options);
-
-		return true;
-	},
-
-	_createAnimProxy: function () {
-
-		var proxy = this._proxy = L.DomUtil.create('div', 'leaflet-proxy leaflet-zoom-animated');
-		this._panes.mapPane.appendChild(proxy);
-
-		this.on('zoomanim', function (e) {
-			var prop = L.DomUtil.TRANSFORM,
-			    transform = proxy.style[prop];
-
-			L.DomUtil.setTransform(proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1));
-
-			// workaround for case when transform is the same and so transitionend event is not fired
-			if (transform === proxy.style[prop] && this._animatingZoom) {
-				this._onZoomTransitionEnd();
-			}
-		}, this);
-
-		this.on('load moveend', function () {
-			var c = this.getCenter(),
-			    z = this.getZoom();
-			L.DomUtil.setTransform(proxy, this.project(c, z), this.getZoomScale(z, 1));
-		}, this);
-	},
-
-	_catchTransitionEnd: function (e) {
-		if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) {
-			this._onZoomTransitionEnd();
-		}
-	},
-
-	_nothingToAnimate: function () {
-		return !this._container.getElementsByClassName('leaflet-zoom-animated').length;
-	},
-
-	_tryAnimatedZoom: function (center, zoom, options) {
-
-		if (this._animatingZoom) { return true; }
-
-		options = options || {};
-
-		// don't animate if disabled, not supported or zoom difference is too large
-		if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||
-		        Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }
-
-		// offset is the pixel coords of the zoom origin relative to the current center
-		var scale = this.getZoomScale(zoom),
-		    offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale);
-
-		// don't animate if the zoom origin isn't within one screen from the current center, unless forced
-		if (options.animate !== true && !this.getSize().contains(offset)) { return false; }
-
-		L.Util.requestAnimFrame(function () {
-			this
-			    ._moveStart(true)
-			    ._animateZoom(center, zoom, true);
-		}, this);
-
-		return true;
-	},
-
-	_animateZoom: function (center, zoom, startAnim, noUpdate) {
-		if (startAnim) {
-			this._animatingZoom = true;
-
-			// remember what center/zoom to set after animation
-			this._animateToCenter = center;
-			this._animateToZoom = zoom;
-
-			L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');
-		}
-
-		// @event zoomanim: ZoomAnimEvent
-		// Fired on every frame of a zoom animation
-		this.fire('zoomanim', {
-			center: center,
-			zoom: zoom,
-			noUpdate: noUpdate
-		});
-
-		// Work around webkit not firing 'transitionend', see https://github.com/Leaflet/Leaflet/issues/3689, 2693
-		setTimeout(L.bind(this._onZoomTransitionEnd, this), 250);
-	},
-
-	_onZoomTransitionEnd: function () {
-		if (!this._animatingZoom) { return; }
-
-		L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');
-
-		this._animatingZoom = false;
-
-		this._move(this._animateToCenter, this._animateToZoom);
-
-		// This anim frame should prevent an obscure iOS webkit tile loading race condition.
-		L.Util.requestAnimFrame(function () {
-			this._moveEnd(true);
-		}, this);
-	}
-});
-
-// @section
-
-// @factory L.map(id: String, options?: Map options)
-// Instantiates a map object given the DOM ID of a `<div>` element
-// and optionally an object literal with `Map options`.
-//
-// @alternative
-// @factory L.map(el: HTMLElement, options?: Map options)
-// Instantiates a map object given an instance of a `<div>` HTML element
-// and optionally an object literal with `Map options`.
-L.map = function (id, options) {
-	return new L.Map(id, options);
-};
-
-
-
-
-/*
- * @class Layer
- * @inherits Evented
- * @aka L.Layer
- * @aka ILayer
- *
- * A set of methods from the Layer base class that all Leaflet layers use.
- * Inherits all methods, options and events from `L.Evented`.
- *
- * @example
- *
- * ```js
- * var layer = L.Marker(latlng).addTo(map);
- * layer.addTo(map);
- * layer.remove();
- * ```
- *
- * @event add: Event
- * Fired after the layer is added to a map
- *
- * @event remove: Event
- * Fired after the layer is removed from a map
- */
-
-
-L.Layer = L.Evented.extend({
-
-	// Classes extending `L.Layer` will inherit the following options:
-	options: {
-		// @option pane: String = 'overlayPane'
-		// By default the layer will be added to the map's [overlay pane](#map-overlaypane). Overriding this option will cause the layer to be placed on another pane by default.
-		pane: 'overlayPane',
-		nonBubblingEvents: [],  // Array of events that should not be bubbled to DOM parents (like the map),
-
-		// @option attribution: String = null
-		// String to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
-		attribution: null
-	},
-
-	/* @section
-	 * Classes extending `L.Layer` will inherit the following methods:
-	 *
-	 * @method addTo(map: Map): this
-	 * Adds the layer to the given map
-	 */
-	addTo: function (map) {
-		map.addLayer(this);
-		return this;
-	},
-
-	// @method remove: this
-	// Removes the layer from the map it is currently active on.
-	remove: function () {
-		return this.removeFrom(this._map || this._mapToAdd);
-	},
-
-	// @method removeFrom(map: Map): this
-	// Removes the layer from the given map
-	removeFrom: function (obj) {
-		if (obj) {
-			obj.removeLayer(this);
-		}
-		return this;
-	},
-
-	// @method getPane(name? : String): HTMLElement
-	// Returns the `HTMLElement` representing the named pane on the map. If `name` is omitted, returns the pane for this layer.
-	getPane: function (name) {
-		return this._map.getPane(name ? (this.options[name] || name) : this.options.pane);
-	},
-
-	addInteractiveTarget: function (targetEl) {
-		this._map._targets[L.stamp(targetEl)] = this;
-		return this;
-	},
-
-	removeInteractiveTarget: function (targetEl) {
-		delete this._map._targets[L.stamp(targetEl)];
-		return this;
-	},
-
-	// @method getAttribution: String
-	// Used by the `attribution control`, returns the [attribution option](#gridlayer-attribution).
-	getAttribution: function () {
-		return this.options.attribution;
-	},
-
-	_layerAdd: function (e) {
-		var map = e.target;
-
-		// check in case layer gets added and then removed before the map is ready
-		if (!map.hasLayer(this)) { return; }
-
-		this._map = map;
-		this._zoomAnimated = map._zoomAnimated;
-
-		if (this.getEvents) {
-			var events = this.getEvents();
-			map.on(events, this);
-			this.once('remove', function () {
-				map.off(events, this);
-			}, this);
-		}
-
-		this.onAdd(map);
-
-		if (this.getAttribution && map.attributionControl) {
-			map.attributionControl.addAttribution(this.getAttribution());
-		}
-
-		this.fire('add');
-		map.fire('layeradd', {layer: this});
-	}
-});
-
-/* @section Extension methods
- * @uninheritable
- *
- * Every layer should extend from `L.Layer` and (re-)implement the following methods.
- *
- * @method onAdd(map: Map): this
- * Should contain code that creates DOM elements for the layer, adds them to `map panes` where they should belong and puts listeners on relevant map events. Called on [`map.addLayer(layer)`](#map-addlayer).
- *
- * @method onRemove(map: Map): this
- * Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in [`onAdd`](#layer-onadd). Called on [`map.removeLayer(layer)`](#map-removelayer).
- *
- * @method getEvents(): Object
- * This optional method should return an object like `{ viewreset: this._reset }` for [`addEventListener`](#evented-addeventlistener). The event handlers in this object will be automatically added and removed from the map with your layer.
- *
- * @method getAttribution(): String
- * This optional method should return a string containing HTML to be shown on the `Attribution control` whenever the layer is visible.
- *
- * @method beforeAdd(map: Map): this
- * Optional method. Called on [`map.addLayer(layer)`](#map-addlayer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.
- */
-
-
-/* @namespace Map
- * @section Layer events
- *
- * @event layeradd: LayerEvent
- * Fired when a new layer is added to the map.
- *
- * @event layerremove: LayerEvent
- * Fired when some layer is removed from the map
- *
- * @section Methods for Layers and Controls
- */
-L.Map.include({
-	// @method addLayer(layer: Layer): this
-	// Adds the given layer to the map
-	addLayer: function (layer) {
-		var id = L.stamp(layer);
-		if (this._layers[id]) { return this; }
-		this._layers[id] = layer;
-
-		layer._mapToAdd = this;
-
-		if (layer.beforeAdd) {
-			layer.beforeAdd(this);
-		}
-
-		this.whenReady(layer._layerAdd, layer);
-
-		return this;
-	},
-
-	// @method removeLayer(layer: Layer): this
-	// Removes the given layer from the map.
-	removeLayer: function (layer) {
-		var id = L.stamp(layer);
-
-		if (!this._layers[id]) { return this; }
-
-		if (this._loaded) {
-			layer.onRemove(this);
-		}
-
-		if (layer.getAttribution && this.attributionControl) {
-			this.attributionControl.removeAttribution(layer.getAttribution());
-		}
-
-		delete this._layers[id];
-
-		if (this._loaded) {
-			this.fire('layerremove', {layer: layer});
-			layer.fire('remove');
-		}
-
-		layer._map = layer._mapToAdd = null;
-
-		return this;
-	},
-
-	// @method hasLayer(layer: Layer): Boolean
-	// Returns `true` if the given layer is currently added to the map
-	hasLayer: function (layer) {
-		return !!layer && (L.stamp(layer) in this._layers);
-	},
-
-	/* @method eachLayer(fn: Function, context?: Object): this
-	 * Iterates over the layers of the map, optionally specifying context of the iterator function.
-	 * ```
-	 * map.eachLayer(function(layer){
-	 *     layer.bindPopup('Hello');
-	 * });
-	 * ```
-	 */
-	eachLayer: function (method, context) {
-		for (var i in this._layers) {
-			method.call(context, this._layers[i]);
-		}
-		return this;
-	},
-
-	_addLayers: function (layers) {
-		layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];
-
-		for (var i = 0, len = layers.length; i < len; i++) {
-			this.addLayer(layers[i]);
-		}
-	},
-
-	_addZoomLimit: function (layer) {
-		if (isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) {
-			this._zoomBoundLayers[L.stamp(layer)] = layer;
-			this._updateZoomLevels();
-		}
-	},
-
-	_removeZoomLimit: function (layer) {
-		var id = L.stamp(layer);
-
-		if (this._zoomBoundLayers[id]) {
-			delete this._zoomBoundLayers[id];
-			this._updateZoomLevels();
-		}
-	},
-
-	_updateZoomLevels: function () {
-		var minZoom = Infinity,
-		    maxZoom = -Infinity,
-		    oldZoomSpan = this._getZoomSpan();
-
-		for (var i in this._zoomBoundLayers) {
-			var options = this._zoomBoundLayers[i].options;
-
-			minZoom = options.minZoom === undefined ? minZoom : Math.min(minZoom, options.minZoom);
-			maxZoom = options.maxZoom === undefined ? maxZoom : Math.max(maxZoom, options.maxZoom);
-		}
-
-		this._layersMaxZoom = maxZoom === -Infinity ? undefined : maxZoom;
-		this._layersMinZoom = minZoom === Infinity ? undefined : minZoom;
-
-		// @section Map state change events
-		// @event zoomlevelschange: Event
-		// Fired when the number of zoomlevels on the map is changed due
-		// to adding or removing a layer.
-		if (oldZoomSpan !== this._getZoomSpan()) {
-			this.fire('zoomlevelschange');
-		}
-
-		if (this.options.maxZoom === undefined && this._layersMaxZoom && this.getZoom() > this._layersMaxZoom) {
-			this.setZoom(this._layersMaxZoom);
-		}
-		if (this.options.minZoom === undefined && this._layersMinZoom && this.getZoom() < this._layersMinZoom) {
-			this.setZoom(this._layersMinZoom);
-		}
-	}
-});
-
-
-
-/*
- * @namespace DomEvent
- * Utility functions to work with the [DOM events](https://developer.mozilla.org/docs/Web/API/Event), used by Leaflet internally.
- */
-
-// Inspired by John Resig, Dean Edwards and YUI addEvent implementations.
-
-
-
-var eventsKey = '_leaflet_events';
-
-L.DomEvent = {
-
-	// @function on(el: HTMLElement, types: String, fn: Function, context?: Object): this
-	// Adds a listener function (`fn`) to a particular DOM event type of the
-	// element `el`. You can optionally specify the context of the listener
-	// (object the `this` keyword will point to). You can also pass several
-	// space-separated types (e.g. `'click dblclick'`).
-
-	// @alternative
-	// @function on(el: HTMLElement, eventMap: Object, context?: Object): this
-	// Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`
-	on: function (obj, types, fn, context) {
-
-		if (typeof types === 'object') {
-			for (var type in types) {
-				this._on(obj, type, types[type], fn);
-			}
-		} else {
-			types = L.Util.splitWords(types);
-
-			for (var i = 0, len = types.length; i < len; i++) {
-				this._on(obj, types[i], fn, context);
-			}
-		}
-
-		return this;
-	},
-
-	// @function off(el: HTMLElement, types: String, fn: Function, context?: Object): this
-	// Removes a previously added listener function. If no function is specified,
-	// it will remove all the listeners of that particular DOM event from the element.
-	// Note that if you passed a custom context to on, you must pass the same
-	// context to `off` in order to remove the listener.
-
-	// @alternative
-	// @function off(el: HTMLElement, eventMap: Object, context?: Object): this
-	// Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`
-	off: function (obj, types, fn, context) {
-
-		if (typeof types === 'object') {
-			for (var type in types) {
-				this._off(obj, type, types[type], fn);
-			}
-		} else {
-			types = L.Util.splitWords(types);
-
-			for (var i = 0, len = types.length; i < len; i++) {
-				this._off(obj, types[i], fn, context);
-			}
-		}
-
-		return this;
-	},
-
-	_on: function (obj, type, fn, context) {
-		var id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : '');
-
-		if (obj[eventsKey] && obj[eventsKey][id]) { return this; }
-
-		var handler = function (e) {
-			return fn.call(context || obj, e || window.event);
-		};
-
-		var originalHandler = handler;
-
-		if (L.Browser.pointer && type.indexOf('touch') === 0) {
-			this.addPointerListener(obj, type, handler, id);
-
-		} else if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener &&
-		           !(L.Browser.pointer && L.Browser.chrome)) {
-			// Chrome >55 does not need the synthetic dblclicks from addDoubleTapListener
-			// See #5180
-			this.addDoubleTapListener(obj, handler, id);
-
-		} else if ('addEventListener' in obj) {
-
-			if (type === 'mousewheel') {
-				obj.addEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false);
-
-			} else if ((type === 'mouseenter') || (type === 'mouseleave')) {
-				handler = function (e) {
-					e = e || window.event;
-					if (L.DomEvent._isExternalTarget(obj, e)) {
-						originalHandler(e);
-					}
-				};
-				obj.addEventListener(type === 'mouseenter' ? 'mouseover' : 'mouseout', handler, false);
-
-			} else {
-				if (type === 'click' && L.Browser.android) {
-					handler = function (e) {
-						return L.DomEvent._filterClick(e, originalHandler);
-					};
-				}
-				obj.addEventListener(type, handler, false);
-			}
-
-		} else if ('attachEvent' in obj) {
-			obj.attachEvent('on' + type, handler);
-		}
-
-		obj[eventsKey] = obj[eventsKey] || {};
-		obj[eventsKey][id] = handler;
-
-		return this;
-	},
-
-	_off: function (obj, type, fn, context) {
-
-		var id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : ''),
-		    handler = obj[eventsKey] && obj[eventsKey][id];
-
-		if (!handler) { return this; }
-
-		if (L.Browser.pointer && type.indexOf('touch') === 0) {
-			this.removePointerListener(obj, type, id);
-
-		} else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {
-			this.removeDoubleTapListener(obj, id);
-
-		} else if ('removeEventListener' in obj) {
-
-			if (type === 'mousewheel') {
-				obj.removeEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false);
-
-			} else {
-				obj.removeEventListener(
-					type === 'mouseenter' ? 'mouseover' :
-					type === 'mouseleave' ? 'mouseout' : type, handler, false);
-			}
-
-		} else if ('detachEvent' in obj) {
-			obj.detachEvent('on' + type, handler);
-		}
-
-		obj[eventsKey][id] = null;
-
-		return this;
-	},
-
-	// @function stopPropagation(ev: DOMEvent): this
-	// Stop the given event from propagation to parent elements. Used inside the listener functions:
-	// ```js
-	// L.DomEvent.on(div, 'click', function (ev) {
-	// 	L.DomEvent.stopPropagation(ev);
-	// });
-	// ```
-	stopPropagation: function (e) {
-
-		if (e.stopPropagation) {
-			e.stopPropagation();
-		} else if (e.originalEvent) {  // In case of Leaflet event.
-			e.originalEvent._stopped = true;
-		} else {
-			e.cancelBubble = true;
-		}
-		L.DomEvent._skipped(e);
-
-		return this;
-	},
-
-	// @function disableScrollPropagation(el: HTMLElement): this
-	// Adds `stopPropagation` to the element's `'mousewheel'` events (plus browser variants).
-	disableScrollPropagation: function (el) {
-		return L.DomEvent.on(el, 'mousewheel', L.DomEvent.stopPropagation);
-	},
-
-	// @function disableClickPropagation(el: HTMLElement): this
-	// Adds `stopPropagation` to the element's `'click'`, `'doubleclick'`,
-	// `'mousedown'` and `'touchstart'` events (plus browser variants).
-	disableClickPropagation: function (el) {
-		var stop = L.DomEvent.stopPropagation;
-
-		L.DomEvent.on(el, L.Draggable.START.join(' '), stop);
-
-		return L.DomEvent.on(el, {
-			click: L.DomEvent._fakeStop,
-			dblclick: stop
-		});
-	},
-
-	// @function preventDefault(ev: DOMEvent): this
-	// Prevents the default action of the DOM Event `ev` from happening (such as
-	// following a link in the href of the a element, or doing a POST request
-	// with page reload when a `<form>` is submitted).
-	// Use it inside listener functions.
-	preventDefault: function (e) {
-
-		if (e.preventDefault) {
-			e.preventDefault();
-		} else {
-			e.returnValue = false;
-		}
-		return this;
-	},
-
-	// @function stop(ev): this
-	// Does `stopPropagation` and `preventDefault` at the same time.
-	stop: function (e) {
-		return L.DomEvent
-			.preventDefault(e)
-			.stopPropagation(e);
-	},
-
-	// @function getMousePosition(ev: DOMEvent, container?: HTMLElement): Point
-	// Gets normalized mouse position from a DOM event relative to the
-	// `container` or to the whole page if not specified.
-	getMousePosition: function (e, container) {
-		if (!container) {
-			return new L.Point(e.clientX, e.clientY);
-		}
-
-		var rect = container.getBoundingClientRect();
-
-		return new L.Point(
-			e.clientX - rect.left - container.clientLeft,
-			e.clientY - rect.top - container.clientTop);
-	},
-
-	// Chrome on Win scrolls double the pixels as in other platforms (see #4538),
-	// and Firefox scrolls device pixels, not CSS pixels
-	_wheelPxFactor: (L.Browser.win && L.Browser.chrome) ? 2 :
-	                L.Browser.gecko ? window.devicePixelRatio :
-	                1,
-
-	// @function getWheelDelta(ev: DOMEvent): Number
-	// Gets normalized wheel delta from a mousewheel DOM event, in vertical
-	// pixels scrolled (negative if scrolling down).
-	// Events from pointing devices without precise scrolling are mapped to
-	// a best guess of 60 pixels.
-	getWheelDelta: function (e) {
-		return (L.Browser.edge) ? e.wheelDeltaY / 2 : // Don't trust window-geometry-based delta
-		       (e.deltaY && e.deltaMode === 0) ? -e.deltaY / L.DomEvent._wheelPxFactor : // Pixels
-		       (e.deltaY && e.deltaMode === 1) ? -e.deltaY * 20 : // Lines
-		       (e.deltaY && e.deltaMode === 2) ? -e.deltaY * 60 : // Pages
-		       (e.deltaX || e.deltaZ) ? 0 :	// Skip horizontal/depth wheel events
-		       e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 2 : // Legacy IE pixels
-		       (e.detail && Math.abs(e.detail) < 32765) ? -e.detail * 20 : // Legacy Moz lines
-		       e.detail ? e.detail / -32765 * 60 : // Legacy Moz pages
-		       0;
-	},
-
-	_skipEvents: {},
-
-	_fakeStop: function (e) {
-		// fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e)
-		L.DomEvent._skipEvents[e.type] = true;
-	},
-
-	_skipped: function (e) {
-		var skipped = this._skipEvents[e.type];
-		// reset when checking, as it's only used in map container and propagates outside of the map
-		this._skipEvents[e.type] = false;
-		return skipped;
-	},
-
-	// check if element really left/entered the event target (for mouseenter/mouseleave)
-	_isExternalTarget: function (el, e) {
-
-		var related = e.relatedTarget;
-
-		if (!related) { return true; }
-
-		try {
-			while (related && (related !== el)) {
-				related = related.parentNode;
-			}
-		} catch (err) {
-			return false;
-		}
-		return (related !== el);
-	},
-
-	// this is a horrible workaround for a bug in Android where a single touch triggers two click events
-	_filterClick: function (e, handler) {
-		var timeStamp = (e.timeStamp || (e.originalEvent && e.originalEvent.timeStamp)),
-		    elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);
-
-		// are they closer together than 500ms yet more than 100ms?
-		// Android typically triggers them ~300ms apart while multiple listeners
-		// on the same event should be triggered far faster;
-		// or check if click is simulated on the element, and if it is, reject any non-simulated events
-
-		if ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) {
-			L.DomEvent.stop(e);
-			return;
-		}
-		L.DomEvent._lastClick = timeStamp;
-
-		handler(e);
-	}
-};
-
-// @function addListener(…): this
-// Alias to [`L.DomEvent.on`](#domevent-on)
-L.DomEvent.addListener = L.DomEvent.on;
-
-// @function removeListener(…): this
-// Alias to [`L.DomEvent.off`](#domevent-off)
-L.DomEvent.removeListener = L.DomEvent.off;
-
-
-
-/*
- * @class PosAnimation
- * @aka L.PosAnimation
- * @inherits Evented
- * Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.
- *
- * @example
- * ```js
- * var fx = new L.PosAnimation();
- * fx.run(el, [300, 500], 0.5);
- * ```
- *
- * @constructor L.PosAnimation()
- * Creates a `PosAnimation` object.
- *
- */
-
-L.PosAnimation = L.Evented.extend({
-
-	// @method run(el: HTMLElement, newPos: Point, duration?: Number, easeLinearity?: Number)
-	// Run an animation of a given element to a new position, optionally setting
-	// duration in seconds (`0.25` by default) and easing linearity factor (3rd
-	// argument of the [cubic bezier curve](http://cubic-bezier.com/#0,0,.5,1),
-	// `0.5` by default).
-	run: function (el, newPos, duration, easeLinearity) {
-		this.stop();
-
-		this._el = el;
-		this._inProgress = true;
-		this._duration = duration || 0.25;
-		this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2);
-
-		this._startPos = L.DomUtil.getPosition(el);
-		this._offset = newPos.subtract(this._startPos);
-		this._startTime = +new Date();
-
-		// @event start: Event
-		// Fired when the animation starts
-		this.fire('start');
-
-		this._animate();
-	},
-
-	// @method stop()
-	// Stops the animation (if currently running).
-	stop: function () {
-		if (!this._inProgress) { return; }
-
-		this._step(true);
-		this._complete();
-	},
-
-	_animate: function () {
-		// animation loop
-		this._animId = L.Util.requestAnimFrame(this._animate, this);
-		this._step();
-	},
-
-	_step: function (round) {
-		var elapsed = (+new Date()) - this._startTime,
-		    duration = this._duration * 1000;
-
-		if (elapsed < duration) {
-			this._runFrame(this._easeOut(elapsed / duration), round);
-		} else {
-			this._runFrame(1);
-			this._complete();
-		}
-	},
-
-	_runFrame: function (progress, round) {
-		var pos = this._startPos.add(this._offset.multiplyBy(progress));
-		if (round) {
-			pos._round();
-		}
-		L.DomUtil.setPosition(this._el, pos);
-
-		// @event step: Event
-		// Fired continuously during the animation.
-		this.fire('step');
-	},
-
-	_complete: function () {
-		L.Util.cancelAnimFrame(this._animId);
-
-		this._inProgress = false;
-		// @event end: Event
-		// Fired when the animation ends.
-		this.fire('end');
-	},
-
-	_easeOut: function (t) {
-		return 1 - Math.pow(1 - t, this._easeOutPower);
-	}
-});
-
-
-
-/*
- * @namespace Projection
- * @projection L.Projection.Mercator
- *
- * Elliptical Mercator projection — more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the EPSG:3395 CRS.
- */
-
-L.Projection.Mercator = {
-	R: 6378137,
-	R_MINOR: 6356752.314245179,
-
-	bounds: L.bounds([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]),
-
-	project: function (latlng) {
-		var d = Math.PI / 180,
-		    r = this.R,
-		    y = latlng.lat * d,
-		    tmp = this.R_MINOR / r,
-		    e = Math.sqrt(1 - tmp * tmp),
-		    con = e * Math.sin(y);
-
-		var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);
-		y = -r * Math.log(Math.max(ts, 1E-10));
-
-		return new L.Point(latlng.lng * d * r, y);
-	},
-
-	unproject: function (point) {
-		var d = 180 / Math.PI,
-		    r = this.R,
-		    tmp = this.R_MINOR / r,
-		    e = Math.sqrt(1 - tmp * tmp),
-		    ts = Math.exp(-point.y / r),
-		    phi = Math.PI / 2 - 2 * Math.atan(ts);
-
-		for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {
-			con = e * Math.sin(phi);
-			con = Math.pow((1 - con) / (1 + con), e / 2);
-			dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;
-			phi += dphi;
-		}
-
-		return new L.LatLng(phi * d, point.x * d / r);
-	}
-};
-
-
-
-/*
- * @namespace CRS
- * @crs L.CRS.EPSG3395
- *
- * Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
- */
-
-L.CRS.EPSG3395 = L.extend({}, L.CRS.Earth, {
-	code: 'EPSG:3395',
-	projection: L.Projection.Mercator,
-
-	transformation: (function () {
-		var scale = 0.5 / (Math.PI * L.Projection.Mercator.R);
-		return new L.Transformation(scale, 0.5, -scale, 0.5);
-	}())
-});
-
-
-
-/*
- * @class GridLayer
- * @inherits Layer
- * @aka L.GridLayer
- *
- * Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces `TileLayer.Canvas`.
- * GridLayer can be extended to create a tiled grid of HTML elements like `<canvas>`, `<img>` or `<div>`. GridLayer will handle creating and animating these DOM elements for you.
- *
- *
- * @section Synchronous usage
- * @example
- *
- * To create a custom layer, extend GridLayer and implement the `createTile()` method, which will be passed a `Point` object with the `x`, `y`, and `z` (zoom level) coordinates to draw your tile.
- *
- * ```js
- * var CanvasLayer = L.GridLayer.extend({
- *     createTile: function(coords){
- *         // create a <canvas> element for drawing
- *         var tile = L.DomUtil.create('canvas', 'leaflet-tile');
- *
- *         // setup tile width and height according to the options
- *         var size = this.getTileSize();
- *         tile.width = size.x;
- *         tile.height = size.y;
- *
- *         // get a canvas context and draw something on it using coords.x, coords.y and coords.z
- *         var ctx = tile.getContext('2d');
- *
- *         // return the tile so it can be rendered on screen
- *         return tile;
- *     }
- * });
- * ```
- *
- * @section Asynchronous usage
- * @example
- *
- * Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the `done()` callback.
- *
- * ```js
- * var CanvasLayer = L.GridLayer.extend({
- *     createTile: function(coords, done){
- *         var error;
- *
- *         // create a <canvas> element for drawing
- *         var tile = L.DomUtil.create('canvas', 'leaflet-tile');
- *
- *         // setup tile width and height according to the options
- *         var size = this.getTileSize();
- *         tile.width = size.x;
- *         tile.height = size.y;
- *
- *         // draw something asynchronously and pass the tile to the done() callback
- *         setTimeout(function() {
- *             done(error, tile);
- *         }, 1000);
- *
- *         return tile;
- *     }
- * });
- * ```
- *
- * @section
- */
-
-
-L.GridLayer = L.Layer.extend({
-
-	// @section
-	// @aka GridLayer options
-	options: {
-		// @option tileSize: Number|Point = 256
-		// Width and height of tiles in the grid. Use a number if width and height are equal, or `L.point(width, height)` otherwise.
-		tileSize: 256,
-
-		// @option opacity: Number = 1.0
-		// Opacity of the tiles. Can be used in the `createTile()` function.
-		opacity: 1,
-
-		// @option updateWhenIdle: Boolean = depends
-		// If `false`, new tiles are loaded during panning, otherwise only after it (for better performance). `true` by default on mobile browsers, otherwise `false`.
-		updateWhenIdle: L.Browser.mobile,
-
-		// @option updateWhenZooming: Boolean = true
-		// By default, a smooth zoom animation (during a [touch zoom](#map-touchzoom) or a [`flyTo()`](#map-flyto)) will update grid layers every integer zoom level. Setting this option to `false` will update the grid layer only when the smooth animation ends.
-		updateWhenZooming: true,
-
-		// @option updateInterval: Number = 200
-		// Tiles will not update more than once every `updateInterval` milliseconds when panning.
-		updateInterval: 200,
-
-		// @option zIndex: Number = 1
-		// The explicit zIndex of the tile layer.
-		zIndex: 1,
-
-		// @option bounds: LatLngBounds = undefined
-		// If set, tiles will only be loaded inside the set `LatLngBounds`.
-		bounds: null,
-
-		// @option minZoom: Number = 0
-		// The minimum zoom level that tiles will be loaded at. By default the entire map.
-		minZoom: 0,
-
-		// @option maxZoom: Number = undefined
-		// The maximum zoom level that tiles will be loaded at.
-		maxZoom: undefined,
-
-		// @option noWrap: Boolean = false
-		// Whether the layer is wrapped around the antimeridian. If `true`, the
-		// GridLayer will only be displayed once at low zoom levels. Has no
-		// effect when the [map CRS](#map-crs) doesn't wrap around. Can be used
-		// in combination with [`bounds`](#gridlayer-bounds) to prevent requesting
-		// tiles outside the CRS limits.
-		noWrap: false,
-
-		// @option pane: String = 'tilePane'
-		// `Map pane` where the grid layer will be added.
-		pane: 'tilePane',
-
-		// @option className: String = ''
-		// A custom class name to assign to the tile layer. Empty by default.
-		className: '',
-
-		// @option keepBuffer: Number = 2
-		// When panning the map, keep this many rows and columns of tiles before unloading them.
-		keepBuffer: 2
-	},
-
-	initialize: function (options) {
-		L.setOptions(this, options);
-	},
-
-	onAdd: function () {
-		this._initContainer();
-
-		this._levels = {};
-		this._tiles = {};
-
-		this._resetView();
-		this._update();
-	},
-
-	beforeAdd: function (map) {
-		map._addZoomLimit(this);
-	},
-
-	onRemove: function (map) {
-		this._removeAllTiles();
-		L.DomUtil.remove(this._container);
-		map._removeZoomLimit(this);
-		this._container = null;
-		this._tileZoom = null;
-	},
-
-	// @method bringToFront: this
-	// Brings the tile layer to the top of all tile layers.
-	bringToFront: function () {
-		if (this._map) {
-			L.DomUtil.toFront(this._container);
-			this._setAutoZIndex(Math.max);
-		}
-		return this;
-	},
-
-	// @method bringToBack: this
-	// Brings the tile layer to the bottom of all tile layers.
-	bringToBack: function () {
-		if (this._map) {
-			L.DomUtil.toBack(this._container);
-			this._setAutoZIndex(Math.min);
-		}
-		return this;
-	},
-
-	// @method getContainer: HTMLElement
-	// Returns the HTML element that contains the tiles for this layer.
-	getContainer: function () {
-		return this._container;
-	},
-
-	// @method setOpacity(opacity: Number): this
-	// Changes the [opacity](#gridlayer-opacity) of the grid layer.
-	setOpacity: function (opacity) {
-		this.options.opacity = opacity;
-		this._updateOpacity();
-		return this;
-	},
-
-	// @method setZIndex(zIndex: Number): this
-	// Changes the [zIndex](#gridlayer-zindex) of the grid layer.
-	setZIndex: function (zIndex) {
-		this.options.zIndex = zIndex;
-		this._updateZIndex();
-
-		return this;
-	},
-
-	// @method isLoading: Boolean
-	// Returns `true` if any tile in the grid layer has not finished loading.
-	isLoading: function () {
-		return this._loading;
-	},
-
-	// @method redraw: this
-	// Causes the layer to clear all the tiles and request them again.
-	redraw: function () {
-		if (this._map) {
-			this._removeAllTiles();
-			this._update();
-		}
-		return this;
-	},
-
-	getEvents: function () {
-		var events = {
-			viewprereset: this._invalidateAll,
-			viewreset: this._resetView,
-			zoom: this._resetView,
-			moveend: this._onMoveEnd
-		};
-
-		if (!this.options.updateWhenIdle) {
-			// update tiles on move, but not more often than once per given interval
-			if (!this._onMove) {
-				this._onMove = L.Util.throttle(this._onMoveEnd, this.options.updateInterval, this);
-			}
-
-			events.move = this._onMove;
-		}
-
-		if (this._zoomAnimated) {
-			events.zoomanim = this._animateZoom;
-		}
-
-		return events;
-	},
-
-	// @section Extension methods
-	// Layers extending `GridLayer` shall reimplement the following method.
-	// @method createTile(coords: Object, done?: Function): HTMLElement
-	// Called only internally, must be overriden by classes extending `GridLayer`.
-	// Returns the `HTMLElement` corresponding to the given `coords`. If the `done` callback
-	// is specified, it must be called when the tile has finished loading and drawing.
-	createTile: function () {
-		return document.createElement('div');
-	},
-
-	// @section
-	// @method getTileSize: Point
-	// Normalizes the [tileSize option](#gridlayer-tilesize) into a point. Used by the `createTile()` method.
-	getTileSize: function () {
-		var s = this.options.tileSize;
-		return s instanceof L.Point ? s : new L.Point(s, s);
-	},
-
-	_updateZIndex: function () {
-		if (this._container && this.options.zIndex !== undefined && this.options.zIndex !== null) {
-			this._container.style.zIndex = this.options.zIndex;
-		}
-	},
-
-	_setAutoZIndex: function (compare) {
-		// go through all other layers of the same pane, set zIndex to max + 1 (front) or min - 1 (back)
-
-		var layers = this.getPane().children,
-		    edgeZIndex = -compare(-Infinity, Infinity); // -Infinity for max, Infinity for min
-
-		for (var i = 0, len = layers.length, zIndex; i < len; i++) {
-
-			zIndex = layers[i].style.zIndex;
-
-			if (layers[i] !== this._container && zIndex) {
-				edgeZIndex = compare(edgeZIndex, +zIndex);
-			}
-		}
-
-		if (isFinite(edgeZIndex)) {
-			this.options.zIndex = edgeZIndex + compare(-1, 1);
-			this._updateZIndex();
-		}
-	},
-
-	_updateOpacity: function () {
-		if (!this._map) { return; }
-
-		// IE doesn't inherit filter opacity properly, so we're forced to set it on tiles
-		if (L.Browser.ielt9) { return; }
-
-		L.DomUtil.setOpacity(this._container, this.options.opacity);
-
-		var now = +new Date(),
-		    nextFrame = false,
-		    willPrune = false;
-
-		for (var key in this._tiles) {
-			var tile = this._tiles[key];
-			if (!tile.current || !tile.loaded) { continue; }
-
-			var fade = Math.min(1, (now - tile.loaded) / 200);
-
-			L.DomUtil.setOpacity(tile.el, fade);
-			if (fade < 1) {
-				nextFrame = true;
-			} else {
-				if (tile.active) { willPrune = true; }
-				tile.active = true;
-			}
-		}
-
-		if (willPrune && !this._noPrune) { this._pruneTiles(); }
-
-		if (nextFrame) {
-			L.Util.cancelAnimFrame(this._fadeFrame);
-			this._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this);
-		}
-	},
-
-	_initContainer: function () {
-		if (this._container) { return; }
-
-		this._container = L.DomUtil.create('div', 'leaflet-layer ' + (this.options.className || ''));
-		this._updateZIndex();
-
-		if (this.options.opacity < 1) {
-			this._updateOpacity();
-		}
-
-		this.getPane().appendChild(this._container);
-	},
-
-	_updateLevels: function () {
-
-		var zoom = this._tileZoom,
-		    maxZoom = this.options.maxZoom;
-
-		if (zoom === undefined) { return undefined; }
-
-		for (var z in this._levels) {
-			if (this._levels[z].el.children.length || z === zoom) {
-				this._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z);
-			} else {
-				L.DomUtil.remove(this._levels[z].el);
-				this._removeTilesAtZoom(z);
-				delete this._levels[z];
-			}
-		}
-
-		var level = this._levels[zoom],
-		    map = this._map;
-
-		if (!level) {
-			level = this._levels[zoom] = {};
-
-			level.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container);
-			level.el.style.zIndex = maxZoom;
-
-			level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round();
-			level.zoom = zoom;
-
-			this._setZoomTransform(level, map.getCenter(), map.getZoom());
-
-			// force the browser to consider the newly added element for transition
-			L.Util.falseFn(level.el.offsetWidth);
-		}
-
-		this._level = level;
-
-		return level;
-	},
-
-	_pruneTiles: function () {
-		if (!this._map) {
-			return;
-		}
-
-		var key, tile;
-
-		var zoom = this._map.getZoom();
-		if (zoom > this.options.maxZoom ||
-			zoom < this.options.minZoom) {
-			this._removeAllTiles();
-			return;
-		}
-
-		for (key in this._tiles) {
-			tile = this._tiles[key];
-			tile.retain = tile.current;
-		}
-
-		for (key in this._tiles) {
-			tile = this._tiles[key];
-			if (tile.current && !tile.active) {
-				var coords = tile.coords;
-				if (!this._retainParent(coords.x, coords.y, coords.z, coords.z - 5)) {
-					this._retainChildren(coords.x, coords.y, coords.z, coords.z + 2);
-				}
-			}
-		}
-
-		for (key in this._tiles) {
-			if (!this._tiles[key].retain) {
-				this._removeTile(key);
-			}
-		}
-	},
-
-	_removeTilesAtZoom: function (zoom) {
-		for (var key in this._tiles) {
-			if (this._tiles[key].coords.z !== zoom) {
-				continue;
-			}
-			this._removeTile(key);
-		}
-	},
-
-	_removeAllTiles: function () {
-		for (var key in this._tiles) {
-			this._removeTile(key);
-		}
-	},
-
-	_invalidateAll: function () {
-		for (var z in this._levels) {
-			L.DomUtil.remove(this._levels[z].el);
-			delete this._levels[z];
-		}
-		this._removeAllTiles();
-
-		this._tileZoom = null;
-	},
-
-	_retainParent: function (x, y, z, minZoom) {
-		var x2 = Math.floor(x / 2),
-		    y2 = Math.floor(y / 2),
-		    z2 = z - 1,
-		    coords2 = new L.Point(+x2, +y2);
-		coords2.z = +z2;
-
-		var key = this._tileCoordsToKey(coords2),
-		    tile = this._tiles[key];
-
-		if (tile && tile.active) {
-			tile.retain = true;
-			return true;
-
-		} else if (tile && tile.loaded) {
-			tile.retain = true;
-		}
-
-		if (z2 > minZoom) {
-			return this._retainParent(x2, y2, z2, minZoom);
-		}
-
-		return false;
-	},
-
-	_retainChildren: function (x, y, z, maxZoom) {
-
-		for (var i = 2 * x; i < 2 * x + 2; i++) {
-			for (var j = 2 * y; j < 2 * y + 2; j++) {
-
-				var coords = new L.Point(i, j);
-				coords.z = z + 1;
-
-				var key = this._tileCoordsToKey(coords),
-				    tile = this._tiles[key];
-
-				if (tile && tile.active) {
-					tile.retain = true;
-					continue;
-
-				} else if (tile && tile.loaded) {
-					tile.retain = true;
-				}
-
-				if (z + 1 < maxZoom) {
-					this._retainChildren(i, j, z + 1, maxZoom);
-				}
-			}
-		}
-	},
-
-	_resetView: function (e) {
-		var animating = e && (e.pinch || e.flyTo);
-		this._setView(this._map.getCenter(), this._map.getZoom(), animating, animating);
-	},
-
-	_animateZoom: function (e) {
-		this._setView(e.center, e.zoom, true, e.noUpdate);
-	},
-
-	_setView: function (center, zoom, noPrune, noUpdate) {
-		var tileZoom = Math.round(zoom);
-		if ((this.options.maxZoom !== undefined && tileZoom > this.options.maxZoom) ||
-		    (this.options.minZoom !== undefined && tileZoom < this.options.minZoom)) {
-			tileZoom = undefined;
-		}
-
-		var tileZoomChanged = this.options.updateWhenZooming && (tileZoom !== this._tileZoom);
-
-		if (!noUpdate || tileZoomChanged) {
-
-			this._tileZoom = tileZoom;
-
-			if (this._abortLoading) {
-				this._abortLoading();
-			}
-
-			this._updateLevels();
-			this._resetGrid();
-
-			if (tileZoom !== undefined) {
-				this._update(center);
-			}
-
-			if (!noPrune) {
-				this._pruneTiles();
-			}
-
-			// Flag to prevent _updateOpacity from pruning tiles during
-			// a zoom anim or a pinch gesture
-			this._noPrune = !!noPrune;
-		}
-
-		this._setZoomTransforms(center, zoom);
-	},
-
-	_setZoomTransforms: function (center, zoom) {
-		for (var i in this._levels) {
-			this._setZoomTransform(this._levels[i], center, zoom);
-		}
-	},
-
-	_setZoomTransform: function (level, center, zoom) {
-		var scale = this._map.getZoomScale(zoom, level.zoom),
-		    translate = level.origin.multiplyBy(scale)
-		        .subtract(this._map._getNewPixelOrigin(center, zoom)).round();
-
-		if (L.Browser.any3d) {
-			L.DomUtil.setTransform(level.el, translate, scale);
-		} else {
-			L.DomUtil.setPosition(level.el, translate);
-		}
-	},
-
-	_resetGrid: function () {
-		var map = this._map,
-		    crs = map.options.crs,
-		    tileSize = this._tileSize = this.getTileSize(),
-		    tileZoom = this._tileZoom;
-
-		var bounds = this._map.getPixelWorldBounds(this._tileZoom);
-		if (bounds) {
-			this._globalTileRange = this._pxBoundsToTileRange(bounds);
-		}
-
-		this._wrapX = crs.wrapLng && !this.options.noWrap && [
-			Math.floor(map.project([0, crs.wrapLng[0]], tileZoom).x / tileSize.x),
-			Math.ceil(map.project([0, crs.wrapLng[1]], tileZoom).x / tileSize.y)
-		];
-		this._wrapY = crs.wrapLat && !this.options.noWrap && [
-			Math.floor(map.project([crs.wrapLat[0], 0], tileZoom).y / tileSize.x),
-			Math.ceil(map.project([crs.wrapLat[1], 0], tileZoom).y / tileSize.y)
-		];
-	},
-
-	_onMoveEnd: function () {
-		if (!this._map || this._map._animatingZoom) { return; }
-
-		this._update();
-	},
-
-	_getTiledPixelBounds: function (center) {
-		var map = this._map,
-		    mapZoom = map._animatingZoom ? Math.max(map._animateToZoom, map.getZoom()) : map.getZoom(),
-		    scale = map.getZoomScale(mapZoom, this._tileZoom),
-		    pixelCenter = map.project(center, this._tileZoom).floor(),
-		    halfSize = map.getSize().divideBy(scale * 2);
-
-		return new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize));
-	},
-
-	// Private method to load tiles in the grid's active zoom level according to map bounds
-	_update: function (center) {
-		var map = this._map;
-		if (!map) { return; }
-		var zoom = map.getZoom();
-
-		if (center === undefined) { center = map.getCenter(); }
-		if (this._tileZoom === undefined) { return; }	// if out of minzoom/maxzoom
-
-		var pixelBounds = this._getTiledPixelBounds(center),
-		    tileRange = this._pxBoundsToTileRange(pixelBounds),
-		    tileCenter = tileRange.getCenter(),
-		    queue = [],
-		    margin = this.options.keepBuffer,
-		    noPruneRange = new L.Bounds(tileRange.getBottomLeft().subtract([margin, -margin]),
-		                              tileRange.getTopRight().add([margin, -margin]));
-
-		for (var key in this._tiles) {
-			var c = this._tiles[key].coords;
-			if (c.z !== this._tileZoom || !noPruneRange.contains(L.point(c.x, c.y))) {
-				this._tiles[key].current = false;
-			}
-		}
-
-		// _update just loads more tiles. If the tile zoom level differs too much
-		// from the map's, let _setView reset levels and prune old tiles.
-		if (Math.abs(zoom - this._tileZoom) > 1) { this._setView(center, zoom); return; }
-
-		// create a queue of coordinates to load tiles from
-		for (var j = tileRange.min.y; j <= tileRange.max.y; j++) {
-			for (var i = tileRange.min.x; i <= tileRange.max.x; i++) {
-				var coords = new L.Point(i, j);
-				coords.z = this._tileZoom;
-
-				if (!this._isValidTile(coords)) { continue; }
-
-				var tile = this._tiles[this._tileCoordsToKey(coords)];
-				if (tile) {
-					tile.current = true;
-				} else {
-					queue.push(coords);
-				}
-			}
-		}
-
-		// sort tile queue to load tiles in order of their distance to center
-		queue.sort(function (a, b) {
-			return a.distanceTo(tileCenter) - b.distanceTo(tileCenter);
-		});
-
-		if (queue.length !== 0) {
-			// if it's the first batch of tiles to load
-			if (!this._loading) {
-				this._loading = true;
-				// @event loading: Event
-				// Fired when the grid layer starts loading tiles.
-				this.fire('loading');
-			}
-
-			// create DOM fragment to append tiles in one batch
-			var fragment = document.createDocumentFragment();
-
-			for (i = 0; i < queue.length; i++) {
-				this._addTile(queue[i], fragment);
-			}
-
-			this._level.el.appendChild(fragment);
-		}
-	},
-
-	_isValidTile: function (coords) {
-		var crs = this._map.options.crs;
-
-		if (!crs.infinite) {
-			// don't load tile if it's out of bounds and not wrapped
-			var bounds = this._globalTileRange;
-			if ((!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) ||
-			    (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))) { return false; }
-		}
-
-		if (!this.options.bounds) { return true; }
-
-		// don't load tile if it doesn't intersect the bounds in options
-		var tileBounds = this._tileCoordsToBounds(coords);
-		return L.latLngBounds(this.options.bounds).overlaps(tileBounds);
-	},
-
-	_keyToBounds: function (key) {
-		return this._tileCoordsToBounds(this._keyToTileCoords(key));
-	},
-
-	// converts tile coordinates to its geographical bounds
-	_tileCoordsToBounds: function (coords) {
-
-		var map = this._map,
-		    tileSize = this.getTileSize(),
-
-		    nwPoint = coords.scaleBy(tileSize),
-		    sePoint = nwPoint.add(tileSize),
-
-		    nw = map.unproject(nwPoint, coords.z),
-		    se = map.unproject(sePoint, coords.z),
-		    bounds = new L.LatLngBounds(nw, se);
-
-		if (!this.options.noWrap) {
-			map.wrapLatLngBounds(bounds);
-		}
-
-		return bounds;
-	},
-
-	// converts tile coordinates to key for the tile cache
-	_tileCoordsToKey: function (coords) {
-		return coords.x + ':' + coords.y + ':' + coords.z;
-	},
-
-	// converts tile cache key to coordinates
-	_keyToTileCoords: function (key) {
-		var k = key.split(':'),
-		    coords = new L.Point(+k[0], +k[1]);
-		coords.z = +k[2];
-		return coords;
-	},
-
-	_removeTile: function (key) {
-		var tile = this._tiles[key];
-		if (!tile) { return; }
-
-		L.DomUtil.remove(tile.el);
-
-		delete this._tiles[key];
-
-		// @event tileunload: TileEvent
-		// Fired when a tile is removed (e.g. when a tile goes off the screen).
-		this.fire('tileunload', {
-			tile: tile.el,
-			coords: this._keyToTileCoords(key)
-		});
-	},
-
-	_initTile: function (tile) {
-		L.DomUtil.addClass(tile, 'leaflet-tile');
-
-		var tileSize = this.getTileSize();
-		tile.style.width = tileSize.x + 'px';
-		tile.style.height = tileSize.y + 'px';
-
-		tile.onselectstart = L.Util.falseFn;
-		tile.onmousemove = L.Util.falseFn;
-
-		// update opacity on tiles in IE7-8 because of filter inheritance problems
-		if (L.Browser.ielt9 && this.options.opacity < 1) {
-			L.DomUtil.setOpacity(tile, this.options.opacity);
-		}
-
-		// without this hack, tiles disappear after zoom on Chrome for Android
-		// https://github.com/Leaflet/Leaflet/issues/2078
-		if (L.Browser.android && !L.Browser.android23) {
-			tile.style.WebkitBackfaceVisibility = 'hidden';
-		}
-	},
-
-	_addTile: function (coords, container) {
-		var tilePos = this._getTilePos(coords),
-		    key = this._tileCoordsToKey(coords);
-
-		var tile = this.createTile(this._wrapCoords(coords), L.bind(this._tileReady, this, coords));
-
-		this._initTile(tile);
-
-		// if createTile is defined with a second argument ("done" callback),
-		// we know that tile is async and will be ready later; otherwise
-		if (this.createTile.length < 2) {
-			// mark tile as ready, but delay one frame for opacity animation to happen
-			L.Util.requestAnimFrame(L.bind(this._tileReady, this, coords, null, tile));
-		}
-
-		L.DomUtil.setPosition(tile, tilePos);
-
-		// save tile in cache
-		this._tiles[key] = {
-			el: tile,
-			coords: coords,
-			current: true
-		};
-
-		container.appendChild(tile);
-		// @event tileloadstart: TileEvent
-		// Fired when a tile is requested and starts loading.
-		this.fire('tileloadstart', {
-			tile: tile,
-			coords: coords
-		});
-	},
-
-	_tileReady: function (coords, err, tile) {
-		if (!this._map) { return; }
-
-		if (err) {
-			// @event tileerror: TileErrorEvent
-			// Fired when there is an error loading a tile.
-			this.fire('tileerror', {
-				error: err,
-				tile: tile,
-				coords: coords
-			});
-		}
-
-		var key = this._tileCoordsToKey(coords);
-
-		tile = this._tiles[key];
-		if (!tile) { return; }
-
-		tile.loaded = +new Date();
-		if (this._map._fadeAnimated) {
-			L.DomUtil.setOpacity(tile.el, 0);
-			L.Util.cancelAnimFrame(this._fadeFrame);
-			this._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this);
-		} else {
-			tile.active = true;
-			this._pruneTiles();
-		}
-
-		if (!err) {
-			L.DomUtil.addClass(tile.el, 'leaflet-tile-loaded');
-
-			// @event tileload: TileEvent
-			// Fired when a tile loads.
-			this.fire('tileload', {
-				tile: tile.el,
-				coords: coords
-			});
-		}
-
-		if (this._noTilesToLoad()) {
-			this._loading = false;
-			// @event load: Event
-			// Fired when the grid layer loaded all visible tiles.
-			this.fire('load');
-
-			if (L.Browser.ielt9 || !this._map._fadeAnimated) {
-				L.Util.requestAnimFrame(this._pruneTiles, this);
-			} else {
-				// Wait a bit more than 0.2 secs (the duration of the tile fade-in)
-				// to trigger a pruning.
-				setTimeout(L.bind(this._pruneTiles, this), 250);
-			}
-		}
-	},
-
-	_getTilePos: function (coords) {
-		return coords.scaleBy(this.getTileSize()).subtract(this._level.origin);
-	},
-
-	_wrapCoords: function (coords) {
-		var newCoords = new L.Point(
-			this._wrapX ? L.Util.wrapNum(coords.x, this._wrapX) : coords.x,
-			this._wrapY ? L.Util.wrapNum(coords.y, this._wrapY) : coords.y);
-		newCoords.z = coords.z;
-		return newCoords;
-	},
-
-	_pxBoundsToTileRange: function (bounds) {
-		var tileSize = this.getTileSize();
-		return new L.Bounds(
-			bounds.min.unscaleBy(tileSize).floor(),
-			bounds.max.unscaleBy(tileSize).ceil().subtract([1, 1]));
-	},
-
-	_noTilesToLoad: function () {
-		for (var key in this._tiles) {
-			if (!this._tiles[key].loaded) { return false; }
-		}
-		return true;
-	}
-});
-
-// @factory L.gridLayer(options?: GridLayer options)
-// Creates a new instance of GridLayer with the supplied options.
-L.gridLayer = function (options) {
-	return new L.GridLayer(options);
-};
-
-
-
-/*
- * @class TileLayer
- * @inherits GridLayer
- * @aka L.TileLayer
- * Used to load and display tile layers on the map. Extends `GridLayer`.
- *
- * @example
- *
- * ```js
- * L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar'}).addTo(map);
- * ```
- *
- * @section URL template
- * @example
- *
- * A string of the following form:
- *
- * ```
- * 'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
- * ```
- *
- * `{s}` means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; `a`, `b` or `c` by default, can be omitted), `{z}` — zoom level, `{x}` and `{y}` — tile coordinates. `{r}` can be used to add @2x to the URL to load retina tiles.
- *
- * You can use custom keys in the template, which will be [evaluated](#util-template) from TileLayer options, like this:
- *
- * ```
- * L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
- * ```
- */
-
-
-L.TileLayer = L.GridLayer.extend({
-
-	// @section
-	// @aka TileLayer options
-	options: {
-		// @option minZoom: Number = 0
-		// Minimum zoom number.
-		minZoom: 0,
-
-		// @option maxZoom: Number = 18
-		// Maximum zoom number.
-		maxZoom: 18,
-
-		// @option maxNativeZoom: Number = null
-		// Maximum zoom number the tile source has available. If it is specified,
-		// the tiles on all zoom levels higher than `maxNativeZoom` will be loaded
-		// from `maxNativeZoom` level and auto-scaled.
-		maxNativeZoom: null,
-
-		// @option minNativeZoom: Number = null
-		// Minimum zoom number the tile source has available. If it is specified,
-		// the tiles on all zoom levels lower than `minNativeZoom` will be loaded
-		// from `minNativeZoom` level and auto-scaled.
-		minNativeZoom: null,
-
-		// @option subdomains: String|String[] = 'abc'
-		// Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
-		subdomains: 'abc',
-
-		// @option errorTileUrl: String = ''
-		// URL to the tile image to show in place of the tile that failed to load.
-		errorTileUrl: '',
-
-		// @option zoomOffset: Number = 0
-		// The zoom number used in tile URLs will be offset with this value.
-		zoomOffset: 0,
-
-		// @option tms: Boolean = false
-		// If `true`, inverses Y axis numbering for tiles (turn this on for [TMS](https://en.wikipedia.org/wiki/Tile_Map_Service) services).
-		tms: false,
-
-		// @option zoomReverse: Boolean = false
-		// If set to true, the zoom number used in tile URLs will be reversed (`maxZoom - zoom` instead of `zoom`)
-		zoomReverse: false,
-
-		// @option detectRetina: Boolean = false
-		// If `true` and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
-		detectRetina: false,
-
-		// @option crossOrigin: Boolean = false
-		// If true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data.
-		crossOrigin: false
-	},
-
-	initialize: function (url, options) {
-
-		this._url = url;
-
-		options = L.setOptions(this, options);
-
-		// detecting retina displays, adjusting tileSize and zoom levels
-		if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {
-
-			options.tileSize = Math.floor(options.tileSize / 2);
-
-			if (!options.zoomReverse) {
-				options.zoomOffset++;
-				options.maxZoom--;
-			} else {
-				options.zoomOffset--;
-				options.minZoom++;
-			}
-
-			options.minZoom = Math.max(0, options.minZoom);
-		}
-
-		if (typeof options.subdomains === 'string') {
-			options.subdomains = options.subdomains.split('');
-		}
-
-		// for https://github.com/Leaflet/Leaflet/issues/137
-		if (!L.Browser.android) {
-			this.on('tileunload', this._onTileRemove);
-		}
-	},
-
-	// @method setUrl(url: String, noRedraw?: Boolean): this
-	// Updates the layer's URL template and redraws it (unless `noRedraw` is set to `true`).
-	setUrl: function (url, noRedraw) {
-		this._url = url;
-
-		if (!noRedraw) {
-			this.redraw();
-		}
-		return this;
-	},
-
-	// @method createTile(coords: Object, done?: Function): HTMLElement
-	// Called only internally, overrides GridLayer's [`createTile()`](#gridlayer-createtile)
-	// to return an `<img>` HTML element with the appropiate image URL given `coords`. The `done`
-	// callback is called when the tile has been loaded.
-	createTile: function (coords, done) {
-		var tile = document.createElement('img');
-
-		L.DomEvent.on(tile, 'load', L.bind(this._tileOnLoad, this, done, tile));
-		L.DomEvent.on(tile, 'error', L.bind(this._tileOnError, this, done, tile));
-
-		if (this.options.crossOrigin) {
-			tile.crossOrigin = '';
-		}
-
-		/*
-		 Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons
-		 http://www.w3.org/TR/WCAG20-TECHS/H67
-		*/
-		tile.alt = '';
-
-		/*
-		 Set role="presentation" to force screen readers to ignore this
-		 https://www.w3.org/TR/wai-aria/roles#textalternativecomputation
-		*/
-		tile.setAttribute('role', 'presentation');
-
-		tile.src = this.getTileUrl(coords);
-
-		return tile;
-	},
-
-	// @section Extension methods
-	// @uninheritable
-	// Layers extending `TileLayer` might reimplement the following method.
-	// @method getTileUrl(coords: Object): String
-	// Called only internally, returns the URL for a tile given its coordinates.
-	// Classes extending `TileLayer` can override this function to provide custom tile URL naming schemes.
-	getTileUrl: function (coords) {
-		var data = {
-			r: L.Browser.retina ? '@2x' : '',
-			s: this._getSubdomain(coords),
-			x: coords.x,
-			y: coords.y,
-			z: this._getZoomForUrl()
-		};
-		if (this._map && !this._map.options.crs.infinite) {
-			var invertedY = this._globalTileRange.max.y - coords.y;
-			if (this.options.tms) {
-				data['y'] = invertedY;
-			}
-			data['-y'] = invertedY;
-		}
-
-		return L.Util.template(this._url, L.extend(data, this.options));
-	},
-
-	_tileOnLoad: function (done, tile) {
-		// For https://github.com/Leaflet/Leaflet/issues/3332
-		if (L.Browser.ielt9) {
-			setTimeout(L.bind(done, this, null, tile), 0);
-		} else {
-			done(null, tile);
-		}
-	},
-
-	_tileOnError: function (done, tile, e) {
-		var errorUrl = this.options.errorTileUrl;
-		if (errorUrl && tile.src !== errorUrl) {
-			tile.src = errorUrl;
-		}
-		done(e, tile);
-	},
-
-	getTileSize: function () {
-		var map = this._map,
-		tileSize = L.GridLayer.prototype.getTileSize.call(this),
-		zoom = this._tileZoom + this.options.zoomOffset,
-		minNativeZoom = this.options.minNativeZoom,
-		maxNativeZoom = this.options.maxNativeZoom;
-
-		// decrease tile size when scaling below minNativeZoom
-		if (minNativeZoom !== null && zoom < minNativeZoom) {
-			return tileSize.divideBy(map.getZoomScale(minNativeZoom, zoom)).round();
-		}
-
-		// increase tile size when scaling above maxNativeZoom
-		if (maxNativeZoom !== null && zoom > maxNativeZoom) {
-			return tileSize.divideBy(map.getZoomScale(maxNativeZoom, zoom)).round();
-		}
-
-		return tileSize;
-	},
-
-	_onTileRemove: function (e) {
-		e.tile.onload = null;
-	},
-
-	_getZoomForUrl: function () {
-		var zoom = this._tileZoom,
-		maxZoom = this.options.maxZoom,
-		zoomReverse = this.options.zoomReverse,
-		zoomOffset = this.options.zoomOffset,
-		minNativeZoom = this.options.minNativeZoom,
-		maxNativeZoom = this.options.maxNativeZoom;
-
-		if (zoomReverse) {
-			zoom = maxZoom - zoom;
-		}
-
-		zoom += zoomOffset;
-
-		if (minNativeZoom !== null && zoom < minNativeZoom) {
-			return minNativeZoom;
-		}
-
-		if (maxNativeZoom !== null && zoom > maxNativeZoom) {
-			return maxNativeZoom;
-		}
-
-		return zoom;
-	},
-
-	_getSubdomain: function (tilePoint) {
-		var index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;
-		return this.options.subdomains[index];
-	},
-
-	// stops loading all tiles in the background layer
-	_abortLoading: function () {
-		var i, tile;
-		for (i in this._tiles) {
-			if (this._tiles[i].coords.z !== this._tileZoom) {
-				tile = this._tiles[i].el;
-
-				tile.onload = L.Util.falseFn;
-				tile.onerror = L.Util.falseFn;
-
-				if (!tile.complete) {
-					tile.src = L.Util.emptyImageUrl;
-					L.DomUtil.remove(tile);
-				}
-			}
-		}
-	}
-});
-
-
-// @factory L.tilelayer(urlTemplate: String, options?: TileLayer options)
-// Instantiates a tile layer object given a `URL template` and optionally an options object.
-
-L.tileLayer = function (url, options) {
-	return new L.TileLayer(url, options);
-};
-
-
-
-/*
- * @class TileLayer.WMS
- * @inherits TileLayer
- * @aka L.TileLayer.WMS
- * Used to display [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services as tile layers on the map. Extends `TileLayer`.
- *
- * @example
- *
- * ```js
- * var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
- * 	layers: 'nexrad-n0r-900913',
- * 	format: 'image/png',
- * 	transparent: true,
- * 	attribution: "Weather data © 2012 IEM Nexrad"
- * });
- * ```
- */
-
-L.TileLayer.WMS = L.TileLayer.extend({
-
-	// @section
-	// @aka TileLayer.WMS options
-	// If any custom options not documented here are used, they will be sent to the
-	// WMS server as extra parameters in each request URL. This can be useful for
-	// [non-standard vendor WMS parameters](http://docs.geoserver.org/stable/en/user/services/wms/vendor.html).
-	defaultWmsParams: {
-		service: 'WMS',
-		request: 'GetMap',
-
-		// @option layers: String = ''
-		// **(required)** Comma-separated list of WMS layers to show.
-		layers: '',
-
-		// @option styles: String = ''
-		// Comma-separated list of WMS styles.
-		styles: '',
-
-		// @option format: String = 'image/jpeg'
-		// WMS image format (use `'image/png'` for layers with transparency).
-		format: 'image/jpeg',
-
-		// @option transparent: Boolean = false
-		// If `true`, the WMS service will return images with transparency.
-		transparent: false,
-
-		// @option version: String = '1.1.1'
-		// Version of the WMS service to use
-		version: '1.1.1'
-	},
-
-	options: {
-		// @option crs: CRS = null
-		// Coordinate Reference System to use for the WMS requests, defaults to
-		// map CRS. Don't change this if you're not sure what it means.
-		crs: null,
-
-		// @option uppercase: Boolean = false
-		// If `true`, WMS request parameter keys will be uppercase.
-		uppercase: false
-	},
-
-	initialize: function (url, options) {
-
-		this._url = url;
-
-		var wmsParams = L.extend({}, this.defaultWmsParams);
-
-		// all keys that are not TileLayer options go to WMS params
-		for (var i in options) {
-			if (!(i in this.options)) {
-				wmsParams[i] = options[i];
-			}
-		}
-
-		options = L.setOptions(this, options);
-
-		wmsParams.width = wmsParams.height = options.tileSize * (options.detectRetina && L.Browser.retina ? 2 : 1);
-
-		this.wmsParams = wmsParams;
-	},
-
-	onAdd: function (map) {
-
-		this._crs = this.options.crs || map.options.crs;
-		this._wmsVersion = parseFloat(this.wmsParams.version);
-
-		var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';
-		this.wmsParams[projectionKey] = this._crs.code;
-
-		L.TileLayer.prototype.onAdd.call(this, map);
-	},
-
-	getTileUrl: function (coords) {
-
-		var tileBounds = this._tileCoordsToBounds(coords),
-		    nw = this._crs.project(tileBounds.getNorthWest()),
-		    se = this._crs.project(tileBounds.getSouthEast()),
-
-		    bbox = (this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?
-			    [se.y, nw.x, nw.y, se.x] :
-			    [nw.x, se.y, se.x, nw.y]).join(','),
-
-		    url = L.TileLayer.prototype.getTileUrl.call(this, coords);
-
-		return url +
-			L.Util.getParamString(this.wmsParams, url, this.options.uppercase) +
-			(this.options.uppercase ? '&BBOX=' : '&bbox=') + bbox;
-	},
-
-	// @method setParams(params: Object, noRedraw?: Boolean): this
-	// Merges an object with the new parameters and re-requests tiles on the current screen (unless `noRedraw` was set to true).
-	setParams: function (params, noRedraw) {
-
-		L.extend(this.wmsParams, params);
-
-		if (!noRedraw) {
-			this.redraw();
-		}
-
-		return this;
-	}
-});
-
-
-// @factory L.tileLayer.wms(baseUrl: String, options: TileLayer.WMS options)
-// Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
-L.tileLayer.wms = function (url, options) {
-	return new L.TileLayer.WMS(url, options);
-};
-
-
-
-/*
- * @class ImageOverlay
- * @aka L.ImageOverlay
- * @inherits Interactive layer
- *
- * Used to load and display a single image over specific bounds of the map. Extends `Layer`.
- *
- * @example
- *
- * ```js
- * var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
- * 	imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
- * L.imageOverlay(imageUrl, imageBounds).addTo(map);
- * ```
- */
-
-L.ImageOverlay = L.Layer.extend({
-
-	// @section
-	// @aka ImageOverlay options
-	options: {
-		// @option opacity: Number = 1.0
-		// The opacity of the image overlay.
-		opacity: 1,
-
-		// @option alt: String = ''
-		// Text for the `alt` attribute of the image (useful for accessibility).
-		alt: '',
-
-		// @option interactive: Boolean = false
-		// If `true`, the image overlay will emit [mouse events](#interactive-layer) when clicked or hovered.
-		interactive: false,
-
-		// @option crossOrigin: Boolean = false
-		// If true, the image will have its crossOrigin attribute set to ''. This is needed if you want to access image pixel data.
-		crossOrigin: false
-	},
-
-	initialize: function (url, bounds, options) { // (String, LatLngBounds, Object)
-		this._url = url;
-		this._bounds = L.latLngBounds(bounds);
-
-		L.setOptions(this, options);
-	},
-
-	onAdd: function () {
-		if (!this._image) {
-			this._initImage();
-
-			if (this.options.opacity < 1) {
-				this._updateOpacity();
-			}
-		}
-
-		if (this.options.interactive) {
-			L.DomUtil.addClass(this._image, 'leaflet-interactive');
-			this.addInteractiveTarget(this._image);
-		}
-
-		this.getPane().appendChild(this._image);
-		this._reset();
-	},
-
-	onRemove: function () {
-		L.DomUtil.remove(this._image);
-		if (this.options.interactive) {
-			this.removeInteractiveTarget(this._image);
-		}
-	},
-
-	// @method setOpacity(opacity: Number): this
-	// Sets the opacity of the overlay.
-	setOpacity: function (opacity) {
-		this.options.opacity = opacity;
-
-		if (this._image) {
-			this._updateOpacity();
-		}
-		return this;
-	},
-
-	setStyle: function (styleOpts) {
-		if (styleOpts.opacity) {
-			this.setOpacity(styleOpts.opacity);
-		}
-		return this;
-	},
-
-	// @method bringToFront(): this
-	// Brings the layer to the top of all overlays.
-	bringToFront: function () {
-		if (this._map) {
-			L.DomUtil.toFront(this._image);
-		}
-		return this;
-	},
-
-	// @method bringToBack(): this
-	// Brings the layer to the bottom of all overlays.
-	bringToBack: function () {
-		if (this._map) {
-			L.DomUtil.toBack(this._image);
-		}
-		return this;
-	},
-
-	// @method setUrl(url: String): this
-	// Changes the URL of the image.
-	setUrl: function (url) {
-		this._url = url;
-
-		if (this._image) {
-			this._image.src = url;
-		}
-		return this;
-	},
-
-	// @method setBounds(bounds: LatLngBounds): this
-	// Update the bounds that this ImageOverlay covers
-	setBounds: function (bounds) {
-		this._bounds = bounds;
-
-		if (this._map) {
-			this._reset();
-		}
-		return this;
-	},
-
-	getEvents: function () {
-		var events = {
-			zoom: this._reset,
-			viewreset: this._reset
-		};
-
-		if (this._zoomAnimated) {
-			events.zoomanim = this._animateZoom;
-		}
-
-		return events;
-	},
-
-	// @method getBounds(): LatLngBounds
-	// Get the bounds that this ImageOverlay covers
-	getBounds: function () {
-		return this._bounds;
-	},
-
-	// @method getElement(): HTMLElement
-	// Get the img element that represents the ImageOverlay on the map
-	getElement: function () {
-		return this._image;
-	},
-
-	_initImage: function () {
-		var img = this._image = L.DomUtil.create('img',
-				'leaflet-image-layer ' + (this._zoomAnimated ? 'leaflet-zoom-animated' : ''));
-
-		img.onselectstart = L.Util.falseFn;
-		img.onmousemove = L.Util.falseFn;
-
-		img.onload = L.bind(this.fire, this, 'load');
-
-		if (this.options.crossOrigin) {
-			img.crossOrigin = '';
-		}
-
-		img.src = this._url;
-		img.alt = this.options.alt;
-	},
-
-	_animateZoom: function (e) {
-		var scale = this._map.getZoomScale(e.zoom),
-		    offset = this._map._latLngBoundsToNewLayerBounds(this._bounds, e.zoom, e.center).min;
-
-		L.DomUtil.setTransform(this._image, offset, scale);
-	},
-
-	_reset: function () {
-		var image = this._image,
-		    bounds = new L.Bounds(
-		        this._map.latLngToLayerPoint(this._bounds.getNorthWest()),
-		        this._map.latLngToLayerPoint(this._bounds.getSouthEast())),
-		    size = bounds.getSize();
-
-		L.DomUtil.setPosition(image, bounds.min);
-
-		image.style.width  = size.x + 'px';
-		image.style.height = size.y + 'px';
-	},
-
-	_updateOpacity: function () {
-		L.DomUtil.setOpacity(this._image, this.options.opacity);
-	}
-});
-
-// @factory L.imageOverlay(imageUrl: String, bounds: LatLngBounds, options?: ImageOverlay options)
-// Instantiates an image overlay object given the URL of the image and the
-// geographical bounds it is tied to.
-L.imageOverlay = function (url, bounds, options) {
-	return new L.ImageOverlay(url, bounds, options);
-};
-
-
-
-/*
- * @class Icon
- * @aka L.Icon
- * @inherits Layer
- *
- * Represents an icon to provide when creating a marker.
- *
- * @example
- *
- * ```js
- * var myIcon = L.icon({
- *     iconUrl: 'my-icon.png',
- *     iconRetinaUrl: 'my-icon@2x.png',
- *     iconSize: [38, 95],
- *     iconAnchor: [22, 94],
- *     popupAnchor: [-3, -76],
- *     shadowUrl: 'my-icon-shadow.png',
- *     shadowRetinaUrl: 'my-icon-shadow@2x.png',
- *     shadowSize: [68, 95],
- *     shadowAnchor: [22, 94]
- * });
- *
- * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
- * ```
- *
- * `L.Icon.Default` extends `L.Icon` and is the blue icon Leaflet uses for markers by default.
- *
- */
-
-L.Icon = L.Class.extend({
-
-	/* @section
-	 * @aka Icon options
-	 *
-	 * @option iconUrl: String = null
-	 * **(required)** The URL to the icon image (absolute or relative to your script path).
-	 *
-	 * @option iconRetinaUrl: String = null
-	 * The URL to a retina sized version of the icon image (absolute or relative to your
-	 * script path). Used for Retina screen devices.
-	 *
-	 * @option iconSize: Point = null
-	 * Size of the icon image in pixels.
-	 *
-	 * @option iconAnchor: Point = null
-	 * The coordinates of the "tip" of the icon (relative to its top left corner). The icon
-	 * will be aligned so that this point is at the marker's geographical location. Centered
-	 * by default if size is specified, also can be set in CSS with negative margins.
-	 *
-	 * @option popupAnchor: Point = null
-	 * The coordinates of the point from which popups will "open", relative to the icon anchor.
-	 *
-	 * @option shadowUrl: String = null
-	 * The URL to the icon shadow image. If not specified, no shadow image will be created.
-	 *
-	 * @option shadowRetinaUrl: String = null
-	 *
-	 * @option shadowSize: Point = null
-	 * Size of the shadow image in pixels.
-	 *
-	 * @option shadowAnchor: Point = null
-	 * The coordinates of the "tip" of the shadow (relative to its top left corner) (the same
-	 * as iconAnchor if not specified).
-	 *
-	 * @option className: String = ''
-	 * A custom class name to assign to both icon and shadow images. Empty by default.
-	 */
-
-	initialize: function (options) {
-		L.setOptions(this, options);
-	},
-
-	// @method createIcon(oldIcon?: HTMLElement): HTMLElement
-	// Called internally when the icon has to be shown, returns a `<img>` HTML element
-	// styled according to the options.
-	createIcon: function (oldIcon) {
-		return this._createIcon('icon', oldIcon);
-	},
-
-	// @method createShadow(oldIcon?: HTMLElement): HTMLElement
-	// As `createIcon`, but for the shadow beneath it.
-	createShadow: function (oldIcon) {
-		return this._createIcon('shadow', oldIcon);
-	},
-
-	_createIcon: function (name, oldIcon) {
-		var src = this._getIconUrl(name);
-
-		if (!src) {
-			if (name === 'icon') {
-				throw new Error('iconUrl not set in Icon options (see the docs).');
-			}
-			return null;
-		}
-
-		var img = this._createImg(src, oldIcon && oldIcon.tagName === 'IMG' ? oldIcon : null);
-		this._setIconStyles(img, name);
-
-		return img;
-	},
-
-	_setIconStyles: function (img, name) {
-		var options = this.options;
-		var sizeOption = options[name + 'Size'];
-
-		if (typeof sizeOption === 'number') {
-			sizeOption = [sizeOption, sizeOption];
-		}
-
-		var size = L.point(sizeOption),
-		    anchor = L.point(name === 'shadow' && options.shadowAnchor || options.iconAnchor ||
-		            size && size.divideBy(2, true));
-
-		img.className = 'leaflet-marker-' + name + ' ' + (options.className || '');
-
-		if (anchor) {
-			img.style.marginLeft = (-anchor.x) + 'px';
-			img.style.marginTop  = (-anchor.y) + 'px';
-		}
-
-		if (size) {
-			img.style.width  = size.x + 'px';
-			img.style.height = size.y + 'px';
-		}
-	},
-
-	_createImg: function (src, el) {
-		el = el || document.createElement('img');
-		el.src = src;
-		return el;
-	},
-
-	_getIconUrl: function (name) {
-		return L.Browser.retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url'];
-	}
-});
-
-
-// @factory L.icon(options: Icon options)
-// Creates an icon instance with the given options.
-L.icon = function (options) {
-	return new L.Icon(options);
-};
-
-
-
-/*
- * @miniclass Icon.Default (Icon)
- * @aka L.Icon.Default
- * @section
- *
- * A trivial subclass of `Icon`, represents the icon to use in `Marker`s when
- * no icon is specified. Points to the blue marker image distributed with Leaflet
- * releases.
- *
- * In order to customize the default icon, just change the properties of `L.Icon.Default.prototype.options`
- * (which is a set of `Icon options`).
- *
- * If you want to _completely_ replace the default icon, override the
- * `L.Marker.prototype.options.icon` with your own icon instead.
- */
-
-L.Icon.Default = L.Icon.extend({
-
-	options: {
-		iconUrl:       'marker-icon.png',
-		iconRetinaUrl: 'marker-icon-2x.png',
-		shadowUrl:     'marker-shadow.png',
-		iconSize:    [25, 41],
-		iconAnchor:  [12, 41],
-		popupAnchor: [1, -34],
-		tooltipAnchor: [16, -28],
-		shadowSize:  [41, 41]
-	},
-
-	_getIconUrl: function (name) {
-		if (!L.Icon.Default.imagePath) {	// Deprecated, backwards-compatibility only
-			L.Icon.Default.imagePath = this._detectIconPath();
-		}
-
-		// @option imagePath: String
-		// `L.Icon.Default` will try to auto-detect the absolute location of the
-		// blue icon images. If you are placing these images in a non-standard
-		// way, set this option to point to the right absolute path.
-		return (this.options.imagePath || L.Icon.Default.imagePath) + L.Icon.prototype._getIconUrl.call(this, name);
-	},
-
-	_detectIconPath: function () {
-		var el = L.DomUtil.create('div',  'leaflet-default-icon-path', document.body);
-		var path = L.DomUtil.getStyle(el, 'background-image') ||
-		           L.DomUtil.getStyle(el, 'backgroundImage');	// IE8
-
-		document.body.removeChild(el);
-
-		return path.indexOf('url') === 0 ?
-			path.replace(/^url\([\"\']?/, '').replace(/marker-icon\.png[\"\']?\)$/, '') : '';
-	}
-});
-
-
-
-/*
- * @class Marker
- * @inherits Interactive layer
- * @aka L.Marker
- * L.Marker is used to display clickable/draggable icons on the map. Extends `Layer`.
- *
- * @example
- *
- * ```js
- * L.marker([50.5, 30.5]).addTo(map);
- * ```
- */
-
-L.Marker = L.Layer.extend({
-
-	// @section
-	// @aka Marker options
-	options: {
-		// @option icon: Icon = *
-		// Icon class to use for rendering the marker. See [Icon documentation](#L.Icon) for details on how to customize the marker icon. If not specified, a new `L.Icon.Default` is used.
-		icon: new L.Icon.Default(),
-
-		// Option inherited from "Interactive layer" abstract class
-		interactive: true,
-
-		// @option draggable: Boolean = false
-		// Whether the marker is draggable with mouse/touch or not.
-		draggable: false,
-
-		// @option keyboard: Boolean = true
-		// Whether the marker can be tabbed to with a keyboard and clicked by pressing enter.
-		keyboard: true,
-
-		// @option title: String = ''
-		// Text for the browser tooltip that appear on marker hover (no tooltip by default).
-		title: '',
-
-		// @option alt: String = ''
-		// Text for the `alt` attribute of the icon image (useful for accessibility).
-		alt: '',
-
-		// @option zIndexOffset: Number = 0
-		// By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like `1000` (or high negative value, respectively).
-		zIndexOffset: 0,
-
-		// @option opacity: Number = 1.0
-		// The opacity of the marker.
-		opacity: 1,
-
-		// @option riseOnHover: Boolean = false
-		// If `true`, the marker will get on top of others when you hover the mouse over it.
-		riseOnHover: false,
-
-		// @option riseOffset: Number = 250
-		// The z-index offset used for the `riseOnHover` feature.
-		riseOffset: 250,
-
-		// @option pane: String = 'markerPane'
-		// `Map pane` where the markers icon will be added.
-		pane: 'markerPane',
-
-		// FIXME: shadowPane is no longer a valid option
-		nonBubblingEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu']
-	},
-
-	/* @section
-	 *
-	 * In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPopup() you can also use the following methods:
-	 */
-
-	initialize: function (latlng, options) {
-		L.setOptions(this, options);
-		this._latlng = L.latLng(latlng);
-	},
-
-	onAdd: function (map) {
-		this._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation;
-
-		if (this._zoomAnimated) {
-			map.on('zoomanim', this._animateZoom, this);
-		}
-
-		this._initIcon();
-		this.update();
-	},
-
-	onRemove: function (map) {
-		if (this.dragging && this.dragging.enabled()) {
-			this.options.draggable = true;
-			this.dragging.removeHooks();
-		}
-
-		if (this._zoomAnimated) {
-			map.off('zoomanim', this._animateZoom, this);
-		}
-
-		this._removeIcon();
-		this._removeShadow();
-	},
-
-	getEvents: function () {
-		return {
-			zoom: this.update,
-			viewreset: this.update
-		};
-	},
-
-	// @method getLatLng: LatLng
-	// Returns the current geographical position of the marker.
-	getLatLng: function () {
-		return this._latlng;
-	},
-
-	// @method setLatLng(latlng: LatLng): this
-	// Changes the marker position to the given point.
-	setLatLng: function (latlng) {
-		var oldLatLng = this._latlng;
-		this._latlng = L.latLng(latlng);
-		this.update();
-
-		// @event move: Event
-		// Fired when the marker is moved via [`setLatLng`](#marker-setlatlng) or by [dragging](#marker-dragging). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`.
-		return this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng});
-	},
-
-	// @method setZIndexOffset(offset: Number): this
-	// Changes the [zIndex offset](#marker-zindexoffset) of the marker.
-	setZIndexOffset: function (offset) {
-		this.options.zIndexOffset = offset;
-		return this.update();
-	},
-
-	// @method setIcon(icon: Icon): this
-	// Changes the marker icon.
-	setIcon: function (icon) {
-
-		this.options.icon = icon;
-
-		if (this._map) {
-			this._initIcon();
-			this.update();
-		}
-
-		if (this._popup) {
-			this.bindPopup(this._popup, this._popup.options);
-		}
-
-		return this;
-	},
-
-	getElement: function () {
-		return this._icon;
-	},
-
-	update: function () {
-
-		if (this._icon) {
-			var pos = this._map.latLngToLayerPoint(this._latlng).round();
-			this._setPos(pos);
-		}
-
-		return this;
-	},
-
-	_initIcon: function () {
-		var options = this.options,
-		    classToAdd = 'leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');
-
-		var icon = options.icon.createIcon(this._icon),
-		    addIcon = false;
-
-		// if we're not reusing the icon, remove the old one and init new one
-		if (icon !== this._icon) {
-			if (this._icon) {
-				this._removeIcon();
-			}
-			addIcon = true;
-
-			if (options.title) {
-				icon.title = options.title;
-			}
-			if (options.alt) {
-				icon.alt = options.alt;
-			}
-		}
-
-		L.DomUtil.addClass(icon, classToAdd);
-
-		if (options.keyboard) {
-			icon.tabIndex = '0';
-		}
-
-		this._icon = icon;
-
-		if (options.riseOnHover) {
-			this.on({
-				mouseover: this._bringToFront,
-				mouseout: this._resetZIndex
-			});
-		}
-
-		var newShadow = options.icon.createShadow(this._shadow),
-		    addShadow = false;
-
-		if (newShadow !== this._shadow) {
-			this._removeShadow();
-			addShadow = true;
-		}
-
-		if (newShadow) {
-			L.DomUtil.addClass(newShadow, classToAdd);
-			newShadow.alt = '';
-		}
-		this._shadow = newShadow;
-
-
-		if (options.opacity < 1) {
-			this._updateOpacity();
-		}
-
-
-		if (addIcon) {
-			this.getPane().appendChild(this._icon);
-		}
-		this._initInteraction();
-		if (newShadow && addShadow) {
-			this.getPane('shadowPane').appendChild(this._shadow);
-		}
-	},
-
-	_removeIcon: function () {
-		if (this.options.riseOnHover) {
-			this.off({
-				mouseover: this._bringToFront,
-				mouseout: this._resetZIndex
-			});
-		}
-
-		L.DomUtil.remove(this._icon);
-		this.removeInteractiveTarget(this._icon);
-
-		this._icon = null;
-	},
-
-	_removeShadow: function () {
-		if (this._shadow) {
-			L.DomUtil.remove(this._shadow);
-		}
-		this._shadow = null;
-	},
-
-	_setPos: function (pos) {
-		L.DomUtil.setPosition(this._icon, pos);
-
-		if (this._shadow) {
-			L.DomUtil.setPosition(this._shadow, pos);
-		}
-
-		this._zIndex = pos.y + this.options.zIndexOffset;
-
-		this._resetZIndex();
-	},
-
-	_updateZIndex: function (offset) {
-		this._icon.style.zIndex = this._zIndex + offset;
-	},
-
-	_animateZoom: function (opt) {
-		var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();
-
-		this._setPos(pos);
-	},
-
-	_initInteraction: function () {
-
-		if (!this.options.interactive) { return; }
-
-		L.DomUtil.addClass(this._icon, 'leaflet-interactive');
-
-		this.addInteractiveTarget(this._icon);
-
-		if (L.Handler.MarkerDrag) {
-			var draggable = this.options.draggable;
-			if (this.dragging) {
-				draggable = this.dragging.enabled();
-				this.dragging.disable();
-			}
-
-			this.dragging = new L.Handler.MarkerDrag(this);
-
-			if (draggable) {
-				this.dragging.enable();
-			}
-		}
-	},
-
-	// @method setOpacity(opacity: Number): this
-	// Changes the opacity of the marker.
-	setOpacity: function (opacity) {
-		this.options.opacity = opacity;
-		if (this._map) {
-			this._updateOpacity();
-		}
-
-		return this;
-	},
-
-	_updateOpacity: function () {
-		var opacity = this.options.opacity;
-
-		L.DomUtil.setOpacity(this._icon, opacity);
-
-		if (this._shadow) {
-			L.DomUtil.setOpacity(this._shadow, opacity);
-		}
-	},
-
-	_bringToFront: function () {
-		this._updateZIndex(this.options.riseOffset);
-	},
-
-	_resetZIndex: function () {
-		this._updateZIndex(0);
-	},
-
-	_getPopupAnchor: function () {
-		return this.options.icon.options.popupAnchor || [0, 0];
-	},
-
-	_getTooltipAnchor: function () {
-		return this.options.icon.options.tooltipAnchor || [0, 0];
-	}
-});
-
-
-// factory L.marker(latlng: LatLng, options? : Marker options)
-
-// @factory L.marker(latlng: LatLng, options? : Marker options)
-// Instantiates a Marker object given a geographical point and optionally an options object.
-L.marker = function (latlng, options) {
-	return new L.Marker(latlng, options);
-};
-
-
-
-/*
- * @class DivIcon
- * @aka L.DivIcon
- * @inherits Icon
- *
- * Represents a lightweight icon for markers that uses a simple `<div>`
- * element instead of an image. Inherits from `Icon` but ignores the `iconUrl` and shadow options.
- *
- * @example
- * ```js
- * var myIcon = L.divIcon({className: 'my-div-icon'});
- * // you can set .my-div-icon styles in CSS
- *
- * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
- * ```
- *
- * By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.
- */
-
-L.DivIcon = L.Icon.extend({
-	options: {
-		// @section
-		// @aka DivIcon options
-		iconSize: [12, 12], // also can be set through CSS
-
-		// iconAnchor: (Point),
-		// popupAnchor: (Point),
-
-		// @option html: String = ''
-		// Custom HTML code to put inside the div element, empty by default.
-		html: false,
-
-		// @option bgPos: Point = [0, 0]
-		// Optional relative position of the background, in pixels
-		bgPos: null,
-
-		className: 'leaflet-div-icon'
-	},
-
-	createIcon: function (oldIcon) {
-		var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),
-		    options = this.options;
-
-		div.innerHTML = options.html !== false ? options.html : '';
-
-		if (options.bgPos) {
-			var bgPos = L.point(options.bgPos);
-			div.style.backgroundPosition = (-bgPos.x) + 'px ' + (-bgPos.y) + 'px';
-		}
-		this._setIconStyles(div, 'icon');
-
-		return div;
-	},
-
-	createShadow: function () {
-		return null;
-	}
-});
-
-// @factory L.divIcon(options: DivIcon options)
-// Creates a `DivIcon` instance with the given options.
-L.divIcon = function (options) {
-	return new L.DivIcon(options);
-};
-
-
-
-/*
- * @class DivOverlay
- * @inherits Layer
- * @aka L.DivOverlay
- * Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.
- */
-
-// @namespace DivOverlay
-L.DivOverlay = L.Layer.extend({
-
-	// @section
-	// @aka DivOverlay options
-	options: {
-		// @option offset: Point = Point(0, 7)
-		// The offset of the popup position. Useful to control the anchor
-		// of the popup when opening it on some overlays.
-		offset: [0, 7],
-
-		// @option className: String = ''
-		// A custom CSS class name to assign to the popup.
-		className: '',
-
-		// @option pane: String = 'popupPane'
-		// `Map pane` where the popup will be added.
-		pane: 'popupPane'
-	},
-
-	initialize: function (options, source) {
-		L.setOptions(this, options);
-
-		this._source = source;
-	},
-
-	onAdd: function (map) {
-		this._zoomAnimated = map._zoomAnimated;
-
-		if (!this._container) {
-			this._initLayout();
-		}
-
-		if (map._fadeAnimated) {
-			L.DomUtil.setOpacity(this._container, 0);
-		}
-
-		clearTimeout(this._removeTimeout);
-		this.getPane().appendChild(this._container);
-		this.update();
-
-		if (map._fadeAnimated) {
-			L.DomUtil.setOpacity(this._container, 1);
-		}
-
-		this.bringToFront();
-	},
-
-	onRemove: function (map) {
-		if (map._fadeAnimated) {
-			L.DomUtil.setOpacity(this._container, 0);
-			this._removeTimeout = setTimeout(L.bind(L.DomUtil.remove, L.DomUtil, this._container), 200);
-		} else {
-			L.DomUtil.remove(this._container);
-		}
-	},
-
-	// @namespace Popup
-	// @method getLatLng: LatLng
-	// Returns the geographical point of popup.
-	getLatLng: function () {
-		return this._latlng;
-	},
-
-	// @method setLatLng(latlng: LatLng): this
-	// Sets the geographical point where the popup will open.
-	setLatLng: function (latlng) {
-		this._latlng = L.latLng(latlng);
-		if (this._map) {
-			this._updatePosition();
-			this._adjustPan();
-		}
-		return this;
-	},
-
-	// @method getContent: String|HTMLElement
-	// Returns the content of the popup.
-	getContent: function () {
-		return this._content;
-	},
-
-	// @method setContent(htmlContent: String|HTMLElement|Function): this
-	// Sets the HTML content of the popup. If a function is passed the source layer will be passed to the function. The function should return a `String` or `HTMLElement` to be used in the popup.
-	setContent: function (content) {
-		this._content = content;
-		this.update();
-		return this;
-	},
-
-	// @method getElement: String|HTMLElement
-	// Alias for [getContent()](#popup-getcontent)
-	getElement: function () {
-		return this._container;
-	},
-
-	// @method update: null
-	// Updates the popup content, layout and position. Useful for updating the popup after something inside changed, e.g. image loaded.
-	update: function () {
-		if (!this._map) { return; }
-
-		this._container.style.visibility = 'hidden';
-
-		this._updateContent();
-		this._updateLayout();
-		this._updatePosition();
-
-		this._container.style.visibility = '';
-
-		this._adjustPan();
-	},
-
-	getEvents: function () {
-		var events = {
-			zoom: this._updatePosition,
-			viewreset: this._updatePosition
-		};
-
-		if (this._zoomAnimated) {
-			events.zoomanim = this._animateZoom;
-		}
-		return events;
-	},
-
-	// @method isOpen: Boolean
-	// Returns `true` when the popup is visible on the map.
-	isOpen: function () {
-		return !!this._map && this._map.hasLayer(this);
-	},
-
-	// @method bringToFront: this
-	// Brings this popup in front of other popups (in the same map pane).
-	bringToFront: function () {
-		if (this._map) {
-			L.DomUtil.toFront(this._container);
-		}
-		return this;
-	},
-
-	// @method bringToBack: this
-	// Brings this popup to the back of other popups (in the same map pane).
-	bringToBack: function () {
-		if (this._map) {
-			L.DomUtil.toBack(this._container);
-		}
-		return this;
-	},
-
-	_updateContent: function () {
-		if (!this._content) { return; }
-
-		var node = this._contentNode;
-		var content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content;
-
-		if (typeof content === 'string') {
-			node.innerHTML = content;
-		} else {
-			while (node.hasChildNodes()) {
-				node.removeChild(node.firstChild);
-			}
-			node.appendChild(content);
-		}
-		this.fire('contentupdate');
-	},
-
-	_updatePosition: function () {
-		if (!this._map) { return; }
-
-		var pos = this._map.latLngToLayerPoint(this._latlng),
-		    offset = L.point(this.options.offset),
-		    anchor = this._getAnchor();
-
-		if (this._zoomAnimated) {
-			L.DomUtil.setPosition(this._container, pos.add(anchor));
-		} else {
-			offset = offset.add(pos).add(anchor);
-		}
-
-		var bottom = this._containerBottom = -offset.y,
-		    left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x;
-
-		// bottom position the popup in case the height of the popup changes (images loading etc)
-		this._container.style.bottom = bottom + 'px';
-		this._container.style.left = left + 'px';
-	},
-
-	_getAnchor: function () {
-		return [0, 0];
-	}
-
-});
-
-
-
-/*
- * @class Popup
- * @inherits DivOverlay
- * @aka L.Popup
- * Used to open popups in certain places of the map. Use [Map.openPopup](#map-openpopup) to
- * open popups while making sure that only one popup is open at one time
- * (recommended for usability), or use [Map.addLayer](#map-addlayer) to open as many as you want.
- *
- * @example
- *
- * If you want to just bind a popup to marker click and then open it, it's really easy:
- *
- * ```js
- * marker.bindPopup(popupContent).openPopup();
- * ```
- * Path overlays like polylines also have a `bindPopup` method.
- * Here's a more complicated way to open a popup on a map:
- *
- * ```js
- * var popup = L.popup()
- * 	.setLatLng(latlng)
- * 	.setContent('<p>Hello world!<br />This is a nice popup.</p>')
- * 	.openOn(map);
- * ```
- */
-
-
-// @namespace Popup
-L.Popup = L.DivOverlay.extend({
-
-	// @section
-	// @aka Popup options
-	options: {
-		// @option maxWidth: Number = 300
-		// Max width of the popup, in pixels.
-		maxWidth: 300,
-
-		// @option minWidth: Number = 50
-		// Min width of the popup, in pixels.
-		minWidth: 50,
-
-		// @option maxHeight: Number = null
-		// If set, creates a scrollable container of the given height
-		// inside a popup if its content exceeds it.
-		maxHeight: null,
-
-		// @option autoPan: Boolean = true
-		// Set it to `false` if you don't want the map to do panning animation
-		// to fit the opened popup.
-		autoPan: true,
-
-		// @option autoPanPaddingTopLeft: Point = null
-		// The margin between the popup and the top left corner of the map
-		// view after autopanning was performed.
-		autoPanPaddingTopLeft: null,
-
-		// @option autoPanPaddingBottomRight: Point = null
-		// The margin between the popup and the bottom right corner of the map
-		// view after autopanning was performed.
-		autoPanPaddingBottomRight: null,
-
-		// @option autoPanPadding: Point = Point(5, 5)
-		// Equivalent of setting both top left and bottom right autopan padding to the same value.
-		autoPanPadding: [5, 5],
-
-		// @option keepInView: Boolean = false
-		// Set it to `true` if you want to prevent users from panning the popup
-		// off of the screen while it is open.
-		keepInView: false,
-
-		// @option closeButton: Boolean = true
-		// Controls the presence of a close button in the popup.
-		closeButton: true,
-
-		// @option autoClose: Boolean = true
-		// Set it to `false` if you want to override the default behavior of
-		// the popup closing when user clicks the map (set globally by
-		// the Map's [closePopupOnClick](#map-closepopuponclick) option).
-		autoClose: true,
-
-		// @option className: String = ''
-		// A custom CSS class name to assign to the popup.
-		className: ''
-	},
-
-	// @namespace Popup
-	// @method openOn(map: Map): this
-	// Adds the popup to the map and closes the previous one. The same as `map.openPopup(popup)`.
-	openOn: function (map) {
-		map.openPopup(this);
-		return this;
-	},
-
-	onAdd: function (map) {
-		L.DivOverlay.prototype.onAdd.call(this, map);
-
-		// @namespace Map
-		// @section Popup events
-		// @event popupopen: PopupEvent
-		// Fired when a popup is opened in the map
-		map.fire('popupopen', {popup: this});
-
-		if (this._source) {
-			// @namespace Layer
-			// @section Popup events
-			// @event popupopen: PopupEvent
-			// Fired when a popup bound to this layer is opened
-			this._source.fire('popupopen', {popup: this}, true);
-			// For non-path layers, we toggle the popup when clicking
-			// again the layer, so prevent the map to reopen it.
-			if (!(this._source instanceof L.Path)) {
-				this._source.on('preclick', L.DomEvent.stopPropagation);
-			}
-		}
-	},
-
-	onRemove: function (map) {
-		L.DivOverlay.prototype.onRemove.call(this, map);
-
-		// @namespace Map
-		// @section Popup events
-		// @event popupclose: PopupEvent
-		// Fired when a popup in the map is closed
-		map.fire('popupclose', {popup: this});
-
-		if (this._source) {
-			// @namespace Layer
-			// @section Popup events
-			// @event popupclose: PopupEvent
-			// Fired when a popup bound to this layer is closed
-			this._source.fire('popupclose', {popup: this}, true);
-			if (!(this._source instanceof L.Path)) {
-				this._source.off('preclick', L.DomEvent.stopPropagation);
-			}
-		}
-	},
-
-	getEvents: function () {
-		var events = L.DivOverlay.prototype.getEvents.call(this);
-
-		if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {
-			events.preclick = this._close;
-		}
-
-		if (this.options.keepInView) {
-			events.moveend = this._adjustPan;
-		}
-
-		return events;
-	},
-
-	_close: function () {
-		if (this._map) {
-			this._map.closePopup(this);
-		}
-	},
-
-	_initLayout: function () {
-		var prefix = 'leaflet-popup',
-		    container = this._container = L.DomUtil.create('div',
-			prefix + ' ' + (this.options.className || '') +
-			' leaflet-zoom-animated');
-
-		if (this.options.closeButton) {
-			var closeButton = this._closeButton = L.DomUtil.create('a', prefix + '-close-button', container);
-			closeButton.href = '#close';
-			closeButton.innerHTML = '&#215;';
-
-			L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this);
-		}
-
-		var wrapper = this._wrapper = L.DomUtil.create('div', prefix + '-content-wrapper', container);
-		this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);
-
-		L.DomEvent
-			.disableClickPropagation(wrapper)
-			.disableScrollPropagation(this._contentNode)
-			.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);
-
-		this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);
-		this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);
-	},
-
-	_updateLayout: function () {
-		var container = this._contentNode,
-		    style = container.style;
-
-		style.width = '';
-		style.whiteSpace = 'nowrap';
-
-		var width = container.offsetWidth;
-		width = Math.min(width, this.options.maxWidth);
-		width = Math.max(width, this.options.minWidth);
-
-		style.width = (width + 1) + 'px';
-		style.whiteSpace = '';
-
-		style.height = '';
-
-		var height = container.offsetHeight,
-		    maxHeight = this.options.maxHeight,
-		    scrolledClass = 'leaflet-popup-scrolled';
-
-		if (maxHeight && height > maxHeight) {
-			style.height = maxHeight + 'px';
-			L.DomUtil.addClass(container, scrolledClass);
-		} else {
-			L.DomUtil.removeClass(container, scrolledClass);
-		}
-
-		this._containerWidth = this._container.offsetWidth;
-	},
-
-	_animateZoom: function (e) {
-		var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center),
-		    anchor = this._getAnchor();
-		L.DomUtil.setPosition(this._container, pos.add(anchor));
-	},
-
-	_adjustPan: function () {
-		if (!this.options.autoPan || (this._map._panAnim && this._map._panAnim._inProgress)) { return; }
-
-		var map = this._map,
-		    marginBottom = parseInt(L.DomUtil.getStyle(this._container, 'marginBottom'), 10) || 0,
-		    containerHeight = this._container.offsetHeight + marginBottom,
-		    containerWidth = this._containerWidth,
-		    layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom);
-
-		layerPos._add(L.DomUtil.getPosition(this._container));
-
-		var containerPos = map.layerPointToContainerPoint(layerPos),
-		    padding = L.point(this.options.autoPanPadding),
-		    paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding),
-		    paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding),
-		    size = map.getSize(),
-		    dx = 0,
-		    dy = 0;
-
-		if (containerPos.x + containerWidth + paddingBR.x > size.x) { // right
-			dx = containerPos.x + containerWidth - size.x + paddingBR.x;
-		}
-		if (containerPos.x - dx - paddingTL.x < 0) { // left
-			dx = containerPos.x - paddingTL.x;
-		}
-		if (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom
-			dy = containerPos.y + containerHeight - size.y + paddingBR.y;
-		}
-		if (containerPos.y - dy - paddingTL.y < 0) { // top
-			dy = containerPos.y - paddingTL.y;
-		}
-
-		// @namespace Map
-		// @section Popup events
-		// @event autopanstart: Event
-		// Fired when the map starts autopanning when opening a popup.
-		if (dx || dy) {
-			map
-			    .fire('autopanstart')
-			    .panBy([dx, dy]);
-		}
-	},
-
-	_onCloseButtonClick: function (e) {
-		this._close();
-		L.DomEvent.stop(e);
-	},
-
-	_getAnchor: function () {
-		// Where should we anchor the popup on the source layer?
-		return L.point(this._source && this._source._getPopupAnchor ? this._source._getPopupAnchor() : [0, 0]);
-	}
-
-});
-
-// @namespace Popup
-// @factory L.popup(options?: Popup options, source?: Layer)
-// Instantiates a `Popup` object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the popup with a reference to the Layer to which it refers.
-L.popup = function (options, source) {
-	return new L.Popup(options, source);
-};
-
-
-/* @namespace Map
- * @section Interaction Options
- * @option closePopupOnClick: Boolean = true
- * Set it to `false` if you don't want popups to close when user clicks the map.
- */
-L.Map.mergeOptions({
-	closePopupOnClick: true
-});
-
-
-// @namespace Map
-// @section Methods for Layers and Controls
-L.Map.include({
-	// @method openPopup(popup: Popup): this
-	// Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).
-	// @alternative
-	// @method openPopup(content: String|HTMLElement, latlng: LatLng, options?: Popup options): this
-	// Creates a popup with the specified content and options and opens it in the given point on a map.
-	openPopup: function (popup, latlng, options) {
-		if (!(popup instanceof L.Popup)) {
-			popup = new L.Popup(options).setContent(popup);
-		}
-
-		if (latlng) {
-			popup.setLatLng(latlng);
-		}
-
-		if (this.hasLayer(popup)) {
-			return this;
-		}
-
-		if (this._popup && this._popup.options.autoClose) {
-			this.closePopup();
-		}
-
-		this._popup = popup;
-		return this.addLayer(popup);
-	},
-
-	// @method closePopup(popup?: Popup): this
-	// Closes the popup previously opened with [openPopup](#map-openpopup) (or the given one).
-	closePopup: function (popup) {
-		if (!popup || popup === this._popup) {
-			popup = this._popup;
-			this._popup = null;
-		}
-		if (popup) {
-			this.removeLayer(popup);
-		}
-		return this;
-	}
-});
-
-/*
- * @namespace Layer
- * @section Popup methods example
- *
- * All layers share a set of methods convenient for binding popups to it.
- *
- * ```js
- * var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);
- * layer.openPopup();
- * layer.closePopup();
- * ```
- *
- * Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.
- */
-
-// @section Popup methods
-L.Layer.include({
-
-	// @method bindPopup(content: String|HTMLElement|Function|Popup, options?: Popup options): this
-	// Binds a popup to the layer with the passed `content` and sets up the
-	// neccessary event listeners. If a `Function` is passed it will receive
-	// the layer as the first argument and should return a `String` or `HTMLElement`.
-	bindPopup: function (content, options) {
-
-		if (content instanceof L.Popup) {
-			L.setOptions(content, options);
-			this._popup = content;
-			content._source = this;
-		} else {
-			if (!this._popup || options) {
-				this._popup = new L.Popup(options, this);
-			}
-			this._popup.setContent(content);
-		}
-
-		if (!this._popupHandlersAdded) {
-			this.on({
-				click: this._openPopup,
-				remove: this.closePopup,
-				move: this._movePopup
-			});
-			this._popupHandlersAdded = true;
-		}
-
-		return this;
-	},
-
-	// @method unbindPopup(): this
-	// Removes the popup previously bound with `bindPopup`.
-	unbindPopup: function () {
-		if (this._popup) {
-			this.off({
-				click: this._openPopup,
-				remove: this.closePopup,
-				move: this._movePopup
-			});
-			this._popupHandlersAdded = false;
-			this._popup = null;
-		}
-		return this;
-	},
-
-	// @method openPopup(latlng?: LatLng): this
-	// Opens the bound popup at the specificed `latlng` or at the default popup anchor if no `latlng` is passed.
-	openPopup: function (layer, latlng) {
-		if (!(layer instanceof L.Layer)) {
-			latlng = layer;
-			layer = this;
-		}
-
-		if (layer instanceof L.FeatureGroup) {
-			for (var id in this._layers) {
-				layer = this._layers[id];
-				break;
-			}
-		}
-
-		if (!latlng) {
-			latlng = layer.getCenter ? layer.getCenter() : layer.getLatLng();
-		}
-
-		if (this._popup && this._map) {
-			// set popup source to this layer
-			this._popup._source = layer;
-
-			// update the popup (content, layout, ect...)
-			this._popup.update();
-
-			// open the popup on the map
-			this._map.openPopup(this._popup, latlng);
-		}
-
-		return this;
-	},
-
-	// @method closePopup(): this
-	// Closes the popup bound to this layer if it is open.
-	closePopup: function () {
-		if (this._popup) {
-			this._popup._close();
-		}
-		return this;
-	},
-
-	// @method togglePopup(): this
-	// Opens or closes the popup bound to this layer depending on its current state.
-	togglePopup: function (target) {
-		if (this._popup) {
-			if (this._popup._map) {
-				this.closePopup();
-			} else {
-				this.openPopup(target);
-			}
-		}
-		return this;
-	},
-
-	// @method isPopupOpen(): boolean
-	// Returns `true` if the popup bound to this layer is currently open.
-	isPopupOpen: function () {
-		return (this._popup ? this._popup.isOpen() : false);
-	},
-
-	// @method setPopupContent(content: String|HTMLElement|Popup): this
-	// Sets the content of the popup bound to this layer.
-	setPopupContent: function (content) {
-		if (this._popup) {
-			this._popup.setContent(content);
-		}
-		return this;
-	},
-
-	// @method getPopup(): Popup
-	// Returns the popup bound to this layer.
-	getPopup: function () {
-		return this._popup;
-	},
-
-	_openPopup: function (e) {
-		var layer = e.layer || e.target;
-
-		if (!this._popup) {
-			return;
-		}
-
-		if (!this._map) {
-			return;
-		}
-
-		// prevent map click
-		L.DomEvent.stop(e);
-
-		// if this inherits from Path its a vector and we can just
-		// open the popup at the new location
-		if (layer instanceof L.Path) {
-			this.openPopup(e.layer || e.target, e.latlng);
-			return;
-		}
-
-		// otherwise treat it like a marker and figure out
-		// if we should toggle it open/closed
-		if (this._map.hasLayer(this._popup) && this._popup._source === layer) {
-			this.closePopup();
-		} else {
-			this.openPopup(layer, e.latlng);
-		}
-	},
-
-	_movePopup: function (e) {
-		this._popup.setLatLng(e.latlng);
-	}
-});
-
-
-
-/*
- * @class Tooltip
- * @inherits DivOverlay
- * @aka L.Tooltip
- * Used to display small texts on top of map layers.
- *
- * @example
- *
- * ```js
- * marker.bindTooltip("my tooltip text").openTooltip();
- * ```
- * Note about tooltip offset. Leaflet takes two options in consideration
- * for computing tooltip offseting:
- * - the `offset` Tooltip option: it defaults to [0, 0], and it's specific to one tooltip.
- *   Add a positive x offset to move the tooltip to the right, and a positive y offset to
- *   move it to the bottom. Negatives will move to the left and top.
- * - the `tooltipAnchor` Icon option: this will only be considered for Marker. You
- *   should adapt this value if you use a custom icon.
- */
-
-
-// @namespace Tooltip
-L.Tooltip = L.DivOverlay.extend({
-
-	// @section
-	// @aka Tooltip options
-	options: {
-		// @option pane: String = 'tooltipPane'
-		// `Map pane` where the tooltip will be added.
-		pane: 'tooltipPane',
-
-		// @option offset: Point = Point(0, 0)
-		// Optional offset of the tooltip position.
-		offset: [0, 0],
-
-		// @option direction: String = 'auto'
-		// Direction where to open the tooltip. Possible values are: `right`, `left`,
-		// `top`, `bottom`, `center`, `auto`.
-		// `auto` will dynamicaly switch between `right` and `left` according to the tooltip
-		// position on the map.
-		direction: 'auto',
-
-		// @option permanent: Boolean = false
-		// Whether to open the tooltip permanently or only on mouseover.
-		permanent: false,
-
-		// @option sticky: Boolean = false
-		// If true, the tooltip will follow the mouse instead of being fixed at the feature center.
-		sticky: false,
-
-		// @option interactive: Boolean = false
-		// If true, the tooltip will listen to the feature events.
-		interactive: false,
-
-		// @option opacity: Number = 0.9
-		// Tooltip container opacity.
-		opacity: 0.9
-	},
-
-	onAdd: function (map) {
-		L.DivOverlay.prototype.onAdd.call(this, map);
-		this.setOpacity(this.options.opacity);
-
-		// @namespace Map
-		// @section Tooltip events
-		// @event tooltipopen: TooltipEvent
-		// Fired when a tooltip is opened in the map.
-		map.fire('tooltipopen', {tooltip: this});
-
-		if (this._source) {
-			// @namespace Layer
-			// @section Tooltip events
-			// @event tooltipopen: TooltipEvent
-			// Fired when a tooltip bound to this layer is opened.
-			this._source.fire('tooltipopen', {tooltip: this}, true);
-		}
-	},
-
-	onRemove: function (map) {
-		L.DivOverlay.prototype.onRemove.call(this, map);
-
-		// @namespace Map
-		// @section Tooltip events
-		// @event tooltipclose: TooltipEvent
-		// Fired when a tooltip in the map is closed.
-		map.fire('tooltipclose', {tooltip: this});
-
-		if (this._source) {
-			// @namespace Layer
-			// @section Tooltip events
-			// @event tooltipclose: TooltipEvent
-			// Fired when a tooltip bound to this layer is closed.
-			this._source.fire('tooltipclose', {tooltip: this}, true);
-		}
-	},
-
-	getEvents: function () {
-		var events = L.DivOverlay.prototype.getEvents.call(this);
-
-		if (L.Browser.touch && !this.options.permanent) {
-			events.preclick = this._close;
-		}
-
-		return events;
-	},
-
-	_close: function () {
-		if (this._map) {
-			this._map.closeTooltip(this);
-		}
-	},
-
-	_initLayout: function () {
-		var prefix = 'leaflet-tooltip',
-		    className = prefix + ' ' + (this.options.className || '') + ' leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');
-
-		this._contentNode = this._container = L.DomUtil.create('div', className);
-	},
-
-	_updateLayout: function () {},
-
-	_adjustPan: function () {},
-
-	_setPosition: function (pos) {
-		var map = this._map,
-		    container = this._container,
-		    centerPoint = map.latLngToContainerPoint(map.getCenter()),
-		    tooltipPoint = map.layerPointToContainerPoint(pos),
-		    direction = this.options.direction,
-		    tooltipWidth = container.offsetWidth,
-		    tooltipHeight = container.offsetHeight,
-		    offset = L.point(this.options.offset),
-		    anchor = this._getAnchor();
-
-		if (direction === 'top') {
-			pos = pos.add(L.point(-tooltipWidth / 2 + offset.x, -tooltipHeight + offset.y + anchor.y, true));
-		} else if (direction === 'bottom') {
-			pos = pos.subtract(L.point(tooltipWidth / 2 - offset.x, -offset.y, true));
-		} else if (direction === 'center') {
-			pos = pos.subtract(L.point(tooltipWidth / 2 + offset.x, tooltipHeight / 2 - anchor.y + offset.y, true));
-		} else if (direction === 'right' || direction === 'auto' && tooltipPoint.x < centerPoint.x) {
-			direction = 'right';
-			pos = pos.add(L.point(offset.x + anchor.x, anchor.y - tooltipHeight / 2 + offset.y, true));
-		} else {
-			direction = 'left';
-			pos = pos.subtract(L.point(tooltipWidth + anchor.x - offset.x, tooltipHeight / 2 - anchor.y - offset.y, true));
-		}
-
-		L.DomUtil.removeClass(container, 'leaflet-tooltip-right');
-		L.DomUtil.removeClass(container, 'leaflet-tooltip-left');
-		L.DomUtil.removeClass(container, 'leaflet-tooltip-top');
-		L.DomUtil.removeClass(container, 'leaflet-tooltip-bottom');
-		L.DomUtil.addClass(container, 'leaflet-tooltip-' + direction);
-		L.DomUtil.setPosition(container, pos);
-	},
-
-	_updatePosition: function () {
-		var pos = this._map.latLngToLayerPoint(this._latlng);
-		this._setPosition(pos);
-	},
-
-	setOpacity: function (opacity) {
-		this.options.opacity = opacity;
-
-		if (this._container) {
-			L.DomUtil.setOpacity(this._container, opacity);
-		}
-	},
-
-	_animateZoom: function (e) {
-		var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center);
-		this._setPosition(pos);
-	},
-
-	_getAnchor: function () {
-		// Where should we anchor the tooltip on the source layer?
-		return L.point(this._source && this._source._getTooltipAnchor && !this.options.sticky ? this._source._getTooltipAnchor() : [0, 0]);
-	}
-
-});
-
-// @namespace Tooltip
-// @factory L.tooltip(options?: Tooltip options, source?: Layer)
-// Instantiates a Tooltip object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the tooltip with a reference to the Layer to which it refers.
-L.tooltip = function (options, source) {
-	return new L.Tooltip(options, source);
-};
-
-// @namespace Map
-// @section Methods for Layers and Controls
-L.Map.include({
-
-	// @method openTooltip(tooltip: Tooltip): this
-	// Opens the specified tooltip.
-	// @alternative
-	// @method openTooltip(content: String|HTMLElement, latlng: LatLng, options?: Tooltip options): this
-	// Creates a tooltip with the specified content and options and open it.
-	openTooltip: function (tooltip, latlng, options) {
-		if (!(tooltip instanceof L.Tooltip)) {
-			tooltip = new L.Tooltip(options).setContent(tooltip);
-		}
-
-		if (latlng) {
-			tooltip.setLatLng(latlng);
-		}
-
-		if (this.hasLayer(tooltip)) {
-			return this;
-		}
-
-		return this.addLayer(tooltip);
-	},
-
-	// @method closeTooltip(tooltip?: Tooltip): this
-	// Closes the tooltip given as parameter.
-	closeTooltip: function (tooltip) {
-		if (tooltip) {
-			this.removeLayer(tooltip);
-		}
-		return this;
-	}
-
-});
-
-/*
- * @namespace Layer
- * @section Tooltip methods example
- *
- * All layers share a set of methods convenient for binding tooltips to it.
- *
- * ```js
- * var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);
- * layer.openTooltip();
- * layer.closeTooltip();
- * ```
- */
-
-// @section Tooltip methods
-L.Layer.include({
-
-	// @method bindTooltip(content: String|HTMLElement|Function|Tooltip, options?: Tooltip options): this
-	// Binds a tooltip to the layer with the passed `content` and sets up the
-	// neccessary event listeners. If a `Function` is passed it will receive
-	// the layer as the first argument and should return a `String` or `HTMLElement`.
-	bindTooltip: function (content, options) {
-
-		if (content instanceof L.Tooltip) {
-			L.setOptions(content, options);
-			this._tooltip = content;
-			content._source = this;
-		} else {
-			if (!this._tooltip || options) {
-				this._tooltip = L.tooltip(options, this);
-			}
-			this._tooltip.setContent(content);
-
-		}
-
-		this._initTooltipInteractions();
-
-		if (this._tooltip.options.permanent && this._map && this._map.hasLayer(this)) {
-			this.openTooltip();
-		}
-
-		return this;
-	},
-
-	// @method unbindTooltip(): this
-	// Removes the tooltip previously bound with `bindTooltip`.
-	unbindTooltip: function () {
-		if (this._tooltip) {
-			this._initTooltipInteractions(true);
-			this.closeTooltip();
-			this._tooltip = null;
-		}
-		return this;
-	},
-
-	_initTooltipInteractions: function (remove) {
-		if (!remove && this._tooltipHandlersAdded) { return; }
-		var onOff = remove ? 'off' : 'on',
-		    events = {
-			remove: this.closeTooltip,
-			move: this._moveTooltip
-		    };
-		if (!this._tooltip.options.permanent) {
-			events.mouseover = this._openTooltip;
-			events.mouseout = this.closeTooltip;
-			if (this._tooltip.options.sticky) {
-				events.mousemove = this._moveTooltip;
-			}
-			if (L.Browser.touch) {
-				events.click = this._openTooltip;
-			}
-		} else {
-			events.add = this._openTooltip;
-		}
-		this[onOff](events);
-		this._tooltipHandlersAdded = !remove;
-	},
-
-	// @method openTooltip(latlng?: LatLng): this
-	// Opens the bound tooltip at the specificed `latlng` or at the default tooltip anchor if no `latlng` is passed.
-	openTooltip: function (layer, latlng) {
-		if (!(layer instanceof L.Layer)) {
-			latlng = layer;
-			layer = this;
-		}
-
-		if (layer instanceof L.FeatureGroup) {
-			for (var id in this._layers) {
-				layer = this._layers[id];
-				break;
-			}
-		}
-
-		if (!latlng) {
-			latlng = layer.getCenter ? layer.getCenter() : layer.getLatLng();
-		}
-
-		if (this._tooltip && this._map) {
-
-			// set tooltip source to this layer
-			this._tooltip._source = layer;
-
-			// update the tooltip (content, layout, ect...)
-			this._tooltip.update();
-
-			// open the tooltip on the map
-			this._map.openTooltip(this._tooltip, latlng);
-
-			// Tooltip container may not be defined if not permanent and never
-			// opened.
-			if (this._tooltip.options.interactive && this._tooltip._container) {
-				L.DomUtil.addClass(this._tooltip._container, 'leaflet-clickable');
-				this.addInteractiveTarget(this._tooltip._container);
-			}
-		}
-
-		return this;
-	},
-
-	// @method closeTooltip(): this
-	// Closes the tooltip bound to this layer if it is open.
-	closeTooltip: function () {
-		if (this._tooltip) {
-			this._tooltip._close();
-			if (this._tooltip.options.interactive && this._tooltip._container) {
-				L.DomUtil.removeClass(this._tooltip._container, 'leaflet-clickable');
-				this.removeInteractiveTarget(this._tooltip._container);
-			}
-		}
-		return this;
-	},
-
-	// @method toggleTooltip(): this
-	// Opens or closes the tooltip bound to this layer depending on its current state.
-	toggleTooltip: function (target) {
-		if (this._tooltip) {
-			if (this._tooltip._map) {
-				this.closeTooltip();
-			} else {
-				this.openTooltip(target);
-			}
-		}
-		return this;
-	},
-
-	// @method isTooltipOpen(): boolean
-	// Returns `true` if the tooltip bound to this layer is currently open.
-	isTooltipOpen: function () {
-		return this._tooltip.isOpen();
-	},
-
-	// @method setTooltipContent(content: String|HTMLElement|Tooltip): this
-	// Sets the content of the tooltip bound to this layer.
-	setTooltipContent: function (content) {
-		if (this._tooltip) {
-			this._tooltip.setContent(content);
-		}
-		return this;
-	},
-
-	// @method getTooltip(): Tooltip
-	// Returns the tooltip bound to this layer.
-	getTooltip: function () {
-		return this._tooltip;
-	},
-
-	_openTooltip: function (e) {
-		var layer = e.layer || e.target;
-
-		if (!this._tooltip || !this._map) {
-			return;
-		}
-		this.openTooltip(layer, this._tooltip.options.sticky ? e.latlng : undefined);
-	},
-
-	_moveTooltip: function (e) {
-		var latlng = e.latlng, containerPoint, layerPoint;
-		if (this._tooltip.options.sticky && e.originalEvent) {
-			containerPoint = this._map.mouseEventToContainerPoint(e.originalEvent);
-			layerPoint = this._map.containerPointToLayerPoint(containerPoint);
-			latlng = this._map.layerPointToLatLng(layerPoint);
-		}
-		this._tooltip.setLatLng(latlng);
-	}
-});
-
-
-
-/*
- * @class LayerGroup
- * @aka L.LayerGroup
- * @inherits Layer
- *
- * Used to group several layers and handle them as one. If you add it to the map,
- * any layers added or removed from the group will be added/removed on the map as
- * well. Extends `Layer`.
- *
- * @example
- *
- * ```js
- * L.layerGroup([marker1, marker2])
- * 	.addLayer(polyline)
- * 	.addTo(map);
- * ```
- */
-
-L.LayerGroup = L.Layer.extend({
-
-	initialize: function (layers) {
-		this._layers = {};
-
-		var i, len;
-
-		if (layers) {
-			for (i = 0, len = layers.length; i < len; i++) {
-				this.addLayer(layers[i]);
-			}
-		}
-	},
-
-	// @method addLayer(layer: Layer): this
-	// Adds the given layer to the group.
-	addLayer: function (layer) {
-		var id = this.getLayerId(layer);
-
-		this._layers[id] = layer;
-
-		if (this._map) {
-			this._map.addLayer(layer);
-		}
-
-		return this;
-	},
-
-	// @method removeLayer(layer: Layer): this
-	// Removes the given layer from the group.
-	// @alternative
-	// @method removeLayer(id: Number): this
-	// Removes the layer with the given internal ID from the group.
-	removeLayer: function (layer) {
-		var id = layer in this._layers ? layer : this.getLayerId(layer);
-
-		if (this._map && this._layers[id]) {
-			this._map.removeLayer(this._layers[id]);
-		}
-
-		delete this._layers[id];
-
-		return this;
-	},
-
-	// @method hasLayer(layer: Layer): Boolean
-	// Returns `true` if the given layer is currently added to the group.
-	hasLayer: function (layer) {
-		return !!layer && (layer in this._layers || this.getLayerId(layer) in this._layers);
-	},
-
-	// @method clearLayers(): this
-	// Removes all the layers from the group.
-	clearLayers: function () {
-		for (var i in this._layers) {
-			this.removeLayer(this._layers[i]);
-		}
-		return this;
-	},
-
-	// @method invoke(methodName: String, …): this
-	// Calls `methodName` on every layer contained in this group, passing any
-	// additional parameters. Has no effect if the layers contained do not
-	// implement `methodName`.
-	invoke: function (methodName) {
-		var args = Array.prototype.slice.call(arguments, 1),
-		    i, layer;
-
-		for (i in this._layers) {
-			layer = this._layers[i];
-
-			if (layer[methodName]) {
-				layer[methodName].apply(layer, args);
-			}
-		}
-
-		return this;
-	},
-
-	onAdd: function (map) {
-		for (var i in this._layers) {
-			map.addLayer(this._layers[i]);
-		}
-	},
-
-	onRemove: function (map) {
-		for (var i in this._layers) {
-			map.removeLayer(this._layers[i]);
-		}
-	},
-
-	// @method eachLayer(fn: Function, context?: Object): this
-	// Iterates over the layers of the group, optionally specifying context of the iterator function.
-	// ```js
-	// group.eachLayer(function (layer) {
-	// 	layer.bindPopup('Hello');
-	// });
-	// ```
-	eachLayer: function (method, context) {
-		for (var i in this._layers) {
-			method.call(context, this._layers[i]);
-		}
-		return this;
-	},
-
-	// @method getLayer(id: Number): Layer
-	// Returns the layer with the given internal ID.
-	getLayer: function (id) {
-		return this._layers[id];
-	},
-
-	// @method getLayers(): Layer[]
-	// Returns an array of all the layers added to the group.
-	getLayers: function () {
-		var layers = [];
-
-		for (var i in this._layers) {
-			layers.push(this._layers[i]);
-		}
-		return layers;
-	},
-
-	// @method setZIndex(zIndex: Number): this
-	// Calls `setZIndex` on every layer contained in this group, passing the z-index.
-	setZIndex: function (zIndex) {
-		return this.invoke('setZIndex', zIndex);
-	},
-
-	// @method getLayerId(layer: Layer): Number
-	// Returns the internal ID for a layer
-	getLayerId: function (layer) {
-		return L.stamp(layer);
-	}
-});
-
-
-// @factory L.layerGroup(layers: Layer[])
-// Create a layer group, optionally given an initial set of layers.
-L.layerGroup = function (layers) {
-	return new L.LayerGroup(layers);
-};
-
-
-
-/*
- * @class FeatureGroup
- * @aka L.FeatureGroup
- * @inherits LayerGroup
- *
- * Extended `LayerGroup` that makes it easier to do the same thing to all its member layers:
- *  * [`bindPopup`](#layer-bindpopup) binds a popup to all of the layers at once (likewise with [`bindTooltip`](#layer-bindtooltip))
- *  * Events are propagated to the `FeatureGroup`, so if the group has an event
- * handler, it will handle events from any of the layers. This includes mouse events
- * and custom events.
- *  * Has `layeradd` and `layerremove` events
- *
- * @example
- *
- * ```js
- * L.featureGroup([marker1, marker2, polyline])
- * 	.bindPopup('Hello world!')
- * 	.on('click', function() { alert('Clicked on a member of the group!'); })
- * 	.addTo(map);
- * ```
- */
-
-L.FeatureGroup = L.LayerGroup.extend({
-
-	addLayer: function (layer) {
-		if (this.hasLayer(layer)) {
-			return this;
-		}
-
-		layer.addEventParent(this);
-
-		L.LayerGroup.prototype.addLayer.call(this, layer);
-
-		// @event layeradd: LayerEvent
-		// Fired when a layer is added to this `FeatureGroup`
-		return this.fire('layeradd', {layer: layer});
-	},
-
-	removeLayer: function (layer) {
-		if (!this.hasLayer(layer)) {
-			return this;
-		}
-		if (layer in this._layers) {
-			layer = this._layers[layer];
-		}
-
-		layer.removeEventParent(this);
-
-		L.LayerGroup.prototype.removeLayer.call(this, layer);
-
-		// @event layerremove: LayerEvent
-		// Fired when a layer is removed from this `FeatureGroup`
-		return this.fire('layerremove', {layer: layer});
-	},
-
-	// @method setStyle(style: Path options): this
-	// Sets the given path options to each layer of the group that has a `setStyle` method.
-	setStyle: function (style) {
-		return this.invoke('setStyle', style);
-	},
-
-	// @method bringToFront(): this
-	// Brings the layer group to the top of all other layers
-	bringToFront: function () {
-		return this.invoke('bringToFront');
-	},
-
-	// @method bringToBack(): this
-	// Brings the layer group to the top of all other layers
-	bringToBack: function () {
-		return this.invoke('bringToBack');
-	},
-
-	// @method getBounds(): LatLngBounds
-	// Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).
-	getBounds: function () {
-		var bounds = new L.LatLngBounds();
-
-		for (var id in this._layers) {
-			var layer = this._layers[id];
-			bounds.extend(layer.getBounds ? layer.getBounds() : layer.getLatLng());
-		}
-		return bounds;
-	}
-});
-
-// @factory L.featureGroup(layers: Layer[])
-// Create a feature group, optionally given an initial set of layers.
-L.featureGroup = function (layers) {
-	return new L.FeatureGroup(layers);
-};
-
-
-
-/*
- * @class Renderer
- * @inherits Layer
- * @aka L.Renderer
- *
- * Base class for vector renderer implementations (`SVG`, `Canvas`). Handles the
- * DOM container of the renderer, its bounds, and its zoom animation.
- *
- * A `Renderer` works as an implicit layer group for all `Path`s - the renderer
- * itself can be added or removed to the map. All paths use a renderer, which can
- * be implicit (the map will decide the type of renderer and use it automatically)
- * or explicit (using the [`renderer`](#path-renderer) option of the path).
- *
- * Do not use this class directly, use `SVG` and `Canvas` instead.
- *
- * @event update: Event
- * Fired when the renderer updates its bounds, center and zoom, for example when
- * its map has moved
- */
-
-L.Renderer = L.Layer.extend({
-
-	// @section
-	// @aka Renderer options
-	options: {
-		// @option padding: Number = 0.1
-		// How much to extend the clip area around the map view (relative to its size)
-		// e.g. 0.1 would be 10% of map view in each direction
-		padding: 0.1
-	},
-
-	initialize: function (options) {
-		L.setOptions(this, options);
-		L.stamp(this);
-		this._layers = this._layers || {};
-	},
-
-	onAdd: function () {
-		if (!this._container) {
-			this._initContainer(); // defined by renderer implementations
-
-			if (this._zoomAnimated) {
-				L.DomUtil.addClass(this._container, 'leaflet-zoom-animated');
-			}
-		}
-
-		this.getPane().appendChild(this._container);
-		this._update();
-		this.on('update', this._updatePaths, this);
-	},
-
-	onRemove: function () {
-		L.DomUtil.remove(this._container);
-		this.off('update', this._updatePaths, this);
-	},
-
-	getEvents: function () {
-		var events = {
-			viewreset: this._reset,
-			zoom: this._onZoom,
-			moveend: this._update,
-			zoomend: this._onZoomEnd
-		};
-		if (this._zoomAnimated) {
-			events.zoomanim = this._onAnimZoom;
-		}
-		return events;
-	},
-
-	_onAnimZoom: function (ev) {
-		this._updateTransform(ev.center, ev.zoom);
-	},
-
-	_onZoom: function () {
-		this._updateTransform(this._map.getCenter(), this._map.getZoom());
-	},
-
-	_updateTransform: function (center, zoom) {
-		var scale = this._map.getZoomScale(zoom, this._zoom),
-		    position = L.DomUtil.getPosition(this._container),
-		    viewHalf = this._map.getSize().multiplyBy(0.5 + this.options.padding),
-		    currentCenterPoint = this._map.project(this._center, zoom),
-		    destCenterPoint = this._map.project(center, zoom),
-		    centerOffset = destCenterPoint.subtract(currentCenterPoint),
-
-		    topLeftOffset = viewHalf.multiplyBy(-scale).add(position).add(viewHalf).subtract(centerOffset);
-
-		if (L.Browser.any3d) {
-			L.DomUtil.setTransform(this._container, topLeftOffset, scale);
-		} else {
-			L.DomUtil.setPosition(this._container, topLeftOffset);
-		}
-	},
-
-	_reset: function () {
-		this._update();
-		this._updateTransform(this._center, this._zoom);
-
-		for (var id in this._layers) {
-			this._layers[id]._reset();
-		}
-	},
-
-	_onZoomEnd: function () {
-		for (var id in this._layers) {
-			this._layers[id]._project();
-		}
-	},
-
-	_updatePaths: function () {
-		for (var id in this._layers) {
-			this._layers[id]._update();
-		}
-	},
-
-	_update: function () {
-		// Update pixel bounds of renderer container (for positioning/sizing/clipping later)
-		// Subclasses are responsible of firing the 'update' event.
-		var p = this.options.padding,
-		    size = this._map.getSize(),
-		    min = this._map.containerPointToLayerPoint(size.multiplyBy(-p)).round();
-
-		this._bounds = new L.Bounds(min, min.add(size.multiplyBy(1 + p * 2)).round());
-
-		this._center = this._map.getCenter();
-		this._zoom = this._map.getZoom();
-	}
-});
-
-
-L.Map.include({
-	// @namespace Map; @method getRenderer(layer: Path): Renderer
-	// Returns the instance of `Renderer` that should be used to render the given
-	// `Path`. It will ensure that the `renderer` options of the map and paths
-	// are respected, and that the renderers do exist on the map.
-	getRenderer: function (layer) {
-		// @namespace Path; @option renderer: Renderer
-		// Use this specific instance of `Renderer` for this path. Takes
-		// precedence over the map's [default renderer](#map-renderer).
-		var renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer;
-
-		if (!renderer) {
-			// @namespace Map; @option preferCanvas: Boolean = false
-			// Whether `Path`s should be rendered on a `Canvas` renderer.
-			// By default, all `Path`s are rendered in a `SVG` renderer.
-			renderer = this._renderer = (this.options.preferCanvas && L.canvas()) || L.svg();
-		}
-
-		if (!this.hasLayer(renderer)) {
-			this.addLayer(renderer);
-		}
-		return renderer;
-	},
-
-	_getPaneRenderer: function (name) {
-		if (name === 'overlayPane' || name === undefined) {
-			return false;
-		}
-
-		var renderer = this._paneRenderers[name];
-		if (renderer === undefined) {
-			renderer = (L.SVG && L.svg({pane: name})) || (L.Canvas && L.canvas({pane: name}));
-			this._paneRenderers[name] = renderer;
-		}
-		return renderer;
-	}
-});
-
-
-
-/*
- * @class Path
- * @aka L.Path
- * @inherits Interactive layer
- *
- * An abstract class that contains options and constants shared between vector
- * overlays (Polygon, Polyline, Circle). Do not use it directly. Extends `Layer`.
- */
-
-L.Path = L.Layer.extend({
-
-	// @section
-	// @aka Path options
-	options: {
-		// @option stroke: Boolean = true
-		// Whether to draw stroke along the path. Set it to `false` to disable borders on polygons or circles.
-		stroke: true,
-
-		// @option color: String = '#3388ff'
-		// Stroke color
-		color: '#3388ff',
-
-		// @option weight: Number = 3
-		// Stroke width in pixels
-		weight: 3,
-
-		// @option opacity: Number = 1.0
-		// Stroke opacity
-		opacity: 1,
-
-		// @option lineCap: String= 'round'
-		// A string that defines [shape to be used at the end](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linecap) of the stroke.
-		lineCap: 'round',
-
-		// @option lineJoin: String = 'round'
-		// A string that defines [shape to be used at the corners](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linejoin) of the stroke.
-		lineJoin: 'round',
-
-		// @option dashArray: String = null
-		// A string that defines the stroke [dash pattern](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dasharray). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).
-		dashArray: null,
-
-		// @option dashOffset: String = null
-		// A string that defines the [distance into the dash pattern to start the dash](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dashoffset). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).
-		dashOffset: null,
-
-		// @option fill: Boolean = depends
-		// Whether to fill the path with color. Set it to `false` to disable filling on polygons or circles.
-		fill: false,
-
-		// @option fillColor: String = *
-		// Fill color. Defaults to the value of the [`color`](#path-color) option
-		fillColor: null,
-
-		// @option fillOpacity: Number = 0.2
-		// Fill opacity.
-		fillOpacity: 0.2,
-
-		// @option fillRule: String = 'evenodd'
-		// A string that defines [how the inside of a shape](https://developer.mozilla.org/docs/Web/SVG/Attribute/fill-rule) is determined.
-		fillRule: 'evenodd',
-
-		// className: '',
-
-		// Option inherited from "Interactive layer" abstract class
-		interactive: true
-	},
-
-	beforeAdd: function (map) {
-		// Renderer is set here because we need to call renderer.getEvents
-		// before this.getEvents.
-		this._renderer = map.getRenderer(this);
-	},
-
-	onAdd: function () {
-		this._renderer._initPath(this);
-		this._reset();
-		this._renderer._addPath(this);
-	},
-
-	onRemove: function () {
-		this._renderer._removePath(this);
-	},
-
-	// @method redraw(): this
-	// Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.
-	redraw: function () {
-		if (this._map) {
-			this._renderer._updatePath(this);
-		}
-		return this;
-	},
-
-	// @method setStyle(style: Path options): this
-	// Changes the appearance of a Path based on the options in the `Path options` object.
-	setStyle: function (style) {
-		L.setOptions(this, style);
-		if (this._renderer) {
-			this._renderer._updateStyle(this);
-		}
-		return this;
-	},
-
-	// @method bringToFront(): this
-	// Brings the layer to the top of all path layers.
-	bringToFront: function () {
-		if (this._renderer) {
-			this._renderer._bringToFront(this);
-		}
-		return this;
-	},
-
-	// @method bringToBack(): this
-	// Brings the layer to the bottom of all path layers.
-	bringToBack: function () {
-		if (this._renderer) {
-			this._renderer._bringToBack(this);
-		}
-		return this;
-	},
-
-	getElement: function () {
-		return this._path;
-	},
-
-	_reset: function () {
-		// defined in children classes
-		this._project();
-		this._update();
-	},
-
-	_clickTolerance: function () {
-		// used when doing hit detection for Canvas layers
-		return (this.options.stroke ? this.options.weight / 2 : 0) + (L.Browser.touch ? 10 : 0);
-	}
-});
-
-
-
-/*
- * @namespace LineUtil
- *
- * Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.
- */
-
-L.LineUtil = {
-
-	// Simplify polyline with vertex reduction and Douglas-Peucker simplification.
-	// Improves rendering performance dramatically by lessening the number of points to draw.
-
-	// @function simplify(points: Point[], tolerance: Number): Point[]
-	// Dramatically reduces the number of points in a polyline while retaining
-	// its shape and returns a new array of simplified points, using the
-	// [Douglas-Peucker algorithm](http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm).
-	// Used for a huge performance boost when processing/displaying Leaflet polylines for
-	// each zoom level and also reducing visual noise. tolerance affects the amount of
-	// simplification (lesser value means higher quality but slower and with more points).
-	// Also released as a separated micro-library [Simplify.js](http://mourner.github.com/simplify-js/).
-	simplify: function (points, tolerance) {
-		if (!tolerance || !points.length) {
-			return points.slice();
-		}
-
-		var sqTolerance = tolerance * tolerance;
-
-		// stage 1: vertex reduction
-		points = this._reducePoints(points, sqTolerance);
-
-		// stage 2: Douglas-Peucker simplification
-		points = this._simplifyDP(points, sqTolerance);
-
-		return points;
-	},
-
-	// @function pointToSegmentDistance(p: Point, p1: Point, p2: Point): Number
-	// Returns the distance between point `p` and segment `p1` to `p2`.
-	pointToSegmentDistance:  function (p, p1, p2) {
-		return Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true));
-	},
-
-	// @function closestPointOnSegment(p: Point, p1: Point, p2: Point): Number
-	// Returns the closest point from a point `p` on a segment `p1` to `p2`.
-	closestPointOnSegment: function (p, p1, p2) {
-		return this._sqClosestPointOnSegment(p, p1, p2);
-	},
-
-	// Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm
-	_simplifyDP: function (points, sqTolerance) {
-
-		var len = points.length,
-		    ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,
-		    markers = new ArrayConstructor(len);
-
-		markers[0] = markers[len - 1] = 1;
-
-		this._simplifyDPStep(points, markers, sqTolerance, 0, len - 1);
-
-		var i,
-		    newPoints = [];
-
-		for (i = 0; i < len; i++) {
-			if (markers[i]) {
-				newPoints.push(points[i]);
-			}
-		}
-
-		return newPoints;
-	},
-
-	_simplifyDPStep: function (points, markers, sqTolerance, first, last) {
-
-		var maxSqDist = 0,
-		    index, i, sqDist;
-
-		for (i = first + 1; i <= last - 1; i++) {
-			sqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true);
-
-			if (sqDist > maxSqDist) {
-				index = i;
-				maxSqDist = sqDist;
-			}
-		}
-
-		if (maxSqDist > sqTolerance) {
-			markers[index] = 1;
-
-			this._simplifyDPStep(points, markers, sqTolerance, first, index);
-			this._simplifyDPStep(points, markers, sqTolerance, index, last);
-		}
-	},
-
-	// reduce points that are too close to each other to a single point
-	_reducePoints: function (points, sqTolerance) {
-		var reducedPoints = [points[0]];
-
-		for (var i = 1, prev = 0, len = points.length; i < len; i++) {
-			if (this._sqDist(points[i], points[prev]) > sqTolerance) {
-				reducedPoints.push(points[i]);
-				prev = i;
-			}
-		}
-		if (prev < len - 1) {
-			reducedPoints.push(points[len - 1]);
-		}
-		return reducedPoints;
-	},
-
-
-	// @function clipSegment(a: Point, b: Point, bounds: Bounds, useLastCode?: Boolean, round?: Boolean): Point[]|Boolean
-	// Clips the segment a to b by rectangular bounds with the
-	// [Cohen-Sutherland algorithm](https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm)
-	// (modifying the segment points directly!). Used by Leaflet to only show polyline
-	// points that are on the screen or near, increasing performance.
-	clipSegment: function (a, b, bounds, useLastCode, round) {
-		var codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds),
-		    codeB = this._getBitCode(b, bounds),
-
-		    codeOut, p, newCode;
-
-		// save 2nd code to avoid calculating it on the next segment
-		this._lastCode = codeB;
-
-		while (true) {
-			// if a,b is inside the clip window (trivial accept)
-			if (!(codeA | codeB)) {
-				return [a, b];
-			}
-
-			// if a,b is outside the clip window (trivial reject)
-			if (codeA & codeB) {
-				return false;
-			}
-
-			// other cases
-			codeOut = codeA || codeB;
-			p = this._getEdgeIntersection(a, b, codeOut, bounds, round);
-			newCode = this._getBitCode(p, bounds);
-
-			if (codeOut === codeA) {
-				a = p;
-				codeA = newCode;
-			} else {
-				b = p;
-				codeB = newCode;
-			}
-		}
-	},
-
-	_getEdgeIntersection: function (a, b, code, bounds, round) {
-		var dx = b.x - a.x,
-		    dy = b.y - a.y,
-		    min = bounds.min,
-		    max = bounds.max,
-		    x, y;
-
-		if (code & 8) { // top
-			x = a.x + dx * (max.y - a.y) / dy;
-			y = max.y;
-
-		} else if (code & 4) { // bottom
-			x = a.x + dx * (min.y - a.y) / dy;
-			y = min.y;
-
-		} else if (code & 2) { // right
-			x = max.x;
-			y = a.y + dy * (max.x - a.x) / dx;
-
-		} else if (code & 1) { // left
-			x = min.x;
-			y = a.y + dy * (min.x - a.x) / dx;
-		}
-
-		return new L.Point(x, y, round);
-	},
-
-	_getBitCode: function (p, bounds) {
-		var code = 0;
-
-		if (p.x < bounds.min.x) { // left
-			code |= 1;
-		} else if (p.x > bounds.max.x) { // right
-			code |= 2;
-		}
-
-		if (p.y < bounds.min.y) { // bottom
-			code |= 4;
-		} else if (p.y > bounds.max.y) { // top
-			code |= 8;
-		}
-
-		return code;
-	},
-
-	// square distance (to avoid unnecessary Math.sqrt calls)
-	_sqDist: function (p1, p2) {
-		var dx = p2.x - p1.x,
-		    dy = p2.y - p1.y;
-		return dx * dx + dy * dy;
-	},
-
-	// return closest point on segment or distance to that point
-	_sqClosestPointOnSegment: function (p, p1, p2, sqDist) {
-		var x = p1.x,
-		    y = p1.y,
-		    dx = p2.x - x,
-		    dy = p2.y - y,
-		    dot = dx * dx + dy * dy,
-		    t;
-
-		if (dot > 0) {
-			t = ((p.x - x) * dx + (p.y - y) * dy) / dot;
-
-			if (t > 1) {
-				x = p2.x;
-				y = p2.y;
-			} else if (t > 0) {
-				x += dx * t;
-				y += dy * t;
-			}
-		}
-
-		dx = p.x - x;
-		dy = p.y - y;
-
-		return sqDist ? dx * dx + dy * dy : new L.Point(x, y);
-	}
-};
-
-
-
-/*
- * @class Polyline
- * @aka L.Polyline
- * @inherits Path
- *
- * A class for drawing polyline overlays on a map. Extends `Path`.
- *
- * @example
- *
- * ```js
- * // create a red polyline from an array of LatLng points
- * var latlngs = [
- * 	[45.51, -122.68],
- * 	[37.77, -122.43],
- * 	[34.04, -118.2]
- * ];
- *
- * var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
- *
- * // zoom the map to the polyline
- * map.fitBounds(polyline.getBounds());
- * ```
- *
- * You can also pass a multi-dimensional array to represent a `MultiPolyline` shape:
- *
- * ```js
- * // create a red polyline from an array of arrays of LatLng points
- * var latlngs = [
- * 	[[45.51, -122.68],
- * 	 [37.77, -122.43],
- * 	 [34.04, -118.2]],
- * 	[[40.78, -73.91],
- * 	 [41.83, -87.62],
- * 	 [32.76, -96.72]]
- * ];
- * ```
- */
-
-L.Polyline = L.Path.extend({
-
-	// @section
-	// @aka Polyline options
-	options: {
-		// @option smoothFactor: Number = 1.0
-		// How much to simplify the polyline on each zoom level. More means
-		// better performance and smoother look, and less means more accurate representation.
-		smoothFactor: 1.0,
-
-		// @option noClip: Boolean = false
-		// Disable polyline clipping.
-		noClip: false
-	},
-
-	initialize: function (latlngs, options) {
-		L.setOptions(this, options);
-		this._setLatLngs(latlngs);
-	},
-
-	// @method getLatLngs(): LatLng[]
-	// Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.
-	getLatLngs: function () {
-		return this._latlngs;
-	},
-
-	// @method setLatLngs(latlngs: LatLng[]): this
-	// Replaces all the points in the polyline with the given array of geographical points.
-	setLatLngs: function (latlngs) {
-		this._setLatLngs(latlngs);
-		return this.redraw();
-	},
-
-	// @method isEmpty(): Boolean
-	// Returns `true` if the Polyline has no LatLngs.
-	isEmpty: function () {
-		return !this._latlngs.length;
-	},
-
-	closestLayerPoint: function (p) {
-		var minDistance = Infinity,
-		    minPoint = null,
-		    closest = L.LineUtil._sqClosestPointOnSegment,
-		    p1, p2;
-
-		for (var j = 0, jLen = this._parts.length; j < jLen; j++) {
-			var points = this._parts[j];
-
-			for (var i = 1, len = points.length; i < len; i++) {
-				p1 = points[i - 1];
-				p2 = points[i];
-
-				var sqDist = closest(p, p1, p2, true);
-
-				if (sqDist < minDistance) {
-					minDistance = sqDist;
-					minPoint = closest(p, p1, p2);
-				}
-			}
-		}
-		if (minPoint) {
-			minPoint.distance = Math.sqrt(minDistance);
-		}
-		return minPoint;
-	},
-
-	// @method getCenter(): LatLng
-	// Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the polyline.
-	getCenter: function () {
-		// throws error when not yet added to map as this center calculation requires projected coordinates
-		if (!this._map) {
-			throw new Error('Must add layer to map before using getCenter()');
-		}
-
-		var i, halfDist, segDist, dist, p1, p2, ratio,
-		    points = this._rings[0],
-		    len = points.length;
-
-		if (!len) { return null; }
-
-		// polyline centroid algorithm; only uses the first ring if there are multiple
-
-		for (i = 0, halfDist = 0; i < len - 1; i++) {
-			halfDist += points[i].distanceTo(points[i + 1]) / 2;
-		}
-
-		// The line is so small in the current view that all points are on the same pixel.
-		if (halfDist === 0) {
-			return this._map.layerPointToLatLng(points[0]);
-		}
-
-		for (i = 0, dist = 0; i < len - 1; i++) {
-			p1 = points[i];
-			p2 = points[i + 1];
-			segDist = p1.distanceTo(p2);
-			dist += segDist;
-
-			if (dist > halfDist) {
-				ratio = (dist - halfDist) / segDist;
-				return this._map.layerPointToLatLng([
-					p2.x - ratio * (p2.x - p1.x),
-					p2.y - ratio * (p2.y - p1.y)
-				]);
-			}
-		}
-	},
-
-	// @method getBounds(): LatLngBounds
-	// Returns the `LatLngBounds` of the path.
-	getBounds: function () {
-		return this._bounds;
-	},
-
-	// @method addLatLng(latlng: LatLng, latlngs? LatLng[]): this
-	// Adds a given point to the polyline. By default, adds to the first ring of
-	// the polyline in case of a multi-polyline, but can be overridden by passing
-	// a specific ring as a LatLng array (that you can earlier access with [`getLatLngs`](#polyline-getlatlngs)).
-	addLatLng: function (latlng, latlngs) {
-		latlngs = latlngs || this._defaultShape();
-		latlng = L.latLng(latlng);
-		latlngs.push(latlng);
-		this._bounds.extend(latlng);
-		return this.redraw();
-	},
-
-	_setLatLngs: function (latlngs) {
-		this._bounds = new L.LatLngBounds();
-		this._latlngs = this._convertLatLngs(latlngs);
-	},
-
-	_defaultShape: function () {
-		return L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0];
-	},
-
-	// recursively convert latlngs input into actual LatLng instances; calculate bounds along the way
-	_convertLatLngs: function (latlngs) {
-		var result = [],
-		    flat = L.Polyline._flat(latlngs);
-
-		for (var i = 0, len = latlngs.length; i < len; i++) {
-			if (flat) {
-				result[i] = L.latLng(latlngs[i]);
-				this._bounds.extend(result[i]);
-			} else {
-				result[i] = this._convertLatLngs(latlngs[i]);
-			}
-		}
-
-		return result;
-	},
-
-	_project: function () {
-		var pxBounds = new L.Bounds();
-		this._rings = [];
-		this._projectLatlngs(this._latlngs, this._rings, pxBounds);
-
-		var w = this._clickTolerance(),
-		    p = new L.Point(w, w);
-
-		if (this._bounds.isValid() && pxBounds.isValid()) {
-			pxBounds.min._subtract(p);
-			pxBounds.max._add(p);
-			this._pxBounds = pxBounds;
-		}
-	},
-
-	// recursively turns latlngs into a set of rings with projected coordinates
-	_projectLatlngs: function (latlngs, result, projectedBounds) {
-		var flat = latlngs[0] instanceof L.LatLng,
-		    len = latlngs.length,
-		    i, ring;
-
-		if (flat) {
-			ring = [];
-			for (i = 0; i < len; i++) {
-				ring[i] = this._map.latLngToLayerPoint(latlngs[i]);
-				projectedBounds.extend(ring[i]);
-			}
-			result.push(ring);
-		} else {
-			for (i = 0; i < len; i++) {
-				this._projectLatlngs(latlngs[i], result, projectedBounds);
-			}
-		}
-	},
-
-	// clip polyline by renderer bounds so that we have less to render for performance
-	_clipPoints: function () {
-		var bounds = this._renderer._bounds;
-
-		this._parts = [];
-		if (!this._pxBounds || !this._pxBounds.intersects(bounds)) {
-			return;
-		}
-
-		if (this.options.noClip) {
-			this._parts = this._rings;
-			return;
-		}
-
-		var parts = this._parts,
-		    i, j, k, len, len2, segment, points;
-
-		for (i = 0, k = 0, len = this._rings.length; i < len; i++) {
-			points = this._rings[i];
-
-			for (j = 0, len2 = points.length; j < len2 - 1; j++) {
-				segment = L.LineUtil.clipSegment(points[j], points[j + 1], bounds, j, true);
-
-				if (!segment) { continue; }
-
-				parts[k] = parts[k] || [];
-				parts[k].push(segment[0]);
-
-				// if segment goes out of screen, or it's the last one, it's the end of the line part
-				if ((segment[1] !== points[j + 1]) || (j === len2 - 2)) {
-					parts[k].push(segment[1]);
-					k++;
-				}
-			}
-		}
-	},
-
-	// simplify each clipped part of the polyline for performance
-	_simplifyPoints: function () {
-		var parts = this._parts,
-		    tolerance = this.options.smoothFactor;
-
-		for (var i = 0, len = parts.length; i < len; i++) {
-			parts[i] = L.LineUtil.simplify(parts[i], tolerance);
-		}
-	},
-
-	_update: function () {
-		if (!this._map) { return; }
-
-		this._clipPoints();
-		this._simplifyPoints();
-		this._updatePath();
-	},
-
-	_updatePath: function () {
-		this._renderer._updatePoly(this);
-	}
-});
-
-// @factory L.polyline(latlngs: LatLng[], options?: Polyline options)
-// Instantiates a polyline object given an array of geographical points and
-// optionally an options object. You can create a `Polyline` object with
-// multiple separate lines (`MultiPolyline`) by passing an array of arrays
-// of geographic points.
-L.polyline = function (latlngs, options) {
-	return new L.Polyline(latlngs, options);
-};
-
-L.Polyline._flat = function (latlngs) {
-	// true if it's a flat array of latlngs; false if nested
-	return !L.Util.isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined');
-};
-
-
-
-/*
- * @namespace PolyUtil
- * Various utility functions for polygon geometries.
- */
-
-L.PolyUtil = {};
-
-/* @function clipPolygon(points: Point[], bounds: Bounds, round?: Boolean): Point[]
- * Clips the polygon geometry defined by the given `points` by the given bounds (using the [Sutherland-Hodgeman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm)).
- * Used by Leaflet to only show polygon points that are on the screen or near, increasing
- * performance. Note that polygon points needs different algorithm for clipping
- * than polyline, so there's a seperate method for it.
- */
-L.PolyUtil.clipPolygon = function (points, bounds, round) {
-	var clippedPoints,
-	    edges = [1, 4, 2, 8],
-	    i, j, k,
-	    a, b,
-	    len, edge, p,
-	    lu = L.LineUtil;
-
-	for (i = 0, len = points.length; i < len; i++) {
-		points[i]._code = lu._getBitCode(points[i], bounds);
-	}
-
-	// for each edge (left, bottom, right, top)
-	for (k = 0; k < 4; k++) {
-		edge = edges[k];
-		clippedPoints = [];
-
-		for (i = 0, len = points.length, j = len - 1; i < len; j = i++) {
-			a = points[i];
-			b = points[j];
-
-			// if a is inside the clip window
-			if (!(a._code & edge)) {
-				// if b is outside the clip window (a->b goes out of screen)
-				if (b._code & edge) {
-					p = lu._getEdgeIntersection(b, a, edge, bounds, round);
-					p._code = lu._getBitCode(p, bounds);
-					clippedPoints.push(p);
-				}
-				clippedPoints.push(a);
-
-			// else if b is inside the clip window (a->b enters the screen)
-			} else if (!(b._code & edge)) {
-				p = lu._getEdgeIntersection(b, a, edge, bounds, round);
-				p._code = lu._getBitCode(p, bounds);
-				clippedPoints.push(p);
-			}
-		}
-		points = clippedPoints;
-	}
-
-	return points;
-};
-
-
-
-/*
- * @class Polygon
- * @aka L.Polygon
- * @inherits Polyline
- *
- * A class for drawing polygon overlays on a map. Extends `Polyline`.
- *
- * Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.
- *
- *
- * @example
- *
- * ```js
- * // create a red polygon from an array of LatLng points
- * var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];
- *
- * var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
- *
- * // zoom the map to the polygon
- * map.fitBounds(polygon.getBounds());
- * ```
- *
- * You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:
- *
- * ```js
- * var latlngs = [
- *   [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
- *   [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
- * ];
- * ```
- *
- * Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.
- *
- * ```js
- * var latlngs = [
- *   [ // first polygon
- *     [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
- *     [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
- *   ],
- *   [ // second polygon
- *     [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]
- *   ]
- * ];
- * ```
- */
-
-L.Polygon = L.Polyline.extend({
-
-	options: {
-		fill: true
-	},
-
-	isEmpty: function () {
-		return !this._latlngs.length || !this._latlngs[0].length;
-	},
-
-	getCenter: function () {
-		// throws error when not yet added to map as this center calculation requires projected coordinates
-		if (!this._map) {
-			throw new Error('Must add layer to map before using getCenter()');
-		}
-
-		var i, j, p1, p2, f, area, x, y, center,
-		    points = this._rings[0],
-		    len = points.length;
-
-		if (!len) { return null; }
-
-		// polygon centroid algorithm; only uses the first ring if there are multiple
-
-		area = x = y = 0;
-
-		for (i = 0, j = len - 1; i < len; j = i++) {
-			p1 = points[i];
-			p2 = points[j];
-
-			f = p1.y * p2.x - p2.y * p1.x;
-			x += (p1.x + p2.x) * f;
-			y += (p1.y + p2.y) * f;
-			area += f * 3;
-		}
-
-		if (area === 0) {
-			// Polygon is so small that all points are on same pixel.
-			center = points[0];
-		} else {
-			center = [x / area, y / area];
-		}
-		return this._map.layerPointToLatLng(center);
-	},
-
-	_convertLatLngs: function (latlngs) {
-		var result = L.Polyline.prototype._convertLatLngs.call(this, latlngs),
-		    len = result.length;
-
-		// remove last point if it equals first one
-		if (len >= 2 && result[0] instanceof L.LatLng && result[0].equals(result[len - 1])) {
-			result.pop();
-		}
-		return result;
-	},
-
-	_setLatLngs: function (latlngs) {
-		L.Polyline.prototype._setLatLngs.call(this, latlngs);
-		if (L.Polyline._flat(this._latlngs)) {
-			this._latlngs = [this._latlngs];
-		}
-	},
-
-	_defaultShape: function () {
-		return L.Polyline._flat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0];
-	},
-
-	_clipPoints: function () {
-		// polygons need a different clipping algorithm so we redefine that
-
-		var bounds = this._renderer._bounds,
-		    w = this.options.weight,
-		    p = new L.Point(w, w);
-
-		// increase clip padding by stroke width to avoid stroke on clip edges
-		bounds = new L.Bounds(bounds.min.subtract(p), bounds.max.add(p));
-
-		this._parts = [];
-		if (!this._pxBounds || !this._pxBounds.intersects(bounds)) {
-			return;
-		}
-
-		if (this.options.noClip) {
-			this._parts = this._rings;
-			return;
-		}
-
-		for (var i = 0, len = this._rings.length, clipped; i < len; i++) {
-			clipped = L.PolyUtil.clipPolygon(this._rings[i], bounds, true);
-			if (clipped.length) {
-				this._parts.push(clipped);
-			}
-		}
-	},
-
-	_updatePath: function () {
-		this._renderer._updatePoly(this, true);
-	}
-});
-
-
-// @factory L.polygon(latlngs: LatLng[], options?: Polyline options)
-L.polygon = function (latlngs, options) {
-	return new L.Polygon(latlngs, options);
-};
-
-
-
-/*
- * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.
- */
-
-/*
- * @class Rectangle
- * @aka L.Retangle
- * @inherits Polygon
- *
- * A class for drawing rectangle overlays on a map. Extends `Polygon`.
- *
- * @example
- *
- * ```js
- * // define rectangle geographical bounds
- * var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
- *
- * // create an orange rectangle
- * L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);
- *
- * // zoom the map to the rectangle bounds
- * map.fitBounds(bounds);
- * ```
- *
- */
-
-
-L.Rectangle = L.Polygon.extend({
-	initialize: function (latLngBounds, options) {
-		L.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);
-	},
-
-	// @method setBounds(latLngBounds: LatLngBounds): this
-	// Redraws the rectangle with the passed bounds.
-	setBounds: function (latLngBounds) {
-		return this.setLatLngs(this._boundsToLatLngs(latLngBounds));
-	},
-
-	_boundsToLatLngs: function (latLngBounds) {
-		latLngBounds = L.latLngBounds(latLngBounds);
-		return [
-			latLngBounds.getSouthWest(),
-			latLngBounds.getNorthWest(),
-			latLngBounds.getNorthEast(),
-			latLngBounds.getSouthEast()
-		];
-	}
-});
-
-
-// @factory L.rectangle(latLngBounds: LatLngBounds, options?: Polyline options)
-L.rectangle = function (latLngBounds, options) {
-	return new L.Rectangle(latLngBounds, options);
-};
-
-
-
-/*
- * @class CircleMarker
- * @aka L.CircleMarker
- * @inherits Path
- *
- * A circle of a fixed size with radius specified in pixels. Extends `Path`.
- */
-
-L.CircleMarker = L.Path.extend({
-
-	// @section
-	// @aka CircleMarker options
-	options: {
-		fill: true,
-
-		// @option radius: Number = 10
-		// Radius of the circle marker, in pixels
-		radius: 10
-	},
-
-	initialize: function (latlng, options) {
-		L.setOptions(this, options);
-		this._latlng = L.latLng(latlng);
-		this._radius = this.options.radius;
-	},
-
-	// @method setLatLng(latLng: LatLng): this
-	// Sets the position of a circle marker to a new location.
-	setLatLng: function (latlng) {
-		this._latlng = L.latLng(latlng);
-		this.redraw();
-		return this.fire('move', {latlng: this._latlng});
-	},
-
-	// @method getLatLng(): LatLng
-	// Returns the current geographical position of the circle marker
-	getLatLng: function () {
-		return this._latlng;
-	},
-
-	// @method setRadius(radius: Number): this
-	// Sets the radius of a circle marker. Units are in pixels.
-	setRadius: function (radius) {
-		this.options.radius = this._radius = radius;
-		return this.redraw();
-	},
-
-	// @method getRadius(): Number
-	// Returns the current radius of the circle
-	getRadius: function () {
-		return this._radius;
-	},
-
-	setStyle : function (options) {
-		var radius = options && options.radius || this._radius;
-		L.Path.prototype.setStyle.call(this, options);
-		this.setRadius(radius);
-		return this;
-	},
-
-	_project: function () {
-		this._point = this._map.latLngToLayerPoint(this._latlng);
-		this._updateBounds();
-	},
-
-	_updateBounds: function () {
-		var r = this._radius,
-		    r2 = this._radiusY || r,
-		    w = this._clickTolerance(),
-		    p = [r + w, r2 + w];
-		this._pxBounds = new L.Bounds(this._point.subtract(p), this._point.add(p));
-	},
-
-	_update: function () {
-		if (this._map) {
-			this._updatePath();
-		}
-	},
-
-	_updatePath: function () {
-		this._renderer._updateCircle(this);
-	},
-
-	_empty: function () {
-		return this._radius && !this._renderer._bounds.intersects(this._pxBounds);
-	}
-});
-
-
-// @factory L.circleMarker(latlng: LatLng, options?: CircleMarker options)
-// Instantiates a circle marker object given a geographical point, and an optional options object.
-L.circleMarker = function (latlng, options) {
-	return new L.CircleMarker(latlng, options);
-};
-
-
-
-/*
- * @class Circle
- * @aka L.Circle
- * @inherits CircleMarker
- *
- * A class for drawing circle overlays on a map. Extends `CircleMarker`.
- *
- * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).
- *
- * @example
- *
- * ```js
- * L.circle([50.5, 30.5], {radius: 200}).addTo(map);
- * ```
- */
-
-L.Circle = L.CircleMarker.extend({
-
-	initialize: function (latlng, options, legacyOptions) {
-		if (typeof options === 'number') {
-			// Backwards compatibility with 0.7.x factory (latlng, radius, options?)
-			options = L.extend({}, legacyOptions, {radius: options});
-		}
-		L.setOptions(this, options);
-		this._latlng = L.latLng(latlng);
-
-		if (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); }
-
-		// @section
-		// @aka Circle options
-		// @option radius: Number; Radius of the circle, in meters.
-		this._mRadius = this.options.radius;
-	},
-
-	// @method setRadius(radius: Number): this
-	// Sets the radius of a circle. Units are in meters.
-	setRadius: function (radius) {
-		this._mRadius = radius;
-		return this.redraw();
-	},
-
-	// @method getRadius(): Number
-	// Returns the current radius of a circle. Units are in meters.
-	getRadius: function () {
-		return this._mRadius;
-	},
-
-	// @method getBounds(): LatLngBounds
-	// Returns the `LatLngBounds` of the path.
-	getBounds: function () {
-		var half = [this._radius, this._radiusY || this._radius];
-
-		return new L.LatLngBounds(
-			this._map.layerPointToLatLng(this._point.subtract(half)),
-			this._map.layerPointToLatLng(this._point.add(half)));
-	},
-
-	setStyle: L.Path.prototype.setStyle,
-
-	_project: function () {
-
-		var lng = this._latlng.lng,
-		    lat = this._latlng.lat,
-		    map = this._map,
-		    crs = map.options.crs;
-
-		if (crs.distance === L.CRS.Earth.distance) {
-			var d = Math.PI / 180,
-			    latR = (this._mRadius / L.CRS.Earth.R) / d,
-			    top = map.project([lat + latR, lng]),
-			    bottom = map.project([lat - latR, lng]),
-			    p = top.add(bottom).divideBy(2),
-			    lat2 = map.unproject(p).lat,
-			    lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) /
-			            (Math.cos(lat * d) * Math.cos(lat2 * d))) / d;
-
-			if (isNaN(lngR) || lngR === 0) {
-				lngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425
-			}
-
-			this._point = p.subtract(map.getPixelOrigin());
-			this._radius = isNaN(lngR) ? 0 : Math.max(Math.round(p.x - map.project([lat2, lng - lngR]).x), 1);
-			this._radiusY = Math.max(Math.round(p.y - top.y), 1);
-
-		} else {
-			var latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0]));
-
-			this._point = map.latLngToLayerPoint(this._latlng);
-			this._radius = this._point.x - map.latLngToLayerPoint(latlng2).x;
-		}
-
-		this._updateBounds();
-	}
-});
-
-// @factory L.circle(latlng: LatLng, options?: Circle options)
-// Instantiates a circle object given a geographical point, and an options object
-// which contains the circle radius.
-// @alternative
-// @factory L.circle(latlng: LatLng, radius: Number, options?: Circle options)
-// Obsolete way of instantiating a circle, for compatibility with 0.7.x code.
-// Do not use in new applications or plugins.
-L.circle = function (latlng, options, legacyOptions) {
-	return new L.Circle(latlng, options, legacyOptions);
-};
-
-
-
-/*
- * @class SVG
- * @inherits Renderer
- * @aka L.SVG
- *
- * Allows vector layers to be displayed with [SVG](https://developer.mozilla.org/docs/Web/SVG).
- * Inherits `Renderer`.
- *
- * Due to [technical limitations](http://caniuse.com/#search=svg), SVG is not
- * available in all web browsers, notably Android 2.x and 3.x.
- *
- * Although SVG is not available on IE7 and IE8, these browsers support
- * [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language)
- * (a now deprecated technology), and the SVG renderer will fall back to VML in
- * this case.
- *
- * @example
- *
- * Use SVG by default for all paths in the map:
- *
- * ```js
- * var map = L.map('map', {
- * 	renderer: L.svg()
- * });
- * ```
- *
- * Use a SVG renderer with extra padding for specific vector geometries:
- *
- * ```js
- * var map = L.map('map');
- * var myRenderer = L.svg({ padding: 0.5 });
- * var line = L.polyline( coordinates, { renderer: myRenderer } );
- * var circle = L.circle( center, { renderer: myRenderer } );
- * ```
- */
-
-L.SVG = L.Renderer.extend({
-
-	getEvents: function () {
-		var events = L.Renderer.prototype.getEvents.call(this);
-		events.zoomstart = this._onZoomStart;
-		return events;
-	},
-
-	_initContainer: function () {
-		this._container = L.SVG.create('svg');
-
-		// makes it possible to click through svg root; we'll reset it back in individual paths
-		this._container.setAttribute('pointer-events', 'none');
-
-		this._rootGroup = L.SVG.create('g');
-		this._container.appendChild(this._rootGroup);
-	},
-
-	_onZoomStart: function () {
-		// Drag-then-pinch interactions might mess up the center and zoom.
-		// In this case, the easiest way to prevent this is re-do the renderer
-		//   bounds and padding when the zooming starts.
-		this._update();
-	},
-
-	_update: function () {
-		if (this._map._animatingZoom && this._bounds) { return; }
-
-		L.Renderer.prototype._update.call(this);
-
-		var b = this._bounds,
-		    size = b.getSize(),
-		    container = this._container;
-
-		// set size of svg-container if changed
-		if (!this._svgSize || !this._svgSize.equals(size)) {
-			this._svgSize = size;
-			container.setAttribute('width', size.x);
-			container.setAttribute('height', size.y);
-		}
-
-		// movement: update container viewBox so that we don't have to change coordinates of individual layers
-		L.DomUtil.setPosition(container, b.min);
-		container.setAttribute('viewBox', [b.min.x, b.min.y, size.x, size.y].join(' '));
-
-		this.fire('update');
-	},
-
-	// methods below are called by vector layers implementations
-
-	_initPath: function (layer) {
-		var path = layer._path = L.SVG.create('path');
-
-		// @namespace Path
-		// @option className: String = null
-		// Custom class name set on an element. Only for SVG renderer.
-		if (layer.options.className) {
-			L.DomUtil.addClass(path, layer.options.className);
-		}
-
-		if (layer.options.interactive) {
-			L.DomUtil.addClass(path, 'leaflet-interactive');
-		}
-
-		this._updateStyle(layer);
-		this._layers[L.stamp(layer)] = layer;
-	},
-
-	_addPath: function (layer) {
-		this._rootGroup.appendChild(layer._path);
-		layer.addInteractiveTarget(layer._path);
-	},
-
-	_removePath: function (layer) {
-		L.DomUtil.remove(layer._path);
-		layer.removeInteractiveTarget(layer._path);
-		delete this._layers[L.stamp(layer)];
-	},
-
-	_updatePath: function (layer) {
-		layer._project();
-		layer._update();
-	},
-
-	_updateStyle: function (layer) {
-		var path = layer._path,
-		    options = layer.options;
-
-		if (!path) { return; }
-
-		if (options.stroke) {
-			path.setAttribute('stroke', options.color);
-			path.setAttribute('stroke-opacity', options.opacity);
-			path.setAttribute('stroke-width', options.weight);
-			path.setAttribute('stroke-linecap', options.lineCap);
-			path.setAttribute('stroke-linejoin', options.lineJoin);
-
-			if (options.dashArray) {
-				path.setAttribute('stroke-dasharray', options.dashArray);
-			} else {
-				path.removeAttribute('stroke-dasharray');
-			}
-
-			if (options.dashOffset) {
-				path.setAttribute('stroke-dashoffset', options.dashOffset);
-			} else {
-				path.removeAttribute('stroke-dashoffset');
-			}
-		} else {
-			path.setAttribute('stroke', 'none');
-		}
-
-		if (options.fill) {
-			path.setAttribute('fill', options.fillColor || options.color);
-			path.setAttribute('fill-opacity', options.fillOpacity);
-			path.setAttribute('fill-rule', options.fillRule || 'evenodd');
-		} else {
-			path.setAttribute('fill', 'none');
-		}
-	},
-
-	_updatePoly: function (layer, closed) {
-		this._setPath(layer, L.SVG.pointsToPath(layer._parts, closed));
-	},
-
-	_updateCircle: function (layer) {
-		var p = layer._point,
-		    r = layer._radius,
-		    r2 = layer._radiusY || r,
-		    arc = 'a' + r + ',' + r2 + ' 0 1,0 ';
-
-		// drawing a circle with two half-arcs
-		var d = layer._empty() ? 'M0 0' :
-				'M' + (p.x - r) + ',' + p.y +
-				arc + (r * 2) + ',0 ' +
-				arc + (-r * 2) + ',0 ';
-
-		this._setPath(layer, d);
-	},
-
-	_setPath: function (layer, path) {
-		layer._path.setAttribute('d', path);
-	},
-
-	// SVG does not have the concept of zIndex so we resort to changing the DOM order of elements
-	_bringToFront: function (layer) {
-		L.DomUtil.toFront(layer._path);
-	},
-
-	_bringToBack: function (layer) {
-		L.DomUtil.toBack(layer._path);
-	}
-});
-
-
-// @namespace SVG; @section
-// There are several static functions which can be called without instantiating L.SVG:
-L.extend(L.SVG, {
-	// @function create(name: String): SVGElement
-	// Returns a instance of [SVGElement](https://developer.mozilla.org/docs/Web/API/SVGElement),
-	// corresponding to the class name passed. For example, using 'line' will return
-	// an instance of [SVGLineElement](https://developer.mozilla.org/docs/Web/API/SVGLineElement).
-	create: function (name) {
-		return document.createElementNS('http://www.w3.org/2000/svg', name);
-	},
-
-	// @function pointsToPath(rings: Point[], closed: Boolean): String
-	// Generates a SVG path string for multiple rings, with each ring turning
-	// into "M..L..L.." instructions
-	pointsToPath: function (rings, closed) {
-		var str = '',
-		    i, j, len, len2, points, p;
-
-		for (i = 0, len = rings.length; i < len; i++) {
-			points = rings[i];
-
-			for (j = 0, len2 = points.length; j < len2; j++) {
-				p = points[j];
-				str += (j ? 'L' : 'M') + p.x + ' ' + p.y;
-			}
-
-			// closes the ring for polygons; "x" is VML syntax
-			str += closed ? (L.Browser.svg ? 'z' : 'x') : '';
-		}
-
-		// SVG complains about empty path strings
-		return str || 'M0 0';
-	}
-});
-
-// @namespace Browser; @property svg: Boolean
-// `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG).
-L.Browser.svg = !!(document.createElementNS && L.SVG.create('svg').createSVGRect);
-
-
-// @namespace SVG
-// @factory L.svg(options?: Renderer options)
-// Creates a SVG renderer with the given options.
-L.svg = function (options) {
-	return L.Browser.svg || L.Browser.vml ? new L.SVG(options) : null;
-};
-
-
-
-/*
- * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!
- */
-
-/*
- * @class SVG
- *
- * Although SVG is not available on IE7 and IE8, these browsers support [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language), and the SVG renderer will fall back to VML in this case.
- *
- * VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility
- * with old versions of Internet Explorer.
- */
-
-// @namespace Browser; @property vml: Boolean
-// `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language).
-L.Browser.vml = !L.Browser.svg && (function () {
-	try {
-		var div = document.createElement('div');
-		div.innerHTML = '<v:shape adj="1"/>';
-
-		var shape = div.firstChild;
-		shape.style.behavior = 'url(#default#VML)';
-
-		return shape && (typeof shape.adj === 'object');
-
-	} catch (e) {
-		return false;
-	}
-}());
-
-// redefine some SVG methods to handle VML syntax which is similar but with some differences
-L.SVG.include(!L.Browser.vml ? {} : {
-
-	_initContainer: function () {
-		this._container = L.DomUtil.create('div', 'leaflet-vml-container');
-	},
-
-	_update: function () {
-		if (this._map._animatingZoom) { return; }
-		L.Renderer.prototype._update.call(this);
-		this.fire('update');
-	},
-
-	_initPath: function (layer) {
-		var container = layer._container = L.SVG.create('shape');
-
-		L.DomUtil.addClass(container, 'leaflet-vml-shape ' + (this.options.className || ''));
-
-		container.coordsize = '1 1';
-
-		layer._path = L.SVG.create('path');
-		container.appendChild(layer._path);
-
-		this._updateStyle(layer);
-		this._layers[L.stamp(layer)] = layer;
-	},
-
-	_addPath: function (layer) {
-		var container = layer._container;
-		this._container.appendChild(container);
-
-		if (layer.options.interactive) {
-			layer.addInteractiveTarget(container);
-		}
-	},
-
-	_removePath: function (layer) {
-		var container = layer._container;
-		L.DomUtil.remove(container);
-		layer.removeInteractiveTarget(container);
-		delete this._layers[L.stamp(layer)];
-	},
-
-	_updateStyle: function (layer) {
-		var stroke = layer._stroke,
-		    fill = layer._fill,
-		    options = layer.options,
-		    container = layer._container;
-
-		container.stroked = !!options.stroke;
-		container.filled = !!options.fill;
-
-		if (options.stroke) {
-			if (!stroke) {
-				stroke = layer._stroke = L.SVG.create('stroke');
-			}
-			container.appendChild(stroke);
-			stroke.weight = options.weight + 'px';
-			stroke.color = options.color;
-			stroke.opacity = options.opacity;
-
-			if (options.dashArray) {
-				stroke.dashStyle = L.Util.isArray(options.dashArray) ?
-				    options.dashArray.join(' ') :
-				    options.dashArray.replace(/( *, *)/g, ' ');
-			} else {
-				stroke.dashStyle = '';
-			}
-			stroke.endcap = options.lineCap.replace('butt', 'flat');
-			stroke.joinstyle = options.lineJoin;
-
-		} else if (stroke) {
-			container.removeChild(stroke);
-			layer._stroke = null;
-		}
-
-		if (options.fill) {
-			if (!fill) {
-				fill = layer._fill = L.SVG.create('fill');
-			}
-			container.appendChild(fill);
-			fill.color = options.fillColor || options.color;
-			fill.opacity = options.fillOpacity;
-
-		} else if (fill) {
-			container.removeChild(fill);
-			layer._fill = null;
-		}
-	},
-
-	_updateCircle: function (layer) {
-		var p = layer._point.round(),
-		    r = Math.round(layer._radius),
-		    r2 = Math.round(layer._radiusY || r);
-
-		this._setPath(layer, layer._empty() ? 'M0 0' :
-				'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r2 + ' 0,' + (65535 * 360));
-	},
-
-	_setPath: function (layer, path) {
-		layer._path.v = path;
-	},
-
-	_bringToFront: function (layer) {
-		L.DomUtil.toFront(layer._container);
-	},
-
-	_bringToBack: function (layer) {
-		L.DomUtil.toBack(layer._container);
-	}
-});
-
-if (L.Browser.vml) {
-	L.SVG.create = (function () {
-		try {
-			document.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');
-			return function (name) {
-				return document.createElement('<lvml:' + name + ' class="lvml">');
-			};
-		} catch (e) {
-			return function (name) {
-				return document.createElement('<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">');
-			};
-		}
-	})();
-}
-
-
-
-/*
- * @class Canvas
- * @inherits Renderer
- * @aka L.Canvas
- *
- * Allows vector layers to be displayed with [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).
- * Inherits `Renderer`.
- *
- * Due to [technical limitations](http://caniuse.com/#search=canvas), Canvas is not
- * available in all web browsers, notably IE8, and overlapping geometries might
- * not display properly in some edge cases.
- *
- * @example
- *
- * Use Canvas by default for all paths in the map:
- *
- * ```js
- * var map = L.map('map', {
- * 	renderer: L.canvas()
- * });
- * ```
- *
- * Use a Canvas renderer with extra padding for specific vector geometries:
- *
- * ```js
- * var map = L.map('map');
- * var myRenderer = L.canvas({ padding: 0.5 });
- * var line = L.polyline( coordinates, { renderer: myRenderer } );
- * var circle = L.circle( center, { renderer: myRenderer } );
- * ```
- */
-
-L.Canvas = L.Renderer.extend({
-	getEvents: function () {
-		var events = L.Renderer.prototype.getEvents.call(this);
-		events.viewprereset = this._onViewPreReset;
-		return events;
-	},
-
-	_onViewPreReset: function () {
-		// Set a flag so that a viewprereset+moveend+viewreset only updates&redraws once
-		this._postponeUpdatePaths = true;
-	},
-
-	onAdd: function () {
-		L.Renderer.prototype.onAdd.call(this);
-
-		// Redraw vectors since canvas is cleared upon removal,
-		// in case of removing the renderer itself from the map.
-		this._draw();
-	},
-
-	_initContainer: function () {
-		var container = this._container = document.createElement('canvas');
-
-		L.DomEvent
-			.on(container, 'mousemove', L.Util.throttle(this._onMouseMove, 32, this), this)
-			.on(container, 'click dblclick mousedown mouseup contextmenu', this._onClick, this)
-			.on(container, 'mouseout', this._handleMouseOut, this);
-
-		this._ctx = container.getContext('2d');
-	},
-
-	_updatePaths: function () {
-		if (this._postponeUpdatePaths) { return; }
-
-		var layer;
-		this._redrawBounds = null;
-		for (var id in this._layers) {
-			layer = this._layers[id];
-			layer._update();
-		}
-		this._redraw();
-	},
-
-	_update: function () {
-		if (this._map._animatingZoom && this._bounds) { return; }
-
-		this._drawnLayers = {};
-
-		L.Renderer.prototype._update.call(this);
-
-		var b = this._bounds,
-		    container = this._container,
-		    size = b.getSize(),
-		    m = L.Browser.retina ? 2 : 1;
-
-		L.DomUtil.setPosition(container, b.min);
-
-		// set canvas size (also clearing it); use double size on retina
-		container.width = m * size.x;
-		container.height = m * size.y;
-		container.style.width = size.x + 'px';
-		container.style.height = size.y + 'px';
-
-		if (L.Browser.retina) {
-			this._ctx.scale(2, 2);
-		}
-
-		// translate so we use the same path coordinates after canvas element moves
-		this._ctx.translate(-b.min.x, -b.min.y);
-
-		// Tell paths to redraw themselves
-		this.fire('update');
-	},
-
-	_reset: function () {
-		L.Renderer.prototype._reset.call(this);
-
-		if (this._postponeUpdatePaths) {
-			this._postponeUpdatePaths = false;
-			this._updatePaths();
-		}
-	},
-
-	_initPath: function (layer) {
-		this._updateDashArray(layer);
-		this._layers[L.stamp(layer)] = layer;
-
-		var order = layer._order = {
-			layer: layer,
-			prev: this._drawLast,
-			next: null
-		};
-		if (this._drawLast) { this._drawLast.next = order; }
-		this._drawLast = order;
-		this._drawFirst = this._drawFirst || this._drawLast;
-	},
-
-	_addPath: function (layer) {
-		this._requestRedraw(layer);
-	},
-
-	_removePath: function (layer) {
-		var order = layer._order;
-		var next = order.next;
-		var prev = order.prev;
-
-		if (next) {
-			next.prev = prev;
-		} else {
-			this._drawLast = prev;
-		}
-		if (prev) {
-			prev.next = next;
-		} else {
-			this._drawFirst = next;
-		}
-
-		delete layer._order;
-
-		delete this._layers[L.stamp(layer)];
-
-		this._requestRedraw(layer);
-	},
-
-	_updatePath: function (layer) {
-		// Redraw the union of the layer's old pixel
-		// bounds and the new pixel bounds.
-		this._extendRedrawBounds(layer);
-		layer._project();
-		layer._update();
-		// The redraw will extend the redraw bounds
-		// with the new pixel bounds.
-		this._requestRedraw(layer);
-	},
-
-	_updateStyle: function (layer) {
-		this._updateDashArray(layer);
-		this._requestRedraw(layer);
-	},
-
-	_updateDashArray: function (layer) {
-		if (layer.options.dashArray) {
-			var parts = layer.options.dashArray.split(','),
-			    dashArray = [],
-			    i;
-			for (i = 0; i < parts.length; i++) {
-				dashArray.push(Number(parts[i]));
-			}
-			layer.options._dashArray = dashArray;
-		}
-	},
-
-	_requestRedraw: function (layer) {
-		if (!this._map) { return; }
-
-		this._extendRedrawBounds(layer);
-		this._redrawRequest = this._redrawRequest || L.Util.requestAnimFrame(this._redraw, this);
-	},
-
-	_extendRedrawBounds: function (layer) {
-		var padding = (layer.options.weight || 0) + 1;
-		this._redrawBounds = this._redrawBounds || new L.Bounds();
-		this._redrawBounds.extend(layer._pxBounds.min.subtract([padding, padding]));
-		this._redrawBounds.extend(layer._pxBounds.max.add([padding, padding]));
-	},
-
-	_redraw: function () {
-		this._redrawRequest = null;
-
-		if (this._redrawBounds) {
-			this._redrawBounds.min._floor();
-			this._redrawBounds.max._ceil();
-		}
-
-		this._clear(); // clear layers in redraw bounds
-		this._draw(); // draw layers
-
-		this._redrawBounds = null;
-	},
-
-	_clear: function () {
-		var bounds = this._redrawBounds;
-		if (bounds) {
-			var size = bounds.getSize();
-			this._ctx.clearRect(bounds.min.x, bounds.min.y, size.x, size.y);
-		} else {
-			this._ctx.clearRect(0, 0, this._container.width, this._container.height);
-		}
-	},
-
-	_draw: function () {
-		var layer, bounds = this._redrawBounds;
-		this._ctx.save();
-		if (bounds) {
-			var size = bounds.getSize();
-			this._ctx.beginPath();
-			this._ctx.rect(bounds.min.x, bounds.min.y, size.x, size.y);
-			this._ctx.clip();
-		}
-
-		this._drawing = true;
-
-		for (var order = this._drawFirst; order; order = order.next) {
-			layer = order.layer;
-			if (!bounds || (layer._pxBounds && layer._pxBounds.intersects(bounds))) {
-				layer._updatePath();
-			}
-		}
-
-		this._drawing = false;
-
-		this._ctx.restore();  // Restore state before clipping.
-	},
-
-	_updatePoly: function (layer, closed) {
-		if (!this._drawing) { return; }
-
-		var i, j, len2, p,
-		    parts = layer._parts,
-		    len = parts.length,
-		    ctx = this._ctx;
-
-		if (!len) { return; }
-
-		this._drawnLayers[layer._leaflet_id] = layer;
-
-		ctx.beginPath();
-
-		if (ctx.setLineDash) {
-			ctx.setLineDash(layer.options && layer.options._dashArray || []);
-		}
-
-		for (i = 0; i < len; i++) {
-			for (j = 0, len2 = parts[i].length; j < len2; j++) {
-				p = parts[i][j];
-				ctx[j ? 'lineTo' : 'moveTo'](p.x, p.y);
-			}
-			if (closed) {
-				ctx.closePath();
-			}
-		}
-
-		this._fillStroke(ctx, layer);
-
-		// TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature
-	},
-
-	_updateCircle: function (layer) {
-
-		if (!this._drawing || layer._empty()) { return; }
-
-		var p = layer._point,
-		    ctx = this._ctx,
-		    r = layer._radius,
-		    s = (layer._radiusY || r) / r;
-
-		this._drawnLayers[layer._leaflet_id] = layer;
-
-		if (s !== 1) {
-			ctx.save();
-			ctx.scale(1, s);
-		}
-
-		ctx.beginPath();
-		ctx.arc(p.x, p.y / s, r, 0, Math.PI * 2, false);
-
-		if (s !== 1) {
-			ctx.restore();
-		}
-
-		this._fillStroke(ctx, layer);
-	},
-
-	_fillStroke: function (ctx, layer) {
-		var options = layer.options;
-
-		if (options.fill) {
-			ctx.globalAlpha = options.fillOpacity;
-			ctx.fillStyle = options.fillColor || options.color;
-			ctx.fill(options.fillRule || 'evenodd');
-		}
-
-		if (options.stroke && options.weight !== 0) {
-			ctx.globalAlpha = options.opacity;
-			ctx.lineWidth = options.weight;
-			ctx.strokeStyle = options.color;
-			ctx.lineCap = options.lineCap;
-			ctx.lineJoin = options.lineJoin;
-			ctx.stroke();
-		}
-	},
-
-	// Canvas obviously doesn't have mouse events for individual drawn objects,
-	// so we emulate that by calculating what's under the mouse on mousemove/click manually
-
-	_onClick: function (e) {
-		var point = this._map.mouseEventToLayerPoint(e), layer, clickedLayer;
-
-		for (var order = this._drawFirst; order; order = order.next) {
-			layer = order.layer;
-			if (layer.options.interactive && layer._containsPoint(point) && !this._map._draggableMoved(layer)) {
-				clickedLayer = layer;
-			}
-		}
-		if (clickedLayer)  {
-			L.DomEvent._fakeStop(e);
-			this._fireEvent([clickedLayer], e);
-		}
-	},
-
-	_onMouseMove: function (e) {
-		if (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { return; }
-
-		var point = this._map.mouseEventToLayerPoint(e);
-		this._handleMouseHover(e, point);
-	},
-
-
-	_handleMouseOut: function (e) {
-		var layer = this._hoveredLayer;
-		if (layer) {
-			// if we're leaving the layer, fire mouseout
-			L.DomUtil.removeClass(this._container, 'leaflet-interactive');
-			this._fireEvent([layer], e, 'mouseout');
-			this._hoveredLayer = null;
-		}
-	},
-
-	_handleMouseHover: function (e, point) {
-		var layer, candidateHoveredLayer;
-
-		for (var order = this._drawFirst; order; order = order.next) {
-			layer = order.layer;
-			if (layer.options.interactive && layer._containsPoint(point)) {
-				candidateHoveredLayer = layer;
-			}
-		}
-
-		if (candidateHoveredLayer !== this._hoveredLayer) {
-			this._handleMouseOut(e);
-
-			if (candidateHoveredLayer) {
-				L.DomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor
-				this._fireEvent([candidateHoveredLayer], e, 'mouseover');
-				this._hoveredLayer = candidateHoveredLayer;
-			}
-		}
-
-		if (this._hoveredLayer) {
-			this._fireEvent([this._hoveredLayer], e);
-		}
-	},
-
-	_fireEvent: function (layers, e, type) {
-		this._map._fireDOMEvent(e, type || e.type, layers);
-	},
-
-	_bringToFront: function (layer) {
-		var order = layer._order;
-		var next = order.next;
-		var prev = order.prev;
-
-		if (next) {
-			next.prev = prev;
-		} else {
-			// Already last
-			return;
-		}
-		if (prev) {
-			prev.next = next;
-		} else if (next) {
-			// Update first entry unless this is the
-			// signle entry
-			this._drawFirst = next;
-		}
-
-		order.prev = this._drawLast;
-		this._drawLast.next = order;
-
-		order.next = null;
-		this._drawLast = order;
-
-		this._requestRedraw(layer);
-	},
-
-	_bringToBack: function (layer) {
-		var order = layer._order;
-		var next = order.next;
-		var prev = order.prev;
-
-		if (prev) {
-			prev.next = next;
-		} else {
-			// Already first
-			return;
-		}
-		if (next) {
-			next.prev = prev;
-		} else if (prev) {
-			// Update last entry unless this is the
-			// signle entry
-			this._drawLast = prev;
-		}
-
-		order.prev = null;
-
-		order.next = this._drawFirst;
-		this._drawFirst.prev = order;
-		this._drawFirst = order;
-
-		this._requestRedraw(layer);
-	}
-});
-
-// @namespace Browser; @property canvas: Boolean
-// `true` when the browser supports [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).
-L.Browser.canvas = (function () {
-	return !!document.createElement('canvas').getContext;
-}());
-
-// @namespace Canvas
-// @factory L.canvas(options?: Renderer options)
-// Creates a Canvas renderer with the given options.
-L.canvas = function (options) {
-	return L.Browser.canvas ? new L.Canvas(options) : null;
-};
-
-L.Polyline.prototype._containsPoint = function (p, closed) {
-	var i, j, k, len, len2, part,
-	    w = this._clickTolerance();
-
-	if (!this._pxBounds.contains(p)) { return false; }
-
-	// hit detection for polylines
-	for (i = 0, len = this._parts.length; i < len; i++) {
-		part = this._parts[i];
-
-		for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {
-			if (!closed && (j === 0)) { continue; }
-
-			if (L.LineUtil.pointToSegmentDistance(p, part[k], part[j]) <= w) {
-				return true;
-			}
-		}
-	}
-	return false;
-};
-
-L.Polygon.prototype._containsPoint = function (p) {
-	var inside = false,
-	    part, p1, p2, i, j, k, len, len2;
-
-	if (!this._pxBounds.contains(p)) { return false; }
-
-	// ray casting algorithm for detecting if point is in polygon
-	for (i = 0, len = this._parts.length; i < len; i++) {
-		part = this._parts[i];
-
-		for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {
-			p1 = part[j];
-			p2 = part[k];
-
-			if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {
-				inside = !inside;
-			}
-		}
-	}
-
-	// also check if it's on polygon stroke
-	return inside || L.Polyline.prototype._containsPoint.call(this, p, true);
-};
-
-L.CircleMarker.prototype._containsPoint = function (p) {
-	return p.distanceTo(this._point) <= this._radius + this._clickTolerance();
-};
-
-
-
-/*
- * @class GeoJSON
- * @aka L.GeoJSON
- * @inherits FeatureGroup
- *
- * Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse
- * GeoJSON data and display it on the map. Extends `FeatureGroup`.
- *
- * @example
- *
- * ```js
- * L.geoJSON(data, {
- * 	style: function (feature) {
- * 		return {color: feature.properties.color};
- * 	}
- * }).bindPopup(function (layer) {
- * 	return layer.feature.properties.description;
- * }).addTo(map);
- * ```
- */
-
-L.GeoJSON = L.FeatureGroup.extend({
-
-	/* @section
-	 * @aka GeoJSON options
-	 *
-	 * @option pointToLayer: Function = *
-	 * A `Function` defining how GeoJSON points spawn Leaflet layers. It is internally
-	 * called when data is added, passing the GeoJSON point feature and its `LatLng`.
-	 * The default is to spawn a default `Marker`:
-	 * ```js
-	 * function(geoJsonPoint, latlng) {
-	 * 	return L.marker(latlng);
-	 * }
-	 * ```
-	 *
-	 * @option style: Function = *
-	 * A `Function` defining the `Path options` for styling GeoJSON lines and polygons,
-	 * called internally when data is added.
-	 * The default value is to not override any defaults:
-	 * ```js
-	 * function (geoJsonFeature) {
-	 * 	return {}
-	 * }
-	 * ```
-	 *
-	 * @option onEachFeature: Function = *
-	 * A `Function` that will be called once for each created `Feature`, after it has
-	 * been created and styled. Useful for attaching events and popups to features.
-	 * The default is to do nothing with the newly created layers:
-	 * ```js
-	 * function (feature, layer) {}
-	 * ```
-	 *
-	 * @option filter: Function = *
-	 * A `Function` that will be used to decide whether to include a feature or not.
-	 * The default is to include all features:
-	 * ```js
-	 * function (geoJsonFeature) {
-	 * 	return true;
-	 * }
-	 * ```
-	 * Note: dynamically changing the `filter` option will have effect only on newly
-	 * added data. It will _not_ re-evaluate already included features.
-	 *
-	 * @option coordsToLatLng: Function = *
-	 * A `Function` that will be used for converting GeoJSON coordinates to `LatLng`s.
-	 * The default is the `coordsToLatLng` static method.
-	 */
-
-	initialize: function (geojson, options) {
-		L.setOptions(this, options);
-
-		this._layers = {};
-
-		if (geojson) {
-			this.addData(geojson);
-		}
-	},
-
-	// @method addData( <GeoJSON> data ): this
-	// Adds a GeoJSON object to the layer.
-	addData: function (geojson) {
-		var features = L.Util.isArray(geojson) ? geojson : geojson.features,
-		    i, len, feature;
-
-		if (features) {
-			for (i = 0, len = features.length; i < len; i++) {
-				// only add this if geometry or geometries are set and not null
-				feature = features[i];
-				if (feature.geometries || feature.geometry || feature.features || feature.coordinates) {
-					this.addData(feature);
-				}
-			}
-			return this;
-		}
-
-		var options = this.options;
-
-		if (options.filter && !options.filter(geojson)) { return this; }
-
-		var layer = L.GeoJSON.geometryToLayer(geojson, options);
-		if (!layer) {
-			return this;
-		}
-		layer.feature = L.GeoJSON.asFeature(geojson);
-
-		layer.defaultOptions = layer.options;
-		this.resetStyle(layer);
-
-		if (options.onEachFeature) {
-			options.onEachFeature(geojson, layer);
-		}
-
-		return this.addLayer(layer);
-	},
-
-	// @method resetStyle( <Path> layer ): this
-	// Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.
-	resetStyle: function (layer) {
-		// reset any custom styles
-		layer.options = L.Util.extend({}, layer.defaultOptions);
-		this._setLayerStyle(layer, this.options.style);
-		return this;
-	},
-
-	// @method setStyle( <Function> style ): this
-	// Changes styles of GeoJSON vector layers with the given style function.
-	setStyle: function (style) {
-		return this.eachLayer(function (layer) {
-			this._setLayerStyle(layer, style);
-		}, this);
-	},
-
-	_setLayerStyle: function (layer, style) {
-		if (typeof style === 'function') {
-			style = style(layer.feature);
-		}
-		if (layer.setStyle) {
-			layer.setStyle(style);
-		}
-	}
-});
-
-// @section
-// There are several static functions which can be called without instantiating L.GeoJSON:
-L.extend(L.GeoJSON, {
-	// @function geometryToLayer(featureData: Object, options?: GeoJSON options): Layer
-	// Creates a `Layer` from a given GeoJSON feature. Can use a custom
-	// [`pointToLayer`](#geojson-pointtolayer) and/or [`coordsToLatLng`](#geojson-coordstolatlng)
-	// functions if provided as options.
-	geometryToLayer: function (geojson, options) {
-
-		var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,
-		    coords = geometry ? geometry.coordinates : null,
-		    layers = [],
-		    pointToLayer = options && options.pointToLayer,
-		    coordsToLatLng = options && options.coordsToLatLng || this.coordsToLatLng,
-		    latlng, latlngs, i, len;
-
-		if (!coords && !geometry) {
-			return null;
-		}
-
-		switch (geometry.type) {
-		case 'Point':
-			latlng = coordsToLatLng(coords);
-			return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);
-
-		case 'MultiPoint':
-			for (i = 0, len = coords.length; i < len; i++) {
-				latlng = coordsToLatLng(coords[i]);
-				layers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng));
-			}
-			return new L.FeatureGroup(layers);
-
-		case 'LineString':
-		case 'MultiLineString':
-			latlngs = this.coordsToLatLngs(coords, geometry.type === 'LineString' ? 0 : 1, coordsToLatLng);
-			return new L.Polyline(latlngs, options);
-
-		case 'Polygon':
-		case 'MultiPolygon':
-			latlngs = this.coordsToLatLngs(coords, geometry.type === 'Polygon' ? 1 : 2, coordsToLatLng);
-			return new L.Polygon(latlngs, options);
-
-		case 'GeometryCollection':
-			for (i = 0, len = geometry.geometries.length; i < len; i++) {
-				var layer = this.geometryToLayer({
-					geometry: geometry.geometries[i],
-					type: 'Feature',
-					properties: geojson.properties
-				}, options);
-
-				if (layer) {
-					layers.push(layer);
-				}
-			}
-			return new L.FeatureGroup(layers);
-
-		default:
-			throw new Error('Invalid GeoJSON object.');
-		}
-	},
-
-	// @function coordsToLatLng(coords: Array): LatLng
-	// Creates a `LatLng` object from an array of 2 numbers (longitude, latitude)
-	// or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.
-	coordsToLatLng: function (coords) {
-		return new L.LatLng(coords[1], coords[0], coords[2]);
-	},
-
-	// @function coordsToLatLngs(coords: Array, levelsDeep?: Number, coordsToLatLng?: Function): Array
-	// Creates a multidimensional array of `LatLng`s from a GeoJSON coordinates array.
-	// `levelsDeep` specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default).
-	// Can use a custom [`coordsToLatLng`](#geojson-coordstolatlng) function.
-	coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) {
-		var latlngs = [];
-
-		for (var i = 0, len = coords.length, latlng; i < len; i++) {
-			latlng = levelsDeep ?
-			        this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) :
-			        (coordsToLatLng || this.coordsToLatLng)(coords[i]);
-
-			latlngs.push(latlng);
-		}
-
-		return latlngs;
-	},
-
-	// @function latLngToCoords(latlng: LatLng): Array
-	// Reverse of [`coordsToLatLng`](#geojson-coordstolatlng)
-	latLngToCoords: function (latlng) {
-		return latlng.alt !== undefined ?
-				[latlng.lng, latlng.lat, latlng.alt] :
-				[latlng.lng, latlng.lat];
-	},
-
-	// @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean): Array
-	// Reverse of [`coordsToLatLngs`](#geojson-coordstolatlngs)
-	// `closed` determines whether the first point should be appended to the end of the array to close the feature, only used when `levelsDeep` is 0. False by default.
-	latLngsToCoords: function (latlngs, levelsDeep, closed) {
-		var coords = [];
-
-		for (var i = 0, len = latlngs.length; i < len; i++) {
-			coords.push(levelsDeep ?
-				L.GeoJSON.latLngsToCoords(latlngs[i], levelsDeep - 1, closed) :
-				L.GeoJSON.latLngToCoords(latlngs[i]));
-		}
-
-		if (!levelsDeep && closed) {
-			coords.push(coords[0]);
-		}
-
-		return coords;
-	},
-
-	getFeature: function (layer, newGeometry) {
-		return layer.feature ?
-				L.extend({}, layer.feature, {geometry: newGeometry}) :
-				L.GeoJSON.asFeature(newGeometry);
-	},
-
-	// @function asFeature(geojson: Object): Object
-	// Normalize GeoJSON geometries/features into GeoJSON features.
-	asFeature: function (geojson) {
-		if (geojson.type === 'Feature' || geojson.type === 'FeatureCollection') {
-			return geojson;
-		}
-
-		return {
-			type: 'Feature',
-			properties: {},
-			geometry: geojson
-		};
-	}
-});
-
-var PointToGeoJSON = {
-	toGeoJSON: function () {
-		return L.GeoJSON.getFeature(this, {
-			type: 'Point',
-			coordinates: L.GeoJSON.latLngToCoords(this.getLatLng())
-		});
-	}
-};
-
-// @namespace Marker
-// @method toGeoJSON(): Object
-// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON `Point` Feature).
-L.Marker.include(PointToGeoJSON);
-
-// @namespace CircleMarker
-// @method toGeoJSON(): Object
-// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature).
-L.Circle.include(PointToGeoJSON);
-L.CircleMarker.include(PointToGeoJSON);
-
-
-// @namespace Polyline
-// @method toGeoJSON(): Object
-// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature).
-L.Polyline.prototype.toGeoJSON = function () {
-	var multi = !L.Polyline._flat(this._latlngs);
-
-	var coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 1 : 0);
-
-	return L.GeoJSON.getFeature(this, {
-		type: (multi ? 'Multi' : '') + 'LineString',
-		coordinates: coords
-	});
-};
-
-// @namespace Polygon
-// @method toGeoJSON(): Object
-// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature).
-L.Polygon.prototype.toGeoJSON = function () {
-	var holes = !L.Polyline._flat(this._latlngs),
-	    multi = holes && !L.Polyline._flat(this._latlngs[0]);
-
-	var coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 2 : holes ? 1 : 0, true);
-
-	if (!holes) {
-		coords = [coords];
-	}
-
-	return L.GeoJSON.getFeature(this, {
-		type: (multi ? 'Multi' : '') + 'Polygon',
-		coordinates: coords
-	});
-};
-
-
-// @namespace LayerGroup
-L.LayerGroup.include({
-	toMultiPoint: function () {
-		var coords = [];
-
-		this.eachLayer(function (layer) {
-			coords.push(layer.toGeoJSON().geometry.coordinates);
-		});
-
-		return L.GeoJSON.getFeature(this, {
-			type: 'MultiPoint',
-			coordinates: coords
-		});
-	},
-
-	// @method toGeoJSON(): Object
-	// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `GeometryCollection`).
-	toGeoJSON: function () {
-
-		var type = this.feature && this.feature.geometry && this.feature.geometry.type;
-
-		if (type === 'MultiPoint') {
-			return this.toMultiPoint();
-		}
-
-		var isGeometryCollection = type === 'GeometryCollection',
-		    jsons = [];
-
-		this.eachLayer(function (layer) {
-			if (layer.toGeoJSON) {
-				var json = layer.toGeoJSON();
-				jsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json));
-			}
-		});
-
-		if (isGeometryCollection) {
-			return L.GeoJSON.getFeature(this, {
-				geometries: jsons,
-				type: 'GeometryCollection'
-			});
-		}
-
-		return {
-			type: 'FeatureCollection',
-			features: jsons
-		};
-	}
-});
-
-// @namespace GeoJSON
-// @factory L.geoJSON(geojson?: Object, options?: GeoJSON options)
-// Creates a GeoJSON layer. Optionally accepts an object in
-// [GeoJSON format](http://geojson.org/geojson-spec.html) to display on the map
-// (you can alternatively add it later with `addData` method) and an `options` object.
-L.geoJSON = function (geojson, options) {
-	return new L.GeoJSON(geojson, options);
-};
-// Backward compatibility.
-L.geoJson = L.geoJSON;
-
-
-
-/*
- * @class Draggable
- * @aka L.Draggable
- * @inherits Evented
- *
- * A class for making DOM elements draggable (including touch support).
- * Used internally for map and marker dragging. Only works for elements
- * that were positioned with [`L.DomUtil.setPosition`](#domutil-setposition).
- *
- * @example
- * ```js
- * var draggable = new L.Draggable(elementToDrag);
- * draggable.enable();
- * ```
- */
-
-L.Draggable = L.Evented.extend({
-
-	options: {
-		// @option clickTolerance: Number = 3
-		// The max number of pixels a user can shift the mouse pointer during a click
-		// for it to be considered a valid click (as opposed to a mouse drag).
-		clickTolerance: 3
-	},
-
-	statics: {
-		START: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'],
-		END: {
-			mousedown: 'mouseup',
-			touchstart: 'touchend',
-			pointerdown: 'touchend',
-			MSPointerDown: 'touchend'
-		},
-		MOVE: {
-			mousedown: 'mousemove',
-			touchstart: 'touchmove',
-			pointerdown: 'touchmove',
-			MSPointerDown: 'touchmove'
-		}
-	},
-
-	// @constructor L.Draggable(el: HTMLElement, dragHandle?: HTMLElement, preventOutline: Boolean)
-	// Creates a `Draggable` object for moving `el` when you start dragging the `dragHandle` element (equals `el` itself by default).
-	initialize: function (element, dragStartTarget, preventOutline) {
-		this._element = element;
-		this._dragStartTarget = dragStartTarget || element;
-		this._preventOutline = preventOutline;
-	},
-
-	// @method enable()
-	// Enables the dragging ability
-	enable: function () {
-		if (this._enabled) { return; }
-
-		L.DomEvent.on(this._dragStartTarget, L.Draggable.START.join(' '), this._onDown, this);
-
-		this._enabled = true;
-	},
-
-	// @method disable()
-	// Disables the dragging ability
-	disable: function () {
-		if (!this._enabled) { return; }
-
-		// If we're currently dragging this draggable,
-		// disabling it counts as first ending the drag.
-		if (L.Draggable._dragging === this) {
-			this.finishDrag();
-		}
-
-		L.DomEvent.off(this._dragStartTarget, L.Draggable.START.join(' '), this._onDown, this);
-
-		this._enabled = false;
-		this._moved = false;
-	},
-
-	_onDown: function (e) {
-		// Ignore simulated events, since we handle both touch and
-		// mouse explicitly; otherwise we risk getting duplicates of
-		// touch events, see #4315.
-		// Also ignore the event if disabled; this happens in IE11
-		// under some circumstances, see #3666.
-		if (e._simulated || !this._enabled) { return; }
-
-		this._moved = false;
-
-		if (L.DomUtil.hasClass(this._element, 'leaflet-zoom-anim')) { return; }
-
-		if (L.Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }
-		L.Draggable._dragging = this;  // Prevent dragging multiple objects at once.
-
-		if (this._preventOutline) {
-			L.DomUtil.preventOutline(this._element);
-		}
-
-		L.DomUtil.disableImageDrag();
-		L.DomUtil.disableTextSelection();
-
-		if (this._moving) { return; }
-
-		// @event down: Event
-		// Fired when a drag is about to start.
-		this.fire('down');
-
-		var first = e.touches ? e.touches[0] : e;
-
-		this._startPoint = new L.Point(first.clientX, first.clientY);
-
-		L.DomEvent
-			.on(document, L.Draggable.MOVE[e.type], this._onMove, this)
-			.on(document, L.Draggable.END[e.type], this._onUp, this);
-	},
-
-	_onMove: function (e) {
-		// Ignore simulated events, since we handle both touch and
-		// mouse explicitly; otherwise we risk getting duplicates of
-		// touch events, see #4315.
-		// Also ignore the event if disabled; this happens in IE11
-		// under some circumstances, see #3666.
-		if (e._simulated || !this._enabled) { return; }
-
-		if (e.touches && e.touches.length > 1) {
-			this._moved = true;
-			return;
-		}
-
-		var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),
-		    newPoint = new L.Point(first.clientX, first.clientY),
-		    offset = newPoint.subtract(this._startPoint);
-
-		if (!offset.x && !offset.y) { return; }
-		if (Math.abs(offset.x) + Math.abs(offset.y) < this.options.clickTolerance) { return; }
-
-		L.DomEvent.preventDefault(e);
-
-		if (!this._moved) {
-			// @event dragstart: Event
-			// Fired when a drag starts
-			this.fire('dragstart');
-
-			this._moved = true;
-			this._startPos = L.DomUtil.getPosition(this._element).subtract(offset);
-
-			L.DomUtil.addClass(document.body, 'leaflet-dragging');
-
-			this._lastTarget = e.target || e.srcElement;
-			// IE and Edge do not give the <use> element, so fetch it
-			// if necessary
-			if ((window.SVGElementInstance) && (this._lastTarget instanceof SVGElementInstance)) {
-				this._lastTarget = this._lastTarget.correspondingUseElement;
-			}
-			L.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target');
-		}
-
-		this._newPos = this._startPos.add(offset);
-		this._moving = true;
-
-		L.Util.cancelAnimFrame(this._animRequest);
-		this._lastEvent = e;
-		this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true);
-	},
-
-	_updatePosition: function () {
-		var e = {originalEvent: this._lastEvent};
-
-		// @event predrag: Event
-		// Fired continuously during dragging *before* each corresponding
-		// update of the element's position.
-		this.fire('predrag', e);
-		L.DomUtil.setPosition(this._element, this._newPos);
-
-		// @event drag: Event
-		// Fired continuously during dragging.
-		this.fire('drag', e);
-	},
-
-	_onUp: function (e) {
-		// Ignore simulated events, since we handle both touch and
-		// mouse explicitly; otherwise we risk getting duplicates of
-		// touch events, see #4315.
-		// Also ignore the event if disabled; this happens in IE11
-		// under some circumstances, see #3666.
-		if (e._simulated || !this._enabled) { return; }
-		this.finishDrag();
-	},
-
-	finishDrag: function () {
-		L.DomUtil.removeClass(document.body, 'leaflet-dragging');
-
-		if (this._lastTarget) {
-			L.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target');
-			this._lastTarget = null;
-		}
-
-		for (var i in L.Draggable.MOVE) {
-			L.DomEvent
-				.off(document, L.Draggable.MOVE[i], this._onMove, this)
-				.off(document, L.Draggable.END[i], this._onUp, this);
-		}
-
-		L.DomUtil.enableImageDrag();
-		L.DomUtil.enableTextSelection();
-
-		if (this._moved && this._moving) {
-			// ensure drag is not fired after dragend
-			L.Util.cancelAnimFrame(this._animRequest);
-
-			// @event dragend: DragEndEvent
-			// Fired when the drag ends.
-			this.fire('dragend', {
-				distance: this._newPos.distanceTo(this._startPos)
-			});
-		}
-
-		this._moving = false;
-		L.Draggable._dragging = false;
-	}
-
-});
-
-
-
-/*
-	L.Handler is a base class for handler classes that are used internally to inject
-	interaction features like dragging to classes like Map and Marker.
-*/
-
-// @class Handler
-// @aka L.Handler
-// Abstract class for map interaction handlers
-
-L.Handler = L.Class.extend({
-	initialize: function (map) {
-		this._map = map;
-	},
-
-	// @method enable(): this
-	// Enables the handler
-	enable: function () {
-		if (this._enabled) { return this; }
-
-		this._enabled = true;
-		this.addHooks();
-		return this;
-	},
-
-	// @method disable(): this
-	// Disables the handler
-	disable: function () {
-		if (!this._enabled) { return this; }
-
-		this._enabled = false;
-		this.removeHooks();
-		return this;
-	},
-
-	// @method enabled(): Boolean
-	// Returns `true` if the handler is enabled
-	enabled: function () {
-		return !!this._enabled;
-	}
-
-	// @section Extension methods
-	// Classes inheriting from `Handler` must implement the two following methods:
-	// @method addHooks()
-	// Called when the handler is enabled, should add event hooks.
-	// @method removeHooks()
-	// Called when the handler is disabled, should remove the event hooks added previously.
-});
-
-
-
-/*
- * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.
- */
-
-// @namespace Map
-// @section Interaction Options
-L.Map.mergeOptions({
-	// @option dragging: Boolean = true
-	// Whether the map be draggable with mouse/touch or not.
-	dragging: true,
-
-	// @section Panning Inertia Options
-	// @option inertia: Boolean = *
-	// If enabled, panning of the map will have an inertia effect where
-	// the map builds momentum while dragging and continues moving in
-	// the same direction for some time. Feels especially nice on touch
-	// devices. Enabled by default unless running on old Android devices.
-	inertia: !L.Browser.android23,
-
-	// @option inertiaDeceleration: Number = 3000
-	// The rate with which the inertial movement slows down, in pixels/second².
-	inertiaDeceleration: 3400, // px/s^2
-
-	// @option inertiaMaxSpeed: Number = Infinity
-	// Max speed of the inertial movement, in pixels/second.
-	inertiaMaxSpeed: Infinity, // px/s
-
-	// @option easeLinearity: Number = 0.2
-	easeLinearity: 0.2,
-
-	// TODO refactor, move to CRS
-	// @option worldCopyJump: Boolean = false
-	// With this option enabled, the map tracks when you pan to another "copy"
-	// of the world and seamlessly jumps to the original one so that all overlays
-	// like markers and vector layers are still visible.
-	worldCopyJump: false,
-
-	// @option maxBoundsViscosity: Number = 0.0
-	// If `maxBounds` is set, this option will control how solid the bounds
-	// are when dragging the map around. The default value of `0.0` allows the
-	// user to drag outside the bounds at normal speed, higher values will
-	// slow down map dragging outside bounds, and `1.0` makes the bounds fully
-	// solid, preventing the user from dragging outside the bounds.
-	maxBoundsViscosity: 0.0
-});
-
-L.Map.Drag = L.Handler.extend({
-	addHooks: function () {
-		if (!this._draggable) {
-			var map = this._map;
-
-			this._draggable = new L.Draggable(map._mapPane, map._container);
-
-			this._draggable.on({
-				down: this._onDown,
-				dragstart: this._onDragStart,
-				drag: this._onDrag,
-				dragend: this._onDragEnd
-			}, this);
-
-			this._draggable.on('predrag', this._onPreDragLimit, this);
-			if (map.options.worldCopyJump) {
-				this._draggable.on('predrag', this._onPreDragWrap, this);
-				map.on('zoomend', this._onZoomEnd, this);
-
-				map.whenReady(this._onZoomEnd, this);
-			}
-		}
-		L.DomUtil.addClass(this._map._container, 'leaflet-grab leaflet-touch-drag');
-		this._draggable.enable();
-		this._positions = [];
-		this._times = [];
-	},
-
-	removeHooks: function () {
-		L.DomUtil.removeClass(this._map._container, 'leaflet-grab');
-		L.DomUtil.removeClass(this._map._container, 'leaflet-touch-drag');
-		this._draggable.disable();
-	},
-
-	moved: function () {
-		return this._draggable && this._draggable._moved;
-	},
-
-	moving: function () {
-		return this._draggable && this._draggable._moving;
-	},
-
-	_onDown: function () {
-		this._map._stop();
-	},
-
-	_onDragStart: function () {
-		var map = this._map;
-
-		if (this._map.options.maxBounds && this._map.options.maxBoundsViscosity) {
-			var bounds = L.latLngBounds(this._map.options.maxBounds);
-
-			this._offsetLimit = L.bounds(
-				this._map.latLngToContainerPoint(bounds.getNorthWest()).multiplyBy(-1),
-				this._map.latLngToContainerPoint(bounds.getSouthEast()).multiplyBy(-1)
-					.add(this._map.getSize()));
-
-			this._viscosity = Math.min(1.0, Math.max(0.0, this._map.options.maxBoundsViscosity));
-		} else {
-			this._offsetLimit = null;
-		}
-
-		map
-		    .fire('movestart')
-		    .fire('dragstart');
-
-		if (map.options.inertia) {
-			this._positions = [];
-			this._times = [];
-		}
-	},
-
-	_onDrag: function (e) {
-		if (this._map.options.inertia) {
-			var time = this._lastTime = +new Date(),
-			    pos = this._lastPos = this._draggable._absPos || this._draggable._newPos;
-
-			this._positions.push(pos);
-			this._times.push(time);
-
-			if (time - this._times[0] > 50) {
-				this._positions.shift();
-				this._times.shift();
-			}
-		}
-
-		this._map
-		    .fire('move', e)
-		    .fire('drag', e);
-	},
-
-	_onZoomEnd: function () {
-		var pxCenter = this._map.getSize().divideBy(2),
-		    pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);
-
-		this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;
-		this._worldWidth = this._map.getPixelWorldBounds().getSize().x;
-	},
-
-	_viscousLimit: function (value, threshold) {
-		return value - (value - threshold) * this._viscosity;
-	},
-
-	_onPreDragLimit: function () {
-		if (!this._viscosity || !this._offsetLimit) { return; }
-
-		var offset = this._draggable._newPos.subtract(this._draggable._startPos);
-
-		var limit = this._offsetLimit;
-		if (offset.x < limit.min.x) { offset.x = this._viscousLimit(offset.x, limit.min.x); }
-		if (offset.y < limit.min.y) { offset.y = this._viscousLimit(offset.y, limit.min.y); }
-		if (offset.x > limit.max.x) { offset.x = this._viscousLimit(offset.x, limit.max.x); }
-		if (offset.y > limit.max.y) { offset.y = this._viscousLimit(offset.y, limit.max.y); }
-
-		this._draggable._newPos = this._draggable._startPos.add(offset);
-	},
-
-	_onPreDragWrap: function () {
-		// TODO refactor to be able to adjust map pane position after zoom
-		var worldWidth = this._worldWidth,
-		    halfWidth = Math.round(worldWidth / 2),
-		    dx = this._initialWorldOffset,
-		    x = this._draggable._newPos.x,
-		    newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,
-		    newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,
-		    newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;
-
-		this._draggable._absPos = this._draggable._newPos.clone();
-		this._draggable._newPos.x = newX;
-	},
-
-	_onDragEnd: function (e) {
-		var map = this._map,
-		    options = map.options,
-
-		    noInertia = !options.inertia || this._times.length < 2;
-
-		map.fire('dragend', e);
-
-		if (noInertia) {
-			map.fire('moveend');
-
-		} else {
-
-			var direction = this._lastPos.subtract(this._positions[0]),
-			    duration = (this._lastTime - this._times[0]) / 1000,
-			    ease = options.easeLinearity,
-
-			    speedVector = direction.multiplyBy(ease / duration),
-			    speed = speedVector.distanceTo([0, 0]),
-
-			    limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),
-			    limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),
-
-			    decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),
-			    offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();
-
-			if (!offset.x && !offset.y) {
-				map.fire('moveend');
-
-			} else {
-				offset = map._limitOffset(offset, map.options.maxBounds);
-
-				L.Util.requestAnimFrame(function () {
-					map.panBy(offset, {
-						duration: decelerationDuration,
-						easeLinearity: ease,
-						noMoveStart: true,
-						animate: true
-					});
-				});
-			}
-		}
-	}
-});
-
-// @section Handlers
-// @property dragging: Handler
-// Map dragging handler (by both mouse and touch).
-L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);
-
-
-
-/*
- * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.
- */
-
-// @namespace Map
-// @section Interaction Options
-
-L.Map.mergeOptions({
-	// @option doubleClickZoom: Boolean|String = true
-	// Whether the map can be zoomed in by double clicking on it and
-	// zoomed out by double clicking while holding shift. If passed
-	// `'center'`, double-click zoom will zoom to the center of the
-	//  view regardless of where the mouse was.
-	doubleClickZoom: true
-});
-
-L.Map.DoubleClickZoom = L.Handler.extend({
-	addHooks: function () {
-		this._map.on('dblclick', this._onDoubleClick, this);
-	},
-
-	removeHooks: function () {
-		this._map.off('dblclick', this._onDoubleClick, this);
-	},
-
-	_onDoubleClick: function (e) {
-		var map = this._map,
-		    oldZoom = map.getZoom(),
-		    delta = map.options.zoomDelta,
-		    zoom = e.originalEvent.shiftKey ? oldZoom - delta : oldZoom + delta;
-
-		if (map.options.doubleClickZoom === 'center') {
-			map.setZoom(zoom);
-		} else {
-			map.setZoomAround(e.containerPoint, zoom);
-		}
-	}
-});
-
-// @section Handlers
-//
-// Map properties include interaction handlers that allow you to control
-// interaction behavior in runtime, enabling or disabling certain features such
-// as dragging or touch zoom (see `Handler` methods). For example:
-//
-// ```js
-// map.doubleClickZoom.disable();
-// ```
-//
-// @property doubleClickZoom: Handler
-// Double click zoom handler.
-L.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom);
-
-
-
-/*
- * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.
- */
-
-// @namespace Map
-// @section Interaction Options
-L.Map.mergeOptions({
-	// @section Mousewheel options
-	// @option scrollWheelZoom: Boolean|String = true
-	// Whether the map can be zoomed by using the mouse wheel. If passed `'center'`,
-	// it will zoom to the center of the view regardless of where the mouse was.
-	scrollWheelZoom: true,
-
-	// @option wheelDebounceTime: Number = 40
-	// Limits the rate at which a wheel can fire (in milliseconds). By default
-	// user can't zoom via wheel more often than once per 40 ms.
-	wheelDebounceTime: 40,
-
-	// @option wheelPxPerZoomLevel: Number = 60
-	// How many scroll pixels (as reported by [L.DomEvent.getWheelDelta](#domevent-getwheeldelta))
-	// mean a change of one full zoom level. Smaller values will make wheel-zooming
-	// faster (and vice versa).
-	wheelPxPerZoomLevel: 60
-});
-
-L.Map.ScrollWheelZoom = L.Handler.extend({
-	addHooks: function () {
-		L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this);
-
-		this._delta = 0;
-	},
-
-	removeHooks: function () {
-		L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll, this);
-	},
-
-	_onWheelScroll: function (e) {
-		var delta = L.DomEvent.getWheelDelta(e);
-
-		var debounce = this._map.options.wheelDebounceTime;
-
-		this._delta += delta;
-		this._lastMousePos = this._map.mouseEventToContainerPoint(e);
-
-		if (!this._startTime) {
-			this._startTime = +new Date();
-		}
-
-		var left = Math.max(debounce - (+new Date() - this._startTime), 0);
-
-		clearTimeout(this._timer);
-		this._timer = setTimeout(L.bind(this._performZoom, this), left);
-
-		L.DomEvent.stop(e);
-	},
-
-	_performZoom: function () {
-		var map = this._map,
-		    zoom = map.getZoom(),
-		    snap = this._map.options.zoomSnap || 0;
-
-		map._stop(); // stop panning and fly animations if any
-
-		// map the delta with a sigmoid function to -4..4 range leaning on -1..1
-		var d2 = this._delta / (this._map.options.wheelPxPerZoomLevel * 4),
-		    d3 = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(d2)))) / Math.LN2,
-		    d4 = snap ? Math.ceil(d3 / snap) * snap : d3,
-		    delta = map._limitZoom(zoom + (this._delta > 0 ? d4 : -d4)) - zoom;
-
-		this._delta = 0;
-		this._startTime = null;
-
-		if (!delta) { return; }
-
-		if (map.options.scrollWheelZoom === 'center') {
-			map.setZoom(zoom + delta);
-		} else {
-			map.setZoomAround(this._lastMousePos, zoom + delta);
-		}
-	}
-});
-
-// @section Handlers
-// @property scrollWheelZoom: Handler
-// Scroll wheel zoom handler.
-L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);
-
-
-
-/*
- * Extends the event handling code with double tap support for mobile browsers.
- */
-
-L.extend(L.DomEvent, {
-
-	_touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',
-	_touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',
-
-	// inspired by Zepto touch code by Thomas Fuchs
-	addDoubleTapListener: function (obj, handler, id) {
-		var last, touch,
-		    doubleTap = false,
-		    delay = 250;
-
-		function onTouchStart(e) {
-			var count;
-
-			if (L.Browser.pointer) {
-				if ((!L.Browser.edge) || e.pointerType === 'mouse') { return; }
-				count = L.DomEvent._pointersCount;
-			} else {
-				count = e.touches.length;
-			}
-
-			if (count > 1) { return; }
-
-			var now = Date.now(),
-			    delta = now - (last || now);
-
-			touch = e.touches ? e.touches[0] : e;
-			doubleTap = (delta > 0 && delta <= delay);
-			last = now;
-		}
-
-		function onTouchEnd(e) {
-			if (doubleTap && !touch.cancelBubble) {
-				if (L.Browser.pointer) {
-					if ((!L.Browser.edge) || e.pointerType === 'mouse') { return; }
-
-					// work around .type being readonly with MSPointer* events
-					var newTouch = {},
-					    prop, i;
-
-					for (i in touch) {
-						prop = touch[i];
-						newTouch[i] = prop && prop.bind ? prop.bind(touch) : prop;
-					}
-					touch = newTouch;
-				}
-				touch.type = 'dblclick';
-				handler(touch);
-				last = null;
-			}
-		}
-
-		var pre = '_leaflet_',
-		    touchstart = this._touchstart,
-		    touchend = this._touchend;
-
-		obj[pre + touchstart + id] = onTouchStart;
-		obj[pre + touchend + id] = onTouchEnd;
-		obj[pre + 'dblclick' + id] = handler;
-
-		obj.addEventListener(touchstart, onTouchStart, false);
-		obj.addEventListener(touchend, onTouchEnd, false);
-
-		// On some platforms (notably, chrome<55 on win10 + touchscreen + mouse),
-		// the browser doesn't fire touchend/pointerup events but does fire
-		// native dblclicks. See #4127.
-		// Edge 14 also fires native dblclicks, but only for pointerType mouse, see #5180.
-		obj.addEventListener('dblclick', handler, false);
-
-		return this;
-	},
-
-	removeDoubleTapListener: function (obj, id) {
-		var pre = '_leaflet_',
-		    touchstart = obj[pre + this._touchstart + id],
-		    touchend = obj[pre + this._touchend + id],
-		    dblclick = obj[pre + 'dblclick' + id];
-
-		obj.removeEventListener(this._touchstart, touchstart, false);
-		obj.removeEventListener(this._touchend, touchend, false);
-		if (!L.Browser.edge) {
-			obj.removeEventListener('dblclick', dblclick, false);
-		}
-
-		return this;
-	}
-});
-
-
-
-/*
- * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.
- */
-
-L.extend(L.DomEvent, {
-
-	POINTER_DOWN:   L.Browser.msPointer ? 'MSPointerDown'   : 'pointerdown',
-	POINTER_MOVE:   L.Browser.msPointer ? 'MSPointerMove'   : 'pointermove',
-	POINTER_UP:     L.Browser.msPointer ? 'MSPointerUp'     : 'pointerup',
-	POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',
-	TAG_WHITE_LIST: ['INPUT', 'SELECT', 'OPTION'],
-
-	_pointers: {},
-	_pointersCount: 0,
-
-	// Provides a touch events wrapper for (ms)pointer events.
-	// ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890
-
-	addPointerListener: function (obj, type, handler, id) {
-
-		if (type === 'touchstart') {
-			this._addPointerStart(obj, handler, id);
-
-		} else if (type === 'touchmove') {
-			this._addPointerMove(obj, handler, id);
-
-		} else if (type === 'touchend') {
-			this._addPointerEnd(obj, handler, id);
-		}
-
-		return this;
-	},
-
-	removePointerListener: function (obj, type, id) {
-		var handler = obj['_leaflet_' + type + id];
-
-		if (type === 'touchstart') {
-			obj.removeEventListener(this.POINTER_DOWN, handler, false);
-
-		} else if (type === 'touchmove') {
-			obj.removeEventListener(this.POINTER_MOVE, handler, false);
-
-		} else if (type === 'touchend') {
-			obj.removeEventListener(this.POINTER_UP, handler, false);
-			obj.removeEventListener(this.POINTER_CANCEL, handler, false);
-		}
-
-		return this;
-	},
-
-	_addPointerStart: function (obj, handler, id) {
-		var onDown = L.bind(function (e) {
-			if (e.pointerType !== 'mouse' && e.MSPOINTER_TYPE_MOUSE && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {
-				// In IE11, some touch events needs to fire for form controls, or
-				// the controls will stop working. We keep a whitelist of tag names that
-				// need these events. For other target tags, we prevent default on the event.
-				if (this.TAG_WHITE_LIST.indexOf(e.target.tagName) < 0) {
-					L.DomEvent.preventDefault(e);
-				} else {
-					return;
-				}
-			}
-
-			this._handlePointer(e, handler);
-		}, this);
-
-		obj['_leaflet_touchstart' + id] = onDown;
-		obj.addEventListener(this.POINTER_DOWN, onDown, false);
-
-		// need to keep track of what pointers and how many are active to provide e.touches emulation
-		if (!this._pointerDocListener) {
-			var pointerUp = L.bind(this._globalPointerUp, this);
-
-			// we listen documentElement as any drags that end by moving the touch off the screen get fired there
-			document.documentElement.addEventListener(this.POINTER_DOWN, L.bind(this._globalPointerDown, this), true);
-			document.documentElement.addEventListener(this.POINTER_MOVE, L.bind(this._globalPointerMove, this), true);
-			document.documentElement.addEventListener(this.POINTER_UP, pointerUp, true);
-			document.documentElement.addEventListener(this.POINTER_CANCEL, pointerUp, true);
-
-			this._pointerDocListener = true;
-		}
-	},
-
-	_globalPointerDown: function (e) {
-		this._pointers[e.pointerId] = e;
-		this._pointersCount++;
-	},
-
-	_globalPointerMove: function (e) {
-		if (this._pointers[e.pointerId]) {
-			this._pointers[e.pointerId] = e;
-		}
-	},
-
-	_globalPointerUp: function (e) {
-		delete this._pointers[e.pointerId];
-		this._pointersCount--;
-	},
-
-	_handlePointer: function (e, handler) {
-		e.touches = [];
-		for (var i in this._pointers) {
-			e.touches.push(this._pointers[i]);
-		}
-		e.changedTouches = [e];
-
-		handler(e);
-	},
-
-	_addPointerMove: function (obj, handler, id) {
-		var onMove = L.bind(function (e) {
-			// don't fire touch moves when mouse isn't down
-			if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }
-
-			this._handlePointer(e, handler);
-		}, this);
-
-		obj['_leaflet_touchmove' + id] = onMove;
-		obj.addEventListener(this.POINTER_MOVE, onMove, false);
-	},
-
-	_addPointerEnd: function (obj, handler, id) {
-		var onUp = L.bind(function (e) {
-			this._handlePointer(e, handler);
-		}, this);
-
-		obj['_leaflet_touchend' + id] = onUp;
-		obj.addEventListener(this.POINTER_UP, onUp, false);
-		obj.addEventListener(this.POINTER_CANCEL, onUp, false);
-	}
-});
-
-
-
-/*
- * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.
- */
-
-// @namespace Map
-// @section Interaction Options
-L.Map.mergeOptions({
-	// @section Touch interaction options
-	// @option touchZoom: Boolean|String = *
-	// Whether the map can be zoomed by touch-dragging with two fingers. If
-	// passed `'center'`, it will zoom to the center of the view regardless of
-	// where the touch events (fingers) were. Enabled for touch-capable web
-	// browsers except for old Androids.
-	touchZoom: L.Browser.touch && !L.Browser.android23,
-
-	// @option bounceAtZoomLimits: Boolean = true
-	// Set it to false if you don't want the map to zoom beyond min/max zoom
-	// and then bounce back when pinch-zooming.
-	bounceAtZoomLimits: true
-});
-
-L.Map.TouchZoom = L.Handler.extend({
-	addHooks: function () {
-		L.DomUtil.addClass(this._map._container, 'leaflet-touch-zoom');
-		L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);
-	},
-
-	removeHooks: function () {
-		L.DomUtil.removeClass(this._map._container, 'leaflet-touch-zoom');
-		L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);
-	},
-
-	_onTouchStart: function (e) {
-		var map = this._map;
-		if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }
-
-		var p1 = map.mouseEventToContainerPoint(e.touches[0]),
-		    p2 = map.mouseEventToContainerPoint(e.touches[1]);
-
-		this._centerPoint = map.getSize()._divideBy(2);
-		this._startLatLng = map.containerPointToLatLng(this._centerPoint);
-		if (map.options.touchZoom !== 'center') {
-			this._pinchStartLatLng = map.containerPointToLatLng(p1.add(p2)._divideBy(2));
-		}
-
-		this._startDist = p1.distanceTo(p2);
-		this._startZoom = map.getZoom();
-
-		this._moved = false;
-		this._zooming = true;
-
-		map._stop();
-
-		L.DomEvent
-		    .on(document, 'touchmove', this._onTouchMove, this)
-		    .on(document, 'touchend', this._onTouchEnd, this);
-
-		L.DomEvent.preventDefault(e);
-	},
-
-	_onTouchMove: function (e) {
-		if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }
-
-		var map = this._map,
-		    p1 = map.mouseEventToContainerPoint(e.touches[0]),
-		    p2 = map.mouseEventToContainerPoint(e.touches[1]),
-		    scale = p1.distanceTo(p2) / this._startDist;
-
-
-		this._zoom = map.getScaleZoom(scale, this._startZoom);
-
-		if (!map.options.bounceAtZoomLimits && (
-			(this._zoom < map.getMinZoom() && scale < 1) ||
-			(this._zoom > map.getMaxZoom() && scale > 1))) {
-			this._zoom = map._limitZoom(this._zoom);
-		}
-
-		if (map.options.touchZoom === 'center') {
-			this._center = this._startLatLng;
-			if (scale === 1) { return; }
-		} else {
-			// Get delta from pinch to center, so centerLatLng is delta applied to initial pinchLatLng
-			var delta = p1._add(p2)._divideBy(2)._subtract(this._centerPoint);
-			if (scale === 1 && delta.x === 0 && delta.y === 0) { return; }
-			this._center = map.unproject(map.project(this._pinchStartLatLng, this._zoom).subtract(delta), this._zoom);
-		}
-
-		if (!this._moved) {
-			map._moveStart(true);
-			this._moved = true;
-		}
-
-		L.Util.cancelAnimFrame(this._animRequest);
-
-		var moveFn = L.bind(map._move, map, this._center, this._zoom, {pinch: true, round: false});
-		this._animRequest = L.Util.requestAnimFrame(moveFn, this, true);
-
-		L.DomEvent.preventDefault(e);
-	},
-
-	_onTouchEnd: function () {
-		if (!this._moved || !this._zooming) {
-			this._zooming = false;
-			return;
-		}
-
-		this._zooming = false;
-		L.Util.cancelAnimFrame(this._animRequest);
-
-		L.DomEvent
-		    .off(document, 'touchmove', this._onTouchMove)
-		    .off(document, 'touchend', this._onTouchEnd);
-
-		// Pinch updates GridLayers' levels only when zoomSnap is off, so zoomSnap becomes noUpdate.
-		if (this._map.options.zoomAnimation) {
-			this._map._animateZoom(this._center, this._map._limitZoom(this._zoom), true, this._map.options.zoomSnap);
-		} else {
-			this._map._resetView(this._center, this._map._limitZoom(this._zoom));
-		}
-	}
-});
-
-// @section Handlers
-// @property touchZoom: Handler
-// Touch zoom handler.
-L.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom);
-
-
-
-/*
- * L.Map.Tap is used to enable mobile hacks like quick taps and long hold.
- */
-
-// @namespace Map
-// @section Interaction Options
-L.Map.mergeOptions({
-	// @section Touch interaction options
-	// @option tap: Boolean = true
-	// Enables mobile hacks for supporting instant taps (fixing 200ms click
-	// delay on iOS/Android) and touch holds (fired as `contextmenu` events).
-	tap: true,
-
-	// @option tapTolerance: Number = 15
-	// The max number of pixels a user can shift his finger during touch
-	// for it to be considered a valid tap.
-	tapTolerance: 15
-});
-
-L.Map.Tap = L.Handler.extend({
-	addHooks: function () {
-		L.DomEvent.on(this._map._container, 'touchstart', this._onDown, this);
-	},
-
-	removeHooks: function () {
-		L.DomEvent.off(this._map._container, 'touchstart', this._onDown, this);
-	},
-
-	_onDown: function (e) {
-		if (!e.touches) { return; }
-
-		L.DomEvent.preventDefault(e);
-
-		this._fireClick = true;
-
-		// don't simulate click or track longpress if more than 1 touch
-		if (e.touches.length > 1) {
-			this._fireClick = false;
-			clearTimeout(this._holdTimeout);
-			return;
-		}
-
-		var first = e.touches[0],
-		    el = first.target;
-
-		this._startPos = this._newPos = new L.Point(first.clientX, first.clientY);
-
-		// if touching a link, highlight it
-		if (el.tagName && el.tagName.toLowerCase() === 'a') {
-			L.DomUtil.addClass(el, 'leaflet-active');
-		}
-
-		// simulate long hold but setting a timeout
-		this._holdTimeout = setTimeout(L.bind(function () {
-			if (this._isTapValid()) {
-				this._fireClick = false;
-				this._onUp();
-				this._simulateEvent('contextmenu', first);
-			}
-		}, this), 1000);
-
-		this._simulateEvent('mousedown', first);
-
-		L.DomEvent.on(document, {
-			touchmove: this._onMove,
-			touchend: this._onUp
-		}, this);
-	},
-
-	_onUp: function (e) {
-		clearTimeout(this._holdTimeout);
-
-		L.DomEvent.off(document, {
-			touchmove: this._onMove,
-			touchend: this._onUp
-		}, this);
-
-		if (this._fireClick && e && e.changedTouches) {
-
-			var first = e.changedTouches[0],
-			    el = first.target;
-
-			if (el && el.tagName && el.tagName.toLowerCase() === 'a') {
-				L.DomUtil.removeClass(el, 'leaflet-active');
-			}
-
-			this._simulateEvent('mouseup', first);
-
-			// simulate click if the touch didn't move too much
-			if (this._isTapValid()) {
-				this._simulateEvent('click', first);
-			}
-		}
-	},
-
-	_isTapValid: function () {
-		return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;
-	},
-
-	_onMove: function (e) {
-		var first = e.touches[0];
-		this._newPos = new L.Point(first.clientX, first.clientY);
-		this._simulateEvent('mousemove', first);
-	},
-
-	_simulateEvent: function (type, e) {
-		var simulatedEvent = document.createEvent('MouseEvents');
-
-		simulatedEvent._simulated = true;
-		e.target._simulatedClick = true;
-
-		simulatedEvent.initMouseEvent(
-		        type, true, true, window, 1,
-		        e.screenX, e.screenY,
-		        e.clientX, e.clientY,
-		        false, false, false, false, 0, null);
-
-		e.target.dispatchEvent(simulatedEvent);
-	}
-});
-
-// @section Handlers
-// @property tap: Handler
-// Mobile touch hacks (quick tap and touch hold) handler.
-if (L.Browser.touch && !L.Browser.pointer) {
-	L.Map.addInitHook('addHandler', 'tap', L.Map.Tap);
-}
-
-
-
-/*
- * L.Handler.BoxZoom is used to add shift-drag zoom interaction to the map
- * (zoom to a selected bounding box), enabled by default.
- */
-
-// @namespace Map
-// @section Interaction Options
-L.Map.mergeOptions({
-	// @option boxZoom: Boolean = true
-	// Whether the map can be zoomed to a rectangular area specified by
-	// dragging the mouse while pressing the shift key.
-	boxZoom: true
-});
-
-L.Map.BoxZoom = L.Handler.extend({
-	initialize: function (map) {
-		this._map = map;
-		this._container = map._container;
-		this._pane = map._panes.overlayPane;
-	},
-
-	addHooks: function () {
-		L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);
-	},
-
-	removeHooks: function () {
-		L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this);
-	},
-
-	moved: function () {
-		return this._moved;
-	},
-
-	_resetState: function () {
-		this._moved = false;
-	},
-
-	_onMouseDown: function (e) {
-		if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }
-
-		this._resetState();
-
-		L.DomUtil.disableTextSelection();
-		L.DomUtil.disableImageDrag();
-
-		this._startPoint = this._map.mouseEventToContainerPoint(e);
-
-		L.DomEvent.on(document, {
-			contextmenu: L.DomEvent.stop,
-			mousemove: this._onMouseMove,
-			mouseup: this._onMouseUp,
-			keydown: this._onKeyDown
-		}, this);
-	},
-
-	_onMouseMove: function (e) {
-		if (!this._moved) {
-			this._moved = true;
-
-			this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container);
-			L.DomUtil.addClass(this._container, 'leaflet-crosshair');
-
-			this._map.fire('boxzoomstart');
-		}
-
-		this._point = this._map.mouseEventToContainerPoint(e);
-
-		var bounds = new L.Bounds(this._point, this._startPoint),
-		    size = bounds.getSize();
-
-		L.DomUtil.setPosition(this._box, bounds.min);
-
-		this._box.style.width  = size.x + 'px';
-		this._box.style.height = size.y + 'px';
-	},
-
-	_finish: function () {
-		if (this._moved) {
-			L.DomUtil.remove(this._box);
-			L.DomUtil.removeClass(this._container, 'leaflet-crosshair');
-		}
-
-		L.DomUtil.enableTextSelection();
-		L.DomUtil.enableImageDrag();
-
-		L.DomEvent.off(document, {
-			contextmenu: L.DomEvent.stop,
-			mousemove: this._onMouseMove,
-			mouseup: this._onMouseUp,
-			keydown: this._onKeyDown
-		}, this);
-	},
-
-	_onMouseUp: function (e) {
-		if ((e.which !== 1) && (e.button !== 1)) { return; }
-
-		this._finish();
-
-		if (!this._moved) { return; }
-		// Postpone to next JS tick so internal click event handling
-		// still see it as "moved".
-		setTimeout(L.bind(this._resetState, this), 0);
-
-		var bounds = new L.LatLngBounds(
-		        this._map.containerPointToLatLng(this._startPoint),
-		        this._map.containerPointToLatLng(this._point));
-
-		this._map
-			.fitBounds(bounds)
-			.fire('boxzoomend', {boxZoomBounds: bounds});
-	},
-
-	_onKeyDown: function (e) {
-		if (e.keyCode === 27) {
-			this._finish();
-		}
-	}
-});
-
-// @section Handlers
-// @property boxZoom: Handler
-// Box (shift-drag with mouse) zoom handler.
-L.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom);
-
-
-
-/*
- * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.
- */
-
-// @namespace Map
-// @section Keyboard Navigation Options
-L.Map.mergeOptions({
-	// @option keyboard: Boolean = true
-	// Makes the map focusable and allows users to navigate the map with keyboard
-	// arrows and `+`/`-` keys.
-	keyboard: true,
-
-	// @option keyboardPanDelta: Number = 80
-	// Amount of pixels to pan when pressing an arrow key.
-	keyboardPanDelta: 80
-});
-
-L.Map.Keyboard = L.Handler.extend({
-
-	keyCodes: {
-		left:    [37],
-		right:   [39],
-		down:    [40],
-		up:      [38],
-		zoomIn:  [187, 107, 61, 171],
-		zoomOut: [189, 109, 54, 173]
-	},
-
-	initialize: function (map) {
-		this._map = map;
-
-		this._setPanDelta(map.options.keyboardPanDelta);
-		this._setZoomDelta(map.options.zoomDelta);
-	},
-
-	addHooks: function () {
-		var container = this._map._container;
-
-		// make the container focusable by tabbing
-		if (container.tabIndex <= 0) {
-			container.tabIndex = '0';
-		}
-
-		L.DomEvent.on(container, {
-			focus: this._onFocus,
-			blur: this._onBlur,
-			mousedown: this._onMouseDown
-		}, this);
-
-		this._map.on({
-			focus: this._addHooks,
-			blur: this._removeHooks
-		}, this);
-	},
-
-	removeHooks: function () {
-		this._removeHooks();
-
-		L.DomEvent.off(this._map._container, {
-			focus: this._onFocus,
-			blur: this._onBlur,
-			mousedown: this._onMouseDown
-		}, this);
-
-		this._map.off({
-			focus: this._addHooks,
-			blur: this._removeHooks
-		}, this);
-	},
-
-	_onMouseDown: function () {
-		if (this._focused) { return; }
-
-		var body = document.body,
-		    docEl = document.documentElement,
-		    top = body.scrollTop || docEl.scrollTop,
-		    left = body.scrollLeft || docEl.scrollLeft;
-
-		this._map._container.focus();
-
-		window.scrollTo(left, top);
-	},
-
-	_onFocus: function () {
-		this._focused = true;
-		this._map.fire('focus');
-	},
-
-	_onBlur: function () {
-		this._focused = false;
-		this._map.fire('blur');
-	},
-
-	_setPanDelta: function (panDelta) {
-		var keys = this._panKeys = {},
-		    codes = this.keyCodes,
-		    i, len;
-
-		for (i = 0, len = codes.left.length; i < len; i++) {
-			keys[codes.left[i]] = [-1 * panDelta, 0];
-		}
-		for (i = 0, len = codes.right.length; i < len; i++) {
-			keys[codes.right[i]] = [panDelta, 0];
-		}
-		for (i = 0, len = codes.down.length; i < len; i++) {
-			keys[codes.down[i]] = [0, panDelta];
-		}
-		for (i = 0, len = codes.up.length; i < len; i++) {
-			keys[codes.up[i]] = [0, -1 * panDelta];
-		}
-	},
-
-	_setZoomDelta: function (zoomDelta) {
-		var keys = this._zoomKeys = {},
-		    codes = this.keyCodes,
-		    i, len;
-
-		for (i = 0, len = codes.zoomIn.length; i < len; i++) {
-			keys[codes.zoomIn[i]] = zoomDelta;
-		}
-		for (i = 0, len = codes.zoomOut.length; i < len; i++) {
-			keys[codes.zoomOut[i]] = -zoomDelta;
-		}
-	},
-
-	_addHooks: function () {
-		L.DomEvent.on(document, 'keydown', this._onKeyDown, this);
-	},
-
-	_removeHooks: function () {
-		L.DomEvent.off(document, 'keydown', this._onKeyDown, this);
-	},
-
-	_onKeyDown: function (e) {
-		if (e.altKey || e.ctrlKey || e.metaKey) { return; }
-
-		var key = e.keyCode,
-		    map = this._map,
-		    offset;
-
-		if (key in this._panKeys) {
-
-			if (map._panAnim && map._panAnim._inProgress) { return; }
-
-			offset = this._panKeys[key];
-			if (e.shiftKey) {
-				offset = L.point(offset).multiplyBy(3);
-			}
-
-			map.panBy(offset);
-
-			if (map.options.maxBounds) {
-				map.panInsideBounds(map.options.maxBounds);
-			}
-
-		} else if (key in this._zoomKeys) {
-			map.setZoom(map.getZoom() + (e.shiftKey ? 3 : 1) * this._zoomKeys[key]);
-
-		} else if (key === 27) {
-			map.closePopup();
-
-		} else {
-			return;
-		}
-
-		L.DomEvent.stop(e);
-	}
-});
-
-// @section Handlers
-// @section Handlers
-// @property keyboard: Handler
-// Keyboard navigation handler.
-L.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard);
-
-
-
-/*
- * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.
- */
-
-
-/* @namespace Marker
- * @section Interaction handlers
- *
- * Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see `Handler` methods). Example:
- *
- * ```js
- * marker.dragging.disable();
- * ```
- *
- * @property dragging: Handler
- * Marker dragging handler (by both mouse and touch).
- */
-
-L.Handler.MarkerDrag = L.Handler.extend({
-	initialize: function (marker) {
-		this._marker = marker;
-	},
-
-	addHooks: function () {
-		var icon = this._marker._icon;
-
-		if (!this._draggable) {
-			this._draggable = new L.Draggable(icon, icon, true);
-		}
-
-		this._draggable.on({
-			dragstart: this._onDragStart,
-			drag: this._onDrag,
-			dragend: this._onDragEnd
-		}, this).enable();
-
-		L.DomUtil.addClass(icon, 'leaflet-marker-draggable');
-	},
-
-	removeHooks: function () {
-		this._draggable.off({
-			dragstart: this._onDragStart,
-			drag: this._onDrag,
-			dragend: this._onDragEnd
-		}, this).disable();
-
-		if (this._marker._icon) {
-			L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');
-		}
-	},
-
-	moved: function () {
-		return this._draggable && this._draggable._moved;
-	},
-
-	_onDragStart: function () {
-		// @section Dragging events
-		// @event dragstart: Event
-		// Fired when the user starts dragging the marker.
-
-		// @event movestart: Event
-		// Fired when the marker starts moving (because of dragging).
-
-		this._oldLatLng = this._marker.getLatLng();
-		this._marker
-		    .closePopup()
-		    .fire('movestart')
-		    .fire('dragstart');
-	},
-
-	_onDrag: function (e) {
-		var marker = this._marker,
-		    shadow = marker._shadow,
-		    iconPos = L.DomUtil.getPosition(marker._icon),
-		    latlng = marker._map.layerPointToLatLng(iconPos);
-
-		// update shadow position
-		if (shadow) {
-			L.DomUtil.setPosition(shadow, iconPos);
-		}
-
-		marker._latlng = latlng;
-		e.latlng = latlng;
-		e.oldLatLng = this._oldLatLng;
-
-		// @event drag: Event
-		// Fired repeatedly while the user drags the marker.
-		marker
-		    .fire('move', e)
-		    .fire('drag', e);
-	},
-
-	_onDragEnd: function (e) {
-		// @event dragend: DragEndEvent
-		// Fired when the user stops dragging the marker.
-
-		// @event moveend: Event
-		// Fired when the marker stops moving (because of dragging).
-		delete this._oldLatLng;
-		this._marker
-		    .fire('moveend')
-		    .fire('dragend', e);
-	}
-});
-
-
-
-/*
- * @class Control
- * @aka L.Control
- * @inherits Class
- *
- * L.Control is a base class for implementing map controls. Handles positioning.
- * All other controls extend from this class.
- */
-
-L.Control = L.Class.extend({
-	// @section
-	// @aka Control options
-	options: {
-		// @option position: String = 'topright'
-		// The position of the control (one of the map corners). Possible values are `'topleft'`,
-		// `'topright'`, `'bottomleft'` or `'bottomright'`
-		position: 'topright'
-	},
-
-	initialize: function (options) {
-		L.setOptions(this, options);
-	},
-
-	/* @section
-	 * Classes extending L.Control will inherit the following methods:
-	 *
-	 * @method getPosition: string
-	 * Returns the position of the control.
-	 */
-	getPosition: function () {
-		return this.options.position;
-	},
-
-	// @method setPosition(position: string): this
-	// Sets the position of the control.
-	setPosition: function (position) {
-		var map = this._map;
-
-		if (map) {
-			map.removeControl(this);
-		}
-
-		this.options.position = position;
-
-		if (map) {
-			map.addControl(this);
-		}
-
-		return this;
-	},
-
-	// @method getContainer: HTMLElement
-	// Returns the HTMLElement that contains the control.
-	getContainer: function () {
-		return this._container;
-	},
-
-	// @method addTo(map: Map): this
-	// Adds the control to the given map.
-	addTo: function (map) {
-		this.remove();
-		this._map = map;
-
-		var container = this._container = this.onAdd(map),
-		    pos = this.getPosition(),
-		    corner = map._controlCorners[pos];
-
-		L.DomUtil.addClass(container, 'leaflet-control');
-
-		if (pos.indexOf('bottom') !== -1) {
-			corner.insertBefore(container, corner.firstChild);
-		} else {
-			corner.appendChild(container);
-		}
-
-		return this;
-	},
-
-	// @method remove: this
-	// Removes the control from the map it is currently active on.
-	remove: function () {
-		if (!this._map) {
-			return this;
-		}
-
-		L.DomUtil.remove(this._container);
-
-		if (this.onRemove) {
-			this.onRemove(this._map);
-		}
-
-		this._map = null;
-
-		return this;
-	},
-
-	_refocusOnMap: function (e) {
-		// if map exists and event is not a keyboard event
-		if (this._map && e && e.screenX > 0 && e.screenY > 0) {
-			this._map.getContainer().focus();
-		}
-	}
-});
-
-L.control = function (options) {
-	return new L.Control(options);
-};
-
-/* @section Extension methods
- * @uninheritable
- *
- * Every control should extend from `L.Control` and (re-)implement the following methods.
- *
- * @method onAdd(map: Map): HTMLElement
- * Should return the container DOM element for the control and add listeners on relevant map events. Called on [`control.addTo(map)`](#control-addTo).
- *
- * @method onRemove(map: Map)
- * Optional method. Should contain all clean up code that removes the listeners previously added in [`onAdd`](#control-onadd). Called on [`control.remove()`](#control-remove).
- */
-
-/* @namespace Map
- * @section Methods for Layers and Controls
- */
-L.Map.include({
-	// @method addControl(control: Control): this
-	// Adds the given control to the map
-	addControl: function (control) {
-		control.addTo(this);
-		return this;
-	},
-
-	// @method removeControl(control: Control): this
-	// Removes the given control from the map
-	removeControl: function (control) {
-		control.remove();
-		return this;
-	},
-
-	_initControlPos: function () {
-		var corners = this._controlCorners = {},
-		    l = 'leaflet-',
-		    container = this._controlContainer =
-		            L.DomUtil.create('div', l + 'control-container', this._container);
-
-		function createCorner(vSide, hSide) {
-			var className = l + vSide + ' ' + l + hSide;
-
-			corners[vSide + hSide] = L.DomUtil.create('div', className, container);
-		}
-
-		createCorner('top', 'left');
-		createCorner('top', 'right');
-		createCorner('bottom', 'left');
-		createCorner('bottom', 'right');
-	},
-
-	_clearControlPos: function () {
-		L.DomUtil.remove(this._controlContainer);
-	}
-});
-
-
-
-/*
- * @class Control.Zoom
- * @aka L.Control.Zoom
- * @inherits Control
- *
- * A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its [`zoomControl` option](#map-zoomcontrol) to `false`. Extends `Control`.
- */
-
-L.Control.Zoom = L.Control.extend({
-	// @section
-	// @aka Control.Zoom options
-	options: {
-		position: 'topleft',
-
-		// @option zoomInText: String = '+'
-		// The text set on the 'zoom in' button.
-		zoomInText: '+',
-
-		// @option zoomInTitle: String = 'Zoom in'
-		// The title set on the 'zoom in' button.
-		zoomInTitle: 'Zoom in',
-
-		// @option zoomOutText: String = '-'
-		// The text set on the 'zoom out' button.
-		zoomOutText: '-',
-
-		// @option zoomOutTitle: String = 'Zoom out'
-		// The title set on the 'zoom out' button.
-		zoomOutTitle: 'Zoom out'
-	},
-
-	onAdd: function (map) {
-		var zoomName = 'leaflet-control-zoom',
-		    container = L.DomUtil.create('div', zoomName + ' leaflet-bar'),
-		    options = this.options;
-
-		this._zoomInButton  = this._createButton(options.zoomInText, options.zoomInTitle,
-		        zoomName + '-in',  container, this._zoomIn);
-		this._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle,
-		        zoomName + '-out', container, this._zoomOut);
-
-		this._updateDisabled();
-		map.on('zoomend zoomlevelschange', this._updateDisabled, this);
-
-		return container;
-	},
-
-	onRemove: function (map) {
-		map.off('zoomend zoomlevelschange', this._updateDisabled, this);
-	},
-
-	disable: function () {
-		this._disabled = true;
-		this._updateDisabled();
-		return this;
-	},
-
-	enable: function () {
-		this._disabled = false;
-		this._updateDisabled();
-		return this;
-	},
-
-	_zoomIn: function (e) {
-		if (!this._disabled && this._map._zoom < this._map.getMaxZoom()) {
-			this._map.zoomIn(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));
-		}
-	},
-
-	_zoomOut: function (e) {
-		if (!this._disabled && this._map._zoom > this._map.getMinZoom()) {
-			this._map.zoomOut(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));
-		}
-	},
-
-	_createButton: function (html, title, className, container, fn) {
-		var link = L.DomUtil.create('a', className, container);
-		link.innerHTML = html;
-		link.href = '#';
-		link.title = title;
-
-		/*
-		 * Will force screen readers like VoiceOver to read this as "Zoom in - button"
-		 */
-		link.setAttribute('role', 'button');
-		link.setAttribute('aria-label', title);
-
-		L.DomEvent
-		    .on(link, 'mousedown dblclick', L.DomEvent.stopPropagation)
-		    .on(link, 'click', L.DomEvent.stop)
-		    .on(link, 'click', fn, this)
-		    .on(link, 'click', this._refocusOnMap, this);
-
-		return link;
-	},
-
-	_updateDisabled: function () {
-		var map = this._map,
-		    className = 'leaflet-disabled';
-
-		L.DomUtil.removeClass(this._zoomInButton, className);
-		L.DomUtil.removeClass(this._zoomOutButton, className);
-
-		if (this._disabled || map._zoom === map.getMinZoom()) {
-			L.DomUtil.addClass(this._zoomOutButton, className);
-		}
-		if (this._disabled || map._zoom === map.getMaxZoom()) {
-			L.DomUtil.addClass(this._zoomInButton, className);
-		}
-	}
-});
-
-// @namespace Map
-// @section Control options
-// @option zoomControl: Boolean = true
-// Whether a [zoom control](#control-zoom) is added to the map by default.
-L.Map.mergeOptions({
-	zoomControl: true
-});
-
-L.Map.addInitHook(function () {
-	if (this.options.zoomControl) {
-		this.zoomControl = new L.Control.Zoom();
-		this.addControl(this.zoomControl);
-	}
-});
-
-// @namespace Control.Zoom
-// @factory L.control.zoom(options: Control.Zoom options)
-// Creates a zoom control
-L.control.zoom = function (options) {
-	return new L.Control.Zoom(options);
-};
-
-
-
-/*
- * @class Control.Attribution
- * @aka L.Control.Attribution
- * @inherits Control
- *
- * The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its [`attributionControl` option](#map-attributioncontrol) to `false`, and it fetches attribution texts from layers with the [`getAttribution` method](#layer-getattribution) automatically. Extends Control.
- */
-
-L.Control.Attribution = L.Control.extend({
-	// @section
-	// @aka Control.Attribution options
-	options: {
-		position: 'bottomright',
-
-		// @option prefix: String = 'Leaflet'
-		// The HTML text shown before the attributions. Pass `false` to disable.
-		prefix: '<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'
-	},
-
-	initialize: function (options) {
-		L.setOptions(this, options);
-
-		this._attributions = {};
-	},
-
-	onAdd: function (map) {
-		map.attributionControl = this;
-		this._container = L.DomUtil.create('div', 'leaflet-control-attribution');
-		if (L.DomEvent) {
-			L.DomEvent.disableClickPropagation(this._container);
-		}
-
-		// TODO ugly, refactor
-		for (var i in map._layers) {
-			if (map._layers[i].getAttribution) {
-				this.addAttribution(map._layers[i].getAttribution());
-			}
-		}
-
-		this._update();
-
-		return this._container;
-	},
-
-	// @method setPrefix(prefix: String): this
-	// Sets the text before the attributions.
-	setPrefix: function (prefix) {
-		this.options.prefix = prefix;
-		this._update();
-		return this;
-	},
-
-	// @method addAttribution(text: String): this
-	// Adds an attribution text (e.g. `'Vector data &copy; Mapbox'`).
-	addAttribution: function (text) {
-		if (!text) { return this; }
-
-		if (!this._attributions[text]) {
-			this._attributions[text] = 0;
-		}
-		this._attributions[text]++;
-
-		this._update();
-
-		return this;
-	},
-
-	// @method removeAttribution(text: String): this
-	// Removes an attribution text.
-	removeAttribution: function (text) {
-		if (!text) { return this; }
-
-		if (this._attributions[text]) {
-			this._attributions[text]--;
-			this._update();
-		}
-
-		return this;
-	},
-
-	_update: function () {
-		if (!this._map) { return; }
-
-		var attribs = [];
-
-		for (var i in this._attributions) {
-			if (this._attributions[i]) {
-				attribs.push(i);
-			}
-		}
-
-		var prefixAndAttribs = [];
-
-		if (this.options.prefix) {
-			prefixAndAttribs.push(this.options.prefix);
-		}
-		if (attribs.length) {
-			prefixAndAttribs.push(attribs.join(', '));
-		}
-
-		this._container.innerHTML = prefixAndAttribs.join(' | ');
-	}
-});
-
-// @namespace Map
-// @section Control options
-// @option attributionControl: Boolean = true
-// Whether a [attribution control](#control-attribution) is added to the map by default.
-L.Map.mergeOptions({
-	attributionControl: true
-});
-
-L.Map.addInitHook(function () {
-	if (this.options.attributionControl) {
-		new L.Control.Attribution().addTo(this);
-	}
-});
-
-// @namespace Control.Attribution
-// @factory L.control.attribution(options: Control.Attribution options)
-// Creates an attribution control.
-L.control.attribution = function (options) {
-	return new L.Control.Attribution(options);
-};
-
-
-
-/*
- * @class Control.Scale
- * @aka L.Control.Scale
- * @inherits Control
- *
- * A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends `Control`.
- *
- * @example
- *
- * ```js
- * L.control.scale().addTo(map);
- * ```
- */
-
-L.Control.Scale = L.Control.extend({
-	// @section
-	// @aka Control.Scale options
-	options: {
-		position: 'bottomleft',
-
-		// @option maxWidth: Number = 100
-		// Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).
-		maxWidth: 100,
-
-		// @option metric: Boolean = True
-		// Whether to show the metric scale line (m/km).
-		metric: true,
-
-		// @option imperial: Boolean = True
-		// Whether to show the imperial scale line (mi/ft).
-		imperial: true
-
-		// @option updateWhenIdle: Boolean = false
-		// If `true`, the control is updated on [`moveend`](#map-moveend), otherwise it's always up-to-date (updated on [`move`](#map-move)).
-	},
-
-	onAdd: function (map) {
-		var className = 'leaflet-control-scale',
-		    container = L.DomUtil.create('div', className),
-		    options = this.options;
-
-		this._addScales(options, className + '-line', container);
-
-		map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);
-		map.whenReady(this._update, this);
-
-		return container;
-	},
-
-	onRemove: function (map) {
-		map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);
-	},
-
-	_addScales: function (options, className, container) {
-		if (options.metric) {
-			this._mScale = L.DomUtil.create('div', className, container);
-		}
-		if (options.imperial) {
-			this._iScale = L.DomUtil.create('div', className, container);
-		}
-	},
-
-	_update: function () {
-		var map = this._map,
-		    y = map.getSize().y / 2;
-
-		var maxMeters = map.distance(
-				map.containerPointToLatLng([0, y]),
-				map.containerPointToLatLng([this.options.maxWidth, y]));
-
-		this._updateScales(maxMeters);
-	},
-
-	_updateScales: function (maxMeters) {
-		if (this.options.metric && maxMeters) {
-			this._updateMetric(maxMeters);
-		}
-		if (this.options.imperial && maxMeters) {
-			this._updateImperial(maxMeters);
-		}
-	},
-
-	_updateMetric: function (maxMeters) {
-		var meters = this._getRoundNum(maxMeters),
-		    label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';
-
-		this._updateScale(this._mScale, label, meters / maxMeters);
-	},
-
-	_updateImperial: function (maxMeters) {
-		var maxFeet = maxMeters * 3.2808399,
-		    maxMiles, miles, feet;
-
-		if (maxFeet > 5280) {
-			maxMiles = maxFeet / 5280;
-			miles = this._getRoundNum(maxMiles);
-			this._updateScale(this._iScale, miles + ' mi', miles / maxMiles);
-
-		} else {
-			feet = this._getRoundNum(maxFeet);
-			this._updateScale(this._iScale, feet + ' ft', feet / maxFeet);
-		}
-	},
-
-	_updateScale: function (scale, text, ratio) {
-		scale.style.width = Math.round(this.options.maxWidth * ratio) + 'px';
-		scale.innerHTML = text;
-	},
-
-	_getRoundNum: function (num) {
-		var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),
-		    d = num / pow10;
-
-		d = d >= 10 ? 10 :
-		    d >= 5 ? 5 :
-		    d >= 3 ? 3 :
-		    d >= 2 ? 2 : 1;
-
-		return pow10 * d;
-	}
-});
-
-
-// @factory L.control.scale(options?: Control.Scale options)
-// Creates an scale control with the given options.
-L.control.scale = function (options) {
-	return new L.Control.Scale(options);
-};
-
-
-
-/*
- * @class Control.Layers
- * @aka L.Control.Layers
- * @inherits Control
- *
- * The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the [detailed example](http://leafletjs.com/examples/layers-control.html)). Extends `Control`.
- *
- * @example
- *
- * ```js
- * var baseLayers = {
- * 	"Mapbox": mapbox,
- * 	"OpenStreetMap": osm
- * };
- *
- * var overlays = {
- * 	"Marker": marker,
- * 	"Roads": roadsLayer
- * };
- *
- * L.control.layers(baseLayers, overlays).addTo(map);
- * ```
- *
- * The `baseLayers` and `overlays` parameters are object literals with layer names as keys and `Layer` objects as values:
- *
- * ```js
- * {
- *     "<someName1>": layer1,
- *     "<someName2>": layer2
- * }
- * ```
- *
- * The layer names can contain HTML, which allows you to add additional styling to the items:
- *
- * ```js
- * {"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>": myLayer}
- * ```
- */
-
-
-L.Control.Layers = L.Control.extend({
-	// @section
-	// @aka Control.Layers options
-	options: {
-		// @option collapsed: Boolean = true
-		// If `true`, the control will be collapsed into an icon and expanded on mouse hover or touch.
-		collapsed: true,
-		position: 'topright',
-
-		// @option autoZIndex: Boolean = true
-		// If `true`, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.
-		autoZIndex: true,
-
-		// @option hideSingleBase: Boolean = false
-		// If `true`, the base layers in the control will be hidden when there is only one.
-		hideSingleBase: false,
-
-		// @option sortLayers: Boolean = false
-		// Whether to sort the layers. When `false`, layers will keep the order
-		// in which they were added to the control.
-		sortLayers: false,
-
-		// @option sortFunction: Function = *
-		// A [compare function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)
-		// that will be used for sorting the layers, when `sortLayers` is `true`.
-		// The function receives both the `L.Layer` instances and their names, as in
-		// `sortFunction(layerA, layerB, nameA, nameB)`.
-		// By default, it sorts layers alphabetically by their name.
-		sortFunction: function (layerA, layerB, nameA, nameB) {
-			return nameA < nameB ? -1 : (nameB < nameA ? 1 : 0);
-		}
-	},
-
-	initialize: function (baseLayers, overlays, options) {
-		L.setOptions(this, options);
-
-		this._layers = [];
-		this._lastZIndex = 0;
-		this._handlingClick = false;
-
-		for (var i in baseLayers) {
-			this._addLayer(baseLayers[i], i);
-		}
-
-		for (i in overlays) {
-			this._addLayer(overlays[i], i, true);
-		}
-	},
-
-	onAdd: function (map) {
-		this._initLayout();
-		this._update();
-
-		this._map = map;
-		map.on('zoomend', this._checkDisabledLayers, this);
-
-		return this._container;
-	},
-
-	onRemove: function () {
-		this._map.off('zoomend', this._checkDisabledLayers, this);
-
-		for (var i = 0; i < this._layers.length; i++) {
-			this._layers[i].layer.off('add remove', this._onLayerChange, this);
-		}
-	},
-
-	// @method addBaseLayer(layer: Layer, name: String): this
-	// Adds a base layer (radio button entry) with the given name to the control.
-	addBaseLayer: function (layer, name) {
-		this._addLayer(layer, name);
-		return (this._map) ? this._update() : this;
-	},
-
-	// @method addOverlay(layer: Layer, name: String): this
-	// Adds an overlay (checkbox entry) with the given name to the control.
-	addOverlay: function (layer, name) {
-		this._addLayer(layer, name, true);
-		return (this._map) ? this._update() : this;
-	},
-
-	// @method removeLayer(layer: Layer): this
-	// Remove the given layer from the control.
-	removeLayer: function (layer) {
-		layer.off('add remove', this._onLayerChange, this);
-
-		var obj = this._getLayer(L.stamp(layer));
-		if (obj) {
-			this._layers.splice(this._layers.indexOf(obj), 1);
-		}
-		return (this._map) ? this._update() : this;
-	},
-
-	// @method expand(): this
-	// Expand the control container if collapsed.
-	expand: function () {
-		L.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded');
-		this._form.style.height = null;
-		var acceptableHeight = this._map.getSize().y - (this._container.offsetTop + 50);
-		if (acceptableHeight < this._form.clientHeight) {
-			L.DomUtil.addClass(this._form, 'leaflet-control-layers-scrollbar');
-			this._form.style.height = acceptableHeight + 'px';
-		} else {
-			L.DomUtil.removeClass(this._form, 'leaflet-control-layers-scrollbar');
-		}
-		this._checkDisabledLayers();
-		return this;
-	},
-
-	// @method collapse(): this
-	// Collapse the control container if expanded.
-	collapse: function () {
-		L.DomUtil.removeClass(this._container, 'leaflet-control-layers-expanded');
-		return this;
-	},
-
-	_initLayout: function () {
-		var className = 'leaflet-control-layers',
-		    container = this._container = L.DomUtil.create('div', className),
-		    collapsed = this.options.collapsed;
-
-		// makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released
-		container.setAttribute('aria-haspopup', true);
-
-		L.DomEvent.disableClickPropagation(container);
-		if (!L.Browser.touch) {
-			L.DomEvent.disableScrollPropagation(container);
-		}
-
-		var form = this._form = L.DomUtil.create('form', className + '-list');
-
-		if (collapsed) {
-			this._map.on('click', this.collapse, this);
-
-			if (!L.Browser.android) {
-				L.DomEvent.on(container, {
-					mouseenter: this.expand,
-					mouseleave: this.collapse
-				}, this);
-			}
-		}
-
-		var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container);
-		link.href = '#';
-		link.title = 'Layers';
-
-		if (L.Browser.touch) {
-			L.DomEvent
-			    .on(link, 'click', L.DomEvent.stop)
-			    .on(link, 'click', this.expand, this);
-		} else {
-			L.DomEvent.on(link, 'focus', this.expand, this);
-		}
-
-		// work around for Firefox Android issue https://github.com/Leaflet/Leaflet/issues/2033
-		L.DomEvent.on(form, 'click', function () {
-			setTimeout(L.bind(this._onInputClick, this), 0);
-		}, this);
-
-		// TODO keyboard accessibility
-
-		if (!collapsed) {
-			this.expand();
-		}
-
-		this._baseLayersList = L.DomUtil.create('div', className + '-base', form);
-		this._separator = L.DomUtil.create('div', className + '-separator', form);
-		this._overlaysList = L.DomUtil.create('div', className + '-overlays', form);
-
-		container.appendChild(form);
-	},
-
-	_getLayer: function (id) {
-		for (var i = 0; i < this._layers.length; i++) {
-
-			if (this._layers[i] && L.stamp(this._layers[i].layer) === id) {
-				return this._layers[i];
-			}
-		}
-	},
-
-	_addLayer: function (layer, name, overlay) {
-		layer.on('add remove', this._onLayerChange, this);
-
-		this._layers.push({
-			layer: layer,
-			name: name,
-			overlay: overlay
-		});
-
-		if (this.options.sortLayers) {
-			this._layers.sort(L.bind(function (a, b) {
-				return this.options.sortFunction(a.layer, b.layer, a.name, b.name);
-			}, this));
-		}
-
-		if (this.options.autoZIndex && layer.setZIndex) {
-			this._lastZIndex++;
-			layer.setZIndex(this._lastZIndex);
-		}
-	},
-
-	_update: function () {
-		if (!this._container) { return this; }
-
-		L.DomUtil.empty(this._baseLayersList);
-		L.DomUtil.empty(this._overlaysList);
-
-		var baseLayersPresent, overlaysPresent, i, obj, baseLayersCount = 0;
-
-		for (i = 0; i < this._layers.length; i++) {
-			obj = this._layers[i];
-			this._addItem(obj);
-			overlaysPresent = overlaysPresent || obj.overlay;
-			baseLayersPresent = baseLayersPresent || !obj.overlay;
-			baseLayersCount += !obj.overlay ? 1 : 0;
-		}
-
-		// Hide base layers section if there's only one layer.
-		if (this.options.hideSingleBase) {
-			baseLayersPresent = baseLayersPresent && baseLayersCount > 1;
-			this._baseLayersList.style.display = baseLayersPresent ? '' : 'none';
-		}
-
-		this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';
-
-		return this;
-	},
-
-	_onLayerChange: function (e) {
-		if (!this._handlingClick) {
-			this._update();
-		}
-
-		var obj = this._getLayer(L.stamp(e.target));
-
-		// @namespace Map
-		// @section Layer events
-		// @event baselayerchange: LayersControlEvent
-		// Fired when the base layer is changed through the [layer control](#control-layers).
-		// @event overlayadd: LayersControlEvent
-		// Fired when an overlay is selected through the [layer control](#control-layers).
-		// @event overlayremove: LayersControlEvent
-		// Fired when an overlay is deselected through the [layer control](#control-layers).
-		// @namespace Control.Layers
-		var type = obj.overlay ?
-			(e.type === 'add' ? 'overlayadd' : 'overlayremove') :
-			(e.type === 'add' ? 'baselayerchange' : null);
-
-		if (type) {
-			this._map.fire(type, obj);
-		}
-	},
-
-	// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)
-	_createRadioElement: function (name, checked) {
-
-		var radioHtml = '<input type="radio" class="leaflet-control-layers-selector" name="' +
-				name + '"' + (checked ? ' checked="checked"' : '') + '/>';
-
-		var radioFragment = document.createElement('div');
-		radioFragment.innerHTML = radioHtml;
-
-		return radioFragment.firstChild;
-	},
-
-	_addItem: function (obj) {
-		var label = document.createElement('label'),
-		    checked = this._map.hasLayer(obj.layer),
-		    input;
-
-		if (obj.overlay) {
-			input = document.createElement('input');
-			input.type = 'checkbox';
-			input.className = 'leaflet-control-layers-selector';
-			input.defaultChecked = checked;
-		} else {
-			input = this._createRadioElement('leaflet-base-layers', checked);
-		}
-
-		input.layerId = L.stamp(obj.layer);
-
-		L.DomEvent.on(input, 'click', this._onInputClick, this);
-
-		var name = document.createElement('span');
-		name.innerHTML = ' ' + obj.name;
-
-		// Helps from preventing layer control flicker when checkboxes are disabled
-		// https://github.com/Leaflet/Leaflet/issues/2771
-		var holder = document.createElement('div');
-
-		label.appendChild(holder);
-		holder.appendChild(input);
-		holder.appendChild(name);
-
-		var container = obj.overlay ? this._overlaysList : this._baseLayersList;
-		container.appendChild(label);
-
-		this._checkDisabledLayers();
-		return label;
-	},
-
-	_onInputClick: function () {
-		var inputs = this._form.getElementsByTagName('input'),
-		    input, layer, hasLayer;
-		var addedLayers = [],
-		    removedLayers = [];
-
-		this._handlingClick = true;
-
-		for (var i = inputs.length - 1; i >= 0; i--) {
-			input = inputs[i];
-			layer = this._getLayer(input.layerId).layer;
-			hasLayer = this._map.hasLayer(layer);
-
-			if (input.checked && !hasLayer) {
-				addedLayers.push(layer);
-
-			} else if (!input.checked && hasLayer) {
-				removedLayers.push(layer);
-			}
-		}
-
-		// Bugfix issue 2318: Should remove all old layers before readding new ones
-		for (i = 0; i < removedLayers.length; i++) {
-			this._map.removeLayer(removedLayers[i]);
-		}
-		for (i = 0; i < addedLayers.length; i++) {
-			this._map.addLayer(addedLayers[i]);
-		}
-
-		this._handlingClick = false;
-
-		this._refocusOnMap();
-	},
-
-	_checkDisabledLayers: function () {
-		var inputs = this._form.getElementsByTagName('input'),
-		    input,
-		    layer,
-		    zoom = this._map.getZoom();
-
-		for (var i = inputs.length - 1; i >= 0; i--) {
-			input = inputs[i];
-			layer = this._getLayer(input.layerId).layer;
-			input.disabled = (layer.options.minZoom !== undefined && zoom < layer.options.minZoom) ||
-			                 (layer.options.maxZoom !== undefined && zoom > layer.options.maxZoom);
-
-		}
-	},
-
-	_expand: function () {
-		// Backward compatibility, remove me in 1.1.
-		return this.expand();
-	},
-
-	_collapse: function () {
-		// Backward compatibility, remove me in 1.1.
-		return this.collapse();
-	}
-
-});
-
-
-// @factory L.control.layers(baselayers?: Object, overlays?: Object, options?: Control.Layers options)
-// Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.
-L.control.layers = function (baseLayers, overlays, options) {
-	return new L.Control.Layers(baseLayers, overlays, options);
-};
-
-
-
-}(window, document));
-//# sourceMappingURL=leaflet-src.map
\ No newline at end of file
--- a/src/pyams_gis/resources/js/leaflet-1.0.3.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-(function(f,b,h){var a={version:"1.0.3+ed36a04"};function d(){var i=f.L;a.noConflict=function(){f.L=i;return this};f.L=a}if(typeof module==="object"&&typeof module.exports==="object"){module.exports=a}else{if(typeof define==="function"&&define.amd){define(a)}}if(typeof f!=="undefined"){d()}a.Util={extend:function(m){var n,l,k,o;for(l=1,k=arguments.length;l<k;l++){o=arguments[l];for(n in o){m[n]=o[n]}}return m},create:Object.create||(function(){function i(){}return function(j){i.prototype=j;return new i()}})(),bind:function(j,k){var l=Array.prototype.slice;if(j.bind){return j.bind.apply(j,l.call(arguments,1))}var i=l.call(arguments,2);return function(){return j.apply(k,i.length?i.concat(l.call(arguments)):arguments)}},stamp:function(i){i._leaflet_id=i._leaflet_id||++a.Util.lastId;return i._leaflet_id},lastId:0,throttle:function(n,o,m){var l,k,j,i;i=function(){l=false;if(k){j.apply(m,k);k=false}};j=function(){if(l){k=arguments}else{n.apply(m,arguments);setTimeout(i,o);l=true}};return j},wrapNum:function(j,k,m){var i=k[1],l=k[0],n=i-l;return j===i&&m?j:((j-l)%n+n)%n+l},falseFn:function(){return false},formatNum:function(i,k){var j=Math.pow(10,k||5);return Math.round(i*j)/j},trim:function(i){return i.trim?i.trim():i.replace(/^\s+|\s+$/g,"")},splitWords:function(i){return a.Util.trim(i).split(/\s+/)},setOptions:function(l,j){if(!l.hasOwnProperty("options")){l.options=l.options?a.Util.create(l.options):{}}for(var k in j){l.options[k]=j[k]}return l.options},getParamString:function(m,j,k){var n=[];for(var l in m){n.push(encodeURIComponent(k?l.toUpperCase():l)+"="+encodeURIComponent(m[l]))}return((!j||j.indexOf("?")===-1)?"?":"&")+n.join("&")},template:function(j,i){return j.replace(a.Util.templateRe,function(m,k){var l=i[k];if(l===h){throw new Error("No value provided for variable "+m)}else{if(typeof l==="function"){l=l(i)}}return l})},templateRe:/\{ *([\w_\-]+) *\}/g,isArray:Array.isArray||function(i){return(Object.prototype.toString.call(i)==="[object Array]")},indexOf:function(l,k){for(var j=0;j<l.length;j++){if(l[j]===k){return j}}return -1},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="};(function(){function l(n){return f["webkit"+n]||f["moz"+n]||f["ms"+n]}var m=0;function j(n){var p=+new Date(),o=Math.max(0,16-(p-m));m=p+o;return f.setTimeout(n,o)}var i=f.requestAnimationFrame||l("RequestAnimationFrame")||j,k=f.cancelAnimationFrame||l("CancelAnimationFrame")||l("CancelRequestAnimationFrame")||function(n){f.clearTimeout(n)};a.Util.requestAnimFrame=function(p,o,n){if(n&&i===j){p.call(o)}else{return i.call(f,a.bind(p,o))}};a.Util.cancelAnimFrame=function(n){if(n){k.call(f,n)}}})();a.extend=a.Util.extend;a.bind=a.Util.bind;a.stamp=a.Util.stamp;a.setOptions=a.Util.setOptions;a.Class=function(){};a.Class.extend=function(k){var n=function(){if(this.initialize){this.initialize.apply(this,arguments)}this.callInitHooks()};var m=n.__super__=this.prototype;var l=a.Util.create(m);l.constructor=n;n.prototype=l;for(var j in this){if(this.hasOwnProperty(j)&&j!=="prototype"){n[j]=this[j]}}if(k.statics){a.extend(n,k.statics);delete k.statics}if(k.includes){a.Util.extend.apply(null,[l].concat(k.includes));delete k.includes}if(l.options){k.options=a.Util.extend(a.Util.create(l.options),k.options)}a.extend(l,k);l._initHooks=[];l.callInitHooks=function(){if(this._initHooksCalled){return}if(m.callInitHooks){m.callInitHooks.call(this)}this._initHooksCalled=true;for(var p=0,o=l._initHooks.length;p<o;p++){l._initHooks[p].call(this)}};return n};a.Class.include=function(i){a.extend(this.prototype,i);return this};a.Class.mergeOptions=function(i){a.extend(this.prototype.options,i);return this};a.Class.addInitHook=function(j){var i=Array.prototype.slice.call(arguments,1);var k=typeof j==="function"?j:function(){this[j].apply(this,i)};this.prototype._initHooks=this.prototype._initHooks||[];this.prototype._initHooks.push(k);return this};a.Evented=a.Class.extend({on:function(m,o,l){if(typeof m==="object"){for(var n in m){this._on(n,m[n],o)}}else{m=a.Util.splitWords(m);for(var k=0,j=m.length;k<j;k++){this._on(m[k],o,l)}}return this},off:function(m,o,l){if(!m){delete this._events}else{if(typeof m==="object"){for(var n in m){this._off(n,m[n],o)}}else{m=a.Util.splitWords(m);for(var k=0,j=m.length;k<j;k++){this._off(m[k],o,l)}}}return this},_on:function(q,p,n){this._events=this._events||{};var k=this._events[q];if(!k){k=[];this._events[q]=k}if(n===this){n=h}var l={fn:p,ctx:n},o=k;for(var m=0,j=o.length;m<j;m++){if(o[m].fn===p&&o[m].ctx===n){return}}o.push(l)},_off:function(q,p,n){var o,m,j;if(!this._events){return}o=this._events[q];if(!o){return}if(!p){for(m=0,j=o.length;m<j;m++){o[m].fn=a.Util.falseFn}delete this._events[q];return}if(n===this){n=h}if(o){for(m=0,j=o.length;m<j;m++){var k=o[m];if(k.ctx!==n){continue}if(k.fn===p){k.fn=a.Util.falseFn;if(this._firingCount){this._events[q]=o=o.slice()}o.splice(m,1);return}}}},fire:function(p,r,k){if(!this.listens(p,k)){return this}var q=a.Util.extend({},r,{type:p,target:this});if(this._events){var o=this._events[p];if(o){this._firingCount=(this._firingCount+1)||1;for(var n=0,j=o.length;n<j;n++){var m=o[n];m.fn.call(m.ctx||this,q)}this._firingCount--}}if(k){this._propagateEvent(q)}return this},listens:function(k,i){var j=this._events&&this._events[k];if(j&&j.length){return true}if(i){for(var l in this._eventParents){if(this._eventParents[l].listens(k,i)){return true}}}return false},once:function(j,m,i){if(typeof j==="object"){for(var l in j){this.once(l,j[l],m)}return this}var k=a.bind(function(){this.off(j,m,i).off(j,k,i)},this);return this.on(j,m,i).on(j,k,i)},addEventParent:function(i){this._eventParents=this._eventParents||{};this._eventParents[a.stamp(i)]=i;return this},removeEventParent:function(i){if(this._eventParents){delete this._eventParents[a.stamp(i)]}return this},_propagateEvent:function(i){for(var j in this._eventParents){this._eventParents[j].fire(i.type,a.extend({layer:i.target},i),true)}}});var e=a.Evented.prototype;e.addEventListener=e.on;e.removeEventListener=e.clearAllEventListeners=e.off;e.addOneTimeEventListener=e.once;e.fireEvent=e.fire;e.hasEventListeners=e.listens;a.Mixin={Events:e};(function(){var l=navigator.userAgent.toLowerCase(),u=b.documentElement,k="ActiveXObject" in f,v=l.indexOf("webkit")!==-1,x=l.indexOf("phantom")!==-1,s=l.search("android [23]")!==-1,q=l.indexOf("chrome")!==-1,m=l.indexOf("gecko")!==-1&&!v&&!f.opera&&!k,t=navigator.platform.indexOf("Win")===0,j=typeof orientation!=="undefined"||l.indexOf("mobile")!==-1,o=!f.PointerEvent&&f.MSPointerEvent,i=f.PointerEvent||o,r=k&&("transition" in u.style),w=("WebKitCSSMatrix" in f)&&("m11" in new f.WebKitCSSMatrix())&&!s,n="MozPerspective" in u.style,y="OTransition" in u.style;var p=!f.L_NO_TOUCH&&(i||"ontouchstart" in f||(f.DocumentTouch&&b instanceof f.DocumentTouch));a.Browser={ie:k,ielt9:k&&!b.addEventListener,edge:"msLaunchUri" in navigator&&!("documentMode" in b),webkit:v,gecko:m,android:l.indexOf("android")!==-1,android23:s,chrome:q,safari:!q&&l.indexOf("safari")!==-1,win:t,ie3d:r,webkit3d:w,gecko3d:n,opera12:y,any3d:!f.L_DISABLE_3D&&(r||w||n)&&!y&&!x,mobile:j,mobileWebkit:j&&v,mobileWebkit3d:j&&w,mobileOpera:j&&f.opera,mobileGecko:j&&m,touch:!!p,msPointer:!!o,pointer:!!i,retina:(f.devicePixelRatio||(f.screen.deviceXDPI/f.screen.logicalXDPI))>1}}());a.Point=function(i,k,j){this.x=(j?Math.round(i):i);this.y=(j?Math.round(k):k)};a.Point.prototype={clone:function(){return new a.Point(this.x,this.y)},add:function(i){return this.clone()._add(a.point(i))},_add:function(i){this.x+=i.x;this.y+=i.y;return this},subtract:function(i){return this.clone()._subtract(a.point(i))},_subtract:function(i){this.x-=i.x;this.y-=i.y;return this},divideBy:function(i){return this.clone()._divideBy(i)},_divideBy:function(i){this.x/=i;this.y/=i;return this},multiplyBy:function(i){return this.clone()._multiplyBy(i)},_multiplyBy:function(i){this.x*=i;this.y*=i;return this},scaleBy:function(i){return new a.Point(this.x*i.x,this.y*i.y)},unscaleBy:function(i){return new a.Point(this.x/i.x,this.y/i.y)},round:function(){return this.clone()._round()},_round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},floor:function(){return this.clone()._floor()},_floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){return this.clone()._ceil()},_ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},distanceTo:function(j){j=a.point(j);var i=j.x-this.x,k=j.y-this.y;return Math.sqrt(i*i+k*k)},equals:function(i){i=a.point(i);return i.x===this.x&&i.y===this.y},contains:function(i){i=a.point(i);return Math.abs(i.x)<=Math.abs(this.x)&&Math.abs(i.y)<=Math.abs(this.y)},toString:function(){return"Point("+a.Util.formatNum(this.x)+", "+a.Util.formatNum(this.y)+")"}};a.point=function(i,k,j){if(i instanceof a.Point){return i}if(a.Util.isArray(i)){return new a.Point(i[0],i[1])}if(i===h||i===null){return i}if(typeof i==="object"&&"x" in i&&"y" in i){return new a.Point(i.x,i.y)}return new a.Point(i,k,j)};a.Bounds=function(l,k){if(!l){return}var n=k?[l,k]:l;for(var m=0,j=n.length;m<j;m++){this.extend(n[m])}};a.Bounds.prototype={extend:function(i){i=a.point(i);if(!this.min&&!this.max){this.min=i.clone();this.max=i.clone()}else{this.min.x=Math.min(i.x,this.min.x);this.max.x=Math.max(i.x,this.max.x);this.min.y=Math.min(i.y,this.min.y);this.max.y=Math.max(i.y,this.max.y)}return this},getCenter:function(i){return new a.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,i)},getBottomLeft:function(){return new a.Point(this.min.x,this.max.y)},getTopRight:function(){return new a.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(k){var j,i;if(typeof k[0]==="number"||k instanceof a.Point){k=a.point(k)}else{k=a.bounds(k)}if(k instanceof a.Bounds){j=k.min;i=k.max}else{j=i=k}return(j.x>=this.min.x)&&(i.x<=this.max.x)&&(j.y>=this.min.y)&&(i.y<=this.max.y)},intersects:function(n){n=a.bounds(n);var l=this.min,i=this.max,m=n.min,j=n.max,k=(j.x>=l.x)&&(m.x<=i.x),o=(j.y>=l.y)&&(m.y<=i.y);return k&&o},overlaps:function(o){o=a.bounds(o);var l=this.min,i=this.max,n=o.min,j=o.max,m=(j.x>l.x)&&(n.x<i.x),k=(j.y>l.y)&&(n.y<i.y);return m&&k},isValid:function(){return !!(this.min&&this.max)}};a.bounds=function(j,i){if(!j||j instanceof a.Bounds){return j}return new a.Bounds(j,i)};a.Transformation=function(j,i,l,k){this._a=j;this._b=i;this._c=l;this._d=k};a.Transformation.prototype={transform:function(i,j){return this._transform(i.clone(),j)},_transform:function(i,j){j=j||1;i.x=j*(this._a*i.x+this._b);i.y=j*(this._c*i.y+this._d);return i},untransform:function(i,j){j=j||1;return new a.Point((i.x/j-this._b)/this._a,(i.y/j-this._d)/this._c)}};a.DomUtil={get:function(i){return typeof i==="string"?b.getElementById(i):i},getStyle:function(k,j){var l=k.style[j]||(k.currentStyle&&k.currentStyle[j]);if((!l||l==="auto")&&b.defaultView){var i=b.defaultView.getComputedStyle(k,null);l=i?i[j]:null}return l==="auto"?null:l},create:function(j,l,i){var k=b.createElement(j);k.className=l||"";if(i){i.appendChild(k)}return k},remove:function(j){var i=j.parentNode;if(i){i.removeChild(j)}},empty:function(i){while(i.firstChild){i.removeChild(i.firstChild)}},toFront:function(i){i.parentNode.appendChild(i)},toBack:function(j){var i=j.parentNode;i.insertBefore(j,i.firstChild)},hasClass:function(k,i){if(k.classList!==h){return k.classList.contains(i)}var j=a.DomUtil.getClass(k);return j.length>0&&new RegExp("(^|\\s)"+i+"(\\s|$)").test(j)},addClass:function(o,k){if(o.classList!==h){var m=a.Util.splitWords(k);for(var l=0,j=m.length;l<j;l++){o.classList.add(m[l])}}else{if(!a.DomUtil.hasClass(o,k)){var n=a.DomUtil.getClass(o);a.DomUtil.setClass(o,(n?n+" ":"")+k)}}},removeClass:function(j,i){if(j.classList!==h){j.classList.remove(i)}else{a.DomUtil.setClass(j,a.Util.trim((" "+a.DomUtil.getClass(j)+" ").replace(" "+i+" "," ")))}},setClass:function(j,i){if(j.className.baseVal===h){j.className=i}else{j.className.baseVal=i}},getClass:function(i){return i.className.baseVal===h?i.className:i.className.baseVal},setOpacity:function(i,j){if("opacity" in i.style){i.style.opacity=j}else{if("filter" in i.style){a.DomUtil._setOpacityIE(i,j)}}},_setOpacityIE:function(k,l){var j=false,i="DXImageTransform.Microsoft.Alpha";try{j=k.filters.item(i)}catch(m){if(l===1){return}}l=Math.round(l*100);if(j){j.Enabled=(l!==100);j.Opacity=l}else{k.style.filter+=" progid:"+i+"(opacity="+l+")"}},testProp:function(l){var k=b.documentElement.style;for(var j=0;j<l.length;j++){if(l[j] in k){return l[j]}}return false},setTransform:function(i,k,j){var l=k||new a.Point(0,0);i.style[a.DomUtil.TRANSFORM]=(a.Browser.ie3d?"translate("+l.x+"px,"+l.y+"px)":"translate3d("+l.x+"px,"+l.y+"px,0)")+(j?" scale("+j+")":"")},setPosition:function(j,i){j._leaflet_pos=i;if(a.Browser.any3d){a.DomUtil.setTransform(j,i)}else{j.style.left=i.x+"px";j.style.top=i.y+"px"}},getPosition:function(i){return i._leaflet_pos||new a.Point(0,0)}};(function(){a.DomUtil.TRANSFORM=a.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]);var j=a.DomUtil.TRANSITION=a.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]);a.DomUtil.TRANSITION_END=j==="webkitTransition"||j==="OTransition"?j+"End":"transitionend";if("onselectstart" in b){a.DomUtil.disableTextSelection=function(){a.DomEvent.on(f,"selectstart",a.DomEvent.preventDefault)};a.DomUtil.enableTextSelection=function(){a.DomEvent.off(f,"selectstart",a.DomEvent.preventDefault)}}else{var i=a.DomUtil.testProp(["userSelect","WebkitUserSelect","OUserSelect","MozUserSelect","msUserSelect"]);a.DomUtil.disableTextSelection=function(){if(i){var k=b.documentElement.style;this._userSelect=k[i];k[i]="none"}};a.DomUtil.enableTextSelection=function(){if(i){b.documentElement.style[i]=this._userSelect;delete this._userSelect}}}a.DomUtil.disableImageDrag=function(){a.DomEvent.on(f,"dragstart",a.DomEvent.preventDefault)};a.DomUtil.enableImageDrag=function(){a.DomEvent.off(f,"dragstart",a.DomEvent.preventDefault)};a.DomUtil.preventOutline=function(k){while(k.tabIndex===-1){k=k.parentNode}if(!k||!k.style){return}a.DomUtil.restoreOutline();this._outlineElement=k;this._outlineStyle=k.style.outline;k.style.outline="none";a.DomEvent.on(f,"keydown",a.DomUtil.restoreOutline,this)};a.DomUtil.restoreOutline=function(){if(!this._outlineElement){return}this._outlineElement.style.outline=this._outlineStyle;delete this._outlineElement;delete this._outlineStyle;a.DomEvent.off(f,"keydown",a.DomUtil.restoreOutline,this)}})();a.LatLng=function(k,i,j){if(isNaN(k)||isNaN(i)){throw new Error("Invalid LatLng object: ("+k+", "+i+")")}this.lat=+k;this.lng=+i;if(j!==h){this.alt=+j}};a.LatLng.prototype={equals:function(k,i){if(!k){return false}k=a.latLng(k);var j=Math.max(Math.abs(this.lat-k.lat),Math.abs(this.lng-k.lng));return j<=(i===h?1e-9:i)},toString:function(i){return"LatLng("+a.Util.formatNum(this.lat,i)+", "+a.Util.formatNum(this.lng,i)+")"},distanceTo:function(i){return a.CRS.Earth.distance(this,a.latLng(i))},wrap:function(){return a.CRS.Earth.wrapLatLng(this)},toBounds:function(j){var k=180*j/40075017,i=k/Math.cos((Math.PI/180)*this.lat);return a.latLngBounds([this.lat-k,this.lng-i],[this.lat+k,this.lng+i])},clone:function(){return new a.LatLng(this.lat,this.lng,this.alt)}};a.latLng=function(j,i,k){if(j instanceof a.LatLng){return j}if(a.Util.isArray(j)&&typeof j[0]!=="object"){if(j.length===3){return new a.LatLng(j[0],j[1],j[2])}if(j.length===2){return new a.LatLng(j[0],j[1])}return null}if(j===h||j===null){return j}if(typeof j==="object"&&"lat" in j){return new a.LatLng(j.lat,"lng" in j?j.lng:j.lon,j.alt)}if(i===h){return null}return new a.LatLng(j,i,k)};a.LatLngBounds=function(m,l){if(!m){return}var k=l?[m,l]:m;for(var n=0,j=k.length;n<j;n++){this.extend(k[n])}};a.LatLngBounds.prototype={extend:function(m){var i=this._southWest,l=this._northEast,j,k;if(m instanceof a.LatLng){j=m;k=m}else{if(m instanceof a.LatLngBounds){j=m._southWest;k=m._northEast;if(!j||!k){return this}}else{return m?this.extend(a.latLng(m)||a.latLngBounds(m)):this}}if(!i&&!l){this._southWest=new a.LatLng(j.lat,j.lng);this._northEast=new a.LatLng(k.lat,k.lng)}else{i.lat=Math.min(j.lat,i.lat);i.lng=Math.min(j.lng,i.lng);l.lat=Math.max(k.lat,l.lat);l.lng=Math.max(k.lng,l.lng)}return this},pad:function(l){var j=this._southWest,m=this._northEast,i=Math.abs(j.lat-m.lat)*l,k=Math.abs(j.lng-m.lng)*l;return new a.LatLngBounds(new a.LatLng(j.lat-i,j.lng-k),new a.LatLng(m.lat+i,m.lng+k))},getCenter:function(){return new a.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new a.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new a.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(m){if(typeof m[0]==="number"||m instanceof a.LatLng||"lat" in m){m=a.latLng(m)}else{m=a.latLngBounds(m)}var i=this._southWest,l=this._northEast,j,k;if(m instanceof a.LatLngBounds){j=m.getSouthWest();k=m.getNorthEast()}else{j=k=m}return(j.lat>=i.lat)&&(k.lat<=l.lat)&&(j.lng>=i.lng)&&(k.lng<=l.lng)},intersects:function(l){l=a.latLngBounds(l);var i=this._southWest,o=this._northEast,j=l.getSouthWest(),n=l.getNorthEast(),m=(n.lat>=i.lat)&&(j.lat<=o.lat),k=(n.lng>=i.lng)&&(j.lng<=o.lng);return m&&k},overlaps:function(m){m=a.latLngBounds(m);var i=this._southWest,o=this._northEast,j=m.getSouthWest(),n=m.getNorthEast(),l=(n.lat>i.lat)&&(j.lat<o.lat),k=(n.lng>i.lng)&&(j.lng<o.lng);return l&&k},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(i){if(!i){return false}i=a.latLngBounds(i);return this._southWest.equals(i.getSouthWest())&&this._northEast.equals(i.getNorthEast())},isValid:function(){return !!(this._southWest&&this._northEast)}};a.latLngBounds=function(j,i){if(j instanceof a.LatLngBounds){return j}return new a.LatLngBounds(j,i)};a.Projection={};a.Projection.LonLat={project:function(i){return new a.Point(i.lng,i.lat)},unproject:function(i){return new a.LatLng(i.y,i.x)},bounds:a.bounds([-180,-90],[180,90])};a.Projection.SphericalMercator={R:6378137,MAX_LATITUDE:85.0511287798,project:function(m){var l=Math.PI/180,i=this.MAX_LATITUDE,k=Math.max(Math.min(i,m.lat),-i),j=Math.sin(k*l);return new a.Point(this.R*m.lng*l,this.R*Math.log((1+j)/(1-j))/2)},unproject:function(i){var j=180/Math.PI;return new a.LatLng((2*Math.atan(Math.exp(i.y/this.R))-(Math.PI/2))*j,i.x*j/this.R)},bounds:(function(){var i=6378137*Math.PI;return a.bounds([-i,-i],[i,i])})()};a.CRS={latLngToPoint:function(l,j){var i=this.projection.project(l),k=this.scale(j);return this.transformation._transform(i,k)},pointToLatLng:function(i,k){var l=this.scale(k),j=this.transformation.untransform(i,l);return this.projection.unproject(j)},project:function(i){return this.projection.project(i)},unproject:function(i){return this.projection.unproject(i)},scale:function(i){return 256*Math.pow(2,i)},zoom:function(i){return Math.log(i/256)/Math.LN2},getProjectedBounds:function(m){if(this.infinite){return null}var j=this.projection.bounds,l=this.scale(m),k=this.transformation.transform(j.min,l),i=this.transformation.transform(j.max,l);return a.bounds(k,i)},infinite:false,wrapLatLng:function(l){var i=this.wrapLng?a.Util.wrapNum(l.lng,this.wrapLng,true):l.lng,k=this.wrapLat?a.Util.wrapNum(l.lat,this.wrapLat,true):l.lat,j=l.alt;return a.latLng(k,i,j)},wrapLatLngBounds:function(i){var j=i.getCenter(),k=this.wrapLatLng(j),n=j.lat-k.lat,o=j.lng-k.lng;if(n===0&&o===0){return i}var p=i.getSouthWest(),l=i.getNorthEast(),q=a.latLng({lat:p.lat-n,lng:p.lng-o}),m=a.latLng({lat:l.lat-n,lng:l.lng-o});return new a.LatLngBounds(q,m)}};a.CRS.Simple=a.extend({},a.CRS,{projection:a.Projection.LonLat,transformation:new a.Transformation(1,0,-1,0),scale:function(i){return Math.pow(2,i)},zoom:function(i){return Math.log(i)/Math.LN2},distance:function(i,l){var k=l.lng-i.lng,j=l.lat-i.lat;return Math.sqrt(k*k+j*j)},infinite:true});a.CRS.Earth=a.extend({},a.CRS,{wrapLng:[-180,180],R:6371000,distance:function(j,n){var i=Math.PI/180,m=j.lat*i,l=n.lat*i,k=Math.sin(m)*Math.sin(l)+Math.cos(m)*Math.cos(l)*Math.cos((n.lng-j.lng)*i);return this.R*Math.acos(Math.min(k,1))}});a.CRS.EPSG3857=a.extend({},a.CRS.Earth,{code:"EPSG:3857",projection:a.Projection.SphericalMercator,transformation:(function(){var i=0.5/(Math.PI*a.Projection.SphericalMercator.R);return new a.Transformation(i,0.5,-i,0.5)}())});a.CRS.EPSG900913=a.extend({},a.CRS.EPSG3857,{code:"EPSG:900913"});a.CRS.EPSG4326=a.extend({},a.CRS.Earth,{code:"EPSG:4326",projection:a.Projection.LonLat,transformation:new a.Transformation(1/180,1,-1/180,0.5)});a.Map=a.Evented.extend({options:{crs:a.CRS.EPSG3857,center:h,zoom:h,minZoom:h,maxZoom:h,layers:[],maxBounds:h,renderer:h,zoomAnimation:true,zoomAnimationThreshold:4,fadeAnimation:true,markerZoomAnimation:true,transform3DLimit:8388608,zoomSnap:1,zoomDelta:1,trackResize:true},initialize:function(j,i){i=a.setOptions(this,i);this._initContainer(j);this._initLayout();this._onResize=a.bind(this._onResize,this);this._initEvents();if(i.maxBounds){this.setMaxBounds(i.maxBounds)}if(i.zoom!==h){this._zoom=this._limitZoom(i.zoom)}if(i.center&&i.zoom!==h){this.setView(a.latLng(i.center),i.zoom,{reset:true})}this._handlers=[];this._layers={};this._zoomBoundLayers={};this._sizeChanged=true;this.callInitHooks();this._zoomAnimated=a.DomUtil.TRANSITION&&a.Browser.any3d&&!a.Browser.mobileOpera&&this.options.zoomAnimation;if(this._zoomAnimated){this._createAnimProxy();a.DomEvent.on(this._proxy,a.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}this._addLayers(this.options.layers)},setView:function(i,l,j){l=l===h?this._zoom:this._limitZoom(l);i=this._limitCenter(a.latLng(i),l,this.options.maxBounds);j=j||{};this._stop();if(this._loaded&&!j.reset&&j!==true){if(j.animate!==h){j.zoom=a.extend({animate:j.animate},j.zoom);j.pan=a.extend({animate:j.animate,duration:j.duration},j.pan)}var k=(this._zoom!==l)?this._tryAnimatedZoom&&this._tryAnimatedZoom(i,l,j.zoom):this._tryAnimatedPan(i,j.pan);if(k){clearTimeout(this._sizeTimer);return this}}this._resetView(i,l);return this},setZoom:function(j,i){if(!this._loaded){this._zoom=j;return this}return this.setView(this.getCenter(),j,{zoom:i})},zoomIn:function(j,i){j=j||(a.Browser.any3d?this.options.zoomDelta:1);return this.setZoom(this._zoom+j,i)},zoomOut:function(j,i){j=j||(a.Browser.any3d?this.options.zoomDelta:1);return this.setZoom(this._zoom-j,i)},setZoomAround:function(p,n,m){var o=this.getZoomScale(n),l=this.getSize().divideBy(2),k=p instanceof a.Point?p:this.latLngToContainerPoint(p),i=k.subtract(l).multiplyBy(1-1/o),j=this.containerPointToLatLng(l.add(i));return this.setView(j,n,{zoom:m})},_getBoundsCenterZoom:function(j,q){q=q||{};j=j.getBounds?j.getBounds():a.latLngBounds(j);var l=a.point(q.paddingTopLeft||q.padding||[0,0]),k=a.point(q.paddingBottomRight||q.padding||[0,0]),p=this.getBoundsZoom(j,false,l.add(k));p=(typeof q.maxZoom==="number")?Math.min(q.maxZoom,p):p;var n=k.subtract(l).divideBy(2),o=this.project(j.getSouthWest(),p),m=this.project(j.getNorthEast(),p),i=this.unproject(o.add(m).divideBy(2).add(n),p);return{center:i,zoom:p}},fitBounds:function(j,i){j=a.latLngBounds(j);if(!j.isValid()){throw new Error("Bounds are not valid.")}var k=this._getBoundsCenterZoom(j,i);return this.setView(k.center,k.zoom,i)},fitWorld:function(i){return this.fitBounds([[-90,-180],[90,180]],i)},panTo:function(i,j){return this.setView(i,this._zoom,{pan:j})},panBy:function(k,i){k=a.point(k).round();i=i||{};if(!k.x&&!k.y){return this.fire("moveend")}if(i.animate!==true&&!this.getSize().contains(k)){this._resetView(this.unproject(this.project(this.getCenter()).add(k)),this.getZoom());return this}if(!this._panAnim){this._panAnim=new a.PosAnimation();this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)}if(!i.noMoveStart){this.fire("movestart")}if(i.animate!==false){a.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var j=this._getMapPanePos().subtract(k).round();this._panAnim.run(this._mapPane,j,i.duration||0.25,i.easeLinearity)}else{this._rawPanBy(k);this.fire("move").fire("moveend")}return this},flyTo:function(F,C,n){n=n||{};if(n.animate===false||!a.Browser.any3d){return this.setView(F,C,n)}this._stop();var G=this.project(this.getCenter()),l=this.project(F),E=this.getSize(),s=this._zoom;F=a.latLng(F);C=C===h?s:C;var z=Math.max(E.x,E.y),y=z*this.getZoomScale(s,C),I=(l.distanceTo(G))||1,k=1.42,q=k*k;function D(K){var J=K?-1:1,w=K?y:z,N=y*y-z*z+J*q*q*I*I,u=2*w*q*I,r=N/u,M=Math.sqrt(r*r+1)-r;var L=M<1e-9?-18:Math.log(M);return L}function v(r){return(Math.exp(r)-Math.exp(-r))/2}function j(r){return(Math.exp(r)+Math.exp(-r))/2}function m(r){return v(r)/j(r)}var H=D(0);function x(r){return z*(j(H)/j(H+k*r))}function A(r){return z*(j(H)*m(H+k*r)-v(H))/q}function t(r){return 1-Math.pow(1-r,1.5)}var p=Date.now(),o=(D(1)-H)/k,i=n.duration?1000*n.duration:1000*o*0.8;function B(){var r=(Date.now()-p)/i,u=t(r)*o;if(r<=1){this._flyToFrame=a.Util.requestAnimFrame(B,this);this._move(this.unproject(G.add(l.subtract(G).multiplyBy(A(u)/I)),s),this.getScaleZoom(z/x(u),s),{flyTo:true})}else{this._move(F,C)._moveEnd(true)}}this._moveStart(true);B.call(this);return this},flyToBounds:function(j,i){var k=this._getBoundsCenterZoom(j,i);return this.flyTo(k.center,k.zoom,i)},setMaxBounds:function(i){i=a.latLngBounds(i);if(!i.isValid()){this.options.maxBounds=null;return this.off("moveend",this._panInsideMaxBounds)}else{if(this.options.maxBounds){this.off("moveend",this._panInsideMaxBounds)}}this.options.maxBounds=i;if(this._loaded){this._panInsideMaxBounds()}return this.on("moveend",this._panInsideMaxBounds)},setMinZoom:function(i){this.options.minZoom=i;if(this._loaded&&this.getZoom()<this.options.minZoom){return this.setZoom(i)}return this},setMaxZoom:function(i){this.options.maxZoom=i;if(this._loaded&&(this.getZoom()>this.options.maxZoom)){return this.setZoom(i)}return this},panInsideBounds:function(l,k){this._enforcingBounds=true;var i=this.getCenter(),j=this._limitCenter(i,this._zoom,a.latLngBounds(l));if(!i.equals(j)){this.panTo(j,k)}this._enforcingBounds=false;return this},invalidateSize:function(k){if(!this._loaded){return this}k=a.extend({animate:false,pan:true},k===true?{animate:true}:k);var l=this.getSize();this._sizeChanged=true;this._lastCenter=null;var j=this.getSize(),n=l.divideBy(2).round(),i=j.divideBy(2).round(),m=n.subtract(i);if(!m.x&&!m.y){return this}if(k.animate&&k.pan){this.panBy(m)}else{if(k.pan){this._rawPanBy(m)}this.fire("move");if(k.debounceMoveend){clearTimeout(this._sizeTimer);this._sizeTimer=setTimeout(a.bind(this.fire,this,"moveend"),200)}else{this.fire("moveend")}}return this.fire("resize",{oldSize:l,newSize:j})},stop:function(){this.setZoom(this._limitZoom(this._zoom));if(!this.options.zoomSnap){this.fire("viewreset")}return this._stop()},locate:function(i){i=this._locateOptions=a.extend({timeout:10000,watch:false},i);if(!("geolocation" in navigator)){this._handleGeolocationError({code:0,message:"Geolocation not supported."});return this}var k=a.bind(this._handleGeolocationResponse,this),j=a.bind(this._handleGeolocationError,this);if(i.watch){this._locationWatchId=navigator.geolocation.watchPosition(k,j,i)}else{navigator.geolocation.getCurrentPosition(k,j,i)}return this},stopLocate:function(){if(navigator.geolocation&&navigator.geolocation.clearWatch){navigator.geolocation.clearWatch(this._locationWatchId)}if(this._locateOptions){this._locateOptions.setView=false}return this},_handleGeolocationError:function(i){var k=i.code,j=i.message||(k===1?"permission denied":(k===2?"position unavailable":"timeout"));if(this._locateOptions.setView&&!this._loaded){this.fitWorld()}this.fire("locationerror",{code:k,message:"Geolocation error: "+j+"."})},_handleGeolocationResponse:function(o){var n=o.coords.latitude,p=o.coords.longitude,k=new a.LatLng(n,p),j=k.toBounds(o.coords.accuracy),r=this._locateOptions;if(r.setView){var q=this.getBoundsZoom(j);this.setView(k,r.maxZoom?Math.min(q,r.maxZoom):q)}var m={latlng:k,bounds:j,timestamp:o.timestamp};for(var l in o.coords){if(typeof o.coords[l]==="number"){m[l]=o.coords[l]}}this.fire("locationfound",m)},addHandler:function(i,k){if(!k){return this}var j=this[i]=new k(this);this._handlers.push(j);if(this.options[i]){j.enable()}return this},remove:function(){this._initEvents(true);if(this._containerId!==this._container._leaflet_id){throw new Error("Map container is being reused by another instance")}try{delete this._container._leaflet_id;delete this._containerId}catch(k){this._container._leaflet_id=h;this._containerId=h}a.DomUtil.remove(this._mapPane);if(this._clearControlPos){this._clearControlPos()}this._clearHandlers();if(this._loaded){this.fire("unload")}for(var j in this._layers){this._layers[j].remove()}return this},createPane:function(j,i){var k="leaflet-pane"+(j?" leaflet-"+j.replace("Pane","")+"-pane":""),l=a.DomUtil.create("div",k,i||this._mapPane);if(j){this._panes[j]=l}return l},getCenter:function(){this._checkIfLoaded();if(this._lastCenter&&!this._moved()){return this._lastCenter}return this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var j=this.getPixelBounds(),i=this.unproject(j.getBottomLeft()),k=this.unproject(j.getTopRight());return new a.LatLngBounds(i,k)},getMinZoom:function(){return this.options.minZoom===h?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===h?(this._layersMaxZoom===h?Infinity:this._layersMaxZoom):this.options.maxZoom},getBoundsZoom:function(i,l,q){i=a.latLngBounds(i);q=a.point(q||[0,0]);var r=this.getZoom()||0,m=this.getMinZoom(),p=this.getMaxZoom(),n=i.getNorthWest(),o=i.getSouthEast(),t=this.getSize().subtract(q),s=a.bounds(this.project(o,r),this.project(n,r)).getSize(),k=a.Browser.any3d?this.options.zoomSnap:1;var j=Math.min(t.x/s.x,t.y/s.y);r=this.getScaleZoom(j,r);if(k){r=Math.round(r/(k/100))*(k/100);r=l?Math.ceil(r/k)*k:Math.floor(r/k)*k}return Math.max(m,Math.min(p,r))},getSize:function(){if(!this._size||this._sizeChanged){this._size=new a.Point(this._container.clientWidth||0,this._container.clientHeight||0);this._sizeChanged=false}return this._size.clone()},getPixelBounds:function(i,k){var j=this._getTopLeftPoint(i,k);return new a.Bounds(j,j.add(this.getSize()))},getPixelOrigin:function(){this._checkIfLoaded();return this._pixelOrigin},getPixelWorldBounds:function(i){return this.options.crs.getProjectedBounds(i===h?this.getZoom():i)},getPane:function(i){return typeof i==="string"?this._panes[i]:i},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(j,k){var i=this.options.crs;k=k===h?this._zoom:k;return i.scale(j)/i.scale(k)},getScaleZoom:function(l,k){var i=this.options.crs;k=k===h?this._zoom:k;var j=i.zoom(l*i.scale(k));return isNaN(j)?Infinity:j},project:function(j,i){i=i===h?this._zoom:i;return this.options.crs.latLngToPoint(a.latLng(j),i)},unproject:function(i,j){j=j===h?this._zoom:j;return this.options.crs.pointToLatLng(a.point(i),j)},layerPointToLatLng:function(i){var j=a.point(i).add(this.getPixelOrigin());return this.unproject(j)},latLngToLayerPoint:function(j){var i=this.project(a.latLng(j))._round();return i._subtract(this.getPixelOrigin())},wrapLatLng:function(i){return this.options.crs.wrapLatLng(a.latLng(i))},wrapLatLngBounds:function(i){return this.options.crs.wrapLatLngBounds(a.latLngBounds(i))},distance:function(i,j){return this.options.crs.distance(a.latLng(i),a.latLng(j))},containerPointToLayerPoint:function(i){return a.point(i).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(i){return a.point(i).add(this._getMapPanePos())},containerPointToLatLng:function(i){var j=this.containerPointToLayerPoint(a.point(i));return this.layerPointToLatLng(j)},latLngToContainerPoint:function(i){return this.layerPointToContainerPoint(this.latLngToLayerPoint(a.latLng(i)))},mouseEventToContainerPoint:function(i){return a.DomEvent.getMousePosition(i,this._container)},mouseEventToLayerPoint:function(i){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(i))},mouseEventToLatLng:function(i){return this.layerPointToLatLng(this.mouseEventToLayerPoint(i))},_initContainer:function(j){var i=this._container=a.DomUtil.get(j);if(!i){throw new Error("Map container not found.")}else{if(i._leaflet_id){throw new Error("Map container is already initialized.")}}a.DomEvent.addListener(i,"scroll",this._onScroll,this);this._containerId=a.Util.stamp(i)},_initLayout:function(){var j=this._container;this._fadeAnimated=this.options.fadeAnimation&&a.Browser.any3d;a.DomUtil.addClass(j,"leaflet-container"+(a.Browser.touch?" leaflet-touch":"")+(a.Browser.retina?" leaflet-retina":"")+(a.Browser.ielt9?" leaflet-oldie":"")+(a.Browser.safari?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":""));var i=a.DomUtil.getStyle(j,"position");if(i!=="absolute"&&i!=="relative"&&i!=="fixed"){j.style.position="relative"}this._initPanes();if(this._initControlPos){this._initControlPos()}},_initPanes:function(){var i=this._panes={};this._paneRenderers={};this._mapPane=this.createPane("mapPane",this._container);a.DomUtil.setPosition(this._mapPane,new a.Point(0,0));this.createPane("tilePane");this.createPane("shadowPane");this.createPane("overlayPane");this.createPane("markerPane");this.createPane("tooltipPane");this.createPane("popupPane");if(!this.options.markerZoomAnimation){a.DomUtil.addClass(i.markerPane,"leaflet-zoom-hide");a.DomUtil.addClass(i.shadowPane,"leaflet-zoom-hide")}},_resetView:function(j,k){a.DomUtil.setPosition(this._mapPane,new a.Point(0,0));var l=!this._loaded;this._loaded=true;k=this._limitZoom(k);this.fire("viewprereset");var i=this._zoom!==k;this._moveStart(i)._move(j,k)._moveEnd(i);this.fire("viewreset");if(l){this.fire("load")}},_moveStart:function(i){if(i){this.fire("zoomstart")}return this.fire("movestart")},_move:function(j,k,l){if(k===h){k=this._zoom}var i=this._zoom!==k;this._zoom=k;this._lastCenter=j;this._pixelOrigin=this._getNewPixelOrigin(j);if(i||(l&&l.pinch)){this.fire("zoom",l)}return this.fire("move",l)},_moveEnd:function(i){if(i){this.fire("zoomend")}return this.fire("moveend")},_stop:function(){a.Util.cancelAnimFrame(this._flyToFrame);if(this._panAnim){this._panAnim.stop()}return this},_rawPanBy:function(i){a.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(i))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){if(!this._enforcingBounds){this.panInsideBounds(this.options.maxBounds)}},_checkIfLoaded:function(){if(!this._loaded){throw new Error("Set map center and zoom first.")}},_initEvents:function(j){if(!a.DomEvent){return}this._targets={};this._targets[a.stamp(this._container)]=this;var i=j?"off":"on";a.DomEvent[i](this._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress",this._handleDOMEvent,this);if(this.options.trackResize){a.DomEvent[i](f,"resize",this._onResize,this)}if(a.Browser.any3d&&this.options.transform3DLimit){this[i]("moveend",this._onMoveEnd)}},_onResize:function(){a.Util.cancelAnimFrame(this._resizeRequest);this._resizeRequest=a.Util.requestAnimFrame(function(){this.invalidateSize({debounceMoveend:true})},this)},_onScroll:function(){this._container.scrollTop=0;this._container.scrollLeft=0},_onMoveEnd:function(){var i=this._getMapPanePos();if(Math.max(Math.abs(i.x),Math.abs(i.y))>=this.options.transform3DLimit){this._resetView(this.getCenter(),this.getZoom())}},_findEventTargets:function(n,j){var i=[],m,l=j==="mouseout"||j==="mouseover",o=n.target||n.srcElement,k=false;while(o){m=this._targets[a.stamp(o)];if(m&&(j==="click"||j==="preclick")&&!n._simulated&&this._draggableMoved(m)){k=true;break}if(m&&m.listens(j,true)){if(l&&!a.DomEvent._isExternalTarget(o,n)){break}i.push(m);if(l){break}}if(o===this._container){break}o=o.parentNode}if(!i.length&&!k&&!l&&a.DomEvent._isExternalTarget(o,n)){i=[this]}return i},_handleDOMEvent:function(j){if(!this._loaded||a.DomEvent._skipped(j)){return}var i=j.type==="keypress"&&j.keyCode===13?"click":j.type;if(i==="mousedown"){a.DomUtil.preventOutline(j.target||j.srcElement)}this._fireDOMEvent(j,i)},_fireDOMEvent:function(p,m,j){if(p.type==="click"){var k=a.Util.extend({},p);k.type="preclick";this._fireDOMEvent(k,k.type,j)}if(p._stopped){return}j=(j||[]).concat(this._findEventTargets(p,m));if(!j.length){return}var o=j[0];if(m==="contextmenu"&&o.listens(m,true)){a.DomEvent.preventDefault(p)}var n={originalEvent:p};if(p.type!=="keypress"){var q=o instanceof a.Marker;n.containerPoint=q?this.latLngToContainerPoint(o.getLatLng()):this.mouseEventToContainerPoint(p);n.layerPoint=this.containerPointToLayerPoint(n.containerPoint);n.latlng=q?o.getLatLng():this.layerPointToLatLng(n.layerPoint)}for(var l=0;l<j.length;l++){j[l].fire(m,n,true);if(n.originalEvent._stopped||(j[l].options.nonBubblingEvents&&a.Util.indexOf(j[l].options.nonBubblingEvents,m)!==-1)){return}}},_draggableMoved:function(i){i=i.dragging&&i.dragging.enabled()?i:this;return(i.dragging&&i.dragging.moved())||(this.boxZoom&&this.boxZoom.moved())},_clearHandlers:function(){for(var k=0,j=this._handlers.length;k<j;k++){this._handlers[k].disable()}},whenReady:function(j,i){if(this._loaded){j.call(i||this,{target:this})}else{this.on("load",j,i)}return this},_getMapPanePos:function(){return a.DomUtil.getPosition(this._mapPane)||new a.Point(0,0)},_moved:function(){var i=this._getMapPanePos();return i&&!i.equals([0,0])},_getTopLeftPoint:function(i,k){var j=i&&k!==h?this._getNewPixelOrigin(i,k):this.getPixelOrigin();return j.subtract(this._getMapPanePos())},_getNewPixelOrigin:function(i,k){var j=this.getSize()._divideBy(2);return this.project(i,k)._subtract(j)._add(this._getMapPanePos())._round()},_latLngToNewLayerPoint:function(l,k,i){var j=this._getNewPixelOrigin(i,k);return this.project(l,k)._subtract(j)},_latLngBoundsToNewLayerBounds:function(l,k,i){var j=this._getNewPixelOrigin(i,k);return a.bounds([this.project(l.getSouthWest(),k)._subtract(j),this.project(l.getNorthWest(),k)._subtract(j),this.project(l.getSouthEast(),k)._subtract(j),this.project(l.getNorthEast(),k)._subtract(j)])},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(i){return this.latLngToLayerPoint(i).subtract(this._getCenterLayerPoint())},_limitCenter:function(i,l,k){if(!k){return i}var o=this.project(i,l),j=this.getSize().divideBy(2),m=new a.Bounds(o.subtract(j),o.add(j)),n=this._getBoundsOffset(m,k,l);if(n.round().equals([0,0])){return i}return this.unproject(o.add(n),l)},_limitOffset:function(l,i){if(!i){return l}var k=this.getPixelBounds(),j=new a.Bounds(k.min.add(l),k.max.add(l));return l.add(this._getBoundsOffset(j,i))},_getBoundsOffset:function(n,k,o){var j=a.bounds(this.project(k.getNorthEast(),o),this.project(k.getSouthWest(),o)),p=j.min.subtract(n.min),m=j.max.subtract(n.max),l=this._rebound(p.x,-m.x),i=this._rebound(p.y,-m.y);return new a.Point(l,i)},_rebound:function(j,i){return j+i>0?Math.round(j-i)/2:Math.max(0,Math.ceil(j))-Math.max(0,Math.floor(i))},_limitZoom:function(l){var k=this.getMinZoom(),j=this.getMaxZoom(),i=a.Browser.any3d?this.options.zoomSnap:1;if(i){l=Math.round(l/i)*i}return Math.max(k,Math.min(j,l))},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){a.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim");this.fire("moveend")},_tryAnimatedPan:function(i,j){var k=this._getCenterOffset(i)._floor();if((j&&j.animate)!==true&&!this.getSize().contains(k)){return false}this.panBy(k,j);return true},_createAnimProxy:function(){var i=this._proxy=a.DomUtil.create("div","leaflet-proxy leaflet-zoom-animated");this._panes.mapPane.appendChild(i);this.on("zoomanim",function(k){var l=a.DomUtil.TRANSFORM,j=i.style[l];a.DomUtil.setTransform(i,this.project(k.center,k.zoom),this.getZoomScale(k.zoom,1));if(j===i.style[l]&&this._animatingZoom){this._onZoomTransitionEnd()}},this);this.on("load moveend",function(){var k=this.getCenter(),j=this.getZoom();a.DomUtil.setTransform(i,this.project(k,j),this.getZoomScale(j,1))},this)},_catchTransitionEnd:function(i){if(this._animatingZoom&&i.propertyName.indexOf("transform")>=0){this._onZoomTransitionEnd()}},_nothingToAnimate:function(){return !this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(i,k,j){if(this._animatingZoom){return true}j=j||{};if(!this._zoomAnimated||j.animate===false||this._nothingToAnimate()||Math.abs(k-this._zoom)>this.options.zoomAnimationThreshold){return false}var m=this.getZoomScale(k),l=this._getCenterOffset(i)._divideBy(1-1/m);if(j.animate!==true&&!this.getSize().contains(l)){return false}a.Util.requestAnimFrame(function(){this._moveStart(true)._animateZoom(i,k,true)},this);return true},_animateZoom:function(i,l,j,k){if(j){this._animatingZoom=true;this._animateToCenter=i;this._animateToZoom=l;a.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim")}this.fire("zoomanim",{center:i,zoom:l,noUpdate:k});setTimeout(a.bind(this._onZoomTransitionEnd,this),250)},_onZoomTransitionEnd:function(){if(!this._animatingZoom){return}a.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim");this._animatingZoom=false;this._move(this._animateToCenter,this._animateToZoom);a.Util.requestAnimFrame(function(){this._moveEnd(true)},this)}});a.map=function(j,i){return new a.Map(j,i)};a.Layer=a.Evented.extend({options:{pane:"overlayPane",nonBubblingEvents:[],attribution:null},addTo:function(i){i.addLayer(this);return this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(i){if(i){i.removeLayer(this)}return this},getPane:function(i){return this._map.getPane(i?(this.options[i]||i):this.options.pane)},addInteractiveTarget:function(i){this._map._targets[a.stamp(i)]=this;return this},removeInteractiveTarget:function(i){delete this._map._targets[a.stamp(i)];return this},getAttribution:function(){return this.options.attribution},_layerAdd:function(k){var j=k.target;if(!j.hasLayer(this)){return}this._map=j;this._zoomAnimated=j._zoomAnimated;if(this.getEvents){var i=this.getEvents();j.on(i,this);this.once("remove",function(){j.off(i,this)},this)}this.onAdd(j);if(this.getAttribution&&j.attributionControl){j.attributionControl.addAttribution(this.getAttribution())}this.fire("add");j.fire("layeradd",{layer:this})}});a.Map.include({addLayer:function(i){var j=a.stamp(i);if(this._layers[j]){return this}this._layers[j]=i;i._mapToAdd=this;if(i.beforeAdd){i.beforeAdd(this)}this.whenReady(i._layerAdd,i);return this},removeLayer:function(i){var j=a.stamp(i);if(!this._layers[j]){return this}if(this._loaded){i.onRemove(this)}if(i.getAttribution&&this.attributionControl){this.attributionControl.removeAttribution(i.getAttribution())}delete this._layers[j];if(this._loaded){this.fire("layerremove",{layer:i});i.fire("remove")}i._map=i._mapToAdd=null;return this},hasLayer:function(i){return !!i&&(a.stamp(i) in this._layers)},eachLayer:function(l,k){for(var j in this._layers){l.call(k,this._layers[j])}return this},_addLayers:function(l){l=l?(a.Util.isArray(l)?l:[l]):[];for(var k=0,j=l.length;k<j;k++){this.addLayer(l[k])}},_addZoomLimit:function(i){if(isNaN(i.options.maxZoom)||!isNaN(i.options.minZoom)){this._zoomBoundLayers[a.stamp(i)]=i;this._updateZoomLevels()}},_removeZoomLimit:function(i){var j=a.stamp(i);if(this._zoomBoundLayers[j]){delete this._zoomBoundLayers[j];this._updateZoomLevels()}},_updateZoomLevels:function(){var n=Infinity,j=-Infinity,m=this._getZoomSpan();for(var l in this._zoomBoundLayers){var k=this._zoomBoundLayers[l].options;n=k.minZoom===h?n:Math.min(n,k.minZoom);j=k.maxZoom===h?j:Math.max(j,k.maxZoom)}this._layersMaxZoom=j===-Infinity?h:j;this._layersMinZoom=n===Infinity?h:n;if(m!==this._getZoomSpan()){this.fire("zoomlevelschange")}if(this.options.maxZoom===h&&this._layersMaxZoom&&this.getZoom()>this._layersMaxZoom){this.setZoom(this._layersMaxZoom)}if(this.options.minZoom===h&&this._layersMinZoom&&this.getZoom()<this._layersMinZoom){this.setZoom(this._layersMinZoom)}}});var g="_leaflet_events";a.DomEvent={on:function(p,m,o,l){if(typeof m==="object"){for(var n in m){this._on(p,n,m[n],o)}}else{m=a.Util.splitWords(m);for(var k=0,j=m.length;k<j;k++){this._on(p,m[k],o,l)}}return this},off:function(p,m,o,l){if(typeof m==="object"){for(var n in m){this._off(p,n,m[n],o)}}else{m=a.Util.splitWords(m);for(var k=0,j=m.length;k<j;k++){this._off(p,m[k],o,l)}}return this},_on:function(n,m,l,j){var o=m+a.stamp(l)+(j?"_"+a.stamp(j):"");if(n[g]&&n[g][o]){return this}var k=function(p){return l.call(j||n,p||f.event)};var i=k;if(a.Browser.pointer&&m.indexOf("touch")===0){this.addPointerListener(n,m,k,o)}else{if(a.Browser.touch&&(m==="dblclick")&&this.addDoubleTapListener&&!(a.Browser.pointer&&a.Browser.chrome)){this.addDoubleTapListener(n,k,o)}else{if("addEventListener" in n){if(m==="mousewheel"){n.addEventListener("onwheel" in n?"wheel":"mousewheel",k,false)}else{if((m==="mouseenter")||(m==="mouseleave")){k=function(p){p=p||f.event;if(a.DomEvent._isExternalTarget(n,p)){i(p)}};n.addEventListener(m==="mouseenter"?"mouseover":"mouseout",k,false)}else{if(m==="click"&&a.Browser.android){k=function(p){return a.DomEvent._filterClick(p,i)}}n.addEventListener(m,k,false)}}}else{if("attachEvent" in n){n.attachEvent("on"+m,k)}}}}n[g]=n[g]||{};n[g][o]=k;return this},_off:function(m,l,k,i){var n=l+a.stamp(k)+(i?"_"+a.stamp(i):""),j=m[g]&&m[g][n];if(!j){return this}if(a.Browser.pointer&&l.indexOf("touch")===0){this.removePointerListener(m,l,n)}else{if(a.Browser.touch&&(l==="dblclick")&&this.removeDoubleTapListener){this.removeDoubleTapListener(m,n)}else{if("removeEventListener" in m){if(l==="mousewheel"){m.removeEventListener("onwheel" in m?"wheel":"mousewheel",j,false)}else{m.removeEventListener(l==="mouseenter"?"mouseover":l==="mouseleave"?"mouseout":l,j,false)}}else{if("detachEvent" in m){m.detachEvent("on"+l,j)}}}}m[g][n]=null;return this},stopPropagation:function(i){if(i.stopPropagation){i.stopPropagation()}else{if(i.originalEvent){i.originalEvent._stopped=true}else{i.cancelBubble=true}}a.DomEvent._skipped(i);return this},disableScrollPropagation:function(i){return a.DomEvent.on(i,"mousewheel",a.DomEvent.stopPropagation)},disableClickPropagation:function(j){var i=a.DomEvent.stopPropagation;a.DomEvent.on(j,a.Draggable.START.join(" "),i);return a.DomEvent.on(j,{click:a.DomEvent._fakeStop,dblclick:i})},preventDefault:function(i){if(i.preventDefault){i.preventDefault()}else{i.returnValue=false}return this},stop:function(i){return a.DomEvent.preventDefault(i).stopPropagation(i)},getMousePosition:function(k,i){if(!i){return new a.Point(k.clientX,k.clientY)}var j=i.getBoundingClientRect();return new a.Point(k.clientX-j.left-i.clientLeft,k.clientY-j.top-i.clientTop)},_wheelPxFactor:(a.Browser.win&&a.Browser.chrome)?2:a.Browser.gecko?f.devicePixelRatio:1,getWheelDelta:function(i){return(a.Browser.edge)?i.wheelDeltaY/2:(i.deltaY&&i.deltaMode===0)?-i.deltaY/a.DomEvent._wheelPxFactor:(i.deltaY&&i.deltaMode===1)?-i.deltaY*20:(i.deltaY&&i.deltaMode===2)?-i.deltaY*60:(i.deltaX||i.deltaZ)?0:i.wheelDelta?(i.wheelDeltaY||i.wheelDelta)/2:(i.detail&&Math.abs(i.detail)<32765)?-i.detail*20:i.detail?i.detail/-32765*60:0},_skipEvents:{},_fakeStop:function(i){a.DomEvent._skipEvents[i.type]=true},_skipped:function(j){var i=this._skipEvents[j.type];this._skipEvents[j.type]=false;return i},_isExternalTarget:function(i,l){var k=l.relatedTarget;if(!k){return true}try{while(k&&(k!==i)){k=k.parentNode}}catch(j){return false}return(k!==i)},_filterClick:function(l,k){var j=(l.timeStamp||(l.originalEvent&&l.originalEvent.timeStamp)),i=a.DomEvent._lastClick&&(j-a.DomEvent._lastClick);if((i&&i>100&&i<500)||(l.target._simulatedClick&&!l._simulated)){a.DomEvent.stop(l);return}a.DomEvent._lastClick=j;k(l)}};a.DomEvent.addListener=a.DomEvent.on;a.DomEvent.removeListener=a.DomEvent.off;a.PosAnimation=a.Evented.extend({run:function(j,i,k,l){this.stop();this._el=j;this._inProgress=true;this._duration=k||0.25;this._easeOutPower=1/Math.max(l||0.5,0.2);this._startPos=a.DomUtil.getPosition(j);this._offset=i.subtract(this._startPos);this._startTime=+new Date();this.fire("start");this._animate()},stop:function(){if(!this._inProgress){return}this._step(true);this._complete()},_animate:function(){this._animId=a.Util.requestAnimFrame(this._animate,this);this._step()},_step:function(j){var i=(+new Date())-this._startTime,k=this._duration*1000;if(i<k){this._runFrame(this._easeOut(i/k),j)}else{this._runFrame(1);this._complete()}},_runFrame:function(j,i){var k=this._startPos.add(this._offset.multiplyBy(j));if(i){k._round()}a.DomUtil.setPosition(this._el,k);this.fire("step")},_complete:function(){a.Util.cancelAnimFrame(this._animId);this._inProgress=false;this.fire("end")},_easeOut:function(i){return 1-Math.pow(1-i,this._easeOutPower)}});a.Projection.Mercator={R:6378137,R_MINOR:6356752.314245179,bounds:a.bounds([-20037508.34279,-15496570.73972],[20037508.34279,18764656.23138]),project:function(p){var n=Math.PI/180,l=this.R,o=p.lat*n,j=this.R_MINOR/l,m=Math.sqrt(1-j*j),i=m*Math.sin(o);var k=Math.tan(Math.PI/4-o/2)/Math.pow((1-i)/(1+i),m/2);o=-l*Math.log(Math.max(k,1e-10));return new a.Point(p.lng*n*l,o)},unproject:function(t){var q=180/Math.PI,j=this.R,l=this.R_MINOR/j,o=Math.sqrt(1-l*l),s=Math.exp(-t.y/j),p=Math.PI/2-2*Math.atan(s);for(var m=0,n=0.1,k;m<15&&Math.abs(n)>1e-7;m++){k=o*Math.sin(p);k=Math.pow((1-k)/(1+k),o/2);n=Math.PI/2-2*Math.atan(s*k)-p;p+=n}return new a.LatLng(p*q,t.x*q/j)}};a.CRS.EPSG3395=a.extend({},a.CRS.Earth,{code:"EPSG:3395",projection:a.Projection.Mercator,transformation:(function(){var i=0.5/(Math.PI*a.Projection.Mercator.R);return new a.Transformation(i,0.5,-i,0.5)}())});a.GridLayer=a.Layer.extend({options:{tileSize:256,opacity:1,updateWhenIdle:a.Browser.mobile,updateWhenZooming:true,updateInterval:200,zIndex:1,bounds:null,minZoom:0,maxZoom:h,noWrap:false,pane:"tilePane",className:"",keepBuffer:2},initialize:function(i){a.setOptions(this,i)},onAdd:function(){this._initContainer();this._levels={};this._tiles={};this._resetView();this._update()},beforeAdd:function(i){i._addZoomLimit(this)},onRemove:function(i){this._removeAllTiles();a.DomUtil.remove(this._container);i._removeZoomLimit(this);this._container=null;this._tileZoom=null},bringToFront:function(){if(this._map){a.DomUtil.toFront(this._container);this._setAutoZIndex(Math.max)}return this},bringToBack:function(){if(this._map){a.DomUtil.toBack(this._container);this._setAutoZIndex(Math.min)}return this},getContainer:function(){return this._container},setOpacity:function(i){this.options.opacity=i;this._updateOpacity();return this},setZIndex:function(i){this.options.zIndex=i;this._updateZIndex();return this},isLoading:function(){return this._loading},redraw:function(){if(this._map){this._removeAllTiles();this._update()}return this},getEvents:function(){var i={viewprereset:this._invalidateAll,viewreset:this._resetView,zoom:this._resetView,moveend:this._onMoveEnd};if(!this.options.updateWhenIdle){if(!this._onMove){this._onMove=a.Util.throttle(this._onMoveEnd,this.options.updateInterval,this)}i.move=this._onMove}if(this._zoomAnimated){i.zoomanim=this._animateZoom}return i},createTile:function(){return b.createElement("div")},getTileSize:function(){var i=this.options.tileSize;return i instanceof a.Point?i:new a.Point(i,i)},_updateZIndex:function(){if(this._container&&this.options.zIndex!==h&&this.options.zIndex!==null){this._container.style.zIndex=this.options.zIndex}},_setAutoZIndex:function(m){var n=this.getPane().children,l=-m(-Infinity,Infinity);for(var k=0,j=n.length,o;k<j;k++){o=n[k].style.zIndex;if(n[k]!==this._container&&o){l=m(l,+o)}}if(isFinite(l)){this.options.zIndex=l+m(-1,1);this._updateZIndex()}},_updateOpacity:function(){if(!this._map){return}if(a.Browser.ielt9){return}a.DomUtil.setOpacity(this._container,this.options.opacity);var i=+new Date(),l=false,n=false;for(var j in this._tiles){var k=this._tiles[j];if(!k.current||!k.loaded){continue}var m=Math.min(1,(i-k.loaded)/200);a.DomUtil.setOpacity(k.el,m);if(m<1){l=true}else{if(k.active){n=true}k.active=true}}if(n&&!this._noPrune){this._pruneTiles()}if(l){a.Util.cancelAnimFrame(this._fadeFrame);this._fadeFrame=a.Util.requestAnimFrame(this._updateOpacity,this)}},_initContainer:function(){if(this._container){return}this._container=a.DomUtil.create("div","leaflet-layer "+(this.options.className||""));this._updateZIndex();if(this.options.opacity<1){this._updateOpacity()}this.getPane().appendChild(this._container)},_updateLevels:function(){var j=this._tileZoom,i=this.options.maxZoom;if(j===h){return h}for(var l in this._levels){if(this._levels[l].el.children.length||l===j){this._levels[l].el.style.zIndex=i-Math.abs(j-l)}else{a.DomUtil.remove(this._levels[l].el);this._removeTilesAtZoom(l);delete this._levels[l]}}var m=this._levels[j],k=this._map;if(!m){m=this._levels[j]={};m.el=a.DomUtil.create("div","leaflet-tile-container leaflet-zoom-animated",this._container);m.el.style.zIndex=i;m.origin=k.project(k.unproject(k.getPixelOrigin()),j).round();m.zoom=j;this._setZoomTransform(m,k.getCenter(),k.getZoom());a.Util.falseFn(m.el.offsetWidth)}this._level=m;return m},_pruneTiles:function(){if(!this._map){return}var i,k;var j=this._map.getZoom();if(j>this.options.maxZoom||j<this.options.minZoom){this._removeAllTiles();return}for(i in this._tiles){k=this._tiles[i];k.retain=k.current}for(i in this._tiles){k=this._tiles[i];if(k.current&&!k.active){var l=k.coords;if(!this._retainParent(l.x,l.y,l.z,l.z-5)){this._retainChildren(l.x,l.y,l.z,l.z+2)}}}for(i in this._tiles){if(!this._tiles[i].retain){this._removeTile(i)}}},_removeTilesAtZoom:function(j){for(var i in this._tiles){if(this._tiles[i].coords.z!==j){continue}this._removeTile(i)}},_removeAllTiles:function(){for(var i in this._tiles){this._removeTile(i)}},_invalidateAll:function(){for(var i in this._levels){a.DomUtil.remove(this._levels[i].el);delete this._levels[i]}this._removeAllTiles();this._tileZoom=null},_retainParent:function(p,n,m,i){var j=Math.floor(p/2),o=Math.floor(n/2),k=m-1,r=new a.Point(+j,+o);r.z=+k;var q=this._tileCoordsToKey(r),l=this._tiles[q];if(l&&l.active){l.retain=true;return true}else{if(l&&l.loaded){l.retain=true}}if(k>i){return this._retainParent(j,o,k,i)}return false},_retainChildren:function(r,o,n,q){for(var l=2*r;l<2*r+2;l++){for(var k=2*o;k<2*o+2;k++){var p=new a.Point(l,k);p.z=n+1;var s=this._tileCoordsToKey(p),m=this._tiles[s];if(m&&m.active){m.retain=true;continue}else{if(m&&m.loaded){m.retain=true}}if(n+1<q){this._retainChildren(l,k,n+1,q)}}}},_resetView:function(j){var i=j&&(j.pinch||j.flyTo);this._setView(this._map.getCenter(),this._map.getZoom(),i,i)},_animateZoom:function(i){this._setView(i.center,i.zoom,true,i.noUpdate)},_setView:function(j,l,i,k){var n=Math.round(l);if((this.options.maxZoom!==h&&n>this.options.maxZoom)||(this.options.minZoom!==h&&n<this.options.minZoom)){n=h}var m=this.options.updateWhenZooming&&(n!==this._tileZoom);if(!k||m){this._tileZoom=n;if(this._abortLoading){this._abortLoading()}this._updateLevels();this._resetGrid();if(n!==h){this._update(j)}if(!i){this._pruneTiles()}this._noPrune=!!i}this._setZoomTransforms(j,l)},_setZoomTransforms:function(j,l){for(var k in this._levels){this._setZoomTransform(this._levels[k],j,l)}},_setZoomTransform:function(m,i,j){var l=this._map.getZoomScale(j,m.zoom),k=m.origin.multiplyBy(l).subtract(this._map._getNewPixelOrigin(i,j)).round();if(a.Browser.any3d){a.DomUtil.setTransform(m.el,k,l)}else{a.DomUtil.setPosition(m.el,k)}},_resetGrid:function(){var l=this._map,i=l.options.crs,k=this._tileSize=this.getTileSize(),m=this._tileZoom;var j=this._map.getPixelWorldBounds(this._tileZoom);if(j){this._globalTileRange=this._pxBoundsToTileRange(j)}this._wrapX=i.wrapLng&&!this.options.noWrap&&[Math.floor(l.project([0,i.wrapLng[0]],m).x/k.x),Math.ceil(l.project([0,i.wrapLng[1]],m).x/k.y)];this._wrapY=i.wrapLat&&!this.options.noWrap&&[Math.floor(l.project([i.wrapLat[0],0],m).y/k.x),Math.ceil(l.project([i.wrapLat[1],0],m).y/k.y)]},_onMoveEnd:function(){if(!this._map||this._map._animatingZoom){return}this._update()},_getTiledPixelBounds:function(i){var m=this._map,l=m._animatingZoom?Math.max(m._animateToZoom,m.getZoom()):m.getZoom(),n=m.getZoomScale(l,this._tileZoom),k=m.project(i,this._tileZoom).floor(),j=m.getSize().divideBy(n*2);return new a.Bounds(k.subtract(j),k.add(j))},_update:function(k){var l=this._map;if(!l){return}var z=l.getZoom();if(k===h){k=l.getCenter()}if(this._tileZoom===h){return}var q=this._getTiledPixelBounds(k),m=this._pxBoundsToTileRange(q),w=m.getCenter(),s=[],n=this.options.keepBuffer,r=new a.Bounds(m.getBottomLeft().subtract([n,-n]),m.getTopRight().add([n,-n]));for(var y in this._tiles){var v=this._tiles[y].coords;if(v.z!==this._tileZoom||!r.contains(a.point(v.x,v.y))){this._tiles[y].current=false}}if(Math.abs(z-this._tileZoom)>1){this._setView(k,z);return}for(var o=m.min.y;o<=m.max.y;o++){for(var p=m.min.x;p<=m.max.x;p++){var x=new a.Point(p,o);x.z=this._tileZoom;if(!this._isValidTile(x)){continue}var u=this._tiles[this._tileCoordsToKey(x)];if(u){u.current=true}else{s.push(x)}}}s.sort(function(j,i){return j.distanceTo(w)-i.distanceTo(w)});if(s.length!==0){if(!this._loading){this._loading=true;this.fire("loading")}var t=b.createDocumentFragment();for(p=0;p<s.length;p++){this._addTile(s[p],t)}this._level.el.appendChild(t)}},_isValidTile:function(k){var i=this._map.options.crs;if(!i.infinite){var j=this._globalTileRange;if((!i.wrapLng&&(k.x<j.min.x||k.x>j.max.x))||(!i.wrapLat&&(k.y<j.min.y||k.y>j.max.y))){return false}}if(!this.options.bounds){return true}var l=this._tileCoordsToBounds(k);return a.latLngBounds(this.options.bounds).overlaps(l)},_keyToBounds:function(i){return this._tileCoordsToBounds(this._keyToTileCoords(i))},_tileCoordsToBounds:function(o){var p=this._map,n=this.getTileSize(),k=o.scaleBy(n),i=k.add(n),j=p.unproject(k,o.z),m=p.unproject(i,o.z),l=new a.LatLngBounds(j,m);if(!this.options.noWrap){p.wrapLatLngBounds(l)}return l},_tileCoordsToKey:function(i){return i.x+":"+i.y+":"+i.z},_keyToTileCoords:function(j){var i=j.split(":"),l=new a.Point(+i[0],+i[1]);l.z=+i[2];return l},_removeTile:function(i){var j=this._tiles[i];if(!j){return}a.DomUtil.remove(j.el);delete this._tiles[i];this.fire("tileunload",{tile:j.el,coords:this._keyToTileCoords(i)})},_initTile:function(i){a.DomUtil.addClass(i,"leaflet-tile");var j=this.getTileSize();i.style.width=j.x+"px";i.style.height=j.y+"px";i.onselectstart=a.Util.falseFn;i.onmousemove=a.Util.falseFn;if(a.Browser.ielt9&&this.options.opacity<1){a.DomUtil.setOpacity(i,this.options.opacity)}if(a.Browser.android&&!a.Browser.android23){i.style.WebkitBackfaceVisibility="hidden"}},_addTile:function(m,i){var k=this._getTilePos(m),j=this._tileCoordsToKey(m);var l=this.createTile(this._wrapCoords(m),a.bind(this._tileReady,this,m));this._initTile(l);if(this.createTile.length<2){a.Util.requestAnimFrame(a.bind(this._tileReady,this,m,null,l))}a.DomUtil.setPosition(l,k);this._tiles[j]={el:l,coords:m,current:true};i.appendChild(l);this.fire("tileloadstart",{tile:l,coords:m})},_tileReady:function(l,k,j){if(!this._map){return}if(k){this.fire("tileerror",{error:k,tile:j,coords:l})}var i=this._tileCoordsToKey(l);j=this._tiles[i];if(!j){return}j.loaded=+new Date();if(this._map._fadeAnimated){a.DomUtil.setOpacity(j.el,0);a.Util.cancelAnimFrame(this._fadeFrame);this._fadeFrame=a.Util.requestAnimFrame(this._updateOpacity,this)}else{j.active=true;this._pruneTiles()}if(!k){a.DomUtil.addClass(j.el,"leaflet-tile-loaded");this.fire("tileload",{tile:j.el,coords:l})}if(this._noTilesToLoad()){this._loading=false;this.fire("load");if(a.Browser.ielt9||!this._map._fadeAnimated){a.Util.requestAnimFrame(this._pruneTiles,this)}else{setTimeout(a.bind(this._pruneTiles,this),250)}}},_getTilePos:function(i){return i.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(i){var j=new a.Point(this._wrapX?a.Util.wrapNum(i.x,this._wrapX):i.x,this._wrapY?a.Util.wrapNum(i.y,this._wrapY):i.y);j.z=i.z;return j},_pxBoundsToTileRange:function(i){var j=this.getTileSize();return new a.Bounds(i.min.unscaleBy(j).floor(),i.max.unscaleBy(j).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var i in this._tiles){if(!this._tiles[i].loaded){return false}}return true}});a.gridLayer=function(i){return new a.GridLayer(i)};a.TileLayer=a.GridLayer.extend({options:{minZoom:0,maxZoom:18,maxNativeZoom:null,minNativeZoom:null,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:false,zoomReverse:false,detectRetina:false,crossOrigin:false},initialize:function(j,i){this._url=j;i=a.setOptions(this,i);if(i.detectRetina&&a.Browser.retina&&i.maxZoom>0){i.tileSize=Math.floor(i.tileSize/2);if(!i.zoomReverse){i.zoomOffset++;i.maxZoom--}else{i.zoomOffset--;i.minZoom++}i.minZoom=Math.max(0,i.minZoom)}if(typeof i.subdomains==="string"){i.subdomains=i.subdomains.split("")}if(!a.Browser.android){this.on("tileunload",this._onTileRemove)}},setUrl:function(i,j){this._url=i;if(!j){this.redraw()}return this},createTile:function(k,i){var j=b.createElement("img");a.DomEvent.on(j,"load",a.bind(this._tileOnLoad,this,i,j));a.DomEvent.on(j,"error",a.bind(this._tileOnError,this,i,j));if(this.options.crossOrigin){j.crossOrigin=""}j.alt="";j.setAttribute("role","presentation");j.src=this.getTileUrl(k);return j},getTileUrl:function(j){var i={r:a.Browser.retina?"@2x":"",s:this._getSubdomain(j),x:j.x,y:j.y,z:this._getZoomForUrl()};if(this._map&&!this._map.options.crs.infinite){var k=this._globalTileRange.max.y-j.y;if(this.options.tms){i.y=k}i["-y"]=k}return a.Util.template(this._url,a.extend(i,this.options))},_tileOnLoad:function(i,j){if(a.Browser.ielt9){setTimeout(a.bind(i,this,null,j),0)}else{i(null,j)}},_tileOnError:function(j,k,l){var i=this.options.errorTileUrl;if(i&&k.src!==i){k.src=i}j(l,k)},getTileSize:function(){var k=this._map,j=a.GridLayer.prototype.getTileSize.call(this),i=this._tileZoom+this.options.zoomOffset,m=this.options.minNativeZoom,l=this.options.maxNativeZoom;if(m!==null&&i<m){return j.divideBy(k.getZoomScale(m,i)).round()}if(l!==null&&i>l){return j.divideBy(k.getZoomScale(l,i)).round()}return j},_onTileRemove:function(i){i.tile.onload=null},_getZoomForUrl:function(){var k=this._tileZoom,j=this.options.maxZoom,l=this.options.zoomReverse,i=this.options.zoomOffset,n=this.options.minNativeZoom,m=this.options.maxNativeZoom;if(l){k=j-k}k+=i;if(n!==null&&k<n){return n}if(m!==null&&k>m){return m}return k},_getSubdomain:function(j){var i=Math.abs(j.x+j.y)%this.options.subdomains.length;return this.options.subdomains[i]},_abortLoading:function(){var j,k;for(j in this._tiles){if(this._tiles[j].coords.z!==this._tileZoom){k=this._tiles[j].el;k.onload=a.Util.falseFn;k.onerror=a.Util.falseFn;if(!k.complete){k.src=a.Util.emptyImageUrl;a.DomUtil.remove(k)}}}}});a.tileLayer=function(j,i){return new a.TileLayer(j,i)};a.TileLayer.WMS=a.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",layers:"",styles:"",format:"image/jpeg",transparent:false,version:"1.1.1"},options:{crs:null,uppercase:false},initialize:function(l,k){this._url=l;var j=a.extend({},this.defaultWmsParams);for(var m in k){if(!(m in this.options)){j[m]=k[m]}}k=a.setOptions(this,k);j.width=j.height=k.tileSize*(k.detectRetina&&a.Browser.retina?2:1);this.wmsParams=j},onAdd:function(i){this._crs=this.options.crs||i.options.crs;this._wmsVersion=parseFloat(this.wmsParams.version);var j=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[j]=this._crs.code;a.TileLayer.prototype.onAdd.call(this,i)},getTileUrl:function(l){var m=this._tileCoordsToBounds(l),i=this._crs.project(m.getNorthWest()),k=this._crs.project(m.getSouthEast()),n=(this._wmsVersion>=1.3&&this._crs===a.CRS.EPSG4326?[k.y,i.x,i.y,k.x]:[i.x,k.y,k.x,i.y]).join(","),j=a.TileLayer.prototype.getTileUrl.call(this,l);return j+a.Util.getParamString(this.wmsParams,j,this.options.uppercase)+(this.options.uppercase?"&BBOX=":"&bbox=")+n},setParams:function(j,i){a.extend(this.wmsParams,j);if(!i){this.redraw()}return this}});a.tileLayer.wms=function(j,i){return new a.TileLayer.WMS(j,i)};a.ImageOverlay=a.Layer.extend({options:{opacity:1,alt:"",interactive:false,crossOrigin:false},initialize:function(j,k,i){this._url=j;this._bounds=a.latLngBounds(k);a.setOptions(this,i)},onAdd:function(){if(!this._image){this._initImage();if(this.options.opacity<1){this._updateOpacity()}}if(this.options.interactive){a.DomUtil.addClass(this._image,"leaflet-interactive");this.addInteractiveTarget(this._image)}this.getPane().appendChild(this._image);this._reset()},onRemove:function(){a.DomUtil.remove(this._image);if(this.options.interactive){this.removeInteractiveTarget(this._image)}},setOpacity:function(i){this.options.opacity=i;if(this._image){this._updateOpacity()}return this},setStyle:function(i){if(i.opacity){this.setOpacity(i.opacity)}return this},bringToFront:function(){if(this._map){a.DomUtil.toFront(this._image)}return this},bringToBack:function(){if(this._map){a.DomUtil.toBack(this._image)}return this},setUrl:function(i){this._url=i;if(this._image){this._image.src=i}return this},setBounds:function(i){this._bounds=i;if(this._map){this._reset()}return this},getEvents:function(){var i={zoom:this._reset,viewreset:this._reset};if(this._zoomAnimated){i.zoomanim=this._animateZoom}return i},getBounds:function(){return this._bounds},getElement:function(){return this._image},_initImage:function(){var i=this._image=a.DomUtil.create("img","leaflet-image-layer "+(this._zoomAnimated?"leaflet-zoom-animated":""));i.onselectstart=a.Util.falseFn;i.onmousemove=a.Util.falseFn;i.onload=a.bind(this.fire,this,"load");if(this.options.crossOrigin){i.crossOrigin=""}i.src=this._url;i.alt=this.options.alt},_animateZoom:function(i){var k=this._map.getZoomScale(i.zoom),j=this._map._latLngBoundsToNewLayerBounds(this._bounds,i.zoom,i.center).min;a.DomUtil.setTransform(this._image,j,k)},_reset:function(){var k=this._image,j=new a.Bounds(this._map.latLngToLayerPoint(this._bounds.getNorthWest()),this._map.latLngToLayerPoint(this._bounds.getSouthEast())),i=j.getSize();a.DomUtil.setPosition(k,j.min);k.style.width=i.x+"px";k.style.height=i.y+"px"},_updateOpacity:function(){a.DomUtil.setOpacity(this._image,this.options.opacity)}});a.imageOverlay=function(j,k,i){return new a.ImageOverlay(j,k,i)};a.Icon=a.Class.extend({initialize:function(i){a.setOptions(this,i)},createIcon:function(i){return this._createIcon("icon",i)},createShadow:function(i){return this._createIcon("shadow",i)},_createIcon:function(j,k){var l=this._getIconUrl(j);if(!l){if(j==="icon"){throw new Error("iconUrl not set in Icon options (see the docs).")}return null}var i=this._createImg(l,k&&k.tagName==="IMG"?k:null);this._setIconStyles(i,j);return i},_setIconStyles:function(j,m){var l=this.options;var i=l[m+"Size"];if(typeof i==="number"){i=[i,i]}var n=a.point(i),k=a.point(m==="shadow"&&l.shadowAnchor||l.iconAnchor||n&&n.divideBy(2,true));j.className="leaflet-marker-"+m+" "+(l.className||"");if(k){j.style.marginLeft=(-k.x)+"px";j.style.marginTop=(-k.y)+"px"}if(n){j.style.width=n.x+"px";j.style.height=n.y+"px"}},_createImg:function(j,i){i=i||b.createElement("img");i.src=j;return i},_getIconUrl:function(i){return a.Browser.retina&&this.options[i+"RetinaUrl"]||this.options[i+"Url"]}});a.icon=function(i){return new a.Icon(i)};a.Icon.Default=a.Icon.extend({options:{iconUrl:"marker-icon.png",iconRetinaUrl:"marker-icon-2x.png",shadowUrl:"marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],tooltipAnchor:[16,-28],shadowSize:[41,41]},_getIconUrl:function(i){if(!a.Icon.Default.imagePath){a.Icon.Default.imagePath=this._detectIconPath()}return(this.options.imagePath||a.Icon.Default.imagePath)+a.Icon.prototype._getIconUrl.call(this,i)},_detectIconPath:function(){var i=a.DomUtil.create("div","leaflet-default-icon-path",b.body);var j=a.DomUtil.getStyle(i,"background-image")||a.DomUtil.getStyle(i,"backgroundImage");b.body.removeChild(i);return j.indexOf("url")===0?j.replace(/^url\([\"\']?/,"").replace(/marker-icon\.png[\"\']?\)$/,""):""}});a.Marker=a.Layer.extend({options:{icon:new a.Icon.Default(),interactive:true,draggable:false,keyboard:true,title:"",alt:"",zIndexOffset:0,opacity:1,riseOnHover:false,riseOffset:250,pane:"markerPane",nonBubblingEvents:["click","dblclick","mouseover","mouseout","contextmenu"]},initialize:function(j,i){a.setOptions(this,i);this._latlng=a.latLng(j)},onAdd:function(i){this._zoomAnimated=this._zoomAnimated&&i.options.markerZoomAnimation;if(this._zoomAnimated){i.on("zoomanim",this._animateZoom,this)}this._initIcon();this.update()},onRemove:function(i){if(this.dragging&&this.dragging.enabled()){this.options.draggable=true;this.dragging.removeHooks()}if(this._zoomAnimated){i.off("zoomanim",this._animateZoom,this)}this._removeIcon();this._removeShadow()},getEvents:function(){return{zoom:this.update,viewreset:this.update}},getLatLng:function(){return this._latlng},setLatLng:function(j){var i=this._latlng;this._latlng=a.latLng(j);this.update();return this.fire("move",{oldLatLng:i,latlng:this._latlng})},setZIndexOffset:function(i){this.options.zIndexOffset=i;return this.update()},setIcon:function(i){this.options.icon=i;if(this._map){this._initIcon();this.update()}if(this._popup){this.bindPopup(this._popup,this._popup.options)}return this},getElement:function(){return this._icon},update:function(){if(this._icon){var i=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(i)}return this},_initIcon:function(){var j=this.options,l="leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");var k=j.icon.createIcon(this._icon),m=false;if(k!==this._icon){if(this._icon){this._removeIcon()}m=true;if(j.title){k.title=j.title}if(j.alt){k.alt=j.alt}}a.DomUtil.addClass(k,l);if(j.keyboard){k.tabIndex="0"}this._icon=k;if(j.riseOnHover){this.on({mouseover:this._bringToFront,mouseout:this._resetZIndex})}var i=j.icon.createShadow(this._shadow),n=false;if(i!==this._shadow){this._removeShadow();n=true}if(i){a.DomUtil.addClass(i,l);i.alt=""}this._shadow=i;if(j.opacity<1){this._updateOpacity()}if(m){this.getPane().appendChild(this._icon)}this._initInteraction();if(i&&n){this.getPane("shadowPane").appendChild(this._shadow)}},_removeIcon:function(){if(this.options.riseOnHover){this.off({mouseover:this._bringToFront,mouseout:this._resetZIndex})}a.DomUtil.remove(this._icon);this.removeInteractiveTarget(this._icon);this._icon=null},_removeShadow:function(){if(this._shadow){a.DomUtil.remove(this._shadow)}this._shadow=null},_setPos:function(i){a.DomUtil.setPosition(this._icon,i);if(this._shadow){a.DomUtil.setPosition(this._shadow,i)}this._zIndex=i.y+this.options.zIndexOffset;this._resetZIndex()},_updateZIndex:function(i){this._icon.style.zIndex=this._zIndex+i},_animateZoom:function(i){var j=this._map._latLngToNewLayerPoint(this._latlng,i.zoom,i.center).round();this._setPos(j)},_initInteraction:function(){if(!this.options.interactive){return}a.DomUtil.addClass(this._icon,"leaflet-interactive");this.addInteractiveTarget(this._icon);if(a.Handler.MarkerDrag){var i=this.options.draggable;if(this.dragging){i=this.dragging.enabled();this.dragging.disable()}this.dragging=new a.Handler.MarkerDrag(this);if(i){this.dragging.enable()}}},setOpacity:function(i){this.options.opacity=i;if(this._map){this._updateOpacity()}return this},_updateOpacity:function(){var i=this.options.opacity;a.DomUtil.setOpacity(this._icon,i);if(this._shadow){a.DomUtil.setOpacity(this._shadow,i)}},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)},_getPopupAnchor:function(){return this.options.icon.options.popupAnchor||[0,0]},_getTooltipAnchor:function(){return this.options.icon.options.tooltipAnchor||[0,0]}});a.marker=function(j,i){return new a.Marker(j,i)};a.DivIcon=a.Icon.extend({options:{iconSize:[12,12],html:false,bgPos:null,className:"leaflet-div-icon"},createIcon:function(j){var l=(j&&j.tagName==="DIV")?j:b.createElement("div"),i=this.options;l.innerHTML=i.html!==false?i.html:"";if(i.bgPos){var k=a.point(i.bgPos);l.style.backgroundPosition=(-k.x)+"px "+(-k.y)+"px"}this._setIconStyles(l,"icon");return l},createShadow:function(){return null}});a.divIcon=function(i){return new a.DivIcon(i)};a.DivOverlay=a.Layer.extend({options:{offset:[0,7],className:"",pane:"popupPane"},initialize:function(i,j){a.setOptions(this,i);this._source=j},onAdd:function(i){this._zoomAnimated=i._zoomAnimated;if(!this._container){this._initLayout()}if(i._fadeAnimated){a.DomUtil.setOpacity(this._container,0)}clearTimeout(this._removeTimeout);this.getPane().appendChild(this._container);this.update();if(i._fadeAnimated){a.DomUtil.setOpacity(this._container,1)}this.bringToFront()},onRemove:function(i){if(i._fadeAnimated){a.DomUtil.setOpacity(this._container,0);this._removeTimeout=setTimeout(a.bind(a.DomUtil.remove,a.DomUtil,this._container),200)}else{a.DomUtil.remove(this._container)}},getLatLng:function(){return this._latlng},setLatLng:function(i){this._latlng=a.latLng(i);if(this._map){this._updatePosition();this._adjustPan()}return this},getContent:function(){return this._content},setContent:function(i){this._content=i;this.update();return this},getElement:function(){return this._container},update:function(){if(!this._map){return}this._container.style.visibility="hidden";this._updateContent();this._updateLayout();this._updatePosition();this._container.style.visibility="";this._adjustPan()},getEvents:function(){var i={zoom:this._updatePosition,viewreset:this._updatePosition};if(this._zoomAnimated){i.zoomanim=this._animateZoom}return i},isOpen:function(){return !!this._map&&this._map.hasLayer(this)},bringToFront:function(){if(this._map){a.DomUtil.toFront(this._container)}return this},bringToBack:function(){if(this._map){a.DomUtil.toBack(this._container)}return this},_updateContent:function(){if(!this._content){return}var j=this._contentNode;var i=(typeof this._content==="function")?this._content(this._source||this):this._content;if(typeof i==="string"){j.innerHTML=i}else{while(j.hasChildNodes()){j.removeChild(j.firstChild)}j.appendChild(i)}this.fire("contentupdate")},_updatePosition:function(){if(!this._map){return}var m=this._map.latLngToLayerPoint(this._latlng),l=a.point(this.options.offset),j=this._getAnchor();if(this._zoomAnimated){a.DomUtil.setPosition(this._container,m.add(j))}else{l=l.add(m).add(j)}var i=this._containerBottom=-l.y,k=this._containerLeft=-Math.round(this._containerWidth/2)+l.x;this._container.style.bottom=i+"px";this._container.style.left=k+"px"},_getAnchor:function(){return[0,0]}});a.Popup=a.DivOverlay.extend({options:{maxWidth:300,minWidth:50,maxHeight:null,autoPan:true,autoPanPaddingTopLeft:null,autoPanPaddingBottomRight:null,autoPanPadding:[5,5],keepInView:false,closeButton:true,autoClose:true,className:""},openOn:function(i){i.openPopup(this);return this},onAdd:function(i){a.DivOverlay.prototype.onAdd.call(this,i);i.fire("popupopen",{popup:this});if(this._source){this._source.fire("popupopen",{popup:this},true);if(!(this._source instanceof a.Path)){this._source.on("preclick",a.DomEvent.stopPropagation)}}},onRemove:function(i){a.DivOverlay.prototype.onRemove.call(this,i);i.fire("popupclose",{popup:this});if(this._source){this._source.fire("popupclose",{popup:this},true);if(!(this._source instanceof a.Path)){this._source.off("preclick",a.DomEvent.stopPropagation)}}},getEvents:function(){var i=a.DivOverlay.prototype.getEvents.call(this);if("closeOnClick" in this.options?this.options.closeOnClick:this._map.options.closePopupOnClick){i.preclick=this._close}if(this.options.keepInView){i.moveend=this._adjustPan}return i},_close:function(){if(this._map){this._map.closePopup(this)}},_initLayout:function(){var k="leaflet-popup",i=this._container=a.DomUtil.create("div",k+" "+(this.options.className||"")+" leaflet-zoom-animated");if(this.options.closeButton){var j=this._closeButton=a.DomUtil.create("a",k+"-close-button",i);j.href="#close";j.innerHTML="&#215;";a.DomEvent.on(j,"click",this._onCloseButtonClick,this)}var l=this._wrapper=a.DomUtil.create("div",k+"-content-wrapper",i);this._contentNode=a.DomUtil.create("div",k+"-content",l);a.DomEvent.disableClickPropagation(l).disableScrollPropagation(this._contentNode).on(l,"contextmenu",a.DomEvent.stopPropagation);this._tipContainer=a.DomUtil.create("div",k+"-tip-container",i);this._tip=a.DomUtil.create("div",k+"-tip",this._tipContainer)},_updateLayout:function(){var j=this._contentNode,l=j.style;l.width="";l.whiteSpace="nowrap";var k=j.offsetWidth;k=Math.min(k,this.options.maxWidth);k=Math.max(k,this.options.minWidth);l.width=(k+1)+"px";l.whiteSpace="";l.height="";var i=j.offsetHeight,m=this.options.maxHeight,n="leaflet-popup-scrolled";if(m&&i>m){l.height=m+"px";a.DomUtil.addClass(j,n)}else{a.DomUtil.removeClass(j,n)}this._containerWidth=this._container.offsetWidth},_animateZoom:function(j){var k=this._map._latLngToNewLayerPoint(this._latlng,j.zoom,j.center),i=this._getAnchor();a.DomUtil.setPosition(this._container,k.add(i))},_adjustPan:function(){if(!this.options.autoPan||(this._map._panAnim&&this._map._panAnim._inProgress)){return}var j=this._map,m=parseInt(a.DomUtil.getStyle(this._container,"marginBottom"),10)||0,t=this._container.offsetHeight+m,p=this._containerWidth,n=new a.Point(this._containerLeft,-t-this._containerBottom);n._add(a.DomUtil.getPosition(this._container));var l=j.layerPointToContainerPoint(n),o=a.point(this.options.autoPanPadding),k=a.point(this.options.autoPanPaddingTopLeft||o),i=a.point(this.options.autoPanPaddingBottomRight||o),s=j.getSize(),r=0,q=0;if(l.x+p+i.x>s.x){r=l.x+p-s.x+i.x}if(l.x-r-k.x<0){r=l.x-k.x}if(l.y+t+i.y>s.y){q=l.y+t-s.y+i.y}if(l.y-q-k.y<0){q=l.y-k.y}if(r||q){j.fire("autopanstart").panBy([r,q])}},_onCloseButtonClick:function(i){this._close();a.DomEvent.stop(i)},_getAnchor:function(){return a.point(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});a.popup=function(i,j){return new a.Popup(i,j)};a.Map.mergeOptions({closePopupOnClick:true});a.Map.include({openPopup:function(i,k,j){if(!(i instanceof a.Popup)){i=new a.Popup(j).setContent(i)}if(k){i.setLatLng(k)}if(this.hasLayer(i)){return this}if(this._popup&&this._popup.options.autoClose){this.closePopup()}this._popup=i;return this.addLayer(i)},closePopup:function(i){if(!i||i===this._popup){i=this._popup;this._popup=null}if(i){this.removeLayer(i)}return this}});a.Layer.include({bindPopup:function(j,i){if(j instanceof a.Popup){a.setOptions(j,i);this._popup=j;j._source=this}else{if(!this._popup||i){this._popup=new a.Popup(i,this)}this._popup.setContent(j)}if(!this._popupHandlersAdded){this.on({click:this._openPopup,remove:this.closePopup,move:this._movePopup});this._popupHandlersAdded=true}return this},unbindPopup:function(){if(this._popup){this.off({click:this._openPopup,remove:this.closePopup,move:this._movePopup});this._popupHandlersAdded=false;this._popup=null}return this},openPopup:function(i,k){if(!(i instanceof a.Layer)){k=i;i=this}if(i instanceof a.FeatureGroup){for(var j in this._layers){i=this._layers[j];break}}if(!k){k=i.getCenter?i.getCenter():i.getLatLng()}if(this._popup&&this._map){this._popup._source=i;this._popup.update();this._map.openPopup(this._popup,k)}return this},closePopup:function(){if(this._popup){this._popup._close()}return this},togglePopup:function(i){if(this._popup){if(this._popup._map){this.closePopup()}else{this.openPopup(i)}}return this},isPopupOpen:function(){return(this._popup?this._popup.isOpen():false)},setPopupContent:function(i){if(this._popup){this._popup.setContent(i)}return this},getPopup:function(){return this._popup},_openPopup:function(j){var i=j.layer||j.target;if(!this._popup){return}if(!this._map){return}a.DomEvent.stop(j);if(i instanceof a.Path){this.openPopup(j.layer||j.target,j.latlng);return}if(this._map.hasLayer(this._popup)&&this._popup._source===i){this.closePopup()}else{this.openPopup(i,j.latlng)}},_movePopup:function(i){this._popup.setLatLng(i.latlng)}});a.Tooltip=a.DivOverlay.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:false,sticky:false,interactive:false,opacity:0.9},onAdd:function(i){a.DivOverlay.prototype.onAdd.call(this,i);this.setOpacity(this.options.opacity);i.fire("tooltipopen",{tooltip:this});if(this._source){this._source.fire("tooltipopen",{tooltip:this},true)}},onRemove:function(i){a.DivOverlay.prototype.onRemove.call(this,i);i.fire("tooltipclose",{tooltip:this});if(this._source){this._source.fire("tooltipclose",{tooltip:this},true)}},getEvents:function(){var i=a.DivOverlay.prototype.getEvents.call(this);if(a.Browser.touch&&!this.options.permanent){i.preclick=this._close}return i},_close:function(){if(this._map){this._map.closeTooltip(this)}},_initLayout:function(){var j="leaflet-tooltip",i=j+" "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=a.DomUtil.create("div",i)},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(p){var i=this._map,j=this._container,o=i.latLngToContainerPoint(i.getCenter()),k=i.layerPointToContainerPoint(p),q=this.options.direction,n=j.offsetWidth,r=j.offsetHeight,l=a.point(this.options.offset),m=this._getAnchor();if(q==="top"){p=p.add(a.point(-n/2+l.x,-r+l.y+m.y,true))}else{if(q==="bottom"){p=p.subtract(a.point(n/2-l.x,-l.y,true))}else{if(q==="center"){p=p.subtract(a.point(n/2+l.x,r/2-m.y+l.y,true))}else{if(q==="right"||q==="auto"&&k.x<o.x){q="right";p=p.add(a.point(l.x+m.x,m.y-r/2+l.y,true))}else{q="left";p=p.subtract(a.point(n+m.x-l.x,r/2-m.y-l.y,true))}}}}a.DomUtil.removeClass(j,"leaflet-tooltip-right");a.DomUtil.removeClass(j,"leaflet-tooltip-left");a.DomUtil.removeClass(j,"leaflet-tooltip-top");a.DomUtil.removeClass(j,"leaflet-tooltip-bottom");a.DomUtil.addClass(j,"leaflet-tooltip-"+q);a.DomUtil.setPosition(j,p)},_updatePosition:function(){var i=this._map.latLngToLayerPoint(this._latlng);this._setPosition(i)},setOpacity:function(i){this.options.opacity=i;if(this._container){a.DomUtil.setOpacity(this._container,i)}},_animateZoom:function(i){var j=this._map._latLngToNewLayerPoint(this._latlng,i.zoom,i.center);this._setPosition(j)},_getAnchor:function(){return a.point(this._source&&this._source._getTooltipAnchor&&!this.options.sticky?this._source._getTooltipAnchor():[0,0])}});a.tooltip=function(i,j){return new a.Tooltip(i,j)};a.Map.include({openTooltip:function(j,k,i){if(!(j instanceof a.Tooltip)){j=new a.Tooltip(i).setContent(j)}if(k){j.setLatLng(k)}if(this.hasLayer(j)){return this}return this.addLayer(j)},closeTooltip:function(i){if(i){this.removeLayer(i)}return this}});a.Layer.include({bindTooltip:function(j,i){if(j instanceof a.Tooltip){a.setOptions(j,i);this._tooltip=j;j._source=this}else{if(!this._tooltip||i){this._tooltip=a.tooltip(i,this)}this._tooltip.setContent(j)}this._initTooltipInteractions();if(this._tooltip.options.permanent&&this._map&&this._map.hasLayer(this)){this.openTooltip()}return this},unbindTooltip:function(){if(this._tooltip){this._initTooltipInteractions(true);this.closeTooltip();this._tooltip=null}return this},_initTooltipInteractions:function(j){if(!j&&this._tooltipHandlersAdded){return}var i=j?"off":"on",k={remove:this.closeTooltip,move:this._moveTooltip};if(!this._tooltip.options.permanent){k.mouseover=this._openTooltip;k.mouseout=this.closeTooltip;if(this._tooltip.options.sticky){k.mousemove=this._moveTooltip}if(a.Browser.touch){k.click=this._openTooltip}}else{k.add=this._openTooltip}this[i](k);this._tooltipHandlersAdded=!j},openTooltip:function(i,k){if(!(i instanceof a.Layer)){k=i;i=this}if(i instanceof a.FeatureGroup){for(var j in this._layers){i=this._layers[j];break}}if(!k){k=i.getCenter?i.getCenter():i.getLatLng()}if(this._tooltip&&this._map){this._tooltip._source=i;this._tooltip.update();this._map.openTooltip(this._tooltip,k);if(this._tooltip.options.interactive&&this._tooltip._container){a.DomUtil.addClass(this._tooltip._container,"leaflet-clickable");this.addInteractiveTarget(this._tooltip._container)}}return this},closeTooltip:function(){if(this._tooltip){this._tooltip._close();if(this._tooltip.options.interactive&&this._tooltip._container){a.DomUtil.removeClass(this._tooltip._container,"leaflet-clickable");this.removeInteractiveTarget(this._tooltip._container)}}return this},toggleTooltip:function(i){if(this._tooltip){if(this._tooltip._map){this.closeTooltip()}else{this.openTooltip(i)}}return this},isTooltipOpen:function(){return this._tooltip.isOpen()},setTooltipContent:function(i){if(this._tooltip){this._tooltip.setContent(i)}return this},getTooltip:function(){return this._tooltip},_openTooltip:function(j){var i=j.layer||j.target;if(!this._tooltip||!this._map){return}this.openTooltip(i,this._tooltip.options.sticky?j.latlng:h)},_moveTooltip:function(k){var l=k.latlng,j,i;if(this._tooltip.options.sticky&&k.originalEvent){j=this._map.mouseEventToContainerPoint(k.originalEvent);i=this._map.containerPointToLayerPoint(j);l=this._map.layerPointToLatLng(i)}this._tooltip.setLatLng(l)}});a.LayerGroup=a.Layer.extend({initialize:function(l){this._layers={};var k,j;if(l){for(k=0,j=l.length;k<j;k++){this.addLayer(l[k])}}},addLayer:function(i){var j=this.getLayerId(i);this._layers[j]=i;if(this._map){this._map.addLayer(i)}return this},removeLayer:function(i){var j=i in this._layers?i:this.getLayerId(i);if(this._map&&this._layers[j]){this._map.removeLayer(this._layers[j])}delete this._layers[j];return this},hasLayer:function(i){return !!i&&(i in this._layers||this.getLayerId(i) in this._layers)},clearLayers:function(){for(var j in this._layers){this.removeLayer(this._layers[j])}return this},invoke:function(j){var k=Array.prototype.slice.call(arguments,1),m,l;for(m in this._layers){l=this._layers[m];if(l[j]){l[j].apply(l,k)}}return this},onAdd:function(k){for(var j in this._layers){k.addLayer(this._layers[j])}},onRemove:function(k){for(var j in this._layers){k.removeLayer(this._layers[j])}},eachLayer:function(l,k){for(var j in this._layers){l.call(k,this._layers[j])}return this},getLayer:function(i){return this._layers[i]},getLayers:function(){var k=[];for(var j in this._layers){k.push(this._layers[j])}return k},setZIndex:function(i){return this.invoke("setZIndex",i)},getLayerId:function(i){return a.stamp(i)}});a.layerGroup=function(i){return new a.LayerGroup(i)};a.FeatureGroup=a.LayerGroup.extend({addLayer:function(i){if(this.hasLayer(i)){return this}i.addEventParent(this);a.LayerGroup.prototype.addLayer.call(this,i);return this.fire("layeradd",{layer:i})},removeLayer:function(i){if(!this.hasLayer(i)){return this}if(i in this._layers){i=this._layers[i]}i.removeEventParent(this);a.LayerGroup.prototype.removeLayer.call(this,i);return this.fire("layerremove",{layer:i})},setStyle:function(i){return this.invoke("setStyle",i)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var j=new a.LatLngBounds();for(var k in this._layers){var i=this._layers[k];j.extend(i.getBounds?i.getBounds():i.getLatLng())}return j}});a.featureGroup=function(i){return new a.FeatureGroup(i)};a.Renderer=a.Layer.extend({options:{padding:0.1},initialize:function(i){a.setOptions(this,i);a.stamp(this);this._layers=this._layers||{}},onAdd:function(){if(!this._container){this._initContainer();if(this._zoomAnimated){a.DomUtil.addClass(this._container,"leaflet-zoom-animated")}}this.getPane().appendChild(this._container);this._update();this.on("update",this._updatePaths,this)},onRemove:function(){a.DomUtil.remove(this._container);this.off("update",this._updatePaths,this)},getEvents:function(){var i={viewreset:this._reset,zoom:this._onZoom,moveend:this._update,zoomend:this._onZoomEnd};if(this._zoomAnimated){i.zoomanim=this._onAnimZoom}return i},_onAnimZoom:function(i){this._updateTransform(i.center,i.zoom)},_onZoom:function(){this._updateTransform(this._map.getCenter(),this._map.getZoom())},_updateTransform:function(i,q){var l=this._map.getZoomScale(q,this._zoom),n=a.DomUtil.getPosition(this._container),o=this._map.getSize().multiplyBy(0.5+this.options.padding),j=this._map.project(this._center,q),m=this._map.project(i,q),p=m.subtract(j),k=o.multiplyBy(-l).add(n).add(o).subtract(p);if(a.Browser.any3d){a.DomUtil.setTransform(this._container,k,l)}else{a.DomUtil.setPosition(this._container,k)}},_reset:function(){this._update();this._updateTransform(this._center,this._zoom);for(var i in this._layers){this._layers[i]._reset()}},_onZoomEnd:function(){for(var i in this._layers){this._layers[i]._project()}},_updatePaths:function(){for(var i in this._layers){this._layers[i]._update()}},_update:function(){var k=this.options.padding,j=this._map.getSize(),i=this._map.containerPointToLayerPoint(j.multiplyBy(-k)).round();this._bounds=new a.Bounds(i,i.add(j.multiplyBy(1+k*2)).round());this._center=this._map.getCenter();this._zoom=this._map.getZoom()}});a.Map.include({getRenderer:function(i){var j=i.options.renderer||this._getPaneRenderer(i.options.pane)||this.options.renderer||this._renderer;if(!j){j=this._renderer=(this.options.preferCanvas&&a.canvas())||a.svg()}if(!this.hasLayer(j)){this.addLayer(j)}return j},_getPaneRenderer:function(i){if(i==="overlayPane"||i===h){return false}var j=this._paneRenderers[i];if(j===h){j=(a.SVG&&a.svg({pane:i}))||(a.Canvas&&a.canvas({pane:i}));this._paneRenderers[i]=j}return j}});a.Path=a.Layer.extend({options:{stroke:true,color:"#3388ff",weight:3,opacity:1,lineCap:"round",lineJoin:"round",dashArray:null,dashOffset:null,fill:false,fillColor:null,fillOpacity:0.2,fillRule:"evenodd",interactive:true},beforeAdd:function(i){this._renderer=i.getRenderer(this)},onAdd:function(){this._renderer._initPath(this);this._reset();this._renderer._addPath(this)},onRemove:function(){this._renderer._removePath(this)},redraw:function(){if(this._map){this._renderer._updatePath(this)}return this},setStyle:function(i){a.setOptions(this,i);if(this._renderer){this._renderer._updateStyle(this)}return this},bringToFront:function(){if(this._renderer){this._renderer._bringToFront(this)}return this},bringToBack:function(){if(this._renderer){this._renderer._bringToBack(this)}return this},getElement:function(){return this._path},_reset:function(){this._project();this._update()},_clickTolerance:function(){return(this.options.stroke?this.options.weight/2:0)+(a.Browser.touch?10:0)}});a.LineUtil={simplify:function(k,i){if(!i||!k.length){return k.slice()}var j=i*i;k=this._reducePoints(k,j);k=this._simplifyDP(k,j);return k},pointToSegmentDistance:function(j,k,i){return Math.sqrt(this._sqClosestPointOnSegment(j,k,i,true))},closestPointOnSegment:function(j,k,i){return this._sqClosestPointOnSegment(j,k,i)},_simplifyDP:function(n,k){var j=n.length,m=typeof Uint8Array!==h+""?Uint8Array:Array,p=new m(j);p[0]=p[j-1]=1;this._simplifyDPStep(n,p,k,0,j-1);var l,o=[];for(l=0;l<j;l++){if(p[l]){o.push(n[l])}}return o},_simplifyDPStep:function(r,k,j,o,q){var l=0,p,m,n;for(m=o+1;m<=q-1;m++){n=this._sqClosestPointOnSegment(r[m],r[o],r[q],true);if(n>l){p=m;l=n}}if(l>j){k[p]=1;this._simplifyDPStep(r,k,j,o,p);this._simplifyDPStep(r,k,j,p,q)}},_reducePoints:function(m,k){var o=[m[0]];for(var l=1,n=0,j=m.length;l<j;l++){if(this._sqDist(m[l],m[n])>k){o.push(m[l]);n=l}}if(n<j-1){o.push(m[j-1])}return o},clipSegment:function(q,o,i,r,s){var m=r?this._lastCode:this._getBitCode(q,i),k=this._getBitCode(o,i),l,j,n;this._lastCode=k;while(true){if(!(m|k)){return[q,o]}if(m&k){return false}l=m||k;j=this._getEdgeIntersection(q,o,l,i,s);n=this._getBitCode(j,i);if(l===m){q=j;m=n}else{o=j;k=n}}},_getEdgeIntersection:function(p,n,j,i,q){var s=n.x-p.x,r=n.y-p.y,k=i.min,m=i.max,o,l;if(j&8){o=p.x+s*(m.y-p.y)/r;l=m.y}else{if(j&4){o=p.x+s*(k.y-p.y)/r;l=k.y}else{if(j&2){o=m.x;l=p.y+r*(m.x-p.x)/s}else{if(j&1){o=k.x;l=p.y+r*(k.x-p.x)/s}}}}return new a.Point(o,l,q)},_getBitCode:function(k,j){var i=0;if(k.x<j.min.x){i|=1}else{if(k.x>j.max.x){i|=2}}if(k.y<j.min.y){i|=4}else{if(k.y>j.max.y){i|=8}}return i},_sqDist:function(l,k){var j=k.x-l.x,i=k.y-l.y;return j*j+i*i},_sqClosestPointOnSegment:function(j,o,n,k){var m=o.x,l=o.y,s=n.x-m,r=n.y-l,i=s*s+r*r,q;if(i>0){q=((j.x-m)*s+(j.y-l)*r)/i;if(q>1){m=n.x;l=n.y}else{if(q>0){m+=s*q;l+=r*q}}}s=j.x-m;r=j.y-l;return k?s*s+r*r:new a.Point(m,l)}};a.Polyline=a.Path.extend({options:{smoothFactor:1,noClip:false},initialize:function(i,j){a.setOptions(this,j);this._setLatLngs(i)},getLatLngs:function(){return this._latlngs},setLatLngs:function(i){this._setLatLngs(i);return this.redraw()},isEmpty:function(){return !this._latlngs.length},closestLayerPoint:function(k){var t=Infinity,r=null,l=a.LineUtil._sqClosestPointOnSegment,v,u;for(var m=0,w=this._parts.length;m<w;m++){var s=this._parts[m];for(var n=1,q=s.length;n<q;n++){v=s[n-1];u=s[n];var o=l(k,v,u,true);if(o<t){t=o;r=l(k,v,u)}}}if(r){r.distance=Math.sqrt(t)}return r},getCenter:function(){if(!this._map){throw new Error("Must add layer to map before using getCenter()")}var l,j,k,o,r,p,n,q=this._rings[0],m=q.length;if(!m){return null}for(l=0,j=0;l<m-1;l++){j+=q[l].distanceTo(q[l+1])/2}if(j===0){return this._map.layerPointToLatLng(q[0])}for(l=0,o=0;l<m-1;l++){r=q[l];p=q[l+1];k=r.distanceTo(p);o+=k;if(o>j){n=(o-j)/k;return this._map.layerPointToLatLng([p.x-n*(p.x-r.x),p.y-n*(p.y-r.y)])}}},getBounds:function(){return this._bounds},addLatLng:function(j,i){i=i||this._defaultShape();j=a.latLng(j);i.push(j);this._bounds.extend(j);return this.redraw()},_setLatLngs:function(i){this._bounds=new a.LatLngBounds();this._latlngs=this._convertLatLngs(i)},_defaultShape:function(){return a.Polyline._flat(this._latlngs)?this._latlngs:this._latlngs[0]},_convertLatLngs:function(l){var k=[],n=a.Polyline._flat(l);for(var m=0,j=l.length;m<j;m++){if(n){k[m]=a.latLng(l[m]);this._bounds.extend(k[m])}else{k[m]=this._convertLatLngs(l[m])}}return k},_project:function(){var j=new a.Bounds();this._rings=[];this._projectLatlngs(this._latlngs,this._rings,j);var i=this._clickTolerance(),k=new a.Point(i,i);if(this._bounds.isValid()&&j.isValid()){j.min._subtract(k);j.max._add(k);this._pxBounds=j}},_projectLatlngs:function(l,k,o){var p=l[0] instanceof a.LatLng,j=l.length,n,m;if(p){m=[];for(n=0;n<j;n++){m[n]=this._map.latLngToLayerPoint(l[n]);o.extend(m[n])}k.push(m)}else{for(n=0;n<j;n++){this._projectLatlngs(l[n],k,o)}}},_clipPoints:function(){var l=this._renderer._bounds;this._parts=[];if(!this._pxBounds||!this._pxBounds.intersects(l)){return}if(this.options.noClip){this._parts=this._rings;return}var o=this._parts,q,p,m,s,n,r,t;for(q=0,m=0,s=this._rings.length;q<s;q++){t=this._rings[q];for(p=0,n=t.length;p<n-1;p++){r=a.LineUtil.clipSegment(t[p],t[p+1],l,p,true);if(!r){continue}o[m]=o[m]||[];o[m].push(r[0]);if((r[1]!==t[p+1])||(p===n-2)){o[m].push(r[1]);m++}}}},_simplifyPoints:function(){var m=this._parts,k=this.options.smoothFactor;for(var l=0,j=m.length;l<j;l++){m[l]=a.LineUtil.simplify(m[l],k)}},_update:function(){if(!this._map){return}this._clipPoints();this._simplifyPoints();this._updatePath()},_updatePath:function(){this._renderer._updatePoly(this)}});a.polyline=function(i,j){return new a.Polyline(i,j)};a.Polyline._flat=function(i){return !a.Util.isArray(i[0])||(typeof i[0][0]!=="object"&&typeof i[0][0]!=="undefined")};a.PolyUtil={};a.PolyUtil.clipPolygon=function(y,l,z){var v,s=[1,4,2,8],t,r,q,x,w,u,n,m,o=a.LineUtil;for(t=0,u=y.length;t<u;t++){y[t]._code=o._getBitCode(y[t],l)}for(q=0;q<4;q++){n=s[q];v=[];for(t=0,u=y.length,r=u-1;t<u;r=t++){x=y[t];w=y[r];if(!(x._code&n)){if(w._code&n){m=o._getEdgeIntersection(w,x,n,l,z);m._code=o._getBitCode(m,l);v.push(m)}v.push(x)}else{if(!(w._code&n)){m=o._getEdgeIntersection(w,x,n,l,z);m._code=o._getBitCode(m,l);v.push(m)}}}y=v}return y};a.Polygon=a.Polyline.extend({options:{fill:true},isEmpty:function(){return !this._latlngs.length||!this._latlngs[0].length},getCenter:function(){if(!this._map){throw new Error("Must add layer to map before using getCenter()")}var n,m,u,t,p,l,r,q,k,s=this._rings[0],o=s.length;if(!o){return null}l=r=q=0;for(n=0,m=o-1;n<o;m=n++){u=s[n];t=s[m];p=u.y*t.x-t.y*u.x;r+=(u.x+t.x)*p;q+=(u.y+t.y)*p;l+=p*3}if(l===0){k=s[0]}else{k=[r/l,q/l]}return this._map.layerPointToLatLng(k)},_convertLatLngs:function(k){var j=a.Polyline.prototype._convertLatLngs.call(this,k),i=j.length;if(i>=2&&j[0] instanceof a.LatLng&&j[0].equals(j[i-1])){j.pop()}return j},_setLatLngs:function(i){a.Polyline.prototype._setLatLngs.call(this,i);if(a.Polyline._flat(this._latlngs)){this._latlngs=[this._latlngs]}},_defaultShape:function(){return a.Polyline._flat(this._latlngs[0])?this._latlngs[0]:this._latlngs[0][0]},_clipPoints:function(){var n=this._renderer._bounds,l=this.options.weight,o=new a.Point(l,l);n=new a.Bounds(n.min.subtract(o),n.max.add(o));this._parts=[];if(!this._pxBounds||!this._pxBounds.intersects(n)){return}if(this.options.noClip){this._parts=this._rings;return}for(var m=0,k=this._rings.length,j;m<k;m++){j=a.PolyUtil.clipPolygon(this._rings[m],n,true);if(j.length){this._parts.push(j)}}},_updatePath:function(){this._renderer._updatePoly(this,true)}});a.polygon=function(i,j){return new a.Polygon(i,j)};a.Rectangle=a.Polygon.extend({initialize:function(j,i){a.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(j),i)},setBounds:function(i){return this.setLatLngs(this._boundsToLatLngs(i))},_boundsToLatLngs:function(i){i=a.latLngBounds(i);return[i.getSouthWest(),i.getNorthWest(),i.getNorthEast(),i.getSouthEast()]}});a.rectangle=function(j,i){return new a.Rectangle(j,i)};a.CircleMarker=a.Path.extend({options:{fill:true,radius:10},initialize:function(j,i){a.setOptions(this,i);this._latlng=a.latLng(j);this._radius=this.options.radius},setLatLng:function(i){this._latlng=a.latLng(i);this.redraw();return this.fire("move",{latlng:this._latlng})},getLatLng:function(){return this._latlng},setRadius:function(i){this.options.radius=this._radius=i;return this.redraw()},getRadius:function(){return this._radius},setStyle:function(j){var i=j&&j.radius||this._radius;a.Path.prototype.setStyle.call(this,j);this.setRadius(i);return this},_project:function(){this._point=this._map.latLngToLayerPoint(this._latlng);this._updateBounds()},_updateBounds:function(){var k=this._radius,j=this._radiusY||k,i=this._clickTolerance(),l=[k+i,j+i];this._pxBounds=new a.Bounds(this._point.subtract(l),this._point.add(l))},_update:function(){if(this._map){this._updatePath()}},_updatePath:function(){this._renderer._updateCircle(this)},_empty:function(){return this._radius&&!this._renderer._bounds.intersects(this._pxBounds)}});a.circleMarker=function(j,i){return new a.CircleMarker(j,i)};a.Circle=a.CircleMarker.extend({initialize:function(k,j,i){if(typeof j==="number"){j=a.extend({},i,{radius:j})}a.setOptions(this,j);this._latlng=a.latLng(k);if(isNaN(this.options.radius)){throw new Error("Circle radius cannot be NaN")}this._mRadius=this.options.radius},setRadius:function(i){this._mRadius=i;return this.redraw()},getRadius:function(){return this._mRadius},getBounds:function(){var i=[this._radius,this._radiusY||this._radius];return new a.LatLngBounds(this._map.layerPointToLatLng(this._point.subtract(i)),this._map.layerPointToLatLng(this._point.add(i)))},setStyle:a.Path.prototype.setStyle,_project:function(){var r=this._latlng.lng,o=this._latlng.lat,j=this._map,t=j.options.crs;if(t.distance===a.CRS.Earth.distance){var n=Math.PI/180,u=(this._mRadius/a.CRS.Earth.R)/n,q=j.project([o+u,r]),i=j.project([o-u,r]),k=q.add(i).divideBy(2),m=j.unproject(k).lat,l=Math.acos((Math.cos(u*n)-Math.sin(o*n)*Math.sin(m*n))/(Math.cos(o*n)*Math.cos(m*n)))/n;if(isNaN(l)||l===0){l=u/Math.cos(Math.PI/180*o)}this._point=k.subtract(j.getPixelOrigin());this._radius=isNaN(l)?0:Math.max(Math.round(k.x-j.project([m,r-l]).x),1);this._radiusY=Math.max(Math.round(k.y-q.y),1)}else{var s=t.unproject(t.project(this._latlng).subtract([this._mRadius,0]));this._point=j.latLngToLayerPoint(this._latlng);this._radius=this._point.x-j.latLngToLayerPoint(s).x}this._updateBounds()}});a.circle=function(k,j,i){return new a.Circle(k,j,i)};a.SVG=a.Renderer.extend({getEvents:function(){var i=a.Renderer.prototype.getEvents.call(this);i.zoomstart=this._onZoomStart;return i},_initContainer:function(){this._container=a.SVG.create("svg");this._container.setAttribute("pointer-events","none");this._rootGroup=a.SVG.create("g");this._container.appendChild(this._rootGroup)},_onZoomStart:function(){this._update()},_update:function(){if(this._map._animatingZoom&&this._bounds){return}a.Renderer.prototype._update.call(this);var i=this._bounds,k=i.getSize(),j=this._container;if(!this._svgSize||!this._svgSize.equals(k)){this._svgSize=k;j.setAttribute("width",k.x);j.setAttribute("height",k.y)}a.DomUtil.setPosition(j,i.min);j.setAttribute("viewBox",[i.min.x,i.min.y,k.x,k.y].join(" "));this.fire("update")},_initPath:function(i){var j=i._path=a.SVG.create("path");if(i.options.className){a.DomUtil.addClass(j,i.options.className)}if(i.options.interactive){a.DomUtil.addClass(j,"leaflet-interactive")}this._updateStyle(i);this._layers[a.stamp(i)]=i},_addPath:function(i){this._rootGroup.appendChild(i._path);i.addInteractiveTarget(i._path)},_removePath:function(i){a.DomUtil.remove(i._path);i.removeInteractiveTarget(i._path);delete this._layers[a.stamp(i)]},_updatePath:function(i){i._project();i._update()},_updateStyle:function(j){var k=j._path,i=j.options;if(!k){return}if(i.stroke){k.setAttribute("stroke",i.color);k.setAttribute("stroke-opacity",i.opacity);k.setAttribute("stroke-width",i.weight);k.setAttribute("stroke-linecap",i.lineCap);k.setAttribute("stroke-linejoin",i.lineJoin);if(i.dashArray){k.setAttribute("stroke-dasharray",i.dashArray)}else{k.removeAttribute("stroke-dasharray")}if(i.dashOffset){k.setAttribute("stroke-dashoffset",i.dashOffset)}else{k.removeAttribute("stroke-dashoffset")}}else{k.setAttribute("stroke","none")}if(i.fill){k.setAttribute("fill",i.fillColor||i.color);k.setAttribute("fill-opacity",i.fillOpacity);k.setAttribute("fill-rule",i.fillRule||"evenodd")}else{k.setAttribute("fill","none")}},_updatePoly:function(j,i){this._setPath(j,a.SVG.pointsToPath(j._parts,i))},_updateCircle:function(k){var m=k._point,l=k._radius,i=k._radiusY||l,j="a"+l+","+i+" 0 1,0 ";var n=k._empty()?"M0 0":"M"+(m.x-l)+","+m.y+j+(l*2)+",0 "+j+(-l*2)+",0 ";this._setPath(k,n)},_setPath:function(i,j){i._path.setAttribute("d",j)},_bringToFront:function(i){a.DomUtil.toFront(i._path)},_bringToBack:function(i){a.DomUtil.toBack(i._path)}});a.extend(a.SVG,{create:function(i){return b.createElementNS("http://www.w3.org/2000/svg",i)},pointsToPath:function(s,o){var r="",n,m,q,l,t,k;for(n=0,q=s.length;n<q;n++){t=s[n];for(m=0,l=t.length;m<l;m++){k=t[m];r+=(m?"L":"M")+k.x+" "+k.y}r+=o?(a.Browser.svg?"z":"x"):""}return r||"M0 0"}});a.Browser.svg=!!(b.createElementNS&&a.SVG.create("svg").createSVGRect);a.svg=function(i){return a.Browser.svg||a.Browser.vml?new a.SVG(i):null};a.Browser.vml=!a.Browser.svg&&(function(){try{var k=b.createElement("div");k.innerHTML='<v:shape adj="1"/>';var i=k.firstChild;i.style.behavior="url(#default#VML)";return i&&(typeof i.adj==="object")}catch(j){return false}}());a.SVG.include(!a.Browser.vml?{}:{_initContainer:function(){this._container=a.DomUtil.create("div","leaflet-vml-container")},_update:function(){if(this._map._animatingZoom){return}a.Renderer.prototype._update.call(this);this.fire("update")},_initPath:function(j){var i=j._container=a.SVG.create("shape");a.DomUtil.addClass(i,"leaflet-vml-shape "+(this.options.className||""));i.coordsize="1 1";j._path=a.SVG.create("path");i.appendChild(j._path);this._updateStyle(j);this._layers[a.stamp(j)]=j},_addPath:function(j){var i=j._container;this._container.appendChild(i);if(j.options.interactive){j.addInteractiveTarget(i)}},_removePath:function(j){var i=j._container;a.DomUtil.remove(i);j.removeInteractiveTarget(i);delete this._layers[a.stamp(j)]},_updateStyle:function(k){var m=k._stroke,l=k._fill,j=k.options,i=k._container;i.stroked=!!j.stroke;i.filled=!!j.fill;if(j.stroke){if(!m){m=k._stroke=a.SVG.create("stroke")}i.appendChild(m);m.weight=j.weight+"px";m.color=j.color;m.opacity=j.opacity;if(j.dashArray){m.dashStyle=a.Util.isArray(j.dashArray)?j.dashArray.join(" "):j.dashArray.replace(/( *, *)/g," ")}else{m.dashStyle=""}m.endcap=j.lineCap.replace("butt","flat");m.joinstyle=j.lineJoin}else{if(m){i.removeChild(m);k._stroke=null}}if(j.fill){if(!l){l=k._fill=a.SVG.create("fill")}i.appendChild(l);l.color=j.fillColor||j.color;l.opacity=j.fillOpacity}else{if(l){i.removeChild(l);k._fill=null}}},_updateCircle:function(j){var l=j._point.round(),k=Math.round(j._radius),i=Math.round(j._radiusY||k);this._setPath(j,j._empty()?"M0 0":"AL "+l.x+","+l.y+" "+k+","+i+" 0,"+(65535*360))},_setPath:function(i,j){i._path.v=j},_bringToFront:function(i){a.DomUtil.toFront(i._container)},_bringToBack:function(i){a.DomUtil.toBack(i._container)}});if(a.Browser.vml){a.SVG.create=(function(){try{b.namespaces.add("lvml","urn:schemas-microsoft-com:vml");return function(j){return b.createElement("<lvml:"+j+' class="lvml">')}}catch(i){return function(j){return b.createElement("<"+j+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}})()}a.Canvas=a.Renderer.extend({getEvents:function(){var i=a.Renderer.prototype.getEvents.call(this);i.viewprereset=this._onViewPreReset;return i},_onViewPreReset:function(){this._postponeUpdatePaths=true},onAdd:function(){a.Renderer.prototype.onAdd.call(this);this._draw()},_initContainer:function(){var i=this._container=b.createElement("canvas");a.DomEvent.on(i,"mousemove",a.Util.throttle(this._onMouseMove,32,this),this).on(i,"click dblclick mousedown mouseup contextmenu",this._onClick,this).on(i,"mouseout",this._handleMouseOut,this);this._ctx=i.getContext("2d")},_updatePaths:function(){if(this._postponeUpdatePaths){return}var i;this._redrawBounds=null;for(var j in this._layers){i=this._layers[j];i._update()}this._redraw()},_update:function(){if(this._map._animatingZoom&&this._bounds){return}this._drawnLayers={};a.Renderer.prototype._update.call(this);var j=this._bounds,k=this._container,l=j.getSize(),i=a.Browser.retina?2:1;a.DomUtil.setPosition(k,j.min);k.width=i*l.x;k.height=i*l.y;k.style.width=l.x+"px";k.style.height=l.y+"px";if(a.Browser.retina){this._ctx.scale(2,2)}this._ctx.translate(-j.min.x,-j.min.y);this.fire("update")},_reset:function(){a.Renderer.prototype._reset.call(this);if(this._postponeUpdatePaths){this._postponeUpdatePaths=false;this._updatePaths()}},_initPath:function(j){this._updateDashArray(j);this._layers[a.stamp(j)]=j;var i=j._order={layer:j,prev:this._drawLast,next:null};if(this._drawLast){this._drawLast.next=i}this._drawLast=i;this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(i){this._requestRedraw(i)},_removePath:function(j){var i=j._order;var k=i.next;var l=i.prev;if(k){k.prev=l}else{this._drawLast=l}if(l){l.next=k}else{this._drawFirst=k}delete j._order;delete this._layers[a.stamp(j)];this._requestRedraw(j)},_updatePath:function(i){this._extendRedrawBounds(i);i._project();i._update();this._requestRedraw(i)},_updateStyle:function(i){this._updateDashArray(i);this._requestRedraw(i)},_updateDashArray:function(l){if(l.options.dashArray){var m=l.options.dashArray.split(","),j=[],k;for(k=0;k<m.length;k++){j.push(Number(m[k]))}l.options._dashArray=j}},_requestRedraw:function(i){if(!this._map){return}this._extendRedrawBounds(i);this._redrawRequest=this._redrawRequest||a.Util.requestAnimFrame(this._redraw,this)},_extendRedrawBounds:function(i){var j=(i.options.weight||0)+1;this._redrawBounds=this._redrawBounds||new a.Bounds();this._redrawBounds.extend(i._pxBounds.min.subtract([j,j]));this._redrawBounds.extend(i._pxBounds.max.add([j,j]))},_redraw:function(){this._redrawRequest=null;if(this._redrawBounds){this._redrawBounds.min._floor();this._redrawBounds.max._ceil()}this._clear();this._draw();this._redrawBounds=null},_clear:function(){var j=this._redrawBounds;if(j){var i=j.getSize();this._ctx.clearRect(j.min.x,j.min.y,i.x,i.y)}else{this._ctx.clearRect(0,0,this._container.width,this._container.height)}},_draw:function(){var k,l=this._redrawBounds;this._ctx.save();if(l){var j=l.getSize();this._ctx.beginPath();this._ctx.rect(l.min.x,l.min.y,j.x,j.y);this._ctx.clip()}this._drawing=true;for(var i=this._drawFirst;i;i=i.next){k=i.layer;if(!l||(k._pxBounds&&k._pxBounds.intersects(l))){k._updatePath()}}this._drawing=false;this._ctx.restore()},_updatePoly:function(q,r){if(!this._drawing){return}var o,n,l,k,m=q._parts,s=m.length,t=this._ctx;if(!s){return}this._drawnLayers[q._leaflet_id]=q;t.beginPath();if(t.setLineDash){t.setLineDash(q.options&&q.options._dashArray||[])}for(o=0;o<s;o++){for(n=0,l=m[o].length;n<l;n++){k=m[o][n];t[n?"lineTo":"moveTo"](k.x,k.y)}if(r){t.closePath()}}this._fillStroke(t,q)},_updateCircle:function(j){if(!this._drawing||j._empty()){return}var m=j._point,i=this._ctx,l=j._radius,k=(j._radiusY||l)/l;this._drawnLayers[j._leaflet_id]=j;if(k!==1){i.save();i.scale(1,k)}i.beginPath();i.arc(m.x,m.y/k,l,0,Math.PI*2,false);if(k!==1){i.restore()}this._fillStroke(i,j)},_fillStroke:function(i,k){var j=k.options;if(j.fill){i.globalAlpha=j.fillOpacity;i.fillStyle=j.fillColor||j.color;i.fill(j.fillRule||"evenodd")}if(j.stroke&&j.weight!==0){i.globalAlpha=j.opacity;i.lineWidth=j.weight;i.strokeStyle=j.color;i.lineCap=j.lineCap;i.lineJoin=j.lineJoin;i.stroke()}},_onClick:function(m){var j=this._map.mouseEventToLayerPoint(m),k,l;for(var i=this._drawFirst;i;i=i.next){k=i.layer;if(k.options.interactive&&k._containsPoint(j)&&!this._map._draggableMoved(k)){l=k}}if(l){a.DomEvent._fakeStop(m);this._fireEvent([l],m)}},_onMouseMove:function(j){if(!this._map||this._map.dragging.moving()||this._map._animatingZoom){return}var i=this._map.mouseEventToLayerPoint(j);this._handleMouseHover(j,i)},_handleMouseOut:function(j){var i=this._hoveredLayer;if(i){a.DomUtil.removeClass(this._container,"leaflet-interactive");this._fireEvent([i],j,"mouseout");this._hoveredLayer=null}},_handleMouseHover:function(m,j){var l,k;for(var i=this._drawFirst;i;i=i.next){l=i.layer;if(l.options.interactive&&l._containsPoint(j)){k=l}}if(k!==this._hoveredLayer){this._handleMouseOut(m);if(k){a.DomUtil.addClass(this._container,"leaflet-interactive");this._fireEvent([k],m,"mouseover");this._hoveredLayer=k}}if(this._hoveredLayer){this._fireEvent([this._hoveredLayer],m)}},_fireEvent:function(k,j,i){this._map._fireDOMEvent(j,i||j.type,k)},_bringToFront:function(j){var i=j._order;var k=i.next;var l=i.prev;if(k){k.prev=l}else{return}if(l){l.next=k}else{if(k){this._drawFirst=k}}i.prev=this._drawLast;this._drawLast.next=i;i.next=null;this._drawLast=i;this._requestRedraw(j)},_bringToBack:function(j){var i=j._order;var k=i.next;var l=i.prev;if(l){l.next=k}else{return}if(k){k.prev=l}else{if(l){this._drawLast=l}}i.prev=null;i.next=this._drawFirst;this._drawFirst.prev=i;this._drawFirst=i;this._requestRedraw(j)}});a.Browser.canvas=(function(){return !!b.createElement("canvas").getContext}());a.canvas=function(i){return a.Browser.canvas?new a.Canvas(i):null};a.Polyline.prototype._containsPoint=function(l,s){var r,q,n,t,o,m,u=this._clickTolerance();if(!this._pxBounds.contains(l)){return false}for(r=0,t=this._parts.length;r<t;r++){m=this._parts[r];for(q=0,o=m.length,n=o-1;q<o;n=q++){if(!s&&(q===0)){continue}if(a.LineUtil.pointToSegmentDistance(l,m[n],m[q])<=u){return true}}}return false};a.Polygon.prototype._containsPoint=function(l){var n=false,m,v,u,s,r,q,t,o;if(!this._pxBounds.contains(l)){return false}for(s=0,t=this._parts.length;s<t;s++){m=this._parts[s];for(r=0,o=m.length,q=o-1;r<o;q=r++){v=m[r];u=m[q];if(((v.y>l.y)!==(u.y>l.y))&&(l.x<(u.x-v.x)*(l.y-v.y)/(u.y-v.y)+v.x)){n=!n}}}return n||a.Polyline.prototype._containsPoint.call(this,l,true)};a.CircleMarker.prototype._containsPoint=function(i){return i.distanceTo(this._point)<=this._radius+this._clickTolerance()};a.GeoJSON=a.FeatureGroup.extend({initialize:function(j,i){a.setOptions(this,i);this._layers={};if(j){this.addData(j)}},addData:function(l){var p=a.Util.isArray(l)?l:l.features,o,j,n;if(p){for(o=0,j=p.length;o<j;o++){n=p[o];if(n.geometries||n.geometry||n.features||n.coordinates){this.addData(n)}}return this}var k=this.options;if(k.filter&&!k.filter(l)){return this}var m=a.GeoJSON.geometryToLayer(l,k);if(!m){return this}m.feature=a.GeoJSON.asFeature(l);m.defaultOptions=m.options;this.resetStyle(m);if(k.onEachFeature){k.onEachFeature(l,m)}return this.addLayer(m)},resetStyle:function(i){i.options=a.Util.extend({},i.defaultOptions);this._setLayerStyle(i,this.options.style);return this},setStyle:function(i){return this.eachLayer(function(j){this._setLayerStyle(j,i)},this)},_setLayerStyle:function(i,j){if(typeof j==="function"){j=j(i.feature)}if(i.setStyle){i.setStyle(j)}}});a.extend(a.GeoJSON,{geometryToLayer:function(k,u){var s=k.type==="Feature"?k.geometry:k,t=s?s.coordinates:null,p=[],l=u&&u.pointToLayer,m=u&&u.coordsToLatLng||this.coordsToLatLng,n,j,o,r;if(!t&&!s){return null}switch(s.type){case"Point":n=m(t);return l?l(k,n):new a.Marker(n);case"MultiPoint":for(o=0,r=t.length;o<r;o++){n=m(t[o]);p.push(l?l(k,n):new a.Marker(n))}return new a.FeatureGroup(p);case"LineString":case"MultiLineString":j=this.coordsToLatLngs(t,s.type==="LineString"?0:1,m);return new a.Polyline(j,u);case"Polygon":case"MultiPolygon":j=this.coordsToLatLngs(t,s.type==="Polygon"?1:2,m);return new a.Polygon(j,u);case"GeometryCollection":for(o=0,r=s.geometries.length;o<r;o++){var q=this.geometryToLayer({geometry:s.geometries[o],type:"Feature",properties:k.properties},u);if(q){p.push(q)}}return new a.FeatureGroup(p);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(i){return new a.LatLng(i[1],i[0],i[2])},coordsToLatLngs:function(n,m,p){var k=[];for(var l=0,j=n.length,o;l<j;l++){o=m?this.coordsToLatLngs(n[l],m-1,p):(p||this.coordsToLatLng)(n[l]);k.push(o)}return k},latLngToCoords:function(i){return i.alt!==h?[i.lng,i.lat,i.alt]:[i.lng,i.lat]},latLngsToCoords:function(k,o,l){var n=[];for(var m=0,j=k.length;m<j;m++){n.push(o?a.GeoJSON.latLngsToCoords(k[m],o-1,l):a.GeoJSON.latLngToCoords(k[m]))}if(!o&&l){n.push(n[0])}return n},getFeature:function(j,i){return j.feature?a.extend({},j.feature,{geometry:i}):a.GeoJSON.asFeature(i)},asFeature:function(i){if(i.type==="Feature"||i.type==="FeatureCollection"){return i}return{type:"Feature",properties:{},geometry:i}}});var c={toGeoJSON:function(){return a.GeoJSON.getFeature(this,{type:"Point",coordinates:a.GeoJSON.latLngToCoords(this.getLatLng())})}};a.Marker.include(c);a.Circle.include(c);a.CircleMarker.include(c);a.Polyline.prototype.toGeoJSON=function(){var j=!a.Polyline._flat(this._latlngs);var i=a.GeoJSON.latLngsToCoords(this._latlngs,j?1:0);return a.GeoJSON.getFeature(this,{type:(j?"Multi":"")+"LineString",coordinates:i})};a.Polygon.prototype.toGeoJSON=function(){var i=!a.Polyline._flat(this._latlngs),k=i&&!a.Polyline._flat(this._latlngs[0]);var j=a.GeoJSON.latLngsToCoords(this._latlngs,k?2:i?1:0,true);if(!i){j=[j]}return a.GeoJSON.getFeature(this,{type:(k?"Multi":"")+"Polygon",coordinates:j})};a.LayerGroup.include({toMultiPoint:function(){var i=[];this.eachLayer(function(j){i.push(j.toGeoJSON().geometry.coordinates)});return a.GeoJSON.getFeature(this,{type:"MultiPoint",coordinates:i})},toGeoJSON:function(){var j=this.feature&&this.feature.geometry&&this.feature.geometry.type;if(j==="MultiPoint"){return this.toMultiPoint()}var i=j==="GeometryCollection",k=[];this.eachLayer(function(m){if(m.toGeoJSON){var l=m.toGeoJSON();k.push(i?l.geometry:a.GeoJSON.asFeature(l))}});if(i){return a.GeoJSON.getFeature(this,{geometries:k,type:"GeometryCollection"})}return{type:"FeatureCollection",features:k}}});a.geoJSON=function(j,i){return new a.GeoJSON(j,i)};a.geoJson=a.geoJSON;a.Draggable=a.Evented.extend({options:{clickTolerance:3},statics:{START:a.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"}},initialize:function(j,k,i){this._element=j;this._dragStartTarget=k||j;this._preventOutline=i},enable:function(){if(this._enabled){return}a.DomEvent.on(this._dragStartTarget,a.Draggable.START.join(" "),this._onDown,this);this._enabled=true},disable:function(){if(!this._enabled){return}if(a.Draggable._dragging===this){this.finishDrag()}a.DomEvent.off(this._dragStartTarget,a.Draggable.START.join(" "),this._onDown,this);this._enabled=false;this._moved=false},_onDown:function(i){if(i._simulated||!this._enabled){return}this._moved=false;if(a.DomUtil.hasClass(this._element,"leaflet-zoom-anim")){return}if(a.Draggable._dragging||i.shiftKey||((i.which!==1)&&(i.button!==1)&&!i.touches)){return}a.Draggable._dragging=this;if(this._preventOutline){a.DomUtil.preventOutline(this._element)}a.DomUtil.disableImageDrag();a.DomUtil.disableTextSelection();if(this._moving){return}this.fire("down");var j=i.touches?i.touches[0]:i;this._startPoint=new a.Point(j.clientX,j.clientY);a.DomEvent.on(b,a.Draggable.MOVE[i.type],this._onMove,this).on(b,a.Draggable.END[i.type],this._onUp,this)},_onMove:function(j){if(j._simulated||!this._enabled){return}if(j.touches&&j.touches.length>1){this._moved=true;return}var l=(j.touches&&j.touches.length===1?j.touches[0]:j),i=new a.Point(l.clientX,l.clientY),k=i.subtract(this._startPoint);if(!k.x&&!k.y){return}if(Math.abs(k.x)+Math.abs(k.y)<this.options.clickTolerance){return}a.DomEvent.preventDefault(j);if(!this._moved){this.fire("dragstart");this._moved=true;this._startPos=a.DomUtil.getPosition(this._element).subtract(k);a.DomUtil.addClass(b.body,"leaflet-dragging");this._lastTarget=j.target||j.srcElement;if((f.SVGElementInstance)&&(this._lastTarget instanceof SVGElementInstance)){this._lastTarget=this._lastTarget.correspondingUseElement}a.DomUtil.addClass(this._lastTarget,"leaflet-drag-target")}this._newPos=this._startPos.add(k);this._moving=true;a.Util.cancelAnimFrame(this._animRequest);this._lastEvent=j;this._animRequest=a.Util.requestAnimFrame(this._updatePosition,this,true)},_updatePosition:function(){var i={originalEvent:this._lastEvent};this.fire("predrag",i);a.DomUtil.setPosition(this._element,this._newPos);this.fire("drag",i)},_onUp:function(i){if(i._simulated||!this._enabled){return}this.finishDrag()},finishDrag:function(){a.DomUtil.removeClass(b.body,"leaflet-dragging");if(this._lastTarget){a.DomUtil.removeClass(this._lastTarget,"leaflet-drag-target");this._lastTarget=null}for(var j in a.Draggable.MOVE){a.DomEvent.off(b,a.Draggable.MOVE[j],this._onMove,this).off(b,a.Draggable.END[j],this._onUp,this)}a.DomUtil.enableImageDrag();a.DomUtil.enableTextSelection();if(this._moved&&this._moving){a.Util.cancelAnimFrame(this._animRequest);this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})}this._moving=false;a.Draggable._dragging=false}});a.Handler=a.Class.extend({initialize:function(i){this._map=i},enable:function(){if(this._enabled){return this}this._enabled=true;this.addHooks();return this},disable:function(){if(!this._enabled){return this}this._enabled=false;this.removeHooks();return this},enabled:function(){return !!this._enabled}});a.Map.mergeOptions({dragging:true,inertia:!a.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:Infinity,easeLinearity:0.2,worldCopyJump:false,maxBoundsViscosity:0});a.Map.Drag=a.Handler.extend({addHooks:function(){if(!this._draggable){var i=this._map;this._draggable=new a.Draggable(i._mapPane,i._container);this._draggable.on({down:this._onDown,dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this);this._draggable.on("predrag",this._onPreDragLimit,this);if(i.options.worldCopyJump){this._draggable.on("predrag",this._onPreDragWrap,this);i.on("zoomend",this._onZoomEnd,this);i.whenReady(this._onZoomEnd,this)}}a.DomUtil.addClass(this._map._container,"leaflet-grab leaflet-touch-drag");this._draggable.enable();this._positions=[];this._times=[]},removeHooks:function(){a.DomUtil.removeClass(this._map._container,"leaflet-grab");a.DomUtil.removeClass(this._map._container,"leaflet-touch-drag");this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDown:function(){this._map._stop()},_onDragStart:function(){var j=this._map;if(this._map.options.maxBounds&&this._map.options.maxBoundsViscosity){var i=a.latLngBounds(this._map.options.maxBounds);this._offsetLimit=a.bounds(this._map.latLngToContainerPoint(i.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(i.getSouthEast()).multiplyBy(-1).add(this._map.getSize()));this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))}else{this._offsetLimit=null}j.fire("movestart").fire("dragstart");if(j.options.inertia){this._positions=[];this._times=[]}},_onDrag:function(j){if(this._map.options.inertia){var i=this._lastTime=+new Date(),k=this._lastPos=this._draggable._absPos||this._draggable._newPos;this._positions.push(k);this._times.push(i);if(i-this._times[0]>50){this._positions.shift();this._times.shift()}}this._map.fire("move",j).fire("drag",j)},_onZoomEnd:function(){var j=this._map.getSize().divideBy(2),i=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=i.subtract(j).x;this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(j,i){return j-(j-i)*this._viscosity},_onPreDragLimit:function(){if(!this._viscosity||!this._offsetLimit){return}var j=this._draggable._newPos.subtract(this._draggable._startPos);var i=this._offsetLimit;if(j.x<i.min.x){j.x=this._viscousLimit(j.x,i.min.x)}if(j.y<i.min.y){j.y=this._viscousLimit(j.y,i.min.y)}if(j.x>i.max.x){j.x=this._viscousLimit(j.x,i.max.x)}if(j.y>i.max.y){j.y=this._viscousLimit(j.y,i.max.y)}this._draggable._newPos=this._draggable._startPos.add(j)},_onPreDragWrap:function(){var o=this._worldWidth,n=Math.round(o/2),j=this._initialWorldOffset,i=this._draggable._newPos.x,l=(i-n+j)%o+n-j,k=(i+n+j)%o-n-j,m=Math.abs(l+j)<Math.abs(k+j)?l:k;this._draggable._absPos=this._draggable._newPos.clone();this._draggable._newPos.x=m},_onDragEnd:function(q){var j=this._map,u=j.options,i=!u.inertia||this._times.length<2;j.fire("dragend",q);if(i){j.fire("moveend")}else{var r=this._lastPos.subtract(this._positions[0]),o=(this._lastTime-this._times[0])/1000,n=u.easeLinearity,m=r.multiplyBy(n/o),l=m.distanceTo([0,0]),t=Math.min(u.inertiaMaxSpeed,l),s=m.multiplyBy(t/l),k=t/(u.inertiaDeceleration*n),p=s.multiplyBy(-k/2).round();if(!p.x&&!p.y){j.fire("moveend")}else{p=j._limitOffset(p,j.options.maxBounds);a.Util.requestAnimFrame(function(){j.panBy(p,{duration:k,easeLinearity:n,noMoveStart:true,animate:true})})}}}});a.Map.addInitHook("addHandler","dragging",a.Map.Drag);a.Map.mergeOptions({doubleClickZoom:true});a.Map.DoubleClickZoom=a.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(l){var k=this._map,j=k.getZoom(),m=k.options.zoomDelta,i=l.originalEvent.shiftKey?j-m:j+m;if(k.options.doubleClickZoom==="center"){k.setZoom(i)}else{k.setZoomAround(l.containerPoint,i)}}});a.Map.addInitHook("addHandler","doubleClickZoom",a.Map.DoubleClickZoom);a.Map.mergeOptions({scrollWheelZoom:true,wheelDebounceTime:40,wheelPxPerZoomLevel:60});a.Map.ScrollWheelZoom=a.Handler.extend({addHooks:function(){a.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this);this._delta=0},removeHooks:function(){a.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll,this)},_onWheelScroll:function(k){var l=a.DomEvent.getWheelDelta(k);var i=this._map.options.wheelDebounceTime;this._delta+=l;this._lastMousePos=this._map.mouseEventToContainerPoint(k);if(!this._startTime){this._startTime=+new Date()}var j=Math.max(i-(+new Date()-this._startTime),0);clearTimeout(this._timer);this._timer=setTimeout(a.bind(this._performZoom,this),j);a.DomEvent.stop(k)},_performZoom:function(){var n=this._map,m=n.getZoom(),i=this._map.options.zoomSnap||0;n._stop();var l=this._delta/(this._map.options.wheelPxPerZoomLevel*4),k=4*Math.log(2/(1+Math.exp(-Math.abs(l))))/Math.LN2,j=i?Math.ceil(k/i)*i:k,o=n._limitZoom(m+(this._delta>0?j:-j))-m;this._delta=0;this._startTime=null;if(!o){return}if(n.options.scrollWheelZoom==="center"){n.setZoom(m+o)}else{n.setZoomAround(this._lastMousePos,m+o)}}});a.Map.addInitHook("addHandler","scrollWheelZoom",a.Map.ScrollWheelZoom);a.extend(a.DomEvent,{_touchstart:a.Browser.msPointer?"MSPointerDown":a.Browser.pointer?"pointerdown":"touchstart",_touchend:a.Browser.msPointer?"MSPointerUp":a.Browser.pointer?"pointerup":"touchend",addDoubleTapListener:function(l,t,i){var s,k,p=false,n=250;function m(w){var v;if(a.Browser.pointer){if((!a.Browser.edge)||w.pointerType==="mouse"){return}v=a.DomEvent._pointersCount}else{v=w.touches.length}if(v>1){return}var u=Date.now(),x=u-(s||u);k=w.touches?w.touches[0]:w;p=(x>0&&x<=n);s=u}function q(w){if(p&&!k.cancelBubble){if(a.Browser.pointer){if((!a.Browser.edge)||w.pointerType==="mouse"){return}var u={},x,v;for(v in k){x=k[v];u[v]=x&&x.bind?x.bind(k):x}k=u}k.type="dblclick";t(k);s=null}}var j="_leaflet_",o=this._touchstart,r=this._touchend;l[j+o+i]=m;l[j+r+i]=q;l[j+"dblclick"+i]=t;l.addEventListener(o,m,false);l.addEventListener(r,q,false);l.addEventListener("dblclick",t,false);return this},removeDoubleTapListener:function(k,n){var j="_leaflet_",m=k[j+this._touchstart+n],l=k[j+this._touchend+n],i=k[j+"dblclick"+n];k.removeEventListener(this._touchstart,m,false);k.removeEventListener(this._touchend,l,false);if(!a.Browser.edge){k.removeEventListener("dblclick",i,false)}return this}});a.extend(a.DomEvent,{POINTER_DOWN:a.Browser.msPointer?"MSPointerDown":"pointerdown",POINTER_MOVE:a.Browser.msPointer?"MSPointerMove":"pointermove",POINTER_UP:a.Browser.msPointer?"MSPointerUp":"pointerup",POINTER_CANCEL:a.Browser.msPointer?"MSPointerCancel":"pointercancel",TAG_WHITE_LIST:["INPUT","SELECT","OPTION"],_pointers:{},_pointersCount:0,addPointerListener:function(k,j,i,l){if(j==="touchstart"){this._addPointerStart(k,i,l)}else{if(j==="touchmove"){this._addPointerMove(k,i,l)}else{if(j==="touchend"){this._addPointerEnd(k,i,l)}}}return this},removePointerListener:function(k,j,l){var i=k["_leaflet_"+j+l];if(j==="touchstart"){k.removeEventListener(this.POINTER_DOWN,i,false)}else{if(j==="touchmove"){k.removeEventListener(this.POINTER_MOVE,i,false)}else{if(j==="touchend"){k.removeEventListener(this.POINTER_UP,i,false);k.removeEventListener(this.POINTER_CANCEL,i,false)}}}return this},_addPointerStart:function(k,i,m){var j=a.bind(function(n){if(n.pointerType!=="mouse"&&n.MSPOINTER_TYPE_MOUSE&&n.pointerType!==n.MSPOINTER_TYPE_MOUSE){if(this.TAG_WHITE_LIST.indexOf(n.target.tagName)<0){a.DomEvent.preventDefault(n)}else{return}}this._handlePointer(n,i)},this);k["_leaflet_touchstart"+m]=j;k.addEventListener(this.POINTER_DOWN,j,false);if(!this._pointerDocListener){var l=a.bind(this._globalPointerUp,this);b.documentElement.addEventListener(this.POINTER_DOWN,a.bind(this._globalPointerDown,this),true);b.documentElement.addEventListener(this.POINTER_MOVE,a.bind(this._globalPointerMove,this),true);b.documentElement.addEventListener(this.POINTER_UP,l,true);b.documentElement.addEventListener(this.POINTER_CANCEL,l,true);this._pointerDocListener=true}},_globalPointerDown:function(i){this._pointers[i.pointerId]=i;this._pointersCount++},_globalPointerMove:function(i){if(this._pointers[i.pointerId]){this._pointers[i.pointerId]=i}},_globalPointerUp:function(i){delete this._pointers[i.pointerId];this._pointersCount--},_handlePointer:function(l,k){l.touches=[];for(var j in this._pointers){l.touches.push(this._pointers[j])}l.changedTouches=[l];k(l)},_addPointerMove:function(j,i,l){var k=a.bind(function(m){if((m.pointerType===m.MSPOINTER_TYPE_MOUSE||m.pointerType==="mouse")&&m.buttons===0){return}this._handlePointer(m,i)},this);j["_leaflet_touchmove"+l]=k;j.addEventListener(this.POINTER_MOVE,k,false)},_addPointerEnd:function(j,i,l){var k=a.bind(function(m){this._handlePointer(m,i)},this);j["_leaflet_touchend"+l]=k;j.addEventListener(this.POINTER_UP,k,false);j.addEventListener(this.POINTER_CANCEL,k,false)}});a.Map.mergeOptions({touchZoom:a.Browser.touch&&!a.Browser.android23,bounceAtZoomLimits:true});a.Map.TouchZoom=a.Handler.extend({addHooks:function(){a.DomUtil.addClass(this._map._container,"leaflet-touch-zoom");a.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){a.DomUtil.removeClass(this._map._container,"leaflet-touch-zoom");a.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(k){var j=this._map;if(!k.touches||k.touches.length!==2||j._animatingZoom||this._zooming){return}var l=j.mouseEventToContainerPoint(k.touches[0]),i=j.mouseEventToContainerPoint(k.touches[1]);this._centerPoint=j.getSize()._divideBy(2);this._startLatLng=j.containerPointToLatLng(this._centerPoint);if(j.options.touchZoom!=="center"){this._pinchStartLatLng=j.containerPointToLatLng(l.add(i)._divideBy(2))}this._startDist=l.distanceTo(i);this._startZoom=j.getZoom();this._moved=false;this._zooming=true;j._stop();a.DomEvent.on(b,"touchmove",this._onTouchMove,this).on(b,"touchend",this._onTouchEnd,this);a.DomEvent.preventDefault(k)},_onTouchMove:function(l){if(!l.touches||l.touches.length!==2||!this._zooming){return}var k=this._map,n=k.mouseEventToContainerPoint(l.touches[0]),j=k.mouseEventToContainerPoint(l.touches[1]),m=n.distanceTo(j)/this._startDist;this._zoom=k.getScaleZoom(m,this._startZoom);if(!k.options.bounceAtZoomLimits&&((this._zoom<k.getMinZoom()&&m<1)||(this._zoom>k.getMaxZoom()&&m>1))){this._zoom=k._limitZoom(this._zoom)}if(k.options.touchZoom==="center"){this._center=this._startLatLng;if(m===1){return}}else{var o=n._add(j)._divideBy(2)._subtract(this._centerPoint);if(m===1&&o.x===0&&o.y===0){return}this._center=k.unproject(k.project(this._pinchStartLatLng,this._zoom).subtract(o),this._zoom)}if(!this._moved){k._moveStart(true);this._moved=true}a.Util.cancelAnimFrame(this._animRequest);var i=a.bind(k._move,k,this._center,this._zoom,{pinch:true,round:false});this._animRequest=a.Util.requestAnimFrame(i,this,true);a.DomEvent.preventDefault(l)},_onTouchEnd:function(){if(!this._moved||!this._zooming){this._zooming=false;return}this._zooming=false;a.Util.cancelAnimFrame(this._animRequest);a.DomEvent.off(b,"touchmove",this._onTouchMove).off(b,"touchend",this._onTouchEnd);if(this._map.options.zoomAnimation){this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),true,this._map.options.zoomSnap)}else{this._map._resetView(this._center,this._map._limitZoom(this._zoom))}}});a.Map.addInitHook("addHandler","touchZoom",a.Map.TouchZoom);a.Map.mergeOptions({tap:true,tapTolerance:15});a.Map.Tap=a.Handler.extend({addHooks:function(){a.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){a.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(j){if(!j.touches){return}a.DomEvent.preventDefault(j);this._fireClick=true;if(j.touches.length>1){this._fireClick=false;clearTimeout(this._holdTimeout);return}var k=j.touches[0],i=k.target;this._startPos=this._newPos=new a.Point(k.clientX,k.clientY);if(i.tagName&&i.tagName.toLowerCase()==="a"){a.DomUtil.addClass(i,"leaflet-active")}this._holdTimeout=setTimeout(a.bind(function(){if(this._isTapValid()){this._fireClick=false;this._onUp();this._simulateEvent("contextmenu",k)}},this),1000);this._simulateEvent("mousedown",k);a.DomEvent.on(b,{touchmove:this._onMove,touchend:this._onUp},this)},_onUp:function(j){clearTimeout(this._holdTimeout);a.DomEvent.off(b,{touchmove:this._onMove,touchend:this._onUp},this);if(this._fireClick&&j&&j.changedTouches){var k=j.changedTouches[0],i=k.target;if(i&&i.tagName&&i.tagName.toLowerCase()==="a"){a.DomUtil.removeClass(i,"leaflet-active")}this._simulateEvent("mouseup",k);if(this._isTapValid()){this._simulateEvent("click",k)}}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(i){var j=i.touches[0];this._newPos=new a.Point(j.clientX,j.clientY);this._simulateEvent("mousemove",j)},_simulateEvent:function(i,k){var j=b.createEvent("MouseEvents");j._simulated=true;k.target._simulatedClick=true;j.initMouseEvent(i,true,true,f,1,k.screenX,k.screenY,k.clientX,k.clientY,false,false,false,false,0,null);k.target.dispatchEvent(j)}});if(a.Browser.touch&&!a.Browser.pointer){a.Map.addInitHook("addHandler","tap",a.Map.Tap)}a.Map.mergeOptions({boxZoom:true});a.Map.BoxZoom=a.Handler.extend({initialize:function(i){this._map=i;this._container=i._container;this._pane=i._panes.overlayPane},addHooks:function(){a.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){a.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_resetState:function(){this._moved=false},_onMouseDown:function(i){if(!i.shiftKey||((i.which!==1)&&(i.button!==1))){return false}this._resetState();a.DomUtil.disableTextSelection();a.DomUtil.disableImageDrag();this._startPoint=this._map.mouseEventToContainerPoint(i);a.DomEvent.on(b,{contextmenu:a.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(k){if(!this._moved){this._moved=true;this._box=a.DomUtil.create("div","leaflet-zoom-box",this._container);a.DomUtil.addClass(this._container,"leaflet-crosshair");this._map.fire("boxzoomstart")}this._point=this._map.mouseEventToContainerPoint(k);var j=new a.Bounds(this._point,this._startPoint),i=j.getSize();a.DomUtil.setPosition(this._box,j.min);this._box.style.width=i.x+"px";this._box.style.height=i.y+"px"},_finish:function(){if(this._moved){a.DomUtil.remove(this._box);a.DomUtil.removeClass(this._container,"leaflet-crosshair")}a.DomUtil.enableTextSelection();a.DomUtil.enableImageDrag();a.DomEvent.off(b,{contextmenu:a.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(j){if((j.which!==1)&&(j.button!==1)){return}this._finish();if(!this._moved){return}setTimeout(a.bind(this._resetState,this),0);var i=new a.LatLngBounds(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point));this._map.fitBounds(i).fire("boxzoomend",{boxZoomBounds:i})},_onKeyDown:function(i){if(i.keyCode===27){this._finish()}}});a.Map.addInitHook("addHandler","boxZoom",a.Map.BoxZoom);a.Map.mergeOptions({keyboard:true,keyboardPanDelta:80});a.Map.Keyboard=a.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,54,173]},initialize:function(i){this._map=i;this._setPanDelta(i.options.keyboardPanDelta);this._setZoomDelta(i.options.zoomDelta)},addHooks:function(){var i=this._map._container;if(i.tabIndex<=0){i.tabIndex="0"}a.DomEvent.on(i,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this);this._map.on({focus:this._addHooks,blur:this._removeHooks},this)},removeHooks:function(){this._removeHooks();a.DomEvent.off(this._map._container,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this);this._map.off({focus:this._addHooks,blur:this._removeHooks},this)},_onMouseDown:function(){if(this._focused){return}var i=b.body,l=b.documentElement,k=i.scrollTop||l.scrollTop,j=i.scrollLeft||l.scrollLeft;this._map._container.focus();f.scrollTo(j,k)},_onFocus:function(){this._focused=true;this._map.fire("focus")},_onBlur:function(){this._focused=false;this._map.fire("blur")},_setPanDelta:function(n){var m=this._panKeys={},k=this.keyCodes,l,j;for(l=0,j=k.left.length;l<j;l++){m[k.left[l]]=[-1*n,0]}for(l=0,j=k.right.length;l<j;l++){m[k.right[l]]=[n,0]}for(l=0,j=k.down.length;l<j;l++){m[k.down[l]]=[0,n]}for(l=0,j=k.up.length;l<j;l++){m[k.up[l]]=[0,-1*n]}},_setZoomDelta:function(n){var m=this._zoomKeys={},k=this.keyCodes,l,j;for(l=0,j=k.zoomIn.length;l<j;l++){m[k.zoomIn[l]]=n}for(l=0,j=k.zoomOut.length;l<j;l++){m[k.zoomOut[l]]=-n}},_addHooks:function(){a.DomEvent.on(b,"keydown",this._onKeyDown,this)},_removeHooks:function(){a.DomEvent.off(b,"keydown",this._onKeyDown,this)},_onKeyDown:function(k){if(k.altKey||k.ctrlKey||k.metaKey){return}var i=k.keyCode,j=this._map,l;if(i in this._panKeys){if(j._panAnim&&j._panAnim._inProgress){return}l=this._panKeys[i];if(k.shiftKey){l=a.point(l).multiplyBy(3)}j.panBy(l);if(j.options.maxBounds){j.panInsideBounds(j.options.maxBounds)}}else{if(i in this._zoomKeys){j.setZoom(j.getZoom()+(k.shiftKey?3:1)*this._zoomKeys[i])}else{if(i===27){j.closePopup()}else{return}}}a.DomEvent.stop(k)}});a.Map.addInitHook("addHandler","keyboard",a.Map.Keyboard);a.Handler.MarkerDrag=a.Handler.extend({initialize:function(i){this._marker=i},addHooks:function(){var i=this._marker._icon;if(!this._draggable){this._draggable=new a.Draggable(i,i,true)}this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this).enable();a.DomUtil.addClass(i,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this).disable();if(this._marker._icon){a.DomUtil.removeClass(this._marker._icon,"leaflet-marker-draggable")}},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._oldLatLng=this._marker.getLatLng();this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(k){var i=this._marker,m=i._shadow,j=a.DomUtil.getPosition(i._icon),l=i._map.layerPointToLatLng(j);if(m){a.DomUtil.setPosition(m,j)}i._latlng=l;k.latlng=l;k.oldLatLng=this._oldLatLng;i.fire("move",k).fire("drag",k)},_onDragEnd:function(i){delete this._oldLatLng;this._marker.fire("moveend").fire("dragend",i)}});a.Control=a.Class.extend({options:{position:"topright"},initialize:function(i){a.setOptions(this,i)},getPosition:function(){return this.options.position},setPosition:function(i){var j=this._map;if(j){j.removeControl(this)}this.options.position=i;if(j){j.addControl(this)}return this},getContainer:function(){return this._container},addTo:function(k){this.remove();this._map=k;var i=this._container=this.onAdd(k),l=this.getPosition(),j=k._controlCorners[l];a.DomUtil.addClass(i,"leaflet-control");if(l.indexOf("bottom")!==-1){j.insertBefore(i,j.firstChild)}else{j.appendChild(i)}return this},remove:function(){if(!this._map){return this}a.DomUtil.remove(this._container);if(this.onRemove){this.onRemove(this._map)}this._map=null;return this},_refocusOnMap:function(i){if(this._map&&i&&i.screenX>0&&i.screenY>0){this._map.getContainer().focus()}}});a.control=function(i){return new a.Control(i)};a.Map.include({addControl:function(i){i.addTo(this);return this},removeControl:function(i){i.remove();return this},_initControlPos:function(){var k=this._controlCorners={},j="leaflet-",i=this._controlContainer=a.DomUtil.create("div",j+"control-container",this._container);function m(n,o){var l=j+n+" "+j+o;k[n+o]=a.DomUtil.create("div",l,i)}m("top","left");m("top","right");m("bottom","left");m("bottom","right")},_clearControlPos:function(){a.DomUtil.remove(this._controlContainer)}});a.Control.Zoom=a.Control.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"-",zoomOutTitle:"Zoom out"},onAdd:function(k){var l="leaflet-control-zoom",i=a.DomUtil.create("div",l+" leaflet-bar"),j=this.options;this._zoomInButton=this._createButton(j.zoomInText,j.zoomInTitle,l+"-in",i,this._zoomIn);this._zoomOutButton=this._createButton(j.zoomOutText,j.zoomOutTitle,l+"-out",i,this._zoomOut);this._updateDisabled();k.on("zoomend zoomlevelschange",this._updateDisabled,this);return i},onRemove:function(i){i.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){this._disabled=true;this._updateDisabled();return this},enable:function(){this._disabled=false;this._updateDisabled();return this},_zoomIn:function(i){if(!this._disabled&&this._map._zoom<this._map.getMaxZoom()){this._map.zoomIn(this._map.options.zoomDelta*(i.shiftKey?3:1))}},_zoomOut:function(i){if(!this._disabled&&this._map._zoom>this._map.getMinZoom()){this._map.zoomOut(this._map.options.zoomDelta*(i.shiftKey?3:1))}},_createButton:function(j,n,l,i,k){var m=a.DomUtil.create("a",l,i);m.innerHTML=j;m.href="#";m.title=n;m.setAttribute("role","button");m.setAttribute("aria-label",n);a.DomEvent.on(m,"mousedown dblclick",a.DomEvent.stopPropagation).on(m,"click",a.DomEvent.stop).on(m,"click",k,this).on(m,"click",this._refocusOnMap,this);return m},_updateDisabled:function(){var j=this._map,i="leaflet-disabled";a.DomUtil.removeClass(this._zoomInButton,i);a.DomUtil.removeClass(this._zoomOutButton,i);if(this._disabled||j._zoom===j.getMinZoom()){a.DomUtil.addClass(this._zoomOutButton,i)}if(this._disabled||j._zoom===j.getMaxZoom()){a.DomUtil.addClass(this._zoomInButton,i)}}});a.Map.mergeOptions({zoomControl:true});a.Map.addInitHook(function(){if(this.options.zoomControl){this.zoomControl=new a.Control.Zoom();this.addControl(this.zoomControl)}});a.control.zoom=function(i){return new a.Control.Zoom(i)};a.Control.Attribution=a.Control.extend({options:{position:"bottomright",prefix:'<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'},initialize:function(i){a.setOptions(this,i);this._attributions={}},onAdd:function(k){k.attributionControl=this;this._container=a.DomUtil.create("div","leaflet-control-attribution");if(a.DomEvent){a.DomEvent.disableClickPropagation(this._container)}for(var j in k._layers){if(k._layers[j].getAttribution){this.addAttribution(k._layers[j].getAttribution())}}this._update();return this._container},setPrefix:function(i){this.options.prefix=i;this._update();return this},addAttribution:function(i){if(!i){return this}if(!this._attributions[i]){this._attributions[i]=0}this._attributions[i]++;this._update();return this},removeAttribution:function(i){if(!i){return this}if(this._attributions[i]){this._attributions[i]--;this._update()}return this},_update:function(){if(!this._map){return}var l=[];for(var j in this._attributions){if(this._attributions[j]){l.push(j)}}var k=[];if(this.options.prefix){k.push(this.options.prefix)}if(l.length){k.push(l.join(", "))}this._container.innerHTML=k.join(" | ")}});a.Map.mergeOptions({attributionControl:true});a.Map.addInitHook(function(){if(this.options.attributionControl){new a.Control.Attribution().addTo(this)}});a.control.attribution=function(i){return new a.Control.Attribution(i)};a.Control.Scale=a.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:true,imperial:true},onAdd:function(l){var k="leaflet-control-scale",i=a.DomUtil.create("div",k),j=this.options;this._addScales(j,k+"-line",i);l.on(j.updateWhenIdle?"moveend":"move",this._update,this);l.whenReady(this._update,this);return i},onRemove:function(i){i.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(j,k,i){if(j.metric){this._mScale=a.DomUtil.create("div",k,i)}if(j.imperial){this._iScale=a.DomUtil.create("div",k,i)}},_update:function(){var j=this._map,k=j.getSize().y/2;var i=j.distance(j.containerPointToLatLng([0,k]),j.containerPointToLatLng([this.options.maxWidth,k]));this._updateScales(i)},_updateScales:function(i){if(this.options.metric&&i){this._updateMetric(i)}if(this.options.imperial&&i){this._updateImperial(i)}},_updateMetric:function(k){var i=this._getRoundNum(k),j=i<1000?i+" m":(i/1000)+" km";this._updateScale(this._mScale,j,i/k)},_updateImperial:function(m){var l=m*3.2808399,k,j,i;if(l>5280){k=l/5280;j=this._getRoundNum(k);this._updateScale(this._iScale,j+" mi",j/k)}else{i=this._getRoundNum(l);this._updateScale(this._iScale,i+" ft",i/l)}},_updateScale:function(k,j,i){k.style.width=Math.round(this.options.maxWidth*i)+"px";k.innerHTML=j},_getRoundNum:function(j){var i=Math.pow(10,(Math.floor(j)+"").length-1),k=j/i;k=k>=10?10:k>=5?5:k>=3?3:k>=2?2:1;return i*k}});a.control.scale=function(i){return new a.Control.Scale(i)};a.Control.Layers=a.Control.extend({options:{collapsed:true,position:"topright",autoZIndex:true,hideSingleBase:false,sortLayers:false,sortFunction:function(l,j,k,i){return k<i?-1:(i<k?1:0)}},initialize:function(m,l,j){a.setOptions(this,j);this._layers=[];this._lastZIndex=0;this._handlingClick=false;for(var k in m){this._addLayer(m[k],k)}for(k in l){this._addLayer(l[k],k,true)}},onAdd:function(i){this._initLayout();this._update();this._map=i;i.on("zoomend",this._checkDisabledLayers,this);return this._container},onRemove:function(){this._map.off("zoomend",this._checkDisabledLayers,this);for(var j=0;j<this._layers.length;j++){this._layers[j].layer.off("add remove",this._onLayerChange,this)}},addBaseLayer:function(j,i){this._addLayer(j,i);return(this._map)?this._update():this},addOverlay:function(j,i){this._addLayer(j,i,true);return(this._map)?this._update():this},removeLayer:function(i){i.off("add remove",this._onLayerChange,this);var j=this._getLayer(a.stamp(i));if(j){this._layers.splice(this._layers.indexOf(j),1)}return(this._map)?this._update():this},expand:function(){a.DomUtil.addClass(this._container,"leaflet-control-layers-expanded");this._form.style.height=null;var i=this._map.getSize().y-(this._container.offsetTop+50);if(i<this._form.clientHeight){a.DomUtil.addClass(this._form,"leaflet-control-layers-scrollbar");this._form.style.height=i+"px"}else{a.DomUtil.removeClass(this._form,"leaflet-control-layers-scrollbar")}this._checkDisabledLayers();return this},collapse:function(){a.DomUtil.removeClass(this._container,"leaflet-control-layers-expanded");return this},_initLayout:function(){var j="leaflet-control-layers",i=this._container=a.DomUtil.create("div",j),m=this.options.collapsed;i.setAttribute("aria-haspopup",true);a.DomEvent.disableClickPropagation(i);if(!a.Browser.touch){a.DomEvent.disableScrollPropagation(i)}var l=this._form=a.DomUtil.create("form",j+"-list");if(m){this._map.on("click",this.collapse,this);if(!a.Browser.android){a.DomEvent.on(i,{mouseenter:this.expand,mouseleave:this.collapse},this)}}var k=this._layersLink=a.DomUtil.create("a",j+"-toggle",i);k.href="#";k.title="Layers";if(a.Browser.touch){a.DomEvent.on(k,"click",a.DomEvent.stop).on(k,"click",this.expand,this)}else{a.DomEvent.on(k,"focus",this.expand,this)}a.DomEvent.on(l,"click",function(){setTimeout(a.bind(this._onInputClick,this),0)},this);if(!m){this.expand()}this._baseLayersList=a.DomUtil.create("div",j+"-base",l);this._separator=a.DomUtil.create("div",j+"-separator",l);this._overlaysList=a.DomUtil.create("div",j+"-overlays",l);i.appendChild(l)},_getLayer:function(k){for(var j=0;j<this._layers.length;j++){if(this._layers[j]&&a.stamp(this._layers[j].layer)===k){return this._layers[j]}}},_addLayer:function(k,j,i){k.on("add remove",this._onLayerChange,this);this._layers.push({layer:k,name:j,overlay:i});if(this.options.sortLayers){this._layers.sort(a.bind(function(m,l){return this.options.sortFunction(m.layer,l.layer,m.name,l.name)},this))}if(this.options.autoZIndex&&k.setZIndex){this._lastZIndex++;k.setZIndex(this._lastZIndex)}},_update:function(){if(!this._container){return this}a.DomUtil.empty(this._baseLayersList);a.DomUtil.empty(this._overlaysList);var j,m,l,n,k=0;for(l=0;l<this._layers.length;l++){n=this._layers[l];this._addItem(n);m=m||n.overlay;j=j||!n.overlay;k+=!n.overlay?1:0}if(this.options.hideSingleBase){j=j&&k>1;this._baseLayersList.style.display=j?"":"none"}this._separator.style.display=m&&j?"":"none";return this},_onLayerChange:function(k){if(!this._handlingClick){this._update()}var j=this._getLayer(a.stamp(k.target));var i=j.overlay?(k.type==="add"?"overlayadd":"overlayremove"):(k.type==="add"?"baselayerchange":null);if(i){this._map.fire(i,j)}},_createRadioElement:function(i,l){var k='<input type="radio" class="leaflet-control-layers-selector" name="'+i+'"'+(l?' checked="checked"':"")+"/>";var j=b.createElement("div");j.innerHTML=k;return j.firstChild},_addItem:function(o){var l=b.createElement("label"),n=this._map.hasLayer(o.layer),j;if(o.overlay){j=b.createElement("input");j.type="checkbox";j.className="leaflet-control-layers-selector";j.defaultChecked=n}else{j=this._createRadioElement("leaflet-base-layers",n)}j.layerId=a.stamp(o.layer);a.DomEvent.on(j,"click",this._onInputClick,this);var k=b.createElement("span");k.innerHTML=" "+o.name;var m=b.createElement("div");l.appendChild(m);m.appendChild(j);m.appendChild(k);var i=o.overlay?this._overlaysList:this._baseLayersList;i.appendChild(l);this._checkDisabledLayers();return l},_onInputClick:function(){var k=this._form.getElementsByTagName("input"),l,p,j;var n=[],m=[];this._handlingClick=true;for(var o=k.length-1;o>=0;o--){l=k[o];p=this._getLayer(l.layerId).layer;j=this._map.hasLayer(p);if(l.checked&&!j){n.push(p)}else{if(!l.checked&&j){m.push(p)}}}for(o=0;o<m.length;o++){this._map.removeLayer(m[o])}for(o=0;o<n.length;o++){this._map.addLayer(n[o])}this._handlingClick=false;this._refocusOnMap()},_checkDisabledLayers:function(){var j=this._form.getElementsByTagName("input"),k,m,n=this._map.getZoom();for(var l=j.length-1;l>=0;l--){k=j[l];m=this._getLayer(k.layerId).layer;k.disabled=(m.options.minZoom!==h&&n<m.options.minZoom)||(m.options.maxZoom!==h&&n>m.options.maxZoom)}},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}});a.control.layers=function(k,j,i){return new a.Control.Layers(k,j,i)}}(window,document));
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-1.7.1.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,14062 @@
+/* @preserve
+ * Leaflet 1.6.0+Detached: bd88f73e8ddb90eb945a28bc1de9eb07f7386118.bd88f73, a JS library for interactive maps. http://leafletjs.com
+ * (c) 2010-2019 Vladimir Agafonkin, (c) 2010-2011 CloudMade
+ */
+
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+  typeof define === 'function' && define.amd ? define(['exports'], factory) :
+  (factory((global.L = {})));
+}(this, (function (exports) { 'use strict';
+
+  var version = "1.6.0";
+
+  /*
+   * @namespace Util
+   *
+   * Various utility functions, used by Leaflet internally.
+   */
+
+  // @function extend(dest: Object, src?: Object): Object
+  // Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut.
+  function extend(dest) {
+  	var i, j, len, src;
+
+  	for (j = 1, len = arguments.length; j < len; j++) {
+  		src = arguments[j];
+  		for (i in src) {
+  			dest[i] = src[i];
+  		}
+  	}
+  	return dest;
+  }
+
+  // @function create(proto: Object, properties?: Object): Object
+  // Compatibility polyfill for [Object.create](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/create)
+  var create = Object.create || (function () {
+  	function F() {}
+  	return function (proto) {
+  		F.prototype = proto;
+  		return new F();
+  	};
+  })();
+
+  // @function bind(fn: Function, …): Function
+  // Returns a new function bound to the arguments passed, like [Function.prototype.bind](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).
+  // Has a `L.bind()` shortcut.
+  function bind(fn, obj) {
+  	var slice = Array.prototype.slice;
+
+  	if (fn.bind) {
+  		return fn.bind.apply(fn, slice.call(arguments, 1));
+  	}
+
+  	var args = slice.call(arguments, 2);
+
+  	return function () {
+  		return fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments);
+  	};
+  }
+
+  // @property lastId: Number
+  // Last unique ID used by [`stamp()`](#util-stamp)
+  var lastId = 0;
+
+  // @function stamp(obj: Object): Number
+  // Returns the unique ID of an object, assigning it one if it doesn't have it.
+  function stamp(obj) {
+  	/*eslint-disable */
+  	obj._leaflet_id = obj._leaflet_id || ++lastId;
+  	return obj._leaflet_id;
+  	/* eslint-enable */
+  }
+
+  // @function throttle(fn: Function, time: Number, context: Object): Function
+  // Returns a function which executes function `fn` with the given scope `context`
+  // (so that the `this` keyword refers to `context` inside `fn`'s code). The function
+  // `fn` will be called no more than one time per given amount of `time`. The arguments
+  // received by the bound function will be any arguments passed when binding the
+  // function, followed by any arguments passed when invoking the bound function.
+  // Has an `L.throttle` shortcut.
+  function throttle(fn, time, context) {
+  	var lock, args, wrapperFn, later;
+
+  	later = function () {
+  		// reset lock and call if queued
+  		lock = false;
+  		if (args) {
+  			wrapperFn.apply(context, args);
+  			args = false;
+  		}
+  	};
+
+  	wrapperFn = function () {
+  		if (lock) {
+  			// called too soon, queue to call later
+  			args = arguments;
+
+  		} else {
+  			// call and lock until later
+  			fn.apply(context, arguments);
+  			setTimeout(later, time);
+  			lock = true;
+  		}
+  	};
+
+  	return wrapperFn;
+  }
+
+  // @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number
+  // Returns the number `num` modulo `range` in such a way so it lies within
+  // `range[0]` and `range[1]`. The returned value will be always smaller than
+  // `range[1]` unless `includeMax` is set to `true`.
+  function wrapNum(x, range, includeMax) {
+  	var max = range[1],
+  	    min = range[0],
+  	    d = max - min;
+  	return x === max && includeMax ? x : ((x - min) % d + d) % d + min;
+  }
+
+  // @function falseFn(): Function
+  // Returns a function which always returns `false`.
+  function falseFn() { return false; }
+
+  // @function formatNum(num: Number, digits?: Number): Number
+  // Returns the number `num` rounded to `digits` decimals, or to 6 decimals by default.
+  function formatNum(num, digits) {
+  	var pow = Math.pow(10, (digits === undefined ? 6 : digits));
+  	return Math.round(num * pow) / pow;
+  }
+
+  // @function trim(str: String): String
+  // Compatibility polyfill for [String.prototype.trim](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)
+  function trim(str) {
+  	return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
+  }
+
+  // @function splitWords(str: String): String[]
+  // Trims and splits the string on whitespace and returns the array of parts.
+  function splitWords(str) {
+  	return trim(str).split(/\s+/);
+  }
+
+  // @function setOptions(obj: Object, options: Object): Object
+  // Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut.
+  function setOptions(obj, options) {
+  	if (!Object.prototype.hasOwnProperty.call(obj, 'options')) {
+  		obj.options = obj.options ? create(obj.options) : {};
+  	}
+  	for (var i in options) {
+  		obj.options[i] = options[i];
+  	}
+  	return obj.options;
+  }
+
+  // @function getParamString(obj: Object, existingUrl?: String, uppercase?: Boolean): String
+  // Converts an object into a parameter URL string, e.g. `{a: "foo", b: "bar"}`
+  // translates to `'?a=foo&b=bar'`. If `existingUrl` is set, the parameters will
+  // be appended at the end. If `uppercase` is `true`, the parameter names will
+  // be uppercased (e.g. `'?A=foo&B=bar'`)
+  function getParamString(obj, existingUrl, uppercase) {
+  	var params = [];
+  	for (var i in obj) {
+  		params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));
+  	}
+  	return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');
+  }
+
+  var templateRe = /\{ *([\w_-]+) *\}/g;
+
+  // @function template(str: String, data: Object): String
+  // Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'`
+  // and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string
+  // `('Hello foo, bar')`. You can also specify functions instead of strings for
+  // data values — they will be evaluated passing `data` as an argument.
+  function template(str, data) {
+  	return str.replace(templateRe, function (str, key) {
+  		var value = data[key];
+
+  		if (value === undefined) {
+  			throw new Error('No value provided for variable ' + str);
+
+  		} else if (typeof value === 'function') {
+  			value = value(data);
+  		}
+  		return value;
+  	});
+  }
+
+  // @function isArray(obj): Boolean
+  // Compatibility polyfill for [Array.isArray](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray)
+  var isArray = Array.isArray || function (obj) {
+  	return (Object.prototype.toString.call(obj) === '[object Array]');
+  };
+
+  // @function indexOf(array: Array, el: Object): Number
+  // Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)
+  function indexOf(array, el) {
+  	for (var i = 0; i < array.length; i++) {
+  		if (array[i] === el) { return i; }
+  	}
+  	return -1;
+  }
+
+  // @property emptyImageUrl: String
+  // Data URI string containing a base64-encoded empty GIF image.
+  // Used as a hack to free memory from unused images on WebKit-powered
+  // mobile devices (by setting image `src` to this string).
+  var emptyImageUrl = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';
+
+  // inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/
+
+  function getPrefixed(name) {
+  	return window['webkit' + name] || window['moz' + name] || window['ms' + name];
+  }
+
+  var lastTime = 0;
+
+  // fallback for IE 7-8
+  function timeoutDefer(fn) {
+  	var time = +new Date(),
+  	    timeToCall = Math.max(0, 16 - (time - lastTime));
+
+  	lastTime = time + timeToCall;
+  	return window.setTimeout(fn, timeToCall);
+  }
+
+  var requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer;
+  var cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') ||
+  		getPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); };
+
+  // @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number
+  // Schedules `fn` to be executed when the browser repaints. `fn` is bound to
+  // `context` if given. When `immediate` is set, `fn` is called immediately if
+  // the browser doesn't have native support for
+  // [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame),
+  // otherwise it's delayed. Returns a request ID that can be used to cancel the request.
+  function requestAnimFrame(fn, context, immediate) {
+  	if (immediate && requestFn === timeoutDefer) {
+  		fn.call(context);
+  	} else {
+  		return requestFn.call(window, bind(fn, context));
+  	}
+  }
+
+  // @function cancelAnimFrame(id: Number): undefined
+  // Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame).
+  function cancelAnimFrame(id) {
+  	if (id) {
+  		cancelFn.call(window, id);
+  	}
+  }
+
+  var Util = ({
+    extend: extend,
+    create: create,
+    bind: bind,
+    lastId: lastId,
+    stamp: stamp,
+    throttle: throttle,
+    wrapNum: wrapNum,
+    falseFn: falseFn,
+    formatNum: formatNum,
+    trim: trim,
+    splitWords: splitWords,
+    setOptions: setOptions,
+    getParamString: getParamString,
+    template: template,
+    isArray: isArray,
+    indexOf: indexOf,
+    emptyImageUrl: emptyImageUrl,
+    requestFn: requestFn,
+    cancelFn: cancelFn,
+    requestAnimFrame: requestAnimFrame,
+    cancelAnimFrame: cancelAnimFrame
+  });
+
+  // @class Class
+  // @aka L.Class
+
+  // @section
+  // @uninheritable
+
+  // Thanks to John Resig and Dean Edwards for inspiration!
+
+  function Class() {}
+
+  Class.extend = function (props) {
+
+  	// @function extend(props: Object): Function
+  	// [Extends the current class](#class-inheritance) given the properties to be included.
+  	// Returns a Javascript function that is a class constructor (to be called with `new`).
+  	var NewClass = function () {
+
+  		// call the constructor
+  		if (this.initialize) {
+  			this.initialize.apply(this, arguments);
+  		}
+
+  		// call all constructor hooks
+  		this.callInitHooks();
+  	};
+
+  	var parentProto = NewClass.__super__ = this.prototype;
+
+  	var proto = create(parentProto);
+  	proto.constructor = NewClass;
+
+  	NewClass.prototype = proto;
+
+  	// inherit parent's statics
+  	for (var i in this) {
+  		if (Object.prototype.hasOwnProperty.call(this, i) && i !== 'prototype' && i !== '__super__') {
+  			NewClass[i] = this[i];
+  		}
+  	}
+
+  	// mix static properties into the class
+  	if (props.statics) {
+  		extend(NewClass, props.statics);
+  		delete props.statics;
+  	}
+
+  	// mix includes into the prototype
+  	if (props.includes) {
+  		checkDeprecatedMixinEvents(props.includes);
+  		extend.apply(null, [proto].concat(props.includes));
+  		delete props.includes;
+  	}
+
+  	// merge options
+  	if (proto.options) {
+  		props.options = extend(create(proto.options), props.options);
+  	}
+
+  	// mix given properties into the prototype
+  	extend(proto, props);
+
+  	proto._initHooks = [];
+
+  	// add method for calling all hooks
+  	proto.callInitHooks = function () {
+
+  		if (this._initHooksCalled) { return; }
+
+  		if (parentProto.callInitHooks) {
+  			parentProto.callInitHooks.call(this);
+  		}
+
+  		this._initHooksCalled = true;
+
+  		for (var i = 0, len = proto._initHooks.length; i < len; i++) {
+  			proto._initHooks[i].call(this);
+  		}
+  	};
+
+  	return NewClass;
+  };
+
+
+  // @function include(properties: Object): this
+  // [Includes a mixin](#class-includes) into the current class.
+  Class.include = function (props) {
+  	extend(this.prototype, props);
+  	return this;
+  };
+
+  // @function mergeOptions(options: Object): this
+  // [Merges `options`](#class-options) into the defaults of the class.
+  Class.mergeOptions = function (options) {
+  	extend(this.prototype.options, options);
+  	return this;
+  };
+
+  // @function addInitHook(fn: Function): this
+  // Adds a [constructor hook](#class-constructor-hooks) to the class.
+  Class.addInitHook = function (fn) { // (Function) || (String, args...)
+  	var args = Array.prototype.slice.call(arguments, 1);
+
+  	var init = typeof fn === 'function' ? fn : function () {
+  		this[fn].apply(this, args);
+  	};
+
+  	this.prototype._initHooks = this.prototype._initHooks || [];
+  	this.prototype._initHooks.push(init);
+  	return this;
+  };
+
+  function checkDeprecatedMixinEvents(includes) {
+  	if (typeof L === 'undefined' || !L || !L.Mixin) { return; }
+
+  	includes = isArray(includes) ? includes : [includes];
+
+  	for (var i = 0; i < includes.length; i++) {
+  		if (includes[i] === L.Mixin.Events) {
+  			console.warn('Deprecated include of L.Mixin.Events: ' +
+  				'this property will be removed in future releases, ' +
+  				'please inherit from L.Evented instead.', new Error().stack);
+  		}
+  	}
+  }
+
+  /*
+   * @class Evented
+   * @aka L.Evented
+   * @inherits Class
+   *
+   * A set of methods shared between event-powered classes (like `Map` and `Marker`). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire `'click'` event).
+   *
+   * @example
+   *
+   * ```js
+   * map.on('click', function(e) {
+   * 	alert(e.latlng);
+   * } );
+   * ```
+   *
+   * Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:
+   *
+   * ```js
+   * function onClick(e) { ... }
+   *
+   * map.on('click', onClick);
+   * map.off('click', onClick);
+   * ```
+   */
+
+  var Events = {
+  	/* @method on(type: String, fn: Function, context?: Object): this
+  	 * Adds a listener function (`fn`) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. `'click dblclick'`).
+  	 *
+  	 * @alternative
+  	 * @method on(eventMap: Object): this
+  	 * Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`
+  	 */
+  	on: function (types, fn, context) {
+
+  		// types can be a map of types/handlers
+  		if (typeof types === 'object') {
+  			for (var type in types) {
+  				// we don't process space-separated events here for performance;
+  				// it's a hot path since Layer uses the on(obj) syntax
+  				this._on(type, types[type], fn);
+  			}
+
+  		} else {
+  			// types can be a string of space-separated words
+  			types = splitWords(types);
+
+  			for (var i = 0, len = types.length; i < len; i++) {
+  				this._on(types[i], fn, context);
+  			}
+  		}
+
+  		return this;
+  	},
+
+  	/* @method off(type: String, fn?: Function, context?: Object): this
+  	 * Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to `on`, you must pass the same context to `off` in order to remove the listener.
+  	 *
+  	 * @alternative
+  	 * @method off(eventMap: Object): this
+  	 * Removes a set of type/listener pairs.
+  	 *
+  	 * @alternative
+  	 * @method off: this
+  	 * Removes all listeners to all events on the object. This includes implicitly attached events.
+  	 */
+  	off: function (types, fn, context) {
+
+  		if (!types) {
+  			// clear all listeners if called without arguments
+  			delete this._events;
+
+  		} else if (typeof types === 'object') {
+  			for (var type in types) {
+  				this._off(type, types[type], fn);
+  			}
+
+  		} else {
+  			types = splitWords(types);
+
+  			for (var i = 0, len = types.length; i < len; i++) {
+  				this._off(types[i], fn, context);
+  			}
+  		}
+
+  		return this;
+  	},
+
+  	// attach listener (without syntactic sugar now)
+  	_on: function (type, fn, context) {
+  		this._events = this._events || {};
+
+  		/* get/init listeners for type */
+  		var typeListeners = this._events[type];
+  		if (!typeListeners) {
+  			typeListeners = [];
+  			this._events[type] = typeListeners;
+  		}
+
+  		if (context === this) {
+  			// Less memory footprint.
+  			context = undefined;
+  		}
+  		var newListener = {fn: fn, ctx: context},
+  		    listeners = typeListeners;
+
+  		// check if fn already there
+  		for (var i = 0, len = listeners.length; i < len; i++) {
+  			if (listeners[i].fn === fn && listeners[i].ctx === context) {
+  				return;
+  			}
+  		}
+
+  		listeners.push(newListener);
+  	},
+
+  	_off: function (type, fn, context) {
+  		var listeners,
+  		    i,
+  		    len;
+
+  		if (!this._events) { return; }
+
+  		listeners = this._events[type];
+
+  		if (!listeners) {
+  			return;
+  		}
+
+  		if (!fn) {
+  			// Set all removed listeners to noop so they are not called if remove happens in fire
+  			for (i = 0, len = listeners.length; i < len; i++) {
+  				listeners[i].fn = falseFn;
+  			}
+  			// clear all listeners for a type if function isn't specified
+  			delete this._events[type];
+  			return;
+  		}
+
+  		if (context === this) {
+  			context = undefined;
+  		}
+
+  		if (listeners) {
+
+  			// find fn and remove it
+  			for (i = 0, len = listeners.length; i < len; i++) {
+  				var l = listeners[i];
+  				if (l.ctx !== context) { continue; }
+  				if (l.fn === fn) {
+
+  					// set the removed listener to noop so that's not called if remove happens in fire
+  					l.fn = falseFn;
+
+  					if (this._firingCount) {
+  						/* copy array in case events are being fired */
+  						this._events[type] = listeners = listeners.slice();
+  					}
+  					listeners.splice(i, 1);
+
+  					return;
+  				}
+  			}
+  		}
+  	},
+
+  	// @method fire(type: String, data?: Object, propagate?: Boolean): this
+  	// Fires an event of the specified type. You can optionally provide an data
+  	// object — the first argument of the listener function will contain its
+  	// properties. The event can optionally be propagated to event parents.
+  	fire: function (type, data, propagate) {
+  		if (!this.listens(type, propagate)) { return this; }
+
+  		var event = extend({}, data, {
+  			type: type,
+  			target: this,
+  			sourceTarget: data && data.sourceTarget || this
+  		});
+
+  		if (this._events) {
+  			var listeners = this._events[type];
+
+  			if (listeners) {
+  				this._firingCount = (this._firingCount + 1) || 1;
+  				for (var i = 0, len = listeners.length; i < len; i++) {
+  					var l = listeners[i];
+  					l.fn.call(l.ctx || this, event);
+  				}
+
+  				this._firingCount--;
+  			}
+  		}
+
+  		if (propagate) {
+  			// propagate the event to parents (set with addEventParent)
+  			this._propagateEvent(event);
+  		}
+
+  		return this;
+  	},
+
+  	// @method listens(type: String): Boolean
+  	// Returns `true` if a particular event type has any listeners attached to it.
+  	listens: function (type, propagate) {
+  		var listeners = this._events && this._events[type];
+  		if (listeners && listeners.length) { return true; }
+
+  		if (propagate) {
+  			// also check parents for listeners if event propagates
+  			for (var id in this._eventParents) {
+  				if (this._eventParents[id].listens(type, propagate)) { return true; }
+  			}
+  		}
+  		return false;
+  	},
+
+  	// @method once(…): this
+  	// Behaves as [`on(…)`](#evented-on), except the listener will only get fired once and then removed.
+  	once: function (types, fn, context) {
+
+  		if (typeof types === 'object') {
+  			for (var type in types) {
+  				this.once(type, types[type], fn);
+  			}
+  			return this;
+  		}
+
+  		var handler = bind(function () {
+  			this
+  			    .off(types, fn, context)
+  			    .off(types, handler, context);
+  		}, this);
+
+  		// add a listener that's executed once and removed after that
+  		return this
+  		    .on(types, fn, context)
+  		    .on(types, handler, context);
+  	},
+
+  	// @method addEventParent(obj: Evented): this
+  	// Adds an event parent - an `Evented` that will receive propagated events
+  	addEventParent: function (obj) {
+  		this._eventParents = this._eventParents || {};
+  		this._eventParents[stamp(obj)] = obj;
+  		return this;
+  	},
+
+  	// @method removeEventParent(obj: Evented): this
+  	// Removes an event parent, so it will stop receiving propagated events
+  	removeEventParent: function (obj) {
+  		if (this._eventParents) {
+  			delete this._eventParents[stamp(obj)];
+  		}
+  		return this;
+  	},
+
+  	_propagateEvent: function (e) {
+  		for (var id in this._eventParents) {
+  			this._eventParents[id].fire(e.type, extend({
+  				layer: e.target,
+  				propagatedFrom: e.target
+  			}, e), true);
+  		}
+  	}
+  };
+
+  // aliases; we should ditch those eventually
+
+  // @method addEventListener(…): this
+  // Alias to [`on(…)`](#evented-on)
+  Events.addEventListener = Events.on;
+
+  // @method removeEventListener(…): this
+  // Alias to [`off(…)`](#evented-off)
+
+  // @method clearAllEventListeners(…): this
+  // Alias to [`off()`](#evented-off)
+  Events.removeEventListener = Events.clearAllEventListeners = Events.off;
+
+  // @method addOneTimeEventListener(…): this
+  // Alias to [`once(…)`](#evented-once)
+  Events.addOneTimeEventListener = Events.once;
+
+  // @method fireEvent(…): this
+  // Alias to [`fire(…)`](#evented-fire)
+  Events.fireEvent = Events.fire;
+
+  // @method hasEventListeners(…): Boolean
+  // Alias to [`listens(…)`](#evented-listens)
+  Events.hasEventListeners = Events.listens;
+
+  var Evented = Class.extend(Events);
+
+  /*
+   * @class Point
+   * @aka L.Point
+   *
+   * Represents a point with `x` and `y` coordinates in pixels.
+   *
+   * @example
+   *
+   * ```js
+   * var point = L.point(200, 300);
+   * ```
+   *
+   * All Leaflet methods and options that accept `Point` objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:
+   *
+   * ```js
+   * map.panBy([200, 300]);
+   * map.panBy(L.point(200, 300));
+   * ```
+   *
+   * Note that `Point` does not inherit from Leaflet's `Class` object,
+   * which means new classes can't inherit from it, and new methods
+   * can't be added to it with the `include` function.
+   */
+
+  function Point(x, y, round) {
+  	// @property x: Number; The `x` coordinate of the point
+  	this.x = (round ? Math.round(x) : x);
+  	// @property y: Number; The `y` coordinate of the point
+  	this.y = (round ? Math.round(y) : y);
+  }
+
+  var trunc = Math.trunc || function (v) {
+  	return v > 0 ? Math.floor(v) : Math.ceil(v);
+  };
+
+  Point.prototype = {
+
+  	// @method clone(): Point
+  	// Returns a copy of the current point.
+  	clone: function () {
+  		return new Point(this.x, this.y);
+  	},
+
+  	// @method add(otherPoint: Point): Point
+  	// Returns the result of addition of the current and the given points.
+  	add: function (point) {
+  		// non-destructive, returns a new point
+  		return this.clone()._add(toPoint(point));
+  	},
+
+  	_add: function (point) {
+  		// destructive, used directly for performance in situations where it's safe to modify existing point
+  		this.x += point.x;
+  		this.y += point.y;
+  		return this;
+  	},
+
+  	// @method subtract(otherPoint: Point): Point
+  	// Returns the result of subtraction of the given point from the current.
+  	subtract: function (point) {
+  		return this.clone()._subtract(toPoint(point));
+  	},
+
+  	_subtract: function (point) {
+  		this.x -= point.x;
+  		this.y -= point.y;
+  		return this;
+  	},
+
+  	// @method divideBy(num: Number): Point
+  	// Returns the result of division of the current point by the given number.
+  	divideBy: function (num) {
+  		return this.clone()._divideBy(num);
+  	},
+
+  	_divideBy: function (num) {
+  		this.x /= num;
+  		this.y /= num;
+  		return this;
+  	},
+
+  	// @method multiplyBy(num: Number): Point
+  	// Returns the result of multiplication of the current point by the given number.
+  	multiplyBy: function (num) {
+  		return this.clone()._multiplyBy(num);
+  	},
+
+  	_multiplyBy: function (num) {
+  		this.x *= num;
+  		this.y *= num;
+  		return this;
+  	},
+
+  	// @method scaleBy(scale: Point): Point
+  	// Multiply each coordinate of the current point by each coordinate of
+  	// `scale`. In linear algebra terms, multiply the point by the
+  	// [scaling matrix](https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation)
+  	// defined by `scale`.
+  	scaleBy: function (point) {
+  		return new Point(this.x * point.x, this.y * point.y);
+  	},
+
+  	// @method unscaleBy(scale: Point): Point
+  	// Inverse of `scaleBy`. Divide each coordinate of the current point by
+  	// each coordinate of `scale`.
+  	unscaleBy: function (point) {
+  		return new Point(this.x / point.x, this.y / point.y);
+  	},
+
+  	// @method round(): Point
+  	// Returns a copy of the current point with rounded coordinates.
+  	round: function () {
+  		return this.clone()._round();
+  	},
+
+  	_round: function () {
+  		this.x = Math.round(this.x);
+  		this.y = Math.round(this.y);
+  		return this;
+  	},
+
+  	// @method floor(): Point
+  	// Returns a copy of the current point with floored coordinates (rounded down).
+  	floor: function () {
+  		return this.clone()._floor();
+  	},
+
+  	_floor: function () {
+  		this.x = Math.floor(this.x);
+  		this.y = Math.floor(this.y);
+  		return this;
+  	},
+
+  	// @method ceil(): Point
+  	// Returns a copy of the current point with ceiled coordinates (rounded up).
+  	ceil: function () {
+  		return this.clone()._ceil();
+  	},
+
+  	_ceil: function () {
+  		this.x = Math.ceil(this.x);
+  		this.y = Math.ceil(this.y);
+  		return this;
+  	},
+
+  	// @method trunc(): Point
+  	// Returns a copy of the current point with truncated coordinates (rounded towards zero).
+  	trunc: function () {
+  		return this.clone()._trunc();
+  	},
+
+  	_trunc: function () {
+  		this.x = trunc(this.x);
+  		this.y = trunc(this.y);
+  		return this;
+  	},
+
+  	// @method distanceTo(otherPoint: Point): Number
+  	// Returns the cartesian distance between the current and the given points.
+  	distanceTo: function (point) {
+  		point = toPoint(point);
+
+  		var x = point.x - this.x,
+  		    y = point.y - this.y;
+
+  		return Math.sqrt(x * x + y * y);
+  	},
+
+  	// @method equals(otherPoint: Point): Boolean
+  	// Returns `true` if the given point has the same coordinates.
+  	equals: function (point) {
+  		point = toPoint(point);
+
+  		return point.x === this.x &&
+  		       point.y === this.y;
+  	},
+
+  	// @method contains(otherPoint: Point): Boolean
+  	// Returns `true` if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).
+  	contains: function (point) {
+  		point = toPoint(point);
+
+  		return Math.abs(point.x) <= Math.abs(this.x) &&
+  		       Math.abs(point.y) <= Math.abs(this.y);
+  	},
+
+  	// @method toString(): String
+  	// Returns a string representation of the point for debugging purposes.
+  	toString: function () {
+  		return 'Point(' +
+  		        formatNum(this.x) + ', ' +
+  		        formatNum(this.y) + ')';
+  	}
+  };
+
+  // @factory L.point(x: Number, y: Number, round?: Boolean)
+  // Creates a Point object with the given `x` and `y` coordinates. If optional `round` is set to true, rounds the `x` and `y` values.
+
+  // @alternative
+  // @factory L.point(coords: Number[])
+  // Expects an array of the form `[x, y]` instead.
+
+  // @alternative
+  // @factory L.point(coords: Object)
+  // Expects a plain object of the form `{x: Number, y: Number}` instead.
+  function toPoint(x, y, round) {
+  	if (x instanceof Point) {
+  		return x;
+  	}
+  	if (isArray(x)) {
+  		return new Point(x[0], x[1]);
+  	}
+  	if (x === undefined || x === null) {
+  		return x;
+  	}
+  	if (typeof x === 'object' && 'x' in x && 'y' in x) {
+  		return new Point(x.x, x.y);
+  	}
+  	return new Point(x, y, round);
+  }
+
+  /*
+   * @class Bounds
+   * @aka L.Bounds
+   *
+   * Represents a rectangular area in pixel coordinates.
+   *
+   * @example
+   *
+   * ```js
+   * var p1 = L.point(10, 10),
+   * p2 = L.point(40, 60),
+   * bounds = L.bounds(p1, p2);
+   * ```
+   *
+   * All Leaflet methods that accept `Bounds` objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:
+   *
+   * ```js
+   * otherBounds.intersects([[10, 10], [40, 60]]);
+   * ```
+   *
+   * Note that `Bounds` does not inherit from Leaflet's `Class` object,
+   * which means new classes can't inherit from it, and new methods
+   * can't be added to it with the `include` function.
+   */
+
+  function Bounds(a, b) {
+  	if (!a) { return; }
+
+  	var points = b ? [a, b] : a;
+
+  	for (var i = 0, len = points.length; i < len; i++) {
+  		this.extend(points[i]);
+  	}
+  }
+
+  Bounds.prototype = {
+  	// @method extend(point: Point): this
+  	// Extends the bounds to contain the given point.
+  	extend: function (point) { // (Point)
+  		point = toPoint(point);
+
+  		// @property min: Point
+  		// The top left corner of the rectangle.
+  		// @property max: Point
+  		// The bottom right corner of the rectangle.
+  		if (!this.min && !this.max) {
+  			this.min = point.clone();
+  			this.max = point.clone();
+  		} else {
+  			this.min.x = Math.min(point.x, this.min.x);
+  			this.max.x = Math.max(point.x, this.max.x);
+  			this.min.y = Math.min(point.y, this.min.y);
+  			this.max.y = Math.max(point.y, this.max.y);
+  		}
+  		return this;
+  	},
+
+  	// @method getCenter(round?: Boolean): Point
+  	// Returns the center point of the bounds.
+  	getCenter: function (round) {
+  		return new Point(
+  		        (this.min.x + this.max.x) / 2,
+  		        (this.min.y + this.max.y) / 2, round);
+  	},
+
+  	// @method getBottomLeft(): Point
+  	// Returns the bottom-left point of the bounds.
+  	getBottomLeft: function () {
+  		return new Point(this.min.x, this.max.y);
+  	},
+
+  	// @method getTopRight(): Point
+  	// Returns the top-right point of the bounds.
+  	getTopRight: function () { // -> Point
+  		return new Point(this.max.x, this.min.y);
+  	},
+
+  	// @method getTopLeft(): Point
+  	// Returns the top-left point of the bounds (i.e. [`this.min`](#bounds-min)).
+  	getTopLeft: function () {
+  		return this.min; // left, top
+  	},
+
+  	// @method getBottomRight(): Point
+  	// Returns the bottom-right point of the bounds (i.e. [`this.max`](#bounds-max)).
+  	getBottomRight: function () {
+  		return this.max; // right, bottom
+  	},
+
+  	// @method getSize(): Point
+  	// Returns the size of the given bounds
+  	getSize: function () {
+  		return this.max.subtract(this.min);
+  	},
+
+  	// @method contains(otherBounds: Bounds): Boolean
+  	// Returns `true` if the rectangle contains the given one.
+  	// @alternative
+  	// @method contains(point: Point): Boolean
+  	// Returns `true` if the rectangle contains the given point.
+  	contains: function (obj) {
+  		var min, max;
+
+  		if (typeof obj[0] === 'number' || obj instanceof Point) {
+  			obj = toPoint(obj);
+  		} else {
+  			obj = toBounds(obj);
+  		}
+
+  		if (obj instanceof Bounds) {
+  			min = obj.min;
+  			max = obj.max;
+  		} else {
+  			min = max = obj;
+  		}
+
+  		return (min.x >= this.min.x) &&
+  		       (max.x <= this.max.x) &&
+  		       (min.y >= this.min.y) &&
+  		       (max.y <= this.max.y);
+  	},
+
+  	// @method intersects(otherBounds: Bounds): Boolean
+  	// Returns `true` if the rectangle intersects the given bounds. Two bounds
+  	// intersect if they have at least one point in common.
+  	intersects: function (bounds) { // (Bounds) -> Boolean
+  		bounds = toBounds(bounds);
+
+  		var min = this.min,
+  		    max = this.max,
+  		    min2 = bounds.min,
+  		    max2 = bounds.max,
+  		    xIntersects = (max2.x >= min.x) && (min2.x <= max.x),
+  		    yIntersects = (max2.y >= min.y) && (min2.y <= max.y);
+
+  		return xIntersects && yIntersects;
+  	},
+
+  	// @method overlaps(otherBounds: Bounds): Boolean
+  	// Returns `true` if the rectangle overlaps the given bounds. Two bounds
+  	// overlap if their intersection is an area.
+  	overlaps: function (bounds) { // (Bounds) -> Boolean
+  		bounds = toBounds(bounds);
+
+  		var min = this.min,
+  		    max = this.max,
+  		    min2 = bounds.min,
+  		    max2 = bounds.max,
+  		    xOverlaps = (max2.x > min.x) && (min2.x < max.x),
+  		    yOverlaps = (max2.y > min.y) && (min2.y < max.y);
+
+  		return xOverlaps && yOverlaps;
+  	},
+
+  	isValid: function () {
+  		return !!(this.min && this.max);
+  	}
+  };
+
+
+  // @factory L.bounds(corner1: Point, corner2: Point)
+  // Creates a Bounds object from two corners coordinate pairs.
+  // @alternative
+  // @factory L.bounds(points: Point[])
+  // Creates a Bounds object from the given array of points.
+  function toBounds(a, b) {
+  	if (!a || a instanceof Bounds) {
+  		return a;
+  	}
+  	return new Bounds(a, b);
+  }
+
+  /*
+   * @class LatLngBounds
+   * @aka L.LatLngBounds
+   *
+   * Represents a rectangular geographical area on a map.
+   *
+   * @example
+   *
+   * ```js
+   * var corner1 = L.latLng(40.712, -74.227),
+   * corner2 = L.latLng(40.774, -74.125),
+   * bounds = L.latLngBounds(corner1, corner2);
+   * ```
+   *
+   * All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:
+   *
+   * ```js
+   * map.fitBounds([
+   * 	[40.712, -74.227],
+   * 	[40.774, -74.125]
+   * ]);
+   * ```
+   *
+   * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range.
+   *
+   * Note that `LatLngBounds` does not inherit from Leaflet's `Class` object,
+   * which means new classes can't inherit from it, and new methods
+   * can't be added to it with the `include` function.
+   */
+
+  function LatLngBounds(corner1, corner2) { // (LatLng, LatLng) or (LatLng[])
+  	if (!corner1) { return; }
+
+  	var latlngs = corner2 ? [corner1, corner2] : corner1;
+
+  	for (var i = 0, len = latlngs.length; i < len; i++) {
+  		this.extend(latlngs[i]);
+  	}
+  }
+
+  LatLngBounds.prototype = {
+
+  	// @method extend(latlng: LatLng): this
+  	// Extend the bounds to contain the given point
+
+  	// @alternative
+  	// @method extend(otherBounds: LatLngBounds): this
+  	// Extend the bounds to contain the given bounds
+  	extend: function (obj) {
+  		var sw = this._southWest,
+  		    ne = this._northEast,
+  		    sw2, ne2;
+
+  		if (obj instanceof LatLng) {
+  			sw2 = obj;
+  			ne2 = obj;
+
+  		} else if (obj instanceof LatLngBounds) {
+  			sw2 = obj._southWest;
+  			ne2 = obj._northEast;
+
+  			if (!sw2 || !ne2) { return this; }
+
+  		} else {
+  			return obj ? this.extend(toLatLng(obj) || toLatLngBounds(obj)) : this;
+  		}
+
+  		if (!sw && !ne) {
+  			this._southWest = new LatLng(sw2.lat, sw2.lng);
+  			this._northEast = new LatLng(ne2.lat, ne2.lng);
+  		} else {
+  			sw.lat = Math.min(sw2.lat, sw.lat);
+  			sw.lng = Math.min(sw2.lng, sw.lng);
+  			ne.lat = Math.max(ne2.lat, ne.lat);
+  			ne.lng = Math.max(ne2.lng, ne.lng);
+  		}
+
+  		return this;
+  	},
+
+  	// @method pad(bufferRatio: Number): LatLngBounds
+  	// Returns bounds created by extending or retracting the current bounds by a given ratio in each direction.
+  	// For example, a ratio of 0.5 extends the bounds by 50% in each direction.
+  	// Negative values will retract the bounds.
+  	pad: function (bufferRatio) {
+  		var sw = this._southWest,
+  		    ne = this._northEast,
+  		    heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,
+  		    widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;
+
+  		return new LatLngBounds(
+  		        new LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),
+  		        new LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));
+  	},
+
+  	// @method getCenter(): LatLng
+  	// Returns the center point of the bounds.
+  	getCenter: function () {
+  		return new LatLng(
+  		        (this._southWest.lat + this._northEast.lat) / 2,
+  		        (this._southWest.lng + this._northEast.lng) / 2);
+  	},
+
+  	// @method getSouthWest(): LatLng
+  	// Returns the south-west point of the bounds.
+  	getSouthWest: function () {
+  		return this._southWest;
+  	},
+
+  	// @method getNorthEast(): LatLng
+  	// Returns the north-east point of the bounds.
+  	getNorthEast: function () {
+  		return this._northEast;
+  	},
+
+  	// @method getNorthWest(): LatLng
+  	// Returns the north-west point of the bounds.
+  	getNorthWest: function () {
+  		return new LatLng(this.getNorth(), this.getWest());
+  	},
+
+  	// @method getSouthEast(): LatLng
+  	// Returns the south-east point of the bounds.
+  	getSouthEast: function () {
+  		return new LatLng(this.getSouth(), this.getEast());
+  	},
+
+  	// @method getWest(): Number
+  	// Returns the west longitude of the bounds
+  	getWest: function () {
+  		return this._southWest.lng;
+  	},
+
+  	// @method getSouth(): Number
+  	// Returns the south latitude of the bounds
+  	getSouth: function () {
+  		return this._southWest.lat;
+  	},
+
+  	// @method getEast(): Number
+  	// Returns the east longitude of the bounds
+  	getEast: function () {
+  		return this._northEast.lng;
+  	},
+
+  	// @method getNorth(): Number
+  	// Returns the north latitude of the bounds
+  	getNorth: function () {
+  		return this._northEast.lat;
+  	},
+
+  	// @method contains(otherBounds: LatLngBounds): Boolean
+  	// Returns `true` if the rectangle contains the given one.
+
+  	// @alternative
+  	// @method contains (latlng: LatLng): Boolean
+  	// Returns `true` if the rectangle contains the given point.
+  	contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean
+  		if (typeof obj[0] === 'number' || obj instanceof LatLng || 'lat' in obj) {
+  			obj = toLatLng(obj);
+  		} else {
+  			obj = toLatLngBounds(obj);
+  		}
+
+  		var sw = this._southWest,
+  		    ne = this._northEast,
+  		    sw2, ne2;
+
+  		if (obj instanceof LatLngBounds) {
+  			sw2 = obj.getSouthWest();
+  			ne2 = obj.getNorthEast();
+  		} else {
+  			sw2 = ne2 = obj;
+  		}
+
+  		return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&
+  		       (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);
+  	},
+
+  	// @method intersects(otherBounds: LatLngBounds): Boolean
+  	// Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.
+  	intersects: function (bounds) {
+  		bounds = toLatLngBounds(bounds);
+
+  		var sw = this._southWest,
+  		    ne = this._northEast,
+  		    sw2 = bounds.getSouthWest(),
+  		    ne2 = bounds.getNorthEast(),
+
+  		    latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),
+  		    lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);
+
+  		return latIntersects && lngIntersects;
+  	},
+
+  	// @method overlaps(otherBounds: LatLngBounds): Boolean
+  	// Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.
+  	overlaps: function (bounds) {
+  		bounds = toLatLngBounds(bounds);
+
+  		var sw = this._southWest,
+  		    ne = this._northEast,
+  		    sw2 = bounds.getSouthWest(),
+  		    ne2 = bounds.getNorthEast(),
+
+  		    latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat),
+  		    lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng);
+
+  		return latOverlaps && lngOverlaps;
+  	},
+
+  	// @method toBBoxString(): String
+  	// Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.
+  	toBBoxString: function () {
+  		return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');
+  	},
+
+  	// @method equals(otherBounds: LatLngBounds, maxMargin?: Number): Boolean
+  	// Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting `maxMargin` to a small number.
+  	equals: function (bounds, maxMargin) {
+  		if (!bounds) { return false; }
+
+  		bounds = toLatLngBounds(bounds);
+
+  		return this._southWest.equals(bounds.getSouthWest(), maxMargin) &&
+  		       this._northEast.equals(bounds.getNorthEast(), maxMargin);
+  	},
+
+  	// @method isValid(): Boolean
+  	// Returns `true` if the bounds are properly initialized.
+  	isValid: function () {
+  		return !!(this._southWest && this._northEast);
+  	}
+  };
+
+  // TODO International date line?
+
+  // @factory L.latLngBounds(corner1: LatLng, corner2: LatLng)
+  // Creates a `LatLngBounds` object by defining two diagonally opposite corners of the rectangle.
+
+  // @alternative
+  // @factory L.latLngBounds(latlngs: LatLng[])
+  // Creates a `LatLngBounds` object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with [`fitBounds`](#map-fitbounds).
+  function toLatLngBounds(a, b) {
+  	if (a instanceof LatLngBounds) {
+  		return a;
+  	}
+  	return new LatLngBounds(a, b);
+  }
+
+  /* @class LatLng
+   * @aka L.LatLng
+   *
+   * Represents a geographical point with a certain latitude and longitude.
+   *
+   * @example
+   *
+   * ```
+   * var latlng = L.latLng(50.5, 30.5);
+   * ```
+   *
+   * All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:
+   *
+   * ```
+   * map.panTo([50, 30]);
+   * map.panTo({lon: 30, lat: 50});
+   * map.panTo({lat: 50, lng: 30});
+   * map.panTo(L.latLng(50, 30));
+   * ```
+   *
+   * Note that `LatLng` does not inherit from Leaflet's `Class` object,
+   * which means new classes can't inherit from it, and new methods
+   * can't be added to it with the `include` function.
+   */
+
+  function LatLng(lat, lng, alt) {
+  	if (isNaN(lat) || isNaN(lng)) {
+  		throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');
+  	}
+
+  	// @property lat: Number
+  	// Latitude in degrees
+  	this.lat = +lat;
+
+  	// @property lng: Number
+  	// Longitude in degrees
+  	this.lng = +lng;
+
+  	// @property alt: Number
+  	// Altitude in meters (optional)
+  	if (alt !== undefined) {
+  		this.alt = +alt;
+  	}
+  }
+
+  LatLng.prototype = {
+  	// @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean
+  	// Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overridden by setting `maxMargin` to a small number.
+  	equals: function (obj, maxMargin) {
+  		if (!obj) { return false; }
+
+  		obj = toLatLng(obj);
+
+  		var margin = Math.max(
+  		        Math.abs(this.lat - obj.lat),
+  		        Math.abs(this.lng - obj.lng));
+
+  		return margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin);
+  	},
+
+  	// @method toString(): String
+  	// Returns a string representation of the point (for debugging purposes).
+  	toString: function (precision) {
+  		return 'LatLng(' +
+  		        formatNum(this.lat, precision) + ', ' +
+  		        formatNum(this.lng, precision) + ')';
+  	},
+
+  	// @method distanceTo(otherLatLng: LatLng): Number
+  	// Returns the distance (in meters) to the given `LatLng` calculated using the [Spherical Law of Cosines](https://en.wikipedia.org/wiki/Spherical_law_of_cosines).
+  	distanceTo: function (other) {
+  		return Earth.distance(this, toLatLng(other));
+  	},
+
+  	// @method wrap(): LatLng
+  	// Returns a new `LatLng` object with the longitude wrapped so it's always between -180 and +180 degrees.
+  	wrap: function () {
+  		return Earth.wrapLatLng(this);
+  	},
+
+  	// @method toBounds(sizeInMeters: Number): LatLngBounds
+  	// Returns a new `LatLngBounds` object in which each boundary is `sizeInMeters/2` meters apart from the `LatLng`.
+  	toBounds: function (sizeInMeters) {
+  		var latAccuracy = 180 * sizeInMeters / 40075017,
+  		    lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat);
+
+  		return toLatLngBounds(
+  		        [this.lat - latAccuracy, this.lng - lngAccuracy],
+  		        [this.lat + latAccuracy, this.lng + lngAccuracy]);
+  	},
+
+  	clone: function () {
+  		return new LatLng(this.lat, this.lng, this.alt);
+  	}
+  };
+
+
+
+  // @factory L.latLng(latitude: Number, longitude: Number, altitude?: Number): LatLng
+  // Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
+
+  // @alternative
+  // @factory L.latLng(coords: Array): LatLng
+  // Expects an array of the form `[Number, Number]` or `[Number, Number, Number]` instead.
+
+  // @alternative
+  // @factory L.latLng(coords: Object): LatLng
+  // Expects an plain object of the form `{lat: Number, lng: Number}` or `{lat: Number, lng: Number, alt: Number}` instead.
+
+  function toLatLng(a, b, c) {
+  	if (a instanceof LatLng) {
+  		return a;
+  	}
+  	if (isArray(a) && typeof a[0] !== 'object') {
+  		if (a.length === 3) {
+  			return new LatLng(a[0], a[1], a[2]);
+  		}
+  		if (a.length === 2) {
+  			return new LatLng(a[0], a[1]);
+  		}
+  		return null;
+  	}
+  	if (a === undefined || a === null) {
+  		return a;
+  	}
+  	if (typeof a === 'object' && 'lat' in a) {
+  		return new LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);
+  	}
+  	if (b === undefined) {
+  		return null;
+  	}
+  	return new LatLng(a, b, c);
+  }
+
+  /*
+   * @namespace CRS
+   * @crs L.CRS.Base
+   * Object that defines coordinate reference systems for projecting
+   * geographical points into pixel (screen) coordinates and back (and to
+   * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See
+   * [spatial reference system](http://en.wikipedia.org/wiki/Coordinate_reference_system).
+   *
+   * Leaflet defines the most usual CRSs by default. If you want to use a
+   * CRS not defined by default, take a look at the
+   * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin.
+   *
+   * Note that the CRS instances do not inherit from Leaflet's `Class` object,
+   * and can't be instantiated. Also, new classes can't inherit from them,
+   * and methods can't be added to them with the `include` function.
+   */
+
+  var CRS = {
+  	// @method latLngToPoint(latlng: LatLng, zoom: Number): Point
+  	// Projects geographical coordinates into pixel coordinates for a given zoom.
+  	latLngToPoint: function (latlng, zoom) {
+  		var projectedPoint = this.projection.project(latlng),
+  		    scale = this.scale(zoom);
+
+  		return this.transformation._transform(projectedPoint, scale);
+  	},
+
+  	// @method pointToLatLng(point: Point, zoom: Number): LatLng
+  	// The inverse of `latLngToPoint`. Projects pixel coordinates on a given
+  	// zoom into geographical coordinates.
+  	pointToLatLng: function (point, zoom) {
+  		var scale = this.scale(zoom),
+  		    untransformedPoint = this.transformation.untransform(point, scale);
+
+  		return this.projection.unproject(untransformedPoint);
+  	},
+
+  	// @method project(latlng: LatLng): Point
+  	// Projects geographical coordinates into coordinates in units accepted for
+  	// this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).
+  	project: function (latlng) {
+  		return this.projection.project(latlng);
+  	},
+
+  	// @method unproject(point: Point): LatLng
+  	// Given a projected coordinate returns the corresponding LatLng.
+  	// The inverse of `project`.
+  	unproject: function (point) {
+  		return this.projection.unproject(point);
+  	},
+
+  	// @method scale(zoom: Number): Number
+  	// Returns the scale used when transforming projected coordinates into
+  	// pixel coordinates for a particular zoom. For example, it returns
+  	// `256 * 2^zoom` for Mercator-based CRS.
+  	scale: function (zoom) {
+  		return 256 * Math.pow(2, zoom);
+  	},
+
+  	// @method zoom(scale: Number): Number
+  	// Inverse of `scale()`, returns the zoom level corresponding to a scale
+  	// factor of `scale`.
+  	zoom: function (scale) {
+  		return Math.log(scale / 256) / Math.LN2;
+  	},
+
+  	// @method getProjectedBounds(zoom: Number): Bounds
+  	// Returns the projection's bounds scaled and transformed for the provided `zoom`.
+  	getProjectedBounds: function (zoom) {
+  		if (this.infinite) { return null; }
+
+  		var b = this.projection.bounds,
+  		    s = this.scale(zoom),
+  		    min = this.transformation.transform(b.min, s),
+  		    max = this.transformation.transform(b.max, s);
+
+  		return new Bounds(min, max);
+  	},
+
+  	// @method distance(latlng1: LatLng, latlng2: LatLng): Number
+  	// Returns the distance between two geographical coordinates.
+
+  	// @property code: String
+  	// Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`)
+  	//
+  	// @property wrapLng: Number[]
+  	// An array of two numbers defining whether the longitude (horizontal) coordinate
+  	// axis wraps around a given range and how. Defaults to `[-180, 180]` in most
+  	// geographical CRSs. If `undefined`, the longitude axis does not wrap around.
+  	//
+  	// @property wrapLat: Number[]
+  	// Like `wrapLng`, but for the latitude (vertical) axis.
+
+  	// wrapLng: [min, max],
+  	// wrapLat: [min, max],
+
+  	// @property infinite: Boolean
+  	// If true, the coordinate space will be unbounded (infinite in both axes)
+  	infinite: false,
+
+  	// @method wrapLatLng(latlng: LatLng): LatLng
+  	// Returns a `LatLng` where lat and lng has been wrapped according to the
+  	// CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds.
+  	wrapLatLng: function (latlng) {
+  		var lng = this.wrapLng ? wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng,
+  		    lat = this.wrapLat ? wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat,
+  		    alt = latlng.alt;
+
+  		return new LatLng(lat, lng, alt);
+  	},
+
+  	// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds
+  	// Returns a `LatLngBounds` with the same size as the given one, ensuring
+  	// that its center is within the CRS's bounds.
+  	// Only accepts actual `L.LatLngBounds` instances, not arrays.
+  	wrapLatLngBounds: function (bounds) {
+  		var center = bounds.getCenter(),
+  		    newCenter = this.wrapLatLng(center),
+  		    latShift = center.lat - newCenter.lat,
+  		    lngShift = center.lng - newCenter.lng;
+
+  		if (latShift === 0 && lngShift === 0) {
+  			return bounds;
+  		}
+
+  		var sw = bounds.getSouthWest(),
+  		    ne = bounds.getNorthEast(),
+  		    newSw = new LatLng(sw.lat - latShift, sw.lng - lngShift),
+  		    newNe = new LatLng(ne.lat - latShift, ne.lng - lngShift);
+
+  		return new LatLngBounds(newSw, newNe);
+  	}
+  };
+
+  /*
+   * @namespace CRS
+   * @crs L.CRS.Earth
+   *
+   * Serves as the base for CRS that are global such that they cover the earth.
+   * Can only be used as the base for other CRS and cannot be used directly,
+   * since it does not have a `code`, `projection` or `transformation`. `distance()` returns
+   * meters.
+   */
+
+  var Earth = extend({}, CRS, {
+  	wrapLng: [-180, 180],
+
+  	// Mean Earth Radius, as recommended for use by
+  	// the International Union of Geodesy and Geophysics,
+  	// see http://rosettacode.org/wiki/Haversine_formula
+  	R: 6371000,
+
+  	// distance between two geographical points using spherical law of cosines approximation
+  	distance: function (latlng1, latlng2) {
+  		var rad = Math.PI / 180,
+  		    lat1 = latlng1.lat * rad,
+  		    lat2 = latlng2.lat * rad,
+  		    sinDLat = Math.sin((latlng2.lat - latlng1.lat) * rad / 2),
+  		    sinDLon = Math.sin((latlng2.lng - latlng1.lng) * rad / 2),
+  		    a = sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLon * sinDLon,
+  		    c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+  		return this.R * c;
+  	}
+  });
+
+  /*
+   * @namespace Projection
+   * @projection L.Projection.SphericalMercator
+   *
+   * Spherical Mercator projection — the most common projection for online maps,
+   * used by almost all free and commercial tile providers. Assumes that Earth is
+   * a sphere. Used by the `EPSG:3857` CRS.
+   */
+
+  var earthRadius = 6378137;
+
+  var SphericalMercator = {
+
+  	R: earthRadius,
+  	MAX_LATITUDE: 85.0511287798,
+
+  	project: function (latlng) {
+  		var d = Math.PI / 180,
+  		    max = this.MAX_LATITUDE,
+  		    lat = Math.max(Math.min(max, latlng.lat), -max),
+  		    sin = Math.sin(lat * d);
+
+  		return new Point(
+  			this.R * latlng.lng * d,
+  			this.R * Math.log((1 + sin) / (1 - sin)) / 2);
+  	},
+
+  	unproject: function (point) {
+  		var d = 180 / Math.PI;
+
+  		return new LatLng(
+  			(2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,
+  			point.x * d / this.R);
+  	},
+
+  	bounds: (function () {
+  		var d = earthRadius * Math.PI;
+  		return new Bounds([-d, -d], [d, d]);
+  	})()
+  };
+
+  /*
+   * @class Transformation
+   * @aka L.Transformation
+   *
+   * Represents an affine transformation: a set of coefficients `a`, `b`, `c`, `d`
+   * for transforming a point of a form `(x, y)` into `(a*x + b, c*y + d)` and doing
+   * the reverse. Used by Leaflet in its projections code.
+   *
+   * @example
+   *
+   * ```js
+   * var transformation = L.transformation(2, 5, -1, 10),
+   * 	p = L.point(1, 2),
+   * 	p2 = transformation.transform(p), //  L.point(7, 8)
+   * 	p3 = transformation.untransform(p2); //  L.point(1, 2)
+   * ```
+   */
+
+
+  // factory new L.Transformation(a: Number, b: Number, c: Number, d: Number)
+  // Creates a `Transformation` object with the given coefficients.
+  function Transformation(a, b, c, d) {
+  	if (isArray(a)) {
+  		// use array properties
+  		this._a = a[0];
+  		this._b = a[1];
+  		this._c = a[2];
+  		this._d = a[3];
+  		return;
+  	}
+  	this._a = a;
+  	this._b = b;
+  	this._c = c;
+  	this._d = d;
+  }
+
+  Transformation.prototype = {
+  	// @method transform(point: Point, scale?: Number): Point
+  	// Returns a transformed point, optionally multiplied by the given scale.
+  	// Only accepts actual `L.Point` instances, not arrays.
+  	transform: function (point, scale) { // (Point, Number) -> Point
+  		return this._transform(point.clone(), scale);
+  	},
+
+  	// destructive transform (faster)
+  	_transform: function (point, scale) {
+  		scale = scale || 1;
+  		point.x = scale * (this._a * point.x + this._b);
+  		point.y = scale * (this._c * point.y + this._d);
+  		return point;
+  	},
+
+  	// @method untransform(point: Point, scale?: Number): Point
+  	// Returns the reverse transformation of the given point, optionally divided
+  	// by the given scale. Only accepts actual `L.Point` instances, not arrays.
+  	untransform: function (point, scale) {
+  		scale = scale || 1;
+  		return new Point(
+  		        (point.x / scale - this._b) / this._a,
+  		        (point.y / scale - this._d) / this._c);
+  	}
+  };
+
+  // factory L.transformation(a: Number, b: Number, c: Number, d: Number)
+
+  // @factory L.transformation(a: Number, b: Number, c: Number, d: Number)
+  // Instantiates a Transformation object with the given coefficients.
+
+  // @alternative
+  // @factory L.transformation(coefficients: Array): Transformation
+  // Expects an coefficients array of the form
+  // `[a: Number, b: Number, c: Number, d: Number]`.
+
+  function toTransformation(a, b, c, d) {
+  	return new Transformation(a, b, c, d);
+  }
+
+  /*
+   * @namespace CRS
+   * @crs L.CRS.EPSG3857
+   *
+   * The most common CRS for online maps, used by almost all free and commercial
+   * tile providers. Uses Spherical Mercator projection. Set in by default in
+   * Map's `crs` option.
+   */
+
+  var EPSG3857 = extend({}, Earth, {
+  	code: 'EPSG:3857',
+  	projection: SphericalMercator,
+
+  	transformation: (function () {
+  		var scale = 0.5 / (Math.PI * SphericalMercator.R);
+  		return toTransformation(scale, 0.5, -scale, 0.5);
+  	}())
+  });
+
+  var EPSG900913 = extend({}, EPSG3857, {
+  	code: 'EPSG:900913'
+  });
+
+  // @namespace SVG; @section
+  // There are several static functions which can be called without instantiating L.SVG:
+
+  // @function create(name: String): SVGElement
+  // Returns a instance of [SVGElement](https://developer.mozilla.org/docs/Web/API/SVGElement),
+  // corresponding to the class name passed. For example, using 'line' will return
+  // an instance of [SVGLineElement](https://developer.mozilla.org/docs/Web/API/SVGLineElement).
+  function svgCreate(name) {
+  	return document.createElementNS('http://www.w3.org/2000/svg', name);
+  }
+
+  // @function pointsToPath(rings: Point[], closed: Boolean): String
+  // Generates a SVG path string for multiple rings, with each ring turning
+  // into "M..L..L.." instructions
+  function pointsToPath(rings, closed) {
+  	var str = '',
+  	i, j, len, len2, points, p;
+
+  	for (i = 0, len = rings.length; i < len; i++) {
+  		points = rings[i];
+
+  		for (j = 0, len2 = points.length; j < len2; j++) {
+  			p = points[j];
+  			str += (j ? 'L' : 'M') + p.x + ' ' + p.y;
+  		}
+
+  		// closes the ring for polygons; "x" is VML syntax
+  		str += closed ? (svg ? 'z' : 'x') : '';
+  	}
+
+  	// SVG complains about empty path strings
+  	return str || 'M0 0';
+  }
+
+  /*
+   * @namespace Browser
+   * @aka L.Browser
+   *
+   * A namespace with static properties for browser/feature detection used by Leaflet internally.
+   *
+   * @example
+   *
+   * ```js
+   * if (L.Browser.ielt9) {
+   *   alert('Upgrade your browser, dude!');
+   * }
+   * ```
+   */
+
+  var style$1 = document.documentElement.style;
+
+  // @property ie: Boolean; `true` for all Internet Explorer versions (not Edge).
+  var ie = 'ActiveXObject' in window;
+
+  // @property ielt9: Boolean; `true` for Internet Explorer versions less than 9.
+  var ielt9 = ie && !document.addEventListener;
+
+  // @property edge: Boolean; `true` for the Edge web browser.
+  var edge = 'msLaunchUri' in navigator && !('documentMode' in document);
+
+  // @property webkit: Boolean;
+  // `true` for webkit-based browsers like Chrome and Safari (including mobile versions).
+  var webkit = userAgentContains('webkit');
+
+  // @property android: Boolean
+  // `true` for any browser running on an Android platform.
+  var android = userAgentContains('android');
+
+  // @property android23: Boolean; `true` for browsers running on Android 2 or Android 3.
+  var android23 = userAgentContains('android 2') || userAgentContains('android 3');
+
+  /* See https://stackoverflow.com/a/17961266 for details on detecting stock Android */
+  var webkitVer = parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.userAgent)[1], 10); // also matches AppleWebKit
+  // @property androidStock: Boolean; `true` for the Android stock browser (i.e. not Chrome)
+  var androidStock = android && userAgentContains('Google') && webkitVer < 537 && !('AudioNode' in window);
+
+  // @property opera: Boolean; `true` for the Opera browser
+  var opera = !!window.opera;
+
+  // @property chrome: Boolean; `true` for the Chrome browser.
+  var chrome = !edge && userAgentContains('chrome');
+
+  // @property gecko: Boolean; `true` for gecko-based browsers like Firefox.
+  var gecko = userAgentContains('gecko') && !webkit && !opera && !ie;
+
+  // @property safari: Boolean; `true` for the Safari browser.
+  var safari = !chrome && userAgentContains('safari');
+
+  var phantom = userAgentContains('phantom');
+
+  // @property opera12: Boolean
+  // `true` for the Opera browser supporting CSS transforms (version 12 or later).
+  var opera12 = 'OTransition' in style$1;
+
+  // @property win: Boolean; `true` when the browser is running in a Windows platform
+  var win = navigator.platform.indexOf('Win') === 0;
+
+  // @property ie3d: Boolean; `true` for all Internet Explorer versions supporting CSS transforms.
+  var ie3d = ie && ('transition' in style$1);
+
+  // @property webkit3d: Boolean; `true` for webkit-based browsers supporting CSS transforms.
+  var webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23;
+
+  // @property gecko3d: Boolean; `true` for gecko-based browsers supporting CSS transforms.
+  var gecko3d = 'MozPerspective' in style$1;
+
+  // @property any3d: Boolean
+  // `true` for all browsers supporting CSS transforms.
+  var any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantom;
+
+  // @property mobile: Boolean; `true` for all browsers running in a mobile device.
+  var mobile = typeof orientation !== 'undefined' || userAgentContains('mobile');
+
+  // @property mobileWebkit: Boolean; `true` for all webkit-based browsers in a mobile device.
+  var mobileWebkit = mobile && webkit;
+
+  // @property mobileWebkit3d: Boolean
+  // `true` for all webkit-based browsers in a mobile device supporting CSS transforms.
+  var mobileWebkit3d = mobile && webkit3d;
+
+  // @property msPointer: Boolean
+  // `true` for browsers implementing the Microsoft touch events model (notably IE10).
+  var msPointer = !window.PointerEvent && window.MSPointerEvent;
+
+  // @property pointer: Boolean
+  // `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx).
+  var pointer = !!(window.PointerEvent || msPointer);
+
+  // @property touch: Boolean
+  // `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events).
+  // This does not necessarily mean that the browser is running in a computer with
+  // a touchscreen, it only means that the browser is capable of understanding
+  // touch events.
+  var touch = !window.L_NO_TOUCH && (pointer || 'ontouchstart' in window ||
+  		(window.DocumentTouch && document instanceof window.DocumentTouch));
+
+  // @property mobileOpera: Boolean; `true` for the Opera browser in a mobile device.
+  var mobileOpera = mobile && opera;
+
+  // @property mobileGecko: Boolean
+  // `true` for gecko-based browsers running in a mobile device.
+  var mobileGecko = mobile && gecko;
+
+  // @property retina: Boolean
+  // `true` for browsers on a high-resolution "retina" screen or on any screen when browser's display zoom is more than 100%.
+  var retina = (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1;
+
+  // @property passiveEvents: Boolean
+  // `true` for browsers that support passive events.
+  var passiveEvents = (function () {
+  	var supportsPassiveOption = false;
+  	try {
+  		var opts = Object.defineProperty({}, 'passive', {
+  			get: function () { // eslint-disable-line getter-return
+  				supportsPassiveOption = true;
+  			}
+  		});
+  		window.addEventListener('testPassiveEventSupport', falseFn, opts);
+  		window.removeEventListener('testPassiveEventSupport', falseFn, opts);
+  	} catch (e) {
+  		// Errors can safely be ignored since this is only a browser support test.
+  	}
+  	return supportsPassiveOption;
+  }());
+
+  // @property canvas: Boolean
+  // `true` when the browser supports [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).
+  var canvas = (function () {
+  	return !!document.createElement('canvas').getContext;
+  }());
+
+  // @property svg: Boolean
+  // `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG).
+  var svg = !!(document.createElementNS && svgCreate('svg').createSVGRect);
+
+  // @property vml: Boolean
+  // `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language).
+  var vml = !svg && (function () {
+  	try {
+  		var div = document.createElement('div');
+  		div.innerHTML = '<v:shape adj="1"/>';
+
+  		var shape = div.firstChild;
+  		shape.style.behavior = 'url(#default#VML)';
+
+  		return shape && (typeof shape.adj === 'object');
+
+  	} catch (e) {
+  		return false;
+  	}
+  }());
+
+
+  function userAgentContains(str) {
+  	return navigator.userAgent.toLowerCase().indexOf(str) >= 0;
+  }
+
+  var Browser = ({
+    ie: ie,
+    ielt9: ielt9,
+    edge: edge,
+    webkit: webkit,
+    android: android,
+    android23: android23,
+    androidStock: androidStock,
+    opera: opera,
+    chrome: chrome,
+    gecko: gecko,
+    safari: safari,
+    phantom: phantom,
+    opera12: opera12,
+    win: win,
+    ie3d: ie3d,
+    webkit3d: webkit3d,
+    gecko3d: gecko3d,
+    any3d: any3d,
+    mobile: mobile,
+    mobileWebkit: mobileWebkit,
+    mobileWebkit3d: mobileWebkit3d,
+    msPointer: msPointer,
+    pointer: pointer,
+    touch: touch,
+    mobileOpera: mobileOpera,
+    mobileGecko: mobileGecko,
+    retina: retina,
+    passiveEvents: passiveEvents,
+    canvas: canvas,
+    svg: svg,
+    vml: vml
+  });
+
+  /*
+   * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.
+   */
+
+
+  var POINTER_DOWN =   msPointer ? 'MSPointerDown'   : 'pointerdown';
+  var POINTER_MOVE =   msPointer ? 'MSPointerMove'   : 'pointermove';
+  var POINTER_UP =     msPointer ? 'MSPointerUp'     : 'pointerup';
+  var POINTER_CANCEL = msPointer ? 'MSPointerCancel' : 'pointercancel';
+
+  var _pointers = {};
+  var _pointerDocListener = false;
+
+  // Provides a touch events wrapper for (ms)pointer events.
+  // ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890
+
+  function addPointerListener(obj, type, handler, id) {
+  	if (type === 'touchstart') {
+  		_addPointerStart(obj, handler, id);
+
+  	} else if (type === 'touchmove') {
+  		_addPointerMove(obj, handler, id);
+
+  	} else if (type === 'touchend') {
+  		_addPointerEnd(obj, handler, id);
+  	}
+
+  	return this;
+  }
+
+  function removePointerListener(obj, type, id) {
+  	var handler = obj['_leaflet_' + type + id];
+
+  	if (type === 'touchstart') {
+  		obj.removeEventListener(POINTER_DOWN, handler, false);
+
+  	} else if (type === 'touchmove') {
+  		obj.removeEventListener(POINTER_MOVE, handler, false);
+
+  	} else if (type === 'touchend') {
+  		obj.removeEventListener(POINTER_UP, handler, false);
+  		obj.removeEventListener(POINTER_CANCEL, handler, false);
+  	}
+
+  	return this;
+  }
+
+  function _addPointerStart(obj, handler, id) {
+  	var onDown = bind(function (e) {
+  		// IE10 specific: MsTouch needs preventDefault. See #2000
+  		if (e.MSPOINTER_TYPE_TOUCH && e.pointerType === e.MSPOINTER_TYPE_TOUCH) {
+  			preventDefault(e);
+  		}
+
+  		_handlePointer(e, handler);
+  	});
+
+  	obj['_leaflet_touchstart' + id] = onDown;
+  	obj.addEventListener(POINTER_DOWN, onDown, false);
+
+  	// need to keep track of what pointers and how many are active to provide e.touches emulation
+  	if (!_pointerDocListener) {
+  		// we listen document as any drags that end by moving the touch off the screen get fired there
+  		document.addEventListener(POINTER_DOWN, _globalPointerDown, true);
+  		document.addEventListener(POINTER_MOVE, _globalPointerMove, true);
+  		document.addEventListener(POINTER_UP, _globalPointerUp, true);
+  		document.addEventListener(POINTER_CANCEL, _globalPointerUp, true);
+
+  		_pointerDocListener = true;
+  	}
+  }
+
+  function _globalPointerDown(e) {
+  	_pointers[e.pointerId] = e;
+  }
+
+  function _globalPointerMove(e) {
+  	if (_pointers[e.pointerId]) {
+  		_pointers[e.pointerId] = e;
+  	}
+  }
+
+  function _globalPointerUp(e) {
+  	delete _pointers[e.pointerId];
+  }
+
+  function _handlePointer(e, handler) {
+  	e.touches = [];
+  	for (var i in _pointers) {
+  		e.touches.push(_pointers[i]);
+  	}
+  	e.changedTouches = [e];
+
+  	handler(e);
+  }
+
+  function _addPointerMove(obj, handler, id) {
+  	var onMove = function (e) {
+  		// don't fire touch moves when mouse isn't down
+  		if ((e.pointerType === (e.MSPOINTER_TYPE_MOUSE || 'mouse')) && e.buttons === 0) {
+  			return;
+  		}
+
+  		_handlePointer(e, handler);
+  	};
+
+  	obj['_leaflet_touchmove' + id] = onMove;
+  	obj.addEventListener(POINTER_MOVE, onMove, false);
+  }
+
+  function _addPointerEnd(obj, handler, id) {
+  	var onUp = function (e) {
+  		_handlePointer(e, handler);
+  	};
+
+  	obj['_leaflet_touchend' + id] = onUp;
+  	obj.addEventListener(POINTER_UP, onUp, false);
+  	obj.addEventListener(POINTER_CANCEL, onUp, false);
+  }
+
+  /*
+   * Extends the event handling code with double tap support for mobile browsers.
+   */
+
+  var _touchstart = msPointer ? 'MSPointerDown' : pointer ? 'pointerdown' : 'touchstart';
+  var _touchend = msPointer ? 'MSPointerUp' : pointer ? 'pointerup' : 'touchend';
+  var _pre = '_leaflet_';
+
+  // inspired by Zepto touch code by Thomas Fuchs
+  function addDoubleTapListener(obj, handler, id) {
+  	var last, touch$$1,
+  	    doubleTap = false,
+  	    delay = 250;
+
+  	function onTouchStart(e) {
+
+  		if (pointer) {
+  			if (!e.isPrimary) { return; }
+  			if (e.pointerType === 'mouse') { return; } // mouse fires native dblclick
+  		} else if (e.touches.length > 1) {
+  			return;
+  		}
+
+  		var now = Date.now(),
+  		    delta = now - (last || now);
+
+  		touch$$1 = e.touches ? e.touches[0] : e;
+  		doubleTap = (delta > 0 && delta <= delay);
+  		last = now;
+  	}
+
+  	function onTouchEnd(e) {
+  		if (doubleTap && !touch$$1.cancelBubble) {
+  			if (pointer) {
+  				if (e.pointerType === 'mouse') { return; }
+  				// work around .type being readonly with MSPointer* events
+  				var newTouch = {},
+  				    prop, i;
+
+  				for (i in touch$$1) {
+  					prop = touch$$1[i];
+  					newTouch[i] = prop && prop.bind ? prop.bind(touch$$1) : prop;
+  				}
+  				touch$$1 = newTouch;
+  			}
+  			touch$$1.type = 'dblclick';
+  			touch$$1.button = 0;
+  			handler(touch$$1);
+  			last = null;
+  		}
+  	}
+
+  	obj[_pre + _touchstart + id] = onTouchStart;
+  	obj[_pre + _touchend + id] = onTouchEnd;
+  	obj[_pre + 'dblclick' + id] = handler;
+
+  	obj.addEventListener(_touchstart, onTouchStart, passiveEvents ? {passive: false} : false);
+  	obj.addEventListener(_touchend, onTouchEnd, passiveEvents ? {passive: false} : false);
+
+  	// On some platforms (notably, chrome<55 on win10 + touchscreen + mouse),
+  	// the browser doesn't fire touchend/pointerup events but does fire
+  	// native dblclicks. See #4127.
+  	// Edge 14 also fires native dblclicks, but only for pointerType mouse, see #5180.
+  	obj.addEventListener('dblclick', handler, false);
+
+  	return this;
+  }
+
+  function removeDoubleTapListener(obj, id) {
+  	var touchstart = obj[_pre + _touchstart + id],
+  	    touchend = obj[_pre + _touchend + id],
+  	    dblclick = obj[_pre + 'dblclick' + id];
+
+  	obj.removeEventListener(_touchstart, touchstart, passiveEvents ? {passive: false} : false);
+  	obj.removeEventListener(_touchend, touchend, passiveEvents ? {passive: false} : false);
+  	obj.removeEventListener('dblclick', dblclick, false);
+
+  	return this;
+  }
+
+  /*
+   * @namespace DomUtil
+   *
+   * Utility functions to work with the [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model)
+   * tree, used by Leaflet internally.
+   *
+   * Most functions expecting or returning a `HTMLElement` also work for
+   * SVG elements. The only difference is that classes refer to CSS classes
+   * in HTML and SVG classes in SVG.
+   */
+
+
+  // @property TRANSFORM: String
+  // Vendor-prefixed transform style name (e.g. `'webkitTransform'` for WebKit).
+  var TRANSFORM = testProp(
+  	['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform']);
+
+  // webkitTransition comes first because some browser versions that drop vendor prefix don't do
+  // the same for the transitionend event, in particular the Android 4.1 stock browser
+
+  // @property TRANSITION: String
+  // Vendor-prefixed transition style name.
+  var TRANSITION = testProp(
+  	['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);
+
+  // @property TRANSITION_END: String
+  // Vendor-prefixed transitionend event name.
+  var TRANSITION_END =
+  	TRANSITION === 'webkitTransition' || TRANSITION === 'OTransition' ? TRANSITION + 'End' : 'transitionend';
+
+
+  // @function get(id: String|HTMLElement): HTMLElement
+  // Returns an element given its DOM id, or returns the element itself
+  // if it was passed directly.
+  function get(id) {
+  	return typeof id === 'string' ? document.getElementById(id) : id;
+  }
+
+  // @function getStyle(el: HTMLElement, styleAttrib: String): String
+  // Returns the value for a certain style attribute on an element,
+  // including computed values or values set through CSS.
+  function getStyle(el, style) {
+  	var value = el.style[style] || (el.currentStyle && el.currentStyle[style]);
+
+  	if ((!value || value === 'auto') && document.defaultView) {
+  		var css = document.defaultView.getComputedStyle(el, null);
+  		value = css ? css[style] : null;
+  	}
+  	return value === 'auto' ? null : value;
+  }
+
+  // @function create(tagName: String, className?: String, container?: HTMLElement): HTMLElement
+  // Creates an HTML element with `tagName`, sets its class to `className`, and optionally appends it to `container` element.
+  function create$1(tagName, className, container) {
+  	var el = document.createElement(tagName);
+  	el.className = className || '';
+
+  	if (container) {
+  		container.appendChild(el);
+  	}
+  	return el;
+  }
+
+  // @function remove(el: HTMLElement)
+  // Removes `el` from its parent element
+  function remove(el) {
+  	var parent = el.parentNode;
+  	if (parent) {
+  		parent.removeChild(el);
+  	}
+  }
+
+  // @function empty(el: HTMLElement)
+  // Removes all of `el`'s children elements from `el`
+  function empty(el) {
+  	while (el.firstChild) {
+  		el.removeChild(el.firstChild);
+  	}
+  }
+
+  // @function toFront(el: HTMLElement)
+  // Makes `el` the last child of its parent, so it renders in front of the other children.
+  function toFront(el) {
+  	var parent = el.parentNode;
+  	if (parent && parent.lastChild !== el) {
+  		parent.appendChild(el);
+  	}
+  }
+
+  // @function toBack(el: HTMLElement)
+  // Makes `el` the first child of its parent, so it renders behind the other children.
+  function toBack(el) {
+  	var parent = el.parentNode;
+  	if (parent && parent.firstChild !== el) {
+  		parent.insertBefore(el, parent.firstChild);
+  	}
+  }
+
+  // @function hasClass(el: HTMLElement, name: String): Boolean
+  // Returns `true` if the element's class attribute contains `name`.
+  function hasClass(el, name) {
+  	if (el.classList !== undefined) {
+  		return el.classList.contains(name);
+  	}
+  	var className = getClass(el);
+  	return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className);
+  }
+
+  // @function addClass(el: HTMLElement, name: String)
+  // Adds `name` to the element's class attribute.
+  function addClass(el, name) {
+  	if (el.classList !== undefined) {
+  		var classes = splitWords(name);
+  		for (var i = 0, len = classes.length; i < len; i++) {
+  			el.classList.add(classes[i]);
+  		}
+  	} else if (!hasClass(el, name)) {
+  		var className = getClass(el);
+  		setClass(el, (className ? className + ' ' : '') + name);
+  	}
+  }
+
+  // @function removeClass(el: HTMLElement, name: String)
+  // Removes `name` from the element's class attribute.
+  function removeClass(el, name) {
+  	if (el.classList !== undefined) {
+  		el.classList.remove(name);
+  	} else {
+  		setClass(el, trim((' ' + getClass(el) + ' ').replace(' ' + name + ' ', ' ')));
+  	}
+  }
+
+  // @function setClass(el: HTMLElement, name: String)
+  // Sets the element's class.
+  function setClass(el, name) {
+  	if (el.className.baseVal === undefined) {
+  		el.className = name;
+  	} else {
+  		// in case of SVG element
+  		el.className.baseVal = name;
+  	}
+  }
+
+  // @function getClass(el: HTMLElement): String
+  // Returns the element's class.
+  function getClass(el) {
+  	// Check if the element is an SVGElementInstance and use the correspondingElement instead
+  	// (Required for linked SVG elements in IE11.)
+  	if (el.correspondingElement) {
+  		el = el.correspondingElement;
+  	}
+  	return el.className.baseVal === undefined ? el.className : el.className.baseVal;
+  }
+
+  // @function setOpacity(el: HTMLElement, opacity: Number)
+  // Set the opacity of an element (including old IE support).
+  // `opacity` must be a number from `0` to `1`.
+  function setOpacity(el, value) {
+  	if ('opacity' in el.style) {
+  		el.style.opacity = value;
+  	} else if ('filter' in el.style) {
+  		_setOpacityIE(el, value);
+  	}
+  }
+
+  function _setOpacityIE(el, value) {
+  	var filter = false,
+  	    filterName = 'DXImageTransform.Microsoft.Alpha';
+
+  	// filters collection throws an error if we try to retrieve a filter that doesn't exist
+  	try {
+  		filter = el.filters.item(filterName);
+  	} catch (e) {
+  		// don't set opacity to 1 if we haven't already set an opacity,
+  		// it isn't needed and breaks transparent pngs.
+  		if (value === 1) { return; }
+  	}
+
+  	value = Math.round(value * 100);
+
+  	if (filter) {
+  		filter.Enabled = (value !== 100);
+  		filter.Opacity = value;
+  	} else {
+  		el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';
+  	}
+  }
+
+  // @function testProp(props: String[]): String|false
+  // Goes through the array of style names and returns the first name
+  // that is a valid style name for an element. If no such name is found,
+  // it returns false. Useful for vendor-prefixed styles like `transform`.
+  function testProp(props) {
+  	var style = document.documentElement.style;
+
+  	for (var i = 0; i < props.length; i++) {
+  		if (props[i] in style) {
+  			return props[i];
+  		}
+  	}
+  	return false;
+  }
+
+  // @function setTransform(el: HTMLElement, offset: Point, scale?: Number)
+  // Resets the 3D CSS transform of `el` so it is translated by `offset` pixels
+  // and optionally scaled by `scale`. Does not have an effect if the
+  // browser doesn't support 3D CSS transforms.
+  function setTransform(el, offset, scale) {
+  	var pos = offset || new Point(0, 0);
+
+  	el.style[TRANSFORM] =
+  		(ie3d ?
+  			'translate(' + pos.x + 'px,' + pos.y + 'px)' :
+  			'translate3d(' + pos.x + 'px,' + pos.y + 'px,0)') +
+  		(scale ? ' scale(' + scale + ')' : '');
+  }
+
+  // @function setPosition(el: HTMLElement, position: Point)
+  // Sets the position of `el` to coordinates specified by `position`,
+  // using CSS translate or top/left positioning depending on the browser
+  // (used by Leaflet internally to position its layers).
+  function setPosition(el, point) {
+
+  	/*eslint-disable */
+  	el._leaflet_pos = point;
+  	/* eslint-enable */
+
+  	if (any3d) {
+  		setTransform(el, point);
+  	} else {
+  		el.style.left = point.x + 'px';
+  		el.style.top = point.y + 'px';
+  	}
+  }
+
+  // @function getPosition(el: HTMLElement): Point
+  // Returns the coordinates of an element previously positioned with setPosition.
+  function getPosition(el) {
+  	// this method is only used for elements previously positioned using setPosition,
+  	// so it's safe to cache the position for performance
+
+  	return el._leaflet_pos || new Point(0, 0);
+  }
+
+  // @function disableTextSelection()
+  // Prevents the user from generating `selectstart` DOM events, usually generated
+  // when the user drags the mouse through a page with text. Used internally
+  // by Leaflet to override the behaviour of any click-and-drag interaction on
+  // the map. Affects drag interactions on the whole document.
+
+  // @function enableTextSelection()
+  // Cancels the effects of a previous [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection).
+  var disableTextSelection;
+  var enableTextSelection;
+  var _userSelect;
+  if ('onselectstart' in document) {
+  	disableTextSelection = function () {
+  		on(window, 'selectstart', preventDefault);
+  	};
+  	enableTextSelection = function () {
+  		off(window, 'selectstart', preventDefault);
+  	};
+  } else {
+  	var userSelectProperty = testProp(
+  		['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);
+
+  	disableTextSelection = function () {
+  		if (userSelectProperty) {
+  			var style = document.documentElement.style;
+  			_userSelect = style[userSelectProperty];
+  			style[userSelectProperty] = 'none';
+  		}
+  	};
+  	enableTextSelection = function () {
+  		if (userSelectProperty) {
+  			document.documentElement.style[userSelectProperty] = _userSelect;
+  			_userSelect = undefined;
+  		}
+  	};
+  }
+
+  // @function disableImageDrag()
+  // As [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection), but
+  // for `dragstart` DOM events, usually generated when the user drags an image.
+  function disableImageDrag() {
+  	on(window, 'dragstart', preventDefault);
+  }
+
+  // @function enableImageDrag()
+  // Cancels the effects of a previous [`L.DomUtil.disableImageDrag`](#domutil-disabletextselection).
+  function enableImageDrag() {
+  	off(window, 'dragstart', preventDefault);
+  }
+
+  var _outlineElement, _outlineStyle;
+  // @function preventOutline(el: HTMLElement)
+  // Makes the [outline](https://developer.mozilla.org/docs/Web/CSS/outline)
+  // of the element `el` invisible. Used internally by Leaflet to prevent
+  // focusable elements from displaying an outline when the user performs a
+  // drag interaction on them.
+  function preventOutline(element) {
+  	while (element.tabIndex === -1) {
+  		element = element.parentNode;
+  	}
+  	if (!element.style) { return; }
+  	restoreOutline();
+  	_outlineElement = element;
+  	_outlineStyle = element.style.outline;
+  	element.style.outline = 'none';
+  	on(window, 'keydown', restoreOutline);
+  }
+
+  // @function restoreOutline()
+  // Cancels the effects of a previous [`L.DomUtil.preventOutline`]().
+  function restoreOutline() {
+  	if (!_outlineElement) { return; }
+  	_outlineElement.style.outline = _outlineStyle;
+  	_outlineElement = undefined;
+  	_outlineStyle = undefined;
+  	off(window, 'keydown', restoreOutline);
+  }
+
+  // @function getSizedParentNode(el: HTMLElement): HTMLElement
+  // Finds the closest parent node which size (width and height) is not null.
+  function getSizedParentNode(element) {
+  	do {
+  		element = element.parentNode;
+  	} while ((!element.offsetWidth || !element.offsetHeight) && element !== document.body);
+  	return element;
+  }
+
+  // @function getScale(el: HTMLElement): Object
+  // Computes the CSS scale currently applied on the element.
+  // Returns an object with `x` and `y` members as horizontal and vertical scales respectively,
+  // and `boundingClientRect` as the result of [`getBoundingClientRect()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect).
+  function getScale(element) {
+  	var rect = element.getBoundingClientRect(); // Read-only in old browsers.
+
+  	return {
+  		x: rect.width / element.offsetWidth || 1,
+  		y: rect.height / element.offsetHeight || 1,
+  		boundingClientRect: rect
+  	};
+  }
+
+  var DomUtil = ({
+    TRANSFORM: TRANSFORM,
+    TRANSITION: TRANSITION,
+    TRANSITION_END: TRANSITION_END,
+    get: get,
+    getStyle: getStyle,
+    create: create$1,
+    remove: remove,
+    empty: empty,
+    toFront: toFront,
+    toBack: toBack,
+    hasClass: hasClass,
+    addClass: addClass,
+    removeClass: removeClass,
+    setClass: setClass,
+    getClass: getClass,
+    setOpacity: setOpacity,
+    testProp: testProp,
+    setTransform: setTransform,
+    setPosition: setPosition,
+    getPosition: getPosition,
+    disableTextSelection: disableTextSelection,
+    enableTextSelection: enableTextSelection,
+    disableImageDrag: disableImageDrag,
+    enableImageDrag: enableImageDrag,
+    preventOutline: preventOutline,
+    restoreOutline: restoreOutline,
+    getSizedParentNode: getSizedParentNode,
+    getScale: getScale
+  });
+
+  /*
+   * @namespace DomEvent
+   * Utility functions to work with the [DOM events](https://developer.mozilla.org/docs/Web/API/Event), used by Leaflet internally.
+   */
+
+  // Inspired by John Resig, Dean Edwards and YUI addEvent implementations.
+
+  // @function on(el: HTMLElement, types: String, fn: Function, context?: Object): this
+  // Adds a listener function (`fn`) to a particular DOM event type of the
+  // element `el`. You can optionally specify the context of the listener
+  // (object the `this` keyword will point to). You can also pass several
+  // space-separated types (e.g. `'click dblclick'`).
+
+  // @alternative
+  // @function on(el: HTMLElement, eventMap: Object, context?: Object): this
+  // Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`
+  function on(obj, types, fn, context) {
+
+  	if (typeof types === 'object') {
+  		for (var type in types) {
+  			addOne(obj, type, types[type], fn);
+  		}
+  	} else {
+  		types = splitWords(types);
+
+  		for (var i = 0, len = types.length; i < len; i++) {
+  			addOne(obj, types[i], fn, context);
+  		}
+  	}
+
+  	return this;
+  }
+
+  var eventsKey = '_leaflet_events';
+
+  // @function off(el: HTMLElement, types: String, fn: Function, context?: Object): this
+  // Removes a previously added listener function.
+  // Note that if you passed a custom context to on, you must pass the same
+  // context to `off` in order to remove the listener.
+
+  // @alternative
+  // @function off(el: HTMLElement, eventMap: Object, context?: Object): this
+  // Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`
+  function off(obj, types, fn, context) {
+
+  	if (typeof types === 'object') {
+  		for (var type in types) {
+  			removeOne(obj, type, types[type], fn);
+  		}
+  	} else if (types) {
+  		types = splitWords(types);
+
+  		for (var i = 0, len = types.length; i < len; i++) {
+  			removeOne(obj, types[i], fn, context);
+  		}
+  	} else {
+  		for (var j in obj[eventsKey]) {
+  			removeOne(obj, j, obj[eventsKey][j]);
+  		}
+  		delete obj[eventsKey];
+  	}
+
+  	return this;
+  }
+
+  function browserFiresNativeDblClick() {
+  	// See https://github.com/w3c/pointerevents/issues/171
+  	if (pointer) {
+  		return !(edge || safari);
+  	}
+  }
+
+  var mouseSubst = {
+  	mouseenter: 'mouseover',
+  	mouseleave: 'mouseout',
+  	wheel: !('onwheel' in window) && 'mousewheel'
+  };
+
+  function addOne(obj, type, fn, context) {
+  	var id = type + stamp(fn) + (context ? '_' + stamp(context) : '');
+
+  	if (obj[eventsKey] && obj[eventsKey][id]) { return this; }
+
+  	var handler = function (e) {
+  		return fn.call(context || obj, e || window.event);
+  	};
+
+  	var originalHandler = handler;
+
+  	if (pointer && type.indexOf('touch') === 0) {
+  		// Needs DomEvent.Pointer.js
+  		addPointerListener(obj, type, handler, id);
+
+  	} else if (touch && (type === 'dblclick') && !browserFiresNativeDblClick()) {
+  		addDoubleTapListener(obj, handler, id);
+
+  	} else if ('addEventListener' in obj) {
+
+  		if (type === 'touchstart' || type === 'touchmove' || type === 'wheel' ||  type === 'mousewheel') {
+  			obj.addEventListener(mouseSubst[type] || type, handler, passiveEvents ? {passive: false} : false);
+
+  		} else if (type === 'mouseenter' || type === 'mouseleave') {
+  			handler = function (e) {
+  				e = e || window.event;
+  				if (isExternalTarget(obj, e)) {
+  					originalHandler(e);
+  				}
+  			};
+  			obj.addEventListener(mouseSubst[type], handler, false);
+
+  		} else {
+  			obj.addEventListener(type, originalHandler, false);
+  		}
+
+  	} else if ('attachEvent' in obj) {
+  		obj.attachEvent('on' + type, handler);
+  	}
+
+  	obj[eventsKey] = obj[eventsKey] || {};
+  	obj[eventsKey][id] = handler;
+  }
+
+  function removeOne(obj, type, fn, context) {
+
+  	var id = type + stamp(fn) + (context ? '_' + stamp(context) : ''),
+  	    handler = obj[eventsKey] && obj[eventsKey][id];
+
+  	if (!handler) { return this; }
+
+  	if (pointer && type.indexOf('touch') === 0) {
+  		removePointerListener(obj, type, id);
+
+  	} else if (touch && (type === 'dblclick') && !browserFiresNativeDblClick()) {
+  		removeDoubleTapListener(obj, id);
+
+  	} else if ('removeEventListener' in obj) {
+
+  		obj.removeEventListener(mouseSubst[type] || type, handler, false);
+
+  	} else if ('detachEvent' in obj) {
+  		obj.detachEvent('on' + type, handler);
+  	}
+
+  	obj[eventsKey][id] = null;
+  }
+
+  // @function stopPropagation(ev: DOMEvent): this
+  // Stop the given event from propagation to parent elements. Used inside the listener functions:
+  // ```js
+  // L.DomEvent.on(div, 'click', function (ev) {
+  // 	L.DomEvent.stopPropagation(ev);
+  // });
+  // ```
+  function stopPropagation(e) {
+
+  	if (e.stopPropagation) {
+  		e.stopPropagation();
+  	} else if (e.originalEvent) {  // In case of Leaflet event.
+  		e.originalEvent._stopped = true;
+  	} else {
+  		e.cancelBubble = true;
+  	}
+  	skipped(e);
+
+  	return this;
+  }
+
+  // @function disableScrollPropagation(el: HTMLElement): this
+  // Adds `stopPropagation` to the element's `'wheel'` events (plus browser variants).
+  function disableScrollPropagation(el) {
+  	addOne(el, 'wheel', stopPropagation);
+  	return this;
+  }
+
+  // @function disableClickPropagation(el: HTMLElement): this
+  // Adds `stopPropagation` to the element's `'click'`, `'doubleclick'`,
+  // `'mousedown'` and `'touchstart'` events (plus browser variants).
+  function disableClickPropagation(el) {
+  	on(el, 'mousedown touchstart dblclick', stopPropagation);
+  	addOne(el, 'click', fakeStop);
+  	return this;
+  }
+
+  // @function preventDefault(ev: DOMEvent): this
+  // Prevents the default action of the DOM Event `ev` from happening (such as
+  // following a link in the href of the a element, or doing a POST request
+  // with page reload when a `<form>` is submitted).
+  // Use it inside listener functions.
+  function preventDefault(e) {
+  	if (e.preventDefault) {
+  		e.preventDefault();
+  	} else {
+  		e.returnValue = false;
+  	}
+  	return this;
+  }
+
+  // @function stop(ev: DOMEvent): this
+  // Does `stopPropagation` and `preventDefault` at the same time.
+  function stop(e) {
+  	preventDefault(e);
+  	stopPropagation(e);
+  	return this;
+  }
+
+  // @function getMousePosition(ev: DOMEvent, container?: HTMLElement): Point
+  // Gets normalized mouse position from a DOM event relative to the
+  // `container` (border excluded) or to the whole page if not specified.
+  function getMousePosition(e, container) {
+  	if (!container) {
+  		return new Point(e.clientX, e.clientY);
+  	}
+
+  	var scale = getScale(container),
+  	    offset = scale.boundingClientRect; // left and top  values are in page scale (like the event clientX/Y)
+
+  	return new Point(
+  		// offset.left/top values are in page scale (like clientX/Y),
+  		// whereas clientLeft/Top (border width) values are the original values (before CSS scale applies).
+  		(e.clientX - offset.left) / scale.x - container.clientLeft,
+  		(e.clientY - offset.top) / scale.y - container.clientTop
+  	);
+  }
+
+  // Chrome on Win scrolls double the pixels as in other platforms (see #4538),
+  // and Firefox scrolls device pixels, not CSS pixels
+  var wheelPxFactor =
+  	(win && chrome) ? 2 * window.devicePixelRatio :
+  	gecko ? window.devicePixelRatio : 1;
+
+  // @function getWheelDelta(ev: DOMEvent): Number
+  // Gets normalized wheel delta from a wheel DOM event, in vertical
+  // pixels scrolled (negative if scrolling down).
+  // Events from pointing devices without precise scrolling are mapped to
+  // a best guess of 60 pixels.
+  function getWheelDelta(e) {
+  	return (edge) ? e.wheelDeltaY / 2 : // Don't trust window-geometry-based delta
+  	       (e.deltaY && e.deltaMode === 0) ? -e.deltaY / wheelPxFactor : // Pixels
+  	       (e.deltaY && e.deltaMode === 1) ? -e.deltaY * 20 : // Lines
+  	       (e.deltaY && e.deltaMode === 2) ? -e.deltaY * 60 : // Pages
+  	       (e.deltaX || e.deltaZ) ? 0 :	// Skip horizontal/depth wheel events
+  	       e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 2 : // Legacy IE pixels
+  	       (e.detail && Math.abs(e.detail) < 32765) ? -e.detail * 20 : // Legacy Moz lines
+  	       e.detail ? e.detail / -32765 * 60 : // Legacy Moz pages
+  	       0;
+  }
+
+  var skipEvents = {};
+
+  function fakeStop(e) {
+  	// fakes stopPropagation by setting a special event flag, checked/reset with skipped(e)
+  	skipEvents[e.type] = true;
+  }
+
+  function skipped(e) {
+  	var events = skipEvents[e.type];
+  	// reset when checking, as it's only used in map container and propagates outside of the map
+  	skipEvents[e.type] = false;
+  	return events;
+  }
+
+  // check if element really left/entered the event target (for mouseenter/mouseleave)
+  function isExternalTarget(el, e) {
+
+  	var related = e.relatedTarget;
+
+  	if (!related) { return true; }
+
+  	try {
+  		while (related && (related !== el)) {
+  			related = related.parentNode;
+  		}
+  	} catch (err) {
+  		return false;
+  	}
+  	return (related !== el);
+  }
+
+  var DomEvent = ({
+    on: on,
+    off: off,
+    stopPropagation: stopPropagation,
+    disableScrollPropagation: disableScrollPropagation,
+    disableClickPropagation: disableClickPropagation,
+    preventDefault: preventDefault,
+    stop: stop,
+    getMousePosition: getMousePosition,
+    getWheelDelta: getWheelDelta,
+    fakeStop: fakeStop,
+    skipped: skipped,
+    isExternalTarget: isExternalTarget,
+    addListener: on,
+    removeListener: off
+  });
+
+  /*
+   * @class PosAnimation
+   * @aka L.PosAnimation
+   * @inherits Evented
+   * Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.
+   *
+   * @example
+   * ```js
+   * var fx = new L.PosAnimation();
+   * fx.run(el, [300, 500], 0.5);
+   * ```
+   *
+   * @constructor L.PosAnimation()
+   * Creates a `PosAnimation` object.
+   *
+   */
+
+  var PosAnimation = Evented.extend({
+
+  	// @method run(el: HTMLElement, newPos: Point, duration?: Number, easeLinearity?: Number)
+  	// Run an animation of a given element to a new position, optionally setting
+  	// duration in seconds (`0.25` by default) and easing linearity factor (3rd
+  	// argument of the [cubic bezier curve](http://cubic-bezier.com/#0,0,.5,1),
+  	// `0.5` by default).
+  	run: function (el, newPos, duration, easeLinearity) {
+  		this.stop();
+
+  		this._el = el;
+  		this._inProgress = true;
+  		this._duration = duration || 0.25;
+  		this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2);
+
+  		this._startPos = getPosition(el);
+  		this._offset = newPos.subtract(this._startPos);
+  		this._startTime = +new Date();
+
+  		// @event start: Event
+  		// Fired when the animation starts
+  		this.fire('start');
+
+  		this._animate();
+  	},
+
+  	// @method stop()
+  	// Stops the animation (if currently running).
+  	stop: function () {
+  		if (!this._inProgress) { return; }
+
+  		this._step(true);
+  		this._complete();
+  	},
+
+  	_animate: function () {
+  		// animation loop
+  		this._animId = requestAnimFrame(this._animate, this);
+  		this._step();
+  	},
+
+  	_step: function (round) {
+  		var elapsed = (+new Date()) - this._startTime,
+  		    duration = this._duration * 1000;
+
+  		if (elapsed < duration) {
+  			this._runFrame(this._easeOut(elapsed / duration), round);
+  		} else {
+  			this._runFrame(1);
+  			this._complete();
+  		}
+  	},
+
+  	_runFrame: function (progress, round) {
+  		var pos = this._startPos.add(this._offset.multiplyBy(progress));
+  		if (round) {
+  			pos._round();
+  		}
+  		setPosition(this._el, pos);
+
+  		// @event step: Event
+  		// Fired continuously during the animation.
+  		this.fire('step');
+  	},
+
+  	_complete: function () {
+  		cancelAnimFrame(this._animId);
+
+  		this._inProgress = false;
+  		// @event end: Event
+  		// Fired when the animation ends.
+  		this.fire('end');
+  	},
+
+  	_easeOut: function (t) {
+  		return 1 - Math.pow(1 - t, this._easeOutPower);
+  	}
+  });
+
+  /*
+   * @class Map
+   * @aka L.Map
+   * @inherits Evented
+   *
+   * The central class of the API — it is used to create a map on a page and manipulate it.
+   *
+   * @example
+   *
+   * ```js
+   * // initialize the map on the "map" div with a given center and zoom
+   * var map = L.map('map', {
+   * 	center: [51.505, -0.09],
+   * 	zoom: 13
+   * });
+   * ```
+   *
+   */
+
+  var Map = Evented.extend({
+
+  	options: {
+  		// @section Map State Options
+  		// @option crs: CRS = L.CRS.EPSG3857
+  		// The [Coordinate Reference System](#crs) to use. Don't change this if you're not
+  		// sure what it means.
+  		crs: EPSG3857,
+
+  		// @option center: LatLng = undefined
+  		// Initial geographic center of the map
+  		center: undefined,
+
+  		// @option zoom: Number = undefined
+  		// Initial map zoom level
+  		zoom: undefined,
+
+  		// @option minZoom: Number = *
+  		// Minimum zoom level of the map.
+  		// If not specified and at least one `GridLayer` or `TileLayer` is in the map,
+  		// the lowest of their `minZoom` options will be used instead.
+  		minZoom: undefined,
+
+  		// @option maxZoom: Number = *
+  		// Maximum zoom level of the map.
+  		// If not specified and at least one `GridLayer` or `TileLayer` is in the map,
+  		// the highest of their `maxZoom` options will be used instead.
+  		maxZoom: undefined,
+
+  		// @option layers: Layer[] = []
+  		// Array of layers that will be added to the map initially
+  		layers: [],
+
+  		// @option maxBounds: LatLngBounds = null
+  		// When this option is set, the map restricts the view to the given
+  		// geographical bounds, bouncing the user back if the user tries to pan
+  		// outside the view. To set the restriction dynamically, use
+  		// [`setMaxBounds`](#map-setmaxbounds) method.
+  		maxBounds: undefined,
+
+  		// @option renderer: Renderer = *
+  		// The default method for drawing vector layers on the map. `L.SVG`
+  		// or `L.Canvas` by default depending on browser support.
+  		renderer: undefined,
+
+
+  		// @section Animation Options
+  		// @option zoomAnimation: Boolean = true
+  		// Whether the map zoom animation is enabled. By default it's enabled
+  		// in all browsers that support CSS3 Transitions except Android.
+  		zoomAnimation: true,
+
+  		// @option zoomAnimationThreshold: Number = 4
+  		// Won't animate zoom if the zoom difference exceeds this value.
+  		zoomAnimationThreshold: 4,
+
+  		// @option fadeAnimation: Boolean = true
+  		// Whether the tile fade animation is enabled. By default it's enabled
+  		// in all browsers that support CSS3 Transitions except Android.
+  		fadeAnimation: true,
+
+  		// @option markerZoomAnimation: Boolean = true
+  		// Whether markers animate their zoom with the zoom animation, if disabled
+  		// they will disappear for the length of the animation. By default it's
+  		// enabled in all browsers that support CSS3 Transitions except Android.
+  		markerZoomAnimation: true,
+
+  		// @option transform3DLimit: Number = 2^23
+  		// Defines the maximum size of a CSS translation transform. The default
+  		// value should not be changed unless a web browser positions layers in
+  		// the wrong place after doing a large `panBy`.
+  		transform3DLimit: 8388608, // Precision limit of a 32-bit float
+
+  		// @section Interaction Options
+  		// @option zoomSnap: Number = 1
+  		// Forces the map's zoom level to always be a multiple of this, particularly
+  		// right after a [`fitBounds()`](#map-fitbounds) or a pinch-zoom.
+  		// By default, the zoom level snaps to the nearest integer; lower values
+  		// (e.g. `0.5` or `0.1`) allow for greater granularity. A value of `0`
+  		// means the zoom level will not be snapped after `fitBounds` or a pinch-zoom.
+  		zoomSnap: 1,
+
+  		// @option zoomDelta: Number = 1
+  		// Controls how much the map's zoom level will change after a
+  		// [`zoomIn()`](#map-zoomin), [`zoomOut()`](#map-zoomout), pressing `+`
+  		// or `-` on the keyboard, or using the [zoom controls](#control-zoom).
+  		// Values smaller than `1` (e.g. `0.5`) allow for greater granularity.
+  		zoomDelta: 1,
+
+  		// @option trackResize: Boolean = true
+  		// Whether the map automatically handles browser window resize to update itself.
+  		trackResize: true
+  	},
+
+  	initialize: function (id, options) { // (HTMLElement or String, Object)
+  		options = setOptions(this, options);
+
+  		// Make sure to assign internal flags at the beginning,
+  		// to avoid inconsistent state in some edge cases.
+  		this._handlers = [];
+  		this._layers = {};
+  		this._zoomBoundLayers = {};
+  		this._sizeChanged = true;
+
+  		this._initContainer(id);
+  		this._initLayout();
+
+  		// hack for https://github.com/Leaflet/Leaflet/issues/1980
+  		this._onResize = bind(this._onResize, this);
+
+  		this._initEvents();
+
+  		if (options.maxBounds) {
+  			this.setMaxBounds(options.maxBounds);
+  		}
+
+  		if (options.zoom !== undefined) {
+  			this._zoom = this._limitZoom(options.zoom);
+  		}
+
+  		if (options.center && options.zoom !== undefined) {
+  			this.setView(toLatLng(options.center), options.zoom, {reset: true});
+  		}
+
+  		this.callInitHooks();
+
+  		// don't animate on browsers without hardware-accelerated transitions or old Android/Opera
+  		this._zoomAnimated = TRANSITION && any3d && !mobileOpera &&
+  				this.options.zoomAnimation;
+
+  		// zoom transitions run with the same duration for all layers, so if one of transitionend events
+  		// happens after starting zoom animation (propagating to the map pane), we know that it ended globally
+  		if (this._zoomAnimated) {
+  			this._createAnimProxy();
+  			on(this._proxy, TRANSITION_END, this._catchTransitionEnd, this);
+  		}
+
+  		this._addLayers(this.options.layers);
+  	},
+
+
+  	// @section Methods for modifying map state
+
+  	// @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this
+  	// Sets the view of the map (geographical center and zoom) with the given
+  	// animation options.
+  	setView: function (center, zoom, options) {
+
+  		zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);
+  		center = this._limitCenter(toLatLng(center), zoom, this.options.maxBounds);
+  		options = options || {};
+
+  		this._stop();
+
+  		if (this._loaded && !options.reset && options !== true) {
+
+  			if (options.animate !== undefined) {
+  				options.zoom = extend({animate: options.animate}, options.zoom);
+  				options.pan = extend({animate: options.animate, duration: options.duration}, options.pan);
+  			}
+
+  			// try animating pan or zoom
+  			var moved = (this._zoom !== zoom) ?
+  				this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :
+  				this._tryAnimatedPan(center, options.pan);
+
+  			if (moved) {
+  				// prevent resize handler call, the view will refresh after animation anyway
+  				clearTimeout(this._sizeTimer);
+  				return this;
+  			}
+  		}
+
+  		// animation didn't start, just reset the map view
+  		this._resetView(center, zoom);
+
+  		return this;
+  	},
+
+  	// @method setZoom(zoom: Number, options?: Zoom/pan options): this
+  	// Sets the zoom of the map.
+  	setZoom: function (zoom, options) {
+  		if (!this._loaded) {
+  			this._zoom = zoom;
+  			return this;
+  		}
+  		return this.setView(this.getCenter(), zoom, {zoom: options});
+  	},
+
+  	// @method zoomIn(delta?: Number, options?: Zoom options): this
+  	// Increases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).
+  	zoomIn: function (delta, options) {
+  		delta = delta || (any3d ? this.options.zoomDelta : 1);
+  		return this.setZoom(this._zoom + delta, options);
+  	},
+
+  	// @method zoomOut(delta?: Number, options?: Zoom options): this
+  	// Decreases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).
+  	zoomOut: function (delta, options) {
+  		delta = delta || (any3d ? this.options.zoomDelta : 1);
+  		return this.setZoom(this._zoom - delta, options);
+  	},
+
+  	// @method setZoomAround(latlng: LatLng, zoom: Number, options: Zoom options): this
+  	// Zooms the map while keeping a specified geographical point on the map
+  	// stationary (e.g. used internally for scroll zoom and double-click zoom).
+  	// @alternative
+  	// @method setZoomAround(offset: Point, zoom: Number, options: Zoom options): this
+  	// Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.
+  	setZoomAround: function (latlng, zoom, options) {
+  		var scale = this.getZoomScale(zoom),
+  		    viewHalf = this.getSize().divideBy(2),
+  		    containerPoint = latlng instanceof Point ? latlng : this.latLngToContainerPoint(latlng),
+
+  		    centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),
+  		    newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));
+
+  		return this.setView(newCenter, zoom, {zoom: options});
+  	},
+
+  	_getBoundsCenterZoom: function (bounds, options) {
+
+  		options = options || {};
+  		bounds = bounds.getBounds ? bounds.getBounds() : toLatLngBounds(bounds);
+
+  		var paddingTL = toPoint(options.paddingTopLeft || options.padding || [0, 0]),
+  		    paddingBR = toPoint(options.paddingBottomRight || options.padding || [0, 0]),
+
+  		    zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR));
+
+  		zoom = (typeof options.maxZoom === 'number') ? Math.min(options.maxZoom, zoom) : zoom;
+
+  		if (zoom === Infinity) {
+  			return {
+  				center: bounds.getCenter(),
+  				zoom: zoom
+  			};
+  		}
+
+  		var paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),
+
+  		    swPoint = this.project(bounds.getSouthWest(), zoom),
+  		    nePoint = this.project(bounds.getNorthEast(), zoom),
+  		    center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);
+
+  		return {
+  			center: center,
+  			zoom: zoom
+  		};
+  	},
+
+  	// @method fitBounds(bounds: LatLngBounds, options?: fitBounds options): this
+  	// Sets a map view that contains the given geographical bounds with the
+  	// maximum zoom level possible.
+  	fitBounds: function (bounds, options) {
+
+  		bounds = toLatLngBounds(bounds);
+
+  		if (!bounds.isValid()) {
+  			throw new Error('Bounds are not valid.');
+  		}
+
+  		var target = this._getBoundsCenterZoom(bounds, options);
+  		return this.setView(target.center, target.zoom, options);
+  	},
+
+  	// @method fitWorld(options?: fitBounds options): this
+  	// Sets a map view that mostly contains the whole world with the maximum
+  	// zoom level possible.
+  	fitWorld: function (options) {
+  		return this.fitBounds([[-90, -180], [90, 180]], options);
+  	},
+
+  	// @method panTo(latlng: LatLng, options?: Pan options): this
+  	// Pans the map to a given center.
+  	panTo: function (center, options) { // (LatLng)
+  		return this.setView(center, this._zoom, {pan: options});
+  	},
+
+  	// @method panBy(offset: Point, options?: Pan options): this
+  	// Pans the map by a given number of pixels (animated).
+  	panBy: function (offset, options) {
+  		offset = toPoint(offset).round();
+  		options = options || {};
+
+  		if (!offset.x && !offset.y) {
+  			return this.fire('moveend');
+  		}
+  		// If we pan too far, Chrome gets issues with tiles
+  		// and makes them disappear or appear in the wrong place (slightly offset) #2602
+  		if (options.animate !== true && !this.getSize().contains(offset)) {
+  			this._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom());
+  			return this;
+  		}
+
+  		if (!this._panAnim) {
+  			this._panAnim = new PosAnimation();
+
+  			this._panAnim.on({
+  				'step': this._onPanTransitionStep,
+  				'end': this._onPanTransitionEnd
+  			}, this);
+  		}
+
+  		// don't fire movestart if animating inertia
+  		if (!options.noMoveStart) {
+  			this.fire('movestart');
+  		}
+
+  		// animate pan unless animate: false specified
+  		if (options.animate !== false) {
+  			addClass(this._mapPane, 'leaflet-pan-anim');
+
+  			var newPos = this._getMapPanePos().subtract(offset).round();
+  			this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);
+  		} else {
+  			this._rawPanBy(offset);
+  			this.fire('move').fire('moveend');
+  		}
+
+  		return this;
+  	},
+
+  	// @method flyTo(latlng: LatLng, zoom?: Number, options?: Zoom/pan options): this
+  	// Sets the view of the map (geographical center and zoom) performing a smooth
+  	// pan-zoom animation.
+  	flyTo: function (targetCenter, targetZoom, options) {
+
+  		options = options || {};
+  		if (options.animate === false || !any3d) {
+  			return this.setView(targetCenter, targetZoom, options);
+  		}
+
+  		this._stop();
+
+  		var from = this.project(this.getCenter()),
+  		    to = this.project(targetCenter),
+  		    size = this.getSize(),
+  		    startZoom = this._zoom;
+
+  		targetCenter = toLatLng(targetCenter);
+  		targetZoom = targetZoom === undefined ? startZoom : targetZoom;
+
+  		var w0 = Math.max(size.x, size.y),
+  		    w1 = w0 * this.getZoomScale(startZoom, targetZoom),
+  		    u1 = (to.distanceTo(from)) || 1,
+  		    rho = 1.42,
+  		    rho2 = rho * rho;
+
+  		function r(i) {
+  			var s1 = i ? -1 : 1,
+  			    s2 = i ? w1 : w0,
+  			    t1 = w1 * w1 - w0 * w0 + s1 * rho2 * rho2 * u1 * u1,
+  			    b1 = 2 * s2 * rho2 * u1,
+  			    b = t1 / b1,
+  			    sq = Math.sqrt(b * b + 1) - b;
+
+  			    // workaround for floating point precision bug when sq = 0, log = -Infinite,
+  			    // thus triggering an infinite loop in flyTo
+  			    var log = sq < 0.000000001 ? -18 : Math.log(sq);
+
+  			return log;
+  		}
+
+  		function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }
+  		function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }
+  		function tanh(n) { return sinh(n) / cosh(n); }
+
+  		var r0 = r(0);
+
+  		function w(s) { return w0 * (cosh(r0) / cosh(r0 + rho * s)); }
+  		function u(s) { return w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2; }
+
+  		function easeOut(t) { return 1 - Math.pow(1 - t, 1.5); }
+
+  		var start = Date.now(),
+  		    S = (r(1) - r0) / rho,
+  		    duration = options.duration ? 1000 * options.duration : 1000 * S * 0.8;
+
+  		function frame() {
+  			var t = (Date.now() - start) / duration,
+  			    s = easeOut(t) * S;
+
+  			if (t <= 1) {
+  				this._flyToFrame = requestAnimFrame(frame, this);
+
+  				this._move(
+  					this.unproject(from.add(to.subtract(from).multiplyBy(u(s) / u1)), startZoom),
+  					this.getScaleZoom(w0 / w(s), startZoom),
+  					{flyTo: true});
+
+  			} else {
+  				this
+  					._move(targetCenter, targetZoom)
+  					._moveEnd(true);
+  			}
+  		}
+
+  		this._moveStart(true, options.noMoveStart);
+
+  		frame.call(this);
+  		return this;
+  	},
+
+  	// @method flyToBounds(bounds: LatLngBounds, options?: fitBounds options): this
+  	// Sets the view of the map with a smooth animation like [`flyTo`](#map-flyto),
+  	// but takes a bounds parameter like [`fitBounds`](#map-fitbounds).
+  	flyToBounds: function (bounds, options) {
+  		var target = this._getBoundsCenterZoom(bounds, options);
+  		return this.flyTo(target.center, target.zoom, options);
+  	},
+
+  	// @method setMaxBounds(bounds: LatLngBounds): this
+  	// Restricts the map view to the given bounds (see the [maxBounds](#map-maxbounds) option).
+  	setMaxBounds: function (bounds) {
+  		bounds = toLatLngBounds(bounds);
+
+  		if (!bounds.isValid()) {
+  			this.options.maxBounds = null;
+  			return this.off('moveend', this._panInsideMaxBounds);
+  		} else if (this.options.maxBounds) {
+  			this.off('moveend', this._panInsideMaxBounds);
+  		}
+
+  		this.options.maxBounds = bounds;
+
+  		if (this._loaded) {
+  			this._panInsideMaxBounds();
+  		}
+
+  		return this.on('moveend', this._panInsideMaxBounds);
+  	},
+
+  	// @method setMinZoom(zoom: Number): this
+  	// Sets the lower limit for the available zoom levels (see the [minZoom](#map-minzoom) option).
+  	setMinZoom: function (zoom) {
+  		var oldZoom = this.options.minZoom;
+  		this.options.minZoom = zoom;
+
+  		if (this._loaded && oldZoom !== zoom) {
+  			this.fire('zoomlevelschange');
+
+  			if (this.getZoom() < this.options.minZoom) {
+  				return this.setZoom(zoom);
+  			}
+  		}
+
+  		return this;
+  	},
+
+  	// @method setMaxZoom(zoom: Number): this
+  	// Sets the upper limit for the available zoom levels (see the [maxZoom](#map-maxzoom) option).
+  	setMaxZoom: function (zoom) {
+  		var oldZoom = this.options.maxZoom;
+  		this.options.maxZoom = zoom;
+
+  		if (this._loaded && oldZoom !== zoom) {
+  			this.fire('zoomlevelschange');
+
+  			if (this.getZoom() > this.options.maxZoom) {
+  				return this.setZoom(zoom);
+  			}
+  		}
+
+  		return this;
+  	},
+
+  	// @method panInsideBounds(bounds: LatLngBounds, options?: Pan options): this
+  	// Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.
+  	panInsideBounds: function (bounds, options) {
+  		this._enforcingBounds = true;
+  		var center = this.getCenter(),
+  		    newCenter = this._limitCenter(center, this._zoom, toLatLngBounds(bounds));
+
+  		if (!center.equals(newCenter)) {
+  			this.panTo(newCenter, options);
+  		}
+
+  		this._enforcingBounds = false;
+  		return this;
+  	},
+
+  	// @method panInside(latlng: LatLng, options?: options): this
+  	// Pans the map the minimum amount to make the `latlng` visible. Use
+  	// `padding`, `paddingTopLeft` and `paddingTopRight` options to fit
+  	// the display to more restricted bounds, like [`fitBounds`](#map-fitbounds).
+  	// If `latlng` is already within the (optionally padded) display bounds,
+  	// the map will not be panned.
+  	panInside: function (latlng, options) {
+  		options = options || {};
+
+  		var paddingTL = toPoint(options.paddingTopLeft || options.padding || [0, 0]),
+  		    paddingBR = toPoint(options.paddingBottomRight || options.padding || [0, 0]),
+  		    center = this.getCenter(),
+  		    pixelCenter = this.project(center),
+  		    pixelPoint = this.project(latlng),
+  		    pixelBounds = this.getPixelBounds(),
+  		    halfPixelBounds = pixelBounds.getSize().divideBy(2),
+  		    paddedBounds = toBounds([pixelBounds.min.add(paddingTL), pixelBounds.max.subtract(paddingBR)]);
+
+  		if (!paddedBounds.contains(pixelPoint)) {
+  			this._enforcingBounds = true;
+  			var diff = pixelCenter.subtract(pixelPoint),
+  			    newCenter = toPoint(pixelPoint.x + diff.x, pixelPoint.y + diff.y);
+
+  			if (pixelPoint.x < paddedBounds.min.x || pixelPoint.x > paddedBounds.max.x) {
+  				newCenter.x = pixelCenter.x - diff.x;
+  				if (diff.x > 0) {
+  					newCenter.x += halfPixelBounds.x - paddingTL.x;
+  				} else {
+  					newCenter.x -= halfPixelBounds.x - paddingBR.x;
+  				}
+  			}
+  			if (pixelPoint.y < paddedBounds.min.y || pixelPoint.y > paddedBounds.max.y) {
+  				newCenter.y = pixelCenter.y - diff.y;
+  				if (diff.y > 0) {
+  					newCenter.y += halfPixelBounds.y - paddingTL.y;
+  				} else {
+  					newCenter.y -= halfPixelBounds.y - paddingBR.y;
+  				}
+  			}
+  			this.panTo(this.unproject(newCenter), options);
+  			this._enforcingBounds = false;
+  		}
+  		return this;
+  	},
+
+  	// @method invalidateSize(options: Zoom/pan options): this
+  	// Checks if the map container size changed and updates the map if so —
+  	// call it after you've changed the map size dynamically, also animating
+  	// pan by default. If `options.pan` is `false`, panning will not occur.
+  	// If `options.debounceMoveend` is `true`, it will delay `moveend` event so
+  	// that it doesn't happen often even if the method is called many
+  	// times in a row.
+
+  	// @alternative
+  	// @method invalidateSize(animate: Boolean): this
+  	// Checks if the map container size changed and updates the map if so —
+  	// call it after you've changed the map size dynamically, also animating
+  	// pan by default.
+  	invalidateSize: function (options) {
+  		if (!this._loaded) { return this; }
+
+  		options = extend({
+  			animate: false,
+  			pan: true
+  		}, options === true ? {animate: true} : options);
+
+  		var oldSize = this.getSize();
+  		this._sizeChanged = true;
+  		this._lastCenter = null;
+
+  		var newSize = this.getSize(),
+  		    oldCenter = oldSize.divideBy(2).round(),
+  		    newCenter = newSize.divideBy(2).round(),
+  		    offset = oldCenter.subtract(newCenter);
+
+  		if (!offset.x && !offset.y) { return this; }
+
+  		if (options.animate && options.pan) {
+  			this.panBy(offset);
+
+  		} else {
+  			if (options.pan) {
+  				this._rawPanBy(offset);
+  			}
+
+  			this.fire('move');
+
+  			if (options.debounceMoveend) {
+  				clearTimeout(this._sizeTimer);
+  				this._sizeTimer = setTimeout(bind(this.fire, this, 'moveend'), 200);
+  			} else {
+  				this.fire('moveend');
+  			}
+  		}
+
+  		// @section Map state change events
+  		// @event resize: ResizeEvent
+  		// Fired when the map is resized.
+  		return this.fire('resize', {
+  			oldSize: oldSize,
+  			newSize: newSize
+  		});
+  	},
+
+  	// @section Methods for modifying map state
+  	// @method stop(): this
+  	// Stops the currently running `panTo` or `flyTo` animation, if any.
+  	stop: function () {
+  		this.setZoom(this._limitZoom(this._zoom));
+  		if (!this.options.zoomSnap) {
+  			this.fire('viewreset');
+  		}
+  		return this._stop();
+  	},
+
+  	// @section Geolocation methods
+  	// @method locate(options?: Locate options): this
+  	// Tries to locate the user using the Geolocation API, firing a [`locationfound`](#map-locationfound)
+  	// event with location data on success or a [`locationerror`](#map-locationerror) event on failure,
+  	// and optionally sets the map view to the user's location with respect to
+  	// detection accuracy (or to the world view if geolocation failed).
+  	// Note that, if your page doesn't use HTTPS, this method will fail in
+  	// modern browsers ([Chrome 50 and newer](https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins))
+  	// See `Locate options` for more details.
+  	locate: function (options) {
+
+  		options = this._locateOptions = extend({
+  			timeout: 10000,
+  			watch: false
+  			// setView: false
+  			// maxZoom: <Number>
+  			// maximumAge: 0
+  			// enableHighAccuracy: false
+  		}, options);
+
+  		if (!('geolocation' in navigator)) {
+  			this._handleGeolocationError({
+  				code: 0,
+  				message: 'Geolocation not supported.'
+  			});
+  			return this;
+  		}
+
+  		var onResponse = bind(this._handleGeolocationResponse, this),
+  		    onError = bind(this._handleGeolocationError, this);
+
+  		if (options.watch) {
+  			this._locationWatchId =
+  			        navigator.geolocation.watchPosition(onResponse, onError, options);
+  		} else {
+  			navigator.geolocation.getCurrentPosition(onResponse, onError, options);
+  		}
+  		return this;
+  	},
+
+  	// @method stopLocate(): this
+  	// Stops watching location previously initiated by `map.locate({watch: true})`
+  	// and aborts resetting the map view if map.locate was called with
+  	// `{setView: true}`.
+  	stopLocate: function () {
+  		if (navigator.geolocation && navigator.geolocation.clearWatch) {
+  			navigator.geolocation.clearWatch(this._locationWatchId);
+  		}
+  		if (this._locateOptions) {
+  			this._locateOptions.setView = false;
+  		}
+  		return this;
+  	},
+
+  	_handleGeolocationError: function (error) {
+  		var c = error.code,
+  		    message = error.message ||
+  		            (c === 1 ? 'permission denied' :
+  		            (c === 2 ? 'position unavailable' : 'timeout'));
+
+  		if (this._locateOptions.setView && !this._loaded) {
+  			this.fitWorld();
+  		}
+
+  		// @section Location events
+  		// @event locationerror: ErrorEvent
+  		// Fired when geolocation (using the [`locate`](#map-locate) method) failed.
+  		this.fire('locationerror', {
+  			code: c,
+  			message: 'Geolocation error: ' + message + '.'
+  		});
+  	},
+
+  	_handleGeolocationResponse: function (pos) {
+  		var lat = pos.coords.latitude,
+  		    lng = pos.coords.longitude,
+  		    latlng = new LatLng(lat, lng),
+  		    bounds = latlng.toBounds(pos.coords.accuracy * 2),
+  		    options = this._locateOptions;
+
+  		if (options.setView) {
+  			var zoom = this.getBoundsZoom(bounds);
+  			this.setView(latlng, options.maxZoom ? Math.min(zoom, options.maxZoom) : zoom);
+  		}
+
+  		var data = {
+  			latlng: latlng,
+  			bounds: bounds,
+  			timestamp: pos.timestamp
+  		};
+
+  		for (var i in pos.coords) {
+  			if (typeof pos.coords[i] === 'number') {
+  				data[i] = pos.coords[i];
+  			}
+  		}
+
+  		// @event locationfound: LocationEvent
+  		// Fired when geolocation (using the [`locate`](#map-locate) method)
+  		// went successfully.
+  		this.fire('locationfound', data);
+  	},
+
+  	// TODO Appropriate docs section?
+  	// @section Other Methods
+  	// @method addHandler(name: String, HandlerClass: Function): this
+  	// Adds a new `Handler` to the map, given its name and constructor function.
+  	addHandler: function (name, HandlerClass) {
+  		if (!HandlerClass) { return this; }
+
+  		var handler = this[name] = new HandlerClass(this);
+
+  		this._handlers.push(handler);
+
+  		if (this.options[name]) {
+  			handler.enable();
+  		}
+
+  		return this;
+  	},
+
+  	// @method remove(): this
+  	// Destroys the map and clears all related event listeners.
+  	remove: function () {
+
+  		this._initEvents(true);
+  		this.off('moveend', this._panInsideMaxBounds);
+
+  		if (this._containerId !== this._container._leaflet_id) {
+  			throw new Error('Map container is being reused by another instance');
+  		}
+
+  		try {
+  			// throws error in IE6-8
+  			delete this._container._leaflet_id;
+  			delete this._containerId;
+  		} catch (e) {
+  			/*eslint-disable */
+  			this._container._leaflet_id = undefined;
+  			/* eslint-enable */
+  			this._containerId = undefined;
+  		}
+
+  		if (this._locationWatchId !== undefined) {
+  			this.stopLocate();
+  		}
+
+  		this._stop();
+
+  		remove(this._mapPane);
+
+  		if (this._clearControlPos) {
+  			this._clearControlPos();
+  		}
+  		if (this._resizeRequest) {
+  			cancelAnimFrame(this._resizeRequest);
+  			this._resizeRequest = null;
+  		}
+
+  		this._clearHandlers();
+
+  		if (this._loaded) {
+  			// @section Map state change events
+  			// @event unload: Event
+  			// Fired when the map is destroyed with [remove](#map-remove) method.
+  			this.fire('unload');
+  		}
+
+  		var i;
+  		for (i in this._layers) {
+  			this._layers[i].remove();
+  		}
+  		for (i in this._panes) {
+  			remove(this._panes[i]);
+  		}
+
+  		this._layers = [];
+  		this._panes = [];
+  		delete this._mapPane;
+  		delete this._renderer;
+
+  		return this;
+  	},
+
+  	// @section Other Methods
+  	// @method createPane(name: String, container?: HTMLElement): HTMLElement
+  	// Creates a new [map pane](#map-pane) with the given name if it doesn't exist already,
+  	// then returns it. The pane is created as a child of `container`, or
+  	// as a child of the main map pane if not set.
+  	createPane: function (name, container) {
+  		var className = 'leaflet-pane' + (name ? ' leaflet-' + name.replace('Pane', '') + '-pane' : ''),
+  		    pane = create$1('div', className, container || this._mapPane);
+
+  		if (name) {
+  			this._panes[name] = pane;
+  		}
+  		return pane;
+  	},
+
+  	// @section Methods for Getting Map State
+
+  	// @method getCenter(): LatLng
+  	// Returns the geographical center of the map view
+  	getCenter: function () {
+  		this._checkIfLoaded();
+
+  		if (this._lastCenter && !this._moved()) {
+  			return this._lastCenter;
+  		}
+  		return this.layerPointToLatLng(this._getCenterLayerPoint());
+  	},
+
+  	// @method getZoom(): Number
+  	// Returns the current zoom level of the map view
+  	getZoom: function () {
+  		return this._zoom;
+  	},
+
+  	// @method getBounds(): LatLngBounds
+  	// Returns the geographical bounds visible in the current map view
+  	getBounds: function () {
+  		var bounds = this.getPixelBounds(),
+  		    sw = this.unproject(bounds.getBottomLeft()),
+  		    ne = this.unproject(bounds.getTopRight());
+
+  		return new LatLngBounds(sw, ne);
+  	},
+
+  	// @method getMinZoom(): Number
+  	// Returns the minimum zoom level of the map (if set in the `minZoom` option of the map or of any layers), or `0` by default.
+  	getMinZoom: function () {
+  		return this.options.minZoom === undefined ? this._layersMinZoom || 0 : this.options.minZoom;
+  	},
+
+  	// @method getMaxZoom(): Number
+  	// Returns the maximum zoom level of the map (if set in the `maxZoom` option of the map or of any layers).
+  	getMaxZoom: function () {
+  		return this.options.maxZoom === undefined ?
+  			(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :
+  			this.options.maxZoom;
+  	},
+
+  	// @method getBoundsZoom(bounds: LatLngBounds, inside?: Boolean, padding?: Point): Number
+  	// Returns the maximum zoom level on which the given bounds fit to the map
+  	// view in its entirety. If `inside` (optional) is set to `true`, the method
+  	// instead returns the minimum zoom level on which the map view fits into
+  	// the given bounds in its entirety.
+  	getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number
+  		bounds = toLatLngBounds(bounds);
+  		padding = toPoint(padding || [0, 0]);
+
+  		var zoom = this.getZoom() || 0,
+  		    min = this.getMinZoom(),
+  		    max = this.getMaxZoom(),
+  		    nw = bounds.getNorthWest(),
+  		    se = bounds.getSouthEast(),
+  		    size = this.getSize().subtract(padding),
+  		    boundsSize = toBounds(this.project(se, zoom), this.project(nw, zoom)).getSize(),
+  		    snap = any3d ? this.options.zoomSnap : 1,
+  		    scalex = size.x / boundsSize.x,
+  		    scaley = size.y / boundsSize.y,
+  		    scale = inside ? Math.max(scalex, scaley) : Math.min(scalex, scaley);
+
+  		zoom = this.getScaleZoom(scale, zoom);
+
+  		if (snap) {
+  			zoom = Math.round(zoom / (snap / 100)) * (snap / 100); // don't jump if within 1% of a snap level
+  			zoom = inside ? Math.ceil(zoom / snap) * snap : Math.floor(zoom / snap) * snap;
+  		}
+
+  		return Math.max(min, Math.min(max, zoom));
+  	},
+
+  	// @method getSize(): Point
+  	// Returns the current size of the map container (in pixels).
+  	getSize: function () {
+  		if (!this._size || this._sizeChanged) {
+  			this._size = new Point(
+  				this._container.clientWidth || 0,
+  				this._container.clientHeight || 0);
+
+  			this._sizeChanged = false;
+  		}
+  		return this._size.clone();
+  	},
+
+  	// @method getPixelBounds(): Bounds
+  	// Returns the bounds of the current map view in projected pixel
+  	// coordinates (sometimes useful in layer and overlay implementations).
+  	getPixelBounds: function (center, zoom) {
+  		var topLeftPoint = this._getTopLeftPoint(center, zoom);
+  		return new Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));
+  	},
+
+  	// TODO: Check semantics - isn't the pixel origin the 0,0 coord relative to
+  	// the map pane? "left point of the map layer" can be confusing, specially
+  	// since there can be negative offsets.
+  	// @method getPixelOrigin(): Point
+  	// Returns the projected pixel coordinates of the top left point of
+  	// the map layer (useful in custom layer and overlay implementations).
+  	getPixelOrigin: function () {
+  		this._checkIfLoaded();
+  		return this._pixelOrigin;
+  	},
+
+  	// @method getPixelWorldBounds(zoom?: Number): Bounds
+  	// Returns the world's bounds in pixel coordinates for zoom level `zoom`.
+  	// If `zoom` is omitted, the map's current zoom level is used.
+  	getPixelWorldBounds: function (zoom) {
+  		return this.options.crs.getProjectedBounds(zoom === undefined ? this.getZoom() : zoom);
+  	},
+
+  	// @section Other Methods
+
+  	// @method getPane(pane: String|HTMLElement): HTMLElement
+  	// Returns a [map pane](#map-pane), given its name or its HTML element (its identity).
+  	getPane: function (pane) {
+  		return typeof pane === 'string' ? this._panes[pane] : pane;
+  	},
+
+  	// @method getPanes(): Object
+  	// Returns a plain object containing the names of all [panes](#map-pane) as keys and
+  	// the panes as values.
+  	getPanes: function () {
+  		return this._panes;
+  	},
+
+  	// @method getContainer: HTMLElement
+  	// Returns the HTML element that contains the map.
+  	getContainer: function () {
+  		return this._container;
+  	},
+
+
+  	// @section Conversion Methods
+
+  	// @method getZoomScale(toZoom: Number, fromZoom: Number): Number
+  	// Returns the scale factor to be applied to a map transition from zoom level
+  	// `fromZoom` to `toZoom`. Used internally to help with zoom animations.
+  	getZoomScale: function (toZoom, fromZoom) {
+  		// TODO replace with universal implementation after refactoring projections
+  		var crs = this.options.crs;
+  		fromZoom = fromZoom === undefined ? this._zoom : fromZoom;
+  		return crs.scale(toZoom) / crs.scale(fromZoom);
+  	},
+
+  	// @method getScaleZoom(scale: Number, fromZoom: Number): Number
+  	// Returns the zoom level that the map would end up at, if it is at `fromZoom`
+  	// level and everything is scaled by a factor of `scale`. Inverse of
+  	// [`getZoomScale`](#map-getZoomScale).
+  	getScaleZoom: function (scale, fromZoom) {
+  		var crs = this.options.crs;
+  		fromZoom = fromZoom === undefined ? this._zoom : fromZoom;
+  		var zoom = crs.zoom(scale * crs.scale(fromZoom));
+  		return isNaN(zoom) ? Infinity : zoom;
+  	},
+
+  	// @method project(latlng: LatLng, zoom: Number): Point
+  	// Projects a geographical coordinate `LatLng` according to the projection
+  	// of the map's CRS, then scales it according to `zoom` and the CRS's
+  	// `Transformation`. The result is pixel coordinate relative to
+  	// the CRS origin.
+  	project: function (latlng, zoom) {
+  		zoom = zoom === undefined ? this._zoom : zoom;
+  		return this.options.crs.latLngToPoint(toLatLng(latlng), zoom);
+  	},
+
+  	// @method unproject(point: Point, zoom: Number): LatLng
+  	// Inverse of [`project`](#map-project).
+  	unproject: function (point, zoom) {
+  		zoom = zoom === undefined ? this._zoom : zoom;
+  		return this.options.crs.pointToLatLng(toPoint(point), zoom);
+  	},
+
+  	// @method layerPointToLatLng(point: Point): LatLng
+  	// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),
+  	// returns the corresponding geographical coordinate (for the current zoom level).
+  	layerPointToLatLng: function (point) {
+  		var projectedPoint = toPoint(point).add(this.getPixelOrigin());
+  		return this.unproject(projectedPoint);
+  	},
+
+  	// @method latLngToLayerPoint(latlng: LatLng): Point
+  	// Given a geographical coordinate, returns the corresponding pixel coordinate
+  	// relative to the [origin pixel](#map-getpixelorigin).
+  	latLngToLayerPoint: function (latlng) {
+  		var projectedPoint = this.project(toLatLng(latlng))._round();
+  		return projectedPoint._subtract(this.getPixelOrigin());
+  	},
+
+  	// @method wrapLatLng(latlng: LatLng): LatLng
+  	// Returns a `LatLng` where `lat` and `lng` has been wrapped according to the
+  	// map's CRS's `wrapLat` and `wrapLng` properties, if they are outside the
+  	// CRS's bounds.
+  	// By default this means longitude is wrapped around the dateline so its
+  	// value is between -180 and +180 degrees.
+  	wrapLatLng: function (latlng) {
+  		return this.options.crs.wrapLatLng(toLatLng(latlng));
+  	},
+
+  	// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds
+  	// Returns a `LatLngBounds` with the same size as the given one, ensuring that
+  	// its center is within the CRS's bounds.
+  	// By default this means the center longitude is wrapped around the dateline so its
+  	// value is between -180 and +180 degrees, and the majority of the bounds
+  	// overlaps the CRS's bounds.
+  	wrapLatLngBounds: function (latlng) {
+  		return this.options.crs.wrapLatLngBounds(toLatLngBounds(latlng));
+  	},
+
+  	// @method distance(latlng1: LatLng, latlng2: LatLng): Number
+  	// Returns the distance between two geographical coordinates according to
+  	// the map's CRS. By default this measures distance in meters.
+  	distance: function (latlng1, latlng2) {
+  		return this.options.crs.distance(toLatLng(latlng1), toLatLng(latlng2));
+  	},
+
+  	// @method containerPointToLayerPoint(point: Point): Point
+  	// Given a pixel coordinate relative to the map container, returns the corresponding
+  	// pixel coordinate relative to the [origin pixel](#map-getpixelorigin).
+  	containerPointToLayerPoint: function (point) { // (Point)
+  		return toPoint(point).subtract(this._getMapPanePos());
+  	},
+
+  	// @method layerPointToContainerPoint(point: Point): Point
+  	// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),
+  	// returns the corresponding pixel coordinate relative to the map container.
+  	layerPointToContainerPoint: function (point) { // (Point)
+  		return toPoint(point).add(this._getMapPanePos());
+  	},
+
+  	// @method containerPointToLatLng(point: Point): LatLng
+  	// Given a pixel coordinate relative to the map container, returns
+  	// the corresponding geographical coordinate (for the current zoom level).
+  	containerPointToLatLng: function (point) {
+  		var layerPoint = this.containerPointToLayerPoint(toPoint(point));
+  		return this.layerPointToLatLng(layerPoint);
+  	},
+
+  	// @method latLngToContainerPoint(latlng: LatLng): Point
+  	// Given a geographical coordinate, returns the corresponding pixel coordinate
+  	// relative to the map container.
+  	latLngToContainerPoint: function (latlng) {
+  		return this.layerPointToContainerPoint(this.latLngToLayerPoint(toLatLng(latlng)));
+  	},
+
+  	// @method mouseEventToContainerPoint(ev: MouseEvent): Point
+  	// Given a MouseEvent object, returns the pixel coordinate relative to the
+  	// map container where the event took place.
+  	mouseEventToContainerPoint: function (e) {
+  		return getMousePosition(e, this._container);
+  	},
+
+  	// @method mouseEventToLayerPoint(ev: MouseEvent): Point
+  	// Given a MouseEvent object, returns the pixel coordinate relative to
+  	// the [origin pixel](#map-getpixelorigin) where the event took place.
+  	mouseEventToLayerPoint: function (e) {
+  		return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));
+  	},
+
+  	// @method mouseEventToLatLng(ev: MouseEvent): LatLng
+  	// Given a MouseEvent object, returns geographical coordinate where the
+  	// event took place.
+  	mouseEventToLatLng: function (e) { // (MouseEvent)
+  		return this.layerPointToLatLng(this.mouseEventToLayerPoint(e));
+  	},
+
+
+  	// map initialization methods
+
+  	_initContainer: function (id) {
+  		var container = this._container = get(id);
+
+  		if (!container) {
+  			throw new Error('Map container not found.');
+  		} else if (container._leaflet_id) {
+  			throw new Error('Map container is already initialized.');
+  		}
+
+  		on(container, 'scroll', this._onScroll, this);
+  		this._containerId = stamp(container);
+  	},
+
+  	_initLayout: function () {
+  		var container = this._container;
+
+  		this._fadeAnimated = this.options.fadeAnimation && any3d;
+
+  		addClass(container, 'leaflet-container' +
+  			(touch ? ' leaflet-touch' : '') +
+  			(retina ? ' leaflet-retina' : '') +
+  			(ielt9 ? ' leaflet-oldie' : '') +
+  			(safari ? ' leaflet-safari' : '') +
+  			(this._fadeAnimated ? ' leaflet-fade-anim' : ''));
+
+  		var position = getStyle(container, 'position');
+
+  		if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {
+  			container.style.position = 'relative';
+  		}
+
+  		this._initPanes();
+
+  		if (this._initControlPos) {
+  			this._initControlPos();
+  		}
+  	},
+
+  	_initPanes: function () {
+  		var panes = this._panes = {};
+  		this._paneRenderers = {};
+
+  		// @section
+  		//
+  		// Panes are DOM elements used to control the ordering of layers on the map. You
+  		// can access panes with [`map.getPane`](#map-getpane) or
+  		// [`map.getPanes`](#map-getpanes) methods. New panes can be created with the
+  		// [`map.createPane`](#map-createpane) method.
+  		//
+  		// Every map has the following default panes that differ only in zIndex.
+  		//
+  		// @pane mapPane: HTMLElement = 'auto'
+  		// Pane that contains all other map panes
+
+  		this._mapPane = this.createPane('mapPane', this._container);
+  		setPosition(this._mapPane, new Point(0, 0));
+
+  		// @pane tilePane: HTMLElement = 200
+  		// Pane for `GridLayer`s and `TileLayer`s
+  		this.createPane('tilePane');
+  		// @pane overlayPane: HTMLElement = 400
+  		// Pane for overlay shadows (e.g. `Marker` shadows)
+  		this.createPane('shadowPane');
+  		// @pane shadowPane: HTMLElement = 500
+  		// Pane for vectors (`Path`s, like `Polyline`s and `Polygon`s), `ImageOverlay`s and `VideoOverlay`s
+  		this.createPane('overlayPane');
+  		// @pane markerPane: HTMLElement = 600
+  		// Pane for `Icon`s of `Marker`s
+  		this.createPane('markerPane');
+  		// @pane tooltipPane: HTMLElement = 650
+  		// Pane for `Tooltip`s.
+  		this.createPane('tooltipPane');
+  		// @pane popupPane: HTMLElement = 700
+  		// Pane for `Popup`s.
+  		this.createPane('popupPane');
+
+  		if (!this.options.markerZoomAnimation) {
+  			addClass(panes.markerPane, 'leaflet-zoom-hide');
+  			addClass(panes.shadowPane, 'leaflet-zoom-hide');
+  		}
+  	},
+
+
+  	// private methods that modify map state
+
+  	// @section Map state change events
+  	_resetView: function (center, zoom) {
+  		setPosition(this._mapPane, new Point(0, 0));
+
+  		var loading = !this._loaded;
+  		this._loaded = true;
+  		zoom = this._limitZoom(zoom);
+
+  		this.fire('viewprereset');
+
+  		var zoomChanged = this._zoom !== zoom;
+  		this
+  			._moveStart(zoomChanged, false)
+  			._move(center, zoom)
+  			._moveEnd(zoomChanged);
+
+  		// @event viewreset: Event
+  		// Fired when the map needs to redraw its content (this usually happens
+  		// on map zoom or load). Very useful for creating custom overlays.
+  		this.fire('viewreset');
+
+  		// @event load: Event
+  		// Fired when the map is initialized (when its center and zoom are set
+  		// for the first time).
+  		if (loading) {
+  			this.fire('load');
+  		}
+  	},
+
+  	_moveStart: function (zoomChanged, noMoveStart) {
+  		// @event zoomstart: Event
+  		// Fired when the map zoom is about to change (e.g. before zoom animation).
+  		// @event movestart: Event
+  		// Fired when the view of the map starts changing (e.g. user starts dragging the map).
+  		if (zoomChanged) {
+  			this.fire('zoomstart');
+  		}
+  		if (!noMoveStart) {
+  			this.fire('movestart');
+  		}
+  		return this;
+  	},
+
+  	_move: function (center, zoom, data) {
+  		if (zoom === undefined) {
+  			zoom = this._zoom;
+  		}
+  		var zoomChanged = this._zoom !== zoom;
+
+  		this._zoom = zoom;
+  		this._lastCenter = center;
+  		this._pixelOrigin = this._getNewPixelOrigin(center);
+
+  		// @event zoom: Event
+  		// Fired repeatedly during any change in zoom level, including zoom
+  		// and fly animations.
+  		if (zoomChanged || (data && data.pinch)) {	// Always fire 'zoom' if pinching because #3530
+  			this.fire('zoom', data);
+  		}
+
+  		// @event move: Event
+  		// Fired repeatedly during any movement of the map, including pan and
+  		// fly animations.
+  		return this.fire('move', data);
+  	},
+
+  	_moveEnd: function (zoomChanged) {
+  		// @event zoomend: Event
+  		// Fired when the map has changed, after any animations.
+  		if (zoomChanged) {
+  			this.fire('zoomend');
+  		}
+
+  		// @event moveend: Event
+  		// Fired when the center of the map stops changing (e.g. user stopped
+  		// dragging the map).
+  		return this.fire('moveend');
+  	},
+
+  	_stop: function () {
+  		cancelAnimFrame(this._flyToFrame);
+  		if (this._panAnim) {
+  			this._panAnim.stop();
+  		}
+  		return this;
+  	},
+
+  	_rawPanBy: function (offset) {
+  		setPosition(this._mapPane, this._getMapPanePos().subtract(offset));
+  	},
+
+  	_getZoomSpan: function () {
+  		return this.getMaxZoom() - this.getMinZoom();
+  	},
+
+  	_panInsideMaxBounds: function () {
+  		if (!this._enforcingBounds) {
+  			this.panInsideBounds(this.options.maxBounds);
+  		}
+  	},
+
+  	_checkIfLoaded: function () {
+  		if (!this._loaded) {
+  			throw new Error('Set map center and zoom first.');
+  		}
+  	},
+
+  	// DOM event handling
+
+  	// @section Interaction events
+  	_initEvents: function (remove$$1) {
+  		this._targets = {};
+  		this._targets[stamp(this._container)] = this;
+
+  		var onOff = remove$$1 ? off : on;
+
+  		// @event click: MouseEvent
+  		// Fired when the user clicks (or taps) the map.
+  		// @event dblclick: MouseEvent
+  		// Fired when the user double-clicks (or double-taps) the map.
+  		// @event mousedown: MouseEvent
+  		// Fired when the user pushes the mouse button on the map.
+  		// @event mouseup: MouseEvent
+  		// Fired when the user releases the mouse button on the map.
+  		// @event mouseover: MouseEvent
+  		// Fired when the mouse enters the map.
+  		// @event mouseout: MouseEvent
+  		// Fired when the mouse leaves the map.
+  		// @event mousemove: MouseEvent
+  		// Fired while the mouse moves over the map.
+  		// @event contextmenu: MouseEvent
+  		// Fired when the user pushes the right mouse button on the map, prevents
+  		// default browser context menu from showing if there are listeners on
+  		// this event. Also fired on mobile when the user holds a single touch
+  		// for a second (also called long press).
+  		// @event keypress: KeyboardEvent
+  		// Fired when the user presses a key from the keyboard that produces a character value while the map is focused.
+  		// @event keydown: KeyboardEvent
+  		// Fired when the user presses a key from the keyboard while the map is focused. Unlike the `keypress` event,
+  		// the `keydown` event is fired for keys that produce a character value and for keys
+  		// that do not produce a character value.
+  		// @event keyup: KeyboardEvent
+  		// Fired when the user releases a key from the keyboard while the map is focused.
+  		onOff(this._container, 'click dblclick mousedown mouseup ' +
+  			'mouseover mouseout mousemove contextmenu keypress keydown keyup', this._handleDOMEvent, this);
+
+  		if (this.options.trackResize) {
+  			onOff(window, 'resize', this._onResize, this);
+  		}
+
+  		if (any3d && this.options.transform3DLimit) {
+  			(remove$$1 ? this.off : this.on).call(this, 'moveend', this._onMoveEnd);
+  		}
+  	},
+
+  	_onResize: function () {
+  		cancelAnimFrame(this._resizeRequest);
+  		this._resizeRequest = requestAnimFrame(
+  		        function () { this.invalidateSize({debounceMoveend: true}); }, this);
+  	},
+
+  	_onScroll: function () {
+  		this._container.scrollTop  = 0;
+  		this._container.scrollLeft = 0;
+  	},
+
+  	_onMoveEnd: function () {
+  		var pos = this._getMapPanePos();
+  		if (Math.max(Math.abs(pos.x), Math.abs(pos.y)) >= this.options.transform3DLimit) {
+  			// https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have
+  			// a pixel offset on very high values, see: http://jsfiddle.net/dg6r5hhb/
+  			this._resetView(this.getCenter(), this.getZoom());
+  		}
+  	},
+
+  	_findEventTargets: function (e, type) {
+  		var targets = [],
+  		    target,
+  		    isHover = type === 'mouseout' || type === 'mouseover',
+  		    src = e.target || e.srcElement,
+  		    dragging = false;
+
+  		while (src) {
+  			target = this._targets[stamp(src)];
+  			if (target && (type === 'click' || type === 'preclick') && !e._simulated && this._draggableMoved(target)) {
+  				// Prevent firing click after you just dragged an object.
+  				dragging = true;
+  				break;
+  			}
+  			if (target && target.listens(type, true)) {
+  				if (isHover && !isExternalTarget(src, e)) { break; }
+  				targets.push(target);
+  				if (isHover) { break; }
+  			}
+  			if (src === this._container) { break; }
+  			src = src.parentNode;
+  		}
+  		if (!targets.length && !dragging && !isHover && isExternalTarget(src, e)) {
+  			targets = [this];
+  		}
+  		return targets;
+  	},
+
+  	_handleDOMEvent: function (e) {
+  		if (!this._loaded || skipped(e)) { return; }
+
+  		var type = e.type;
+
+  		if (type === 'mousedown' || type === 'keypress' || type === 'keyup' || type === 'keydown') {
+  			// prevents outline when clicking on keyboard-focusable element
+  			preventOutline(e.target || e.srcElement);
+  		}
+
+  		this._fireDOMEvent(e, type);
+  	},
+
+  	_mouseEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu'],
+
+  	_fireDOMEvent: function (e, type, targets) {
+
+  		if (e.type === 'click') {
+  			// Fire a synthetic 'preclick' event which propagates up (mainly for closing popups).
+  			// @event preclick: MouseEvent
+  			// Fired before mouse click on the map (sometimes useful when you
+  			// want something to happen on click before any existing click
+  			// handlers start running).
+  			var synth = extend({}, e);
+  			synth.type = 'preclick';
+  			this._fireDOMEvent(synth, synth.type, targets);
+  		}
+
+  		if (e._stopped) { return; }
+
+  		// Find the layer the event is propagating from and its parents.
+  		targets = (targets || []).concat(this._findEventTargets(e, type));
+
+  		if (!targets.length) { return; }
+
+  		var target = targets[0];
+  		if (type === 'contextmenu' && target.listens(type, true)) {
+  			preventDefault(e);
+  		}
+
+  		var data = {
+  			originalEvent: e
+  		};
+
+  		if (e.type !== 'keypress' && e.type !== 'keydown' && e.type !== 'keyup') {
+  			var isMarker = target.getLatLng && (!target._radius || target._radius <= 10);
+  			data.containerPoint = isMarker ?
+  				this.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e);
+  			data.layerPoint = this.containerPointToLayerPoint(data.containerPoint);
+  			data.latlng = isMarker ? target.getLatLng() : this.layerPointToLatLng(data.layerPoint);
+  		}
+
+  		for (var i = 0; i < targets.length; i++) {
+  			targets[i].fire(type, data, true);
+  			if (data.originalEvent._stopped ||
+  				(targets[i].options.bubblingMouseEvents === false && indexOf(this._mouseEvents, type) !== -1)) { return; }
+  		}
+  	},
+
+  	_draggableMoved: function (obj) {
+  		obj = obj.dragging && obj.dragging.enabled() ? obj : this;
+  		return (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved());
+  	},
+
+  	_clearHandlers: function () {
+  		for (var i = 0, len = this._handlers.length; i < len; i++) {
+  			this._handlers[i].disable();
+  		}
+  	},
+
+  	// @section Other Methods
+
+  	// @method whenReady(fn: Function, context?: Object): this
+  	// Runs the given function `fn` when the map gets initialized with
+  	// a view (center and zoom) and at least one layer, or immediately
+  	// if it's already initialized, optionally passing a function context.
+  	whenReady: function (callback, context) {
+  		if (this._loaded) {
+  			callback.call(context || this, {target: this});
+  		} else {
+  			this.on('load', callback, context);
+  		}
+  		return this;
+  	},
+
+
+  	// private methods for getting map state
+
+  	_getMapPanePos: function () {
+  		return getPosition(this._mapPane) || new Point(0, 0);
+  	},
+
+  	_moved: function () {
+  		var pos = this._getMapPanePos();
+  		return pos && !pos.equals([0, 0]);
+  	},
+
+  	_getTopLeftPoint: function (center, zoom) {
+  		var pixelOrigin = center && zoom !== undefined ?
+  			this._getNewPixelOrigin(center, zoom) :
+  			this.getPixelOrigin();
+  		return pixelOrigin.subtract(this._getMapPanePos());
+  	},
+
+  	_getNewPixelOrigin: function (center, zoom) {
+  		var viewHalf = this.getSize()._divideBy(2);
+  		return this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round();
+  	},
+
+  	_latLngToNewLayerPoint: function (latlng, zoom, center) {
+  		var topLeft = this._getNewPixelOrigin(center, zoom);
+  		return this.project(latlng, zoom)._subtract(topLeft);
+  	},
+
+  	_latLngBoundsToNewLayerBounds: function (latLngBounds, zoom, center) {
+  		var topLeft = this._getNewPixelOrigin(center, zoom);
+  		return toBounds([
+  			this.project(latLngBounds.getSouthWest(), zoom)._subtract(topLeft),
+  			this.project(latLngBounds.getNorthWest(), zoom)._subtract(topLeft),
+  			this.project(latLngBounds.getSouthEast(), zoom)._subtract(topLeft),
+  			this.project(latLngBounds.getNorthEast(), zoom)._subtract(topLeft)
+  		]);
+  	},
+
+  	// layer point of the current center
+  	_getCenterLayerPoint: function () {
+  		return this.containerPointToLayerPoint(this.getSize()._divideBy(2));
+  	},
+
+  	// offset of the specified place to the current center in pixels
+  	_getCenterOffset: function (latlng) {
+  		return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());
+  	},
+
+  	// adjust center for view to get inside bounds
+  	_limitCenter: function (center, zoom, bounds) {
+
+  		if (!bounds) { return center; }
+
+  		var centerPoint = this.project(center, zoom),
+  		    viewHalf = this.getSize().divideBy(2),
+  		    viewBounds = new Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),
+  		    offset = this._getBoundsOffset(viewBounds, bounds, zoom);
+
+  		// If offset is less than a pixel, ignore.
+  		// This prevents unstable projections from getting into
+  		// an infinite loop of tiny offsets.
+  		if (offset.round().equals([0, 0])) {
+  			return center;
+  		}
+
+  		return this.unproject(centerPoint.add(offset), zoom);
+  	},
+
+  	// adjust offset for view to get inside bounds
+  	_limitOffset: function (offset, bounds) {
+  		if (!bounds) { return offset; }
+
+  		var viewBounds = this.getPixelBounds(),
+  		    newBounds = new Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));
+
+  		return offset.add(this._getBoundsOffset(newBounds, bounds));
+  	},
+
+  	// returns offset needed for pxBounds to get inside maxBounds at a specified zoom
+  	_getBoundsOffset: function (pxBounds, maxBounds, zoom) {
+  		var projectedMaxBounds = toBounds(
+  		        this.project(maxBounds.getNorthEast(), zoom),
+  		        this.project(maxBounds.getSouthWest(), zoom)
+  		    ),
+  		    minOffset = projectedMaxBounds.min.subtract(pxBounds.min),
+  		    maxOffset = projectedMaxBounds.max.subtract(pxBounds.max),
+
+  		    dx = this._rebound(minOffset.x, -maxOffset.x),
+  		    dy = this._rebound(minOffset.y, -maxOffset.y);
+
+  		return new Point(dx, dy);
+  	},
+
+  	_rebound: function (left, right) {
+  		return left + right > 0 ?
+  			Math.round(left - right) / 2 :
+  			Math.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));
+  	},
+
+  	_limitZoom: function (zoom) {
+  		var min = this.getMinZoom(),
+  		    max = this.getMaxZoom(),
+  		    snap = any3d ? this.options.zoomSnap : 1;
+  		if (snap) {
+  			zoom = Math.round(zoom / snap) * snap;
+  		}
+  		return Math.max(min, Math.min(max, zoom));
+  	},
+
+  	_onPanTransitionStep: function () {
+  		this.fire('move');
+  	},
+
+  	_onPanTransitionEnd: function () {
+  		removeClass(this._mapPane, 'leaflet-pan-anim');
+  		this.fire('moveend');
+  	},
+
+  	_tryAnimatedPan: function (center, options) {
+  		// difference between the new and current centers in pixels
+  		var offset = this._getCenterOffset(center)._trunc();
+
+  		// don't animate too far unless animate: true specified in options
+  		if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }
+
+  		this.panBy(offset, options);
+
+  		return true;
+  	},
+
+  	_createAnimProxy: function () {
+
+  		var proxy = this._proxy = create$1('div', 'leaflet-proxy leaflet-zoom-animated');
+  		this._panes.mapPane.appendChild(proxy);
+
+  		this.on('zoomanim', function (e) {
+  			var prop = TRANSFORM,
+  			    transform = this._proxy.style[prop];
+
+  			setTransform(this._proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1));
+
+  			// workaround for case when transform is the same and so transitionend event is not fired
+  			if (transform === this._proxy.style[prop] && this._animatingZoom) {
+  				this._onZoomTransitionEnd();
+  			}
+  		}, this);
+
+  		this.on('load moveend', this._animMoveEnd, this);
+
+  		this._on('unload', this._destroyAnimProxy, this);
+  	},
+
+  	_destroyAnimProxy: function () {
+  		remove(this._proxy);
+  		this.off('load moveend', this._animMoveEnd, this);
+  		delete this._proxy;
+  	},
+
+  	_animMoveEnd: function () {
+  		var c = this.getCenter(),
+  		    z = this.getZoom();
+  		setTransform(this._proxy, this.project(c, z), this.getZoomScale(z, 1));
+  	},
+
+  	_catchTransitionEnd: function (e) {
+  		if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) {
+  			this._onZoomTransitionEnd();
+  		}
+  	},
+
+  	_nothingToAnimate: function () {
+  		return !this._container.getElementsByClassName('leaflet-zoom-animated').length;
+  	},
+
+  	_tryAnimatedZoom: function (center, zoom, options) {
+
+  		if (this._animatingZoom) { return true; }
+
+  		options = options || {};
+
+  		// don't animate if disabled, not supported or zoom difference is too large
+  		if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||
+  		        Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }
+
+  		// offset is the pixel coords of the zoom origin relative to the current center
+  		var scale = this.getZoomScale(zoom),
+  		    offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale);
+
+  		// don't animate if the zoom origin isn't within one screen from the current center, unless forced
+  		if (options.animate !== true && !this.getSize().contains(offset)) { return false; }
+
+  		requestAnimFrame(function () {
+  			this
+  			    ._moveStart(true, false)
+  			    ._animateZoom(center, zoom, true);
+  		}, this);
+
+  		return true;
+  	},
+
+  	_animateZoom: function (center, zoom, startAnim, noUpdate) {
+  		if (!this._mapPane) { return; }
+
+  		if (startAnim) {
+  			this._animatingZoom = true;
+
+  			// remember what center/zoom to set after animation
+  			this._animateToCenter = center;
+  			this._animateToZoom = zoom;
+
+  			addClass(this._mapPane, 'leaflet-zoom-anim');
+  		}
+
+  		// @section Other Events
+  		// @event zoomanim: ZoomAnimEvent
+  		// Fired at least once per zoom animation. For continuous zoom, like pinch zooming, fired once per frame during zoom.
+  		this.fire('zoomanim', {
+  			center: center,
+  			zoom: zoom,
+  			noUpdate: noUpdate
+  		});
+
+  		// Work around webkit not firing 'transitionend', see https://github.com/Leaflet/Leaflet/issues/3689, 2693
+  		setTimeout(bind(this._onZoomTransitionEnd, this), 250);
+  	},
+
+  	_onZoomTransitionEnd: function () {
+  		if (!this._animatingZoom) { return; }
+
+  		if (this._mapPane) {
+  			removeClass(this._mapPane, 'leaflet-zoom-anim');
+  		}
+
+  		this._animatingZoom = false;
+
+  		this._move(this._animateToCenter, this._animateToZoom);
+
+  		// This anim frame should prevent an obscure iOS webkit tile loading race condition.
+  		requestAnimFrame(function () {
+  			this._moveEnd(true);
+  		}, this);
+  	}
+  });
+
+  // @section
+
+  // @factory L.map(id: String, options?: Map options)
+  // Instantiates a map object given the DOM ID of a `<div>` element
+  // and optionally an object literal with `Map options`.
+  //
+  // @alternative
+  // @factory L.map(el: HTMLElement, options?: Map options)
+  // Instantiates a map object given an instance of a `<div>` HTML element
+  // and optionally an object literal with `Map options`.
+  function createMap(id, options) {
+  	return new Map(id, options);
+  }
+
+  /*
+   * @class Control
+   * @aka L.Control
+   * @inherits Class
+   *
+   * L.Control is a base class for implementing map controls. Handles positioning.
+   * All other controls extend from this class.
+   */
+
+  var Control = Class.extend({
+  	// @section
+  	// @aka Control options
+  	options: {
+  		// @option position: String = 'topright'
+  		// The position of the control (one of the map corners). Possible values are `'topleft'`,
+  		// `'topright'`, `'bottomleft'` or `'bottomright'`
+  		position: 'topright'
+  	},
+
+  	initialize: function (options) {
+  		setOptions(this, options);
+  	},
+
+  	/* @section
+  	 * Classes extending L.Control will inherit the following methods:
+  	 *
+  	 * @method getPosition: string
+  	 * Returns the position of the control.
+  	 */
+  	getPosition: function () {
+  		return this.options.position;
+  	},
+
+  	// @method setPosition(position: string): this
+  	// Sets the position of the control.
+  	setPosition: function (position) {
+  		var map = this._map;
+
+  		if (map) {
+  			map.removeControl(this);
+  		}
+
+  		this.options.position = position;
+
+  		if (map) {
+  			map.addControl(this);
+  		}
+
+  		return this;
+  	},
+
+  	// @method getContainer: HTMLElement
+  	// Returns the HTMLElement that contains the control.
+  	getContainer: function () {
+  		return this._container;
+  	},
+
+  	// @method addTo(map: Map): this
+  	// Adds the control to the given map.
+  	addTo: function (map) {
+  		this.remove();
+  		this._map = map;
+
+  		var container = this._container = this.onAdd(map),
+  		    pos = this.getPosition(),
+  		    corner = map._controlCorners[pos];
+
+  		addClass(container, 'leaflet-control');
+
+  		if (pos.indexOf('bottom') !== -1) {
+  			corner.insertBefore(container, corner.firstChild);
+  		} else {
+  			corner.appendChild(container);
+  		}
+
+  		this._map.on('unload', this.remove, this);
+
+  		return this;
+  	},
+
+  	// @method remove: this
+  	// Removes the control from the map it is currently active on.
+  	remove: function () {
+  		if (!this._map) {
+  			return this;
+  		}
+
+  		remove(this._container);
+
+  		if (this.onRemove) {
+  			this.onRemove(this._map);
+  		}
+
+  		this._map.off('unload', this.remove, this);
+  		this._map = null;
+
+  		return this;
+  	},
+
+  	_refocusOnMap: function (e) {
+  		// if map exists and event is not a keyboard event
+  		if (this._map && e && e.screenX > 0 && e.screenY > 0) {
+  			this._map.getContainer().focus();
+  		}
+  	}
+  });
+
+  var control = function (options) {
+  	return new Control(options);
+  };
+
+  /* @section Extension methods
+   * @uninheritable
+   *
+   * Every control should extend from `L.Control` and (re-)implement the following methods.
+   *
+   * @method onAdd(map: Map): HTMLElement
+   * Should return the container DOM element for the control and add listeners on relevant map events. Called on [`control.addTo(map)`](#control-addTo).
+   *
+   * @method onRemove(map: Map)
+   * Optional method. Should contain all clean up code that removes the listeners previously added in [`onAdd`](#control-onadd). Called on [`control.remove()`](#control-remove).
+   */
+
+  /* @namespace Map
+   * @section Methods for Layers and Controls
+   */
+  Map.include({
+  	// @method addControl(control: Control): this
+  	// Adds the given control to the map
+  	addControl: function (control) {
+  		control.addTo(this);
+  		return this;
+  	},
+
+  	// @method removeControl(control: Control): this
+  	// Removes the given control from the map
+  	removeControl: function (control) {
+  		control.remove();
+  		return this;
+  	},
+
+  	_initControlPos: function () {
+  		var corners = this._controlCorners = {},
+  		    l = 'leaflet-',
+  		    container = this._controlContainer =
+  		            create$1('div', l + 'control-container', this._container);
+
+  		function createCorner(vSide, hSide) {
+  			var className = l + vSide + ' ' + l + hSide;
+
+  			corners[vSide + hSide] = create$1('div', className, container);
+  		}
+
+  		createCorner('top', 'left');
+  		createCorner('top', 'right');
+  		createCorner('bottom', 'left');
+  		createCorner('bottom', 'right');
+  	},
+
+  	_clearControlPos: function () {
+  		for (var i in this._controlCorners) {
+  			remove(this._controlCorners[i]);
+  		}
+  		remove(this._controlContainer);
+  		delete this._controlCorners;
+  		delete this._controlContainer;
+  	}
+  });
+
+  /*
+   * @class Control.Layers
+   * @aka L.Control.Layers
+   * @inherits Control
+   *
+   * The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the [detailed example](http://leafletjs.com/examples/layers-control/)). Extends `Control`.
+   *
+   * @example
+   *
+   * ```js
+   * var baseLayers = {
+   * 	"Mapbox": mapbox,
+   * 	"OpenStreetMap": osm
+   * };
+   *
+   * var overlays = {
+   * 	"Marker": marker,
+   * 	"Roads": roadsLayer
+   * };
+   *
+   * L.control.layers(baseLayers, overlays).addTo(map);
+   * ```
+   *
+   * The `baseLayers` and `overlays` parameters are object literals with layer names as keys and `Layer` objects as values:
+   *
+   * ```js
+   * {
+   *     "<someName1>": layer1,
+   *     "<someName2>": layer2
+   * }
+   * ```
+   *
+   * The layer names can contain HTML, which allows you to add additional styling to the items:
+   *
+   * ```js
+   * {"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>": myLayer}
+   * ```
+   */
+
+  var Layers = Control.extend({
+  	// @section
+  	// @aka Control.Layers options
+  	options: {
+  		// @option collapsed: Boolean = true
+  		// If `true`, the control will be collapsed into an icon and expanded on mouse hover or touch.
+  		collapsed: true,
+  		position: 'topright',
+
+  		// @option autoZIndex: Boolean = true
+  		// If `true`, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.
+  		autoZIndex: true,
+
+  		// @option hideSingleBase: Boolean = false
+  		// If `true`, the base layers in the control will be hidden when there is only one.
+  		hideSingleBase: false,
+
+  		// @option sortLayers: Boolean = false
+  		// Whether to sort the layers. When `false`, layers will keep the order
+  		// in which they were added to the control.
+  		sortLayers: false,
+
+  		// @option sortFunction: Function = *
+  		// A [compare function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)
+  		// that will be used for sorting the layers, when `sortLayers` is `true`.
+  		// The function receives both the `L.Layer` instances and their names, as in
+  		// `sortFunction(layerA, layerB, nameA, nameB)`.
+  		// By default, it sorts layers alphabetically by their name.
+  		sortFunction: function (layerA, layerB, nameA, nameB) {
+  			return nameA < nameB ? -1 : (nameB < nameA ? 1 : 0);
+  		}
+  	},
+
+  	initialize: function (baseLayers, overlays, options) {
+  		setOptions(this, options);
+
+  		this._layerControlInputs = [];
+  		this._layers = [];
+  		this._lastZIndex = 0;
+  		this._handlingClick = false;
+
+  		for (var i in baseLayers) {
+  			this._addLayer(baseLayers[i], i);
+  		}
+
+  		for (i in overlays) {
+  			this._addLayer(overlays[i], i, true);
+  		}
+  	},
+
+  	onAdd: function (map) {
+  		this._initLayout();
+  		this._update();
+
+  		this._map = map;
+  		map.on('zoomend', this._checkDisabledLayers, this);
+
+  		for (var i = 0; i < this._layers.length; i++) {
+  			this._layers[i].layer.on('add remove', this._onLayerChange, this);
+  		}
+
+  		return this._container;
+  	},
+
+  	addTo: function (map) {
+  		Control.prototype.addTo.call(this, map);
+  		// Trigger expand after Layers Control has been inserted into DOM so that is now has an actual height.
+  		return this._expandIfNotCollapsed();
+  	},
+
+  	onRemove: function () {
+  		this._map.off('zoomend', this._checkDisabledLayers, this);
+
+  		for (var i = 0; i < this._layers.length; i++) {
+  			this._layers[i].layer.off('add remove', this._onLayerChange, this);
+  		}
+  	},
+
+  	// @method addBaseLayer(layer: Layer, name: String): this
+  	// Adds a base layer (radio button entry) with the given name to the control.
+  	addBaseLayer: function (layer, name) {
+  		this._addLayer(layer, name);
+  		return (this._map) ? this._update() : this;
+  	},
+
+  	// @method addOverlay(layer: Layer, name: String): this
+  	// Adds an overlay (checkbox entry) with the given name to the control.
+  	addOverlay: function (layer, name) {
+  		this._addLayer(layer, name, true);
+  		return (this._map) ? this._update() : this;
+  	},
+
+  	// @method removeLayer(layer: Layer): this
+  	// Remove the given layer from the control.
+  	removeLayer: function (layer) {
+  		layer.off('add remove', this._onLayerChange, this);
+
+  		var obj = this._getLayer(stamp(layer));
+  		if (obj) {
+  			this._layers.splice(this._layers.indexOf(obj), 1);
+  		}
+  		return (this._map) ? this._update() : this;
+  	},
+
+  	// @method expand(): this
+  	// Expand the control container if collapsed.
+  	expand: function () {
+  		addClass(this._container, 'leaflet-control-layers-expanded');
+  		this._section.style.height = null;
+  		var acceptableHeight = this._map.getSize().y - (this._container.offsetTop + 50);
+  		if (acceptableHeight < this._section.clientHeight) {
+  			addClass(this._section, 'leaflet-control-layers-scrollbar');
+  			this._section.style.height = acceptableHeight + 'px';
+  		} else {
+  			removeClass(this._section, 'leaflet-control-layers-scrollbar');
+  		}
+  		this._checkDisabledLayers();
+  		return this;
+  	},
+
+  	// @method collapse(): this
+  	// Collapse the control container if expanded.
+  	collapse: function () {
+  		removeClass(this._container, 'leaflet-control-layers-expanded');
+  		return this;
+  	},
+
+  	_initLayout: function () {
+  		var className = 'leaflet-control-layers',
+  		    container = this._container = create$1('div', className),
+  		    collapsed = this.options.collapsed;
+
+  		// makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released
+  		container.setAttribute('aria-haspopup', true);
+
+  		disableClickPropagation(container);
+  		disableScrollPropagation(container);
+
+  		var section = this._section = create$1('section', className + '-list');
+
+  		if (collapsed) {
+  			this._map.on('click', this.collapse, this);
+
+  			if (!android) {
+  				on(container, {
+  					mouseenter: this.expand,
+  					mouseleave: this.collapse
+  				}, this);
+  			}
+  		}
+
+  		var link = this._layersLink = create$1('a', className + '-toggle', container);
+  		link.href = '#';
+  		link.title = 'Layers';
+
+  		if (touch) {
+  			on(link, 'click', stop);
+  			on(link, 'click', this.expand, this);
+  		} else {
+  			on(link, 'focus', this.expand, this);
+  		}
+
+  		if (!collapsed) {
+  			this.expand();
+  		}
+
+  		this._baseLayersList = create$1('div', className + '-base', section);
+  		this._separator = create$1('div', className + '-separator', section);
+  		this._overlaysList = create$1('div', className + '-overlays', section);
+
+  		container.appendChild(section);
+  	},
+
+  	_getLayer: function (id) {
+  		for (var i = 0; i < this._layers.length; i++) {
+
+  			if (this._layers[i] && stamp(this._layers[i].layer) === id) {
+  				return this._layers[i];
+  			}
+  		}
+  	},
+
+  	_addLayer: function (layer, name, overlay) {
+  		if (this._map) {
+  			layer.on('add remove', this._onLayerChange, this);
+  		}
+
+  		this._layers.push({
+  			layer: layer,
+  			name: name,
+  			overlay: overlay
+  		});
+
+  		if (this.options.sortLayers) {
+  			this._layers.sort(bind(function (a, b) {
+  				return this.options.sortFunction(a.layer, b.layer, a.name, b.name);
+  			}, this));
+  		}
+
+  		if (this.options.autoZIndex && layer.setZIndex) {
+  			this._lastZIndex++;
+  			layer.setZIndex(this._lastZIndex);
+  		}
+
+  		this._expandIfNotCollapsed();
+  	},
+
+  	_update: function () {
+  		if (!this._container) { return this; }
+
+  		empty(this._baseLayersList);
+  		empty(this._overlaysList);
+
+  		this._layerControlInputs = [];
+  		var baseLayersPresent, overlaysPresent, i, obj, baseLayersCount = 0;
+
+  		for (i = 0; i < this._layers.length; i++) {
+  			obj = this._layers[i];
+  			this._addItem(obj);
+  			overlaysPresent = overlaysPresent || obj.overlay;
+  			baseLayersPresent = baseLayersPresent || !obj.overlay;
+  			baseLayersCount += !obj.overlay ? 1 : 0;
+  		}
+
+  		// Hide base layers section if there's only one layer.
+  		if (this.options.hideSingleBase) {
+  			baseLayersPresent = baseLayersPresent && baseLayersCount > 1;
+  			this._baseLayersList.style.display = baseLayersPresent ? '' : 'none';
+  		}
+
+  		this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';
+
+  		return this;
+  	},
+
+  	_onLayerChange: function (e) {
+  		if (!this._handlingClick) {
+  			this._update();
+  		}
+
+  		var obj = this._getLayer(stamp(e.target));
+
+  		// @namespace Map
+  		// @section Layer events
+  		// @event baselayerchange: LayersControlEvent
+  		// Fired when the base layer is changed through the [layers control](#control-layers).
+  		// @event overlayadd: LayersControlEvent
+  		// Fired when an overlay is selected through the [layers control](#control-layers).
+  		// @event overlayremove: LayersControlEvent
+  		// Fired when an overlay is deselected through the [layers control](#control-layers).
+  		// @namespace Control.Layers
+  		var type = obj.overlay ?
+  			(e.type === 'add' ? 'overlayadd' : 'overlayremove') :
+  			(e.type === 'add' ? 'baselayerchange' : null);
+
+  		if (type) {
+  			this._map.fire(type, obj);
+  		}
+  	},
+
+  	// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)
+  	_createRadioElement: function (name, checked) {
+
+  		var radioHtml = '<input type="radio" class="leaflet-control-layers-selector" name="' +
+  				name + '"' + (checked ? ' checked="checked"' : '') + '/>';
+
+  		var radioFragment = document.createElement('div');
+  		radioFragment.innerHTML = radioHtml;
+
+  		return radioFragment.firstChild;
+  	},
+
+  	_addItem: function (obj) {
+  		var label = document.createElement('label'),
+  		    checked = this._map.hasLayer(obj.layer),
+  		    input;
+
+  		if (obj.overlay) {
+  			input = document.createElement('input');
+  			input.type = 'checkbox';
+  			input.className = 'leaflet-control-layers-selector';
+  			input.defaultChecked = checked;
+  		} else {
+  			input = this._createRadioElement('leaflet-base-layers_' + stamp(this), checked);
+  		}
+
+  		this._layerControlInputs.push(input);
+  		input.layerId = stamp(obj.layer);
+
+  		on(input, 'click', this._onInputClick, this);
+
+  		var name = document.createElement('span');
+  		name.innerHTML = ' ' + obj.name;
+
+  		// Helps from preventing layer control flicker when checkboxes are disabled
+  		// https://github.com/Leaflet/Leaflet/issues/2771
+  		var holder = document.createElement('div');
+
+  		label.appendChild(holder);
+  		holder.appendChild(input);
+  		holder.appendChild(name);
+
+  		var container = obj.overlay ? this._overlaysList : this._baseLayersList;
+  		container.appendChild(label);
+
+  		this._checkDisabledLayers();
+  		return label;
+  	},
+
+  	_onInputClick: function () {
+  		var inputs = this._layerControlInputs,
+  		    input, layer;
+  		var addedLayers = [],
+  		    removedLayers = [];
+
+  		this._handlingClick = true;
+
+  		for (var i = inputs.length - 1; i >= 0; i--) {
+  			input = inputs[i];
+  			layer = this._getLayer(input.layerId).layer;
+
+  			if (input.checked) {
+  				addedLayers.push(layer);
+  			} else if (!input.checked) {
+  				removedLayers.push(layer);
+  			}
+  		}
+
+  		// Bugfix issue 2318: Should remove all old layers before readding new ones
+  		for (i = 0; i < removedLayers.length; i++) {
+  			if (this._map.hasLayer(removedLayers[i])) {
+  				this._map.removeLayer(removedLayers[i]);
+  			}
+  		}
+  		for (i = 0; i < addedLayers.length; i++) {
+  			if (!this._map.hasLayer(addedLayers[i])) {
+  				this._map.addLayer(addedLayers[i]);
+  			}
+  		}
+
+  		this._handlingClick = false;
+
+  		this._refocusOnMap();
+  	},
+
+  	_checkDisabledLayers: function () {
+  		var inputs = this._layerControlInputs,
+  		    input,
+  		    layer,
+  		    zoom = this._map.getZoom();
+
+  		for (var i = inputs.length - 1; i >= 0; i--) {
+  			input = inputs[i];
+  			layer = this._getLayer(input.layerId).layer;
+  			input.disabled = (layer.options.minZoom !== undefined && zoom < layer.options.minZoom) ||
+  			                 (layer.options.maxZoom !== undefined && zoom > layer.options.maxZoom);
+
+  		}
+  	},
+
+  	_expandIfNotCollapsed: function () {
+  		if (this._map && !this.options.collapsed) {
+  			this.expand();
+  		}
+  		return this;
+  	},
+
+  	_expand: function () {
+  		// Backward compatibility, remove me in 1.1.
+  		return this.expand();
+  	},
+
+  	_collapse: function () {
+  		// Backward compatibility, remove me in 1.1.
+  		return this.collapse();
+  	}
+
+  });
+
+
+  // @factory L.control.layers(baselayers?: Object, overlays?: Object, options?: Control.Layers options)
+  // Creates a layers control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.
+  var layers = function (baseLayers, overlays, options) {
+  	return new Layers(baseLayers, overlays, options);
+  };
+
+  /*
+   * @class Control.Zoom
+   * @aka L.Control.Zoom
+   * @inherits Control
+   *
+   * A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its [`zoomControl` option](#map-zoomcontrol) to `false`. Extends `Control`.
+   */
+
+  var Zoom = Control.extend({
+  	// @section
+  	// @aka Control.Zoom options
+  	options: {
+  		position: 'topleft',
+
+  		// @option zoomInText: String = '+'
+  		// The text set on the 'zoom in' button.
+  		zoomInText: '+',
+
+  		// @option zoomInTitle: String = 'Zoom in'
+  		// The title set on the 'zoom in' button.
+  		zoomInTitle: 'Zoom in',
+
+  		// @option zoomOutText: String = '&#x2212;'
+  		// The text set on the 'zoom out' button.
+  		zoomOutText: '&#x2212;',
+
+  		// @option zoomOutTitle: String = 'Zoom out'
+  		// The title set on the 'zoom out' button.
+  		zoomOutTitle: 'Zoom out'
+  	},
+
+  	onAdd: function (map) {
+  		var zoomName = 'leaflet-control-zoom',
+  		    container = create$1('div', zoomName + ' leaflet-bar'),
+  		    options = this.options;
+
+  		this._zoomInButton  = this._createButton(options.zoomInText, options.zoomInTitle,
+  		        zoomName + '-in',  container, this._zoomIn);
+  		this._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle,
+  		        zoomName + '-out', container, this._zoomOut);
+
+  		this._updateDisabled();
+  		map.on('zoomend zoomlevelschange', this._updateDisabled, this);
+
+  		return container;
+  	},
+
+  	onRemove: function (map) {
+  		map.off('zoomend zoomlevelschange', this._updateDisabled, this);
+  	},
+
+  	disable: function () {
+  		this._disabled = true;
+  		this._updateDisabled();
+  		return this;
+  	},
+
+  	enable: function () {
+  		this._disabled = false;
+  		this._updateDisabled();
+  		return this;
+  	},
+
+  	_zoomIn: function (e) {
+  		if (!this._disabled && this._map._zoom < this._map.getMaxZoom()) {
+  			this._map.zoomIn(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));
+  		}
+  	},
+
+  	_zoomOut: function (e) {
+  		if (!this._disabled && this._map._zoom > this._map.getMinZoom()) {
+  			this._map.zoomOut(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));
+  		}
+  	},
+
+  	_createButton: function (html, title, className, container, fn) {
+  		var link = create$1('a', className, container);
+  		link.innerHTML = html;
+  		link.href = '#';
+  		link.title = title;
+
+  		/*
+  		 * Will force screen readers like VoiceOver to read this as "Zoom in - button"
+  		 */
+  		link.setAttribute('role', 'button');
+  		link.setAttribute('aria-label', title);
+
+  		disableClickPropagation(link);
+  		on(link, 'click', stop);
+  		on(link, 'click', fn, this);
+  		on(link, 'click', this._refocusOnMap, this);
+
+  		return link;
+  	},
+
+  	_updateDisabled: function () {
+  		var map = this._map,
+  		    className = 'leaflet-disabled';
+
+  		removeClass(this._zoomInButton, className);
+  		removeClass(this._zoomOutButton, className);
+
+  		if (this._disabled || map._zoom === map.getMinZoom()) {
+  			addClass(this._zoomOutButton, className);
+  		}
+  		if (this._disabled || map._zoom === map.getMaxZoom()) {
+  			addClass(this._zoomInButton, className);
+  		}
+  	}
+  });
+
+  // @namespace Map
+  // @section Control options
+  // @option zoomControl: Boolean = true
+  // Whether a [zoom control](#control-zoom) is added to the map by default.
+  Map.mergeOptions({
+  	zoomControl: true
+  });
+
+  Map.addInitHook(function () {
+  	if (this.options.zoomControl) {
+  		// @section Controls
+  		// @property zoomControl: Control.Zoom
+  		// The default zoom control (only available if the
+  		// [`zoomControl` option](#map-zoomcontrol) was `true` when creating the map).
+  		this.zoomControl = new Zoom();
+  		this.addControl(this.zoomControl);
+  	}
+  });
+
+  // @namespace Control.Zoom
+  // @factory L.control.zoom(options: Control.Zoom options)
+  // Creates a zoom control
+  var zoom = function (options) {
+  	return new Zoom(options);
+  };
+
+  /*
+   * @class Control.Scale
+   * @aka L.Control.Scale
+   * @inherits Control
+   *
+   * A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends `Control`.
+   *
+   * @example
+   *
+   * ```js
+   * L.control.scale().addTo(map);
+   * ```
+   */
+
+  var Scale = Control.extend({
+  	// @section
+  	// @aka Control.Scale options
+  	options: {
+  		position: 'bottomleft',
+
+  		// @option maxWidth: Number = 100
+  		// Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).
+  		maxWidth: 100,
+
+  		// @option metric: Boolean = True
+  		// Whether to show the metric scale line (m/km).
+  		metric: true,
+
+  		// @option imperial: Boolean = True
+  		// Whether to show the imperial scale line (mi/ft).
+  		imperial: true
+
+  		// @option updateWhenIdle: Boolean = false
+  		// If `true`, the control is updated on [`moveend`](#map-moveend), otherwise it's always up-to-date (updated on [`move`](#map-move)).
+  	},
+
+  	onAdd: function (map) {
+  		var className = 'leaflet-control-scale',
+  		    container = create$1('div', className),
+  		    options = this.options;
+
+  		this._addScales(options, className + '-line', container);
+
+  		map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);
+  		map.whenReady(this._update, this);
+
+  		return container;
+  	},
+
+  	onRemove: function (map) {
+  		map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);
+  	},
+
+  	_addScales: function (options, className, container) {
+  		if (options.metric) {
+  			this._mScale = create$1('div', className, container);
+  		}
+  		if (options.imperial) {
+  			this._iScale = create$1('div', className, container);
+  		}
+  	},
+
+  	_update: function () {
+  		var map = this._map,
+  		    y = map.getSize().y / 2;
+
+  		var maxMeters = map.distance(
+  			map.containerPointToLatLng([0, y]),
+  			map.containerPointToLatLng([this.options.maxWidth, y]));
+
+  		this._updateScales(maxMeters);
+  	},
+
+  	_updateScales: function (maxMeters) {
+  		if (this.options.metric && maxMeters) {
+  			this._updateMetric(maxMeters);
+  		}
+  		if (this.options.imperial && maxMeters) {
+  			this._updateImperial(maxMeters);
+  		}
+  	},
+
+  	_updateMetric: function (maxMeters) {
+  		var meters = this._getRoundNum(maxMeters),
+  		    label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';
+
+  		this._updateScale(this._mScale, label, meters / maxMeters);
+  	},
+
+  	_updateImperial: function (maxMeters) {
+  		var maxFeet = maxMeters * 3.2808399,
+  		    maxMiles, miles, feet;
+
+  		if (maxFeet > 5280) {
+  			maxMiles = maxFeet / 5280;
+  			miles = this._getRoundNum(maxMiles);
+  			this._updateScale(this._iScale, miles + ' mi', miles / maxMiles);
+
+  		} else {
+  			feet = this._getRoundNum(maxFeet);
+  			this._updateScale(this._iScale, feet + ' ft', feet / maxFeet);
+  		}
+  	},
+
+  	_updateScale: function (scale, text, ratio) {
+  		scale.style.width = Math.round(this.options.maxWidth * ratio) + 'px';
+  		scale.innerHTML = text;
+  	},
+
+  	_getRoundNum: function (num) {
+  		var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),
+  		    d = num / pow10;
+
+  		d = d >= 10 ? 10 :
+  		    d >= 5 ? 5 :
+  		    d >= 3 ? 3 :
+  		    d >= 2 ? 2 : 1;
+
+  		return pow10 * d;
+  	}
+  });
+
+
+  // @factory L.control.scale(options?: Control.Scale options)
+  // Creates an scale control with the given options.
+  var scale = function (options) {
+  	return new Scale(options);
+  };
+
+  /*
+   * @class Control.Attribution
+   * @aka L.Control.Attribution
+   * @inherits Control
+   *
+   * The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its [`attributionControl` option](#map-attributioncontrol) to `false`, and it fetches attribution texts from layers with the [`getAttribution` method](#layer-getattribution) automatically. Extends Control.
+   */
+
+  var Attribution = Control.extend({
+  	// @section
+  	// @aka Control.Attribution options
+  	options: {
+  		position: 'bottomright',
+
+  		// @option prefix: String = 'Leaflet'
+  		// The HTML text shown before the attributions. Pass `false` to disable.
+  		prefix: '<a href="https://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'
+  	},
+
+  	initialize: function (options) {
+  		setOptions(this, options);
+
+  		this._attributions = {};
+  	},
+
+  	onAdd: function (map) {
+  		map.attributionControl = this;
+  		this._container = create$1('div', 'leaflet-control-attribution');
+  		disableClickPropagation(this._container);
+
+  		// TODO ugly, refactor
+  		for (var i in map._layers) {
+  			if (map._layers[i].getAttribution) {
+  				this.addAttribution(map._layers[i].getAttribution());
+  			}
+  		}
+
+  		this._update();
+
+  		return this._container;
+  	},
+
+  	// @method setPrefix(prefix: String): this
+  	// Sets the text before the attributions.
+  	setPrefix: function (prefix) {
+  		this.options.prefix = prefix;
+  		this._update();
+  		return this;
+  	},
+
+  	// @method addAttribution(text: String): this
+  	// Adds an attribution text (e.g. `'Vector data &copy; Mapbox'`).
+  	addAttribution: function (text) {
+  		if (!text) { return this; }
+
+  		if (!this._attributions[text]) {
+  			this._attributions[text] = 0;
+  		}
+  		this._attributions[text]++;
+
+  		this._update();
+
+  		return this;
+  	},
+
+  	// @method removeAttribution(text: String): this
+  	// Removes an attribution text.
+  	removeAttribution: function (text) {
+  		if (!text) { return this; }
+
+  		if (this._attributions[text]) {
+  			this._attributions[text]--;
+  			this._update();
+  		}
+
+  		return this;
+  	},
+
+  	_update: function () {
+  		if (!this._map) { return; }
+
+  		var attribs = [];
+
+  		for (var i in this._attributions) {
+  			if (this._attributions[i]) {
+  				attribs.push(i);
+  			}
+  		}
+
+  		var prefixAndAttribs = [];
+
+  		if (this.options.prefix) {
+  			prefixAndAttribs.push(this.options.prefix);
+  		}
+  		if (attribs.length) {
+  			prefixAndAttribs.push(attribs.join(', '));
+  		}
+
+  		this._container.innerHTML = prefixAndAttribs.join(' | ');
+  	}
+  });
+
+  // @namespace Map
+  // @section Control options
+  // @option attributionControl: Boolean = true
+  // Whether a [attribution control](#control-attribution) is added to the map by default.
+  Map.mergeOptions({
+  	attributionControl: true
+  });
+
+  Map.addInitHook(function () {
+  	if (this.options.attributionControl) {
+  		new Attribution().addTo(this);
+  	}
+  });
+
+  // @namespace Control.Attribution
+  // @factory L.control.attribution(options: Control.Attribution options)
+  // Creates an attribution control.
+  var attribution = function (options) {
+  	return new Attribution(options);
+  };
+
+  Control.Layers = Layers;
+  Control.Zoom = Zoom;
+  Control.Scale = Scale;
+  Control.Attribution = Attribution;
+
+  control.layers = layers;
+  control.zoom = zoom;
+  control.scale = scale;
+  control.attribution = attribution;
+
+  /*
+  	L.Handler is a base class for handler classes that are used internally to inject
+  	interaction features like dragging to classes like Map and Marker.
+  */
+
+  // @class Handler
+  // @aka L.Handler
+  // Abstract class for map interaction handlers
+
+  var Handler = Class.extend({
+  	initialize: function (map) {
+  		this._map = map;
+  	},
+
+  	// @method enable(): this
+  	// Enables the handler
+  	enable: function () {
+  		if (this._enabled) { return this; }
+
+  		this._enabled = true;
+  		this.addHooks();
+  		return this;
+  	},
+
+  	// @method disable(): this
+  	// Disables the handler
+  	disable: function () {
+  		if (!this._enabled) { return this; }
+
+  		this._enabled = false;
+  		this.removeHooks();
+  		return this;
+  	},
+
+  	// @method enabled(): Boolean
+  	// Returns `true` if the handler is enabled
+  	enabled: function () {
+  		return !!this._enabled;
+  	}
+
+  	// @section Extension methods
+  	// Classes inheriting from `Handler` must implement the two following methods:
+  	// @method addHooks()
+  	// Called when the handler is enabled, should add event hooks.
+  	// @method removeHooks()
+  	// Called when the handler is disabled, should remove the event hooks added previously.
+  });
+
+  // @section There is static function which can be called without instantiating L.Handler:
+  // @function addTo(map: Map, name: String): this
+  // Adds a new Handler to the given map with the given name.
+  Handler.addTo = function (map, name) {
+  	map.addHandler(name, this);
+  	return this;
+  };
+
+  var Mixin = {Events: Events};
+
+  /*
+   * @class Draggable
+   * @aka L.Draggable
+   * @inherits Evented
+   *
+   * A class for making DOM elements draggable (including touch support).
+   * Used internally for map and marker dragging. Only works for elements
+   * that were positioned with [`L.DomUtil.setPosition`](#domutil-setposition).
+   *
+   * @example
+   * ```js
+   * var draggable = new L.Draggable(elementToDrag);
+   * draggable.enable();
+   * ```
+   */
+
+  var START = touch ? 'touchstart mousedown' : 'mousedown';
+  var END = {
+  	mousedown: 'mouseup',
+  	touchstart: 'touchend',
+  	pointerdown: 'touchend',
+  	MSPointerDown: 'touchend'
+  };
+  var MOVE = {
+  	mousedown: 'mousemove',
+  	touchstart: 'touchmove',
+  	pointerdown: 'touchmove',
+  	MSPointerDown: 'touchmove'
+  };
+
+
+  var Draggable = Evented.extend({
+
+  	options: {
+  		// @section
+  		// @aka Draggable options
+  		// @option clickTolerance: Number = 3
+  		// The max number of pixels a user can shift the mouse pointer during a click
+  		// for it to be considered a valid click (as opposed to a mouse drag).
+  		clickTolerance: 3
+  	},
+
+  	// @constructor L.Draggable(el: HTMLElement, dragHandle?: HTMLElement, preventOutline?: Boolean, options?: Draggable options)
+  	// Creates a `Draggable` object for moving `el` when you start dragging the `dragHandle` element (equals `el` itself by default).
+  	initialize: function (element, dragStartTarget, preventOutline$$1, options) {
+  		setOptions(this, options);
+
+  		this._element = element;
+  		this._dragStartTarget = dragStartTarget || element;
+  		this._preventOutline = preventOutline$$1;
+  	},
+
+  	// @method enable()
+  	// Enables the dragging ability
+  	enable: function () {
+  		if (this._enabled) { return; }
+
+  		on(this._dragStartTarget, START, this._onDown, this);
+
+  		this._enabled = true;
+  	},
+
+  	// @method disable()
+  	// Disables the dragging ability
+  	disable: function () {
+  		if (!this._enabled) { return; }
+
+  		// If we're currently dragging this draggable,
+  		// disabling it counts as first ending the drag.
+  		if (Draggable._dragging === this) {
+  			this.finishDrag();
+  		}
+
+  		off(this._dragStartTarget, START, this._onDown, this);
+
+  		this._enabled = false;
+  		this._moved = false;
+  	},
+
+  	_onDown: function (e) {
+  		// Ignore simulated events, since we handle both touch and
+  		// mouse explicitly; otherwise we risk getting duplicates of
+  		// touch events, see #4315.
+  		// Also ignore the event if disabled; this happens in IE11
+  		// under some circumstances, see #3666.
+  		if (e._simulated || !this._enabled) { return; }
+
+  		this._moved = false;
+
+  		if (hasClass(this._element, 'leaflet-zoom-anim')) { return; }
+
+  		if (Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }
+  		Draggable._dragging = this;  // Prevent dragging multiple objects at once.
+
+  		if (this._preventOutline) {
+  			preventOutline(this._element);
+  		}
+
+  		disableImageDrag();
+  		disableTextSelection();
+
+  		if (this._moving) { return; }
+
+  		// @event down: Event
+  		// Fired when a drag is about to start.
+  		this.fire('down');
+
+  		var first = e.touches ? e.touches[0] : e,
+  		    sizedParent = getSizedParentNode(this._element);
+
+  		this._startPoint = new Point(first.clientX, first.clientY);
+
+  		// Cache the scale, so that we can continuously compensate for it during drag (_onMove).
+  		this._parentScale = getScale(sizedParent);
+
+  		on(document, MOVE[e.type], this._onMove, this);
+  		on(document, END[e.type], this._onUp, this);
+  	},
+
+  	_onMove: function (e) {
+  		// Ignore simulated events, since we handle both touch and
+  		// mouse explicitly; otherwise we risk getting duplicates of
+  		// touch events, see #4315.
+  		// Also ignore the event if disabled; this happens in IE11
+  		// under some circumstances, see #3666.
+  		if (e._simulated || !this._enabled) { return; }
+
+  		if (e.touches && e.touches.length > 1) {
+  			this._moved = true;
+  			return;
+  		}
+
+  		var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),
+  		    offset = new Point(first.clientX, first.clientY)._subtract(this._startPoint);
+
+  		if (!offset.x && !offset.y) { return; }
+  		if (Math.abs(offset.x) + Math.abs(offset.y) < this.options.clickTolerance) { return; }
+
+  		// We assume that the parent container's position, border and scale do not change for the duration of the drag.
+  		// Therefore there is no need to account for the position and border (they are eliminated by the subtraction)
+  		// and we can use the cached value for the scale.
+  		offset.x /= this._parentScale.x;
+  		offset.y /= this._parentScale.y;
+
+  		preventDefault(e);
+
+  		if (!this._moved) {
+  			// @event dragstart: Event
+  			// Fired when a drag starts
+  			this.fire('dragstart');
+
+  			this._moved = true;
+  			this._startPos = getPosition(this._element).subtract(offset);
+
+  			addClass(document.body, 'leaflet-dragging');
+
+  			this._lastTarget = e.target || e.srcElement;
+  			// IE and Edge do not give the <use> element, so fetch it
+  			// if necessary
+  			if (window.SVGElementInstance && this._lastTarget instanceof window.SVGElementInstance) {
+  				this._lastTarget = this._lastTarget.correspondingUseElement;
+  			}
+  			addClass(this._lastTarget, 'leaflet-drag-target');
+  		}
+
+  		this._newPos = this._startPos.add(offset);
+  		this._moving = true;
+
+  		cancelAnimFrame(this._animRequest);
+  		this._lastEvent = e;
+  		this._animRequest = requestAnimFrame(this._updatePosition, this, true);
+  	},
+
+  	_updatePosition: function () {
+  		var e = {originalEvent: this._lastEvent};
+
+  		// @event predrag: Event
+  		// Fired continuously during dragging *before* each corresponding
+  		// update of the element's position.
+  		this.fire('predrag', e);
+  		setPosition(this._element, this._newPos);
+
+  		// @event drag: Event
+  		// Fired continuously during dragging.
+  		this.fire('drag', e);
+  	},
+
+  	_onUp: function (e) {
+  		// Ignore simulated events, since we handle both touch and
+  		// mouse explicitly; otherwise we risk getting duplicates of
+  		// touch events, see #4315.
+  		// Also ignore the event if disabled; this happens in IE11
+  		// under some circumstances, see #3666.
+  		if (e._simulated || !this._enabled) { return; }
+  		this.finishDrag();
+  	},
+
+  	finishDrag: function () {
+  		removeClass(document.body, 'leaflet-dragging');
+
+  		if (this._lastTarget) {
+  			removeClass(this._lastTarget, 'leaflet-drag-target');
+  			this._lastTarget = null;
+  		}
+
+  		for (var i in MOVE) {
+  			off(document, MOVE[i], this._onMove, this);
+  			off(document, END[i], this._onUp, this);
+  		}
+
+  		enableImageDrag();
+  		enableTextSelection();
+
+  		if (this._moved && this._moving) {
+  			// ensure drag is not fired after dragend
+  			cancelAnimFrame(this._animRequest);
+
+  			// @event dragend: DragEndEvent
+  			// Fired when the drag ends.
+  			this.fire('dragend', {
+  				distance: this._newPos.distanceTo(this._startPos)
+  			});
+  		}
+
+  		this._moving = false;
+  		Draggable._dragging = false;
+  	}
+
+  });
+
+  /*
+   * @namespace LineUtil
+   *
+   * Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.
+   */
+
+  // Simplify polyline with vertex reduction and Douglas-Peucker simplification.
+  // Improves rendering performance dramatically by lessening the number of points to draw.
+
+  // @function simplify(points: Point[], tolerance: Number): Point[]
+  // Dramatically reduces the number of points in a polyline while retaining
+  // its shape and returns a new array of simplified points, using the
+  // [Douglas-Peucker algorithm](http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm).
+  // Used for a huge performance boost when processing/displaying Leaflet polylines for
+  // each zoom level and also reducing visual noise. tolerance affects the amount of
+  // simplification (lesser value means higher quality but slower and with more points).
+  // Also released as a separated micro-library [Simplify.js](http://mourner.github.com/simplify-js/).
+  function simplify(points, tolerance) {
+  	if (!tolerance || !points.length) {
+  		return points.slice();
+  	}
+
+  	var sqTolerance = tolerance * tolerance;
+
+  	    // stage 1: vertex reduction
+  	    points = _reducePoints(points, sqTolerance);
+
+  	    // stage 2: Douglas-Peucker simplification
+  	    points = _simplifyDP(points, sqTolerance);
+
+  	return points;
+  }
+
+  // @function pointToSegmentDistance(p: Point, p1: Point, p2: Point): Number
+  // Returns the distance between point `p` and segment `p1` to `p2`.
+  function pointToSegmentDistance(p, p1, p2) {
+  	return Math.sqrt(_sqClosestPointOnSegment(p, p1, p2, true));
+  }
+
+  // @function closestPointOnSegment(p: Point, p1: Point, p2: Point): Number
+  // Returns the closest point from a point `p` on a segment `p1` to `p2`.
+  function closestPointOnSegment(p, p1, p2) {
+  	return _sqClosestPointOnSegment(p, p1, p2);
+  }
+
+  // Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm
+  function _simplifyDP(points, sqTolerance) {
+
+  	var len = points.length,
+  	    ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,
+  	    markers = new ArrayConstructor(len);
+
+  	    markers[0] = markers[len - 1] = 1;
+
+  	_simplifyDPStep(points, markers, sqTolerance, 0, len - 1);
+
+  	var i,
+  	    newPoints = [];
+
+  	for (i = 0; i < len; i++) {
+  		if (markers[i]) {
+  			newPoints.push(points[i]);
+  		}
+  	}
+
+  	return newPoints;
+  }
+
+  function _simplifyDPStep(points, markers, sqTolerance, first, last) {
+
+  	var maxSqDist = 0,
+  	index, i, sqDist;
+
+  	for (i = first + 1; i <= last - 1; i++) {
+  		sqDist = _sqClosestPointOnSegment(points[i], points[first], points[last], true);
+
+  		if (sqDist > maxSqDist) {
+  			index = i;
+  			maxSqDist = sqDist;
+  		}
+  	}
+
+  	if (maxSqDist > sqTolerance) {
+  		markers[index] = 1;
+
+  		_simplifyDPStep(points, markers, sqTolerance, first, index);
+  		_simplifyDPStep(points, markers, sqTolerance, index, last);
+  	}
+  }
+
+  // reduce points that are too close to each other to a single point
+  function _reducePoints(points, sqTolerance) {
+  	var reducedPoints = [points[0]];
+
+  	for (var i = 1, prev = 0, len = points.length; i < len; i++) {
+  		if (_sqDist(points[i], points[prev]) > sqTolerance) {
+  			reducedPoints.push(points[i]);
+  			prev = i;
+  		}
+  	}
+  	if (prev < len - 1) {
+  		reducedPoints.push(points[len - 1]);
+  	}
+  	return reducedPoints;
+  }
+
+  var _lastCode;
+
+  // @function clipSegment(a: Point, b: Point, bounds: Bounds, useLastCode?: Boolean, round?: Boolean): Point[]|Boolean
+  // Clips the segment a to b by rectangular bounds with the
+  // [Cohen-Sutherland algorithm](https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm)
+  // (modifying the segment points directly!). Used by Leaflet to only show polyline
+  // points that are on the screen or near, increasing performance.
+  function clipSegment(a, b, bounds, useLastCode, round) {
+  	var codeA = useLastCode ? _lastCode : _getBitCode(a, bounds),
+  	    codeB = _getBitCode(b, bounds),
+
+  	    codeOut, p, newCode;
+
+  	    // save 2nd code to avoid calculating it on the next segment
+  	    _lastCode = codeB;
+
+  	while (true) {
+  		// if a,b is inside the clip window (trivial accept)
+  		if (!(codeA | codeB)) {
+  			return [a, b];
+  		}
+
+  		// if a,b is outside the clip window (trivial reject)
+  		if (codeA & codeB) {
+  			return false;
+  		}
+
+  		// other cases
+  		codeOut = codeA || codeB;
+  		p = _getEdgeIntersection(a, b, codeOut, bounds, round);
+  		newCode = _getBitCode(p, bounds);
+
+  		if (codeOut === codeA) {
+  			a = p;
+  			codeA = newCode;
+  		} else {
+  			b = p;
+  			codeB = newCode;
+  		}
+  	}
+  }
+
+  function _getEdgeIntersection(a, b, code, bounds, round) {
+  	var dx = b.x - a.x,
+  	    dy = b.y - a.y,
+  	    min = bounds.min,
+  	    max = bounds.max,
+  	    x, y;
+
+  	if (code & 8) { // top
+  		x = a.x + dx * (max.y - a.y) / dy;
+  		y = max.y;
+
+  	} else if (code & 4) { // bottom
+  		x = a.x + dx * (min.y - a.y) / dy;
+  		y = min.y;
+
+  	} else if (code & 2) { // right
+  		x = max.x;
+  		y = a.y + dy * (max.x - a.x) / dx;
+
+  	} else if (code & 1) { // left
+  		x = min.x;
+  		y = a.y + dy * (min.x - a.x) / dx;
+  	}
+
+  	return new Point(x, y, round);
+  }
+
+  function _getBitCode(p, bounds) {
+  	var code = 0;
+
+  	if (p.x < bounds.min.x) { // left
+  		code |= 1;
+  	} else if (p.x > bounds.max.x) { // right
+  		code |= 2;
+  	}
+
+  	if (p.y < bounds.min.y) { // bottom
+  		code |= 4;
+  	} else if (p.y > bounds.max.y) { // top
+  		code |= 8;
+  	}
+
+  	return code;
+  }
+
+  // square distance (to avoid unnecessary Math.sqrt calls)
+  function _sqDist(p1, p2) {
+  	var dx = p2.x - p1.x,
+  	    dy = p2.y - p1.y;
+  	return dx * dx + dy * dy;
+  }
+
+  // return closest point on segment or distance to that point
+  function _sqClosestPointOnSegment(p, p1, p2, sqDist) {
+  	var x = p1.x,
+  	    y = p1.y,
+  	    dx = p2.x - x,
+  	    dy = p2.y - y,
+  	    dot = dx * dx + dy * dy,
+  	    t;
+
+  	if (dot > 0) {
+  		t = ((p.x - x) * dx + (p.y - y) * dy) / dot;
+
+  		if (t > 1) {
+  			x = p2.x;
+  			y = p2.y;
+  		} else if (t > 0) {
+  			x += dx * t;
+  			y += dy * t;
+  		}
+  	}
+
+  	dx = p.x - x;
+  	dy = p.y - y;
+
+  	return sqDist ? dx * dx + dy * dy : new Point(x, y);
+  }
+
+
+  // @function isFlat(latlngs: LatLng[]): Boolean
+  // Returns true if `latlngs` is a flat array, false is nested.
+  function isFlat(latlngs) {
+  	return !isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined');
+  }
+
+  function _flat(latlngs) {
+  	console.warn('Deprecated use of _flat, please use L.LineUtil.isFlat instead.');
+  	return isFlat(latlngs);
+  }
+
+  var LineUtil = ({
+    simplify: simplify,
+    pointToSegmentDistance: pointToSegmentDistance,
+    closestPointOnSegment: closestPointOnSegment,
+    clipSegment: clipSegment,
+    _getEdgeIntersection: _getEdgeIntersection,
+    _getBitCode: _getBitCode,
+    _sqClosestPointOnSegment: _sqClosestPointOnSegment,
+    isFlat: isFlat,
+    _flat: _flat
+  });
+
+  /*
+   * @namespace PolyUtil
+   * Various utility functions for polygon geometries.
+   */
+
+  /* @function clipPolygon(points: Point[], bounds: Bounds, round?: Boolean): Point[]
+   * Clips the polygon geometry defined by the given `points` by the given bounds (using the [Sutherland-Hodgman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm)).
+   * Used by Leaflet to only show polygon points that are on the screen or near, increasing
+   * performance. Note that polygon points needs different algorithm for clipping
+   * than polyline, so there's a separate method for it.
+   */
+  function clipPolygon(points, bounds, round) {
+  	var clippedPoints,
+  	    edges = [1, 4, 2, 8],
+  	    i, j, k,
+  	    a, b,
+  	    len, edge, p;
+
+  	for (i = 0, len = points.length; i < len; i++) {
+  		points[i]._code = _getBitCode(points[i], bounds);
+  	}
+
+  	// for each edge (left, bottom, right, top)
+  	for (k = 0; k < 4; k++) {
+  		edge = edges[k];
+  		clippedPoints = [];
+
+  		for (i = 0, len = points.length, j = len - 1; i < len; j = i++) {
+  			a = points[i];
+  			b = points[j];
+
+  			// if a is inside the clip window
+  			if (!(a._code & edge)) {
+  				// if b is outside the clip window (a->b goes out of screen)
+  				if (b._code & edge) {
+  					p = _getEdgeIntersection(b, a, edge, bounds, round);
+  					p._code = _getBitCode(p, bounds);
+  					clippedPoints.push(p);
+  				}
+  				clippedPoints.push(a);
+
+  			// else if b is inside the clip window (a->b enters the screen)
+  			} else if (!(b._code & edge)) {
+  				p = _getEdgeIntersection(b, a, edge, bounds, round);
+  				p._code = _getBitCode(p, bounds);
+  				clippedPoints.push(p);
+  			}
+  		}
+  		points = clippedPoints;
+  	}
+
+  	return points;
+  }
+
+  var PolyUtil = ({
+    clipPolygon: clipPolygon
+  });
+
+  /*
+   * @namespace Projection
+   * @section
+   * Leaflet comes with a set of already defined Projections out of the box:
+   *
+   * @projection L.Projection.LonLat
+   *
+   * Equirectangular, or Plate Carree projection — the most simple projection,
+   * mostly used by GIS enthusiasts. Directly maps `x` as longitude, and `y` as
+   * latitude. Also suitable for flat worlds, e.g. game maps. Used by the
+   * `EPSG:4326` and `Simple` CRS.
+   */
+
+  var LonLat = {
+  	project: function (latlng) {
+  		return new Point(latlng.lng, latlng.lat);
+  	},
+
+  	unproject: function (point) {
+  		return new LatLng(point.y, point.x);
+  	},
+
+  	bounds: new Bounds([-180, -90], [180, 90])
+  };
+
+  /*
+   * @namespace Projection
+   * @projection L.Projection.Mercator
+   *
+   * Elliptical Mercator projection — more complex than Spherical Mercator. Assumes that Earth is an ellipsoid. Used by the EPSG:3395 CRS.
+   */
+
+  var Mercator = {
+  	R: 6378137,
+  	R_MINOR: 6356752.314245179,
+
+  	bounds: new Bounds([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]),
+
+  	project: function (latlng) {
+  		var d = Math.PI / 180,
+  		    r = this.R,
+  		    y = latlng.lat * d,
+  		    tmp = this.R_MINOR / r,
+  		    e = Math.sqrt(1 - tmp * tmp),
+  		    con = e * Math.sin(y);
+
+  		var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);
+  		y = -r * Math.log(Math.max(ts, 1E-10));
+
+  		return new Point(latlng.lng * d * r, y);
+  	},
+
+  	unproject: function (point) {
+  		var d = 180 / Math.PI,
+  		    r = this.R,
+  		    tmp = this.R_MINOR / r,
+  		    e = Math.sqrt(1 - tmp * tmp),
+  		    ts = Math.exp(-point.y / r),
+  		    phi = Math.PI / 2 - 2 * Math.atan(ts);
+
+  		for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {
+  			con = e * Math.sin(phi);
+  			con = Math.pow((1 - con) / (1 + con), e / 2);
+  			dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;
+  			phi += dphi;
+  		}
+
+  		return new LatLng(phi * d, point.x * d / r);
+  	}
+  };
+
+  /*
+   * @class Projection
+
+   * An object with methods for projecting geographical coordinates of the world onto
+   * a flat surface (and back). See [Map projection](http://en.wikipedia.org/wiki/Map_projection).
+
+   * @property bounds: Bounds
+   * The bounds (specified in CRS units) where the projection is valid
+
+   * @method project(latlng: LatLng): Point
+   * Projects geographical coordinates into a 2D point.
+   * Only accepts actual `L.LatLng` instances, not arrays.
+
+   * @method unproject(point: Point): LatLng
+   * The inverse of `project`. Projects a 2D point into a geographical location.
+   * Only accepts actual `L.Point` instances, not arrays.
+
+   * Note that the projection instances do not inherit from Leaflet's `Class` object,
+   * and can't be instantiated. Also, new classes can't inherit from them,
+   * and methods can't be added to them with the `include` function.
+
+   */
+
+  var index = ({
+    LonLat: LonLat,
+    Mercator: Mercator,
+    SphericalMercator: SphericalMercator
+  });
+
+  /*
+   * @namespace CRS
+   * @crs L.CRS.EPSG3395
+   *
+   * Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
+   */
+  var EPSG3395 = extend({}, Earth, {
+  	code: 'EPSG:3395',
+  	projection: Mercator,
+
+  	transformation: (function () {
+  		var scale = 0.5 / (Math.PI * Mercator.R);
+  		return toTransformation(scale, 0.5, -scale, 0.5);
+  	}())
+  });
+
+  /*
+   * @namespace CRS
+   * @crs L.CRS.EPSG4326
+   *
+   * A common CRS among GIS enthusiasts. Uses simple Equirectangular projection.
+   *
+   * Leaflet 1.0.x complies with the [TMS coordinate scheme for EPSG:4326](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#global-geodetic),
+   * which is a breaking change from 0.7.x behaviour.  If you are using a `TileLayer`
+   * with this CRS, ensure that there are two 256x256 pixel tiles covering the
+   * whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90),
+   * or (-180,-90) for `TileLayer`s with [the `tms` option](#tilelayer-tms) set.
+   */
+
+  var EPSG4326 = extend({}, Earth, {
+  	code: 'EPSG:4326',
+  	projection: LonLat,
+  	transformation: toTransformation(1 / 180, 1, -1 / 180, 0.5)
+  });
+
+  /*
+   * @namespace CRS
+   * @crs L.CRS.Simple
+   *
+   * A simple CRS that maps longitude and latitude into `x` and `y` directly.
+   * May be used for maps of flat surfaces (e.g. game maps). Note that the `y`
+   * axis should still be inverted (going from bottom to top). `distance()` returns
+   * simple euclidean distance.
+   */
+
+  var Simple = extend({}, CRS, {
+  	projection: LonLat,
+  	transformation: toTransformation(1, 0, -1, 0),
+
+  	scale: function (zoom) {
+  		return Math.pow(2, zoom);
+  	},
+
+  	zoom: function (scale) {
+  		return Math.log(scale) / Math.LN2;
+  	},
+
+  	distance: function (latlng1, latlng2) {
+  		var dx = latlng2.lng - latlng1.lng,
+  		    dy = latlng2.lat - latlng1.lat;
+
+  		return Math.sqrt(dx * dx + dy * dy);
+  	},
+
+  	infinite: true
+  });
+
+  CRS.Earth = Earth;
+  CRS.EPSG3395 = EPSG3395;
+  CRS.EPSG3857 = EPSG3857;
+  CRS.EPSG900913 = EPSG900913;
+  CRS.EPSG4326 = EPSG4326;
+  CRS.Simple = Simple;
+
+  /*
+   * @class Layer
+   * @inherits Evented
+   * @aka L.Layer
+   * @aka ILayer
+   *
+   * A set of methods from the Layer base class that all Leaflet layers use.
+   * Inherits all methods, options and events from `L.Evented`.
+   *
+   * @example
+   *
+   * ```js
+   * var layer = L.marker(latlng).addTo(map);
+   * layer.addTo(map);
+   * layer.remove();
+   * ```
+   *
+   * @event add: Event
+   * Fired after the layer is added to a map
+   *
+   * @event remove: Event
+   * Fired after the layer is removed from a map
+   */
+
+
+  var Layer = Evented.extend({
+
+  	// Classes extending `L.Layer` will inherit the following options:
+  	options: {
+  		// @option pane: String = 'overlayPane'
+  		// By default the layer will be added to the map's [overlay pane](#map-overlaypane). Overriding this option will cause the layer to be placed on another pane by default.
+  		pane: 'overlayPane',
+
+  		// @option attribution: String = null
+  		// String to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+  		attribution: null,
+
+  		bubblingMouseEvents: true
+  	},
+
+  	/* @section
+  	 * Classes extending `L.Layer` will inherit the following methods:
+  	 *
+  	 * @method addTo(map: Map|LayerGroup): this
+  	 * Adds the layer to the given map or layer group.
+  	 */
+  	addTo: function (map) {
+  		map.addLayer(this);
+  		return this;
+  	},
+
+  	// @method remove: this
+  	// Removes the layer from the map it is currently active on.
+  	remove: function () {
+  		return this.removeFrom(this._map || this._mapToAdd);
+  	},
+
+  	// @method removeFrom(map: Map): this
+  	// Removes the layer from the given map
+  	//
+  	// @alternative
+  	// @method removeFrom(group: LayerGroup): this
+  	// Removes the layer from the given `LayerGroup`
+  	removeFrom: function (obj) {
+  		if (obj) {
+  			obj.removeLayer(this);
+  		}
+  		return this;
+  	},
+
+  	// @method getPane(name? : String): HTMLElement
+  	// Returns the `HTMLElement` representing the named pane on the map. If `name` is omitted, returns the pane for this layer.
+  	getPane: function (name) {
+  		return this._map.getPane(name ? (this.options[name] || name) : this.options.pane);
+  	},
+
+  	addInteractiveTarget: function (targetEl) {
+  		this._map._targets[stamp(targetEl)] = this;
+  		return this;
+  	},
+
+  	removeInteractiveTarget: function (targetEl) {
+  		delete this._map._targets[stamp(targetEl)];
+  		return this;
+  	},
+
+  	// @method getAttribution: String
+  	// Used by the `attribution control`, returns the [attribution option](#gridlayer-attribution).
+  	getAttribution: function () {
+  		return this.options.attribution;
+  	},
+
+  	_layerAdd: function (e) {
+  		var map = e.target;
+
+  		// check in case layer gets added and then removed before the map is ready
+  		if (!map.hasLayer(this)) { return; }
+
+  		this._map = map;
+  		this._zoomAnimated = map._zoomAnimated;
+
+  		if (this.getEvents) {
+  			var events = this.getEvents();
+  			map.on(events, this);
+  			this.once('remove', function () {
+  				map.off(events, this);
+  			}, this);
+  		}
+
+  		this.onAdd(map);
+
+  		if (this.getAttribution && map.attributionControl) {
+  			map.attributionControl.addAttribution(this.getAttribution());
+  		}
+
+  		this.fire('add');
+  		map.fire('layeradd', {layer: this});
+  	}
+  });
+
+  /* @section Extension methods
+   * @uninheritable
+   *
+   * Every layer should extend from `L.Layer` and (re-)implement the following methods.
+   *
+   * @method onAdd(map: Map): this
+   * Should contain code that creates DOM elements for the layer, adds them to `map panes` where they should belong and puts listeners on relevant map events. Called on [`map.addLayer(layer)`](#map-addlayer).
+   *
+   * @method onRemove(map: Map): this
+   * Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in [`onAdd`](#layer-onadd). Called on [`map.removeLayer(layer)`](#map-removelayer).
+   *
+   * @method getEvents(): Object
+   * This optional method should return an object like `{ viewreset: this._reset }` for [`addEventListener`](#evented-addeventlistener). The event handlers in this object will be automatically added and removed from the map with your layer.
+   *
+   * @method getAttribution(): String
+   * This optional method should return a string containing HTML to be shown on the `Attribution control` whenever the layer is visible.
+   *
+   * @method beforeAdd(map: Map): this
+   * Optional method. Called on [`map.addLayer(layer)`](#map-addlayer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.
+   */
+
+
+  /* @namespace Map
+   * @section Layer events
+   *
+   * @event layeradd: LayerEvent
+   * Fired when a new layer is added to the map.
+   *
+   * @event layerremove: LayerEvent
+   * Fired when some layer is removed from the map
+   *
+   * @section Methods for Layers and Controls
+   */
+  Map.include({
+  	// @method addLayer(layer: Layer): this
+  	// Adds the given layer to the map
+  	addLayer: function (layer) {
+  		if (!layer._layerAdd) {
+  			throw new Error('The provided object is not a Layer.');
+  		}
+
+  		var id = stamp(layer);
+  		if (this._layers[id]) { return this; }
+  		this._layers[id] = layer;
+
+  		layer._mapToAdd = this;
+
+  		if (layer.beforeAdd) {
+  			layer.beforeAdd(this);
+  		}
+
+  		this.whenReady(layer._layerAdd, layer);
+
+  		return this;
+  	},
+
+  	// @method removeLayer(layer: Layer): this
+  	// Removes the given layer from the map.
+  	removeLayer: function (layer) {
+  		var id = stamp(layer);
+
+  		if (!this._layers[id]) { return this; }
+
+  		if (this._loaded) {
+  			layer.onRemove(this);
+  		}
+
+  		if (layer.getAttribution && this.attributionControl) {
+  			this.attributionControl.removeAttribution(layer.getAttribution());
+  		}
+
+  		delete this._layers[id];
+
+  		if (this._loaded) {
+  			this.fire('layerremove', {layer: layer});
+  			layer.fire('remove');
+  		}
+
+  		layer._map = layer._mapToAdd = null;
+
+  		return this;
+  	},
+
+  	// @method hasLayer(layer: Layer): Boolean
+  	// Returns `true` if the given layer is currently added to the map
+  	hasLayer: function (layer) {
+  		return !!layer && (stamp(layer) in this._layers);
+  	},
+
+  	/* @method eachLayer(fn: Function, context?: Object): this
+  	 * Iterates over the layers of the map, optionally specifying context of the iterator function.
+  	 * ```
+  	 * map.eachLayer(function(layer){
+  	 *     layer.bindPopup('Hello');
+  	 * });
+  	 * ```
+  	 */
+  	eachLayer: function (method, context) {
+  		for (var i in this._layers) {
+  			method.call(context, this._layers[i]);
+  		}
+  		return this;
+  	},
+
+  	_addLayers: function (layers) {
+  		layers = layers ? (isArray(layers) ? layers : [layers]) : [];
+
+  		for (var i = 0, len = layers.length; i < len; i++) {
+  			this.addLayer(layers[i]);
+  		}
+  	},
+
+  	_addZoomLimit: function (layer) {
+  		if (isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) {
+  			this._zoomBoundLayers[stamp(layer)] = layer;
+  			this._updateZoomLevels();
+  		}
+  	},
+
+  	_removeZoomLimit: function (layer) {
+  		var id = stamp(layer);
+
+  		if (this._zoomBoundLayers[id]) {
+  			delete this._zoomBoundLayers[id];
+  			this._updateZoomLevels();
+  		}
+  	},
+
+  	_updateZoomLevels: function () {
+  		var minZoom = Infinity,
+  		    maxZoom = -Infinity,
+  		    oldZoomSpan = this._getZoomSpan();
+
+  		for (var i in this._zoomBoundLayers) {
+  			var options = this._zoomBoundLayers[i].options;
+
+  			minZoom = options.minZoom === undefined ? minZoom : Math.min(minZoom, options.minZoom);
+  			maxZoom = options.maxZoom === undefined ? maxZoom : Math.max(maxZoom, options.maxZoom);
+  		}
+
+  		this._layersMaxZoom = maxZoom === -Infinity ? undefined : maxZoom;
+  		this._layersMinZoom = minZoom === Infinity ? undefined : minZoom;
+
+  		// @section Map state change events
+  		// @event zoomlevelschange: Event
+  		// Fired when the number of zoomlevels on the map is changed due
+  		// to adding or removing a layer.
+  		if (oldZoomSpan !== this._getZoomSpan()) {
+  			this.fire('zoomlevelschange');
+  		}
+
+  		if (this.options.maxZoom === undefined && this._layersMaxZoom && this.getZoom() > this._layersMaxZoom) {
+  			this.setZoom(this._layersMaxZoom);
+  		}
+  		if (this.options.minZoom === undefined && this._layersMinZoom && this.getZoom() < this._layersMinZoom) {
+  			this.setZoom(this._layersMinZoom);
+  		}
+  	}
+  });
+
+  /*
+   * @class LayerGroup
+   * @aka L.LayerGroup
+   * @inherits Layer
+   *
+   * Used to group several layers and handle them as one. If you add it to the map,
+   * any layers added or removed from the group will be added/removed on the map as
+   * well. Extends `Layer`.
+   *
+   * @example
+   *
+   * ```js
+   * L.layerGroup([marker1, marker2])
+   * 	.addLayer(polyline)
+   * 	.addTo(map);
+   * ```
+   */
+
+  var LayerGroup = Layer.extend({
+
+  	initialize: function (layers, options) {
+  		setOptions(this, options);
+
+  		this._layers = {};
+
+  		var i, len;
+
+  		if (layers) {
+  			for (i = 0, len = layers.length; i < len; i++) {
+  				this.addLayer(layers[i]);
+  			}
+  		}
+  	},
+
+  	// @method addLayer(layer: Layer): this
+  	// Adds the given layer to the group.
+  	addLayer: function (layer) {
+  		var id = this.getLayerId(layer);
+
+  		this._layers[id] = layer;
+
+  		if (this._map) {
+  			this._map.addLayer(layer);
+  		}
+
+  		return this;
+  	},
+
+  	// @method removeLayer(layer: Layer): this
+  	// Removes the given layer from the group.
+  	// @alternative
+  	// @method removeLayer(id: Number): this
+  	// Removes the layer with the given internal ID from the group.
+  	removeLayer: function (layer) {
+  		var id = layer in this._layers ? layer : this.getLayerId(layer);
+
+  		if (this._map && this._layers[id]) {
+  			this._map.removeLayer(this._layers[id]);
+  		}
+
+  		delete this._layers[id];
+
+  		return this;
+  	},
+
+  	// @method hasLayer(layer: Layer): Boolean
+  	// Returns `true` if the given layer is currently added to the group.
+  	// @alternative
+  	// @method hasLayer(id: Number): Boolean
+  	// Returns `true` if the given internal ID is currently added to the group.
+  	hasLayer: function (layer) {
+  		if (!layer) { return false; }
+  		var layerId = typeof layer === 'number' ? layer : this.getLayerId(layer);
+  		return layerId in this._layers;
+  	},
+
+  	// @method clearLayers(): this
+  	// Removes all the layers from the group.
+  	clearLayers: function () {
+  		return this.eachLayer(this.removeLayer, this);
+  	},
+
+  	// @method invoke(methodName: String, …): this
+  	// Calls `methodName` on every layer contained in this group, passing any
+  	// additional parameters. Has no effect if the layers contained do not
+  	// implement `methodName`.
+  	invoke: function (methodName) {
+  		var args = Array.prototype.slice.call(arguments, 1),
+  		    i, layer;
+
+  		for (i in this._layers) {
+  			layer = this._layers[i];
+
+  			if (layer[methodName]) {
+  				layer[methodName].apply(layer, args);
+  			}
+  		}
+
+  		return this;
+  	},
+
+  	onAdd: function (map) {
+  		this.eachLayer(map.addLayer, map);
+  	},
+
+  	onRemove: function (map) {
+  		this.eachLayer(map.removeLayer, map);
+  	},
+
+  	// @method eachLayer(fn: Function, context?: Object): this
+  	// Iterates over the layers of the group, optionally specifying context of the iterator function.
+  	// ```js
+  	// group.eachLayer(function (layer) {
+  	// 	layer.bindPopup('Hello');
+  	// });
+  	// ```
+  	eachLayer: function (method, context) {
+  		for (var i in this._layers) {
+  			method.call(context, this._layers[i]);
+  		}
+  		return this;
+  	},
+
+  	// @method getLayer(id: Number): Layer
+  	// Returns the layer with the given internal ID.
+  	getLayer: function (id) {
+  		return this._layers[id];
+  	},
+
+  	// @method getLayers(): Layer[]
+  	// Returns an array of all the layers added to the group.
+  	getLayers: function () {
+  		var layers = [];
+  		this.eachLayer(layers.push, layers);
+  		return layers;
+  	},
+
+  	// @method setZIndex(zIndex: Number): this
+  	// Calls `setZIndex` on every layer contained in this group, passing the z-index.
+  	setZIndex: function (zIndex) {
+  		return this.invoke('setZIndex', zIndex);
+  	},
+
+  	// @method getLayerId(layer: Layer): Number
+  	// Returns the internal ID for a layer
+  	getLayerId: function (layer) {
+  		return stamp(layer);
+  	}
+  });
+
+
+  // @factory L.layerGroup(layers?: Layer[], options?: Object)
+  // Create a layer group, optionally given an initial set of layers and an `options` object.
+  var layerGroup = function (layers, options) {
+  	return new LayerGroup(layers, options);
+  };
+
+  /*
+   * @class FeatureGroup
+   * @aka L.FeatureGroup
+   * @inherits LayerGroup
+   *
+   * Extended `LayerGroup` that makes it easier to do the same thing to all its member layers:
+   *  * [`bindPopup`](#layer-bindpopup) binds a popup to all of the layers at once (likewise with [`bindTooltip`](#layer-bindtooltip))
+   *  * Events are propagated to the `FeatureGroup`, so if the group has an event
+   * handler, it will handle events from any of the layers. This includes mouse events
+   * and custom events.
+   *  * Has `layeradd` and `layerremove` events
+   *
+   * @example
+   *
+   * ```js
+   * L.featureGroup([marker1, marker2, polyline])
+   * 	.bindPopup('Hello world!')
+   * 	.on('click', function() { alert('Clicked on a member of the group!'); })
+   * 	.addTo(map);
+   * ```
+   */
+
+  var FeatureGroup = LayerGroup.extend({
+
+  	addLayer: function (layer) {
+  		if (this.hasLayer(layer)) {
+  			return this;
+  		}
+
+  		layer.addEventParent(this);
+
+  		LayerGroup.prototype.addLayer.call(this, layer);
+
+  		// @event layeradd: LayerEvent
+  		// Fired when a layer is added to this `FeatureGroup`
+  		return this.fire('layeradd', {layer: layer});
+  	},
+
+  	removeLayer: function (layer) {
+  		if (!this.hasLayer(layer)) {
+  			return this;
+  		}
+  		if (layer in this._layers) {
+  			layer = this._layers[layer];
+  		}
+
+  		layer.removeEventParent(this);
+
+  		LayerGroup.prototype.removeLayer.call(this, layer);
+
+  		// @event layerremove: LayerEvent
+  		// Fired when a layer is removed from this `FeatureGroup`
+  		return this.fire('layerremove', {layer: layer});
+  	},
+
+  	// @method setStyle(style: Path options): this
+  	// Sets the given path options to each layer of the group that has a `setStyle` method.
+  	setStyle: function (style) {
+  		return this.invoke('setStyle', style);
+  	},
+
+  	// @method bringToFront(): this
+  	// Brings the layer group to the top of all other layers
+  	bringToFront: function () {
+  		return this.invoke('bringToFront');
+  	},
+
+  	// @method bringToBack(): this
+  	// Brings the layer group to the back of all other layers
+  	bringToBack: function () {
+  		return this.invoke('bringToBack');
+  	},
+
+  	// @method getBounds(): LatLngBounds
+  	// Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).
+  	getBounds: function () {
+  		var bounds = new LatLngBounds();
+
+  		for (var id in this._layers) {
+  			var layer = this._layers[id];
+  			bounds.extend(layer.getBounds ? layer.getBounds() : layer.getLatLng());
+  		}
+  		return bounds;
+  	}
+  });
+
+  // @factory L.featureGroup(layers?: Layer[], options?: Object)
+  // Create a feature group, optionally given an initial set of layers and an `options` object.
+  var featureGroup = function (layers, options) {
+  	return new FeatureGroup(layers, options);
+  };
+
+  /*
+   * @class Icon
+   * @aka L.Icon
+   *
+   * Represents an icon to provide when creating a marker.
+   *
+   * @example
+   *
+   * ```js
+   * var myIcon = L.icon({
+   *     iconUrl: 'my-icon.png',
+   *     iconRetinaUrl: 'my-icon@2x.png',
+   *     iconSize: [38, 95],
+   *     iconAnchor: [22, 94],
+   *     popupAnchor: [-3, -76],
+   *     shadowUrl: 'my-icon-shadow.png',
+   *     shadowRetinaUrl: 'my-icon-shadow@2x.png',
+   *     shadowSize: [68, 95],
+   *     shadowAnchor: [22, 94]
+   * });
+   *
+   * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
+   * ```
+   *
+   * `L.Icon.Default` extends `L.Icon` and is the blue icon Leaflet uses for markers by default.
+   *
+   */
+
+  var Icon = Class.extend({
+
+  	/* @section
+  	 * @aka Icon options
+  	 *
+  	 * @option iconUrl: String = null
+  	 * **(required)** The URL to the icon image (absolute or relative to your script path).
+  	 *
+  	 * @option iconRetinaUrl: String = null
+  	 * The URL to a retina sized version of the icon image (absolute or relative to your
+  	 * script path). Used for Retina screen devices.
+  	 *
+  	 * @option iconSize: Point = null
+  	 * Size of the icon image in pixels.
+  	 *
+  	 * @option iconAnchor: Point = null
+  	 * The coordinates of the "tip" of the icon (relative to its top left corner). The icon
+  	 * will be aligned so that this point is at the marker's geographical location. Centered
+  	 * by default if size is specified, also can be set in CSS with negative margins.
+  	 *
+  	 * @option popupAnchor: Point = [0, 0]
+  	 * The coordinates of the point from which popups will "open", relative to the icon anchor.
+  	 *
+  	 * @option tooltipAnchor: Point = [0, 0]
+  	 * The coordinates of the point from which tooltips will "open", relative to the icon anchor.
+  	 *
+  	 * @option shadowUrl: String = null
+  	 * The URL to the icon shadow image. If not specified, no shadow image will be created.
+  	 *
+  	 * @option shadowRetinaUrl: String = null
+  	 *
+  	 * @option shadowSize: Point = null
+  	 * Size of the shadow image in pixels.
+  	 *
+  	 * @option shadowAnchor: Point = null
+  	 * The coordinates of the "tip" of the shadow (relative to its top left corner) (the same
+  	 * as iconAnchor if not specified).
+  	 *
+  	 * @option className: String = ''
+  	 * A custom class name to assign to both icon and shadow images. Empty by default.
+  	 */
+
+  	options: {
+  		popupAnchor: [0, 0],
+  		tooltipAnchor: [0, 0]
+  	},
+
+  	initialize: function (options) {
+  		setOptions(this, options);
+  	},
+
+  	// @method createIcon(oldIcon?: HTMLElement): HTMLElement
+  	// Called internally when the icon has to be shown, returns a `<img>` HTML element
+  	// styled according to the options.
+  	createIcon: function (oldIcon) {
+  		return this._createIcon('icon', oldIcon);
+  	},
+
+  	// @method createShadow(oldIcon?: HTMLElement): HTMLElement
+  	// As `createIcon`, but for the shadow beneath it.
+  	createShadow: function (oldIcon) {
+  		return this._createIcon('shadow', oldIcon);
+  	},
+
+  	_createIcon: function (name, oldIcon) {
+  		var src = this._getIconUrl(name);
+
+  		if (!src) {
+  			if (name === 'icon') {
+  				throw new Error('iconUrl not set in Icon options (see the docs).');
+  			}
+  			return null;
+  		}
+
+  		var img = this._createImg(src, oldIcon && oldIcon.tagName === 'IMG' ? oldIcon : null);
+  		this._setIconStyles(img, name);
+
+  		return img;
+  	},
+
+  	_setIconStyles: function (img, name) {
+  		var options = this.options;
+  		var sizeOption = options[name + 'Size'];
+
+  		if (typeof sizeOption === 'number') {
+  			sizeOption = [sizeOption, sizeOption];
+  		}
+
+  		var size = toPoint(sizeOption),
+  		    anchor = toPoint(name === 'shadow' && options.shadowAnchor || options.iconAnchor ||
+  		            size && size.divideBy(2, true));
+
+  		img.className = 'leaflet-marker-' + name + ' ' + (options.className || '');
+
+  		if (anchor) {
+  			img.style.marginLeft = (-anchor.x) + 'px';
+  			img.style.marginTop  = (-anchor.y) + 'px';
+  		}
+
+  		if (size) {
+  			img.style.width  = size.x + 'px';
+  			img.style.height = size.y + 'px';
+  		}
+  	},
+
+  	_createImg: function (src, el) {
+  		el = el || document.createElement('img');
+  		el.src = src;
+  		return el;
+  	},
+
+  	_getIconUrl: function (name) {
+  		return retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url'];
+  	}
+  });
+
+
+  // @factory L.icon(options: Icon options)
+  // Creates an icon instance with the given options.
+  function icon(options) {
+  	return new Icon(options);
+  }
+
+  /*
+   * @miniclass Icon.Default (Icon)
+   * @aka L.Icon.Default
+   * @section
+   *
+   * A trivial subclass of `Icon`, represents the icon to use in `Marker`s when
+   * no icon is specified. Points to the blue marker image distributed with Leaflet
+   * releases.
+   *
+   * In order to customize the default icon, just change the properties of `L.Icon.Default.prototype.options`
+   * (which is a set of `Icon options`).
+   *
+   * If you want to _completely_ replace the default icon, override the
+   * `L.Marker.prototype.options.icon` with your own icon instead.
+   */
+
+  var IconDefault = Icon.extend({
+
+  	options: {
+  		iconUrl:       'marker-icon.png',
+  		iconRetinaUrl: 'marker-icon-2x.png',
+  		shadowUrl:     'marker-shadow.png',
+  		iconSize:    [25, 41],
+  		iconAnchor:  [12, 41],
+  		popupAnchor: [1, -34],
+  		tooltipAnchor: [16, -28],
+  		shadowSize:  [41, 41]
+  	},
+
+  	_getIconUrl: function (name) {
+  		if (!IconDefault.imagePath) {	// Deprecated, backwards-compatibility only
+  			IconDefault.imagePath = this._detectIconPath();
+  		}
+
+  		// @option imagePath: String
+  		// `Icon.Default` will try to auto-detect the location of the
+  		// blue icon images. If you are placing these images in a non-standard
+  		// way, set this option to point to the right path.
+  		return (this.options.imagePath || IconDefault.imagePath) + Icon.prototype._getIconUrl.call(this, name);
+  	},
+
+  	_detectIconPath: function () {
+  		var el = create$1('div',  'leaflet-default-icon-path', document.body);
+  		var path = getStyle(el, 'background-image') ||
+  		           getStyle(el, 'backgroundImage');	// IE8
+
+  		document.body.removeChild(el);
+
+  		if (path === null || path.indexOf('url') !== 0) {
+  			path = '';
+  		} else {
+  			path = path.replace(/^url\(["']?/, '').replace(/marker-icon\.png["']?\)$/, '');
+  		}
+
+  		return path;
+  	}
+  });
+
+  /*
+   * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.
+   */
+
+
+  /* @namespace Marker
+   * @section Interaction handlers
+   *
+   * Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see `Handler` methods). Example:
+   *
+   * ```js
+   * marker.dragging.disable();
+   * ```
+   *
+   * @property dragging: Handler
+   * Marker dragging handler (by both mouse and touch). Only valid when the marker is on the map (Otherwise set [`marker.options.draggable`](#marker-draggable)).
+   */
+
+  var MarkerDrag = Handler.extend({
+  	initialize: function (marker) {
+  		this._marker = marker;
+  	},
+
+  	addHooks: function () {
+  		var icon = this._marker._icon;
+
+  		if (!this._draggable) {
+  			this._draggable = new Draggable(icon, icon, true);
+  		}
+
+  		this._draggable.on({
+  			dragstart: this._onDragStart,
+  			predrag: this._onPreDrag,
+  			drag: this._onDrag,
+  			dragend: this._onDragEnd
+  		}, this).enable();
+
+  		addClass(icon, 'leaflet-marker-draggable');
+  	},
+
+  	removeHooks: function () {
+  		this._draggable.off({
+  			dragstart: this._onDragStart,
+  			predrag: this._onPreDrag,
+  			drag: this._onDrag,
+  			dragend: this._onDragEnd
+  		}, this).disable();
+
+  		if (this._marker._icon) {
+  			removeClass(this._marker._icon, 'leaflet-marker-draggable');
+  		}
+  	},
+
+  	moved: function () {
+  		return this._draggable && this._draggable._moved;
+  	},
+
+  	_adjustPan: function (e) {
+  		var marker = this._marker,
+  		    map = marker._map,
+  		    speed = this._marker.options.autoPanSpeed,
+  		    padding = this._marker.options.autoPanPadding,
+  		    iconPos = getPosition(marker._icon),
+  		    bounds = map.getPixelBounds(),
+  		    origin = map.getPixelOrigin();
+
+  		var panBounds = toBounds(
+  			bounds.min._subtract(origin).add(padding),
+  			bounds.max._subtract(origin).subtract(padding)
+  		);
+
+  		if (!panBounds.contains(iconPos)) {
+  			// Compute incremental movement
+  			var movement = toPoint(
+  				(Math.max(panBounds.max.x, iconPos.x) - panBounds.max.x) / (bounds.max.x - panBounds.max.x) -
+  				(Math.min(panBounds.min.x, iconPos.x) - panBounds.min.x) / (bounds.min.x - panBounds.min.x),
+
+  				(Math.max(panBounds.max.y, iconPos.y) - panBounds.max.y) / (bounds.max.y - panBounds.max.y) -
+  				(Math.min(panBounds.min.y, iconPos.y) - panBounds.min.y) / (bounds.min.y - panBounds.min.y)
+  			).multiplyBy(speed);
+
+  			map.panBy(movement, {animate: false});
+
+  			this._draggable._newPos._add(movement);
+  			this._draggable._startPos._add(movement);
+
+  			setPosition(marker._icon, this._draggable._newPos);
+  			this._onDrag(e);
+
+  			this._panRequest = requestAnimFrame(this._adjustPan.bind(this, e));
+  		}
+  	},
+
+  	_onDragStart: function () {
+  		// @section Dragging events
+  		// @event dragstart: Event
+  		// Fired when the user starts dragging the marker.
+
+  		// @event movestart: Event
+  		// Fired when the marker starts moving (because of dragging).
+
+  		this._oldLatLng = this._marker.getLatLng();
+
+  		// When using ES6 imports it could not be set when `Popup` was not imported as well
+  		this._marker.closePopup && this._marker.closePopup();
+
+  		this._marker
+  			.fire('movestart')
+  			.fire('dragstart');
+  	},
+
+  	_onPreDrag: function (e) {
+  		if (this._marker.options.autoPan) {
+  			cancelAnimFrame(this._panRequest);
+  			this._panRequest = requestAnimFrame(this._adjustPan.bind(this, e));
+  		}
+  	},
+
+  	_onDrag: function (e) {
+  		var marker = this._marker,
+  		    shadow = marker._shadow,
+  		    iconPos = getPosition(marker._icon),
+  		    latlng = marker._map.layerPointToLatLng(iconPos);
+
+  		// update shadow position
+  		if (shadow) {
+  			setPosition(shadow, iconPos);
+  		}
+
+  		marker._latlng = latlng;
+  		e.latlng = latlng;
+  		e.oldLatLng = this._oldLatLng;
+
+  		// @event drag: Event
+  		// Fired repeatedly while the user drags the marker.
+  		marker
+  		    .fire('move', e)
+  		    .fire('drag', e);
+  	},
+
+  	_onDragEnd: function (e) {
+  		// @event dragend: DragEndEvent
+  		// Fired when the user stops dragging the marker.
+
+  		 cancelAnimFrame(this._panRequest);
+
+  		// @event moveend: Event
+  		// Fired when the marker stops moving (because of dragging).
+  		delete this._oldLatLng;
+  		this._marker
+  		    .fire('moveend')
+  		    .fire('dragend', e);
+  	}
+  });
+
+  /*
+   * @class Marker
+   * @inherits Interactive layer
+   * @aka L.Marker
+   * L.Marker is used to display clickable/draggable icons on the map. Extends `Layer`.
+   *
+   * @example
+   *
+   * ```js
+   * L.marker([50.5, 30.5]).addTo(map);
+   * ```
+   */
+
+  var Marker = Layer.extend({
+
+  	// @section
+  	// @aka Marker options
+  	options: {
+  		// @option icon: Icon = *
+  		// Icon instance to use for rendering the marker.
+  		// See [Icon documentation](#L.Icon) for details on how to customize the marker icon.
+  		// If not specified, a common instance of `L.Icon.Default` is used.
+  		icon: new IconDefault(),
+
+  		// Option inherited from "Interactive layer" abstract class
+  		interactive: true,
+
+  		// @option keyboard: Boolean = true
+  		// Whether the marker can be tabbed to with a keyboard and clicked by pressing enter.
+  		keyboard: true,
+
+  		// @option title: String = ''
+  		// Text for the browser tooltip that appear on marker hover (no tooltip by default).
+  		title: '',
+
+  		// @option alt: String = ''
+  		// Text for the `alt` attribute of the icon image (useful for accessibility).
+  		alt: '',
+
+  		// @option zIndexOffset: Number = 0
+  		// By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like `1000` (or high negative value, respectively).
+  		zIndexOffset: 0,
+
+  		// @option opacity: Number = 1.0
+  		// The opacity of the marker.
+  		opacity: 1,
+
+  		// @option riseOnHover: Boolean = false
+  		// If `true`, the marker will get on top of others when you hover the mouse over it.
+  		riseOnHover: false,
+
+  		// @option riseOffset: Number = 250
+  		// The z-index offset used for the `riseOnHover` feature.
+  		riseOffset: 250,
+
+  		// @option pane: String = 'markerPane'
+  		// `Map pane` where the markers icon will be added.
+  		pane: 'markerPane',
+
+  		// @option shadowPane: String = 'shadowPane'
+  		// `Map pane` where the markers shadow will be added.
+  		shadowPane: 'shadowPane',
+
+  		// @option bubblingMouseEvents: Boolean = false
+  		// When `true`, a mouse event on this marker will trigger the same event on the map
+  		// (unless [`L.DomEvent.stopPropagation`](#domevent-stoppropagation) is used).
+  		bubblingMouseEvents: false,
+
+  		// @section Draggable marker options
+  		// @option draggable: Boolean = false
+  		// Whether the marker is draggable with mouse/touch or not.
+  		draggable: false,
+
+  		// @option autoPan: Boolean = false
+  		// Whether to pan the map when dragging this marker near its edge or not.
+  		autoPan: false,
+
+  		// @option autoPanPadding: Point = Point(50, 50)
+  		// Distance (in pixels to the left/right and to the top/bottom) of the
+  		// map edge to start panning the map.
+  		autoPanPadding: [50, 50],
+
+  		// @option autoPanSpeed: Number = 10
+  		// Number of pixels the map should pan by.
+  		autoPanSpeed: 10
+  	},
+
+  	/* @section
+  	 *
+  	 * In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPopup() you can also use the following methods:
+  	 */
+
+  	initialize: function (latlng, options) {
+  		setOptions(this, options);
+  		this._latlng = toLatLng(latlng);
+  	},
+
+  	onAdd: function (map) {
+  		this._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation;
+
+  		if (this._zoomAnimated) {
+  			map.on('zoomanim', this._animateZoom, this);
+  		}
+
+  		this._initIcon();
+  		this.update();
+  	},
+
+  	onRemove: function (map) {
+  		if (this.dragging && this.dragging.enabled()) {
+  			this.options.draggable = true;
+  			this.dragging.removeHooks();
+  		}
+  		delete this.dragging;
+
+  		if (this._zoomAnimated) {
+  			map.off('zoomanim', this._animateZoom, this);
+  		}
+
+  		this._removeIcon();
+  		this._removeShadow();
+  	},
+
+  	getEvents: function () {
+  		return {
+  			zoom: this.update,
+  			viewreset: this.update
+  		};
+  	},
+
+  	// @method getLatLng: LatLng
+  	// Returns the current geographical position of the marker.
+  	getLatLng: function () {
+  		return this._latlng;
+  	},
+
+  	// @method setLatLng(latlng: LatLng): this
+  	// Changes the marker position to the given point.
+  	setLatLng: function (latlng) {
+  		var oldLatLng = this._latlng;
+  		this._latlng = toLatLng(latlng);
+  		this.update();
+
+  		// @event move: Event
+  		// Fired when the marker is moved via [`setLatLng`](#marker-setlatlng) or by [dragging](#marker-dragging). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`.
+  		return this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng});
+  	},
+
+  	// @method setZIndexOffset(offset: Number): this
+  	// Changes the [zIndex offset](#marker-zindexoffset) of the marker.
+  	setZIndexOffset: function (offset) {
+  		this.options.zIndexOffset = offset;
+  		return this.update();
+  	},
+
+  	// @method getIcon: Icon
+  	// Returns the current icon used by the marker
+  	getIcon: function () {
+  		return this.options.icon;
+  	},
+
+  	// @method setIcon(icon: Icon): this
+  	// Changes the marker icon.
+  	setIcon: function (icon) {
+
+  		this.options.icon = icon;
+
+  		if (this._map) {
+  			this._initIcon();
+  			this.update();
+  		}
+
+  		if (this._popup) {
+  			this.bindPopup(this._popup, this._popup.options);
+  		}
+
+  		return this;
+  	},
+
+  	getElement: function () {
+  		return this._icon;
+  	},
+
+  	update: function () {
+
+  		if (this._icon && this._map) {
+  			var pos = this._map.latLngToLayerPoint(this._latlng).round();
+  			this._setPos(pos);
+  		}
+
+  		return this;
+  	},
+
+  	_initIcon: function () {
+  		var options = this.options,
+  		    classToAdd = 'leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');
+
+  		var icon = options.icon.createIcon(this._icon),
+  		    addIcon = false;
+
+  		// if we're not reusing the icon, remove the old one and init new one
+  		if (icon !== this._icon) {
+  			if (this._icon) {
+  				this._removeIcon();
+  			}
+  			addIcon = true;
+
+  			if (options.title) {
+  				icon.title = options.title;
+  			}
+
+  			if (icon.tagName === 'IMG') {
+  				icon.alt = options.alt || '';
+  			}
+  		}
+
+  		addClass(icon, classToAdd);
+
+  		if (options.keyboard) {
+  			icon.tabIndex = '0';
+  		}
+
+  		this._icon = icon;
+
+  		if (options.riseOnHover) {
+  			this.on({
+  				mouseover: this._bringToFront,
+  				mouseout: this._resetZIndex
+  			});
+  		}
+
+  		var newShadow = options.icon.createShadow(this._shadow),
+  		    addShadow = false;
+
+  		if (newShadow !== this._shadow) {
+  			this._removeShadow();
+  			addShadow = true;
+  		}
+
+  		if (newShadow) {
+  			addClass(newShadow, classToAdd);
+  			newShadow.alt = '';
+  		}
+  		this._shadow = newShadow;
+
+
+  		if (options.opacity < 1) {
+  			this._updateOpacity();
+  		}
+
+
+  		if (addIcon) {
+  			this.getPane().appendChild(this._icon);
+  		}
+  		this._initInteraction();
+  		if (newShadow && addShadow) {
+  			this.getPane(options.shadowPane).appendChild(this._shadow);
+  		}
+  	},
+
+  	_removeIcon: function () {
+  		if (this.options.riseOnHover) {
+  			this.off({
+  				mouseover: this._bringToFront,
+  				mouseout: this._resetZIndex
+  			});
+  		}
+
+  		remove(this._icon);
+  		this.removeInteractiveTarget(this._icon);
+
+  		this._icon = null;
+  	},
+
+  	_removeShadow: function () {
+  		if (this._shadow) {
+  			remove(this._shadow);
+  		}
+  		this._shadow = null;
+  	},
+
+  	_setPos: function (pos) {
+
+  		if (this._icon) {
+  			setPosition(this._icon, pos);
+  		}
+
+  		if (this._shadow) {
+  			setPosition(this._shadow, pos);
+  		}
+
+  		this._zIndex = pos.y + this.options.zIndexOffset;
+
+  		this._resetZIndex();
+  	},
+
+  	_updateZIndex: function (offset) {
+  		if (this._icon) {
+  			this._icon.style.zIndex = this._zIndex + offset;
+  		}
+  	},
+
+  	_animateZoom: function (opt) {
+  		var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();
+
+  		this._setPos(pos);
+  	},
+
+  	_initInteraction: function () {
+
+  		if (!this.options.interactive) { return; }
+
+  		addClass(this._icon, 'leaflet-interactive');
+
+  		this.addInteractiveTarget(this._icon);
+
+  		if (MarkerDrag) {
+  			var draggable = this.options.draggable;
+  			if (this.dragging) {
+  				draggable = this.dragging.enabled();
+  				this.dragging.disable();
+  			}
+
+  			this.dragging = new MarkerDrag(this);
+
+  			if (draggable) {
+  				this.dragging.enable();
+  			}
+  		}
+  	},
+
+  	// @method setOpacity(opacity: Number): this
+  	// Changes the opacity of the marker.
+  	setOpacity: function (opacity) {
+  		this.options.opacity = opacity;
+  		if (this._map) {
+  			this._updateOpacity();
+  		}
+
+  		return this;
+  	},
+
+  	_updateOpacity: function () {
+  		var opacity = this.options.opacity;
+
+  		if (this._icon) {
+  			setOpacity(this._icon, opacity);
+  		}
+
+  		if (this._shadow) {
+  			setOpacity(this._shadow, opacity);
+  		}
+  	},
+
+  	_bringToFront: function () {
+  		this._updateZIndex(this.options.riseOffset);
+  	},
+
+  	_resetZIndex: function () {
+  		this._updateZIndex(0);
+  	},
+
+  	_getPopupAnchor: function () {
+  		return this.options.icon.options.popupAnchor;
+  	},
+
+  	_getTooltipAnchor: function () {
+  		return this.options.icon.options.tooltipAnchor;
+  	}
+  });
+
+
+  // factory L.marker(latlng: LatLng, options? : Marker options)
+
+  // @factory L.marker(latlng: LatLng, options? : Marker options)
+  // Instantiates a Marker object given a geographical point and optionally an options object.
+  function marker(latlng, options) {
+  	return new Marker(latlng, options);
+  }
+
+  /*
+   * @class Path
+   * @aka L.Path
+   * @inherits Interactive layer
+   *
+   * An abstract class that contains options and constants shared between vector
+   * overlays (Polygon, Polyline, Circle). Do not use it directly. Extends `Layer`.
+   */
+
+  var Path = Layer.extend({
+
+  	// @section
+  	// @aka Path options
+  	options: {
+  		// @option stroke: Boolean = true
+  		// Whether to draw stroke along the path. Set it to `false` to disable borders on polygons or circles.
+  		stroke: true,
+
+  		// @option color: String = '#3388ff'
+  		// Stroke color
+  		color: '#3388ff',
+
+  		// @option weight: Number = 3
+  		// Stroke width in pixels
+  		weight: 3,
+
+  		// @option opacity: Number = 1.0
+  		// Stroke opacity
+  		opacity: 1,
+
+  		// @option lineCap: String= 'round'
+  		// A string that defines [shape to be used at the end](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linecap) of the stroke.
+  		lineCap: 'round',
+
+  		// @option lineJoin: String = 'round'
+  		// A string that defines [shape to be used at the corners](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linejoin) of the stroke.
+  		lineJoin: 'round',
+
+  		// @option dashArray: String = null
+  		// A string that defines the stroke [dash pattern](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dasharray). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).
+  		dashArray: null,
+
+  		// @option dashOffset: String = null
+  		// A string that defines the [distance into the dash pattern to start the dash](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dashoffset). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).
+  		dashOffset: null,
+
+  		// @option fill: Boolean = depends
+  		// Whether to fill the path with color. Set it to `false` to disable filling on polygons or circles.
+  		fill: false,
+
+  		// @option fillColor: String = *
+  		// Fill color. Defaults to the value of the [`color`](#path-color) option
+  		fillColor: null,
+
+  		// @option fillOpacity: Number = 0.2
+  		// Fill opacity.
+  		fillOpacity: 0.2,
+
+  		// @option fillRule: String = 'evenodd'
+  		// A string that defines [how the inside of a shape](https://developer.mozilla.org/docs/Web/SVG/Attribute/fill-rule) is determined.
+  		fillRule: 'evenodd',
+
+  		// className: '',
+
+  		// Option inherited from "Interactive layer" abstract class
+  		interactive: true,
+
+  		// @option bubblingMouseEvents: Boolean = true
+  		// When `true`, a mouse event on this path will trigger the same event on the map
+  		// (unless [`L.DomEvent.stopPropagation`](#domevent-stoppropagation) is used).
+  		bubblingMouseEvents: true
+  	},
+
+  	beforeAdd: function (map) {
+  		// Renderer is set here because we need to call renderer.getEvents
+  		// before this.getEvents.
+  		this._renderer = map.getRenderer(this);
+  	},
+
+  	onAdd: function () {
+  		this._renderer._initPath(this);
+  		this._reset();
+  		this._renderer._addPath(this);
+  	},
+
+  	onRemove: function () {
+  		this._renderer._removePath(this);
+  	},
+
+  	// @method redraw(): this
+  	// Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.
+  	redraw: function () {
+  		if (this._map) {
+  			this._renderer._updatePath(this);
+  		}
+  		return this;
+  	},
+
+  	// @method setStyle(style: Path options): this
+  	// Changes the appearance of a Path based on the options in the `Path options` object.
+  	setStyle: function (style) {
+  		setOptions(this, style);
+  		if (this._renderer) {
+  			this._renderer._updateStyle(this);
+  			if (this.options.stroke && style && Object.prototype.hasOwnProperty.call(style, 'weight')) {
+  				this._updateBounds();
+  			}
+  		}
+  		return this;
+  	},
+
+  	// @method bringToFront(): this
+  	// Brings the layer to the top of all path layers.
+  	bringToFront: function () {
+  		if (this._renderer) {
+  			this._renderer._bringToFront(this);
+  		}
+  		return this;
+  	},
+
+  	// @method bringToBack(): this
+  	// Brings the layer to the bottom of all path layers.
+  	bringToBack: function () {
+  		if (this._renderer) {
+  			this._renderer._bringToBack(this);
+  		}
+  		return this;
+  	},
+
+  	getElement: function () {
+  		return this._path;
+  	},
+
+  	_reset: function () {
+  		// defined in child classes
+  		this._project();
+  		this._update();
+  	},
+
+  	_clickTolerance: function () {
+  		// used when doing hit detection for Canvas layers
+  		return (this.options.stroke ? this.options.weight / 2 : 0) + this._renderer.options.tolerance;
+  	}
+  });
+
+  /*
+   * @class CircleMarker
+   * @aka L.CircleMarker
+   * @inherits Path
+   *
+   * A circle of a fixed size with radius specified in pixels. Extends `Path`.
+   */
+
+  var CircleMarker = Path.extend({
+
+  	// @section
+  	// @aka CircleMarker options
+  	options: {
+  		fill: true,
+
+  		// @option radius: Number = 10
+  		// Radius of the circle marker, in pixels
+  		radius: 10
+  	},
+
+  	initialize: function (latlng, options) {
+  		setOptions(this, options);
+  		this._latlng = toLatLng(latlng);
+  		this._radius = this.options.radius;
+  	},
+
+  	// @method setLatLng(latLng: LatLng): this
+  	// Sets the position of a circle marker to a new location.
+  	setLatLng: function (latlng) {
+  		var oldLatLng = this._latlng;
+  		this._latlng = toLatLng(latlng);
+  		this.redraw();
+
+  		// @event move: Event
+  		// Fired when the marker is moved via [`setLatLng`](#circlemarker-setlatlng). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`.
+  		return this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng});
+  	},
+
+  	// @method getLatLng(): LatLng
+  	// Returns the current geographical position of the circle marker
+  	getLatLng: function () {
+  		return this._latlng;
+  	},
+
+  	// @method setRadius(radius: Number): this
+  	// Sets the radius of a circle marker. Units are in pixels.
+  	setRadius: function (radius) {
+  		this.options.radius = this._radius = radius;
+  		return this.redraw();
+  	},
+
+  	// @method getRadius(): Number
+  	// Returns the current radius of the circle
+  	getRadius: function () {
+  		return this._radius;
+  	},
+
+  	setStyle : function (options) {
+  		var radius = options && options.radius || this._radius;
+  		Path.prototype.setStyle.call(this, options);
+  		this.setRadius(radius);
+  		return this;
+  	},
+
+  	_project: function () {
+  		this._point = this._map.latLngToLayerPoint(this._latlng);
+  		this._updateBounds();
+  	},
+
+  	_updateBounds: function () {
+  		var r = this._radius,
+  		    r2 = this._radiusY || r,
+  		    w = this._clickTolerance(),
+  		    p = [r + w, r2 + w];
+  		this._pxBounds = new Bounds(this._point.subtract(p), this._point.add(p));
+  	},
+
+  	_update: function () {
+  		if (this._map) {
+  			this._updatePath();
+  		}
+  	},
+
+  	_updatePath: function () {
+  		this._renderer._updateCircle(this);
+  	},
+
+  	_empty: function () {
+  		return this._radius && !this._renderer._bounds.intersects(this._pxBounds);
+  	},
+
+  	// Needed by the `Canvas` renderer for interactivity
+  	_containsPoint: function (p) {
+  		return p.distanceTo(this._point) <= this._radius + this._clickTolerance();
+  	}
+  });
+
+
+  // @factory L.circleMarker(latlng: LatLng, options?: CircleMarker options)
+  // Instantiates a circle marker object given a geographical point, and an optional options object.
+  function circleMarker(latlng, options) {
+  	return new CircleMarker(latlng, options);
+  }
+
+  /*
+   * @class Circle
+   * @aka L.Circle
+   * @inherits CircleMarker
+   *
+   * A class for drawing circle overlays on a map. Extends `CircleMarker`.
+   *
+   * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).
+   *
+   * @example
+   *
+   * ```js
+   * L.circle([50.5, 30.5], {radius: 200}).addTo(map);
+   * ```
+   */
+
+  var Circle = CircleMarker.extend({
+
+  	initialize: function (latlng, options, legacyOptions) {
+  		if (typeof options === 'number') {
+  			// Backwards compatibility with 0.7.x factory (latlng, radius, options?)
+  			options = extend({}, legacyOptions, {radius: options});
+  		}
+  		setOptions(this, options);
+  		this._latlng = toLatLng(latlng);
+
+  		if (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); }
+
+  		// @section
+  		// @aka Circle options
+  		// @option radius: Number; Radius of the circle, in meters.
+  		this._mRadius = this.options.radius;
+  	},
+
+  	// @method setRadius(radius: Number): this
+  	// Sets the radius of a circle. Units are in meters.
+  	setRadius: function (radius) {
+  		this._mRadius = radius;
+  		return this.redraw();
+  	},
+
+  	// @method getRadius(): Number
+  	// Returns the current radius of a circle. Units are in meters.
+  	getRadius: function () {
+  		return this._mRadius;
+  	},
+
+  	// @method getBounds(): LatLngBounds
+  	// Returns the `LatLngBounds` of the path.
+  	getBounds: function () {
+  		var half = [this._radius, this._radiusY || this._radius];
+
+  		return new LatLngBounds(
+  			this._map.layerPointToLatLng(this._point.subtract(half)),
+  			this._map.layerPointToLatLng(this._point.add(half)));
+  	},
+
+  	setStyle: Path.prototype.setStyle,
+
+  	_project: function () {
+
+  		var lng = this._latlng.lng,
+  		    lat = this._latlng.lat,
+  		    map = this._map,
+  		    crs = map.options.crs;
+
+  		if (crs.distance === Earth.distance) {
+  			var d = Math.PI / 180,
+  			    latR = (this._mRadius / Earth.R) / d,
+  			    top = map.project([lat + latR, lng]),
+  			    bottom = map.project([lat - latR, lng]),
+  			    p = top.add(bottom).divideBy(2),
+  			    lat2 = map.unproject(p).lat,
+  			    lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) /
+  			            (Math.cos(lat * d) * Math.cos(lat2 * d))) / d;
+
+  			if (isNaN(lngR) || lngR === 0) {
+  				lngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425
+  			}
+
+  			this._point = p.subtract(map.getPixelOrigin());
+  			this._radius = isNaN(lngR) ? 0 : p.x - map.project([lat2, lng - lngR]).x;
+  			this._radiusY = p.y - top.y;
+
+  		} else {
+  			var latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0]));
+
+  			this._point = map.latLngToLayerPoint(this._latlng);
+  			this._radius = this._point.x - map.latLngToLayerPoint(latlng2).x;
+  		}
+
+  		this._updateBounds();
+  	}
+  });
+
+  // @factory L.circle(latlng: LatLng, options?: Circle options)
+  // Instantiates a circle object given a geographical point, and an options object
+  // which contains the circle radius.
+  // @alternative
+  // @factory L.circle(latlng: LatLng, radius: Number, options?: Circle options)
+  // Obsolete way of instantiating a circle, for compatibility with 0.7.x code.
+  // Do not use in new applications or plugins.
+  function circle(latlng, options, legacyOptions) {
+  	return new Circle(latlng, options, legacyOptions);
+  }
+
+  /*
+   * @class Polyline
+   * @aka L.Polyline
+   * @inherits Path
+   *
+   * A class for drawing polyline overlays on a map. Extends `Path`.
+   *
+   * @example
+   *
+   * ```js
+   * // create a red polyline from an array of LatLng points
+   * var latlngs = [
+   * 	[45.51, -122.68],
+   * 	[37.77, -122.43],
+   * 	[34.04, -118.2]
+   * ];
+   *
+   * var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
+   *
+   * // zoom the map to the polyline
+   * map.fitBounds(polyline.getBounds());
+   * ```
+   *
+   * You can also pass a multi-dimensional array to represent a `MultiPolyline` shape:
+   *
+   * ```js
+   * // create a red polyline from an array of arrays of LatLng points
+   * var latlngs = [
+   * 	[[45.51, -122.68],
+   * 	 [37.77, -122.43],
+   * 	 [34.04, -118.2]],
+   * 	[[40.78, -73.91],
+   * 	 [41.83, -87.62],
+   * 	 [32.76, -96.72]]
+   * ];
+   * ```
+   */
+
+
+  var Polyline = Path.extend({
+
+  	// @section
+  	// @aka Polyline options
+  	options: {
+  		// @option smoothFactor: Number = 1.0
+  		// How much to simplify the polyline on each zoom level. More means
+  		// better performance and smoother look, and less means more accurate representation.
+  		smoothFactor: 1.0,
+
+  		// @option noClip: Boolean = false
+  		// Disable polyline clipping.
+  		noClip: false
+  	},
+
+  	initialize: function (latlngs, options) {
+  		setOptions(this, options);
+  		this._setLatLngs(latlngs);
+  	},
+
+  	// @method getLatLngs(): LatLng[]
+  	// Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.
+  	getLatLngs: function () {
+  		return this._latlngs;
+  	},
+
+  	// @method setLatLngs(latlngs: LatLng[]): this
+  	// Replaces all the points in the polyline with the given array of geographical points.
+  	setLatLngs: function (latlngs) {
+  		this._setLatLngs(latlngs);
+  		return this.redraw();
+  	},
+
+  	// @method isEmpty(): Boolean
+  	// Returns `true` if the Polyline has no LatLngs.
+  	isEmpty: function () {
+  		return !this._latlngs.length;
+  	},
+
+  	// @method closestLayerPoint(p: Point): Point
+  	// Returns the point closest to `p` on the Polyline.
+  	closestLayerPoint: function (p) {
+  		var minDistance = Infinity,
+  		    minPoint = null,
+  		    closest = _sqClosestPointOnSegment,
+  		    p1, p2;
+
+  		for (var j = 0, jLen = this._parts.length; j < jLen; j++) {
+  			var points = this._parts[j];
+
+  			for (var i = 1, len = points.length; i < len; i++) {
+  				p1 = points[i - 1];
+  				p2 = points[i];
+
+  				var sqDist = closest(p, p1, p2, true);
+
+  				if (sqDist < minDistance) {
+  					minDistance = sqDist;
+  					minPoint = closest(p, p1, p2);
+  				}
+  			}
+  		}
+  		if (minPoint) {
+  			minPoint.distance = Math.sqrt(minDistance);
+  		}
+  		return minPoint;
+  	},
+
+  	// @method getCenter(): LatLng
+  	// Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the polyline.
+  	getCenter: function () {
+  		// throws error when not yet added to map as this center calculation requires projected coordinates
+  		if (!this._map) {
+  			throw new Error('Must add layer to map before using getCenter()');
+  		}
+
+  		var i, halfDist, segDist, dist, p1, p2, ratio,
+  		    points = this._rings[0],
+  		    len = points.length;
+
+  		if (!len) { return null; }
+
+  		// polyline centroid algorithm; only uses the first ring if there are multiple
+
+  		for (i = 0, halfDist = 0; i < len - 1; i++) {
+  			halfDist += points[i].distanceTo(points[i + 1]) / 2;
+  		}
+
+  		// The line is so small in the current view that all points are on the same pixel.
+  		if (halfDist === 0) {
+  			return this._map.layerPointToLatLng(points[0]);
+  		}
+
+  		for (i = 0, dist = 0; i < len - 1; i++) {
+  			p1 = points[i];
+  			p2 = points[i + 1];
+  			segDist = p1.distanceTo(p2);
+  			dist += segDist;
+
+  			if (dist > halfDist) {
+  				ratio = (dist - halfDist) / segDist;
+  				return this._map.layerPointToLatLng([
+  					p2.x - ratio * (p2.x - p1.x),
+  					p2.y - ratio * (p2.y - p1.y)
+  				]);
+  			}
+  		}
+  	},
+
+  	// @method getBounds(): LatLngBounds
+  	// Returns the `LatLngBounds` of the path.
+  	getBounds: function () {
+  		return this._bounds;
+  	},
+
+  	// @method addLatLng(latlng: LatLng, latlngs?: LatLng[]): this
+  	// Adds a given point to the polyline. By default, adds to the first ring of
+  	// the polyline in case of a multi-polyline, but can be overridden by passing
+  	// a specific ring as a LatLng array (that you can earlier access with [`getLatLngs`](#polyline-getlatlngs)).
+  	addLatLng: function (latlng, latlngs) {
+  		latlngs = latlngs || this._defaultShape();
+  		latlng = toLatLng(latlng);
+  		latlngs.push(latlng);
+  		this._bounds.extend(latlng);
+  		return this.redraw();
+  	},
+
+  	_setLatLngs: function (latlngs) {
+  		this._bounds = new LatLngBounds();
+  		this._latlngs = this._convertLatLngs(latlngs);
+  	},
+
+  	_defaultShape: function () {
+  		return isFlat(this._latlngs) ? this._latlngs : this._latlngs[0];
+  	},
+
+  	// recursively convert latlngs input into actual LatLng instances; calculate bounds along the way
+  	_convertLatLngs: function (latlngs) {
+  		var result = [],
+  		    flat = isFlat(latlngs);
+
+  		for (var i = 0, len = latlngs.length; i < len; i++) {
+  			if (flat) {
+  				result[i] = toLatLng(latlngs[i]);
+  				this._bounds.extend(result[i]);
+  			} else {
+  				result[i] = this._convertLatLngs(latlngs[i]);
+  			}
+  		}
+
+  		return result;
+  	},
+
+  	_project: function () {
+  		var pxBounds = new Bounds();
+  		this._rings = [];
+  		this._projectLatlngs(this._latlngs, this._rings, pxBounds);
+
+  		if (this._bounds.isValid() && pxBounds.isValid()) {
+  			this._rawPxBounds = pxBounds;
+  			this._updateBounds();
+  		}
+  	},
+
+  	_updateBounds: function () {
+  		var w = this._clickTolerance(),
+  		    p = new Point(w, w);
+  		this._pxBounds = new Bounds([
+  			this._rawPxBounds.min.subtract(p),
+  			this._rawPxBounds.max.add(p)
+  		]);
+  	},
+
+  	// recursively turns latlngs into a set of rings with projected coordinates
+  	_projectLatlngs: function (latlngs, result, projectedBounds) {
+  		var flat = latlngs[0] instanceof LatLng,
+  		    len = latlngs.length,
+  		    i, ring;
+
+  		if (flat) {
+  			ring = [];
+  			for (i = 0; i < len; i++) {
+  				ring[i] = this._map.latLngToLayerPoint(latlngs[i]);
+  				projectedBounds.extend(ring[i]);
+  			}
+  			result.push(ring);
+  		} else {
+  			for (i = 0; i < len; i++) {
+  				this._projectLatlngs(latlngs[i], result, projectedBounds);
+  			}
+  		}
+  	},
+
+  	// clip polyline by renderer bounds so that we have less to render for performance
+  	_clipPoints: function () {
+  		var bounds = this._renderer._bounds;
+
+  		this._parts = [];
+  		if (!this._pxBounds || !this._pxBounds.intersects(bounds)) {
+  			return;
+  		}
+
+  		if (this.options.noClip) {
+  			this._parts = this._rings;
+  			return;
+  		}
+
+  		var parts = this._parts,
+  		    i, j, k, len, len2, segment, points;
+
+  		for (i = 0, k = 0, len = this._rings.length; i < len; i++) {
+  			points = this._rings[i];
+
+  			for (j = 0, len2 = points.length; j < len2 - 1; j++) {
+  				segment = clipSegment(points[j], points[j + 1], bounds, j, true);
+
+  				if (!segment) { continue; }
+
+  				parts[k] = parts[k] || [];
+  				parts[k].push(segment[0]);
+
+  				// if segment goes out of screen, or it's the last one, it's the end of the line part
+  				if ((segment[1] !== points[j + 1]) || (j === len2 - 2)) {
+  					parts[k].push(segment[1]);
+  					k++;
+  				}
+  			}
+  		}
+  	},
+
+  	// simplify each clipped part of the polyline for performance
+  	_simplifyPoints: function () {
+  		var parts = this._parts,
+  		    tolerance = this.options.smoothFactor;
+
+  		for (var i = 0, len = parts.length; i < len; i++) {
+  			parts[i] = simplify(parts[i], tolerance);
+  		}
+  	},
+
+  	_update: function () {
+  		if (!this._map) { return; }
+
+  		this._clipPoints();
+  		this._simplifyPoints();
+  		this._updatePath();
+  	},
+
+  	_updatePath: function () {
+  		this._renderer._updatePoly(this);
+  	},
+
+  	// Needed by the `Canvas` renderer for interactivity
+  	_containsPoint: function (p, closed) {
+  		var i, j, k, len, len2, part,
+  		    w = this._clickTolerance();
+
+  		if (!this._pxBounds || !this._pxBounds.contains(p)) { return false; }
+
+  		// hit detection for polylines
+  		for (i = 0, len = this._parts.length; i < len; i++) {
+  			part = this._parts[i];
+
+  			for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {
+  				if (!closed && (j === 0)) { continue; }
+
+  				if (pointToSegmentDistance(p, part[k], part[j]) <= w) {
+  					return true;
+  				}
+  			}
+  		}
+  		return false;
+  	}
+  });
+
+  // @factory L.polyline(latlngs: LatLng[], options?: Polyline options)
+  // Instantiates a polyline object given an array of geographical points and
+  // optionally an options object. You can create a `Polyline` object with
+  // multiple separate lines (`MultiPolyline`) by passing an array of arrays
+  // of geographic points.
+  function polyline(latlngs, options) {
+  	return new Polyline(latlngs, options);
+  }
+
+  // Retrocompat. Allow plugins to support Leaflet versions before and after 1.1.
+  Polyline._flat = _flat;
+
+  /*
+   * @class Polygon
+   * @aka L.Polygon
+   * @inherits Polyline
+   *
+   * A class for drawing polygon overlays on a map. Extends `Polyline`.
+   *
+   * Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.
+   *
+   *
+   * @example
+   *
+   * ```js
+   * // create a red polygon from an array of LatLng points
+   * var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];
+   *
+   * var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
+   *
+   * // zoom the map to the polygon
+   * map.fitBounds(polygon.getBounds());
+   * ```
+   *
+   * You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:
+   *
+   * ```js
+   * var latlngs = [
+   *   [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
+   *   [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
+   * ];
+   * ```
+   *
+   * Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.
+   *
+   * ```js
+   * var latlngs = [
+   *   [ // first polygon
+   *     [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
+   *     [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
+   *   ],
+   *   [ // second polygon
+   *     [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]
+   *   ]
+   * ];
+   * ```
+   */
+
+  var Polygon = Polyline.extend({
+
+  	options: {
+  		fill: true
+  	},
+
+  	isEmpty: function () {
+  		return !this._latlngs.length || !this._latlngs[0].length;
+  	},
+
+  	getCenter: function () {
+  		// throws error when not yet added to map as this center calculation requires projected coordinates
+  		if (!this._map) {
+  			throw new Error('Must add layer to map before using getCenter()');
+  		}
+
+  		var i, j, p1, p2, f, area, x, y, center,
+  		    points = this._rings[0],
+  		    len = points.length;
+
+  		if (!len) { return null; }
+
+  		// polygon centroid algorithm; only uses the first ring if there are multiple
+
+  		area = x = y = 0;
+
+  		for (i = 0, j = len - 1; i < len; j = i++) {
+  			p1 = points[i];
+  			p2 = points[j];
+
+  			f = p1.y * p2.x - p2.y * p1.x;
+  			x += (p1.x + p2.x) * f;
+  			y += (p1.y + p2.y) * f;
+  			area += f * 3;
+  		}
+
+  		if (area === 0) {
+  			// Polygon is so small that all points are on same pixel.
+  			center = points[0];
+  		} else {
+  			center = [x / area, y / area];
+  		}
+  		return this._map.layerPointToLatLng(center);
+  	},
+
+  	_convertLatLngs: function (latlngs) {
+  		var result = Polyline.prototype._convertLatLngs.call(this, latlngs),
+  		    len = result.length;
+
+  		// remove last point if it equals first one
+  		if (len >= 2 && result[0] instanceof LatLng && result[0].equals(result[len - 1])) {
+  			result.pop();
+  		}
+  		return result;
+  	},
+
+  	_setLatLngs: function (latlngs) {
+  		Polyline.prototype._setLatLngs.call(this, latlngs);
+  		if (isFlat(this._latlngs)) {
+  			this._latlngs = [this._latlngs];
+  		}
+  	},
+
+  	_defaultShape: function () {
+  		return isFlat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0];
+  	},
+
+  	_clipPoints: function () {
+  		// polygons need a different clipping algorithm so we redefine that
+
+  		var bounds = this._renderer._bounds,
+  		    w = this.options.weight,
+  		    p = new Point(w, w);
+
+  		// increase clip padding by stroke width to avoid stroke on clip edges
+  		bounds = new Bounds(bounds.min.subtract(p), bounds.max.add(p));
+
+  		this._parts = [];
+  		if (!this._pxBounds || !this._pxBounds.intersects(bounds)) {
+  			return;
+  		}
+
+  		if (this.options.noClip) {
+  			this._parts = this._rings;
+  			return;
+  		}
+
+  		for (var i = 0, len = this._rings.length, clipped; i < len; i++) {
+  			clipped = clipPolygon(this._rings[i], bounds, true);
+  			if (clipped.length) {
+  				this._parts.push(clipped);
+  			}
+  		}
+  	},
+
+  	_updatePath: function () {
+  		this._renderer._updatePoly(this, true);
+  	},
+
+  	// Needed by the `Canvas` renderer for interactivity
+  	_containsPoint: function (p) {
+  		var inside = false,
+  		    part, p1, p2, i, j, k, len, len2;
+
+  		if (!this._pxBounds || !this._pxBounds.contains(p)) { return false; }
+
+  		// ray casting algorithm for detecting if point is in polygon
+  		for (i = 0, len = this._parts.length; i < len; i++) {
+  			part = this._parts[i];
+
+  			for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {
+  				p1 = part[j];
+  				p2 = part[k];
+
+  				if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {
+  					inside = !inside;
+  				}
+  			}
+  		}
+
+  		// also check if it's on polygon stroke
+  		return inside || Polyline.prototype._containsPoint.call(this, p, true);
+  	}
+
+  });
+
+
+  // @factory L.polygon(latlngs: LatLng[], options?: Polyline options)
+  function polygon(latlngs, options) {
+  	return new Polygon(latlngs, options);
+  }
+
+  /*
+   * @class GeoJSON
+   * @aka L.GeoJSON
+   * @inherits FeatureGroup
+   *
+   * Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse
+   * GeoJSON data and display it on the map. Extends `FeatureGroup`.
+   *
+   * @example
+   *
+   * ```js
+   * L.geoJSON(data, {
+   * 	style: function (feature) {
+   * 		return {color: feature.properties.color};
+   * 	}
+   * }).bindPopup(function (layer) {
+   * 	return layer.feature.properties.description;
+   * }).addTo(map);
+   * ```
+   */
+
+  var GeoJSON = FeatureGroup.extend({
+
+  	/* @section
+  	 * @aka GeoJSON options
+  	 *
+  	 * @option pointToLayer: Function = *
+  	 * A `Function` defining how GeoJSON points spawn Leaflet layers. It is internally
+  	 * called when data is added, passing the GeoJSON point feature and its `LatLng`.
+  	 * The default is to spawn a default `Marker`:
+  	 * ```js
+  	 * function(geoJsonPoint, latlng) {
+  	 * 	return L.marker(latlng);
+  	 * }
+  	 * ```
+  	 *
+  	 * @option style: Function = *
+  	 * A `Function` defining the `Path options` for styling GeoJSON lines and polygons,
+  	 * called internally when data is added.
+  	 * The default value is to not override any defaults:
+  	 * ```js
+  	 * function (geoJsonFeature) {
+  	 * 	return {}
+  	 * }
+  	 * ```
+  	 *
+  	 * @option onEachFeature: Function = *
+  	 * A `Function` that will be called once for each created `Feature`, after it has
+  	 * been created and styled. Useful for attaching events and popups to features.
+  	 * The default is to do nothing with the newly created layers:
+  	 * ```js
+  	 * function (feature, layer) {}
+  	 * ```
+  	 *
+  	 * @option filter: Function = *
+  	 * A `Function` that will be used to decide whether to include a feature or not.
+  	 * The default is to include all features:
+  	 * ```js
+  	 * function (geoJsonFeature) {
+  	 * 	return true;
+  	 * }
+  	 * ```
+  	 * Note: dynamically changing the `filter` option will have effect only on newly
+  	 * added data. It will _not_ re-evaluate already included features.
+  	 *
+  	 * @option coordsToLatLng: Function = *
+  	 * A `Function` that will be used for converting GeoJSON coordinates to `LatLng`s.
+  	 * The default is the `coordsToLatLng` static method.
+  	 *
+  	 * @option markersInheritOptions: Boolean = false
+  	 * Whether default Markers for "Point" type Features inherit from group options.
+  	 */
+
+  	initialize: function (geojson, options) {
+  		setOptions(this, options);
+
+  		this._layers = {};
+
+  		if (geojson) {
+  			this.addData(geojson);
+  		}
+  	},
+
+  	// @method addData( <GeoJSON> data ): this
+  	// Adds a GeoJSON object to the layer.
+  	addData: function (geojson) {
+  		var features = isArray(geojson) ? geojson : geojson.features,
+  		    i, len, feature;
+
+  		if (features) {
+  			for (i = 0, len = features.length; i < len; i++) {
+  				// only add this if geometry or geometries are set and not null
+  				feature = features[i];
+  				if (feature.geometries || feature.geometry || feature.features || feature.coordinates) {
+  					this.addData(feature);
+  				}
+  			}
+  			return this;
+  		}
+
+  		var options = this.options;
+
+  		if (options.filter && !options.filter(geojson)) { return this; }
+
+  		var layer = geometryToLayer(geojson, options);
+  		if (!layer) {
+  			return this;
+  		}
+  		layer.feature = asFeature(geojson);
+
+  		layer.defaultOptions = layer.options;
+  		this.resetStyle(layer);
+
+  		if (options.onEachFeature) {
+  			options.onEachFeature(geojson, layer);
+  		}
+
+  		return this.addLayer(layer);
+  	},
+
+  	// @method resetStyle( <Path> layer? ): this
+  	// Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.
+  	// If `layer` is omitted, the style of all features in the current layer is reset.
+  	resetStyle: function (layer) {
+  		if (layer === undefined) {
+  			return this.eachLayer(this.resetStyle, this);
+  		}
+  		// reset any custom styles
+  		layer.options = extend({}, layer.defaultOptions);
+  		this._setLayerStyle(layer, this.options.style);
+  		return this;
+  	},
+
+  	// @method setStyle( <Function> style ): this
+  	// Changes styles of GeoJSON vector layers with the given style function.
+  	setStyle: function (style) {
+  		return this.eachLayer(function (layer) {
+  			this._setLayerStyle(layer, style);
+  		}, this);
+  	},
+
+  	_setLayerStyle: function (layer, style) {
+  		if (layer.setStyle) {
+  			if (typeof style === 'function') {
+  				style = style(layer.feature);
+  			}
+  			layer.setStyle(style);
+  		}
+  	}
+  });
+
+  // @section
+  // There are several static functions which can be called without instantiating L.GeoJSON:
+
+  // @function geometryToLayer(featureData: Object, options?: GeoJSON options): Layer
+  // Creates a `Layer` from a given GeoJSON feature. Can use a custom
+  // [`pointToLayer`](#geojson-pointtolayer) and/or [`coordsToLatLng`](#geojson-coordstolatlng)
+  // functions if provided as options.
+  function geometryToLayer(geojson, options) {
+
+  	var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,
+  	    coords = geometry ? geometry.coordinates : null,
+  	    layers = [],
+  	    pointToLayer = options && options.pointToLayer,
+  	    _coordsToLatLng = options && options.coordsToLatLng || coordsToLatLng,
+  	    latlng, latlngs, i, len;
+
+  	if (!coords && !geometry) {
+  		return null;
+  	}
+
+  	switch (geometry.type) {
+  	case 'Point':
+  		latlng = _coordsToLatLng(coords);
+  		return _pointToLayer(pointToLayer, geojson, latlng, options);
+
+  	case 'MultiPoint':
+  		for (i = 0, len = coords.length; i < len; i++) {
+  			latlng = _coordsToLatLng(coords[i]);
+  			layers.push(_pointToLayer(pointToLayer, geojson, latlng, options));
+  		}
+  		return new FeatureGroup(layers);
+
+  	case 'LineString':
+  	case 'MultiLineString':
+  		latlngs = coordsToLatLngs(coords, geometry.type === 'LineString' ? 0 : 1, _coordsToLatLng);
+  		return new Polyline(latlngs, options);
+
+  	case 'Polygon':
+  	case 'MultiPolygon':
+  		latlngs = coordsToLatLngs(coords, geometry.type === 'Polygon' ? 1 : 2, _coordsToLatLng);
+  		return new Polygon(latlngs, options);
+
+  	case 'GeometryCollection':
+  		for (i = 0, len = geometry.geometries.length; i < len; i++) {
+  			var layer = geometryToLayer({
+  				geometry: geometry.geometries[i],
+  				type: 'Feature',
+  				properties: geojson.properties
+  			}, options);
+
+  			if (layer) {
+  				layers.push(layer);
+  			}
+  		}
+  		return new FeatureGroup(layers);
+
+  	default:
+  		throw new Error('Invalid GeoJSON object.');
+  	}
+  }
+
+  function _pointToLayer(pointToLayerFn, geojson, latlng, options) {
+  	return pointToLayerFn ?
+  		pointToLayerFn(geojson, latlng) :
+  		new Marker(latlng, options && options.markersInheritOptions && options);
+  }
+
+  // @function coordsToLatLng(coords: Array): LatLng
+  // Creates a `LatLng` object from an array of 2 numbers (longitude, latitude)
+  // or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.
+  function coordsToLatLng(coords) {
+  	return new LatLng(coords[1], coords[0], coords[2]);
+  }
+
+  // @function coordsToLatLngs(coords: Array, levelsDeep?: Number, coordsToLatLng?: Function): Array
+  // Creates a multidimensional array of `LatLng`s from a GeoJSON coordinates array.
+  // `levelsDeep` specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default).
+  // Can use a custom [`coordsToLatLng`](#geojson-coordstolatlng) function.
+  function coordsToLatLngs(coords, levelsDeep, _coordsToLatLng) {
+  	var latlngs = [];
+
+  	for (var i = 0, len = coords.length, latlng; i < len; i++) {
+  		latlng = levelsDeep ?
+  			coordsToLatLngs(coords[i], levelsDeep - 1, _coordsToLatLng) :
+  			(_coordsToLatLng || coordsToLatLng)(coords[i]);
+
+  		latlngs.push(latlng);
+  	}
+
+  	return latlngs;
+  }
+
+  // @function latLngToCoords(latlng: LatLng, precision?: Number): Array
+  // Reverse of [`coordsToLatLng`](#geojson-coordstolatlng)
+  function latLngToCoords(latlng, precision) {
+  	precision = typeof precision === 'number' ? precision : 6;
+  	return latlng.alt !== undefined ?
+  		[formatNum(latlng.lng, precision), formatNum(latlng.lat, precision), formatNum(latlng.alt, precision)] :
+  		[formatNum(latlng.lng, precision), formatNum(latlng.lat, precision)];
+  }
+
+  // @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean): Array
+  // Reverse of [`coordsToLatLngs`](#geojson-coordstolatlngs)
+  // `closed` determines whether the first point should be appended to the end of the array to close the feature, only used when `levelsDeep` is 0. False by default.
+  function latLngsToCoords(latlngs, levelsDeep, closed, precision) {
+  	var coords = [];
+
+  	for (var i = 0, len = latlngs.length; i < len; i++) {
+  		coords.push(levelsDeep ?
+  			latLngsToCoords(latlngs[i], levelsDeep - 1, closed, precision) :
+  			latLngToCoords(latlngs[i], precision));
+  	}
+
+  	if (!levelsDeep && closed) {
+  		coords.push(coords[0]);
+  	}
+
+  	return coords;
+  }
+
+  function getFeature(layer, newGeometry) {
+  	return layer.feature ?
+  		extend({}, layer.feature, {geometry: newGeometry}) :
+  		asFeature(newGeometry);
+  }
+
+  // @function asFeature(geojson: Object): Object
+  // Normalize GeoJSON geometries/features into GeoJSON features.
+  function asFeature(geojson) {
+  	if (geojson.type === 'Feature' || geojson.type === 'FeatureCollection') {
+  		return geojson;
+  	}
+
+  	return {
+  		type: 'Feature',
+  		properties: {},
+  		geometry: geojson
+  	};
+  }
+
+  var PointToGeoJSON = {
+  	toGeoJSON: function (precision) {
+  		return getFeature(this, {
+  			type: 'Point',
+  			coordinates: latLngToCoords(this.getLatLng(), precision)
+  		});
+  	}
+  };
+
+  // @namespace Marker
+  // @section Other methods
+  // @method toGeoJSON(precision?: Number): Object
+  // `precision` is the number of decimal places for coordinates.
+  // The default value is 6 places.
+  // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON `Point` Feature).
+  Marker.include(PointToGeoJSON);
+
+  // @namespace CircleMarker
+  // @method toGeoJSON(precision?: Number): Object
+  // `precision` is the number of decimal places for coordinates.
+  // The default value is 6 places.
+  // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature).
+  Circle.include(PointToGeoJSON);
+  CircleMarker.include(PointToGeoJSON);
+
+
+  // @namespace Polyline
+  // @method toGeoJSON(precision?: Number): Object
+  // `precision` is the number of decimal places for coordinates.
+  // The default value is 6 places.
+  // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature).
+  Polyline.include({
+  	toGeoJSON: function (precision) {
+  		var multi = !isFlat(this._latlngs);
+
+  		var coords = latLngsToCoords(this._latlngs, multi ? 1 : 0, false, precision);
+
+  		return getFeature(this, {
+  			type: (multi ? 'Multi' : '') + 'LineString',
+  			coordinates: coords
+  		});
+  	}
+  });
+
+  // @namespace Polygon
+  // @method toGeoJSON(precision?: Number): Object
+  // `precision` is the number of decimal places for coordinates.
+  // The default value is 6 places.
+  // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature).
+  Polygon.include({
+  	toGeoJSON: function (precision) {
+  		var holes = !isFlat(this._latlngs),
+  		    multi = holes && !isFlat(this._latlngs[0]);
+
+  		var coords = latLngsToCoords(this._latlngs, multi ? 2 : holes ? 1 : 0, true, precision);
+
+  		if (!holes) {
+  			coords = [coords];
+  		}
+
+  		return getFeature(this, {
+  			type: (multi ? 'Multi' : '') + 'Polygon',
+  			coordinates: coords
+  		});
+  	}
+  });
+
+
+  // @namespace LayerGroup
+  LayerGroup.include({
+  	toMultiPoint: function (precision) {
+  		var coords = [];
+
+  		this.eachLayer(function (layer) {
+  			coords.push(layer.toGeoJSON(precision).geometry.coordinates);
+  		});
+
+  		return getFeature(this, {
+  			type: 'MultiPoint',
+  			coordinates: coords
+  		});
+  	},
+
+  	// @method toGeoJSON(precision?: Number): Object
+  	// `precision` is the number of decimal places for coordinates.
+  	// The default value is 6 places.
+  	// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `FeatureCollection`, `GeometryCollection`, or `MultiPoint`).
+  	toGeoJSON: function (precision) {
+
+  		var type = this.feature && this.feature.geometry && this.feature.geometry.type;
+
+  		if (type === 'MultiPoint') {
+  			return this.toMultiPoint(precision);
+  		}
+
+  		var isGeometryCollection = type === 'GeometryCollection',
+  		    jsons = [];
+
+  		this.eachLayer(function (layer) {
+  			if (layer.toGeoJSON) {
+  				var json = layer.toGeoJSON(precision);
+  				if (isGeometryCollection) {
+  					jsons.push(json.geometry);
+  				} else {
+  					var feature = asFeature(json);
+  					// Squash nested feature collections
+  					if (feature.type === 'FeatureCollection') {
+  						jsons.push.apply(jsons, feature.features);
+  					} else {
+  						jsons.push(feature);
+  					}
+  				}
+  			}
+  		});
+
+  		if (isGeometryCollection) {
+  			return getFeature(this, {
+  				geometries: jsons,
+  				type: 'GeometryCollection'
+  			});
+  		}
+
+  		return {
+  			type: 'FeatureCollection',
+  			features: jsons
+  		};
+  	}
+  });
+
+  // @namespace GeoJSON
+  // @factory L.geoJSON(geojson?: Object, options?: GeoJSON options)
+  // Creates a GeoJSON layer. Optionally accepts an object in
+  // [GeoJSON format](https://tools.ietf.org/html/rfc7946) to display on the map
+  // (you can alternatively add it later with `addData` method) and an `options` object.
+  function geoJSON(geojson, options) {
+  	return new GeoJSON(geojson, options);
+  }
+
+  // Backward compatibility.
+  var geoJson = geoJSON;
+
+  /*
+   * @class ImageOverlay
+   * @aka L.ImageOverlay
+   * @inherits Interactive layer
+   *
+   * Used to load and display a single image over specific bounds of the map. Extends `Layer`.
+   *
+   * @example
+   *
+   * ```js
+   * var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
+   * 	imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
+   * L.imageOverlay(imageUrl, imageBounds).addTo(map);
+   * ```
+   */
+
+  var ImageOverlay = Layer.extend({
+
+  	// @section
+  	// @aka ImageOverlay options
+  	options: {
+  		// @option opacity: Number = 1.0
+  		// The opacity of the image overlay.
+  		opacity: 1,
+
+  		// @option alt: String = ''
+  		// Text for the `alt` attribute of the image (useful for accessibility).
+  		alt: '',
+
+  		// @option interactive: Boolean = false
+  		// If `true`, the image overlay will emit [mouse events](#interactive-layer) when clicked or hovered.
+  		interactive: false,
+
+  		// @option crossOrigin: Boolean|String = false
+  		// Whether the crossOrigin attribute will be added to the image.
+  		// If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data.
+  		// Refer to [CORS Settings](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for valid String values.
+  		crossOrigin: false,
+
+  		// @option errorOverlayUrl: String = ''
+  		// URL to the overlay image to show in place of the overlay that failed to load.
+  		errorOverlayUrl: '',
+
+  		// @option zIndex: Number = 1
+  		// The explicit [zIndex](https://developer.mozilla.org/docs/Web/CSS/CSS_Positioning/Understanding_z_index) of the overlay layer.
+  		zIndex: 1,
+
+  		// @option className: String = ''
+  		// A custom class name to assign to the image. Empty by default.
+  		className: ''
+  	},
+
+  	initialize: function (url, bounds, options) { // (String, LatLngBounds, Object)
+  		this._url = url;
+  		this._bounds = toLatLngBounds(bounds);
+
+  		setOptions(this, options);
+  	},
+
+  	onAdd: function () {
+  		if (!this._image) {
+  			this._initImage();
+
+  			if (this.options.opacity < 1) {
+  				this._updateOpacity();
+  			}
+  		}
+
+  		if (this.options.interactive) {
+  			addClass(this._image, 'leaflet-interactive');
+  			this.addInteractiveTarget(this._image);
+  		}
+
+  		this.getPane().appendChild(this._image);
+  		this._reset();
+  	},
+
+  	onRemove: function () {
+  		remove(this._image);
+  		if (this.options.interactive) {
+  			this.removeInteractiveTarget(this._image);
+  		}
+  	},
+
+  	// @method setOpacity(opacity: Number): this
+  	// Sets the opacity of the overlay.
+  	setOpacity: function (opacity) {
+  		this.options.opacity = opacity;
+
+  		if (this._image) {
+  			this._updateOpacity();
+  		}
+  		return this;
+  	},
+
+  	setStyle: function (styleOpts) {
+  		if (styleOpts.opacity) {
+  			this.setOpacity(styleOpts.opacity);
+  		}
+  		return this;
+  	},
+
+  	// @method bringToFront(): this
+  	// Brings the layer to the top of all overlays.
+  	bringToFront: function () {
+  		if (this._map) {
+  			toFront(this._image);
+  		}
+  		return this;
+  	},
+
+  	// @method bringToBack(): this
+  	// Brings the layer to the bottom of all overlays.
+  	bringToBack: function () {
+  		if (this._map) {
+  			toBack(this._image);
+  		}
+  		return this;
+  	},
+
+  	// @method setUrl(url: String): this
+  	// Changes the URL of the image.
+  	setUrl: function (url) {
+  		this._url = url;
+
+  		if (this._image) {
+  			this._image.src = url;
+  		}
+  		return this;
+  	},
+
+  	// @method setBounds(bounds: LatLngBounds): this
+  	// Update the bounds that this ImageOverlay covers
+  	setBounds: function (bounds) {
+  		this._bounds = toLatLngBounds(bounds);
+
+  		if (this._map) {
+  			this._reset();
+  		}
+  		return this;
+  	},
+
+  	getEvents: function () {
+  		var events = {
+  			zoom: this._reset,
+  			viewreset: this._reset
+  		};
+
+  		if (this._zoomAnimated) {
+  			events.zoomanim = this._animateZoom;
+  		}
+
+  		return events;
+  	},
+
+  	// @method setZIndex(value: Number): this
+  	// Changes the [zIndex](#imageoverlay-zindex) of the image overlay.
+  	setZIndex: function (value) {
+  		this.options.zIndex = value;
+  		this._updateZIndex();
+  		return this;
+  	},
+
+  	// @method getBounds(): LatLngBounds
+  	// Get the bounds that this ImageOverlay covers
+  	getBounds: function () {
+  		return this._bounds;
+  	},
+
+  	// @method getElement(): HTMLElement
+  	// Returns the instance of [`HTMLImageElement`](https://developer.mozilla.org/docs/Web/API/HTMLImageElement)
+  	// used by this overlay.
+  	getElement: function () {
+  		return this._image;
+  	},
+
+  	_initImage: function () {
+  		var wasElementSupplied = this._url.tagName === 'IMG';
+  		var img = this._image = wasElementSupplied ? this._url : create$1('img');
+
+  		addClass(img, 'leaflet-image-layer');
+  		if (this._zoomAnimated) { addClass(img, 'leaflet-zoom-animated'); }
+  		if (this.options.className) { addClass(img, this.options.className); }
+
+  		img.onselectstart = falseFn;
+  		img.onmousemove = falseFn;
+
+  		// @event load: Event
+  		// Fired when the ImageOverlay layer has loaded its image
+  		img.onload = bind(this.fire, this, 'load');
+  		img.onerror = bind(this._overlayOnError, this, 'error');
+
+  		if (this.options.crossOrigin || this.options.crossOrigin === '') {
+  			img.crossOrigin = this.options.crossOrigin === true ? '' : this.options.crossOrigin;
+  		}
+
+  		if (this.options.zIndex) {
+  			this._updateZIndex();
+  		}
+
+  		if (wasElementSupplied) {
+  			this._url = img.src;
+  			return;
+  		}
+
+  		img.src = this._url;
+  		img.alt = this.options.alt;
+  	},
+
+  	_animateZoom: function (e) {
+  		var scale = this._map.getZoomScale(e.zoom),
+  		    offset = this._map._latLngBoundsToNewLayerBounds(this._bounds, e.zoom, e.center).min;
+
+  		setTransform(this._image, offset, scale);
+  	},
+
+  	_reset: function () {
+  		var image = this._image,
+  		    bounds = new Bounds(
+  		        this._map.latLngToLayerPoint(this._bounds.getNorthWest()),
+  		        this._map.latLngToLayerPoint(this._bounds.getSouthEast())),
+  		    size = bounds.getSize();
+
+  		setPosition(image, bounds.min);
+
+  		image.style.width  = size.x + 'px';
+  		image.style.height = size.y + 'px';
+  	},
+
+  	_updateOpacity: function () {
+  		setOpacity(this._image, this.options.opacity);
+  	},
+
+  	_updateZIndex: function () {
+  		if (this._image && this.options.zIndex !== undefined && this.options.zIndex !== null) {
+  			this._image.style.zIndex = this.options.zIndex;
+  		}
+  	},
+
+  	_overlayOnError: function () {
+  		// @event error: Event
+  		// Fired when the ImageOverlay layer fails to load its image
+  		this.fire('error');
+
+  		var errorUrl = this.options.errorOverlayUrl;
+  		if (errorUrl && this._url !== errorUrl) {
+  			this._url = errorUrl;
+  			this._image.src = errorUrl;
+  		}
+  	}
+  });
+
+  // @factory L.imageOverlay(imageUrl: String, bounds: LatLngBounds, options?: ImageOverlay options)
+  // Instantiates an image overlay object given the URL of the image and the
+  // geographical bounds it is tied to.
+  var imageOverlay = function (url, bounds, options) {
+  	return new ImageOverlay(url, bounds, options);
+  };
+
+  /*
+   * @class VideoOverlay
+   * @aka L.VideoOverlay
+   * @inherits ImageOverlay
+   *
+   * Used to load and display a video player over specific bounds of the map. Extends `ImageOverlay`.
+   *
+   * A video overlay uses the [`<video>`](https://developer.mozilla.org/docs/Web/HTML/Element/video)
+   * HTML5 element.
+   *
+   * @example
+   *
+   * ```js
+   * var videoUrl = 'https://www.mapbox.com/bites/00188/patricia_nasa.webm',
+   * 	videoBounds = [[ 32, -130], [ 13, -100]];
+   * L.videoOverlay(videoUrl, videoBounds ).addTo(map);
+   * ```
+   */
+
+  var VideoOverlay = ImageOverlay.extend({
+
+  	// @section
+  	// @aka VideoOverlay options
+  	options: {
+  		// @option autoplay: Boolean = true
+  		// Whether the video starts playing automatically when loaded.
+  		autoplay: true,
+
+  		// @option loop: Boolean = true
+  		// Whether the video will loop back to the beginning when played.
+  		loop: true,
+
+  		// @option keepAspectRatio: Boolean = true
+  		// Whether the video will save aspect ratio after the projection.
+  		// Relevant for supported browsers. Browser compatibility- https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit
+  		keepAspectRatio: true,
+
+  		// @option muted: Boolean = false
+  		// Whether the video starts on mute when loaded.
+  		muted: false
+  	},
+
+  	_initImage: function () {
+  		var wasElementSupplied = this._url.tagName === 'VIDEO';
+  		var vid = this._image = wasElementSupplied ? this._url : create$1('video');
+
+  		addClass(vid, 'leaflet-image-layer');
+  		if (this._zoomAnimated) { addClass(vid, 'leaflet-zoom-animated'); }
+  		if (this.options.className) { addClass(vid, this.options.className); }
+
+  		vid.onselectstart = falseFn;
+  		vid.onmousemove = falseFn;
+
+  		// @event load: Event
+  		// Fired when the video has finished loading the first frame
+  		vid.onloadeddata = bind(this.fire, this, 'load');
+
+  		if (wasElementSupplied) {
+  			var sourceElements = vid.getElementsByTagName('source');
+  			var sources = [];
+  			for (var j = 0; j < sourceElements.length; j++) {
+  				sources.push(sourceElements[j].src);
+  			}
+
+  			this._url = (sourceElements.length > 0) ? sources : [vid.src];
+  			return;
+  		}
+
+  		if (!isArray(this._url)) { this._url = [this._url]; }
+
+  		if (!this.options.keepAspectRatio && Object.prototype.hasOwnProperty.call(vid.style, 'objectFit')) {
+  			vid.style['objectFit'] = 'fill';
+  		}
+  		vid.autoplay = !!this.options.autoplay;
+  		vid.loop = !!this.options.loop;
+  		vid.muted = !!this.options.muted;
+  		for (var i = 0; i < this._url.length; i++) {
+  			var source = create$1('source');
+  			source.src = this._url[i];
+  			vid.appendChild(source);
+  		}
+  	}
+
+  	// @method getElement(): HTMLVideoElement
+  	// Returns the instance of [`HTMLVideoElement`](https://developer.mozilla.org/docs/Web/API/HTMLVideoElement)
+  	// used by this overlay.
+  });
+
+
+  // @factory L.videoOverlay(video: String|Array|HTMLVideoElement, bounds: LatLngBounds, options?: VideoOverlay options)
+  // Instantiates an image overlay object given the URL of the video (or array of URLs, or even a video element) and the
+  // geographical bounds it is tied to.
+
+  function videoOverlay(video, bounds, options) {
+  	return new VideoOverlay(video, bounds, options);
+  }
+
+  /*
+   * @class SVGOverlay
+   * @aka L.SVGOverlay
+   * @inherits ImageOverlay
+   *
+   * Used to load, display and provide DOM access to an SVG file over specific bounds of the map. Extends `ImageOverlay`.
+   *
+   * An SVG overlay uses the [`<svg>`](https://developer.mozilla.org/docs/Web/SVG/Element/svg) element.
+   *
+   * @example
+   *
+   * ```js
+   * var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
+   * svgElement.setAttribute('xmlns', "http://www.w3.org/2000/svg");
+   * svgElement.setAttribute('viewBox', "0 0 200 200");
+   * svgElement.innerHTML = '<rect width="200" height="200"/><rect x="75" y="23" width="50" height="50" style="fill:red"/><rect x="75" y="123" width="50" height="50" style="fill:#0013ff"/>';
+   * var svgElementBounds = [ [ 32, -130 ], [ 13, -100 ] ];
+   * L.svgOverlay(svgElement, svgElementBounds).addTo(map);
+   * ```
+   */
+
+  var SVGOverlay = ImageOverlay.extend({
+  	_initImage: function () {
+  		var el = this._image = this._url;
+
+  		addClass(el, 'leaflet-image-layer');
+  		if (this._zoomAnimated) { addClass(el, 'leaflet-zoom-animated'); }
+  		if (this.options.className) { addClass(el, this.options.className); }
+
+  		el.onselectstart = falseFn;
+  		el.onmousemove = falseFn;
+  	}
+
+  	// @method getElement(): SVGElement
+  	// Returns the instance of [`SVGElement`](https://developer.mozilla.org/docs/Web/API/SVGElement)
+  	// used by this overlay.
+  });
+
+
+  // @factory L.svgOverlay(svg: String|SVGElement, bounds: LatLngBounds, options?: SVGOverlay options)
+  // Instantiates an image overlay object given an SVG element and the geographical bounds it is tied to.
+  // A viewBox attribute is required on the SVG element to zoom in and out properly.
+
+  function svgOverlay(el, bounds, options) {
+  	return new SVGOverlay(el, bounds, options);
+  }
+
+  /*
+   * @class DivOverlay
+   * @inherits Layer
+   * @aka L.DivOverlay
+   * Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.
+   */
+
+  // @namespace DivOverlay
+  var DivOverlay = Layer.extend({
+
+  	// @section
+  	// @aka DivOverlay options
+  	options: {
+  		// @option offset: Point = Point(0, 7)
+  		// The offset of the popup position. Useful to control the anchor
+  		// of the popup when opening it on some overlays.
+  		offset: [0, 7],
+
+  		// @option className: String = ''
+  		// A custom CSS class name to assign to the popup.
+  		className: '',
+
+  		// @option pane: String = 'popupPane'
+  		// `Map pane` where the popup will be added.
+  		pane: 'popupPane'
+  	},
+
+  	initialize: function (options, source) {
+  		setOptions(this, options);
+
+  		this._source = source;
+  	},
+
+  	onAdd: function (map) {
+  		this._zoomAnimated = map._zoomAnimated;
+
+  		if (!this._container) {
+  			this._initLayout();
+  		}
+
+  		if (map._fadeAnimated) {
+  			setOpacity(this._container, 0);
+  		}
+
+  		clearTimeout(this._removeTimeout);
+  		this.getPane().appendChild(this._container);
+  		this.update();
+
+  		if (map._fadeAnimated) {
+  			setOpacity(this._container, 1);
+  		}
+
+  		this.bringToFront();
+  	},
+
+  	onRemove: function (map) {
+  		if (map._fadeAnimated) {
+  			setOpacity(this._container, 0);
+  			this._removeTimeout = setTimeout(bind(remove, undefined, this._container), 200);
+  		} else {
+  			remove(this._container);
+  		}
+  	},
+
+  	// @namespace Popup
+  	// @method getLatLng: LatLng
+  	// Returns the geographical point of popup.
+  	getLatLng: function () {
+  		return this._latlng;
+  	},
+
+  	// @method setLatLng(latlng: LatLng): this
+  	// Sets the geographical point where the popup will open.
+  	setLatLng: function (latlng) {
+  		this._latlng = toLatLng(latlng);
+  		if (this._map) {
+  			this._updatePosition();
+  			this._adjustPan();
+  		}
+  		return this;
+  	},
+
+  	// @method getContent: String|HTMLElement
+  	// Returns the content of the popup.
+  	getContent: function () {
+  		return this._content;
+  	},
+
+  	// @method setContent(htmlContent: String|HTMLElement|Function): this
+  	// Sets the HTML content of the popup. If a function is passed the source layer will be passed to the function. The function should return a `String` or `HTMLElement` to be used in the popup.
+  	setContent: function (content) {
+  		this._content = content;
+  		this.update();
+  		return this;
+  	},
+
+  	// @method getElement: String|HTMLElement
+  	// Returns the HTML container of the popup.
+  	getElement: function () {
+  		return this._container;
+  	},
+
+  	// @method update: null
+  	// Updates the popup content, layout and position. Useful for updating the popup after something inside changed, e.g. image loaded.
+  	update: function () {
+  		if (!this._map) { return; }
+
+  		this._container.style.visibility = 'hidden';
+
+  		this._updateContent();
+  		this._updateLayout();
+  		this._updatePosition();
+
+  		this._container.style.visibility = '';
+
+  		this._adjustPan();
+  	},
+
+  	getEvents: function () {
+  		var events = {
+  			zoom: this._updatePosition,
+  			viewreset: this._updatePosition
+  		};
+
+  		if (this._zoomAnimated) {
+  			events.zoomanim = this._animateZoom;
+  		}
+  		return events;
+  	},
+
+  	// @method isOpen: Boolean
+  	// Returns `true` when the popup is visible on the map.
+  	isOpen: function () {
+  		return !!this._map && this._map.hasLayer(this);
+  	},
+
+  	// @method bringToFront: this
+  	// Brings this popup in front of other popups (in the same map pane).
+  	bringToFront: function () {
+  		if (this._map) {
+  			toFront(this._container);
+  		}
+  		return this;
+  	},
+
+  	// @method bringToBack: this
+  	// Brings this popup to the back of other popups (in the same map pane).
+  	bringToBack: function () {
+  		if (this._map) {
+  			toBack(this._container);
+  		}
+  		return this;
+  	},
+
+  	_prepareOpen: function (parent, layer, latlng) {
+  		if (!(layer instanceof Layer)) {
+  			latlng = layer;
+  			layer = parent;
+  		}
+
+  		if (layer instanceof FeatureGroup) {
+  			for (var id in parent._layers) {
+  				layer = parent._layers[id];
+  				break;
+  			}
+  		}
+
+  		if (!latlng) {
+  			if (layer.getCenter) {
+  				latlng = layer.getCenter();
+  			} else if (layer.getLatLng) {
+  				latlng = layer.getLatLng();
+  			} else {
+  				throw new Error('Unable to get source layer LatLng.');
+  			}
+  		}
+
+  		// set overlay source to this layer
+  		this._source = layer;
+
+  		// update the overlay (content, layout, ect...)
+  		this.update();
+
+  		return latlng;
+  	},
+
+  	_updateContent: function () {
+  		if (!this._content) { return; }
+
+  		var node = this._contentNode;
+  		var content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content;
+
+  		if (typeof content === 'string') {
+  			node.innerHTML = content;
+  		} else {
+  			while (node.hasChildNodes()) {
+  				node.removeChild(node.firstChild);
+  			}
+  			node.appendChild(content);
+  		}
+  		this.fire('contentupdate');
+  	},
+
+  	_updatePosition: function () {
+  		if (!this._map) { return; }
+
+  		var pos = this._map.latLngToLayerPoint(this._latlng),
+  		    offset = toPoint(this.options.offset),
+  		    anchor = this._getAnchor();
+
+  		if (this._zoomAnimated) {
+  			setPosition(this._container, pos.add(anchor));
+  		} else {
+  			offset = offset.add(pos).add(anchor);
+  		}
+
+  		var bottom = this._containerBottom = -offset.y,
+  		    left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x;
+
+  		// bottom position the popup in case the height of the popup changes (images loading etc)
+  		this._container.style.bottom = bottom + 'px';
+  		this._container.style.left = left + 'px';
+  	},
+
+  	_getAnchor: function () {
+  		return [0, 0];
+  	}
+
+  });
+
+  /*
+   * @class Popup
+   * @inherits DivOverlay
+   * @aka L.Popup
+   * Used to open popups in certain places of the map. Use [Map.openPopup](#map-openpopup) to
+   * open popups while making sure that only one popup is open at one time
+   * (recommended for usability), or use [Map.addLayer](#map-addlayer) to open as many as you want.
+   *
+   * @example
+   *
+   * If you want to just bind a popup to marker click and then open it, it's really easy:
+   *
+   * ```js
+   * marker.bindPopup(popupContent).openPopup();
+   * ```
+   * Path overlays like polylines also have a `bindPopup` method.
+   * Here's a more complicated way to open a popup on a map:
+   *
+   * ```js
+   * var popup = L.popup()
+   * 	.setLatLng(latlng)
+   * 	.setContent('<p>Hello world!<br />This is a nice popup.</p>')
+   * 	.openOn(map);
+   * ```
+   */
+
+
+  // @namespace Popup
+  var Popup = DivOverlay.extend({
+
+  	// @section
+  	// @aka Popup options
+  	options: {
+  		// @option maxWidth: Number = 300
+  		// Max width of the popup, in pixels.
+  		maxWidth: 300,
+
+  		// @option minWidth: Number = 50
+  		// Min width of the popup, in pixels.
+  		minWidth: 50,
+
+  		// @option maxHeight: Number = null
+  		// If set, creates a scrollable container of the given height
+  		// inside a popup if its content exceeds it.
+  		maxHeight: null,
+
+  		// @option autoPan: Boolean = true
+  		// Set it to `false` if you don't want the map to do panning animation
+  		// to fit the opened popup.
+  		autoPan: true,
+
+  		// @option autoPanPaddingTopLeft: Point = null
+  		// The margin between the popup and the top left corner of the map
+  		// view after autopanning was performed.
+  		autoPanPaddingTopLeft: null,
+
+  		// @option autoPanPaddingBottomRight: Point = null
+  		// The margin between the popup and the bottom right corner of the map
+  		// view after autopanning was performed.
+  		autoPanPaddingBottomRight: null,
+
+  		// @option autoPanPadding: Point = Point(5, 5)
+  		// Equivalent of setting both top left and bottom right autopan padding to the same value.
+  		autoPanPadding: [5, 5],
+
+  		// @option keepInView: Boolean = false
+  		// Set it to `true` if you want to prevent users from panning the popup
+  		// off of the screen while it is open.
+  		keepInView: false,
+
+  		// @option closeButton: Boolean = true
+  		// Controls the presence of a close button in the popup.
+  		closeButton: true,
+
+  		// @option autoClose: Boolean = true
+  		// Set it to `false` if you want to override the default behavior of
+  		// the popup closing when another popup is opened.
+  		autoClose: true,
+
+  		// @option closeOnEscapeKey: Boolean = true
+  		// Set it to `false` if you want to override the default behavior of
+  		// the ESC key for closing of the popup.
+  		closeOnEscapeKey: true,
+
+  		// @option closeOnClick: Boolean = *
+  		// Set it if you want to override the default behavior of the popup closing when user clicks
+  		// on the map. Defaults to the map's [`closePopupOnClick`](#map-closepopuponclick) option.
+
+  		// @option className: String = ''
+  		// A custom CSS class name to assign to the popup.
+  		className: ''
+  	},
+
+  	// @namespace Popup
+  	// @method openOn(map: Map): this
+  	// Adds the popup to the map and closes the previous one. The same as `map.openPopup(popup)`.
+  	openOn: function (map) {
+  		map.openPopup(this);
+  		return this;
+  	},
+
+  	onAdd: function (map) {
+  		DivOverlay.prototype.onAdd.call(this, map);
+
+  		// @namespace Map
+  		// @section Popup events
+  		// @event popupopen: PopupEvent
+  		// Fired when a popup is opened in the map
+  		map.fire('popupopen', {popup: this});
+
+  		if (this._source) {
+  			// @namespace Layer
+  			// @section Popup events
+  			// @event popupopen: PopupEvent
+  			// Fired when a popup bound to this layer is opened
+  			this._source.fire('popupopen', {popup: this}, true);
+  			// For non-path layers, we toggle the popup when clicking
+  			// again the layer, so prevent the map to reopen it.
+  			if (!(this._source instanceof Path)) {
+  				this._source.on('preclick', stopPropagation);
+  			}
+  		}
+  	},
+
+  	onRemove: function (map) {
+  		DivOverlay.prototype.onRemove.call(this, map);
+
+  		// @namespace Map
+  		// @section Popup events
+  		// @event popupclose: PopupEvent
+  		// Fired when a popup in the map is closed
+  		map.fire('popupclose', {popup: this});
+
+  		if (this._source) {
+  			// @namespace Layer
+  			// @section Popup events
+  			// @event popupclose: PopupEvent
+  			// Fired when a popup bound to this layer is closed
+  			this._source.fire('popupclose', {popup: this}, true);
+  			if (!(this._source instanceof Path)) {
+  				this._source.off('preclick', stopPropagation);
+  			}
+  		}
+  	},
+
+  	getEvents: function () {
+  		var events = DivOverlay.prototype.getEvents.call(this);
+
+  		if (this.options.closeOnClick !== undefined ? this.options.closeOnClick : this._map.options.closePopupOnClick) {
+  			events.preclick = this._close;
+  		}
+
+  		if (this.options.keepInView) {
+  			events.moveend = this._adjustPan;
+  		}
+
+  		return events;
+  	},
+
+  	_close: function () {
+  		if (this._map) {
+  			this._map.closePopup(this);
+  		}
+  	},
+
+  	_initLayout: function () {
+  		var prefix = 'leaflet-popup',
+  		    container = this._container = create$1('div',
+  			prefix + ' ' + (this.options.className || '') +
+  			' leaflet-zoom-animated');
+
+  		var wrapper = this._wrapper = create$1('div', prefix + '-content-wrapper', container);
+  		this._contentNode = create$1('div', prefix + '-content', wrapper);
+
+  		disableClickPropagation(container);
+  		disableScrollPropagation(this._contentNode);
+  		on(container, 'contextmenu', stopPropagation);
+
+  		this._tipContainer = create$1('div', prefix + '-tip-container', container);
+  		this._tip = create$1('div', prefix + '-tip', this._tipContainer);
+
+  		if (this.options.closeButton) {
+  			var closeButton = this._closeButton = create$1('a', prefix + '-close-button', container);
+  			closeButton.href = '#close';
+  			closeButton.innerHTML = '&#215;';
+
+  			on(closeButton, 'click', this._onCloseButtonClick, this);
+  		}
+  	},
+
+  	_updateLayout: function () {
+  		var container = this._contentNode,
+  		    style = container.style;
+
+  		style.width = '';
+  		style.whiteSpace = 'nowrap';
+
+  		var width = container.offsetWidth;
+  		width = Math.min(width, this.options.maxWidth);
+  		width = Math.max(width, this.options.minWidth);
+
+  		style.width = (width + 1) + 'px';
+  		style.whiteSpace = '';
+
+  		style.height = '';
+
+  		var height = container.offsetHeight,
+  		    maxHeight = this.options.maxHeight,
+  		    scrolledClass = 'leaflet-popup-scrolled';
+
+  		if (maxHeight && height > maxHeight) {
+  			style.height = maxHeight + 'px';
+  			addClass(container, scrolledClass);
+  		} else {
+  			removeClass(container, scrolledClass);
+  		}
+
+  		this._containerWidth = this._container.offsetWidth;
+  	},
+
+  	_animateZoom: function (e) {
+  		var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center),
+  		    anchor = this._getAnchor();
+  		setPosition(this._container, pos.add(anchor));
+  	},
+
+  	_adjustPan: function () {
+  		if (!this.options.autoPan) { return; }
+  		if (this._map._panAnim) { this._map._panAnim.stop(); }
+
+  		var map = this._map,
+  		    marginBottom = parseInt(getStyle(this._container, 'marginBottom'), 10) || 0,
+  		    containerHeight = this._container.offsetHeight + marginBottom,
+  		    containerWidth = this._containerWidth,
+  		    layerPos = new Point(this._containerLeft, -containerHeight - this._containerBottom);
+
+  		layerPos._add(getPosition(this._container));
+
+  		var containerPos = map.layerPointToContainerPoint(layerPos),
+  		    padding = toPoint(this.options.autoPanPadding),
+  		    paddingTL = toPoint(this.options.autoPanPaddingTopLeft || padding),
+  		    paddingBR = toPoint(this.options.autoPanPaddingBottomRight || padding),
+  		    size = map.getSize(),
+  		    dx = 0,
+  		    dy = 0;
+
+  		if (containerPos.x + containerWidth + paddingBR.x > size.x) { // right
+  			dx = containerPos.x + containerWidth - size.x + paddingBR.x;
+  		}
+  		if (containerPos.x - dx - paddingTL.x < 0) { // left
+  			dx = containerPos.x - paddingTL.x;
+  		}
+  		if (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom
+  			dy = containerPos.y + containerHeight - size.y + paddingBR.y;
+  		}
+  		if (containerPos.y - dy - paddingTL.y < 0) { // top
+  			dy = containerPos.y - paddingTL.y;
+  		}
+
+  		// @namespace Map
+  		// @section Popup events
+  		// @event autopanstart: Event
+  		// Fired when the map starts autopanning when opening a popup.
+  		if (dx || dy) {
+  			map
+  			    .fire('autopanstart')
+  			    .panBy([dx, dy]);
+  		}
+  	},
+
+  	_onCloseButtonClick: function (e) {
+  		this._close();
+  		stop(e);
+  	},
+
+  	_getAnchor: function () {
+  		// Where should we anchor the popup on the source layer?
+  		return toPoint(this._source && this._source._getPopupAnchor ? this._source._getPopupAnchor() : [0, 0]);
+  	}
+
+  });
+
+  // @namespace Popup
+  // @factory L.popup(options?: Popup options, source?: Layer)
+  // Instantiates a `Popup` object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the popup with a reference to the Layer to which it refers.
+  var popup = function (options, source) {
+  	return new Popup(options, source);
+  };
+
+
+  /* @namespace Map
+   * @section Interaction Options
+   * @option closePopupOnClick: Boolean = true
+   * Set it to `false` if you don't want popups to close when user clicks the map.
+   */
+  Map.mergeOptions({
+  	closePopupOnClick: true
+  });
+
+
+  // @namespace Map
+  // @section Methods for Layers and Controls
+  Map.include({
+  	// @method openPopup(popup: Popup): this
+  	// Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).
+  	// @alternative
+  	// @method openPopup(content: String|HTMLElement, latlng: LatLng, options?: Popup options): this
+  	// Creates a popup with the specified content and options and opens it in the given point on a map.
+  	openPopup: function (popup, latlng, options) {
+  		if (!(popup instanceof Popup)) {
+  			popup = new Popup(options).setContent(popup);
+  		}
+
+  		if (latlng) {
+  			popup.setLatLng(latlng);
+  		}
+
+  		if (this.hasLayer(popup)) {
+  			return this;
+  		}
+
+  		if (this._popup && this._popup.options.autoClose) {
+  			this.closePopup();
+  		}
+
+  		this._popup = popup;
+  		return this.addLayer(popup);
+  	},
+
+  	// @method closePopup(popup?: Popup): this
+  	// Closes the popup previously opened with [openPopup](#map-openpopup) (or the given one).
+  	closePopup: function (popup) {
+  		if (!popup || popup === this._popup) {
+  			popup = this._popup;
+  			this._popup = null;
+  		}
+  		if (popup) {
+  			this.removeLayer(popup);
+  		}
+  		return this;
+  	}
+  });
+
+  /*
+   * @namespace Layer
+   * @section Popup methods example
+   *
+   * All layers share a set of methods convenient for binding popups to it.
+   *
+   * ```js
+   * var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);
+   * layer.openPopup();
+   * layer.closePopup();
+   * ```
+   *
+   * Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.
+   */
+
+  // @section Popup methods
+  Layer.include({
+
+  	// @method bindPopup(content: String|HTMLElement|Function|Popup, options?: Popup options): this
+  	// Binds a popup to the layer with the passed `content` and sets up the
+  	// necessary event listeners. If a `Function` is passed it will receive
+  	// the layer as the first argument and should return a `String` or `HTMLElement`.
+  	bindPopup: function (content, options) {
+
+  		if (content instanceof Popup) {
+  			setOptions(content, options);
+  			this._popup = content;
+  			content._source = this;
+  		} else {
+  			if (!this._popup || options) {
+  				this._popup = new Popup(options, this);
+  			}
+  			this._popup.setContent(content);
+  		}
+
+  		if (!this._popupHandlersAdded) {
+  			this.on({
+  				click: this._openPopup,
+  				keypress: this._onKeyPress,
+  				remove: this.closePopup,
+  				move: this._movePopup
+  			});
+  			this._popupHandlersAdded = true;
+  		}
+
+  		return this;
+  	},
+
+  	// @method unbindPopup(): this
+  	// Removes the popup previously bound with `bindPopup`.
+  	unbindPopup: function () {
+  		if (this._popup) {
+  			this.off({
+  				click: this._openPopup,
+  				keypress: this._onKeyPress,
+  				remove: this.closePopup,
+  				move: this._movePopup
+  			});
+  			this._popupHandlersAdded = false;
+  			this._popup = null;
+  		}
+  		return this;
+  	},
+
+  	// @method openPopup(latlng?: LatLng): this
+  	// Opens the bound popup at the specified `latlng` or at the default popup anchor if no `latlng` is passed.
+  	openPopup: function (layer, latlng) {
+  		if (this._popup && this._map) {
+  			latlng = this._popup._prepareOpen(this, layer, latlng);
+
+  			// open the popup on the map
+  			this._map.openPopup(this._popup, latlng);
+  		}
+
+  		return this;
+  	},
+
+  	// @method closePopup(): this
+  	// Closes the popup bound to this layer if it is open.
+  	closePopup: function () {
+  		if (this._popup) {
+  			this._popup._close();
+  		}
+  		return this;
+  	},
+
+  	// @method togglePopup(): this
+  	// Opens or closes the popup bound to this layer depending on its current state.
+  	togglePopup: function (target) {
+  		if (this._popup) {
+  			if (this._popup._map) {
+  				this.closePopup();
+  			} else {
+  				this.openPopup(target);
+  			}
+  		}
+  		return this;
+  	},
+
+  	// @method isPopupOpen(): boolean
+  	// Returns `true` if the popup bound to this layer is currently open.
+  	isPopupOpen: function () {
+  		return (this._popup ? this._popup.isOpen() : false);
+  	},
+
+  	// @method setPopupContent(content: String|HTMLElement|Popup): this
+  	// Sets the content of the popup bound to this layer.
+  	setPopupContent: function (content) {
+  		if (this._popup) {
+  			this._popup.setContent(content);
+  		}
+  		return this;
+  	},
+
+  	// @method getPopup(): Popup
+  	// Returns the popup bound to this layer.
+  	getPopup: function () {
+  		return this._popup;
+  	},
+
+  	_openPopup: function (e) {
+  		var layer = e.layer || e.target;
+
+  		if (!this._popup) {
+  			return;
+  		}
+
+  		if (!this._map) {
+  			return;
+  		}
+
+  		// prevent map click
+  		stop(e);
+
+  		// if this inherits from Path its a vector and we can just
+  		// open the popup at the new location
+  		if (layer instanceof Path) {
+  			this.openPopup(e.layer || e.target, e.latlng);
+  			return;
+  		}
+
+  		// otherwise treat it like a marker and figure out
+  		// if we should toggle it open/closed
+  		if (this._map.hasLayer(this._popup) && this._popup._source === layer) {
+  			this.closePopup();
+  		} else {
+  			this.openPopup(layer, e.latlng);
+  		}
+  	},
+
+  	_movePopup: function (e) {
+  		this._popup.setLatLng(e.latlng);
+  	},
+
+  	_onKeyPress: function (e) {
+  		if (e.originalEvent.keyCode === 13) {
+  			this._openPopup(e);
+  		}
+  	}
+  });
+
+  /*
+   * @class Tooltip
+   * @inherits DivOverlay
+   * @aka L.Tooltip
+   * Used to display small texts on top of map layers.
+   *
+   * @example
+   *
+   * ```js
+   * marker.bindTooltip("my tooltip text").openTooltip();
+   * ```
+   * Note about tooltip offset. Leaflet takes two options in consideration
+   * for computing tooltip offsetting:
+   * - the `offset` Tooltip option: it defaults to [0, 0], and it's specific to one tooltip.
+   *   Add a positive x offset to move the tooltip to the right, and a positive y offset to
+   *   move it to the bottom. Negatives will move to the left and top.
+   * - the `tooltipAnchor` Icon option: this will only be considered for Marker. You
+   *   should adapt this value if you use a custom icon.
+   */
+
+
+  // @namespace Tooltip
+  var Tooltip = DivOverlay.extend({
+
+  	// @section
+  	// @aka Tooltip options
+  	options: {
+  		// @option pane: String = 'tooltipPane'
+  		// `Map pane` where the tooltip will be added.
+  		pane: 'tooltipPane',
+
+  		// @option offset: Point = Point(0, 0)
+  		// Optional offset of the tooltip position.
+  		offset: [0, 0],
+
+  		// @option direction: String = 'auto'
+  		// Direction where to open the tooltip. Possible values are: `right`, `left`,
+  		// `top`, `bottom`, `center`, `auto`.
+  		// `auto` will dynamically switch between `right` and `left` according to the tooltip
+  		// position on the map.
+  		direction: 'auto',
+
+  		// @option permanent: Boolean = false
+  		// Whether to open the tooltip permanently or only on mouseover.
+  		permanent: false,
+
+  		// @option sticky: Boolean = false
+  		// If true, the tooltip will follow the mouse instead of being fixed at the feature center.
+  		sticky: false,
+
+  		// @option interactive: Boolean = false
+  		// If true, the tooltip will listen to the feature events.
+  		interactive: false,
+
+  		// @option opacity: Number = 0.9
+  		// Tooltip container opacity.
+  		opacity: 0.9
+  	},
+
+  	onAdd: function (map) {
+  		DivOverlay.prototype.onAdd.call(this, map);
+  		this.setOpacity(this.options.opacity);
+
+  		// @namespace Map
+  		// @section Tooltip events
+  		// @event tooltipopen: TooltipEvent
+  		// Fired when a tooltip is opened in the map.
+  		map.fire('tooltipopen', {tooltip: this});
+
+  		if (this._source) {
+  			// @namespace Layer
+  			// @section Tooltip events
+  			// @event tooltipopen: TooltipEvent
+  			// Fired when a tooltip bound to this layer is opened.
+  			this._source.fire('tooltipopen', {tooltip: this}, true);
+  		}
+  	},
+
+  	onRemove: function (map) {
+  		DivOverlay.prototype.onRemove.call(this, map);
+
+  		// @namespace Map
+  		// @section Tooltip events
+  		// @event tooltipclose: TooltipEvent
+  		// Fired when a tooltip in the map is closed.
+  		map.fire('tooltipclose', {tooltip: this});
+
+  		if (this._source) {
+  			// @namespace Layer
+  			// @section Tooltip events
+  			// @event tooltipclose: TooltipEvent
+  			// Fired when a tooltip bound to this layer is closed.
+  			this._source.fire('tooltipclose', {tooltip: this}, true);
+  		}
+  	},
+
+  	getEvents: function () {
+  		var events = DivOverlay.prototype.getEvents.call(this);
+
+  		if (touch && !this.options.permanent) {
+  			events.preclick = this._close;
+  		}
+
+  		return events;
+  	},
+
+  	_close: function () {
+  		if (this._map) {
+  			this._map.closeTooltip(this);
+  		}
+  	},
+
+  	_initLayout: function () {
+  		var prefix = 'leaflet-tooltip',
+  		    className = prefix + ' ' + (this.options.className || '') + ' leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');
+
+  		this._contentNode = this._container = create$1('div', className);
+  	},
+
+  	_updateLayout: function () {},
+
+  	_adjustPan: function () {},
+
+  	_setPosition: function (pos) {
+  		var subX, subY,
+  		    map = this._map,
+  		    container = this._container,
+  		    centerPoint = map.latLngToContainerPoint(map.getCenter()),
+  		    tooltipPoint = map.layerPointToContainerPoint(pos),
+  		    direction = this.options.direction,
+  		    tooltipWidth = container.offsetWidth,
+  		    tooltipHeight = container.offsetHeight,
+  		    offset = toPoint(this.options.offset),
+  		    anchor = this._getAnchor();
+
+  		if (direction === 'top') {
+  			subX = tooltipWidth / 2;
+  			subY = tooltipHeight;
+  		} else if (direction === 'bottom') {
+  			subX = tooltipWidth / 2;
+  			subY = 0;
+  		} else if (direction === 'center') {
+  			subX = tooltipWidth / 2;
+  			subY = tooltipHeight / 2;
+  		} else if (direction === 'right') {
+  			subX = 0;
+  			subY = tooltipHeight / 2;
+  		} else if (direction === 'left') {
+  			subX = tooltipWidth;
+  			subY = tooltipHeight / 2;
+  		} else if (tooltipPoint.x < centerPoint.x) {
+  			direction = 'right';
+  			subX = 0;
+  			subY = tooltipHeight / 2;
+  		} else {
+  			direction = 'left';
+  			subX = tooltipWidth + (offset.x + anchor.x) * 2;
+  			subY = tooltipHeight / 2;
+  		}
+
+  		pos = pos.subtract(toPoint(subX, subY, true)).add(offset).add(anchor);
+
+  		removeClass(container, 'leaflet-tooltip-right');
+  		removeClass(container, 'leaflet-tooltip-left');
+  		removeClass(container, 'leaflet-tooltip-top');
+  		removeClass(container, 'leaflet-tooltip-bottom');
+  		addClass(container, 'leaflet-tooltip-' + direction);
+  		setPosition(container, pos);
+  	},
+
+  	_updatePosition: function () {
+  		var pos = this._map.latLngToLayerPoint(this._latlng);
+  		this._setPosition(pos);
+  	},
+
+  	setOpacity: function (opacity) {
+  		this.options.opacity = opacity;
+
+  		if (this._container) {
+  			setOpacity(this._container, opacity);
+  		}
+  	},
+
+  	_animateZoom: function (e) {
+  		var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center);
+  		this._setPosition(pos);
+  	},
+
+  	_getAnchor: function () {
+  		// Where should we anchor the tooltip on the source layer?
+  		return toPoint(this._source && this._source._getTooltipAnchor && !this.options.sticky ? this._source._getTooltipAnchor() : [0, 0]);
+  	}
+
+  });
+
+  // @namespace Tooltip
+  // @factory L.tooltip(options?: Tooltip options, source?: Layer)
+  // Instantiates a Tooltip object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the tooltip with a reference to the Layer to which it refers.
+  var tooltip = function (options, source) {
+  	return new Tooltip(options, source);
+  };
+
+  // @namespace Map
+  // @section Methods for Layers and Controls
+  Map.include({
+
+  	// @method openTooltip(tooltip: Tooltip): this
+  	// Opens the specified tooltip.
+  	// @alternative
+  	// @method openTooltip(content: String|HTMLElement, latlng: LatLng, options?: Tooltip options): this
+  	// Creates a tooltip with the specified content and options and open it.
+  	openTooltip: function (tooltip, latlng, options) {
+  		if (!(tooltip instanceof Tooltip)) {
+  			tooltip = new Tooltip(options).setContent(tooltip);
+  		}
+
+  		if (latlng) {
+  			tooltip.setLatLng(latlng);
+  		}
+
+  		if (this.hasLayer(tooltip)) {
+  			return this;
+  		}
+
+  		return this.addLayer(tooltip);
+  	},
+
+  	// @method closeTooltip(tooltip?: Tooltip): this
+  	// Closes the tooltip given as parameter.
+  	closeTooltip: function (tooltip) {
+  		if (tooltip) {
+  			this.removeLayer(tooltip);
+  		}
+  		return this;
+  	}
+
+  });
+
+  /*
+   * @namespace Layer
+   * @section Tooltip methods example
+   *
+   * All layers share a set of methods convenient for binding tooltips to it.
+   *
+   * ```js
+   * var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);
+   * layer.openTooltip();
+   * layer.closeTooltip();
+   * ```
+   */
+
+  // @section Tooltip methods
+  Layer.include({
+
+  	// @method bindTooltip(content: String|HTMLElement|Function|Tooltip, options?: Tooltip options): this
+  	// Binds a tooltip to the layer with the passed `content` and sets up the
+  	// necessary event listeners. If a `Function` is passed it will receive
+  	// the layer as the first argument and should return a `String` or `HTMLElement`.
+  	bindTooltip: function (content, options) {
+
+  		if (content instanceof Tooltip) {
+  			setOptions(content, options);
+  			this._tooltip = content;
+  			content._source = this;
+  		} else {
+  			if (!this._tooltip || options) {
+  				this._tooltip = new Tooltip(options, this);
+  			}
+  			this._tooltip.setContent(content);
+
+  		}
+
+  		this._initTooltipInteractions();
+
+  		if (this._tooltip.options.permanent && this._map && this._map.hasLayer(this)) {
+  			this.openTooltip();
+  		}
+
+  		return this;
+  	},
+
+  	// @method unbindTooltip(): this
+  	// Removes the tooltip previously bound with `bindTooltip`.
+  	unbindTooltip: function () {
+  		if (this._tooltip) {
+  			this._initTooltipInteractions(true);
+  			this.closeTooltip();
+  			this._tooltip = null;
+  		}
+  		return this;
+  	},
+
+  	_initTooltipInteractions: function (remove$$1) {
+  		if (!remove$$1 && this._tooltipHandlersAdded) { return; }
+  		var onOff = remove$$1 ? 'off' : 'on',
+  		    events = {
+  			remove: this.closeTooltip,
+  			move: this._moveTooltip
+  		    };
+  		if (!this._tooltip.options.permanent) {
+  			events.mouseover = this._openTooltip;
+  			events.mouseout = this.closeTooltip;
+  			if (this._tooltip.options.sticky) {
+  				events.mousemove = this._moveTooltip;
+  			}
+  			if (touch) {
+  				events.click = this._openTooltip;
+  			}
+  		} else {
+  			events.add = this._openTooltip;
+  		}
+  		this[onOff](events);
+  		this._tooltipHandlersAdded = !remove$$1;
+  	},
+
+  	// @method openTooltip(latlng?: LatLng): this
+  	// Opens the bound tooltip at the specified `latlng` or at the default tooltip anchor if no `latlng` is passed.
+  	openTooltip: function (layer, latlng) {
+  		if (this._tooltip && this._map) {
+  			latlng = this._tooltip._prepareOpen(this, layer, latlng);
+
+  			// open the tooltip on the map
+  			this._map.openTooltip(this._tooltip, latlng);
+
+  			// Tooltip container may not be defined if not permanent and never
+  			// opened.
+  			if (this._tooltip.options.interactive && this._tooltip._container) {
+  				addClass(this._tooltip._container, 'leaflet-clickable');
+  				this.addInteractiveTarget(this._tooltip._container);
+  			}
+  		}
+
+  		return this;
+  	},
+
+  	// @method closeTooltip(): this
+  	// Closes the tooltip bound to this layer if it is open.
+  	closeTooltip: function () {
+  		if (this._tooltip) {
+  			this._tooltip._close();
+  			if (this._tooltip.options.interactive && this._tooltip._container) {
+  				removeClass(this._tooltip._container, 'leaflet-clickable');
+  				this.removeInteractiveTarget(this._tooltip._container);
+  			}
+  		}
+  		return this;
+  	},
+
+  	// @method toggleTooltip(): this
+  	// Opens or closes the tooltip bound to this layer depending on its current state.
+  	toggleTooltip: function (target) {
+  		if (this._tooltip) {
+  			if (this._tooltip._map) {
+  				this.closeTooltip();
+  			} else {
+  				this.openTooltip(target);
+  			}
+  		}
+  		return this;
+  	},
+
+  	// @method isTooltipOpen(): boolean
+  	// Returns `true` if the tooltip bound to this layer is currently open.
+  	isTooltipOpen: function () {
+  		return this._tooltip.isOpen();
+  	},
+
+  	// @method setTooltipContent(content: String|HTMLElement|Tooltip): this
+  	// Sets the content of the tooltip bound to this layer.
+  	setTooltipContent: function (content) {
+  		if (this._tooltip) {
+  			this._tooltip.setContent(content);
+  		}
+  		return this;
+  	},
+
+  	// @method getTooltip(): Tooltip
+  	// Returns the tooltip bound to this layer.
+  	getTooltip: function () {
+  		return this._tooltip;
+  	},
+
+  	_openTooltip: function (e) {
+  		var layer = e.layer || e.target;
+
+  		if (!this._tooltip || !this._map) {
+  			return;
+  		}
+  		this.openTooltip(layer, this._tooltip.options.sticky ? e.latlng : undefined);
+  	},
+
+  	_moveTooltip: function (e) {
+  		var latlng = e.latlng, containerPoint, layerPoint;
+  		if (this._tooltip.options.sticky && e.originalEvent) {
+  			containerPoint = this._map.mouseEventToContainerPoint(e.originalEvent);
+  			layerPoint = this._map.containerPointToLayerPoint(containerPoint);
+  			latlng = this._map.layerPointToLatLng(layerPoint);
+  		}
+  		this._tooltip.setLatLng(latlng);
+  	}
+  });
+
+  /*
+   * @class DivIcon
+   * @aka L.DivIcon
+   * @inherits Icon
+   *
+   * Represents a lightweight icon for markers that uses a simple `<div>`
+   * element instead of an image. Inherits from `Icon` but ignores the `iconUrl` and shadow options.
+   *
+   * @example
+   * ```js
+   * var myIcon = L.divIcon({className: 'my-div-icon'});
+   * // you can set .my-div-icon styles in CSS
+   *
+   * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
+   * ```
+   *
+   * By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.
+   */
+
+  var DivIcon = Icon.extend({
+  	options: {
+  		// @section
+  		// @aka DivIcon options
+  		iconSize: [12, 12], // also can be set through CSS
+
+  		// iconAnchor: (Point),
+  		// popupAnchor: (Point),
+
+  		// @option html: String|HTMLElement = ''
+  		// Custom HTML code to put inside the div element, empty by default. Alternatively,
+  		// an instance of `HTMLElement`.
+  		html: false,
+
+  		// @option bgPos: Point = [0, 0]
+  		// Optional relative position of the background, in pixels
+  		bgPos: null,
+
+  		className: 'leaflet-div-icon'
+  	},
+
+  	createIcon: function (oldIcon) {
+  		var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),
+  		    options = this.options;
+
+  		if (options.html instanceof Element) {
+  			empty(div);
+  			div.appendChild(options.html);
+  		} else {
+  			div.innerHTML = options.html !== false ? options.html : '';
+  		}
+
+  		if (options.bgPos) {
+  			var bgPos = toPoint(options.bgPos);
+  			div.style.backgroundPosition = (-bgPos.x) + 'px ' + (-bgPos.y) + 'px';
+  		}
+  		this._setIconStyles(div, 'icon');
+
+  		return div;
+  	},
+
+  	createShadow: function () {
+  		return null;
+  	}
+  });
+
+  // @factory L.divIcon(options: DivIcon options)
+  // Creates a `DivIcon` instance with the given options.
+  function divIcon(options) {
+  	return new DivIcon(options);
+  }
+
+  Icon.Default = IconDefault;
+
+  /*
+   * @class GridLayer
+   * @inherits Layer
+   * @aka L.GridLayer
+   *
+   * Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces `TileLayer.Canvas`.
+   * GridLayer can be extended to create a tiled grid of HTML elements like `<canvas>`, `<img>` or `<div>`. GridLayer will handle creating and animating these DOM elements for you.
+   *
+   *
+   * @section Synchronous usage
+   * @example
+   *
+   * To create a custom layer, extend GridLayer and implement the `createTile()` method, which will be passed a `Point` object with the `x`, `y`, and `z` (zoom level) coordinates to draw your tile.
+   *
+   * ```js
+   * var CanvasLayer = L.GridLayer.extend({
+   *     createTile: function(coords){
+   *         // create a <canvas> element for drawing
+   *         var tile = L.DomUtil.create('canvas', 'leaflet-tile');
+   *
+   *         // setup tile width and height according to the options
+   *         var size = this.getTileSize();
+   *         tile.width = size.x;
+   *         tile.height = size.y;
+   *
+   *         // get a canvas context and draw something on it using coords.x, coords.y and coords.z
+   *         var ctx = tile.getContext('2d');
+   *
+   *         // return the tile so it can be rendered on screen
+   *         return tile;
+   *     }
+   * });
+   * ```
+   *
+   * @section Asynchronous usage
+   * @example
+   *
+   * Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the `done()` callback.
+   *
+   * ```js
+   * var CanvasLayer = L.GridLayer.extend({
+   *     createTile: function(coords, done){
+   *         var error;
+   *
+   *         // create a <canvas> element for drawing
+   *         var tile = L.DomUtil.create('canvas', 'leaflet-tile');
+   *
+   *         // setup tile width and height according to the options
+   *         var size = this.getTileSize();
+   *         tile.width = size.x;
+   *         tile.height = size.y;
+   *
+   *         // draw something asynchronously and pass the tile to the done() callback
+   *         setTimeout(function() {
+   *             done(error, tile);
+   *         }, 1000);
+   *
+   *         return tile;
+   *     }
+   * });
+   * ```
+   *
+   * @section
+   */
+
+
+  var GridLayer = Layer.extend({
+
+  	// @section
+  	// @aka GridLayer options
+  	options: {
+  		// @option tileSize: Number|Point = 256
+  		// Width and height of tiles in the grid. Use a number if width and height are equal, or `L.point(width, height)` otherwise.
+  		tileSize: 256,
+
+  		// @option opacity: Number = 1.0
+  		// Opacity of the tiles. Can be used in the `createTile()` function.
+  		opacity: 1,
+
+  		// @option updateWhenIdle: Boolean = (depends)
+  		// Load new tiles only when panning ends.
+  		// `true` by default on mobile browsers, in order to avoid too many requests and keep smooth navigation.
+  		// `false` otherwise in order to display new tiles _during_ panning, since it is easy to pan outside the
+  		// [`keepBuffer`](#gridlayer-keepbuffer) option in desktop browsers.
+  		updateWhenIdle: mobile,
+
+  		// @option updateWhenZooming: Boolean = true
+  		// By default, a smooth zoom animation (during a [touch zoom](#map-touchzoom) or a [`flyTo()`](#map-flyto)) will update grid layers every integer zoom level. Setting this option to `false` will update the grid layer only when the smooth animation ends.
+  		updateWhenZooming: true,
+
+  		// @option updateInterval: Number = 200
+  		// Tiles will not update more than once every `updateInterval` milliseconds when panning.
+  		updateInterval: 200,
+
+  		// @option zIndex: Number = 1
+  		// The explicit zIndex of the tile layer.
+  		zIndex: 1,
+
+  		// @option bounds: LatLngBounds = undefined
+  		// If set, tiles will only be loaded inside the set `LatLngBounds`.
+  		bounds: null,
+
+  		// @option minZoom: Number = 0
+  		// The minimum zoom level down to which this layer will be displayed (inclusive).
+  		minZoom: 0,
+
+  		// @option maxZoom: Number = undefined
+  		// The maximum zoom level up to which this layer will be displayed (inclusive).
+  		maxZoom: undefined,
+
+  		// @option maxNativeZoom: Number = undefined
+  		// Maximum zoom number the tile source has available. If it is specified,
+  		// the tiles on all zoom levels higher than `maxNativeZoom` will be loaded
+  		// from `maxNativeZoom` level and auto-scaled.
+  		maxNativeZoom: undefined,
+
+  		// @option minNativeZoom: Number = undefined
+  		// Minimum zoom number the tile source has available. If it is specified,
+  		// the tiles on all zoom levels lower than `minNativeZoom` will be loaded
+  		// from `minNativeZoom` level and auto-scaled.
+  		minNativeZoom: undefined,
+
+  		// @option noWrap: Boolean = false
+  		// Whether the layer is wrapped around the antimeridian. If `true`, the
+  		// GridLayer will only be displayed once at low zoom levels. Has no
+  		// effect when the [map CRS](#map-crs) doesn't wrap around. Can be used
+  		// in combination with [`bounds`](#gridlayer-bounds) to prevent requesting
+  		// tiles outside the CRS limits.
+  		noWrap: false,
+
+  		// @option pane: String = 'tilePane'
+  		// `Map pane` where the grid layer will be added.
+  		pane: 'tilePane',
+
+  		// @option className: String = ''
+  		// A custom class name to assign to the tile layer. Empty by default.
+  		className: '',
+
+  		// @option keepBuffer: Number = 2
+  		// When panning the map, keep this many rows and columns of tiles before unloading them.
+  		keepBuffer: 2
+  	},
+
+  	initialize: function (options) {
+  		setOptions(this, options);
+  	},
+
+  	onAdd: function () {
+  		this._initContainer();
+
+  		this._levels = {};
+  		this._tiles = {};
+
+  		this._resetView();
+  		this._update();
+  	},
+
+  	beforeAdd: function (map) {
+  		map._addZoomLimit(this);
+  	},
+
+  	onRemove: function (map) {
+  		this._removeAllTiles();
+  		remove(this._container);
+  		map._removeZoomLimit(this);
+  		this._container = null;
+  		this._tileZoom = undefined;
+  	},
+
+  	// @method bringToFront: this
+  	// Brings the tile layer to the top of all tile layers.
+  	bringToFront: function () {
+  		if (this._map) {
+  			toFront(this._container);
+  			this._setAutoZIndex(Math.max);
+  		}
+  		return this;
+  	},
+
+  	// @method bringToBack: this
+  	// Brings the tile layer to the bottom of all tile layers.
+  	bringToBack: function () {
+  		if (this._map) {
+  			toBack(this._container);
+  			this._setAutoZIndex(Math.min);
+  		}
+  		return this;
+  	},
+
+  	// @method getContainer: HTMLElement
+  	// Returns the HTML element that contains the tiles for this layer.
+  	getContainer: function () {
+  		return this._container;
+  	},
+
+  	// @method setOpacity(opacity: Number): this
+  	// Changes the [opacity](#gridlayer-opacity) of the grid layer.
+  	setOpacity: function (opacity) {
+  		this.options.opacity = opacity;
+  		this._updateOpacity();
+  		return this;
+  	},
+
+  	// @method setZIndex(zIndex: Number): this
+  	// Changes the [zIndex](#gridlayer-zindex) of the grid layer.
+  	setZIndex: function (zIndex) {
+  		this.options.zIndex = zIndex;
+  		this._updateZIndex();
+
+  		return this;
+  	},
+
+  	// @method isLoading: Boolean
+  	// Returns `true` if any tile in the grid layer has not finished loading.
+  	isLoading: function () {
+  		return this._loading;
+  	},
+
+  	// @method redraw: this
+  	// Causes the layer to clear all the tiles and request them again.
+  	redraw: function () {
+  		if (this._map) {
+  			this._removeAllTiles();
+  			this._update();
+  		}
+  		return this;
+  	},
+
+  	getEvents: function () {
+  		var events = {
+  			viewprereset: this._invalidateAll,
+  			viewreset: this._resetView,
+  			zoom: this._resetView,
+  			moveend: this._onMoveEnd
+  		};
+
+  		if (!this.options.updateWhenIdle) {
+  			// update tiles on move, but not more often than once per given interval
+  			if (!this._onMove) {
+  				this._onMove = throttle(this._onMoveEnd, this.options.updateInterval, this);
+  			}
+
+  			events.move = this._onMove;
+  		}
+
+  		if (this._zoomAnimated) {
+  			events.zoomanim = this._animateZoom;
+  		}
+
+  		return events;
+  	},
+
+  	// @section Extension methods
+  	// Layers extending `GridLayer` shall reimplement the following method.
+  	// @method createTile(coords: Object, done?: Function): HTMLElement
+  	// Called only internally, must be overridden by classes extending `GridLayer`.
+  	// Returns the `HTMLElement` corresponding to the given `coords`. If the `done` callback
+  	// is specified, it must be called when the tile has finished loading and drawing.
+  	createTile: function () {
+  		return document.createElement('div');
+  	},
+
+  	// @section
+  	// @method getTileSize: Point
+  	// Normalizes the [tileSize option](#gridlayer-tilesize) into a point. Used by the `createTile()` method.
+  	getTileSize: function () {
+  		var s = this.options.tileSize;
+  		return s instanceof Point ? s : new Point(s, s);
+  	},
+
+  	_updateZIndex: function () {
+  		if (this._container && this.options.zIndex !== undefined && this.options.zIndex !== null) {
+  			this._container.style.zIndex = this.options.zIndex;
+  		}
+  	},
+
+  	_setAutoZIndex: function (compare) {
+  		// go through all other layers of the same pane, set zIndex to max + 1 (front) or min - 1 (back)
+
+  		var layers = this.getPane().children,
+  		    edgeZIndex = -compare(-Infinity, Infinity); // -Infinity for max, Infinity for min
+
+  		for (var i = 0, len = layers.length, zIndex; i < len; i++) {
+
+  			zIndex = layers[i].style.zIndex;
+
+  			if (layers[i] !== this._container && zIndex) {
+  				edgeZIndex = compare(edgeZIndex, +zIndex);
+  			}
+  		}
+
+  		if (isFinite(edgeZIndex)) {
+  			this.options.zIndex = edgeZIndex + compare(-1, 1);
+  			this._updateZIndex();
+  		}
+  	},
+
+  	_updateOpacity: function () {
+  		if (!this._map) { return; }
+
+  		// IE doesn't inherit filter opacity properly, so we're forced to set it on tiles
+  		if (ielt9) { return; }
+
+  		setOpacity(this._container, this.options.opacity);
+
+  		var now = +new Date(),
+  		    nextFrame = false,
+  		    willPrune = false;
+
+  		for (var key in this._tiles) {
+  			var tile = this._tiles[key];
+  			if (!tile.current || !tile.loaded) { continue; }
+
+  			var fade = Math.min(1, (now - tile.loaded) / 200);
+
+  			setOpacity(tile.el, fade);
+  			if (fade < 1) {
+  				nextFrame = true;
+  			} else {
+  				if (tile.active) {
+  					willPrune = true;
+  				} else {
+  					this._onOpaqueTile(tile);
+  				}
+  				tile.active = true;
+  			}
+  		}
+
+  		if (willPrune && !this._noPrune) { this._pruneTiles(); }
+
+  		if (nextFrame) {
+  			cancelAnimFrame(this._fadeFrame);
+  			this._fadeFrame = requestAnimFrame(this._updateOpacity, this);
+  		}
+  	},
+
+  	_onOpaqueTile: falseFn,
+
+  	_initContainer: function () {
+  		if (this._container) { return; }
+
+  		this._container = create$1('div', 'leaflet-layer ' + (this.options.className || ''));
+  		this._updateZIndex();
+
+  		if (this.options.opacity < 1) {
+  			this._updateOpacity();
+  		}
+
+  		this.getPane().appendChild(this._container);
+  	},
+
+  	_updateLevels: function () {
+
+  		var zoom = this._tileZoom,
+  		    maxZoom = this.options.maxZoom;
+
+  		if (zoom === undefined) { return undefined; }
+
+  		for (var z in this._levels) {
+  			z = Number(z);
+  			if (this._levels[z].el.children.length || z === zoom) {
+  				this._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z);
+  				this._onUpdateLevel(z);
+  			} else {
+  				remove(this._levels[z].el);
+  				this._removeTilesAtZoom(z);
+  				this._onRemoveLevel(z);
+  				delete this._levels[z];
+  			}
+  		}
+
+  		var level = this._levels[zoom],
+  		    map = this._map;
+
+  		if (!level) {
+  			level = this._levels[zoom] = {};
+
+  			level.el = create$1('div', 'leaflet-tile-container leaflet-zoom-animated', this._container);
+  			level.el.style.zIndex = maxZoom;
+
+  			level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round();
+  			level.zoom = zoom;
+
+  			this._setZoomTransform(level, map.getCenter(), map.getZoom());
+
+  			// force the browser to consider the newly added element for transition
+  			falseFn(level.el.offsetWidth);
+
+  			this._onCreateLevel(level);
+  		}
+
+  		this._level = level;
+
+  		return level;
+  	},
+
+  	_onUpdateLevel: falseFn,
+
+  	_onRemoveLevel: falseFn,
+
+  	_onCreateLevel: falseFn,
+
+  	_pruneTiles: function () {
+  		if (!this._map) {
+  			return;
+  		}
+
+  		var key, tile;
+
+  		var zoom = this._map.getZoom();
+  		if (zoom > this.options.maxZoom ||
+  			zoom < this.options.minZoom) {
+  			this._removeAllTiles();
+  			return;
+  		}
+
+  		for (key in this._tiles) {
+  			tile = this._tiles[key];
+  			tile.retain = tile.current;
+  		}
+
+  		for (key in this._tiles) {
+  			tile = this._tiles[key];
+  			if (tile.current && !tile.active) {
+  				var coords = tile.coords;
+  				if (!this._retainParent(coords.x, coords.y, coords.z, coords.z - 5)) {
+  					this._retainChildren(coords.x, coords.y, coords.z, coords.z + 2);
+  				}
+  			}
+  		}
+
+  		for (key in this._tiles) {
+  			if (!this._tiles[key].retain) {
+  				this._removeTile(key);
+  			}
+  		}
+  	},
+
+  	_removeTilesAtZoom: function (zoom) {
+  		for (var key in this._tiles) {
+  			if (this._tiles[key].coords.z !== zoom) {
+  				continue;
+  			}
+  			this._removeTile(key);
+  		}
+  	},
+
+  	_removeAllTiles: function () {
+  		for (var key in this._tiles) {
+  			this._removeTile(key);
+  		}
+  	},
+
+  	_invalidateAll: function () {
+  		for (var z in this._levels) {
+  			remove(this._levels[z].el);
+  			this._onRemoveLevel(Number(z));
+  			delete this._levels[z];
+  		}
+  		this._removeAllTiles();
+
+  		this._tileZoom = undefined;
+  	},
+
+  	_retainParent: function (x, y, z, minZoom) {
+  		var x2 = Math.floor(x / 2),
+  		    y2 = Math.floor(y / 2),
+  		    z2 = z - 1,
+  		    coords2 = new Point(+x2, +y2);
+  		coords2.z = +z2;
+
+  		var key = this._tileCoordsToKey(coords2),
+  		    tile = this._tiles[key];
+
+  		if (tile && tile.active) {
+  			tile.retain = true;
+  			return true;
+
+  		} else if (tile && tile.loaded) {
+  			tile.retain = true;
+  		}
+
+  		if (z2 > minZoom) {
+  			return this._retainParent(x2, y2, z2, minZoom);
+  		}
+
+  		return false;
+  	},
+
+  	_retainChildren: function (x, y, z, maxZoom) {
+
+  		for (var i = 2 * x; i < 2 * x + 2; i++) {
+  			for (var j = 2 * y; j < 2 * y + 2; j++) {
+
+  				var coords = new Point(i, j);
+  				coords.z = z + 1;
+
+  				var key = this._tileCoordsToKey(coords),
+  				    tile = this._tiles[key];
+
+  				if (tile && tile.active) {
+  					tile.retain = true;
+  					continue;
+
+  				} else if (tile && tile.loaded) {
+  					tile.retain = true;
+  				}
+
+  				if (z + 1 < maxZoom) {
+  					this._retainChildren(i, j, z + 1, maxZoom);
+  				}
+  			}
+  		}
+  	},
+
+  	_resetView: function (e) {
+  		var animating = e && (e.pinch || e.flyTo);
+  		this._setView(this._map.getCenter(), this._map.getZoom(), animating, animating);
+  	},
+
+  	_animateZoom: function (e) {
+  		this._setView(e.center, e.zoom, true, e.noUpdate);
+  	},
+
+  	_clampZoom: function (zoom) {
+  		var options = this.options;
+
+  		if (undefined !== options.minNativeZoom && zoom < options.minNativeZoom) {
+  			return options.minNativeZoom;
+  		}
+
+  		if (undefined !== options.maxNativeZoom && options.maxNativeZoom < zoom) {
+  			return options.maxNativeZoom;
+  		}
+
+  		return zoom;
+  	},
+
+  	_setView: function (center, zoom, noPrune, noUpdate) {
+  		var tileZoom = Math.round(zoom);
+  		if ((this.options.maxZoom !== undefined && tileZoom > this.options.maxZoom) ||
+  		    (this.options.minZoom !== undefined && tileZoom < this.options.minZoom)) {
+  			tileZoom = undefined;
+  		} else {
+  			tileZoom = this._clampZoom(tileZoom);
+  		}
+
+  		var tileZoomChanged = this.options.updateWhenZooming && (tileZoom !== this._tileZoom);
+
+  		if (!noUpdate || tileZoomChanged) {
+
+  			this._tileZoom = tileZoom;
+
+  			if (this._abortLoading) {
+  				this._abortLoading();
+  			}
+
+  			this._updateLevels();
+  			this._resetGrid();
+
+  			if (tileZoom !== undefined) {
+  				this._update(center);
+  			}
+
+  			if (!noPrune) {
+  				this._pruneTiles();
+  			}
+
+  			// Flag to prevent _updateOpacity from pruning tiles during
+  			// a zoom anim or a pinch gesture
+  			this._noPrune = !!noPrune;
+  		}
+
+  		this._setZoomTransforms(center, zoom);
+  	},
+
+  	_setZoomTransforms: function (center, zoom) {
+  		for (var i in this._levels) {
+  			this._setZoomTransform(this._levels[i], center, zoom);
+  		}
+  	},
+
+  	_setZoomTransform: function (level, center, zoom) {
+  		var scale = this._map.getZoomScale(zoom, level.zoom),
+  		    translate = level.origin.multiplyBy(scale)
+  		        .subtract(this._map._getNewPixelOrigin(center, zoom)).round();
+
+  		if (any3d) {
+  			setTransform(level.el, translate, scale);
+  		} else {
+  			setPosition(level.el, translate);
+  		}
+  	},
+
+  	_resetGrid: function () {
+  		var map = this._map,
+  		    crs = map.options.crs,
+  		    tileSize = this._tileSize = this.getTileSize(),
+  		    tileZoom = this._tileZoom;
+
+  		var bounds = this._map.getPixelWorldBounds(this._tileZoom);
+  		if (bounds) {
+  			this._globalTileRange = this._pxBoundsToTileRange(bounds);
+  		}
+
+  		this._wrapX = crs.wrapLng && !this.options.noWrap && [
+  			Math.floor(map.project([0, crs.wrapLng[0]], tileZoom).x / tileSize.x),
+  			Math.ceil(map.project([0, crs.wrapLng[1]], tileZoom).x / tileSize.y)
+  		];
+  		this._wrapY = crs.wrapLat && !this.options.noWrap && [
+  			Math.floor(map.project([crs.wrapLat[0], 0], tileZoom).y / tileSize.x),
+  			Math.ceil(map.project([crs.wrapLat[1], 0], tileZoom).y / tileSize.y)
+  		];
+  	},
+
+  	_onMoveEnd: function () {
+  		if (!this._map || this._map._animatingZoom) { return; }
+
+  		this._update();
+  	},
+
+  	_getTiledPixelBounds: function (center) {
+  		var map = this._map,
+  		    mapZoom = map._animatingZoom ? Math.max(map._animateToZoom, map.getZoom()) : map.getZoom(),
+  		    scale = map.getZoomScale(mapZoom, this._tileZoom),
+  		    pixelCenter = map.project(center, this._tileZoom).floor(),
+  		    halfSize = map.getSize().divideBy(scale * 2);
+
+  		return new Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize));
+  	},
+
+  	// Private method to load tiles in the grid's active zoom level according to map bounds
+  	_update: function (center) {
+  		var map = this._map;
+  		if (!map) { return; }
+  		var zoom = this._clampZoom(map.getZoom());
+
+  		if (center === undefined) { center = map.getCenter(); }
+  		if (this._tileZoom === undefined) { return; }	// if out of minzoom/maxzoom
+
+  		var pixelBounds = this._getTiledPixelBounds(center),
+  		    tileRange = this._pxBoundsToTileRange(pixelBounds),
+  		    tileCenter = tileRange.getCenter(),
+  		    queue = [],
+  		    margin = this.options.keepBuffer,
+  		    noPruneRange = new Bounds(tileRange.getBottomLeft().subtract([margin, -margin]),
+  		                              tileRange.getTopRight().add([margin, -margin]));
+
+  		// Sanity check: panic if the tile range contains Infinity somewhere.
+  		if (!(isFinite(tileRange.min.x) &&
+  		      isFinite(tileRange.min.y) &&
+  		      isFinite(tileRange.max.x) &&
+  		      isFinite(tileRange.max.y))) { throw new Error('Attempted to load an infinite number of tiles'); }
+
+  		for (var key in this._tiles) {
+  			var c = this._tiles[key].coords;
+  			if (c.z !== this._tileZoom || !noPruneRange.contains(new Point(c.x, c.y))) {
+  				this._tiles[key].current = false;
+  			}
+  		}
+
+  		// _update just loads more tiles. If the tile zoom level differs too much
+  		// from the map's, let _setView reset levels and prune old tiles.
+  		if (Math.abs(zoom - this._tileZoom) > 1) { this._setView(center, zoom); return; }
+
+  		// create a queue of coordinates to load tiles from
+  		for (var j = tileRange.min.y; j <= tileRange.max.y; j++) {
+  			for (var i = tileRange.min.x; i <= tileRange.max.x; i++) {
+  				var coords = new Point(i, j);
+  				coords.z = this._tileZoom;
+
+  				if (!this._isValidTile(coords)) { continue; }
+
+  				var tile = this._tiles[this._tileCoordsToKey(coords)];
+  				if (tile) {
+  					tile.current = true;
+  				} else {
+  					queue.push(coords);
+  				}
+  			}
+  		}
+
+  		// sort tile queue to load tiles in order of their distance to center
+  		queue.sort(function (a, b) {
+  			return a.distanceTo(tileCenter) - b.distanceTo(tileCenter);
+  		});
+
+  		if (queue.length !== 0) {
+  			// if it's the first batch of tiles to load
+  			if (!this._loading) {
+  				this._loading = true;
+  				// @event loading: Event
+  				// Fired when the grid layer starts loading tiles.
+  				this.fire('loading');
+  			}
+
+  			// create DOM fragment to append tiles in one batch
+  			var fragment = document.createDocumentFragment();
+
+  			for (i = 0; i < queue.length; i++) {
+  				this._addTile(queue[i], fragment);
+  			}
+
+  			this._level.el.appendChild(fragment);
+  		}
+  	},
+
+  	_isValidTile: function (coords) {
+  		var crs = this._map.options.crs;
+
+  		if (!crs.infinite) {
+  			// don't load tile if it's out of bounds and not wrapped
+  			var bounds = this._globalTileRange;
+  			if ((!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) ||
+  			    (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))) { return false; }
+  		}
+
+  		if (!this.options.bounds) { return true; }
+
+  		// don't load tile if it doesn't intersect the bounds in options
+  		var tileBounds = this._tileCoordsToBounds(coords);
+  		return toLatLngBounds(this.options.bounds).overlaps(tileBounds);
+  	},
+
+  	_keyToBounds: function (key) {
+  		return this._tileCoordsToBounds(this._keyToTileCoords(key));
+  	},
+
+  	_tileCoordsToNwSe: function (coords) {
+  		var map = this._map,
+  		    tileSize = this.getTileSize(),
+  		    nwPoint = coords.scaleBy(tileSize),
+  		    sePoint = nwPoint.add(tileSize),
+  		    nw = map.unproject(nwPoint, coords.z),
+  		    se = map.unproject(sePoint, coords.z);
+  		return [nw, se];
+  	},
+
+  	// converts tile coordinates to its geographical bounds
+  	_tileCoordsToBounds: function (coords) {
+  		var bp = this._tileCoordsToNwSe(coords),
+  		    bounds = new LatLngBounds(bp[0], bp[1]);
+
+  		if (!this.options.noWrap) {
+  			bounds = this._map.wrapLatLngBounds(bounds);
+  		}
+  		return bounds;
+  	},
+  	// converts tile coordinates to key for the tile cache
+  	_tileCoordsToKey: function (coords) {
+  		return coords.x + ':' + coords.y + ':' + coords.z;
+  	},
+
+  	// converts tile cache key to coordinates
+  	_keyToTileCoords: function (key) {
+  		var k = key.split(':'),
+  		    coords = new Point(+k[0], +k[1]);
+  		coords.z = +k[2];
+  		return coords;
+  	},
+
+  	_removeTile: function (key) {
+  		var tile = this._tiles[key];
+  		if (!tile) { return; }
+
+  		remove(tile.el);
+
+  		delete this._tiles[key];
+
+  		// @event tileunload: TileEvent
+  		// Fired when a tile is removed (e.g. when a tile goes off the screen).
+  		this.fire('tileunload', {
+  			tile: tile.el,
+  			coords: this._keyToTileCoords(key)
+  		});
+  	},
+
+  	_initTile: function (tile) {
+  		addClass(tile, 'leaflet-tile');
+
+  		var tileSize = this.getTileSize();
+  		tile.style.width = tileSize.x + 'px';
+  		tile.style.height = tileSize.y + 'px';
+
+  		tile.onselectstart = falseFn;
+  		tile.onmousemove = falseFn;
+
+  		// update opacity on tiles in IE7-8 because of filter inheritance problems
+  		if (ielt9 && this.options.opacity < 1) {
+  			setOpacity(tile, this.options.opacity);
+  		}
+
+  		// without this hack, tiles disappear after zoom on Chrome for Android
+  		// https://github.com/Leaflet/Leaflet/issues/2078
+  		if (android && !android23) {
+  			tile.style.WebkitBackfaceVisibility = 'hidden';
+  		}
+  	},
+
+  	_addTile: function (coords, container) {
+  		var tilePos = this._getTilePos(coords),
+  		    key = this._tileCoordsToKey(coords);
+
+  		var tile = this.createTile(this._wrapCoords(coords), bind(this._tileReady, this, coords));
+
+  		this._initTile(tile);
+
+  		// if createTile is defined with a second argument ("done" callback),
+  		// we know that tile is async and will be ready later; otherwise
+  		if (this.createTile.length < 2) {
+  			// mark tile as ready, but delay one frame for opacity animation to happen
+  			requestAnimFrame(bind(this._tileReady, this, coords, null, tile));
+  		}
+
+  		setPosition(tile, tilePos);
+
+  		// save tile in cache
+  		this._tiles[key] = {
+  			el: tile,
+  			coords: coords,
+  			current: true
+  		};
+
+  		container.appendChild(tile);
+  		// @event tileloadstart: TileEvent
+  		// Fired when a tile is requested and starts loading.
+  		this.fire('tileloadstart', {
+  			tile: tile,
+  			coords: coords
+  		});
+  	},
+
+  	_tileReady: function (coords, err, tile) {
+  		if (err) {
+  			// @event tileerror: TileErrorEvent
+  			// Fired when there is an error loading a tile.
+  			this.fire('tileerror', {
+  				error: err,
+  				tile: tile,
+  				coords: coords
+  			});
+  		}
+
+  		var key = this._tileCoordsToKey(coords);
+
+  		tile = this._tiles[key];
+  		if (!tile) { return; }
+
+  		tile.loaded = +new Date();
+  		if (this._map._fadeAnimated) {
+  			setOpacity(tile.el, 0);
+  			cancelAnimFrame(this._fadeFrame);
+  			this._fadeFrame = requestAnimFrame(this._updateOpacity, this);
+  		} else {
+  			tile.active = true;
+  			this._pruneTiles();
+  		}
+
+  		if (!err) {
+  			addClass(tile.el, 'leaflet-tile-loaded');
+
+  			// @event tileload: TileEvent
+  			// Fired when a tile loads.
+  			this.fire('tileload', {
+  				tile: tile.el,
+  				coords: coords
+  			});
+  		}
+
+  		if (this._noTilesToLoad()) {
+  			this._loading = false;
+  			// @event load: Event
+  			// Fired when the grid layer loaded all visible tiles.
+  			this.fire('load');
+
+  			if (ielt9 || !this._map._fadeAnimated) {
+  				requestAnimFrame(this._pruneTiles, this);
+  			} else {
+  				// Wait a bit more than 0.2 secs (the duration of the tile fade-in)
+  				// to trigger a pruning.
+  				setTimeout(bind(this._pruneTiles, this), 250);
+  			}
+  		}
+  	},
+
+  	_getTilePos: function (coords) {
+  		return coords.scaleBy(this.getTileSize()).subtract(this._level.origin);
+  	},
+
+  	_wrapCoords: function (coords) {
+  		var newCoords = new Point(
+  			this._wrapX ? wrapNum(coords.x, this._wrapX) : coords.x,
+  			this._wrapY ? wrapNum(coords.y, this._wrapY) : coords.y);
+  		newCoords.z = coords.z;
+  		return newCoords;
+  	},
+
+  	_pxBoundsToTileRange: function (bounds) {
+  		var tileSize = this.getTileSize();
+  		return new Bounds(
+  			bounds.min.unscaleBy(tileSize).floor(),
+  			bounds.max.unscaleBy(tileSize).ceil().subtract([1, 1]));
+  	},
+
+  	_noTilesToLoad: function () {
+  		for (var key in this._tiles) {
+  			if (!this._tiles[key].loaded) { return false; }
+  		}
+  		return true;
+  	}
+  });
+
+  // @factory L.gridLayer(options?: GridLayer options)
+  // Creates a new instance of GridLayer with the supplied options.
+  function gridLayer(options) {
+  	return new GridLayer(options);
+  }
+
+  /*
+   * @class TileLayer
+   * @inherits GridLayer
+   * @aka L.TileLayer
+   * Used to load and display tile layers on the map. Note that most tile servers require attribution, which you can set under `Layer`. Extends `GridLayer`.
+   *
+   * @example
+   *
+   * ```js
+   * L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar', attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'}).addTo(map);
+   * ```
+   *
+   * @section URL template
+   * @example
+   *
+   * A string of the following form:
+   *
+   * ```
+   * 'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
+   * ```
+   *
+   * `{s}` means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; `a`, `b` or `c` by default, can be omitted), `{z}` — zoom level, `{x}` and `{y}` — tile coordinates. `{r}` can be used to add "&commat;2x" to the URL to load retina tiles.
+   *
+   * You can use custom keys in the template, which will be [evaluated](#util-template) from TileLayer options, like this:
+   *
+   * ```
+   * L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
+   * ```
+   */
+
+
+  var TileLayer = GridLayer.extend({
+
+  	// @section
+  	// @aka TileLayer options
+  	options: {
+  		// @option minZoom: Number = 0
+  		// The minimum zoom level down to which this layer will be displayed (inclusive).
+  		minZoom: 0,
+
+  		// @option maxZoom: Number = 18
+  		// The maximum zoom level up to which this layer will be displayed (inclusive).
+  		maxZoom: 18,
+
+  		// @option subdomains: String|String[] = 'abc'
+  		// Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
+  		subdomains: 'abc',
+
+  		// @option errorTileUrl: String = ''
+  		// URL to the tile image to show in place of the tile that failed to load.
+  		errorTileUrl: '',
+
+  		// @option zoomOffset: Number = 0
+  		// The zoom number used in tile URLs will be offset with this value.
+  		zoomOffset: 0,
+
+  		// @option tms: Boolean = false
+  		// If `true`, inverses Y axis numbering for tiles (turn this on for [TMS](https://en.wikipedia.org/wiki/Tile_Map_Service) services).
+  		tms: false,
+
+  		// @option zoomReverse: Boolean = false
+  		// If set to true, the zoom number used in tile URLs will be reversed (`maxZoom - zoom` instead of `zoom`)
+  		zoomReverse: false,
+
+  		// @option detectRetina: Boolean = false
+  		// If `true` and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
+  		detectRetina: false,
+
+  		// @option crossOrigin: Boolean|String = false
+  		// Whether the crossOrigin attribute will be added to the tiles.
+  		// If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data.
+  		// Refer to [CORS Settings](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for valid String values.
+  		crossOrigin: false
+  	},
+
+  	initialize: function (url, options) {
+
+  		this._url = url;
+
+  		options = setOptions(this, options);
+
+  		// detecting retina displays, adjusting tileSize and zoom levels
+  		if (options.detectRetina && retina && options.maxZoom > 0) {
+
+  			options.tileSize = Math.floor(options.tileSize / 2);
+
+  			if (!options.zoomReverse) {
+  				options.zoomOffset++;
+  				options.maxZoom--;
+  			} else {
+  				options.zoomOffset--;
+  				options.minZoom++;
+  			}
+
+  			options.minZoom = Math.max(0, options.minZoom);
+  		}
+
+  		if (typeof options.subdomains === 'string') {
+  			options.subdomains = options.subdomains.split('');
+  		}
+
+  		// for https://github.com/Leaflet/Leaflet/issues/137
+  		if (!android) {
+  			this.on('tileunload', this._onTileRemove);
+  		}
+  	},
+
+  	// @method setUrl(url: String, noRedraw?: Boolean): this
+  	// Updates the layer's URL template and redraws it (unless `noRedraw` is set to `true`).
+  	// If the URL does not change, the layer will not be redrawn unless
+  	// the noRedraw parameter is set to false.
+  	setUrl: function (url, noRedraw) {
+  		if (this._url === url && noRedraw === undefined) {
+  			noRedraw = true;
+  		}
+
+  		this._url = url;
+
+  		if (!noRedraw) {
+  			this.redraw();
+  		}
+  		return this;
+  	},
+
+  	// @method createTile(coords: Object, done?: Function): HTMLElement
+  	// Called only internally, overrides GridLayer's [`createTile()`](#gridlayer-createtile)
+  	// to return an `<img>` HTML element with the appropriate image URL given `coords`. The `done`
+  	// callback is called when the tile has been loaded.
+  	createTile: function (coords, done) {
+  		var tile = document.createElement('img');
+
+  		on(tile, 'load', bind(this._tileOnLoad, this, done, tile));
+  		on(tile, 'error', bind(this._tileOnError, this, done, tile));
+
+  		if (this.options.crossOrigin || this.options.crossOrigin === '') {
+  			tile.crossOrigin = this.options.crossOrigin === true ? '' : this.options.crossOrigin;
+  		}
+
+  		/*
+  		 Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons
+  		 http://www.w3.org/TR/WCAG20-TECHS/H67
+  		*/
+  		tile.alt = '';
+
+  		/*
+  		 Set role="presentation" to force screen readers to ignore this
+  		 https://www.w3.org/TR/wai-aria/roles#textalternativecomputation
+  		*/
+  		tile.setAttribute('role', 'presentation');
+
+  		tile.src = this.getTileUrl(coords);
+
+  		return tile;
+  	},
+
+  	// @section Extension methods
+  	// @uninheritable
+  	// Layers extending `TileLayer` might reimplement the following method.
+  	// @method getTileUrl(coords: Object): String
+  	// Called only internally, returns the URL for a tile given its coordinates.
+  	// Classes extending `TileLayer` can override this function to provide custom tile URL naming schemes.
+  	getTileUrl: function (coords) {
+  		var data = {
+  			r: retina ? '@2x' : '',
+  			s: this._getSubdomain(coords),
+  			x: coords.x,
+  			y: coords.y,
+  			z: this._getZoomForUrl()
+  		};
+  		if (this._map && !this._map.options.crs.infinite) {
+  			var invertedY = this._globalTileRange.max.y - coords.y;
+  			if (this.options.tms) {
+  				data['y'] = invertedY;
+  			}
+  			data['-y'] = invertedY;
+  		}
+
+  		return template(this._url, extend(data, this.options));
+  	},
+
+  	_tileOnLoad: function (done, tile) {
+  		// For https://github.com/Leaflet/Leaflet/issues/3332
+  		if (ielt9) {
+  			setTimeout(bind(done, this, null, tile), 0);
+  		} else {
+  			done(null, tile);
+  		}
+  	},
+
+  	_tileOnError: function (done, tile, e) {
+  		var errorUrl = this.options.errorTileUrl;
+  		if (errorUrl && tile.getAttribute('src') !== errorUrl) {
+  			tile.src = errorUrl;
+  		}
+  		done(e, tile);
+  	},
+
+  	_onTileRemove: function (e) {
+  		e.tile.onload = null;
+  	},
+
+  	_getZoomForUrl: function () {
+  		var zoom = this._tileZoom,
+  		maxZoom = this.options.maxZoom,
+  		zoomReverse = this.options.zoomReverse,
+  		zoomOffset = this.options.zoomOffset;
+
+  		if (zoomReverse) {
+  			zoom = maxZoom - zoom;
+  		}
+
+  		return zoom + zoomOffset;
+  	},
+
+  	_getSubdomain: function (tilePoint) {
+  		var index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;
+  		return this.options.subdomains[index];
+  	},
+
+  	// stops loading all tiles in the background layer
+  	_abortLoading: function () {
+  		var i, tile;
+  		for (i in this._tiles) {
+  			if (this._tiles[i].coords.z !== this._tileZoom) {
+  				tile = this._tiles[i].el;
+
+  				tile.onload = falseFn;
+  				tile.onerror = falseFn;
+
+  				if (!tile.complete) {
+  					tile.src = emptyImageUrl;
+  					remove(tile);
+  					delete this._tiles[i];
+  				}
+  			}
+  		}
+  	},
+
+  	_removeTile: function (key) {
+  		var tile = this._tiles[key];
+  		if (!tile) { return; }
+
+  		// Cancels any pending http requests associated with the tile
+  		// unless we're on Android's stock browser,
+  		// see https://github.com/Leaflet/Leaflet/issues/137
+  		if (!androidStock) {
+  			tile.el.setAttribute('src', emptyImageUrl);
+  		}
+
+  		return GridLayer.prototype._removeTile.call(this, key);
+  	},
+
+  	_tileReady: function (coords, err, tile) {
+  		if (!this._map || (tile && tile.getAttribute('src') === emptyImageUrl)) {
+  			return;
+  		}
+
+  		return GridLayer.prototype._tileReady.call(this, coords, err, tile);
+  	}
+  });
+
+
+  // @factory L.tilelayer(urlTemplate: String, options?: TileLayer options)
+  // Instantiates a tile layer object given a `URL template` and optionally an options object.
+
+  function tileLayer(url, options) {
+  	return new TileLayer(url, options);
+  }
+
+  /*
+   * @class TileLayer.WMS
+   * @inherits TileLayer
+   * @aka L.TileLayer.WMS
+   * Used to display [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services as tile layers on the map. Extends `TileLayer`.
+   *
+   * @example
+   *
+   * ```js
+   * var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
+   * 	layers: 'nexrad-n0r-900913',
+   * 	format: 'image/png',
+   * 	transparent: true,
+   * 	attribution: "Weather data © 2012 IEM Nexrad"
+   * });
+   * ```
+   */
+
+  var TileLayerWMS = TileLayer.extend({
+
+  	// @section
+  	// @aka TileLayer.WMS options
+  	// If any custom options not documented here are used, they will be sent to the
+  	// WMS server as extra parameters in each request URL. This can be useful for
+  	// [non-standard vendor WMS parameters](http://docs.geoserver.org/stable/en/user/services/wms/vendor.html).
+  	defaultWmsParams: {
+  		service: 'WMS',
+  		request: 'GetMap',
+
+  		// @option layers: String = ''
+  		// **(required)** Comma-separated list of WMS layers to show.
+  		layers: '',
+
+  		// @option styles: String = ''
+  		// Comma-separated list of WMS styles.
+  		styles: '',
+
+  		// @option format: String = 'image/jpeg'
+  		// WMS image format (use `'image/png'` for layers with transparency).
+  		format: 'image/jpeg',
+
+  		// @option transparent: Boolean = false
+  		// If `true`, the WMS service will return images with transparency.
+  		transparent: false,
+
+  		// @option version: String = '1.1.1'
+  		// Version of the WMS service to use
+  		version: '1.1.1'
+  	},
+
+  	options: {
+  		// @option crs: CRS = null
+  		// Coordinate Reference System to use for the WMS requests, defaults to
+  		// map CRS. Don't change this if you're not sure what it means.
+  		crs: null,
+
+  		// @option uppercase: Boolean = false
+  		// If `true`, WMS request parameter keys will be uppercase.
+  		uppercase: false
+  	},
+
+  	initialize: function (url, options) {
+
+  		this._url = url;
+
+  		var wmsParams = extend({}, this.defaultWmsParams);
+
+  		// all keys that are not TileLayer options go to WMS params
+  		for (var i in options) {
+  			if (!(i in this.options)) {
+  				wmsParams[i] = options[i];
+  			}
+  		}
+
+  		options = setOptions(this, options);
+
+  		var realRetina = options.detectRetina && retina ? 2 : 1;
+  		var tileSize = this.getTileSize();
+  		wmsParams.width = tileSize.x * realRetina;
+  		wmsParams.height = tileSize.y * realRetina;
+
+  		this.wmsParams = wmsParams;
+  	},
+
+  	onAdd: function (map) {
+
+  		this._crs = this.options.crs || map.options.crs;
+  		this._wmsVersion = parseFloat(this.wmsParams.version);
+
+  		var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';
+  		this.wmsParams[projectionKey] = this._crs.code;
+
+  		TileLayer.prototype.onAdd.call(this, map);
+  	},
+
+  	getTileUrl: function (coords) {
+
+  		var tileBounds = this._tileCoordsToNwSe(coords),
+  		    crs = this._crs,
+  		    bounds = toBounds(crs.project(tileBounds[0]), crs.project(tileBounds[1])),
+  		    min = bounds.min,
+  		    max = bounds.max,
+  		    bbox = (this._wmsVersion >= 1.3 && this._crs === EPSG4326 ?
+  		    [min.y, min.x, max.y, max.x] :
+  		    [min.x, min.y, max.x, max.y]).join(','),
+  		    url = TileLayer.prototype.getTileUrl.call(this, coords);
+  		return url +
+  			getParamString(this.wmsParams, url, this.options.uppercase) +
+  			(this.options.uppercase ? '&BBOX=' : '&bbox=') + bbox;
+  	},
+
+  	// @method setParams(params: Object, noRedraw?: Boolean): this
+  	// Merges an object with the new parameters and re-requests tiles on the current screen (unless `noRedraw` was set to true).
+  	setParams: function (params, noRedraw) {
+
+  		extend(this.wmsParams, params);
+
+  		if (!noRedraw) {
+  			this.redraw();
+  		}
+
+  		return this;
+  	}
+  });
+
+
+  // @factory L.tileLayer.wms(baseUrl: String, options: TileLayer.WMS options)
+  // Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
+  function tileLayerWMS(url, options) {
+  	return new TileLayerWMS(url, options);
+  }
+
+  TileLayer.WMS = TileLayerWMS;
+  tileLayer.wms = tileLayerWMS;
+
+  /*
+   * @class Renderer
+   * @inherits Layer
+   * @aka L.Renderer
+   *
+   * Base class for vector renderer implementations (`SVG`, `Canvas`). Handles the
+   * DOM container of the renderer, its bounds, and its zoom animation.
+   *
+   * A `Renderer` works as an implicit layer group for all `Path`s - the renderer
+   * itself can be added or removed to the map. All paths use a renderer, which can
+   * be implicit (the map will decide the type of renderer and use it automatically)
+   * or explicit (using the [`renderer`](#path-renderer) option of the path).
+   *
+   * Do not use this class directly, use `SVG` and `Canvas` instead.
+   *
+   * @event update: Event
+   * Fired when the renderer updates its bounds, center and zoom, for example when
+   * its map has moved
+   */
+
+  var Renderer = Layer.extend({
+
+  	// @section
+  	// @aka Renderer options
+  	options: {
+  		// @option padding: Number = 0.1
+  		// How much to extend the clip area around the map view (relative to its size)
+  		// e.g. 0.1 would be 10% of map view in each direction
+  		padding: 0.1,
+
+  		// @option tolerance: Number = 0
+  		// How much to extend click tolerance round a path/object on the map
+  		tolerance : 0
+  	},
+
+  	initialize: function (options) {
+  		setOptions(this, options);
+  		stamp(this);
+  		this._layers = this._layers || {};
+  	},
+
+  	onAdd: function () {
+  		if (!this._container) {
+  			this._initContainer(); // defined by renderer implementations
+
+  			if (this._zoomAnimated) {
+  				addClass(this._container, 'leaflet-zoom-animated');
+  			}
+  		}
+
+  		this.getPane().appendChild(this._container);
+  		this._update();
+  		this.on('update', this._updatePaths, this);
+  	},
+
+  	onRemove: function () {
+  		this.off('update', this._updatePaths, this);
+  		this._destroyContainer();
+  	},
+
+  	getEvents: function () {
+  		var events = {
+  			viewreset: this._reset,
+  			zoom: this._onZoom,
+  			moveend: this._update,
+  			zoomend: this._onZoomEnd
+  		};
+  		if (this._zoomAnimated) {
+  			events.zoomanim = this._onAnimZoom;
+  		}
+  		return events;
+  	},
+
+  	_onAnimZoom: function (ev) {
+  		this._updateTransform(ev.center, ev.zoom);
+  	},
+
+  	_onZoom: function () {
+  		this._updateTransform(this._map.getCenter(), this._map.getZoom());
+  	},
+
+  	_updateTransform: function (center, zoom) {
+  		var scale = this._map.getZoomScale(zoom, this._zoom),
+  		    position = getPosition(this._container),
+  		    viewHalf = this._map.getSize().multiplyBy(0.5 + this.options.padding),
+  		    currentCenterPoint = this._map.project(this._center, zoom),
+  		    destCenterPoint = this._map.project(center, zoom),
+  		    centerOffset = destCenterPoint.subtract(currentCenterPoint),
+
+  		    topLeftOffset = viewHalf.multiplyBy(-scale).add(position).add(viewHalf).subtract(centerOffset);
+
+  		if (any3d) {
+  			setTransform(this._container, topLeftOffset, scale);
+  		} else {
+  			setPosition(this._container, topLeftOffset);
+  		}
+  	},
+
+  	_reset: function () {
+  		this._update();
+  		this._updateTransform(this._center, this._zoom);
+
+  		for (var id in this._layers) {
+  			this._layers[id]._reset();
+  		}
+  	},
+
+  	_onZoomEnd: function () {
+  		for (var id in this._layers) {
+  			this._layers[id]._project();
+  		}
+  	},
+
+  	_updatePaths: function () {
+  		for (var id in this._layers) {
+  			this._layers[id]._update();
+  		}
+  	},
+
+  	_update: function () {
+  		// Update pixel bounds of renderer container (for positioning/sizing/clipping later)
+  		// Subclasses are responsible of firing the 'update' event.
+  		var p = this.options.padding,
+  		    size = this._map.getSize(),
+  		    min = this._map.containerPointToLayerPoint(size.multiplyBy(-p)).round();
+
+  		this._bounds = new Bounds(min, min.add(size.multiplyBy(1 + p * 2)).round());
+
+  		this._center = this._map.getCenter();
+  		this._zoom = this._map.getZoom();
+  	}
+  });
+
+  /*
+   * @class Canvas
+   * @inherits Renderer
+   * @aka L.Canvas
+   *
+   * Allows vector layers to be displayed with [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).
+   * Inherits `Renderer`.
+   *
+   * Due to [technical limitations](http://caniuse.com/#search=canvas), Canvas is not
+   * available in all web browsers, notably IE8, and overlapping geometries might
+   * not display properly in some edge cases.
+   *
+   * @example
+   *
+   * Use Canvas by default for all paths in the map:
+   *
+   * ```js
+   * var map = L.map('map', {
+   * 	renderer: L.canvas()
+   * });
+   * ```
+   *
+   * Use a Canvas renderer with extra padding for specific vector geometries:
+   *
+   * ```js
+   * var map = L.map('map');
+   * var myRenderer = L.canvas({ padding: 0.5 });
+   * var line = L.polyline( coordinates, { renderer: myRenderer } );
+   * var circle = L.circle( center, { renderer: myRenderer } );
+   * ```
+   */
+
+  var Canvas = Renderer.extend({
+  	getEvents: function () {
+  		var events = Renderer.prototype.getEvents.call(this);
+  		events.viewprereset = this._onViewPreReset;
+  		return events;
+  	},
+
+  	_onViewPreReset: function () {
+  		// Set a flag so that a viewprereset+moveend+viewreset only updates&redraws once
+  		this._postponeUpdatePaths = true;
+  	},
+
+  	onAdd: function () {
+  		Renderer.prototype.onAdd.call(this);
+
+  		// Redraw vectors since canvas is cleared upon removal,
+  		// in case of removing the renderer itself from the map.
+  		this._draw();
+  	},
+
+  	_initContainer: function () {
+  		var container = this._container = document.createElement('canvas');
+
+  		on(container, 'mousemove', this._onMouseMove, this);
+  		on(container, 'click dblclick mousedown mouseup contextmenu', this._onClick, this);
+  		on(container, 'mouseout', this._handleMouseOut, this);
+
+  		this._ctx = container.getContext('2d');
+  	},
+
+  	_destroyContainer: function () {
+  		cancelAnimFrame(this._redrawRequest);
+  		delete this._ctx;
+  		remove(this._container);
+  		off(this._container);
+  		delete this._container;
+  	},
+
+  	_updatePaths: function () {
+  		if (this._postponeUpdatePaths) { return; }
+
+  		var layer;
+  		this._redrawBounds = null;
+  		for (var id in this._layers) {
+  			layer = this._layers[id];
+  			layer._update();
+  		}
+  		this._redraw();
+  	},
+
+  	_update: function () {
+  		if (this._map._animatingZoom && this._bounds) { return; }
+
+  		Renderer.prototype._update.call(this);
+
+  		var b = this._bounds,
+  		    container = this._container,
+  		    size = b.getSize(),
+  		    m = retina ? 2 : 1;
+
+  		setPosition(container, b.min);
+
+  		// set canvas size (also clearing it); use double size on retina
+  		container.width = m * size.x;
+  		container.height = m * size.y;
+  		container.style.width = size.x + 'px';
+  		container.style.height = size.y + 'px';
+
+  		if (retina) {
+  			this._ctx.scale(2, 2);
+  		}
+
+  		// translate so we use the same path coordinates after canvas element moves
+  		this._ctx.translate(-b.min.x, -b.min.y);
+
+  		// Tell paths to redraw themselves
+  		this.fire('update');
+  	},
+
+  	_reset: function () {
+  		Renderer.prototype._reset.call(this);
+
+  		if (this._postponeUpdatePaths) {
+  			this._postponeUpdatePaths = false;
+  			this._updatePaths();
+  		}
+  	},
+
+  	_initPath: function (layer) {
+  		this._updateDashArray(layer);
+  		this._layers[stamp(layer)] = layer;
+
+  		var order = layer._order = {
+  			layer: layer,
+  			prev: this._drawLast,
+  			next: null
+  		};
+  		if (this._drawLast) { this._drawLast.next = order; }
+  		this._drawLast = order;
+  		this._drawFirst = this._drawFirst || this._drawLast;
+  	},
+
+  	_addPath: function (layer) {
+  		this._requestRedraw(layer);
+  	},
+
+  	_removePath: function (layer) {
+  		var order = layer._order;
+  		var next = order.next;
+  		var prev = order.prev;
+
+  		if (next) {
+  			next.prev = prev;
+  		} else {
+  			this._drawLast = prev;
+  		}
+  		if (prev) {
+  			prev.next = next;
+  		} else {
+  			this._drawFirst = next;
+  		}
+
+  		delete layer._order;
+
+  		delete this._layers[stamp(layer)];
+
+  		this._requestRedraw(layer);
+  	},
+
+  	_updatePath: function (layer) {
+  		// Redraw the union of the layer's old pixel
+  		// bounds and the new pixel bounds.
+  		this._extendRedrawBounds(layer);
+  		layer._project();
+  		layer._update();
+  		// The redraw will extend the redraw bounds
+  		// with the new pixel bounds.
+  		this._requestRedraw(layer);
+  	},
+
+  	_updateStyle: function (layer) {
+  		this._updateDashArray(layer);
+  		this._requestRedraw(layer);
+  	},
+
+  	_updateDashArray: function (layer) {
+  		if (typeof layer.options.dashArray === 'string') {
+  			var parts = layer.options.dashArray.split(/[, ]+/),
+  			    dashArray = [],
+  			    dashValue,
+  			    i;
+  			for (i = 0; i < parts.length; i++) {
+  				dashValue = Number(parts[i]);
+  				// Ignore dash array containing invalid lengths
+  				if (isNaN(dashValue)) { return; }
+  				dashArray.push(dashValue);
+  			}
+  			layer.options._dashArray = dashArray;
+  		} else {
+  			layer.options._dashArray = layer.options.dashArray;
+  		}
+  	},
+
+  	_requestRedraw: function (layer) {
+  		if (!this._map) { return; }
+
+  		this._extendRedrawBounds(layer);
+  		this._redrawRequest = this._redrawRequest || requestAnimFrame(this._redraw, this);
+  	},
+
+  	_extendRedrawBounds: function (layer) {
+  		if (layer._pxBounds) {
+  			var padding = (layer.options.weight || 0) + 1;
+  			this._redrawBounds = this._redrawBounds || new Bounds();
+  			this._redrawBounds.extend(layer._pxBounds.min.subtract([padding, padding]));
+  			this._redrawBounds.extend(layer._pxBounds.max.add([padding, padding]));
+  		}
+  	},
+
+  	_redraw: function () {
+  		this._redrawRequest = null;
+
+  		if (this._redrawBounds) {
+  			this._redrawBounds.min._floor();
+  			this._redrawBounds.max._ceil();
+  		}
+
+  		this._clear(); // clear layers in redraw bounds
+  		this._draw(); // draw layers
+
+  		this._redrawBounds = null;
+  	},
+
+  	_clear: function () {
+  		var bounds = this._redrawBounds;
+  		if (bounds) {
+  			var size = bounds.getSize();
+  			this._ctx.clearRect(bounds.min.x, bounds.min.y, size.x, size.y);
+  		} else {
+  			this._ctx.save();
+  			this._ctx.setTransform(1, 0, 0, 1, 0, 0);
+  			this._ctx.clearRect(0, 0, this._container.width, this._container.height);
+  			this._ctx.restore();
+  		}
+  	},
+
+  	_draw: function () {
+  		var layer, bounds = this._redrawBounds;
+  		this._ctx.save();
+  		if (bounds) {
+  			var size = bounds.getSize();
+  			this._ctx.beginPath();
+  			this._ctx.rect(bounds.min.x, bounds.min.y, size.x, size.y);
+  			this._ctx.clip();
+  		}
+
+  		this._drawing = true;
+
+  		for (var order = this._drawFirst; order; order = order.next) {
+  			layer = order.layer;
+  			if (!bounds || (layer._pxBounds && layer._pxBounds.intersects(bounds))) {
+  				layer._updatePath();
+  			}
+  		}
+
+  		this._drawing = false;
+
+  		this._ctx.restore();  // Restore state before clipping.
+  	},
+
+  	_updatePoly: function (layer, closed) {
+  		if (!this._drawing) { return; }
+
+  		var i, j, len2, p,
+  		    parts = layer._parts,
+  		    len = parts.length,
+  		    ctx = this._ctx;
+
+  		if (!len) { return; }
+
+  		ctx.beginPath();
+
+  		for (i = 0; i < len; i++) {
+  			for (j = 0, len2 = parts[i].length; j < len2; j++) {
+  				p = parts[i][j];
+  				ctx[j ? 'lineTo' : 'moveTo'](p.x, p.y);
+  			}
+  			if (closed) {
+  				ctx.closePath();
+  			}
+  		}
+
+  		this._fillStroke(ctx, layer);
+
+  		// TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature
+  	},
+
+  	_updateCircle: function (layer) {
+
+  		if (!this._drawing || layer._empty()) { return; }
+
+  		var p = layer._point,
+  		    ctx = this._ctx,
+  		    r = Math.max(Math.round(layer._radius), 1),
+  		    s = (Math.max(Math.round(layer._radiusY), 1) || r) / r;
+
+  		if (s !== 1) {
+  			ctx.save();
+  			ctx.scale(1, s);
+  		}
+
+  		ctx.beginPath();
+  		ctx.arc(p.x, p.y / s, r, 0, Math.PI * 2, false);
+
+  		if (s !== 1) {
+  			ctx.restore();
+  		}
+
+  		this._fillStroke(ctx, layer);
+  	},
+
+  	_fillStroke: function (ctx, layer) {
+  		var options = layer.options;
+
+  		if (options.fill) {
+  			ctx.globalAlpha = options.fillOpacity;
+  			ctx.fillStyle = options.fillColor || options.color;
+  			ctx.fill(options.fillRule || 'evenodd');
+  		}
+
+  		if (options.stroke && options.weight !== 0) {
+  			if (ctx.setLineDash) {
+  				ctx.setLineDash(layer.options && layer.options._dashArray || []);
+  			}
+  			ctx.globalAlpha = options.opacity;
+  			ctx.lineWidth = options.weight;
+  			ctx.strokeStyle = options.color;
+  			ctx.lineCap = options.lineCap;
+  			ctx.lineJoin = options.lineJoin;
+  			ctx.stroke();
+  		}
+  	},
+
+  	// Canvas obviously doesn't have mouse events for individual drawn objects,
+  	// so we emulate that by calculating what's under the mouse on mousemove/click manually
+
+  	_onClick: function (e) {
+  		var point = this._map.mouseEventToLayerPoint(e), layer, clickedLayer;
+
+  		for (var order = this._drawFirst; order; order = order.next) {
+  			layer = order.layer;
+  			if (layer.options.interactive && layer._containsPoint(point)) {
+  				if (!(e.type === 'click' || e.type !== 'preclick') || !this._map._draggableMoved(layer)) {
+  					clickedLayer = layer;
+  				}
+  			}
+  		}
+  		if (clickedLayer)  {
+  			fakeStop(e);
+  			this._fireEvent([clickedLayer], e);
+  		}
+  	},
+
+  	_onMouseMove: function (e) {
+  		if (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { return; }
+
+  		var point = this._map.mouseEventToLayerPoint(e);
+  		this._handleMouseHover(e, point);
+  	},
+
+
+  	_handleMouseOut: function (e) {
+  		var layer = this._hoveredLayer;
+  		if (layer) {
+  			// if we're leaving the layer, fire mouseout
+  			removeClass(this._container, 'leaflet-interactive');
+  			this._fireEvent([layer], e, 'mouseout');
+  			this._hoveredLayer = null;
+  			this._mouseHoverThrottled = false;
+  		}
+  	},
+
+  	_handleMouseHover: function (e, point) {
+  		if (this._mouseHoverThrottled) {
+  			return;
+  		}
+
+  		var layer, candidateHoveredLayer;
+
+  		for (var order = this._drawFirst; order; order = order.next) {
+  			layer = order.layer;
+  			if (layer.options.interactive && layer._containsPoint(point)) {
+  				candidateHoveredLayer = layer;
+  			}
+  		}
+
+  		if (candidateHoveredLayer !== this._hoveredLayer) {
+  			this._handleMouseOut(e);
+
+  			if (candidateHoveredLayer) {
+  				addClass(this._container, 'leaflet-interactive'); // change cursor
+  				this._fireEvent([candidateHoveredLayer], e, 'mouseover');
+  				this._hoveredLayer = candidateHoveredLayer;
+  			}
+  		}
+
+  		if (this._hoveredLayer) {
+  			this._fireEvent([this._hoveredLayer], e);
+  		}
+
+  		this._mouseHoverThrottled = true;
+  		setTimeout(bind(function () {
+  			this._mouseHoverThrottled = false;
+  		}, this), 32);
+  	},
+
+  	_fireEvent: function (layers, e, type) {
+  		this._map._fireDOMEvent(e, type || e.type, layers);
+  	},
+
+  	_bringToFront: function (layer) {
+  		var order = layer._order;
+
+  		if (!order) { return; }
+
+  		var next = order.next;
+  		var prev = order.prev;
+
+  		if (next) {
+  			next.prev = prev;
+  		} else {
+  			// Already last
+  			return;
+  		}
+  		if (prev) {
+  			prev.next = next;
+  		} else if (next) {
+  			// Update first entry unless this is the
+  			// single entry
+  			this._drawFirst = next;
+  		}
+
+  		order.prev = this._drawLast;
+  		this._drawLast.next = order;
+
+  		order.next = null;
+  		this._drawLast = order;
+
+  		this._requestRedraw(layer);
+  	},
+
+  	_bringToBack: function (layer) {
+  		var order = layer._order;
+
+  		if (!order) { return; }
+
+  		var next = order.next;
+  		var prev = order.prev;
+
+  		if (prev) {
+  			prev.next = next;
+  		} else {
+  			// Already first
+  			return;
+  		}
+  		if (next) {
+  			next.prev = prev;
+  		} else if (prev) {
+  			// Update last entry unless this is the
+  			// single entry
+  			this._drawLast = prev;
+  		}
+
+  		order.prev = null;
+
+  		order.next = this._drawFirst;
+  		this._drawFirst.prev = order;
+  		this._drawFirst = order;
+
+  		this._requestRedraw(layer);
+  	}
+  });
+
+  // @factory L.canvas(options?: Renderer options)
+  // Creates a Canvas renderer with the given options.
+  function canvas$1(options) {
+  	return canvas ? new Canvas(options) : null;
+  }
+
+  /*
+   * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!
+   */
+
+
+  var vmlCreate = (function () {
+  	try {
+  		document.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');
+  		return function (name) {
+  			return document.createElement('<lvml:' + name + ' class="lvml">');
+  		};
+  	} catch (e) {
+  		return function (name) {
+  			return document.createElement('<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">');
+  		};
+  	}
+  })();
+
+
+  /*
+   * @class SVG
+   *
+   *
+   * VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility
+   * with old versions of Internet Explorer.
+   */
+
+  // mixin to redefine some SVG methods to handle VML syntax which is similar but with some differences
+  var vmlMixin = {
+
+  	_initContainer: function () {
+  		this._container = create$1('div', 'leaflet-vml-container');
+  	},
+
+  	_update: function () {
+  		if (this._map._animatingZoom) { return; }
+  		Renderer.prototype._update.call(this);
+  		this.fire('update');
+  	},
+
+  	_initPath: function (layer) {
+  		var container = layer._container = vmlCreate('shape');
+
+  		addClass(container, 'leaflet-vml-shape ' + (this.options.className || ''));
+
+  		container.coordsize = '1 1';
+
+  		layer._path = vmlCreate('path');
+  		container.appendChild(layer._path);
+
+  		this._updateStyle(layer);
+  		this._layers[stamp(layer)] = layer;
+  	},
+
+  	_addPath: function (layer) {
+  		var container = layer._container;
+  		this._container.appendChild(container);
+
+  		if (layer.options.interactive) {
+  			layer.addInteractiveTarget(container);
+  		}
+  	},
+
+  	_removePath: function (layer) {
+  		var container = layer._container;
+  		remove(container);
+  		layer.removeInteractiveTarget(container);
+  		delete this._layers[stamp(layer)];
+  	},
+
+  	_updateStyle: function (layer) {
+  		var stroke = layer._stroke,
+  		    fill = layer._fill,
+  		    options = layer.options,
+  		    container = layer._container;
+
+  		container.stroked = !!options.stroke;
+  		container.filled = !!options.fill;
+
+  		if (options.stroke) {
+  			if (!stroke) {
+  				stroke = layer._stroke = vmlCreate('stroke');
+  			}
+  			container.appendChild(stroke);
+  			stroke.weight = options.weight + 'px';
+  			stroke.color = options.color;
+  			stroke.opacity = options.opacity;
+
+  			if (options.dashArray) {
+  				stroke.dashStyle = isArray(options.dashArray) ?
+  				    options.dashArray.join(' ') :
+  				    options.dashArray.replace(/( *, *)/g, ' ');
+  			} else {
+  				stroke.dashStyle = '';
+  			}
+  			stroke.endcap = options.lineCap.replace('butt', 'flat');
+  			stroke.joinstyle = options.lineJoin;
+
+  		} else if (stroke) {
+  			container.removeChild(stroke);
+  			layer._stroke = null;
+  		}
+
+  		if (options.fill) {
+  			if (!fill) {
+  				fill = layer._fill = vmlCreate('fill');
+  			}
+  			container.appendChild(fill);
+  			fill.color = options.fillColor || options.color;
+  			fill.opacity = options.fillOpacity;
+
+  		} else if (fill) {
+  			container.removeChild(fill);
+  			layer._fill = null;
+  		}
+  	},
+
+  	_updateCircle: function (layer) {
+  		var p = layer._point.round(),
+  		    r = Math.round(layer._radius),
+  		    r2 = Math.round(layer._radiusY || r);
+
+  		this._setPath(layer, layer._empty() ? 'M0 0' :
+  			'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r2 + ' 0,' + (65535 * 360));
+  	},
+
+  	_setPath: function (layer, path) {
+  		layer._path.v = path;
+  	},
+
+  	_bringToFront: function (layer) {
+  		toFront(layer._container);
+  	},
+
+  	_bringToBack: function (layer) {
+  		toBack(layer._container);
+  	}
+  };
+
+  var create$2 = vml ? vmlCreate : svgCreate;
+
+  /*
+   * @class SVG
+   * @inherits Renderer
+   * @aka L.SVG
+   *
+   * Allows vector layers to be displayed with [SVG](https://developer.mozilla.org/docs/Web/SVG).
+   * Inherits `Renderer`.
+   *
+   * Due to [technical limitations](http://caniuse.com/#search=svg), SVG is not
+   * available in all web browsers, notably Android 2.x and 3.x.
+   *
+   * Although SVG is not available on IE7 and IE8, these browsers support
+   * [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language)
+   * (a now deprecated technology), and the SVG renderer will fall back to VML in
+   * this case.
+   *
+   * @example
+   *
+   * Use SVG by default for all paths in the map:
+   *
+   * ```js
+   * var map = L.map('map', {
+   * 	renderer: L.svg()
+   * });
+   * ```
+   *
+   * Use a SVG renderer with extra padding for specific vector geometries:
+   *
+   * ```js
+   * var map = L.map('map');
+   * var myRenderer = L.svg({ padding: 0.5 });
+   * var line = L.polyline( coordinates, { renderer: myRenderer } );
+   * var circle = L.circle( center, { renderer: myRenderer } );
+   * ```
+   */
+
+  var SVG = Renderer.extend({
+
+  	getEvents: function () {
+  		var events = Renderer.prototype.getEvents.call(this);
+  		events.zoomstart = this._onZoomStart;
+  		return events;
+  	},
+
+  	_initContainer: function () {
+  		this._container = create$2('svg');
+
+  		// makes it possible to click through svg root; we'll reset it back in individual paths
+  		this._container.setAttribute('pointer-events', 'none');
+
+  		this._rootGroup = create$2('g');
+  		this._container.appendChild(this._rootGroup);
+  	},
+
+  	_destroyContainer: function () {
+  		remove(this._container);
+  		off(this._container);
+  		delete this._container;
+  		delete this._rootGroup;
+  		delete this._svgSize;
+  	},
+
+  	_onZoomStart: function () {
+  		// Drag-then-pinch interactions might mess up the center and zoom.
+  		// In this case, the easiest way to prevent this is re-do the renderer
+  		//   bounds and padding when the zooming starts.
+  		this._update();
+  	},
+
+  	_update: function () {
+  		if (this._map._animatingZoom && this._bounds) { return; }
+
+  		Renderer.prototype._update.call(this);
+
+  		var b = this._bounds,
+  		    size = b.getSize(),
+  		    container = this._container;
+
+  		// set size of svg-container if changed
+  		if (!this._svgSize || !this._svgSize.equals(size)) {
+  			this._svgSize = size;
+  			container.setAttribute('width', size.x);
+  			container.setAttribute('height', size.y);
+  		}
+
+  		// movement: update container viewBox so that we don't have to change coordinates of individual layers
+  		setPosition(container, b.min);
+  		container.setAttribute('viewBox', [b.min.x, b.min.y, size.x, size.y].join(' '));
+
+  		this.fire('update');
+  	},
+
+  	// methods below are called by vector layers implementations
+
+  	_initPath: function (layer) {
+  		var path = layer._path = create$2('path');
+
+  		// @namespace Path
+  		// @option className: String = null
+  		// Custom class name set on an element. Only for SVG renderer.
+  		if (layer.options.className) {
+  			addClass(path, layer.options.className);
+  		}
+
+  		if (layer.options.interactive) {
+  			addClass(path, 'leaflet-interactive');
+  		}
+
+  		this._updateStyle(layer);
+  		this._layers[stamp(layer)] = layer;
+  	},
+
+  	_addPath: function (layer) {
+  		if (!this._rootGroup) { this._initContainer(); }
+  		this._rootGroup.appendChild(layer._path);
+  		layer.addInteractiveTarget(layer._path);
+  	},
+
+  	_removePath: function (layer) {
+  		remove(layer._path);
+  		layer.removeInteractiveTarget(layer._path);
+  		delete this._layers[stamp(layer)];
+  	},
+
+  	_updatePath: function (layer) {
+  		layer._project();
+  		layer._update();
+  	},
+
+  	_updateStyle: function (layer) {
+  		var path = layer._path,
+  		    options = layer.options;
+
+  		if (!path) { return; }
+
+  		if (options.stroke) {
+  			path.setAttribute('stroke', options.color);
+  			path.setAttribute('stroke-opacity', options.opacity);
+  			path.setAttribute('stroke-width', options.weight);
+  			path.setAttribute('stroke-linecap', options.lineCap);
+  			path.setAttribute('stroke-linejoin', options.lineJoin);
+
+  			if (options.dashArray) {
+  				path.setAttribute('stroke-dasharray', options.dashArray);
+  			} else {
+  				path.removeAttribute('stroke-dasharray');
+  			}
+
+  			if (options.dashOffset) {
+  				path.setAttribute('stroke-dashoffset', options.dashOffset);
+  			} else {
+  				path.removeAttribute('stroke-dashoffset');
+  			}
+  		} else {
+  			path.setAttribute('stroke', 'none');
+  		}
+
+  		if (options.fill) {
+  			path.setAttribute('fill', options.fillColor || options.color);
+  			path.setAttribute('fill-opacity', options.fillOpacity);
+  			path.setAttribute('fill-rule', options.fillRule || 'evenodd');
+  		} else {
+  			path.setAttribute('fill', 'none');
+  		}
+  	},
+
+  	_updatePoly: function (layer, closed) {
+  		this._setPath(layer, pointsToPath(layer._parts, closed));
+  	},
+
+  	_updateCircle: function (layer) {
+  		var p = layer._point,
+  		    r = Math.max(Math.round(layer._radius), 1),
+  		    r2 = Math.max(Math.round(layer._radiusY), 1) || r,
+  		    arc = 'a' + r + ',' + r2 + ' 0 1,0 ';
+
+  		// drawing a circle with two half-arcs
+  		var d = layer._empty() ? 'M0 0' :
+  			'M' + (p.x - r) + ',' + p.y +
+  			arc + (r * 2) + ',0 ' +
+  			arc + (-r * 2) + ',0 ';
+
+  		this._setPath(layer, d);
+  	},
+
+  	_setPath: function (layer, path) {
+  		layer._path.setAttribute('d', path);
+  	},
+
+  	// SVG does not have the concept of zIndex so we resort to changing the DOM order of elements
+  	_bringToFront: function (layer) {
+  		toFront(layer._path);
+  	},
+
+  	_bringToBack: function (layer) {
+  		toBack(layer._path);
+  	}
+  });
+
+  if (vml) {
+  	SVG.include(vmlMixin);
+  }
+
+  // @namespace SVG
+  // @factory L.svg(options?: Renderer options)
+  // Creates a SVG renderer with the given options.
+  function svg$1(options) {
+  	return svg || vml ? new SVG(options) : null;
+  }
+
+  Map.include({
+  	// @namespace Map; @method getRenderer(layer: Path): Renderer
+  	// Returns the instance of `Renderer` that should be used to render the given
+  	// `Path`. It will ensure that the `renderer` options of the map and paths
+  	// are respected, and that the renderers do exist on the map.
+  	getRenderer: function (layer) {
+  		// @namespace Path; @option renderer: Renderer
+  		// Use this specific instance of `Renderer` for this path. Takes
+  		// precedence over the map's [default renderer](#map-renderer).
+  		var renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer;
+
+  		if (!renderer) {
+  			renderer = this._renderer = this._createRenderer();
+  		}
+
+  		if (!this.hasLayer(renderer)) {
+  			this.addLayer(renderer);
+  		}
+  		return renderer;
+  	},
+
+  	_getPaneRenderer: function (name) {
+  		if (name === 'overlayPane' || name === undefined) {
+  			return false;
+  		}
+
+  		var renderer = this._paneRenderers[name];
+  		if (renderer === undefined) {
+  			renderer = this._createRenderer({pane: name});
+  			this._paneRenderers[name] = renderer;
+  		}
+  		return renderer;
+  	},
+
+  	_createRenderer: function (options) {
+  		// @namespace Map; @option preferCanvas: Boolean = false
+  		// Whether `Path`s should be rendered on a `Canvas` renderer.
+  		// By default, all `Path`s are rendered in a `SVG` renderer.
+  		return (this.options.preferCanvas && canvas$1(options)) || svg$1(options);
+  	}
+  });
+
+  /*
+   * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.
+   */
+
+  /*
+   * @class Rectangle
+   * @aka L.Rectangle
+   * @inherits Polygon
+   *
+   * A class for drawing rectangle overlays on a map. Extends `Polygon`.
+   *
+   * @example
+   *
+   * ```js
+   * // define rectangle geographical bounds
+   * var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
+   *
+   * // create an orange rectangle
+   * L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);
+   *
+   * // zoom the map to the rectangle bounds
+   * map.fitBounds(bounds);
+   * ```
+   *
+   */
+
+
+  var Rectangle = Polygon.extend({
+  	initialize: function (latLngBounds, options) {
+  		Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);
+  	},
+
+  	// @method setBounds(latLngBounds: LatLngBounds): this
+  	// Redraws the rectangle with the passed bounds.
+  	setBounds: function (latLngBounds) {
+  		return this.setLatLngs(this._boundsToLatLngs(latLngBounds));
+  	},
+
+  	_boundsToLatLngs: function (latLngBounds) {
+  		latLngBounds = toLatLngBounds(latLngBounds);
+  		return [
+  			latLngBounds.getSouthWest(),
+  			latLngBounds.getNorthWest(),
+  			latLngBounds.getNorthEast(),
+  			latLngBounds.getSouthEast()
+  		];
+  	}
+  });
+
+
+  // @factory L.rectangle(latLngBounds: LatLngBounds, options?: Polyline options)
+  function rectangle(latLngBounds, options) {
+  	return new Rectangle(latLngBounds, options);
+  }
+
+  SVG.create = create$2;
+  SVG.pointsToPath = pointsToPath;
+
+  GeoJSON.geometryToLayer = geometryToLayer;
+  GeoJSON.coordsToLatLng = coordsToLatLng;
+  GeoJSON.coordsToLatLngs = coordsToLatLngs;
+  GeoJSON.latLngToCoords = latLngToCoords;
+  GeoJSON.latLngsToCoords = latLngsToCoords;
+  GeoJSON.getFeature = getFeature;
+  GeoJSON.asFeature = asFeature;
+
+  /*
+   * L.Handler.BoxZoom is used to add shift-drag zoom interaction to the map
+   * (zoom to a selected bounding box), enabled by default.
+   */
+
+  // @namespace Map
+  // @section Interaction Options
+  Map.mergeOptions({
+  	// @option boxZoom: Boolean = true
+  	// Whether the map can be zoomed to a rectangular area specified by
+  	// dragging the mouse while pressing the shift key.
+  	boxZoom: true
+  });
+
+  var BoxZoom = Handler.extend({
+  	initialize: function (map) {
+  		this._map = map;
+  		this._container = map._container;
+  		this._pane = map._panes.overlayPane;
+  		this._resetStateTimeout = 0;
+  		map.on('unload', this._destroy, this);
+  	},
+
+  	addHooks: function () {
+  		on(this._container, 'mousedown', this._onMouseDown, this);
+  	},
+
+  	removeHooks: function () {
+  		off(this._container, 'mousedown', this._onMouseDown, this);
+  	},
+
+  	moved: function () {
+  		return this._moved;
+  	},
+
+  	_destroy: function () {
+  		remove(this._pane);
+  		delete this._pane;
+  	},
+
+  	_resetState: function () {
+  		this._resetStateTimeout = 0;
+  		this._moved = false;
+  	},
+
+  	_clearDeferredResetState: function () {
+  		if (this._resetStateTimeout !== 0) {
+  			clearTimeout(this._resetStateTimeout);
+  			this._resetStateTimeout = 0;
+  		}
+  	},
+
+  	_onMouseDown: function (e) {
+  		if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }
+
+  		// Clear the deferred resetState if it hasn't executed yet, otherwise it
+  		// will interrupt the interaction and orphan a box element in the container.
+  		this._clearDeferredResetState();
+  		this._resetState();
+
+  		disableTextSelection();
+  		disableImageDrag();
+
+  		this._startPoint = this._map.mouseEventToContainerPoint(e);
+
+  		on(document, {
+  			contextmenu: stop,
+  			mousemove: this._onMouseMove,
+  			mouseup: this._onMouseUp,
+  			keydown: this._onKeyDown
+  		}, this);
+  	},
+
+  	_onMouseMove: function (e) {
+  		if (!this._moved) {
+  			this._moved = true;
+
+  			this._box = create$1('div', 'leaflet-zoom-box', this._container);
+  			addClass(this._container, 'leaflet-crosshair');
+
+  			this._map.fire('boxzoomstart');
+  		}
+
+  		this._point = this._map.mouseEventToContainerPoint(e);
+
+  		var bounds = new Bounds(this._point, this._startPoint),
+  		    size = bounds.getSize();
+
+  		setPosition(this._box, bounds.min);
+
+  		this._box.style.width  = size.x + 'px';
+  		this._box.style.height = size.y + 'px';
+  	},
+
+  	_finish: function () {
+  		if (this._moved) {
+  			remove(this._box);
+  			removeClass(this._container, 'leaflet-crosshair');
+  		}
+
+  		enableTextSelection();
+  		enableImageDrag();
+
+  		off(document, {
+  			contextmenu: stop,
+  			mousemove: this._onMouseMove,
+  			mouseup: this._onMouseUp,
+  			keydown: this._onKeyDown
+  		}, this);
+  	},
+
+  	_onMouseUp: function (e) {
+  		if ((e.which !== 1) && (e.button !== 1)) { return; }
+
+  		this._finish();
+
+  		if (!this._moved) { return; }
+  		// Postpone to next JS tick so internal click event handling
+  		// still see it as "moved".
+  		this._clearDeferredResetState();
+  		this._resetStateTimeout = setTimeout(bind(this._resetState, this), 0);
+
+  		var bounds = new LatLngBounds(
+  		        this._map.containerPointToLatLng(this._startPoint),
+  		        this._map.containerPointToLatLng(this._point));
+
+  		this._map
+  			.fitBounds(bounds)
+  			.fire('boxzoomend', {boxZoomBounds: bounds});
+  	},
+
+  	_onKeyDown: function (e) {
+  		if (e.keyCode === 27) {
+  			this._finish();
+  		}
+  	}
+  });
+
+  // @section Handlers
+  // @property boxZoom: Handler
+  // Box (shift-drag with mouse) zoom handler.
+  Map.addInitHook('addHandler', 'boxZoom', BoxZoom);
+
+  /*
+   * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.
+   */
+
+  // @namespace Map
+  // @section Interaction Options
+
+  Map.mergeOptions({
+  	// @option doubleClickZoom: Boolean|String = true
+  	// Whether the map can be zoomed in by double clicking on it and
+  	// zoomed out by double clicking while holding shift. If passed
+  	// `'center'`, double-click zoom will zoom to the center of the
+  	//  view regardless of where the mouse was.
+  	doubleClickZoom: true
+  });
+
+  var DoubleClickZoom = Handler.extend({
+  	addHooks: function () {
+  		this._map.on('dblclick', this._onDoubleClick, this);
+  	},
+
+  	removeHooks: function () {
+  		this._map.off('dblclick', this._onDoubleClick, this);
+  	},
+
+  	_onDoubleClick: function (e) {
+  		var map = this._map,
+  		    oldZoom = map.getZoom(),
+  		    delta = map.options.zoomDelta,
+  		    zoom = e.originalEvent.shiftKey ? oldZoom - delta : oldZoom + delta;
+
+  		if (map.options.doubleClickZoom === 'center') {
+  			map.setZoom(zoom);
+  		} else {
+  			map.setZoomAround(e.containerPoint, zoom);
+  		}
+  	}
+  });
+
+  // @section Handlers
+  //
+  // Map properties include interaction handlers that allow you to control
+  // interaction behavior in runtime, enabling or disabling certain features such
+  // as dragging or touch zoom (see `Handler` methods). For example:
+  //
+  // ```js
+  // map.doubleClickZoom.disable();
+  // ```
+  //
+  // @property doubleClickZoom: Handler
+  // Double click zoom handler.
+  Map.addInitHook('addHandler', 'doubleClickZoom', DoubleClickZoom);
+
+  /*
+   * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.
+   */
+
+  // @namespace Map
+  // @section Interaction Options
+  Map.mergeOptions({
+  	// @option dragging: Boolean = true
+  	// Whether the map be draggable with mouse/touch or not.
+  	dragging: true,
+
+  	// @section Panning Inertia Options
+  	// @option inertia: Boolean = *
+  	// If enabled, panning of the map will have an inertia effect where
+  	// the map builds momentum while dragging and continues moving in
+  	// the same direction for some time. Feels especially nice on touch
+  	// devices. Enabled by default unless running on old Android devices.
+  	inertia: !android23,
+
+  	// @option inertiaDeceleration: Number = 3000
+  	// The rate with which the inertial movement slows down, in pixels/second².
+  	inertiaDeceleration: 3400, // px/s^2
+
+  	// @option inertiaMaxSpeed: Number = Infinity
+  	// Max speed of the inertial movement, in pixels/second.
+  	inertiaMaxSpeed: Infinity, // px/s
+
+  	// @option easeLinearity: Number = 0.2
+  	easeLinearity: 0.2,
+
+  	// TODO refactor, move to CRS
+  	// @option worldCopyJump: Boolean = false
+  	// With this option enabled, the map tracks when you pan to another "copy"
+  	// of the world and seamlessly jumps to the original one so that all overlays
+  	// like markers and vector layers are still visible.
+  	worldCopyJump: false,
+
+  	// @option maxBoundsViscosity: Number = 0.0
+  	// If `maxBounds` is set, this option will control how solid the bounds
+  	// are when dragging the map around. The default value of `0.0` allows the
+  	// user to drag outside the bounds at normal speed, higher values will
+  	// slow down map dragging outside bounds, and `1.0` makes the bounds fully
+  	// solid, preventing the user from dragging outside the bounds.
+  	maxBoundsViscosity: 0.0
+  });
+
+  var Drag = Handler.extend({
+  	addHooks: function () {
+  		if (!this._draggable) {
+  			var map = this._map;
+
+  			this._draggable = new Draggable(map._mapPane, map._container);
+
+  			this._draggable.on({
+  				dragstart: this._onDragStart,
+  				drag: this._onDrag,
+  				dragend: this._onDragEnd
+  			}, this);
+
+  			this._draggable.on('predrag', this._onPreDragLimit, this);
+  			if (map.options.worldCopyJump) {
+  				this._draggable.on('predrag', this._onPreDragWrap, this);
+  				map.on('zoomend', this._onZoomEnd, this);
+
+  				map.whenReady(this._onZoomEnd, this);
+  			}
+  		}
+  		addClass(this._map._container, 'leaflet-grab leaflet-touch-drag');
+  		this._draggable.enable();
+  		this._positions = [];
+  		this._times = [];
+  	},
+
+  	removeHooks: function () {
+  		removeClass(this._map._container, 'leaflet-grab');
+  		removeClass(this._map._container, 'leaflet-touch-drag');
+  		this._draggable.disable();
+  	},
+
+  	moved: function () {
+  		return this._draggable && this._draggable._moved;
+  	},
+
+  	moving: function () {
+  		return this._draggable && this._draggable._moving;
+  	},
+
+  	_onDragStart: function () {
+  		var map = this._map;
+
+  		map._stop();
+  		if (this._map.options.maxBounds && this._map.options.maxBoundsViscosity) {
+  			var bounds = toLatLngBounds(this._map.options.maxBounds);
+
+  			this._offsetLimit = toBounds(
+  				this._map.latLngToContainerPoint(bounds.getNorthWest()).multiplyBy(-1),
+  				this._map.latLngToContainerPoint(bounds.getSouthEast()).multiplyBy(-1)
+  					.add(this._map.getSize()));
+
+  			this._viscosity = Math.min(1.0, Math.max(0.0, this._map.options.maxBoundsViscosity));
+  		} else {
+  			this._offsetLimit = null;
+  		}
+
+  		map
+  		    .fire('movestart')
+  		    .fire('dragstart');
+
+  		if (map.options.inertia) {
+  			this._positions = [];
+  			this._times = [];
+  		}
+  	},
+
+  	_onDrag: function (e) {
+  		if (this._map.options.inertia) {
+  			var time = this._lastTime = +new Date(),
+  			    pos = this._lastPos = this._draggable._absPos || this._draggable._newPos;
+
+  			this._positions.push(pos);
+  			this._times.push(time);
+
+  			this._prunePositions(time);
+  		}
+
+  		this._map
+  		    .fire('move', e)
+  		    .fire('drag', e);
+  	},
+
+  	_prunePositions: function (time) {
+  		while (this._positions.length > 1 && time - this._times[0] > 50) {
+  			this._positions.shift();
+  			this._times.shift();
+  		}
+  	},
+
+  	_onZoomEnd: function () {
+  		var pxCenter = this._map.getSize().divideBy(2),
+  		    pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);
+
+  		this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;
+  		this._worldWidth = this._map.getPixelWorldBounds().getSize().x;
+  	},
+
+  	_viscousLimit: function (value, threshold) {
+  		return value - (value - threshold) * this._viscosity;
+  	},
+
+  	_onPreDragLimit: function () {
+  		if (!this._viscosity || !this._offsetLimit) { return; }
+
+  		var offset = this._draggable._newPos.subtract(this._draggable._startPos);
+
+  		var limit = this._offsetLimit;
+  		if (offset.x < limit.min.x) { offset.x = this._viscousLimit(offset.x, limit.min.x); }
+  		if (offset.y < limit.min.y) { offset.y = this._viscousLimit(offset.y, limit.min.y); }
+  		if (offset.x > limit.max.x) { offset.x = this._viscousLimit(offset.x, limit.max.x); }
+  		if (offset.y > limit.max.y) { offset.y = this._viscousLimit(offset.y, limit.max.y); }
+
+  		this._draggable._newPos = this._draggable._startPos.add(offset);
+  	},
+
+  	_onPreDragWrap: function () {
+  		// TODO refactor to be able to adjust map pane position after zoom
+  		var worldWidth = this._worldWidth,
+  		    halfWidth = Math.round(worldWidth / 2),
+  		    dx = this._initialWorldOffset,
+  		    x = this._draggable._newPos.x,
+  		    newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,
+  		    newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,
+  		    newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;
+
+  		this._draggable._absPos = this._draggable._newPos.clone();
+  		this._draggable._newPos.x = newX;
+  	},
+
+  	_onDragEnd: function (e) {
+  		var map = this._map,
+  		    options = map.options,
+
+  		    noInertia = !options.inertia || this._times.length < 2;
+
+  		map.fire('dragend', e);
+
+  		if (noInertia) {
+  			map.fire('moveend');
+
+  		} else {
+  			this._prunePositions(+new Date());
+
+  			var direction = this._lastPos.subtract(this._positions[0]),
+  			    duration = (this._lastTime - this._times[0]) / 1000,
+  			    ease = options.easeLinearity,
+
+  			    speedVector = direction.multiplyBy(ease / duration),
+  			    speed = speedVector.distanceTo([0, 0]),
+
+  			    limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),
+  			    limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),
+
+  			    decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),
+  			    offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();
+
+  			if (!offset.x && !offset.y) {
+  				map.fire('moveend');
+
+  			} else {
+  				offset = map._limitOffset(offset, map.options.maxBounds);
+
+  				requestAnimFrame(function () {
+  					map.panBy(offset, {
+  						duration: decelerationDuration,
+  						easeLinearity: ease,
+  						noMoveStart: true,
+  						animate: true
+  					});
+  				});
+  			}
+  		}
+  	}
+  });
+
+  // @section Handlers
+  // @property dragging: Handler
+  // Map dragging handler (by both mouse and touch).
+  Map.addInitHook('addHandler', 'dragging', Drag);
+
+  /*
+   * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.
+   */
+
+  // @namespace Map
+  // @section Keyboard Navigation Options
+  Map.mergeOptions({
+  	// @option keyboard: Boolean = true
+  	// Makes the map focusable and allows users to navigate the map with keyboard
+  	// arrows and `+`/`-` keys.
+  	keyboard: true,
+
+  	// @option keyboardPanDelta: Number = 80
+  	// Amount of pixels to pan when pressing an arrow key.
+  	keyboardPanDelta: 80
+  });
+
+  var Keyboard = Handler.extend({
+
+  	keyCodes: {
+  		left:    [37],
+  		right:   [39],
+  		down:    [40],
+  		up:      [38],
+  		zoomIn:  [187, 107, 61, 171],
+  		zoomOut: [189, 109, 54, 173]
+  	},
+
+  	initialize: function (map) {
+  		this._map = map;
+
+  		this._setPanDelta(map.options.keyboardPanDelta);
+  		this._setZoomDelta(map.options.zoomDelta);
+  	},
+
+  	addHooks: function () {
+  		var container = this._map._container;
+
+  		// make the container focusable by tabbing
+  		if (container.tabIndex <= 0) {
+  			container.tabIndex = '0';
+  		}
+
+  		on(container, {
+  			focus: this._onFocus,
+  			blur: this._onBlur,
+  			mousedown: this._onMouseDown
+  		}, this);
+
+  		this._map.on({
+  			focus: this._addHooks,
+  			blur: this._removeHooks
+  		}, this);
+  	},
+
+  	removeHooks: function () {
+  		this._removeHooks();
+
+  		off(this._map._container, {
+  			focus: this._onFocus,
+  			blur: this._onBlur,
+  			mousedown: this._onMouseDown
+  		}, this);
+
+  		this._map.off({
+  			focus: this._addHooks,
+  			blur: this._removeHooks
+  		}, this);
+  	},
+
+  	_onMouseDown: function () {
+  		if (this._focused) { return; }
+
+  		var body = document.body,
+  		    docEl = document.documentElement,
+  		    top = body.scrollTop || docEl.scrollTop,
+  		    left = body.scrollLeft || docEl.scrollLeft;
+
+  		this._map._container.focus();
+
+  		window.scrollTo(left, top);
+  	},
+
+  	_onFocus: function () {
+  		this._focused = true;
+  		this._map.fire('focus');
+  	},
+
+  	_onBlur: function () {
+  		this._focused = false;
+  		this._map.fire('blur');
+  	},
+
+  	_setPanDelta: function (panDelta) {
+  		var keys = this._panKeys = {},
+  		    codes = this.keyCodes,
+  		    i, len;
+
+  		for (i = 0, len = codes.left.length; i < len; i++) {
+  			keys[codes.left[i]] = [-1 * panDelta, 0];
+  		}
+  		for (i = 0, len = codes.right.length; i < len; i++) {
+  			keys[codes.right[i]] = [panDelta, 0];
+  		}
+  		for (i = 0, len = codes.down.length; i < len; i++) {
+  			keys[codes.down[i]] = [0, panDelta];
+  		}
+  		for (i = 0, len = codes.up.length; i < len; i++) {
+  			keys[codes.up[i]] = [0, -1 * panDelta];
+  		}
+  	},
+
+  	_setZoomDelta: function (zoomDelta) {
+  		var keys = this._zoomKeys = {},
+  		    codes = this.keyCodes,
+  		    i, len;
+
+  		for (i = 0, len = codes.zoomIn.length; i < len; i++) {
+  			keys[codes.zoomIn[i]] = zoomDelta;
+  		}
+  		for (i = 0, len = codes.zoomOut.length; i < len; i++) {
+  			keys[codes.zoomOut[i]] = -zoomDelta;
+  		}
+  	},
+
+  	_addHooks: function () {
+  		on(document, 'keydown', this._onKeyDown, this);
+  	},
+
+  	_removeHooks: function () {
+  		off(document, 'keydown', this._onKeyDown, this);
+  	},
+
+  	_onKeyDown: function (e) {
+  		if (e.altKey || e.ctrlKey || e.metaKey) { return; }
+
+  		var key = e.keyCode,
+  		    map = this._map,
+  		    offset;
+
+  		if (key in this._panKeys) {
+  			if (!map._panAnim || !map._panAnim._inProgress) {
+  				offset = this._panKeys[key];
+  				if (e.shiftKey) {
+  					offset = toPoint(offset).multiplyBy(3);
+  				}
+
+  				map.panBy(offset);
+
+  				if (map.options.maxBounds) {
+  					map.panInsideBounds(map.options.maxBounds);
+  				}
+  			}
+  		} else if (key in this._zoomKeys) {
+  			map.setZoom(map.getZoom() + (e.shiftKey ? 3 : 1) * this._zoomKeys[key]);
+
+  		} else if (key === 27 && map._popup && map._popup.options.closeOnEscapeKey) {
+  			map.closePopup();
+
+  		} else {
+  			return;
+  		}
+
+  		stop(e);
+  	}
+  });
+
+  // @section Handlers
+  // @section Handlers
+  // @property keyboard: Handler
+  // Keyboard navigation handler.
+  Map.addInitHook('addHandler', 'keyboard', Keyboard);
+
+  /*
+   * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.
+   */
+
+  // @namespace Map
+  // @section Interaction Options
+  Map.mergeOptions({
+  	// @section Mouse wheel options
+  	// @option scrollWheelZoom: Boolean|String = true
+  	// Whether the map can be zoomed by using the mouse wheel. If passed `'center'`,
+  	// it will zoom to the center of the view regardless of where the mouse was.
+  	scrollWheelZoom: true,
+
+  	// @option wheelDebounceTime: Number = 40
+  	// Limits the rate at which a wheel can fire (in milliseconds). By default
+  	// user can't zoom via wheel more often than once per 40 ms.
+  	wheelDebounceTime: 40,
+
+  	// @option wheelPxPerZoomLevel: Number = 60
+  	// How many scroll pixels (as reported by [L.DomEvent.getWheelDelta](#domevent-getwheeldelta))
+  	// mean a change of one full zoom level. Smaller values will make wheel-zooming
+  	// faster (and vice versa).
+  	wheelPxPerZoomLevel: 60
+  });
+
+  var ScrollWheelZoom = Handler.extend({
+  	addHooks: function () {
+  		on(this._map._container, 'wheel', this._onWheelScroll, this);
+
+  		this._delta = 0;
+  	},
+
+  	removeHooks: function () {
+  		off(this._map._container, 'wheel', this._onWheelScroll, this);
+  	},
+
+  	_onWheelScroll: function (e) {
+  		var delta = getWheelDelta(e);
+
+  		var debounce = this._map.options.wheelDebounceTime;
+
+  		this._delta += delta;
+  		this._lastMousePos = this._map.mouseEventToContainerPoint(e);
+
+  		if (!this._startTime) {
+  			this._startTime = +new Date();
+  		}
+
+  		var left = Math.max(debounce - (+new Date() - this._startTime), 0);
+
+  		clearTimeout(this._timer);
+  		this._timer = setTimeout(bind(this._performZoom, this), left);
+
+  		stop(e);
+  	},
+
+  	_performZoom: function () {
+  		var map = this._map,
+  		    zoom = map.getZoom(),
+  		    snap = this._map.options.zoomSnap || 0;
+
+  		map._stop(); // stop panning and fly animations if any
+
+  		// map the delta with a sigmoid function to -4..4 range leaning on -1..1
+  		var d2 = this._delta / (this._map.options.wheelPxPerZoomLevel * 4),
+  		    d3 = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(d2)))) / Math.LN2,
+  		    d4 = snap ? Math.ceil(d3 / snap) * snap : d3,
+  		    delta = map._limitZoom(zoom + (this._delta > 0 ? d4 : -d4)) - zoom;
+
+  		this._delta = 0;
+  		this._startTime = null;
+
+  		if (!delta) { return; }
+
+  		if (map.options.scrollWheelZoom === 'center') {
+  			map.setZoom(zoom + delta);
+  		} else {
+  			map.setZoomAround(this._lastMousePos, zoom + delta);
+  		}
+  	}
+  });
+
+  // @section Handlers
+  // @property scrollWheelZoom: Handler
+  // Scroll wheel zoom handler.
+  Map.addInitHook('addHandler', 'scrollWheelZoom', ScrollWheelZoom);
+
+  /*
+   * L.Map.Tap is used to enable mobile hacks like quick taps and long hold.
+   */
+
+  // @namespace Map
+  // @section Interaction Options
+  Map.mergeOptions({
+  	// @section Touch interaction options
+  	// @option tap: Boolean = true
+  	// Enables mobile hacks for supporting instant taps (fixing 200ms click
+  	// delay on iOS/Android) and touch holds (fired as `contextmenu` events).
+  	tap: true,
+
+  	// @option tapTolerance: Number = 15
+  	// The max number of pixels a user can shift his finger during touch
+  	// for it to be considered a valid tap.
+  	tapTolerance: 15
+  });
+
+  var Tap = Handler.extend({
+  	addHooks: function () {
+  		on(this._map._container, 'touchstart', this._onDown, this);
+  	},
+
+  	removeHooks: function () {
+  		off(this._map._container, 'touchstart', this._onDown, this);
+  	},
+
+  	_onDown: function (e) {
+  		if (!e.touches) { return; }
+
+  		preventDefault(e);
+
+  		this._fireClick = true;
+
+  		// don't simulate click or track longpress if more than 1 touch
+  		if (e.touches.length > 1) {
+  			this._fireClick = false;
+  			clearTimeout(this._holdTimeout);
+  			return;
+  		}
+
+  		var first = e.touches[0],
+  		    el = first.target;
+
+  		this._startPos = this._newPos = new Point(first.clientX, first.clientY);
+
+  		// if touching a link, highlight it
+  		if (el.tagName && el.tagName.toLowerCase() === 'a') {
+  			addClass(el, 'leaflet-active');
+  		}
+
+  		// simulate long hold but setting a timeout
+  		this._holdTimeout = setTimeout(bind(function () {
+  			if (this._isTapValid()) {
+  				this._fireClick = false;
+  				this._onUp();
+  				this._simulateEvent('contextmenu', first);
+  			}
+  		}, this), 1000);
+
+  		this._simulateEvent('mousedown', first);
+
+  		on(document, {
+  			touchmove: this._onMove,
+  			touchend: this._onUp
+  		}, this);
+  	},
+
+  	_onUp: function (e) {
+  		clearTimeout(this._holdTimeout);
+
+  		off(document, {
+  			touchmove: this._onMove,
+  			touchend: this._onUp
+  		}, this);
+
+  		if (this._fireClick && e && e.changedTouches) {
+
+  			var first = e.changedTouches[0],
+  			    el = first.target;
+
+  			if (el && el.tagName && el.tagName.toLowerCase() === 'a') {
+  				removeClass(el, 'leaflet-active');
+  			}
+
+  			this._simulateEvent('mouseup', first);
+
+  			// simulate click if the touch didn't move too much
+  			if (this._isTapValid()) {
+  				this._simulateEvent('click', first);
+  			}
+  		}
+  	},
+
+  	_isTapValid: function () {
+  		return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;
+  	},
+
+  	_onMove: function (e) {
+  		var first = e.touches[0];
+  		this._newPos = new Point(first.clientX, first.clientY);
+  		this._simulateEvent('mousemove', first);
+  	},
+
+  	_simulateEvent: function (type, e) {
+  		var simulatedEvent = document.createEvent('MouseEvents');
+
+  		simulatedEvent._simulated = true;
+  		e.target._simulatedClick = true;
+
+  		simulatedEvent.initMouseEvent(
+  		        type, true, true, window, 1,
+  		        e.screenX, e.screenY,
+  		        e.clientX, e.clientY,
+  		        false, false, false, false, 0, null);
+
+  		e.target.dispatchEvent(simulatedEvent);
+  	}
+  });
+
+  // @section Handlers
+  // @property tap: Handler
+  // Mobile touch hacks (quick tap and touch hold) handler.
+  if (touch && (!pointer || safari)) {
+  	Map.addInitHook('addHandler', 'tap', Tap);
+  }
+
+  /*
+   * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.
+   */
+
+  // @namespace Map
+  // @section Interaction Options
+  Map.mergeOptions({
+  	// @section Touch interaction options
+  	// @option touchZoom: Boolean|String = *
+  	// Whether the map can be zoomed by touch-dragging with two fingers. If
+  	// passed `'center'`, it will zoom to the center of the view regardless of
+  	// where the touch events (fingers) were. Enabled for touch-capable web
+  	// browsers except for old Androids.
+  	touchZoom: touch && !android23,
+
+  	// @option bounceAtZoomLimits: Boolean = true
+  	// Set it to false if you don't want the map to zoom beyond min/max zoom
+  	// and then bounce back when pinch-zooming.
+  	bounceAtZoomLimits: true
+  });
+
+  var TouchZoom = Handler.extend({
+  	addHooks: function () {
+  		addClass(this._map._container, 'leaflet-touch-zoom');
+  		on(this._map._container, 'touchstart', this._onTouchStart, this);
+  	},
+
+  	removeHooks: function () {
+  		removeClass(this._map._container, 'leaflet-touch-zoom');
+  		off(this._map._container, 'touchstart', this._onTouchStart, this);
+  	},
+
+  	_onTouchStart: function (e) {
+  		var map = this._map;
+  		if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }
+
+  		var p1 = map.mouseEventToContainerPoint(e.touches[0]),
+  		    p2 = map.mouseEventToContainerPoint(e.touches[1]);
+
+  		this._centerPoint = map.getSize()._divideBy(2);
+  		this._startLatLng = map.containerPointToLatLng(this._centerPoint);
+  		if (map.options.touchZoom !== 'center') {
+  			this._pinchStartLatLng = map.containerPointToLatLng(p1.add(p2)._divideBy(2));
+  		}
+
+  		this._startDist = p1.distanceTo(p2);
+  		this._startZoom = map.getZoom();
+
+  		this._moved = false;
+  		this._zooming = true;
+
+  		map._stop();
+
+  		on(document, 'touchmove', this._onTouchMove, this);
+  		on(document, 'touchend', this._onTouchEnd, this);
+
+  		preventDefault(e);
+  	},
+
+  	_onTouchMove: function (e) {
+  		if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }
+
+  		var map = this._map,
+  		    p1 = map.mouseEventToContainerPoint(e.touches[0]),
+  		    p2 = map.mouseEventToContainerPoint(e.touches[1]),
+  		    scale = p1.distanceTo(p2) / this._startDist;
+
+  		this._zoom = map.getScaleZoom(scale, this._startZoom);
+
+  		if (!map.options.bounceAtZoomLimits && (
+  			(this._zoom < map.getMinZoom() && scale < 1) ||
+  			(this._zoom > map.getMaxZoom() && scale > 1))) {
+  			this._zoom = map._limitZoom(this._zoom);
+  		}
+
+  		if (map.options.touchZoom === 'center') {
+  			this._center = this._startLatLng;
+  			if (scale === 1) { return; }
+  		} else {
+  			// Get delta from pinch to center, so centerLatLng is delta applied to initial pinchLatLng
+  			var delta = p1._add(p2)._divideBy(2)._subtract(this._centerPoint);
+  			if (scale === 1 && delta.x === 0 && delta.y === 0) { return; }
+  			this._center = map.unproject(map.project(this._pinchStartLatLng, this._zoom).subtract(delta), this._zoom);
+  		}
+
+  		if (!this._moved) {
+  			map._moveStart(true, false);
+  			this._moved = true;
+  		}
+
+  		cancelAnimFrame(this._animRequest);
+
+  		var moveFn = bind(map._move, map, this._center, this._zoom, {pinch: true, round: false});
+  		this._animRequest = requestAnimFrame(moveFn, this, true);
+
+  		preventDefault(e);
+  	},
+
+  	_onTouchEnd: function () {
+  		if (!this._moved || !this._zooming) {
+  			this._zooming = false;
+  			return;
+  		}
+
+  		this._zooming = false;
+  		cancelAnimFrame(this._animRequest);
+
+  		off(document, 'touchmove', this._onTouchMove, this);
+  		off(document, 'touchend', this._onTouchEnd, this);
+
+  		// Pinch updates GridLayers' levels only when zoomSnap is off, so zoomSnap becomes noUpdate.
+  		if (this._map.options.zoomAnimation) {
+  			this._map._animateZoom(this._center, this._map._limitZoom(this._zoom), true, this._map.options.zoomSnap);
+  		} else {
+  			this._map._resetView(this._center, this._map._limitZoom(this._zoom));
+  		}
+  	}
+  });
+
+  // @section Handlers
+  // @property touchZoom: Handler
+  // Touch zoom handler.
+  Map.addInitHook('addHandler', 'touchZoom', TouchZoom);
+
+  Map.BoxZoom = BoxZoom;
+  Map.DoubleClickZoom = DoubleClickZoom;
+  Map.Drag = Drag;
+  Map.Keyboard = Keyboard;
+  Map.ScrollWheelZoom = ScrollWheelZoom;
+  Map.Tap = Tap;
+  Map.TouchZoom = TouchZoom;
+
+  exports.version = version;
+  exports.Control = Control;
+  exports.control = control;
+  exports.Browser = Browser;
+  exports.Evented = Evented;
+  exports.Mixin = Mixin;
+  exports.Util = Util;
+  exports.Class = Class;
+  exports.Handler = Handler;
+  exports.extend = extend;
+  exports.bind = bind;
+  exports.stamp = stamp;
+  exports.setOptions = setOptions;
+  exports.DomEvent = DomEvent;
+  exports.DomUtil = DomUtil;
+  exports.PosAnimation = PosAnimation;
+  exports.Draggable = Draggable;
+  exports.LineUtil = LineUtil;
+  exports.PolyUtil = PolyUtil;
+  exports.Point = Point;
+  exports.point = toPoint;
+  exports.Bounds = Bounds;
+  exports.bounds = toBounds;
+  exports.Transformation = Transformation;
+  exports.transformation = toTransformation;
+  exports.Projection = index;
+  exports.LatLng = LatLng;
+  exports.latLng = toLatLng;
+  exports.LatLngBounds = LatLngBounds;
+  exports.latLngBounds = toLatLngBounds;
+  exports.CRS = CRS;
+  exports.GeoJSON = GeoJSON;
+  exports.geoJSON = geoJSON;
+  exports.geoJson = geoJson;
+  exports.Layer = Layer;
+  exports.LayerGroup = LayerGroup;
+  exports.layerGroup = layerGroup;
+  exports.FeatureGroup = FeatureGroup;
+  exports.featureGroup = featureGroup;
+  exports.ImageOverlay = ImageOverlay;
+  exports.imageOverlay = imageOverlay;
+  exports.VideoOverlay = VideoOverlay;
+  exports.videoOverlay = videoOverlay;
+  exports.SVGOverlay = SVGOverlay;
+  exports.svgOverlay = svgOverlay;
+  exports.DivOverlay = DivOverlay;
+  exports.Popup = Popup;
+  exports.popup = popup;
+  exports.Tooltip = Tooltip;
+  exports.tooltip = tooltip;
+  exports.Icon = Icon;
+  exports.icon = icon;
+  exports.DivIcon = DivIcon;
+  exports.divIcon = divIcon;
+  exports.Marker = Marker;
+  exports.marker = marker;
+  exports.TileLayer = TileLayer;
+  exports.tileLayer = tileLayer;
+  exports.GridLayer = GridLayer;
+  exports.gridLayer = gridLayer;
+  exports.SVG = SVG;
+  exports.svg = svg$1;
+  exports.Renderer = Renderer;
+  exports.Canvas = Canvas;
+  exports.canvas = canvas$1;
+  exports.Path = Path;
+  exports.CircleMarker = CircleMarker;
+  exports.circleMarker = circleMarker;
+  exports.Circle = Circle;
+  exports.circle = circle;
+  exports.Polyline = Polyline;
+  exports.polyline = polyline;
+  exports.Polygon = Polygon;
+  exports.polygon = polygon;
+  exports.Rectangle = Rectangle;
+  exports.rectangle = rectangle;
+  exports.Map = Map;
+  exports.map = createMap;
+
+  var oldL = window.L;
+  exports.noConflict = function() {
+  	window.L = oldL;
+  	return this;
+  }
+
+  // Always export us to window global (see #2364)
+  window.L = exports;
+
+})));
+//# sourceMappingURL=leaflet-src.js.map
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-1.7.1.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,5 @@
+/* @preserve
+ * Leaflet 1.6.0+Detached: bd88f73e8ddb90eb945a28bc1de9eb07f7386118.bd88f73, a JS library for interactive maps. http://leafletjs.com
+ * (c) 2010-2019 Vladimir Agafonkin, (c) 2010-2011 CloudMade
+ */
+!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i(t.L={})}(this,(function(t){"use strict";function i(t){var i,e,n,o;for(e=1,n=arguments.length;e<n;e++)for(i in o=arguments[e])t[i]=o[i];return t}var e=Object.create||function(){function t(){}return function(i){return t.prototype=i,new t}}();function n(t,i){var e=Array.prototype.slice;if(t.bind)return t.bind.apply(t,e.call(arguments,1));var n=e.call(arguments,2);return function(){return t.apply(i,n.length?n.concat(e.call(arguments)):arguments)}}var o=0;function s(t){return t._leaflet_id=t._leaflet_id||++o,t._leaflet_id}function r(t,i,e){var n,o,s,r;return r=function(){n=!1,o&&(s.apply(e,o),o=!1)},s=function(){n?o=arguments:(t.apply(e,arguments),setTimeout(r,i),n=!0)}}function a(t,i,e){var n=i[1],o=i[0],s=n-o;return t===n&&e?t:((t-o)%s+s)%s+o}function h(){return!1}function u(t,i){var e=Math.pow(10,void 0===i?6:i);return Math.round(t*e)/e}function l(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function c(t){return l(t).split(/\s+/)}function _(t,i){for(var n in Object.prototype.hasOwnProperty.call(t,"options")||(t.options=t.options?e(t.options):{}),i)t.options[n]=i[n];return t.options}function d(t,i,e){var n=[];for(var o in t)n.push(encodeURIComponent(e?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(i&&-1!==i.indexOf("?")?"&":"?")+n.join("&")}var p=/\{ *([\w_-]+) *\}/g;function m(t,i){return t.replace(p,(function(t,e){var n=i[e];if(void 0===n)throw new Error("No value provided for variable "+t);return"function"==typeof n&&(n=n(i)),n}))}var f=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)};function g(t,i){for(var e=0;e<t.length;e++)if(t[e]===i)return e;return-1}var v="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=";function y(t){return window["webkit"+t]||window["moz"+t]||window["ms"+t]}var x=0;function w(t){var i=+new Date,e=Math.max(0,16-(i-x));return x=i+e,window.setTimeout(t,e)}var P=window.requestAnimationFrame||y("RequestAnimationFrame")||w,b=window.cancelAnimationFrame||y("CancelAnimationFrame")||y("CancelRequestAnimationFrame")||function(t){window.clearTimeout(t)};function T(t,i,e){if(!e||P!==w)return P.call(window,n(t,i));t.call(i)}function M(t){t&&b.call(window,t)}var z={extend:i,create:e,bind:n,lastId:o,stamp:s,throttle:r,wrapNum:a,falseFn:h,formatNum:u,trim:l,splitWords:c,setOptions:_,getParamString:d,template:m,isArray:f,indexOf:g,emptyImageUrl:v,requestFn:P,cancelFn:b,requestAnimFrame:T,cancelAnimFrame:M};function C(){}C.extend=function(t){var n=function(){this.initialize&&this.initialize.apply(this,arguments),this.callInitHooks()},o=n.__super__=this.prototype,s=e(o);for(var r in s.constructor=n,n.prototype=s,this)Object.prototype.hasOwnProperty.call(this,r)&&"prototype"!==r&&"__super__"!==r&&(n[r]=this[r]);return t.statics&&(i(n,t.statics),delete t.statics),t.includes&&(!function(t){if("undefined"==typeof L||!L||!L.Mixin)return;t=f(t)?t:[t];for(var i=0;i<t.length;i++)t[i]===L.Mixin.Events&&console.warn("Deprecated include of L.Mixin.Events: this property will be removed in future releases, please inherit from L.Evented instead.",(new Error).stack)}(t.includes),i.apply(null,[s].concat(t.includes)),delete t.includes),s.options&&(t.options=i(e(s.options),t.options)),i(s,t),s._initHooks=[],s.callInitHooks=function(){if(!this._initHooksCalled){o.callInitHooks&&o.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,i=s._initHooks.length;t<i;t++)s._initHooks[t].call(this)}},n},C.include=function(t){return i(this.prototype,t),this},C.mergeOptions=function(t){return i(this.prototype.options,t),this},C.addInitHook=function(t){var i=Array.prototype.slice.call(arguments,1),e="function"==typeof t?t:function(){this[t].apply(this,i)};return this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(e),this};var S={on:function(t,i,e){if("object"==typeof t)for(var n in t)this._on(n,t[n],i);else for(var o=0,s=(t=c(t)).length;o<s;o++)this._on(t[o],i,e);return this},off:function(t,i,e){if(t)if("object"==typeof t)for(var n in t)this._off(n,t[n],i);else for(var o=0,s=(t=c(t)).length;o<s;o++)this._off(t[o],i,e);else delete this._events;return this},_on:function(t,i,e){this._events=this._events||{};var n=this._events[t];n||(n=[],this._events[t]=n),e===this&&(e=void 0);for(var o={fn:i,ctx:e},s=n,r=0,a=s.length;r<a;r++)if(s[r].fn===i&&s[r].ctx===e)return;s.push(o)},_off:function(t,i,e){var n,o,s;if(this._events&&(n=this._events[t]))if(i){if(e===this&&(e=void 0),n)for(o=0,s=n.length;o<s;o++){var r=n[o];if(r.ctx===e&&r.fn===i)return r.fn=h,this._firingCount&&(this._events[t]=n=n.slice()),void n.splice(o,1)}}else{for(o=0,s=n.length;o<s;o++)n[o].fn=h;delete this._events[t]}},fire:function(t,e,n){if(!this.listens(t,n))return this;var o=i({},e,{type:t,target:this,sourceTarget:e&&e.sourceTarget||this});if(this._events){var s=this._events[t];if(s){this._firingCount=this._firingCount+1||1;for(var r=0,a=s.length;r<a;r++){var h=s[r];h.fn.call(h.ctx||this,o)}this._firingCount--}}return n&&this._propagateEvent(o),this},listens:function(t,i){var e=this._events&&this._events[t];if(e&&e.length)return!0;if(i)for(var n in this._eventParents)if(this._eventParents[n].listens(t,i))return!0;return!1},once:function(t,i,e){if("object"==typeof t){for(var o in t)this.once(o,t[o],i);return this}var s=n((function(){this.off(t,i,e).off(t,s,e)}),this);return this.on(t,i,e).on(t,s,e)},addEventParent:function(t){return this._eventParents=this._eventParents||{},this._eventParents[s(t)]=t,this},removeEventParent:function(t){return this._eventParents&&delete this._eventParents[s(t)],this},_propagateEvent:function(t){for(var e in this._eventParents)this._eventParents[e].fire(t.type,i({layer:t.target,propagatedFrom:t.target},t),!0)}};S.addEventListener=S.on,S.removeEventListener=S.clearAllEventListeners=S.off,S.addOneTimeEventListener=S.once,S.fireEvent=S.fire,S.hasEventListeners=S.listens;var Z=C.extend(S);function E(t,i,e){this.x=e?Math.round(t):t,this.y=e?Math.round(i):i}var k=Math.trunc||function(t){return t>0?Math.floor(t):Math.ceil(t)};function B(t,i,e){return t instanceof E?t:f(t)?new E(t[0],t[1]):null==t?t:"object"==typeof t&&"x"in t&&"y"in t?new E(t.x,t.y):new E(t,i,e)}function A(t,i){if(t)for(var e=i?[t,i]:t,n=0,o=e.length;n<o;n++)this.extend(e[n])}function I(t,i){return!t||t instanceof A?t:new A(t,i)}function O(t,i){if(t)for(var e=i?[t,i]:t,n=0,o=e.length;n<o;n++)this.extend(e[n])}function R(t,i){return t instanceof O?t:new O(t,i)}function N(t,i,e){if(isNaN(t)||isNaN(i))throw new Error("Invalid LatLng object: ("+t+", "+i+")");this.lat=+t,this.lng=+i,void 0!==e&&(this.alt=+e)}function D(t,i,e){return t instanceof N?t:f(t)&&"object"!=typeof t[0]?3===t.length?new N(t[0],t[1],t[2]):2===t.length?new N(t[0],t[1]):null:null==t?t:"object"==typeof t&&"lat"in t?new N(t.lat,"lng"in t?t.lng:t.lon,t.alt):void 0===i?null:new N(t,i,e)}E.prototype={clone:function(){return new E(this.x,this.y)},add:function(t){return this.clone()._add(B(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(B(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},scaleBy:function(t){return new E(this.x*t.x,this.y*t.y)},unscaleBy:function(t){return new E(this.x/t.x,this.y/t.y)},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.clone()._ceil()},_ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},trunc:function(){return this.clone()._trunc()},_trunc:function(){return this.x=k(this.x),this.y=k(this.y),this},distanceTo:function(t){var i=(t=B(t)).x-this.x,e=t.y-this.y;return Math.sqrt(i*i+e*e)},equals:function(t){return(t=B(t)).x===this.x&&t.y===this.y},contains:function(t){return t=B(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+u(this.x)+", "+u(this.y)+")"}},A.prototype={extend:function(t){return t=B(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new E((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new E(this.min.x,this.max.y)},getTopRight:function(){return new E(this.max.x,this.min.y)},getTopLeft:function(){return this.min},getBottomRight:function(){return this.max},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var i,e;return(t="number"==typeof t[0]||t instanceof E?B(t):I(t))instanceof A?(i=t.min,e=t.max):i=e=t,i.x>=this.min.x&&e.x<=this.max.x&&i.y>=this.min.y&&e.y<=this.max.y},intersects:function(t){t=I(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>=i.x&&n.x<=e.x,r=o.y>=i.y&&n.y<=e.y;return s&&r},overlaps:function(t){t=I(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>i.x&&n.x<e.x,r=o.y>i.y&&n.y<e.y;return s&&r},isValid:function(){return!(!this.min||!this.max)}},O.prototype={extend:function(t){var i,e,n=this._southWest,o=this._northEast;if(t instanceof N)i=t,e=t;else{if(!(t instanceof O))return t?this.extend(D(t)||R(t)):this;if(i=t._southWest,e=t._northEast,!i||!e)return this}return n||o?(n.lat=Math.min(i.lat,n.lat),n.lng=Math.min(i.lng,n.lng),o.lat=Math.max(e.lat,o.lat),o.lng=Math.max(e.lng,o.lng)):(this._southWest=new N(i.lat,i.lng),this._northEast=new N(e.lat,e.lng)),this},pad:function(t){var i=this._southWest,e=this._northEast,n=Math.abs(i.lat-e.lat)*t,o=Math.abs(i.lng-e.lng)*t;return new O(new N(i.lat-n,i.lng-o),new N(e.lat+n,e.lng+o))},getCenter:function(){return new N((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new N(this.getNorth(),this.getWest())},getSouthEast:function(){return new N(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof N||"lat"in t?D(t):R(t);var i,e,n=this._southWest,o=this._northEast;return t instanceof O?(i=t.getSouthWest(),e=t.getNorthEast()):i=e=t,i.lat>=n.lat&&e.lat<=o.lat&&i.lng>=n.lng&&e.lng<=o.lng},intersects:function(t){t=R(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>=i.lat&&n.lat<=e.lat,r=o.lng>=i.lng&&n.lng<=e.lng;return s&&r},overlaps:function(t){t=R(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>i.lat&&n.lat<e.lat,r=o.lng>i.lng&&n.lng<e.lng;return s&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t,i){return!!t&&(t=R(t),this._southWest.equals(t.getSouthWest(),i)&&this._northEast.equals(t.getNorthEast(),i))},isValid:function(){return!(!this._southWest||!this._northEast)}},N.prototype={equals:function(t,i){return!!t&&(t=D(t),Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng))<=(void 0===i?1e-9:i))},toString:function(t){return"LatLng("+u(this.lat,t)+", "+u(this.lng,t)+")"},distanceTo:function(t){return H.distance(this,D(t))},wrap:function(){return H.wrapLatLng(this)},toBounds:function(t){var i=180*t/40075017,e=i/Math.cos(Math.PI/180*this.lat);return R([this.lat-i,this.lng-e],[this.lat+i,this.lng+e])},clone:function(){return new N(this.lat,this.lng,this.alt)}};var j,W={latLngToPoint:function(t,i){var e=this.projection.project(t),n=this.scale(i);return this.transformation._transform(e,n)},pointToLatLng:function(t,i){var e=this.scale(i),n=this.transformation.untransform(t,e);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},unproject:function(t){return this.projection.unproject(t)},scale:function(t){return 256*Math.pow(2,t)},zoom:function(t){return Math.log(t/256)/Math.LN2},getProjectedBounds:function(t){if(this.infinite)return null;var i=this.projection.bounds,e=this.scale(t);return new A(this.transformation.transform(i.min,e),this.transformation.transform(i.max,e))},infinite:!1,wrapLatLng:function(t){var i=this.wrapLng?a(t.lng,this.wrapLng,!0):t.lng;return new N(this.wrapLat?a(t.lat,this.wrapLat,!0):t.lat,i,t.alt)},wrapLatLngBounds:function(t){var i=t.getCenter(),e=this.wrapLatLng(i),n=i.lat-e.lat,o=i.lng-e.lng;if(0===n&&0===o)return t;var s=t.getSouthWest(),r=t.getNorthEast();return new O(new N(s.lat-n,s.lng-o),new N(r.lat-n,r.lng-o))}},H=i({},W,{wrapLng:[-180,180],R:6371e3,distance:function(t,i){var e=Math.PI/180,n=t.lat*e,o=i.lat*e,s=Math.sin((i.lat-t.lat)*e/2),r=Math.sin((i.lng-t.lng)*e/2),a=s*s+Math.cos(n)*Math.cos(o)*r*r,h=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));return this.R*h}}),F={R:6378137,MAX_LATITUDE:85.0511287798,project:function(t){var i=Math.PI/180,e=this.MAX_LATITUDE,n=Math.max(Math.min(e,t.lat),-e),o=Math.sin(n*i);return new E(this.R*t.lng*i,this.R*Math.log((1+o)/(1-o))/2)},unproject:function(t){var i=180/Math.PI;return new N((2*Math.atan(Math.exp(t.y/this.R))-Math.PI/2)*i,t.x*i/this.R)},bounds:(j=6378137*Math.PI,new A([-j,-j],[j,j]))};function U(t,i,e,n){if(f(t))return this._a=t[0],this._b=t[1],this._c=t[2],void(this._d=t[3]);this._a=t,this._b=i,this._c=e,this._d=n}function V(t,i,e,n){return new U(t,i,e,n)}U.prototype={transform:function(t,i){return this._transform(t.clone(),i)},_transform:function(t,i){return i=i||1,t.x=i*(this._a*t.x+this._b),t.y=i*(this._c*t.y+this._d),t},untransform:function(t,i){return i=i||1,new E((t.x/i-this._b)/this._a,(t.y/i-this._d)/this._c)}};var q=i({},H,{code:"EPSG:3857",projection:F,transformation:function(){var t=.5/(Math.PI*F.R);return V(t,.5,-t,.5)}()}),G=i({},q,{code:"EPSG:900913"});function K(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}function Y(t,i){var e,n,o,s,r,a,h="";for(e=0,o=t.length;e<o;e++){for(n=0,s=(r=t[e]).length;n<s;n++)h+=(n?"L":"M")+(a=r[n]).x+" "+a.y;h+=i?zt?"z":"x":""}return h||"M0 0"}var X=document.documentElement.style,J="ActiveXObject"in window,$=J&&!document.addEventListener,Q="msLaunchUri"in navigator&&!("documentMode"in document),tt=St("webkit"),it=St("android"),et=St("android 2")||St("android 3"),nt=parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.userAgent)[1],10),ot=it&&St("Google")&&nt<537&&!("AudioNode"in window),st=!!window.opera,rt=!Q&&St("chrome"),at=St("gecko")&&!tt&&!st&&!J,ht=!rt&&St("safari"),ut=St("phantom"),lt="OTransition"in X,ct=0===navigator.platform.indexOf("Win"),_t=J&&"transition"in X,dt="WebKitCSSMatrix"in window&&"m11"in new window.WebKitCSSMatrix&&!et,pt="MozPerspective"in X,mt=!window.L_DISABLE_3D&&(_t||dt||pt)&&!lt&&!ut,ft="undefined"!=typeof orientation||St("mobile"),gt=ft&&tt,vt=ft&&dt,yt=!window.PointerEvent&&window.MSPointerEvent,xt=!(!window.PointerEvent&&!yt),wt=!window.L_NO_TOUCH&&(xt||"ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch),Pt=ft&&st,Lt=ft&&at,bt=(window.devicePixelRatio||window.screen.deviceXDPI/window.screen.logicalXDPI)>1,Tt=function(){var t=!1;try{var i=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("testPassiveEventSupport",h,i),window.removeEventListener("testPassiveEventSupport",h,i)}catch(t){}return t}(),Mt=!!document.createElement("canvas").getContext,zt=!(!document.createElementNS||!K("svg").createSVGRect),Ct=!zt&&function(){try{var t=document.createElement("div");t.innerHTML='<v:shape adj="1"/>';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(t){return!1}}();function St(t){return navigator.userAgent.toLowerCase().indexOf(t)>=0}var Zt={ie:J,ielt9:$,edge:Q,webkit:tt,android:it,android23:et,androidStock:ot,opera:st,chrome:rt,gecko:at,safari:ht,phantom:ut,opera12:lt,win:ct,ie3d:_t,webkit3d:dt,gecko3d:pt,any3d:mt,mobile:ft,mobileWebkit:gt,mobileWebkit3d:vt,msPointer:yt,pointer:xt,touch:wt,mobileOpera:Pt,mobileGecko:Lt,retina:bt,passiveEvents:Tt,canvas:Mt,svg:zt,vml:Ct},Et=yt?"MSPointerDown":"pointerdown",kt=yt?"MSPointerMove":"pointermove",Bt=yt?"MSPointerUp":"pointerup",At=yt?"MSPointerCancel":"pointercancel",It={},Ot=!1;function Rt(t,i,e,o){return"touchstart"===i?function(t,i,e){var o=n((function(t){t.MSPOINTER_TYPE_TOUCH&&t.pointerType===t.MSPOINTER_TYPE_TOUCH&&Ai(t),Wt(t,i)}));t["_leaflet_touchstart"+e]=o,t.addEventListener(Et,o,!1),Ot||(document.addEventListener(Et,Nt,!0),document.addEventListener(kt,Dt,!0),document.addEventListener(Bt,jt,!0),document.addEventListener(At,jt,!0),Ot=!0)}(t,e,o):"touchmove"===i?function(t,i,e){var n=function(t){t.pointerType===(t.MSPOINTER_TYPE_MOUSE||"mouse")&&0===t.buttons||Wt(t,i)};t["_leaflet_touchmove"+e]=n,t.addEventListener(kt,n,!1)}(t,e,o):"touchend"===i&&function(t,i,e){var n=function(t){Wt(t,i)};t["_leaflet_touchend"+e]=n,t.addEventListener(Bt,n,!1),t.addEventListener(At,n,!1)}(t,e,o),this}function Nt(t){It[t.pointerId]=t}function Dt(t){It[t.pointerId]&&(It[t.pointerId]=t)}function jt(t){delete It[t.pointerId]}function Wt(t,i){for(var e in t.touches=[],It)t.touches.push(It[e]);t.changedTouches=[t],i(t)}var Ht=yt?"MSPointerDown":xt?"pointerdown":"touchstart",Ft=yt?"MSPointerUp":xt?"pointerup":"touchend",Ut="_leaflet_";var Vt,qt,Gt,Kt,Yt,Xt=_i(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),Jt=_i(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),$t="webkitTransition"===Jt||"OTransition"===Jt?Jt+"End":"transitionend";function Qt(t){return"string"==typeof t?document.getElementById(t):t}function ti(t,i){var e=t.style[i]||t.currentStyle&&t.currentStyle[i];if((!e||"auto"===e)&&document.defaultView){var n=document.defaultView.getComputedStyle(t,null);e=n?n[i]:null}return"auto"===e?null:e}function ii(t,i,e){var n=document.createElement(t);return n.className=i||"",e&&e.appendChild(n),n}function ei(t){var i=t.parentNode;i&&i.removeChild(t)}function ni(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function oi(t){var i=t.parentNode;i&&i.lastChild!==t&&i.appendChild(t)}function si(t){var i=t.parentNode;i&&i.firstChild!==t&&i.insertBefore(t,i.firstChild)}function ri(t,i){if(void 0!==t.classList)return t.classList.contains(i);var e=li(t);return e.length>0&&new RegExp("(^|\\s)"+i+"(\\s|$)").test(e)}function ai(t,i){if(void 0!==t.classList)for(var e=c(i),n=0,o=e.length;n<o;n++)t.classList.add(e[n]);else if(!ri(t,i)){var s=li(t);ui(t,(s?s+" ":"")+i)}}function hi(t,i){void 0!==t.classList?t.classList.remove(i):ui(t,l((" "+li(t)+" ").replace(" "+i+" "," ")))}function ui(t,i){void 0===t.className.baseVal?t.className=i:t.className.baseVal=i}function li(t){return t.correspondingElement&&(t=t.correspondingElement),void 0===t.className.baseVal?t.className:t.className.baseVal}function ci(t,i){"opacity"in t.style?t.style.opacity=i:"filter"in t.style&&function(t,i){var e=!1,n="DXImageTransform.Microsoft.Alpha";try{e=t.filters.item(n)}catch(t){if(1===i)return}i=Math.round(100*i),e?(e.Enabled=100!==i,e.Opacity=i):t.style.filter+=" progid:"+n+"(opacity="+i+")"}(t,i)}function _i(t){for(var i=document.documentElement.style,e=0;e<t.length;e++)if(t[e]in i)return t[e];return!1}function di(t,i,e){var n=i||new E(0,0);t.style[Xt]=(_t?"translate("+n.x+"px,"+n.y+"px)":"translate3d("+n.x+"px,"+n.y+"px,0)")+(e?" scale("+e+")":"")}function pi(t,i){t._leaflet_pos=i,mt?di(t,i):(t.style.left=i.x+"px",t.style.top=i.y+"px")}function mi(t){return t._leaflet_pos||new E(0,0)}if("onselectstart"in document)Vt=function(){bi(window,"selectstart",Ai)},qt=function(){Mi(window,"selectstart",Ai)};else{var fi=_i(["userSelect","WebkitUserSelect","OUserSelect","MozUserSelect","msUserSelect"]);Vt=function(){if(fi){var t=document.documentElement.style;Gt=t[fi],t[fi]="none"}},qt=function(){fi&&(document.documentElement.style[fi]=Gt,Gt=void 0)}}function gi(){bi(window,"dragstart",Ai)}function vi(){Mi(window,"dragstart",Ai)}function yi(t){for(;-1===t.tabIndex;)t=t.parentNode;t.style&&(xi(),Kt=t,Yt=t.style.outline,t.style.outline="none",bi(window,"keydown",xi))}function xi(){Kt&&(Kt.style.outline=Yt,Kt=void 0,Yt=void 0,Mi(window,"keydown",xi))}function wi(t){do{t=t.parentNode}while(!(t.offsetWidth&&t.offsetHeight||t===document.body));return t}function Pi(t){var i=t.getBoundingClientRect();return{x:i.width/t.offsetWidth||1,y:i.height/t.offsetHeight||1,boundingClientRect:i}}var Li={TRANSFORM:Xt,TRANSITION:Jt,TRANSITION_END:$t,get:Qt,getStyle:ti,create:ii,remove:ei,empty:ni,toFront:oi,toBack:si,hasClass:ri,addClass:ai,removeClass:hi,setClass:ui,getClass:li,setOpacity:ci,testProp:_i,setTransform:di,setPosition:pi,getPosition:mi,disableTextSelection:Vt,enableTextSelection:qt,disableImageDrag:gi,enableImageDrag:vi,preventOutline:yi,restoreOutline:xi,getSizedParentNode:wi,getScale:Pi};function bi(t,i,e,n){if("object"==typeof i)for(var o in i)Si(t,o,i[o],e);else for(var s=0,r=(i=c(i)).length;s<r;s++)Si(t,i[s],e,n);return this}var Ti="_leaflet_events";function Mi(t,i,e,n){if("object"==typeof i)for(var o in i)Zi(t,o,i[o],e);else if(i)for(var s=0,r=(i=c(i)).length;s<r;s++)Zi(t,i[s],e,n);else{for(var a in t[Ti])Zi(t,a,t[Ti][a]);delete t[Ti]}return this}function zi(){if(xt)return!(Q||ht)}var Ci={mouseenter:"mouseover",mouseleave:"mouseout",wheel:!("onwheel"in window)&&"mousewheel"};function Si(t,i,e,n){var o=i+s(e)+(n?"_"+s(n):"");if(t[Ti]&&t[Ti][o])return this;var r=function(i){return e.call(n||t,i||window.event)},a=r;xt&&0===i.indexOf("touch")?Rt(t,i,r,o):wt&&"dblclick"===i&&!zi()?function(t,i,e){var n,o,s=!1,r=250;function a(t){if(xt){if(!t.isPrimary)return;if("mouse"===t.pointerType)return}else if(t.touches.length>1)return;var i=Date.now(),e=i-(n||i);o=t.touches?t.touches[0]:t,s=e>0&&e<=r,n=i}function h(t){if(s&&!o.cancelBubble){if(xt){if("mouse"===t.pointerType)return;var e,r,a={};for(r in o)e=o[r],a[r]=e&&e.bind?e.bind(o):e;o=a}o.type="dblclick",o.button=0,i(o),n=null}}t[Ut+Ht+e]=a,t[Ut+Ft+e]=h,t[Ut+"dblclick"+e]=i,t.addEventListener(Ht,a,!!Tt&&{passive:!1}),t.addEventListener(Ft,h,!!Tt&&{passive:!1}),t.addEventListener("dblclick",i,!1)}(t,r,o):"addEventListener"in t?"touchstart"===i||"touchmove"===i||"wheel"===i||"mousewheel"===i?t.addEventListener(Ci[i]||i,r,!!Tt&&{passive:!1}):"mouseenter"===i||"mouseleave"===i?(r=function(i){i=i||window.event,Hi(t,i)&&a(i)},t.addEventListener(Ci[i],r,!1)):t.addEventListener(i,a,!1):"attachEvent"in t&&t.attachEvent("on"+i,r),t[Ti]=t[Ti]||{},t[Ti][o]=r}function Zi(t,i,e,n){var o=i+s(e)+(n?"_"+s(n):""),r=t[Ti]&&t[Ti][o];if(!r)return this;xt&&0===i.indexOf("touch")?function(t,i,e){var n=t["_leaflet_"+i+e];"touchstart"===i?t.removeEventListener(Et,n,!1):"touchmove"===i?t.removeEventListener(kt,n,!1):"touchend"===i&&(t.removeEventListener(Bt,n,!1),t.removeEventListener(At,n,!1))}(t,i,o):wt&&"dblclick"===i&&!zi()?function(t,i){var e=t[Ut+Ht+i],n=t[Ut+Ft+i],o=t[Ut+"dblclick"+i];t.removeEventListener(Ht,e,!!Tt&&{passive:!1}),t.removeEventListener(Ft,n,!!Tt&&{passive:!1}),t.removeEventListener("dblclick",o,!1)}(t,o):"removeEventListener"in t?t.removeEventListener(Ci[i]||i,r,!1):"detachEvent"in t&&t.detachEvent("on"+i,r),t[Ti][o]=null}function Ei(t){return t.stopPropagation?t.stopPropagation():t.originalEvent?t.originalEvent._stopped=!0:t.cancelBubble=!0,Wi(t),this}function ki(t){return Si(t,"wheel",Ei),this}function Bi(t){return bi(t,"mousedown touchstart dblclick",Ei),Si(t,"click",ji),this}function Ai(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this}function Ii(t){return Ai(t),Ei(t),this}function Oi(t,i){if(!i)return new E(t.clientX,t.clientY);var e=Pi(i),n=e.boundingClientRect;return new E((t.clientX-n.left)/e.x-i.clientLeft,(t.clientY-n.top)/e.y-i.clientTop)}var Ri=ct&&rt?2*window.devicePixelRatio:at?window.devicePixelRatio:1;function Ni(t){return Q?t.wheelDeltaY/2:t.deltaY&&0===t.deltaMode?-t.deltaY/Ri:t.deltaY&&1===t.deltaMode?20*-t.deltaY:t.deltaY&&2===t.deltaMode?60*-t.deltaY:t.deltaX||t.deltaZ?0:t.wheelDelta?(t.wheelDeltaY||t.wheelDelta)/2:t.detail&&Math.abs(t.detail)<32765?20*-t.detail:t.detail?t.detail/-32765*60:0}var Di={};function ji(t){Di[t.type]=!0}function Wi(t){var i=Di[t.type];return Di[t.type]=!1,i}function Hi(t,i){var e=i.relatedTarget;if(!e)return!0;try{for(;e&&e!==t;)e=e.parentNode}catch(t){return!1}return e!==t}var Fi={on:bi,off:Mi,stopPropagation:Ei,disableScrollPropagation:ki,disableClickPropagation:Bi,preventDefault:Ai,stop:Ii,getMousePosition:Oi,getWheelDelta:Ni,fakeStop:ji,skipped:Wi,isExternalTarget:Hi,addListener:bi,removeListener:Mi},Ui=Z.extend({run:function(t,i,e,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=e||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=mi(t),this._offset=i.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(!0),this._complete())},_animate:function(){this._animId=T(this._animate,this),this._step()},_step:function(t){var i=+new Date-this._startTime,e=1e3*this._duration;i<e?this._runFrame(this._easeOut(i/e),t):(this._runFrame(1),this._complete())},_runFrame:function(t,i){var e=this._startPos.add(this._offset.multiplyBy(t));i&&e._round(),pi(this._el,e),this.fire("step")},_complete:function(){M(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),Vi=Z.extend({options:{crs:q,center:void 0,zoom:void 0,minZoom:void 0,maxZoom:void 0,layers:[],maxBounds:void 0,renderer:void 0,zoomAnimation:!0,zoomAnimationThreshold:4,fadeAnimation:!0,markerZoomAnimation:!0,transform3DLimit:8388608,zoomSnap:1,zoomDelta:1,trackResize:!0},initialize:function(t,i){i=_(this,i),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._sizeChanged=!0,this._initContainer(t),this._initLayout(),this._onResize=n(this._onResize,this),this._initEvents(),i.maxBounds&&this.setMaxBounds(i.maxBounds),void 0!==i.zoom&&(this._zoom=this._limitZoom(i.zoom)),i.center&&void 0!==i.zoom&&this.setView(D(i.center),i.zoom,{reset:!0}),this.callInitHooks(),this._zoomAnimated=Jt&&mt&&!Pt&&this.options.zoomAnimation,this._zoomAnimated&&(this._createAnimProxy(),bi(this._proxy,$t,this._catchTransitionEnd,this)),this._addLayers(this.options.layers)},setView:function(t,e,n){if((e=void 0===e?this._zoom:this._limitZoom(e),t=this._limitCenter(D(t),e,this.options.maxBounds),n=n||{},this._stop(),this._loaded&&!n.reset&&!0!==n)&&(void 0!==n.animate&&(n.zoom=i({animate:n.animate},n.zoom),n.pan=i({animate:n.animate,duration:n.duration},n.pan)),this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan)))return clearTimeout(this._sizeTimer),this;return this._resetView(t,e),this},setZoom:function(t,i){return this._loaded?this.setView(this.getCenter(),t,{zoom:i}):(this._zoom=t,this)},zoomIn:function(t,i){return t=t||(mt?this.options.zoomDelta:1),this.setZoom(this._zoom+t,i)},zoomOut:function(t,i){return t=t||(mt?this.options.zoomDelta:1),this.setZoom(this._zoom-t,i)},setZoomAround:function(t,i,e){var n=this.getZoomScale(i),o=this.getSize().divideBy(2),s=(t instanceof E?t:this.latLngToContainerPoint(t)).subtract(o).multiplyBy(1-1/n),r=this.containerPointToLatLng(o.add(s));return this.setView(r,i,{zoom:e})},_getBoundsCenterZoom:function(t,i){i=i||{},t=t.getBounds?t.getBounds():R(t);var e=B(i.paddingTopLeft||i.padding||[0,0]),n=B(i.paddingBottomRight||i.padding||[0,0]),o=this.getBoundsZoom(t,!1,e.add(n));if((o="number"==typeof i.maxZoom?Math.min(i.maxZoom,o):o)===1/0)return{center:t.getCenter(),zoom:o};var s=n.subtract(e).divideBy(2),r=this.project(t.getSouthWest(),o),a=this.project(t.getNorthEast(),o);return{center:this.unproject(r.add(a).divideBy(2).add(s),o),zoom:o}},fitBounds:function(t,i){if(!(t=R(t)).isValid())throw new Error("Bounds are not valid.");var e=this._getBoundsCenterZoom(t,i);return this.setView(e.center,e.zoom,i)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,i){return this.setView(t,this._zoom,{pan:i})},panBy:function(t,i){if(i=i||{},!(t=B(t).round()).x&&!t.y)return this.fire("moveend");if(!0!==i.animate&&!this.getSize().contains(t))return this._resetView(this.unproject(this.project(this.getCenter()).add(t)),this.getZoom()),this;if(this._panAnim||(this._panAnim=new Ui,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),i.noMoveStart||this.fire("movestart"),!1!==i.animate){ai(this._mapPane,"leaflet-pan-anim");var e=this._getMapPanePos().subtract(t).round();this._panAnim.run(this._mapPane,e,i.duration||.25,i.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},flyTo:function(t,i,e){if(!1===(e=e||{}).animate||!mt)return this.setView(t,i,e);this._stop();var n=this.project(this.getCenter()),o=this.project(t),s=this.getSize(),r=this._zoom;t=D(t),i=void 0===i?r:i;var a=Math.max(s.x,s.y),h=a*this.getZoomScale(r,i),u=o.distanceTo(n)||1,l=1.42,c=l*l;function _(t){var i=(h*h-a*a+(t?-1:1)*c*c*u*u)/(2*(t?h:a)*c*u),e=Math.sqrt(i*i+1)-i;return e<1e-9?-18:Math.log(e)}function d(t){return(Math.exp(t)-Math.exp(-t))/2}function p(t){return(Math.exp(t)+Math.exp(-t))/2}var m=_(0);function f(t){return a*(p(m)*(d(i=m+l*t)/p(i))-d(m))/c;var i}var g=Date.now(),v=(_(1)-m)/l,y=e.duration?1e3*e.duration:1e3*v*.8;return this._moveStart(!0,e.noMoveStart),function e(){var s=(Date.now()-g)/y,h=function(t){return 1-Math.pow(1-t,1.5)}(s)*v;s<=1?(this._flyToFrame=T(e,this),this._move(this.unproject(n.add(o.subtract(n).multiplyBy(f(h)/u)),r),this.getScaleZoom(a/function(t){return a*(p(m)/p(m+l*t))}(h),r),{flyTo:!0})):this._move(t,i)._moveEnd(!0)}.call(this),this},flyToBounds:function(t,i){var e=this._getBoundsCenterZoom(t,i);return this.flyTo(e.center,e.zoom,i)},setMaxBounds:function(t){return(t=R(t)).isValid()?(this.options.maxBounds&&this.off("moveend",this._panInsideMaxBounds),this.options.maxBounds=t,this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds)):(this.options.maxBounds=null,this.off("moveend",this._panInsideMaxBounds))},setMinZoom:function(t){var i=this.options.minZoom;return this.options.minZoom=t,this._loaded&&i!==t&&(this.fire("zoomlevelschange"),this.getZoom()<this.options.minZoom)?this.setZoom(t):this},setMaxZoom:function(t){var i=this.options.maxZoom;return this.options.maxZoom=t,this._loaded&&i!==t&&(this.fire("zoomlevelschange"),this.getZoom()>this.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,i){this._enforcingBounds=!0;var e=this.getCenter(),n=this._limitCenter(e,this._zoom,R(t));return e.equals(n)||this.panTo(n,i),this._enforcingBounds=!1,this},panInside:function(t,i){var e=B((i=i||{}).paddingTopLeft||i.padding||[0,0]),n=B(i.paddingBottomRight||i.padding||[0,0]),o=this.getCenter(),s=this.project(o),r=this.project(t),a=this.getPixelBounds(),h=a.getSize().divideBy(2),u=I([a.min.add(e),a.max.subtract(n)]);if(!u.contains(r)){this._enforcingBounds=!0;var l=s.subtract(r),c=B(r.x+l.x,r.y+l.y);(r.x<u.min.x||r.x>u.max.x)&&(c.x=s.x-l.x,l.x>0?c.x+=h.x-e.x:c.x-=h.x-n.x),(r.y<u.min.y||r.y>u.max.y)&&(c.y=s.y-l.y,l.y>0?c.y+=h.y-e.y:c.y-=h.y-n.y),this.panTo(this.unproject(c),i),this._enforcingBounds=!1}return this},invalidateSize:function(t){if(!this._loaded)return this;t=i({animate:!1,pan:!0},!0===t?{animate:!0}:t);var e=this.getSize();this._sizeChanged=!0,this._lastCenter=null;var o=this.getSize(),s=e.divideBy(2).round(),r=o.divideBy(2).round(),a=s.subtract(r);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(n(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:o})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(t){if(t=this._locateOptions=i({timeout:1e4,watch:!1},t),!("geolocation"in navigator))return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=n(this._handleGeolocationResponse,this),o=n(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,o,t):navigator.geolocation.getCurrentPosition(e,o,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var i=t.code,e=t.message||(1===i?"permission denied":2===i?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:i,message:"Geolocation error: "+e+"."})},_handleGeolocationResponse:function(t){var i=new N(t.coords.latitude,t.coords.longitude),e=i.toBounds(2*t.coords.accuracy),n=this._locateOptions;if(n.setView){var o=this.getBoundsZoom(e);this.setView(i,n.maxZoom?Math.min(o,n.maxZoom):o)}var s={latlng:i,bounds:e,timestamp:t.timestamp};for(var r in t.coords)"number"==typeof t.coords[r]&&(s[r]=t.coords[r]);this.fire("locationfound",s)},addHandler:function(t,i){if(!i)return this;var e=this[t]=new i(this);return this._handlers.push(e),this.options[t]&&e.enable(),this},remove:function(){if(this._initEvents(!0),this.off("moveend",this._panInsideMaxBounds),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch(t){this._container._leaflet_id=void 0,this._containerId=void 0}var t;for(t in void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),ei(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(M(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload"),this._layers)this._layers[t].remove();for(t in this._panes)ei(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,i){var e=ii("div","leaflet-pane"+(t?" leaflet-"+t.replace("Pane","")+"-pane":""),i||this._mapPane);return t&&(this._panes[t]=e),e},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new O(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,i,e){t=R(t),e=B(e||[0,0]);var n=this.getZoom()||0,o=this.getMinZoom(),s=this.getMaxZoom(),r=t.getNorthWest(),a=t.getSouthEast(),h=this.getSize().subtract(e),u=I(this.project(a,n),this.project(r,n)).getSize(),l=mt?this.options.zoomSnap:1,c=h.x/u.x,_=h.y/u.y,d=i?Math.max(c,_):Math.min(c,_);return n=this.getScaleZoom(d,n),l&&(n=Math.round(n/(l/100))*(l/100),n=i?Math.ceil(n/l)*l:Math.floor(n/l)*l),Math.max(o,Math.min(s,n))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new E(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,i){var e=this._getTopLeftPoint(t,i);return new A(e,e.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return"string"==typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,i){var e=this.options.crs;return i=void 0===i?this._zoom:i,e.scale(t)/e.scale(i)},getScaleZoom:function(t,i){var e=this.options.crs;i=void 0===i?this._zoom:i;var n=e.zoom(t*e.scale(i));return isNaN(n)?1/0:n},project:function(t,i){return i=void 0===i?this._zoom:i,this.options.crs.latLngToPoint(D(t),i)},unproject:function(t,i){return i=void 0===i?this._zoom:i,this.options.crs.pointToLatLng(B(t),i)},layerPointToLatLng:function(t){var i=B(t).add(this.getPixelOrigin());return this.unproject(i)},latLngToLayerPoint:function(t){return this.project(D(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(D(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(R(t))},distance:function(t,i){return this.options.crs.distance(D(t),D(i))},containerPointToLayerPoint:function(t){return B(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return B(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var i=this.containerPointToLayerPoint(B(t));return this.layerPointToLatLng(i)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(D(t)))},mouseEventToContainerPoint:function(t){return Oi(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var i=this._container=Qt(t);if(!i)throw new Error("Map container not found.");if(i._leaflet_id)throw new Error("Map container is already initialized.");bi(i,"scroll",this._onScroll,this),this._containerId=s(i)},_initLayout:function(){var t=this._container;this._fadeAnimated=this.options.fadeAnimation&&mt,ai(t,"leaflet-container"+(wt?" leaflet-touch":"")+(bt?" leaflet-retina":"")+($?" leaflet-oldie":"")+(ht?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":""));var i=ti(t,"position");"absolute"!==i&&"relative"!==i&&"fixed"!==i&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),pi(this._mapPane,new E(0,0)),this.createPane("tilePane"),this.createPane("shadowPane"),this.createPane("overlayPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(ai(t.markerPane,"leaflet-zoom-hide"),ai(t.shadowPane,"leaflet-zoom-hide"))},_resetView:function(t,i){pi(this._mapPane,new E(0,0));var e=!this._loaded;this._loaded=!0,i=this._limitZoom(i),this.fire("viewprereset");var n=this._zoom!==i;this._moveStart(n,!1)._move(t,i)._moveEnd(n),this.fire("viewreset"),e&&this.fire("load")},_moveStart:function(t,i){return t&&this.fire("zoomstart"),i||this.fire("movestart"),this},_move:function(t,i,e){void 0===i&&(i=this._zoom);var n=this._zoom!==i;return this._zoom=i,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),(n||e&&e.pinch)&&this.fire("zoom",e),this.fire("move",e)},_moveEnd:function(t){return t&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return M(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){pi(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(t){this._targets={},this._targets[s(this._container)]=this;var i=t?Mi:bi;i(this._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress keydown keyup",this._handleDOMEvent,this),this.options.trackResize&&i(window,"resize",this._onResize,this),mt&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){M(this._resizeRequest),this._resizeRequest=T((function(){this.invalidateSize({debounceMoveend:!0})}),this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,i){for(var e,n=[],o="mouseout"===i||"mouseover"===i,r=t.target||t.srcElement,a=!1;r;){if((e=this._targets[s(r)])&&("click"===i||"preclick"===i)&&!t._simulated&&this._draggableMoved(e)){a=!0;break}if(e&&e.listens(i,!0)){if(o&&!Hi(r,t))break;if(n.push(e),o)break}if(r===this._container)break;r=r.parentNode}return n.length||a||o||!Hi(r,t)||(n=[this]),n},_handleDOMEvent:function(t){if(this._loaded&&!Wi(t)){var i=t.type;"mousedown"!==i&&"keypress"!==i&&"keyup"!==i&&"keydown"!==i||yi(t.target||t.srcElement),this._fireDOMEvent(t,i)}},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,e,n){if("click"===t.type){var o=i({},t);o.type="preclick",this._fireDOMEvent(o,o.type,n)}if(!t._stopped&&(n=(n||[]).concat(this._findEventTargets(t,e))).length){var s=n[0];"contextmenu"===e&&s.listens(e,!0)&&Ai(t);var r={originalEvent:t};if("keypress"!==t.type&&"keydown"!==t.type&&"keyup"!==t.type){var a=s.getLatLng&&(!s._radius||s._radius<=10);r.containerPoint=a?this.latLngToContainerPoint(s.getLatLng()):this.mouseEventToContainerPoint(t),r.layerPoint=this.containerPointToLayerPoint(r.containerPoint),r.latlng=a?s.getLatLng():this.layerPointToLatLng(r.layerPoint)}for(var h=0;h<n.length;h++)if(n[h].fire(e,r,!0),r.originalEvent._stopped||!1===n[h].options.bubblingMouseEvents&&-1!==g(this._mouseEvents,e))return}},_draggableMoved:function(t){return(t=t.dragging&&t.dragging.enabled()?t:this).dragging&&t.dragging.moved()||this.boxZoom&&this.boxZoom.moved()},_clearHandlers:function(){for(var t=0,i=this._handlers.length;t<i;t++)this._handlers[t].disable()},whenReady:function(t,i){return this._loaded?t.call(i||this,{target:this}):this.on("load",t,i),this},_getMapPanePos:function(){return mi(this._mapPane)||new E(0,0)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(t,i){return(t&&void 0!==i?this._getNewPixelOrigin(t,i):this.getPixelOrigin()).subtract(this._getMapPanePos())},_getNewPixelOrigin:function(t,i){var e=this.getSize()._divideBy(2);return this.project(t,i)._subtract(e)._add(this._getMapPanePos())._round()},_latLngToNewLayerPoint:function(t,i,e){var n=this._getNewPixelOrigin(e,i);return this.project(t,i)._subtract(n)},_latLngBoundsToNewLayerBounds:function(t,i,e){var n=this._getNewPixelOrigin(e,i);return I([this.project(t.getSouthWest(),i)._subtract(n),this.project(t.getNorthWest(),i)._subtract(n),this.project(t.getSouthEast(),i)._subtract(n),this.project(t.getNorthEast(),i)._subtract(n)])},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,i,e){if(!e)return t;var n=this.project(t,i),o=this.getSize().divideBy(2),s=new A(n.subtract(o),n.add(o)),r=this._getBoundsOffset(s,e,i);return r.round().equals([0,0])?t:this.unproject(n.add(r),i)},_limitOffset:function(t,i){if(!i)return t;var e=this.getPixelBounds(),n=new A(e.min.add(t),e.max.add(t));return t.add(this._getBoundsOffset(n,i))},_getBoundsOffset:function(t,i,e){var n=I(this.project(i.getNorthEast(),e),this.project(i.getSouthWest(),e)),o=n.min.subtract(t.min),s=n.max.subtract(t.max);return new E(this._rebound(o.x,-s.x),this._rebound(o.y,-s.y))},_rebound:function(t,i){return t+i>0?Math.round(t-i)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(i))},_limitZoom:function(t){var i=this.getMinZoom(),e=this.getMaxZoom(),n=mt?this.options.zoomSnap:1;return n&&(t=Math.round(t/n)*n),Math.max(i,Math.min(e,t))},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){hi(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,i){var e=this._getCenterOffset(t)._trunc();return!(!0!==(i&&i.animate)&&!this.getSize().contains(e))&&(this.panBy(e,i),!0)},_createAnimProxy:function(){var t=this._proxy=ii("div","leaflet-proxy leaflet-zoom-animated");this._panes.mapPane.appendChild(t),this.on("zoomanim",(function(t){var i=Xt,e=this._proxy.style[i];di(this._proxy,this.project(t.center,t.zoom),this.getZoomScale(t.zoom,1)),e===this._proxy.style[i]&&this._animatingZoom&&this._onZoomTransitionEnd()}),this),this.on("load moveend",this._animMoveEnd,this),this._on("unload",this._destroyAnimProxy,this)},_destroyAnimProxy:function(){ei(this._proxy),this.off("load moveend",this._animMoveEnd,this),delete this._proxy},_animMoveEnd:function(){var t=this.getCenter(),i=this.getZoom();di(this._proxy,this.project(t,i),this.getZoomScale(i,1))},_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,i,e){if(this._animatingZoom)return!0;if(e=e||{},!this._zoomAnimated||!1===e.animate||this._nothingToAnimate()||Math.abs(i-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(i),o=this._getCenterOffset(t)._divideBy(1-1/n);return!(!0!==e.animate&&!this.getSize().contains(o))&&(T((function(){this._moveStart(!0,!1)._animateZoom(t,i,!0)}),this),!0)},_animateZoom:function(t,i,e,o){this._mapPane&&(e&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=i,ai(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:i,noUpdate:o}),setTimeout(n(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&hi(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom),T((function(){this._moveEnd(!0)}),this))}});var qi=C.extend({options:{position:"topright"},initialize:function(t){_(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var i=this._map;return i&&i.removeControl(this),this.options.position=t,i&&i.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var i=this._container=this.onAdd(t),e=this.getPosition(),n=t._controlCorners[e];return ai(i,"leaflet-control"),-1!==e.indexOf("bottom")?n.insertBefore(i,n.firstChild):n.appendChild(i),this._map.on("unload",this.remove,this),this},remove:function(){return this._map?(ei(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null,this):this},_refocusOnMap:function(t){this._map&&t&&t.screenX>0&&t.screenY>0&&this._map.getContainer().focus()}}),Gi=function(t){return new qi(t)};Vi.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.remove(),this},_initControlPos:function(){var t=this._controlCorners={},i="leaflet-",e=this._controlContainer=ii("div",i+"control-container",this._container);function n(n,o){var s=i+n+" "+i+o;t[n+o]=ii("div",s,e)}n("top","left"),n("top","right"),n("bottom","left"),n("bottom","right")},_clearControlPos:function(){for(var t in this._controlCorners)ei(this._controlCorners[t]);ei(this._controlContainer),delete this._controlCorners,delete this._controlContainer}});var Ki=qi.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0,hideSingleBase:!1,sortLayers:!1,sortFunction:function(t,i,e,n){return e<n?-1:n<e?1:0}},initialize:function(t,i,e){for(var n in _(this,e),this._layerControlInputs=[],this._layers=[],this._lastZIndex=0,this._handlingClick=!1,t)this._addLayer(t[n],n);for(n in i)this._addLayer(i[n],n,!0)},onAdd:function(t){this._initLayout(),this._update(),this._map=t,t.on("zoomend",this._checkDisabledLayers,this);for(var i=0;i<this._layers.length;i++)this._layers[i].layer.on("add remove",this._onLayerChange,this);return this._container},addTo:function(t){return qi.prototype.addTo.call(this,t),this._expandIfNotCollapsed()},onRemove:function(){this._map.off("zoomend",this._checkDisabledLayers,this);for(var t=0;t<this._layers.length;t++)this._layers[t].layer.off("add remove",this._onLayerChange,this)},addBaseLayer:function(t,i){return this._addLayer(t,i),this._map?this._update():this},addOverlay:function(t,i){return this._addLayer(t,i,!0),this._map?this._update():this},removeLayer:function(t){t.off("add remove",this._onLayerChange,this);var i=this._getLayer(s(t));return i&&this._layers.splice(this._layers.indexOf(i),1),this._map?this._update():this},expand:function(){ai(this._container,"leaflet-control-layers-expanded"),this._section.style.height=null;var t=this._map.getSize().y-(this._container.offsetTop+50);return t<this._section.clientHeight?(ai(this._section,"leaflet-control-layers-scrollbar"),this._section.style.height=t+"px"):hi(this._section,"leaflet-control-layers-scrollbar"),this._checkDisabledLayers(),this},collapse:function(){return hi(this._container,"leaflet-control-layers-expanded"),this},_initLayout:function(){var t="leaflet-control-layers",i=this._container=ii("div",t),e=this.options.collapsed;i.setAttribute("aria-haspopup",!0),Bi(i),ki(i);var n=this._section=ii("section",t+"-list");e&&(this._map.on("click",this.collapse,this),it||bi(i,{mouseenter:this.expand,mouseleave:this.collapse},this));var o=this._layersLink=ii("a",t+"-toggle",i);o.href="#",o.title="Layers",wt?(bi(o,"click",Ii),bi(o,"click",this.expand,this)):bi(o,"focus",this.expand,this),e||this.expand(),this._baseLayersList=ii("div",t+"-base",n),this._separator=ii("div",t+"-separator",n),this._overlaysList=ii("div",t+"-overlays",n),i.appendChild(n)},_getLayer:function(t){for(var i=0;i<this._layers.length;i++)if(this._layers[i]&&s(this._layers[i].layer)===t)return this._layers[i]},_addLayer:function(t,i,e){this._map&&t.on("add remove",this._onLayerChange,this),this._layers.push({layer:t,name:i,overlay:e}),this.options.sortLayers&&this._layers.sort(n((function(t,i){return this.options.sortFunction(t.layer,i.layer,t.name,i.name)}),this)),this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex)),this._expandIfNotCollapsed()},_update:function(){if(!this._container)return this;ni(this._baseLayersList),ni(this._overlaysList),this._layerControlInputs=[];var t,i,e,n,o=0;for(e=0;e<this._layers.length;e++)n=this._layers[e],this._addItem(n),i=i||n.overlay,t=t||!n.overlay,o+=n.overlay?0:1;return this.options.hideSingleBase&&(t=t&&o>1,this._baseLayersList.style.display=t?"":"none"),this._separator.style.display=i&&t?"":"none",this},_onLayerChange:function(t){this._handlingClick||this._update();var i=this._getLayer(s(t.target)),e=i.overlay?"add"===t.type?"overlayadd":"overlayremove":"add"===t.type?"baselayerchange":null;e&&this._map.fire(e,i)},_createRadioElement:function(t,i){var e='<input type="radio" class="leaflet-control-layers-selector" name="'+t+'"'+(i?' checked="checked"':"")+"/>",n=document.createElement("div");return n.innerHTML=e,n.firstChild},_addItem:function(t){var i,e=document.createElement("label"),n=this._map.hasLayer(t.layer);t.overlay?((i=document.createElement("input")).type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=n):i=this._createRadioElement("leaflet-base-layers_"+s(this),n),this._layerControlInputs.push(i),i.layerId=s(t.layer),bi(i,"click",this._onInputClick,this);var o=document.createElement("span");o.innerHTML=" "+t.name;var r=document.createElement("div");return e.appendChild(r),r.appendChild(i),r.appendChild(o),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(e),this._checkDisabledLayers(),e},_onInputClick:function(){var t,i,e=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=e.length-1;s>=0;s--)t=e[s],i=this._getLayer(t.layerId).layer,t.checked?n.push(i):t.checked||o.push(i);for(s=0;s<o.length;s++)this._map.hasLayer(o[s])&&this._map.removeLayer(o[s]);for(s=0;s<n.length;s++)this._map.hasLayer(n[s])||this._map.addLayer(n[s]);this._handlingClick=!1,this._refocusOnMap()},_checkDisabledLayers:function(){for(var t,i,e=this._layerControlInputs,n=this._map.getZoom(),o=e.length-1;o>=0;o--)t=e[o],i=this._getLayer(t.layerId).layer,t.disabled=void 0!==i.options.minZoom&&n<i.options.minZoom||void 0!==i.options.maxZoom&&n>i.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}}),Yi=qi.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"&#x2212;",zoomOutTitle:"Zoom out"},onAdd:function(t){var i="leaflet-control-zoom",e=ii("div",i+" leaflet-bar"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,i+"-in",e,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,i+"-out",e,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),e},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoom<this._map.getMaxZoom()&&this._map.zoomIn(this._map.options.zoomDelta*(t.shiftKey?3:1))},_zoomOut:function(t){!this._disabled&&this._map._zoom>this._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,i,e,n,o){var s=ii("a",e,n);return s.innerHTML=t,s.href="#",s.title=i,s.setAttribute("role","button"),s.setAttribute("aria-label",i),Bi(s),bi(s,"click",Ii),bi(s,"click",o,this),bi(s,"click",this._refocusOnMap,this),s},_updateDisabled:function(){var t=this._map,i="leaflet-disabled";hi(this._zoomInButton,i),hi(this._zoomOutButton,i),(this._disabled||t._zoom===t.getMinZoom())&&ai(this._zoomOutButton,i),(this._disabled||t._zoom===t.getMaxZoom())&&ai(this._zoomInButton,i)}});Vi.mergeOptions({zoomControl:!0}),Vi.addInitHook((function(){this.options.zoomControl&&(this.zoomControl=new Yi,this.addControl(this.zoomControl))}));var Xi=qi.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var i=ii("div","leaflet-control-scale"),e=this.options;return this._addScales(e,"leaflet-control-scale-line",i),t.on(e.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,i,e){t.metric&&(this._mScale=ii("div",i,e)),t.imperial&&(this._iScale=ii("div",i,e))},_update:function(){var t=this._map,i=t.getSize().y/2,e=t.distance(t.containerPointToLatLng([0,i]),t.containerPointToLatLng([this.options.maxWidth,i]));this._updateScales(e)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var i=this._getRoundNum(t),e=i<1e3?i+" m":i/1e3+" km";this._updateScale(this._mScale,e,i/t)},_updateImperial:function(t){var i,e,n,o=3.2808399*t;o>5280?(i=o/5280,e=this._getRoundNum(i),this._updateScale(this._iScale,e+" mi",e/i)):(n=this._getRoundNum(o),this._updateScale(this._iScale,n+" ft",n/o))},_updateScale:function(t,i,e){t.style.width=Math.round(this.options.maxWidth*e)+"px",t.innerHTML=i},_getRoundNum:function(t){var i=Math.pow(10,(Math.floor(t)+"").length-1),e=t/i;return i*(e=e>=10?10:e>=5?5:e>=3?3:e>=2?2:1)}}),Ji=qi.extend({options:{position:"bottomright",prefix:'<a href="https://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'},initialize:function(t){_(this,t),this._attributions={}},onAdd:function(t){for(var i in t.attributionControl=this,this._container=ii("div","leaflet-control-attribution"),Bi(this._container),t._layers)t._layers[i].getAttribution&&this.addAttribution(t._layers[i].getAttribution());return this._update(),this._container},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):this},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):this},_update:function(){if(this._map){var t=[];for(var i in this._attributions)this._attributions[i]&&t.push(i);var e=[];this.options.prefix&&e.push(this.options.prefix),t.length&&e.push(t.join(", ")),this._container.innerHTML=e.join(" | ")}}});Vi.mergeOptions({attributionControl:!0}),Vi.addInitHook((function(){this.options.attributionControl&&(new Ji).addTo(this)}));qi.Layers=Ki,qi.Zoom=Yi,qi.Scale=Xi,qi.Attribution=Ji,Gi.layers=function(t,i,e){return new Ki(t,i,e)},Gi.zoom=function(t){return new Yi(t)},Gi.scale=function(t){return new Xi(t)},Gi.attribution=function(t){return new Ji(t)};var $i=C.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled?this:(this._enabled=!0,this.addHooks(),this)},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},enabled:function(){return!!this._enabled}});$i.addTo=function(t,i){return t.addHandler(i,this),this};var Qi,te={Events:S},ie=wt?"touchstart mousedown":"mousedown",ee={mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},ne={mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"},oe=Z.extend({options:{clickTolerance:3},initialize:function(t,i,e,n){_(this,n),this._element=t,this._dragStartTarget=i||t,this._preventOutline=e},enable:function(){this._enabled||(bi(this._dragStartTarget,ie,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(oe._dragging===this&&this.finishDrag(),Mi(this._dragStartTarget,ie,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){if(!t._simulated&&this._enabled&&(this._moved=!1,!ri(this._element,"leaflet-zoom-anim")&&!(oe._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(oe._dragging=this,this._preventOutline&&yi(this._element),gi(),Vt(),this._moving)))){this.fire("down");var i=t.touches?t.touches[0]:t,e=wi(this._element);this._startPoint=new E(i.clientX,i.clientY),this._parentScale=Pi(e),bi(document,ne[t.type],this._onMove,this),bi(document,ee[t.type],this._onUp,this)}},_onMove:function(t){if(!t._simulated&&this._enabled)if(t.touches&&t.touches.length>1)this._moved=!0;else{var i=t.touches&&1===t.touches.length?t.touches[0]:t,e=new E(i.clientX,i.clientY)._subtract(this._startPoint);(e.x||e.y)&&(Math.abs(e.x)+Math.abs(e.y)<this.options.clickTolerance||(e.x/=this._parentScale.x,e.y/=this._parentScale.y,Ai(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=mi(this._element).subtract(e),ai(document.body,"leaflet-dragging"),this._lastTarget=t.target||t.srcElement,window.SVGElementInstance&&this._lastTarget instanceof window.SVGElementInstance&&(this._lastTarget=this._lastTarget.correspondingUseElement),ai(this._lastTarget,"leaflet-drag-target")),this._newPos=this._startPos.add(e),this._moving=!0,M(this._animRequest),this._lastEvent=t,this._animRequest=T(this._updatePosition,this,!0)))}},_updatePosition:function(){var t={originalEvent:this._lastEvent};this.fire("predrag",t),pi(this._element,this._newPos),this.fire("drag",t)},_onUp:function(t){!t._simulated&&this._enabled&&this.finishDrag()},finishDrag:function(){for(var t in hi(document.body,"leaflet-dragging"),this._lastTarget&&(hi(this._lastTarget,"leaflet-drag-target"),this._lastTarget=null),ne)Mi(document,ne[t],this._onMove,this),Mi(document,ee[t],this._onUp,this);vi(),qt(),this._moved&&this._moving&&(M(this._animRequest),this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1,oe._dragging=!1}});function se(t,i){if(!i||!t.length)return t.slice();var e=i*i;return t=function(t,i){var e=t.length,n=new(typeof Uint8Array!=void 0+""?Uint8Array:Array)(e);n[0]=n[e-1]=1,function t(i,e,n,o,s){var r,a,h,u=0;for(a=o+1;a<=s-1;a++)(h=le(i[a],i[o],i[s],!0))>u&&(r=a,u=h);u>n&&(e[r]=1,t(i,e,n,o,r),t(i,e,n,r,s))}(t,n,i,0,e-1);var o,s=[];for(o=0;o<e;o++)n[o]&&s.push(t[o]);return s}(t=function(t,i){for(var e=[t[0]],n=1,o=0,s=t.length;n<s;n++)r=t[n],a=t[o],h=void 0,u=void 0,h=a.x-r.x,u=a.y-r.y,h*h+u*u>i&&(e.push(t[n]),o=n);var r,a,h,u;o<s-1&&e.push(t[s-1]);return e}(t,e),e)}function re(t,i,e){return Math.sqrt(le(t,i,e,!0))}function ae(t,i,e,n,o){var s,r,a,h=n?Qi:ue(t,e),u=ue(i,e);for(Qi=u;;){if(!(h|u))return[t,i];if(h&u)return!1;a=ue(r=he(t,i,s=h||u,e,o),e),s===h?(t=r,h=a):(i=r,u=a)}}function he(t,i,e,n,o){var s,r,a=i.x-t.x,h=i.y-t.y,u=n.min,l=n.max;return 8&e?(s=t.x+a*(l.y-t.y)/h,r=l.y):4&e?(s=t.x+a*(u.y-t.y)/h,r=u.y):2&e?(s=l.x,r=t.y+h*(l.x-t.x)/a):1&e&&(s=u.x,r=t.y+h*(u.x-t.x)/a),new E(s,r,o)}function ue(t,i){var e=0;return t.x<i.min.x?e|=1:t.x>i.max.x&&(e|=2),t.y<i.min.y?e|=4:t.y>i.max.y&&(e|=8),e}function le(t,i,e,n){var o,s=i.x,r=i.y,a=e.x-s,h=e.y-r,u=a*a+h*h;return u>0&&((o=((t.x-s)*a+(t.y-r)*h)/u)>1?(s=e.x,r=e.y):o>0&&(s+=a*o,r+=h*o)),a=t.x-s,h=t.y-r,n?a*a+h*h:new E(s,r)}function ce(t){return!f(t[0])||"object"!=typeof t[0][0]&&void 0!==t[0][0]}function _e(t){return console.warn("Deprecated use of _flat, please use L.LineUtil.isFlat instead."),ce(t)}var de={simplify:se,pointToSegmentDistance:re,closestPointOnSegment:function(t,i,e){return le(t,i,e)},clipSegment:ae,_getEdgeIntersection:he,_getBitCode:ue,_sqClosestPointOnSegment:le,isFlat:ce,_flat:_e};function pe(t,i,e){var n,o,s,r,a,h,u,l,c,_=[1,4,2,8];for(o=0,u=t.length;o<u;o++)t[o]._code=ue(t[o],i);for(r=0;r<4;r++){for(l=_[r],n=[],o=0,s=(u=t.length)-1;o<u;s=o++)a=t[o],h=t[s],a._code&l?h._code&l||((c=he(h,a,l,i,e))._code=ue(c,i),n.push(c)):(h._code&l&&((c=he(h,a,l,i,e))._code=ue(c,i),n.push(c)),n.push(a));t=n}return t}var me={clipPolygon:pe},fe={project:function(t){return new E(t.lng,t.lat)},unproject:function(t){return new N(t.y,t.x)},bounds:new A([-180,-90],[180,90])},ge={R:6378137,R_MINOR:6356752.314245179,bounds:new A([-20037508.34279,-15496570.73972],[20037508.34279,18764656.23138]),project:function(t){var i=Math.PI/180,e=this.R,n=t.lat*i,o=this.R_MINOR/e,s=Math.sqrt(1-o*o),r=s*Math.sin(n),a=Math.tan(Math.PI/4-n/2)/Math.pow((1-r)/(1+r),s/2);return n=-e*Math.log(Math.max(a,1e-10)),new E(t.lng*i*e,n)},unproject:function(t){for(var i,e=180/Math.PI,n=this.R,o=this.R_MINOR/n,s=Math.sqrt(1-o*o),r=Math.exp(-t.y/n),a=Math.PI/2-2*Math.atan(r),h=0,u=.1;h<15&&Math.abs(u)>1e-7;h++)i=s*Math.sin(a),i=Math.pow((1-i)/(1+i),s/2),a+=u=Math.PI/2-2*Math.atan(r*i)-a;return new N(a*e,t.x*e/n)}},ve={LonLat:fe,Mercator:ge,SphericalMercator:F},ye=i({},H,{code:"EPSG:3395",projection:ge,transformation:function(){var t=.5/(Math.PI*ge.R);return V(t,.5,-t,.5)}()}),xe=i({},H,{code:"EPSG:4326",projection:fe,transformation:V(1/180,1,-1/180,.5)}),we=i({},W,{projection:fe,transformation:V(1,0,-1,0),scale:function(t){return Math.pow(2,t)},zoom:function(t){return Math.log(t)/Math.LN2},distance:function(t,i){var e=i.lng-t.lng,n=i.lat-t.lat;return Math.sqrt(e*e+n*n)},infinite:!0});W.Earth=H,W.EPSG3395=ye,W.EPSG3857=q,W.EPSG900913=G,W.EPSG4326=xe,W.Simple=we;var Pe=Z.extend({options:{pane:"overlayPane",attribution:null,bubblingMouseEvents:!0},addTo:function(t){return t.addLayer(this),this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(t){return t&&t.removeLayer(this),this},getPane:function(t){return this._map.getPane(t?this.options[t]||t:this.options.pane)},addInteractiveTarget:function(t){return this._map._targets[s(t)]=this,this},removeInteractiveTarget:function(t){return delete this._map._targets[s(t)],this},getAttribution:function(){return this.options.attribution},_layerAdd:function(t){var i=t.target;if(i.hasLayer(this)){if(this._map=i,this._zoomAnimated=i._zoomAnimated,this.getEvents){var e=this.getEvents();i.on(e,this),this.once("remove",(function(){i.off(e,this)}),this)}this.onAdd(i),this.getAttribution&&i.attributionControl&&i.attributionControl.addAttribution(this.getAttribution()),this.fire("add"),i.fire("layeradd",{layer:this})}}});Vi.include({addLayer:function(t){if(!t._layerAdd)throw new Error("The provided object is not a Layer.");var i=s(t);return this._layers[i]?this:(this._layers[i]=t,t._mapToAdd=this,t.beforeAdd&&t.beforeAdd(this),this.whenReady(t._layerAdd,t),this)},removeLayer:function(t){var i=s(t);return this._layers[i]?(this._loaded&&t.onRemove(this),t.getAttribution&&this.attributionControl&&this.attributionControl.removeAttribution(t.getAttribution()),delete this._layers[i],this._loaded&&(this.fire("layerremove",{layer:t}),t.fire("remove")),t._map=t._mapToAdd=null,this):this},hasLayer:function(t){return!!t&&s(t)in this._layers},eachLayer:function(t,i){for(var e in this._layers)t.call(i,this._layers[e]);return this},_addLayers:function(t){for(var i=0,e=(t=t?f(t)?t:[t]:[]).length;i<e;i++)this.addLayer(t[i])},_addZoomLimit:function(t){!isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[s(t)]=t,this._updateZoomLevels())},_removeZoomLimit:function(t){var i=s(t);this._zoomBoundLayers[i]&&(delete this._zoomBoundLayers[i],this._updateZoomLevels())},_updateZoomLevels:function(){var t=1/0,i=-1/0,e=this._getZoomSpan();for(var n in this._zoomBoundLayers){var o=this._zoomBoundLayers[n].options;t=void 0===o.minZoom?t:Math.min(t,o.minZoom),i=void 0===o.maxZoom?i:Math.max(i,o.maxZoom)}this._layersMaxZoom=i===-1/0?void 0:i,this._layersMinZoom=t===1/0?void 0:t,e!==this._getZoomSpan()&&this.fire("zoomlevelschange"),void 0===this.options.maxZoom&&this._layersMaxZoom&&this.getZoom()>this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()<this._layersMinZoom&&this.setZoom(this._layersMinZoom)}});var Le=Pe.extend({initialize:function(t,i){var e,n;if(_(this,i),this._layers={},t)for(e=0,n=t.length;e<n;e++)this.addLayer(t[e])},addLayer:function(t){var i=this.getLayerId(t);return this._layers[i]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var i=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[i]&&this._map.removeLayer(this._layers[i]),delete this._layers[i],this},hasLayer:function(t){return!!t&&("number"==typeof t?t:this.getLayerId(t))in this._layers},clearLayers:function(){return this.eachLayer(this.removeLayer,this)},invoke:function(t){var i,e,n=Array.prototype.slice.call(arguments,1);for(i in this._layers)(e=this._layers[i])[t]&&e[t].apply(e,n);return this},onAdd:function(t){this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t)},eachLayer:function(t,i){for(var e in this._layers)t.call(i,this._layers[e]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];return this.eachLayer(t.push,t),t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return s(t)}}),be=Le.extend({addLayer:function(t){return this.hasLayer(t)?this:(t.addEventParent(this),Le.prototype.addLayer.call(this,t),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.removeEventParent(this),Le.prototype.removeLayer.call(this,t),this.fire("layerremove",{layer:t})):this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new O;for(var i in this._layers){var e=this._layers[i];t.extend(e.getBounds?e.getBounds():e.getLatLng())}return t}}),Te=C.extend({options:{popupAnchor:[0,0],tooltipAnchor:[0,0]},initialize:function(t){_(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,i){var e=this._getIconUrl(t);if(!e){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n=this._createImg(e,i&&"IMG"===i.tagName?i:null);return this._setIconStyles(n,t),n},_setIconStyles:function(t,i){var e=this.options,n=e[i+"Size"];"number"==typeof n&&(n=[n,n]);var o=B(n),s=B("shadow"===i&&e.shadowAnchor||e.iconAnchor||o&&o.divideBy(2,!0));t.className="leaflet-marker-"+i+" "+(e.className||""),s&&(t.style.marginLeft=-s.x+"px",t.style.marginTop=-s.y+"px"),o&&(t.style.width=o.x+"px",t.style.height=o.y+"px")},_createImg:function(t,i){return(i=i||document.createElement("img")).src=t,i},_getIconUrl:function(t){return bt&&this.options[t+"RetinaUrl"]||this.options[t+"Url"]}});var Me=Te.extend({options:{iconUrl:"marker-icon.png",iconRetinaUrl:"marker-icon-2x.png",shadowUrl:"marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],tooltipAnchor:[16,-28],shadowSize:[41,41]},_getIconUrl:function(t){return Me.imagePath||(Me.imagePath=this._detectIconPath()),(this.options.imagePath||Me.imagePath)+Te.prototype._getIconUrl.call(this,t)},_detectIconPath:function(){var t=ii("div","leaflet-default-icon-path",document.body),i=ti(t,"background-image")||ti(t,"backgroundImage");return document.body.removeChild(t),i=null===i||0!==i.indexOf("url")?"":i.replace(/^url\(["']?/,"").replace(/marker-icon\.png["']?\)$/,"")}}),ze=$i.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new oe(t,t,!0)),this._draggable.on({dragstart:this._onDragStart,predrag:this._onPreDrag,drag:this._onDrag,dragend:this._onDragEnd},this).enable(),ai(t,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off({dragstart:this._onDragStart,predrag:this._onPreDrag,drag:this._onDrag,dragend:this._onDragEnd},this).disable(),this._marker._icon&&hi(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_adjustPan:function(t){var i=this._marker,e=i._map,n=this._marker.options.autoPanSpeed,o=this._marker.options.autoPanPadding,s=mi(i._icon),r=e.getPixelBounds(),a=e.getPixelOrigin(),h=I(r.min._subtract(a).add(o),r.max._subtract(a).subtract(o));if(!h.contains(s)){var u=B((Math.max(h.max.x,s.x)-h.max.x)/(r.max.x-h.max.x)-(Math.min(h.min.x,s.x)-h.min.x)/(r.min.x-h.min.x),(Math.max(h.max.y,s.y)-h.max.y)/(r.max.y-h.max.y)-(Math.min(h.min.y,s.y)-h.min.y)/(r.min.y-h.min.y)).multiplyBy(n);e.panBy(u,{animate:!1}),this._draggable._newPos._add(u),this._draggable._startPos._add(u),pi(i._icon,this._draggable._newPos),this._onDrag(t),this._panRequest=T(this._adjustPan.bind(this,t))}},_onDragStart:function(){this._oldLatLng=this._marker.getLatLng(),this._marker.closePopup&&this._marker.closePopup(),this._marker.fire("movestart").fire("dragstart")},_onPreDrag:function(t){this._marker.options.autoPan&&(M(this._panRequest),this._panRequest=T(this._adjustPan.bind(this,t)))},_onDrag:function(t){var i=this._marker,e=i._shadow,n=mi(i._icon),o=i._map.layerPointToLatLng(n);e&&pi(e,n),i._latlng=o,t.latlng=o,t.oldLatLng=this._oldLatLng,i.fire("move",t).fire("drag",t)},_onDragEnd:function(t){M(this._panRequest),delete this._oldLatLng,this._marker.fire("moveend").fire("dragend",t)}}),Ce=Pe.extend({options:{icon:new Me,interactive:!0,keyboard:!0,title:"",alt:"",zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250,pane:"markerPane",shadowPane:"shadowPane",bubblingMouseEvents:!1,draggable:!1,autoPan:!1,autoPanPadding:[50,50],autoPanSpeed:10},initialize:function(t,i){_(this,i),this._latlng=D(t)},onAdd:function(t){this._zoomAnimated=this._zoomAnimated&&t.options.markerZoomAnimation,this._zoomAnimated&&t.on("zoomanim",this._animateZoom,this),this._initIcon(),this.update()},onRemove:function(t){this.dragging&&this.dragging.enabled()&&(this.options.draggable=!0,this.dragging.removeHooks()),delete this.dragging,this._zoomAnimated&&t.off("zoomanim",this._animateZoom,this),this._removeIcon(),this._removeShadow()},getEvents:function(){return{zoom:this.update,viewreset:this.update}},getLatLng:function(){return this._latlng},setLatLng:function(t){var i=this._latlng;return this._latlng=D(t),this.update(),this.fire("move",{oldLatLng:i,latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update()},getIcon:function(){return this.options.icon},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup,this._popup.options),this},getElement:function(){return this._icon},update:function(){if(this._icon&&this._map){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,i="leaflet-zoom-"+(this._zoomAnimated?"animated":"hide"),e=t.icon.createIcon(this._icon),n=!1;e!==this._icon&&(this._icon&&this._removeIcon(),n=!0,t.title&&(e.title=t.title),"IMG"===e.tagName&&(e.alt=t.alt||"")),ai(e,i),t.keyboard&&(e.tabIndex="0"),this._icon=e,t.riseOnHover&&this.on({mouseover:this._bringToFront,mouseout:this._resetZIndex});var o=t.icon.createShadow(this._shadow),s=!1;o!==this._shadow&&(this._removeShadow(),s=!0),o&&(ai(o,i),o.alt=""),this._shadow=o,t.opacity<1&&this._updateOpacity(),n&&this.getPane().appendChild(this._icon),this._initInteraction(),o&&s&&this.getPane(t.shadowPane).appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&this.off({mouseover:this._bringToFront,mouseout:this._resetZIndex}),ei(this._icon),this.removeInteractiveTarget(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&ei(this._shadow),this._shadow=null},_setPos:function(t){this._icon&&pi(this._icon,t),this._shadow&&pi(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon&&(this._icon.style.zIndex=this._zIndex+t)},_animateZoom:function(t){var i=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(i)},_initInteraction:function(){if(this.options.interactive&&(ai(this._icon,"leaflet-interactive"),this.addInteractiveTarget(this._icon),ze)){var t=this.options.draggable;this.dragging&&(t=this.dragging.enabled(),this.dragging.disable()),this.dragging=new ze(this),t&&this.dragging.enable()}},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},_updateOpacity:function(){var t=this.options.opacity;this._icon&&ci(this._icon,t),this._shadow&&ci(this._shadow,t)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)},_getPopupAnchor:function(){return this.options.icon.options.popupAnchor},_getTooltipAnchor:function(){return this.options.icon.options.tooltipAnchor}});var Se=Pe.extend({options:{stroke:!0,color:"#3388ff",weight:3,opacity:1,lineCap:"round",lineJoin:"round",dashArray:null,dashOffset:null,fill:!1,fillColor:null,fillOpacity:.2,fillRule:"evenodd",interactive:!0,bubblingMouseEvents:!0},beforeAdd:function(t){this._renderer=t.getRenderer(this)},onAdd:function(){this._renderer._initPath(this),this._reset(),this._renderer._addPath(this)},onRemove:function(){this._renderer._removePath(this)},redraw:function(){return this._map&&this._renderer._updatePath(this),this},setStyle:function(t){return _(this,t),this._renderer&&(this._renderer._updateStyle(this),this.options.stroke&&t&&Object.prototype.hasOwnProperty.call(t,"weight")&&this._updateBounds()),this},bringToFront:function(){return this._renderer&&this._renderer._bringToFront(this),this},bringToBack:function(){return this._renderer&&this._renderer._bringToBack(this),this},getElement:function(){return this._path},_reset:function(){this._project(),this._update()},_clickTolerance:function(){return(this.options.stroke?this.options.weight/2:0)+this._renderer.options.tolerance}}),Ze=Se.extend({options:{fill:!0,radius:10},initialize:function(t,i){_(this,i),this._latlng=D(t),this._radius=this.options.radius},setLatLng:function(t){var i=this._latlng;return this._latlng=D(t),this.redraw(),this.fire("move",{oldLatLng:i,latlng:this._latlng})},getLatLng:function(){return this._latlng},setRadius:function(t){return this.options.radius=this._radius=t,this.redraw()},getRadius:function(){return this._radius},setStyle:function(t){var i=t&&t.radius||this._radius;return Se.prototype.setStyle.call(this,t),this.setRadius(i),this},_project:function(){this._point=this._map.latLngToLayerPoint(this._latlng),this._updateBounds()},_updateBounds:function(){var t=this._radius,i=this._radiusY||t,e=this._clickTolerance(),n=[t+e,i+e];this._pxBounds=new A(this._point.subtract(n),this._point.add(n))},_update:function(){this._map&&this._updatePath()},_updatePath:function(){this._renderer._updateCircle(this)},_empty:function(){return this._radius&&!this._renderer._bounds.intersects(this._pxBounds)},_containsPoint:function(t){return t.distanceTo(this._point)<=this._radius+this._clickTolerance()}});var Ee=Ze.extend({initialize:function(t,e,n){if("number"==typeof e&&(e=i({},n,{radius:e})),_(this,e),this._latlng=D(t),isNaN(this.options.radius))throw new Error("Circle radius cannot be NaN");this._mRadius=this.options.radius},setRadius:function(t){return this._mRadius=t,this.redraw()},getRadius:function(){return this._mRadius},getBounds:function(){var t=[this._radius,this._radiusY||this._radius];return new O(this._map.layerPointToLatLng(this._point.subtract(t)),this._map.layerPointToLatLng(this._point.add(t)))},setStyle:Se.prototype.setStyle,_project:function(){var t=this._latlng.lng,i=this._latlng.lat,e=this._map,n=e.options.crs;if(n.distance===H.distance){var o=Math.PI/180,s=this._mRadius/H.R/o,r=e.project([i+s,t]),a=e.project([i-s,t]),h=r.add(a).divideBy(2),u=e.unproject(h).lat,l=Math.acos((Math.cos(s*o)-Math.sin(i*o)*Math.sin(u*o))/(Math.cos(i*o)*Math.cos(u*o)))/o;(isNaN(l)||0===l)&&(l=s/Math.cos(Math.PI/180*i)),this._point=h.subtract(e.getPixelOrigin()),this._radius=isNaN(l)?0:h.x-e.project([u,t-l]).x,this._radiusY=h.y-r.y}else{var c=n.unproject(n.project(this._latlng).subtract([this._mRadius,0]));this._point=e.latLngToLayerPoint(this._latlng),this._radius=this._point.x-e.latLngToLayerPoint(c).x}this._updateBounds()}});var ke=Se.extend({options:{smoothFactor:1,noClip:!1},initialize:function(t,i){_(this,i),this._setLatLngs(t)},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._setLatLngs(t),this.redraw()},isEmpty:function(){return!this._latlngs.length},closestLayerPoint:function(t){for(var i,e,n=1/0,o=null,s=le,r=0,a=this._parts.length;r<a;r++)for(var h=this._parts[r],u=1,l=h.length;u<l;u++){var c=s(t,i=h[u-1],e=h[u],!0);c<n&&(n=c,o=s(t,i,e))}return o&&(o.distance=Math.sqrt(n)),o},getCenter:function(){if(!this._map)throw new Error("Must add layer to map before using getCenter()");var t,i,e,n,o,s,r,a=this._rings[0],h=a.length;if(!h)return null;for(t=0,i=0;t<h-1;t++)i+=a[t].distanceTo(a[t+1])/2;if(0===i)return this._map.layerPointToLatLng(a[0]);for(t=0,n=0;t<h-1;t++)if(o=a[t],s=a[t+1],(n+=e=o.distanceTo(s))>i)return r=(n-i)/e,this._map.layerPointToLatLng([s.x-r*(s.x-o.x),s.y-r*(s.y-o.y)])},getBounds:function(){return this._bounds},addLatLng:function(t,i){return i=i||this._defaultShape(),t=D(t),i.push(t),this._bounds.extend(t),this.redraw()},_setLatLngs:function(t){this._bounds=new O,this._latlngs=this._convertLatLngs(t)},_defaultShape:function(){return ce(this._latlngs)?this._latlngs:this._latlngs[0]},_convertLatLngs:function(t){for(var i=[],e=ce(t),n=0,o=t.length;n<o;n++)e?(i[n]=D(t[n]),this._bounds.extend(i[n])):i[n]=this._convertLatLngs(t[n]);return i},_project:function(){var t=new A;this._rings=[],this._projectLatlngs(this._latlngs,this._rings,t),this._bounds.isValid()&&t.isValid()&&(this._rawPxBounds=t,this._updateBounds())},_updateBounds:function(){var t=this._clickTolerance(),i=new E(t,t);this._pxBounds=new A([this._rawPxBounds.min.subtract(i),this._rawPxBounds.max.add(i)])},_projectLatlngs:function(t,i,e){var n,o,s=t[0]instanceof N,r=t.length;if(s){for(o=[],n=0;n<r;n++)o[n]=this._map.latLngToLayerPoint(t[n]),e.extend(o[n]);i.push(o)}else for(n=0;n<r;n++)this._projectLatlngs(t[n],i,e)},_clipPoints:function(){var t=this._renderer._bounds;if(this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else{var i,e,n,o,s,r,a,h=this._parts;for(i=0,n=0,o=this._rings.length;i<o;i++)for(e=0,s=(a=this._rings[i]).length;e<s-1;e++)(r=ae(a[e],a[e+1],t,e,!0))&&(h[n]=h[n]||[],h[n].push(r[0]),r[1]===a[e+1]&&e!==s-2||(h[n].push(r[1]),n++))}},_simplifyPoints:function(){for(var t=this._parts,i=this.options.smoothFactor,e=0,n=t.length;e<n;e++)t[e]=se(t[e],i)},_update:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),this._updatePath())},_updatePath:function(){this._renderer._updatePoly(this)},_containsPoint:function(t,i){var e,n,o,s,r,a,h=this._clickTolerance();if(!this._pxBounds||!this._pxBounds.contains(t))return!1;for(e=0,s=this._parts.length;e<s;e++)for(n=0,o=(r=(a=this._parts[e]).length)-1;n<r;o=n++)if((i||0!==n)&&re(t,a[o],a[n])<=h)return!0;return!1}});ke._flat=_e;var Be=ke.extend({options:{fill:!0},isEmpty:function(){return!this._latlngs.length||!this._latlngs[0].length},getCenter:function(){if(!this._map)throw new Error("Must add layer to map before using getCenter()");var t,i,e,n,o,s,r,a,h,u=this._rings[0],l=u.length;if(!l)return null;for(s=r=a=0,t=0,i=l-1;t<l;i=t++)e=u[t],n=u[i],o=e.y*n.x-n.y*e.x,r+=(e.x+n.x)*o,a+=(e.y+n.y)*o,s+=3*o;return h=0===s?u[0]:[r/s,a/s],this._map.layerPointToLatLng(h)},_convertLatLngs:function(t){var i=ke.prototype._convertLatLngs.call(this,t),e=i.length;return e>=2&&i[0]instanceof N&&i[0].equals(i[e-1])&&i.pop(),i},_setLatLngs:function(t){ke.prototype._setLatLngs.call(this,t),ce(this._latlngs)&&(this._latlngs=[this._latlngs])},_defaultShape:function(){return ce(this._latlngs[0])?this._latlngs[0]:this._latlngs[0][0]},_clipPoints:function(){var t=this._renderer._bounds,i=this.options.weight,e=new E(i,i);if(t=new A(t.min.subtract(e),t.max.add(e)),this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else for(var n,o=0,s=this._rings.length;o<s;o++)(n=pe(this._rings[o],t,!0)).length&&this._parts.push(n)},_updatePath:function(){this._renderer._updatePoly(this,!0)},_containsPoint:function(t){var i,e,n,o,s,r,a,h,u=!1;if(!this._pxBounds||!this._pxBounds.contains(t))return!1;for(o=0,a=this._parts.length;o<a;o++)for(s=0,r=(h=(i=this._parts[o]).length)-1;s<h;r=s++)e=i[s],n=i[r],e.y>t.y!=n.y>t.y&&t.x<(n.x-e.x)*(t.y-e.y)/(n.y-e.y)+e.x&&(u=!u);return u||ke.prototype._containsPoint.call(this,t,!0)}});var Ae=be.extend({initialize:function(t,i){_(this,i),this._layers={},t&&this.addData(t)},addData:function(t){var i,e,n,o=f(t)?t:t.features;if(o){for(i=0,e=o.length;i<e;i++)((n=o[i]).geometries||n.geometry||n.features||n.coordinates)&&this.addData(n);return this}var s=this.options;if(s.filter&&!s.filter(t))return this;var r=Ie(t,s);return r?(r.feature=He(t),r.defaultOptions=r.options,this.resetStyle(r),s.onEachFeature&&s.onEachFeature(t,r),this.addLayer(r)):this},resetStyle:function(t){return void 0===t?this.eachLayer(this.resetStyle,this):(t.options=i({},t.defaultOptions),this._setLayerStyle(t,this.options.style),this)},setStyle:function(t){return this.eachLayer((function(i){this._setLayerStyle(i,t)}),this)},_setLayerStyle:function(t,i){t.setStyle&&("function"==typeof i&&(i=i(t.feature)),t.setStyle(i))}});function Ie(t,i){var e,n,o,s,r="Feature"===t.type?t.geometry:t,a=r?r.coordinates:null,h=[],u=i&&i.pointToLayer,l=i&&i.coordsToLatLng||Re;if(!a&&!r)return null;switch(r.type){case"Point":return Oe(u,t,e=l(a),i);case"MultiPoint":for(o=0,s=a.length;o<s;o++)e=l(a[o]),h.push(Oe(u,t,e,i));return new be(h);case"LineString":case"MultiLineString":return n=Ne(a,"LineString"===r.type?0:1,l),new ke(n,i);case"Polygon":case"MultiPolygon":return n=Ne(a,"Polygon"===r.type?1:2,l),new Be(n,i);case"GeometryCollection":for(o=0,s=r.geometries.length;o<s;o++){var c=Ie({geometry:r.geometries[o],type:"Feature",properties:t.properties},i);c&&h.push(c)}return new be(h);default:throw new Error("Invalid GeoJSON object.")}}function Oe(t,i,e,n){return t?t(i,e):new Ce(e,n&&n.markersInheritOptions&&n)}function Re(t){return new N(t[1],t[0],t[2])}function Ne(t,i,e){for(var n,o=[],s=0,r=t.length;s<r;s++)n=i?Ne(t[s],i-1,e):(e||Re)(t[s]),o.push(n);return o}function De(t,i){return i="number"==typeof i?i:6,void 0!==t.alt?[u(t.lng,i),u(t.lat,i),u(t.alt,i)]:[u(t.lng,i),u(t.lat,i)]}function je(t,i,e,n){for(var o=[],s=0,r=t.length;s<r;s++)o.push(i?je(t[s],i-1,e,n):De(t[s],n));return!i&&e&&o.push(o[0]),o}function We(t,e){return t.feature?i({},t.feature,{geometry:e}):He(e)}function He(t){return"Feature"===t.type||"FeatureCollection"===t.type?t:{type:"Feature",properties:{},geometry:t}}var Fe={toGeoJSON:function(t){return We(this,{type:"Point",coordinates:De(this.getLatLng(),t)})}};function Ue(t,i){return new Ae(t,i)}Ce.include(Fe),Ee.include(Fe),Ze.include(Fe),ke.include({toGeoJSON:function(t){var i=!ce(this._latlngs);return We(this,{type:(i?"Multi":"")+"LineString",coordinates:je(this._latlngs,i?1:0,!1,t)})}}),Be.include({toGeoJSON:function(t){var i=!ce(this._latlngs),e=i&&!ce(this._latlngs[0]),n=je(this._latlngs,e?2:i?1:0,!0,t);return i||(n=[n]),We(this,{type:(e?"Multi":"")+"Polygon",coordinates:n})}}),Le.include({toMultiPoint:function(t){var i=[];return this.eachLayer((function(e){i.push(e.toGeoJSON(t).geometry.coordinates)})),We(this,{type:"MultiPoint",coordinates:i})},toGeoJSON:function(t){var i=this.feature&&this.feature.geometry&&this.feature.geometry.type;if("MultiPoint"===i)return this.toMultiPoint(t);var e="GeometryCollection"===i,n=[];return this.eachLayer((function(i){if(i.toGeoJSON){var o=i.toGeoJSON(t);if(e)n.push(o.geometry);else{var s=He(o);"FeatureCollection"===s.type?n.push.apply(n,s.features):n.push(s)}}})),e?We(this,{geometries:n,type:"GeometryCollection"}):{type:"FeatureCollection",features:n}}});var Ve=Ue,qe=Pe.extend({options:{opacity:1,alt:"",interactive:!1,crossOrigin:!1,errorOverlayUrl:"",zIndex:1,className:""},initialize:function(t,i,e){this._url=t,this._bounds=R(i),_(this,e)},onAdd:function(){this._image||(this._initImage(),this.options.opacity<1&&this._updateOpacity()),this.options.interactive&&(ai(this._image,"leaflet-interactive"),this.addInteractiveTarget(this._image)),this.getPane().appendChild(this._image),this._reset()},onRemove:function(){ei(this._image),this.options.interactive&&this.removeInteractiveTarget(this._image)},setOpacity:function(t){return this.options.opacity=t,this._image&&this._updateOpacity(),this},setStyle:function(t){return t.opacity&&this.setOpacity(t.opacity),this},bringToFront:function(){return this._map&&oi(this._image),this},bringToBack:function(){return this._map&&si(this._image),this},setUrl:function(t){return this._url=t,this._image&&(this._image.src=t),this},setBounds:function(t){return this._bounds=R(t),this._map&&this._reset(),this},getEvents:function(){var t={zoom:this._reset,viewreset:this._reset};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},getBounds:function(){return this._bounds},getElement:function(){return this._image},_initImage:function(){var t="IMG"===this._url.tagName,i=this._image=t?this._url:ii("img");ai(i,"leaflet-image-layer"),this._zoomAnimated&&ai(i,"leaflet-zoom-animated"),this.options.className&&ai(i,this.options.className),i.onselectstart=h,i.onmousemove=h,i.onload=n(this.fire,this,"load"),i.onerror=n(this._overlayOnError,this,"error"),(this.options.crossOrigin||""===this.options.crossOrigin)&&(i.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),this.options.zIndex&&this._updateZIndex(),t?this._url=i.src:(i.src=this._url,i.alt=this.options.alt)},_animateZoom:function(t){var i=this._map.getZoomScale(t.zoom),e=this._map._latLngBoundsToNewLayerBounds(this._bounds,t.zoom,t.center).min;di(this._image,e,i)},_reset:function(){var t=this._image,i=new A(this._map.latLngToLayerPoint(this._bounds.getNorthWest()),this._map.latLngToLayerPoint(this._bounds.getSouthEast())),e=i.getSize();pi(t,i.min),t.style.width=e.x+"px",t.style.height=e.y+"px"},_updateOpacity:function(){ci(this._image,this.options.opacity)},_updateZIndex:function(){this._image&&void 0!==this.options.zIndex&&null!==this.options.zIndex&&(this._image.style.zIndex=this.options.zIndex)},_overlayOnError:function(){this.fire("error");var t=this.options.errorOverlayUrl;t&&this._url!==t&&(this._url=t,this._image.src=t)}}),Ge=qe.extend({options:{autoplay:!0,loop:!0,keepAspectRatio:!0,muted:!1},_initImage:function(){var t="VIDEO"===this._url.tagName,i=this._image=t?this._url:ii("video");if(ai(i,"leaflet-image-layer"),this._zoomAnimated&&ai(i,"leaflet-zoom-animated"),this.options.className&&ai(i,this.options.className),i.onselectstart=h,i.onmousemove=h,i.onloadeddata=n(this.fire,this,"load"),t){for(var e=i.getElementsByTagName("source"),o=[],s=0;s<e.length;s++)o.push(e[s].src);this._url=e.length>0?o:[i.src]}else{f(this._url)||(this._url=[this._url]),!this.options.keepAspectRatio&&Object.prototype.hasOwnProperty.call(i.style,"objectFit")&&(i.style.objectFit="fill"),i.autoplay=!!this.options.autoplay,i.loop=!!this.options.loop,i.muted=!!this.options.muted;for(var r=0;r<this._url.length;r++){var a=ii("source");a.src=this._url[r],i.appendChild(a)}}}});var Ke=qe.extend({_initImage:function(){var t=this._image=this._url;ai(t,"leaflet-image-layer"),this._zoomAnimated&&ai(t,"leaflet-zoom-animated"),this.options.className&&ai(t,this.options.className),t.onselectstart=h,t.onmousemove=h}});var Ye=Pe.extend({options:{offset:[0,7],className:"",pane:"popupPane"},initialize:function(t,i){_(this,t),this._source=i},onAdd:function(t){this._zoomAnimated=t._zoomAnimated,this._container||this._initLayout(),t._fadeAnimated&&ci(this._container,0),clearTimeout(this._removeTimeout),this.getPane().appendChild(this._container),this.update(),t._fadeAnimated&&ci(this._container,1),this.bringToFront()},onRemove:function(t){t._fadeAnimated?(ci(this._container,0),this._removeTimeout=setTimeout(n(ei,void 0,this._container),200)):ei(this._container)},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=D(t),this._map&&(this._updatePosition(),this._adjustPan()),this},getContent:function(){return this._content},setContent:function(t){return this._content=t,this.update(),this},getElement:function(){return this._container},update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},getEvents:function(){var t={zoom:this._updatePosition,viewreset:this._updatePosition};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},isOpen:function(){return!!this._map&&this._map.hasLayer(this)},bringToFront:function(){return this._map&&oi(this._container),this},bringToBack:function(){return this._map&&si(this._container),this},_prepareOpen:function(t,i,e){if(i instanceof Pe||(e=i,i=t),i instanceof be)for(var n in t._layers){i=t._layers[n];break}if(!e)if(i.getCenter)e=i.getCenter();else{if(!i.getLatLng)throw new Error("Unable to get source layer LatLng.");e=i.getLatLng()}return this._source=i,this.update(),e},_updateContent:function(){if(this._content){var t=this._contentNode,i="function"==typeof this._content?this._content(this._source||this):this._content;if("string"==typeof i)t.innerHTML=i;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(i)}this.fire("contentupdate")}},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),i=B(this.options.offset),e=this._getAnchor();this._zoomAnimated?pi(this._container,t.add(e)):i=i.add(t).add(e);var n=this._containerBottom=-i.y,o=this._containerLeft=-Math.round(this._containerWidth/2)+i.x;this._container.style.bottom=n+"px",this._container.style.left=o+"px"}},_getAnchor:function(){return[0,0]}}),Xe=Ye.extend({options:{maxWidth:300,minWidth:50,maxHeight:null,autoPan:!0,autoPanPaddingTopLeft:null,autoPanPaddingBottomRight:null,autoPanPadding:[5,5],keepInView:!1,closeButton:!0,autoClose:!0,closeOnEscapeKey:!0,className:""},openOn:function(t){return t.openPopup(this),this},onAdd:function(t){Ye.prototype.onAdd.call(this,t),t.fire("popupopen",{popup:this}),this._source&&(this._source.fire("popupopen",{popup:this},!0),this._source instanceof Se||this._source.on("preclick",Ei))},onRemove:function(t){Ye.prototype.onRemove.call(this,t),t.fire("popupclose",{popup:this}),this._source&&(this._source.fire("popupclose",{popup:this},!0),this._source instanceof Se||this._source.off("preclick",Ei))},getEvents:function(){var t=Ye.prototype.getEvents.call(this);return(void 0!==this.options.closeOnClick?this.options.closeOnClick:this._map.options.closePopupOnClick)&&(t.preclick=this._close),this.options.keepInView&&(t.moveend=this._adjustPan),t},_close:function(){this._map&&this._map.closePopup(this)},_initLayout:function(){var t="leaflet-popup",i=this._container=ii("div",t+" "+(this.options.className||"")+" leaflet-zoom-animated"),e=this._wrapper=ii("div",t+"-content-wrapper",i);if(this._contentNode=ii("div",t+"-content",e),Bi(i),ki(this._contentNode),bi(i,"contextmenu",Ei),this._tipContainer=ii("div",t+"-tip-container",i),this._tip=ii("div",t+"-tip",this._tipContainer),this.options.closeButton){var n=this._closeButton=ii("a",t+"-close-button",i);n.href="#close",n.innerHTML="&#215;",bi(n,"click",this._onCloseButtonClick,this)}},_updateLayout:function(){var t=this._contentNode,i=t.style;i.width="",i.whiteSpace="nowrap";var e=t.offsetWidth;e=Math.min(e,this.options.maxWidth),e=Math.max(e,this.options.minWidth),i.width=e+1+"px",i.whiteSpace="",i.height="";var n=t.offsetHeight,o=this.options.maxHeight;o&&n>o?(i.height=o+"px",ai(t,"leaflet-popup-scrolled")):hi(t,"leaflet-popup-scrolled"),this._containerWidth=this._container.offsetWidth},_animateZoom:function(t){var i=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center),e=this._getAnchor();pi(this._container,i.add(e))},_adjustPan:function(){if(this.options.autoPan){this._map._panAnim&&this._map._panAnim.stop();var t=this._map,i=parseInt(ti(this._container,"marginBottom"),10)||0,e=this._container.offsetHeight+i,n=this._containerWidth,o=new E(this._containerLeft,-e-this._containerBottom);o._add(mi(this._container));var s=t.layerPointToContainerPoint(o),r=B(this.options.autoPanPadding),a=B(this.options.autoPanPaddingTopLeft||r),h=B(this.options.autoPanPaddingBottomRight||r),u=t.getSize(),l=0,c=0;s.x+n+h.x>u.x&&(l=s.x+n-u.x+h.x),s.x-l-a.x<0&&(l=s.x-a.x),s.y+e+h.y>u.y&&(c=s.y+e-u.y+h.y),s.y-c-a.y<0&&(c=s.y-a.y),(l||c)&&t.fire("autopanstart").panBy([l,c])}},_onCloseButtonClick:function(t){this._close(),Ii(t)},_getAnchor:function(){return B(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});Vi.mergeOptions({closePopupOnClick:!0}),Vi.include({openPopup:function(t,i,e){return t instanceof Xe||(t=new Xe(e).setContent(t)),i&&t.setLatLng(i),this.hasLayer(t)?this:(this._popup&&this._popup.options.autoClose&&this.closePopup(),this._popup=t,this.addLayer(t))},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&this.removeLayer(t),this}}),Pe.include({bindPopup:function(t,i){return t instanceof Xe?(_(t,i),this._popup=t,t._source=this):(this._popup&&!i||(this._popup=new Xe(i,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t,i){return this._popup&&this._map&&(i=this._popup._prepareOpen(this,t,i),this._map.openPopup(this._popup,i)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(t){return this._popup&&(this._popup._map?this.closePopup():this.openPopup(t)),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var i=t.layer||t.target;this._popup&&this._map&&(Ii(t),i instanceof Se?this.openPopup(t.layer||t.target,t.latlng):this._map.hasLayer(this._popup)&&this._popup._source===i?this.closePopup():this.openPopup(i,t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}});var Je=Ye.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,interactive:!1,opacity:.9},onAdd:function(t){Ye.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&this._source.fire("tooltipopen",{tooltip:this},!0)},onRemove:function(t){Ye.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&this._source.fire("tooltipclose",{tooltip:this},!0)},getEvents:function(){var t=Ye.prototype.getEvents.call(this);return wt&&!this.options.permanent&&(t.preclick=this._close),t},_close:function(){this._map&&this._map.closeTooltip(this)},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=ii("div",t)},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var i,e,n=this._map,o=this._container,s=n.latLngToContainerPoint(n.getCenter()),r=n.layerPointToContainerPoint(t),a=this.options.direction,h=o.offsetWidth,u=o.offsetHeight,l=B(this.options.offset),c=this._getAnchor();"top"===a?(i=h/2,e=u):"bottom"===a?(i=h/2,e=0):"center"===a?(i=h/2,e=u/2):"right"===a?(i=0,e=u/2):"left"===a?(i=h,e=u/2):r.x<s.x?(a="right",i=0,e=u/2):(a="left",i=h+2*(l.x+c.x),e=u/2),t=t.subtract(B(i,e,!0)).add(l).add(c),hi(o,"leaflet-tooltip-right"),hi(o,"leaflet-tooltip-left"),hi(o,"leaflet-tooltip-top"),hi(o,"leaflet-tooltip-bottom"),ai(o,"leaflet-tooltip-"+a),pi(o,t)},_updatePosition:function(){var t=this._map.latLngToLayerPoint(this._latlng);this._setPosition(t)},setOpacity:function(t){this.options.opacity=t,this._container&&ci(this._container,t)},_animateZoom:function(t){var i=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPosition(i)},_getAnchor:function(){return B(this._source&&this._source._getTooltipAnchor&&!this.options.sticky?this._source._getTooltipAnchor():[0,0])}});Vi.include({openTooltip:function(t,i,e){return t instanceof Je||(t=new Je(e).setContent(t)),i&&t.setLatLng(i),this.hasLayer(t)?this:this.addLayer(t)},closeTooltip:function(t){return t&&this.removeLayer(t),this}}),Pe.include({bindTooltip:function(t,i){return t instanceof Je?(_(t,i),this._tooltip=t,t._source=this):(this._tooltip&&!i||(this._tooltip=new Je(i,this)),this._tooltip.setContent(t)),this._initTooltipInteractions(),this._tooltip.options.permanent&&this._map&&this._map.hasLayer(this)&&this.openTooltip(),this},unbindTooltip:function(){return this._tooltip&&(this._initTooltipInteractions(!0),this.closeTooltip(),this._tooltip=null),this},_initTooltipInteractions:function(t){if(t||!this._tooltipHandlersAdded){var i=t?"off":"on",e={remove:this.closeTooltip,move:this._moveTooltip};this._tooltip.options.permanent?e.add=this._openTooltip:(e.mouseover=this._openTooltip,e.mouseout=this.closeTooltip,this._tooltip.options.sticky&&(e.mousemove=this._moveTooltip),wt&&(e.click=this._openTooltip)),this[i](e),this._tooltipHandlersAdded=!t}},openTooltip:function(t,i){return this._tooltip&&this._map&&(i=this._tooltip._prepareOpen(this,t,i),this._map.openTooltip(this._tooltip,i),this._tooltip.options.interactive&&this._tooltip._container&&(ai(this._tooltip._container,"leaflet-clickable"),this.addInteractiveTarget(this._tooltip._container))),this},closeTooltip:function(){return this._tooltip&&(this._tooltip._close(),this._tooltip.options.interactive&&this._tooltip._container&&(hi(this._tooltip._container,"leaflet-clickable"),this.removeInteractiveTarget(this._tooltip._container))),this},toggleTooltip:function(t){return this._tooltip&&(this._tooltip._map?this.closeTooltip():this.openTooltip(t)),this},isTooltipOpen:function(){return this._tooltip.isOpen()},setTooltipContent:function(t){return this._tooltip&&this._tooltip.setContent(t),this},getTooltip:function(){return this._tooltip},_openTooltip:function(t){var i=t.layer||t.target;this._tooltip&&this._map&&this.openTooltip(i,this._tooltip.options.sticky?t.latlng:void 0)},_moveTooltip:function(t){var i,e,n=t.latlng;this._tooltip.options.sticky&&t.originalEvent&&(i=this._map.mouseEventToContainerPoint(t.originalEvent),e=this._map.containerPointToLayerPoint(i),n=this._map.layerPointToLatLng(e)),this._tooltip.setLatLng(n)}});var $e=Te.extend({options:{iconSize:[12,12],html:!1,bgPos:null,className:"leaflet-div-icon"},createIcon:function(t){var i=t&&"DIV"===t.tagName?t:document.createElement("div"),e=this.options;if(e.html instanceof Element?(ni(i),i.appendChild(e.html)):i.innerHTML=!1!==e.html?e.html:"",e.bgPos){var n=B(e.bgPos);i.style.backgroundPosition=-n.x+"px "+-n.y+"px"}return this._setIconStyles(i,"icon"),i},createShadow:function(){return null}});Te.Default=Me;var Qe=Pe.extend({options:{tileSize:256,opacity:1,updateWhenIdle:ft,updateWhenZooming:!0,updateInterval:200,zIndex:1,bounds:null,minZoom:0,maxZoom:void 0,maxNativeZoom:void 0,minNativeZoom:void 0,noWrap:!1,pane:"tilePane",className:"",keepBuffer:2},initialize:function(t){_(this,t)},onAdd:function(){this._initContainer(),this._levels={},this._tiles={},this._resetView(),this._update()},beforeAdd:function(t){t._addZoomLimit(this)},onRemove:function(t){this._removeAllTiles(),ei(this._container),t._removeZoomLimit(this),this._container=null,this._tileZoom=void 0},bringToFront:function(){return this._map&&(oi(this._container),this._setAutoZIndex(Math.max)),this},bringToBack:function(){return this._map&&(si(this._container),this._setAutoZIndex(Math.min)),this},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},isLoading:function(){return this._loading},redraw:function(){return this._map&&(this._removeAllTiles(),this._update()),this},getEvents:function(){var t={viewprereset:this._invalidateAll,viewreset:this._resetView,zoom:this._resetView,moveend:this._onMoveEnd};return this.options.updateWhenIdle||(this._onMove||(this._onMove=r(this._onMoveEnd,this.options.updateInterval,this)),t.move=this._onMove),this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},createTile:function(){return document.createElement("div")},getTileSize:function(){var t=this.options.tileSize;return t instanceof E?t:new E(t,t)},_updateZIndex:function(){this._container&&void 0!==this.options.zIndex&&null!==this.options.zIndex&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t){for(var i,e=this.getPane().children,n=-t(-1/0,1/0),o=0,s=e.length;o<s;o++)i=e[o].style.zIndex,e[o]!==this._container&&i&&(n=t(n,+i));isFinite(n)&&(this.options.zIndex=n+t(-1,1),this._updateZIndex())},_updateOpacity:function(){if(this._map&&!$){ci(this._container,this.options.opacity);var t=+new Date,i=!1,e=!1;for(var n in this._tiles){var o=this._tiles[n];if(o.current&&o.loaded){var s=Math.min(1,(t-o.loaded)/200);ci(o.el,s),s<1?i=!0:(o.active?e=!0:this._onOpaqueTile(o),o.active=!0)}}e&&!this._noPrune&&this._pruneTiles(),i&&(M(this._fadeFrame),this._fadeFrame=T(this._updateOpacity,this))}},_onOpaqueTile:h,_initContainer:function(){this._container||(this._container=ii("div","leaflet-layer "+(this.options.className||"")),this._updateZIndex(),this.options.opacity<1&&this._updateOpacity(),this.getPane().appendChild(this._container))},_updateLevels:function(){var t=this._tileZoom,i=this.options.maxZoom;if(void 0!==t){for(var e in this._levels)e=Number(e),this._levels[e].el.children.length||e===t?(this._levels[e].el.style.zIndex=i-Math.abs(t-e),this._onUpdateLevel(e)):(ei(this._levels[e].el),this._removeTilesAtZoom(e),this._onRemoveLevel(e),delete this._levels[e]);var n=this._levels[t],o=this._map;return n||((n=this._levels[t]={}).el=ii("div","leaflet-tile-container leaflet-zoom-animated",this._container),n.el.style.zIndex=i,n.origin=o.project(o.unproject(o.getPixelOrigin()),t).round(),n.zoom=t,this._setZoomTransform(n,o.getCenter(),o.getZoom()),n.el.offsetWidth,this._onCreateLevel(n)),this._level=n,n}},_onUpdateLevel:h,_onRemoveLevel:h,_onCreateLevel:h,_pruneTiles:function(){if(this._map){var t,i,e=this._map.getZoom();if(e>this.options.maxZoom||e<this.options.minZoom)this._removeAllTiles();else{for(t in this._tiles)(i=this._tiles[t]).retain=i.current;for(t in this._tiles)if((i=this._tiles[t]).current&&!i.active){var n=i.coords;this._retainParent(n.x,n.y,n.z,n.z-5)||this._retainChildren(n.x,n.y,n.z,n.z+2)}for(t in this._tiles)this._tiles[t].retain||this._removeTile(t)}}},_removeTilesAtZoom:function(t){for(var i in this._tiles)this._tiles[i].coords.z===t&&this._removeTile(i)},_removeAllTiles:function(){for(var t in this._tiles)this._removeTile(t)},_invalidateAll:function(){for(var t in this._levels)ei(this._levels[t].el),this._onRemoveLevel(Number(t)),delete this._levels[t];this._removeAllTiles(),this._tileZoom=void 0},_retainParent:function(t,i,e,n){var o=Math.floor(t/2),s=Math.floor(i/2),r=e-1,a=new E(+o,+s);a.z=+r;var h=this._tileCoordsToKey(a),u=this._tiles[h];return u&&u.active?(u.retain=!0,!0):(u&&u.loaded&&(u.retain=!0),r>n&&this._retainParent(o,s,r,n))},_retainChildren:function(t,i,e,n){for(var o=2*t;o<2*t+2;o++)for(var s=2*i;s<2*i+2;s++){var r=new E(o,s);r.z=e+1;var a=this._tileCoordsToKey(r),h=this._tiles[a];h&&h.active?h.retain=!0:(h&&h.loaded&&(h.retain=!0),e+1<n&&this._retainChildren(o,s,e+1,n))}},_resetView:function(t){var i=t&&(t.pinch||t.flyTo);this._setView(this._map.getCenter(),this._map.getZoom(),i,i)},_animateZoom:function(t){this._setView(t.center,t.zoom,!0,t.noUpdate)},_clampZoom:function(t){var i=this.options;return void 0!==i.minNativeZoom&&t<i.minNativeZoom?i.minNativeZoom:void 0!==i.maxNativeZoom&&i.maxNativeZoom<t?i.maxNativeZoom:t},_setView:function(t,i,e,n){var o=Math.round(i);o=void 0!==this.options.maxZoom&&o>this.options.maxZoom||void 0!==this.options.minZoom&&o<this.options.minZoom?void 0:this._clampZoom(o);var s=this.options.updateWhenZooming&&o!==this._tileZoom;n&&!s||(this._tileZoom=o,this._abortLoading&&this._abortLoading(),this._updateLevels(),this._resetGrid(),void 0!==o&&this._update(t),e||this._pruneTiles(),this._noPrune=!!e),this._setZoomTransforms(t,i)},_setZoomTransforms:function(t,i){for(var e in this._levels)this._setZoomTransform(this._levels[e],t,i)},_setZoomTransform:function(t,i,e){var n=this._map.getZoomScale(e,t.zoom),o=t.origin.multiplyBy(n).subtract(this._map._getNewPixelOrigin(i,e)).round();mt?di(t.el,o,n):pi(t.el,o)},_resetGrid:function(){var t=this._map,i=t.options.crs,e=this._tileSize=this.getTileSize(),n=this._tileZoom,o=this._map.getPixelWorldBounds(this._tileZoom);o&&(this._globalTileRange=this._pxBoundsToTileRange(o)),this._wrapX=i.wrapLng&&!this.options.noWrap&&[Math.floor(t.project([0,i.wrapLng[0]],n).x/e.x),Math.ceil(t.project([0,i.wrapLng[1]],n).x/e.y)],this._wrapY=i.wrapLat&&!this.options.noWrap&&[Math.floor(t.project([i.wrapLat[0],0],n).y/e.x),Math.ceil(t.project([i.wrapLat[1],0],n).y/e.y)]},_onMoveEnd:function(){this._map&&!this._map._animatingZoom&&this._update()},_getTiledPixelBounds:function(t){var i=this._map,e=i._animatingZoom?Math.max(i._animateToZoom,i.getZoom()):i.getZoom(),n=i.getZoomScale(e,this._tileZoom),o=i.project(t,this._tileZoom).floor(),s=i.getSize().divideBy(2*n);return new A(o.subtract(s),o.add(s))},_update:function(t){var i=this._map;if(i){var e=this._clampZoom(i.getZoom());if(void 0===t&&(t=i.getCenter()),void 0!==this._tileZoom){var n=this._getTiledPixelBounds(t),o=this._pxBoundsToTileRange(n),s=o.getCenter(),r=[],a=this.options.keepBuffer,h=new A(o.getBottomLeft().subtract([a,-a]),o.getTopRight().add([a,-a]));if(!(isFinite(o.min.x)&&isFinite(o.min.y)&&isFinite(o.max.x)&&isFinite(o.max.y)))throw new Error("Attempted to load an infinite number of tiles");for(var u in this._tiles){var l=this._tiles[u].coords;l.z===this._tileZoom&&h.contains(new E(l.x,l.y))||(this._tiles[u].current=!1)}if(Math.abs(e-this._tileZoom)>1)this._setView(t,e);else{for(var c=o.min.y;c<=o.max.y;c++)for(var _=o.min.x;_<=o.max.x;_++){var d=new E(_,c);if(d.z=this._tileZoom,this._isValidTile(d)){var p=this._tiles[this._tileCoordsToKey(d)];p?p.current=!0:r.push(d)}}if(r.sort((function(t,i){return t.distanceTo(s)-i.distanceTo(s)})),0!==r.length){this._loading||(this._loading=!0,this.fire("loading"));var m=document.createDocumentFragment();for(_=0;_<r.length;_++)this._addTile(r[_],m);this._level.el.appendChild(m)}}}}},_isValidTile:function(t){var i=this._map.options.crs;if(!i.infinite){var e=this._globalTileRange;if(!i.wrapLng&&(t.x<e.min.x||t.x>e.max.x)||!i.wrapLat&&(t.y<e.min.y||t.y>e.max.y))return!1}if(!this.options.bounds)return!0;var n=this._tileCoordsToBounds(t);return R(this.options.bounds).overlaps(n)},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var i=this._map,e=this.getTileSize(),n=t.scaleBy(e),o=n.add(e);return[i.unproject(n,t.z),i.unproject(o,t.z)]},_tileCoordsToBounds:function(t){var i=this._tileCoordsToNwSe(t),e=new O(i[0],i[1]);return this.options.noWrap||(e=this._map.wrapLatLngBounds(e)),e},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var i=t.split(":"),e=new E(+i[0],+i[1]);return e.z=+i[2],e},_removeTile:function(t){var i=this._tiles[t];i&&(ei(i.el),delete this._tiles[t],this.fire("tileunload",{tile:i.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){ai(t,"leaflet-tile");var i=this.getTileSize();t.style.width=i.x+"px",t.style.height=i.y+"px",t.onselectstart=h,t.onmousemove=h,$&&this.options.opacity<1&&ci(t,this.options.opacity),it&&!et&&(t.style.WebkitBackfaceVisibility="hidden")},_addTile:function(t,i){var e=this._getTilePos(t),o=this._tileCoordsToKey(t),s=this.createTile(this._wrapCoords(t),n(this._tileReady,this,t));this._initTile(s),this.createTile.length<2&&T(n(this._tileReady,this,t,null,s)),pi(s,e),this._tiles[o]={el:s,coords:t,current:!0},i.appendChild(s),this.fire("tileloadstart",{tile:s,coords:t})},_tileReady:function(t,i,e){i&&this.fire("tileerror",{error:i,tile:e,coords:t});var o=this._tileCoordsToKey(t);(e=this._tiles[o])&&(e.loaded=+new Date,this._map._fadeAnimated?(ci(e.el,0),M(this._fadeFrame),this._fadeFrame=T(this._updateOpacity,this)):(e.active=!0,this._pruneTiles()),i||(ai(e.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:e.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),$||!this._map._fadeAnimated?T(this._pruneTiles,this):setTimeout(n(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var i=new E(this._wrapX?a(t.x,this._wrapX):t.x,this._wrapY?a(t.y,this._wrapY):t.y);return i.z=t.z,i},_pxBoundsToTileRange:function(t){var i=this.getTileSize();return new A(t.min.unscaleBy(i).floor(),t.max.unscaleBy(i).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var tn=Qe.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1},initialize:function(t,i){this._url=t,(i=_(this,i)).detectRetina&&bt&&i.maxZoom>0&&(i.tileSize=Math.floor(i.tileSize/2),i.zoomReverse?(i.zoomOffset--,i.minZoom++):(i.zoomOffset++,i.maxZoom--),i.minZoom=Math.max(0,i.minZoom)),"string"==typeof i.subdomains&&(i.subdomains=i.subdomains.split("")),it||this.on("tileunload",this._onTileRemove)},setUrl:function(t,i){return this._url===t&&void 0===i&&(i=!0),this._url=t,i||this.redraw(),this},createTile:function(t,i){var e=document.createElement("img");return bi(e,"load",n(this._tileOnLoad,this,i,e)),bi(e,"error",n(this._tileOnError,this,i,e)),(this.options.crossOrigin||""===this.options.crossOrigin)&&(e.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),e.alt="",e.setAttribute("role","presentation"),e.src=this.getTileUrl(t),e},getTileUrl:function(t){var e={r:bt?"@2x":"",s:this._getSubdomain(t),x:t.x,y:t.y,z:this._getZoomForUrl()};if(this._map&&!this._map.options.crs.infinite){var n=this._globalTileRange.max.y-t.y;this.options.tms&&(e.y=n),e["-y"]=n}return m(this._url,i(e,this.options))},_tileOnLoad:function(t,i){$?setTimeout(n(t,this,null,i),0):t(null,i)},_tileOnError:function(t,i,e){var n=this.options.errorTileUrl;n&&i.getAttribute("src")!==n&&(i.src=n),t(e,i)},_onTileRemove:function(t){t.tile.onload=null},_getZoomForUrl:function(){var t=this._tileZoom,i=this.options.maxZoom;return this.options.zoomReverse&&(t=i-t),t+this.options.zoomOffset},_getSubdomain:function(t){var i=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[i]},_abortLoading:function(){var t,i;for(t in this._tiles)this._tiles[t].coords.z!==this._tileZoom&&((i=this._tiles[t].el).onload=h,i.onerror=h,i.complete||(i.src=v,ei(i),delete this._tiles[t]))},_removeTile:function(t){var i=this._tiles[t];if(i)return ot||i.el.setAttribute("src",v),Qe.prototype._removeTile.call(this,t)},_tileReady:function(t,i,e){if(this._map&&(!e||e.getAttribute("src")!==v))return Qe.prototype._tileReady.call(this,t,i,e)}});function en(t,i){return new tn(t,i)}var nn=tn.extend({defaultWmsParams:{service:"WMS",request:"GetMap",layers:"",styles:"",format:"image/jpeg",transparent:!1,version:"1.1.1"},options:{crs:null,uppercase:!1},initialize:function(t,e){this._url=t;var n=i({},this.defaultWmsParams);for(var o in e)o in this.options||(n[o]=e[o]);var s=(e=_(this,e)).detectRetina&&bt?2:1,r=this.getTileSize();n.width=r.x*s,n.height=r.y*s,this.wmsParams=n},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var i=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[i]=this._crs.code,tn.prototype.onAdd.call(this,t)},getTileUrl:function(t){var i=this._tileCoordsToNwSe(t),e=this._crs,n=I(e.project(i[0]),e.project(i[1])),o=n.min,s=n.max,r=(this._wmsVersion>=1.3&&this._crs===xe?[o.y,o.x,s.y,s.x]:[o.x,o.y,s.x,s.y]).join(","),a=tn.prototype.getTileUrl.call(this,t);return a+d(this.wmsParams,a,this.options.uppercase)+(this.options.uppercase?"&BBOX=":"&bbox=")+r},setParams:function(t,e){return i(this.wmsParams,t),e||this.redraw(),this}});tn.WMS=nn,en.wms=function(t,i){return new nn(t,i)};var on=Pe.extend({options:{padding:.1,tolerance:0},initialize:function(t){_(this,t),s(this),this._layers=this._layers||{}},onAdd:function(){this._container||(this._initContainer(),this._zoomAnimated&&ai(this._container,"leaflet-zoom-animated")),this.getPane().appendChild(this._container),this._update(),this.on("update",this._updatePaths,this)},onRemove:function(){this.off("update",this._updatePaths,this),this._destroyContainer()},getEvents:function(){var t={viewreset:this._reset,zoom:this._onZoom,moveend:this._update,zoomend:this._onZoomEnd};return this._zoomAnimated&&(t.zoomanim=this._onAnimZoom),t},_onAnimZoom:function(t){this._updateTransform(t.center,t.zoom)},_onZoom:function(){this._updateTransform(this._map.getCenter(),this._map.getZoom())},_updateTransform:function(t,i){var e=this._map.getZoomScale(i,this._zoom),n=mi(this._container),o=this._map.getSize().multiplyBy(.5+this.options.padding),s=this._map.project(this._center,i),r=this._map.project(t,i).subtract(s),a=o.multiplyBy(-e).add(n).add(o).subtract(r);mt?di(this._container,a,e):pi(this._container,a)},_reset:function(){for(var t in this._update(),this._updateTransform(this._center,this._zoom),this._layers)this._layers[t]._reset()},_onZoomEnd:function(){for(var t in this._layers)this._layers[t]._project()},_updatePaths:function(){for(var t in this._layers)this._layers[t]._update()},_update:function(){var t=this.options.padding,i=this._map.getSize(),e=this._map.containerPointToLayerPoint(i.multiplyBy(-t)).round();this._bounds=new A(e,e.add(i.multiplyBy(1+2*t)).round()),this._center=this._map.getCenter(),this._zoom=this._map.getZoom()}}),sn=on.extend({getEvents:function(){var t=on.prototype.getEvents.call(this);return t.viewprereset=this._onViewPreReset,t},_onViewPreReset:function(){this._postponeUpdatePaths=!0},onAdd:function(){on.prototype.onAdd.call(this),this._draw()},_initContainer:function(){var t=this._container=document.createElement("canvas");bi(t,"mousemove",this._onMouseMove,this),bi(t,"click dblclick mousedown mouseup contextmenu",this._onClick,this),bi(t,"mouseout",this._handleMouseOut,this),this._ctx=t.getContext("2d")},_destroyContainer:function(){M(this._redrawRequest),delete this._ctx,ei(this._container),Mi(this._container),delete this._container},_updatePaths:function(){if(!this._postponeUpdatePaths){for(var t in this._redrawBounds=null,this._layers)this._layers[t]._update();this._redraw()}},_update:function(){if(!this._map._animatingZoom||!this._bounds){on.prototype._update.call(this);var t=this._bounds,i=this._container,e=t.getSize(),n=bt?2:1;pi(i,t.min),i.width=n*e.x,i.height=n*e.y,i.style.width=e.x+"px",i.style.height=e.y+"px",bt&&this._ctx.scale(2,2),this._ctx.translate(-t.min.x,-t.min.y),this.fire("update")}},_reset:function(){on.prototype._reset.call(this),this._postponeUpdatePaths&&(this._postponeUpdatePaths=!1,this._updatePaths())},_initPath:function(t){this._updateDashArray(t),this._layers[s(t)]=t;var i=t._order={layer:t,prev:this._drawLast,next:null};this._drawLast&&(this._drawLast.next=i),this._drawLast=i,this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(t){this._requestRedraw(t)},_removePath:function(t){var i=t._order,e=i.next,n=i.prev;e?e.prev=n:this._drawLast=n,n?n.next=e:this._drawFirst=e,delete t._order,delete this._layers[s(t)],this._requestRedraw(t)},_updatePath:function(t){this._extendRedrawBounds(t),t._project(),t._update(),this._requestRedraw(t)},_updateStyle:function(t){this._updateDashArray(t),this._requestRedraw(t)},_updateDashArray:function(t){if("string"==typeof t.options.dashArray){var i,e,n=t.options.dashArray.split(/[, ]+/),o=[];for(e=0;e<n.length;e++){if(i=Number(n[e]),isNaN(i))return;o.push(i)}t.options._dashArray=o}else t.options._dashArray=t.options.dashArray},_requestRedraw:function(t){this._map&&(this._extendRedrawBounds(t),this._redrawRequest=this._redrawRequest||T(this._redraw,this))},_extendRedrawBounds:function(t){if(t._pxBounds){var i=(t.options.weight||0)+1;this._redrawBounds=this._redrawBounds||new A,this._redrawBounds.extend(t._pxBounds.min.subtract([i,i])),this._redrawBounds.extend(t._pxBounds.max.add([i,i]))}},_redraw:function(){this._redrawRequest=null,this._redrawBounds&&(this._redrawBounds.min._floor(),this._redrawBounds.max._ceil()),this._clear(),this._draw(),this._redrawBounds=null},_clear:function(){var t=this._redrawBounds;if(t){var i=t.getSize();this._ctx.clearRect(t.min.x,t.min.y,i.x,i.y)}else this._ctx.save(),this._ctx.setTransform(1,0,0,1,0,0),this._ctx.clearRect(0,0,this._container.width,this._container.height),this._ctx.restore()},_draw:function(){var t,i=this._redrawBounds;if(this._ctx.save(),i){var e=i.getSize();this._ctx.beginPath(),this._ctx.rect(i.min.x,i.min.y,e.x,e.y),this._ctx.clip()}this._drawing=!0;for(var n=this._drawFirst;n;n=n.next)t=n.layer,(!i||t._pxBounds&&t._pxBounds.intersects(i))&&t._updatePath();this._drawing=!1,this._ctx.restore()},_updatePoly:function(t,i){if(this._drawing){var e,n,o,s,r=t._parts,a=r.length,h=this._ctx;if(a){for(h.beginPath(),e=0;e<a;e++){for(n=0,o=r[e].length;n<o;n++)s=r[e][n],h[n?"lineTo":"moveTo"](s.x,s.y);i&&h.closePath()}this._fillStroke(h,t)}}},_updateCircle:function(t){if(this._drawing&&!t._empty()){var i=t._point,e=this._ctx,n=Math.max(Math.round(t._radius),1),o=(Math.max(Math.round(t._radiusY),1)||n)/n;1!==o&&(e.save(),e.scale(1,o)),e.beginPath(),e.arc(i.x,i.y/o,n,0,2*Math.PI,!1),1!==o&&e.restore(),this._fillStroke(e,t)}},_fillStroke:function(t,i){var e=i.options;e.fill&&(t.globalAlpha=e.fillOpacity,t.fillStyle=e.fillColor||e.color,t.fill(e.fillRule||"evenodd")),e.stroke&&0!==e.weight&&(t.setLineDash&&t.setLineDash(i.options&&i.options._dashArray||[]),t.globalAlpha=e.opacity,t.lineWidth=e.weight,t.strokeStyle=e.color,t.lineCap=e.lineCap,t.lineJoin=e.lineJoin,t.stroke())},_onClick:function(t){for(var i,e,n=this._map.mouseEventToLayerPoint(t),o=this._drawFirst;o;o=o.next)(i=o.layer).options.interactive&&i._containsPoint(n)&&("click"!==t.type&&"preclick"===t.type||!this._map._draggableMoved(i))&&(e=i);e&&(ji(t),this._fireEvent([e],t))},_onMouseMove:function(t){if(this._map&&!this._map.dragging.moving()&&!this._map._animatingZoom){var i=this._map.mouseEventToLayerPoint(t);this._handleMouseHover(t,i)}},_handleMouseOut:function(t){var i=this._hoveredLayer;i&&(hi(this._container,"leaflet-interactive"),this._fireEvent([i],t,"mouseout"),this._hoveredLayer=null,this._mouseHoverThrottled=!1)},_handleMouseHover:function(t,i){if(!this._mouseHoverThrottled){for(var e,o,s=this._drawFirst;s;s=s.next)(e=s.layer).options.interactive&&e._containsPoint(i)&&(o=e);o!==this._hoveredLayer&&(this._handleMouseOut(t),o&&(ai(this._container,"leaflet-interactive"),this._fireEvent([o],t,"mouseover"),this._hoveredLayer=o)),this._hoveredLayer&&this._fireEvent([this._hoveredLayer],t),this._mouseHoverThrottled=!0,setTimeout(n((function(){this._mouseHoverThrottled=!1}),this),32)}},_fireEvent:function(t,i,e){this._map._fireDOMEvent(i,e||i.type,t)},_bringToFront:function(t){var i=t._order;if(i){var e=i.next,n=i.prev;e&&(e.prev=n,n?n.next=e:e&&(this._drawFirst=e),i.prev=this._drawLast,this._drawLast.next=i,i.next=null,this._drawLast=i,this._requestRedraw(t))}},_bringToBack:function(t){var i=t._order;if(i){var e=i.next,n=i.prev;n&&(n.next=e,e?e.prev=n:n&&(this._drawLast=n),i.prev=null,i.next=this._drawFirst,this._drawFirst.prev=i,this._drawFirst=i,this._requestRedraw(t))}}});function rn(t){return Mt?new sn(t):null}var an=function(){try{return document.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return document.createElement("<lvml:"+t+' class="lvml">')}}catch(t){return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),hn={_initContainer:function(){this._container=ii("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(on.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var i=t._container=an("shape");ai(i,"leaflet-vml-shape "+(this.options.className||"")),i.coordsize="1 1",t._path=an("path"),i.appendChild(t._path),this._updateStyle(t),this._layers[s(t)]=t},_addPath:function(t){var i=t._container;this._container.appendChild(i),t.options.interactive&&t.addInteractiveTarget(i)},_removePath:function(t){var i=t._container;ei(i),t.removeInteractiveTarget(i),delete this._layers[s(t)]},_updateStyle:function(t){var i=t._stroke,e=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(i||(i=t._stroke=an("stroke")),o.appendChild(i),i.weight=n.weight+"px",i.color=n.color,i.opacity=n.opacity,n.dashArray?i.dashStyle=f(n.dashArray)?n.dashArray.join(" "):n.dashArray.replace(/( *, *)/g," "):i.dashStyle="",i.endcap=n.lineCap.replace("butt","flat"),i.joinstyle=n.lineJoin):i&&(o.removeChild(i),t._stroke=null),n.fill?(e||(e=t._fill=an("fill")),o.appendChild(e),e.color=n.fillColor||n.color,e.opacity=n.fillOpacity):e&&(o.removeChild(e),t._fill=null)},_updateCircle:function(t){var i=t._point.round(),e=Math.round(t._radius),n=Math.round(t._radiusY||e);this._setPath(t,t._empty()?"M0 0":"AL "+i.x+","+i.y+" "+e+","+n+" 0,23592600")},_setPath:function(t,i){t._path.v=i},_bringToFront:function(t){oi(t._container)},_bringToBack:function(t){si(t._container)}},un=Ct?an:K,ln=on.extend({getEvents:function(){var t=on.prototype.getEvents.call(this);return t.zoomstart=this._onZoomStart,t},_initContainer:function(){this._container=un("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=un("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){ei(this._container),Mi(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_onZoomStart:function(){this._update()},_update:function(){if(!this._map._animatingZoom||!this._bounds){on.prototype._update.call(this);var t=this._bounds,i=t.getSize(),e=this._container;this._svgSize&&this._svgSize.equals(i)||(this._svgSize=i,e.setAttribute("width",i.x),e.setAttribute("height",i.y)),pi(e,t.min),e.setAttribute("viewBox",[t.min.x,t.min.y,i.x,i.y].join(" ")),this.fire("update")}},_initPath:function(t){var i=t._path=un("path");t.options.className&&ai(i,t.options.className),t.options.interactive&&ai(i,"leaflet-interactive"),this._updateStyle(t),this._layers[s(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){ei(t._path),t.removeInteractiveTarget(t._path),delete this._layers[s(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var i=t._path,e=t.options;i&&(e.stroke?(i.setAttribute("stroke",e.color),i.setAttribute("stroke-opacity",e.opacity),i.setAttribute("stroke-width",e.weight),i.setAttribute("stroke-linecap",e.lineCap),i.setAttribute("stroke-linejoin",e.lineJoin),e.dashArray?i.setAttribute("stroke-dasharray",e.dashArray):i.removeAttribute("stroke-dasharray"),e.dashOffset?i.setAttribute("stroke-dashoffset",e.dashOffset):i.removeAttribute("stroke-dashoffset")):i.setAttribute("stroke","none"),e.fill?(i.setAttribute("fill",e.fillColor||e.color),i.setAttribute("fill-opacity",e.fillOpacity),i.setAttribute("fill-rule",e.fillRule||"evenodd")):i.setAttribute("fill","none"))},_updatePoly:function(t,i){this._setPath(t,Y(t._parts,i))},_updateCircle:function(t){var i=t._point,e=Math.max(Math.round(t._radius),1),n="a"+e+","+(Math.max(Math.round(t._radiusY),1)||e)+" 0 1,0 ",o=t._empty()?"M0 0":"M"+(i.x-e)+","+i.y+n+2*e+",0 "+n+2*-e+",0 ";this._setPath(t,o)},_setPath:function(t,i){t._path.setAttribute("d",i)},_bringToFront:function(t){oi(t._path)},_bringToBack:function(t){si(t._path)}});function cn(t){return zt||Ct?new ln(t):null}Ct&&ln.include(hn),Vi.include({getRenderer:function(t){var i=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer;return i||(i=this._renderer=this._createRenderer()),this.hasLayer(i)||this.addLayer(i),i},_getPaneRenderer:function(t){if("overlayPane"===t||void 0===t)return!1;var i=this._paneRenderers[t];return void 0===i&&(i=this._createRenderer({pane:t}),this._paneRenderers[t]=i),i},_createRenderer:function(t){return this.options.preferCanvas&&rn(t)||cn(t)}});var _n=Be.extend({initialize:function(t,i){Be.prototype.initialize.call(this,this._boundsToLatLngs(t),i)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=R(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});ln.create=un,ln.pointsToPath=Y,Ae.geometryToLayer=Ie,Ae.coordsToLatLng=Re,Ae.coordsToLatLngs=Ne,Ae.latLngToCoords=De,Ae.latLngsToCoords=je,Ae.getFeature=We,Ae.asFeature=He,Vi.mergeOptions({boxZoom:!0});var dn=$i.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){bi(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){Mi(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){ei(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),Vt(),gi(),this._startPoint=this._map.mouseEventToContainerPoint(t),bi(document,{contextmenu:Ii,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=ii("div","leaflet-zoom-box",this._container),ai(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var i=new A(this._point,this._startPoint),e=i.getSize();pi(this._box,i.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(ei(this._box),hi(this._container,"leaflet-crosshair")),qt(),vi(),Mi(document,{contextmenu:Ii,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(n(this._resetState,this),0);var i=new O(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point));this._map.fitBounds(i).fire("boxzoomend",{boxZoomBounds:i})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}});Vi.addInitHook("addHandler","boxZoom",dn),Vi.mergeOptions({doubleClickZoom:!0});var pn=$i.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var i=this._map,e=i.getZoom(),n=i.options.zoomDelta,o=t.originalEvent.shiftKey?e-n:e+n;"center"===i.options.doubleClickZoom?i.setZoom(o):i.setZoomAround(t.containerPoint,o)}});Vi.addInitHook("addHandler","doubleClickZoom",pn),Vi.mergeOptions({dragging:!0,inertia:!et,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});var mn=$i.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new oe(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))}ai(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){hi(this._map._container,"leaflet-grab"),hi(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t=this._map;if(t._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity){var i=R(this._map.options.maxBounds);this._offsetLimit=I(this._map.latLngToContainerPoint(i.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(i.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))}else this._offsetLimit=null;t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){if(this._map.options.inertia){var i=this._lastTime=+new Date,e=this._lastPos=this._draggable._absPos||this._draggable._newPos;this._positions.push(e),this._times.push(i),this._prunePositions(i)}this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;this._positions.length>1&&t-this._times[0]>50;)this._positions.shift(),this._times.shift()},_onZoomEnd:function(){var t=this._map.getSize().divideBy(2),i=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=i.subtract(t).x,this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(t,i){return t-(t-i)*this._viscosity},_onPreDragLimit:function(){if(this._viscosity&&this._offsetLimit){var t=this._draggable._newPos.subtract(this._draggable._startPos),i=this._offsetLimit;t.x<i.min.x&&(t.x=this._viscousLimit(t.x,i.min.x)),t.y<i.min.y&&(t.y=this._viscousLimit(t.y,i.min.y)),t.x>i.max.x&&(t.x=this._viscousLimit(t.x,i.max.x)),t.y>i.max.y&&(t.y=this._viscousLimit(t.y,i.max.y)),this._draggable._newPos=this._draggable._startPos.add(t)}},_onPreDragWrap:function(){var t=this._worldWidth,i=Math.round(t/2),e=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-i+e)%t+i-e,s=(n+i+e)%t-i-e,r=Math.abs(o+e)<Math.abs(s+e)?o:s;this._draggable._absPos=this._draggable._newPos.clone(),this._draggable._newPos.x=r},_onDragEnd:function(t){var i=this._map,e=i.options,n=!e.inertia||this._times.length<2;if(i.fire("dragend",t),n)i.fire("moveend");else{this._prunePositions(+new Date);var o=this._lastPos.subtract(this._positions[0]),s=(this._lastTime-this._times[0])/1e3,r=e.easeLinearity,a=o.multiplyBy(r/s),h=a.distanceTo([0,0]),u=Math.min(e.inertiaMaxSpeed,h),l=a.multiplyBy(u/h),c=u/(e.inertiaDeceleration*r),_=l.multiplyBy(-c/2).round();_.x||_.y?(_=i._limitOffset(_,i.options.maxBounds),T((function(){i.panBy(_,{duration:c,easeLinearity:r,noMoveStart:!0,animate:!0})}))):i.fire("moveend")}}});Vi.addInitHook("addHandler","dragging",mn),Vi.mergeOptions({keyboard:!0,keyboardPanDelta:80});var fn=$i.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,54,173]},initialize:function(t){this._map=t,this._setPanDelta(t.options.keyboardPanDelta),this._setZoomDelta(t.options.zoomDelta)},addHooks:function(){var t=this._map._container;t.tabIndex<=0&&(t.tabIndex="0"),bi(t,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.on({focus:this._addHooks,blur:this._removeHooks},this)},removeHooks:function(){this._removeHooks(),Mi(this._map._container,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.off({focus:this._addHooks,blur:this._removeHooks},this)},_onMouseDown:function(){if(!this._focused){var t=document.body,i=document.documentElement,e=t.scrollTop||i.scrollTop,n=t.scrollLeft||i.scrollLeft;this._map._container.focus(),window.scrollTo(n,e)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanDelta:function(t){var i,e,n=this._panKeys={},o=this.keyCodes;for(i=0,e=o.left.length;i<e;i++)n[o.left[i]]=[-1*t,0];for(i=0,e=o.right.length;i<e;i++)n[o.right[i]]=[t,0];for(i=0,e=o.down.length;i<e;i++)n[o.down[i]]=[0,t];for(i=0,e=o.up.length;i<e;i++)n[o.up[i]]=[0,-1*t]},_setZoomDelta:function(t){var i,e,n=this._zoomKeys={},o=this.keyCodes;for(i=0,e=o.zoomIn.length;i<e;i++)n[o.zoomIn[i]]=t;for(i=0,e=o.zoomOut.length;i<e;i++)n[o.zoomOut[i]]=-t},_addHooks:function(){bi(document,"keydown",this._onKeyDown,this)},_removeHooks:function(){Mi(document,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){if(!(t.altKey||t.ctrlKey||t.metaKey)){var i,e=t.keyCode,n=this._map;if(e in this._panKeys)n._panAnim&&n._panAnim._inProgress||(i=this._panKeys[e],t.shiftKey&&(i=B(i).multiplyBy(3)),n.panBy(i),n.options.maxBounds&&n.panInsideBounds(n.options.maxBounds));else if(e in this._zoomKeys)n.setZoom(n.getZoom()+(t.shiftKey?3:1)*this._zoomKeys[e]);else{if(27!==e||!n._popup||!n._popup.options.closeOnEscapeKey)return;n.closePopup()}Ii(t)}}});Vi.addInitHook("addHandler","keyboard",fn),Vi.mergeOptions({scrollWheelZoom:!0,wheelDebounceTime:40,wheelPxPerZoomLevel:60});var gn=$i.extend({addHooks:function(){bi(this._map._container,"wheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){Mi(this._map._container,"wheel",this._onWheelScroll,this)},_onWheelScroll:function(t){var i=Ni(t),e=this._map.options.wheelDebounceTime;this._delta+=i,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var o=Math.max(e-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(n(this._performZoom,this),o),Ii(t)},_performZoom:function(){var t=this._map,i=t.getZoom(),e=this._map.options.zoomSnap||0;t._stop();var n=this._delta/(4*this._map.options.wheelPxPerZoomLevel),o=4*Math.log(2/(1+Math.exp(-Math.abs(n))))/Math.LN2,s=e?Math.ceil(o/e)*e:o,r=t._limitZoom(i+(this._delta>0?s:-s))-i;this._delta=0,this._startTime=null,r&&("center"===t.options.scrollWheelZoom?t.setZoom(i+r):t.setZoomAround(this._lastMousePos,i+r))}});Vi.addInitHook("addHandler","scrollWheelZoom",gn),Vi.mergeOptions({tap:!0,tapTolerance:15});var vn=$i.extend({addHooks:function(){bi(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){Mi(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(Ai(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,void clearTimeout(this._holdTimeout);var i=t.touches[0],e=i.target;this._startPos=this._newPos=new E(i.clientX,i.clientY),e.tagName&&"a"===e.tagName.toLowerCase()&&ai(e,"leaflet-active"),this._holdTimeout=setTimeout(n((function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))}),this),1e3),this._simulateEvent("mousedown",i),bi(document,{touchmove:this._onMove,touchend:this._onUp},this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),Mi(document,{touchmove:this._onMove,touchend:this._onUp},this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],e=i.target;e&&e.tagName&&"a"===e.tagName.toLowerCase()&&hi(e,"leaflet-active"),this._simulateEvent("mouseup",i),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var i=t.touches[0];this._newPos=new E(i.clientX,i.clientY),this._simulateEvent("mousemove",i)},_simulateEvent:function(t,i){var e=document.createEvent("MouseEvents");e._simulated=!0,i.target._simulatedClick=!0,e.initMouseEvent(t,!0,!0,window,1,i.screenX,i.screenY,i.clientX,i.clientY,!1,!1,!1,!1,0,null),i.target.dispatchEvent(e)}});!wt||xt&&!ht||Vi.addInitHook("addHandler","tap",vn),Vi.mergeOptions({touchZoom:wt&&!et,bounceAtZoomLimits:!0});var yn=$i.extend({addHooks:function(){ai(this._map._container,"leaflet-touch-zoom"),bi(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){hi(this._map._container,"leaflet-touch-zoom"),Mi(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var e=i.mouseEventToContainerPoint(t.touches[0]),n=i.mouseEventToContainerPoint(t.touches[1]);this._centerPoint=i.getSize()._divideBy(2),this._startLatLng=i.containerPointToLatLng(this._centerPoint),"center"!==i.options.touchZoom&&(this._pinchStartLatLng=i.containerPointToLatLng(e.add(n)._divideBy(2))),this._startDist=e.distanceTo(n),this._startZoom=i.getZoom(),this._moved=!1,this._zooming=!0,i._stop(),bi(document,"touchmove",this._onTouchMove,this),bi(document,"touchend",this._onTouchEnd,this),Ai(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length&&this._zooming){var i=this._map,e=i.mouseEventToContainerPoint(t.touches[0]),o=i.mouseEventToContainerPoint(t.touches[1]),s=e.distanceTo(o)/this._startDist;if(this._zoom=i.getScaleZoom(s,this._startZoom),!i.options.bounceAtZoomLimits&&(this._zoom<i.getMinZoom()&&s<1||this._zoom>i.getMaxZoom()&&s>1)&&(this._zoom=i._limitZoom(this._zoom)),"center"===i.options.touchZoom){if(this._center=this._startLatLng,1===s)return}else{var r=e._add(o)._divideBy(2)._subtract(this._centerPoint);if(1===s&&0===r.x&&0===r.y)return;this._center=i.unproject(i.project(this._pinchStartLatLng,this._zoom).subtract(r),this._zoom)}this._moved||(i._moveStart(!0,!1),this._moved=!0),M(this._animRequest);var a=n(i._move,i,this._center,this._zoom,{pinch:!0,round:!1});this._animRequest=T(a,this,!0),Ai(t)}},_onTouchEnd:function(){this._moved&&this._zooming?(this._zooming=!1,M(this._animRequest),Mi(document,"touchmove",this._onTouchMove,this),Mi(document,"touchend",this._onTouchEnd,this),this._map.options.zoomAnimation?this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),!0,this._map.options.zoomSnap):this._map._resetView(this._center,this._map._limitZoom(this._zoom))):this._zooming=!1}});Vi.addInitHook("addHandler","touchZoom",yn),Vi.BoxZoom=dn,Vi.DoubleClickZoom=pn,Vi.Drag=mn,Vi.Keyboard=fn,Vi.ScrollWheelZoom=gn,Vi.Tap=vn,Vi.TouchZoom=yn,t.version="1.6.0",t.Control=qi,t.control=Gi,t.Browser=Zt,t.Evented=Z,t.Mixin=te,t.Util=z,t.Class=C,t.Handler=$i,t.extend=i,t.bind=n,t.stamp=s,t.setOptions=_,t.DomEvent=Fi,t.DomUtil=Li,t.PosAnimation=Ui,t.Draggable=oe,t.LineUtil=de,t.PolyUtil=me,t.Point=E,t.point=B,t.Bounds=A,t.bounds=I,t.Transformation=U,t.transformation=V,t.Projection=ve,t.LatLng=N,t.latLng=D,t.LatLngBounds=O,t.latLngBounds=R,t.CRS=W,t.GeoJSON=Ae,t.geoJSON=Ue,t.geoJson=Ve,t.Layer=Pe,t.LayerGroup=Le,t.layerGroup=function(t,i){return new Le(t,i)},t.FeatureGroup=be,t.featureGroup=function(t,i){return new be(t,i)},t.ImageOverlay=qe,t.imageOverlay=function(t,i,e){return new qe(t,i,e)},t.VideoOverlay=Ge,t.videoOverlay=function(t,i,e){return new Ge(t,i,e)},t.SVGOverlay=Ke,t.svgOverlay=function(t,i,e){return new Ke(t,i,e)},t.DivOverlay=Ye,t.Popup=Xe,t.popup=function(t,i){return new Xe(t,i)},t.Tooltip=Je,t.tooltip=function(t,i){return new Je(t,i)},t.Icon=Te,t.icon=function(t){return new Te(t)},t.DivIcon=$e,t.divIcon=function(t){return new $e(t)},t.Marker=Ce,t.marker=function(t,i){return new Ce(t,i)},t.TileLayer=tn,t.tileLayer=en,t.GridLayer=Qe,t.gridLayer=function(t){return new Qe(t)},t.SVG=ln,t.svg=cn,t.Renderer=on,t.Canvas=sn,t.canvas=rn,t.Path=Se,t.CircleMarker=Ze,t.circleMarker=function(t,i){return new Ze(t,i)},t.Circle=Ee,t.circle=function(t,i,e){return new Ee(t,i,e)},t.Polyline=ke,t.polyline=function(t,i){return new ke(t,i)},t.Polygon=Be,t.polygon=function(t,i){return new Be(t,i)},t.Rectangle=_n,t.rectangle=function(t,i){return new _n(t,i)},t.Map=Vi,t.map=function(t,i){return new Vi(t,i)};var xn=window.L;t.noConflict=function(){return window.L=xn,this},window.L=t}));
--- a/src/pyams_gis/resources/js/leaflet-esri-2.0.8.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3967 +0,0 @@
-/* esri-leaflet - v2.0.8 - Tue Mar 21 2017 16:10:14 GMT-0700 (PDT)
- * Copyright (c) 2017 Environmental Systems Research Institute, Inc.
- * Apache-2.0 */
-(function (global, factory) {
-	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet')) :
-	typeof define === 'function' && define.amd ? define(['exports', 'leaflet'], factory) :
-	(factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}),global.L));
-}(this, function (exports,L$1) { 'use strict';
-
-	var L$1__default = 'default' in L$1 ? L$1['default'] : L$1;
-
-	var version = "2.0.8";
-
-	var cors = ((window.XMLHttpRequest && 'withCredentials' in new window.XMLHttpRequest()));
-	var pointerEvents = document.documentElement.style.pointerEvents === '';
-
-	var Support = {
-	  cors: cors,
-	  pointerEvents: pointerEvents
-	};
-
-	var options = {
-	  attributionWidthOffset: 55
-	};
-
-	var callbacks = 0;
-
-	function serialize (params) {
-	  var data = '';
-
-	  params.f = params.f || 'json';
-
-	  for (var key in params) {
-	    if (params.hasOwnProperty(key)) {
-	      var param = params[key];
-	      var type = Object.prototype.toString.call(param);
-	      var value;
-
-	      if (data.length) {
-	        data += '&';
-	      }
-
-	      if (type === '[object Array]') {
-	        value = (Object.prototype.toString.call(param[0]) === '[object Object]') ? JSON.stringify(param) : param.join(',');
-	      } else if (type === '[object Object]') {
-	        value = JSON.stringify(param);
-	      } else if (type === '[object Date]') {
-	        value = param.valueOf();
-	      } else {
-	        value = param;
-	      }
-
-	      data += encodeURIComponent(key) + '=' + encodeURIComponent(value);
-	    }
-	  }
-
-	  return data;
-	}
-
-	function createRequest (callback, context) {
-	  var httpRequest = new window.XMLHttpRequest();
-
-	  httpRequest.onerror = function (e) {
-	    httpRequest.onreadystatechange = L$1.Util.falseFn;
-
-	    callback.call(context, {
-	      error: {
-	        code: 500,
-	        message: 'XMLHttpRequest error'
-	      }
-	    }, null);
-	  };
-
-	  httpRequest.onreadystatechange = function () {
-	    var response;
-	    var error;
-
-	    if (httpRequest.readyState === 4) {
-	      try {
-	        response = JSON.parse(httpRequest.responseText);
-	      } catch (e) {
-	        response = null;
-	        error = {
-	          code: 500,
-	          message: 'Could not parse response as JSON. This could also be caused by a CORS or XMLHttpRequest error.'
-	        };
-	      }
-
-	      if (!error && response.error) {
-	        error = response.error;
-	        response = null;
-	      }
-
-	      httpRequest.onerror = L$1.Util.falseFn;
-
-	      callback.call(context, error, response);
-	    }
-	  };
-
-	  httpRequest.ontimeout = function () {
-	    this.onerror();
-	  };
-
-	  return httpRequest;
-	}
-
-	function xmlHttpPost (url, params, callback, context) {
-	  var httpRequest = createRequest(callback, context);
-	  httpRequest.open('POST', url);
-
-	  if (typeof context !== 'undefined' && context !== null) {
-	    if (typeof context.options !== 'undefined') {
-	      httpRequest.timeout = context.options.timeout;
-	    }
-	  }
-	  httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-	  httpRequest.send(serialize(params));
-
-	  return httpRequest;
-	}
-
-	function xmlHttpGet (url, params, callback, context) {
-	  var httpRequest = createRequest(callback, context);
-	  httpRequest.open('GET', url + '?' + serialize(params), true);
-
-	  if (typeof context !== 'undefined' && context !== null) {
-	    if (typeof context.options !== 'undefined') {
-	      httpRequest.timeout = context.options.timeout;
-	    }
-	  }
-	  httpRequest.send(null);
-
-	  return httpRequest;
-	}
-
-	// AJAX handlers for CORS (modern browsers) or JSONP (older browsers)
-	function request (url, params, callback, context) {
-	  var paramString = serialize(params);
-	  var httpRequest = createRequest(callback, context);
-	  var requestLength = (url + '?' + paramString).length;
-
-	  // ie10/11 require the request be opened before a timeout is applied
-	  if (requestLength <= 2000 && Support.cors) {
-	    httpRequest.open('GET', url + '?' + paramString);
-	  } else if (requestLength > 2000 && Support.cors) {
-	    httpRequest.open('POST', url);
-	    httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-	  }
-
-	  if (typeof context !== 'undefined' && context !== null) {
-	    if (typeof context.options !== 'undefined') {
-	      httpRequest.timeout = context.options.timeout;
-	    }
-	  }
-
-	  // request is less than 2000 characters and the browser supports CORS, make GET request with XMLHttpRequest
-	  if (requestLength <= 2000 && Support.cors) {
-	    httpRequest.send(null);
-
-	  // request is more than 2000 characters and the browser supports CORS, make POST request with XMLHttpRequest
-	  } else if (requestLength > 2000 && Support.cors) {
-	    httpRequest.send(paramString);
-
-	  // request is less  than 2000 characters and the browser does not support CORS, make a JSONP request
-	  } else if (requestLength <= 2000 && !Support.cors) {
-	    return jsonp(url, params, callback, context);
-
-	  // request is longer then 2000 characters and the browser does not support CORS, log a warning
-	  } else {
-	    warn('a request to ' + url + ' was longer then 2000 characters and this browser cannot make a cross-domain post request. Please use a proxy http://esri.github.io/esri-leaflet/api-reference/request.html');
-	    return;
-	  }
-
-	  return httpRequest;
-	}
-
-	function jsonp (url, params, callback, context) {
-	  window._EsriLeafletCallbacks = window._EsriLeafletCallbacks || {};
-	  var callbackId = 'c' + callbacks;
-	  params.callback = 'window._EsriLeafletCallbacks.' + callbackId;
-
-	  window._EsriLeafletCallbacks[callbackId] = function (response) {
-	    if (window._EsriLeafletCallbacks[callbackId] !== true) {
-	      var error;
-	      var responseType = Object.prototype.toString.call(response);
-
-	      if (!(responseType === '[object Object]' || responseType === '[object Array]')) {
-	        error = {
-	          error: {
-	            code: 500,
-	            message: 'Expected array or object as JSONP response'
-	          }
-	        };
-	        response = null;
-	      }
-
-	      if (!error && response.error) {
-	        error = response;
-	        response = null;
-	      }
-
-	      callback.call(context, error, response);
-	      window._EsriLeafletCallbacks[callbackId] = true;
-	    }
-	  };
-
-	  var script = L$1.DomUtil.create('script', null, document.body);
-	  script.type = 'text/javascript';
-	  script.src = url + '?' + serialize(params);
-	  script.id = callbackId;
-
-	  callbacks++;
-
-	  return {
-	    id: callbackId,
-	    url: script.src,
-	    abort: function () {
-	      window._EsriLeafletCallbacks._callback[callbackId]({
-	        code: 0,
-	        message: 'Request aborted.'
-	      });
-	    }
-	  };
-	}
-
-	var get = ((Support.cors) ? xmlHttpGet : jsonp);
-	get.CORS = xmlHttpGet;
-	get.JSONP = jsonp;
-
-	// export the Request object to call the different handlers for debugging
-	var Request = {
-	  request: request,
-	  get: get,
-	  post: xmlHttpPost
-	};
-
-	/*
-	 * Copyright 2015 Esri
-	 *
-	 * Licensed under the Apache License, Version 2.0 (the "License");
-	 * you may not use this file except in compliance with the License.
-	 * You may obtain a copy of the License at
-	 *
-	 *     http://www.apache.org/licenses/LICENSE-2.0
-	 *
-	 * Unless required by applicable law or agreed to in writing, software
-	 * distributed under the License is distributed on an "AS IS" BASIS,
-	 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-	 * See the License for the specific language governing permissions and
-	 * limitations under the Liscense.
-	 */
-
-	// checks if 2 x,y points are equal
-	function pointsEqual (a, b) {
-	  for (var i = 0; i < a.length; i++) {
-	    if (a[i] !== b[i]) {
-	      return false;
-	    }
-	  }
-	  return true;
-	}
-
-	// checks if the first and last points of a ring are equal and closes the ring
-	function closeRing (coordinates) {
-	  if (!pointsEqual(coordinates[0], coordinates[coordinates.length - 1])) {
-	    coordinates.push(coordinates[0]);
-	  }
-	  return coordinates;
-	}
-
-	// determine if polygon ring coordinates are clockwise. clockwise signifies outer ring, counter-clockwise an inner ring
-	// or hole. this logic was found at http://stackoverflow.com/questions/1165647/how-to-determine-if-a-list-of-polygon-
-	// points-are-in-clockwise-order
-	function ringIsClockwise (ringToTest) {
-	  var total = 0;
-	  var i = 0;
-	  var rLength = ringToTest.length;
-	  var pt1 = ringToTest[i];
-	  var pt2;
-	  for (i; i < rLength - 1; i++) {
-	    pt2 = ringToTest[i + 1];
-	    total += (pt2[0] - pt1[0]) * (pt2[1] + pt1[1]);
-	    pt1 = pt2;
-	  }
-	  return (total >= 0);
-	}
-
-	// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L504-L519
-	function vertexIntersectsVertex (a1, a2, b1, b2) {
-	  var uaT = (b2[0] - b1[0]) * (a1[1] - b1[1]) - (b2[1] - b1[1]) * (a1[0] - b1[0]);
-	  var ubT = (a2[0] - a1[0]) * (a1[1] - b1[1]) - (a2[1] - a1[1]) * (a1[0] - b1[0]);
-	  var uB = (b2[1] - b1[1]) * (a2[0] - a1[0]) - (b2[0] - b1[0]) * (a2[1] - a1[1]);
-
-	  if (uB !== 0) {
-	    var ua = uaT / uB;
-	    var ub = ubT / uB;
-
-	    if (ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1) {
-	      return true;
-	    }
-	  }
-
-	  return false;
-	}
-
-	// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L521-L531
-	function arrayIntersectsArray (a, b) {
-	  for (var i = 0; i < a.length - 1; i++) {
-	    for (var j = 0; j < b.length - 1; j++) {
-	      if (vertexIntersectsVertex(a[i], a[i + 1], b[j], b[j + 1])) {
-	        return true;
-	      }
-	    }
-	  }
-
-	  return false;
-	}
-
-	// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L470-L480
-	function coordinatesContainPoint (coordinates, point) {
-	  var contains = false;
-	  for (var i = -1, l = coordinates.length, j = l - 1; ++i < l; j = i) {
-	    if (((coordinates[i][1] <= point[1] && point[1] < coordinates[j][1]) ||
-	         (coordinates[j][1] <= point[1] && point[1] < coordinates[i][1])) &&
-	        (point[0] < (coordinates[j][0] - coordinates[i][0]) * (point[1] - coordinates[i][1]) / (coordinates[j][1] - coordinates[i][1]) + coordinates[i][0])) {
-	      contains = !contains;
-	    }
-	  }
-	  return contains;
-	}
-
-	// ported from terraformer-arcgis-parser.js https://github.com/Esri/terraformer-arcgis-parser/blob/master/terraformer-arcgis-parser.js#L106-L113
-	function coordinatesContainCoordinates (outer, inner) {
-	  var intersects = arrayIntersectsArray(outer, inner);
-	  var contains = coordinatesContainPoint(outer, inner[0]);
-	  if (!intersects && contains) {
-	    return true;
-	  }
-	  return false;
-	}
-
-	// do any polygons in this array contain any other polygons in this array?
-	// used for checking for holes in arcgis rings
-	// ported from terraformer-arcgis-parser.js https://github.com/Esri/terraformer-arcgis-parser/blob/master/terraformer-arcgis-parser.js#L117-L172
-	function convertRingsToGeoJSON (rings) {
-	  var outerRings = [];
-	  var holes = [];
-	  var x; // iterator
-	  var outerRing; // current outer ring being evaluated
-	  var hole; // current hole being evaluated
-
-	  // for each ring
-	  for (var r = 0; r < rings.length; r++) {
-	    var ring = closeRing(rings[r].slice(0));
-	    if (ring.length < 4) {
-	      continue;
-	    }
-	    // is this ring an outer ring? is it clockwise?
-	    if (ringIsClockwise(ring)) {
-	      var polygon = [ ring ];
-	      outerRings.push(polygon); // push to outer rings
-	    } else {
-	      holes.push(ring); // counterclockwise push to holes
-	    }
-	  }
-
-	  var uncontainedHoles = [];
-
-	  // while there are holes left...
-	  while (holes.length) {
-	    // pop a hole off out stack
-	    hole = holes.pop();
-
-	    // loop over all outer rings and see if they contain our hole.
-	    var contained = false;
-	    for (x = outerRings.length - 1; x >= 0; x--) {
-	      outerRing = outerRings[x][0];
-	      if (coordinatesContainCoordinates(outerRing, hole)) {
-	        // the hole is contained push it into our polygon
-	        outerRings[x].push(hole);
-	        contained = true;
-	        break;
-	      }
-	    }
-
-	    // ring is not contained in any outer ring
-	    // sometimes this happens https://github.com/Esri/esri-leaflet/issues/320
-	    if (!contained) {
-	      uncontainedHoles.push(hole);
-	    }
-	  }
-
-	  // if we couldn't match any holes using contains we can try intersects...
-	  while (uncontainedHoles.length) {
-	    // pop a hole off out stack
-	    hole = uncontainedHoles.pop();
-
-	    // loop over all outer rings and see if any intersect our hole.
-	    var intersects = false;
-
-	    for (x = outerRings.length - 1; x >= 0; x--) {
-	      outerRing = outerRings[x][0];
-	      if (arrayIntersectsArray(outerRing, hole)) {
-	        // the hole is contained push it into our polygon
-	        outerRings[x].push(hole);
-	        intersects = true;
-	        break;
-	      }
-	    }
-
-	    if (!intersects) {
-	      outerRings.push([hole.reverse()]);
-	    }
-	  }
-
-	  if (outerRings.length === 1) {
-	    return {
-	      type: 'Polygon',
-	      coordinates: outerRings[0]
-	    };
-	  } else {
-	    return {
-	      type: 'MultiPolygon',
-	      coordinates: outerRings
-	    };
-	  }
-	}
-
-	// This function ensures that rings are oriented in the right directions
-	// outer rings are clockwise, holes are counterclockwise
-	// used for converting GeoJSON Polygons to ArcGIS Polygons
-	function orientRings (poly) {
-	  var output = [];
-	  var polygon = poly.slice(0);
-	  var outerRing = closeRing(polygon.shift().slice(0));
-	  if (outerRing.length >= 4) {
-	    if (!ringIsClockwise(outerRing)) {
-	      outerRing.reverse();
-	    }
-
-	    output.push(outerRing);
-
-	    for (var i = 0; i < polygon.length; i++) {
-	      var hole = closeRing(polygon[i].slice(0));
-	      if (hole.length >= 4) {
-	        if (ringIsClockwise(hole)) {
-	          hole.reverse();
-	        }
-	        output.push(hole);
-	      }
-	    }
-	  }
-
-	  return output;
-	}
-
-	// This function flattens holes in multipolygons to one array of polygons
-	// used for converting GeoJSON Polygons to ArcGIS Polygons
-	function flattenMultiPolygonRings (rings) {
-	  var output = [];
-	  for (var i = 0; i < rings.length; i++) {
-	    var polygon = orientRings(rings[i]);
-	    for (var x = polygon.length - 1; x >= 0; x--) {
-	      var ring = polygon[x].slice(0);
-	      output.push(ring);
-	    }
-	  }
-	  return output;
-	}
-
-	// shallow object clone for feature properties and attributes
-	// from http://jsperf.com/cloning-an-object/2
-	function shallowClone$1 (obj) {
-	  var target = {};
-	  for (var i in obj) {
-	    if (obj.hasOwnProperty(i)) {
-	      target[i] = obj[i];
-	    }
-	  }
-	  return target;
-	}
-
-	function arcgisToGeoJSON$1 (arcgis, idAttribute) {
-	  var geojson = {};
-
-	  if (typeof arcgis.x === 'number' && typeof arcgis.y === 'number') {
-	    geojson.type = 'Point';
-	    geojson.coordinates = [arcgis.x, arcgis.y];
-	  }
-
-	  if (arcgis.points) {
-	    geojson.type = 'MultiPoint';
-	    geojson.coordinates = arcgis.points.slice(0);
-	  }
-
-	  if (arcgis.paths) {
-	    if (arcgis.paths.length === 1) {
-	      geojson.type = 'LineString';
-	      geojson.coordinates = arcgis.paths[0].slice(0);
-	    } else {
-	      geojson.type = 'MultiLineString';
-	      geojson.coordinates = arcgis.paths.slice(0);
-	    }
-	  }
-
-	  if (arcgis.rings) {
-	    geojson = convertRingsToGeoJSON(arcgis.rings.slice(0));
-	  }
-
-	  if (arcgis.geometry || arcgis.attributes) {
-	    geojson.type = 'Feature';
-	    geojson.geometry = (arcgis.geometry) ? arcgisToGeoJSON$1(arcgis.geometry) : null;
-	    geojson.properties = (arcgis.attributes) ? shallowClone$1(arcgis.attributes) : null;
-	    if (arcgis.attributes) {
-	      geojson.id = arcgis.attributes[idAttribute] || arcgis.attributes.OBJECTID || arcgis.attributes.FID;
-	    }
-	  }
-
-	  return geojson;
-	}
-
-	function geojsonToArcGIS$1 (geojson, idAttribute) {
-	  idAttribute = idAttribute || 'OBJECTID';
-	  var spatialReference = { wkid: 4326 };
-	  var result = {};
-	  var i;
-
-	  switch (geojson.type) {
-	    case 'Point':
-	      result.x = geojson.coordinates[0];
-	      result.y = geojson.coordinates[1];
-	      result.spatialReference = spatialReference;
-	      break;
-	    case 'MultiPoint':
-	      result.points = geojson.coordinates.slice(0);
-	      result.spatialReference = spatialReference;
-	      break;
-	    case 'LineString':
-	      result.paths = [geojson.coordinates.slice(0)];
-	      result.spatialReference = spatialReference;
-	      break;
-	    case 'MultiLineString':
-	      result.paths = geojson.coordinates.slice(0);
-	      result.spatialReference = spatialReference;
-	      break;
-	    case 'Polygon':
-	      result.rings = orientRings(geojson.coordinates.slice(0));
-	      result.spatialReference = spatialReference;
-	      break;
-	    case 'MultiPolygon':
-	      result.rings = flattenMultiPolygonRings(geojson.coordinates.slice(0));
-	      result.spatialReference = spatialReference;
-	      break;
-	    case 'Feature':
-	      if (geojson.geometry) {
-	        result.geometry = geojsonToArcGIS$1(geojson.geometry, idAttribute);
-	      }
-	      result.attributes = (geojson.properties) ? shallowClone$1(geojson.properties) : {};
-	      if (geojson.id) {
-	        result.attributes[idAttribute] = geojson.id;
-	      }
-	      break;
-	    case 'FeatureCollection':
-	      result = [];
-	      for (i = 0; i < geojson.features.length; i++) {
-	        result.push(geojsonToArcGIS$1(geojson.features[i], idAttribute));
-	      }
-	      break;
-	    case 'GeometryCollection':
-	      result = [];
-	      for (i = 0; i < geojson.geometries.length; i++) {
-	        result.push(geojsonToArcGIS$1(geojson.geometries[i], idAttribute));
-	      }
-	      break;
-	  }
-
-	  return result;
-	}
-
-	function geojsonToArcGIS (geojson, idAttr) {
-	  return geojsonToArcGIS$1(geojson, idAttr);
-	}
-
-	function arcgisToGeoJSON (arcgis, idAttr) {
-	  return arcgisToGeoJSON$1(arcgis, idAttr);
-	}
-
-	// shallow object clone for feature properties and attributes
-	// from http://jsperf.com/cloning-an-object/2
-	function shallowClone (obj) {
-	  var target = {};
-	  for (var i in obj) {
-	    if (obj.hasOwnProperty(i)) {
-	      target[i] = obj[i];
-	    }
-	  }
-	  return target;
-	}
-
-	// convert an extent (ArcGIS) to LatLngBounds (Leaflet)
-	function extentToBounds (extent) {
-	  // "NaN" coordinates from ArcGIS Server indicate a null geometry
-	  if (extent.xmin !== 'NaN' && extent.ymin !== 'NaN' && extent.xmax !== 'NaN' && extent.ymax !== 'NaN') {
-	    var sw = L$1.latLng(extent.ymin, extent.xmin);
-	    var ne = L$1.latLng(extent.ymax, extent.xmax);
-	    return L$1.latLngBounds(sw, ne);
-	  } else {
-	    return null;
-	  }
-	}
-
-	// convert an LatLngBounds (Leaflet) to extent (ArcGIS)
-	function boundsToExtent (bounds) {
-	  bounds = L$1.latLngBounds(bounds);
-	  return {
-	    'xmin': bounds.getSouthWest().lng,
-	    'ymin': bounds.getSouthWest().lat,
-	    'xmax': bounds.getNorthEast().lng,
-	    'ymax': bounds.getNorthEast().lat,
-	    'spatialReference': {
-	      'wkid': 4326
-	    }
-	  };
-	}
-
-	function responseToFeatureCollection (response, idAttribute) {
-	  var objectIdField;
-	  var features = response.features || response.results;
-	  var count = features.length;
-
-	  if (idAttribute) {
-	    objectIdField = idAttribute;
-	  } else if (response.objectIdFieldName) {
-	    objectIdField = response.objectIdFieldName;
-	  } else if (response.fields) {
-	    for (var j = 0; j <= response.fields.length - 1; j++) {
-	      if (response.fields[j].type === 'esriFieldTypeOID') {
-	        objectIdField = response.fields[j].name;
-	        break;
-	      }
-	    }
-	  } else if (count) {
-	    /* as a last resort, check for common ID fieldnames in the first feature returned
-	    not foolproof. identifyFeatures can returned a mixed array of features. */
-	    for (var key in features[0].attributes) {
-	      if (key.match(/^(OBJECTID|FID|OID|ID)$/i)) {
-	        objectIdField = key;
-	        break;
-	      }
-	    }
-	  }
-
-	  var featureCollection = {
-	    type: 'FeatureCollection',
-	    features: []
-	  };
-
-	  if (count) {
-	    for (var i = features.length - 1; i >= 0; i--) {
-	      var feature = arcgisToGeoJSON(features[i], objectIdField);
-	      featureCollection.features.push(feature);
-	    }
-	  }
-
-	  return featureCollection;
-	}
-
-	  // trim url whitespace and add a trailing slash if needed
-	function cleanUrl (url) {
-	  // trim leading and trailing spaces, but not spaces inside the url
-	  url = L$1.Util.trim(url);
-
-	  // add a trailing slash to the url if the user omitted it
-	  if (url[url.length - 1] !== '/') {
-	    url += '/';
-	  }
-
-	  return url;
-	}
-
-	function isArcgisOnline (url) {
-	  /* hosted feature services support geojson as an output format
-	  utility.arcgis.com services are proxied from a variety of ArcGIS Server vintages, and may not */
-	  return (/^(?!.*utility\.arcgis\.com).*\.arcgis\.com.*FeatureServer/i).test(url);
-	}
-
-	function geojsonTypeToArcGIS (geoJsonType) {
-	  var arcgisGeometryType;
-	  switch (geoJsonType) {
-	    case 'Point':
-	      arcgisGeometryType = 'esriGeometryPoint';
-	      break;
-	    case 'MultiPoint':
-	      arcgisGeometryType = 'esriGeometryMultipoint';
-	      break;
-	    case 'LineString':
-	      arcgisGeometryType = 'esriGeometryPolyline';
-	      break;
-	    case 'MultiLineString':
-	      arcgisGeometryType = 'esriGeometryPolyline';
-	      break;
-	    case 'Polygon':
-	      arcgisGeometryType = 'esriGeometryPolygon';
-	      break;
-	    case 'MultiPolygon':
-	      arcgisGeometryType = 'esriGeometryPolygon';
-	      break;
-	  }
-
-	  return arcgisGeometryType;
-	}
-
-	function warn () {
-	  if (console && console.warn) {
-	    console.warn.apply(console, arguments);
-	  }
-	}
-
-	function calcAttributionWidth (map) {
-	  // either crop at 55px or user defined buffer
-	  return (map.getSize().x - options.attributionWidthOffset) + 'px';
-	}
-
-	function setEsriAttribution (map) {
-	  if (map.attributionControl && !map.attributionControl._esriAttributionAdded) {
-	    map.attributionControl.setPrefix('<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a> | Powered by <a href="https://www.esri.com">Esri</a>');
-
-	    var hoverAttributionStyle = document.createElement('style');
-	    hoverAttributionStyle.type = 'text/css';
-	    hoverAttributionStyle.innerHTML = '.esri-truncated-attribution:hover {' +
-	      'white-space: normal;' +
-	    '}';
-
-	    document.getElementsByTagName('head')[0].appendChild(hoverAttributionStyle);
-	    L$1.DomUtil.addClass(map.attributionControl._container, 'esri-truncated-attribution:hover');
-
-	    // define a new css class in JS to trim attribution into a single line
-	    var attributionStyle = document.createElement('style');
-	    attributionStyle.type = 'text/css';
-	    attributionStyle.innerHTML = '.esri-truncated-attribution {' +
-	      'vertical-align: -3px;' +
-	      'white-space: nowrap;' +
-	      'overflow: hidden;' +
-	      'text-overflow: ellipsis;' +
-	      'display: inline-block;' +
-	      'transition: 0s white-space;' +
-	      'transition-delay: 1s;' +
-	      'max-width: ' + calcAttributionWidth(map) + ';' +
-	    '}';
-
-	    document.getElementsByTagName('head')[0].appendChild(attributionStyle);
-	    L$1.DomUtil.addClass(map.attributionControl._container, 'esri-truncated-attribution');
-
-	    // update the width used to truncate when the map itself is resized
-	    map.on('resize', function (e) {
-	      map.attributionControl._container.style.maxWidth = calcAttributionWidth(e.target);
-	    });
-
-	    map.attributionControl._esriAttributionAdded = true;
-	  }
-	}
-
-	function _getAttributionData (url, map) {
-	  jsonp(url, {}, L$1.Util.bind(function (error, attributions) {
-	    if (error) { return; }
-	    map._esriAttributions = [];
-	    for (var c = 0; c < attributions.contributors.length; c++) {
-	      var contributor = attributions.contributors[c];
-
-	      for (var i = 0; i < contributor.coverageAreas.length; i++) {
-	        var coverageArea = contributor.coverageAreas[i];
-	        var southWest = L$1.latLng(coverageArea.bbox[0], coverageArea.bbox[1]);
-	        var northEast = L$1.latLng(coverageArea.bbox[2], coverageArea.bbox[3]);
-	        map._esriAttributions.push({
-	          attribution: contributor.attribution,
-	          score: coverageArea.score,
-	          bounds: L$1.latLngBounds(southWest, northEast),
-	          minZoom: coverageArea.zoomMin,
-	          maxZoom: coverageArea.zoomMax
-	        });
-	      }
-	    }
-
-	    map._esriAttributions.sort(function (a, b) {
-	      return b.score - a.score;
-	    });
-
-	    // pass the same argument as the map's 'moveend' event
-	    var obj = { target: map };
-	    _updateMapAttribution(obj);
-	  }, this));
-	}
-
-	function _updateMapAttribution (evt) {
-	  var map = evt.target;
-	  var oldAttributions = map._esriAttributions;
-
-	  if (map && map.attributionControl && oldAttributions) {
-	    var newAttributions = '';
-	    var bounds = map.getBounds();
-	    var wrappedBounds = L$1.latLngBounds(
-	      bounds.getSouthWest().wrap(),
-	      bounds.getNorthEast().wrap()
-	    );
-	    var zoom = map.getZoom();
-
-	    for (var i = 0; i < oldAttributions.length; i++) {
-	      var attribution = oldAttributions[i];
-	      var text = attribution.attribution;
-
-	      if (!newAttributions.match(text) && attribution.bounds.intersects(wrappedBounds) && zoom >= attribution.minZoom && zoom <= attribution.maxZoom) {
-	        newAttributions += (', ' + text);
-	      }
-	    }
-
-	    newAttributions = newAttributions.substr(2);
-	    var attributionElement = map.attributionControl._container.querySelector('.esri-dynamic-attribution');
-
-	    attributionElement.innerHTML = newAttributions;
-	    attributionElement.style.maxWidth = calcAttributionWidth(map);
-
-	    map.fire('attributionupdated', {
-	      attribution: newAttributions
-	    });
-	  }
-	}
-
-	var EsriUtil = {
-	  shallowClone: shallowClone,
-	  warn: warn,
-	  cleanUrl: cleanUrl,
-	  isArcgisOnline: isArcgisOnline,
-	  geojsonTypeToArcGIS: geojsonTypeToArcGIS,
-	  responseToFeatureCollection: responseToFeatureCollection,
-	  geojsonToArcGIS: geojsonToArcGIS,
-	  arcgisToGeoJSON: arcgisToGeoJSON,
-	  boundsToExtent: boundsToExtent,
-	  extentToBounds: extentToBounds,
-	  calcAttributionWidth: calcAttributionWidth,
-	  setEsriAttribution: setEsriAttribution,
-	  _getAttributionData: _getAttributionData,
-	  _updateMapAttribution: _updateMapAttribution
-	};
-
-	var Task = L$1.Class.extend({
-
-	  options: {
-	    proxy: false,
-	    useCors: cors
-	  },
-
-	  // Generate a method for each methodName:paramName in the setters for this task.
-	  generateSetter: function (param, context) {
-	    return L$1.Util.bind(function (value) {
-	      this.params[param] = value;
-	      return this;
-	    }, context);
-	  },
-
-	  initialize: function (endpoint) {
-	    // endpoint can be either a url (and options) for an ArcGIS Rest Service or an instance of EsriLeaflet.Service
-	    if (endpoint.request && endpoint.options) {
-	      this._service = endpoint;
-	      L$1.Util.setOptions(this, endpoint.options);
-	    } else {
-	      L$1.Util.setOptions(this, endpoint);
-	      this.options.url = cleanUrl(endpoint.url);
-	    }
-
-	    // clone default params into this object
-	    this.params = L$1.Util.extend({}, this.params || {});
-
-	    // generate setter methods based on the setters object implimented a child class
-	    if (this.setters) {
-	      for (var setter in this.setters) {
-	        var param = this.setters[setter];
-	        this[setter] = this.generateSetter(param, this);
-	      }
-	    }
-	  },
-
-	  token: function (token) {
-	    if (this._service) {
-	      this._service.authenticate(token);
-	    } else {
-	      this.params.token = token;
-	    }
-	    return this;
-	  },
-
-	  request: function (callback, context) {
-	    if (this._service) {
-	      return this._service.request(this.path, this.params, callback, context);
-	    }
-
-	    return this._request('request', this.path, this.params, callback, context);
-	  },
-
-	  _request: function (method, path, params, callback, context) {
-	    var url = (this.options.proxy) ? this.options.proxy + '?' + this.options.url + path : this.options.url + path;
-
-	    if ((method === 'get' || method === 'request') && !this.options.useCors) {
-	      return Request.get.JSONP(url, params, callback, context);
-	    }
-
-	    return Request[method](url, params, callback, context);
-	  }
-	});
-
-	function task (options) {
-	  return new Task(options);
-	}
-
-	var Query = Task.extend({
-	  setters: {
-	    'offset': 'resultOffset',
-	    'limit': 'resultRecordCount',
-	    'fields': 'outFields',
-	    'precision': 'geometryPrecision',
-	    'featureIds': 'objectIds',
-	    'returnGeometry': 'returnGeometry',
-	    'token': 'token'
-	  },
-
-	  path: 'query',
-
-	  params: {
-	    returnGeometry: true,
-	    where: '1=1',
-	    outSr: 4326,
-	    outFields: '*'
-	  },
-
-	  // Returns a feature if its shape is wholly contained within the search geometry. Valid for all shape type combinations.
-	  within: function (geometry) {
-	    this._setGeometry(geometry);
-	    this.params.spatialRel = 'esriSpatialRelContains'; // to the REST api this reads geometry **contains** layer
-	    return this;
-	  },
-
-	  // Returns a feature if any spatial relationship is found. Applies to all shape type combinations.
-	  intersects: function (geometry) {
-	    this._setGeometry(geometry);
-	    this.params.spatialRel = 'esriSpatialRelIntersects';
-	    return this;
-	  },
-
-	  // Returns a feature if its shape wholly contains the search geometry. Valid for all shape type combinations.
-	  contains: function (geometry) {
-	    this._setGeometry(geometry);
-	    this.params.spatialRel = 'esriSpatialRelWithin'; // to the REST api this reads geometry **within** layer
-	    return this;
-	  },
-
-	  // Returns a feature if the intersection of the interiors of the two shapes is not empty and has a lower dimension than the maximum dimension of the two shapes. Two lines that share an endpoint in common do not cross. Valid for Line/Line, Line/Area, Multi-point/Area, and Multi-point/Line shape type combinations.
-	  crosses: function (geometry) {
-	    this._setGeometry(geometry);
-	    this.params.spatialRel = 'esriSpatialRelCrosses';
-	    return this;
-	  },
-
-	  // Returns a feature if the two shapes share a common boundary. However, the intersection of the interiors of the two shapes must be empty. In the Point/Line case, the point may touch an endpoint only of the line. Applies to all combinations except Point/Point.
-	  touches: function (geometry) {
-	    this._setGeometry(geometry);
-	    this.params.spatialRel = 'esriSpatialRelTouches';
-	    return this;
-	  },
-
-	  // Returns a feature if the intersection of the two shapes results in an object of the same dimension, but different from both of the shapes. Applies to Area/Area, Line/Line, and Multi-point/Multi-point shape type combinations.
-	  overlaps: function (geometry) {
-	    this._setGeometry(geometry);
-	    this.params.spatialRel = 'esriSpatialRelOverlaps';
-	    return this;
-	  },
-
-	  // Returns a feature if the envelope of the two shapes intersects.
-	  bboxIntersects: function (geometry) {
-	    this._setGeometry(geometry);
-	    this.params.spatialRel = 'esriSpatialRelEnvelopeIntersects';
-	    return this;
-	  },
-
-	  // if someone can help decipher the ArcObjects explanation and translate to plain speak, we should mention this method in the doc
-	  indexIntersects: function (geometry) {
-	    this._setGeometry(geometry);
-	    this.params.spatialRel = 'esriSpatialRelIndexIntersects'; // Returns a feature if the envelope of the query geometry intersects the index entry for the target geometry
-	    return this;
-	  },
-
-	  // only valid for Feature Services running on ArcGIS Server 10.3+ or ArcGIS Online
-	  nearby: function (latlng, radius) {
-	    latlng = L$1.latLng(latlng);
-	    this.params.geometry = [latlng.lng, latlng.lat];
-	    this.params.geometryType = 'esriGeometryPoint';
-	    this.params.spatialRel = 'esriSpatialRelIntersects';
-	    this.params.units = 'esriSRUnit_Meter';
-	    this.params.distance = radius;
-	    this.params.inSr = 4326;
-	    return this;
-	  },
-
-	  where: function (string) {
-	    // instead of converting double-quotes to single quotes, pass as is, and provide a more informative message if a 400 is encountered
-	    this.params.where = string;
-	    return this;
-	  },
-
-	  between: function (start, end) {
-	    this.params.time = [start.valueOf(), end.valueOf()];
-	    return this;
-	  },
-
-	  simplify: function (map, factor) {
-	    var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());
-	    this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;
-	    return this;
-	  },
-
-	  orderBy: function (fieldName, order) {
-	    order = order || 'ASC';
-	    this.params.orderByFields = (this.params.orderByFields) ? this.params.orderByFields + ',' : '';
-	    this.params.orderByFields += ([fieldName, order]).join(' ');
-	    return this;
-	  },
-
-	  run: function (callback, context) {
-	    this._cleanParams();
-
-	    // services hosted on ArcGIS Online and ArcGIS Server 10.3.1+ support requesting geojson directly
-	    if (this.options.isModern || isArcgisOnline(this.options.url)) {
-	      this.params.f = 'geojson';
-
-	      return this.request(function (error, response) {
-	        this._trapSQLerrors(error);
-	        callback.call(context, error, response, response);
-	      }, this);
-
-	    // otherwise convert it in the callback then pass it on
-	    } else {
-	      return this.request(function (error, response) {
-	        this._trapSQLerrors(error);
-	        callback.call(context, error, (response && responseToFeatureCollection(response)), response);
-	      }, this);
-	    }
-	  },
-
-	  count: function (callback, context) {
-	    this._cleanParams();
-	    this.params.returnCountOnly = true;
-	    return this.request(function (error, response) {
-	      callback.call(this, error, (response && response.count), response);
-	    }, context);
-	  },
-
-	  ids: function (callback, context) {
-	    this._cleanParams();
-	    this.params.returnIdsOnly = true;
-	    return this.request(function (error, response) {
-	      callback.call(this, error, (response && response.objectIds), response);
-	    }, context);
-	  },
-
-	  // only valid for Feature Services running on ArcGIS Server 10.3+ or ArcGIS Online
-	  bounds: function (callback, context) {
-	    this._cleanParams();
-	    this.params.returnExtentOnly = true;
-	    return this.request(function (error, response) {
-	      if (response && response.extent && extentToBounds(response.extent)) {
-	        callback.call(context, error, extentToBounds(response.extent), response);
-	      } else {
-	        error = {
-	          message: 'Invalid Bounds'
-	        };
-	        callback.call(context, error, null, response);
-	      }
-	    }, context);
-	  },
-
-	  // only valid for image services
-	  pixelSize: function (rawPoint) {
-	    var castPoint = L$1.point(rawPoint);
-	    this.params.pixelSize = [castPoint.x, castPoint.y];
-	    return this;
-	  },
-
-	  // only valid for map services
-	  layer: function (layer) {
-	    this.path = layer + '/query';
-	    return this;
-	  },
-
-	  _trapSQLerrors: function (error) {
-	    if (error) {
-	      if (error.code === '400') {
-	        warn('one common syntax error in query requests is encasing string values in double quotes instead of single quotes');
-	      }
-	    }
-	  },
-
-	  _cleanParams: function () {
-	    delete this.params.returnIdsOnly;
-	    delete this.params.returnExtentOnly;
-	    delete this.params.returnCountOnly;
-	  },
-
-	  _setGeometry: function (geometry) {
-	    this.params.inSr = 4326;
-
-	    // convert bounds to extent and finish
-	    if (geometry instanceof L$1.LatLngBounds) {
-	      // set geometry + geometryType
-	      this.params.geometry = boundsToExtent(geometry);
-	      this.params.geometryType = 'esriGeometryEnvelope';
-	      return;
-	    }
-
-	    // convert L.Marker > L.LatLng
-	    if (geometry.getLatLng) {
-	      geometry = geometry.getLatLng();
-	    }
-
-	    // convert L.LatLng to a geojson point and continue;
-	    if (geometry instanceof L$1.LatLng) {
-	      geometry = {
-	        type: 'Point',
-	        coordinates: [geometry.lng, geometry.lat]
-	      };
-	    }
-
-	    // handle L.GeoJSON, pull out the first geometry
-	    if (geometry instanceof L$1.GeoJSON) {
-	      // reassign geometry to the GeoJSON value  (we are assuming that only one feature is present)
-	      geometry = geometry.getLayers()[0].feature.geometry;
-	      this.params.geometry = geojsonToArcGIS(geometry);
-	      this.params.geometryType = geojsonTypeToArcGIS(geometry.type);
-	    }
-
-	    // Handle L.Polyline and L.Polygon
-	    if (geometry.toGeoJSON) {
-	      geometry = geometry.toGeoJSON();
-	    }
-
-	    // handle GeoJSON feature by pulling out the geometry
-	    if (geometry.type === 'Feature') {
-	      // get the geometry of the geojson feature
-	      geometry = geometry.geometry;
-	    }
-
-	    // confirm that our GeoJSON is a point, line or polygon
-	    if (geometry.type === 'Point' || geometry.type === 'LineString' || geometry.type === 'Polygon' || geometry.type === 'MultiPolygon') {
-	      this.params.geometry = geojsonToArcGIS(geometry);
-	      this.params.geometryType = geojsonTypeToArcGIS(geometry.type);
-	      return;
-	    }
-
-	    // warn the user if we havn't found an appropriate object
-	    warn('invalid geometry passed to spatial query. Should be L.LatLng, L.LatLngBounds, L.Marker or a GeoJSON Point, Line, Polygon or MultiPolygon object');
-
-	    return;
-	  }
-	});
-
-	function query (options) {
-	  return new Query(options);
-	}
-
-	var Find = Task.extend({
-	  setters: {
-	    // method name > param name
-	    'contains': 'contains',
-	    'text': 'searchText',
-	    'fields': 'searchFields', // denote an array or single string
-	    'spatialReference': 'sr',
-	    'sr': 'sr',
-	    'layers': 'layers',
-	    'returnGeometry': 'returnGeometry',
-	    'maxAllowableOffset': 'maxAllowableOffset',
-	    'precision': 'geometryPrecision',
-	    'dynamicLayers': 'dynamicLayers',
-	    'returnZ': 'returnZ',
-	    'returnM': 'returnM',
-	    'gdbVersion': 'gdbVersion',
-	    'token': 'token'
-	  },
-
-	  path: 'find',
-
-	  params: {
-	    sr: 4326,
-	    contains: true,
-	    returnGeometry: true,
-	    returnZ: true,
-	    returnM: false
-	  },
-
-	  layerDefs: function (id, where) {
-	    this.params.layerDefs = (this.params.layerDefs) ? this.params.layerDefs + ';' : '';
-	    this.params.layerDefs += ([id, where]).join(':');
-	    return this;
-	  },
-
-	  simplify: function (map, factor) {
-	    var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());
-	    this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;
-	    return this;
-	  },
-
-	  run: function (callback, context) {
-	    return this.request(function (error, response) {
-	      callback.call(context, error, (response && responseToFeatureCollection(response)), response);
-	    }, context);
-	  }
-	});
-
-	function find (options) {
-	  return new Find(options);
-	}
-
-	var Identify = Task.extend({
-	  path: 'identify',
-
-	  between: function (start, end) {
-	    this.params.time = [start.valueOf(), end.valueOf()];
-	    return this;
-	  }
-	});
-
-	function identify (options) {
-	  return new Identify(options);
-	}
-
-	var IdentifyFeatures = Identify.extend({
-	  setters: {
-	    'layers': 'layers',
-	    'precision': 'geometryPrecision',
-	    'tolerance': 'tolerance',
-	    'returnGeometry': 'returnGeometry'
-	  },
-
-	  params: {
-	    sr: 4326,
-	    layers: 'all',
-	    tolerance: 3,
-	    returnGeometry: true
-	  },
-
-	  on: function (map) {
-	    var extent = boundsToExtent(map.getBounds());
-	    var size = map.getSize();
-	    this.params.imageDisplay = [size.x, size.y, 96];
-	    this.params.mapExtent = [extent.xmin, extent.ymin, extent.xmax, extent.ymax];
-	    return this;
-	  },
-
-	  at: function (latlng) {
-	    latlng = L$1.latLng(latlng);
-	    this.params.geometry = [latlng.lng, latlng.lat];
-	    this.params.geometryType = 'esriGeometryPoint';
-	    return this;
-	  },
-
-	  layerDef: function (id, where) {
-	    this.params.layerDefs = (this.params.layerDefs) ? this.params.layerDefs + ';' : '';
-	    this.params.layerDefs += ([id, where]).join(':');
-	    return this;
-	  },
-
-	  simplify: function (map, factor) {
-	    var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());
-	    this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;
-	    return this;
-	  },
-
-	  run: function (callback, context) {
-	    return this.request(function (error, response) {
-	      // immediately invoke with an error
-	      if (error) {
-	        callback.call(context, error, undefined, response);
-	        return;
-
-	      // ok no error lets just assume we have features...
-	      } else {
-	        var featureCollection = responseToFeatureCollection(response);
-	        response.results = response.results.reverse();
-	        for (var i = 0; i < featureCollection.features.length; i++) {
-	          var feature = featureCollection.features[i];
-	          feature.layerId = response.results[i].layerId;
-	        }
-	        callback.call(context, undefined, featureCollection, response);
-	      }
-	    });
-	  }
-	});
-
-	function identifyFeatures (options) {
-	  return new IdentifyFeatures(options);
-	}
-
-	var IdentifyImage = Identify.extend({
-	  setters: {
-	    'setMosaicRule': 'mosaicRule',
-	    'setRenderingRule': 'renderingRule',
-	    'setPixelSize': 'pixelSize',
-	    'returnCatalogItems': 'returnCatalogItems',
-	    'returnGeometry': 'returnGeometry'
-	  },
-
-	  params: {
-	    returnGeometry: false
-	  },
-
-	  at: function (latlng) {
-	    latlng = L$1.latLng(latlng);
-	    this.params.geometry = JSON.stringify({
-	      x: latlng.lng,
-	      y: latlng.lat,
-	      spatialReference: {
-	        wkid: 4326
-	      }
-	    });
-	    this.params.geometryType = 'esriGeometryPoint';
-	    return this;
-	  },
-
-	  getMosaicRule: function () {
-	    return this.params.mosaicRule;
-	  },
-
-	  getRenderingRule: function () {
-	    return this.params.renderingRule;
-	  },
-
-	  getPixelSize: function () {
-	    return this.params.pixelSize;
-	  },
-
-	  run: function (callback, context) {
-	    return this.request(function (error, response) {
-	      callback.call(context, error, (response && this._responseToGeoJSON(response)), response);
-	    }, this);
-	  },
-
-	  // get pixel data and return as geoJSON point
-	  // populate catalog items (if any)
-	  // merging in any catalogItemVisibilities as a propery of each feature
-	  _responseToGeoJSON: function (response) {
-	    var location = response.location;
-	    var catalogItems = response.catalogItems;
-	    var catalogItemVisibilities = response.catalogItemVisibilities;
-	    var geoJSON = {
-	      'pixel': {
-	        'type': 'Feature',
-	        'geometry': {
-	          'type': 'Point',
-	          'coordinates': [location.x, location.y]
-	        },
-	        'crs': {
-	          'type': 'EPSG',
-	          'properties': {
-	            'code': location.spatialReference.wkid
-	          }
-	        },
-	        'properties': {
-	          'OBJECTID': response.objectId,
-	          'name': response.name,
-	          'value': response.value
-	        },
-	        'id': response.objectId
-	      }
-	    };
-
-	    if (response.properties && response.properties.Values) {
-	      geoJSON.pixel.properties.values = response.properties.Values;
-	    }
-
-	    if (catalogItems && catalogItems.features) {
-	      geoJSON.catalogItems = responseToFeatureCollection(catalogItems);
-	      if (catalogItemVisibilities && catalogItemVisibilities.length === geoJSON.catalogItems.features.length) {
-	        for (var i = catalogItemVisibilities.length - 1; i >= 0; i--) {
-	          geoJSON.catalogItems.features[i].properties.catalogItemVisibility = catalogItemVisibilities[i];
-	        }
-	      }
-	    }
-	    return geoJSON;
-	  }
-
-	});
-
-	function identifyImage (params) {
-	  return new IdentifyImage(params);
-	}
-
-	var Service = L$1.Evented.extend({
-
-	  options: {
-	    proxy: false,
-	    useCors: cors,
-	    timeout: 0
-	  },
-
-	  initialize: function (options) {
-	    options = options || {};
-	    this._requestQueue = [];
-	    this._authenticating = false;
-	    L$1.Util.setOptions(this, options);
-	    this.options.url = cleanUrl(this.options.url);
-	  },
-
-	  get: function (path, params, callback, context) {
-	    return this._request('get', path, params, callback, context);
-	  },
-
-	  post: function (path, params, callback, context) {
-	    return this._request('post', path, params, callback, context);
-	  },
-
-	  request: function (path, params, callback, context) {
-	    return this._request('request', path, params, callback, context);
-	  },
-
-	  metadata: function (callback, context) {
-	    return this._request('get', '', {}, callback, context);
-	  },
-
-	  authenticate: function (token) {
-	    this._authenticating = false;
-	    this.options.token = token;
-	    this._runQueue();
-	    return this;
-	  },
-
-	  getTimeout: function () {
-	    return this.options.timeout;
-	  },
-
-	  setTimeout: function (timeout) {
-	    this.options.timeout = timeout;
-	  },
-
-	  _request: function (method, path, params, callback, context) {
-	    this.fire('requeststart', {
-	      url: this.options.url + path,
-	      params: params,
-	      method: method
-	    }, true);
-
-	    var wrappedCallback = this._createServiceCallback(method, path, params, callback, context);
-
-	    if (this.options.token) {
-	      params.token = this.options.token;
-	    }
-
-	    if (this._authenticating) {
-	      this._requestQueue.push([method, path, params, callback, context]);
-	      return;
-	    } else {
-	      var url = (this.options.proxy) ? this.options.proxy + '?' + this.options.url + path : this.options.url + path;
-
-	      if ((method === 'get' || method === 'request') && !this.options.useCors) {
-	        return Request.get.JSONP(url, params, wrappedCallback, context);
-	      } else {
-	        return Request[method](url, params, wrappedCallback, context);
-	      }
-	    }
-	  },
-
-	  _createServiceCallback: function (method, path, params, callback, context) {
-	    return L$1.Util.bind(function (error, response) {
-	      if (error && (error.code === 499 || error.code === 498)) {
-	        this._authenticating = true;
-
-	        this._requestQueue.push([method, path, params, callback, context]);
-
-	        // fire an event for users to handle and re-authenticate
-	        this.fire('authenticationrequired', {
-	          authenticate: L$1.Util.bind(this.authenticate, this)
-	        }, true);
-
-	        // if the user has access to a callback they can handle the auth error
-	        error.authenticate = L$1.Util.bind(this.authenticate, this);
-	      }
-
-	      callback.call(context, error, response);
-
-	      if (error) {
-	        this.fire('requesterror', {
-	          url: this.options.url + path,
-	          params: params,
-	          message: error.message,
-	          code: error.code,
-	          method: method
-	        }, true);
-	      } else {
-	        this.fire('requestsuccess', {
-	          url: this.options.url + path,
-	          params: params,
-	          response: response,
-	          method: method
-	        }, true);
-	      }
-
-	      this.fire('requestend', {
-	        url: this.options.url + path,
-	        params: params,
-	        method: method
-	      }, true);
-	    }, this);
-	  },
-
-	  _runQueue: function () {
-	    for (var i = this._requestQueue.length - 1; i >= 0; i--) {
-	      var request = this._requestQueue[i];
-	      var method = request.shift();
-	      this[method].apply(this, request);
-	    }
-	    this._requestQueue = [];
-	  }
-	});
-
-	function service (options) {
-	  return new Service(options);
-	}
-
-	var MapService = Service.extend({
-
-	  identify: function () {
-	    return identifyFeatures(this);
-	  },
-
-	  find: function () {
-	    return find(this);
-	  },
-
-	  query: function () {
-	    return query(this);
-	  }
-
-	});
-
-	function mapService (options) {
-	  return new MapService(options);
-	}
-
-	var ImageService = Service.extend({
-
-	  query: function () {
-	    return query(this);
-	  },
-
-	  identify: function () {
-	    return identifyImage(this);
-	  }
-	});
-
-	function imageService (options) {
-	  return new ImageService(options);
-	}
-
-	var FeatureLayerService = Service.extend({
-
-	  options: {
-	    idAttribute: 'OBJECTID'
-	  },
-
-	  query: function () {
-	    return query(this);
-	  },
-
-	  addFeature: function (feature, callback, context) {
-	    delete feature.id;
-
-	    feature = geojsonToArcGIS(feature);
-
-	    return this.post('addFeatures', {
-	      features: [feature]
-	    }, function (error, response) {
-	      var result = (response && response.addResults) ? response.addResults[0] : undefined;
-	      if (callback) {
-	        callback.call(context, error || response.addResults[0].error, result);
-	      }
-	    }, context);
-	  },
-
-	  updateFeature: function (feature, callback, context) {
-	    feature = geojsonToArcGIS(feature, this.options.idAttribute);
-
-	    return this.post('updateFeatures', {
-	      features: [feature]
-	    }, function (error, response) {
-	      var result = (response && response.updateResults) ? response.updateResults[0] : undefined;
-	      if (callback) {
-	        callback.call(context, error || response.updateResults[0].error, result);
-	      }
-	    }, context);
-	  },
-
-	  deleteFeature: function (id, callback, context) {
-	    return this.post('deleteFeatures', {
-	      objectIds: id
-	    }, function (error, response) {
-	      var result = (response && response.deleteResults) ? response.deleteResults[0] : undefined;
-	      if (callback) {
-	        callback.call(context, error || response.deleteResults[0].error, result);
-	      }
-	    }, context);
-	  },
-
-	  deleteFeatures: function (ids, callback, context) {
-	    return this.post('deleteFeatures', {
-	      objectIds: ids
-	    }, function (error, response) {
-	      // pass back the entire array
-	      var result = (response && response.deleteResults) ? response.deleteResults : undefined;
-	      if (callback) {
-	        callback.call(context, error || response.deleteResults[0].error, result);
-	      }
-	    }, context);
-	  }
-	});
-
-	function featureLayerService (options) {
-	  return new FeatureLayerService(options);
-	}
-
-	var tileProtocol = (window.location.protocol !== 'https:') ? 'http:' : 'https:';
-
-	var BasemapLayer = L$1.TileLayer.extend({
-	  statics: {
-	    TILES: {
-	      Streets: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 19,
-	          subdomains: ['server', 'services'],
-	          attribution: 'USGS, NOAA',
-	          attributionUrl: 'https://static.arcgis.com/attribution/World_Street_Map'
-	        }
-	      },
-	      Topographic: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 19,
-	          subdomains: ['server', 'services'],
-	          attribution: 'USGS, NOAA',
-	          attributionUrl: 'https://static.arcgis.com/attribution/World_Topo_Map'
-	        }
-	      },
-	      Oceans: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 16,
-	          subdomains: ['server', 'services'],
-	          attribution: 'USGS, NOAA',
-	          attributionUrl: 'https://static.arcgis.com/attribution/Ocean_Basemap'
-	        }
-	      },
-	      OceansLabels: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Reference/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 16,
-	          subdomains: ['server', 'services'],
-	          pane: (pointerEvents) ? 'esri-labels' : 'tilePane'
-	        }
-	      },
-	      NationalGeographic: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 16,
-	          subdomains: ['server', 'services'],
-	          attribution: 'National Geographic, DeLorme, HERE, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, increment P Corp.'
-	        }
-	      },
-	      DarkGray: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 16,
-	          subdomains: ['server', 'services'],
-	          attribution: 'HERE, DeLorme, MapmyIndia, &copy; OpenStreetMap contributors'
-	        }
-	      },
-	      DarkGrayLabels: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Reference/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 16,
-	          subdomains: ['server', 'services'],
-	          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
-	          attribution: ''
-
-	        }
-	      },
-	      Gray: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 16,
-	          subdomains: ['server', 'services'],
-	          attribution: 'HERE, DeLorme, MapmyIndia, &copy; OpenStreetMap contributors'
-	        }
-	      },
-	      GrayLabels: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 16,
-	          subdomains: ['server', 'services'],
-	          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
-	          attribution: ''
-	        }
-	      },
-	      Imagery: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 19,
-	          subdomains: ['server', 'services'],
-	          attribution: 'DigitalGlobe, GeoEye, i-cubed, USDA, USGS, AEX, Getmapping, Aerogrid, IGN, IGP, swisstopo, and the GIS User Community'
-	        }
-	      },
-	      ImageryLabels: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 19,
-	          subdomains: ['server', 'services'],
-	          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
-	          attribution: ''
-	        }
-	      },
-	      ImageryTransportation: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Transportation/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 19,
-	          subdomains: ['server', 'services'],
-	          pane: (pointerEvents) ? 'esri-labels' : 'tilePane'
-	        }
-	      },
-	      ShadedRelief: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 13,
-	          subdomains: ['server', 'services'],
-	          attribution: 'USGS'
-	        }
-	      },
-	      ShadedReliefLabels: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places_Alternate/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 12,
-	          subdomains: ['server', 'services'],
-	          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
-	          attribution: ''
-	        }
-	      },
-	      Terrain: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 13,
-	          subdomains: ['server', 'services'],
-	          attribution: 'USGS, NOAA'
-	        }
-	      },
-	      TerrainLabels: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Reference_Overlay/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 13,
-	          subdomains: ['server', 'services'],
-	          pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
-	          attribution: ''
-	        }
-	      },
-	      USATopo: {
-	        urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer/tile/{z}/{y}/{x}',
-	        options: {
-	          minZoom: 1,
-	          maxZoom: 15,
-	          subdomains: ['server', 'services'],
-	          attribution: 'USGS, National Geographic Society, i-cubed'
-	        }
-	      }
-	    }
-	  },
-
-	  initialize: function (key, options) {
-	    var config;
-
-	    // set the config variable with the appropriate config object
-	    if (typeof key === 'object' && key.urlTemplate && key.options) {
-	      config = key;
-	    } else if (typeof key === 'string' && BasemapLayer.TILES[key]) {
-	      config = BasemapLayer.TILES[key];
-	    } else {
-	      throw new Error('L.esri.BasemapLayer: Invalid parameter. Use one of "Streets", "Topographic", "Oceans", "OceansLabels", "NationalGeographic", "Gray", "GrayLabels", "DarkGray", "DarkGrayLabels", "Imagery", "ImageryLabels", "ImageryTransportation", "ShadedRelief", "ShadedReliefLabels", "Terrain", "TerrainLabels" or "USATopo"');
-	    }
-
-	    // merge passed options into the config options
-	    var tileOptions = L$1.Util.extend(config.options, options);
-
-	    L$1.Util.setOptions(this, tileOptions);
-
-	    if (this.options.token) {
-	      config.urlTemplate += ('?token=' + this.options.token);
-	    }
-
-	    // call the initialize method on L.TileLayer to set everything up
-	    L$1.TileLayer.prototype.initialize.call(this, config.urlTemplate, tileOptions);
-	  },
-
-	  onAdd: function (map) {
-	    // include 'Powered by Esri' in map attribution
-	    setEsriAttribution(map);
-
-	    if (this.options.pane === 'esri-labels') {
-	      this._initPane();
-	    }
-	    // some basemaps can supply dynamic attribution
-	    if (this.options.attributionUrl) {
-	      _getAttributionData(this.options.attributionUrl, map);
-	    }
-
-	    map.on('moveend', _updateMapAttribution);
-
-	    L$1.TileLayer.prototype.onAdd.call(this, map);
-	  },
-
-	  onRemove: function (map) {
-	    map.off('moveend', _updateMapAttribution);
-	    L$1.TileLayer.prototype.onRemove.call(this, map);
-	  },
-
-	  _initPane: function () {
-	    if (!this._map.getPane(this.options.pane)) {
-	      var pane = this._map.createPane(this.options.pane);
-	      pane.style.pointerEvents = 'none';
-	      pane.style.zIndex = 500;
-	    }
-	  },
-
-	  getAttribution: function () {
-	    if (this.options.attribution) {
-	      var attribution = '<span class="esri-dynamic-attribution">' + this.options.attribution + '</span>';
-	    }
-	    return attribution;
-	  }
-	});
-
-	function basemapLayer (key, options) {
-	  return new BasemapLayer(key, options);
-	}
-
-	var TiledMapLayer = L$1.TileLayer.extend({
-	  options: {
-	    zoomOffsetAllowance: 0.1,
-	    errorTileUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEABAMAAACuXLVVAAAAA1BMVEUzNDVszlHHAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAAAAAAAAAB6mUWpAAAADZJREFUeJztwQEBAAAAgiD/r25IQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7waBAAABw08RwAAAAABJRU5ErkJggg=='
-	  },
-
-	  statics: {
-	    MercatorZoomLevels: {
-	      '0': 156543.03392799999,
-	      '1': 78271.516963999893,
-	      '2': 39135.758482000099,
-	      '3': 19567.879240999901,
-	      '4': 9783.9396204999593,
-	      '5': 4891.9698102499797,
-	      '6': 2445.9849051249898,
-	      '7': 1222.9924525624899,
-	      '8': 611.49622628138002,
-	      '9': 305.74811314055802,
-	      '10': 152.874056570411,
-	      '11': 76.437028285073197,
-	      '12': 38.218514142536598,
-	      '13': 19.109257071268299,
-	      '14': 9.5546285356341496,
-	      '15': 4.7773142679493699,
-	      '16': 2.38865713397468,
-	      '17': 1.1943285668550501,
-	      '18': 0.59716428355981699,
-	      '19': 0.29858214164761698,
-	      '20': 0.14929107082381,
-	      '21': 0.07464553541191,
-	      '22': 0.0373227677059525,
-	      '23': 0.0186613838529763
-	    }
-	  },
-
-	  initialize: function (options) {
-	    options.url = cleanUrl(options.url);
-	    options = L$1.Util.setOptions(this, options);
-
-	    // set the urls
-	    this.tileUrl = options.url + 'tile/{z}/{y}/{x}';
-	    this.service = mapService(options);
-	    this.service.addEventParent(this);
-
-	    var arcgisonline = new RegExp(/tiles.arcgis(online)?\.com/g);
-	    if (arcgisonline.test(options.url)) {
-	      this.tileUrl = this.tileUrl.replace('://tiles', '://tiles{s}');
-	      options.subdomains = ['1', '2', '3', '4'];
-	    }
-
-	    if (this.options.token) {
-	      this.tileUrl += ('?token=' + this.options.token);
-	    }
-
-	    // init layer by calling TileLayers initialize method
-	    L$1.TileLayer.prototype.initialize.call(this, this.tileUrl, options);
-	  },
-
-	  getTileUrl: function (tilePoint) {
-	    var zoom = this._getZoomForUrl();
-
-	    return L$1.Util.template(this.tileUrl, L$1.Util.extend({
-	      s: this._getSubdomain(tilePoint),
-	      x: tilePoint.x,
-	      y: tilePoint.y,
-	      // try lod map first, then just default to zoom level
-	      z: (this._lodMap && this._lodMap[zoom]) ? this._lodMap[zoom] : zoom
-	    }, this.options));
-	  },
-
-	  createTile: function (coords, done) {
-	    var tile = document.createElement('img');
-
-	    L.DomEvent.on(tile, 'load', L.bind(this._tileOnLoad, this, done, tile));
-	    L.DomEvent.on(tile, 'error', L.bind(this._tileOnError, this, done, tile));
-
-	    if (this.options.crossOrigin) {
-	      tile.crossOrigin = '';
-	    }
-
-	    /*
-	     Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons
-	     http://www.w3.org/TR/WCAG20-TECHS/H67
-	    */
-	    tile.alt = '';
-
-	    // if there is no lod map or an lod map with a proper zoom load the tile
-	    // otherwise wait for the lod map to become available
-	    if (!this._lodMap || (this._lodMap && this._lodMap[this._getZoomForUrl()])) {
-	      tile.src = this.getTileUrl(coords);
-	    } else {
-	      this.once('lodmap', function () {
-	        tile.src = this.getTileUrl(coords);
-	      }, this);
-	    }
-
-	    return tile;
-	  },
-
-	  onAdd: function (map) {
-	    // include 'Powered by Esri' in map attribution
-	    setEsriAttribution(map);
-
-	    if (!this._lodMap) {
-	      this.metadata(function (error, metadata) {
-	        if (!error && metadata.spatialReference) {
-	          var sr = metadata.spatialReference.latestWkid || metadata.spatialReference.wkid;
-	          if (!this.options.attribution && map.attributionControl && metadata.copyrightText) {
-	            this.options.attribution = metadata.copyrightText;
-	            map.attributionControl.addAttribution(this.getAttribution());
-	          }
-	          if (map.options.crs === L.CRS.EPSG3857 && sr === 102100 || sr === 3857) {
-	            this._lodMap = {};
-	            // create the zoom level data
-	            var arcgisLODs = metadata.tileInfo.lods;
-	            var correctResolutions = TiledMapLayer.MercatorZoomLevels;
-
-	            for (var i = 0; i < arcgisLODs.length; i++) {
-	              var arcgisLOD = arcgisLODs[i];
-	              for (var ci in correctResolutions) {
-	                var correctRes = correctResolutions[ci];
-
-	                if (this._withinPercentage(arcgisLOD.resolution, correctRes, this.options.zoomOffsetAllowance)) {
-	                  this._lodMap[ci] = arcgisLOD.level;
-	                  break;
-	                }
-	              }
-	            }
-
-	            this.fire('lodmap');
-	          } else {
-	            if (!proj4) {
-	              warn('L.esri.TiledMapLayer is using a non-mercator spatial reference. Support may be available through Proj4Leaflet http://esri.github.io/esri-leaflet/examples/non-mercator-projection.html');
-	            }
-	          }
-	        }
-	      }, this);
-	    }
-
-	    L$1.TileLayer.prototype.onAdd.call(this, map);
-	  },
-
-	  metadata: function (callback, context) {
-	    this.service.metadata(callback, context);
-	    return this;
-	  },
-
-	  identify: function () {
-	    return this.service.identify();
-	  },
-
-	  find: function () {
-	    return this.service.find();
-	  },
-
-	  query: function () {
-	    return this.service.query();
-	  },
-
-	  authenticate: function (token) {
-	    var tokenQs = '?token=' + token;
-	    this.tileUrl = (this.options.token) ? this.tileUrl.replace(/\?token=(.+)/g, tokenQs) : this.tileUrl + tokenQs;
-	    this.options.token = token;
-	    this.service.authenticate(token);
-	    return this;
-	  },
-
-	  _withinPercentage: function (a, b, percentage) {
-	    var diff = Math.abs((a / b) - 1);
-	    return diff < percentage;
-	  }
-	});
-
-	function tiledMapLayer (url, options) {
-	  return new TiledMapLayer(url, options);
-	}
-
-	var Overlay = L$1.ImageOverlay.extend({
-	  onAdd: function (map) {
-	    this._topLeft = map.getPixelBounds().min;
-	    L$1.ImageOverlay.prototype.onAdd.call(this, map);
-	  },
-	  _reset: function () {
-	    if (this._map.options.crs === L$1.CRS.EPSG3857) {
-	      L$1.ImageOverlay.prototype._reset.call(this);
-	    } else {
-	      L$1.DomUtil.setPosition(this._image, this._topLeft.subtract(this._map.getPixelOrigin()));
-	    }
-	  }
-	});
-
-	var RasterLayer = L$1.Layer.extend({
-
-	  options: {
-	    opacity: 1,
-	    position: 'front',
-	    f: 'image',
-	    useCors: cors,
-	    attribution: null,
-	    interactive: false,
-	    alt: ''
-	  },
-
-	  onAdd: function (map) {
-	    // include 'Powered by Esri' in map attribution
-	    setEsriAttribution(map);
-
-	    this._update = L$1.Util.throttle(this._update, this.options.updateInterval, this);
-
-	    map.on('moveend', this._update, this);
-
-	    // if we had an image loaded and it matches the
-	    // current bounds show the image otherwise remove it
-	    if (this._currentImage && this._currentImage._bounds.equals(this._map.getBounds())) {
-	      map.addLayer(this._currentImage);
-	    } else if (this._currentImage) {
-	      this._map.removeLayer(this._currentImage);
-	      this._currentImage = null;
-	    }
-
-	    this._update();
-
-	    if (this._popup) {
-	      this._map.on('click', this._getPopupData, this);
-	      this._map.on('dblclick', this._resetPopupState, this);
-	    }
-
-	    // add copyright text listed in service metadata
-	    this.metadata(function (err, metadata) {
-	      if (!err && !this.options.attribution && map.attributionControl && metadata.copyrightText) {
-	        this.options.attribution = metadata.copyrightText;
-	        map.attributionControl.addAttribution(this.getAttribution());
-	      }
-	    }, this);
-	  },
-
-	  onRemove: function (map) {
-	    if (this._currentImage) {
-	      this._map.removeLayer(this._currentImage);
-	    }
-
-	    if (this._popup) {
-	      this._map.off('click', this._getPopupData, this);
-	      this._map.off('dblclick', this._resetPopupState, this);
-	    }
-
-	    this._map.off('moveend', this._update, this);
-	  },
-
-	  bindPopup: function (fn, popupOptions) {
-	    this._shouldRenderPopup = false;
-	    this._lastClick = false;
-	    this._popup = L$1.popup(popupOptions);
-	    this._popupFunction = fn;
-	    if (this._map) {
-	      this._map.on('click', this._getPopupData, this);
-	      this._map.on('dblclick', this._resetPopupState, this);
-	    }
-	    return this;
-	  },
-
-	  unbindPopup: function () {
-	    if (this._map) {
-	      this._map.closePopup(this._popup);
-	      this._map.off('click', this._getPopupData, this);
-	      this._map.off('dblclick', this._resetPopupState, this);
-	    }
-	    this._popup = false;
-	    return this;
-	  },
-
-	  bringToFront: function () {
-	    this.options.position = 'front';
-	    if (this._currentImage) {
-	      this._currentImage.bringToFront();
-	    }
-	    return this;
-	  },
-
-	  bringToBack: function () {
-	    this.options.position = 'back';
-	    if (this._currentImage) {
-	      this._currentImage.bringToBack();
-	    }
-	    return this;
-	  },
-
-	  getAttribution: function () {
-	    return this.options.attribution;
-	  },
-
-	  getOpacity: function () {
-	    return this.options.opacity;
-	  },
-
-	  setOpacity: function (opacity) {
-	    this.options.opacity = opacity;
-	    if (this._currentImage) {
-	      this._currentImage.setOpacity(opacity);
-	    }
-	    return this;
-	  },
-
-	  getTimeRange: function () {
-	    return [this.options.from, this.options.to];
-	  },
-
-	  setTimeRange: function (from, to) {
-	    this.options.from = from;
-	    this.options.to = to;
-	    this._update();
-	    return this;
-	  },
-
-	  metadata: function (callback, context) {
-	    this.service.metadata(callback, context);
-	    return this;
-	  },
-
-	  authenticate: function (token) {
-	    this.service.authenticate(token);
-	    return this;
-	  },
-
-	  redraw: function () {
-	    this._update();
-	  },
-
-	  _renderImage: function (url, bounds, contentType) {
-	    if (this._map) {
-	      // if no output directory has been specified for a service, MIME data will be returned
-	      if (contentType) {
-	        url = 'data:' + contentType + ';base64,' + url;
-	      }
-	      // create a new image overlay and add it to the map
-	      // to start loading the image
-	      // opacity is 0 while the image is loading
-	      var image = new Overlay(url, bounds, {
-	        opacity: 0,
-	        crossOrigin: this.options.useCors,
-	        alt: this.options.alt,
-	        pane: this.options.pane || this.getPane(),
-	        interactive: this.options.interactive
-	      }).addTo(this._map);
-
-	      // once the image loads
-	      image.once('load', function (e) {
-	        if (this._map) {
-	          var newImage = e.target;
-	          var oldImage = this._currentImage;
-
-	          // if the bounds of this image matches the bounds that
-	          // _renderImage was called with and we have a map with the same bounds
-	          // hide the old image if there is one and set the opacity
-	          // of the new image otherwise remove the new image
-	          if (newImage._bounds.equals(bounds) && newImage._bounds.equals(this._map.getBounds())) {
-	            this._currentImage = newImage;
-
-	            if (this.options.position === 'front') {
-	              this.bringToFront();
-	            } else {
-	              this.bringToBack();
-	            }
-
-	            if (this._map && this._currentImage._map) {
-	              this._currentImage.setOpacity(this.options.opacity);
-	            } else {
-	              this._currentImage._map.removeLayer(this._currentImage);
-	            }
-
-	            if (oldImage && this._map) {
-	              this._map.removeLayer(oldImage);
-	            }
-
-	            if (oldImage && oldImage._map) {
-	              oldImage._map.removeLayer(oldImage);
-	            }
-	          } else {
-	            this._map.removeLayer(newImage);
-	          }
-	        }
-
-	        this.fire('load', {
-	          bounds: bounds
-	        });
-	      }, this);
-
-	      this.fire('loading', {
-	        bounds: bounds
-	      });
-	    }
-	  },
-
-	  _update: function () {
-	    if (!this._map) {
-	      return;
-	    }
-
-	    var zoom = this._map.getZoom();
-	    var bounds = this._map.getBounds();
-
-	    if (this._animatingZoom) {
-	      return;
-	    }
-
-	    if (this._map._panTransition && this._map._panTransition._inProgress) {
-	      return;
-	    }
-
-	    if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {
-	      if (this._currentImage) {
-	        this._currentImage._map.removeLayer(this._currentImage);
-	        this._currentImage = null;
-	      }
-	      return;
-	    }
-
-	    var params = this._buildExportParams();
-
-	    this._requestExport(params, bounds);
-	  },
-
-	  _renderPopup: function (latlng, error, results, response) {
-	    latlng = L$1.latLng(latlng);
-	    if (this._shouldRenderPopup && this._lastClick.equals(latlng)) {
-	      // add the popup to the map where the mouse was clicked at
-	      var content = this._popupFunction(error, results, response);
-	      if (content) {
-	        this._popup.setLatLng(latlng).setContent(content).openOn(this._map);
-	      }
-	    }
-	  },
-
-	  _resetPopupState: function (e) {
-	    this._shouldRenderPopup = false;
-	    this._lastClick = e.latlng;
-	  }
-	});
-
-	var ImageMapLayer = RasterLayer.extend({
-
-	  options: {
-	    updateInterval: 150,
-	    format: 'jpgpng',
-	    transparent: true,
-	    f: 'json'
-	  },
-
-	  query: function () {
-	    return this.service.query();
-	  },
-
-	  identify: function () {
-	    return this.service.identify();
-	  },
-
-	  initialize: function (options) {
-	    options.url = cleanUrl(options.url);
-	    this.service = imageService(options);
-	    this.service.addEventParent(this);
-
-	    L$1.Util.setOptions(this, options);
-	  },
-
-	  setPixelType: function (pixelType) {
-	    this.options.pixelType = pixelType;
-	    this._update();
-	    return this;
-	  },
-
-	  getPixelType: function () {
-	    return this.options.pixelType;
-	  },
-
-	  setBandIds: function (bandIds) {
-	    if (L$1.Util.isArray(bandIds)) {
-	      this.options.bandIds = bandIds.join(',');
-	    } else {
-	      this.options.bandIds = bandIds.toString();
-	    }
-	    this._update();
-	    return this;
-	  },
-
-	  getBandIds: function () {
-	    return this.options.bandIds;
-	  },
-
-	  setNoData: function (noData, noDataInterpretation) {
-	    if (L$1.Util.isArray(noData)) {
-	      this.options.noData = noData.join(',');
-	    } else {
-	      this.options.noData = noData.toString();
-	    }
-	    if (noDataInterpretation) {
-	      this.options.noDataInterpretation = noDataInterpretation;
-	    }
-	    this._update();
-	    return this;
-	  },
-
-	  getNoData: function () {
-	    return this.options.noData;
-	  },
-
-	  getNoDataInterpretation: function () {
-	    return this.options.noDataInterpretation;
-	  },
-
-	  setRenderingRule: function (renderingRule) {
-	    this.options.renderingRule = renderingRule;
-	    this._update();
-	  },
-
-	  getRenderingRule: function () {
-	    return this.options.renderingRule;
-	  },
-
-	  setMosaicRule: function (mosaicRule) {
-	    this.options.mosaicRule = mosaicRule;
-	    this._update();
-	  },
-
-	  getMosaicRule: function () {
-	    return this.options.mosaicRule;
-	  },
-
-	  _getPopupData: function (e) {
-	    var callback = L$1.Util.bind(function (error, results, response) {
-	      if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire
-	      setTimeout(L$1.Util.bind(function () {
-	        this._renderPopup(e.latlng, error, results, response);
-	      }, this), 300);
-	    }, this);
-
-	    var identifyRequest = this.identify().at(e.latlng);
-
-	    // set mosaic rule for identify task if it is set for layer
-	    if (this.options.mosaicRule) {
-	      identifyRequest.setMosaicRule(this.options.mosaicRule);
-	      // @TODO: force return catalog items too?
-	    }
-
-	    // @TODO: set rendering rule? Not sure,
-	    // sometimes you want raw pixel values
-	    // if (this.options.renderingRule) {
-	    //   identifyRequest.setRenderingRule(this.options.renderingRule);
-	    // }
-
-	    identifyRequest.run(callback);
-
-	    // set the flags to show the popup
-	    this._shouldRenderPopup = true;
-	    this._lastClick = e.latlng;
-	  },
-
-	  _buildExportParams: function () {
-	    var bounds = this._map.getBounds();
-	    var size = this._map.getSize();
-	    var ne = this._map.options.crs.project(bounds._northEast);
-	    var sw = this._map.options.crs.project(bounds._southWest);
-
-	    // ensure that we don't ask ArcGIS Server for a taller image than we have actual map displaying
-	    var top = this._map.latLngToLayerPoint(bounds._northEast);
-	    var bottom = this._map.latLngToLayerPoint(bounds._southWest);
-
-	    if (top.y > 0 || bottom.y < size.y) {
-	      size.y = bottom.y - top.y;
-	    }
-
-	    var sr = parseInt(this._map.options.crs.code.split(':')[1], 10);
-
-	    var params = {
-	      bbox: [sw.x, sw.y, ne.x, ne.y].join(','),
-	      size: size.x + ',' + size.y,
-	      format: this.options.format,
-	      transparent: this.options.transparent,
-	      bboxSR: sr,
-	      imageSR: sr
-	    };
-
-	    if (this.options.from && this.options.to) {
-	      params.time = this.options.from.valueOf() + ',' + this.options.to.valueOf();
-	    }
-
-	    if (this.options.pixelType) {
-	      params.pixelType = this.options.pixelType;
-	    }
-
-	    if (this.options.interpolation) {
-	      params.interpolation = this.options.interpolation;
-	    }
-
-	    if (this.options.compressionQuality) {
-	      params.compressionQuality = this.options.compressionQuality;
-	    }
-
-	    if (this.options.bandIds) {
-	      params.bandIds = this.options.bandIds;
-	    }
-
-	    if (this.options.noData) {
-	      params.noData = this.options.noData;
-	    }
-
-	    if (this.options.noDataInterpretation) {
-	      params.noDataInterpretation = this.options.noDataInterpretation;
-	    }
-
-	    if (this.service.options.token) {
-	      params.token = this.service.options.token;
-	    }
-
-	    if (this.options.renderingRule) {
-	      params.renderingRule = JSON.stringify(this.options.renderingRule);
-	    }
-
-	    if (this.options.mosaicRule) {
-	      params.mosaicRule = JSON.stringify(this.options.mosaicRule);
-	    }
-
-	    return params;
-	  },
-
-	  _requestExport: function (params, bounds) {
-	    if (this.options.f === 'json') {
-	      this.service.request('exportImage', params, function (error, response) {
-	        if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire
-	        if (this.options.token) {
-	          response.href += ('?token=' + this.options.token);
-	        }
-	        this._renderImage(response.href, bounds);
-	      }, this);
-	    } else {
-	      params.f = 'image';
-	      this._renderImage(this.options.url + 'exportImage' + L$1.Util.getParamString(params), bounds);
-	    }
-	  }
-	});
-
-	function imageMapLayer (url, options) {
-	  return new ImageMapLayer(url, options);
-	}
-
-	var DynamicMapLayer = RasterLayer.extend({
-
-	  options: {
-	    updateInterval: 150,
-	    layers: false,
-	    layerDefs: false,
-	    timeOptions: false,
-	    format: 'png24',
-	    transparent: true,
-	    f: 'json'
-	  },
-
-	  initialize: function (options) {
-	    options.url = cleanUrl(options.url);
-	    this.service = mapService(options);
-	    this.service.addEventParent(this);
-
-	    if ((options.proxy || options.token) && options.f !== 'json') {
-	      options.f = 'json';
-	    }
-
-	    L$1.Util.setOptions(this, options);
-	  },
-
-	  getDynamicLayers: function () {
-	    return this.options.dynamicLayers;
-	  },
-
-	  setDynamicLayers: function (dynamicLayers) {
-	    this.options.dynamicLayers = dynamicLayers;
-	    this._update();
-	    return this;
-	  },
-
-	  getLayers: function () {
-	    return this.options.layers;
-	  },
-
-	  setLayers: function (layers) {
-	    this.options.layers = layers;
-	    this._update();
-	    return this;
-	  },
-
-	  getLayerDefs: function () {
-	    return this.options.layerDefs;
-	  },
-
-	  setLayerDefs: function (layerDefs) {
-	    this.options.layerDefs = layerDefs;
-	    this._update();
-	    return this;
-	  },
-
-	  getTimeOptions: function () {
-	    return this.options.timeOptions;
-	  },
-
-	  setTimeOptions: function (timeOptions) {
-	    this.options.timeOptions = timeOptions;
-	    this._update();
-	    return this;
-	  },
-
-	  query: function () {
-	    return this.service.query();
-	  },
-
-	  identify: function () {
-	    return this.service.identify();
-	  },
-
-	  find: function () {
-	    return this.service.find();
-	  },
-
-	  _getPopupData: function (e) {
-	    var callback = L$1.Util.bind(function (error, featureCollection, response) {
-	      if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire
-	      setTimeout(L$1.Util.bind(function () {
-	        this._renderPopup(e.latlng, error, featureCollection, response);
-	      }, this), 300);
-	    }, this);
-
-	    var identifyRequest = this.identify().on(this._map).at(e.latlng);
-
-	    // remove extraneous vertices from response features
-	    identifyRequest.simplify(this._map, 0.5);
-
-	    if (this.options.layers) {
-	      identifyRequest.layers('visible:' + this.options.layers.join(','));
-	    } else {
-	      identifyRequest.layers('visible');
-	    }
-
-	    identifyRequest.run(callback);
-
-	    // set the flags to show the popup
-	    this._shouldRenderPopup = true;
-	    this._lastClick = e.latlng;
-	  },
-
-	  _buildExportParams: function () {
-	    var bounds = this._map.getBounds();
-	    var size = this._map.getSize();
-	    var ne = this._map.options.crs.project(bounds.getNorthEast());
-	    var sw = this._map.options.crs.project(bounds.getSouthWest());
-	    var sr = parseInt(this._map.options.crs.code.split(':')[1], 10);
-
-	    // ensure that we don't ask ArcGIS Server for a taller image than we have actual map displaying
-	    var top = this._map.latLngToLayerPoint(bounds._northEast);
-	    var bottom = this._map.latLngToLayerPoint(bounds._southWest);
-
-	    if (top.y > 0 || bottom.y < size.y) {
-	      size.y = bottom.y - top.y;
-	    }
-
-	    var params = {
-	      bbox: [sw.x, sw.y, ne.x, ne.y].join(','),
-	      size: size.x + ',' + size.y,
-	      dpi: 96,
-	      format: this.options.format,
-	      transparent: this.options.transparent,
-	      bboxSR: sr,
-	      imageSR: sr
-	    };
-
-	    if (this.options.dynamicLayers) {
-	      params.dynamicLayers = this.options.dynamicLayers;
-	    }
-
-	    if (this.options.layers) {
-	      params.layers = 'show:' + this.options.layers.join(',');
-	    }
-
-	    if (this.options.layerDefs) {
-	      params.layerDefs = typeof this.options.layerDefs === 'string' ? this.options.layerDefs : JSON.stringify(this.options.layerDefs);
-	    }
-
-	    if (this.options.timeOptions) {
-	      params.timeOptions = JSON.stringify(this.options.timeOptions);
-	    }
-
-	    if (this.options.from && this.options.to) {
-	      params.time = this.options.from.valueOf() + ',' + this.options.to.valueOf();
-	    }
-
-	    if (this.service.options.token) {
-	      params.token = this.service.options.token;
-	    }
-
-	    if (this.options.proxy) {
-	      params.proxy = this.options.proxy;
-	    }
-
-	    return params;
-	  },
-
-	  _requestExport: function (params, bounds) {
-	    if (this.options.f === 'json') {
-	      this.service.request('export', params, function (error, response) {
-	        if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire
-
-	        if (this.options.token) {
-	          response.href += ('?token=' + this.options.token);
-	        }
-	        if (this.options.proxy) {
-	          response.href = this.options.proxy + '?' + response.href;
-	        }
-	        if (response.href) {
-	          this._renderImage(response.href, bounds);
-	        } else {
-	          this._renderImage(response.imageData, bounds, response.contentType);
-	        }
-	      }, this);
-	    } else {
-	      params.f = 'image';
-	      this._renderImage(this.options.url + 'export' + L$1.Util.getParamString(params), bounds);
-	    }
-	  }
-	});
-
-	function dynamicMapLayer (url, options) {
-	  return new DynamicMapLayer(url, options);
-	}
-
-	var VirtualGrid = L$1__default.Layer.extend({
-
-	  options: {
-	    cellSize: 512,
-	    updateInterval: 150
-	  },
-
-	  initialize: function (options) {
-	    options = L$1__default.setOptions(this, options);
-	    this._zooming = false;
-	  },
-
-	  onAdd: function (map) {
-	    this._map = map;
-	    this._update = L$1__default.Util.throttle(this._update, this.options.updateInterval, this);
-	    this._reset();
-	    this._update();
-	  },
-
-	  onRemove: function () {
-	    this._map.removeEventListener(this.getEvents(), this);
-	    this._removeCells();
-	  },
-
-	  getEvents: function () {
-	    var events = {
-	      moveend: this._update,
-	      zoomstart: this._zoomstart,
-	      zoomend: this._reset
-	    };
-
-	    return events;
-	  },
-
-	  addTo: function (map) {
-	    map.addLayer(this);
-	    return this;
-	  },
-
-	  removeFrom: function (map) {
-	    map.removeLayer(this);
-	    return this;
-	  },
-
-	  _zoomstart: function () {
-	    this._zooming = true;
-	  },
-
-	  _reset: function () {
-	    this._removeCells();
-
-	    this._cells = {};
-	    this._activeCells = {};
-	    this._cellsToLoad = 0;
-	    this._cellsTotal = 0;
-	    this._cellNumBounds = this._getCellNumBounds();
-
-	    this._resetWrap();
-	    this._zooming = false;
-	  },
-
-	  _resetWrap: function () {
-	    var map = this._map;
-	    var crs = map.options.crs;
-
-	    if (crs.infinite) { return; }
-
-	    var cellSize = this._getCellSize();
-
-	    if (crs.wrapLng) {
-	      this._wrapLng = [
-	        Math.floor(map.project([0, crs.wrapLng[0]]).x / cellSize),
-	        Math.ceil(map.project([0, crs.wrapLng[1]]).x / cellSize)
-	      ];
-	    }
-
-	    if (crs.wrapLat) {
-	      this._wrapLat = [
-	        Math.floor(map.project([crs.wrapLat[0], 0]).y / cellSize),
-	        Math.ceil(map.project([crs.wrapLat[1], 0]).y / cellSize)
-	      ];
-	    }
-	  },
-
-	  _getCellSize: function () {
-	    return this.options.cellSize;
-	  },
-
-	  _update: function () {
-	    if (!this._map) {
-	      return;
-	    }
-
-	    var bounds = this._map.getPixelBounds();
-	    var cellSize = this._getCellSize();
-
-	    // cell coordinates range for the current view
-	    var cellBounds = L$1__default.bounds(
-	      bounds.min.divideBy(cellSize).floor(),
-	      bounds.max.divideBy(cellSize).floor());
-
-	    this._removeOtherCells(cellBounds);
-	    this._addCells(cellBounds);
-
-	    this.fire('cellsupdated');
-	  },
-
-	  _addCells: function (bounds) {
-	    var queue = [];
-	    var center = bounds.getCenter();
-	    var zoom = this._map.getZoom();
-
-	    var j, i, coords;
-	    // create a queue of coordinates to load cells from
-	    for (j = bounds.min.y; j <= bounds.max.y; j++) {
-	      for (i = bounds.min.x; i <= bounds.max.x; i++) {
-	        coords = L$1__default.point(i, j);
-	        coords.z = zoom;
-
-	        if (this._isValidCell(coords)) {
-	          queue.push(coords);
-	        }
-	      }
-	    }
-
-	    var cellsToLoad = queue.length;
-
-	    if (cellsToLoad === 0) { return; }
-
-	    this._cellsToLoad += cellsToLoad;
-	    this._cellsTotal += cellsToLoad;
-
-	    // sort cell queue to load cells in order of their distance to center
-	    queue.sort(function (a, b) {
-	      return a.distanceTo(center) - b.distanceTo(center);
-	    });
-
-	    for (i = 0; i < cellsToLoad; i++) {
-	      this._addCell(queue[i]);
-	    }
-	  },
-
-	  _isValidCell: function (coords) {
-	    var crs = this._map.options.crs;
-
-	    if (!crs.infinite) {
-	      // don't load cell if it's out of bounds and not wrapped
-	      var bounds = this._cellNumBounds;
-	      if (
-	        (!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) ||
-	        (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))
-	      ) {
-	        return false;
-	      }
-	    }
-
-	    if (!this.options.bounds) {
-	      return true;
-	    }
-
-	    // don't load cell if it doesn't intersect the bounds in options
-	    var cellBounds = this._cellCoordsToBounds(coords);
-	    return L$1__default.latLngBounds(this.options.bounds).intersects(cellBounds);
-	  },
-
-	  // converts cell coordinates to its geographical bounds
-	  _cellCoordsToBounds: function (coords) {
-	    var map = this._map;
-	    var cellSize = this.options.cellSize;
-	    var nwPoint = coords.multiplyBy(cellSize);
-	    var sePoint = nwPoint.add([cellSize, cellSize]);
-	    var nw = map.wrapLatLng(map.unproject(nwPoint, coords.z));
-	    var se = map.wrapLatLng(map.unproject(sePoint, coords.z));
-
-	    return L$1__default.latLngBounds(nw, se);
-	  },
-
-	  // converts cell coordinates to key for the cell cache
-	  _cellCoordsToKey: function (coords) {
-	    return coords.x + ':' + coords.y;
-	  },
-
-	  // converts cell cache key to coordiantes
-	  _keyToCellCoords: function (key) {
-	    var kArr = key.split(':');
-	    var x = parseInt(kArr[0], 10);
-	    var y = parseInt(kArr[1], 10);
-
-	    return L$1__default.point(x, y);
-	  },
-
-	  // remove any present cells that are off the specified bounds
-	  _removeOtherCells: function (bounds) {
-	    for (var key in this._cells) {
-	      if (!bounds.contains(this._keyToCellCoords(key))) {
-	        this._removeCell(key);
-	      }
-	    }
-	  },
-
-	  _removeCell: function (key) {
-	    var cell = this._activeCells[key];
-
-	    if (cell) {
-	      delete this._activeCells[key];
-
-	      if (this.cellLeave) {
-	        this.cellLeave(cell.bounds, cell.coords);
-	      }
-
-	      this.fire('cellleave', {
-	        bounds: cell.bounds,
-	        coords: cell.coords
-	      });
-	    }
-	  },
-
-	  _removeCells: function () {
-	    for (var key in this._cells) {
-	      var bounds = this._cells[key].bounds;
-	      var coords = this._cells[key].coords;
-
-	      if (this.cellLeave) {
-	        this.cellLeave(bounds, coords);
-	      }
-
-	      this.fire('cellleave', {
-	        bounds: bounds,
-	        coords: coords
-	      });
-	    }
-	  },
-
-	  _addCell: function (coords) {
-	    // wrap cell coords if necessary (depending on CRS)
-	    this._wrapCoords(coords);
-
-	    // generate the cell key
-	    var key = this._cellCoordsToKey(coords);
-
-	    // get the cell from the cache
-	    var cell = this._cells[key];
-	    // if this cell should be shown as isnt active yet (enter)
-
-	    if (cell && !this._activeCells[key]) {
-	      if (this.cellEnter) {
-	        this.cellEnter(cell.bounds, coords);
-	      }
-
-	      this.fire('cellenter', {
-	        bounds: cell.bounds,
-	        coords: coords
-	      });
-
-	      this._activeCells[key] = cell;
-	    }
-
-	    // if we dont have this cell in the cache yet (create)
-	    if (!cell) {
-	      cell = {
-	        coords: coords,
-	        bounds: this._cellCoordsToBounds(coords)
-	      };
-
-	      this._cells[key] = cell;
-	      this._activeCells[key] = cell;
-
-	      if (this.createCell) {
-	        this.createCell(cell.bounds, coords);
-	      }
-
-	      this.fire('cellcreate', {
-	        bounds: cell.bounds,
-	        coords: coords
-	      });
-	    }
-	  },
-
-	  _wrapCoords: function (coords) {
-	    coords.x = this._wrapLng ? L$1__default.Util.wrapNum(coords.x, this._wrapLng) : coords.x;
-	    coords.y = this._wrapLat ? L$1__default.Util.wrapNum(coords.y, this._wrapLat) : coords.y;
-	  },
-
-	  // get the global cell coordinates range for the current zoom
-	  _getCellNumBounds: function () {
-	    var bounds = this._map.getPixelWorldBounds();
-	    var size = this._getCellSize();
-
-	    return bounds ? L$1__default.bounds(
-	        bounds.min.divideBy(size).floor(),
-	        bounds.max.divideBy(size).ceil().subtract([1, 1])) : null;
-	  }
-	});
-
-	function BinarySearchIndex (values) {
-	  this.values = [].concat(values || []);
-	}
-
-	BinarySearchIndex.prototype.query = function (value) {
-	  var index = this.getIndex(value);
-	  return this.values[index];
-	};
-
-	BinarySearchIndex.prototype.getIndex = function getIndex (value) {
-	  if (this.dirty) {
-	    this.sort();
-	  }
-
-	  var minIndex = 0;
-	  var maxIndex = this.values.length - 1;
-	  var currentIndex;
-	  var currentElement;
-
-	  while (minIndex <= maxIndex) {
-	    currentIndex = (minIndex + maxIndex) / 2 | 0;
-	    currentElement = this.values[Math.round(currentIndex)];
-	    if (+currentElement.value < +value) {
-	      minIndex = currentIndex + 1;
-	    } else if (+currentElement.value > +value) {
-	      maxIndex = currentIndex - 1;
-	    } else {
-	      return currentIndex;
-	    }
-	  }
-
-	  return Math.abs(~maxIndex);
-	};
-
-	BinarySearchIndex.prototype.between = function between (start, end) {
-	  var startIndex = this.getIndex(start);
-	  var endIndex = this.getIndex(end);
-
-	  if (startIndex === 0 && endIndex === 0) {
-	    return [];
-	  }
-
-	  while (this.values[startIndex - 1] && this.values[startIndex - 1].value === start) {
-	    startIndex--;
-	  }
-
-	  while (this.values[endIndex + 1] && this.values[endIndex + 1].value === end) {
-	    endIndex++;
-	  }
-
-	  if (this.values[endIndex] && this.values[endIndex].value === end && this.values[endIndex + 1]) {
-	    endIndex++;
-	  }
-
-	  return this.values.slice(startIndex, endIndex);
-	};
-
-	BinarySearchIndex.prototype.insert = function insert (item) {
-	  this.values.splice(this.getIndex(item.value), 0, item);
-	  return this;
-	};
-
-	BinarySearchIndex.prototype.bulkAdd = function bulkAdd (items, sort) {
-	  this.values = this.values.concat([].concat(items || []));
-
-	  if (sort) {
-	    this.sort();
-	  } else {
-	    this.dirty = true;
-	  }
-
-	  return this;
-	};
-
-	BinarySearchIndex.prototype.sort = function sort () {
-	  this.values.sort(function (a, b) {
-	    return +b.value - +a.value;
-	  }).reverse();
-	  this.dirty = false;
-	  return this;
-	};
-
-	var FeatureManager = VirtualGrid.extend({
-	  /**
-	   * Options
-	   */
-
-	  options: {
-	    attribution: null,
-	    where: '1=1',
-	    fields: ['*'],
-	    from: false,
-	    to: false,
-	    timeField: false,
-	    timeFilterMode: 'server',
-	    simplifyFactor: 0,
-	    precision: 6
-	  },
-
-	  /**
-	   * Constructor
-	   */
-
-	  initialize: function (options) {
-	    VirtualGrid.prototype.initialize.call(this, options);
-
-	    options.url = cleanUrl(options.url);
-	    options = L$1.setOptions(this, options);
-
-	    this.service = featureLayerService(options);
-	    this.service.addEventParent(this);
-
-	    // use case insensitive regex to look for common fieldnames used for indexing
-	    if (this.options.fields[0] !== '*') {
-	      var oidCheck = false;
-	      for (var i = 0; i < this.options.fields.length; i++) {
-	        if (this.options.fields[i].match(/^(OBJECTID|FID|OID|ID)$/i)) {
-	          oidCheck = true;
-	        }
-	      }
-	      if (oidCheck === false) {
-	        warn('no known esriFieldTypeOID field detected in fields Array.  Please add an attribute field containing unique IDs to ensure the layer can be drawn correctly.');
-	      }
-	    }
-
-	    if (this.options.timeField.start && this.options.timeField.end) {
-	      this._startTimeIndex = new BinarySearchIndex();
-	      this._endTimeIndex = new BinarySearchIndex();
-	    } else if (this.options.timeField) {
-	      this._timeIndex = new BinarySearchIndex();
-	    }
-
-	    this._cache = {};
-	    this._currentSnapshot = []; // cache of what layers should be active
-	    this._activeRequests = 0;
-	  },
-
-	  /**
-	   * Layer Interface
-	   */
-
-	  onAdd: function (map) {
-	    // include 'Powered by Esri' in map attribution
-	    setEsriAttribution(map);
-
-	    this.service.metadata(function (err, metadata) {
-	      if (!err) {
-	        var supportedFormats = metadata.supportedQueryFormats;
-
-	        // Check if someone has requested that we don't use geoJSON, even if it's available
-	        var forceJsonFormat = false;
-	        if (this.service.options.isModern === false) {
-	          forceJsonFormat = true;
-	        }
-
-	        // Unless we've been told otherwise, check to see whether service can emit GeoJSON natively
-	        if (!forceJsonFormat && supportedFormats && supportedFormats.indexOf('geoJSON') !== -1) {
-	          this.service.options.isModern = true;
-	        }
-
-	        // add copyright text listed in service metadata
-	        if (!this.options.attribution && map.attributionControl && metadata.copyrightText) {
-	          this.options.attribution = metadata.copyrightText;
-	          map.attributionControl.addAttribution(this.getAttribution());
-	        }
-	      }
-	    }, this);
-
-	    map.on('zoomend', this._handleZoomChange, this);
-
-	    return VirtualGrid.prototype.onAdd.call(this, map);
-	  },
-
-	  onRemove: function (map) {
-	    map.off('zoomend', this._handleZoomChange, this);
-
-	    return VirtualGrid.prototype.onRemove.call(this, map);
-	  },
-
-	  getAttribution: function () {
-	    return this.options.attribution;
-	  },
-
-	  /**
-	   * Feature Management
-	   */
-
-	  createCell: function (bounds, coords) {
-	    // dont fetch features outside the scale range defined for the layer
-	    if (this._visibleZoom()) {
-	      this._requestFeatures(bounds, coords);
-	    }
-	  },
-
-	  _requestFeatures: function (bounds, coords, callback) {
-	    this._activeRequests++;
-
-	    // our first active request fires loading
-	    if (this._activeRequests === 1) {
-	      this.fire('loading', {
-	        bounds: bounds
-	      }, true);
-	    }
-
-	    return this._buildQuery(bounds).run(function (error, featureCollection, response) {
-	      if (response && response.exceededTransferLimit) {
-	        this.fire('drawlimitexceeded');
-	      }
-
-	      // no error, features
-	      if (!error && featureCollection && featureCollection.features.length) {
-	        // schedule adding features until the next animation frame
-	        L$1.Util.requestAnimFrame(L$1.Util.bind(function () {
-	          this._addFeatures(featureCollection.features, coords);
-	          this._postProcessFeatures(bounds);
-	        }, this));
-	      }
-
-	      // no error, no features
-	      if (!error && featureCollection && !featureCollection.features.length) {
-	        this._postProcessFeatures(bounds);
-	      }
-
-	      if (error) {
-	        this._postProcessFeatures(bounds);
-	      }
-
-	      if (callback) {
-	        callback.call(this, error, featureCollection);
-	      }
-	    }, this);
-	  },
-
-	  _postProcessFeatures: function (bounds) {
-	    // deincrement the request counter now that we have processed features
-	    this._activeRequests--;
-
-	    // if there are no more active requests fire a load event for this view
-	    if (this._activeRequests <= 0) {
-	      this.fire('load', {
-	        bounds: bounds
-	      });
-	    }
-	  },
-
-	  _cacheKey: function (coords) {
-	    return coords.z + ':' + coords.x + ':' + coords.y;
-	  },
-
-	  _addFeatures: function (features, coords) {
-	    var key = this._cacheKey(coords);
-	    this._cache[key] = this._cache[key] || [];
-
-	    for (var i = features.length - 1; i >= 0; i--) {
-	      var id = features[i].id;
-
-	      if (this._currentSnapshot.indexOf(id) === -1) {
-	        this._currentSnapshot.push(id);
-	      }
-	      if (this._cache[key].indexOf(id) === -1) {
-	        this._cache[key].push(id);
-	      }
-	    }
-
-	    if (this.options.timeField) {
-	      this._buildTimeIndexes(features);
-	    }
-
-	    this.createLayers(features);
-	  },
-
-	  _buildQuery: function (bounds) {
-	    var query = this.service.query()
-	      .intersects(bounds)
-	      .where(this.options.where)
-	      .fields(this.options.fields)
-	      .precision(this.options.precision);
-
-	    if (this.options.simplifyFactor) {
-	      query.simplify(this._map, this.options.simplifyFactor);
-	    }
-
-	    if (this.options.timeFilterMode === 'server' && this.options.from && this.options.to) {
-	      query.between(this.options.from, this.options.to);
-	    }
-
-	    return query;
-	  },
-
-	  /**
-	   * Where Methods
-	   */
-
-	  setWhere: function (where, callback, context) {
-	    this.options.where = (where && where.length) ? where : '1=1';
-
-	    var oldSnapshot = [];
-	    var newSnapshot = [];
-	    var pendingRequests = 0;
-	    var requestError = null;
-	    var requestCallback = L$1.Util.bind(function (error, featureCollection) {
-	      if (error) {
-	        requestError = error;
-	      }
-
-	      if (featureCollection) {
-	        for (var i = featureCollection.features.length - 1; i >= 0; i--) {
-	          newSnapshot.push(featureCollection.features[i].id);
-	        }
-	      }
-
-	      pendingRequests--;
-
-	      if (pendingRequests <= 0) {
-	        this._currentSnapshot = newSnapshot;
-	        // schedule adding features for the next animation frame
-	        L$1.Util.requestAnimFrame(L$1.Util.bind(function () {
-	          this.removeLayers(oldSnapshot);
-	          this.addLayers(newSnapshot);
-	          if (callback) {
-	            callback.call(context, requestError);
-	          }
-	        }, this));
-	      }
-	    }, this);
-
-	    for (var i = this._currentSnapshot.length - 1; i >= 0; i--) {
-	      oldSnapshot.push(this._currentSnapshot[i]);
-	    }
-
-	    for (var key in this._activeCells) {
-	      pendingRequests++;
-	      var coords = this._keyToCellCoords(key);
-	      var bounds = this._cellCoordsToBounds(coords);
-	      this._requestFeatures(bounds, key, requestCallback);
-	    }
-
-	    return this;
-	  },
-
-	  getWhere: function () {
-	    return this.options.where;
-	  },
-
-	  /**
-	   * Time Range Methods
-	   */
-
-	  getTimeRange: function () {
-	    return [this.options.from, this.options.to];
-	  },
-
-	  setTimeRange: function (from, to, callback, context) {
-	    var oldFrom = this.options.from;
-	    var oldTo = this.options.to;
-	    var pendingRequests = 0;
-	    var requestError = null;
-	    var requestCallback = L$1.Util.bind(function (error) {
-	      if (error) {
-	        requestError = error;
-	      }
-	      this._filterExistingFeatures(oldFrom, oldTo, from, to);
-
-	      pendingRequests--;
-
-	      if (callback && pendingRequests <= 0) {
-	        callback.call(context, requestError);
-	      }
-	    }, this);
-
-	    this.options.from = from;
-	    this.options.to = to;
-
-	    this._filterExistingFeatures(oldFrom, oldTo, from, to);
-
-	    if (this.options.timeFilterMode === 'server') {
-	      for (var key in this._activeCells) {
-	        pendingRequests++;
-	        var coords = this._keyToCellCoords(key);
-	        var bounds = this._cellCoordsToBounds(coords);
-	        this._requestFeatures(bounds, key, requestCallback);
-	      }
-	    }
-
-	    return this;
-	  },
-
-	  refresh: function () {
-	    for (var key in this._activeCells) {
-	      var coords = this._keyToCellCoords(key);
-	      var bounds = this._cellCoordsToBounds(coords);
-	      this._requestFeatures(bounds, key);
-	    }
-
-	    if (this.redraw) {
-	      this.once('load', function () {
-	        this.eachFeature(function (layer) {
-	          this._redraw(layer.feature.id);
-	        }, this);
-	      }, this);
-	    }
-	  },
-
-	  _filterExistingFeatures: function (oldFrom, oldTo, newFrom, newTo) {
-	    var layersToRemove = (oldFrom && oldTo) ? this._getFeaturesInTimeRange(oldFrom, oldTo) : this._currentSnapshot;
-	    var layersToAdd = this._getFeaturesInTimeRange(newFrom, newTo);
-
-	    if (layersToAdd.indexOf) {
-	      for (var i = 0; i < layersToAdd.length; i++) {
-	        var shouldRemoveLayer = layersToRemove.indexOf(layersToAdd[i]);
-	        if (shouldRemoveLayer >= 0) {
-	          layersToRemove.splice(shouldRemoveLayer, 1);
-	        }
-	      }
-	    }
-
-	    // schedule adding features until the next animation frame
-	    L$1.Util.requestAnimFrame(L$1.Util.bind(function () {
-	      this.removeLayers(layersToRemove);
-	      this.addLayers(layersToAdd);
-	    }, this));
-	  },
-
-	  _getFeaturesInTimeRange: function (start, end) {
-	    var ids = [];
-	    var search;
-
-	    if (this.options.timeField.start && this.options.timeField.end) {
-	      var startTimes = this._startTimeIndex.between(start, end);
-	      var endTimes = this._endTimeIndex.between(start, end);
-	      search = startTimes.concat(endTimes);
-	    } else {
-	      search = this._timeIndex.between(start, end);
-	    }
-
-	    for (var i = search.length - 1; i >= 0; i--) {
-	      ids.push(search[i].id);
-	    }
-
-	    return ids;
-	  },
-
-	  _buildTimeIndexes: function (geojson) {
-	    var i;
-	    var feature;
-	    if (this.options.timeField.start && this.options.timeField.end) {
-	      var startTimeEntries = [];
-	      var endTimeEntries = [];
-	      for (i = geojson.length - 1; i >= 0; i--) {
-	        feature = geojson[i];
-	        startTimeEntries.push({
-	          id: feature.id,
-	          value: new Date(feature.properties[this.options.timeField.start])
-	        });
-	        endTimeEntries.push({
-	          id: feature.id,
-	          value: new Date(feature.properties[this.options.timeField.end])
-	        });
-	      }
-	      this._startTimeIndex.bulkAdd(startTimeEntries);
-	      this._endTimeIndex.bulkAdd(endTimeEntries);
-	    } else {
-	      var timeEntries = [];
-	      for (i = geojson.length - 1; i >= 0; i--) {
-	        feature = geojson[i];
-	        timeEntries.push({
-	          id: feature.id,
-	          value: new Date(feature.properties[this.options.timeField])
-	        });
-	      }
-
-	      this._timeIndex.bulkAdd(timeEntries);
-	    }
-	  },
-
-	  _featureWithinTimeRange: function (feature) {
-	    if (!this.options.from || !this.options.to) {
-	      return true;
-	    }
-
-	    var from = +this.options.from.valueOf();
-	    var to = +this.options.to.valueOf();
-
-	    if (typeof this.options.timeField === 'string') {
-	      var date = +feature.properties[this.options.timeField];
-	      return (date >= from) && (date <= to);
-	    }
-
-	    if (this.options.timeField.start && this.options.timeField.end) {
-	      var startDate = +feature.properties[this.options.timeField.start];
-	      var endDate = +feature.properties[this.options.timeField.end];
-	      return ((startDate >= from) && (startDate <= to)) || ((endDate >= from) && (endDate <= to));
-	    }
-	  },
-
-	  _visibleZoom: function () {
-	    // check to see whether the current zoom level of the map is within the optional limit defined for the FeatureLayer
-	    if (!this._map) {
-	      return false;
-	    }
-	    var zoom = this._map.getZoom();
-	    if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {
-	      return false;
-	    } else { return true; }
-	  },
-
-	  _handleZoomChange: function () {
-	    if (!this._visibleZoom()) {
-	      this.removeLayers(this._currentSnapshot);
-	      this._currentSnapshot = [];
-	    } else {
-	      /*
-	      for every cell in this._activeCells
-	        1. Get the cache key for the coords of the cell
-	        2. If this._cache[key] exists it will be an array of feature IDs.
-	        3. Call this.addLayers(this._cache[key]) to instruct the feature layer to add the layers back.
-	      */
-	      for (var i in this._activeCells) {
-	        var coords = this._activeCells[i].coords;
-	        var key = this._cacheKey(coords);
-	        if (this._cache[key]) {
-	          this.addLayers(this._cache[key]);
-	        }
-	      }
-	    }
-	  },
-
-	  /**
-	   * Service Methods
-	   */
-
-	  authenticate: function (token) {
-	    this.service.authenticate(token);
-	    return this;
-	  },
-
-	  metadata: function (callback, context) {
-	    this.service.metadata(callback, context);
-	    return this;
-	  },
-
-	  query: function () {
-	    return this.service.query();
-	  },
-
-	  _getMetadata: function (callback) {
-	    if (this._metadata) {
-	      var error;
-	      callback(error, this._metadata);
-	    } else {
-	      this.metadata(L$1.Util.bind(function (error, response) {
-	        this._metadata = response;
-	        callback(error, this._metadata);
-	      }, this));
-	    }
-	  },
-
-	  addFeature: function (feature, callback, context) {
-	    this._getMetadata(L$1.Util.bind(function (error, metadata) {
-	      if (error) {
-	        if (callback) { callback.call(this, error, null); }
-	        return;
-	      }
-
-	      this.service.addFeature(feature, L$1.Util.bind(function (error, response) {
-	        if (!error) {
-	          // assign ID from result to appropriate objectid field from service metadata
-	          feature.properties[metadata.objectIdField] = response.objectId;
-
-	          // we also need to update the geojson id for createLayers() to function
-	          feature.id = response.objectId;
-	          this.createLayers([feature]);
-	        }
-
-	        if (callback) {
-	          callback.call(context, error, response);
-	        }
-	      }, this));
-	    }, this));
-	  },
-
-	  updateFeature: function (feature, callback, context) {
-	    this.service.updateFeature(feature, function (error, response) {
-	      if (!error) {
-	        this.removeLayers([feature.id], true);
-	        this.createLayers([feature]);
-	      }
-
-	      if (callback) {
-	        callback.call(context, error, response);
-	      }
-	    }, this);
-	  },
-
-	  deleteFeature: function (id, callback, context) {
-	    this.service.deleteFeature(id, function (error, response) {
-	      if (!error && response.objectId) {
-	        this.removeLayers([response.objectId], true);
-	      }
-	      if (callback) {
-	        callback.call(context, error, response);
-	      }
-	    }, this);
-	  },
-
-	  deleteFeatures: function (ids, callback, context) {
-	    return this.service.deleteFeatures(ids, function (error, response) {
-	      if (!error && response.length > 0) {
-	        for (var i = 0; i < response.length; i++) {
-	          this.removeLayers([response[i].objectId], true);
-	        }
-	      }
-	      if (callback) {
-	        callback.call(context, error, response);
-	      }
-	    }, this);
-	  }
-	});
-
-	var FeatureLayer = FeatureManager.extend({
-
-	  options: {
-	    cacheLayers: true
-	  },
-
-	  /**
-	   * Constructor
-	   */
-	  initialize: function (options) {
-	    FeatureManager.prototype.initialize.call(this, options);
-	    this._originalStyle = this.options.style;
-	    this._layers = {};
-	  },
-
-	  /**
-	   * Layer Interface
-	   */
-
-	  onRemove: function (map) {
-	    for (var i in this._layers) {
-	      map.removeLayer(this._layers[i]);
-	      // trigger the event when the entire featureLayer is removed from the map
-	      this.fire('removefeature', {
-	        feature: this._layers[i].feature,
-	        permanent: false
-	      }, true);
-	    }
-
-	    return FeatureManager.prototype.onRemove.call(this, map);
-	  },
-
-	  createNewLayer: function (geojson) {
-	    var layer = L$1.GeoJSON.geometryToLayer(geojson, this.options);
-	    layer.defaultOptions = layer.options;
-	    return layer;
-	  },
-
-	  _updateLayer: function (layer, geojson) {
-	    // convert the geojson coordinates into a Leaflet LatLng array/nested arrays
-	    // pass it to setLatLngs to update layer geometries
-	    var latlngs = [];
-	    var coordsToLatLng = this.options.coordsToLatLng || L$1.GeoJSON.coordsToLatLng;
-
-	    // copy new attributes, if present
-	    if (geojson.properties) {
-	      layer.feature.properties = geojson.properties;
-	    }
-
-	    switch (geojson.geometry.type) {
-	      case 'Point':
-	        latlngs = L$1.GeoJSON.coordsToLatLng(geojson.geometry.coordinates);
-	        layer.setLatLng(latlngs);
-	        break;
-	      case 'LineString':
-	        latlngs = L$1.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 0, coordsToLatLng);
-	        layer.setLatLngs(latlngs);
-	        break;
-	      case 'MultiLineString':
-	        latlngs = L$1.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1, coordsToLatLng);
-	        layer.setLatLngs(latlngs);
-	        break;
-	      case 'Polygon':
-	        latlngs = L$1.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1, coordsToLatLng);
-	        layer.setLatLngs(latlngs);
-	        break;
-	      case 'MultiPolygon':
-	        latlngs = L$1.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 2, coordsToLatLng);
-	        layer.setLatLngs(latlngs);
-	        break;
-	    }
-	  },
-
-	  /**
-	   * Feature Management Methods
-	   */
-
-	  createLayers: function (features) {
-	    for (var i = features.length - 1; i >= 0; i--) {
-	      var geojson = features[i];
-
-	      var layer = this._layers[geojson.id];
-	      var newLayer;
-
-	      if (this._visibleZoom() && layer && !this._map.hasLayer(layer)) {
-	        this._map.addLayer(layer);
-	        this.fire('addfeature', {
-	          feature: layer.feature
-	        }, true);
-	      }
-
-	      // update geometry if necessary
-	      if (layer && this.options.simplifyFactor > 0 && (layer.setLatLngs || layer.setLatLng)) {
-	        this._updateLayer(layer, geojson);
-	      }
-
-	      if (!layer) {
-	        newLayer = this.createNewLayer(geojson);
-	        newLayer.feature = geojson;
-
-	        // bubble events from individual layers to the feature layer
-	        newLayer.addEventParent(this);
-
-	        if (this.options.onEachFeature) {
-	          this.options.onEachFeature(newLayer.feature, newLayer);
-	        }
-
-	        // cache the layer
-	        this._layers[newLayer.feature.id] = newLayer;
-
-	        // style the layer
-	        this.setFeatureStyle(newLayer.feature.id, this.options.style);
-
-	        this.fire('createfeature', {
-	          feature: newLayer.feature
-	        }, true);
-
-	        // add the layer if the current zoom level is inside the range defined for the layer, it is within the current time bounds or our layer is not time enabled
-	        if (this._visibleZoom() && (!this.options.timeField || (this.options.timeField && this._featureWithinTimeRange(geojson)))) {
-	          this._map.addLayer(newLayer);
-	        }
-	      }
-	    }
-	  },
-
-	  addLayers: function (ids) {
-	    for (var i = ids.length - 1; i >= 0; i--) {
-	      var layer = this._layers[ids[i]];
-	      if (layer) {
-	        this._map.addLayer(layer);
-	      }
-	    }
-	  },
-
-	  removeLayers: function (ids, permanent) {
-	    for (var i = ids.length - 1; i >= 0; i--) {
-	      var id = ids[i];
-	      var layer = this._layers[id];
-	      if (layer) {
-	        this.fire('removefeature', {
-	          feature: layer.feature,
-	          permanent: permanent
-	        }, true);
-	        this._map.removeLayer(layer);
-	      }
-	      if (layer && permanent) {
-	        delete this._layers[id];
-	      }
-	    }
-	  },
-
-	  cellEnter: function (bounds, coords) {
-	    if (this._visibleZoom() && !this._zooming && this._map) {
-	      L$1.Util.requestAnimFrame(L$1.Util.bind(function () {
-	        var cacheKey = this._cacheKey(coords);
-	        var cellKey = this._cellCoordsToKey(coords);
-	        var layers = this._cache[cacheKey];
-	        if (this._activeCells[cellKey] && layers) {
-	          this.addLayers(layers);
-	        }
-	      }, this));
-	    }
-	  },
-
-	  cellLeave: function (bounds, coords) {
-	    if (!this._zooming) {
-	      L$1.Util.requestAnimFrame(L$1.Util.bind(function () {
-	        if (this._map) {
-	          var cacheKey = this._cacheKey(coords);
-	          var cellKey = this._cellCoordsToKey(coords);
-	          var layers = this._cache[cacheKey];
-	          var mapBounds = this._map.getBounds();
-	          if (!this._activeCells[cellKey] && layers) {
-	            var removable = true;
-
-	            for (var i = 0; i < layers.length; i++) {
-	              var layer = this._layers[layers[i]];
-	              if (layer && layer.getBounds && mapBounds.intersects(layer.getBounds())) {
-	                removable = false;
-	              }
-	            }
-
-	            if (removable) {
-	              this.removeLayers(layers, !this.options.cacheLayers);
-	            }
-
-	            if (!this.options.cacheLayers && removable) {
-	              delete this._cache[cacheKey];
-	              delete this._cells[cellKey];
-	              delete this._activeCells[cellKey];
-	            }
-	          }
-	        }
-	      }, this));
-	    }
-	  },
-
-	  /**
-	   * Styling Methods
-	   */
-
-	  resetStyle: function () {
-	    this.options.style = this._originalStyle;
-	    this.eachFeature(function (layer) {
-	      this.resetFeatureStyle(layer.feature.id);
-	    }, this);
-	    return this;
-	  },
-
-	  setStyle: function (style) {
-	    this.options.style = style;
-	    this.eachFeature(function (layer) {
-	      this.setFeatureStyle(layer.feature.id, style);
-	    }, this);
-	    return this;
-	  },
-
-	  resetFeatureStyle: function (id) {
-	    var layer = this._layers[id];
-	    var style = this._originalStyle || L.Path.prototype.options;
-	    if (layer) {
-	      L$1.Util.extend(layer.options, layer.defaultOptions);
-	      this.setFeatureStyle(id, style);
-	    }
-	    return this;
-	  },
-
-	  setFeatureStyle: function (id, style) {
-	    var layer = this._layers[id];
-	    if (typeof style === 'function') {
-	      style = style(layer.feature);
-	    }
-	    if (layer.setStyle) {
-	      layer.setStyle(style);
-	    }
-	    return this;
-	  },
-
-	  /**
-	   * Utility Methods
-	   */
-
-	  eachActiveFeature: function (fn, context) {
-	    // figure out (roughly) which layers are in view
-	    if (this._map) {
-	      var activeBounds = this._map.getBounds();
-	      for (var i in this._layers) {
-	        if (activeBounds.intersects(this._layers[i].getBounds()) && this._currentSnapshot.indexOf(this._layers[i].feature.id) !== -1) {
-	          fn.call(context, this._layers[i]);
-	        }
-	      }
-	    }
-	    return this;
-	  },
-
-	  eachFeature: function (fn, context) {
-	    for (var i in this._layers) {
-	      fn.call(context, this._layers[i]);
-	    }
-	    return this;
-	  },
-
-	  getFeature: function (id) {
-	    return this._layers[id];
-	  },
-
-	  bringToBack: function () {
-	    this.eachFeature(function (layer) {
-	      if (layer.bringToBack) {
-	        layer.bringToBack();
-	      }
-	    });
-	  },
-
-	  bringToFront: function () {
-	    this.eachFeature(function (layer) {
-	      if (layer.bringToFront) {
-	        layer.bringToFront();
-	      }
-	    });
-	  },
-
-	  redraw: function (id) {
-	    if (id) {
-	      this._redraw(id);
-	    }
-	    return this;
-	  },
-
-	  _redraw: function (id) {
-	    var layer = this._layers[id];
-	    var geojson = layer.feature;
-
-	    // if this looks like a marker
-	    if (layer && layer.setIcon && this.options.pointToLayer) {
-	      // update custom symbology, if necessary
-	      if (this.options.pointToLayer) {
-	        var getIcon = this.options.pointToLayer(geojson, L$1.latLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0]));
-	        var updatedIcon = getIcon.options.icon;
-	        layer.setIcon(updatedIcon);
-	      }
-	    }
-
-	    // looks like a vector marker (circleMarker)
-	    if (layer && layer.setStyle && this.options.pointToLayer) {
-	      var getStyle = this.options.pointToLayer(geojson, L$1.latLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0]));
-	      var updatedStyle = getStyle.options;
-	      this.setFeatureStyle(geojson.id, updatedStyle);
-	    }
-
-	    // looks like a path (polygon/polyline)
-	    if (layer && layer.setStyle && this.options.style) {
-	      this.resetStyle(geojson.id);
-	    }
-	  }
-	});
-
-	function featureLayer (options) {
-	  return new FeatureLayer(options);
-	}
-
-	exports.VERSION = version;
-	exports.Support = Support;
-	exports.options = options;
-	exports.Util = EsriUtil;
-	exports.get = get;
-	exports.post = xmlHttpPost;
-	exports.request = request;
-	exports.Task = Task;
-	exports.task = task;
-	exports.Query = Query;
-	exports.query = query;
-	exports.Find = Find;
-	exports.find = find;
-	exports.Identify = Identify;
-	exports.identify = identify;
-	exports.IdentifyFeatures = IdentifyFeatures;
-	exports.identifyFeatures = identifyFeatures;
-	exports.IdentifyImage = IdentifyImage;
-	exports.identifyImage = identifyImage;
-	exports.Service = Service;
-	exports.service = service;
-	exports.MapService = MapService;
-	exports.mapService = mapService;
-	exports.ImageService = ImageService;
-	exports.imageService = imageService;
-	exports.FeatureLayerService = FeatureLayerService;
-	exports.featureLayerService = featureLayerService;
-	exports.BasemapLayer = BasemapLayer;
-	exports.basemapLayer = basemapLayer;
-	exports.TiledMapLayer = TiledMapLayer;
-	exports.tiledMapLayer = tiledMapLayer;
-	exports.RasterLayer = RasterLayer;
-	exports.ImageMapLayer = ImageMapLayer;
-	exports.imageMapLayer = imageMapLayer;
-	exports.DynamicMapLayer = DynamicMapLayer;
-	exports.dynamicMapLayer = dynamicMapLayer;
-	exports.FeatureManager = FeatureManager;
-	exports.FeatureLayer = FeatureLayer;
-	exports.featureLayer = featureLayer;
-
-}));
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWRlYnVnLmpzIiwic291cmNlcyI6WyIuLi9wYWNrYWdlLmpzb24iLCIuLi9zcmMvU3VwcG9ydC5qcyIsIi4uL3NyYy9PcHRpb25zLmpzIiwiLi4vc3JjL1JlcXVlc3QuanMiLCIuLi9ub2RlX21vZHVsZXMvYXJjZ2lzLXRvLWdlb2pzb24tdXRpbHMvaW5kZXguanMiLCIuLi9zcmMvVXRpbC5qcyIsIi4uL3NyYy9UYXNrcy9UYXNrLmpzIiwiLi4vc3JjL1Rhc2tzL1F1ZXJ5LmpzIiwiLi4vc3JjL1Rhc2tzL0ZpbmQuanMiLCIuLi9zcmMvVGFza3MvSWRlbnRpZnkuanMiLCIuLi9zcmMvVGFza3MvSWRlbnRpZnlGZWF0dXJlcy5qcyIsIi4uL3NyYy9UYXNrcy9JZGVudGlmeUltYWdlLmpzIiwiLi4vc3JjL1NlcnZpY2VzL1NlcnZpY2UuanMiLCIuLi9zcmMvU2VydmljZXMvTWFwU2VydmljZS5qcyIsIi4uL3NyYy9TZXJ2aWNlcy9JbWFnZVNlcnZpY2UuanMiLCIuLi9zcmMvU2VydmljZXMvRmVhdHVyZUxheWVyU2VydmljZS5qcyIsIi4uL3NyYy9MYXllcnMvQmFzZW1hcExheWVyLmpzIiwiLi4vc3JjL0xheWVycy9UaWxlZE1hcExheWVyLmpzIiwiLi4vc3JjL0xheWVycy9SYXN0ZXJMYXllci5qcyIsIi4uL3NyYy9MYXllcnMvSW1hZ2VNYXBMYXllci5qcyIsIi4uL3NyYy9MYXllcnMvRHluYW1pY01hcExheWVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xlYWZsZXQtdmlydHVhbC1ncmlkL3NyYy92aXJ0dWFsLWdyaWQuanMiLCIuLi9ub2RlX21vZHVsZXMvdGlueS1iaW5hcnktc2VhcmNoL2luZGV4LmpzIiwiLi4vc3JjL0xheWVycy9GZWF0dXJlTGF5ZXIvRmVhdHVyZU1hbmFnZXIuanMiLCIuLi9zcmMvTGF5ZXJzL0ZlYXR1cmVMYXllci9GZWF0dXJlTGF5ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXRcIixcbiAgXCJkZXNjcmlwdGlvblwiOiBcIkxlYWZsZXQgcGx1Z2lucyBmb3IgY29uc3VtaW5nIEFyY0dJUyBPbmxpbmUgYW5kIEFyY0dJUyBTZXJ2ZXIgc2VydmljZXMuXCIsXG4gIFwidmVyc2lvblwiOiBcIjIuMC44XCIsXG4gIFwiYXV0aG9yXCI6IFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCIsXG4gIFwiYnJvd3NlclwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LWRlYnVnLmpzXCIsXG4gIFwiYnVnc1wiOiB7XG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZXNyaS9lc3JpLWxlYWZsZXQvaXNzdWVzXCJcbiAgfSxcbiAgXCJjb250cmlidXRvcnNcIjogW1xuICAgIFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCIsXG4gICAgXCJKb2huIEdyYXZvaXMgPGpncmF2b2lzQGVzcmkuY29tPiAoaHR0cDovL2pvaG5ncmF2b2lzLmNvbSlcIlxuICBdLFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJhcmNnaXMtdG8tZ2VvanNvbi11dGlsc1wiOiBcIl4xLjAuMVwiLFxuICAgIFwibGVhZmxldFwiOiBcIl4xLjAuMFwiLFxuICAgIFwibGVhZmxldC12aXJ0dWFsLWdyaWRcIjogXCJeMS4wLjNcIixcbiAgICBcInRpbnktYmluYXJ5LXNlYXJjaFwiOiBcIl4xLjAuMlwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImNoYWlcIjogXCIzLjUuMFwiLFxuICAgIFwiZ2gtcmVsZWFzZVwiOiBcIl4yLjAuMFwiLFxuICAgIFwiaGlnaGxpZ2h0LmpzXCI6IFwiXjguMC4wXCIsXG4gICAgXCJodHRwLXNlcnZlclwiOiBcIl4wLjguNVwiLFxuICAgIFwiaHVza3lcIjogXCJeMC4xMi4wXCIsXG4gICAgXCJpc3BhcnRhXCI6IFwiXjQuMC4wXCIsXG4gICAgXCJpc3RhbmJ1bFwiOiBcIl4wLjQuMlwiLFxuICAgIFwia2FybWFcIjogXCJeMS4zLjBcIixcbiAgICBcImthcm1hLWNoYWktc2lub25cIjogXCJeMC4xLjNcIixcbiAgICBcImthcm1hLWNvdmVyYWdlXCI6IFwiXjEuMS4xXCIsXG4gICAgXCJrYXJtYS1tb2NoYVwiOiBcIl4xLjMuMFwiLFxuICAgIFwia2FybWEtbW9jaGEtcmVwb3J0ZXJcIjogXCJeMi4yLjFcIixcbiAgICBcImthcm1hLXBoYW50b21qcy1sYXVuY2hlclwiOiBcIl4wLjIuMFwiLFxuICAgIFwia2FybWEtc291cmNlbWFwLWxvYWRlclwiOiBcIl4wLjMuNVwiLFxuICAgIFwibWtkaXJwXCI6IFwiXjAuNS4xXCIsXG4gICAgXCJtb2NoYVwiOiBcIl4zLjEuMFwiLFxuICAgIFwicGFyYWxsZWxzaGVsbFwiOiBcIl4yLjAuMFwiLFxuICAgIFwicGhhbnRvbWpzXCI6IFwiXjEuOS44XCIsXG4gICAgXCJyb2xsdXBcIjogXCJeMC4yNS40XCIsXG4gICAgXCJyb2xsdXAtcGx1Z2luLWpzb25cIjogXCJeMi4wLjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tbm9kZS1yZXNvbHZlXCI6IFwiXjEuNC4wXCIsXG4gICAgXCJyb2xsdXAtcGx1Z2luLXVnbGlmeVwiOiBcIl4wLjMuMVwiLFxuICAgIFwic2VtaXN0YW5kYXJkXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJzaW5vblwiOiBcIl4xLjExLjFcIixcbiAgICBcInNpbm9uLWNoYWlcIjogXCIyLjguMFwiLFxuICAgIFwic25henp5XCI6IFwiXjUuMC4wXCIsXG4gICAgXCJ1Z2xpZnktanNcIjogXCJeMi42LjFcIixcbiAgICBcIndhdGNoXCI6IFwiXjAuMTcuMVwiXG4gIH0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwOi8vZXNyaS5naXRodWIuaW8vZXNyaS1sZWFmbGV0XCIsXG4gIFwibW9kdWxlXCI6IFwic3JjL0VzcmlMZWFmbGV0LmpzXCIsXG4gIFwianNuZXh0Om1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXQuanNcIixcbiAgXCJqc3BtXCI6IHtcbiAgICBcInJlZ2lzdHJ5XCI6IFwibnBtXCIsXG4gICAgXCJmb3JtYXRcIjogXCJlczZcIixcbiAgICBcIm1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXQuanNcIlxuICB9LFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImFyY2dpc1wiLFxuICAgIFwiZXNyaVwiLFxuICAgIFwiZXNyaSBsZWFmbGV0XCIsXG4gICAgXCJnaXNcIixcbiAgICBcImxlYWZsZXQgcGx1Z2luXCIsXG4gICAgXCJtYXBwaW5nXCJcbiAgXSxcbiAgXCJsaWNlbnNlXCI6IFwiQXBhY2hlLTIuMFwiLFxuICBcIm1haW5cIjogXCJkaXN0L2VzcmktbGVhZmxldC1kZWJ1Zy5qc1wiLFxuICBcInJlYWRtZUZpbGVuYW1lXCI6IFwiUkVBRE1FLm1kXCIsXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXRAZ2l0aHViLmNvbTpFc3JpL2VzcmktbGVhZmxldC5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwiYnVpbGRcIjogXCJyb2xsdXAgLWMgcHJvZmlsZXMvZGVidWcuanMgJiByb2xsdXAgLWMgcHJvZmlsZXMvcHJvZHVjdGlvbi5qc1wiLFxuICAgIFwibGludFwiOiBcInNlbWlzdGFuZGFyZCB8IHNuYXp6eVwiLFxuICAgIFwicHJlYnVpbGRcIjogXCJta2RpcnAgZGlzdFwiLFxuICAgIFwicHJlcHVibGlzaFwiOiBcIm5wbSBydW4gYnVpbGRcIixcbiAgICBcInByZXRlc3RcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJwcmVjb21taXRcIjogXCJucG0gcnVuIGxpbnRcIixcbiAgICBcInJlbGVhc2VcIjogXCIuL3NjcmlwdHMvcmVsZWFzZS5zaFwiLFxuICAgIFwic3RhcnQtd2F0Y2hcIjogXCJ3YXRjaCBcXFwibnBtIHJ1biBidWlsZFxcXCIgc3JjXCIsXG4gICAgXCJzdGFydFwiOiBcInBhcmFsbGVsc2hlbGwgXFxcIm5wbSBydW4gc3RhcnQtd2F0Y2hcXFwiIFxcXCJodHRwLXNlcnZlciAtcCA1MDAwIC1jLTEgLW9cXFwiXCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1biBsaW50ICYmIGthcm1hIHN0YXJ0XCJcbiAgfSxcbiAgXCJzZW1pc3RhbmRhcmRcIjoge1xuICAgIFwiZ2xvYmFsc1wiOiBbIFwiZXhwZWN0XCIsIFwiTFwiLCBcIlhNTEh0dHBSZXF1ZXN0XCIsIFwic2lub25cIiwgXCJ4aHJcIiwgXCJwcm9qNFwiIF1cbiAgfVxufVxuIiwiZXhwb3J0IHZhciBjb3JzID0gKCh3aW5kb3cuWE1MSHR0cFJlcXVlc3QgJiYgJ3dpdGhDcmVkZW50aWFscycgaW4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpKSk7XG5leHBvcnQgdmFyIHBvaW50ZXJFdmVudHMgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9PT0gJyc7XG5cbmV4cG9ydCB2YXIgU3VwcG9ydCA9IHtcbiAgY29yczogY29ycyxcbiAgcG9pbnRlckV2ZW50czogcG9pbnRlckV2ZW50c1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU3VwcG9ydDtcbiIsImV4cG9ydCB2YXIgb3B0aW9ucyA9IHtcbiAgYXR0cmlidXRpb25XaWR0aE9mZnNldDogNTVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG9wdGlvbnM7XG4iLCJpbXBvcnQgeyBVdGlsLCBEb21VdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgU3VwcG9ydCBmcm9tICcuL1N1cHBvcnQnO1xuaW1wb3J0IHsgd2FybiB9IGZyb20gJy4vVXRpbCc7XG5cbnZhciBjYWxsYmFja3MgPSAwO1xuXG5mdW5jdGlvbiBzZXJpYWxpemUgKHBhcmFtcykge1xuICB2YXIgZGF0YSA9ICcnO1xuXG4gIHBhcmFtcy5mID0gcGFyYW1zLmYgfHwgJ2pzb24nO1xuXG4gIGZvciAodmFyIGtleSBpbiBwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1trZXldO1xuICAgICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocGFyYW0pO1xuICAgICAgdmFyIHZhbHVlO1xuXG4gICAgICBpZiAoZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgZGF0YSArPSAnJic7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgICAgIHZhbHVlID0gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwYXJhbVswXSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSA/IEpTT04uc3RyaW5naWZ5KHBhcmFtKSA6IHBhcmFtLmpvaW4oJywnKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeShwYXJhbSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgICAgICB2YWx1ZSA9IHBhcmFtLnZhbHVlT2YoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gcGFyYW07XG4gICAgICB9XG5cbiAgICAgIGRhdGEgKz0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZXF1ZXN0IChjYWxsYmFjaywgY29udGV4dCkge1xuICB2YXIgaHR0cFJlcXVlc3QgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgaHR0cFJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgaHR0cFJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gVXRpbC5mYWxzZUZuO1xuXG4gICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiA1MDAsXG4gICAgICAgIG1lc3NhZ2U6ICdYTUxIdHRwUmVxdWVzdCBlcnJvcidcbiAgICAgIH1cbiAgICB9LCBudWxsKTtcbiAgfTtcblxuICBodHRwUmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3BvbnNlO1xuICAgIHZhciBlcnJvcjtcblxuICAgIGlmIChodHRwUmVxdWVzdC5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UoaHR0cFJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVzcG9uc2UgPSBudWxsO1xuICAgICAgICBlcnJvciA9IHtcbiAgICAgICAgICBjb2RlOiA1MDAsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvdWxkIG5vdCBwYXJzZSByZXNwb25zZSBhcyBKU09OLiBUaGlzIGNvdWxkIGFsc28gYmUgY2F1c2VkIGJ5IGEgQ09SUyBvciBYTUxIdHRwUmVxdWVzdCBlcnJvci4nXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghZXJyb3IgJiYgcmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcbiAgICAgICAgcmVzcG9uc2UgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBodHRwUmVxdWVzdC5vbmVycm9yID0gVXRpbC5mYWxzZUZuO1xuXG4gICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSk7XG4gICAgfVxuICB9O1xuXG4gIGh0dHBSZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9uZXJyb3IoKTtcbiAgfTtcblxuICByZXR1cm4gaHR0cFJlcXVlc3Q7XG59XG5cbmZ1bmN0aW9uIHhtbEh0dHBQb3N0ICh1cmwsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgdmFyIGh0dHBSZXF1ZXN0ID0gY3JlYXRlUmVxdWVzdChjYWxsYmFjaywgY29udGV4dCk7XG4gIGh0dHBSZXF1ZXN0Lm9wZW4oJ1BPU1QnLCB1cmwpO1xuXG4gIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGV4dCAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY29udGV4dC5vcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaHR0cFJlcXVlc3QudGltZW91dCA9IGNvbnRleHQub3B0aW9ucy50aW1lb3V0O1xuICAgIH1cbiAgfVxuICBodHRwUmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gIGh0dHBSZXF1ZXN0LnNlbmQoc2VyaWFsaXplKHBhcmFtcykpO1xuXG4gIHJldHVybiBodHRwUmVxdWVzdDtcbn1cblxuZnVuY3Rpb24geG1sSHR0cEdldCAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIHZhciBodHRwUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3QoY2FsbGJhY2ssIGNvbnRleHQpO1xuICBodHRwUmVxdWVzdC5vcGVuKCdHRVQnLCB1cmwgKyAnPycgKyBzZXJpYWxpemUocGFyYW1zKSwgdHJ1ZSk7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0ICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZXh0ICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0Lm9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBodHRwUmVxdWVzdC50aW1lb3V0ID0gY29udGV4dC5vcHRpb25zLnRpbWVvdXQ7XG4gICAgfVxuICB9XG4gIGh0dHBSZXF1ZXN0LnNlbmQobnVsbCk7XG5cbiAgcmV0dXJuIGh0dHBSZXF1ZXN0O1xufVxuXG4vLyBBSkFYIGhhbmRsZXJzIGZvciBDT1JTIChtb2Rlcm4gYnJvd3NlcnMpIG9yIEpTT05QIChvbGRlciBicm93c2VycylcbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0ICh1cmwsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgdmFyIHBhcmFtU3RyaW5nID0gc2VyaWFsaXplKHBhcmFtcyk7XG4gIHZhciBodHRwUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3QoY2FsbGJhY2ssIGNvbnRleHQpO1xuICB2YXIgcmVxdWVzdExlbmd0aCA9ICh1cmwgKyAnPycgKyBwYXJhbVN0cmluZykubGVuZ3RoO1xuXG4gIC8vIGllMTAvMTEgcmVxdWlyZSB0aGUgcmVxdWVzdCBiZSBvcGVuZWQgYmVmb3JlIGEgdGltZW91dCBpcyBhcHBsaWVkXG4gIGlmIChyZXF1ZXN0TGVuZ3RoIDw9IDIwMDAgJiYgU3VwcG9ydC5jb3JzKSB7XG4gICAgaHR0cFJlcXVlc3Qub3BlbignR0VUJywgdXJsICsgJz8nICsgcGFyYW1TdHJpbmcpO1xuICB9IGVsc2UgaWYgKHJlcXVlc3RMZW5ndGggPiAyMDAwICYmIFN1cHBvcnQuY29ycykge1xuICAgIGh0dHBSZXF1ZXN0Lm9wZW4oJ1BPU1QnLCB1cmwpO1xuICAgIGh0dHBSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGV4dCAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY29udGV4dC5vcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaHR0cFJlcXVlc3QudGltZW91dCA9IGNvbnRleHQub3B0aW9ucy50aW1lb3V0O1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlcXVlc3QgaXMgbGVzcyB0aGFuIDIwMDAgY2hhcmFjdGVycyBhbmQgdGhlIGJyb3dzZXIgc3VwcG9ydHMgQ09SUywgbWFrZSBHRVQgcmVxdWVzdCB3aXRoIFhNTEh0dHBSZXF1ZXN0XG4gIGlmIChyZXF1ZXN0TGVuZ3RoIDw9IDIwMDAgJiYgU3VwcG9ydC5jb3JzKSB7XG4gICAgaHR0cFJlcXVlc3Quc2VuZChudWxsKTtcblxuICAvLyByZXF1ZXN0IGlzIG1vcmUgdGhhbiAyMDAwIGNoYXJhY3RlcnMgYW5kIHRoZSBicm93c2VyIHN1cHBvcnRzIENPUlMsIG1ha2UgUE9TVCByZXF1ZXN0IHdpdGggWE1MSHR0cFJlcXVlc3RcbiAgfSBlbHNlIGlmIChyZXF1ZXN0TGVuZ3RoID4gMjAwMCAmJiBTdXBwb3J0LmNvcnMpIHtcbiAgICBodHRwUmVxdWVzdC5zZW5kKHBhcmFtU3RyaW5nKTtcblxuICAvLyByZXF1ZXN0IGlzIGxlc3MgIHRoYW4gMjAwMCBjaGFyYWN0ZXJzIGFuZCB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IENPUlMsIG1ha2UgYSBKU09OUCByZXF1ZXN0XG4gIH0gZWxzZSBpZiAocmVxdWVzdExlbmd0aCA8PSAyMDAwICYmICFTdXBwb3J0LmNvcnMpIHtcbiAgICByZXR1cm4ganNvbnAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcblxuICAvLyByZXF1ZXN0IGlzIGxvbmdlciB0aGVuIDIwMDAgY2hhcmFjdGVycyBhbmQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBDT1JTLCBsb2cgYSB3YXJuaW5nXG4gIH0gZWxzZSB7XG4gICAgd2FybignYSByZXF1ZXN0IHRvICcgKyB1cmwgKyAnIHdhcyBsb25nZXIgdGhlbiAyMDAwIGNoYXJhY3RlcnMgYW5kIHRoaXMgYnJvd3NlciBjYW5ub3QgbWFrZSBhIGNyb3NzLWRvbWFpbiBwb3N0IHJlcXVlc3QuIFBsZWFzZSB1c2UgYSBwcm94eSBodHRwOi8vZXNyaS5naXRodWIuaW8vZXNyaS1sZWFmbGV0L2FwaS1yZWZlcmVuY2UvcmVxdWVzdC5odG1sJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGh0dHBSZXF1ZXN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganNvbnAgKHVybCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICB3aW5kb3cuX0VzcmlMZWFmbGV0Q2FsbGJhY2tzID0gd2luZG93Ll9Fc3JpTGVhZmxldENhbGxiYWNrcyB8fCB7fTtcbiAgdmFyIGNhbGxiYWNrSWQgPSAnYycgKyBjYWxsYmFja3M7XG4gIHBhcmFtcy5jYWxsYmFjayA9ICd3aW5kb3cuX0VzcmlMZWFmbGV0Q2FsbGJhY2tzLicgKyBjYWxsYmFja0lkO1xuXG4gIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3NbY2FsbGJhY2tJZF0gPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICBpZiAod2luZG93Ll9Fc3JpTGVhZmxldENhbGxiYWNrc1tjYWxsYmFja0lkXSAhPT0gdHJ1ZSkge1xuICAgICAgdmFyIGVycm9yO1xuICAgICAgdmFyIHJlc3BvbnNlVHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyZXNwb25zZSk7XG5cbiAgICAgIGlmICghKHJlc3BvbnNlVHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgfHwgcmVzcG9uc2VUeXBlID09PSAnW29iamVjdCBBcnJheV0nKSkge1xuICAgICAgICBlcnJvciA9IHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogNTAwLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0V4cGVjdGVkIGFycmF5IG9yIG9iamVjdCBhcyBKU09OUCByZXNwb25zZSdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlc3BvbnNlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcnJvciAmJiByZXNwb25zZS5lcnJvcikge1xuICAgICAgICBlcnJvciA9IHJlc3BvbnNlO1xuICAgICAgICByZXNwb25zZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIHJlc3BvbnNlKTtcbiAgICAgIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3NbY2FsbGJhY2tJZF0gPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc2NyaXB0ID0gRG9tVXRpbC5jcmVhdGUoJ3NjcmlwdCcsIG51bGwsIGRvY3VtZW50LmJvZHkpO1xuICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuICBzY3JpcHQuc3JjID0gdXJsICsgJz8nICsgc2VyaWFsaXplKHBhcmFtcyk7XG4gIHNjcmlwdC5pZCA9IGNhbGxiYWNrSWQ7XG5cbiAgY2FsbGJhY2tzKys7XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogY2FsbGJhY2tJZCxcbiAgICB1cmw6IHNjcmlwdC5zcmMsXG4gICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3MuX2NhbGxiYWNrW2NhbGxiYWNrSWRdKHtcbiAgICAgICAgY29kZTogMCxcbiAgICAgICAgbWVzc2FnZTogJ1JlcXVlc3QgYWJvcnRlZC4nXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBnZXQgPSAoKFN1cHBvcnQuY29ycykgPyB4bWxIdHRwR2V0IDoganNvbnApO1xuZ2V0LkNPUlMgPSB4bWxIdHRwR2V0O1xuZ2V0LkpTT05QID0ganNvbnA7XG5cbi8vIGNob29zZSB0aGUgY29ycmVjdCBBSkFYIGhhbmRsZXIgZGVwZW5kaW5nIG9uIENPUlMgc3VwcG9ydFxuZXhwb3J0IHsgZ2V0IH07XG5cbi8vIGFsd2F5cyB1c2UgWE1MSHR0cFJlcXVlc3QgZm9yIHBvc3RzXG5leHBvcnQgeyB4bWxIdHRwUG9zdCBhcyBwb3N0IH07XG5cbi8vIGV4cG9ydCB0aGUgUmVxdWVzdCBvYmplY3QgdG8gY2FsbCB0aGUgZGlmZmVyZW50IGhhbmRsZXJzIGZvciBkZWJ1Z2dpbmdcbmV4cG9ydCB2YXIgUmVxdWVzdCA9IHtcbiAgcmVxdWVzdDogcmVxdWVzdCxcbiAgZ2V0OiBnZXQsXG4gIHBvc3Q6IHhtbEh0dHBQb3N0XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSZXF1ZXN0O1xuIiwiLypcbiAqIENvcHlyaWdodCAyMDE1IEVzcmlcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpc2NlbnNlLlxuICovXG5cbi8vIGNoZWNrcyBpZiAyIHgseSBwb2ludHMgYXJlIGVxdWFsXG5mdW5jdGlvbiBwb2ludHNFcXVhbCAoYSwgYikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gY2hlY2tzIGlmIHRoZSBmaXJzdCBhbmQgbGFzdCBwb2ludHMgb2YgYSByaW5nIGFyZSBlcXVhbCBhbmQgY2xvc2VzIHRoZSByaW5nXG5mdW5jdGlvbiBjbG9zZVJpbmcgKGNvb3JkaW5hdGVzKSB7XG4gIGlmICghcG9pbnRzRXF1YWwoY29vcmRpbmF0ZXNbMF0sIGNvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzLmxlbmd0aCAtIDFdKSkge1xuICAgIGNvb3JkaW5hdGVzLnB1c2goY29vcmRpbmF0ZXNbMF0pO1xuICB9XG4gIHJldHVybiBjb29yZGluYXRlcztcbn1cblxuLy8gZGV0ZXJtaW5lIGlmIHBvbHlnb24gcmluZyBjb29yZGluYXRlcyBhcmUgY2xvY2t3aXNlLiBjbG9ja3dpc2Ugc2lnbmlmaWVzIG91dGVyIHJpbmcsIGNvdW50ZXItY2xvY2t3aXNlIGFuIGlubmVyIHJpbmdcbi8vIG9yIGhvbGUuIHRoaXMgbG9naWMgd2FzIGZvdW5kIGF0IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTE2NTY0Ny9ob3ctdG8tZGV0ZXJtaW5lLWlmLWEtbGlzdC1vZi1wb2x5Z29uLVxuLy8gcG9pbnRzLWFyZS1pbi1jbG9ja3dpc2Utb3JkZXJcbmZ1bmN0aW9uIHJpbmdJc0Nsb2Nrd2lzZSAocmluZ1RvVGVzdCkge1xuICB2YXIgdG90YWwgPSAwO1xuICB2YXIgaSA9IDA7XG4gIHZhciByTGVuZ3RoID0gcmluZ1RvVGVzdC5sZW5ndGg7XG4gIHZhciBwdDEgPSByaW5nVG9UZXN0W2ldO1xuICB2YXIgcHQyO1xuICBmb3IgKGk7IGkgPCByTGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgcHQyID0gcmluZ1RvVGVzdFtpICsgMV07XG4gICAgdG90YWwgKz0gKHB0MlswXSAtIHB0MVswXSkgKiAocHQyWzFdICsgcHQxWzFdKTtcbiAgICBwdDEgPSBwdDI7XG4gIH1cbiAgcmV0dXJuICh0b3RhbCA+PSAwKTtcbn1cblxuLy8gcG9ydGVkIGZyb20gdGVycmFmb3JtZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvVGVycmFmb3JtZXIvYmxvYi9tYXN0ZXIvdGVycmFmb3JtZXIuanMjTDUwNC1MNTE5XG5mdW5jdGlvbiB2ZXJ0ZXhJbnRlcnNlY3RzVmVydGV4IChhMSwgYTIsIGIxLCBiMikge1xuICB2YXIgdWFUID0gKGIyWzBdIC0gYjFbMF0pICogKGExWzFdIC0gYjFbMV0pIC0gKGIyWzFdIC0gYjFbMV0pICogKGExWzBdIC0gYjFbMF0pO1xuICB2YXIgdWJUID0gKGEyWzBdIC0gYTFbMF0pICogKGExWzFdIC0gYjFbMV0pIC0gKGEyWzFdIC0gYTFbMV0pICogKGExWzBdIC0gYjFbMF0pO1xuICB2YXIgdUIgPSAoYjJbMV0gLSBiMVsxXSkgKiAoYTJbMF0gLSBhMVswXSkgLSAoYjJbMF0gLSBiMVswXSkgKiAoYTJbMV0gLSBhMVsxXSk7XG5cbiAgaWYgKHVCICE9PSAwKSB7XG4gICAgdmFyIHVhID0gdWFUIC8gdUI7XG4gICAgdmFyIHViID0gdWJUIC8gdUI7XG5cbiAgICBpZiAodWEgPj0gMCAmJiB1YSA8PSAxICYmIHViID49IDAgJiYgdWIgPD0gMSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBwb3J0ZWQgZnJvbSB0ZXJyYWZvcm1lci5qcyBodHRwczovL2dpdGh1Yi5jb20vRXNyaS9UZXJyYWZvcm1lci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci5qcyNMNTIxLUw1MzFcbmZ1bmN0aW9uIGFycmF5SW50ZXJzZWN0c0FycmF5IChhLCBiKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGIubGVuZ3RoIC0gMTsgaisrKSB7XG4gICAgICBpZiAodmVydGV4SW50ZXJzZWN0c1ZlcnRleChhW2ldLCBhW2kgKyAxXSwgYltqXSwgYltqICsgMV0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gcG9ydGVkIGZyb20gdGVycmFmb3JtZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvVGVycmFmb3JtZXIvYmxvYi9tYXN0ZXIvdGVycmFmb3JtZXIuanMjTDQ3MC1MNDgwXG5mdW5jdGlvbiBjb29yZGluYXRlc0NvbnRhaW5Qb2ludCAoY29vcmRpbmF0ZXMsIHBvaW50KSB7XG4gIHZhciBjb250YWlucyA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gLTEsIGwgPSBjb29yZGluYXRlcy5sZW5ndGgsIGogPSBsIC0gMTsgKytpIDwgbDsgaiA9IGkpIHtcbiAgICBpZiAoKChjb29yZGluYXRlc1tpXVsxXSA8PSBwb2ludFsxXSAmJiBwb2ludFsxXSA8IGNvb3JkaW5hdGVzW2pdWzFdKSB8fFxuICAgICAgICAgKGNvb3JkaW5hdGVzW2pdWzFdIDw9IHBvaW50WzFdICYmIHBvaW50WzFdIDwgY29vcmRpbmF0ZXNbaV1bMV0pKSAmJlxuICAgICAgICAocG9pbnRbMF0gPCAoY29vcmRpbmF0ZXNbal1bMF0gLSBjb29yZGluYXRlc1tpXVswXSkgKiAocG9pbnRbMV0gLSBjb29yZGluYXRlc1tpXVsxXSkgLyAoY29vcmRpbmF0ZXNbal1bMV0gLSBjb29yZGluYXRlc1tpXVsxXSkgKyBjb29yZGluYXRlc1tpXVswXSkpIHtcbiAgICAgIGNvbnRhaW5zID0gIWNvbnRhaW5zO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29udGFpbnM7XG59XG5cbi8vIHBvcnRlZCBmcm9tIHRlcnJhZm9ybWVyLWFyY2dpcy1wYXJzZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvdGVycmFmb3JtZXItYXJjZ2lzLXBhcnNlci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci1hcmNnaXMtcGFyc2VyLmpzI0wxMDYtTDExM1xuZnVuY3Rpb24gY29vcmRpbmF0ZXNDb250YWluQ29vcmRpbmF0ZXMgKG91dGVyLCBpbm5lcikge1xuICB2YXIgaW50ZXJzZWN0cyA9IGFycmF5SW50ZXJzZWN0c0FycmF5KG91dGVyLCBpbm5lcik7XG4gIHZhciBjb250YWlucyA9IGNvb3JkaW5hdGVzQ29udGFpblBvaW50KG91dGVyLCBpbm5lclswXSk7XG4gIGlmICghaW50ZXJzZWN0cyAmJiBjb250YWlucykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gZG8gYW55IHBvbHlnb25zIGluIHRoaXMgYXJyYXkgY29udGFpbiBhbnkgb3RoZXIgcG9seWdvbnMgaW4gdGhpcyBhcnJheT9cbi8vIHVzZWQgZm9yIGNoZWNraW5nIGZvciBob2xlcyBpbiBhcmNnaXMgcmluZ3Ncbi8vIHBvcnRlZCBmcm9tIHRlcnJhZm9ybWVyLWFyY2dpcy1wYXJzZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvdGVycmFmb3JtZXItYXJjZ2lzLXBhcnNlci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci1hcmNnaXMtcGFyc2VyLmpzI0wxMTctTDE3MlxuZnVuY3Rpb24gY29udmVydFJpbmdzVG9HZW9KU09OIChyaW5ncykge1xuICB2YXIgb3V0ZXJSaW5ncyA9IFtdO1xuICB2YXIgaG9sZXMgPSBbXTtcbiAgdmFyIHg7IC8vIGl0ZXJhdG9yXG4gIHZhciBvdXRlclJpbmc7IC8vIGN1cnJlbnQgb3V0ZXIgcmluZyBiZWluZyBldmFsdWF0ZWRcbiAgdmFyIGhvbGU7IC8vIGN1cnJlbnQgaG9sZSBiZWluZyBldmFsdWF0ZWRcblxuICAvLyBmb3IgZWFjaCByaW5nXG4gIGZvciAodmFyIHIgPSAwOyByIDwgcmluZ3MubGVuZ3RoOyByKyspIHtcbiAgICB2YXIgcmluZyA9IGNsb3NlUmluZyhyaW5nc1tyXS5zbGljZSgwKSk7XG4gICAgaWYgKHJpbmcubGVuZ3RoIDwgNCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIGlzIHRoaXMgcmluZyBhbiBvdXRlciByaW5nPyBpcyBpdCBjbG9ja3dpc2U/XG4gICAgaWYgKHJpbmdJc0Nsb2Nrd2lzZShyaW5nKSkge1xuICAgICAgdmFyIHBvbHlnb24gPSBbIHJpbmcgXTtcbiAgICAgIG91dGVyUmluZ3MucHVzaChwb2x5Z29uKTsgLy8gcHVzaCB0byBvdXRlciByaW5nc1xuICAgIH0gZWxzZSB7XG4gICAgICBob2xlcy5wdXNoKHJpbmcpOyAvLyBjb3VudGVyY2xvY2t3aXNlIHB1c2ggdG8gaG9sZXNcbiAgICB9XG4gIH1cblxuICB2YXIgdW5jb250YWluZWRIb2xlcyA9IFtdO1xuXG4gIC8vIHdoaWxlIHRoZXJlIGFyZSBob2xlcyBsZWZ0Li4uXG4gIHdoaWxlIChob2xlcy5sZW5ndGgpIHtcbiAgICAvLyBwb3AgYSBob2xlIG9mZiBvdXQgc3RhY2tcbiAgICBob2xlID0gaG9sZXMucG9wKCk7XG5cbiAgICAvLyBsb29wIG92ZXIgYWxsIG91dGVyIHJpbmdzIGFuZCBzZWUgaWYgdGhleSBjb250YWluIG91ciBob2xlLlxuICAgIHZhciBjb250YWluZWQgPSBmYWxzZTtcbiAgICBmb3IgKHggPSBvdXRlclJpbmdzLmxlbmd0aCAtIDE7IHggPj0gMDsgeC0tKSB7XG4gICAgICBvdXRlclJpbmcgPSBvdXRlclJpbmdzW3hdWzBdO1xuICAgICAgaWYgKGNvb3JkaW5hdGVzQ29udGFpbkNvb3JkaW5hdGVzKG91dGVyUmluZywgaG9sZSkpIHtcbiAgICAgICAgLy8gdGhlIGhvbGUgaXMgY29udGFpbmVkIHB1c2ggaXQgaW50byBvdXIgcG9seWdvblxuICAgICAgICBvdXRlclJpbmdzW3hdLnB1c2goaG9sZSk7XG4gICAgICAgIGNvbnRhaW5lZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJpbmcgaXMgbm90IGNvbnRhaW5lZCBpbiBhbnkgb3V0ZXIgcmluZ1xuICAgIC8vIHNvbWV0aW1lcyB0aGlzIGhhcHBlbnMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvZXNyaS1sZWFmbGV0L2lzc3Vlcy8zMjBcbiAgICBpZiAoIWNvbnRhaW5lZCkge1xuICAgICAgdW5jb250YWluZWRIb2xlcy5wdXNoKGhvbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHdlIGNvdWxkbid0IG1hdGNoIGFueSBob2xlcyB1c2luZyBjb250YWlucyB3ZSBjYW4gdHJ5IGludGVyc2VjdHMuLi5cbiAgd2hpbGUgKHVuY29udGFpbmVkSG9sZXMubGVuZ3RoKSB7XG4gICAgLy8gcG9wIGEgaG9sZSBvZmYgb3V0IHN0YWNrXG4gICAgaG9sZSA9IHVuY29udGFpbmVkSG9sZXMucG9wKCk7XG5cbiAgICAvLyBsb29wIG92ZXIgYWxsIG91dGVyIHJpbmdzIGFuZCBzZWUgaWYgYW55IGludGVyc2VjdCBvdXIgaG9sZS5cbiAgICB2YXIgaW50ZXJzZWN0cyA9IGZhbHNlO1xuXG4gICAgZm9yICh4ID0gb3V0ZXJSaW5ncy5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkge1xuICAgICAgb3V0ZXJSaW5nID0gb3V0ZXJSaW5nc1t4XVswXTtcbiAgICAgIGlmIChhcnJheUludGVyc2VjdHNBcnJheShvdXRlclJpbmcsIGhvbGUpKSB7XG4gICAgICAgIC8vIHRoZSBob2xlIGlzIGNvbnRhaW5lZCBwdXNoIGl0IGludG8gb3VyIHBvbHlnb25cbiAgICAgICAgb3V0ZXJSaW5nc1t4XS5wdXNoKGhvbGUpO1xuICAgICAgICBpbnRlcnNlY3RzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbnRlcnNlY3RzKSB7XG4gICAgICBvdXRlclJpbmdzLnB1c2goW2hvbGUucmV2ZXJzZSgpXSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG91dGVyUmluZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgIGNvb3JkaW5hdGVzOiBvdXRlclJpbmdzWzBdXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ011bHRpUG9seWdvbicsXG4gICAgICBjb29yZGluYXRlczogb3V0ZXJSaW5nc1xuICAgIH07XG4gIH1cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgcmluZ3MgYXJlIG9yaWVudGVkIGluIHRoZSByaWdodCBkaXJlY3Rpb25zXG4vLyBvdXRlciByaW5ncyBhcmUgY2xvY2t3aXNlLCBob2xlcyBhcmUgY291bnRlcmNsb2Nrd2lzZVxuLy8gdXNlZCBmb3IgY29udmVydGluZyBHZW9KU09OIFBvbHlnb25zIHRvIEFyY0dJUyBQb2x5Z29uc1xuZnVuY3Rpb24gb3JpZW50UmluZ3MgKHBvbHkpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICB2YXIgcG9seWdvbiA9IHBvbHkuc2xpY2UoMCk7XG4gIHZhciBvdXRlclJpbmcgPSBjbG9zZVJpbmcocG9seWdvbi5zaGlmdCgpLnNsaWNlKDApKTtcbiAgaWYgKG91dGVyUmluZy5sZW5ndGggPj0gNCkge1xuICAgIGlmICghcmluZ0lzQ2xvY2t3aXNlKG91dGVyUmluZykpIHtcbiAgICAgIG91dGVyUmluZy5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgb3V0cHV0LnB1c2gob3V0ZXJSaW5nKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9seWdvbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhvbGUgPSBjbG9zZVJpbmcocG9seWdvbltpXS5zbGljZSgwKSk7XG4gICAgICBpZiAoaG9sZS5sZW5ndGggPj0gNCkge1xuICAgICAgICBpZiAocmluZ0lzQ2xvY2t3aXNlKGhvbGUpKSB7XG4gICAgICAgICAgaG9sZS5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0LnB1c2goaG9sZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBmbGF0dGVucyBob2xlcyBpbiBtdWx0aXBvbHlnb25zIHRvIG9uZSBhcnJheSBvZiBwb2x5Z29uc1xuLy8gdXNlZCBmb3IgY29udmVydGluZyBHZW9KU09OIFBvbHlnb25zIHRvIEFyY0dJUyBQb2x5Z29uc1xuZnVuY3Rpb24gZmxhdHRlbk11bHRpUG9seWdvblJpbmdzIChyaW5ncykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcG9seWdvbiA9IG9yaWVudFJpbmdzKHJpbmdzW2ldKTtcbiAgICBmb3IgKHZhciB4ID0gcG9seWdvbi5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkge1xuICAgICAgdmFyIHJpbmcgPSBwb2x5Z29uW3hdLnNsaWNlKDApO1xuICAgICAgb3V0cHV0LnB1c2gocmluZyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8vIHNoYWxsb3cgb2JqZWN0IGNsb25lIGZvciBmZWF0dXJlIHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXNcbi8vIGZyb20gaHR0cDovL2pzcGVyZi5jb20vY2xvbmluZy1hbi1vYmplY3QvMlxuZnVuY3Rpb24gc2hhbGxvd0Nsb25lIChvYmopIHtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgIHRhcmdldFtpXSA9IG9ialtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyY2dpc1RvR2VvSlNPTiAoYXJjZ2lzLCBpZEF0dHJpYnV0ZSkge1xuICB2YXIgZ2VvanNvbiA9IHt9O1xuXG4gIGlmICh0eXBlb2YgYXJjZ2lzLnggPT09ICdudW1iZXInICYmIHR5cGVvZiBhcmNnaXMueSA9PT0gJ251bWJlcicpIHtcbiAgICBnZW9qc29uLnR5cGUgPSAnUG9pbnQnO1xuICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBbYXJjZ2lzLngsIGFyY2dpcy55XTtcbiAgfVxuXG4gIGlmIChhcmNnaXMucG9pbnRzKSB7XG4gICAgZ2VvanNvbi50eXBlID0gJ011bHRpUG9pbnQnO1xuICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBhcmNnaXMucG9pbnRzLnNsaWNlKDApO1xuICB9XG5cbiAgaWYgKGFyY2dpcy5wYXRocykge1xuICAgIGlmIChhcmNnaXMucGF0aHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBnZW9qc29uLnR5cGUgPSAnTGluZVN0cmluZyc7XG4gICAgICBnZW9qc29uLmNvb3JkaW5hdGVzID0gYXJjZ2lzLnBhdGhzWzBdLnNsaWNlKDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW9qc29uLnR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBhcmNnaXMucGF0aHMuc2xpY2UoMCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGFyY2dpcy5yaW5ncykge1xuICAgIGdlb2pzb24gPSBjb252ZXJ0UmluZ3NUb0dlb0pTT04oYXJjZ2lzLnJpbmdzLnNsaWNlKDApKTtcbiAgfVxuXG4gIGlmIChhcmNnaXMuZ2VvbWV0cnkgfHwgYXJjZ2lzLmF0dHJpYnV0ZXMpIHtcbiAgICBnZW9qc29uLnR5cGUgPSAnRmVhdHVyZSc7XG4gICAgZ2VvanNvbi5nZW9tZXRyeSA9IChhcmNnaXMuZ2VvbWV0cnkpID8gYXJjZ2lzVG9HZW9KU09OKGFyY2dpcy5nZW9tZXRyeSkgOiBudWxsO1xuICAgIGdlb2pzb24ucHJvcGVydGllcyA9IChhcmNnaXMuYXR0cmlidXRlcykgPyBzaGFsbG93Q2xvbmUoYXJjZ2lzLmF0dHJpYnV0ZXMpIDogbnVsbDtcbiAgICBpZiAoYXJjZ2lzLmF0dHJpYnV0ZXMpIHtcbiAgICAgIGdlb2pzb24uaWQgPSBhcmNnaXMuYXR0cmlidXRlc1tpZEF0dHJpYnV0ZV0gfHwgYXJjZ2lzLmF0dHJpYnV0ZXMuT0JKRUNUSUQgfHwgYXJjZ2lzLmF0dHJpYnV0ZXMuRklEO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZW9qc29uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VvanNvblRvQXJjR0lTIChnZW9qc29uLCBpZEF0dHJpYnV0ZSkge1xuICBpZEF0dHJpYnV0ZSA9IGlkQXR0cmlidXRlIHx8ICdPQkpFQ1RJRCc7XG4gIHZhciBzcGF0aWFsUmVmZXJlbmNlID0geyB3a2lkOiA0MzI2IH07XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGk7XG5cbiAgc3dpdGNoIChnZW9qc29uLnR5cGUpIHtcbiAgICBjYXNlICdQb2ludCc6XG4gICAgICByZXN1bHQueCA9IGdlb2pzb24uY29vcmRpbmF0ZXNbMF07XG4gICAgICByZXN1bHQueSA9IGdlb2pzb24uY29vcmRpbmF0ZXNbMV07XG4gICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aVBvaW50JzpcbiAgICAgIHJlc3VsdC5wb2ludHMgPSBnZW9qc29uLmNvb3JkaW5hdGVzLnNsaWNlKDApO1xuICAgICAgcmVzdWx0LnNwYXRpYWxSZWZlcmVuY2UgPSBzcGF0aWFsUmVmZXJlbmNlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnTGluZVN0cmluZyc6XG4gICAgICByZXN1bHQucGF0aHMgPSBbZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKV07XG4gICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aUxpbmVTdHJpbmcnOlxuICAgICAgcmVzdWx0LnBhdGhzID0gZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKTtcbiAgICAgIHJlc3VsdC5zcGF0aWFsUmVmZXJlbmNlID0gc3BhdGlhbFJlZmVyZW5jZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1BvbHlnb24nOlxuICAgICAgcmVzdWx0LnJpbmdzID0gb3JpZW50UmluZ3MoZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKSk7XG4gICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgcmVzdWx0LnJpbmdzID0gZmxhdHRlbk11bHRpUG9seWdvblJpbmdzKGdlb2pzb24uY29vcmRpbmF0ZXMuc2xpY2UoMCkpO1xuICAgICAgcmVzdWx0LnNwYXRpYWxSZWZlcmVuY2UgPSBzcGF0aWFsUmVmZXJlbmNlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRmVhdHVyZSc6XG4gICAgICBpZiAoZ2VvanNvbi5nZW9tZXRyeSkge1xuICAgICAgICByZXN1bHQuZ2VvbWV0cnkgPSBnZW9qc29uVG9BcmNHSVMoZ2VvanNvbi5nZW9tZXRyeSwgaWRBdHRyaWJ1dGUpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmF0dHJpYnV0ZXMgPSAoZ2VvanNvbi5wcm9wZXJ0aWVzKSA/IHNoYWxsb3dDbG9uZShnZW9qc29uLnByb3BlcnRpZXMpIDoge307XG4gICAgICBpZiAoZ2VvanNvbi5pZCkge1xuICAgICAgICByZXN1bHQuYXR0cmlidXRlc1tpZEF0dHJpYnV0ZV0gPSBnZW9qc29uLmlkO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRmVhdHVyZUNvbGxlY3Rpb24nOlxuICAgICAgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvanNvbi5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQucHVzaChnZW9qc29uVG9BcmNHSVMoZ2VvanNvbi5mZWF0dXJlc1tpXSwgaWRBdHRyaWJ1dGUpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0dlb21ldHJ5Q29sbGVjdGlvbic6XG4gICAgICByZXN1bHQgPSBbXTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9qc29uLmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZ2VvanNvblRvQXJjR0lTKGdlb2pzb24uZ2VvbWV0cmllc1tpXSwgaWRBdHRyaWJ1dGUpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsImltcG9ydCB7IGxhdExuZywgbGF0TG5nQm91bmRzLCBVdGlsLCBEb21VdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBqc29ucCB9IGZyb20gJy4vUmVxdWVzdCc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9PcHRpb25zJztcblxuaW1wb3J0IHtcbiAgZ2VvanNvblRvQXJjR0lTIGFzIGcyYSxcbiAgYXJjZ2lzVG9HZW9KU09OIGFzIGEyZ1xufSBmcm9tICdhcmNnaXMtdG8tZ2VvanNvbi11dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9qc29uVG9BcmNHSVMgKGdlb2pzb24sIGlkQXR0cikge1xuICByZXR1cm4gZzJhKGdlb2pzb24sIGlkQXR0cik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmNnaXNUb0dlb0pTT04gKGFyY2dpcywgaWRBdHRyKSB7XG4gIHJldHVybiBhMmcoYXJjZ2lzLCBpZEF0dHIpO1xufVxuXG4vLyBzaGFsbG93IG9iamVjdCBjbG9uZSBmb3IgZmVhdHVyZSBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzXG4vLyBmcm9tIGh0dHA6Ly9qc3BlcmYuY29tL2Nsb25pbmctYW4tb2JqZWN0LzJcbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93Q2xvbmUgKG9iaikge1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgdGFyZ2V0W2ldID0gb2JqW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vLyBjb252ZXJ0IGFuIGV4dGVudCAoQXJjR0lTKSB0byBMYXRMbmdCb3VuZHMgKExlYWZsZXQpXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW50VG9Cb3VuZHMgKGV4dGVudCkge1xuICAvLyBcIk5hTlwiIGNvb3JkaW5hdGVzIGZyb20gQXJjR0lTIFNlcnZlciBpbmRpY2F0ZSBhIG51bGwgZ2VvbWV0cnlcbiAgaWYgKGV4dGVudC54bWluICE9PSAnTmFOJyAmJiBleHRlbnQueW1pbiAhPT0gJ05hTicgJiYgZXh0ZW50LnhtYXggIT09ICdOYU4nICYmIGV4dGVudC55bWF4ICE9PSAnTmFOJykge1xuICAgIHZhciBzdyA9IGxhdExuZyhleHRlbnQueW1pbiwgZXh0ZW50LnhtaW4pO1xuICAgIHZhciBuZSA9IGxhdExuZyhleHRlbnQueW1heCwgZXh0ZW50LnhtYXgpO1xuICAgIHJldHVybiBsYXRMbmdCb3VuZHMoc3csIG5lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBjb252ZXJ0IGFuIExhdExuZ0JvdW5kcyAoTGVhZmxldCkgdG8gZXh0ZW50IChBcmNHSVMpXG5leHBvcnQgZnVuY3Rpb24gYm91bmRzVG9FeHRlbnQgKGJvdW5kcykge1xuICBib3VuZHMgPSBsYXRMbmdCb3VuZHMoYm91bmRzKTtcbiAgcmV0dXJuIHtcbiAgICAneG1pbic6IGJvdW5kcy5nZXRTb3V0aFdlc3QoKS5sbmcsXG4gICAgJ3ltaW4nOiBib3VuZHMuZ2V0U291dGhXZXN0KCkubGF0LFxuICAgICd4bWF4JzogYm91bmRzLmdldE5vcnRoRWFzdCgpLmxuZyxcbiAgICAneW1heCc6IGJvdW5kcy5nZXROb3J0aEVhc3QoKS5sYXQsXG4gICAgJ3NwYXRpYWxSZWZlcmVuY2UnOiB7XG4gICAgICAnd2tpZCc6IDQzMjZcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gKHJlc3BvbnNlLCBpZEF0dHJpYnV0ZSkge1xuICB2YXIgb2JqZWN0SWRGaWVsZDtcbiAgdmFyIGZlYXR1cmVzID0gcmVzcG9uc2UuZmVhdHVyZXMgfHwgcmVzcG9uc2UucmVzdWx0cztcbiAgdmFyIGNvdW50ID0gZmVhdHVyZXMubGVuZ3RoO1xuXG4gIGlmIChpZEF0dHJpYnV0ZSkge1xuICAgIG9iamVjdElkRmllbGQgPSBpZEF0dHJpYnV0ZTtcbiAgfSBlbHNlIGlmIChyZXNwb25zZS5vYmplY3RJZEZpZWxkTmFtZSkge1xuICAgIG9iamVjdElkRmllbGQgPSByZXNwb25zZS5vYmplY3RJZEZpZWxkTmFtZTtcbiAgfSBlbHNlIGlmIChyZXNwb25zZS5maWVsZHMpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8PSByZXNwb25zZS5maWVsZHMubGVuZ3RoIC0gMTsgaisrKSB7XG4gICAgICBpZiAocmVzcG9uc2UuZmllbGRzW2pdLnR5cGUgPT09ICdlc3JpRmllbGRUeXBlT0lEJykge1xuICAgICAgICBvYmplY3RJZEZpZWxkID0gcmVzcG9uc2UuZmllbGRzW2pdLm5hbWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChjb3VudCkge1xuICAgIC8qIGFzIGEgbGFzdCByZXNvcnQsIGNoZWNrIGZvciBjb21tb24gSUQgZmllbGRuYW1lcyBpbiB0aGUgZmlyc3QgZmVhdHVyZSByZXR1cm5lZFxuICAgIG5vdCBmb29scHJvb2YuIGlkZW50aWZ5RmVhdHVyZXMgY2FuIHJldHVybmVkIGEgbWl4ZWQgYXJyYXkgb2YgZmVhdHVyZXMuICovXG4gICAgZm9yICh2YXIga2V5IGluIGZlYXR1cmVzWzBdLmF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmIChrZXkubWF0Y2goL14oT0JKRUNUSUR8RklEfE9JRHxJRCkkL2kpKSB7XG4gICAgICAgIG9iamVjdElkRmllbGQgPSBrZXk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBmZWF0dXJlQ29sbGVjdGlvbiA9IHtcbiAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgIGZlYXR1cmVzOiBbXVxuICB9O1xuXG4gIGlmIChjb3VudCkge1xuICAgIGZvciAodmFyIGkgPSBmZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZlYXR1cmUgPSBhcmNnaXNUb0dlb0pTT04oZmVhdHVyZXNbaV0sIG9iamVjdElkRmllbGQpO1xuICAgICAgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMucHVzaChmZWF0dXJlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmVhdHVyZUNvbGxlY3Rpb247XG59XG5cbiAgLy8gdHJpbSB1cmwgd2hpdGVzcGFjZSBhbmQgYWRkIGEgdHJhaWxpbmcgc2xhc2ggaWYgbmVlZGVkXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcmwgKHVybCkge1xuICAvLyB0cmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcywgYnV0IG5vdCBzcGFjZXMgaW5zaWRlIHRoZSB1cmxcbiAgdXJsID0gVXRpbC50cmltKHVybCk7XG5cbiAgLy8gYWRkIGEgdHJhaWxpbmcgc2xhc2ggdG8gdGhlIHVybCBpZiB0aGUgdXNlciBvbWl0dGVkIGl0XG4gIGlmICh1cmxbdXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcbiAgICB1cmwgKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJjZ2lzT25saW5lICh1cmwpIHtcbiAgLyogaG9zdGVkIGZlYXR1cmUgc2VydmljZXMgc3VwcG9ydCBnZW9qc29uIGFzIGFuIG91dHB1dCBmb3JtYXRcbiAgdXRpbGl0eS5hcmNnaXMuY29tIHNlcnZpY2VzIGFyZSBwcm94aWVkIGZyb20gYSB2YXJpZXR5IG9mIEFyY0dJUyBTZXJ2ZXIgdmludGFnZXMsIGFuZCBtYXkgbm90ICovXG4gIHJldHVybiAoL14oPyEuKnV0aWxpdHlcXC5hcmNnaXNcXC5jb20pLipcXC5hcmNnaXNcXC5jb20uKkZlYXR1cmVTZXJ2ZXIvaSkudGVzdCh1cmwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VvanNvblR5cGVUb0FyY0dJUyAoZ2VvSnNvblR5cGUpIHtcbiAgdmFyIGFyY2dpc0dlb21ldHJ5VHlwZTtcbiAgc3dpdGNoIChnZW9Kc29uVHlwZSkge1xuICAgIGNhc2UgJ1BvaW50JzpcbiAgICAgIGFyY2dpc0dlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlQb2ludCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aVBvaW50JzpcbiAgICAgIGFyY2dpc0dlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlNdWx0aXBvaW50JztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0xpbmVTdHJpbmcnOlxuICAgICAgYXJjZ2lzR2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvbHlsaW5lJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ011bHRpTGluZVN0cmluZyc6XG4gICAgICBhcmNnaXNHZW9tZXRyeVR5cGUgPSAnZXNyaUdlb21ldHJ5UG9seWxpbmUnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnUG9seWdvbic6XG4gICAgICBhcmNnaXNHZW9tZXRyeVR5cGUgPSAnZXNyaUdlb21ldHJ5UG9seWdvbic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgYXJjZ2lzR2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvbHlnb24nO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gYXJjZ2lzR2VvbWV0cnlUeXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2FybiAoKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2Fybikge1xuICAgIGNvbnNvbGUud2Fybi5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjQXR0cmlidXRpb25XaWR0aCAobWFwKSB7XG4gIC8vIGVpdGhlciBjcm9wIGF0IDU1cHggb3IgdXNlciBkZWZpbmVkIGJ1ZmZlclxuICByZXR1cm4gKG1hcC5nZXRTaXplKCkueCAtIG9wdGlvbnMuYXR0cmlidXRpb25XaWR0aE9mZnNldCkgKyAncHgnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RXNyaUF0dHJpYnV0aW9uIChtYXApIHtcbiAgaWYgKG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wgJiYgIW1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuX2VzcmlBdHRyaWJ1dGlvbkFkZGVkKSB7XG4gICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5zZXRQcmVmaXgoJzxhIGhyZWY9XCJodHRwOi8vbGVhZmxldGpzLmNvbVwiIHRpdGxlPVwiQSBKUyBsaWJyYXJ5IGZvciBpbnRlcmFjdGl2ZSBtYXBzXCI+TGVhZmxldDwvYT4gfCBQb3dlcmVkIGJ5IDxhIGhyZWY9XCJodHRwczovL3d3dy5lc3JpLmNvbVwiPkVzcmk8L2E+Jyk7XG5cbiAgICB2YXIgaG92ZXJBdHRyaWJ1dGlvblN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBob3ZlckF0dHJpYnV0aW9uU3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgaG92ZXJBdHRyaWJ1dGlvblN0eWxlLmlubmVySFRNTCA9ICcuZXNyaS10cnVuY2F0ZWQtYXR0cmlidXRpb246aG92ZXIgeycgK1xuICAgICAgJ3doaXRlLXNwYWNlOiBub3JtYWw7JyArXG4gICAgJ30nO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChob3ZlckF0dHJpYnV0aW9uU3R5bGUpO1xuICAgIERvbVV0aWwuYWRkQ2xhc3MobWFwLmF0dHJpYnV0aW9uQ29udHJvbC5fY29udGFpbmVyLCAnZXNyaS10cnVuY2F0ZWQtYXR0cmlidXRpb246aG92ZXInKTtcblxuICAgIC8vIGRlZmluZSBhIG5ldyBjc3MgY2xhc3MgaW4gSlMgdG8gdHJpbSBhdHRyaWJ1dGlvbiBpbnRvIGEgc2luZ2xlIGxpbmVcbiAgICB2YXIgYXR0cmlidXRpb25TdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgYXR0cmlidXRpb25TdHlsZS50eXBlID0gJ3RleHQvY3NzJztcbiAgICBhdHRyaWJ1dGlvblN0eWxlLmlubmVySFRNTCA9ICcuZXNyaS10cnVuY2F0ZWQtYXR0cmlidXRpb24geycgK1xuICAgICAgJ3ZlcnRpY2FsLWFsaWduOiAtM3B4OycgK1xuICAgICAgJ3doaXRlLXNwYWNlOiBub3dyYXA7JyArXG4gICAgICAnb3ZlcmZsb3c6IGhpZGRlbjsnICtcbiAgICAgICd0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsnICtcbiAgICAgICdkaXNwbGF5OiBpbmxpbmUtYmxvY2s7JyArXG4gICAgICAndHJhbnNpdGlvbjogMHMgd2hpdGUtc3BhY2U7JyArXG4gICAgICAndHJhbnNpdGlvbi1kZWxheTogMXM7JyArXG4gICAgICAnbWF4LXdpZHRoOiAnICsgY2FsY0F0dHJpYnV0aW9uV2lkdGgobWFwKSArICc7JyArXG4gICAgJ30nO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChhdHRyaWJ1dGlvblN0eWxlKTtcbiAgICBEb21VdGlsLmFkZENsYXNzKG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuX2NvbnRhaW5lciwgJ2VzcmktdHJ1bmNhdGVkLWF0dHJpYnV0aW9uJyk7XG5cbiAgICAvLyB1cGRhdGUgdGhlIHdpZHRoIHVzZWQgdG8gdHJ1bmNhdGUgd2hlbiB0aGUgbWFwIGl0c2VsZiBpcyByZXNpemVkXG4gICAgbWFwLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5fY29udGFpbmVyLnN0eWxlLm1heFdpZHRoID0gY2FsY0F0dHJpYnV0aW9uV2lkdGgoZS50YXJnZXQpO1xuICAgIH0pO1xuXG4gICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5fZXNyaUF0dHJpYnV0aW9uQWRkZWQgPSB0cnVlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0QXR0cmlidXRpb25EYXRhICh1cmwsIG1hcCkge1xuICBqc29ucCh1cmwsIHt9LCBVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCBhdHRyaWJ1dGlvbnMpIHtcbiAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9XG4gICAgbWFwLl9lc3JpQXR0cmlidXRpb25zID0gW107XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBhdHRyaWJ1dGlvbnMuY29udHJpYnV0b3JzLmxlbmd0aDsgYysrKSB7XG4gICAgICB2YXIgY29udHJpYnV0b3IgPSBhdHRyaWJ1dGlvbnMuY29udHJpYnV0b3JzW2NdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRyaWJ1dG9yLmNvdmVyYWdlQXJlYXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvdmVyYWdlQXJlYSA9IGNvbnRyaWJ1dG9yLmNvdmVyYWdlQXJlYXNbaV07XG4gICAgICAgIHZhciBzb3V0aFdlc3QgPSBsYXRMbmcoY292ZXJhZ2VBcmVhLmJib3hbMF0sIGNvdmVyYWdlQXJlYS5iYm94WzFdKTtcbiAgICAgICAgdmFyIG5vcnRoRWFzdCA9IGxhdExuZyhjb3ZlcmFnZUFyZWEuYmJveFsyXSwgY292ZXJhZ2VBcmVhLmJib3hbM10pO1xuICAgICAgICBtYXAuX2VzcmlBdHRyaWJ1dGlvbnMucHVzaCh7XG4gICAgICAgICAgYXR0cmlidXRpb246IGNvbnRyaWJ1dG9yLmF0dHJpYnV0aW9uLFxuICAgICAgICAgIHNjb3JlOiBjb3ZlcmFnZUFyZWEuc2NvcmUsXG4gICAgICAgICAgYm91bmRzOiBsYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpLFxuICAgICAgICAgIG1pblpvb206IGNvdmVyYWdlQXJlYS56b29tTWluLFxuICAgICAgICAgIG1heFpvb206IGNvdmVyYWdlQXJlYS56b29tTWF4XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1hcC5fZXNyaUF0dHJpYnV0aW9ucy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYi5zY29yZSAtIGEuc2NvcmU7XG4gICAgfSk7XG5cbiAgICAvLyBwYXNzIHRoZSBzYW1lIGFyZ3VtZW50IGFzIHRoZSBtYXAncyAnbW92ZWVuZCcgZXZlbnRcbiAgICB2YXIgb2JqID0geyB0YXJnZXQ6IG1hcCB9O1xuICAgIF91cGRhdGVNYXBBdHRyaWJ1dGlvbihvYmopO1xuICB9LCB0aGlzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfdXBkYXRlTWFwQXR0cmlidXRpb24gKGV2dCkge1xuICB2YXIgbWFwID0gZXZ0LnRhcmdldDtcbiAgdmFyIG9sZEF0dHJpYnV0aW9ucyA9IG1hcC5fZXNyaUF0dHJpYnV0aW9ucztcblxuICBpZiAobWFwICYmIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wgJiYgb2xkQXR0cmlidXRpb25zKSB7XG4gICAgdmFyIG5ld0F0dHJpYnV0aW9ucyA9ICcnO1xuICAgIHZhciBib3VuZHMgPSBtYXAuZ2V0Qm91bmRzKCk7XG4gICAgdmFyIHdyYXBwZWRCb3VuZHMgPSBsYXRMbmdCb3VuZHMoXG4gICAgICBib3VuZHMuZ2V0U291dGhXZXN0KCkud3JhcCgpLFxuICAgICAgYm91bmRzLmdldE5vcnRoRWFzdCgpLndyYXAoKVxuICAgICk7XG4gICAgdmFyIHpvb20gPSBtYXAuZ2V0Wm9vbSgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGRBdHRyaWJ1dGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBhdHRyaWJ1dGlvbiA9IG9sZEF0dHJpYnV0aW9uc1tpXTtcbiAgICAgIHZhciB0ZXh0ID0gYXR0cmlidXRpb24uYXR0cmlidXRpb247XG5cbiAgICAgIGlmICghbmV3QXR0cmlidXRpb25zLm1hdGNoKHRleHQpICYmIGF0dHJpYnV0aW9uLmJvdW5kcy5pbnRlcnNlY3RzKHdyYXBwZWRCb3VuZHMpICYmIHpvb20gPj0gYXR0cmlidXRpb24ubWluWm9vbSAmJiB6b29tIDw9IGF0dHJpYnV0aW9uLm1heFpvb20pIHtcbiAgICAgICAgbmV3QXR0cmlidXRpb25zICs9ICgnLCAnICsgdGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3QXR0cmlidXRpb25zID0gbmV3QXR0cmlidXRpb25zLnN1YnN0cigyKTtcbiAgICB2YXIgYXR0cmlidXRpb25FbGVtZW50ID0gbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5lc3JpLWR5bmFtaWMtYXR0cmlidXRpb24nKTtcblxuICAgIGF0dHJpYnV0aW9uRWxlbWVudC5pbm5lckhUTUwgPSBuZXdBdHRyaWJ1dGlvbnM7XG4gICAgYXR0cmlidXRpb25FbGVtZW50LnN0eWxlLm1heFdpZHRoID0gY2FsY0F0dHJpYnV0aW9uV2lkdGgobWFwKTtcblxuICAgIG1hcC5maXJlKCdhdHRyaWJ1dGlvbnVwZGF0ZWQnLCB7XG4gICAgICBhdHRyaWJ1dGlvbjogbmV3QXR0cmlidXRpb25zXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHZhciBFc3JpVXRpbCA9IHtcbiAgc2hhbGxvd0Nsb25lOiBzaGFsbG93Q2xvbmUsXG4gIHdhcm46IHdhcm4sXG4gIGNsZWFuVXJsOiBjbGVhblVybCxcbiAgaXNBcmNnaXNPbmxpbmU6IGlzQXJjZ2lzT25saW5lLFxuICBnZW9qc29uVHlwZVRvQXJjR0lTOiBnZW9qc29uVHlwZVRvQXJjR0lTLFxuICByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb246IHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbixcbiAgZ2VvanNvblRvQXJjR0lTOiBnZW9qc29uVG9BcmNHSVMsXG4gIGFyY2dpc1RvR2VvSlNPTjogYXJjZ2lzVG9HZW9KU09OLFxuICBib3VuZHNUb0V4dGVudDogYm91bmRzVG9FeHRlbnQsXG4gIGV4dGVudFRvQm91bmRzOiBleHRlbnRUb0JvdW5kcyxcbiAgY2FsY0F0dHJpYnV0aW9uV2lkdGg6IGNhbGNBdHRyaWJ1dGlvbldpZHRoLFxuICBzZXRFc3JpQXR0cmlidXRpb246IHNldEVzcmlBdHRyaWJ1dGlvbixcbiAgX2dldEF0dHJpYnV0aW9uRGF0YTogX2dldEF0dHJpYnV0aW9uRGF0YSxcbiAgX3VwZGF0ZU1hcEF0dHJpYnV0aW9uOiBfdXBkYXRlTWFwQXR0cmlidXRpb25cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEVzcmlVdGlsO1xuIiwiaW1wb3J0IHsgQ2xhc3MsIFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7Y29yc30gZnJvbSAnLi4vU3VwcG9ydCc7XG5pbXBvcnQge2NsZWFuVXJsfSBmcm9tICcuLi9VdGlsJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4uL1JlcXVlc3QnO1xuXG5leHBvcnQgdmFyIFRhc2sgPSBDbGFzcy5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBwcm94eTogZmFsc2UsXG4gICAgdXNlQ29yczogY29yc1xuICB9LFxuXG4gIC8vIEdlbmVyYXRlIGEgbWV0aG9kIGZvciBlYWNoIG1ldGhvZE5hbWU6cGFyYW1OYW1lIGluIHRoZSBzZXR0ZXJzIGZvciB0aGlzIHRhc2suXG4gIGdlbmVyYXRlU2V0dGVyOiBmdW5jdGlvbiAocGFyYW0sIGNvbnRleHQpIHtcbiAgICByZXR1cm4gVXRpbC5iaW5kKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdGhpcy5wYXJhbXNbcGFyYW1dID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAoZW5kcG9pbnQpIHtcbiAgICAvLyBlbmRwb2ludCBjYW4gYmUgZWl0aGVyIGEgdXJsIChhbmQgb3B0aW9ucykgZm9yIGFuIEFyY0dJUyBSZXN0IFNlcnZpY2Ugb3IgYW4gaW5zdGFuY2Ugb2YgRXNyaUxlYWZsZXQuU2VydmljZVxuICAgIGlmIChlbmRwb2ludC5yZXF1ZXN0ICYmIGVuZHBvaW50Lm9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX3NlcnZpY2UgPSBlbmRwb2ludDtcbiAgICAgIFV0aWwuc2V0T3B0aW9ucyh0aGlzLCBlbmRwb2ludC5vcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgVXRpbC5zZXRPcHRpb25zKHRoaXMsIGVuZHBvaW50KTtcbiAgICAgIHRoaXMub3B0aW9ucy51cmwgPSBjbGVhblVybChlbmRwb2ludC51cmwpO1xuICAgIH1cblxuICAgIC8vIGNsb25lIGRlZmF1bHQgcGFyYW1zIGludG8gdGhpcyBvYmplY3RcbiAgICB0aGlzLnBhcmFtcyA9IFV0aWwuZXh0ZW5kKHt9LCB0aGlzLnBhcmFtcyB8fCB7fSk7XG5cbiAgICAvLyBnZW5lcmF0ZSBzZXR0ZXIgbWV0aG9kcyBiYXNlZCBvbiB0aGUgc2V0dGVycyBvYmplY3QgaW1wbGltZW50ZWQgYSBjaGlsZCBjbGFzc1xuICAgIGlmICh0aGlzLnNldHRlcnMpIHtcbiAgICAgIGZvciAodmFyIHNldHRlciBpbiB0aGlzLnNldHRlcnMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5zZXR0ZXJzW3NldHRlcl07XG4gICAgICAgIHRoaXNbc2V0dGVyXSA9IHRoaXMuZ2VuZXJhdGVTZXR0ZXIocGFyYW0sIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0b2tlbjogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRoaXMuX3NlcnZpY2UpIHtcbiAgICAgIHRoaXMuX3NlcnZpY2UuYXV0aGVudGljYXRlKHRva2VuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJhbXMudG9rZW4gPSB0b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcmVxdWVzdDogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgaWYgKHRoaXMuX3NlcnZpY2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QodGhpcy5wYXRoLCB0aGlzLnBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdyZXF1ZXN0JywgdGhpcy5wYXRoLCB0aGlzLnBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICB9LFxuXG4gIF9yZXF1ZXN0OiBmdW5jdGlvbiAobWV0aG9kLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdmFyIHVybCA9ICh0aGlzLm9wdGlvbnMucHJveHkpID8gdGhpcy5vcHRpb25zLnByb3h5ICsgJz8nICsgdGhpcy5vcHRpb25zLnVybCArIHBhdGggOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aDtcblxuICAgIGlmICgobWV0aG9kID09PSAnZ2V0JyB8fCBtZXRob2QgPT09ICdyZXF1ZXN0JykgJiYgIXRoaXMub3B0aW9ucy51c2VDb3JzKSB7XG4gICAgICByZXR1cm4gUmVxdWVzdC5nZXQuSlNPTlAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gUmVxdWVzdFttZXRob2RdKHVybCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gdGFzayAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IFRhc2sob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRhc2s7XG4iLCJpbXBvcnQgeyBwb2ludCwgbGF0TG5nLCBMYXRMbmdCb3VuZHMsIExhdExuZywgR2VvSlNPTiB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5pbXBvcnQge1xuICB3YXJuLFxuICByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24sXG4gIGlzQXJjZ2lzT25saW5lLFxuICBleHRlbnRUb0JvdW5kcyxcbiAgYm91bmRzVG9FeHRlbnQsXG4gIGdlb2pzb25Ub0FyY0dJUyxcbiAgZ2VvanNvblR5cGVUb0FyY0dJU1xufSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBRdWVyeSA9IFRhc2suZXh0ZW5kKHtcbiAgc2V0dGVyczoge1xuICAgICdvZmZzZXQnOiAncmVzdWx0T2Zmc2V0JyxcbiAgICAnbGltaXQnOiAncmVzdWx0UmVjb3JkQ291bnQnLFxuICAgICdmaWVsZHMnOiAnb3V0RmllbGRzJyxcbiAgICAncHJlY2lzaW9uJzogJ2dlb21ldHJ5UHJlY2lzaW9uJyxcbiAgICAnZmVhdHVyZUlkcyc6ICdvYmplY3RJZHMnLFxuICAgICdyZXR1cm5HZW9tZXRyeSc6ICdyZXR1cm5HZW9tZXRyeScsXG4gICAgJ3Rva2VuJzogJ3Rva2VuJ1xuICB9LFxuXG4gIHBhdGg6ICdxdWVyeScsXG5cbiAgcGFyYW1zOiB7XG4gICAgcmV0dXJuR2VvbWV0cnk6IHRydWUsXG4gICAgd2hlcmU6ICcxPTEnLFxuICAgIG91dFNyOiA0MzI2LFxuICAgIG91dEZpZWxkczogJyonXG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgaXRzIHNoYXBlIGlzIHdob2xseSBjb250YWluZWQgd2l0aGluIHRoZSBzZWFyY2ggZ2VvbWV0cnkuIFZhbGlkIGZvciBhbGwgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIHdpdGhpbjogZnVuY3Rpb24gKGdlb21ldHJ5KSB7XG4gICAgdGhpcy5fc2V0R2VvbWV0cnkoZ2VvbWV0cnkpO1xuICAgIHRoaXMucGFyYW1zLnNwYXRpYWxSZWwgPSAnZXNyaVNwYXRpYWxSZWxDb250YWlucyc7IC8vIHRvIHRoZSBSRVNUIGFwaSB0aGlzIHJlYWRzIGdlb21ldHJ5ICoqY29udGFpbnMqKiBsYXllclxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIGFueSBzcGF0aWFsIHJlbGF0aW9uc2hpcCBpcyBmb3VuZC4gQXBwbGllcyB0byBhbGwgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIGludGVyc2VjdHM6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHRoaXMuX3NldEdlb21ldHJ5KGdlb21ldHJ5KTtcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsSW50ZXJzZWN0cyc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgaXRzIHNoYXBlIHdob2xseSBjb250YWlucyB0aGUgc2VhcmNoIGdlb21ldHJ5LiBWYWxpZCBmb3IgYWxsIHNoYXBlIHR5cGUgY29tYmluYXRpb25zLlxuICBjb250YWluczogZnVuY3Rpb24gKGdlb21ldHJ5KSB7XG4gICAgdGhpcy5fc2V0R2VvbWV0cnkoZ2VvbWV0cnkpO1xuICAgIHRoaXMucGFyYW1zLnNwYXRpYWxSZWwgPSAnZXNyaVNwYXRpYWxSZWxXaXRoaW4nOyAvLyB0byB0aGUgUkVTVCBhcGkgdGhpcyByZWFkcyBnZW9tZXRyeSAqKndpdGhpbioqIGxheWVyXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgaW50ZXJpb3JzIG9mIHRoZSB0d28gc2hhcGVzIGlzIG5vdCBlbXB0eSBhbmQgaGFzIGEgbG93ZXIgZGltZW5zaW9uIHRoYW4gdGhlIG1heGltdW0gZGltZW5zaW9uIG9mIHRoZSB0d28gc2hhcGVzLiBUd28gbGluZXMgdGhhdCBzaGFyZSBhbiBlbmRwb2ludCBpbiBjb21tb24gZG8gbm90IGNyb3NzLiBWYWxpZCBmb3IgTGluZS9MaW5lLCBMaW5lL0FyZWEsIE11bHRpLXBvaW50L0FyZWEsIGFuZCBNdWx0aS1wb2ludC9MaW5lIHNoYXBlIHR5cGUgY29tYmluYXRpb25zLlxuICBjcm9zc2VzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbENyb3NzZXMnO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSB0d28gc2hhcGVzIHNoYXJlIGEgY29tbW9uIGJvdW5kYXJ5LiBIb3dldmVyLCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBpbnRlcmlvcnMgb2YgdGhlIHR3byBzaGFwZXMgbXVzdCBiZSBlbXB0eS4gSW4gdGhlIFBvaW50L0xpbmUgY2FzZSwgdGhlIHBvaW50IG1heSB0b3VjaCBhbiBlbmRwb2ludCBvbmx5IG9mIHRoZSBsaW5lLiBBcHBsaWVzIHRvIGFsbCBjb21iaW5hdGlvbnMgZXhjZXB0IFBvaW50L1BvaW50LlxuICB0b3VjaGVzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbFRvdWNoZXMnO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBzaGFwZXMgcmVzdWx0cyBpbiBhbiBvYmplY3Qgb2YgdGhlIHNhbWUgZGltZW5zaW9uLCBidXQgZGlmZmVyZW50IGZyb20gYm90aCBvZiB0aGUgc2hhcGVzLiBBcHBsaWVzIHRvIEFyZWEvQXJlYSwgTGluZS9MaW5lLCBhbmQgTXVsdGktcG9pbnQvTXVsdGktcG9pbnQgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIG92ZXJsYXBzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbE92ZXJsYXBzJztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBSZXR1cm5zIGEgZmVhdHVyZSBpZiB0aGUgZW52ZWxvcGUgb2YgdGhlIHR3byBzaGFwZXMgaW50ZXJzZWN0cy5cbiAgYmJveEludGVyc2VjdHM6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHRoaXMuX3NldEdlb21ldHJ5KGdlb21ldHJ5KTtcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsRW52ZWxvcGVJbnRlcnNlY3RzJztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBpZiBzb21lb25lIGNhbiBoZWxwIGRlY2lwaGVyIHRoZSBBcmNPYmplY3RzIGV4cGxhbmF0aW9uIGFuZCB0cmFuc2xhdGUgdG8gcGxhaW4gc3BlYWssIHdlIHNob3VsZCBtZW50aW9uIHRoaXMgbWV0aG9kIGluIHRoZSBkb2NcbiAgaW5kZXhJbnRlcnNlY3RzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbEluZGV4SW50ZXJzZWN0cyc7IC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSBlbnZlbG9wZSBvZiB0aGUgcXVlcnkgZ2VvbWV0cnkgaW50ZXJzZWN0cyB0aGUgaW5kZXggZW50cnkgZm9yIHRoZSB0YXJnZXQgZ2VvbWV0cnlcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBvbmx5IHZhbGlkIGZvciBGZWF0dXJlIFNlcnZpY2VzIHJ1bm5pbmcgb24gQXJjR0lTIFNlcnZlciAxMC4zKyBvciBBcmNHSVMgT25saW5lXG4gIG5lYXJieTogZnVuY3Rpb24gKGxhdGxuZywgcmFkaXVzKSB7XG4gICAgbGF0bG5nID0gbGF0TG5nKGxhdGxuZyk7XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBbbGF0bG5nLmxuZywgbGF0bG5nLmxhdF07XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvaW50JztcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsSW50ZXJzZWN0cyc7XG4gICAgdGhpcy5wYXJhbXMudW5pdHMgPSAnZXNyaVNSVW5pdF9NZXRlcic7XG4gICAgdGhpcy5wYXJhbXMuZGlzdGFuY2UgPSByYWRpdXM7XG4gICAgdGhpcy5wYXJhbXMuaW5TciA9IDQzMjY7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgd2hlcmU6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAvLyBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcgZG91YmxlLXF1b3RlcyB0byBzaW5nbGUgcXVvdGVzLCBwYXNzIGFzIGlzLCBhbmQgcHJvdmlkZSBhIG1vcmUgaW5mb3JtYXRpdmUgbWVzc2FnZSBpZiBhIDQwMCBpcyBlbmNvdW50ZXJlZFxuICAgIHRoaXMucGFyYW1zLndoZXJlID0gc3RyaW5nO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGJldHdlZW46IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgdGhpcy5wYXJhbXMudGltZSA9IFtzdGFydC52YWx1ZU9mKCksIGVuZC52YWx1ZU9mKCldO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNpbXBsaWZ5OiBmdW5jdGlvbiAobWFwLCBmYWN0b3IpIHtcbiAgICB2YXIgbWFwV2lkdGggPSBNYXRoLmFicyhtYXAuZ2V0Qm91bmRzKCkuZ2V0V2VzdCgpIC0gbWFwLmdldEJvdW5kcygpLmdldEVhc3QoKSk7XG4gICAgdGhpcy5wYXJhbXMubWF4QWxsb3dhYmxlT2Zmc2V0ID0gKG1hcFdpZHRoIC8gbWFwLmdldFNpemUoKS55KSAqIGZhY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBvcmRlckJ5OiBmdW5jdGlvbiAoZmllbGROYW1lLCBvcmRlcikge1xuICAgIG9yZGVyID0gb3JkZXIgfHwgJ0FTQyc7XG4gICAgdGhpcy5wYXJhbXMub3JkZXJCeUZpZWxkcyA9ICh0aGlzLnBhcmFtcy5vcmRlckJ5RmllbGRzKSA/IHRoaXMucGFyYW1zLm9yZGVyQnlGaWVsZHMgKyAnLCcgOiAnJztcbiAgICB0aGlzLnBhcmFtcy5vcmRlckJ5RmllbGRzICs9IChbZmllbGROYW1lLCBvcmRlcl0pLmpvaW4oJyAnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBydW46IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG5cbiAgICAvLyBzZXJ2aWNlcyBob3N0ZWQgb24gQXJjR0lTIE9ubGluZSBhbmQgQXJjR0lTIFNlcnZlciAxMC4zLjErIHN1cHBvcnQgcmVxdWVzdGluZyBnZW9qc29uIGRpcmVjdGx5XG4gICAgaWYgKHRoaXMub3B0aW9ucy5pc01vZGVybiB8fCBpc0FyY2dpc09ubGluZSh0aGlzLm9wdGlvbnMudXJsKSkge1xuICAgICAgdGhpcy5wYXJhbXMuZiA9ICdnZW9qc29uJztcblxuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuX3RyYXBTUUxlcnJvcnMoZXJyb3IpO1xuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgICAgfSwgdGhpcyk7XG5cbiAgICAvLyBvdGhlcndpc2UgY29udmVydCBpdCBpbiB0aGUgY2FsbGJhY2sgdGhlbiBwYXNzIGl0IG9uXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICB0aGlzLl90cmFwU1FMZXJyb3JzKGVycm9yKTtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgKHJlc3BvbnNlICYmIHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbihyZXNwb25zZSkpLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH0sXG5cbiAgY291bnQ6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG4gICAgdGhpcy5wYXJhbXMucmV0dXJuQ291bnRPbmx5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgZXJyb3IsIChyZXNwb25zZSAmJiByZXNwb25zZS5jb3VudCksIHJlc3BvbnNlKTtcbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICBpZHM6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG4gICAgdGhpcy5wYXJhbXMucmV0dXJuSWRzT25seSA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIGVycm9yLCAocmVzcG9uc2UgJiYgcmVzcG9uc2Uub2JqZWN0SWRzKSwgcmVzcG9uc2UpO1xuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIC8vIG9ubHkgdmFsaWQgZm9yIEZlYXR1cmUgU2VydmljZXMgcnVubmluZyBvbiBBcmNHSVMgU2VydmVyIDEwLjMrIG9yIEFyY0dJUyBPbmxpbmVcbiAgYm91bmRzOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLl9jbGVhblBhcmFtcygpO1xuICAgIHRoaXMucGFyYW1zLnJldHVybkV4dGVudE9ubHkgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmV4dGVudCAmJiBleHRlbnRUb0JvdW5kcyhyZXNwb25zZS5leHRlbnQpKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIGV4dGVudFRvQm91bmRzKHJlc3BvbnNlLmV4dGVudCksIHJlc3BvbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0ge1xuICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIEJvdW5kcydcbiAgICAgICAgfTtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgbnVsbCwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIC8vIG9ubHkgdmFsaWQgZm9yIGltYWdlIHNlcnZpY2VzXG4gIHBpeGVsU2l6ZTogZnVuY3Rpb24gKHJhd1BvaW50KSB7XG4gICAgdmFyIGNhc3RQb2ludCA9IHBvaW50KHJhd1BvaW50KTtcbiAgICB0aGlzLnBhcmFtcy5waXhlbFNpemUgPSBbY2FzdFBvaW50LngsIGNhc3RQb2ludC55XTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBvbmx5IHZhbGlkIGZvciBtYXAgc2VydmljZXNcbiAgbGF5ZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgIHRoaXMucGF0aCA9IGxheWVyICsgJy9xdWVyeSc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgX3RyYXBTUUxlcnJvcnM6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICc0MDAnKSB7XG4gICAgICAgIHdhcm4oJ29uZSBjb21tb24gc3ludGF4IGVycm9yIGluIHF1ZXJ5IHJlcXVlc3RzIGlzIGVuY2FzaW5nIHN0cmluZyB2YWx1ZXMgaW4gZG91YmxlIHF1b3RlcyBpbnN0ZWFkIG9mIHNpbmdsZSBxdW90ZXMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX2NsZWFuUGFyYW1zOiBmdW5jdGlvbiAoKSB7XG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLnJldHVybklkc09ubHk7XG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLnJldHVybkV4dGVudE9ubHk7XG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLnJldHVybkNvdW50T25seTtcbiAgfSxcblxuICBfc2V0R2VvbWV0cnk6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHRoaXMucGFyYW1zLmluU3IgPSA0MzI2O1xuXG4gICAgLy8gY29udmVydCBib3VuZHMgdG8gZXh0ZW50IGFuZCBmaW5pc2hcbiAgICBpZiAoZ2VvbWV0cnkgaW5zdGFuY2VvZiBMYXRMbmdCb3VuZHMpIHtcbiAgICAgIC8vIHNldCBnZW9tZXRyeSArIGdlb21ldHJ5VHlwZVxuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBib3VuZHNUb0V4dGVudChnZW9tZXRyeSk7XG4gICAgICB0aGlzLnBhcmFtcy5nZW9tZXRyeVR5cGUgPSAnZXNyaUdlb21ldHJ5RW52ZWxvcGUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNvbnZlcnQgTC5NYXJrZXIgPiBMLkxhdExuZ1xuICAgIGlmIChnZW9tZXRyeS5nZXRMYXRMbmcpIHtcbiAgICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnkuZ2V0TGF0TG5nKCk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBMLkxhdExuZyB0byBhIGdlb2pzb24gcG9pbnQgYW5kIGNvbnRpbnVlO1xuICAgIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIExhdExuZykge1xuICAgICAgZ2VvbWV0cnkgPSB7XG4gICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBbZ2VvbWV0cnkubG5nLCBnZW9tZXRyeS5sYXRdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGhhbmRsZSBMLkdlb0pTT04sIHB1bGwgb3V0IHRoZSBmaXJzdCBnZW9tZXRyeVxuICAgIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIEdlb0pTT04pIHtcbiAgICAgIC8vIHJlYXNzaWduIGdlb21ldHJ5IHRvIHRoZSBHZW9KU09OIHZhbHVlICAod2UgYXJlIGFzc3VtaW5nIHRoYXQgb25seSBvbmUgZmVhdHVyZSBpcyBwcmVzZW50KVxuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZXRMYXllcnMoKVswXS5mZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBnZW9qc29uVG9BcmNHSVMoZ2VvbWV0cnkpO1xuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gZ2VvanNvblR5cGVUb0FyY0dJUyhnZW9tZXRyeS50eXBlKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgTC5Qb2x5bGluZSBhbmQgTC5Qb2x5Z29uXG4gICAgaWYgKGdlb21ldHJ5LnRvR2VvSlNPTikge1xuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS50b0dlb0pTT04oKTtcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgR2VvSlNPTiBmZWF0dXJlIGJ5IHB1bGxpbmcgb3V0IHRoZSBnZW9tZXRyeVxuICAgIGlmIChnZW9tZXRyeS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgIC8vIGdldCB0aGUgZ2VvbWV0cnkgb2YgdGhlIGdlb2pzb24gZmVhdHVyZVxuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZW9tZXRyeTtcbiAgICB9XG5cbiAgICAvLyBjb25maXJtIHRoYXQgb3VyIEdlb0pTT04gaXMgYSBwb2ludCwgbGluZSBvciBwb2x5Z29uXG4gICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcgfHwgZ2VvbWV0cnkudHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJyB8fCBnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBnZW9qc29uVG9BcmNHSVMoZ2VvbWV0cnkpO1xuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gZ2VvanNvblR5cGVUb0FyY0dJUyhnZW9tZXRyeS50eXBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB3YXJuIHRoZSB1c2VyIGlmIHdlIGhhdm4ndCBmb3VuZCBhbiBhcHByb3ByaWF0ZSBvYmplY3RcbiAgICB3YXJuKCdpbnZhbGlkIGdlb21ldHJ5IHBhc3NlZCB0byBzcGF0aWFsIHF1ZXJ5LiBTaG91bGQgYmUgTC5MYXRMbmcsIEwuTGF0TG5nQm91bmRzLCBMLk1hcmtlciBvciBhIEdlb0pTT04gUG9pbnQsIExpbmUsIFBvbHlnb24gb3IgTXVsdGlQb2x5Z29uIG9iamVjdCcpO1xuXG4gICAgcmV0dXJuO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5IChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgUXVlcnkob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHF1ZXJ5O1xuIiwiaW1wb3J0IHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5pbXBvcnQgeyByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBGaW5kID0gVGFzay5leHRlbmQoe1xuICBzZXR0ZXJzOiB7XG4gICAgLy8gbWV0aG9kIG5hbWUgPiBwYXJhbSBuYW1lXG4gICAgJ2NvbnRhaW5zJzogJ2NvbnRhaW5zJyxcbiAgICAndGV4dCc6ICdzZWFyY2hUZXh0JyxcbiAgICAnZmllbGRzJzogJ3NlYXJjaEZpZWxkcycsIC8vIGRlbm90ZSBhbiBhcnJheSBvciBzaW5nbGUgc3RyaW5nXG4gICAgJ3NwYXRpYWxSZWZlcmVuY2UnOiAnc3InLFxuICAgICdzcic6ICdzcicsXG4gICAgJ2xheWVycyc6ICdsYXllcnMnLFxuICAgICdyZXR1cm5HZW9tZXRyeSc6ICdyZXR1cm5HZW9tZXRyeScsXG4gICAgJ21heEFsbG93YWJsZU9mZnNldCc6ICdtYXhBbGxvd2FibGVPZmZzZXQnLFxuICAgICdwcmVjaXNpb24nOiAnZ2VvbWV0cnlQcmVjaXNpb24nLFxuICAgICdkeW5hbWljTGF5ZXJzJzogJ2R5bmFtaWNMYXllcnMnLFxuICAgICdyZXR1cm5aJzogJ3JldHVyblonLFxuICAgICdyZXR1cm5NJzogJ3JldHVybk0nLFxuICAgICdnZGJWZXJzaW9uJzogJ2dkYlZlcnNpb24nLFxuICAgICd0b2tlbic6ICd0b2tlbidcbiAgfSxcblxuICBwYXRoOiAnZmluZCcsXG5cbiAgcGFyYW1zOiB7XG4gICAgc3I6IDQzMjYsXG4gICAgY29udGFpbnM6IHRydWUsXG4gICAgcmV0dXJuR2VvbWV0cnk6IHRydWUsXG4gICAgcmV0dXJuWjogdHJ1ZSxcbiAgICByZXR1cm5NOiBmYWxzZVxuICB9LFxuXG4gIGxheWVyRGVmczogZnVuY3Rpb24gKGlkLCB3aGVyZSkge1xuICAgIHRoaXMucGFyYW1zLmxheWVyRGVmcyA9ICh0aGlzLnBhcmFtcy5sYXllckRlZnMpID8gdGhpcy5wYXJhbXMubGF5ZXJEZWZzICsgJzsnIDogJyc7XG4gICAgdGhpcy5wYXJhbXMubGF5ZXJEZWZzICs9IChbaWQsIHdoZXJlXSkuam9pbignOicpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNpbXBsaWZ5OiBmdW5jdGlvbiAobWFwLCBmYWN0b3IpIHtcbiAgICB2YXIgbWFwV2lkdGggPSBNYXRoLmFicyhtYXAuZ2V0Qm91bmRzKCkuZ2V0V2VzdCgpIC0gbWFwLmdldEJvdW5kcygpLmdldEVhc3QoKSk7XG4gICAgdGhpcy5wYXJhbXMubWF4QWxsb3dhYmxlT2Zmc2V0ID0gKG1hcFdpZHRoIC8gbWFwLmdldFNpemUoKS55KSAqIGZhY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBydW46IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgKHJlc3BvbnNlICYmIHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbihyZXNwb25zZSkpLCByZXNwb25zZSk7XG4gICAgfSwgY29udGV4dCk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZmluZCAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEZpbmQob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZpbmQ7XG4iLCJpbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi9UYXNrJztcblxuZXhwb3J0IHZhciBJZGVudGlmeSA9IFRhc2suZXh0ZW5kKHtcbiAgcGF0aDogJ2lkZW50aWZ5JyxcblxuICBiZXR3ZWVuOiBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgIHRoaXMucGFyYW1zLnRpbWUgPSBbc3RhcnQudmFsdWVPZigpLCBlbmQudmFsdWVPZigpXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeSAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IElkZW50aWZ5KG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpZGVudGlmeTtcbiIsImltcG9ydCB7IGxhdExuZyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgSWRlbnRpZnkgfSBmcm9tICcuL0lkZW50aWZ5JztcbmltcG9ydCB7IGJvdW5kc1RvRXh0ZW50LCByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBJZGVudGlmeUZlYXR1cmVzID0gSWRlbnRpZnkuZXh0ZW5kKHtcbiAgc2V0dGVyczoge1xuICAgICdsYXllcnMnOiAnbGF5ZXJzJyxcbiAgICAncHJlY2lzaW9uJzogJ2dlb21ldHJ5UHJlY2lzaW9uJyxcbiAgICAndG9sZXJhbmNlJzogJ3RvbGVyYW5jZScsXG4gICAgJ3JldHVybkdlb21ldHJ5JzogJ3JldHVybkdlb21ldHJ5J1xuICB9LFxuXG4gIHBhcmFtczoge1xuICAgIHNyOiA0MzI2LFxuICAgIGxheWVyczogJ2FsbCcsXG4gICAgdG9sZXJhbmNlOiAzLFxuICAgIHJldHVybkdlb21ldHJ5OiB0cnVlXG4gIH0sXG5cbiAgb246IGZ1bmN0aW9uIChtYXApIHtcbiAgICB2YXIgZXh0ZW50ID0gYm91bmRzVG9FeHRlbnQobWFwLmdldEJvdW5kcygpKTtcbiAgICB2YXIgc2l6ZSA9IG1hcC5nZXRTaXplKCk7XG4gICAgdGhpcy5wYXJhbXMuaW1hZ2VEaXNwbGF5ID0gW3NpemUueCwgc2l6ZS55LCA5Nl07XG4gICAgdGhpcy5wYXJhbXMubWFwRXh0ZW50ID0gW2V4dGVudC54bWluLCBleHRlbnQueW1pbiwgZXh0ZW50LnhtYXgsIGV4dGVudC55bWF4XTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBhdDogZnVuY3Rpb24gKGxhdGxuZykge1xuICAgIGxhdGxuZyA9IGxhdExuZyhsYXRsbmcpO1xuICAgIHRoaXMucGFyYW1zLmdlb21ldHJ5ID0gW2xhdGxuZy5sbmcsIGxhdGxuZy5sYXRdO1xuICAgIHRoaXMucGFyYW1zLmdlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlQb2ludCc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgbGF5ZXJEZWY6IGZ1bmN0aW9uIChpZCwgd2hlcmUpIHtcbiAgICB0aGlzLnBhcmFtcy5sYXllckRlZnMgPSAodGhpcy5wYXJhbXMubGF5ZXJEZWZzKSA/IHRoaXMucGFyYW1zLmxheWVyRGVmcyArICc7JyA6ICcnO1xuICAgIHRoaXMucGFyYW1zLmxheWVyRGVmcyArPSAoW2lkLCB3aGVyZV0pLmpvaW4oJzonKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBzaW1wbGlmeTogZnVuY3Rpb24gKG1hcCwgZmFjdG9yKSB7XG4gICAgdmFyIG1hcFdpZHRoID0gTWF0aC5hYnMobWFwLmdldEJvdW5kcygpLmdldFdlc3QoKSAtIG1hcC5nZXRCb3VuZHMoKS5nZXRFYXN0KCkpO1xuICAgIHRoaXMucGFyYW1zLm1heEFsbG93YWJsZU9mZnNldCA9IChtYXBXaWR0aCAvIG1hcC5nZXRTaXplKCkueSkgKiBmYWN0b3I7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcnVuOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIC8vIGltbWVkaWF0ZWx5IGludm9rZSB3aXRoIGFuIGVycm9yXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgdW5kZWZpbmVkLCByZXNwb25zZSk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgLy8gb2sgbm8gZXJyb3IgbGV0cyBqdXN0IGFzc3VtZSB3ZSBoYXZlIGZlYXR1cmVzLi4uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZmVhdHVyZUNvbGxlY3Rpb24gPSByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24ocmVzcG9uc2UpO1xuICAgICAgICByZXNwb25zZS5yZXN1bHRzID0gcmVzcG9uc2UucmVzdWx0cy5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzW2ldO1xuICAgICAgICAgIGZlYXR1cmUubGF5ZXJJZCA9IHJlc3BvbnNlLnJlc3VsdHNbaV0ubGF5ZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIHVuZGVmaW5lZCwgZmVhdHVyZUNvbGxlY3Rpb24sIHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeUZlYXR1cmVzIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgSWRlbnRpZnlGZWF0dXJlcyhvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaWRlbnRpZnlGZWF0dXJlcztcbiIsImltcG9ydCB7IGxhdExuZyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgSWRlbnRpZnkgfSBmcm9tICcuL0lkZW50aWZ5JztcbmltcG9ydCB7IHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbiB9IGZyb20gJy4uL1V0aWwnO1xuXG5leHBvcnQgdmFyIElkZW50aWZ5SW1hZ2UgPSBJZGVudGlmeS5leHRlbmQoe1xuICBzZXR0ZXJzOiB7XG4gICAgJ3NldE1vc2FpY1J1bGUnOiAnbW9zYWljUnVsZScsXG4gICAgJ3NldFJlbmRlcmluZ1J1bGUnOiAncmVuZGVyaW5nUnVsZScsXG4gICAgJ3NldFBpeGVsU2l6ZSc6ICdwaXhlbFNpemUnLFxuICAgICdyZXR1cm5DYXRhbG9nSXRlbXMnOiAncmV0dXJuQ2F0YWxvZ0l0ZW1zJyxcbiAgICAncmV0dXJuR2VvbWV0cnknOiAncmV0dXJuR2VvbWV0cnknXG4gIH0sXG5cbiAgcGFyYW1zOiB7XG4gICAgcmV0dXJuR2VvbWV0cnk6IGZhbHNlXG4gIH0sXG5cbiAgYXQ6IGZ1bmN0aW9uIChsYXRsbmcpIHtcbiAgICBsYXRsbmcgPSBsYXRMbmcobGF0bG5nKTtcbiAgICB0aGlzLnBhcmFtcy5nZW9tZXRyeSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHg6IGxhdGxuZy5sbmcsXG4gICAgICB5OiBsYXRsbmcubGF0LFxuICAgICAgc3BhdGlhbFJlZmVyZW5jZToge1xuICAgICAgICB3a2lkOiA0MzI2XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvaW50JztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRNb3NhaWNSdWxlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLm1vc2FpY1J1bGU7XG4gIH0sXG5cbiAgZ2V0UmVuZGVyaW5nUnVsZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5yZW5kZXJpbmdSdWxlO1xuICB9LFxuXG4gIGdldFBpeGVsU2l6ZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5waXhlbFNpemU7XG4gIH0sXG5cbiAgcnVuOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIChyZXNwb25zZSAmJiB0aGlzLl9yZXNwb25zZVRvR2VvSlNPTihyZXNwb25zZSkpLCByZXNwb25zZSk7XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgLy8gZ2V0IHBpeGVsIGRhdGEgYW5kIHJldHVybiBhcyBnZW9KU09OIHBvaW50XG4gIC8vIHBvcHVsYXRlIGNhdGFsb2cgaXRlbXMgKGlmIGFueSlcbiAgLy8gbWVyZ2luZyBpbiBhbnkgY2F0YWxvZ0l0ZW1WaXNpYmlsaXRpZXMgYXMgYSBwcm9wZXJ5IG9mIGVhY2ggZmVhdHVyZVxuICBfcmVzcG9uc2VUb0dlb0pTT046IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgIHZhciBsb2NhdGlvbiA9IHJlc3BvbnNlLmxvY2F0aW9uO1xuICAgIHZhciBjYXRhbG9nSXRlbXMgPSByZXNwb25zZS5jYXRhbG9nSXRlbXM7XG4gICAgdmFyIGNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzID0gcmVzcG9uc2UuY2F0YWxvZ0l0ZW1WaXNpYmlsaXRpZXM7XG4gICAgdmFyIGdlb0pTT04gPSB7XG4gICAgICAncGl4ZWwnOiB7XG4gICAgICAgICd0eXBlJzogJ0ZlYXR1cmUnLFxuICAgICAgICAnZ2VvbWV0cnknOiB7XG4gICAgICAgICAgJ3R5cGUnOiAnUG9pbnQnLFxuICAgICAgICAgICdjb29yZGluYXRlcyc6IFtsb2NhdGlvbi54LCBsb2NhdGlvbi55XVxuICAgICAgICB9LFxuICAgICAgICAnY3JzJzoge1xuICAgICAgICAgICd0eXBlJzogJ0VQU0cnLFxuICAgICAgICAgICdwcm9wZXJ0aWVzJzoge1xuICAgICAgICAgICAgJ2NvZGUnOiBsb2NhdGlvbi5zcGF0aWFsUmVmZXJlbmNlLndraWRcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdwcm9wZXJ0aWVzJzoge1xuICAgICAgICAgICdPQkpFQ1RJRCc6IHJlc3BvbnNlLm9iamVjdElkLFxuICAgICAgICAgICduYW1lJzogcmVzcG9uc2UubmFtZSxcbiAgICAgICAgICAndmFsdWUnOiByZXNwb25zZS52YWx1ZVxuICAgICAgICB9LFxuICAgICAgICAnaWQnOiByZXNwb25zZS5vYmplY3RJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAocmVzcG9uc2UucHJvcGVydGllcyAmJiByZXNwb25zZS5wcm9wZXJ0aWVzLlZhbHVlcykge1xuICAgICAgZ2VvSlNPTi5waXhlbC5wcm9wZXJ0aWVzLnZhbHVlcyA9IHJlc3BvbnNlLnByb3BlcnRpZXMuVmFsdWVzO1xuICAgIH1cblxuICAgIGlmIChjYXRhbG9nSXRlbXMgJiYgY2F0YWxvZ0l0ZW1zLmZlYXR1cmVzKSB7XG4gICAgICBnZW9KU09OLmNhdGFsb2dJdGVtcyA9IHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbihjYXRhbG9nSXRlbXMpO1xuICAgICAgaWYgKGNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzICYmIGNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzLmxlbmd0aCA9PT0gZ2VvSlNPTi5jYXRhbG9nSXRlbXMuZmVhdHVyZXMubGVuZ3RoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBjYXRhbG9nSXRlbVZpc2liaWxpdGllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGdlb0pTT04uY2F0YWxvZ0l0ZW1zLmZlYXR1cmVzW2ldLnByb3BlcnRpZXMuY2F0YWxvZ0l0ZW1WaXNpYmlsaXR5ID0gY2F0YWxvZ0l0ZW1WaXNpYmlsaXRpZXNbaV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdlb0pTT047XG4gIH1cblxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeUltYWdlIChwYXJhbXMpIHtcbiAgcmV0dXJuIG5ldyBJZGVudGlmeUltYWdlKHBhcmFtcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlkZW50aWZ5SW1hZ2U7XG4iLCJpbXBvcnQgeyBVdGlsLCBFdmVudGVkIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQge2NvcnN9IGZyb20gJy4uL1N1cHBvcnQnO1xuaW1wb3J0IHtjbGVhblVybH0gZnJvbSAnLi4vVXRpbCc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi9SZXF1ZXN0JztcblxuZXhwb3J0IHZhciBTZXJ2aWNlID0gRXZlbnRlZC5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBwcm94eTogZmFsc2UsXG4gICAgdXNlQ29yczogY29ycyxcbiAgICB0aW1lb3V0OiAwXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLl9yZXF1ZXN0UXVldWUgPSBbXTtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGluZyA9IGZhbHNlO1xuICAgIFV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLm9wdGlvbnMudXJsID0gY2xlYW5VcmwodGhpcy5vcHRpb25zLnVybCk7XG4gIH0sXG5cbiAgZ2V0OiBmdW5jdGlvbiAocGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdnZXQnLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgfSxcblxuICBwb3N0OiBmdW5jdGlvbiAocGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdwb3N0JywgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH0sXG5cbiAgcmVxdWVzdDogZnVuY3Rpb24gKHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgncmVxdWVzdCcsIHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICB9LFxuXG4gIG1ldGFkYXRhOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnZ2V0JywgJycsIHt9LCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH0sXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGluZyA9IGZhbHNlO1xuICAgIHRoaXMub3B0aW9ucy50b2tlbiA9IHRva2VuO1xuICAgIHRoaXMuX3J1blF1ZXVlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0VGltZW91dDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudGltZW91dDtcbiAgfSxcblxuICBzZXRUaW1lb3V0OiBmdW5jdGlvbiAodGltZW91dCkge1xuICAgIHRoaXMub3B0aW9ucy50aW1lb3V0ID0gdGltZW91dDtcbiAgfSxcblxuICBfcmVxdWVzdDogZnVuY3Rpb24gKG1ldGhvZCwgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuZmlyZSgncmVxdWVzdHN0YXJ0Jywge1xuICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aCxcbiAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgbWV0aG9kOiBtZXRob2RcbiAgICB9LCB0cnVlKTtcblxuICAgIHZhciB3cmFwcGVkQ2FsbGJhY2sgPSB0aGlzLl9jcmVhdGVTZXJ2aWNlQ2FsbGJhY2sobWV0aG9kLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHBhcmFtcy50b2tlbiA9IHRoaXMub3B0aW9ucy50b2tlbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYXV0aGVudGljYXRpbmcpIHtcbiAgICAgIHRoaXMuX3JlcXVlc3RRdWV1ZS5wdXNoKFttZXRob2QsIHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHRdKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVybCA9ICh0aGlzLm9wdGlvbnMucHJveHkpID8gdGhpcy5vcHRpb25zLnByb3h5ICsgJz8nICsgdGhpcy5vcHRpb25zLnVybCArIHBhdGggOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aDtcblxuICAgICAgaWYgKChtZXRob2QgPT09ICdnZXQnIHx8IG1ldGhvZCA9PT0gJ3JlcXVlc3QnKSAmJiAhdGhpcy5vcHRpb25zLnVzZUNvcnMpIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3QuZ2V0LkpTT05QKHVybCwgcGFyYW1zLCB3cmFwcGVkQ2FsbGJhY2ssIGNvbnRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3RbbWV0aG9kXSh1cmwsIHBhcmFtcywgd3JhcHBlZENhbGxiYWNrLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX2NyZWF0ZVNlcnZpY2VDYWxsYmFjazogZnVuY3Rpb24gKG1ldGhvZCwgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiBVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgaWYgKGVycm9yICYmIChlcnJvci5jb2RlID09PSA0OTkgfHwgZXJyb3IuY29kZSA9PT0gNDk4KSkge1xuICAgICAgICB0aGlzLl9hdXRoZW50aWNhdGluZyA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fcmVxdWVzdFF1ZXVlLnB1c2goW21ldGhvZCwgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dF0pO1xuXG4gICAgICAgIC8vIGZpcmUgYW4gZXZlbnQgZm9yIHVzZXJzIHRvIGhhbmRsZSBhbmQgcmUtYXV0aGVudGljYXRlXG4gICAgICAgIHRoaXMuZmlyZSgnYXV0aGVudGljYXRpb25yZXF1aXJlZCcsIHtcbiAgICAgICAgICBhdXRoZW50aWNhdGU6IFV0aWwuYmluZCh0aGlzLmF1dGhlbnRpY2F0ZSwgdGhpcylcbiAgICAgICAgfSwgdHJ1ZSk7XG5cbiAgICAgICAgLy8gaWYgdGhlIHVzZXIgaGFzIGFjY2VzcyB0byBhIGNhbGxiYWNrIHRoZXkgY2FuIGhhbmRsZSB0aGUgYXV0aCBlcnJvclxuICAgICAgICBlcnJvci5hdXRoZW50aWNhdGUgPSBVdGlsLmJpbmQodGhpcy5hdXRoZW50aWNhdGUsIHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSk7XG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICB0aGlzLmZpcmUoJ3JlcXVlc3RlcnJvcicsIHtcbiAgICAgICAgICB1cmw6IHRoaXMub3B0aW9ucy51cmwgKyBwYXRoLFxuICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgY29kZTogZXJyb3IuY29kZSxcbiAgICAgICAgICBtZXRob2Q6IG1ldGhvZFxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlyZSgncmVxdWVzdHN1Y2Nlc3MnLCB7XG4gICAgICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aCxcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2UsXG4gICAgICAgICAgbWV0aG9kOiBtZXRob2RcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlyZSgncmVxdWVzdGVuZCcsIHtcbiAgICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aCxcbiAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgIG1ldGhvZDogbWV0aG9kXG4gICAgICB9LCB0cnVlKTtcbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICBfcnVuUXVldWU6IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5fcmVxdWVzdFF1ZXVlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgcmVxdWVzdCA9IHRoaXMuX3JlcXVlc3RRdWV1ZVtpXTtcbiAgICAgIHZhciBtZXRob2QgPSByZXF1ZXN0LnNoaWZ0KCk7XG4gICAgICB0aGlzW21ldGhvZF0uYXBwbHkodGhpcywgcmVxdWVzdCk7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RRdWV1ZSA9IFtdO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2UgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBTZXJ2aWNlKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzZXJ2aWNlO1xuIiwiaW1wb3J0IHsgU2VydmljZSB9IGZyb20gJy4vU2VydmljZSc7XG5pbXBvcnQgaWRlbnRpZnlGZWF0dXJlcyBmcm9tICcuLi9UYXNrcy9JZGVudGlmeUZlYXR1cmVzJztcbmltcG9ydCBxdWVyeSBmcm9tICcuLi9UYXNrcy9RdWVyeSc7XG5pbXBvcnQgZmluZCBmcm9tICcuLi9UYXNrcy9GaW5kJztcblxuZXhwb3J0IHZhciBNYXBTZXJ2aWNlID0gU2VydmljZS5leHRlbmQoe1xuXG4gIGlkZW50aWZ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlkZW50aWZ5RmVhdHVyZXModGhpcyk7XG4gIH0sXG5cbiAgZmluZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmaW5kKHRoaXMpO1xuICB9LFxuXG4gIHF1ZXJ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHF1ZXJ5KHRoaXMpO1xuICB9XG5cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFwU2VydmljZSAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IE1hcFNlcnZpY2Uob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1hcFNlcnZpY2U7XG4iLCJpbXBvcnQgeyBTZXJ2aWNlIH0gZnJvbSAnLi9TZXJ2aWNlJztcbmltcG9ydCBpZGVudGlmeUltYWdlIGZyb20gJy4uL1Rhc2tzL0lkZW50aWZ5SW1hZ2UnO1xuaW1wb3J0IHF1ZXJ5IGZyb20gJy4uL1Rhc2tzL1F1ZXJ5JztcblxuZXhwb3J0IHZhciBJbWFnZVNlcnZpY2UgPSBTZXJ2aWNlLmV4dGVuZCh7XG5cbiAgcXVlcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcXVlcnkodGhpcyk7XG4gIH0sXG5cbiAgaWRlbnRpZnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaWRlbnRpZnlJbWFnZSh0aGlzKTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZVNlcnZpY2UgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBJbWFnZVNlcnZpY2Uob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGltYWdlU2VydmljZTtcbiIsImltcG9ydCB7IFNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2UnO1xuaW1wb3J0IHF1ZXJ5IGZyb20gJy4uL1Rhc2tzL1F1ZXJ5JztcbmltcG9ydCB7IGdlb2pzb25Ub0FyY0dJUyB9IGZyb20gJy4uL1V0aWwnO1xuXG5leHBvcnQgdmFyIEZlYXR1cmVMYXllclNlcnZpY2UgPSBTZXJ2aWNlLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIGlkQXR0cmlidXRlOiAnT0JKRUNUSUQnXG4gIH0sXG5cbiAgcXVlcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcXVlcnkodGhpcyk7XG4gIH0sXG5cbiAgYWRkRmVhdHVyZTogZnVuY3Rpb24gKGZlYXR1cmUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgZGVsZXRlIGZlYXR1cmUuaWQ7XG5cbiAgICBmZWF0dXJlID0gZ2VvanNvblRvQXJjR0lTKGZlYXR1cmUpO1xuXG4gICAgcmV0dXJuIHRoaXMucG9zdCgnYWRkRmVhdHVyZXMnLCB7XG4gICAgICBmZWF0dXJlczogW2ZlYXR1cmVdXG4gICAgfSwgZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXNwb25zZSAmJiByZXNwb25zZS5hZGRSZXN1bHRzKSA/IHJlc3BvbnNlLmFkZFJlc3VsdHNbMF0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciB8fCByZXNwb25zZS5hZGRSZXN1bHRzWzBdLmVycm9yLCByZXN1bHQpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIHVwZGF0ZUZlYXR1cmU6IGZ1bmN0aW9uIChmZWF0dXJlLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIGZlYXR1cmUgPSBnZW9qc29uVG9BcmNHSVMoZmVhdHVyZSwgdGhpcy5vcHRpb25zLmlkQXR0cmlidXRlKTtcblxuICAgIHJldHVybiB0aGlzLnBvc3QoJ3VwZGF0ZUZlYXR1cmVzJywge1xuICAgICAgZmVhdHVyZXM6IFtmZWF0dXJlXVxuICAgIH0sIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzcG9uc2UgJiYgcmVzcG9uc2UudXBkYXRlUmVzdWx0cykgPyByZXNwb25zZS51cGRhdGVSZXN1bHRzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IgfHwgcmVzcG9uc2UudXBkYXRlUmVzdWx0c1swXS5lcnJvciwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICBkZWxldGVGZWF0dXJlOiBmdW5jdGlvbiAoaWQsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMucG9zdCgnZGVsZXRlRmVhdHVyZXMnLCB7XG4gICAgICBvYmplY3RJZHM6IGlkXG4gICAgfSwgZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXNwb25zZSAmJiByZXNwb25zZS5kZWxldGVSZXN1bHRzKSA/IHJlc3BvbnNlLmRlbGV0ZVJlc3VsdHNbMF0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciB8fCByZXNwb25zZS5kZWxldGVSZXN1bHRzWzBdLmVycm9yLCByZXN1bHQpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIGRlbGV0ZUZlYXR1cmVzOiBmdW5jdGlvbiAoaWRzLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnBvc3QoJ2RlbGV0ZUZlYXR1cmVzJywge1xuICAgICAgb2JqZWN0SWRzOiBpZHNcbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAvLyBwYXNzIGJhY2sgdGhlIGVudGlyZSBhcnJheVxuICAgICAgdmFyIHJlc3VsdCA9IChyZXNwb25zZSAmJiByZXNwb25zZS5kZWxldGVSZXN1bHRzKSA/IHJlc3BvbnNlLmRlbGV0ZVJlc3VsdHMgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciB8fCByZXNwb25zZS5kZWxldGVSZXN1bHRzWzBdLmVycm9yLCByZXN1bHQpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZlYXR1cmVMYXllclNlcnZpY2UgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBGZWF0dXJlTGF5ZXJTZXJ2aWNlKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmZWF0dXJlTGF5ZXJTZXJ2aWNlO1xuIiwiaW1wb3J0IHsgVGlsZUxheWVyLCBVdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBwb2ludGVyRXZlbnRzIH0gZnJvbSAnLi4vU3VwcG9ydCc7XG5pbXBvcnQge1xuICBzZXRFc3JpQXR0cmlidXRpb24sXG4gIF9nZXRBdHRyaWJ1dGlvbkRhdGEsXG4gIF91cGRhdGVNYXBBdHRyaWJ1dGlvblxufSBmcm9tICcuLi9VdGlsJztcblxudmFyIHRpbGVQcm90b2NvbCA9ICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgIT09ICdodHRwczonKSA/ICdodHRwOicgOiAnaHR0cHM6JztcblxuZXhwb3J0IHZhciBCYXNlbWFwTGF5ZXIgPSBUaWxlTGF5ZXIuZXh0ZW5kKHtcbiAgc3RhdGljczoge1xuICAgIFRJTEVTOiB7XG4gICAgICBTdHJlZXRzOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9TdHJlZXRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTksXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ1VTR1MsIE5PQUEnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uVXJsOiAnaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9Xb3JsZF9TdHJlZXRfTWFwJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgVG9wb2dyYXBoaWM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX1RvcG9fTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTksXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ1VTR1MsIE5PQUEnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uVXJsOiAnaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9Xb3JsZF9Ub3BvX01hcCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIE9jZWFuczoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vYXJjZ2lzL3Jlc3Qvc2VydmljZXMvT2NlYW4vV29ybGRfT2NlYW5fQmFzZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdVU0dTLCBOT0FBJyxcbiAgICAgICAgICBhdHRyaWJ1dGlvblVybDogJ2h0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vT2NlYW5fQmFzZW1hcCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIE9jZWFuc0xhYmVsczoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vYXJjZ2lzL3Jlc3Qvc2VydmljZXMvT2NlYW4vV29ybGRfT2NlYW5fUmVmZXJlbmNlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTYsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBwYW5lOiAocG9pbnRlckV2ZW50cykgPyAnZXNyaS1sYWJlbHMnIDogJ3RpbGVQYW5lJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgTmF0aW9uYWxHZW9ncmFwaGljOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9OYXRHZW9fV29ybGRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTYsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ05hdGlvbmFsIEdlb2dyYXBoaWMsIERlTG9ybWUsIEhFUkUsIFVORVAtV0NNQywgVVNHUywgTkFTQSwgRVNBLCBNRVRJLCBOUkNBTiwgR0VCQ08sIE5PQUEsIGluY3JlbWVudCBQIENvcnAuJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgRGFya0dyYXk6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL0NhbnZhcy9Xb3JsZF9EYXJrX0dyYXlfQmFzZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdIRVJFLCBEZUxvcm1lLCBNYXBteUluZGlhLCAmY29weTsgT3BlblN0cmVldE1hcCBjb250cmlidXRvcnMnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBEYXJrR3JheUxhYmVsczoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvQ2FudmFzL1dvcmxkX0RhcmtfR3JheV9SZWZlcmVuY2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxNixcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJ1xuXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBHcmF5OiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9DYW52YXMvV29ybGRfTGlnaHRfR3JheV9CYXNlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTYsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ0hFUkUsIERlTG9ybWUsIE1hcG15SW5kaWEsICZjb3B5OyBPcGVuU3RyZWV0TWFwIGNvbnRyaWJ1dG9ycydcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIEdyYXlMYWJlbHM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL0NhbnZhcy9Xb3JsZF9MaWdodF9HcmF5X1JlZmVyZW5jZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgcGFuZTogKHBvaW50ZXJFdmVudHMpID8gJ2VzcmktbGFiZWxzJyA6ICd0aWxlUGFuZScsXG4gICAgICAgICAgYXR0cmlidXRpb246ICcnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBJbWFnZXJ5OiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9JbWFnZXJ5L01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTksXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ0RpZ2l0YWxHbG9iZSwgR2VvRXllLCBpLWN1YmVkLCBVU0RBLCBVU0dTLCBBRVgsIEdldG1hcHBpbmcsIEFlcm9ncmlkLCBJR04sIElHUCwgc3dpc3N0b3BvLCBhbmQgdGhlIEdJUyBVc2VyIENvbW11bml0eSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIEltYWdlcnlMYWJlbHM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1JlZmVyZW5jZS9Xb3JsZF9Cb3VuZGFyaWVzX2FuZF9QbGFjZXMvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxOSxcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgSW1hZ2VyeVRyYW5zcG9ydGF0aW9uOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfVHJhbnNwb3J0YXRpb24vTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxOSxcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBTaGFkZWRSZWxpZWY6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX1NoYWRlZF9SZWxpZWYvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxMyxcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnVVNHUydcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFNoYWRlZFJlbGllZkxhYmVsczoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX0JvdW5kYXJpZXNfYW5kX1BsYWNlc19BbHRlcm5hdGUvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxMixcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgVGVycmFpbjoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfVGVycmFpbl9CYXNlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTMsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ1VTR1MsIE5PQUEnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBUZXJyYWluTGFiZWxzOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfUmVmZXJlbmNlX092ZXJsYXkvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxMyxcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgVVNBVG9wbzoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvVVNBX1RvcG9fTWFwcy9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE1LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdVU0dTLCBOYXRpb25hbCBHZW9ncmFwaGljIFNvY2lldHksIGktY3ViZWQnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGtleSwgb3B0aW9ucykge1xuICAgIHZhciBjb25maWc7XG5cbiAgICAvLyBzZXQgdGhlIGNvbmZpZyB2YXJpYWJsZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb25maWcgb2JqZWN0XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmIGtleS51cmxUZW1wbGF0ZSAmJiBrZXkub3B0aW9ucykge1xuICAgICAgY29uZmlnID0ga2V5O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYgQmFzZW1hcExheWVyLlRJTEVTW2tleV0pIHtcbiAgICAgIGNvbmZpZyA9IEJhc2VtYXBMYXllci5USUxFU1trZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0wuZXNyaS5CYXNlbWFwTGF5ZXI6IEludmFsaWQgcGFyYW1ldGVyLiBVc2Ugb25lIG9mIFwiU3RyZWV0c1wiLCBcIlRvcG9ncmFwaGljXCIsIFwiT2NlYW5zXCIsIFwiT2NlYW5zTGFiZWxzXCIsIFwiTmF0aW9uYWxHZW9ncmFwaGljXCIsIFwiR3JheVwiLCBcIkdyYXlMYWJlbHNcIiwgXCJEYXJrR3JheVwiLCBcIkRhcmtHcmF5TGFiZWxzXCIsIFwiSW1hZ2VyeVwiLCBcIkltYWdlcnlMYWJlbHNcIiwgXCJJbWFnZXJ5VHJhbnNwb3J0YXRpb25cIiwgXCJTaGFkZWRSZWxpZWZcIiwgXCJTaGFkZWRSZWxpZWZMYWJlbHNcIiwgXCJUZXJyYWluXCIsIFwiVGVycmFpbkxhYmVsc1wiIG9yIFwiVVNBVG9wb1wiJyk7XG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgcGFzc2VkIG9wdGlvbnMgaW50byB0aGUgY29uZmlnIG9wdGlvbnNcbiAgICB2YXIgdGlsZU9wdGlvbnMgPSBVdGlsLmV4dGVuZChjb25maWcub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICBVdGlsLnNldE9wdGlvbnModGhpcywgdGlsZU9wdGlvbnMpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50b2tlbikge1xuICAgICAgY29uZmlnLnVybFRlbXBsYXRlICs9ICgnP3Rva2VuPScgKyB0aGlzLm9wdGlvbnMudG9rZW4pO1xuICAgIH1cblxuICAgIC8vIGNhbGwgdGhlIGluaXRpYWxpemUgbWV0aG9kIG9uIEwuVGlsZUxheWVyIHRvIHNldCBldmVyeXRoaW5nIHVwXG4gICAgVGlsZUxheWVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgY29uZmlnLnVybFRlbXBsYXRlLCB0aWxlT3B0aW9ucyk7XG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAvLyBpbmNsdWRlICdQb3dlcmVkIGJ5IEVzcmknIGluIG1hcCBhdHRyaWJ1dGlvblxuICAgIHNldEVzcmlBdHRyaWJ1dGlvbihtYXApO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYW5lID09PSAnZXNyaS1sYWJlbHMnKSB7XG4gICAgICB0aGlzLl9pbml0UGFuZSgpO1xuICAgIH1cbiAgICAvLyBzb21lIGJhc2VtYXBzIGNhbiBzdXBwbHkgZHluYW1pYyBhdHRyaWJ1dGlvblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRpb25VcmwpIHtcbiAgICAgIF9nZXRBdHRyaWJ1dGlvbkRhdGEodGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uVXJsLCBtYXApO1xuICAgIH1cblxuICAgIG1hcC5vbignbW92ZWVuZCcsIF91cGRhdGVNYXBBdHRyaWJ1dGlvbik7XG5cbiAgICBUaWxlTGF5ZXIucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTtcbiAgfSxcblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIG1hcC5vZmYoJ21vdmVlbmQnLCBfdXBkYXRlTWFwQXR0cmlidXRpb24pO1xuICAgIFRpbGVMYXllci5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIF9pbml0UGFuZTogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fbWFwLmdldFBhbmUodGhpcy5vcHRpb25zLnBhbmUpKSB7XG4gICAgICB2YXIgcGFuZSA9IHRoaXMuX21hcC5jcmVhdGVQYW5lKHRoaXMub3B0aW9ucy5wYW5lKTtcbiAgICAgIHBhbmUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIHBhbmUuc3R5bGUuekluZGV4ID0gNTAwO1xuICAgIH1cbiAgfSxcblxuICBnZXRBdHRyaWJ1dGlvbjogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24pIHtcbiAgICAgIHZhciBhdHRyaWJ1dGlvbiA9ICc8c3BhbiBjbGFzcz1cImVzcmktZHluYW1pYy1hdHRyaWJ1dGlvblwiPicgKyB0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24gKyAnPC9zcGFuPic7XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGlvbjtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlbWFwTGF5ZXIgKGtleSwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEJhc2VtYXBMYXllcihrZXksIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlbWFwTGF5ZXI7XG4iLCJpbXBvcnQgeyBUaWxlTGF5ZXIsIFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IHdhcm4sIGNsZWFuVXJsLCBzZXRFc3JpQXR0cmlidXRpb24gfSBmcm9tICcuLi9VdGlsJztcbmltcG9ydCBtYXBTZXJ2aWNlIGZyb20gJy4uL1NlcnZpY2VzL01hcFNlcnZpY2UnO1xuXG5leHBvcnQgdmFyIFRpbGVkTWFwTGF5ZXIgPSBUaWxlTGF5ZXIuZXh0ZW5kKHtcbiAgb3B0aW9uczoge1xuICAgIHpvb21PZmZzZXRBbGxvd2FuY2U6IDAuMSxcbiAgICBlcnJvclRpbGVVcmw6ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQVFBQUFBRUFCQU1BQUFDdVhMVlZBQUFBQTFCTVZFVXpORFZzemxISEFBQUFBWFJTVGxNQVFPYllaZ0FBQUFsd1NGbHpBQUFBQUFBQUFBQUI2bVVXcEFBQUFEWkpSRUZVZUp6dHdRRUJBQUFBZ2lEL3IyNUlRQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTd3YUJBQUFCdzA4UndBQUFBQUJKUlU1RXJrSmdnZz09J1xuICB9LFxuXG4gIHN0YXRpY3M6IHtcbiAgICBNZXJjYXRvclpvb21MZXZlbHM6IHtcbiAgICAgICcwJzogMTU2NTQzLjAzMzkyNzk5OTk5LFxuICAgICAgJzEnOiA3ODI3MS41MTY5NjM5OTk4OTMsXG4gICAgICAnMic6IDM5MTM1Ljc1ODQ4MjAwMDA5OSxcbiAgICAgICczJzogMTk1NjcuODc5MjQwOTk5OTAxLFxuICAgICAgJzQnOiA5NzgzLjkzOTYyMDQ5OTk1OTMsXG4gICAgICAnNSc6IDQ4OTEuOTY5ODEwMjQ5OTc5NyxcbiAgICAgICc2JzogMjQ0NS45ODQ5MDUxMjQ5ODk4LFxuICAgICAgJzcnOiAxMjIyLjk5MjQ1MjU2MjQ4OTksXG4gICAgICAnOCc6IDYxMS40OTYyMjYyODEzODAwMixcbiAgICAgICc5JzogMzA1Ljc0ODExMzE0MDU1ODAyLFxuICAgICAgJzEwJzogMTUyLjg3NDA1NjU3MDQxMSxcbiAgICAgICcxMSc6IDc2LjQzNzAyODI4NTA3MzE5NyxcbiAgICAgICcxMic6IDM4LjIxODUxNDE0MjUzNjU5OCxcbiAgICAgICcxMyc6IDE5LjEwOTI1NzA3MTI2ODI5OSxcbiAgICAgICcxNCc6IDkuNTU0NjI4NTM1NjM0MTQ5NixcbiAgICAgICcxNSc6IDQuNzc3MzE0MjY3OTQ5MzY5OSxcbiAgICAgICcxNic6IDIuMzg4NjU3MTMzOTc0NjgsXG4gICAgICAnMTcnOiAxLjE5NDMyODU2Njg1NTA1MDEsXG4gICAgICAnMTgnOiAwLjU5NzE2NDI4MzU1OTgxNjk5LFxuICAgICAgJzE5JzogMC4yOTg1ODIxNDE2NDc2MTY5OCxcbiAgICAgICcyMCc6IDAuMTQ5MjkxMDcwODIzODEsXG4gICAgICAnMjEnOiAwLjA3NDY0NTUzNTQxMTkxLFxuICAgICAgJzIyJzogMC4wMzczMjI3Njc3MDU5NTI1LFxuICAgICAgJzIzJzogMC4wMTg2NjEzODM4NTI5NzYzXG4gICAgfVxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgb3B0aW9ucy51cmwgPSBjbGVhblVybChvcHRpb25zLnVybCk7XG4gICAgb3B0aW9ucyA9IFV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcblxuICAgIC8vIHNldCB0aGUgdXJsc1xuICAgIHRoaXMudGlsZVVybCA9IG9wdGlvbnMudXJsICsgJ3RpbGUve3p9L3t5fS97eH0nO1xuICAgIHRoaXMuc2VydmljZSA9IG1hcFNlcnZpY2Uob3B0aW9ucyk7XG4gICAgdGhpcy5zZXJ2aWNlLmFkZEV2ZW50UGFyZW50KHRoaXMpO1xuXG4gICAgdmFyIGFyY2dpc29ubGluZSA9IG5ldyBSZWdFeHAoL3RpbGVzLmFyY2dpcyhvbmxpbmUpP1xcLmNvbS9nKTtcbiAgICBpZiAoYXJjZ2lzb25saW5lLnRlc3Qob3B0aW9ucy51cmwpKSB7XG4gICAgICB0aGlzLnRpbGVVcmwgPSB0aGlzLnRpbGVVcmwucmVwbGFjZSgnOi8vdGlsZXMnLCAnOi8vdGlsZXN7c30nKTtcbiAgICAgIG9wdGlvbnMuc3ViZG9tYWlucyA9IFsnMScsICcyJywgJzMnLCAnNCddO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHRoaXMudGlsZVVybCArPSAoJz90b2tlbj0nICsgdGhpcy5vcHRpb25zLnRva2VuKTtcbiAgICB9XG5cbiAgICAvLyBpbml0IGxheWVyIGJ5IGNhbGxpbmcgVGlsZUxheWVycyBpbml0aWFsaXplIG1ldGhvZFxuICAgIFRpbGVMYXllci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHRoaXMudGlsZVVybCwgb3B0aW9ucyk7XG4gIH0sXG5cbiAgZ2V0VGlsZVVybDogZnVuY3Rpb24gKHRpbGVQb2ludCkge1xuICAgIHZhciB6b29tID0gdGhpcy5fZ2V0Wm9vbUZvclVybCgpO1xuXG4gICAgcmV0dXJuIFV0aWwudGVtcGxhdGUodGhpcy50aWxlVXJsLCBVdGlsLmV4dGVuZCh7XG4gICAgICBzOiB0aGlzLl9nZXRTdWJkb21haW4odGlsZVBvaW50KSxcbiAgICAgIHg6IHRpbGVQb2ludC54LFxuICAgICAgeTogdGlsZVBvaW50LnksXG4gICAgICAvLyB0cnkgbG9kIG1hcCBmaXJzdCwgdGhlbiBqdXN0IGRlZmF1bHQgdG8gem9vbSBsZXZlbFxuICAgICAgejogKHRoaXMuX2xvZE1hcCAmJiB0aGlzLl9sb2RNYXBbem9vbV0pID8gdGhpcy5fbG9kTWFwW3pvb21dIDogem9vbVxuICAgIH0sIHRoaXMub3B0aW9ucykpO1xuICB9LFxuXG4gIGNyZWF0ZVRpbGU6IGZ1bmN0aW9uIChjb29yZHMsIGRvbmUpIHtcbiAgICB2YXIgdGlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuXG4gICAgTC5Eb21FdmVudC5vbih0aWxlLCAnbG9hZCcsIEwuYmluZCh0aGlzLl90aWxlT25Mb2FkLCB0aGlzLCBkb25lLCB0aWxlKSk7XG4gICAgTC5Eb21FdmVudC5vbih0aWxlLCAnZXJyb3InLCBMLmJpbmQodGhpcy5fdGlsZU9uRXJyb3IsIHRoaXMsIGRvbmUsIHRpbGUpKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4pIHtcbiAgICAgIHRpbGUuY3Jvc3NPcmlnaW4gPSAnJztcbiAgICB9XG5cbiAgICAvKlxuICAgICBBbHQgdGFnIGlzIHNldCB0byBlbXB0eSBzdHJpbmcgdG8ga2VlcCBzY3JlZW4gcmVhZGVycyBmcm9tIHJlYWRpbmcgVVJMIGFuZCBmb3IgY29tcGxpYW5jZSByZWFzb25zXG4gICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1dDQUcyMC1URUNIUy9INjdcbiAgICAqL1xuICAgIHRpbGUuYWx0ID0gJyc7XG5cbiAgICAvLyBpZiB0aGVyZSBpcyBubyBsb2QgbWFwIG9yIGFuIGxvZCBtYXAgd2l0aCBhIHByb3BlciB6b29tIGxvYWQgdGhlIHRpbGVcbiAgICAvLyBvdGhlcndpc2Ugd2FpdCBmb3IgdGhlIGxvZCBtYXAgdG8gYmVjb21lIGF2YWlsYWJsZVxuICAgIGlmICghdGhpcy5fbG9kTWFwIHx8ICh0aGlzLl9sb2RNYXAgJiYgdGhpcy5fbG9kTWFwW3RoaXMuX2dldFpvb21Gb3JVcmwoKV0pKSB7XG4gICAgICB0aWxlLnNyYyA9IHRoaXMuZ2V0VGlsZVVybChjb29yZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uY2UoJ2xvZG1hcCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGlsZS5zcmMgPSB0aGlzLmdldFRpbGVVcmwoY29vcmRzKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aWxlO1xuICB9LFxuXG4gIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgLy8gaW5jbHVkZSAnUG93ZXJlZCBieSBFc3JpJyBpbiBtYXAgYXR0cmlidXRpb25cbiAgICBzZXRFc3JpQXR0cmlidXRpb24obWFwKTtcblxuICAgIGlmICghdGhpcy5fbG9kTWFwKSB7XG4gICAgICB0aGlzLm1ldGFkYXRhKGZ1bmN0aW9uIChlcnJvciwgbWV0YWRhdGEpIHtcbiAgICAgICAgaWYgKCFlcnJvciAmJiBtZXRhZGF0YS5zcGF0aWFsUmVmZXJlbmNlKSB7XG4gICAgICAgICAgdmFyIHNyID0gbWV0YWRhdGEuc3BhdGlhbFJlZmVyZW5jZS5sYXRlc3RXa2lkIHx8IG1ldGFkYXRhLnNwYXRpYWxSZWZlcmVuY2Uud2tpZDtcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiAmJiBtYXAuYXR0cmlidXRpb25Db250cm9sICYmIG1ldGFkYXRhLmNvcHlyaWdodFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiA9IG1ldGFkYXRhLmNvcHlyaWdodFRleHQ7XG4gICAgICAgICAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLmFkZEF0dHJpYnV0aW9uKHRoaXMuZ2V0QXR0cmlidXRpb24oKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXAub3B0aW9ucy5jcnMgPT09IEwuQ1JTLkVQU0czODU3ICYmIHNyID09PSAxMDIxMDAgfHwgc3IgPT09IDM4NTcpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZE1hcCA9IHt9O1xuICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSB6b29tIGxldmVsIGRhdGFcbiAgICAgICAgICAgIHZhciBhcmNnaXNMT0RzID0gbWV0YWRhdGEudGlsZUluZm8ubG9kcztcbiAgICAgICAgICAgIHZhciBjb3JyZWN0UmVzb2x1dGlvbnMgPSBUaWxlZE1hcExheWVyLk1lcmNhdG9yWm9vbUxldmVscztcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmNnaXNMT0RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBhcmNnaXNMT0QgPSBhcmNnaXNMT0RzW2ldO1xuICAgICAgICAgICAgICBmb3IgKHZhciBjaSBpbiBjb3JyZWN0UmVzb2x1dGlvbnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29ycmVjdFJlcyA9IGNvcnJlY3RSZXNvbHV0aW9uc1tjaV07XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fd2l0aGluUGVyY2VudGFnZShhcmNnaXNMT0QucmVzb2x1dGlvbiwgY29ycmVjdFJlcywgdGhpcy5vcHRpb25zLnpvb21PZmZzZXRBbGxvd2FuY2UpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9sb2RNYXBbY2ldID0gYXJjZ2lzTE9ELmxldmVsO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbG9kbWFwJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghcHJvajQpIHtcbiAgICAgICAgICAgICAgd2FybignTC5lc3JpLlRpbGVkTWFwTGF5ZXIgaXMgdXNpbmcgYSBub24tbWVyY2F0b3Igc3BhdGlhbCByZWZlcmVuY2UuIFN1cHBvcnQgbWF5IGJlIGF2YWlsYWJsZSB0aHJvdWdoIFByb2o0TGVhZmxldCBodHRwOi8vZXNyaS5naXRodWIuaW8vZXNyaS1sZWFmbGV0L2V4YW1wbGVzL25vbi1tZXJjYXRvci1wcm9qZWN0aW9uLmh0bWwnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cblxuICAgIFRpbGVMYXllci5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIG1ldGFkYXRhOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLnNlcnZpY2UubWV0YWRhdGEoY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGlkZW50aWZ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5pZGVudGlmeSgpO1xuICB9LFxuXG4gIGZpbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmZpbmQoKTtcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UucXVlcnkoKTtcbiAgfSxcblxuICBhdXRoZW50aWNhdGU6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHZhciB0b2tlblFzID0gJz90b2tlbj0nICsgdG9rZW47XG4gICAgdGhpcy50aWxlVXJsID0gKHRoaXMub3B0aW9ucy50b2tlbikgPyB0aGlzLnRpbGVVcmwucmVwbGFjZSgvXFw/dG9rZW49KC4rKS9nLCB0b2tlblFzKSA6IHRoaXMudGlsZVVybCArIHRva2VuUXM7XG4gICAgdGhpcy5vcHRpb25zLnRva2VuID0gdG9rZW47XG4gICAgdGhpcy5zZXJ2aWNlLmF1dGhlbnRpY2F0ZSh0b2tlbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgX3dpdGhpblBlcmNlbnRhZ2U6IGZ1bmN0aW9uIChhLCBiLCBwZXJjZW50YWdlKSB7XG4gICAgdmFyIGRpZmYgPSBNYXRoLmFicygoYSAvIGIpIC0gMSk7XG4gICAgcmV0dXJuIGRpZmYgPCBwZXJjZW50YWdlO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbGVkTWFwTGF5ZXIgKHVybCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFRpbGVkTWFwTGF5ZXIodXJsLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGlsZWRNYXBMYXllcjtcbiIsImltcG9ydCB7IEltYWdlT3ZlcmxheSwgQ1JTLCBEb21VdGlsLCBVdGlsLCBMYXllciwgcG9wdXAsIGxhdExuZyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgY29ycyB9IGZyb20gJy4uL1N1cHBvcnQnO1xuaW1wb3J0IHsgc2V0RXNyaUF0dHJpYnV0aW9uIH0gZnJvbSAnLi4vVXRpbCc7XG5cbnZhciBPdmVybGF5ID0gSW1hZ2VPdmVybGF5LmV4dGVuZCh7XG4gIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgdGhpcy5fdG9wTGVmdCA9IG1hcC5nZXRQaXhlbEJvdW5kcygpLm1pbjtcbiAgICBJbWFnZU92ZXJsYXkucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTtcbiAgfSxcbiAgX3Jlc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX21hcC5vcHRpb25zLmNycyA9PT0gQ1JTLkVQU0czODU3KSB7XG4gICAgICBJbWFnZU92ZXJsYXkucHJvdG90eXBlLl9yZXNldC5jYWxsKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBEb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX2ltYWdlLCB0aGlzLl90b3BMZWZ0LnN1YnRyYWN0KHRoaXMuX21hcC5nZXRQaXhlbE9yaWdpbigpKSk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IHZhciBSYXN0ZXJMYXllciA9IExheWVyLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIG9wYWNpdHk6IDEsXG4gICAgcG9zaXRpb246ICdmcm9udCcsXG4gICAgZjogJ2ltYWdlJyxcbiAgICB1c2VDb3JzOiBjb3JzLFxuICAgIGF0dHJpYnV0aW9uOiBudWxsLFxuICAgIGludGVyYWN0aXZlOiBmYWxzZSxcbiAgICBhbHQ6ICcnXG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAvLyBpbmNsdWRlICdQb3dlcmVkIGJ5IEVzcmknIGluIG1hcCBhdHRyaWJ1dGlvblxuICAgIHNldEVzcmlBdHRyaWJ1dGlvbihtYXApO1xuXG4gICAgdGhpcy5fdXBkYXRlID0gVXRpbC50aHJvdHRsZSh0aGlzLl91cGRhdGUsIHRoaXMub3B0aW9ucy51cGRhdGVJbnRlcnZhbCwgdGhpcyk7XG5cbiAgICBtYXAub24oJ21vdmVlbmQnLCB0aGlzLl91cGRhdGUsIHRoaXMpO1xuXG4gICAgLy8gaWYgd2UgaGFkIGFuIGltYWdlIGxvYWRlZCBhbmQgaXQgbWF0Y2hlcyB0aGVcbiAgICAvLyBjdXJyZW50IGJvdW5kcyBzaG93IHRoZSBpbWFnZSBvdGhlcndpc2UgcmVtb3ZlIGl0XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSAmJiB0aGlzLl9jdXJyZW50SW1hZ2UuX2JvdW5kcy5lcXVhbHModGhpcy5fbWFwLmdldEJvdW5kcygpKSkge1xuICAgICAgbWFwLmFkZExheWVyKHRoaXMuX2N1cnJlbnRJbWFnZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9jdXJyZW50SW1hZ2UpIHtcbiAgICAgIHRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzLl9jdXJyZW50SW1hZ2UpO1xuICAgICAgdGhpcy5fY3VycmVudEltYWdlID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGUoKTtcblxuICAgIGlmICh0aGlzLl9wb3B1cCkge1xuICAgICAgdGhpcy5fbWFwLm9uKCdjbGljaycsIHRoaXMuX2dldFBvcHVwRGF0YSwgdGhpcyk7XG4gICAgICB0aGlzLl9tYXAub24oJ2RibGNsaWNrJywgdGhpcy5fcmVzZXRQb3B1cFN0YXRlLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgY29weXJpZ2h0IHRleHQgbGlzdGVkIGluIHNlcnZpY2UgbWV0YWRhdGFcbiAgICB0aGlzLm1ldGFkYXRhKGZ1bmN0aW9uIChlcnIsIG1ldGFkYXRhKSB7XG4gICAgICBpZiAoIWVyciAmJiAhdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uICYmIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wgJiYgbWV0YWRhdGEuY29weXJpZ2h0VGV4dCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24gPSBtZXRhZGF0YS5jb3B5cmlnaHRUZXh0O1xuICAgICAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLmFkZEF0dHJpYnV0aW9uKHRoaXMuZ2V0QXR0cmlidXRpb24oKSk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgb25SZW1vdmU6IGZ1bmN0aW9uIChtYXApIHtcbiAgICBpZiAodGhpcy5fY3VycmVudEltYWdlKSB7XG4gICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fY3VycmVudEltYWdlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcG9wdXApIHtcbiAgICAgIHRoaXMuX21hcC5vZmYoJ2NsaWNrJywgdGhpcy5fZ2V0UG9wdXBEYXRhLCB0aGlzKTtcbiAgICAgIHRoaXMuX21hcC5vZmYoJ2RibGNsaWNrJywgdGhpcy5fcmVzZXRQb3B1cFN0YXRlLCB0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlLCB0aGlzKTtcbiAgfSxcblxuICBiaW5kUG9wdXA6IGZ1bmN0aW9uIChmbiwgcG9wdXBPcHRpb25zKSB7XG4gICAgdGhpcy5fc2hvdWxkUmVuZGVyUG9wdXAgPSBmYWxzZTtcbiAgICB0aGlzLl9sYXN0Q2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLl9wb3B1cCA9IHBvcHVwKHBvcHVwT3B0aW9ucyk7XG4gICAgdGhpcy5fcG9wdXBGdW5jdGlvbiA9IGZuO1xuICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgIHRoaXMuX21hcC5vbignY2xpY2snLCB0aGlzLl9nZXRQb3B1cERhdGEsIHRoaXMpO1xuICAgICAgdGhpcy5fbWFwLm9uKCdkYmxjbGljaycsIHRoaXMuX3Jlc2V0UG9wdXBTdGF0ZSwgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHVuYmluZFBvcHVwOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgdGhpcy5fbWFwLmNsb3NlUG9wdXAodGhpcy5fcG9wdXApO1xuICAgICAgdGhpcy5fbWFwLm9mZignY2xpY2snLCB0aGlzLl9nZXRQb3B1cERhdGEsIHRoaXMpO1xuICAgICAgdGhpcy5fbWFwLm9mZignZGJsY2xpY2snLCB0aGlzLl9yZXNldFBvcHVwU3RhdGUsIHRoaXMpO1xuICAgIH1cbiAgICB0aGlzLl9wb3B1cCA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGJyaW5nVG9Gcm9udDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9ICdmcm9udCc7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSkge1xuICAgICAgdGhpcy5fY3VycmVudEltYWdlLmJyaW5nVG9Gcm9udCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBicmluZ1RvQmFjazogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9ICdiYWNrJztcbiAgICBpZiAodGhpcy5fY3VycmVudEltYWdlKSB7XG4gICAgICB0aGlzLl9jdXJyZW50SW1hZ2UuYnJpbmdUb0JhY2soKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0QXR0cmlidXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uO1xuICB9LFxuXG4gIGdldE9wYWNpdHk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm9wYWNpdHk7XG4gIH0sXG5cbiAgc2V0T3BhY2l0eTogZnVuY3Rpb24gKG9wYWNpdHkpIHtcbiAgICB0aGlzLm9wdGlvbnMub3BhY2l0eSA9IG9wYWNpdHk7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSkge1xuICAgICAgdGhpcy5fY3VycmVudEltYWdlLnNldE9wYWNpdHkob3BhY2l0eSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldFRpbWVSYW5nZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBbdGhpcy5vcHRpb25zLmZyb20sIHRoaXMub3B0aW9ucy50b107XG4gIH0sXG5cbiAgc2V0VGltZVJhbmdlOiBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgICB0aGlzLm9wdGlvbnMuZnJvbSA9IGZyb207XG4gICAgdGhpcy5vcHRpb25zLnRvID0gdG87XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgbWV0YWRhdGE6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuc2VydmljZS5tZXRhZGF0YShjYWxsYmFjaywgY29udGV4dCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB0aGlzLnNlcnZpY2UuYXV0aGVudGljYXRlKHRva2VuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICByZWRyYXc6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfSxcblxuICBfcmVuZGVySW1hZ2U6IGZ1bmN0aW9uICh1cmwsIGJvdW5kcywgY29udGVudFR5cGUpIHtcbiAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAvLyBpZiBubyBvdXRwdXQgZGlyZWN0b3J5IGhhcyBiZWVuIHNwZWNpZmllZCBmb3IgYSBzZXJ2aWNlLCBNSU1FIGRhdGEgd2lsbCBiZSByZXR1cm5lZFxuICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgICAgIHVybCA9ICdkYXRhOicgKyBjb250ZW50VHlwZSArICc7YmFzZTY0LCcgKyB1cmw7XG4gICAgICB9XG4gICAgICAvLyBjcmVhdGUgYSBuZXcgaW1hZ2Ugb3ZlcmxheSBhbmQgYWRkIGl0IHRvIHRoZSBtYXBcbiAgICAgIC8vIHRvIHN0YXJ0IGxvYWRpbmcgdGhlIGltYWdlXG4gICAgICAvLyBvcGFjaXR5IGlzIDAgd2hpbGUgdGhlIGltYWdlIGlzIGxvYWRpbmdcbiAgICAgIHZhciBpbWFnZSA9IG5ldyBPdmVybGF5KHVybCwgYm91bmRzLCB7XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIGNyb3NzT3JpZ2luOiB0aGlzLm9wdGlvbnMudXNlQ29ycyxcbiAgICAgICAgYWx0OiB0aGlzLm9wdGlvbnMuYWx0LFxuICAgICAgICBwYW5lOiB0aGlzLm9wdGlvbnMucGFuZSB8fCB0aGlzLmdldFBhbmUoKSxcbiAgICAgICAgaW50ZXJhY3RpdmU6IHRoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZVxuICAgICAgfSkuYWRkVG8odGhpcy5fbWFwKTtcblxuICAgICAgLy8gb25jZSB0aGUgaW1hZ2UgbG9hZHNcbiAgICAgIGltYWdlLm9uY2UoJ2xvYWQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgdmFyIG5ld0ltYWdlID0gZS50YXJnZXQ7XG4gICAgICAgICAgdmFyIG9sZEltYWdlID0gdGhpcy5fY3VycmVudEltYWdlO1xuXG4gICAgICAgICAgLy8gaWYgdGhlIGJvdW5kcyBvZiB0aGlzIGltYWdlIG1hdGNoZXMgdGhlIGJvdW5kcyB0aGF0XG4gICAgICAgICAgLy8gX3JlbmRlckltYWdlIHdhcyBjYWxsZWQgd2l0aCBhbmQgd2UgaGF2ZSBhIG1hcCB3aXRoIHRoZSBzYW1lIGJvdW5kc1xuICAgICAgICAgIC8vIGhpZGUgdGhlIG9sZCBpbWFnZSBpZiB0aGVyZSBpcyBvbmUgYW5kIHNldCB0aGUgb3BhY2l0eVxuICAgICAgICAgIC8vIG9mIHRoZSBuZXcgaW1hZ2Ugb3RoZXJ3aXNlIHJlbW92ZSB0aGUgbmV3IGltYWdlXG4gICAgICAgICAgaWYgKG5ld0ltYWdlLl9ib3VuZHMuZXF1YWxzKGJvdW5kcykgJiYgbmV3SW1hZ2UuX2JvdW5kcy5lcXVhbHModGhpcy5fbWFwLmdldEJvdW5kcygpKSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudEltYWdlID0gbmV3SW1hZ2U7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24gPT09ICdmcm9udCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5icmluZ1RvRnJvbnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuYnJpbmdUb0JhY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcCAmJiB0aGlzLl9jdXJyZW50SW1hZ2UuX21hcCkge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW1hZ2Uuc2V0T3BhY2l0eSh0aGlzLm9wdGlvbnMub3BhY2l0eSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW1hZ2UuX21hcC5yZW1vdmVMYXllcih0aGlzLl9jdXJyZW50SW1hZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob2xkSW1hZ2UgJiYgdGhpcy5fbWFwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX21hcC5yZW1vdmVMYXllcihvbGRJbWFnZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvbGRJbWFnZSAmJiBvbGRJbWFnZS5fbWFwKSB7XG4gICAgICAgICAgICAgIG9sZEltYWdlLl9tYXAucmVtb3ZlTGF5ZXIob2xkSW1hZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIobmV3SW1hZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnbG9hZCcsIHtcbiAgICAgICAgICBib3VuZHM6IGJvdW5kc1xuICAgICAgICB9KTtcbiAgICAgIH0sIHRoaXMpO1xuXG4gICAgICB0aGlzLmZpcmUoJ2xvYWRpbmcnLCB7XG4gICAgICAgIGJvdW5kczogYm91bmRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX3VwZGF0ZTogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHpvb20gPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpO1xuICAgIHZhciBib3VuZHMgPSB0aGlzLl9tYXAuZ2V0Qm91bmRzKCk7XG5cbiAgICBpZiAodGhpcy5fYW5pbWF0aW5nWm9vbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tYXAuX3BhblRyYW5zaXRpb24gJiYgdGhpcy5fbWFwLl9wYW5UcmFuc2l0aW9uLl9pblByb2dyZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHpvb20gPiB0aGlzLm9wdGlvbnMubWF4Wm9vbSB8fCB6b29tIDwgdGhpcy5vcHRpb25zLm1pblpvb20pIHtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50SW1hZ2UpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudEltYWdlLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fY3VycmVudEltYWdlKTtcbiAgICAgICAgdGhpcy5fY3VycmVudEltYWdlID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcGFyYW1zID0gdGhpcy5fYnVpbGRFeHBvcnRQYXJhbXMoKTtcblxuICAgIHRoaXMuX3JlcXVlc3RFeHBvcnQocGFyYW1zLCBib3VuZHMpO1xuICB9LFxuXG4gIF9yZW5kZXJQb3B1cDogZnVuY3Rpb24gKGxhdGxuZywgZXJyb3IsIHJlc3VsdHMsIHJlc3BvbnNlKSB7XG4gICAgbGF0bG5nID0gbGF0TG5nKGxhdGxuZyk7XG4gICAgaWYgKHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwICYmIHRoaXMuX2xhc3RDbGljay5lcXVhbHMobGF0bG5nKSkge1xuICAgICAgLy8gYWRkIHRoZSBwb3B1cCB0byB0aGUgbWFwIHdoZXJlIHRoZSBtb3VzZSB3YXMgY2xpY2tlZCBhdFxuICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLl9wb3B1cEZ1bmN0aW9uKGVycm9yLCByZXN1bHRzLCByZXNwb25zZSk7XG4gICAgICBpZiAoY29udGVudCkge1xuICAgICAgICB0aGlzLl9wb3B1cC5zZXRMYXRMbmcobGF0bG5nKS5zZXRDb250ZW50KGNvbnRlbnQpLm9wZW5Pbih0aGlzLl9tYXApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBfcmVzZXRQb3B1cFN0YXRlOiBmdW5jdGlvbiAoZSkge1xuICAgIHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwID0gZmFsc2U7XG4gICAgdGhpcy5fbGFzdENsaWNrID0gZS5sYXRsbmc7XG4gIH1cbn0pO1xuIiwiaW1wb3J0IHsgVXRpbCB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgUmFzdGVyTGF5ZXIgfSBmcm9tICcuL1Jhc3RlckxheWVyJztcbmltcG9ydCB7IGNsZWFuVXJsIH0gZnJvbSAnLi4vVXRpbCc7XG5pbXBvcnQgaW1hZ2VTZXJ2aWNlIGZyb20gJy4uL1NlcnZpY2VzL0ltYWdlU2VydmljZSc7XG5cbmV4cG9ydCB2YXIgSW1hZ2VNYXBMYXllciA9IFJhc3RlckxheWVyLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIHVwZGF0ZUludGVydmFsOiAxNTAsXG4gICAgZm9ybWF0OiAnanBncG5nJyxcbiAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICBmOiAnanNvbidcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UucXVlcnkoKTtcbiAgfSxcblxuICBpZGVudGlmeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuaWRlbnRpZnkoKTtcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMudXJsID0gY2xlYW5Vcmwob3B0aW9ucy51cmwpO1xuICAgIHRoaXMuc2VydmljZSA9IGltYWdlU2VydmljZShvcHRpb25zKTtcbiAgICB0aGlzLnNlcnZpY2UuYWRkRXZlbnRQYXJlbnQodGhpcyk7XG5cbiAgICBVdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gIH0sXG5cbiAgc2V0UGl4ZWxUeXBlOiBmdW5jdGlvbiAocGl4ZWxUeXBlKSB7XG4gICAgdGhpcy5vcHRpb25zLnBpeGVsVHlwZSA9IHBpeGVsVHlwZTtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRQaXhlbFR5cGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBpeGVsVHlwZTtcbiAgfSxcblxuICBzZXRCYW5kSWRzOiBmdW5jdGlvbiAoYmFuZElkcykge1xuICAgIGlmIChVdGlsLmlzQXJyYXkoYmFuZElkcykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5iYW5kSWRzID0gYmFuZElkcy5qb2luKCcsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3B0aW9ucy5iYW5kSWRzID0gYmFuZElkcy50b1N0cmluZygpO1xuICAgIH1cbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRCYW5kSWRzOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5iYW5kSWRzO1xuICB9LFxuXG4gIHNldE5vRGF0YTogZnVuY3Rpb24gKG5vRGF0YSwgbm9EYXRhSW50ZXJwcmV0YXRpb24pIHtcbiAgICBpZiAoVXRpbC5pc0FycmF5KG5vRGF0YSkpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5ub0RhdGEgPSBub0RhdGEuam9pbignLCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnMubm9EYXRhID0gbm9EYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmIChub0RhdGFJbnRlcnByZXRhdGlvbikge1xuICAgICAgdGhpcy5vcHRpb25zLm5vRGF0YUludGVycHJldGF0aW9uID0gbm9EYXRhSW50ZXJwcmV0YXRpb247XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldE5vRGF0YTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubm9EYXRhO1xuICB9LFxuXG4gIGdldE5vRGF0YUludGVycHJldGF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ub0RhdGFJbnRlcnByZXRhdGlvbjtcbiAgfSxcblxuICBzZXRSZW5kZXJpbmdSdWxlOiBmdW5jdGlvbiAocmVuZGVyaW5nUnVsZSkge1xuICAgIHRoaXMub3B0aW9ucy5yZW5kZXJpbmdSdWxlID0gcmVuZGVyaW5nUnVsZTtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfSxcblxuICBnZXRSZW5kZXJpbmdSdWxlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yZW5kZXJpbmdSdWxlO1xuICB9LFxuXG4gIHNldE1vc2FpY1J1bGU6IGZ1bmN0aW9uIChtb3NhaWNSdWxlKSB7XG4gICAgdGhpcy5vcHRpb25zLm1vc2FpY1J1bGUgPSBtb3NhaWNSdWxlO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICB9LFxuXG4gIGdldE1vc2FpY1J1bGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1vc2FpY1J1bGU7XG4gIH0sXG5cbiAgX2dldFBvcHVwRGF0YTogZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzLCByZXNwb25zZSkge1xuICAgICAgaWYgKGVycm9yKSB7IHJldHVybjsgfSAvLyB3ZSByZWFsbHkgY2FuJ3QgZG8gYW55dGhpbmcgaGVyZSBidXQgYXV0aGVudGljYXRlIG9yIHJlcXVlc3RlcnJvciB3aWxsIGZpcmVcbiAgICAgIHNldFRpbWVvdXQoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyUG9wdXAoZS5sYXRsbmcsIGVycm9yLCByZXN1bHRzLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKSwgMzAwKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHZhciBpZGVudGlmeVJlcXVlc3QgPSB0aGlzLmlkZW50aWZ5KCkuYXQoZS5sYXRsbmcpO1xuXG4gICAgLy8gc2V0IG1vc2FpYyBydWxlIGZvciBpZGVudGlmeSB0YXNrIGlmIGl0IGlzIHNldCBmb3IgbGF5ZXJcbiAgICBpZiAodGhpcy5vcHRpb25zLm1vc2FpY1J1bGUpIHtcbiAgICAgIGlkZW50aWZ5UmVxdWVzdC5zZXRNb3NhaWNSdWxlKHRoaXMub3B0aW9ucy5tb3NhaWNSdWxlKTtcbiAgICAgIC8vIEBUT0RPOiBmb3JjZSByZXR1cm4gY2F0YWxvZyBpdGVtcyB0b28/XG4gICAgfVxuXG4gICAgLy8gQFRPRE86IHNldCByZW5kZXJpbmcgcnVsZT8gTm90IHN1cmUsXG4gICAgLy8gc29tZXRpbWVzIHlvdSB3YW50IHJhdyBwaXhlbCB2YWx1ZXNcbiAgICAvLyBpZiAodGhpcy5vcHRpb25zLnJlbmRlcmluZ1J1bGUpIHtcbiAgICAvLyAgIGlkZW50aWZ5UmVxdWVzdC5zZXRSZW5kZXJpbmdSdWxlKHRoaXMub3B0aW9ucy5yZW5kZXJpbmdSdWxlKTtcbiAgICAvLyB9XG5cbiAgICBpZGVudGlmeVJlcXVlc3QucnVuKGNhbGxiYWNrKTtcblxuICAgIC8vIHNldCB0aGUgZmxhZ3MgdG8gc2hvdyB0aGUgcG9wdXBcbiAgICB0aGlzLl9zaG91bGRSZW5kZXJQb3B1cCA9IHRydWU7XG4gICAgdGhpcy5fbGFzdENsaWNrID0gZS5sYXRsbmc7XG4gIH0sXG5cbiAgX2J1aWxkRXhwb3J0UGFyYW1zOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7XG4gICAgdmFyIG5lID0gdGhpcy5fbWFwLm9wdGlvbnMuY3JzLnByb2plY3QoYm91bmRzLl9ub3J0aEVhc3QpO1xuICAgIHZhciBzdyA9IHRoaXMuX21hcC5vcHRpb25zLmNycy5wcm9qZWN0KGJvdW5kcy5fc291dGhXZXN0KTtcblxuICAgIC8vIGVuc3VyZSB0aGF0IHdlIGRvbid0IGFzayBBcmNHSVMgU2VydmVyIGZvciBhIHRhbGxlciBpbWFnZSB0aGFuIHdlIGhhdmUgYWN0dWFsIG1hcCBkaXNwbGF5aW5nXG4gICAgdmFyIHRvcCA9IHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQoYm91bmRzLl9ub3J0aEVhc3QpO1xuICAgIHZhciBib3R0b20gPSB0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KGJvdW5kcy5fc291dGhXZXN0KTtcblxuICAgIGlmICh0b3AueSA+IDAgfHwgYm90dG9tLnkgPCBzaXplLnkpIHtcbiAgICAgIHNpemUueSA9IGJvdHRvbS55IC0gdG9wLnk7XG4gICAgfVxuXG4gICAgdmFyIHNyID0gcGFyc2VJbnQodGhpcy5fbWFwLm9wdGlvbnMuY3JzLmNvZGUuc3BsaXQoJzonKVsxXSwgMTApO1xuXG4gICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgIGJib3g6IFtzdy54LCBzdy55LCBuZS54LCBuZS55XS5qb2luKCcsJyksXG4gICAgICBzaXplOiBzaXplLnggKyAnLCcgKyBzaXplLnksXG4gICAgICBmb3JtYXQ6IHRoaXMub3B0aW9ucy5mb3JtYXQsXG4gICAgICB0cmFuc3BhcmVudDogdGhpcy5vcHRpb25zLnRyYW5zcGFyZW50LFxuICAgICAgYmJveFNSOiBzcixcbiAgICAgIGltYWdlU1I6IHNyXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZnJvbSAmJiB0aGlzLm9wdGlvbnMudG8pIHtcbiAgICAgIHBhcmFtcy50aW1lID0gdGhpcy5vcHRpb25zLmZyb20udmFsdWVPZigpICsgJywnICsgdGhpcy5vcHRpb25zLnRvLnZhbHVlT2YoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnBpeGVsVHlwZSkge1xuICAgICAgcGFyYW1zLnBpeGVsVHlwZSA9IHRoaXMub3B0aW9ucy5waXhlbFR5cGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uKSB7XG4gICAgICBwYXJhbXMuaW50ZXJwb2xhdGlvbiA9IHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcHJlc3Npb25RdWFsaXR5KSB7XG4gICAgICBwYXJhbXMuY29tcHJlc3Npb25RdWFsaXR5ID0gdGhpcy5vcHRpb25zLmNvbXByZXNzaW9uUXVhbGl0eTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmJhbmRJZHMpIHtcbiAgICAgIHBhcmFtcy5iYW5kSWRzID0gdGhpcy5vcHRpb25zLmJhbmRJZHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub0RhdGEpIHtcbiAgICAgIHBhcmFtcy5ub0RhdGEgPSB0aGlzLm9wdGlvbnMubm9EYXRhO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubm9EYXRhSW50ZXJwcmV0YXRpb24pIHtcbiAgICAgIHBhcmFtcy5ub0RhdGFJbnRlcnByZXRhdGlvbiA9IHRoaXMub3B0aW9ucy5ub0RhdGFJbnRlcnByZXRhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXJ2aWNlLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHBhcmFtcy50b2tlbiA9IHRoaXMuc2VydmljZS5vcHRpb25zLnRva2VuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucmVuZGVyaW5nUnVsZSkge1xuICAgICAgcGFyYW1zLnJlbmRlcmluZ1J1bGUgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMucmVuZGVyaW5nUnVsZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5tb3NhaWNSdWxlKSB7XG4gICAgICBwYXJhbXMubW9zYWljUnVsZSA9IEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5tb3NhaWNSdWxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9LFxuXG4gIF9yZXF1ZXN0RXhwb3J0OiBmdW5jdGlvbiAocGFyYW1zLCBib3VuZHMpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmYgPT09ICdqc29uJykge1xuICAgICAgdGhpcy5zZXJ2aWNlLnJlcXVlc3QoJ2V4cG9ydEltYWdlJywgcGFyYW1zLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChlcnJvcikgeyByZXR1cm47IH0gLy8gd2UgcmVhbGx5IGNhbid0IGRvIGFueXRoaW5nIGhlcmUgYnV0IGF1dGhlbnRpY2F0ZSBvciByZXF1ZXN0ZXJyb3Igd2lsbCBmaXJlXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgICAgICByZXNwb25zZS5ocmVmICs9ICgnP3Rva2VuPScgKyB0aGlzLm9wdGlvbnMudG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbmRlckltYWdlKHJlc3BvbnNlLmhyZWYsIGJvdW5kcyk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zLmYgPSAnaW1hZ2UnO1xuICAgICAgdGhpcy5fcmVuZGVySW1hZ2UodGhpcy5vcHRpb25zLnVybCArICdleHBvcnRJbWFnZScgKyBVdGlsLmdldFBhcmFtU3RyaW5nKHBhcmFtcyksIGJvdW5kcyk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlTWFwTGF5ZXIgKHVybCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEltYWdlTWFwTGF5ZXIodXJsLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW1hZ2VNYXBMYXllcjtcbiIsImltcG9ydCB7IFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFJhc3RlckxheWVyIH0gZnJvbSAnLi9SYXN0ZXJMYXllcic7XG5pbXBvcnQgeyBjbGVhblVybCB9IGZyb20gJy4uL1V0aWwnO1xuaW1wb3J0IG1hcFNlcnZpY2UgZnJvbSAnLi4vU2VydmljZXMvTWFwU2VydmljZSc7XG5cbmV4cG9ydCB2YXIgRHluYW1pY01hcExheWVyID0gUmFzdGVyTGF5ZXIuZXh0ZW5kKHtcblxuICBvcHRpb25zOiB7XG4gICAgdXBkYXRlSW50ZXJ2YWw6IDE1MCxcbiAgICBsYXllcnM6IGZhbHNlLFxuICAgIGxheWVyRGVmczogZmFsc2UsXG4gICAgdGltZU9wdGlvbnM6IGZhbHNlLFxuICAgIGZvcm1hdDogJ3BuZzI0JyxcbiAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICBmOiAnanNvbidcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMudXJsID0gY2xlYW5Vcmwob3B0aW9ucy51cmwpO1xuICAgIHRoaXMuc2VydmljZSA9IG1hcFNlcnZpY2Uob3B0aW9ucyk7XG4gICAgdGhpcy5zZXJ2aWNlLmFkZEV2ZW50UGFyZW50KHRoaXMpO1xuXG4gICAgaWYgKChvcHRpb25zLnByb3h5IHx8IG9wdGlvbnMudG9rZW4pICYmIG9wdGlvbnMuZiAhPT0gJ2pzb24nKSB7XG4gICAgICBvcHRpb25zLmYgPSAnanNvbic7XG4gICAgfVxuXG4gICAgVXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuICB9LFxuXG4gIGdldER5bmFtaWNMYXllcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnM7XG4gIH0sXG5cbiAgc2V0RHluYW1pY0xheWVyczogZnVuY3Rpb24gKGR5bmFtaWNMYXllcnMpIHtcbiAgICB0aGlzLm9wdGlvbnMuZHluYW1pY0xheWVycyA9IGR5bmFtaWNMYXllcnM7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0TGF5ZXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYXllcnM7XG4gIH0sXG5cbiAgc2V0TGF5ZXJzOiBmdW5jdGlvbiAobGF5ZXJzKSB7XG4gICAgdGhpcy5vcHRpb25zLmxheWVycyA9IGxheWVycztcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRMYXllckRlZnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxheWVyRGVmcztcbiAgfSxcblxuICBzZXRMYXllckRlZnM6IGZ1bmN0aW9uIChsYXllckRlZnMpIHtcbiAgICB0aGlzLm9wdGlvbnMubGF5ZXJEZWZzID0gbGF5ZXJEZWZzO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldFRpbWVPcHRpb25zOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50aW1lT3B0aW9ucztcbiAgfSxcblxuICBzZXRUaW1lT3B0aW9uczogZnVuY3Rpb24gKHRpbWVPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zLnRpbWVPcHRpb25zID0gdGltZU9wdGlvbnM7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcXVlcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnF1ZXJ5KCk7XG4gIH0sXG5cbiAgaWRlbnRpZnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmlkZW50aWZ5KCk7XG4gIH0sXG5cbiAgZmluZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZmluZCgpO1xuICB9LFxuXG4gIF9nZXRQb3B1cERhdGE6IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIGNhbGxiYWNrID0gVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvciwgZmVhdHVyZUNvbGxlY3Rpb24sIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9IC8vIHdlIHJlYWxseSBjYW4ndCBkbyBhbnl0aGluZyBoZXJlIGJ1dCBhdXRoZW50aWNhdGUgb3IgcmVxdWVzdGVycm9yIHdpbGwgZmlyZVxuICAgICAgc2V0VGltZW91dChVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9yZW5kZXJQb3B1cChlLmxhdGxuZywgZXJyb3IsIGZlYXR1cmVDb2xsZWN0aW9uLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKSwgMzAwKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHZhciBpZGVudGlmeVJlcXVlc3QgPSB0aGlzLmlkZW50aWZ5KCkub24odGhpcy5fbWFwKS5hdChlLmxhdGxuZyk7XG5cbiAgICAvLyByZW1vdmUgZXh0cmFuZW91cyB2ZXJ0aWNlcyBmcm9tIHJlc3BvbnNlIGZlYXR1cmVzXG4gICAgaWRlbnRpZnlSZXF1ZXN0LnNpbXBsaWZ5KHRoaXMuX21hcCwgMC41KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMubGF5ZXJzKSB7XG4gICAgICBpZGVudGlmeVJlcXVlc3QubGF5ZXJzKCd2aXNpYmxlOicgKyB0aGlzLm9wdGlvbnMubGF5ZXJzLmpvaW4oJywnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkZW50aWZ5UmVxdWVzdC5sYXllcnMoJ3Zpc2libGUnKTtcbiAgICB9XG5cbiAgICBpZGVudGlmeVJlcXVlc3QucnVuKGNhbGxiYWNrKTtcblxuICAgIC8vIHNldCB0aGUgZmxhZ3MgdG8gc2hvdyB0aGUgcG9wdXBcbiAgICB0aGlzLl9zaG91bGRSZW5kZXJQb3B1cCA9IHRydWU7XG4gICAgdGhpcy5fbGFzdENsaWNrID0gZS5sYXRsbmc7XG4gIH0sXG5cbiAgX2J1aWxkRXhwb3J0UGFyYW1zOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7XG4gICAgdmFyIG5lID0gdGhpcy5fbWFwLm9wdGlvbnMuY3JzLnByb2plY3QoYm91bmRzLmdldE5vcnRoRWFzdCgpKTtcbiAgICB2YXIgc3cgPSB0aGlzLl9tYXAub3B0aW9ucy5jcnMucHJvamVjdChib3VuZHMuZ2V0U291dGhXZXN0KCkpO1xuICAgIHZhciBzciA9IHBhcnNlSW50KHRoaXMuX21hcC5vcHRpb25zLmNycy5jb2RlLnNwbGl0KCc6JylbMV0sIDEwKTtcblxuICAgIC8vIGVuc3VyZSB0aGF0IHdlIGRvbid0IGFzayBBcmNHSVMgU2VydmVyIGZvciBhIHRhbGxlciBpbWFnZSB0aGFuIHdlIGhhdmUgYWN0dWFsIG1hcCBkaXNwbGF5aW5nXG4gICAgdmFyIHRvcCA9IHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQoYm91bmRzLl9ub3J0aEVhc3QpO1xuICAgIHZhciBib3R0b20gPSB0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KGJvdW5kcy5fc291dGhXZXN0KTtcblxuICAgIGlmICh0b3AueSA+IDAgfHwgYm90dG9tLnkgPCBzaXplLnkpIHtcbiAgICAgIHNpemUueSA9IGJvdHRvbS55IC0gdG9wLnk7XG4gICAgfVxuXG4gICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgIGJib3g6IFtzdy54LCBzdy55LCBuZS54LCBuZS55XS5qb2luKCcsJyksXG4gICAgICBzaXplOiBzaXplLnggKyAnLCcgKyBzaXplLnksXG4gICAgICBkcGk6IDk2LFxuICAgICAgZm9ybWF0OiB0aGlzLm9wdGlvbnMuZm9ybWF0LFxuICAgICAgdHJhbnNwYXJlbnQ6IHRoaXMub3B0aW9ucy50cmFuc3BhcmVudCxcbiAgICAgIGJib3hTUjogc3IsXG4gICAgICBpbWFnZVNSOiBzclxuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnMpIHtcbiAgICAgIHBhcmFtcy5keW5hbWljTGF5ZXJzID0gdGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYXllcnMpIHtcbiAgICAgIHBhcmFtcy5sYXllcnMgPSAnc2hvdzonICsgdGhpcy5vcHRpb25zLmxheWVycy5qb2luKCcsJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYXllckRlZnMpIHtcbiAgICAgIHBhcmFtcy5sYXllckRlZnMgPSB0eXBlb2YgdGhpcy5vcHRpb25zLmxheWVyRGVmcyA9PT0gJ3N0cmluZycgPyB0aGlzLm9wdGlvbnMubGF5ZXJEZWZzIDogSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLmxheWVyRGVmcyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50aW1lT3B0aW9ucykge1xuICAgICAgcGFyYW1zLnRpbWVPcHRpb25zID0gSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLnRpbWVPcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmZyb20gJiYgdGhpcy5vcHRpb25zLnRvKSB7XG4gICAgICBwYXJhbXMudGltZSA9IHRoaXMub3B0aW9ucy5mcm9tLnZhbHVlT2YoKSArICcsJyArIHRoaXMub3B0aW9ucy50by52YWx1ZU9mKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VydmljZS5vcHRpb25zLnRva2VuKSB7XG4gICAgICBwYXJhbXMudG9rZW4gPSB0aGlzLnNlcnZpY2Uub3B0aW9ucy50b2tlbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5KSB7XG4gICAgICBwYXJhbXMucHJveHkgPSB0aGlzLm9wdGlvbnMucHJveHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfSxcblxuICBfcmVxdWVzdEV4cG9ydDogZnVuY3Rpb24gKHBhcmFtcywgYm91bmRzKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5mID09PSAnanNvbicpIHtcbiAgICAgIHRoaXMuc2VydmljZS5yZXF1ZXN0KCdleHBvcnQnLCBwYXJhbXMsIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGVycm9yKSB7IHJldHVybjsgfSAvLyB3ZSByZWFsbHkgY2FuJ3QgZG8gYW55dGhpbmcgaGVyZSBidXQgYXV0aGVudGljYXRlIG9yIHJlcXVlc3RlcnJvciB3aWxsIGZpcmVcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRva2VuKSB7XG4gICAgICAgICAgcmVzcG9uc2UuaHJlZiArPSAoJz90b2tlbj0nICsgdGhpcy5vcHRpb25zLnRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5KSB7XG4gICAgICAgICAgcmVzcG9uc2UuaHJlZiA9IHRoaXMub3B0aW9ucy5wcm94eSArICc/JyArIHJlc3BvbnNlLmhyZWY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLmhyZWYpIHtcbiAgICAgICAgICB0aGlzLl9yZW5kZXJJbWFnZShyZXNwb25zZS5ocmVmLCBib3VuZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3JlbmRlckltYWdlKHJlc3BvbnNlLmltYWdlRGF0YSwgYm91bmRzLCByZXNwb25zZS5jb250ZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXMuZiA9ICdpbWFnZSc7XG4gICAgICB0aGlzLl9yZW5kZXJJbWFnZSh0aGlzLm9wdGlvbnMudXJsICsgJ2V4cG9ydCcgKyBVdGlsLmdldFBhcmFtU3RyaW5nKHBhcmFtcyksIGJvdW5kcyk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGR5bmFtaWNNYXBMYXllciAodXJsLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRHluYW1pY01hcExheWVyKHVybCwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGR5bmFtaWNNYXBMYXllcjtcbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuXG52YXIgVmlydHVhbEdyaWQgPSBMLkxheWVyLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIGNlbGxTaXplOiA1MTIsXG4gICAgdXBkYXRlSW50ZXJ2YWw6IDE1MFxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLl96b29taW5nID0gZmFsc2U7XG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgdGhpcy5fdXBkYXRlID0gTC5VdGlsLnRocm90dGxlKHRoaXMuX3VwZGF0ZSwgdGhpcy5vcHRpb25zLnVwZGF0ZUludGVydmFsLCB0aGlzKTtcbiAgICB0aGlzLl9yZXNldCgpO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fbWFwLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5nZXRFdmVudHMoKSwgdGhpcyk7XG4gICAgdGhpcy5fcmVtb3ZlQ2VsbHMoKTtcbiAgfSxcblxuICBnZXRFdmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXZlbnRzID0ge1xuICAgICAgbW92ZWVuZDogdGhpcy5fdXBkYXRlLFxuICAgICAgem9vbXN0YXJ0OiB0aGlzLl96b29tc3RhcnQsXG4gICAgICB6b29tZW5kOiB0aGlzLl9yZXNldFxuICAgIH07XG5cbiAgICByZXR1cm4gZXZlbnRzO1xuICB9LFxuXG4gIGFkZFRvOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgbWFwLmFkZExheWVyKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJlbW92ZUZyb206IGZ1bmN0aW9uIChtYXApIHtcbiAgICBtYXAucmVtb3ZlTGF5ZXIodGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgX3pvb21zdGFydDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3pvb21pbmcgPSB0cnVlO1xuICB9LFxuXG4gIF9yZXNldDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbW92ZUNlbGxzKCk7XG5cbiAgICB0aGlzLl9jZWxscyA9IHt9O1xuICAgIHRoaXMuX2FjdGl2ZUNlbGxzID0ge307XG4gICAgdGhpcy5fY2VsbHNUb0xvYWQgPSAwO1xuICAgIHRoaXMuX2NlbGxzVG90YWwgPSAwO1xuICAgIHRoaXMuX2NlbGxOdW1Cb3VuZHMgPSB0aGlzLl9nZXRDZWxsTnVtQm91bmRzKCk7XG5cbiAgICB0aGlzLl9yZXNldFdyYXAoKTtcbiAgICB0aGlzLl96b29taW5nID0gZmFsc2U7XG4gIH0sXG5cbiAgX3Jlc2V0V3JhcDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG4gICAgdmFyIGNycyA9IG1hcC5vcHRpb25zLmNycztcblxuICAgIGlmIChjcnMuaW5maW5pdGUpIHsgcmV0dXJuOyB9XG5cbiAgICB2YXIgY2VsbFNpemUgPSB0aGlzLl9nZXRDZWxsU2l6ZSgpO1xuXG4gICAgaWYgKGNycy53cmFwTG5nKSB7XG4gICAgICB0aGlzLl93cmFwTG5nID0gW1xuICAgICAgICBNYXRoLmZsb29yKG1hcC5wcm9qZWN0KFswLCBjcnMud3JhcExuZ1swXV0pLnggLyBjZWxsU2l6ZSksXG4gICAgICAgIE1hdGguY2VpbChtYXAucHJvamVjdChbMCwgY3JzLndyYXBMbmdbMV1dKS54IC8gY2VsbFNpemUpXG4gICAgICBdO1xuICAgIH1cblxuICAgIGlmIChjcnMud3JhcExhdCkge1xuICAgICAgdGhpcy5fd3JhcExhdCA9IFtcbiAgICAgICAgTWF0aC5mbG9vcihtYXAucHJvamVjdChbY3JzLndyYXBMYXRbMF0sIDBdKS55IC8gY2VsbFNpemUpLFxuICAgICAgICBNYXRoLmNlaWwobWFwLnByb2plY3QoW2Nycy53cmFwTGF0WzFdLCAwXSkueSAvIGNlbGxTaXplKVxuICAgICAgXTtcbiAgICB9XG4gIH0sXG5cbiAgX2dldENlbGxTaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jZWxsU2l6ZTtcbiAgfSxcblxuICBfdXBkYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLl9tYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYm91bmRzID0gdGhpcy5fbWFwLmdldFBpeGVsQm91bmRzKCk7XG4gICAgdmFyIGNlbGxTaXplID0gdGhpcy5fZ2V0Q2VsbFNpemUoKTtcblxuICAgIC8vIGNlbGwgY29vcmRpbmF0ZXMgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHZpZXdcbiAgICB2YXIgY2VsbEJvdW5kcyA9IEwuYm91bmRzKFxuICAgICAgYm91bmRzLm1pbi5kaXZpZGVCeShjZWxsU2l6ZSkuZmxvb3IoKSxcbiAgICAgIGJvdW5kcy5tYXguZGl2aWRlQnkoY2VsbFNpemUpLmZsb29yKCkpO1xuXG4gICAgdGhpcy5fcmVtb3ZlT3RoZXJDZWxscyhjZWxsQm91bmRzKTtcbiAgICB0aGlzLl9hZGRDZWxscyhjZWxsQm91bmRzKTtcblxuICAgIHRoaXMuZmlyZSgnY2VsbHN1cGRhdGVkJyk7XG4gIH0sXG5cbiAgX2FkZENlbGxzOiBmdW5jdGlvbiAoYm91bmRzKSB7XG4gICAgdmFyIHF1ZXVlID0gW107XG4gICAgdmFyIGNlbnRlciA9IGJvdW5kcy5nZXRDZW50ZXIoKTtcbiAgICB2YXIgem9vbSA9IHRoaXMuX21hcC5nZXRab29tKCk7XG5cbiAgICB2YXIgaiwgaSwgY29vcmRzO1xuICAgIC8vIGNyZWF0ZSBhIHF1ZXVlIG9mIGNvb3JkaW5hdGVzIHRvIGxvYWQgY2VsbHMgZnJvbVxuICAgIGZvciAoaiA9IGJvdW5kcy5taW4ueTsgaiA8PSBib3VuZHMubWF4Lnk7IGorKykge1xuICAgICAgZm9yIChpID0gYm91bmRzLm1pbi54OyBpIDw9IGJvdW5kcy5tYXgueDsgaSsrKSB7XG4gICAgICAgIGNvb3JkcyA9IEwucG9pbnQoaSwgaik7XG4gICAgICAgIGNvb3Jkcy56ID0gem9vbTtcblxuICAgICAgICBpZiAodGhpcy5faXNWYWxpZENlbGwoY29vcmRzKSkge1xuICAgICAgICAgIHF1ZXVlLnB1c2goY29vcmRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjZWxsc1RvTG9hZCA9IHF1ZXVlLmxlbmd0aDtcblxuICAgIGlmIChjZWxsc1RvTG9hZCA9PT0gMCkgeyByZXR1cm47IH1cblxuICAgIHRoaXMuX2NlbGxzVG9Mb2FkICs9IGNlbGxzVG9Mb2FkO1xuICAgIHRoaXMuX2NlbGxzVG90YWwgKz0gY2VsbHNUb0xvYWQ7XG5cbiAgICAvLyBzb3J0IGNlbGwgcXVldWUgdG8gbG9hZCBjZWxscyBpbiBvcmRlciBvZiB0aGVpciBkaXN0YW5jZSB0byBjZW50ZXJcbiAgICBxdWV1ZS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS5kaXN0YW5jZVRvKGNlbnRlcikgLSBiLmRpc3RhbmNlVG8oY2VudGVyKTtcbiAgICB9KTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBjZWxsc1RvTG9hZDsgaSsrKSB7XG4gICAgICB0aGlzLl9hZGRDZWxsKHF1ZXVlW2ldKTtcbiAgICB9XG4gIH0sXG5cbiAgX2lzVmFsaWRDZWxsOiBmdW5jdGlvbiAoY29vcmRzKSB7XG4gICAgdmFyIGNycyA9IHRoaXMuX21hcC5vcHRpb25zLmNycztcblxuICAgIGlmICghY3JzLmluZmluaXRlKSB7XG4gICAgICAvLyBkb24ndCBsb2FkIGNlbGwgaWYgaXQncyBvdXQgb2YgYm91bmRzIGFuZCBub3Qgd3JhcHBlZFxuICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxOdW1Cb3VuZHM7XG4gICAgICBpZiAoXG4gICAgICAgICghY3JzLndyYXBMbmcgJiYgKGNvb3Jkcy54IDwgYm91bmRzLm1pbi54IHx8IGNvb3Jkcy54ID4gYm91bmRzLm1heC54KSkgfHxcbiAgICAgICAgKCFjcnMud3JhcExhdCAmJiAoY29vcmRzLnkgPCBib3VuZHMubWluLnkgfHwgY29vcmRzLnkgPiBib3VuZHMubWF4LnkpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ib3VuZHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGRvbid0IGxvYWQgY2VsbCBpZiBpdCBkb2Vzbid0IGludGVyc2VjdCB0aGUgYm91bmRzIGluIG9wdGlvbnNcbiAgICB2YXIgY2VsbEJvdW5kcyA9IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpO1xuICAgIHJldHVybiBMLmxhdExuZ0JvdW5kcyh0aGlzLm9wdGlvbnMuYm91bmRzKS5pbnRlcnNlY3RzKGNlbGxCb3VuZHMpO1xuICB9LFxuXG4gIC8vIGNvbnZlcnRzIGNlbGwgY29vcmRpbmF0ZXMgdG8gaXRzIGdlb2dyYXBoaWNhbCBib3VuZHNcbiAgX2NlbGxDb29yZHNUb0JvdW5kczogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG4gICAgdmFyIGNlbGxTaXplID0gdGhpcy5vcHRpb25zLmNlbGxTaXplO1xuICAgIHZhciBud1BvaW50ID0gY29vcmRzLm11bHRpcGx5QnkoY2VsbFNpemUpO1xuICAgIHZhciBzZVBvaW50ID0gbndQb2ludC5hZGQoW2NlbGxTaXplLCBjZWxsU2l6ZV0pO1xuICAgIHZhciBudyA9IG1hcC53cmFwTGF0TG5nKG1hcC51bnByb2plY3QobndQb2ludCwgY29vcmRzLnopKTtcbiAgICB2YXIgc2UgPSBtYXAud3JhcExhdExuZyhtYXAudW5wcm9qZWN0KHNlUG9pbnQsIGNvb3Jkcy56KSk7XG5cbiAgICByZXR1cm4gTC5sYXRMbmdCb3VuZHMobncsIHNlKTtcbiAgfSxcblxuICAvLyBjb252ZXJ0cyBjZWxsIGNvb3JkaW5hdGVzIHRvIGtleSBmb3IgdGhlIGNlbGwgY2FjaGVcbiAgX2NlbGxDb29yZHNUb0tleTogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHJldHVybiBjb29yZHMueCArICc6JyArIGNvb3Jkcy55O1xuICB9LFxuXG4gIC8vIGNvbnZlcnRzIGNlbGwgY2FjaGUga2V5IHRvIGNvb3JkaWFudGVzXG4gIF9rZXlUb0NlbGxDb29yZHM6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIga0FyciA9IGtleS5zcGxpdCgnOicpO1xuICAgIHZhciB4ID0gcGFyc2VJbnQoa0FyclswXSwgMTApO1xuICAgIHZhciB5ID0gcGFyc2VJbnQoa0FyclsxXSwgMTApO1xuXG4gICAgcmV0dXJuIEwucG9pbnQoeCwgeSk7XG4gIH0sXG5cbiAgLy8gcmVtb3ZlIGFueSBwcmVzZW50IGNlbGxzIHRoYXQgYXJlIG9mZiB0aGUgc3BlY2lmaWVkIGJvdW5kc1xuICBfcmVtb3ZlT3RoZXJDZWxsczogZnVuY3Rpb24gKGJvdW5kcykge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9jZWxscykge1xuICAgICAgaWYgKCFib3VuZHMuY29udGFpbnModGhpcy5fa2V5VG9DZWxsQ29vcmRzKGtleSkpKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUNlbGwoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX3JlbW92ZUNlbGw6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuX2FjdGl2ZUNlbGxzW2tleV07XG5cbiAgICBpZiAoY2VsbCkge1xuICAgICAgZGVsZXRlIHRoaXMuX2FjdGl2ZUNlbGxzW2tleV07XG5cbiAgICAgIGlmICh0aGlzLmNlbGxMZWF2ZSkge1xuICAgICAgICB0aGlzLmNlbGxMZWF2ZShjZWxsLmJvdW5kcywgY2VsbC5jb29yZHMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpcmUoJ2NlbGxsZWF2ZScsIHtcbiAgICAgICAgYm91bmRzOiBjZWxsLmJvdW5kcyxcbiAgICAgICAgY29vcmRzOiBjZWxsLmNvb3Jkc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIF9yZW1vdmVDZWxsczogZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9jZWxscykge1xuICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxzW2tleV0uYm91bmRzO1xuICAgICAgdmFyIGNvb3JkcyA9IHRoaXMuX2NlbGxzW2tleV0uY29vcmRzO1xuXG4gICAgICBpZiAodGhpcy5jZWxsTGVhdmUpIHtcbiAgICAgICAgdGhpcy5jZWxsTGVhdmUoYm91bmRzLCBjb29yZHMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpcmUoJ2NlbGxsZWF2ZScsIHtcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgIGNvb3JkczogY29vcmRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX2FkZENlbGw6IGZ1bmN0aW9uIChjb29yZHMpIHtcbiAgICAvLyB3cmFwIGNlbGwgY29vcmRzIGlmIG5lY2Vzc2FyeSAoZGVwZW5kaW5nIG9uIENSUylcbiAgICB0aGlzLl93cmFwQ29vcmRzKGNvb3Jkcyk7XG5cbiAgICAvLyBnZW5lcmF0ZSB0aGUgY2VsbCBrZXlcbiAgICB2YXIga2V5ID0gdGhpcy5fY2VsbENvb3Jkc1RvS2V5KGNvb3Jkcyk7XG5cbiAgICAvLyBnZXQgdGhlIGNlbGwgZnJvbSB0aGUgY2FjaGVcbiAgICB2YXIgY2VsbCA9IHRoaXMuX2NlbGxzW2tleV07XG4gICAgLy8gaWYgdGhpcyBjZWxsIHNob3VsZCBiZSBzaG93biBhcyBpc250IGFjdGl2ZSB5ZXQgKGVudGVyKVxuXG4gICAgaWYgKGNlbGwgJiYgIXRoaXMuX2FjdGl2ZUNlbGxzW2tleV0pIHtcbiAgICAgIGlmICh0aGlzLmNlbGxFbnRlcikge1xuICAgICAgICB0aGlzLmNlbGxFbnRlcihjZWxsLmJvdW5kcywgY29vcmRzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maXJlKCdjZWxsZW50ZXInLCB7XG4gICAgICAgIGJvdW5kczogY2VsbC5ib3VuZHMsXG4gICAgICAgIGNvb3JkczogY29vcmRzXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fYWN0aXZlQ2VsbHNba2V5XSA9IGNlbGw7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgZG9udCBoYXZlIHRoaXMgY2VsbCBpbiB0aGUgY2FjaGUgeWV0IChjcmVhdGUpXG4gICAgaWYgKCFjZWxsKSB7XG4gICAgICBjZWxsID0ge1xuICAgICAgICBjb29yZHM6IGNvb3JkcyxcbiAgICAgICAgYm91bmRzOiB0aGlzLl9jZWxsQ29vcmRzVG9Cb3VuZHMoY29vcmRzKVxuICAgICAgfTtcblxuICAgICAgdGhpcy5fY2VsbHNba2V5XSA9IGNlbGw7XG4gICAgICB0aGlzLl9hY3RpdmVDZWxsc1trZXldID0gY2VsbDtcblxuICAgICAgaWYgKHRoaXMuY3JlYXRlQ2VsbCkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNlbGwoY2VsbC5ib3VuZHMsIGNvb3Jkcyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlyZSgnY2VsbGNyZWF0ZScsIHtcbiAgICAgICAgYm91bmRzOiBjZWxsLmJvdW5kcyxcbiAgICAgICAgY29vcmRzOiBjb29yZHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBfd3JhcENvb3JkczogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIGNvb3Jkcy54ID0gdGhpcy5fd3JhcExuZyA/IEwuVXRpbC53cmFwTnVtKGNvb3Jkcy54LCB0aGlzLl93cmFwTG5nKSA6IGNvb3Jkcy54O1xuICAgIGNvb3Jkcy55ID0gdGhpcy5fd3JhcExhdCA/IEwuVXRpbC53cmFwTnVtKGNvb3Jkcy55LCB0aGlzLl93cmFwTGF0KSA6IGNvb3Jkcy55O1xuICB9LFxuXG4gIC8vIGdldCB0aGUgZ2xvYmFsIGNlbGwgY29vcmRpbmF0ZXMgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHpvb21cbiAgX2dldENlbGxOdW1Cb3VuZHM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYm91bmRzID0gdGhpcy5fbWFwLmdldFBpeGVsV29ybGRCb3VuZHMoKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX2dldENlbGxTaXplKCk7XG5cbiAgICByZXR1cm4gYm91bmRzID8gTC5ib3VuZHMoXG4gICAgICAgIGJvdW5kcy5taW4uZGl2aWRlQnkoc2l6ZSkuZmxvb3IoKSxcbiAgICAgICAgYm91bmRzLm1heC5kaXZpZGVCeShzaXplKS5jZWlsKCkuc3VidHJhY3QoWzEsIDFdKSkgOiBudWxsO1xuICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgVmlydHVhbEdyaWQ7XG4iLCJmdW5jdGlvbiBCaW5hcnlTZWFyY2hJbmRleCAodmFsdWVzKSB7XG4gIHRoaXMudmFsdWVzID0gW10uY29uY2F0KHZhbHVlcyB8fCBbXSk7XG59XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgaW5kZXggPSB0aGlzLmdldEluZGV4KHZhbHVlKTtcbiAgcmV0dXJuIHRoaXMudmFsdWVzW2luZGV4XTtcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5nZXRJbmRleCA9IGZ1bmN0aW9uIGdldEluZGV4ICh2YWx1ZSkge1xuICBpZiAodGhpcy5kaXJ0eSkge1xuICAgIHRoaXMuc29ydCgpO1xuICB9XG5cbiAgdmFyIG1pbkluZGV4ID0gMDtcbiAgdmFyIG1heEluZGV4ID0gdGhpcy52YWx1ZXMubGVuZ3RoIC0gMTtcbiAgdmFyIGN1cnJlbnRJbmRleDtcbiAgdmFyIGN1cnJlbnRFbGVtZW50O1xuXG4gIHdoaWxlIChtaW5JbmRleCA8PSBtYXhJbmRleCkge1xuICAgIGN1cnJlbnRJbmRleCA9IChtaW5JbmRleCArIG1heEluZGV4KSAvIDIgfCAwO1xuICAgIGN1cnJlbnRFbGVtZW50ID0gdGhpcy52YWx1ZXNbTWF0aC5yb3VuZChjdXJyZW50SW5kZXgpXTtcbiAgICBpZiAoK2N1cnJlbnRFbGVtZW50LnZhbHVlIDwgK3ZhbHVlKSB7XG4gICAgICBtaW5JbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgfSBlbHNlIGlmICgrY3VycmVudEVsZW1lbnQudmFsdWUgPiArdmFsdWUpIHtcbiAgICAgIG1heEluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gTWF0aC5hYnMofm1heEluZGV4KTtcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5iZXR3ZWVuID0gZnVuY3Rpb24gYmV0d2VlbiAoc3RhcnQsIGVuZCkge1xuICB2YXIgc3RhcnRJbmRleCA9IHRoaXMuZ2V0SW5kZXgoc3RhcnQpO1xuICB2YXIgZW5kSW5kZXggPSB0aGlzLmdldEluZGV4KGVuZCk7XG5cbiAgaWYgKHN0YXJ0SW5kZXggPT09IDAgJiYgZW5kSW5kZXggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB3aGlsZSAodGhpcy52YWx1ZXNbc3RhcnRJbmRleCAtIDFdICYmIHRoaXMudmFsdWVzW3N0YXJ0SW5kZXggLSAxXS52YWx1ZSA9PT0gc3RhcnQpIHtcbiAgICBzdGFydEluZGV4LS07XG4gIH1cblxuICB3aGlsZSAodGhpcy52YWx1ZXNbZW5kSW5kZXggKyAxXSAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleCArIDFdLnZhbHVlID09PSBlbmQpIHtcbiAgICBlbmRJbmRleCsrO1xuICB9XG5cbiAgaWYgKHRoaXMudmFsdWVzW2VuZEluZGV4XSAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleF0udmFsdWUgPT09IGVuZCAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleCArIDFdKSB7XG4gICAgZW5kSW5kZXgrKztcbiAgfVxuXG4gIHJldHVybiB0aGlzLnZhbHVlcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG59O1xuXG5CaW5hcnlTZWFyY2hJbmRleC5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gaW5zZXJ0IChpdGVtKSB7XG4gIHRoaXMudmFsdWVzLnNwbGljZSh0aGlzLmdldEluZGV4KGl0ZW0udmFsdWUpLCAwLCBpdGVtKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5CaW5hcnlTZWFyY2hJbmRleC5wcm90b3R5cGUuYnVsa0FkZCA9IGZ1bmN0aW9uIGJ1bGtBZGQgKGl0ZW1zLCBzb3J0KSB7XG4gIHRoaXMudmFsdWVzID0gdGhpcy52YWx1ZXMuY29uY2F0KFtdLmNvbmNhdChpdGVtcyB8fCBbXSkpO1xuXG4gIGlmIChzb3J0KSB7XG4gICAgdGhpcy5zb3J0KCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24gc29ydCAoKSB7XG4gIHRoaXMudmFsdWVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gK2IudmFsdWUgLSArYS52YWx1ZTtcbiAgfSkucmV2ZXJzZSgpO1xuICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQmluYXJ5U2VhcmNoSW5kZXg7XG4iLCJpbXBvcnQgeyBVdGlsLCBzZXRPcHRpb25zIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgZmVhdHVyZUxheWVyU2VydmljZSBmcm9tICcuLi8uLi9TZXJ2aWNlcy9GZWF0dXJlTGF5ZXJTZXJ2aWNlJztcbmltcG9ydCB7IGNsZWFuVXJsLCB3YXJuLCBzZXRFc3JpQXR0cmlidXRpb24gfSBmcm9tICcuLi8uLi9VdGlsJztcbmltcG9ydCBWaXJ0dWFsR3JpZCBmcm9tICdsZWFmbGV0LXZpcnR1YWwtZ3JpZCc7XG5pbXBvcnQgQmluYXJ5U2VhcmNoSW5kZXggZnJvbSAndGlueS1iaW5hcnktc2VhcmNoJztcblxuZXhwb3J0IHZhciBGZWF0dXJlTWFuYWdlciA9IFZpcnR1YWxHcmlkLmV4dGVuZCh7XG4gIC8qKlxuICAgKiBPcHRpb25zXG4gICAqL1xuXG4gIG9wdGlvbnM6IHtcbiAgICBhdHRyaWJ1dGlvbjogbnVsbCxcbiAgICB3aGVyZTogJzE9MScsXG4gICAgZmllbGRzOiBbJyonXSxcbiAgICBmcm9tOiBmYWxzZSxcbiAgICB0bzogZmFsc2UsXG4gICAgdGltZUZpZWxkOiBmYWxzZSxcbiAgICB0aW1lRmlsdGVyTW9kZTogJ3NlcnZlcicsXG4gICAgc2ltcGxpZnlGYWN0b3I6IDAsXG4gICAgcHJlY2lzaW9uOiA2XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgVmlydHVhbEdyaWQucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICAgIG9wdGlvbnMudXJsID0gY2xlYW5Vcmwob3B0aW9ucy51cmwpO1xuICAgIG9wdGlvbnMgPSBzZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5zZXJ2aWNlID0gZmVhdHVyZUxheWVyU2VydmljZShvcHRpb25zKTtcbiAgICB0aGlzLnNlcnZpY2UuYWRkRXZlbnRQYXJlbnQodGhpcyk7XG5cbiAgICAvLyB1c2UgY2FzZSBpbnNlbnNpdGl2ZSByZWdleCB0byBsb29rIGZvciBjb21tb24gZmllbGRuYW1lcyB1c2VkIGZvciBpbmRleGluZ1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZmllbGRzWzBdICE9PSAnKicpIHtcbiAgICAgIHZhciBvaWRDaGVjayA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmllbGRzW2ldLm1hdGNoKC9eKE9CSkVDVElEfEZJRHxPSUR8SUQpJC9pKSkge1xuICAgICAgICAgIG9pZENoZWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9pZENoZWNrID09PSBmYWxzZSkge1xuICAgICAgICB3YXJuKCdubyBrbm93biBlc3JpRmllbGRUeXBlT0lEIGZpZWxkIGRldGVjdGVkIGluIGZpZWxkcyBBcnJheS4gIFBsZWFzZSBhZGQgYW4gYXR0cmlidXRlIGZpZWxkIGNvbnRhaW5pbmcgdW5pcXVlIElEcyB0byBlbnN1cmUgdGhlIGxheWVyIGNhbiBiZSBkcmF3biBjb3JyZWN0bHkuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50aW1lRmllbGQuc3RhcnQgJiYgdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5lbmQpIHtcbiAgICAgIHRoaXMuX3N0YXJ0VGltZUluZGV4ID0gbmV3IEJpbmFyeVNlYXJjaEluZGV4KCk7XG4gICAgICB0aGlzLl9lbmRUaW1lSW5kZXggPSBuZXcgQmluYXJ5U2VhcmNoSW5kZXgoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy50aW1lRmllbGQpIHtcbiAgICAgIHRoaXMuX3RpbWVJbmRleCA9IG5ldyBCaW5hcnlTZWFyY2hJbmRleCgpO1xuICAgIH1cblxuICAgIHRoaXMuX2NhY2hlID0ge307XG4gICAgdGhpcy5fY3VycmVudFNuYXBzaG90ID0gW107IC8vIGNhY2hlIG9mIHdoYXQgbGF5ZXJzIHNob3VsZCBiZSBhY3RpdmVcbiAgICB0aGlzLl9hY3RpdmVSZXF1ZXN0cyA9IDA7XG4gIH0sXG5cbiAgLyoqXG4gICAqIExheWVyIEludGVyZmFjZVxuICAgKi9cblxuICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgIC8vIGluY2x1ZGUgJ1Bvd2VyZWQgYnkgRXNyaScgaW4gbWFwIGF0dHJpYnV0aW9uXG4gICAgc2V0RXNyaUF0dHJpYnV0aW9uKG1hcCk7XG5cbiAgICB0aGlzLnNlcnZpY2UubWV0YWRhdGEoZnVuY3Rpb24gKGVyciwgbWV0YWRhdGEpIHtcbiAgICAgIGlmICghZXJyKSB7XG4gICAgICAgIHZhciBzdXBwb3J0ZWRGb3JtYXRzID0gbWV0YWRhdGEuc3VwcG9ydGVkUXVlcnlGb3JtYXRzO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHNvbWVvbmUgaGFzIHJlcXVlc3RlZCB0aGF0IHdlIGRvbid0IHVzZSBnZW9KU09OLCBldmVuIGlmIGl0J3MgYXZhaWxhYmxlXG4gICAgICAgIHZhciBmb3JjZUpzb25Gb3JtYXQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuc2VydmljZS5vcHRpb25zLmlzTW9kZXJuID09PSBmYWxzZSkge1xuICAgICAgICAgIGZvcmNlSnNvbkZvcm1hdCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVbmxlc3Mgd2UndmUgYmVlbiB0b2xkIG90aGVyd2lzZSwgY2hlY2sgdG8gc2VlIHdoZXRoZXIgc2VydmljZSBjYW4gZW1pdCBHZW9KU09OIG5hdGl2ZWx5XG4gICAgICAgIGlmICghZm9yY2VKc29uRm9ybWF0ICYmIHN1cHBvcnRlZEZvcm1hdHMgJiYgc3VwcG9ydGVkRm9ybWF0cy5pbmRleE9mKCdnZW9KU09OJykgIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5zZXJ2aWNlLm9wdGlvbnMuaXNNb2Rlcm4gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGNvcHlyaWdodCB0ZXh0IGxpc3RlZCBpbiBzZXJ2aWNlIG1ldGFkYXRhXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uICYmIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wgJiYgbWV0YWRhdGEuY29weXJpZ2h0VGV4dCkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiA9IG1ldGFkYXRhLmNvcHlyaWdodFRleHQ7XG4gICAgICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5hZGRBdHRyaWJ1dGlvbih0aGlzLmdldEF0dHJpYnV0aW9uKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG5cbiAgICBtYXAub24oJ3pvb21lbmQnLCB0aGlzLl9oYW5kbGVab29tQ2hhbmdlLCB0aGlzKTtcblxuICAgIHJldHVybiBWaXJ0dWFsR3JpZC5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgbWFwLm9mZignem9vbWVuZCcsIHRoaXMuX2hhbmRsZVpvb21DaGFuZ2UsIHRoaXMpO1xuXG4gICAgcmV0dXJuIFZpcnR1YWxHcmlkLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsIG1hcCk7XG4gIH0sXG5cbiAgZ2V0QXR0cmlidXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGZWF0dXJlIE1hbmFnZW1lbnRcbiAgICovXG5cbiAgY3JlYXRlQ2VsbDogZnVuY3Rpb24gKGJvdW5kcywgY29vcmRzKSB7XG4gICAgLy8gZG9udCBmZXRjaCBmZWF0dXJlcyBvdXRzaWRlIHRoZSBzY2FsZSByYW5nZSBkZWZpbmVkIGZvciB0aGUgbGF5ZXJcbiAgICBpZiAodGhpcy5fdmlzaWJsZVpvb20oKSkge1xuICAgICAgdGhpcy5fcmVxdWVzdEZlYXR1cmVzKGJvdW5kcywgY29vcmRzKTtcbiAgICB9XG4gIH0sXG5cbiAgX3JlcXVlc3RGZWF0dXJlczogZnVuY3Rpb24gKGJvdW5kcywgY29vcmRzLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX2FjdGl2ZVJlcXVlc3RzKys7XG5cbiAgICAvLyBvdXIgZmlyc3QgYWN0aXZlIHJlcXVlc3QgZmlyZXMgbG9hZGluZ1xuICAgIGlmICh0aGlzLl9hY3RpdmVSZXF1ZXN0cyA9PT0gMSkge1xuICAgICAgdGhpcy5maXJlKCdsb2FkaW5nJywge1xuICAgICAgICBib3VuZHM6IGJvdW5kc1xuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2J1aWxkUXVlcnkoYm91bmRzKS5ydW4oZnVuY3Rpb24gKGVycm9yLCBmZWF0dXJlQ29sbGVjdGlvbiwgcmVzcG9uc2UpIHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5leGNlZWRlZFRyYW5zZmVyTGltaXQpIHtcbiAgICAgICAgdGhpcy5maXJlKCdkcmF3bGltaXRleGNlZWRlZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBubyBlcnJvciwgZmVhdHVyZXNcbiAgICAgIGlmICghZXJyb3IgJiYgZmVhdHVyZUNvbGxlY3Rpb24gJiYgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIHNjaGVkdWxlIGFkZGluZyBmZWF0dXJlcyB1bnRpbCB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWVcbiAgICAgICAgVXRpbC5yZXF1ZXN0QW5pbUZyYW1lKFV0aWwuYmluZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5fYWRkRmVhdHVyZXMoZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMsIGNvb3Jkcyk7XG4gICAgICAgICAgdGhpcy5fcG9zdFByb2Nlc3NGZWF0dXJlcyhib3VuZHMpO1xuICAgICAgICB9LCB0aGlzKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIG5vIGVycm9yLCBubyBmZWF0dXJlc1xuICAgICAgaWYgKCFlcnJvciAmJiBmZWF0dXJlQ29sbGVjdGlvbiAmJiAhZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX3Bvc3RQcm9jZXNzRmVhdHVyZXMoYm91bmRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX3Bvc3RQcm9jZXNzRmVhdHVyZXMoYm91bmRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgZXJyb3IsIGZlYXR1cmVDb2xsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICBfcG9zdFByb2Nlc3NGZWF0dXJlczogZnVuY3Rpb24gKGJvdW5kcykge1xuICAgIC8vIGRlaW5jcmVtZW50IHRoZSByZXF1ZXN0IGNvdW50ZXIgbm93IHRoYXQgd2UgaGF2ZSBwcm9jZXNzZWQgZmVhdHVyZXNcbiAgICB0aGlzLl9hY3RpdmVSZXF1ZXN0cy0tO1xuXG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIG1vcmUgYWN0aXZlIHJlcXVlc3RzIGZpcmUgYSBsb2FkIGV2ZW50IGZvciB0aGlzIHZpZXdcbiAgICBpZiAodGhpcy5fYWN0aXZlUmVxdWVzdHMgPD0gMCkge1xuICAgICAgdGhpcy5maXJlKCdsb2FkJywge1xuICAgICAgICBib3VuZHM6IGJvdW5kc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIF9jYWNoZUtleTogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHJldHVybiBjb29yZHMueiArICc6JyArIGNvb3Jkcy54ICsgJzonICsgY29vcmRzLnk7XG4gIH0sXG5cbiAgX2FkZEZlYXR1cmVzOiBmdW5jdGlvbiAoZmVhdHVyZXMsIGNvb3Jkcykge1xuICAgIHZhciBrZXkgPSB0aGlzLl9jYWNoZUtleShjb29yZHMpO1xuICAgIHRoaXMuX2NhY2hlW2tleV0gPSB0aGlzLl9jYWNoZVtrZXldIHx8IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IGZlYXR1cmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgaWQgPSBmZWF0dXJlc1tpXS5pZDtcblxuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTbmFwc2hvdC5pbmRleE9mKGlkKSA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFNuYXBzaG90LnB1c2goaWQpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2NhY2hlW2tleV0uaW5kZXhPZihpZCkgPT09IC0xKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlW2tleV0ucHVzaChpZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50aW1lRmllbGQpIHtcbiAgICAgIHRoaXMuX2J1aWxkVGltZUluZGV4ZXMoZmVhdHVyZXMpO1xuICAgIH1cblxuICAgIHRoaXMuY3JlYXRlTGF5ZXJzKGZlYXR1cmVzKTtcbiAgfSxcblxuICBfYnVpbGRRdWVyeTogZnVuY3Rpb24gKGJvdW5kcykge1xuICAgIHZhciBxdWVyeSA9IHRoaXMuc2VydmljZS5xdWVyeSgpXG4gICAgICAuaW50ZXJzZWN0cyhib3VuZHMpXG4gICAgICAud2hlcmUodGhpcy5vcHRpb25zLndoZXJlKVxuICAgICAgLmZpZWxkcyh0aGlzLm9wdGlvbnMuZmllbGRzKVxuICAgICAgLnByZWNpc2lvbih0aGlzLm9wdGlvbnMucHJlY2lzaW9uKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2ltcGxpZnlGYWN0b3IpIHtcbiAgICAgIHF1ZXJ5LnNpbXBsaWZ5KHRoaXMuX21hcCwgdGhpcy5vcHRpb25zLnNpbXBsaWZ5RmFjdG9yKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWVGaWx0ZXJNb2RlID09PSAnc2VydmVyJyAmJiB0aGlzLm9wdGlvbnMuZnJvbSAmJiB0aGlzLm9wdGlvbnMudG8pIHtcbiAgICAgIHF1ZXJ5LmJldHdlZW4odGhpcy5vcHRpb25zLmZyb20sIHRoaXMub3B0aW9ucy50byk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9LFxuXG4gIC8qKlxuICAgKiBXaGVyZSBNZXRob2RzXG4gICAqL1xuXG4gIHNldFdoZXJlOiBmdW5jdGlvbiAod2hlcmUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5vcHRpb25zLndoZXJlID0gKHdoZXJlICYmIHdoZXJlLmxlbmd0aCkgPyB3aGVyZSA6ICcxPTEnO1xuXG4gICAgdmFyIG9sZFNuYXBzaG90ID0gW107XG4gICAgdmFyIG5ld1NuYXBzaG90ID0gW107XG4gICAgdmFyIHBlbmRpbmdSZXF1ZXN0cyA9IDA7XG4gICAgdmFyIHJlcXVlc3RFcnJvciA9IG51bGw7XG4gICAgdmFyIHJlcXVlc3RDYWxsYmFjayA9IFV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIGZlYXR1cmVDb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmVxdWVzdEVycm9yID0gZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChmZWF0dXJlQ29sbGVjdGlvbikge1xuICAgICAgICBmb3IgKHZhciBpID0gZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBuZXdTbmFwc2hvdC5wdXNoKGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzW2ldLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwZW5kaW5nUmVxdWVzdHMtLTtcblxuICAgICAgaWYgKHBlbmRpbmdSZXF1ZXN0cyA8PSAwKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTbmFwc2hvdCA9IG5ld1NuYXBzaG90O1xuICAgICAgICAvLyBzY2hlZHVsZSBhZGRpbmcgZmVhdHVyZXMgZm9yIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxuICAgICAgICBVdGlsLnJlcXVlc3RBbmltRnJhbWUoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxheWVycyhvbGRTbmFwc2hvdCk7XG4gICAgICAgICAgdGhpcy5hZGRMYXllcnMobmV3U25hcHNob3QpO1xuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCByZXF1ZXN0RXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcykpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgZm9yICh2YXIgaSA9IHRoaXMuX2N1cnJlbnRTbmFwc2hvdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgb2xkU25hcHNob3QucHVzaCh0aGlzLl9jdXJyZW50U25hcHNob3RbaV0pO1xuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9hY3RpdmVDZWxscykge1xuICAgICAgcGVuZGluZ1JlcXVlc3RzKys7XG4gICAgICB2YXIgY29vcmRzID0gdGhpcy5fa2V5VG9DZWxsQ29vcmRzKGtleSk7XG4gICAgICB2YXIgYm91bmRzID0gdGhpcy5fY2VsbENvb3Jkc1RvQm91bmRzKGNvb3Jkcyk7XG4gICAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMoYm91bmRzLCBrZXksIHJlcXVlc3RDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0V2hlcmU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLndoZXJlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUaW1lIFJhbmdlIE1ldGhvZHNcbiAgICovXG5cbiAgZ2V0VGltZVJhbmdlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFt0aGlzLm9wdGlvbnMuZnJvbSwgdGhpcy5vcHRpb25zLnRvXTtcbiAgfSxcblxuICBzZXRUaW1lUmFuZ2U6IGZ1bmN0aW9uIChmcm9tLCB0bywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB2YXIgb2xkRnJvbSA9IHRoaXMub3B0aW9ucy5mcm9tO1xuICAgIHZhciBvbGRUbyA9IHRoaXMub3B0aW9ucy50bztcbiAgICB2YXIgcGVuZGluZ1JlcXVlc3RzID0gMDtcbiAgICB2YXIgcmVxdWVzdEVycm9yID0gbnVsbDtcbiAgICB2YXIgcmVxdWVzdENhbGxiYWNrID0gVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlcXVlc3RFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhpcy5fZmlsdGVyRXhpc3RpbmdGZWF0dXJlcyhvbGRGcm9tLCBvbGRUbywgZnJvbSwgdG8pO1xuXG4gICAgICBwZW5kaW5nUmVxdWVzdHMtLTtcblxuICAgICAgaWYgKGNhbGxiYWNrICYmIHBlbmRpbmdSZXF1ZXN0cyA8PSAwKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgcmVxdWVzdEVycm9yKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcblxuICAgIHRoaXMub3B0aW9ucy5mcm9tID0gZnJvbTtcbiAgICB0aGlzLm9wdGlvbnMudG8gPSB0bztcblxuICAgIHRoaXMuX2ZpbHRlckV4aXN0aW5nRmVhdHVyZXMob2xkRnJvbSwgb2xkVG8sIGZyb20sIHRvKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpbHRlck1vZGUgPT09ICdzZXJ2ZXInKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fYWN0aXZlQ2VsbHMpIHtcbiAgICAgICAgcGVuZGluZ1JlcXVlc3RzKys7XG4gICAgICAgIHZhciBjb29yZHMgPSB0aGlzLl9rZXlUb0NlbGxDb29yZHMoa2V5KTtcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMoYm91bmRzLCBrZXksIHJlcXVlc3RDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9hY3RpdmVDZWxscykge1xuICAgICAgdmFyIGNvb3JkcyA9IHRoaXMuX2tleVRvQ2VsbENvb3JkcyhrZXkpO1xuICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpO1xuICAgICAgdGhpcy5fcmVxdWVzdEZlYXR1cmVzKGJvdW5kcywga2V5KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWRyYXcpIHtcbiAgICAgIHRoaXMub25jZSgnbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5lYWNoRmVhdHVyZShmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgICAgICB0aGlzLl9yZWRyYXcobGF5ZXIuZmVhdHVyZS5pZCk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9LFxuXG4gIF9maWx0ZXJFeGlzdGluZ0ZlYXR1cmVzOiBmdW5jdGlvbiAob2xkRnJvbSwgb2xkVG8sIG5ld0Zyb20sIG5ld1RvKSB7XG4gICAgdmFyIGxheWVyc1RvUmVtb3ZlID0gKG9sZEZyb20gJiYgb2xkVG8pID8gdGhpcy5fZ2V0RmVhdHVyZXNJblRpbWVSYW5nZShvbGRGcm9tLCBvbGRUbykgOiB0aGlzLl9jdXJyZW50U25hcHNob3Q7XG4gICAgdmFyIGxheWVyc1RvQWRkID0gdGhpcy5fZ2V0RmVhdHVyZXNJblRpbWVSYW5nZShuZXdGcm9tLCBuZXdUbyk7XG5cbiAgICBpZiAobGF5ZXJzVG9BZGQuaW5kZXhPZikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnNUb0FkZC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2hvdWxkUmVtb3ZlTGF5ZXIgPSBsYXllcnNUb1JlbW92ZS5pbmRleE9mKGxheWVyc1RvQWRkW2ldKTtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUxheWVyID49IDApIHtcbiAgICAgICAgICBsYXllcnNUb1JlbW92ZS5zcGxpY2Uoc2hvdWxkUmVtb3ZlTGF5ZXIsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2NoZWR1bGUgYWRkaW5nIGZlYXR1cmVzIHVudGlsIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxuICAgIFV0aWwucmVxdWVzdEFuaW1GcmFtZShVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5yZW1vdmVMYXllcnMobGF5ZXJzVG9SZW1vdmUpO1xuICAgICAgdGhpcy5hZGRMYXllcnMobGF5ZXJzVG9BZGQpO1xuICAgIH0sIHRoaXMpKTtcbiAgfSxcblxuICBfZ2V0RmVhdHVyZXNJblRpbWVSYW5nZTogZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgaWRzID0gW107XG4gICAgdmFyIHNlYXJjaDtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpZWxkLnN0YXJ0ICYmIHRoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kKSB7XG4gICAgICB2YXIgc3RhcnRUaW1lcyA9IHRoaXMuX3N0YXJ0VGltZUluZGV4LmJldHdlZW4oc3RhcnQsIGVuZCk7XG4gICAgICB2YXIgZW5kVGltZXMgPSB0aGlzLl9lbmRUaW1lSW5kZXguYmV0d2VlbihzdGFydCwgZW5kKTtcbiAgICAgIHNlYXJjaCA9IHN0YXJ0VGltZXMuY29uY2F0KGVuZFRpbWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VhcmNoID0gdGhpcy5fdGltZUluZGV4LmJldHdlZW4oc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IHNlYXJjaC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWRzLnB1c2goc2VhcmNoW2ldLmlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWRzO1xuICB9LFxuXG4gIF9idWlsZFRpbWVJbmRleGVzOiBmdW5jdGlvbiAoZ2VvanNvbikge1xuICAgIHZhciBpO1xuICAgIHZhciBmZWF0dXJlO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpZWxkLnN0YXJ0ICYmIHRoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kKSB7XG4gICAgICB2YXIgc3RhcnRUaW1lRW50cmllcyA9IFtdO1xuICAgICAgdmFyIGVuZFRpbWVFbnRyaWVzID0gW107XG4gICAgICBmb3IgKGkgPSBnZW9qc29uLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGZlYXR1cmUgPSBnZW9qc29uW2ldO1xuICAgICAgICBzdGFydFRpbWVFbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydF0pXG4gICAgICAgIH0pO1xuICAgICAgICBlbmRUaW1lRW50cmllcy5wdXNoKHtcbiAgICAgICAgICBpZDogZmVhdHVyZS5pZCxcbiAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoZmVhdHVyZS5wcm9wZXJ0aWVzW3RoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kXSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFydFRpbWVJbmRleC5idWxrQWRkKHN0YXJ0VGltZUVudHJpZXMpO1xuICAgICAgdGhpcy5fZW5kVGltZUluZGV4LmJ1bGtBZGQoZW5kVGltZUVudHJpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdGltZUVudHJpZXMgPSBbXTtcbiAgICAgIGZvciAoaSA9IGdlb2pzb24ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgZmVhdHVyZSA9IGdlb2pzb25baV07XG4gICAgICAgIHRpbWVFbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZF0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90aW1lSW5kZXguYnVsa0FkZCh0aW1lRW50cmllcyk7XG4gICAgfVxuICB9LFxuXG4gIF9mZWF0dXJlV2l0aGluVGltZVJhbmdlOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmZyb20gfHwgIXRoaXMub3B0aW9ucy50bykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGZyb20gPSArdGhpcy5vcHRpb25zLmZyb20udmFsdWVPZigpO1xuICAgIHZhciB0byA9ICt0aGlzLm9wdGlvbnMudG8udmFsdWVPZigpO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMudGltZUZpZWxkID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGRhdGUgPSArZmVhdHVyZS5wcm9wZXJ0aWVzW3RoaXMub3B0aW9ucy50aW1lRmllbGRdO1xuICAgICAgcmV0dXJuIChkYXRlID49IGZyb20pICYmIChkYXRlIDw9IHRvKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydCAmJiB0aGlzLm9wdGlvbnMudGltZUZpZWxkLmVuZCkge1xuICAgICAgdmFyIHN0YXJ0RGF0ZSA9ICtmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydF07XG4gICAgICB2YXIgZW5kRGF0ZSA9ICtmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5lbmRdO1xuICAgICAgcmV0dXJuICgoc3RhcnREYXRlID49IGZyb20pICYmIChzdGFydERhdGUgPD0gdG8pKSB8fCAoKGVuZERhdGUgPj0gZnJvbSkgJiYgKGVuZERhdGUgPD0gdG8pKTtcbiAgICB9XG4gIH0sXG5cbiAgX3Zpc2libGVab29tOiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBvZiB0aGUgbWFwIGlzIHdpdGhpbiB0aGUgb3B0aW9uYWwgbGltaXQgZGVmaW5lZCBmb3IgdGhlIEZlYXR1cmVMYXllclxuICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKTtcbiAgICBpZiAoem9vbSA+IHRoaXMub3B0aW9ucy5tYXhab29tIHx8IHpvb20gPCB0aGlzLm9wdGlvbnMubWluWm9vbSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7IHJldHVybiB0cnVlOyB9XG4gIH0sXG5cbiAgX2hhbmRsZVpvb21DaGFuZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX3Zpc2libGVab29tKCkpIHtcbiAgICAgIHRoaXMucmVtb3ZlTGF5ZXJzKHRoaXMuX2N1cnJlbnRTbmFwc2hvdCk7XG4gICAgICB0aGlzLl9jdXJyZW50U25hcHNob3QgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLypcbiAgICAgIGZvciBldmVyeSBjZWxsIGluIHRoaXMuX2FjdGl2ZUNlbGxzXG4gICAgICAgIDEuIEdldCB0aGUgY2FjaGUga2V5IGZvciB0aGUgY29vcmRzIG9mIHRoZSBjZWxsXG4gICAgICAgIDIuIElmIHRoaXMuX2NhY2hlW2tleV0gZXhpc3RzIGl0IHdpbGwgYmUgYW4gYXJyYXkgb2YgZmVhdHVyZSBJRHMuXG4gICAgICAgIDMuIENhbGwgdGhpcy5hZGRMYXllcnModGhpcy5fY2FjaGVba2V5XSkgdG8gaW5zdHJ1Y3QgdGhlIGZlYXR1cmUgbGF5ZXIgdG8gYWRkIHRoZSBsYXllcnMgYmFjay5cbiAgICAgICovXG4gICAgICBmb3IgKHZhciBpIGluIHRoaXMuX2FjdGl2ZUNlbGxzKSB7XG4gICAgICAgIHZhciBjb29yZHMgPSB0aGlzLl9hY3RpdmVDZWxsc1tpXS5jb29yZHM7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLl9jYWNoZUtleShjb29yZHMpO1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVba2V5XSkge1xuICAgICAgICAgIHRoaXMuYWRkTGF5ZXJzKHRoaXMuX2NhY2hlW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIE1ldGhvZHNcbiAgICovXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB0aGlzLnNlcnZpY2UuYXV0aGVudGljYXRlKHRva2VuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBtZXRhZGF0YTogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5zZXJ2aWNlLm1ldGFkYXRhKGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UucXVlcnkoKTtcbiAgfSxcblxuICBfZ2V0TWV0YWRhdGE6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9tZXRhZGF0YSkge1xuICAgICAgdmFyIGVycm9yO1xuICAgICAgY2FsbGJhY2soZXJyb3IsIHRoaXMuX21ldGFkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhZGF0YShVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICBjYWxsYmFjayhlcnJvciwgdGhpcy5fbWV0YWRhdGEpO1xuICAgICAgfSwgdGhpcykpO1xuICAgIH1cbiAgfSxcblxuICBhZGRGZWF0dXJlOiBmdW5jdGlvbiAoZmVhdHVyZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLl9nZXRNZXRhZGF0YShVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCBtZXRhZGF0YSkge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChjYWxsYmFjaykgeyBjYWxsYmFjay5jYWxsKHRoaXMsIGVycm9yLCBudWxsKTsgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VydmljZS5hZGRGZWF0dXJlKGZlYXR1cmUsIFV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAvLyBhc3NpZ24gSUQgZnJvbSByZXN1bHQgdG8gYXBwcm9wcmlhdGUgb2JqZWN0aWQgZmllbGQgZnJvbSBzZXJ2aWNlIG1ldGFkYXRhXG4gICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW21ldGFkYXRhLm9iamVjdElkRmllbGRdID0gcmVzcG9uc2Uub2JqZWN0SWQ7XG5cbiAgICAgICAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gdXBkYXRlIHRoZSBnZW9qc29uIGlkIGZvciBjcmVhdGVMYXllcnMoKSB0byBmdW5jdGlvblxuICAgICAgICAgIGZlYXR1cmUuaWQgPSByZXNwb25zZS5vYmplY3RJZDtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUxheWVycyhbZmVhdHVyZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzKSk7XG4gICAgfSwgdGhpcykpO1xuICB9LFxuXG4gIHVwZGF0ZUZlYXR1cmU6IGZ1bmN0aW9uIChmZWF0dXJlLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuc2VydmljZS51cGRhdGVGZWF0dXJlKGZlYXR1cmUsIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMoW2ZlYXR1cmUuaWRdLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMYXllcnMoW2ZlYXR1cmVdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICBkZWxldGVGZWF0dXJlOiBmdW5jdGlvbiAoaWQsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5zZXJ2aWNlLmRlbGV0ZUZlYXR1cmUoaWQsIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGlmICghZXJyb3IgJiYgcmVzcG9uc2Uub2JqZWN0SWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMoW3Jlc3BvbnNlLm9iamVjdElkXSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9LFxuXG4gIGRlbGV0ZUZlYXR1cmVzOiBmdW5jdGlvbiAoaWRzLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZGVsZXRlRmVhdHVyZXMoaWRzLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoIWVycm9yICYmIHJlc3BvbnNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGF5ZXJzKFtyZXNwb25zZVtpXS5vYmplY3RJZF0sIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9XG59KTtcbiIsImltcG9ydCB7IFV0aWwsIEdlb0pTT04sIGxhdExuZyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgRmVhdHVyZU1hbmFnZXIgfSBmcm9tICcuL0ZlYXR1cmVNYW5hZ2VyJztcblxuZXhwb3J0IHZhciBGZWF0dXJlTGF5ZXIgPSBGZWF0dXJlTWFuYWdlci5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBjYWNoZUxheWVyczogdHJ1ZVxuICB9LFxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKi9cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuX29yaWdpbmFsU3R5bGUgPSB0aGlzLm9wdGlvbnMuc3R5bGU7XG4gICAgdGhpcy5fbGF5ZXJzID0ge307XG4gIH0sXG5cbiAgLyoqXG4gICAqIExheWVyIEludGVyZmFjZVxuICAgKi9cblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICBtYXAucmVtb3ZlTGF5ZXIodGhpcy5fbGF5ZXJzW2ldKTtcbiAgICAgIC8vIHRyaWdnZXIgdGhlIGV2ZW50IHdoZW4gdGhlIGVudGlyZSBmZWF0dXJlTGF5ZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBtYXBcbiAgICAgIHRoaXMuZmlyZSgncmVtb3ZlZmVhdHVyZScsIHtcbiAgICAgICAgZmVhdHVyZTogdGhpcy5fbGF5ZXJzW2ldLmZlYXR1cmUsXG4gICAgICAgIHBlcm1hbmVudDogZmFsc2VcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIGNyZWF0ZU5ld0xheWVyOiBmdW5jdGlvbiAoZ2VvanNvbikge1xuICAgIHZhciBsYXllciA9IEdlb0pTT04uZ2VvbWV0cnlUb0xheWVyKGdlb2pzb24sIHRoaXMub3B0aW9ucyk7XG4gICAgbGF5ZXIuZGVmYXVsdE9wdGlvbnMgPSBsYXllci5vcHRpb25zO1xuICAgIHJldHVybiBsYXllcjtcbiAgfSxcblxuICBfdXBkYXRlTGF5ZXI6IGZ1bmN0aW9uIChsYXllciwgZ2VvanNvbikge1xuICAgIC8vIGNvbnZlcnQgdGhlIGdlb2pzb24gY29vcmRpbmF0ZXMgaW50byBhIExlYWZsZXQgTGF0TG5nIGFycmF5L25lc3RlZCBhcnJheXNcbiAgICAvLyBwYXNzIGl0IHRvIHNldExhdExuZ3MgdG8gdXBkYXRlIGxheWVyIGdlb21ldHJpZXNcbiAgICB2YXIgbGF0bG5ncyA9IFtdO1xuICAgIHZhciBjb29yZHNUb0xhdExuZyA9IHRoaXMub3B0aW9ucy5jb29yZHNUb0xhdExuZyB8fCBHZW9KU09OLmNvb3Jkc1RvTGF0TG5nO1xuXG4gICAgLy8gY29weSBuZXcgYXR0cmlidXRlcywgaWYgcHJlc2VudFxuICAgIGlmIChnZW9qc29uLnByb3BlcnRpZXMpIHtcbiAgICAgIGxheWVyLmZlYXR1cmUucHJvcGVydGllcyA9IGdlb2pzb24ucHJvcGVydGllcztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGdlb2pzb24uZ2VvbWV0cnkudHlwZSkge1xuICAgICAgY2FzZSAnUG9pbnQnOlxuICAgICAgICBsYXRsbmdzID0gR2VvSlNPTi5jb29yZHNUb0xhdExuZyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgbGF5ZXIuc2V0TGF0TG5nKGxhdGxuZ3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0xpbmVTdHJpbmcnOlxuICAgICAgICBsYXRsbmdzID0gR2VvSlNPTi5jb29yZHNUb0xhdExuZ3MoZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlcywgMCwgY29vcmRzVG9MYXRMbmcpO1xuICAgICAgICBsYXllci5zZXRMYXRMbmdzKGxhdGxuZ3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ011bHRpTGluZVN0cmluZyc6XG4gICAgICAgIGxhdGxuZ3MgPSBHZW9KU09OLmNvb3Jkc1RvTGF0TG5ncyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzLCAxLCBjb29yZHNUb0xhdExuZyk7XG4gICAgICAgIGxheWVyLnNldExhdExuZ3MobGF0bG5ncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnUG9seWdvbic6XG4gICAgICAgIGxhdGxuZ3MgPSBHZW9KU09OLmNvb3Jkc1RvTGF0TG5ncyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzLCAxLCBjb29yZHNUb0xhdExuZyk7XG4gICAgICAgIGxheWVyLnNldExhdExuZ3MobGF0bG5ncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnTXVsdGlQb2x5Z29uJzpcbiAgICAgICAgbGF0bG5ncyA9IEdlb0pTT04uY29vcmRzVG9MYXRMbmdzKGdlb2pzb24uZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIDIsIGNvb3Jkc1RvTGF0TG5nKTtcbiAgICAgICAgbGF5ZXIuc2V0TGF0TG5ncyhsYXRsbmdzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBGZWF0dXJlIE1hbmFnZW1lbnQgTWV0aG9kc1xuICAgKi9cblxuICBjcmVhdGVMYXllcnM6IGZ1bmN0aW9uIChmZWF0dXJlcykge1xuICAgIGZvciAodmFyIGkgPSBmZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGdlb2pzb24gPSBmZWF0dXJlc1tpXTtcblxuICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2dlb2pzb24uaWRdO1xuICAgICAgdmFyIG5ld0xheWVyO1xuXG4gICAgICBpZiAodGhpcy5fdmlzaWJsZVpvb20oKSAmJiBsYXllciAmJiAhdGhpcy5fbWFwLmhhc0xheWVyKGxheWVyKSkge1xuICAgICAgICB0aGlzLl9tYXAuYWRkTGF5ZXIobGF5ZXIpO1xuICAgICAgICB0aGlzLmZpcmUoJ2FkZGZlYXR1cmUnLCB7XG4gICAgICAgICAgZmVhdHVyZTogbGF5ZXIuZmVhdHVyZVxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gdXBkYXRlIGdlb21ldHJ5IGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKGxheWVyICYmIHRoaXMub3B0aW9ucy5zaW1wbGlmeUZhY3RvciA+IDAgJiYgKGxheWVyLnNldExhdExuZ3MgfHwgbGF5ZXIuc2V0TGF0TG5nKSkge1xuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllciwgZ2VvanNvbik7XG4gICAgICB9XG5cbiAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgbmV3TGF5ZXIgPSB0aGlzLmNyZWF0ZU5ld0xheWVyKGdlb2pzb24pO1xuICAgICAgICBuZXdMYXllci5mZWF0dXJlID0gZ2VvanNvbjtcblxuICAgICAgICAvLyBidWJibGUgZXZlbnRzIGZyb20gaW5kaXZpZHVhbCBsYXllcnMgdG8gdGhlIGZlYXR1cmUgbGF5ZXJcbiAgICAgICAgbmV3TGF5ZXIuYWRkRXZlbnRQYXJlbnQodGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkVhY2hGZWF0dXJlKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLm9uRWFjaEZlYXR1cmUobmV3TGF5ZXIuZmVhdHVyZSwgbmV3TGF5ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FjaGUgdGhlIGxheWVyXG4gICAgICAgIHRoaXMuX2xheWVyc1tuZXdMYXllci5mZWF0dXJlLmlkXSA9IG5ld0xheWVyO1xuXG4gICAgICAgIC8vIHN0eWxlIHRoZSBsYXllclxuICAgICAgICB0aGlzLnNldEZlYXR1cmVTdHlsZShuZXdMYXllci5mZWF0dXJlLmlkLCB0aGlzLm9wdGlvbnMuc3R5bGUpO1xuXG4gICAgICAgIHRoaXMuZmlyZSgnY3JlYXRlZmVhdHVyZScsIHtcbiAgICAgICAgICBmZWF0dXJlOiBuZXdMYXllci5mZWF0dXJlXG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgbGF5ZXIgaWYgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBpcyBpbnNpZGUgdGhlIHJhbmdlIGRlZmluZWQgZm9yIHRoZSBsYXllciwgaXQgaXMgd2l0aGluIHRoZSBjdXJyZW50IHRpbWUgYm91bmRzIG9yIG91ciBsYXllciBpcyBub3QgdGltZSBlbmFibGVkXG4gICAgICAgIGlmICh0aGlzLl92aXNpYmxlWm9vbSgpICYmICghdGhpcy5vcHRpb25zLnRpbWVGaWVsZCB8fCAodGhpcy5vcHRpb25zLnRpbWVGaWVsZCAmJiB0aGlzLl9mZWF0dXJlV2l0aGluVGltZVJhbmdlKGdlb2pzb24pKSkpIHtcbiAgICAgICAgICB0aGlzLl9tYXAuYWRkTGF5ZXIobmV3TGF5ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGFkZExheWVyczogZnVuY3Rpb24gKGlkcykge1xuICAgIGZvciAodmFyIGkgPSBpZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tpZHNbaV1dO1xuICAgICAgaWYgKGxheWVyKSB7XG4gICAgICAgIHRoaXMuX21hcC5hZGRMYXllcihsYXllcik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlbW92ZUxheWVyczogZnVuY3Rpb24gKGlkcywgcGVybWFuZW50KSB7XG4gICAgZm9yICh2YXIgaSA9IGlkcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGlkID0gaWRzW2ldO1xuICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgIGlmIChsYXllcikge1xuICAgICAgICB0aGlzLmZpcmUoJ3JlbW92ZWZlYXR1cmUnLCB7XG4gICAgICAgICAgZmVhdHVyZTogbGF5ZXIuZmVhdHVyZSxcbiAgICAgICAgICBwZXJtYW5lbnQ6IHBlcm1hbmVudFxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKGxheWVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYXllciAmJiBwZXJtYW5lbnQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xheWVyc1tpZF07XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNlbGxFbnRlcjogZnVuY3Rpb24gKGJvdW5kcywgY29vcmRzKSB7XG4gICAgaWYgKHRoaXMuX3Zpc2libGVab29tKCkgJiYgIXRoaXMuX3pvb21pbmcgJiYgdGhpcy5fbWFwKSB7XG4gICAgICBVdGlsLnJlcXVlc3RBbmltRnJhbWUoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhY2hlS2V5ID0gdGhpcy5fY2FjaGVLZXkoY29vcmRzKTtcbiAgICAgICAgdmFyIGNlbGxLZXkgPSB0aGlzLl9jZWxsQ29vcmRzVG9LZXkoY29vcmRzKTtcbiAgICAgICAgdmFyIGxheWVycyA9IHRoaXMuX2NhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldICYmIGxheWVycykge1xuICAgICAgICAgIHRoaXMuYWRkTGF5ZXJzKGxheWVycyk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpKTtcbiAgICB9XG4gIH0sXG5cbiAgY2VsbExlYXZlOiBmdW5jdGlvbiAoYm91bmRzLCBjb29yZHMpIHtcbiAgICBpZiAoIXRoaXMuX3pvb21pbmcpIHtcbiAgICAgIFV0aWwucmVxdWVzdEFuaW1GcmFtZShVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgdmFyIGNhY2hlS2V5ID0gdGhpcy5fY2FjaGVLZXkoY29vcmRzKTtcbiAgICAgICAgICB2YXIgY2VsbEtleSA9IHRoaXMuX2NlbGxDb29yZHNUb0tleShjb29yZHMpO1xuICAgICAgICAgIHZhciBsYXllcnMgPSB0aGlzLl9jYWNoZVtjYWNoZUtleV07XG4gICAgICAgICAgdmFyIG1hcEJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldICYmIGxheWVycykge1xuICAgICAgICAgICAgdmFyIHJlbW92YWJsZSA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcnNbaV1dO1xuICAgICAgICAgICAgICBpZiAobGF5ZXIgJiYgbGF5ZXIuZ2V0Qm91bmRzICYmIG1hcEJvdW5kcy5pbnRlcnNlY3RzKGxheWVyLmdldEJvdW5kcygpKSkge1xuICAgICAgICAgICAgICAgIHJlbW92YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW1vdmFibGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMobGF5ZXJzLCAhdGhpcy5vcHRpb25zLmNhY2hlTGF5ZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY2FjaGVMYXllcnMgJiYgcmVtb3ZhYmxlKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVtjYWNoZUtleV07XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jZWxsc1tjZWxsS2V5XTtcbiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgdGhpcykpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU3R5bGluZyBNZXRob2RzXG4gICAqL1xuXG4gIHJlc2V0U3R5bGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3R5bGUgPSB0aGlzLl9vcmlnaW5hbFN0eWxlO1xuICAgIHRoaXMuZWFjaEZlYXR1cmUoZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICB0aGlzLnJlc2V0RmVhdHVyZVN0eWxlKGxheWVyLmZlYXR1cmUuaWQpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNldFN0eWxlOiBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3R5bGUgPSBzdHlsZTtcbiAgICB0aGlzLmVhY2hGZWF0dXJlKGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgdGhpcy5zZXRGZWF0dXJlU3R5bGUobGF5ZXIuZmVhdHVyZS5pZCwgc3R5bGUpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJlc2V0RmVhdHVyZVN0eWxlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgIHZhciBzdHlsZSA9IHRoaXMuX29yaWdpbmFsU3R5bGUgfHwgTC5QYXRoLnByb3RvdHlwZS5vcHRpb25zO1xuICAgIGlmIChsYXllcikge1xuICAgICAgVXRpbC5leHRlbmQobGF5ZXIub3B0aW9ucywgbGF5ZXIuZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgdGhpcy5zZXRGZWF0dXJlU3R5bGUoaWQsIHN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgc2V0RmVhdHVyZVN0eWxlOiBmdW5jdGlvbiAoaWQsIHN0eWxlKSB7XG4gICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICBpZiAodHlwZW9mIHN0eWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdHlsZSA9IHN0eWxlKGxheWVyLmZlYXR1cmUpO1xuICAgIH1cbiAgICBpZiAobGF5ZXIuc2V0U3R5bGUpIHtcbiAgICAgIGxheWVyLnNldFN0eWxlKHN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFV0aWxpdHkgTWV0aG9kc1xuICAgKi9cblxuICBlYWNoQWN0aXZlRmVhdHVyZTogZnVuY3Rpb24gKGZuLCBjb250ZXh0KSB7XG4gICAgLy8gZmlndXJlIG91dCAocm91Z2hseSkgd2hpY2ggbGF5ZXJzIGFyZSBpbiB2aWV3XG4gICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgdmFyIGFjdGl2ZUJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTtcbiAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgIGlmIChhY3RpdmVCb3VuZHMuaW50ZXJzZWN0cyh0aGlzLl9sYXllcnNbaV0uZ2V0Qm91bmRzKCkpICYmIHRoaXMuX2N1cnJlbnRTbmFwc2hvdC5pbmRleE9mKHRoaXMuX2xheWVyc1tpXS5mZWF0dXJlLmlkKSAhPT0gLTEpIHtcbiAgICAgICAgICBmbi5jYWxsKGNvbnRleHQsIHRoaXMuX2xheWVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZWFjaEZlYXR1cmU6IGZ1bmN0aW9uIChmbiwgY29udGV4dCkge1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICBmbi5jYWxsKGNvbnRleHQsIHRoaXMuX2xheWVyc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldEZlYXR1cmU6IGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiB0aGlzLl9sYXllcnNbaWRdO1xuICB9LFxuXG4gIGJyaW5nVG9CYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lYWNoRmVhdHVyZShmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgIGlmIChsYXllci5icmluZ1RvQmFjaykge1xuICAgICAgICBsYXllci5icmluZ1RvQmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIGJyaW5nVG9Gcm9udDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZWFjaEZlYXR1cmUoZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICBpZiAobGF5ZXIuYnJpbmdUb0Zyb250KSB7XG4gICAgICAgIGxheWVyLmJyaW5nVG9Gcm9udCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIHJlZHJhdzogZnVuY3Rpb24gKGlkKSB7XG4gICAgaWYgKGlkKSB7XG4gICAgICB0aGlzLl9yZWRyYXcoaWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBfcmVkcmF3OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgIHZhciBnZW9qc29uID0gbGF5ZXIuZmVhdHVyZTtcblxuICAgIC8vIGlmIHRoaXMgbG9va3MgbGlrZSBhIG1hcmtlclxuICAgIGlmIChsYXllciAmJiBsYXllci5zZXRJY29uICYmIHRoaXMub3B0aW9ucy5wb2ludFRvTGF5ZXIpIHtcbiAgICAgIC8vIHVwZGF0ZSBjdXN0b20gc3ltYm9sb2d5LCBpZiBuZWNlc3NhcnlcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9pbnRUb0xheWVyKSB7XG4gICAgICAgIHZhciBnZXRJY29uID0gdGhpcy5vcHRpb25zLnBvaW50VG9MYXllcihnZW9qc29uLCBsYXRMbmcoZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSwgZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlc1swXSkpO1xuICAgICAgICB2YXIgdXBkYXRlZEljb24gPSBnZXRJY29uLm9wdGlvbnMuaWNvbjtcbiAgICAgICAgbGF5ZXIuc2V0SWNvbih1cGRhdGVkSWNvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbG9va3MgbGlrZSBhIHZlY3RvciBtYXJrZXIgKGNpcmNsZU1hcmtlcilcbiAgICBpZiAobGF5ZXIgJiYgbGF5ZXIuc2V0U3R5bGUgJiYgdGhpcy5vcHRpb25zLnBvaW50VG9MYXllcikge1xuICAgICAgdmFyIGdldFN0eWxlID0gdGhpcy5vcHRpb25zLnBvaW50VG9MYXllcihnZW9qc29uLCBsYXRMbmcoZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSwgZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlc1swXSkpO1xuICAgICAgdmFyIHVwZGF0ZWRTdHlsZSA9IGdldFN0eWxlLm9wdGlvbnM7XG4gICAgICB0aGlzLnNldEZlYXR1cmVTdHlsZShnZW9qc29uLmlkLCB1cGRhdGVkU3R5bGUpO1xuICAgIH1cblxuICAgIC8vIGxvb2tzIGxpa2UgYSBwYXRoIChwb2x5Z29uL3BvbHlsaW5lKVxuICAgIGlmIChsYXllciAmJiBsYXllci5zZXRTdHlsZSAmJiB0aGlzLm9wdGlvbnMuc3R5bGUpIHtcbiAgICAgIHRoaXMucmVzZXRTdHlsZShnZW9qc29uLmlkKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZUxheWVyIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRmVhdHVyZUxheWVyKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmZWF0dXJlTGF5ZXI7XG4iXSwibmFtZXMiOlsiVXRpbCIsIkRvbVV0aWwiLCJzaGFsbG93Q2xvbmUiLCJhcmNnaXNUb0dlb0pTT04iLCJnZW9qc29uVG9BcmNHSVMiLCJnMmEiLCJhMmciLCJsYXRMbmciLCJsYXRMbmdCb3VuZHMiLCJDbGFzcyIsInBvaW50IiwiTGF0TG5nQm91bmRzIiwiTGF0TG5nIiwiR2VvSlNPTiIsIkV2ZW50ZWQiLCJUaWxlTGF5ZXIiLCJJbWFnZU92ZXJsYXkiLCJDUlMiLCJMYXllciIsInBvcHVwIiwiTCIsInNldE9wdGlvbnMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Q0NBTyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEcsQ0FBTyxJQUFJLGFBQWEsR0FB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QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEYsQ0FBQSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLENBQUEsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFakYsQ0FBQSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRTtBQUNoQixDQUFBLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUN0QixDQUFBLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7QUFFdEIsQ0FBQSxJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtBQUNsRCxDQUFBLE1BQU0sT0FBTyxJQUFJLENBQUM7QUFDbEIsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUEsQ0FBQzs7QUFFRCxDQUFBO0FBQ0EsQ0FBQSxTQUFTLG9CQUFvQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckMsQ0FBQSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxDQUFBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzNDLENBQUEsTUFBTSxJQUFJLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDbEUsQ0FBQSxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLENBQUEsT0FBTztBQUNQLENBQUEsS0FBSztBQUNMLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFBLENBQUM7O0FBRUQsQ0FBQTtBQUNBLENBQUEsU0FBUyx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO0FBQ3RELENBQUEsRUFBRSxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7QUFDdkIsQ0FBQSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDdEUsQ0FBQSxJQUFJLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RSxDQUFBLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDN0osQ0FBQSxNQUFNLFFBQVEsR0FBRyxDQUFDLFFBQVEsQ0FBQztBQUMzQixDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7QUFDSCxDQUFBLEVBQUUsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQSxDQUFDOztBQUVE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RTtBQUN4QyxDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO0FBQ3ZCLENBQUEsTUFBTSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDOUUsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDL0UsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxRQUFRLEVBQUUsVUFBVSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO0FBQy9ELENBQUEsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7O0FBRWxILENBQUEsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxNQUFNLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtBQUM3RSxDQUFBLE1BQU0sT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMvRCxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzNELENBQUEsR0FBRztBQUNILENBQUEsQ0FBQyxDQUFDLENBQUM7O0FBRUgsQ0FBTyxTQUFTLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDL0IsQ0FBQSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0IsQ0FBQSxDQUFDOztDQzVETSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQy9CLENBQUEsRUFBRSxPQUFPLEVBQUU7QUFDWCxDQUFBLElBQUksUUFBUSxFQUFFLGNBQWM7QUFDNUIsQ0FBQSxJQUFJLE9BQU8sRUFBRSxtQkFBbUI7QUFDaEMsQ0FBQSxJQUFJLFFBQVEsRUFBRSxXQUFXO0FBQ3pCLENBQUEsSUFBSSxXQUFXLEVBQUUsbUJBQW1CO0FBQ3BDLENBQUEsSUFBSSxZQUFZLEVBQUUsV0FBVztBQUM3QixDQUFBLElBQUksZ0JBQWdCLEVBQUUsZ0JBQWdCO0FBQ3RDLENBQUEsSUFBSSxPQUFPLEVBQUUsT0FBTztBQUNwQixDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLElBQUksRUFBRSxPQUFPOztBQUVmLENBQUEsRUFBRSxNQUFNLEVBQUU7QUFDVixDQUFBLElBQUksY0FBYyxFQUFFLElBQUk7QUFDeEIsQ0FBQSxJQUFJLEtBQUssRUFBRSxLQUFLO0FBQ2hCLENBQUEsSUFBSSxLQUFLLEVBQUUsSUFBSTtBQUNmLENBQUEsSUFBSSxTQUFTLEVBQUUsR0FBRztBQUNsQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxNQUFNLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDOUIsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHdCQUF3QixDQUFDO0FBQ3RELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxVQUFVLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDbEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLDBCQUEwQixDQUFDO0FBQ3hELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxRQUFRLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHNCQUFzQixDQUFDO0FBQ3BELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxPQUFPLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDL0IsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHVCQUF1QixDQUFDO0FBQ3JELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxPQUFPLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDL0IsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHVCQUF1QixDQUFDO0FBQ3JELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxRQUFRLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxN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QUFDOztBQUVqRSxDQUFBLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDeEMsQ0FBQSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDOztBQUVwRSxDQUFBLElBQUksSUFBSSxNQUFNLEdBQUc7QUFDakIsQ0FBQSxNQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQzlDLENBQUEsTUFBTSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDakMsQ0FBQSxNQUFNLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07QUFDakMsQ0FBQSxNQUFNLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7QUFDM0MsQ0FBQSxNQUFNLE1BQU0sRUFBRSxFQUFFO0FBQ2hCLENBQUEsTUFBTSxPQUFPLEVBQUUsRUFBRTtBQUNqQixDQUFBLEtBQUssQ0FBQzs7QUFFTixDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRTtBQUM5QyxDQUFBLE1BQU0sTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUks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QztBQUM5RCxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7QUFDaEMsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxTQUFTLEdBQUcsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3RJLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtBQUNsQyxDQUFBLE1BQU0sTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDcEUsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFO0FBQzlDLENBQUEsTUFBTSxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNsRixDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO0FBQ3BDLENBQUEsTUFBTSxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUNoRCxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDNUIsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FB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QSxHQUFHOztBQUVILENBQUEsRUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHLEVBQUU7QUFDL0UsQ0FBQSxJQUFJLFFBQVEsRUFBRSxDQUFDO0FBQ2YsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ2pHLENBQUEsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUNmLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDakQsQ0FBQSxDQUFDLENBQUM7O0FBRUYsQ0FBQSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTSxFQUFFLElBQUksRUFBRTtBQUM1RCxDQUFBLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pELENBQUEsRUFBRSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUEsQ0FBQyxDQUFDOztBQUVGLENBQUEsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxTQUFTLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0FBQ3JFLENBQUEsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FB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QUFTLENBQUMsQ0FBQztBQUM3RCxDQUFBLE1BQU0sT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM1QyxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtBQUNwRSxDQUFBLE1BQU0sSUFBSSxTQUFTLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hFLENBQUEsTUFBTSxJQUFJLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEUsQ0FBQSxNQUFNLE9BQU8sQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsRyxDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFlBQVksRUFBRSxZQUFZO0FBQzVCLENBQUE7QUFDQSxDQUFBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDcEIsQ0FBQSxNQUFNLE9BQU8sS0FBSyxDQUFDO0FBQ25CLENBQUEsS0FBSztBQUNMLENBQUEsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ25DLENBQUEsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFP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
--- a/src/pyams_gis/resources/js/leaflet-esri-2.0.8.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("leaflet")):"function"==typeof define&&define.amd?define(["exports","leaflet"],e):e((t.L=t.L||{},t.L.esri=t.L.esri||{}),t.L)}(this,function(t,e){"use strict";function i(t){var e="";t.f=t.f||"json";for(var i in t)if(t.hasOwnProperty(i)){var s,r=t[i],n=Object.prototype.toString.call(r);e.length&&(e+="&"),s="[object Array]"===n?"[object Object]"===Object.prototype.toString.call(r[0])?JSON.stringify(r):r.join(","):"[object Object]"===n?JSON.stringify(r):"[object Date]"===n?r.valueOf():r,e+=encodeURIComponent(i)+"="+encodeURIComponent(s)}return e}function s(t,i){var s=new window.XMLHttpRequest;return s.onerror=function(r){s.onreadystatechange=e.Util.falseFn,t.call(i,{error:{code:500,message:"XMLHttpRequest error"}},null)},s.onreadystatechange=function(){var r,n;if(4===s.readyState){try{r=JSON.parse(s.responseText)}catch(t){r=null,n={code:500,message:"Could not parse response as JSON. This could also be caused by a CORS or XMLHttpRequest error."}}!n&&r.error&&(n=r.error,r=null),s.onerror=e.Util.falseFn,t.call(i,n,r)}},s.ontimeout=function(){this.onerror()},s}function r(t,e,r,n){var o=s(r,n);return o.open("POST",t),void 0!==n&&null!==n&&void 0!==n.options&&(o.timeout=n.options.timeout),o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),o.send(i(e)),o}function n(t,e,r,n){var o=s(r,n);return o.open("GET",t+"?"+i(e),!0),void 0!==n&&null!==n&&void 0!==n.options&&(o.timeout=n.options.timeout),o.send(null),o}function o(t,e,r,n){var o=i(e),u=s(r,n),l=(t+"?"+o).length;if(l<=2e3&&J.cors?u.open("GET",t+"?"+o):l>2e3&&J.cors&&(u.open("POST",t),u.setRequestHeader("Content-Type","application/x-www-form-urlencoded")),void 0!==n&&null!==n&&void 0!==n.options&&(u.timeout=n.options.timeout),l<=2e3&&J.cors)u.send(null);else{if(!(l>2e3&&J.cors))return l<=2e3&&!J.cors?a(t,e,r,n):void O("a request to "+t+" was longer then 2000 characters and this browser cannot make a cross-domain post request. Please use a proxy http://esri.github.io/esri-leaflet/api-reference/request.html");u.send(o)}return u}function a(t,s,r,n){window._EsriLeafletCallbacks=window._EsriLeafletCallbacks||{};var o="c"+H;s.callback="window._EsriLeafletCallbacks."+o,window._EsriLeafletCallbacks[o]=function(t){if(!0!==window._EsriLeafletCallbacks[o]){var e,i=Object.prototype.toString.call(t);"[object Object]"!==i&&"[object Array]"!==i&&(e={error:{code:500,message:"Expected array or object as JSONP response"}},t=null),!e&&t.error&&(e=t,t=null),r.call(n,e,t),window._EsriLeafletCallbacks[o]=!0}};var a=e.DomUtil.create("script",null,document.body);return a.type="text/javascript",a.src=t+"?"+i(s),a.id=o,H++,{id:o,url:a.src,abort:function(){window._EsriLeafletCallbacks._callback[o]({code:0,message:"Request aborted."})}}}function u(t,e){for(var i=0;i<t.length;i++)if(t[i]!==e[i])return!1;return!0}function l(t){return u(t[0],t[t.length-1])||t.push(t[0]),t}function h(t){var e,i=0,s=0,r=t.length,n=t[s];for(s;s<r-1;s++)i+=((e=t[s+1])[0]-n[0])*(e[1]+n[1]),n=e;return i>=0}function c(t,e,i,s){var r=(s[0]-i[0])*(t[1]-i[1])-(s[1]-i[1])*(t[0]-i[0]),n=(e[0]-t[0])*(t[1]-i[1])-(e[1]-t[1])*(t[0]-i[0]),o=(s[1]-i[1])*(e[0]-t[0])-(s[0]-i[0])*(e[1]-t[1]);if(0!==o){var a=r/o,u=n/o;if(a>=0&&a<=1&&u>=0&&u<=1)return!0}return!1}function p(t,e){for(var i=0;i<t.length-1;i++)for(var s=0;s<e.length-1;s++)if(c(t[i],t[i+1],e[s],e[s+1]))return!0;return!1}function d(t,e){for(var i=!1,s=-1,r=t.length,n=r-1;++s<r;n=s)(t[s][1]<=e[1]&&e[1]<t[n][1]||t[n][1]<=e[1]&&e[1]<t[s][1])&&e[0]<(t[n][0]-t[s][0])*(e[1]-t[s][1])/(t[n][1]-t[s][1])+t[s][0]&&(i=!i);return i}function m(t,e){var i=p(t,e),s=d(t,e[0]);return!(i||!s)}function f(t){for(var e,i,s,r=[],n=[],o=0;o<t.length;o++){var a=l(t[o].slice(0));if(!(a.length<4))if(h(a)){var u=[a];r.push(u)}else n.push(a)}for(var c=[];n.length;){s=n.pop();var d=!1;for(e=r.length-1;e>=0;e--)if(i=r[e][0],m(i,s)){r[e].push(s),d=!0;break}d||c.push(s)}for(;c.length;){s=c.pop();var f=!1;for(e=r.length-1;e>=0;e--)if(i=r[e][0],p(i,s)){r[e].push(s),f=!0;break}f||r.push([s.reverse()])}return 1===r.length?{type:"Polygon",coordinates:r[0]}:{type:"MultiPolygon",coordinates:r}}function y(t){var e=[],i=t.slice(0),s=l(i.shift().slice(0));if(s.length>=4){h(s)||s.reverse(),e.push(s);for(var r=0;r<i.length;r++){var n=l(i[r].slice(0));n.length>=4&&(h(n)&&n.reverse(),e.push(n))}}return e}function g(t){for(var e=[],i=0;i<t.length;i++)for(var s=y(t[i]),r=s.length-1;r>=0;r--){var n=s[r].slice(0);e.push(n)}return e}function _(t){var e={};for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i]);return e}function v(t,e){var i={};return"number"==typeof t.x&&"number"==typeof t.y&&(i.type="Point",i.coordinates=[t.x,t.y]),t.points&&(i.type="MultiPoint",i.coordinates=t.points.slice(0)),t.paths&&(1===t.paths.length?(i.type="LineString",i.coordinates=t.paths[0].slice(0)):(i.type="MultiLineString",i.coordinates=t.paths.slice(0))),t.rings&&(i=f(t.rings.slice(0))),(t.geometry||t.attributes)&&(i.type="Feature",i.geometry=t.geometry?v(t.geometry):null,i.properties=t.attributes?_(t.attributes):null,t.attributes&&(i.id=t.attributes[e]||t.attributes.OBJECTID||t.attributes.FID)),i}function b(t,e){e=e||"OBJECTID";var i,s={wkid:4326},r={};switch(t.type){case"Point":r.x=t.coordinates[0],r.y=t.coordinates[1],r.spatialReference=s;break;case"MultiPoint":r.points=t.coordinates.slice(0),r.spatialReference=s;break;case"LineString":r.paths=[t.coordinates.slice(0)],r.spatialReference=s;break;case"MultiLineString":r.paths=t.coordinates.slice(0),r.spatialReference=s;break;case"Polygon":r.rings=y(t.coordinates.slice(0)),r.spatialReference=s;break;case"MultiPolygon":r.rings=g(t.coordinates.slice(0)),r.spatialReference=s;break;case"Feature":t.geometry&&(r.geometry=b(t.geometry,e)),r.attributes=t.properties?_(t.properties):{},t.id&&(r.attributes[e]=t.id);break;case"FeatureCollection":for(r=[],i=0;i<t.features.length;i++)r.push(b(t.features[i],e));break;case"GeometryCollection":for(r=[],i=0;i<t.geometries.length;i++)r.push(b(t.geometries[i],e))}return r}function x(t,e){return b(t,e)}function S(t,e){return v(t,e)}function A(t){if("NaN"!==t.xmin&&"NaN"!==t.ymin&&"NaN"!==t.xmax&&"NaN"!==t.ymax){var i=e.latLng(t.ymin,t.xmin),s=e.latLng(t.ymax,t.xmax);return e.latLngBounds(i,s)}return null}function T(t){return t=e.latLngBounds(t),{xmin:t.getSouthWest().lng,ymin:t.getSouthWest().lat,xmax:t.getNorthEast().lng,ymax:t.getNorthEast().lat,spatialReference:{wkid:4326}}}function I(t,e){var i,s=t.features||t.results,r=s.length;if(e)i=e;else if(t.objectIdFieldName)i=t.objectIdFieldName;else if(t.fields){for(var n=0;n<=t.fields.length-1;n++)if("esriFieldTypeOID"===t.fields[n].type){i=t.fields[n].name;break}}else if(r)for(var o in s[0].attributes)if(o.match(/^(OBJECTID|FID|OID|ID)$/i)){i=o;break}var a={type:"FeatureCollection",features:[]};if(r)for(var u=s.length-1;u>=0;u--){var l=S(s[u],i);a.features.push(l)}return a}function w(t){return"/"!==(t=e.Util.trim(t))[t.length-1]&&(t+="/"),t}function R(t){return/^(?!.*utility\.arcgis\.com).*\.arcgis\.com.*FeatureServer/i.test(t)}function C(t){var e;switch(t){case"Point":e="esriGeometryPoint";break;case"MultiPoint":e="esriGeometryMultipoint";break;case"LineString":case"MultiLineString":e="esriGeometryPolyline";break;case"Polygon":case"MultiPolygon":e="esriGeometryPolygon"}return e}function O(){console&&console.warn&&console.warn.apply(console,arguments)}function F(t){return t.getSize().x-Q.attributionWidthOffset+"px"}function P(t){if(t.attributionControl&&!t.attributionControl._esriAttributionAdded){t.attributionControl.setPrefix('<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a> | Powered by <a href="https://www.esri.com">Esri</a>');var i=document.createElement("style");i.type="text/css",i.innerHTML=".esri-truncated-attribution:hover {white-space: normal;}",document.getElementsByTagName("head")[0].appendChild(i),e.DomUtil.addClass(t.attributionControl._container,"esri-truncated-attribution:hover");var s=document.createElement("style");s.type="text/css",s.innerHTML=".esri-truncated-attribution {vertical-align: -3px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;display: inline-block;transition: 0s white-space;transition-delay: 1s;max-width: "+F(t)+";}",document.getElementsByTagName("head")[0].appendChild(s),e.DomUtil.addClass(t.attributionControl._container,"esri-truncated-attribution"),t.on("resize",function(e){t.attributionControl._container.style.maxWidth=F(e.target)}),t.attributionControl._esriAttributionAdded=!0}}function k(t,i){a(t,{},e.Util.bind(function(t,s){if(!t){i._esriAttributions=[];for(var r=0;r<s.contributors.length;r++)for(var n=s.contributors[r],o=0;o<n.coverageAreas.length;o++){var a=n.coverageAreas[o],u=e.latLng(a.bbox[0],a.bbox[1]),l=e.latLng(a.bbox[2],a.bbox[3]);i._esriAttributions.push({attribution:n.attribution,score:a.score,bounds:e.latLngBounds(u,l),minZoom:a.zoomMin,maxZoom:a.zoomMax})}i._esriAttributions.sort(function(t,e){return e.score-t.score}),M({target:i})}},this))}function M(t){var i=t.target,s=i._esriAttributions;if(i&&i.attributionControl&&s){for(var r="",n=i.getBounds(),o=e.latLngBounds(n.getSouthWest().wrap(),n.getNorthEast().wrap()),a=i.getZoom(),u=0;u<s.length;u++){var l=s[u],h=l.attribution;!r.match(h)&&l.bounds.intersects(o)&&a>=l.minZoom&&a<=l.maxZoom&&(r+=", "+h)}r=r.substr(2);var c=i.attributionControl._container.querySelector(".esri-dynamic-attribution");c.innerHTML=r,c.style.maxWidth=F(i),i.fire("attributionupdated",{attribution:r})}}function G(t){return new Y(t)}function E(t){return new tt(t)}function U(t){return new it(t)}function q(t){return new st(t)}function D(t){return new nt(t)}function B(t){return new ot(t)}function z(t){return new at(t)}function N(t){this.values=[].concat(t||[])}var j="default"in e?e.default:e,Z=window.XMLHttpRequest&&"withCredentials"in new window.XMLHttpRequest,W=""===document.documentElement.style.pointerEvents,J={cors:Z,pointerEvents:W},Q={attributionWidthOffset:55},H=0,V=J.cors?n:a;V.CORS=n,V.JSONP=a;var K={request:o,get:V,post:r},X={shallowClone:function(t){var e={};for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i]);return e},warn:O,cleanUrl:w,isArcgisOnline:R,geojsonTypeToArcGIS:C,responseToFeatureCollection:I,geojsonToArcGIS:x,arcgisToGeoJSON:S,boundsToExtent:T,extentToBounds:A,calcAttributionWidth:F,setEsriAttribution:P,_getAttributionData:k,_updateMapAttribution:M},$=e.Class.extend({options:{proxy:!1,useCors:Z},generateSetter:function(t,i){return e.Util.bind(function(e){return this.params[t]=e,this},i)},initialize:function(t){if(t.request&&t.options?(this._service=t,e.Util.setOptions(this,t.options)):(e.Util.setOptions(this,t),this.options.url=w(t.url)),this.params=e.Util.extend({},this.params||{}),this.setters)for(var i in this.setters){var s=this.setters[i];this[i]=this.generateSetter(s,this)}},token:function(t){return this._service?this._service.authenticate(t):this.params.token=t,this},request:function(t,e){return this._service?this._service.request(this.path,this.params,t,e):this._request("request",this.path,this.params,t,e)},_request:function(t,e,i,s,r){var n=this.options.proxy?this.options.proxy+"?"+this.options.url+e:this.options.url+e;return"get"!==t&&"request"!==t||this.options.useCors?K[t](n,i,s,r):K.get.JSONP(n,i,s,r)}}),Y=$.extend({setters:{offset:"resultOffset",limit:"resultRecordCount",fields:"outFields",precision:"geometryPrecision",featureIds:"objectIds",returnGeometry:"returnGeometry",token:"token"},path:"query",params:{returnGeometry:!0,where:"1=1",outSr:4326,outFields:"*"},within:function(t){return this._setGeometry(t),this.params.spatialRel="esriSpatialRelContains",this},intersects:function(t){return this._setGeometry(t),this.params.spatialRel="esriSpatialRelIntersects",this},contains:function(t){return this._setGeometry(t),this.params.spatialRel="esriSpatialRelWithin",this},crosses:function(t){return this._setGeometry(t),this.params.spatialRel="esriSpatialRelCrosses",this},touches:function(t){return this._setGeometry(t),this.params.spatialRel="esriSpatialRelTouches",this},overlaps:function(t){return this._setGeometry(t),this.params.spatialRel="esriSpatialRelOverlaps",this},bboxIntersects:function(t){return this._setGeometry(t),this.params.spatialRel="esriSpatialRelEnvelopeIntersects",this},indexIntersects:function(t){return this._setGeometry(t),this.params.spatialRel="esriSpatialRelIndexIntersects",this},nearby:function(t,i){return t=e.latLng(t),this.params.geometry=[t.lng,t.lat],this.params.geometryType="esriGeometryPoint",this.params.spatialRel="esriSpatialRelIntersects",this.params.units="esriSRUnit_Meter",this.params.distance=i,this.params.inSr=4326,this},where:function(t){return this.params.where=t,this},between:function(t,e){return this.params.time=[t.valueOf(),e.valueOf()],this},simplify:function(t,e){var i=Math.abs(t.getBounds().getWest()-t.getBounds().getEast());return this.params.maxAllowableOffset=i/t.getSize().y*e,this},orderBy:function(t,e){return e=e||"ASC",this.params.orderByFields=this.params.orderByFields?this.params.orderByFields+",":"",this.params.orderByFields+=[t,e].join(" "),this},run:function(t,e){return this._cleanParams(),this.options.isModern||R(this.options.url)?(this.params.f="geojson",this.request(function(i,s){this._trapSQLerrors(i),t.call(e,i,s,s)},this)):this.request(function(i,s){this._trapSQLerrors(i),t.call(e,i,s&&I(s),s)},this)},count:function(t,e){return this._cleanParams(),this.params.returnCountOnly=!0,this.request(function(e,i){t.call(this,e,i&&i.count,i)},e)},ids:function(t,e){return this._cleanParams(),this.params.returnIdsOnly=!0,this.request(function(e,i){t.call(this,e,i&&i.objectIds,i)},e)},bounds:function(t,e){return this._cleanParams(),this.params.returnExtentOnly=!0,this.request(function(i,s){s&&s.extent&&A(s.extent)?t.call(e,i,A(s.extent),s):(i={message:"Invalid Bounds"},t.call(e,i,null,s))},e)},pixelSize:function(t){var i=e.point(t);return this.params.pixelSize=[i.x,i.y],this},layer:function(t){return this.path=t+"/query",this},_trapSQLerrors:function(t){t&&"400"===t.code&&O("one common syntax error in query requests is encasing string values in double quotes instead of single quotes")},_cleanParams:function(){delete this.params.returnIdsOnly,delete this.params.returnExtentOnly,delete this.params.returnCountOnly},_setGeometry:function(t){return this.params.inSr=4326,t instanceof e.LatLngBounds?(this.params.geometry=T(t),void(this.params.geometryType="esriGeometryEnvelope")):(t.getLatLng&&(t=t.getLatLng()),t instanceof e.LatLng&&(t={type:"Point",coordinates:[t.lng,t.lat]}),t instanceof e.GeoJSON&&(t=t.getLayers()[0].feature.geometry,this.params.geometry=x(t),this.params.geometryType=C(t.type)),t.toGeoJSON&&(t=t.toGeoJSON()),"Feature"===t.type&&(t=t.geometry),"Point"===t.type||"LineString"===t.type||"Polygon"===t.type||"MultiPolygon"===t.type?(this.params.geometry=x(t),void(this.params.geometryType=C(t.type))):void O("invalid geometry passed to spatial query. Should be L.LatLng, L.LatLngBounds, L.Marker or a GeoJSON Point, Line, Polygon or MultiPolygon object"))}}),tt=$.extend({setters:{contains:"contains",text:"searchText",fields:"searchFields",spatialReference:"sr",sr:"sr",layers:"layers",returnGeometry:"returnGeometry",maxAllowableOffset:"maxAllowableOffset",precision:"geometryPrecision",dynamicLayers:"dynamicLayers",returnZ:"returnZ",returnM:"returnM",gdbVersion:"gdbVersion",token:"token"},path:"find",params:{sr:4326,contains:!0,returnGeometry:!0,returnZ:!0,returnM:!1},layerDefs:function(t,e){return this.params.layerDefs=this.params.layerDefs?this.params.layerDefs+";":"",this.params.layerDefs+=[t,e].join(":"),this},simplify:function(t,e){var i=Math.abs(t.getBounds().getWest()-t.getBounds().getEast());return this.params.maxAllowableOffset=i/t.getSize().y*e,this},run:function(t,e){return this.request(function(i,s){t.call(e,i,s&&I(s),s)},e)}}),et=$.extend({path:"identify",between:function(t,e){return this.params.time=[t.valueOf(),e.valueOf()],this}}),it=et.extend({setters:{layers:"layers",precision:"geometryPrecision",tolerance:"tolerance",returnGeometry:"returnGeometry"},params:{sr:4326,layers:"all",tolerance:3,returnGeometry:!0},on:function(t){var e=T(t.getBounds()),i=t.getSize();return this.params.imageDisplay=[i.x,i.y,96],this.params.mapExtent=[e.xmin,e.ymin,e.xmax,e.ymax],this},at:function(t){return t=e.latLng(t),this.params.geometry=[t.lng,t.lat],this.params.geometryType="esriGeometryPoint",this},layerDef:function(t,e){return this.params.layerDefs=this.params.layerDefs?this.params.layerDefs+";":"",this.params.layerDefs+=[t,e].join(":"),this},simplify:function(t,e){var i=Math.abs(t.getBounds().getWest()-t.getBounds().getEast());return this.params.maxAllowableOffset=i/t.getSize().y*e,this},run:function(t,e){return this.request(function(i,s){if(i)t.call(e,i,void 0,s);else{var r=I(s);s.results=s.results.reverse();for(var n=0;n<r.features.length;n++)r.features[n].layerId=s.results[n].layerId;t.call(e,void 0,r,s)}})}}),st=et.extend({setters:{setMosaicRule:"mosaicRule",setRenderingRule:"renderingRule",setPixelSize:"pixelSize",returnCatalogItems:"returnCatalogItems",returnGeometry:"returnGeometry"},params:{returnGeometry:!1},at:function(t){return t=e.latLng(t),this.params.geometry=JSON.stringify({x:t.lng,y:t.lat,spatialReference:{wkid:4326}}),this.params.geometryType="esriGeometryPoint",this},getMosaicRule:function(){return this.params.mosaicRule},getRenderingRule:function(){return this.params.renderingRule},getPixelSize:function(){return this.params.pixelSize},run:function(t,e){return this.request(function(i,s){t.call(e,i,s&&this._responseToGeoJSON(s),s)},this)},_responseToGeoJSON:function(t){var e=t.location,i=t.catalogItems,s=t.catalogItemVisibilities,r={pixel:{type:"Feature",geometry:{type:"Point",coordinates:[e.x,e.y]},crs:{type:"EPSG",properties:{code:e.spatialReference.wkid}},properties:{OBJECTID:t.objectId,name:t.name,value:t.value},id:t.objectId}};if(t.properties&&t.properties.Values&&(r.pixel.properties.values=t.properties.Values),i&&i.features&&(r.catalogItems=I(i),s&&s.length===r.catalogItems.features.length))for(var n=s.length-1;n>=0;n--)r.catalogItems.features[n].properties.catalogItemVisibility=s[n];return r}}),rt=e.Evented.extend({options:{proxy:!1,useCors:Z,timeout:0},initialize:function(t){t=t||{},this._requestQueue=[],this._authenticating=!1,e.Util.setOptions(this,t),this.options.url=w(this.options.url)},get:function(t,e,i,s){return this._request("get",t,e,i,s)},post:function(t,e,i,s){return this._request("post",t,e,i,s)},request:function(t,e,i,s){return this._request("request",t,e,i,s)},metadata:function(t,e){return this._request("get","",{},t,e)},authenticate:function(t){return this._authenticating=!1,this.options.token=t,this._runQueue(),this},getTimeout:function(){return this.options.timeout},setTimeout:function(t){this.options.timeout=t},_request:function(t,e,i,s,r){this.fire("requeststart",{url:this.options.url+e,params:i,method:t},!0);var n=this._createServiceCallback(t,e,i,s,r);this.options.token&&(i.token=this.options.token);{if(!this._authenticating){var o=this.options.proxy?this.options.proxy+"?"+this.options.url+e:this.options.url+e;return"get"!==t&&"request"!==t||this.options.useCors?K[t](o,i,n,r):K.get.JSONP(o,i,n,r)}this._requestQueue.push([t,e,i,s,r])}},_createServiceCallback:function(t,i,s,r,n){return e.Util.bind(function(o,a){!o||499!==o.code&&498!==o.code||(this._authenticating=!0,this._requestQueue.push([t,i,s,r,n]),this.fire("authenticationrequired",{authenticate:e.Util.bind(this.authenticate,this)},!0),o.authenticate=e.Util.bind(this.authenticate,this)),r.call(n,o,a),o?this.fire("requesterror",{url:this.options.url+i,params:s,message:o.message,code:o.code,method:t},!0):this.fire("requestsuccess",{url:this.options.url+i,params:s,response:a,method:t},!0),this.fire("requestend",{url:this.options.url+i,params:s,method:t},!0)},this)},_runQueue:function(){for(var t=this._requestQueue.length-1;t>=0;t--){var e=this._requestQueue[t];this[e.shift()].apply(this,e)}this._requestQueue=[]}}),nt=rt.extend({identify:function(){return U(this)},find:function(){return E(this)},query:function(){return G(this)}}),ot=rt.extend({query:function(){return G(this)},identify:function(){return q(this)}}),at=rt.extend({options:{idAttribute:"OBJECTID"},query:function(){return G(this)},addFeature:function(t,e,i){return delete t.id,t=x(t),this.post("addFeatures",{features:[t]},function(t,s){var r=s&&s.addResults?s.addResults[0]:void 0;e&&e.call(i,t||s.addResults[0].error,r)},i)},updateFeature:function(t,e,i){return t=x(t,this.options.idAttribute),this.post("updateFeatures",{features:[t]},function(t,s){var r=s&&s.updateResults?s.updateResults[0]:void 0;e&&e.call(i,t||s.updateResults[0].error,r)},i)},deleteFeature:function(t,e,i){return this.post("deleteFeatures",{objectIds:t},function(t,s){var r=s&&s.deleteResults?s.deleteResults[0]:void 0;e&&e.call(i,t||s.deleteResults[0].error,r)},i)},deleteFeatures:function(t,e,i){return this.post("deleteFeatures",{objectIds:t},function(t,s){var r=s&&s.deleteResults?s.deleteResults:void 0;e&&e.call(i,t||s.deleteResults[0].error,r)},i)}}),ut="https:"!==window.location.protocol?"http:":"https:",lt=e.TileLayer.extend({statics:{TILES:{Streets:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],attribution:"USGS, NOAA",attributionUrl:"https://static.arcgis.com/attribution/World_Street_Map"}},Topographic:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],attribution:"USGS, NOAA",attributionUrl:"https://static.arcgis.com/attribution/World_Topo_Map"}},Oceans:{urlTemplate:ut+"//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],attribution:"USGS, NOAA",attributionUrl:"https://static.arcgis.com/attribution/Ocean_Basemap"}},OceansLabels:{urlTemplate:ut+"//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Reference/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],pane:W?"esri-labels":"tilePane"}},NationalGeographic:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],attribution:"National Geographic, DeLorme, HERE, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, increment P Corp."}},DarkGray:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],attribution:"HERE, DeLorme, MapmyIndia, &copy; OpenStreetMap contributors"}},DarkGrayLabels:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Reference/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],pane:W?"esri-labels":"tilePane",attribution:""}},Gray:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],attribution:"HERE, DeLorme, MapmyIndia, &copy; OpenStreetMap contributors"}},GrayLabels:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],pane:W?"esri-labels":"tilePane",attribution:""}},Imagery:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],attribution:"DigitalGlobe, GeoEye, i-cubed, USDA, USGS, AEX, Getmapping, Aerogrid, IGN, IGP, swisstopo, and the GIS User Community"}},ImageryLabels:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],pane:W?"esri-labels":"tilePane",attribution:""}},ImageryTransportation:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Transportation/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],pane:W?"esri-labels":"tilePane"}},ShadedRelief:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:13,subdomains:["server","services"],attribution:"USGS"}},ShadedReliefLabels:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places_Alternate/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:12,subdomains:["server","services"],pane:W?"esri-labels":"tilePane",attribution:""}},Terrain:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:13,subdomains:["server","services"],attribution:"USGS, NOAA"}},TerrainLabels:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Reference_Overlay/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:13,subdomains:["server","services"],pane:W?"esri-labels":"tilePane",attribution:""}},USATopo:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:15,subdomains:["server","services"],attribution:"USGS, National Geographic Society, i-cubed"}}}},initialize:function(t,i){var s;if("object"==typeof t&&t.urlTemplate&&t.options)s=t;else{if("string"!=typeof t||!lt.TILES[t])throw new Error('L.esri.BasemapLayer: Invalid parameter. Use one of "Streets", "Topographic", "Oceans", "OceansLabels", "NationalGeographic", "Gray", "GrayLabels", "DarkGray", "DarkGrayLabels", "Imagery", "ImageryLabels", "ImageryTransportation", "ShadedRelief", "ShadedReliefLabels", "Terrain", "TerrainLabels" or "USATopo"');s=lt.TILES[t]}var r=e.Util.extend(s.options,i);e.Util.setOptions(this,r),this.options.token&&(s.urlTemplate+="?token="+this.options.token),e.TileLayer.prototype.initialize.call(this,s.urlTemplate,r)},onAdd:function(t){P(t),"esri-labels"===this.options.pane&&this._initPane(),this.options.attributionUrl&&k(this.options.attributionUrl,t),t.on("moveend",M),e.TileLayer.prototype.onAdd.call(this,t)},onRemove:function(t){t.off("moveend",M),e.TileLayer.prototype.onRemove.call(this,t)},_initPane:function(){if(!this._map.getPane(this.options.pane)){var t=this._map.createPane(this.options.pane);t.style.pointerEvents="none",t.style.zIndex=500}},getAttribution:function(){if(this.options.attribution)var t='<span class="esri-dynamic-attribution">'+this.options.attribution+"</span>";return t}}),ht=e.TileLayer.extend({options:{zoomOffsetAllowance:.1,errorTileUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEABAMAAACuXLVVAAAAA1BMVEUzNDVszlHHAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAAAAAAAAAB6mUWpAAAADZJREFUeJztwQEBAAAAgiD/r25IQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7waBAAABw08RwAAAAABJRU5ErkJggg=="},statics:{MercatorZoomLevels:{0:156543.033928,1:78271.5169639999,2:39135.7584820001,3:19567.8792409999,4:9783.93962049996,5:4891.96981024998,6:2445.98490512499,7:1222.99245256249,8:611.49622628138,9:305.748113140558,10:152.874056570411,11:76.4370282850732,12:38.2185141425366,13:19.1092570712683,14:9.55462853563415,15:4.77731426794937,16:2.38865713397468,17:1.19432856685505,18:.597164283559817,19:.298582141647617,20:.14929107082381,21:.07464553541191,22:.0373227677059525,23:.0186613838529763}},initialize:function(t){t.url=w(t.url),t=e.Util.setOptions(this,t),this.tileUrl=t.url+"tile/{z}/{y}/{x}",this.service=D(t),this.service.addEventParent(this),new RegExp(/tiles.arcgis(online)?\.com/g).test(t.url)&&(this.tileUrl=this.tileUrl.replace("://tiles","://tiles{s}"),t.subdomains=["1","2","3","4"]),this.options.token&&(this.tileUrl+="?token="+this.options.token),e.TileLayer.prototype.initialize.call(this,this.tileUrl,t)},getTileUrl:function(t){var i=this._getZoomForUrl();return e.Util.template(this.tileUrl,e.Util.extend({s:this._getSubdomain(t),x:t.x,y:t.y,z:this._lodMap&&this._lodMap[i]?this._lodMap[i]:i},this.options))},createTile:function(t,e){var i=document.createElement("img");return L.DomEvent.on(i,"load",L.bind(this._tileOnLoad,this,e,i)),L.DomEvent.on(i,"error",L.bind(this._tileOnError,this,e,i)),this.options.crossOrigin&&(i.crossOrigin=""),i.alt="",!this._lodMap||this._lodMap&&this._lodMap[this._getZoomForUrl()]?i.src=this.getTileUrl(t):this.once("lodmap",function(){i.src=this.getTileUrl(t)},this),i},onAdd:function(t){P(t),this._lodMap||this.metadata(function(e,i){if(!e&&i.spatialReference){var s=i.spatialReference.latestWkid||i.spatialReference.wkid;if(!this.options.attribution&&t.attributionControl&&i.copyrightText&&(this.options.attribution=i.copyrightText,t.attributionControl.addAttribution(this.getAttribution())),t.options.crs===L.CRS.EPSG3857&&102100===s||3857===s){this._lodMap={};for(var r=i.tileInfo.lods,n=ht.MercatorZoomLevels,o=0;o<r.length;o++){var a=r[o];for(var u in n){var l=n[u];if(this._withinPercentage(a.resolution,l,this.options.zoomOffsetAllowance)){this._lodMap[u]=a.level;break}}}this.fire("lodmap")}else proj4||O("L.esri.TiledMapLayer is using a non-mercator spatial reference. Support may be available through Proj4Leaflet http://esri.github.io/esri-leaflet/examples/non-mercator-projection.html")}},this),e.TileLayer.prototype.onAdd.call(this,t)},metadata:function(t,e){return this.service.metadata(t,e),this},identify:function(){return this.service.identify()},find:function(){return this.service.find()},query:function(){return this.service.query()},authenticate:function(t){var e="?token="+t;return this.tileUrl=this.options.token?this.tileUrl.replace(/\?token=(.+)/g,e):this.tileUrl+e,this.options.token=t,this.service.authenticate(t),this},_withinPercentage:function(t,e,i){return Math.abs(t/e-1)<i}}),ct=e.ImageOverlay.extend({onAdd:function(t){this._topLeft=t.getPixelBounds().min,e.ImageOverlay.prototype.onAdd.call(this,t)},_reset:function(){this._map.options.crs===e.CRS.EPSG3857?e.ImageOverlay.prototype._reset.call(this):e.DomUtil.setPosition(this._image,this._topLeft.subtract(this._map.getPixelOrigin()))}}),pt=e.Layer.extend({options:{opacity:1,position:"front",f:"image",useCors:Z,attribution:null,interactive:!1,alt:""},onAdd:function(t){P(t),this._update=e.Util.throttle(this._update,this.options.updateInterval,this),t.on("moveend",this._update,this),this._currentImage&&this._currentImage._bounds.equals(this._map.getBounds())?t.addLayer(this._currentImage):this._currentImage&&(this._map.removeLayer(this._currentImage),this._currentImage=null),this._update(),this._popup&&(this._map.on("click",this._getPopupData,this),this._map.on("dblclick",this._resetPopupState,this)),this.metadata(function(e,i){!e&&!this.options.attribution&&t.attributionControl&&i.copyrightText&&(this.options.attribution=i.copyrightText,t.attributionControl.addAttribution(this.getAttribution()))},this)},onRemove:function(t){this._currentImage&&this._map.removeLayer(this._currentImage),this._popup&&(this._map.off("click",this._getPopupData,this),this._map.off("dblclick",this._resetPopupState,this)),this._map.off("moveend",this._update,this)},bindPopup:function(t,i){return this._shouldRenderPopup=!1,this._lastClick=!1,this._popup=e.popup(i),this._popupFunction=t,this._map&&(this._map.on("click",this._getPopupData,this),this._map.on("dblclick",this._resetPopupState,this)),this},unbindPopup:function(){return this._map&&(this._map.closePopup(this._popup),this._map.off("click",this._getPopupData,this),this._map.off("dblclick",this._resetPopupState,this)),this._popup=!1,this},bringToFront:function(){return this.options.position="front",this._currentImage&&this._currentImage.bringToFront(),this},bringToBack:function(){return this.options.position="back",this._currentImage&&this._currentImage.bringToBack(),this},getAttribution:function(){return this.options.attribution},getOpacity:function(){return this.options.opacity},setOpacity:function(t){return this.options.opacity=t,this._currentImage&&this._currentImage.setOpacity(t),this},getTimeRange:function(){return[this.options.from,this.options.to]},setTimeRange:function(t,e){return this.options.from=t,this.options.to=e,this._update(),this},metadata:function(t,e){return this.service.metadata(t,e),this},authenticate:function(t){return this.service.authenticate(t),this},redraw:function(){this._update()},_renderImage:function(t,e,i){this._map&&(i&&(t="data:"+i+";base64,"+t),new ct(t,e,{opacity:0,crossOrigin:this.options.useCors,alt:this.options.alt,pane:this.options.pane||this.getPane(),interactive:this.options.interactive}).addTo(this._map).once("load",function(t){if(this._map){var i=t.target,s=this._currentImage;i._bounds.equals(e)&&i._bounds.equals(this._map.getBounds())?(this._currentImage=i,"front"===this.options.position?this.bringToFront():this.bringToBack(),this._map&&this._currentImage._map?this._currentImage.setOpacity(this.options.opacity):this._currentImage._map.removeLayer(this._currentImage),s&&this._map&&this._map.removeLayer(s),s&&s._map&&s._map.removeLayer(s)):this._map.removeLayer(i)}this.fire("load",{bounds:e})},this),this.fire("loading",{bounds:e}))},_update:function(){if(this._map){var t=this._map.getZoom(),e=this._map.getBounds();if(!(this._animatingZoom||this._map._panTransition&&this._map._panTransition._inProgress))if(t>this.options.maxZoom||t<this.options.minZoom)this._currentImage&&(this._currentImage._map.removeLayer(this._currentImage),this._currentImage=null);else{var i=this._buildExportParams();this._requestExport(i,e)}}},_renderPopup:function(t,i,s,r){if(t=e.latLng(t),this._shouldRenderPopup&&this._lastClick.equals(t)){var n=this._popupFunction(i,s,r);n&&this._popup.setLatLng(t).setContent(n).openOn(this._map)}},_resetPopupState:function(t){this._shouldRenderPopup=!1,this._lastClick=t.latlng}}),dt=pt.extend({options:{updateInterval:150,format:"jpgpng",transparent:!0,f:"json"},query:function(){return this.service.query()},identify:function(){return this.service.identify()},initialize:function(t){t.url=w(t.url),this.service=B(t),this.service.addEventParent(this),e.Util.setOptions(this,t)},setPixelType:function(t){return this.options.pixelType=t,this._update(),this},getPixelType:function(){return this.options.pixelType},setBandIds:function(t){return e.Util.isArray(t)?this.options.bandIds=t.join(","):this.options.bandIds=t.toString(),this._update(),this},getBandIds:function(){return this.options.bandIds},setNoData:function(t,i){return e.Util.isArray(t)?this.options.noData=t.join(","):this.options.noData=t.toString(),i&&(this.options.noDataInterpretation=i),this._update(),this},getNoData:function(){return this.options.noData},getNoDataInterpretation:function(){return this.options.noDataInterpretation},setRenderingRule:function(t){this.options.renderingRule=t,this._update()},getRenderingRule:function(){return this.options.renderingRule},setMosaicRule:function(t){this.options.mosaicRule=t,this._update()},getMosaicRule:function(){return this.options.mosaicRule},_getPopupData:function(t){var i=e.Util.bind(function(i,s,r){i||setTimeout(e.Util.bind(function(){this._renderPopup(t.latlng,i,s,r)},this),300)},this),s=this.identify().at(t.latlng);this.options.mosaicRule&&s.setMosaicRule(this.options.mosaicRule),s.run(i),this._shouldRenderPopup=!0,this._lastClick=t.latlng},_buildExportParams:function(){var t=this._map.getBounds(),e=this._map.getSize(),i=this._map.options.crs.project(t._northEast),s=this._map.options.crs.project(t._southWest),r=this._map.latLngToLayerPoint(t._northEast),n=this._map.latLngToLayerPoint(t._southWest);(r.y>0||n.y<e.y)&&(e.y=n.y-r.y);var o=parseInt(this._map.options.crs.code.split(":")[1],10),a={bbox:[s.x,s.y,i.x,i.y].join(","),size:e.x+","+e.y,format:this.options.format,transparent:this.options.transparent,bboxSR:o,imageSR:o};return this.options.from&&this.options.to&&(a.time=this.options.from.valueOf()+","+this.options.to.valueOf()),this.options.pixelType&&(a.pixelType=this.options.pixelType),this.options.interpolation&&(a.interpolation=this.options.interpolation),this.options.compressionQuality&&(a.compressionQuality=this.options.compressionQuality),this.options.bandIds&&(a.bandIds=this.options.bandIds),this.options.noData&&(a.noData=this.options.noData),this.options.noDataInterpretation&&(a.noDataInterpretation=this.options.noDataInterpretation),this.service.options.token&&(a.token=this.service.options.token),this.options.renderingRule&&(a.renderingRule=JSON.stringify(this.options.renderingRule)),this.options.mosaicRule&&(a.mosaicRule=JSON.stringify(this.options.mosaicRule)),a},_requestExport:function(t,i){"json"===this.options.f?this.service.request("exportImage",t,function(t,e){t||(this.options.token&&(e.href+="?token="+this.options.token),this._renderImage(e.href,i))},this):(t.f="image",this._renderImage(this.options.url+"exportImage"+e.Util.getParamString(t),i))}}),mt=pt.extend({options:{updateInterval:150,layers:!1,layerDefs:!1,timeOptions:!1,format:"png24",transparent:!0,f:"json"},initialize:function(t){t.url=w(t.url),this.service=D(t),this.service.addEventParent(this),(t.proxy||t.token)&&"json"!==t.f&&(t.f="json"),e.Util.setOptions(this,t)},getDynamicLayers:function(){return this.options.dynamicLayers},setDynamicLayers:function(t){return this.options.dynamicLayers=t,this._update(),this},getLayers:function(){return this.options.layers},setLayers:function(t){return this.options.layers=t,this._update(),this},getLayerDefs:function(){return this.options.layerDefs},setLayerDefs:function(t){return this.options.layerDefs=t,this._update(),this},getTimeOptions:function(){return this.options.timeOptions},setTimeOptions:function(t){return this.options.timeOptions=t,this._update(),this},query:function(){return this.service.query()},identify:function(){return this.service.identify()},find:function(){return this.service.find()},_getPopupData:function(t){var i=e.Util.bind(function(i,s,r){i||setTimeout(e.Util.bind(function(){this._renderPopup(t.latlng,i,s,r)},this),300)},this),s=this.identify().on(this._map).at(t.latlng);s.simplify(this._map,.5),this.options.layers?s.layers("visible:"+this.options.layers.join(",")):s.layers("visible"),s.run(i),this._shouldRenderPopup=!0,this._lastClick=t.latlng},_buildExportParams:function(){var t=this._map.getBounds(),e=this._map.getSize(),i=this._map.options.crs.project(t.getNorthEast()),s=this._map.options.crs.project(t.getSouthWest()),r=parseInt(this._map.options.crs.code.split(":")[1],10),n=this._map.latLngToLayerPoint(t._northEast),o=this._map.latLngToLayerPoint(t._southWest);(n.y>0||o.y<e.y)&&(e.y=o.y-n.y);var a={bbox:[s.x,s.y,i.x,i.y].join(","),size:e.x+","+e.y,dpi:96,format:this.options.format,transparent:this.options.transparent,bboxSR:r,imageSR:r};return this.options.dynamicLayers&&(a.dynamicLayers=this.options.dynamicLayers),this.options.layers&&(a.layers="show:"+this.options.layers.join(",")),this.options.layerDefs&&(a.layerDefs="string"==typeof this.options.layerDefs?this.options.layerDefs:JSON.stringify(this.options.layerDefs)),this.options.timeOptions&&(a.timeOptions=JSON.stringify(this.options.timeOptions)),this.options.from&&this.options.to&&(a.time=this.options.from.valueOf()+","+this.options.to.valueOf()),this.service.options.token&&(a.token=this.service.options.token),this.options.proxy&&(a.proxy=this.options.proxy),a},_requestExport:function(t,i){"json"===this.options.f?this.service.request("export",t,function(t,e){t||(this.options.token&&(e.href+="?token="+this.options.token),this.options.proxy&&(e.href=this.options.proxy+"?"+e.href),e.href?this._renderImage(e.href,i):this._renderImage(e.imageData,i,e.contentType))},this):(t.f="image",this._renderImage(this.options.url+"export"+e.Util.getParamString(t),i))}}),ft=j.Layer.extend({options:{cellSize:512,updateInterval:150},initialize:function(t){t=j.setOptions(this,t),this._zooming=!1},onAdd:function(t){this._map=t,this._update=j.Util.throttle(this._update,this.options.updateInterval,this),this._reset(),this._update()},onRemove:function(){this._map.removeEventListener(this.getEvents(),this),this._removeCells()},getEvents:function(){return{moveend:this._update,zoomstart:this._zoomstart,zoomend:this._reset}},addTo:function(t){return t.addLayer(this),this},removeFrom:function(t){return t.removeLayer(this),this},_zoomstart:function(){this._zooming=!0},_reset:function(){this._removeCells(),this._cells={},this._activeCells={},this._cellsToLoad=0,this._cellsTotal=0,this._cellNumBounds=this._getCellNumBounds(),this._resetWrap(),this._zooming=!1},_resetWrap:function(){var t=this._map,e=t.options.crs;if(!e.infinite){var i=this._getCellSize();e.wrapLng&&(this._wrapLng=[Math.floor(t.project([0,e.wrapLng[0]]).x/i),Math.ceil(t.project([0,e.wrapLng[1]]).x/i)]),e.wrapLat&&(this._wrapLat=[Math.floor(t.project([e.wrapLat[0],0]).y/i),Math.ceil(t.project([e.wrapLat[1],0]).y/i)])}},_getCellSize:function(){return this.options.cellSize},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._getCellSize(),i=j.bounds(t.min.divideBy(e).floor(),t.max.divideBy(e).floor());this._removeOtherCells(i),this._addCells(i),this.fire("cellsupdated")}},_addCells:function(t){var e,i,s,r=[],n=t.getCenter(),o=this._map.getZoom();for(e=t.min.y;e<=t.max.y;e++)for(i=t.min.x;i<=t.max.x;i++)(s=j.point(i,e)).z=o,this._isValidCell(s)&&r.push(s);var a=r.length;if(0!==a)for(this._cellsToLoad+=a,this._cellsTotal+=a,r.sort(function(t,e){return t.distanceTo(n)-e.distanceTo(n)}),i=0;i<a;i++)this._addCell(r[i])},_isValidCell:function(t){var e=this._map.options.crs;if(!e.infinite){var i=this._cellNumBounds;if(!e.wrapLng&&(t.x<i.min.x||t.x>i.max.x)||!e.wrapLat&&(t.y<i.min.y||t.y>i.max.y))return!1}if(!this.options.bounds)return!0;var s=this._cellCoordsToBounds(t);return j.latLngBounds(this.options.bounds).intersects(s)},_cellCoordsToBounds:function(t){var e=this._map,i=this.options.cellSize,s=t.multiplyBy(i),r=s.add([i,i]),n=e.wrapLatLng(e.unproject(s,t.z)),o=e.wrapLatLng(e.unproject(r,t.z));return j.latLngBounds(n,o)},_cellCoordsToKey:function(t){return t.x+":"+t.y},_keyToCellCoords:function(t){var e=t.split(":"),i=parseInt(e[0],10),s=parseInt(e[1],10);return j.point(i,s)},_removeOtherCells:function(t){for(var e in this._cells)t.contains(this._keyToCellCoords(e))||this._removeCell(e)},_removeCell:function(t){var e=this._activeCells[t];e&&(delete this._activeCells[t],this.cellLeave&&this.cellLeave(e.bounds,e.coords),this.fire("cellleave",{bounds:e.bounds,coords:e.coords}))},_removeCells:function(){for(var t in this._cells){var e=this._cells[t].bounds,i=this._cells[t].coords;this.cellLeave&&this.cellLeave(e,i),this.fire("cellleave",{bounds:e,coords:i})}},_addCell:function(t){this._wrapCoords(t);var e=this._cellCoordsToKey(t),i=this._cells[e];i&&!this._activeCells[e]&&(this.cellEnter&&this.cellEnter(i.bounds,t),this.fire("cellenter",{bounds:i.bounds,coords:t}),this._activeCells[e]=i),i||(i={coords:t,bounds:this._cellCoordsToBounds(t)},this._cells[e]=i,this._activeCells[e]=i,this.createCell&&this.createCell(i.bounds,t),this.fire("cellcreate",{bounds:i.bounds,coords:t}))},_wrapCoords:function(t){t.x=this._wrapLng?j.Util.wrapNum(t.x,this._wrapLng):t.x,t.y=this._wrapLat?j.Util.wrapNum(t.y,this._wrapLat):t.y},_getCellNumBounds:function(){var t=this._map.getPixelWorldBounds(),e=this._getCellSize();return t?j.bounds(t.min.divideBy(e).floor(),t.max.divideBy(e).ceil().subtract([1,1])):null}});N.prototype.query=function(t){var e=this.getIndex(t);return this.values[e]},N.prototype.getIndex=function(t){this.dirty&&this.sort();for(var e,i,s=0,r=this.values.length-1;s<=r;)if(e=(s+r)/2|0,+(i=this.values[Math.round(e)]).value<+t)s=e+1;else{if(!(+i.value>+t))return e;r=e-1}return Math.abs(~r)},N.prototype.between=function(t,e){var i=this.getIndex(t),s=this.getIndex(e);if(0===i&&0===s)return[];for(;this.values[i-1]&&this.values[i-1].value===t;)i--;for(;this.values[s+1]&&this.values[s+1].value===e;)s++;return this.values[s]&&this.values[s].value===e&&this.values[s+1]&&s++,this.values.slice(i,s)},N.prototype.insert=function(t){return this.values.splice(this.getIndex(t.value),0,t),this},N.prototype.bulkAdd=function(t,e){return this.values=this.values.concat([].concat(t||[])),e?this.sort():this.dirty=!0,this},N.prototype.sort=function(){return this.values.sort(function(t,e){return+e.value-+t.value}).reverse(),this.dirty=!1,this};var yt=ft.extend({options:{attribution:null,where:"1=1",fields:["*"],from:!1,to:!1,timeField:!1,timeFilterMode:"server",simplifyFactor:0,precision:6},initialize:function(t){if(ft.prototype.initialize.call(this,t),t.url=w(t.url),t=e.setOptions(this,t),this.service=z(t),this.service.addEventParent(this),"*"!==this.options.fields[0]){for(var i=!1,s=0;s<this.options.fields.length;s++)this.options.fields[s].match(/^(OBJECTID|FID|OID|ID)$/i)&&(i=!0);!1===i&&O("no known esriFieldTypeOID field detected in fields Array.  Please add an attribute field containing unique IDs to ensure the layer can be drawn correctly.")}this.options.timeField.start&&this.options.timeField.end?(this._startTimeIndex=new N,this._endTimeIndex=new N):this.options.timeField&&(this._timeIndex=new N),this._cache={},this._currentSnapshot=[],this._activeRequests=0},onAdd:function(t){return P(t),this.service.metadata(function(e,i){if(!e){var s=i.supportedQueryFormats,r=!1;!1===this.service.options.isModern&&(r=!0),!r&&s&&-1!==s.indexOf("geoJSON")&&(this.service.options.isModern=!0),!this.options.attribution&&t.attributionControl&&i.copyrightText&&(this.options.attribution=i.copyrightText,t.attributionControl.addAttribution(this.getAttribution()))}},this),t.on("zoomend",this._handleZoomChange,this),ft.prototype.onAdd.call(this,t)},onRemove:function(t){return t.off("zoomend",this._handleZoomChange,this),ft.prototype.onRemove.call(this,t)},getAttribution:function(){return this.options.attribution},createCell:function(t,e){this._visibleZoom()&&this._requestFeatures(t,e)},_requestFeatures:function(t,i,s){return this._activeRequests++,1===this._activeRequests&&this.fire("loading",{bounds:t},!0),this._buildQuery(t).run(function(r,n,o){o&&o.exceededTransferLimit&&this.fire("drawlimitexceeded"),!r&&n&&n.features.length&&e.Util.requestAnimFrame(e.Util.bind(function(){this._addFeatures(n.features,i),this._postProcessFeatures(t)},this)),r||!n||n.features.length||this._postProcessFeatures(t),r&&this._postProcessFeatures(t),s&&s.call(this,r,n)},this)},_postProcessFeatures:function(t){this._activeRequests--,this._activeRequests<=0&&this.fire("load",{bounds:t})},_cacheKey:function(t){return t.z+":"+t.x+":"+t.y},_addFeatures:function(t,e){var i=this._cacheKey(e);this._cache[i]=this._cache[i]||[];for(var s=t.length-1;s>=0;s--){var r=t[s].id;-1===this._currentSnapshot.indexOf(r)&&this._currentSnapshot.push(r),-1===this._cache[i].indexOf(r)&&this._cache[i].push(r)}this.options.timeField&&this._buildTimeIndexes(t),this.createLayers(t)},_buildQuery:function(t){var e=this.service.query().intersects(t).where(this.options.where).fields(this.options.fields).precision(this.options.precision);return this.options.simplifyFactor&&e.simplify(this._map,this.options.simplifyFactor),"server"===this.options.timeFilterMode&&this.options.from&&this.options.to&&e.between(this.options.from,this.options.to),e},setWhere:function(t,i,s){this.options.where=t&&t.length?t:"1=1";for(var r=[],n=[],o=0,a=null,u=e.Util.bind(function(t,u){if(t&&(a=t),u)for(var l=u.features.length-1;l>=0;l--)n.push(u.features[l].id);--o<=0&&(this._currentSnapshot=n,e.Util.requestAnimFrame(e.Util.bind(function(){this.removeLayers(r),this.addLayers(n),i&&i.call(s,a)},this)))},this),l=this._currentSnapshot.length-1;l>=0;l--)r.push(this._currentSnapshot[l]);for(var h in this._activeCells){o++;var c=this._keyToCellCoords(h),p=this._cellCoordsToBounds(c);this._requestFeatures(p,h,u)}return this},getWhere:function(){return this.options.where},getTimeRange:function(){return[this.options.from,this.options.to]},setTimeRange:function(t,i,s,r){var n=this.options.from,o=this.options.to,a=0,u=null,l=e.Util.bind(function(e){e&&(u=e),this._filterExistingFeatures(n,o,t,i),a--,s&&a<=0&&s.call(r,u)},this);if(this.options.from=t,this.options.to=i,this._filterExistingFeatures(n,o,t,i),"server"===this.options.timeFilterMode)for(var h in this._activeCells){a++;var c=this._keyToCellCoords(h),p=this._cellCoordsToBounds(c);this._requestFeatures(p,h,l)}return this},refresh:function(){for(var t in this._activeCells){var e=this._keyToCellCoords(t),i=this._cellCoordsToBounds(e);this._requestFeatures(i,t)}this.redraw&&this.once("load",function(){this.eachFeature(function(t){this._redraw(t.feature.id)},this)},this)},_filterExistingFeatures:function(t,i,s,r){var n=t&&i?this._getFeaturesInTimeRange(t,i):this._currentSnapshot,o=this._getFeaturesInTimeRange(s,r);if(o.indexOf)for(var a=0;a<o.length;a++){var u=n.indexOf(o[a]);u>=0&&n.splice(u,1)}e.Util.requestAnimFrame(e.Util.bind(function(){this.removeLayers(n),this.addLayers(o)},this))},_getFeaturesInTimeRange:function(t,e){var i,s=[];if(this.options.timeField.start&&this.options.timeField.end){var r=this._startTimeIndex.between(t,e),n=this._endTimeIndex.between(t,e);i=r.concat(n)}else i=this._timeIndex.between(t,e);for(var o=i.length-1;o>=0;o--)s.push(i[o].id);return s},_buildTimeIndexes:function(t){var e,i;if(this.options.timeField.start&&this.options.timeField.end){var s=[],r=[];for(e=t.length-1;e>=0;e--)i=t[e],s.push({id:i.id,value:new Date(i.properties[this.options.timeField.start])}),r.push({id:i.id,value:new Date(i.properties[this.options.timeField.end])});this._startTimeIndex.bulkAdd(s),this._endTimeIndex.bulkAdd(r)}else{var n=[];for(e=t.length-1;e>=0;e--)i=t[e],n.push({id:i.id,value:new Date(i.properties[this.options.timeField])});this._timeIndex.bulkAdd(n)}},_featureWithinTimeRange:function(t){if(!this.options.from||!this.options.to)return!0;var e=+this.options.from.valueOf(),i=+this.options.to.valueOf();if("string"==typeof this.options.timeField){var s=+t.properties[this.options.timeField];return s>=e&&s<=i}if(this.options.timeField.start&&this.options.timeField.end){var r=+t.properties[this.options.timeField.start],n=+t.properties[this.options.timeField.end];return r>=e&&r<=i||n>=e&&n<=i}},_visibleZoom:function(){if(!this._map)return!1;var t=this._map.getZoom();return!(t>this.options.maxZoom||t<this.options.minZoom)},_handleZoomChange:function(){if(this._visibleZoom())for(var t in this._activeCells){var e=this._activeCells[t].coords,i=this._cacheKey(e);this._cache[i]&&this.addLayers(this._cache[i])}else this.removeLayers(this._currentSnapshot),this._currentSnapshot=[]},authenticate:function(t){return this.service.authenticate(t),this},metadata:function(t,e){return this.service.metadata(t,e),this},query:function(){return this.service.query()},_getMetadata:function(t){if(this._metadata){t(void 0,this._metadata)}else this.metadata(e.Util.bind(function(e,i){this._metadata=i,t(e,this._metadata)},this))},addFeature:function(t,i,s){this._getMetadata(e.Util.bind(function(r,n){r?i&&i.call(this,r,null):this.service.addFeature(t,e.Util.bind(function(e,r){e||(t.properties[n.objectIdField]=r.objectId,t.id=r.objectId,this.createLayers([t])),i&&i.call(s,e,r)},this))},this))},updateFeature:function(t,e,i){this.service.updateFeature(t,function(s,r){s||(this.removeLayers([t.id],!0),this.createLayers([t])),e&&e.call(i,s,r)},this)},deleteFeature:function(t,e,i){this.service.deleteFeature(t,function(t,s){!t&&s.objectId&&this.removeLayers([s.objectId],!0),e&&e.call(i,t,s)},this)},deleteFeatures:function(t,e,i){return this.service.deleteFeatures(t,function(t,s){if(!t&&s.length>0)for(var r=0;r<s.length;r++)this.removeLayers([s[r].objectId],!0);e&&e.call(i,t,s)},this)}}),gt=yt.extend({options:{cacheLayers:!0},initialize:function(t){yt.prototype.initialize.call(this,t),this._originalStyle=this.options.style,this._layers={}},onRemove:function(t){for(var e in this._layers)t.removeLayer(this._layers[e]),this.fire("removefeature",{feature:this._layers[e].feature,permanent:!1},!0);return yt.prototype.onRemove.call(this,t)},createNewLayer:function(t){var i=e.GeoJSON.geometryToLayer(t,this.options);return i.defaultOptions=i.options,i},_updateLayer:function(t,i){var s=[],r=this.options.coordsToLatLng||e.GeoJSON.coordsToLatLng;switch(i.properties&&(t.feature.properties=i.properties),i.geometry.type){case"Point":s=e.GeoJSON.coordsToLatLng(i.geometry.coordinates),t.setLatLng(s);break;case"LineString":s=e.GeoJSON.coordsToLatLngs(i.geometry.coordinates,0,r),t.setLatLngs(s);break;case"MultiLineString":case"Polygon":s=e.GeoJSON.coordsToLatLngs(i.geometry.coordinates,1,r),t.setLatLngs(s);break;case"MultiPolygon":s=e.GeoJSON.coordsToLatLngs(i.geometry.coordinates,2,r),t.setLatLngs(s)}},createLayers:function(t){for(var e=t.length-1;e>=0;e--){var i,s=t[e],r=this._layers[s.id];this._visibleZoom()&&r&&!this._map.hasLayer(r)&&(this._map.addLayer(r),this.fire("addfeature",{feature:r.feature},!0)),r&&this.options.simplifyFactor>0&&(r.setLatLngs||r.setLatLng)&&this._updateLayer(r,s),r||((i=this.createNewLayer(s)).feature=s,i.addEventParent(this),this.options.onEachFeature&&this.options.onEachFeature(i.feature,i),this._layers[i.feature.id]=i,this.setFeatureStyle(i.feature.id,this.options.style),this.fire("createfeature",{feature:i.feature},!0),this._visibleZoom()&&(!this.options.timeField||this.options.timeField&&this._featureWithinTimeRange(s))&&this._map.addLayer(i))}},addLayers:function(t){for(var e=t.length-1;e>=0;e--){var i=this._layers[t[e]];i&&this._map.addLayer(i)}},removeLayers:function(t,e){for(var i=t.length-1;i>=0;i--){var s=t[i],r=this._layers[s];r&&(this.fire("removefeature",{feature:r.feature,permanent:e},!0),this._map.removeLayer(r)),r&&e&&delete this._layers[s]}},cellEnter:function(t,i){this._visibleZoom()&&!this._zooming&&this._map&&e.Util.requestAnimFrame(e.Util.bind(function(){var t=this._cacheKey(i),e=this._cellCoordsToKey(i),s=this._cache[t];this._activeCells[e]&&s&&this.addLayers(s)},this))},cellLeave:function(t,i){this._zooming||e.Util.requestAnimFrame(e.Util.bind(function(){if(this._map){var t=this._cacheKey(i),e=this._cellCoordsToKey(i),s=this._cache[t],r=this._map.getBounds();if(!this._activeCells[e]&&s){for(var n=!0,o=0;o<s.length;o++){var a=this._layers[s[o]];a&&a.getBounds&&r.intersects(a.getBounds())&&(n=!1)}n&&this.removeLayers(s,!this.options.cacheLayers),!this.options.cacheLayers&&n&&(delete this._cache[t],delete this._cells[e],delete this._activeCells[e])}}},this))},resetStyle:function(){return this.options.style=this._originalStyle,this.eachFeature(function(t){this.resetFeatureStyle(t.feature.id)},this),this},setStyle:function(t){return this.options.style=t,this.eachFeature(function(e){this.setFeatureStyle(e.feature.id,t)},this),this},resetFeatureStyle:function(t){var i=this._layers[t],s=this._originalStyle||L.Path.prototype.options;return i&&(e.Util.extend(i.options,i.defaultOptions),this.setFeatureStyle(t,s)),this},setFeatureStyle:function(t,e){var i=this._layers[t];return"function"==typeof e&&(e=e(i.feature)),i.setStyle&&i.setStyle(e),this},eachActiveFeature:function(t,e){if(this._map){var i=this._map.getBounds();for(var s in this._layers)i.intersects(this._layers[s].getBounds())&&-1!==this._currentSnapshot.indexOf(this._layers[s].feature.id)&&t.call(e,this._layers[s])}return this},eachFeature:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getFeature:function(t){return this._layers[t]},bringToBack:function(){this.eachFeature(function(t){t.bringToBack&&t.bringToBack()})},bringToFront:function(){this.eachFeature(function(t){t.bringToFront&&t.bringToFront()})},redraw:function(t){return t&&this._redraw(t),this},_redraw:function(t){var i=this._layers[t],s=i.feature;if(i&&i.setIcon&&this.options.pointToLayer&&this.options.pointToLayer){var r=this.options.pointToLayer(s,e.latLng(s.geometry.coordinates[1],s.geometry.coordinates[0])).options.icon;i.setIcon(r)}if(i&&i.setStyle&&this.options.pointToLayer){var n=this.options.pointToLayer(s,e.latLng(s.geometry.coordinates[1],s.geometry.coordinates[0])).options;this.setFeatureStyle(s.id,n)}i&&i.setStyle&&this.options.style&&this.resetStyle(s.id)}});t.VERSION="2.0.8",t.Support=J,t.options=Q,t.Util=X,t.get=V,t.post=r,t.request=o,t.Task=$,t.task=function(t){return new $(t)},t.Query=Y,t.query=G,t.Find=tt,t.find=E,t.Identify=et,t.identify=function(t){return new et(t)},t.IdentifyFeatures=it,t.identifyFeatures=U,t.IdentifyImage=st,t.identifyImage=q,t.Service=rt,t.service=function(t){return new rt(t)},t.MapService=nt,t.mapService=D,t.ImageService=ot,t.imageService=B,t.FeatureLayerService=at,t.featureLayerService=z,t.BasemapLayer=lt,t.basemapLayer=function(t,e){return new lt(t,e)},t.TiledMapLayer=ht,t.tiledMapLayer=function(t,e){return new ht(t,e)},t.RasterLayer=pt,t.ImageMapLayer=dt,t.imageMapLayer=function(t,e){return new dt(t,e)},t.DynamicMapLayer=mt,t.dynamicMapLayer=function(t,e){return new mt(t,e)},t.FeatureManager=yt,t.FeatureLayer=gt,t.featureLayer=function(t){return new gt(t)}});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-2.5.3.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,4703 @@
+/* esri-leaflet - v2.5.3 - Wed Jan 06 2021 13:16:30 GMT-0600 (Central Standard Time)
+ * Copyright (c) 2021 Environmental Systems Research Institute, Inc.
+ * Apache-2.0 */
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet')) :
+  typeof define === 'function' && define.amd ? define(['exports', 'leaflet'], factory) :
+  (global = global || self, factory((global.L = global.L || {}, global.L.esri = {}), global.L));
+}(this, (function (exports, leaflet) { 'use strict';
+
+  var version = "2.5.3";
+
+  var cors = ((window.XMLHttpRequest && 'withCredentials' in new window.XMLHttpRequest()));
+  var pointerEvents = document.documentElement.style.pointerEvents === '';
+
+  var Support = {
+    cors: cors,
+    pointerEvents: pointerEvents
+  };
+
+  var options = {
+    attributionWidthOffset: 55
+  };
+
+  var callbacks = 0;
+
+  function serialize (params) {
+    var data = '';
+
+    params.f = params.f || 'json';
+
+    for (var key in params) {
+      if (params.hasOwnProperty(key)) {
+        var param = params[key];
+        var type = Object.prototype.toString.call(param);
+        var value;
+
+        if (data.length) {
+          data += '&';
+        }
+
+        if (type === '[object Array]') {
+          value = (Object.prototype.toString.call(param[0]) === '[object Object]') ? JSON.stringify(param) : param.join(',');
+        } else if (type === '[object Object]') {
+          value = JSON.stringify(param);
+        } else if (type === '[object Date]') {
+          value = param.valueOf();
+        } else {
+          value = param;
+        }
+
+        data += encodeURIComponent(key) + '=' + encodeURIComponent(value);
+      }
+    }
+
+    return data;
+  }
+
+  function createRequest (callback, context) {
+    var httpRequest = new window.XMLHttpRequest();
+
+    httpRequest.onerror = function (e) {
+      httpRequest.onreadystatechange = leaflet.Util.falseFn;
+
+      callback.call(context, {
+        error: {
+          code: 500,
+          message: 'XMLHttpRequest error'
+        }
+      }, null);
+    };
+
+    httpRequest.onreadystatechange = function () {
+      var response;
+      var error;
+
+      if (httpRequest.readyState === 4) {
+        try {
+          response = JSON.parse(httpRequest.responseText);
+        } catch (e) {
+          response = null;
+          error = {
+            code: 500,
+            message: 'Could not parse response as JSON. This could also be caused by a CORS or XMLHttpRequest error.'
+          };
+        }
+
+        if (!error && response.error) {
+          error = response.error;
+          response = null;
+        }
+
+        httpRequest.onerror = leaflet.Util.falseFn;
+
+        callback.call(context, error, response);
+      }
+    };
+
+    httpRequest.ontimeout = function () {
+      this.onerror();
+    };
+
+    return httpRequest;
+  }
+
+  function xmlHttpPost (url, params, callback, context) {
+    var httpRequest = createRequest(callback, context);
+    httpRequest.open('POST', url);
+
+    if (typeof context !== 'undefined' && context !== null) {
+      if (typeof context.options !== 'undefined') {
+        httpRequest.timeout = context.options.timeout;
+      }
+    }
+    httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
+    httpRequest.send(serialize(params));
+
+    return httpRequest;
+  }
+
+  function xmlHttpGet (url, params, callback, context) {
+    var httpRequest = createRequest(callback, context);
+    httpRequest.open('GET', url + '?' + serialize(params), true);
+
+    if (typeof context !== 'undefined' && context !== null) {
+      if (typeof context.options !== 'undefined') {
+        httpRequest.timeout = context.options.timeout;
+        if (context.options.withCredentials) {
+          httpRequest.withCredentials = true;
+        }
+      }
+    }
+    httpRequest.send(null);
+
+    return httpRequest;
+  }
+
+  // AJAX handlers for CORS (modern browsers) or JSONP (older browsers)
+  function request (url, params, callback, context) {
+    var paramString = serialize(params);
+    var httpRequest = createRequest(callback, context);
+    var requestLength = (url + '?' + paramString).length;
+
+    // ie10/11 require the request be opened before a timeout is applied
+    if (requestLength <= 2000 && Support.cors) {
+      httpRequest.open('GET', url + '?' + paramString);
+    } else if (requestLength > 2000 && Support.cors) {
+      httpRequest.open('POST', url);
+      httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
+    }
+
+    if (typeof context !== 'undefined' && context !== null) {
+      if (typeof context.options !== 'undefined') {
+        httpRequest.timeout = context.options.timeout;
+        if (context.options.withCredentials) {
+          httpRequest.withCredentials = true;
+        }
+      }
+    }
+
+    // request is less than 2000 characters and the browser supports CORS, make GET request with XMLHttpRequest
+    if (requestLength <= 2000 && Support.cors) {
+      httpRequest.send(null);
+
+    // request is more than 2000 characters and the browser supports CORS, make POST request with XMLHttpRequest
+    } else if (requestLength > 2000 && Support.cors) {
+      httpRequest.send(paramString);
+
+    // request is less  than 2000 characters and the browser does not support CORS, make a JSONP request
+    } else if (requestLength <= 2000 && !Support.cors) {
+      return jsonp(url, params, callback, context);
+
+    // request is longer then 2000 characters and the browser does not support CORS, log a warning
+    } else {
+      warn('a request to ' + url + ' was longer then 2000 characters and this browser cannot make a cross-domain post request. Please use a proxy http://esri.github.io/esri-leaflet/api-reference/request.html');
+      return;
+    }
+
+    return httpRequest;
+  }
+
+  function jsonp (url, params, callback, context) {
+    window._EsriLeafletCallbacks = window._EsriLeafletCallbacks || {};
+    var callbackId = 'c' + callbacks;
+    params.callback = 'window._EsriLeafletCallbacks.' + callbackId;
+
+    window._EsriLeafletCallbacks[callbackId] = function (response) {
+      if (window._EsriLeafletCallbacks[callbackId] !== true) {
+        var error;
+        var responseType = Object.prototype.toString.call(response);
+
+        if (!(responseType === '[object Object]' || responseType === '[object Array]')) {
+          error = {
+            error: {
+              code: 500,
+              message: 'Expected array or object as JSONP response'
+            }
+          };
+          response = null;
+        }
+
+        if (!error && response.error) {
+          error = response;
+          response = null;
+        }
+
+        callback.call(context, error, response);
+        window._EsriLeafletCallbacks[callbackId] = true;
+      }
+    };
+
+    var script = leaflet.DomUtil.create('script', null, document.body);
+    script.type = 'text/javascript';
+    script.src = url + '?' + serialize(params);
+    script.id = callbackId;
+    script.onerror = function (error) {
+      if (error && window._EsriLeafletCallbacks[callbackId] !== true) {
+        // Can't get true error code: it can be 404, or 401, or 500
+        var err = {
+          error: {
+            code: 500,
+            message: 'An unknown error occurred'
+          }
+        };
+
+        callback.call(context, err);
+        window._EsriLeafletCallbacks[callbackId] = true;
+      }
+    };
+    leaflet.DomUtil.addClass(script, 'esri-leaflet-jsonp');
+
+    callbacks++;
+
+    return {
+      id: callbackId,
+      url: script.src,
+      abort: function () {
+        window._EsriLeafletCallbacks._callback[callbackId]({
+          code: 0,
+          message: 'Request aborted.'
+        });
+      }
+    };
+  }
+
+  var get = ((Support.cors) ? xmlHttpGet : jsonp);
+  get.CORS = xmlHttpGet;
+  get.JSONP = jsonp;
+
+  function warn () {
+    if (console && console.warn) {
+      console.warn.apply(console, arguments);
+    }
+  }
+
+  // export the Request object to call the different handlers for debugging
+  var Request = {
+    request: request,
+    get: get,
+    post: xmlHttpPost
+  };
+
+  /* @preserve
+  * @terraformer/arcgis - v2.0.6 - MIT
+  * Copyright (c) 2012-2020 Environmental Systems Research Institute, Inc.
+  * Mon May 18 2020 14:30:35 GMT-0700 (Pacific Daylight Time)
+  */
+  /* Copyright (c) 2012-2019 Environmental Systems Research Institute, Inc.
+   * Apache-2.0 */
+
+  var edgeIntersectsEdge = function edgeIntersectsEdge(a1, a2, b1, b2) {
+    var uaT = (b2[0] - b1[0]) * (a1[1] - b1[1]) - (b2[1] - b1[1]) * (a1[0] - b1[0]);
+    var ubT = (a2[0] - a1[0]) * (a1[1] - b1[1]) - (a2[1] - a1[1]) * (a1[0] - b1[0]);
+    var uB = (b2[1] - b1[1]) * (a2[0] - a1[0]) - (b2[0] - b1[0]) * (a2[1] - a1[1]);
+
+    if (uB !== 0) {
+      var ua = uaT / uB;
+      var ub = ubT / uB;
+
+      if (ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1) {
+        return true;
+      }
+    }
+
+    return false;
+  };
+  var coordinatesContainPoint = function coordinatesContainPoint(coordinates, point) {
+    var contains = false;
+
+    for (var i = -1, l = coordinates.length, j = l - 1; ++i < l; j = i) {
+      if ((coordinates[i][1] <= point[1] && point[1] < coordinates[j][1] || coordinates[j][1] <= point[1] && point[1] < coordinates[i][1]) && point[0] < (coordinates[j][0] - coordinates[i][0]) * (point[1] - coordinates[i][1]) / (coordinates[j][1] - coordinates[i][1]) + coordinates[i][0]) {
+        contains = !contains;
+      }
+    }
+
+    return contains;
+  };
+  var pointsEqual = function pointsEqual(a, b) {
+    for (var i = 0; i < a.length; i++) {
+      if (a[i] !== b[i]) {
+        return false;
+      }
+    }
+
+    return true;
+  };
+  var arrayIntersectsArray = function arrayIntersectsArray(a, b) {
+    for (var i = 0; i < a.length - 1; i++) {
+      for (var j = 0; j < b.length - 1; j++) {
+        if (edgeIntersectsEdge(a[i], a[i + 1], b[j], b[j + 1])) {
+          return true;
+        }
+      }
+    }
+
+    return false;
+  };
+
+  /* Copyright (c) 2012-2019 Environmental Systems Research Institute, Inc.
+   * Apache-2.0 */
+
+  var closeRing = function closeRing(coordinates) {
+    if (!pointsEqual(coordinates[0], coordinates[coordinates.length - 1])) {
+      coordinates.push(coordinates[0]);
+    }
+
+    return coordinates;
+  }; // determine if polygon ring coordinates are clockwise. clockwise signifies outer ring, counter-clockwise an inner ring
+  // or hole. this logic was found at http://stackoverflow.com/questions/1165647/how-to-determine-if-a-list-of-polygon-
+  // points-are-in-clockwise-order
+
+  var ringIsClockwise = function ringIsClockwise(ringToTest) {
+    var total = 0;
+    var i = 0;
+    var rLength = ringToTest.length;
+    var pt1 = ringToTest[i];
+    var pt2;
+
+    for (i; i < rLength - 1; i++) {
+      pt2 = ringToTest[i + 1];
+      total += (pt2[0] - pt1[0]) * (pt2[1] + pt1[1]);
+      pt1 = pt2;
+    }
+
+    return total >= 0;
+  }; // This function ensures that rings are oriented in the right directions
+  // from http://jsperf.com/cloning-an-object/2
+
+  var shallowClone = function shallowClone(obj) {
+    var target = {};
+
+    for (var i in obj) {
+      // both arcgis attributes and geojson props are just hardcoded keys
+      if (obj.hasOwnProperty(i)) {
+        // eslint-disable-line no-prototype-builtins
+        target[i] = obj[i];
+      }
+    }
+
+    return target;
+  };
+
+  /* Copyright (c) 2012-2019 Environmental Systems Research Institute, Inc.
+   * Apache-2.0 */
+
+  var coordinatesContainCoordinates = function coordinatesContainCoordinates(outer, inner) {
+    var intersects = arrayIntersectsArray(outer, inner);
+    var contains = coordinatesContainPoint(outer, inner[0]);
+
+    if (!intersects && contains) {
+      return true;
+    }
+
+    return false;
+  }; // do any polygons in this array contain any other polygons in this array?
+  // used for checking for holes in arcgis rings
+
+
+  var convertRingsToGeoJSON = function convertRingsToGeoJSON(rings) {
+    var outerRings = [];
+    var holes = [];
+    var x; // iterator
+
+    var outerRing; // current outer ring being evaluated
+
+    var hole; // current hole being evaluated
+    // for each ring
+
+    for (var r = 0; r < rings.length; r++) {
+      var ring = closeRing(rings[r].slice(0));
+
+      if (ring.length < 4) {
+        continue;
+      } // is this ring an outer ring? is it clockwise?
+
+
+      if (ringIsClockwise(ring)) {
+        var polygon = [ring.slice().reverse()]; // wind outer rings counterclockwise for RFC 7946 compliance
+
+        outerRings.push(polygon); // push to outer rings
+      } else {
+        holes.push(ring.slice().reverse()); // wind inner rings clockwise for RFC 7946 compliance
+      }
+    }
+
+    var uncontainedHoles = []; // while there are holes left...
+
+    while (holes.length) {
+      // pop a hole off out stack
+      hole = holes.pop(); // loop over all outer rings and see if they contain our hole.
+
+      var contained = false;
+
+      for (x = outerRings.length - 1; x >= 0; x--) {
+        outerRing = outerRings[x][0];
+
+        if (coordinatesContainCoordinates(outerRing, hole)) {
+          // the hole is contained push it into our polygon
+          outerRings[x].push(hole);
+          contained = true;
+          break;
+        }
+      } // ring is not contained in any outer ring
+      // sometimes this happens https://github.com/Esri/esri-leaflet/issues/320
+
+
+      if (!contained) {
+        uncontainedHoles.push(hole);
+      }
+    } // if we couldn't match any holes using contains we can try intersects...
+
+
+    while (uncontainedHoles.length) {
+      // pop a hole off out stack
+      hole = uncontainedHoles.pop(); // loop over all outer rings and see if any intersect our hole.
+
+      var intersects = false;
+
+      for (x = outerRings.length - 1; x >= 0; x--) {
+        outerRing = outerRings[x][0];
+
+        if (arrayIntersectsArray(outerRing, hole)) {
+          // the hole is contained push it into our polygon
+          outerRings[x].push(hole);
+          intersects = true;
+          break;
+        }
+      }
+
+      if (!intersects) {
+        outerRings.push([hole.reverse()]);
+      }
+    }
+
+    if (outerRings.length === 1) {
+      return {
+        type: 'Polygon',
+        coordinates: outerRings[0]
+      };
+    } else {
+      return {
+        type: 'MultiPolygon',
+        coordinates: outerRings
+      };
+    }
+  };
+
+  var getId = function getId(attributes, idAttribute) {
+    var keys = idAttribute ? [idAttribute, 'OBJECTID', 'FID'] : ['OBJECTID', 'FID'];
+
+    for (var i = 0; i < keys.length; i++) {
+      var key = keys[i];
+
+      if (key in attributes && (typeof attributes[key] === 'string' || typeof attributes[key] === 'number')) {
+        return attributes[key];
+      }
+    }
+
+    throw Error('No valid id attribute found');
+  };
+
+  var arcgisToGeoJSON = function arcgisToGeoJSON(arcgis, idAttribute) {
+    var geojson = {};
+
+    if (arcgis.features) {
+      geojson.type = 'FeatureCollection';
+      geojson.features = [];
+
+      for (var i = 0; i < arcgis.features.length; i++) {
+        geojson.features.push(arcgisToGeoJSON(arcgis.features[i], idAttribute));
+      }
+    }
+
+    if (typeof arcgis.x === 'number' && typeof arcgis.y === 'number') {
+      geojson.type = 'Point';
+      geojson.coordinates = [arcgis.x, arcgis.y];
+
+      if (typeof arcgis.z === 'number') {
+        geojson.coordinates.push(arcgis.z);
+      }
+    }
+
+    if (arcgis.points) {
+      geojson.type = 'MultiPoint';
+      geojson.coordinates = arcgis.points.slice(0);
+    }
+
+    if (arcgis.paths) {
+      if (arcgis.paths.length === 1) {
+        geojson.type = 'LineString';
+        geojson.coordinates = arcgis.paths[0].slice(0);
+      } else {
+        geojson.type = 'MultiLineString';
+        geojson.coordinates = arcgis.paths.slice(0);
+      }
+    }
+
+    if (arcgis.rings) {
+      geojson = convertRingsToGeoJSON(arcgis.rings.slice(0));
+    }
+
+    if (typeof arcgis.xmin === 'number' && typeof arcgis.ymin === 'number' && typeof arcgis.xmax === 'number' && typeof arcgis.ymax === 'number') {
+      geojson.type = 'Polygon';
+      geojson.coordinates = [[[arcgis.xmax, arcgis.ymax], [arcgis.xmin, arcgis.ymax], [arcgis.xmin, arcgis.ymin], [arcgis.xmax, arcgis.ymin], [arcgis.xmax, arcgis.ymax]]];
+    }
+
+    if (arcgis.geometry || arcgis.attributes) {
+      geojson.type = 'Feature';
+      geojson.geometry = arcgis.geometry ? arcgisToGeoJSON(arcgis.geometry) : null;
+      geojson.properties = arcgis.attributes ? shallowClone(arcgis.attributes) : null;
+
+      if (arcgis.attributes) {
+        try {
+          geojson.id = getId(arcgis.attributes, idAttribute);
+        } catch (err) {// don't set an id
+        }
+      }
+    } // if no valid geometry was encountered
+
+
+    if (JSON.stringify(geojson.geometry) === JSON.stringify({})) {
+      geojson.geometry = null;
+    }
+
+    if (arcgis.spatialReference && arcgis.spatialReference.wkid && arcgis.spatialReference.wkid !== 4326) {
+      console.warn('Object converted in non-standard crs - ' + JSON.stringify(arcgis.spatialReference));
+    }
+
+    return geojson;
+  };
+
+  /* Copyright (c) 2012-2019 Environmental Systems Research Institute, Inc.
+   * Apache-2.0 */
+  // outer rings are clockwise, holes are counterclockwise
+  // used for converting GeoJSON Polygons to ArcGIS Polygons
+
+  var orientRings = function orientRings(poly) {
+    var output = [];
+    var polygon = poly.slice(0);
+    var outerRing = closeRing(polygon.shift().slice(0));
+
+    if (outerRing.length >= 4) {
+      if (!ringIsClockwise(outerRing)) {
+        outerRing.reverse();
+      }
+
+      output.push(outerRing);
+
+      for (var i = 0; i < polygon.length; i++) {
+        var hole = closeRing(polygon[i].slice(0));
+
+        if (hole.length >= 4) {
+          if (ringIsClockwise(hole)) {
+            hole.reverse();
+          }
+
+          output.push(hole);
+        }
+      }
+    }
+
+    return output;
+  }; // This function flattens holes in multipolygons to one array of polygons
+  // used for converting GeoJSON Polygons to ArcGIS Polygons
+
+
+  var flattenMultiPolygonRings = function flattenMultiPolygonRings(rings) {
+    var output = [];
+
+    for (var i = 0; i < rings.length; i++) {
+      var polygon = orientRings(rings[i]);
+
+      for (var x = polygon.length - 1; x >= 0; x--) {
+        var ring = polygon[x].slice(0);
+        output.push(ring);
+      }
+    }
+
+    return output;
+  };
+
+  var geojsonToArcGIS = function geojsonToArcGIS(geojson, idAttribute) {
+    idAttribute = idAttribute || 'OBJECTID';
+    var spatialReference = {
+      wkid: 4326
+    };
+    var result = {};
+    var i;
+
+    switch (geojson.type) {
+      case 'Point':
+        result.x = geojson.coordinates[0];
+        result.y = geojson.coordinates[1];
+        result.spatialReference = spatialReference;
+        break;
+
+      case 'MultiPoint':
+        result.points = geojson.coordinates.slice(0);
+        result.spatialReference = spatialReference;
+        break;
+
+      case 'LineString':
+        result.paths = [geojson.coordinates.slice(0)];
+        result.spatialReference = spatialReference;
+        break;
+
+      case 'MultiLineString':
+        result.paths = geojson.coordinates.slice(0);
+        result.spatialReference = spatialReference;
+        break;
+
+      case 'Polygon':
+        result.rings = orientRings(geojson.coordinates.slice(0));
+        result.spatialReference = spatialReference;
+        break;
+
+      case 'MultiPolygon':
+        result.rings = flattenMultiPolygonRings(geojson.coordinates.slice(0));
+        result.spatialReference = spatialReference;
+        break;
+
+      case 'Feature':
+        if (geojson.geometry) {
+          result.geometry = geojsonToArcGIS(geojson.geometry, idAttribute);
+        }
+
+        result.attributes = geojson.properties ? shallowClone(geojson.properties) : {};
+
+        if (geojson.id) {
+          result.attributes[idAttribute] = geojson.id;
+        }
+
+        break;
+
+      case 'FeatureCollection':
+        result = [];
+
+        for (i = 0; i < geojson.features.length; i++) {
+          result.push(geojsonToArcGIS(geojson.features[i], idAttribute));
+        }
+
+        break;
+
+      case 'GeometryCollection':
+        result = [];
+
+        for (i = 0; i < geojson.geometries.length; i++) {
+          result.push(geojsonToArcGIS(geojson.geometries[i], idAttribute));
+        }
+
+        break;
+    }
+
+    return result;
+  };
+
+  var BASE_LEAFLET_ATTRIBUTION_STRING = '<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>';
+  var POWERED_BY_ESRI_ATTRIBUTION_STRING = 'Powered by <a href="https://www.esri.com">Esri</a>';
+
+  function geojsonToArcGIS$1 (geojson, idAttr) {
+    return geojsonToArcGIS(geojson, idAttr);
+  }
+
+  function arcgisToGeoJSON$1 (arcgis, idAttr) {
+    return arcgisToGeoJSON(arcgis, idAttr);
+  }
+
+  // convert an extent (ArcGIS) to LatLngBounds (Leaflet)
+  function extentToBounds (extent) {
+    // "NaN" coordinates from ArcGIS Server indicate a null geometry
+    if (extent.xmin !== 'NaN' && extent.ymin !== 'NaN' && extent.xmax !== 'NaN' && extent.ymax !== 'NaN') {
+      var sw = leaflet.latLng(extent.ymin, extent.xmin);
+      var ne = leaflet.latLng(extent.ymax, extent.xmax);
+      return leaflet.latLngBounds(sw, ne);
+    } else {
+      return null;
+    }
+  }
+
+  // convert an LatLngBounds (Leaflet) to extent (ArcGIS)
+  function boundsToExtent (bounds) {
+    bounds = leaflet.latLngBounds(bounds);
+    return {
+      'xmin': bounds.getSouthWest().lng,
+      'ymin': bounds.getSouthWest().lat,
+      'xmax': bounds.getNorthEast().lng,
+      'ymax': bounds.getNorthEast().lat,
+      'spatialReference': {
+        'wkid': 4326
+      }
+    };
+  }
+
+  var knownFieldNames = /^(OBJECTID|FID|OID|ID)$/i;
+
+  // Attempts to find the ID Field from response
+  function _findIdAttributeFromResponse (response) {
+    var result;
+
+    if (response.objectIdFieldName) {
+      // Find Id Field directly
+      result = response.objectIdFieldName;
+    } else if (response.fields) {
+      // Find ID Field based on field type
+      for (var j = 0; j <= response.fields.length - 1; j++) {
+        if (response.fields[j].type === 'esriFieldTypeOID') {
+          result = response.fields[j].name;
+          break;
+        }
+      }
+      if (!result) {
+        // If no field was marked as being the esriFieldTypeOID try well known field names
+        for (j = 0; j <= response.fields.length - 1; j++) {
+          if (response.fields[j].name.match(knownFieldNames)) {
+            result = response.fields[j].name;
+            break;
+          }
+        }
+      }
+    }
+    return result;
+  }
+
+  // This is the 'last' resort, find the Id field from the specified feature
+  function _findIdAttributeFromFeature (feature) {
+    for (var key in feature.attributes) {
+      if (key.match(knownFieldNames)) {
+        return key;
+      }
+    }
+  }
+
+  function responseToFeatureCollection (response, idAttribute) {
+    var objectIdField;
+    var features = response.features || response.results;
+    var count = features && features.length;
+
+    if (idAttribute) {
+      objectIdField = idAttribute;
+    } else {
+      objectIdField = _findIdAttributeFromResponse(response);
+    }
+
+    var featureCollection = {
+      type: 'FeatureCollection',
+      features: []
+    };
+
+    if (count) {
+      for (var i = features.length - 1; i >= 0; i--) {
+        var feature = arcgisToGeoJSON$1(features[i], objectIdField || _findIdAttributeFromFeature(features[i]));
+        featureCollection.features.push(feature);
+      }
+    }
+
+    return featureCollection;
+  }
+
+    // trim url whitespace and add a trailing slash if needed
+  function cleanUrl (url) {
+    // trim leading and trailing spaces, but not spaces inside the url
+    url = leaflet.Util.trim(url);
+
+    // add a trailing slash to the url if the user omitted it
+    if (url[url.length - 1] !== '/') {
+      url += '/';
+    }
+
+    return url;
+  }
+
+  /* Extract url params if any and store them in requestParams attribute.
+     Return the options params updated */
+  function getUrlParams (options) {
+    if (options.url.indexOf('?') !== -1) {
+      options.requestParams = options.requestParams || {};
+      var queryString = options.url.substring(options.url.indexOf('?') + 1);
+      options.url = options.url.split('?')[0];
+      options.requestParams = JSON.parse('{"' + decodeURI(queryString).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}');
+    }
+    options.url = cleanUrl(options.url.split('?')[0]);
+    return options;
+  }
+
+  function isArcgisOnline (url) {
+    /* hosted feature services support geojson as an output format
+    utility.arcgis.com services are proxied from a variety of ArcGIS Server vintages, and may not */
+    return (/^(?!.*utility\.arcgis\.com).*\.arcgis\.com.*FeatureServer/i).test(url);
+  }
+
+  function geojsonTypeToArcGIS (geoJsonType) {
+    var arcgisGeometryType;
+    switch (geoJsonType) {
+      case 'Point':
+        arcgisGeometryType = 'esriGeometryPoint';
+        break;
+      case 'MultiPoint':
+        arcgisGeometryType = 'esriGeometryMultipoint';
+        break;
+      case 'LineString':
+        arcgisGeometryType = 'esriGeometryPolyline';
+        break;
+      case 'MultiLineString':
+        arcgisGeometryType = 'esriGeometryPolyline';
+        break;
+      case 'Polygon':
+        arcgisGeometryType = 'esriGeometryPolygon';
+        break;
+      case 'MultiPolygon':
+        arcgisGeometryType = 'esriGeometryPolygon';
+        break;
+    }
+
+    return arcgisGeometryType;
+  }
+
+  function calcAttributionWidth (map) {
+    // either crop at 55px or user defined buffer
+    return (map.getSize().x - options.attributionWidthOffset) + 'px';
+  }
+
+  function setEsriAttribution (map) {
+    if (!map.attributionControl) {
+      return;
+    }
+
+    if (!map.attributionControl._esriAttributionLayerCount) {
+      map.attributionControl._esriAttributionLayerCount = 0;
+    }
+
+    if (map.attributionControl._esriAttributionLayerCount === 0) {
+      // Dynamically creating the CSS rules, only run this once per page load:
+      if (!map.attributionControl._esriAttributionAddedOnce) {
+        var hoverAttributionStyle = document.createElement('style');
+        hoverAttributionStyle.type = 'text/css';
+        hoverAttributionStyle.innerHTML = '.esri-truncated-attribution:hover {' +
+          'white-space: normal;' +
+        '}';
+        document.getElementsByTagName('head')[0].appendChild(hoverAttributionStyle);
+
+        // define a new css class in JS to trim attribution into a single line
+        var attributionStyle = document.createElement('style');
+        attributionStyle.type = 'text/css';
+        attributionStyle.innerHTML = '.esri-truncated-attribution {' +
+          'vertical-align: -3px;' +
+          'white-space: nowrap;' +
+          'overflow: hidden;' +
+          'text-overflow: ellipsis;' +
+          'display: inline-block;' +
+          'transition: 0s white-space;' +
+          'transition-delay: 1s;' +
+          'max-width: ' + calcAttributionWidth(map) + ';' +
+        '}';
+        document.getElementsByTagName('head')[0].appendChild(attributionStyle);
+
+        // update the width used to truncate when the map itself is resized
+        map.on('resize', function (e) {
+          if (map.attributionControl) {
+            map.attributionControl._container.style.maxWidth = calcAttributionWidth(e.target);
+          }
+        });
+
+        map.attributionControl._esriAttributionAddedOnce = true;
+      }
+
+      map.attributionControl.setPrefix(BASE_LEAFLET_ATTRIBUTION_STRING + ' | ' + POWERED_BY_ESRI_ATTRIBUTION_STRING);
+      leaflet.DomUtil.addClass(map.attributionControl._container, 'esri-truncated-attribution:hover');
+      leaflet.DomUtil.addClass(map.attributionControl._container, 'esri-truncated-attribution');
+    }
+
+    // Track the number of esri-leaflet layers that are on the map so we can know when we can remove the attribution (below in removeEsriAttribution)
+    map.attributionControl._esriAttributionLayerCount = map.attributionControl._esriAttributionLayerCount + 1;
+  }
+
+  function removeEsriAttribution (map) {
+    if (!map.attributionControl) {
+      return;
+    }
+
+    // Only remove the attribution if we're about to remove the LAST esri-leaflet layer (_esriAttributionLayerCount)
+    if (map.attributionControl._esriAttributionLayerCount && map.attributionControl._esriAttributionLayerCount === 1) {
+      map.attributionControl.setPrefix(BASE_LEAFLET_ATTRIBUTION_STRING);
+      leaflet.DomUtil.removeClass(map.attributionControl._container, 'esri-truncated-attribution:hover');
+      leaflet.DomUtil.removeClass(map.attributionControl._container, 'esri-truncated-attribution');
+    }
+    map.attributionControl._esriAttributionLayerCount = map.attributionControl._esriAttributionLayerCount - 1;
+  }
+
+  function _setGeometry (geometry) {
+    var params = {
+      geometry: null,
+      geometryType: null
+    };
+
+    // convert bounds to extent and finish
+    if (geometry instanceof leaflet.LatLngBounds) {
+      // set geometry + geometryType
+      params.geometry = boundsToExtent(geometry);
+      params.geometryType = 'esriGeometryEnvelope';
+      return params;
+    }
+
+    // convert L.Marker > L.LatLng
+    if (geometry.getLatLng) {
+      geometry = geometry.getLatLng();
+    }
+
+    // convert L.LatLng to a geojson point and continue;
+    if (geometry instanceof leaflet.LatLng) {
+      geometry = {
+        type: 'Point',
+        coordinates: [geometry.lng, geometry.lat]
+      };
+    }
+
+    // handle L.GeoJSON, pull out the first geometry
+    if (geometry instanceof leaflet.GeoJSON) {
+      // reassign geometry to the GeoJSON value  (we are assuming that only one feature is present)
+      geometry = geometry.getLayers()[0].feature.geometry;
+      params.geometry = geojsonToArcGIS$1(geometry);
+      params.geometryType = geojsonTypeToArcGIS(geometry.type);
+    }
+
+    // Handle L.Polyline and L.Polygon
+    if (geometry.toGeoJSON) {
+      geometry = geometry.toGeoJSON();
+    }
+
+    // handle GeoJSON feature by pulling out the geometry
+    if (geometry.type === 'Feature') {
+      // get the geometry of the geojson feature
+      geometry = geometry.geometry;
+    }
+
+    // confirm that our GeoJSON is a point, line or polygon
+    if (geometry.type === 'Point' || geometry.type === 'LineString' || geometry.type === 'Polygon' || geometry.type === 'MultiPolygon') {
+      params.geometry = geojsonToArcGIS$1(geometry);
+      params.geometryType = geojsonTypeToArcGIS(geometry.type);
+      return params;
+    }
+
+    // warn the user if we havn't found an appropriate object
+    warn('invalid geometry passed to spatial query. Should be L.LatLng, L.LatLngBounds, L.Marker or a GeoJSON Point, Line, Polygon or MultiPolygon object');
+
+    return;
+  }
+
+  function _getAttributionData (url, map) {
+    if (Support.cors) {
+      request(url, {}, leaflet.Util.bind(function (error, attributions) {
+        if (error) { return; }
+        map._esriAttributions = [];
+        for (var c = 0; c < attributions.contributors.length; c++) {
+          var contributor = attributions.contributors[c];
+
+          for (var i = 0; i < contributor.coverageAreas.length; i++) {
+            var coverageArea = contributor.coverageAreas[i];
+            var southWest = leaflet.latLng(coverageArea.bbox[0], coverageArea.bbox[1]);
+            var northEast = leaflet.latLng(coverageArea.bbox[2], coverageArea.bbox[3]);
+            map._esriAttributions.push({
+              attribution: contributor.attribution,
+              score: coverageArea.score,
+              bounds: leaflet.latLngBounds(southWest, northEast),
+              minZoom: coverageArea.zoomMin,
+              maxZoom: coverageArea.zoomMax
+            });
+          }
+        }
+
+        map._esriAttributions.sort(function (a, b) {
+          return b.score - a.score;
+        });
+
+        // pass the same argument as the map's 'moveend' event
+        var obj = { target: map };
+        _updateMapAttribution(obj);
+      }, this));
+    }
+  }
+
+  function _updateMapAttribution (evt) {
+    var map = evt.target;
+    var oldAttributions = map._esriAttributions;
+
+    if (!map || !map.attributionControl) return;
+
+    var attributionElement = map.attributionControl._container.querySelector('.esri-dynamic-attribution');
+
+    if (attributionElement && oldAttributions) {
+      var newAttributions = '';
+      var bounds = map.getBounds();
+      var wrappedBounds = leaflet.latLngBounds(
+        bounds.getSouthWest().wrap(),
+        bounds.getNorthEast().wrap()
+      );
+      var zoom = map.getZoom();
+
+      for (var i = 0; i < oldAttributions.length; i++) {
+        var attribution = oldAttributions[i];
+        var text = attribution.attribution;
+
+        if (!newAttributions.match(text) && attribution.bounds.intersects(wrappedBounds) && zoom >= attribution.minZoom && zoom <= attribution.maxZoom) {
+          newAttributions += (', ' + text);
+        }
+      }
+
+      newAttributions = newAttributions.substr(2);
+      attributionElement.innerHTML = newAttributions;
+      attributionElement.style.maxWidth = calcAttributionWidth(map);
+
+      map.fire('attributionupdated', {
+        attribution: newAttributions
+      });
+    }
+  }
+
+  var EsriUtil = {
+    warn: warn,
+    cleanUrl: cleanUrl,
+    getUrlParams: getUrlParams,
+    isArcgisOnline: isArcgisOnline,
+    geojsonTypeToArcGIS: geojsonTypeToArcGIS,
+    responseToFeatureCollection: responseToFeatureCollection,
+    geojsonToArcGIS: geojsonToArcGIS$1,
+    arcgisToGeoJSON: arcgisToGeoJSON$1,
+    boundsToExtent: boundsToExtent,
+    extentToBounds: extentToBounds,
+    calcAttributionWidth: calcAttributionWidth,
+    setEsriAttribution: setEsriAttribution,
+    _setGeometry: _setGeometry,
+    _getAttributionData: _getAttributionData,
+    _updateMapAttribution: _updateMapAttribution,
+    _findIdAttributeFromFeature: _findIdAttributeFromFeature,
+    _findIdAttributeFromResponse: _findIdAttributeFromResponse
+  };
+
+  var Task = leaflet.Class.extend({
+
+    options: {
+      proxy: false,
+      useCors: cors
+    },
+
+    // Generate a method for each methodName:paramName in the setters for this task.
+    generateSetter: function (param, context) {
+      return leaflet.Util.bind(function (value) {
+        this.params[param] = value;
+        return this;
+      }, context);
+    },
+
+    initialize: function (endpoint) {
+      // endpoint can be either a url (and options) for an ArcGIS Rest Service or an instance of EsriLeaflet.Service
+      if (endpoint.request && endpoint.options) {
+        this._service = endpoint;
+        leaflet.Util.setOptions(this, endpoint.options);
+      } else {
+        leaflet.Util.setOptions(this, endpoint);
+        this.options.url = cleanUrl(endpoint.url);
+      }
+
+      // clone default params into this object
+      this.params = leaflet.Util.extend({}, this.params || {});
+
+      // generate setter methods based on the setters object implimented a child class
+      if (this.setters) {
+        for (var setter in this.setters) {
+          var param = this.setters[setter];
+          this[setter] = this.generateSetter(param, this);
+        }
+      }
+    },
+
+    token: function (token) {
+      if (this._service) {
+        this._service.authenticate(token);
+      } else {
+        this.params.token = token;
+      }
+      return this;
+    },
+
+    // ArcGIS Server Find/Identify 10.5+
+    format: function (boolean) {
+      // use double negative to expose a more intuitive positive method name
+      this.params.returnUnformattedValues = !boolean;
+      return this;
+    },
+
+    request: function (callback, context) {
+      if (this.options.requestParams) {
+        leaflet.Util.extend(this.params, this.options.requestParams);
+      }
+      if (this._service) {
+        return this._service.request(this.path, this.params, callback, context);
+      }
+
+      return this._request('request', this.path, this.params, callback, context);
+    },
+
+    _request: function (method, path, params, callback, context) {
+      var url = (this.options.proxy) ? this.options.proxy + '?' + this.options.url + path : this.options.url + path;
+
+      if ((method === 'get' || method === 'request') && !this.options.useCors) {
+        return Request.get.JSONP(url, params, callback, context);
+      }
+
+      return Request[method](url, params, callback, context);
+    }
+  });
+
+  function task (options) {
+    options = getUrlParams(options);
+    return new Task(options);
+  }
+
+  var Query = Task.extend({
+    setters: {
+      'offset': 'resultOffset',
+      'limit': 'resultRecordCount',
+      'fields': 'outFields',
+      'precision': 'geometryPrecision',
+      'featureIds': 'objectIds',
+      'returnGeometry': 'returnGeometry',
+      'returnM': 'returnM',
+      'transform': 'datumTransformation',
+      'token': 'token'
+    },
+
+    path: 'query',
+
+    params: {
+      returnGeometry: true,
+      where: '1=1',
+      outSR: 4326,
+      outFields: '*'
+    },
+
+    // Returns a feature if its shape is wholly contained within the search geometry. Valid for all shape type combinations.
+    within: function (geometry) {
+      this._setGeometryParams(geometry);
+      this.params.spatialRel = 'esriSpatialRelContains'; // to the REST api this reads geometry **contains** layer
+      return this;
+    },
+
+    // Returns a feature if any spatial relationship is found. Applies to all shape type combinations.
+    intersects: function (geometry) {
+      this._setGeometryParams(geometry);
+      this.params.spatialRel = 'esriSpatialRelIntersects';
+      return this;
+    },
+
+    // Returns a feature if its shape wholly contains the search geometry. Valid for all shape type combinations.
+    contains: function (geometry) {
+      this._setGeometryParams(geometry);
+      this.params.spatialRel = 'esriSpatialRelWithin'; // to the REST api this reads geometry **within** layer
+      return this;
+    },
+
+    // Returns a feature if the intersection of the interiors of the two shapes is not empty and has a lower dimension than the maximum dimension of the two shapes. Two lines that share an endpoint in common do not cross. Valid for Line/Line, Line/Area, Multi-point/Area, and Multi-point/Line shape type combinations.
+    crosses: function (geometry) {
+      this._setGeometryParams(geometry);
+      this.params.spatialRel = 'esriSpatialRelCrosses';
+      return this;
+    },
+
+    // Returns a feature if the two shapes share a common boundary. However, the intersection of the interiors of the two shapes must be empty. In the Point/Line case, the point may touch an endpoint only of the line. Applies to all combinations except Point/Point.
+    touches: function (geometry) {
+      this._setGeometryParams(geometry);
+      this.params.spatialRel = 'esriSpatialRelTouches';
+      return this;
+    },
+
+    // Returns a feature if the intersection of the two shapes results in an object of the same dimension, but different from both of the shapes. Applies to Area/Area, Line/Line, and Multi-point/Multi-point shape type combinations.
+    overlaps: function (geometry) {
+      this._setGeometryParams(geometry);
+      this.params.spatialRel = 'esriSpatialRelOverlaps';
+      return this;
+    },
+
+    // Returns a feature if the envelope of the two shapes intersects.
+    bboxIntersects: function (geometry) {
+      this._setGeometryParams(geometry);
+      this.params.spatialRel = 'esriSpatialRelEnvelopeIntersects';
+      return this;
+    },
+
+    // if someone can help decipher the ArcObjects explanation and translate to plain speak, we should mention this method in the doc
+    indexIntersects: function (geometry) {
+      this._setGeometryParams(geometry);
+      this.params.spatialRel = 'esriSpatialRelIndexIntersects'; // Returns a feature if the envelope of the query geometry intersects the index entry for the target geometry
+      return this;
+    },
+
+    // only valid for Feature Services running on ArcGIS Server 10.3+ or ArcGIS Online
+    nearby: function (latlng, radius) {
+      latlng = leaflet.latLng(latlng);
+      this.params.geometry = [latlng.lng, latlng.lat];
+      this.params.geometryType = 'esriGeometryPoint';
+      this.params.spatialRel = 'esriSpatialRelIntersects';
+      this.params.units = 'esriSRUnit_Meter';
+      this.params.distance = radius;
+      this.params.inSR = 4326;
+      return this;
+    },
+
+    where: function (string) {
+      // instead of converting double-quotes to single quotes, pass as is, and provide a more informative message if a 400 is encountered
+      this.params.where = string;
+      return this;
+    },
+
+    between: function (start, end) {
+      this.params.time = [start.valueOf(), end.valueOf()];
+      return this;
+    },
+
+    simplify: function (map, factor) {
+      var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());
+      this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;
+      return this;
+    },
+
+    orderBy: function (fieldName, order) {
+      order = order || 'ASC';
+      this.params.orderByFields = (this.params.orderByFields) ? this.params.orderByFields + ',' : '';
+      this.params.orderByFields += ([fieldName, order]).join(' ');
+      return this;
+    },
+
+    run: function (callback, context) {
+      this._cleanParams();
+
+      // services hosted on ArcGIS Online and ArcGIS Server 10.3.1+ support requesting geojson directly
+      if (this.options.isModern || (isArcgisOnline(this.options.url) && this.options.isModern === undefined)) {
+        this.params.f = 'geojson';
+
+        return this.request(function (error, response) {
+          this._trapSQLerrors(error);
+          callback.call(context, error, response, response);
+        }, this);
+
+        // otherwise convert it in the callback then pass it on
+      } else {
+        return this.request(function (error, response) {
+          this._trapSQLerrors(error);
+          callback.call(context, error, (response && responseToFeatureCollection(response)), response);
+        }, this);
+      }
+    },
+
+    count: function (callback, context) {
+      this._cleanParams();
+      this.params.returnCountOnly = true;
+      return this.request(function (error, response) {
+        callback.call(this, error, (response && response.count), response);
+      }, context);
+    },
+
+    ids: function (callback, context) {
+      this._cleanParams();
+      this.params.returnIdsOnly = true;
+      return this.request(function (error, response) {
+        callback.call(this, error, (response && response.objectIds), response);
+      }, context);
+    },
+
+    // only valid for Feature Services running on ArcGIS Server 10.3+ or ArcGIS Online
+    bounds: function (callback, context) {
+      this._cleanParams();
+      this.params.returnExtentOnly = true;
+      return this.request(function (error, response) {
+        if (response && response.extent && extentToBounds(response.extent)) {
+          callback.call(context, error, extentToBounds(response.extent), response);
+        } else {
+          error = {
+            message: 'Invalid Bounds'
+          };
+          callback.call(context, error, null, response);
+        }
+      }, context);
+    },
+
+    distinct: function () {
+      // geometry must be omitted for queries requesting distinct values
+      this.params.returnGeometry = false;
+      this.params.returnDistinctValues = true;
+      return this;
+    },
+
+    // only valid for image services
+    pixelSize: function (rawPoint) {
+      var castPoint = leaflet.point(rawPoint);
+      this.params.pixelSize = [castPoint.x, castPoint.y];
+      return this;
+    },
+
+    // only valid for map services
+    layer: function (layer) {
+      this.path = layer + '/query';
+      return this;
+    },
+
+    _trapSQLerrors: function (error) {
+      if (error) {
+        if (error.code === '400') {
+          warn('one common syntax error in query requests is encasing string values in double quotes instead of single quotes');
+        }
+      }
+    },
+
+    _cleanParams: function () {
+      delete this.params.returnIdsOnly;
+      delete this.params.returnExtentOnly;
+      delete this.params.returnCountOnly;
+    },
+
+    _setGeometryParams: function (geometry) {
+      this.params.inSR = 4326;
+      var converted = _setGeometry(geometry);
+      this.params.geometry = converted.geometry;
+      this.params.geometryType = converted.geometryType;
+    }
+
+  });
+
+  function query (options) {
+    return new Query(options);
+  }
+
+  var Find = Task.extend({
+    setters: {
+      // method name > param name
+      'contains': 'contains',
+      'text': 'searchText',
+      'fields': 'searchFields', // denote an array or single string
+      'spatialReference': 'sr',
+      'sr': 'sr',
+      'layers': 'layers',
+      'returnGeometry': 'returnGeometry',
+      'maxAllowableOffset': 'maxAllowableOffset',
+      'precision': 'geometryPrecision',
+      'dynamicLayers': 'dynamicLayers',
+      'returnZ': 'returnZ',
+      'returnM': 'returnM',
+      'gdbVersion': 'gdbVersion',
+      // skipped implementing this (for now) because the REST service implementation isnt consistent between operations
+      // 'transform': 'datumTransformations',
+      'token': 'token'
+    },
+
+    path: 'find',
+
+    params: {
+      sr: 4326,
+      contains: true,
+      returnGeometry: true,
+      returnZ: true,
+      returnM: false
+    },
+
+    layerDefs: function (id, where) {
+      this.params.layerDefs = (this.params.layerDefs) ? this.params.layerDefs + ';' : '';
+      this.params.layerDefs += ([id, where]).join(':');
+      return this;
+    },
+
+    simplify: function (map, factor) {
+      var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());
+      this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;
+      return this;
+    },
+
+    run: function (callback, context) {
+      return this.request(function (error, response) {
+        callback.call(context, error, (response && responseToFeatureCollection(response)), response);
+      }, context);
+    }
+  });
+
+  function find (options) {
+    return new Find(options);
+  }
+
+  var Identify = Task.extend({
+    path: 'identify',
+
+    between: function (start, end) {
+      this.params.time = [start.valueOf(), end.valueOf()];
+      return this;
+    }
+  });
+
+  function identify (options) {
+    return new Identify(options);
+  }
+
+  var IdentifyFeatures = Identify.extend({
+    setters: {
+      'layers': 'layers',
+      'precision': 'geometryPrecision',
+      'tolerance': 'tolerance',
+      // skipped implementing this (for now) because the REST service implementation isnt consistent between operations.
+      // 'transform': 'datumTransformations'
+      'returnGeometry': 'returnGeometry'
+    },
+
+    params: {
+      sr: 4326,
+      layers: 'all',
+      tolerance: 3,
+      returnGeometry: true
+    },
+
+    on: function (map) {
+      var extent = boundsToExtent(map.getBounds());
+      var size = map.getSize();
+      this.params.imageDisplay = [size.x, size.y, 96];
+      this.params.mapExtent = [extent.xmin, extent.ymin, extent.xmax, extent.ymax];
+      return this;
+    },
+
+    at: function (geometry) {
+      // cast lat, long pairs in raw array form manually
+      if (geometry.length === 2) {
+        geometry = leaflet.latLng(geometry);
+      }
+      this._setGeometryParams(geometry);
+      return this;
+    },
+
+    layerDef: function (id, where) {
+      this.params.layerDefs = (this.params.layerDefs) ? this.params.layerDefs + ';' : '';
+      this.params.layerDefs += ([id, where]).join(':');
+      return this;
+    },
+
+    simplify: function (map, factor) {
+      var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());
+      this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;
+      return this;
+    },
+
+    run: function (callback, context) {
+      return this.request(function (error, response) {
+        // immediately invoke with an error
+        if (error) {
+          callback.call(context, error, undefined, response);
+          return;
+
+        // ok no error lets just assume we have features...
+        } else {
+          var featureCollection = responseToFeatureCollection(response);
+          response.results = response.results.reverse();
+          for (var i = 0; i < featureCollection.features.length; i++) {
+            var feature = featureCollection.features[i];
+            feature.layerId = response.results[i].layerId;
+          }
+          callback.call(context, undefined, featureCollection, response);
+        }
+      });
+    },
+
+    _setGeometryParams: function (geometry) {
+      var converted = _setGeometry(geometry);
+      this.params.geometry = converted.geometry;
+      this.params.geometryType = converted.geometryType;
+    }
+  });
+
+  function identifyFeatures (options) {
+    return new IdentifyFeatures(options);
+  }
+
+  var IdentifyImage = Identify.extend({
+    setters: {
+      'setMosaicRule': 'mosaicRule',
+      'setRenderingRule': 'renderingRule',
+      'setPixelSize': 'pixelSize',
+      'returnCatalogItems': 'returnCatalogItems',
+      'returnGeometry': 'returnGeometry'
+    },
+
+    params: {
+      returnGeometry: false
+    },
+
+    at: function (latlng) {
+      latlng = leaflet.latLng(latlng);
+      this.params.geometry = JSON.stringify({
+        x: latlng.lng,
+        y: latlng.lat,
+        spatialReference: {
+          wkid: 4326
+        }
+      });
+      this.params.geometryType = 'esriGeometryPoint';
+      return this;
+    },
+
+    getMosaicRule: function () {
+      return this.params.mosaicRule;
+    },
+
+    getRenderingRule: function () {
+      return this.params.renderingRule;
+    },
+
+    getPixelSize: function () {
+      return this.params.pixelSize;
+    },
+
+    run: function (callback, context) {
+      return this.request(function (error, response) {
+        callback.call(context, error, (response && this._responseToGeoJSON(response)), response);
+      }, this);
+    },
+
+    // get pixel data and return as geoJSON point
+    // populate catalog items (if any)
+    // merging in any catalogItemVisibilities as a propery of each feature
+    _responseToGeoJSON: function (response) {
+      var location = response.location;
+      var catalogItems = response.catalogItems;
+      var catalogItemVisibilities = response.catalogItemVisibilities;
+      var geoJSON = {
+        'pixel': {
+          'type': 'Feature',
+          'geometry': {
+            'type': 'Point',
+            'coordinates': [location.x, location.y]
+          },
+          'crs': {
+            'type': 'EPSG',
+            'properties': {
+              'code': location.spatialReference.wkid
+            }
+          },
+          'properties': {
+            'OBJECTID': response.objectId,
+            'name': response.name,
+            'value': response.value
+          },
+          'id': response.objectId
+        }
+      };
+
+      if (response.properties && response.properties.Values) {
+        geoJSON.pixel.properties.values = response.properties.Values;
+      }
+
+      if (catalogItems && catalogItems.features) {
+        geoJSON.catalogItems = responseToFeatureCollection(catalogItems);
+        if (catalogItemVisibilities && catalogItemVisibilities.length === geoJSON.catalogItems.features.length) {
+          for (var i = catalogItemVisibilities.length - 1; i >= 0; i--) {
+            geoJSON.catalogItems.features[i].properties.catalogItemVisibility = catalogItemVisibilities[i];
+          }
+        }
+      }
+      return geoJSON;
+    }
+
+  });
+
+  function identifyImage (params) {
+    return new IdentifyImage(params);
+  }
+
+  var Service = leaflet.Evented.extend({
+
+    options: {
+      proxy: false,
+      useCors: cors,
+      timeout: 0
+    },
+
+    initialize: function (options) {
+      options = options || {};
+      this._requestQueue = [];
+      this._authenticating = false;
+      leaflet.Util.setOptions(this, options);
+      this.options.url = cleanUrl(this.options.url);
+    },
+
+    get: function (path, params, callback, context) {
+      return this._request('get', path, params, callback, context);
+    },
+
+    post: function (path, params, callback, context) {
+      return this._request('post', path, params, callback, context);
+    },
+
+    request: function (path, params, callback, context) {
+      return this._request('request', path, params, callback, context);
+    },
+
+    metadata: function (callback, context) {
+      return this._request('get', '', {}, callback, context);
+    },
+
+    authenticate: function (token) {
+      this._authenticating = false;
+      this.options.token = token;
+      this._runQueue();
+      return this;
+    },
+
+    getTimeout: function () {
+      return this.options.timeout;
+    },
+
+    setTimeout: function (timeout) {
+      this.options.timeout = timeout;
+    },
+
+    _request: function (method, path, params, callback, context) {
+      this.fire('requeststart', {
+        url: this.options.url + path,
+        params: params,
+        method: method
+      }, true);
+
+      var wrappedCallback = this._createServiceCallback(method, path, params, callback, context);
+
+      if (this.options.token) {
+        params.token = this.options.token;
+      }
+      if (this.options.requestParams) {
+        leaflet.Util.extend(params, this.options.requestParams);
+      }
+      if (this._authenticating) {
+        this._requestQueue.push([method, path, params, callback, context]);
+        return;
+      } else {
+        var url = (this.options.proxy) ? this.options.proxy + '?' + this.options.url + path : this.options.url + path;
+
+        if ((method === 'get' || method === 'request') && !this.options.useCors) {
+          return Request.get.JSONP(url, params, wrappedCallback, context);
+        } else {
+          return Request[method](url, params, wrappedCallback, context);
+        }
+      }
+    },
+
+    _createServiceCallback: function (method, path, params, callback, context) {
+      return leaflet.Util.bind(function (error, response) {
+        if (error && (error.code === 499 || error.code === 498)) {
+          this._authenticating = true;
+
+          this._requestQueue.push([method, path, params, callback, context]);
+
+          // fire an event for users to handle and re-authenticate
+          this.fire('authenticationrequired', {
+            authenticate: leaflet.Util.bind(this.authenticate, this)
+          }, true);
+
+          // if the user has access to a callback they can handle the auth error
+          error.authenticate = leaflet.Util.bind(this.authenticate, this);
+        }
+
+        callback.call(context, error, response);
+
+        if (error) {
+          this.fire('requesterror', {
+            url: this.options.url + path,
+            params: params,
+            message: error.message,
+            code: error.code,
+            method: method
+          }, true);
+        } else {
+          this.fire('requestsuccess', {
+            url: this.options.url + path,
+            params: params,
+            response: response,
+            method: method
+          }, true);
+        }
+
+        this.fire('requestend', {
+          url: this.options.url + path,
+          params: params,
+          method: method
+        }, true);
+      }, this);
+    },
+
+    _runQueue: function () {
+      for (var i = this._requestQueue.length - 1; i >= 0; i--) {
+        var request = this._requestQueue[i];
+        var method = request.shift();
+        this[method].apply(this, request);
+      }
+      this._requestQueue = [];
+    }
+  });
+
+  function service (options) {
+    options = getUrlParams(options);
+    return new Service(options);
+  }
+
+  var MapService = Service.extend({
+
+    identify: function () {
+      return identifyFeatures(this);
+    },
+
+    find: function () {
+      return find(this);
+    },
+
+    query: function () {
+      return query(this);
+    }
+
+  });
+
+  function mapService (options) {
+    return new MapService(options);
+  }
+
+  var ImageService = Service.extend({
+
+    query: function () {
+      return query(this);
+    },
+
+    identify: function () {
+      return identifyImage(this);
+    }
+  });
+
+  function imageService (options) {
+    return new ImageService(options);
+  }
+
+  var FeatureLayerService = Service.extend({
+
+    options: {
+      idAttribute: 'OBJECTID'
+    },
+
+    query: function () {
+      return query(this);
+    },
+
+    addFeature: function (feature, callback, context) {
+      this.addFeatures(feature, callback, context);
+    },
+
+    addFeatures: function (features, callback, context) {
+      var featuresArray = features.features ? features.features : [features];
+      for (var i = featuresArray.length - 1; i >= 0; i--) {
+        delete featuresArray[i].id;
+      }
+      features = geojsonToArcGIS$1(features);
+      features = featuresArray.length > 1 ? features : [features];
+      return this.post('addFeatures', {
+        features: features
+      }, function (error, response) {
+        // For compatibility reason with former addFeature function,
+        // we return the object in the array and not the array itself
+        var result = (response && response.addResults) ? response.addResults.length > 1 ? response.addResults : response.addResults[0] : undefined;
+        if (callback) {
+          callback.call(context, error || response.addResults[0].error, result);
+        }
+      }, context);
+    },
+
+    updateFeature: function (feature, callback, context) {
+      this.updateFeatures(feature, callback, context);
+    },
+
+    updateFeatures: function (features, callback, context) {
+      var featuresArray = features.features ? features.features : [features];
+      features = geojsonToArcGIS$1(features, this.options.idAttribute);
+      features = featuresArray.length > 1 ? features : [features];
+
+      return this.post('updateFeatures', {
+        features: features
+      }, function (error, response) {
+        // For compatibility reason with former updateFeature function,
+        // we return the object in the array and not the array itself
+        var result = (response && response.updateResults) ? response.updateResults.length > 1 ? response.updateResults : response.updateResults[0] : undefined;
+        if (callback) {
+          callback.call(context, error || response.updateResults[0].error, result);
+        }
+      }, context);
+    },
+
+    deleteFeature: function (id, callback, context) {
+      this.deleteFeatures(id, callback, context);
+    },
+
+    deleteFeatures: function (ids, callback, context) {
+      return this.post('deleteFeatures', {
+        objectIds: ids
+      }, function (error, response) {
+        // For compatibility reason with former deleteFeature function,
+        // we return the object in the array and not the array itself
+        var result = (response && response.deleteResults) ? response.deleteResults.length > 1 ? response.deleteResults : response.deleteResults[0] : undefined;
+        if (callback) {
+          callback.call(context, error || response.deleteResults[0].error, result);
+        }
+      }, context);
+    }
+  });
+
+  function featureLayerService (options) {
+    return new FeatureLayerService(options);
+  }
+
+  var tileProtocol = (window.location.protocol !== 'https:') ? 'http:' : 'https:';
+
+  var BasemapLayer = leaflet.TileLayer.extend({
+    statics: {
+      TILES: {
+        Streets: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 19,
+            subdomains: ['server', 'services'],
+            attribution: 'USGS, NOAA',
+            attributionUrl: 'https://static.arcgis.com/attribution/World_Street_Map'
+          }
+        },
+        Topographic: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 19,
+            subdomains: ['server', 'services'],
+            attribution: 'USGS, NOAA',
+            attributionUrl: 'https://static.arcgis.com/attribution/World_Topo_Map'
+          }
+        },
+        Oceans: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 16,
+            subdomains: ['server', 'services'],
+            attribution: 'USGS, NOAA',
+            attributionUrl: 'https://static.arcgis.com/attribution/Ocean_Basemap'
+          }
+        },
+        OceansLabels: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Reference/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 16,
+            subdomains: ['server', 'services'],
+            pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
+            attribution: ''
+          }
+        },
+        NationalGeographic: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 16,
+            subdomains: ['server', 'services'],
+            attribution: 'National Geographic, DeLorme, HERE, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, increment P Corp.'
+          }
+        },
+        DarkGray: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 16,
+            subdomains: ['server', 'services'],
+            attribution: 'HERE, DeLorme, MapmyIndia, &copy; OpenStreetMap contributors'
+          }
+        },
+        DarkGrayLabels: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Reference/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 16,
+            subdomains: ['server', 'services'],
+            pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
+            attribution: ''
+
+          }
+        },
+        Gray: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 16,
+            subdomains: ['server', 'services'],
+            attribution: 'HERE, DeLorme, MapmyIndia, &copy; OpenStreetMap contributors'
+          }
+        },
+        GrayLabels: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 16,
+            subdomains: ['server', 'services'],
+            pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
+            attribution: ''
+          }
+        },
+        Imagery: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 19,
+            subdomains: ['server', 'services'],
+            attribution: 'DigitalGlobe, GeoEye, i-cubed, USDA, USGS, AEX, Getmapping, Aerogrid, IGN, IGP, swisstopo, and the GIS User Community',
+            attributionUrl: 'https://static.arcgis.com/attribution/World_Imagery'
+          }
+        },
+        ImageryLabels: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 19,
+            subdomains: ['server', 'services'],
+            pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
+            attribution: ''
+          }
+        },
+        ImageryTransportation: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Transportation/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 19,
+            subdomains: ['server', 'services'],
+            pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
+            attribution: ''
+          }
+        },
+        ShadedRelief: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 13,
+            subdomains: ['server', 'services'],
+            attribution: 'USGS'
+          }
+        },
+        ShadedReliefLabels: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places_Alternate/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 12,
+            subdomains: ['server', 'services'],
+            pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
+            attribution: ''
+          }
+        },
+        Terrain: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 13,
+            subdomains: ['server', 'services'],
+            attribution: 'USGS, NOAA'
+          }
+        },
+        TerrainLabels: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Reference_Overlay/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 13,
+            subdomains: ['server', 'services'],
+            pane: (pointerEvents) ? 'esri-labels' : 'tilePane',
+            attribution: ''
+          }
+        },
+        USATopo: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 15,
+            subdomains: ['server', 'services'],
+            attribution: 'USGS, National Geographic Society, i-cubed'
+          }
+        },
+        ImageryClarity: {
+          urlTemplate: tileProtocol + '//clarity.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 19,
+            attribution: 'Esri, DigitalGlobe, GeoEye, Earthstar Geographics, CNES/Airbus DS, USDA, USGS, AeroGRID, IGN, and the GIS User Community'
+          }
+        },
+        Physical: {
+          urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/World_Physical_Map/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 8,
+            subdomains: ['server', 'services'],
+            attribution: 'U.S. National Park Service'
+          }
+        },
+        ImageryFirefly: {
+          urlTemplate: tileProtocol + '//fly.maptiles.arcgis.com/arcgis/rest/services/World_Imagery_Firefly/MapServer/tile/{z}/{y}/{x}',
+          options: {
+            minZoom: 1,
+            maxZoom: 19,
+            attribution: 'Esri, DigitalGlobe, GeoEye, Earthstar Geographics, CNES/Airbus DS, USDA, USGS, AeroGRID, IGN, and the GIS User Community',
+            attributionUrl: 'https://static.arcgis.com/attribution/World_Imagery'
+          }
+        }
+      }
+    },
+
+    initialize: function (key, options) {
+      var config;
+
+      // set the config variable with the appropriate config object
+      if (typeof key === 'object' && key.urlTemplate && key.options) {
+        config = key;
+      } else if (typeof key === 'string' && BasemapLayer.TILES[key]) {
+        config = BasemapLayer.TILES[key];
+      } else {
+        throw new Error('L.esri.BasemapLayer: Invalid parameter. Use one of "Streets", "Topographic", "Oceans", "OceansLabels", "NationalGeographic", "Physical", "Gray", "GrayLabels", "DarkGray", "DarkGrayLabels", "Imagery", "ImageryLabels", "ImageryTransportation", "ImageryClarity", "ImageryFirefly", ShadedRelief", "ShadedReliefLabels", "Terrain", "TerrainLabels" or "USATopo"');
+      }
+
+      // merge passed options into the config options
+      var tileOptions = leaflet.Util.extend(config.options, options);
+
+      leaflet.Util.setOptions(this, tileOptions);
+
+      if (this.options.token && config.urlTemplate.indexOf('token=') === -1) {
+        config.urlTemplate += ('?token=' + this.options.token);
+      }
+      if (this.options.proxy) {
+        config.urlTemplate = this.options.proxy + '?' + config.urlTemplate;
+      }
+
+      // call the initialize method on L.TileLayer to set everything up
+      leaflet.TileLayer.prototype.initialize.call(this, config.urlTemplate, tileOptions);
+    },
+
+    onAdd: function (map) {
+      // include 'Powered by Esri' in map attribution
+      setEsriAttribution(map);
+
+      if (this.options.pane === 'esri-labels') {
+        this._initPane();
+      }
+      // some basemaps can supply dynamic attribution
+      if (this.options.attributionUrl) {
+        _getAttributionData((this.options.proxy ? this.options.proxy + '?' : '') + this.options.attributionUrl, map);
+      }
+
+      map.on('moveend', _updateMapAttribution);
+
+      leaflet.TileLayer.prototype.onAdd.call(this, map);
+    },
+
+    onRemove: function (map) {
+      removeEsriAttribution(map);
+
+      map.off('moveend', _updateMapAttribution);
+
+      leaflet.TileLayer.prototype.onRemove.call(this, map);
+    },
+
+    _initPane: function () {
+      if (!this._map.getPane(this.options.pane)) {
+        var pane = this._map.createPane(this.options.pane);
+        pane.style.pointerEvents = 'none';
+        pane.style.zIndex = 500;
+      }
+    },
+
+    getAttribution: function () {
+      if (this.options.attribution) {
+        var attribution = '<span class="esri-dynamic-attribution">' + this.options.attribution + '</span>';
+      }
+      return attribution;
+    }
+  });
+
+  function basemapLayer (key, options) {
+    return new BasemapLayer(key, options);
+  }
+
+  var TiledMapLayer = leaflet.TileLayer.extend({
+    options: {
+      zoomOffsetAllowance: 0.1,
+      errorTileUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEABAMAAACuXLVVAAAAA1BMVEUzNDVszlHHAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAAAAAAAAAB6mUWpAAAADZJREFUeJztwQEBAAAAgiD/r25IQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7waBAAABw08RwAAAAABJRU5ErkJggg=='
+    },
+
+    statics: {
+      MercatorZoomLevels: {
+        '0': 156543.03392799999,
+        '1': 78271.516963999893,
+        '2': 39135.758482000099,
+        '3': 19567.879240999901,
+        '4': 9783.9396204999593,
+        '5': 4891.9698102499797,
+        '6': 2445.9849051249898,
+        '7': 1222.9924525624899,
+        '8': 611.49622628138002,
+        '9': 305.74811314055802,
+        '10': 152.874056570411,
+        '11': 76.437028285073197,
+        '12': 38.218514142536598,
+        '13': 19.109257071268299,
+        '14': 9.5546285356341496,
+        '15': 4.7773142679493699,
+        '16': 2.38865713397468,
+        '17': 1.1943285668550501,
+        '18': 0.59716428355981699,
+        '19': 0.29858214164761698,
+        '20': 0.14929107082381,
+        '21': 0.07464553541191,
+        '22': 0.0373227677059525,
+        '23': 0.0186613838529763
+      }
+    },
+
+    initialize: function (options) {
+      options = leaflet.Util.setOptions(this, options);
+
+      // set the urls
+      options = getUrlParams(options);
+      this.tileUrl = (options.proxy ? options.proxy + '?' : '') + options.url + 'tile/{z}/{y}/{x}' + (options.requestParams && Object.keys(options.requestParams).length > 0 ? leaflet.Util.getParamString(options.requestParams) : '');
+      // Remove subdomain in url
+      // https://github.com/Esri/esri-leaflet/issues/991
+      if (options.url.indexOf('{s}') !== -1 && options.subdomains) {
+        options.url = options.url.replace('{s}', options.subdomains[0]);
+      }
+      this.service = mapService(options);
+      this.service.addEventParent(this);
+
+      var arcgisonline = new RegExp(/tiles.arcgis(online)?\.com/g);
+      if (arcgisonline.test(options.url)) {
+        this.tileUrl = this.tileUrl.replace('://tiles', '://tiles{s}');
+        options.subdomains = ['1', '2', '3', '4'];
+      }
+
+      if (this.options.token) {
+        this.tileUrl += ('?token=' + this.options.token);
+      }
+
+      // init layer by calling TileLayers initialize method
+      leaflet.TileLayer.prototype.initialize.call(this, this.tileUrl, options);
+    },
+
+    getTileUrl: function (tilePoint) {
+      var zoom = this._getZoomForUrl();
+
+      return leaflet.Util.template(this.tileUrl, leaflet.Util.extend({
+        s: this._getSubdomain(tilePoint),
+        x: tilePoint.x,
+        y: tilePoint.y,
+        // try lod map first, then just default to zoom level
+        z: (this._lodMap && this._lodMap[zoom]) ? this._lodMap[zoom] : zoom
+      }, this.options));
+    },
+
+    createTile: function (coords, done) {
+      var tile = document.createElement('img');
+
+      leaflet.DomEvent.on(tile, 'load', leaflet.Util.bind(this._tileOnLoad, this, done, tile));
+      leaflet.DomEvent.on(tile, 'error', leaflet.Util.bind(this._tileOnError, this, done, tile));
+
+      if (this.options.crossOrigin) {
+        tile.crossOrigin = '';
+      }
+
+      /*
+       Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons
+       http://www.w3.org/TR/WCAG20-TECHS/H67
+      */
+      tile.alt = '';
+
+      // if there is no lod map or an lod map with a proper zoom load the tile
+      // otherwise wait for the lod map to become available
+      if (!this._lodMap || (this._lodMap && this._lodMap[this._getZoomForUrl()])) {
+        tile.src = this.getTileUrl(coords);
+      } else {
+        this.once('lodmap', function () {
+          tile.src = this.getTileUrl(coords);
+        }, this);
+      }
+
+      return tile;
+    },
+
+    onAdd: function (map) {
+      // include 'Powered by Esri' in map attribution
+      setEsriAttribution(map);
+
+      if (!this._lodMap) {
+        this.metadata(function (error, metadata) {
+          if (!error && metadata.spatialReference) {
+            var sr = metadata.spatialReference.latestWkid || metadata.spatialReference.wkid;
+            // display the copyright text from the service using leaflet's attribution control
+            if (!this.options.attribution && map.attributionControl && metadata.copyrightText) {
+              this.options.attribution = metadata.copyrightText;
+              map.attributionControl.addAttribution(this.getAttribution());
+            }
+
+            // if the service tiles were published in web mercator using conventional LODs but missing levels, we can try and remap them
+            if (map.options.crs === leaflet.CRS.EPSG3857 && (sr === 102100 || sr === 3857)) {
+              this._lodMap = {};
+              // create the zoom level data
+              var arcgisLODs = metadata.tileInfo.lods;
+              var correctResolutions = TiledMapLayer.MercatorZoomLevels;
+
+              for (var i = 0; i < arcgisLODs.length; i++) {
+                var arcgisLOD = arcgisLODs[i];
+                for (var ci in correctResolutions) {
+                  var correctRes = correctResolutions[ci];
+
+                  if (this._withinPercentage(arcgisLOD.resolution, correctRes, this.options.zoomOffsetAllowance)) {
+                    this._lodMap[ci] = arcgisLOD.level;
+                    break;
+                  }
+                }
+              }
+
+              this.fire('lodmap');
+            } else if (map.options.crs && map.options.crs.code && (map.options.crs.code.indexOf(sr) > -1)) ; else {
+              // if the service was cached in a custom projection and an appropriate LOD hasn't been defined in the map, guide the developer to our Proj4 sample
+              warn('L.esri.TiledMapLayer is using a non-mercator spatial reference. Support may be available through Proj4Leaflet http://esri.github.io/esri-leaflet/examples/non-mercator-projection.html');
+            }
+          }
+        }, this);
+      }
+
+      leaflet.TileLayer.prototype.onAdd.call(this, map);
+    },
+
+    onRemove: function (map) {
+      removeEsriAttribution(map);
+    },
+
+    metadata: function (callback, context) {
+      this.service.metadata(callback, context);
+      return this;
+    },
+
+    identify: function () {
+      return this.service.identify();
+    },
+
+    find: function () {
+      return this.service.find();
+    },
+
+    query: function () {
+      return this.service.query();
+    },
+
+    authenticate: function (token) {
+      var tokenQs = '?token=' + token;
+      this.tileUrl = (this.options.token) ? this.tileUrl.replace(/\?token=(.+)/g, tokenQs) : this.tileUrl + tokenQs;
+      this.options.token = token;
+      this.service.authenticate(token);
+      return this;
+    },
+
+    _withinPercentage: function (a, b, percentage) {
+      var diff = Math.abs((a / b) - 1);
+      return diff < percentage;
+    }
+  });
+
+  function tiledMapLayer (url, options) {
+    return new TiledMapLayer(url, options);
+  }
+
+  var Overlay = leaflet.ImageOverlay.extend({
+    onAdd: function (map) {
+      this._topLeft = map.getPixelBounds().min;
+      leaflet.ImageOverlay.prototype.onAdd.call(this, map);
+    },
+    _reset: function () {
+      if (this._map.options.crs === leaflet.CRS.EPSG3857) {
+        leaflet.ImageOverlay.prototype._reset.call(this);
+      } else {
+        leaflet.DomUtil.setPosition(this._image, this._topLeft.subtract(this._map.getPixelOrigin()));
+      }
+    }
+  });
+
+  var RasterLayer = leaflet.Layer.extend({
+    options: {
+      opacity: 1,
+      position: 'front',
+      f: 'image',
+      useCors: cors,
+      attribution: null,
+      interactive: false,
+      alt: ''
+    },
+
+    onAdd: function (map) {
+      // include 'Powered by Esri' in map attribution
+      setEsriAttribution(map);
+
+      if (this.options.zIndex) {
+        this.options.position = null;
+      }
+
+      this._update = leaflet.Util.throttle(this._update, this.options.updateInterval, this);
+
+      map.on('moveend', this._update, this);
+
+      // if we had an image loaded and it matches the
+      // current bounds show the image otherwise remove it
+      if (this._currentImage && this._currentImage._bounds.equals(this._map.getBounds())) {
+        map.addLayer(this._currentImage);
+      } else if (this._currentImage) {
+        this._map.removeLayer(this._currentImage);
+        this._currentImage = null;
+      }
+
+      this._update();
+
+      if (this._popup) {
+        this._map.on('click', this._getPopupData, this);
+        this._map.on('dblclick', this._resetPopupState, this);
+      }
+
+      // add copyright text listed in service metadata
+      this.metadata(function (err, metadata) {
+        if (!err && !this.options.attribution && map.attributionControl && metadata.copyrightText) {
+          this.options.attribution = metadata.copyrightText;
+          map.attributionControl.addAttribution(this.getAttribution());
+        }
+      }, this);
+    },
+
+    onRemove: function (map) {
+      removeEsriAttribution(map);
+
+      if (this._currentImage) {
+        this._map.removeLayer(this._currentImage);
+      }
+
+      if (this._popup) {
+        this._map.off('click', this._getPopupData, this);
+        this._map.off('dblclick', this._resetPopupState, this);
+      }
+
+      this._map.off('moveend', this._update, this);
+    },
+
+    bindPopup: function (fn, popupOptions) {
+      this._shouldRenderPopup = false;
+      this._lastClick = false;
+      this._popup = leaflet.popup(popupOptions);
+      this._popupFunction = fn;
+      if (this._map) {
+        this._map.on('click', this._getPopupData, this);
+        this._map.on('dblclick', this._resetPopupState, this);
+      }
+      return this;
+    },
+
+    unbindPopup: function () {
+      if (this._map) {
+        this._map.closePopup(this._popup);
+        this._map.off('click', this._getPopupData, this);
+        this._map.off('dblclick', this._resetPopupState, this);
+      }
+      this._popup = false;
+      return this;
+    },
+
+    bringToFront: function () {
+      this.options.position = 'front';
+      if (this._currentImage) {
+        this._currentImage.bringToFront();
+        this._setAutoZIndex(Math.max);
+      }
+      return this;
+    },
+
+    bringToBack: function () {
+      this.options.position = 'back';
+      if (this._currentImage) {
+        this._currentImage.bringToBack();
+        this._setAutoZIndex(Math.min);
+      }
+      return this;
+    },
+
+    setZIndex: function (value) {
+      this.options.zIndex = value;
+      if (this._currentImage) {
+        this._currentImage.setZIndex(value);
+      }
+      return this;
+    },
+
+    _setAutoZIndex: function (compare) {
+      // go through all other layers of the same pane, set zIndex to max + 1 (front) or min - 1 (back)
+      if (!this._currentImage) {
+        return;
+      }
+      var layers = this._currentImage.getPane().children;
+      var edgeZIndex = -compare(-Infinity, Infinity); // -Infinity for max, Infinity for min
+      for (var i = 0, len = layers.length, zIndex; i < len; i++) {
+        zIndex = layers[i].style.zIndex;
+        if (layers[i] !== this._currentImage._image && zIndex) {
+          edgeZIndex = compare(edgeZIndex, +zIndex);
+        }
+      }
+
+      if (isFinite(edgeZIndex)) {
+        this.options.zIndex = edgeZIndex + compare(-1, 1);
+        this.setZIndex(this.options.zIndex);
+      }
+    },
+
+    getAttribution: function () {
+      return this.options.attribution;
+    },
+
+    getOpacity: function () {
+      return this.options.opacity;
+    },
+
+    setOpacity: function (opacity) {
+      this.options.opacity = opacity;
+      if (this._currentImage) {
+        this._currentImage.setOpacity(opacity);
+      }
+      return this;
+    },
+
+    getTimeRange: function () {
+      return [this.options.from, this.options.to];
+    },
+
+    setTimeRange: function (from, to) {
+      this.options.from = from;
+      this.options.to = to;
+      this._update();
+      return this;
+    },
+
+    metadata: function (callback, context) {
+      this.service.metadata(callback, context);
+      return this;
+    },
+
+    authenticate: function (token) {
+      this.service.authenticate(token);
+      return this;
+    },
+
+    redraw: function () {
+      this._update();
+    },
+
+    _renderImage: function (url, bounds, contentType) {
+      if (this._map) {
+        // if no output directory has been specified for a service, MIME data will be returned
+        if (contentType) {
+          url = 'data:' + contentType + ';base64,' + url;
+        }
+
+        // if server returns an inappropriate response, abort.
+        if (!url) return;
+
+        // create a new image overlay and add it to the map
+        // to start loading the image
+        // opacity is 0 while the image is loading
+        var image = new Overlay(url, bounds, {
+          opacity: 0,
+          crossOrigin: this.options.withCredentials ? 'use-credentials' : this.options.useCors,
+          alt: this.options.alt,
+          pane: this.options.pane || this.getPane(),
+          interactive: this.options.interactive
+        }).addTo(this._map);
+
+        var onOverlayError = function () {
+          this._map.removeLayer(image);
+          this.fire('error');
+          image.off('load', onOverlayLoad, this);
+        };
+
+        var onOverlayLoad = function (e) {
+          image.off('error', onOverlayLoad, this);
+          if (this._map) {
+            var newImage = e.target;
+            var oldImage = this._currentImage;
+
+            // if the bounds of this image matches the bounds that
+            // _renderImage was called with and we have a map with the same bounds
+            // hide the old image if there is one and set the opacity
+            // of the new image otherwise remove the new image
+            if (newImage._bounds.equals(bounds) && newImage._bounds.equals(this._map.getBounds())) {
+              this._currentImage = newImage;
+
+              if (this.options.position === 'front') {
+                this.bringToFront();
+              } else if (this.options.position === 'back') {
+                this.bringToBack();
+              }
+
+              if (this.options.zIndex) {
+                this.setZIndex(this.options.zIndex);
+              }
+
+              if (this._map && this._currentImage._map) {
+                this._currentImage.setOpacity(this.options.opacity);
+              } else {
+                this._currentImage._map.removeLayer(this._currentImage);
+              }
+
+              if (oldImage && this._map) {
+                this._map.removeLayer(oldImage);
+              }
+
+              if (oldImage && oldImage._map) {
+                oldImage._map.removeLayer(oldImage);
+              }
+            } else {
+              this._map.removeLayer(newImage);
+            }
+          }
+
+          this.fire('load', {
+            bounds: bounds
+          });
+        };
+
+        // If loading the image fails
+        image.once('error', onOverlayError, this);
+
+        // once the image loads
+        image.once('load', onOverlayLoad, this);
+      }
+    },
+
+    _update: function () {
+      if (!this._map) {
+        return;
+      }
+
+      var zoom = this._map.getZoom();
+      var bounds = this._map.getBounds();
+
+      if (this._animatingZoom) {
+        return;
+      }
+
+      if (this._map._panTransition && this._map._panTransition._inProgress) {
+        return;
+      }
+
+      if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {
+        if (this._currentImage) {
+          this._currentImage._map.removeLayer(this._currentImage);
+          this._currentImage = null;
+        }
+        return;
+      }
+
+      var params = this._buildExportParams();
+      leaflet.Util.extend(params, this.options.requestParams);
+
+      if (params) {
+        this._requestExport(params, bounds);
+
+        this.fire('loading', {
+          bounds: bounds
+        });
+      } else if (this._currentImage) {
+        this._currentImage._map.removeLayer(this._currentImage);
+        this._currentImage = null;
+      }
+    },
+
+    _renderPopup: function (latlng, error, results, response) {
+      latlng = leaflet.latLng(latlng);
+      if (this._shouldRenderPopup && this._lastClick.equals(latlng)) {
+        // add the popup to the map where the mouse was clicked at
+        var content = this._popupFunction(error, results, response);
+        if (content) {
+          this._popup.setLatLng(latlng).setContent(content).openOn(this._map);
+        }
+      }
+    },
+
+    _resetPopupState: function (e) {
+      this._shouldRenderPopup = false;
+      this._lastClick = e.latlng;
+    },
+
+    _calculateBbox: function () {
+      var pixelBounds = this._map.getPixelBounds();
+
+      var sw = this._map.unproject(pixelBounds.getBottomLeft());
+      var ne = this._map.unproject(pixelBounds.getTopRight());
+
+      var neProjected = this._map.options.crs.project(ne);
+      var swProjected = this._map.options.crs.project(sw);
+
+      // this ensures ne/sw are switched in polar maps where north/top bottom/south is inverted
+      var boundsProjected = leaflet.bounds(neProjected, swProjected);
+
+      return [boundsProjected.getBottomLeft().x, boundsProjected.getBottomLeft().y, boundsProjected.getTopRight().x, boundsProjected.getTopRight().y].join(',');
+    },
+
+    _calculateImageSize: function () {
+      // ensure that we don't ask ArcGIS Server for a taller image than we have actual map displaying within the div
+      var bounds = this._map.getPixelBounds();
+      var size = this._map.getSize();
+
+      var sw = this._map.unproject(bounds.getBottomLeft());
+      var ne = this._map.unproject(bounds.getTopRight());
+
+      var top = this._map.latLngToLayerPoint(ne).y;
+      var bottom = this._map.latLngToLayerPoint(sw).y;
+
+      if (top > 0 || bottom < size.y) {
+        size.y = bottom - top;
+      }
+
+      return size.x + ',' + size.y;
+    }
+  });
+
+  var ImageMapLayer = RasterLayer.extend({
+
+    options: {
+      updateInterval: 150,
+      format: 'jpgpng',
+      transparent: true,
+      f: 'image'
+    },
+
+    query: function () {
+      return this.service.query();
+    },
+
+    identify: function () {
+      return this.service.identify();
+    },
+
+    initialize: function (options) {
+      options = getUrlParams(options);
+      this.service = imageService(options);
+      this.service.addEventParent(this);
+
+      leaflet.Util.setOptions(this, options);
+    },
+
+    setPixelType: function (pixelType) {
+      this.options.pixelType = pixelType;
+      this._update();
+      return this;
+    },
+
+    getPixelType: function () {
+      return this.options.pixelType;
+    },
+
+    setBandIds: function (bandIds) {
+      if (leaflet.Util.isArray(bandIds)) {
+        this.options.bandIds = bandIds.join(',');
+      } else {
+        this.options.bandIds = bandIds.toString();
+      }
+      this._update();
+      return this;
+    },
+
+    getBandIds: function () {
+      return this.options.bandIds;
+    },
+
+    setNoData: function (noData, noDataInterpretation) {
+      if (leaflet.Util.isArray(noData)) {
+        this.options.noData = noData.join(',');
+      } else {
+        this.options.noData = noData.toString();
+      }
+      if (noDataInterpretation) {
+        this.options.noDataInterpretation = noDataInterpretation;
+      }
+      this._update();
+      return this;
+    },
+
+    getNoData: function () {
+      return this.options.noData;
+    },
+
+    getNoDataInterpretation: function () {
+      return this.options.noDataInterpretation;
+    },
+
+    setRenderingRule: function (renderingRule) {
+      this.options.renderingRule = renderingRule;
+      this._update();
+    },
+
+    getRenderingRule: function () {
+      return this.options.renderingRule;
+    },
+
+    setMosaicRule: function (mosaicRule) {
+      this.options.mosaicRule = mosaicRule;
+      this._update();
+    },
+
+    getMosaicRule: function () {
+      return this.options.mosaicRule;
+    },
+
+    _getPopupData: function (e) {
+      var callback = leaflet.Util.bind(function (error, results, response) {
+        if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire
+        setTimeout(leaflet.Util.bind(function () {
+          this._renderPopup(e.latlng, error, results, response);
+        }, this), 300);
+      }, this);
+
+      var identifyRequest = this.identify().at(e.latlng);
+
+      // set mosaic rule for identify task if it is set for layer
+      if (this.options.mosaicRule) {
+        identifyRequest.setMosaicRule(this.options.mosaicRule);
+        // @TODO: force return catalog items too?
+      }
+
+      // @TODO: set rendering rule? Not sure,
+      // sometimes you want raw pixel values
+      // if (this.options.renderingRule) {
+      //   identifyRequest.setRenderingRule(this.options.renderingRule);
+      // }
+
+      identifyRequest.run(callback);
+
+      // set the flags to show the popup
+      this._shouldRenderPopup = true;
+      this._lastClick = e.latlng;
+    },
+
+    _buildExportParams: function () {
+      var sr = parseInt(this._map.options.crs.code.split(':')[1], 10);
+
+      var params = {
+        bbox: this._calculateBbox(),
+        size: this._calculateImageSize(),
+        format: this.options.format,
+        transparent: this.options.transparent,
+        bboxSR: sr,
+        imageSR: sr
+      };
+
+      if (this.options.from && this.options.to) {
+        params.time = this.options.from.valueOf() + ',' + this.options.to.valueOf();
+      }
+
+      if (this.options.pixelType) {
+        params.pixelType = this.options.pixelType;
+      }
+
+      if (this.options.interpolation) {
+        params.interpolation = this.options.interpolation;
+      }
+
+      if (this.options.compressionQuality) {
+        params.compressionQuality = this.options.compressionQuality;
+      }
+
+      if (this.options.bandIds) {
+        params.bandIds = this.options.bandIds;
+      }
+
+      // 0 is falsy *and* a valid input parameter
+      if (this.options.noData === 0 || this.options.noData) {
+        params.noData = this.options.noData;
+      }
+
+      if (this.options.noDataInterpretation) {
+        params.noDataInterpretation = this.options.noDataInterpretation;
+      }
+
+      if (this.service.options.token) {
+        params.token = this.service.options.token;
+      }
+
+      if (this.options.renderingRule) {
+        params.renderingRule = JSON.stringify(this.options.renderingRule);
+      }
+
+      if (this.options.mosaicRule) {
+        params.mosaicRule = JSON.stringify(this.options.mosaicRule);
+      }
+
+      return params;
+    },
+
+    _requestExport: function (params, bounds) {
+      if (this.options.f === 'json') {
+        this.service.request('exportImage', params, function (error, response) {
+          if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire
+          if (this.options.token) {
+            response.href += ('?token=' + this.options.token);
+          }
+          if (this.options.proxy) {
+            response.href = this.options.proxy + '?' + response.href;
+          }
+          this._renderImage(response.href, bounds);
+        }, this);
+      } else {
+        params.f = 'image';
+        var fullUrl = this.options.url + 'exportImage' + leaflet.Util.getParamString(params);
+        if (this.options.proxy) {
+          fullUrl = this.options.proxy + '?' + fullUrl;
+        }
+        this._renderImage(fullUrl, bounds);
+      }
+    }
+  });
+
+  function imageMapLayer (url, options) {
+    return new ImageMapLayer(url, options);
+  }
+
+  var DynamicMapLayer = RasterLayer.extend({
+
+    options: {
+      updateInterval: 150,
+      layers: false,
+      layerDefs: false,
+      timeOptions: false,
+      format: 'png32',
+      transparent: true,
+      f: 'json'
+    },
+
+    initialize: function (options) {
+      options = getUrlParams(options);
+      this.service = mapService(options);
+      this.service.addEventParent(this);
+
+      leaflet.Util.setOptions(this, options);
+    },
+
+    getDynamicLayers: function () {
+      return this.options.dynamicLayers;
+    },
+
+    setDynamicLayers: function (dynamicLayers) {
+      this.options.dynamicLayers = dynamicLayers;
+      this._update();
+      return this;
+    },
+
+    getLayers: function () {
+      return this.options.layers;
+    },
+
+    setLayers: function (layers) {
+      this.options.layers = layers;
+      this._update();
+      return this;
+    },
+
+    getLayerDefs: function () {
+      return this.options.layerDefs;
+    },
+
+    setLayerDefs: function (layerDefs) {
+      this.options.layerDefs = layerDefs;
+      this._update();
+      return this;
+    },
+
+    getTimeOptions: function () {
+      return this.options.timeOptions;
+    },
+
+    setTimeOptions: function (timeOptions) {
+      this.options.timeOptions = timeOptions;
+      this._update();
+      return this;
+    },
+
+    query: function () {
+      return this.service.query();
+    },
+
+    identify: function () {
+      return this.service.identify();
+    },
+
+    find: function () {
+      return this.service.find();
+    },
+
+    _getPopupData: function (e) {
+      var callback = leaflet.Util.bind(function (error, featureCollection, response) {
+        if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire
+        setTimeout(leaflet.Util.bind(function () {
+          this._renderPopup(e.latlng, error, featureCollection, response);
+        }, this), 300);
+      }, this);
+
+      var identifyRequest;
+      if (this.options.popup) {
+        identifyRequest = this.options.popup.on(this._map).at(e.latlng);
+      } else {
+        identifyRequest = this.identify().on(this._map).at(e.latlng);
+      }
+
+      // remove extraneous vertices from response features if it has not already been done
+      identifyRequest.params.maxAllowableOffset ? true : identifyRequest.simplify(this._map, 0.5);
+
+      if (!(this.options.popup && this.options.popup.params && this.options.popup.params.layers)) {
+        if (this.options.layers) {
+          identifyRequest.layers('visible:' + this.options.layers.join(','));
+        } else {
+          identifyRequest.layers('visible');
+        }
+      }
+
+      // if present, pass layer ids and sql filters through to the identify task
+      if (this.options.layerDefs && typeof this.options.layerDefs !== 'string' && !identifyRequest.params.layerDefs) {
+        for (var id in this.options.layerDefs) {
+          if (this.options.layerDefs.hasOwnProperty(id)) {
+            identifyRequest.layerDef(id, this.options.layerDefs[id]);
+          }
+        }
+      }
+
+      identifyRequest.run(callback);
+
+      // set the flags to show the popup
+      this._shouldRenderPopup = true;
+      this._lastClick = e.latlng;
+    },
+
+    _buildExportParams: function () {
+      var sr = parseInt(this._map.options.crs.code.split(':')[1], 10);
+
+      var params = {
+        bbox: this._calculateBbox(),
+        size: this._calculateImageSize(),
+        dpi: 96,
+        format: this.options.format,
+        transparent: this.options.transparent,
+        bboxSR: sr,
+        imageSR: sr
+      };
+
+      if (this.options.dynamicLayers) {
+        params.dynamicLayers = this.options.dynamicLayers;
+      }
+
+      if (this.options.layers) {
+        if (this.options.layers.length === 0) {
+          return;
+        } else {
+          params.layers = 'show:' + this.options.layers.join(',');
+        }
+      }
+
+      if (this.options.layerDefs) {
+        params.layerDefs = typeof this.options.layerDefs === 'string' ? this.options.layerDefs : JSON.stringify(this.options.layerDefs);
+      }
+
+      if (this.options.timeOptions) {
+        params.timeOptions = JSON.stringify(this.options.timeOptions);
+      }
+
+      if (this.options.from && this.options.to) {
+        params.time = this.options.from.valueOf() + ',' + this.options.to.valueOf();
+      }
+
+      if (this.service.options.token) {
+        params.token = this.service.options.token;
+      }
+
+      if (this.options.proxy) {
+        params.proxy = this.options.proxy;
+      }
+
+      // use a timestamp to bust server cache
+      if (this.options.disableCache) {
+        params._ts = Date.now();
+      }
+
+      return params;
+    },
+
+    _requestExport: function (params, bounds) {
+      if (this.options.f === 'json') {
+        this.service.request('export', params, function (error, response) {
+          if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire
+
+          if (this.options.token && response.href) {
+            response.href += ('?token=' + this.options.token);
+          }
+          if (this.options.proxy && response.href) {
+            response.href = this.options.proxy + '?' + response.href;
+          }
+          if (response.href) {
+            this._renderImage(response.href, bounds);
+          } else {
+            this._renderImage(response.imageData, bounds, response.contentType);
+          }
+        }, this);
+      } else {
+        params.f = 'image';
+        var fullUrl = this.options.url + 'export' + leaflet.Util.getParamString(params);
+        if (this.options.proxy) {
+          fullUrl = this.options.proxy + '?' + fullUrl;
+        }
+        this._renderImage(fullUrl, bounds);
+      }
+    }
+  });
+
+  function dynamicMapLayer (url, options) {
+    return new DynamicMapLayer(url, options);
+  }
+
+  var FeatureGrid = leaflet.Layer.extend({
+    // @section
+    // @aka GridLayer options
+    options: {
+      // @option cellSize: Number|Point = 256
+      // Width and height of cells in the grid. Use a number if width and height are equal, or `L.point(width, height)` otherwise.
+      cellSize: 512,
+
+      // @option updateWhenIdle: Boolean = (depends)
+      // Load new cells only when panning ends.
+      // `true` by default on mobile browsers, in order to avoid too many requests and keep smooth navigation.
+      // `false` otherwise in order to display new cells _during_ panning, since it is easy to pan outside the
+      // [`keepBuffer`](#gridlayer-keepbuffer) option in desktop browsers.
+      updateWhenIdle: leaflet.Browser.mobile,
+
+      // @option updateInterval: Number = 150
+      // Cells will not update more than once every `updateInterval` milliseconds when panning.
+      updateInterval: 150,
+
+      // @option noWrap: Boolean = false
+      // Whether the layer is wrapped around the antimeridian. If `true`, the
+      // GridLayer will only be displayed once at low zoom levels. Has no
+      // effect when the [map CRS](#map-crs) doesn't wrap around. Can be used
+      // in combination with [`bounds`](#gridlayer-bounds) to prevent requesting
+      // cells outside the CRS limits.
+      noWrap: false,
+
+      // @option keepBuffer: Number = 1.5
+      // When panning the map, keep this many rows and columns of cells before unloading them.
+      keepBuffer: 1.5
+    },
+
+    initialize: function (options) {
+      leaflet.Util.setOptions(this, options);
+    },
+
+    onAdd: function (map) {
+      this._cells = {};
+      this._activeCells = {};
+      this._resetView();
+      this._update();
+    },
+
+    onRemove: function (map) {
+      this._removeAllCells();
+      this._cellZoom = undefined;
+    },
+
+    // @method isLoading: Boolean
+    // Returns `true` if any cell in the grid layer has not finished loading.
+    isLoading: function () {
+      return this._loading;
+    },
+
+    // @method redraw: this
+    // Causes the layer to clear all the cells and request them again.
+    redraw: function () {
+      if (this._map) {
+        this._removeAllCells();
+        this._update();
+      }
+      return this;
+    },
+
+    getEvents: function () {
+      var events = {
+        viewprereset: this._invalidateAll,
+        viewreset: this._resetView,
+        zoom: this._resetView,
+        moveend: this._onMoveEnd
+      };
+
+      if (!this.options.updateWhenIdle) {
+        // update cells on move, but not more often than once per given interval
+        if (!this._onMove) {
+          this._onMove = leaflet.Util.throttle(
+            this._onMoveEnd,
+            this.options.updateInterval,
+            this
+          );
+        }
+
+        events.move = this._onMove;
+      }
+
+      return events;
+    },
+
+    // @section Extension methods
+    // Layers extending `GridLayer` shall reimplement the following method.
+    // @method createCell(coords: Object, done?: Function): HTMLElement
+    // Called only internally, must be overridden by classes extending `GridLayer`.
+    // Returns the `HTMLElement` corresponding to the given `coords`. If the `done` callback
+    // is specified, it must be called when the cell has finished loading and drawing.
+    createCell: function () {
+      return document.createElement('div');
+    },
+
+    removeCell: function () {
+      return;
+    },
+
+    reuseCell: function () {
+      return;
+    },
+
+    cellLeave: function () {
+      return;
+    },
+
+    cellEnter: function () {
+      return;
+    },
+    // @section
+    // @method getCellSize: Point
+    // Normalizes the [cellSize option](#gridlayer-cellsize) into a point. Used by the `createCell()` method.
+    getCellSize: function () {
+      var s = this.options.cellSize;
+      return s instanceof leaflet.Point ? s : new leaflet.Point(s, s);
+    },
+
+    _pruneCells: function () {
+      if (!this._map) {
+        return;
+      }
+
+      var key, cell;
+
+      for (key in this._cells) {
+        cell = this._cells[key];
+        cell.retain = cell.current;
+      }
+
+      for (key in this._cells) {
+        cell = this._cells[key];
+        if (cell.current && !cell.active) {
+          var coords = cell.coords;
+          if (!this._retainParent(coords.x, coords.y, coords.z, coords.z - 5)) {
+            this._retainChildren(coords.x, coords.y, coords.z, coords.z + 2);
+          }
+        }
+      }
+
+      for (key in this._cells) {
+        if (!this._cells[key].retain) {
+          this._removeCell(key);
+        }
+      }
+    },
+
+    _removeAllCells: function () {
+      for (var key in this._cells) {
+        this._removeCell(key);
+      }
+    },
+
+    _invalidateAll: function () {
+      this._removeAllCells();
+
+      this._cellZoom = undefined;
+    },
+
+    _retainParent: function (x, y, z, minZoom) {
+      var x2 = Math.floor(x / 2);
+      var y2 = Math.floor(y / 2);
+      var z2 = z - 1;
+      var coords2 = new leaflet.Point(+x2, +y2);
+      coords2.z = +z2;
+
+      var key = this._cellCoordsToKey(coords2);
+      var cell = this._cells[key];
+
+      if (cell && cell.active) {
+        cell.retain = true;
+        return true;
+      } else if (cell && cell.loaded) {
+        cell.retain = true;
+      }
+
+      if (z2 > minZoom) {
+        return this._retainParent(x2, y2, z2, minZoom);
+      }
+
+      return false;
+    },
+
+    _retainChildren: function (x, y, z, maxZoom) {
+      for (var i = 2 * x; i < 2 * x + 2; i++) {
+        for (var j = 2 * y; j < 2 * y + 2; j++) {
+          var coords = new leaflet.Point(i, j);
+          coords.z = z + 1;
+
+          var key = this._cellCoordsToKey(coords);
+          var cell = this._cells[key];
+
+          if (cell && cell.active) {
+            cell.retain = true;
+            continue;
+          } else if (cell && cell.loaded) {
+            cell.retain = true;
+          }
+
+          if (z + 1 < maxZoom) {
+            this._retainChildren(i, j, z + 1, maxZoom);
+          }
+        }
+      }
+    },
+
+    _resetView: function (e) {
+      var animating = e && (e.pinch || e.flyTo);
+
+      if (animating) {
+        return;
+      }
+
+      this._setView(
+        this._map.getCenter(),
+        this._map.getZoom(),
+        animating,
+        animating
+      );
+    },
+
+    _setView: function (center, zoom, noPrune, noUpdate) {
+      var cellZoom = Math.round(zoom);
+
+      if (!noUpdate) {
+        this._cellZoom = cellZoom;
+
+        if (this._abortLoading) {
+          this._abortLoading();
+        }
+
+        this._resetGrid();
+
+        if (cellZoom !== undefined) {
+          this._update(center);
+        }
+
+        if (!noPrune) {
+          this._pruneCells();
+        }
+
+        // Flag to prevent _updateOpacity from pruning cells during
+        // a zoom anim or a pinch gesture
+        this._noPrune = !!noPrune;
+      }
+    },
+
+    _resetGrid: function () {
+      var map = this._map;
+      var crs = map.options.crs;
+      var cellSize = (this._cellSize = this.getCellSize());
+      var cellZoom = this._cellZoom;
+
+      var bounds = this._map.getPixelWorldBounds(this._cellZoom);
+      if (bounds) {
+        this._globalCellRange = this._pxBoundsToCellRange(bounds);
+      }
+
+      this._wrapX = crs.wrapLng &&
+        !this.options.noWrap && [
+          Math.floor(map.project([0, crs.wrapLng[0]], cellZoom).x / cellSize.x),
+          Math.ceil(map.project([0, crs.wrapLng[1]], cellZoom).x / cellSize.y)
+        ];
+      this._wrapY = crs.wrapLat &&
+        !this.options.noWrap && [
+          Math.floor(map.project([crs.wrapLat[0], 0], cellZoom).y / cellSize.x),
+          Math.ceil(map.project([crs.wrapLat[1], 0], cellZoom).y / cellSize.y)
+        ];
+    },
+
+    _onMoveEnd: function (e) {
+      var animating = e && (e.pinch || e.flyTo);
+
+      if (animating || !this._map || this._map._animatingZoom) {
+        return;
+      }
+
+      this._update();
+    },
+
+    _getCelldPixelBounds: function (center) {
+      var map = this._map;
+      var mapZoom = map._animatingZoom
+        ? Math.max(map._animateToZoom, map.getZoom())
+        : map.getZoom();
+      var scale = map.getZoomScale(mapZoom, this._cellZoom);
+      var pixelCenter = map.project(center, this._cellZoom).floor();
+      var halfSize = map.getSize().divideBy(scale * 2);
+
+      return new leaflet.Bounds(
+        pixelCenter.subtract(halfSize),
+        pixelCenter.add(halfSize)
+      );
+    },
+
+    // Private method to load cells in the grid's active zoom level according to map bounds
+    _update: function (center) {
+      var map = this._map;
+      if (!map) {
+        return;
+      }
+      var zoom = Math.round(map.getZoom());
+
+      if (center === undefined) {
+        center = map.getCenter();
+      }
+
+      var pixelBounds = this._getCelldPixelBounds(center);
+      var cellRange = this._pxBoundsToCellRange(pixelBounds);
+      var cellCenter = cellRange.getCenter();
+      var queue = [];
+      var margin = this.options.keepBuffer;
+      var noPruneRange = new leaflet.Bounds(
+        cellRange.getBottomLeft().subtract([margin, -margin]),
+        cellRange.getTopRight().add([margin, -margin])
+      );
+
+      // Sanity check: panic if the cell range contains Infinity somewhere.
+      if (
+        !(
+          isFinite(cellRange.min.x) &&
+          isFinite(cellRange.min.y) &&
+          isFinite(cellRange.max.x) &&
+          isFinite(cellRange.max.y)
+        )
+      ) {
+        throw new Error('Attempted to load an infinite number of cells');
+      }
+
+      for (var key in this._cells) {
+        var c = this._cells[key].coords;
+        if (
+          c.z !== this._cellZoom ||
+          !noPruneRange.contains(new leaflet.Point(c.x, c.y))
+        ) {
+          this._cells[key].current = false;
+        }
+      }
+
+      // _update just loads more cells. If the cell zoom level differs too much
+      // from the map's, let _setView reset levels and prune old cells.
+      if (Math.abs(zoom - this._cellZoom) > 1) {
+        this._setView(center, zoom);
+        return;
+      }
+
+      // create a queue of coordinates to load cells from
+      for (var j = cellRange.min.y; j <= cellRange.max.y; j++) {
+        for (var i = cellRange.min.x; i <= cellRange.max.x; i++) {
+          var coords = new leaflet.Point(i, j);
+          coords.z = this._cellZoom;
+
+          if (!this._isValidCell(coords)) {
+            continue;
+          }
+
+          var cell = this._cells[this._cellCoordsToKey(coords)];
+          if (cell) {
+            cell.current = true;
+          } else {
+            queue.push(coords);
+          }
+        }
+      }
+
+      // sort cell queue to load cells in order of their distance to center
+      queue.sort(function (a, b) {
+        return a.distanceTo(cellCenter) - b.distanceTo(cellCenter);
+      });
+
+      if (queue.length !== 0) {
+        // if it's the first batch of cells to load
+        if (!this._loading) {
+          this._loading = true;
+        }
+
+        for (i = 0; i < queue.length; i++) {
+          var _key = this._cellCoordsToKey(queue[i]);
+          var _coords = this._keyToCellCoords(_key);
+          if (this._activeCells[_coords]) {
+            this._reuseCell(queue[i]);
+          } else {
+            this._createCell(queue[i]);
+          }
+        }
+      }
+    },
+
+    _isValidCell: function (coords) {
+      var crs = this._map.options.crs;
+
+      if (!crs.infinite) {
+        // don't load cell if it's out of bounds and not wrapped
+        var bounds = this._globalCellRange;
+        if (
+          (!crs.wrapLng &&
+            (coords.x < bounds.min.x || coords.x > bounds.max.x)) ||
+          (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))
+        ) {
+          return false;
+        }
+      }
+
+      if (!this.options.bounds) {
+        return true;
+      }
+
+      // don't load cell if it doesn't intersect the bounds in options
+      var cellBounds = this._cellCoordsToBounds(coords);
+      return leaflet.toLatLngBounds(this.options.bounds).overlaps(cellBounds);
+    },
+
+    _keyToBounds: function (key) {
+      return this._cellCoordsToBounds(this._keyToCellCoords(key));
+    },
+
+    _cellCoordsToNwSe: function (coords) {
+      var map = this._map;
+      var cellSize = this.getCellSize();
+      var nwPoint = coords.scaleBy(cellSize);
+      var sePoint = nwPoint.add(cellSize);
+      var nw = map.unproject(nwPoint, coords.z);
+      var se = map.unproject(sePoint, coords.z);
+
+      return [nw, se];
+    },
+
+    // converts cell coordinates to its geographical bounds
+    _cellCoordsToBounds: function (coords) {
+      var bp = this._cellCoordsToNwSe(coords);
+      var bounds = new leaflet.LatLngBounds(bp[0], bp[1]);
+
+      if (!this.options.noWrap) {
+        bounds = this._map.wrapLatLngBounds(bounds);
+      }
+      return bounds;
+    },
+    // converts cell coordinates to key for the cell cache
+    _cellCoordsToKey: function (coords) {
+      return coords.x + ':' + coords.y + ':' + coords.z;
+    },
+
+    // converts cell cache key to coordinates
+    _keyToCellCoords: function (key) {
+      var k = key.split(':');
+      var coords = new leaflet.Point(+k[0], +k[1]);
+
+      coords.z = +k[2];
+      return coords;
+    },
+
+    _removeCell: function (key) {
+      var cell = this._cells[key];
+
+      if (!cell) {
+        return;
+      }
+
+      var coords = this._keyToCellCoords(key);
+      var wrappedCoords = this._wrapCoords(coords);
+      var cellBounds = this._cellCoordsToBounds(this._wrapCoords(coords));
+
+      cell.current = false;
+
+      delete this._cells[key];
+      this._activeCells[key] = cell;
+
+      this.cellLeave(cellBounds, wrappedCoords, key);
+
+      this.fire('cellleave', {
+        key: key,
+        coords: wrappedCoords,
+        bounds: cellBounds
+      });
+    },
+
+    _reuseCell: function (coords) {
+      var key = this._cellCoordsToKey(coords);
+
+      // save cell in cache
+      this._cells[key] = this._activeCells[key];
+      this._cells[key].current = true;
+
+      var wrappedCoords = this._wrapCoords(coords);
+      var cellBounds = this._cellCoordsToBounds(this._wrapCoords(coords));
+
+      this.cellEnter(cellBounds, wrappedCoords, key);
+
+      this.fire('cellenter', {
+        key: key,
+        coords: wrappedCoords,
+        bounds: cellBounds
+      });
+    },
+
+    _createCell: function (coords) {
+      var key = this._cellCoordsToKey(coords);
+
+      var wrappedCoords = this._wrapCoords(coords);
+      var cellBounds = this._cellCoordsToBounds(this._wrapCoords(coords));
+
+      this.createCell(cellBounds, wrappedCoords, key);
+
+      this.fire('cellcreate', {
+        key: key,
+        coords: wrappedCoords,
+        bounds: cellBounds
+      });
+
+      // save cell in cache
+      this._cells[key] = {
+        coords: coords,
+        current: true
+      };
+
+      leaflet.Util.requestAnimFrame(this._pruneCells, this);
+    },
+
+    _cellReady: function (coords, err, cell) {
+      var key = this._cellCoordsToKey(coords);
+
+      cell = this._cells[key];
+
+      if (!cell) {
+        return;
+      }
+
+      cell.loaded = +new Date();
+
+      cell.active = true;
+    },
+
+    _getCellPos: function (coords) {
+      return coords.scaleBy(this.getCellSize());
+    },
+
+    _wrapCoords: function (coords) {
+      var newCoords = new leaflet.Point(
+        this._wrapX ? leaflet.Util.wrapNum(coords.x, this._wrapX) : coords.x,
+        this._wrapY ? leaflet.Util.wrapNum(coords.y, this._wrapY) : coords.y
+      );
+      newCoords.z = coords.z;
+      return newCoords;
+    },
+
+    _pxBoundsToCellRange: function (bounds) {
+      var cellSize = this.getCellSize();
+      return new leaflet.Bounds(
+        bounds.min.unscaleBy(cellSize).floor(),
+        bounds.max.unscaleBy(cellSize).ceil().subtract([1, 1])
+      );
+    }
+  });
+
+  function BinarySearchIndex (values) {
+    this.values = [].concat(values || []);
+  }
+
+  BinarySearchIndex.prototype.query = function (value) {
+    var index = this.getIndex(value);
+    return this.values[index];
+  };
+
+  BinarySearchIndex.prototype.getIndex = function getIndex (value) {
+    if (this.dirty) {
+      this.sort();
+    }
+
+    var minIndex = 0;
+    var maxIndex = this.values.length - 1;
+    var currentIndex;
+    var currentElement;
+
+    while (minIndex <= maxIndex) {
+      currentIndex = (minIndex + maxIndex) / 2 | 0;
+      currentElement = this.values[Math.round(currentIndex)];
+      if (+currentElement.value < +value) {
+        minIndex = currentIndex + 1;
+      } else if (+currentElement.value > +value) {
+        maxIndex = currentIndex - 1;
+      } else {
+        return currentIndex;
+      }
+    }
+
+    return Math.abs(~maxIndex);
+  };
+
+  BinarySearchIndex.prototype.between = function between (start, end) {
+    var startIndex = this.getIndex(start);
+    var endIndex = this.getIndex(end);
+
+    if (startIndex === 0 && endIndex === 0) {
+      return [];
+    }
+
+    while (this.values[startIndex - 1] && this.values[startIndex - 1].value === start) {
+      startIndex--;
+    }
+
+    while (this.values[endIndex + 1] && this.values[endIndex + 1].value === end) {
+      endIndex++;
+    }
+
+    if (this.values[endIndex] && this.values[endIndex].value === end && this.values[endIndex + 1]) {
+      endIndex++;
+    }
+
+    return this.values.slice(startIndex, endIndex);
+  };
+
+  BinarySearchIndex.prototype.insert = function insert (item) {
+    this.values.splice(this.getIndex(item.value), 0, item);
+    return this;
+  };
+
+  BinarySearchIndex.prototype.bulkAdd = function bulkAdd (items, sort) {
+    this.values = this.values.concat([].concat(items || []));
+
+    if (sort) {
+      this.sort();
+    } else {
+      this.dirty = true;
+    }
+
+    return this;
+  };
+
+  BinarySearchIndex.prototype.sort = function sort () {
+    this.values.sort(function (a, b) {
+      return +b.value - +a.value;
+    }).reverse();
+    this.dirty = false;
+    return this;
+  };
+
+  var FeatureManager = FeatureGrid.extend({
+    /**
+     * Options
+     */
+
+    options: {
+      attribution: null,
+      where: '1=1',
+      fields: ['*'],
+      from: false,
+      to: false,
+      timeField: false,
+      timeFilterMode: 'server',
+      simplifyFactor: 0,
+      precision: 6,
+      fetchAllFeatures: false
+    },
+
+    /**
+     * Constructor
+     */
+
+    initialize: function (options) {
+      FeatureGrid.prototype.initialize.call(this, options);
+
+      options = getUrlParams(options);
+      options = leaflet.Util.setOptions(this, options);
+
+      this.service = featureLayerService(options);
+      this.service.addEventParent(this);
+
+      // use case insensitive regex to look for common fieldnames used for indexing
+      if (this.options.fields[0] !== '*') {
+        var oidCheck = false;
+        for (var i = 0; i < this.options.fields.length; i++) {
+          if (this.options.fields[i].match(/^(OBJECTID|FID|OID|ID)$/i)) {
+            oidCheck = true;
+          }
+        }
+        if (oidCheck === false) {
+          warn(
+            'no known esriFieldTypeOID field detected in fields Array.  Please add an attribute field containing unique IDs to ensure the layer can be drawn correctly.'
+          );
+        }
+      }
+
+      if (this.options.timeField.start && this.options.timeField.end) {
+        this._startTimeIndex = new BinarySearchIndex();
+        this._endTimeIndex = new BinarySearchIndex();
+      } else if (this.options.timeField) {
+        this._timeIndex = new BinarySearchIndex();
+      }
+
+      this._cache = {};
+      this._currentSnapshot = []; // cache of what layers should be active
+      this._activeRequests = 0;
+    },
+
+    /**
+     * Layer Interface
+     */
+
+    onAdd: function (map) {
+      // include 'Powered by Esri' in map attribution
+      setEsriAttribution(map);
+
+      this.service.metadata(function (err, metadata) {
+        if (!err) {
+          var supportedFormats = metadata.supportedQueryFormats;
+
+          // Check if someone has requested that we don't use geoJSON, even if it's available
+          var forceJsonFormat = false;
+          if (this.service.options.isModern === false || this.options.fetchAllFeatures) {
+            forceJsonFormat = true;
+          }
+
+          // Unless we've been told otherwise, check to see whether service can emit GeoJSON natively
+          if (
+            !forceJsonFormat &&
+            supportedFormats &&
+            supportedFormats.indexOf('geoJSON') !== -1
+          ) {
+            this.service.options.isModern = true;
+          }
+
+          if (metadata.objectIdField) {
+            this.service.options.idAttribute = metadata.objectIdField;
+          }
+
+          // add copyright text listed in service metadata
+          if (
+            !this.options.attribution &&
+            map.attributionControl &&
+            metadata.copyrightText
+          ) {
+            this.options.attribution = metadata.copyrightText;
+            map.attributionControl.addAttribution(this.getAttribution());
+          }
+        }
+      }, this);
+
+      map.on('zoomend', this._handleZoomChange, this);
+
+      return FeatureGrid.prototype.onAdd.call(this, map);
+    },
+
+    onRemove: function (map) {
+      removeEsriAttribution(map);
+      map.off('zoomend', this._handleZoomChange, this);
+
+      return FeatureGrid.prototype.onRemove.call(this, map);
+    },
+
+    getAttribution: function () {
+      return this.options.attribution;
+    },
+
+    /**
+     * Feature Management
+     */
+
+    createCell: function (bounds, coords) {
+      // dont fetch features outside the scale range defined for the layer
+      if (this._visibleZoom()) {
+        this._requestFeatures(bounds, coords);
+      }
+    },
+
+    _requestFeatures: function (bounds, coords, callback, offset) {
+      this._activeRequests++;
+
+      // default param
+      offset = offset || 0;
+
+      var originalWhere = this.options.where;
+
+      // our first active request fires loading
+      if (this._activeRequests === 1) {
+        this.fire(
+          'loading',
+          {
+            bounds: bounds
+          },
+          true
+        );
+      }
+
+      return this._buildQuery(bounds, offset).run(function (
+        error,
+        featureCollection,
+        response
+      ) {
+        if (response && response.exceededTransferLimit) {
+          this.fire('drawlimitexceeded');
+        }
+
+        // the where changed while this request was being run so don't it.
+        if (this.options.where !== originalWhere) {
+          return;
+        }
+
+        // no error, features
+        if (!error && featureCollection && featureCollection.features.length) {
+          // schedule adding features until the next animation frame
+          leaflet.Util.requestAnimFrame(
+            leaflet.Util.bind(function () {
+              this._addFeatures(featureCollection.features, coords);
+              this._postProcessFeatures(bounds);
+            }, this)
+          );
+        }
+
+        // no error, no features
+        if (!error && featureCollection && !featureCollection.features.length) {
+          this._postProcessFeatures(bounds);
+        }
+
+        if (error) {
+          this._postProcessFeatures(bounds);
+        }
+
+        if (callback) {
+          callback.call(this, error, featureCollection);
+        }
+        if (response && (response.exceededTransferLimit || (response.properties && response.properties.exceededTransferLimit)) && this.options.fetchAllFeatures) {
+          this._requestFeatures(bounds, coords, callback, offset + featureCollection.features.length);
+        }
+      },
+        this);
+    },
+
+    _postProcessFeatures: function (bounds) {
+      // deincrement the request counter now that we have processed features
+      this._activeRequests--;
+
+      // if there are no more active requests fire a load event for this view
+      if (this._activeRequests <= 0) {
+        this.fire('load', {
+          bounds: bounds
+        });
+      }
+    },
+
+    _cacheKey: function (coords) {
+      return coords.z + ':' + coords.x + ':' + coords.y;
+    },
+
+    _addFeatures: function (features, coords) {
+      // coords is optional - will be false if coming from addFeatures() function
+      if (coords) {
+        var key = this._cacheKey(coords);
+        this._cache[key] = this._cache[key] || [];
+      }
+
+      for (var i = features.length - 1; i >= 0; i--) {
+        var id = features[i].id;
+
+        if (this._currentSnapshot.indexOf(id) === -1) {
+          this._currentSnapshot.push(id);
+        }
+        if (typeof key !== 'undefined' && this._cache[key].indexOf(id) === -1) {
+          this._cache[key].push(id);
+        }
+      }
+
+      if (this.options.timeField) {
+        this._buildTimeIndexes(features);
+      }
+
+      this.createLayers(features);
+    },
+
+    _buildQuery: function (bounds, offset) {
+      var query = this.service
+        .query()
+        .intersects(bounds)
+        .where(this.options.where)
+        .fields(this.options.fields)
+        .precision(this.options.precision);
+
+      if (this.options.fetchAllFeatures && !isNaN(parseInt(offset))) {
+        query = query.offset(offset);
+      }
+
+      query.params['resultType'] = 'tile';
+
+      if (this.options.requestParams) {
+        leaflet.Util.extend(query.params, this.options.requestParams);
+      }
+
+      if (this.options.simplifyFactor) {
+        query.simplify(this._map, this.options.simplifyFactor);
+      }
+
+      if (
+        this.options.timeFilterMode === 'server' &&
+        this.options.from &&
+        this.options.to
+      ) {
+        query.between(this.options.from, this.options.to);
+      }
+
+      return query;
+    },
+
+    /**
+     * Where Methods
+     */
+
+    setWhere: function (where, callback, context) {
+      this.options.where = where && where.length ? where : '1=1';
+
+      var oldSnapshot = [];
+      var newSnapshot = [];
+      var pendingRequests = 0;
+      var requestError = null;
+      var requestCallback = leaflet.Util.bind(function (error, featureCollection) {
+        if (error) {
+          requestError = error;
+        }
+
+        if (featureCollection) {
+          for (var i = featureCollection.features.length - 1; i >= 0; i--) {
+            newSnapshot.push(featureCollection.features[i].id);
+          }
+        }
+
+        pendingRequests--;
+
+        if (
+          pendingRequests <= 0 &&
+          this._visibleZoom() &&
+          where === this.options.where // the where is still the same so use this one
+        ) {
+          this._currentSnapshot = newSnapshot;
+          // schedule adding features for the next animation frame
+          leaflet.Util.requestAnimFrame(
+            leaflet.Util.bind(function () {
+              this.removeLayers(oldSnapshot);
+              this.addLayers(newSnapshot);
+              if (callback) {
+                callback.call(context, requestError);
+              }
+            }, this)
+          );
+        }
+      }, this);
+
+      for (var i = this._currentSnapshot.length - 1; i >= 0; i--) {
+        oldSnapshot.push(this._currentSnapshot[i]);
+      }
+
+      this._cache = {};
+
+      for (var key in this._cells) {
+        pendingRequests++;
+        var coords = this._keyToCellCoords(key);
+        var bounds = this._cellCoordsToBounds(coords);
+        this._requestFeatures(bounds, coords, requestCallback);
+      }
+
+      return this;
+    },
+
+    getWhere: function () {
+      return this.options.where;
+    },
+
+    /**
+     * Time Range Methods
+     */
+
+    getTimeRange: function () {
+      return [this.options.from, this.options.to];
+    },
+
+    setTimeRange: function (from, to, callback, context) {
+      var oldFrom = this.options.from;
+      var oldTo = this.options.to;
+      var pendingRequests = 0;
+      var requestError = null;
+      var requestCallback = leaflet.Util.bind(function (error) {
+        if (error) {
+          requestError = error;
+        }
+        this._filterExistingFeatures(oldFrom, oldTo, from, to);
+
+        pendingRequests--;
+
+        if (callback && pendingRequests <= 0) {
+          callback.call(context, requestError);
+        }
+      }, this);
+
+      this.options.from = from;
+      this.options.to = to;
+
+      this._filterExistingFeatures(oldFrom, oldTo, from, to);
+
+      if (this.options.timeFilterMode === 'server') {
+        for (var key in this._cells) {
+          pendingRequests++;
+          var coords = this._keyToCellCoords(key);
+          var bounds = this._cellCoordsToBounds(coords);
+          this._requestFeatures(bounds, coords, requestCallback);
+        }
+      }
+
+      return this;
+    },
+
+    refresh: function () {
+      this.setWhere(this.options.where);
+    },
+
+    _filterExistingFeatures: function (oldFrom, oldTo, newFrom, newTo) {
+      var layersToRemove =
+        oldFrom && oldTo
+          ? this._getFeaturesInTimeRange(oldFrom, oldTo)
+          : this._currentSnapshot;
+      var layersToAdd = this._getFeaturesInTimeRange(newFrom, newTo);
+
+      if (layersToAdd.indexOf) {
+        for (var i = 0; i < layersToAdd.length; i++) {
+          var shouldRemoveLayer = layersToRemove.indexOf(layersToAdd[i]);
+          if (shouldRemoveLayer >= 0) {
+            layersToRemove.splice(shouldRemoveLayer, 1);
+          }
+        }
+      }
+
+      // schedule adding features until the next animation frame
+      leaflet.Util.requestAnimFrame(
+        leaflet.Util.bind(function () {
+          this.removeLayers(layersToRemove);
+          this.addLayers(layersToAdd);
+        }, this)
+      );
+    },
+
+    _getFeaturesInTimeRange: function (start, end) {
+      var ids = [];
+      var search;
+
+      if (this.options.timeField.start && this.options.timeField.end) {
+        var startTimes = this._startTimeIndex.between(start, end);
+        var endTimes = this._endTimeIndex.between(start, end);
+        search = startTimes.concat(endTimes);
+      } else if (this._timeIndex) {
+        search = this._timeIndex.between(start, end);
+      } else {
+        warn(
+          'You must set timeField in the layer constructor in order to manipulate the start and end time filter.'
+        );
+        return [];
+      }
+
+      for (var i = search.length - 1; i >= 0; i--) {
+        ids.push(search[i].id);
+      }
+
+      return ids;
+    },
+
+    _buildTimeIndexes: function (geojson) {
+      var i;
+      var feature;
+      if (this.options.timeField.start && this.options.timeField.end) {
+        var startTimeEntries = [];
+        var endTimeEntries = [];
+        for (i = geojson.length - 1; i >= 0; i--) {
+          feature = geojson[i];
+          startTimeEntries.push({
+            id: feature.id,
+            value: new Date(feature.properties[this.options.timeField.start])
+          });
+          endTimeEntries.push({
+            id: feature.id,
+            value: new Date(feature.properties[this.options.timeField.end])
+          });
+        }
+        this._startTimeIndex.bulkAdd(startTimeEntries);
+        this._endTimeIndex.bulkAdd(endTimeEntries);
+      } else {
+        var timeEntries = [];
+        for (i = geojson.length - 1; i >= 0; i--) {
+          feature = geojson[i];
+          timeEntries.push({
+            id: feature.id,
+            value: new Date(feature.properties[this.options.timeField])
+          });
+        }
+
+        this._timeIndex.bulkAdd(timeEntries);
+      }
+    },
+
+    _featureWithinTimeRange: function (feature) {
+      if (!this.options.from || !this.options.to) {
+        return true;
+      }
+
+      var from = +this.options.from.valueOf();
+      var to = +this.options.to.valueOf();
+
+      if (typeof this.options.timeField === 'string') {
+        var date = +feature.properties[this.options.timeField];
+        return date >= from && date <= to;
+      }
+
+      if (this.options.timeField.start && this.options.timeField.end) {
+        var startDate = +feature.properties[this.options.timeField.start];
+        var endDate = +feature.properties[this.options.timeField.end];
+        return (
+          (startDate >= from && startDate <= to) ||
+          (endDate >= from && endDate <= to) ||
+          (startDate <= from && endDate >= to)
+        );
+      }
+    },
+
+    _visibleZoom: function () {
+      // check to see whether the current zoom level of the map is within the optional limit defined for the FeatureLayer
+      if (!this._map) {
+        return false;
+      }
+      var zoom = this._map.getZoom();
+      if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {
+        return false;
+      } else {
+        return true;
+      }
+    },
+
+    _handleZoomChange: function () {
+      if (!this._visibleZoom()) {
+        this.removeLayers(this._currentSnapshot);
+      } else {
+        /*
+        for every cell in this._cells
+          1. Get the cache key for the coords of the cell
+          2. If this._cache[key] exists it will be an array of feature IDs.
+          3. Call this.addLayers(this._cache[key]) to instruct the feature layer to add the layers back.
+        */
+        for (var i in this._cells) {
+          var coords = this._cells[i].coords;
+          var key = this._cacheKey(coords);
+          if (this._cache[key]) {
+            this.addLayers(this._cache[key]);
+          }
+        }
+      }
+    },
+
+    /**
+     * Service Methods
+     */
+
+    authenticate: function (token) {
+      this.service.authenticate(token);
+      return this;
+    },
+
+    metadata: function (callback, context) {
+      this.service.metadata(callback, context);
+      return this;
+    },
+
+    query: function () {
+      return this.service.query();
+    },
+
+    _getMetadata: function (callback) {
+      if (this._metadata) {
+        var error;
+        callback(error, this._metadata);
+      } else {
+        this.metadata(
+          leaflet.Util.bind(function (error, response) {
+            this._metadata = response;
+            callback(error, this._metadata);
+          }, this)
+        );
+      }
+    },
+
+    addFeature: function (feature, callback, context) {
+      this.addFeatures(feature, callback, context);
+    },
+
+    addFeatures: function (features, callback, context) {
+      this._getMetadata(
+        leaflet.Util.bind(function (error, metadata) {
+          if (error) {
+            if (callback) {
+              callback.call(this, error, null);
+            }
+            return;
+          }
+          // GeoJSON featureCollection or simple feature
+          var featuresArray = features.features ? features.features : [features];
+
+          this.service.addFeatures(
+            features,
+            leaflet.Util.bind(function (error, response) {
+              if (!error) {
+                for (var i = featuresArray.length - 1; i >= 0; i--) {
+                  // assign ID from result to appropriate objectid field from service metadata
+                  featuresArray[i].properties[metadata.objectIdField] =
+                    featuresArray.length > 1
+                      ? response[i].objectId
+                      : response.objectId;
+                  // we also need to update the geojson id for createLayers() to function
+                  featuresArray[i].id =
+                    featuresArray.length > 1
+                      ? response[i].objectId
+                      : response.objectId;
+                }
+                this._addFeatures(featuresArray);
+              }
+
+              if (callback) {
+                callback.call(context, error, response);
+              }
+            }, this)
+          );
+        }, this)
+      );
+    },
+
+    updateFeature: function (feature, callback, context) {
+      this.updateFeatures(feature, callback, context);
+    },
+
+    updateFeatures: function (features, callback, context) {
+      // GeoJSON featureCollection or simple feature
+      var featuresArray = features.features ? features.features : [features];
+      this.service.updateFeatures(
+        features,
+        function (error, response) {
+          if (!error) {
+            for (var i = featuresArray.length - 1; i >= 0; i--) {
+              this.removeLayers([featuresArray[i].id], true);
+            }
+            this._addFeatures(featuresArray);
+          }
+
+          if (callback) {
+            callback.call(context, error, response);
+          }
+        },
+        this
+      );
+    },
+
+    deleteFeature: function (id, callback, context) {
+      this.deleteFeatures(id, callback, context);
+    },
+
+    deleteFeatures: function (ids, callback, context) {
+      return this.service.deleteFeatures(
+        ids,
+        function (error, response) {
+          var responseArray = response.length ? response : [response];
+          if (!error && responseArray.length > 0) {
+            for (var i = responseArray.length - 1; i >= 0; i--) {
+              this.removeLayers([responseArray[i].objectId], true);
+            }
+          }
+          if (callback) {
+            callback.call(context, error, response);
+          }
+        },
+        this
+      );
+    }
+  });
+
+  var FeatureLayer = FeatureManager.extend({
+
+    options: {
+      cacheLayers: true
+    },
+
+    /**
+     * Constructor
+     */
+    initialize: function (options) {
+      FeatureManager.prototype.initialize.call(this, options);
+      this._originalStyle = this.options.style;
+      this._layers = {};
+    },
+
+    /**
+     * Layer Interface
+     */
+
+    onRemove: function (map) {
+      for (var i in this._layers) {
+        map.removeLayer(this._layers[i]);
+        // trigger the event when the entire featureLayer is removed from the map
+        this.fire('removefeature', {
+          feature: this._layers[i].feature,
+          permanent: false
+        }, true);
+      }
+
+      return FeatureManager.prototype.onRemove.call(this, map);
+    },
+
+    createNewLayer: function (geojson) {
+      var layer = leaflet.GeoJSON.geometryToLayer(geojson, this.options);
+      // trap for GeoJSON without geometry
+      if (layer) {
+        layer.defaultOptions = layer.options;
+      }
+      return layer;
+    },
+
+    _updateLayer: function (layer, geojson) {
+      // convert the geojson coordinates into a Leaflet LatLng array/nested arrays
+      // pass it to setLatLngs to update layer geometries
+      var latlngs = [];
+      var coordsToLatLng = this.options.coordsToLatLng || leaflet.GeoJSON.coordsToLatLng;
+
+      // copy new attributes, if present
+      if (geojson.properties) {
+        layer.feature.properties = geojson.properties;
+      }
+
+      switch (geojson.geometry.type) {
+        case 'Point':
+          latlngs = leaflet.GeoJSON.coordsToLatLng(geojson.geometry.coordinates);
+          layer.setLatLng(latlngs);
+          break;
+        case 'LineString':
+          latlngs = leaflet.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 0, coordsToLatLng);
+          layer.setLatLngs(latlngs);
+          break;
+        case 'MultiLineString':
+          latlngs = leaflet.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1, coordsToLatLng);
+          layer.setLatLngs(latlngs);
+          break;
+        case 'Polygon':
+          latlngs = leaflet.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1, coordsToLatLng);
+          layer.setLatLngs(latlngs);
+          break;
+        case 'MultiPolygon':
+          latlngs = leaflet.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 2, coordsToLatLng);
+          layer.setLatLngs(latlngs);
+          break;
+      }
+    },
+
+    /**
+     * Feature Management Methods
+     */
+
+    createLayers: function (features) {
+      for (var i = features.length - 1; i >= 0; i--) {
+        var geojson = features[i];
+
+        var layer = this._layers[geojson.id];
+        var newLayer;
+
+        if (this._visibleZoom() && layer && !this._map.hasLayer(layer) && (!this.options.timeField || this._featureWithinTimeRange(geojson))) {
+          this._map.addLayer(layer);
+          this.fire('addfeature', {
+            feature: layer.feature
+          }, true);
+        }
+
+        // update geometry if necessary
+        if (layer && this.options.simplifyFactor > 0 && (layer.setLatLngs || layer.setLatLng)) {
+          this._updateLayer(layer, geojson);
+        }
+
+        if (!layer) {
+          newLayer = this.createNewLayer(geojson);
+
+          if (!newLayer) {
+            warn('invalid GeoJSON encountered');
+          } else {
+            newLayer.feature = geojson;
+
+            // bubble events from individual layers to the feature layer
+            newLayer.addEventParent(this);
+
+            if (this.options.onEachFeature) {
+              this.options.onEachFeature(newLayer.feature, newLayer);
+            }
+
+            // cache the layer
+            this._layers[newLayer.feature.id] = newLayer;
+
+            // style the layer
+            this.setFeatureStyle(newLayer.feature.id, this.options.style);
+
+            this.fire('createfeature', {
+              feature: newLayer.feature
+            }, true);
+
+            // add the layer if the current zoom level is inside the range defined for the layer, it is within the current time bounds or our layer is not time enabled
+            if (this._visibleZoom() && (!this.options.timeField || (this.options.timeField && this._featureWithinTimeRange(geojson)))) {
+              this._map.addLayer(newLayer);
+            }
+          }
+        }
+      }
+    },
+
+    addLayers: function (ids) {
+      for (var i = ids.length - 1; i >= 0; i--) {
+        var layer = this._layers[ids[i]];
+        if (layer && (!this.options.timeField || this._featureWithinTimeRange(layer.feature))) {
+          this._map.addLayer(layer);
+        }
+      }
+    },
+
+    removeLayers: function (ids, permanent) {
+      for (var i = ids.length - 1; i >= 0; i--) {
+        var id = ids[i];
+        var layer = this._layers[id];
+        if (layer) {
+          this.fire('removefeature', {
+            feature: layer.feature,
+            permanent: permanent
+          }, true);
+          this._map.removeLayer(layer);
+        }
+        if (layer && permanent) {
+          delete this._layers[id];
+        }
+      }
+    },
+
+    cellEnter: function (bounds, coords) {
+      if (this._visibleZoom() && !this._zooming && this._map) {
+        leaflet.Util.requestAnimFrame(leaflet.Util.bind(function () {
+          var cacheKey = this._cacheKey(coords);
+          var cellKey = this._cellCoordsToKey(coords);
+          var layers = this._cache[cacheKey];
+          if (this._activeCells[cellKey] && layers) {
+            this.addLayers(layers);
+          }
+        }, this));
+      }
+    },
+
+    cellLeave: function (bounds, coords) {
+      if (!this._zooming) {
+        leaflet.Util.requestAnimFrame(leaflet.Util.bind(function () {
+          if (this._map) {
+            var cacheKey = this._cacheKey(coords);
+            var cellKey = this._cellCoordsToKey(coords);
+            var layers = this._cache[cacheKey];
+            var mapBounds = this._map.getBounds();
+            if (!this._activeCells[cellKey] && layers) {
+              var removable = true;
+
+              for (var i = 0; i < layers.length; i++) {
+                var layer = this._layers[layers[i]];
+                if (layer && layer.getBounds && mapBounds.intersects(layer.getBounds())) {
+                  removable = false;
+                }
+              }
+
+              if (removable) {
+                this.removeLayers(layers, !this.options.cacheLayers);
+              }
+
+              if (!this.options.cacheLayers && removable) {
+                delete this._cache[cacheKey];
+                delete this._cells[cellKey];
+                delete this._activeCells[cellKey];
+              }
+            }
+          }
+        }, this));
+      }
+    },
+
+    /**
+     * Styling Methods
+     */
+
+    resetStyle: function () {
+      this.options.style = this._originalStyle;
+      this.eachFeature(function (layer) {
+        this.resetFeatureStyle(layer.feature.id);
+      }, this);
+      return this;
+    },
+
+    setStyle: function (style) {
+      this.options.style = style;
+      this.eachFeature(function (layer) {
+        this.setFeatureStyle(layer.feature.id, style);
+      }, this);
+      return this;
+    },
+
+    resetFeatureStyle: function (id) {
+      var layer = this._layers[id];
+      var style = this._originalStyle || leaflet.Path.prototype.options;
+      if (layer) {
+        leaflet.Util.extend(layer.options, layer.defaultOptions);
+        this.setFeatureStyle(id, style);
+      }
+      return this;
+    },
+
+    setFeatureStyle: function (id, style) {
+      var layer = this._layers[id];
+      if (typeof style === 'function') {
+        style = style(layer.feature);
+      }
+      if (layer.setStyle) {
+        layer.setStyle(style);
+      }
+      return this;
+    },
+
+    /**
+     * Utility Methods
+     */
+
+    eachActiveFeature: function (fn, context) {
+      // figure out (roughly) which layers are in view
+      if (this._map) {
+        var activeBounds = this._map.getBounds();
+        for (var i in this._layers) {
+          if (this._currentSnapshot.indexOf(this._layers[i].feature.id) !== -1) {
+            // a simple point in poly test for point geometries
+            if (typeof this._layers[i].getLatLng === 'function' && activeBounds.contains(this._layers[i].getLatLng())) {
+              fn.call(context, this._layers[i]);
+            } else if (typeof this._layers[i].getBounds === 'function' && activeBounds.intersects(this._layers[i].getBounds())) {
+              // intersecting bounds check for polyline and polygon geometries
+              fn.call(context, this._layers[i]);
+            }
+          }
+        }
+      }
+      return this;
+    },
+
+    eachFeature: function (fn, context) {
+      for (var i in this._layers) {
+        fn.call(context, this._layers[i]);
+      }
+      return this;
+    },
+
+    getFeature: function (id) {
+      return this._layers[id];
+    },
+
+    bringToBack: function () {
+      this.eachFeature(function (layer) {
+        if (layer.bringToBack) {
+          layer.bringToBack();
+        }
+      });
+    },
+
+    bringToFront: function () {
+      this.eachFeature(function (layer) {
+        if (layer.bringToFront) {
+          layer.bringToFront();
+        }
+      });
+    },
+
+    redraw: function (id) {
+      if (id) {
+        this._redraw(id);
+      }
+      return this;
+    },
+
+    _redraw: function (id) {
+      var layer = this._layers[id];
+      var geojson = layer.feature;
+
+      // if this looks like a marker
+      if (layer && layer.setIcon && this.options.pointToLayer) {
+        // update custom symbology, if necessary
+        if (this.options.pointToLayer) {
+          var getIcon = this.options.pointToLayer(geojson, leaflet.latLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0]));
+          var updatedIcon = getIcon.options.icon;
+          layer.setIcon(updatedIcon);
+        }
+      }
+
+      // looks like a vector marker (circleMarker)
+      if (layer && layer.setStyle && this.options.pointToLayer) {
+        var getStyle = this.options.pointToLayer(geojson, leaflet.latLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0]));
+        var updatedStyle = getStyle.options;
+        this.setFeatureStyle(geojson.id, updatedStyle);
+      }
+
+      // looks like a path (polygon/polyline)
+      if (layer && layer.setStyle && this.options.style) {
+        this.resetStyle(geojson.id);
+      }
+    }
+  });
+
+  function featureLayer (options) {
+    return new FeatureLayer(options);
+  }
+
+  exports.BasemapLayer = BasemapLayer;
+  exports.DynamicMapLayer = DynamicMapLayer;
+  exports.FeatureLayer = FeatureLayer;
+  exports.FeatureLayerService = FeatureLayerService;
+  exports.FeatureManager = FeatureManager;
+  exports.Find = Find;
+  exports.Identify = Identify;
+  exports.IdentifyFeatures = IdentifyFeatures;
+  exports.IdentifyImage = IdentifyImage;
+  exports.ImageMapLayer = ImageMapLayer;
+  exports.ImageService = ImageService;
+  exports.MapService = MapService;
+  exports.Query = Query;
+  exports.RasterLayer = RasterLayer;
+  exports.Service = Service;
+  exports.Support = Support;
+  exports.Task = Task;
+  exports.TiledMapLayer = TiledMapLayer;
+  exports.Util = EsriUtil;
+  exports.VERSION = version;
+  exports.basemapLayer = basemapLayer;
+  exports.dynamicMapLayer = dynamicMapLayer;
+  exports.featureLayer = featureLayer;
+  exports.featureLayerService = featureLayerService;
+  exports.find = find;
+  exports.get = get;
+  exports.identify = identify;
+  exports.identifyFeatures = identifyFeatures;
+  exports.identifyImage = identifyImage;
+  exports.imageMapLayer = imageMapLayer;
+  exports.imageService = imageService;
+  exports.mapService = mapService;
+  exports.options = options;
+  exports.post = xmlHttpPost;
+  exports.query = query;
+  exports.request = request;
+  exports.service = service;
+  exports.task = task;
+  exports.tiledMapLayer = tiledMapLayer;
+
+  Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
+//# sourceMappingURL=esri-leaflet-debug.js.map
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-2.5.3.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,6 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("leaflet")):"function"==typeof define&&define.amd?define(["exports","leaflet"],e):e(((t=t||self).L=t.L||{},t.L.esri={}),t.L)}(this,(function(t,e){"use strict";var i=window.XMLHttpRequest&&"withCredentials"in new window.XMLHttpRequest,s=""===document.documentElement.style.pointerEvents,r={cors:i,pointerEvents:s},o={attributionWidthOffset:55},n=0;function a(t){var e="";for(var i in t.f=t.f||"json",t)if(t.hasOwnProperty(i)){var s,r=t[i],o=Object.prototype.toString.call(r);e.length&&(e+="&"),s="[object Array]"===o?"[object Object]"===Object.prototype.toString.call(r[0])?JSON.stringify(r):r.join(","):"[object Object]"===o?JSON.stringify(r):"[object Date]"===o?r.valueOf():r,e+=encodeURIComponent(i)+"="+encodeURIComponent(s)}return e}function l(t,i){var s=new window.XMLHttpRequest;return s.onerror=function(r){s.onreadystatechange=e.Util.falseFn,t.call(i,{error:{code:500,message:"XMLHttpRequest error"}},null)},s.onreadystatechange=function(){var r,o;if(4===s.readyState){try{r=JSON.parse(s.responseText)}catch(t){r=null,o={code:500,message:"Could not parse response as JSON. This could also be caused by a CORS or XMLHttpRequest error."}}!o&&r.error&&(o=r.error,r=null),s.onerror=e.Util.falseFn,t.call(i,o,r)}},s.ontimeout=function(){this.onerror()},s}function u(t,e,i,s){var r=l(i,s);return r.open("POST",t),null!=s&&void 0!==s.options&&(r.timeout=s.options.timeout),r.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"),r.send(a(e)),r}function h(t,e,i,s){var r=l(i,s);return r.open("GET",t+"?"+a(e),!0),null!=s&&void 0!==s.options&&(r.timeout=s.options.timeout,s.options.withCredentials&&(r.withCredentials=!0)),r.send(null),r}function c(t,e,i,s){var o=a(e),n=l(i,s),u=(t+"?"+o).length;if(u<=2e3&&r.cors?n.open("GET",t+"?"+o):u>2e3&&r.cors&&(n.open("POST",t),n.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8")),null!=s&&void 0!==s.options&&(n.timeout=s.options.timeout,s.options.withCredentials&&(n.withCredentials=!0)),u<=2e3&&r.cors)n.send(null);else{if(!(u>2e3&&r.cors))return u<=2e3&&!r.cors?p(t,e,i,s):void m("a request to "+t+" was longer then 2000 characters and this browser cannot make a cross-domain post request. Please use a proxy http://esri.github.io/esri-leaflet/api-reference/request.html");n.send(o)}return n}function p(t,i,s,r){window._EsriLeafletCallbacks=window._EsriLeafletCallbacks||{};var o="c"+n;i.callback="window._EsriLeafletCallbacks."+o,window._EsriLeafletCallbacks[o]=function(t){if(!0!==window._EsriLeafletCallbacks[o]){var e,i=Object.prototype.toString.call(t);"[object Object]"!==i&&"[object Array]"!==i&&(e={error:{code:500,message:"Expected array or object as JSONP response"}},t=null),!e&&t.error&&(e=t,t=null),s.call(r,e,t),window._EsriLeafletCallbacks[o]=!0}};var l=e.DomUtil.create("script",null,document.body);return l.type="text/javascript",l.src=t+"?"+a(i),l.id=o,l.onerror=function(t){if(t&&!0!==window._EsriLeafletCallbacks[o]){s.call(r,{error:{code:500,message:"An unknown error occurred"}}),window._EsriLeafletCallbacks[o]=!0}},e.DomUtil.addClass(l,"esri-leaflet-jsonp"),n++,{id:o,url:l.src,abort:function(){window._EsriLeafletCallbacks._callback[o]({code:0,message:"Request aborted."})}}}var d=r.cors?h:p;function m(){console&&console.warn&&console.warn.apply(console,arguments)}d.CORS=h,d.JSONP=p;var f={request:c,get:d,post:u},y=function(t,e,i,s){var r=(s[0]-i[0])*(t[1]-i[1])-(s[1]-i[1])*(t[0]-i[0]),o=(e[0]-t[0])*(t[1]-i[1])-(e[1]-t[1])*(t[0]-i[0]),n=(s[1]-i[1])*(e[0]-t[0])-(s[0]-i[0])*(e[1]-t[1]);if(0!==n){var a=r/n,l=o/n;if(a>=0&&a<=1&&l>=0&&l<=1)return!0}return!1},g=function(t,e){for(var i=0;i<t.length-1;i++)for(var s=0;s<e.length-1;s++)if(y(t[i],t[i+1],e[s],e[s+1]))return!0;return!1},_=function(t){return function(t,e){for(var i=0;i<t.length;i++)if(t[i]!==e[i])return!1;return!0}(t[0],t[t.length-1])||t.push(t[0]),t},v=function(t){for(var e,i=0,s=0,r=t.length,o=t[s];s<r-1;s++)i+=((e=t[s+1])[0]-o[0])*(e[1]+o[1]),o=e;return i>=0},b=function(t){var e={};for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i]);return e},x=function(t,e){var i=g(t,e),s=function(t,e){for(var i=!1,s=-1,r=t.length,o=r-1;++s<r;o=s)(t[s][1]<=e[1]&&e[1]<t[o][1]||t[o][1]<=e[1]&&e[1]<t[s][1])&&e[0]<(t[o][0]-t[s][0])*(e[1]-t[s][1])/(t[o][1]-t[s][1])+t[s][0]&&(i=!i);return i}(t,e[0]);return!(i||!s)},S=function t(e,i){var s={};if(e.features){s.type="FeatureCollection",s.features=[];for(var r=0;r<e.features.length;r++)s.features.push(t(e.features[r],i))}if("number"==typeof e.x&&"number"==typeof e.y&&(s.type="Point",s.coordinates=[e.x,e.y],"number"==typeof e.z&&s.coordinates.push(e.z)),e.points&&(s.type="MultiPoint",s.coordinates=e.points.slice(0)),e.paths&&(1===e.paths.length?(s.type="LineString",s.coordinates=e.paths[0].slice(0)):(s.type="MultiLineString",s.coordinates=e.paths.slice(0))),e.rings&&(s=function(t){for(var e,i,s,r=[],o=[],n=0;n<t.length;n++){var a=_(t[n].slice(0));if(!(a.length<4))if(v(a)){var l=[a.slice().reverse()];r.push(l)}else o.push(a.slice().reverse())}for(var u=[];o.length;){s=o.pop();var h=!1;for(e=r.length-1;e>=0;e--)if(i=r[e][0],x(i,s)){r[e].push(s),h=!0;break}h||u.push(s)}for(;u.length;){s=u.pop();var c=!1;for(e=r.length-1;e>=0;e--)if(i=r[e][0],g(i,s)){r[e].push(s),c=!0;break}c||r.push([s.reverse()])}return 1===r.length?{type:"Polygon",coordinates:r[0]}:{type:"MultiPolygon",coordinates:r}}(e.rings.slice(0))),"number"==typeof e.xmin&&"number"==typeof e.ymin&&"number"==typeof e.xmax&&"number"==typeof e.ymax&&(s.type="Polygon",s.coordinates=[[[e.xmax,e.ymax],[e.xmin,e.ymax],[e.xmin,e.ymin],[e.xmax,e.ymin],[e.xmax,e.ymax]]]),(e.geometry||e.attributes)&&(s.type="Feature",s.geometry=e.geometry?t(e.geometry):null,s.properties=e.attributes?b(e.attributes):null,e.attributes))try{s.id=function(t,e){for(var i=e?[e,"OBJECTID","FID"]:["OBJECTID","FID"],s=0;s<i.length;s++){var r=i[s];if(r in t&&("string"==typeof t[r]||"number"==typeof t[r]))return t[r]}throw Error("No valid id attribute found")}(e.attributes,i)}catch(t){}return JSON.stringify(s.geometry)===JSON.stringify({})&&(s.geometry=null),e.spatialReference&&e.spatialReference.wkid&&4326!==e.spatialReference.wkid&&console.warn("Object converted in non-standard crs - "+JSON.stringify(e.spatialReference)),s},L=function(t){var e=[],i=t.slice(0),s=_(i.shift().slice(0));if(s.length>=4){v(s)||s.reverse(),e.push(s);for(var r=0;r<i.length;r++){var o=_(i[r].slice(0));o.length>=4&&(v(o)&&o.reverse(),e.push(o))}}return e},A=function t(e,i){i=i||"OBJECTID";var s,r={wkid:4326},o={};switch(e.type){case"Point":o.x=e.coordinates[0],o.y=e.coordinates[1],o.spatialReference=r;break;case"MultiPoint":o.points=e.coordinates.slice(0),o.spatialReference=r;break;case"LineString":o.paths=[e.coordinates.slice(0)],o.spatialReference=r;break;case"MultiLineString":o.paths=e.coordinates.slice(0),o.spatialReference=r;break;case"Polygon":o.rings=L(e.coordinates.slice(0)),o.spatialReference=r;break;case"MultiPolygon":o.rings=function(t){for(var e=[],i=0;i<t.length;i++)for(var s=L(t[i]),r=s.length-1;r>=0;r--){var o=s[r].slice(0);e.push(o)}return e}(e.coordinates.slice(0)),o.spatialReference=r;break;case"Feature":e.geometry&&(o.geometry=t(e.geometry,i)),o.attributes=e.properties?b(e.properties):{},e.id&&(o.attributes[i]=e.id);break;case"FeatureCollection":for(o=[],s=0;s<e.features.length;s++)o.push(t(e.features[s],i));break;case"GeometryCollection":for(o=[],s=0;s<e.geometries.length;s++)o.push(t(e.geometries[s],i))}return o},I='<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>',T='Powered by <a href="https://www.esri.com">Esri</a>';
+/* @preserve
+  * @terraformer/arcgis - v2.0.6 - MIT
+  * Copyright (c) 2012-2020 Environmental Systems Research Institute, Inc.
+  * Mon May 18 2020 14:30:35 GMT-0700 (Pacific Daylight Time)
+  */function C(t,e){return A(t,e)}function w(t,e){return S(t,e)}function R(t){if("NaN"!==t.xmin&&"NaN"!==t.ymin&&"NaN"!==t.xmax&&"NaN"!==t.ymax){var i=e.latLng(t.ymin,t.xmin),s=e.latLng(t.ymax,t.xmax);return e.latLngBounds(i,s)}return null}function P(t){return{xmin:(t=e.latLngBounds(t)).getSouthWest().lng,ymin:t.getSouthWest().lat,xmax:t.getNorthEast().lng,ymax:t.getNorthEast().lat,spatialReference:{wkid:4326}}}var F=/^(OBJECTID|FID|OID|ID)$/i;function O(t){var e;if(t.objectIdFieldName)e=t.objectIdFieldName;else if(t.fields){for(var i=0;i<=t.fields.length-1;i++)if("esriFieldTypeOID"===t.fields[i].type){e=t.fields[i].name;break}if(!e)for(i=0;i<=t.fields.length-1;i++)if(t.fields[i].name.match(F)){e=t.fields[i].name;break}}return e}function M(t){for(var e in t.attributes)if(e.match(F))return e}function k(t,e){var i,s=t.features||t.results,r=s&&s.length;i=e||O(t);var o={type:"FeatureCollection",features:[]};if(r)for(var n=s.length-1;n>=0;n--){var a=w(s[n],i||M(s[n]));o.features.push(a)}return o}function U(t){return"/"!==(t=e.Util.trim(t))[t.length-1]&&(t+="/"),t}function G(t){if(-1!==t.url.indexOf("?")){t.requestParams=t.requestParams||{};var e=t.url.substring(t.url.indexOf("?")+1);t.url=t.url.split("?")[0],t.requestParams=JSON.parse('{"'+decodeURI(e).replace(/"/g,'\\"').replace(/&/g,'","').replace(/=/g,'":"')+'"}')}return t.url=U(t.url.split("?")[0]),t}function D(t){return/^(?!.*utility\.arcgis\.com).*\.arcgis\.com.*FeatureServer/i.test(t)}function q(t){var e;switch(t){case"Point":e="esriGeometryPoint";break;case"MultiPoint":e="esriGeometryMultipoint";break;case"LineString":case"MultiLineString":e="esriGeometryPolyline";break;case"Polygon":case"MultiPolygon":e="esriGeometryPolygon"}return e}function E(t){return t.getSize().x-o.attributionWidthOffset+"px"}function B(t){if(t.attributionControl){if(t.attributionControl._esriAttributionLayerCount||(t.attributionControl._esriAttributionLayerCount=0),0===t.attributionControl._esriAttributionLayerCount){if(!t.attributionControl._esriAttributionAddedOnce){var i=document.createElement("style");i.type="text/css",i.innerHTML=".esri-truncated-attribution:hover {white-space: normal;}",document.getElementsByTagName("head")[0].appendChild(i);var s=document.createElement("style");s.type="text/css",s.innerHTML=".esri-truncated-attribution {vertical-align: -3px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;display: inline-block;transition: 0s white-space;transition-delay: 1s;max-width: "+E(t)+";}",document.getElementsByTagName("head")[0].appendChild(s),t.on("resize",(function(e){t.attributionControl&&(t.attributionControl._container.style.maxWidth=E(e.target))})),t.attributionControl._esriAttributionAddedOnce=!0}t.attributionControl.setPrefix(I+" | "+T),e.DomUtil.addClass(t.attributionControl._container,"esri-truncated-attribution:hover"),e.DomUtil.addClass(t.attributionControl._container,"esri-truncated-attribution")}t.attributionControl._esriAttributionLayerCount=t.attributionControl._esriAttributionLayerCount+1}}function z(t){t.attributionControl&&(t.attributionControl._esriAttributionLayerCount&&1===t.attributionControl._esriAttributionLayerCount&&(t.attributionControl.setPrefix(I),e.DomUtil.removeClass(t.attributionControl._container,"esri-truncated-attribution:hover"),e.DomUtil.removeClass(t.attributionControl._container,"esri-truncated-attribution")),t.attributionControl._esriAttributionLayerCount=t.attributionControl._esriAttributionLayerCount-1)}function Z(t){var i={geometry:null,geometryType:null};return t instanceof e.LatLngBounds?(i.geometry=P(t),i.geometryType="esriGeometryEnvelope",i):(t.getLatLng&&(t=t.getLatLng()),t instanceof e.LatLng&&(t={type:"Point",coordinates:[t.lng,t.lat]}),t instanceof e.GeoJSON&&(t=t.getLayers()[0].feature.geometry,i.geometry=C(t),i.geometryType=q(t.type)),t.toGeoJSON&&(t=t.toGeoJSON()),"Feature"===t.type&&(t=t.geometry),"Point"===t.type||"LineString"===t.type||"Polygon"===t.type||"MultiPolygon"===t.type?(i.geometry=C(t),i.geometryType=q(t.type),i):void m("invalid geometry passed to spatial query. Should be L.LatLng, L.LatLngBounds, L.Marker or a GeoJSON Point, Line, Polygon or MultiPolygon object"))}function N(t,i){r.cors&&c(t,{},e.Util.bind((function(t,s){if(!t){i._esriAttributions=[];for(var r=0;r<s.contributors.length;r++)for(var o=s.contributors[r],n=0;n<o.coverageAreas.length;n++){var a=o.coverageAreas[n],l=e.latLng(a.bbox[0],a.bbox[1]),u=e.latLng(a.bbox[2],a.bbox[3]);i._esriAttributions.push({attribution:o.attribution,score:a.score,bounds:e.latLngBounds(l,u),minZoom:a.zoomMin,maxZoom:a.zoomMax})}i._esriAttributions.sort((function(t,e){return e.score-t.score})),j({target:i})}}),this))}function j(t){var i=t.target,s=i._esriAttributions;if(i&&i.attributionControl){var r=i.attributionControl._container.querySelector(".esri-dynamic-attribution");if(r&&s){for(var o="",n=i.getBounds(),a=e.latLngBounds(n.getSouthWest().wrap(),n.getNorthEast().wrap()),l=i.getZoom(),u=0;u<s.length;u++){var h=s[u],c=h.attribution;!o.match(c)&&h.bounds.intersects(a)&&l>=h.minZoom&&l<=h.maxZoom&&(o+=", "+c)}o=o.substr(2),r.innerHTML=o,r.style.maxWidth=E(i),i.fire("attributionupdated",{attribution:o})}}}var W={warn:m,cleanUrl:U,getUrlParams:G,isArcgisOnline:D,geojsonTypeToArcGIS:q,responseToFeatureCollection:k,geojsonToArcGIS:C,arcgisToGeoJSON:w,boundsToExtent:P,extentToBounds:R,calcAttributionWidth:E,setEsriAttribution:B,_setGeometry:Z,_getAttributionData:N,_updateMapAttribution:j,_findIdAttributeFromFeature:M,_findIdAttributeFromResponse:O},J=e.Class.extend({options:{proxy:!1,useCors:i},generateSetter:function(t,i){return e.Util.bind((function(e){return this.params[t]=e,this}),i)},initialize:function(t){if(t.request&&t.options?(this._service=t,e.Util.setOptions(this,t.options)):(e.Util.setOptions(this,t),this.options.url=U(t.url)),this.params=e.Util.extend({},this.params||{}),this.setters)for(var i in this.setters){var s=this.setters[i];this[i]=this.generateSetter(s,this)}},token:function(t){return this._service?this._service.authenticate(t):this.params.token=t,this},format:function(t){return this.params.returnUnformattedValues=!t,this},request:function(t,i){return this.options.requestParams&&e.Util.extend(this.params,this.options.requestParams),this._service?this._service.request(this.path,this.params,t,i):this._request("request",this.path,this.params,t,i)},_request:function(t,e,i,s,r){var o=this.options.proxy?this.options.proxy+"?"+this.options.url+e:this.options.url+e;return"get"!==t&&"request"!==t||this.options.useCors?f[t](o,i,s,r):f.get.JSONP(o,i,s,r)}});var V=J.extend({setters:{offset:"resultOffset",limit:"resultRecordCount",fields:"outFields",precision:"geometryPrecision",featureIds:"objectIds",returnGeometry:"returnGeometry",returnM:"returnM",transform:"datumTransformation",token:"token"},path:"query",params:{returnGeometry:!0,where:"1=1",outSR:4326,outFields:"*"},within:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelContains",this},intersects:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelIntersects",this},contains:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelWithin",this},crosses:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelCrosses",this},touches:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelTouches",this},overlaps:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelOverlaps",this},bboxIntersects:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelEnvelopeIntersects",this},indexIntersects:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelIndexIntersects",this},nearby:function(t,i){return t=e.latLng(t),this.params.geometry=[t.lng,t.lat],this.params.geometryType="esriGeometryPoint",this.params.spatialRel="esriSpatialRelIntersects",this.params.units="esriSRUnit_Meter",this.params.distance=i,this.params.inSR=4326,this},where:function(t){return this.params.where=t,this},between:function(t,e){return this.params.time=[t.valueOf(),e.valueOf()],this},simplify:function(t,e){var i=Math.abs(t.getBounds().getWest()-t.getBounds().getEast());return this.params.maxAllowableOffset=i/t.getSize().y*e,this},orderBy:function(t,e){return e=e||"ASC",this.params.orderByFields=this.params.orderByFields?this.params.orderByFields+",":"",this.params.orderByFields+=[t,e].join(" "),this},run:function(t,e){return this._cleanParams(),this.options.isModern||D(this.options.url)&&void 0===this.options.isModern?(this.params.f="geojson",this.request((function(i,s){this._trapSQLerrors(i),t.call(e,i,s,s)}),this)):this.request((function(i,s){this._trapSQLerrors(i),t.call(e,i,s&&k(s),s)}),this)},count:function(t,e){return this._cleanParams(),this.params.returnCountOnly=!0,this.request((function(e,i){t.call(this,e,i&&i.count,i)}),e)},ids:function(t,e){return this._cleanParams(),this.params.returnIdsOnly=!0,this.request((function(e,i){t.call(this,e,i&&i.objectIds,i)}),e)},bounds:function(t,e){return this._cleanParams(),this.params.returnExtentOnly=!0,this.request((function(i,s){s&&s.extent&&R(s.extent)?t.call(e,i,R(s.extent),s):(i={message:"Invalid Bounds"},t.call(e,i,null,s))}),e)},distinct:function(){return this.params.returnGeometry=!1,this.params.returnDistinctValues=!0,this},pixelSize:function(t){var i=e.point(t);return this.params.pixelSize=[i.x,i.y],this},layer:function(t){return this.path=t+"/query",this},_trapSQLerrors:function(t){t&&"400"===t.code&&m("one common syntax error in query requests is encasing string values in double quotes instead of single quotes")},_cleanParams:function(){delete this.params.returnIdsOnly,delete this.params.returnExtentOnly,delete this.params.returnCountOnly},_setGeometryParams:function(t){this.params.inSR=4326;var e=Z(t);this.params.geometry=e.geometry,this.params.geometryType=e.geometryType}});function Q(t){return new V(t)}var K=J.extend({setters:{contains:"contains",text:"searchText",fields:"searchFields",spatialReference:"sr",sr:"sr",layers:"layers",returnGeometry:"returnGeometry",maxAllowableOffset:"maxAllowableOffset",precision:"geometryPrecision",dynamicLayers:"dynamicLayers",returnZ:"returnZ",returnM:"returnM",gdbVersion:"gdbVersion",token:"token"},path:"find",params:{sr:4326,contains:!0,returnGeometry:!0,returnZ:!0,returnM:!1},layerDefs:function(t,e){return this.params.layerDefs=this.params.layerDefs?this.params.layerDefs+";":"",this.params.layerDefs+=[t,e].join(":"),this},simplify:function(t,e){var i=Math.abs(t.getBounds().getWest()-t.getBounds().getEast());return this.params.maxAllowableOffset=i/t.getSize().y*e,this},run:function(t,e){return this.request((function(i,s){t.call(e,i,s&&k(s),s)}),e)}});function H(t){return new K(t)}var X=J.extend({path:"identify",between:function(t,e){return this.params.time=[t.valueOf(),e.valueOf()],this}});var Y=X.extend({setters:{layers:"layers",precision:"geometryPrecision",tolerance:"tolerance",returnGeometry:"returnGeometry"},params:{sr:4326,layers:"all",tolerance:3,returnGeometry:!0},on:function(t){var e=P(t.getBounds()),i=t.getSize();return this.params.imageDisplay=[i.x,i.y,96],this.params.mapExtent=[e.xmin,e.ymin,e.xmax,e.ymax],this},at:function(t){return 2===t.length&&(t=e.latLng(t)),this._setGeometryParams(t),this},layerDef:function(t,e){return this.params.layerDefs=this.params.layerDefs?this.params.layerDefs+";":"",this.params.layerDefs+=[t,e].join(":"),this},simplify:function(t,e){var i=Math.abs(t.getBounds().getWest()-t.getBounds().getEast());return this.params.maxAllowableOffset=i/t.getSize().y*e,this},run:function(t,e){return this.request((function(i,s){if(i)t.call(e,i,void 0,s);else{var r=k(s);s.results=s.results.reverse();for(var o=0;o<r.features.length;o++){r.features[o].layerId=s.results[o].layerId}t.call(e,void 0,r,s)}}))},_setGeometryParams:function(t){var e=Z(t);this.params.geometry=e.geometry,this.params.geometryType=e.geometryType}});function $(t){return new Y(t)}var tt=X.extend({setters:{setMosaicRule:"mosaicRule",setRenderingRule:"renderingRule",setPixelSize:"pixelSize",returnCatalogItems:"returnCatalogItems",returnGeometry:"returnGeometry"},params:{returnGeometry:!1},at:function(t){return t=e.latLng(t),this.params.geometry=JSON.stringify({x:t.lng,y:t.lat,spatialReference:{wkid:4326}}),this.params.geometryType="esriGeometryPoint",this},getMosaicRule:function(){return this.params.mosaicRule},getRenderingRule:function(){return this.params.renderingRule},getPixelSize:function(){return this.params.pixelSize},run:function(t,e){return this.request((function(i,s){t.call(e,i,s&&this._responseToGeoJSON(s),s)}),this)},_responseToGeoJSON:function(t){var e=t.location,i=t.catalogItems,s=t.catalogItemVisibilities,r={pixel:{type:"Feature",geometry:{type:"Point",coordinates:[e.x,e.y]},crs:{type:"EPSG",properties:{code:e.spatialReference.wkid}},properties:{OBJECTID:t.objectId,name:t.name,value:t.value},id:t.objectId}};if(t.properties&&t.properties.Values&&(r.pixel.properties.values=t.properties.Values),i&&i.features&&(r.catalogItems=k(i),s&&s.length===r.catalogItems.features.length))for(var o=s.length-1;o>=0;o--)r.catalogItems.features[o].properties.catalogItemVisibility=s[o];return r}});function et(t){return new tt(t)}var it=e.Evented.extend({options:{proxy:!1,useCors:i,timeout:0},initialize:function(t){t=t||{},this._requestQueue=[],this._authenticating=!1,e.Util.setOptions(this,t),this.options.url=U(this.options.url)},get:function(t,e,i,s){return this._request("get",t,e,i,s)},post:function(t,e,i,s){return this._request("post",t,e,i,s)},request:function(t,e,i,s){return this._request("request",t,e,i,s)},metadata:function(t,e){return this._request("get","",{},t,e)},authenticate:function(t){return this._authenticating=!1,this.options.token=t,this._runQueue(),this},getTimeout:function(){return this.options.timeout},setTimeout:function(t){this.options.timeout=t},_request:function(t,i,s,r,o){this.fire("requeststart",{url:this.options.url+i,params:s,method:t},!0);var n=this._createServiceCallback(t,i,s,r,o);if(this.options.token&&(s.token=this.options.token),this.options.requestParams&&e.Util.extend(s,this.options.requestParams),!this._authenticating){var a=this.options.proxy?this.options.proxy+"?"+this.options.url+i:this.options.url+i;return"get"!==t&&"request"!==t||this.options.useCors?f[t](a,s,n,o):f.get.JSONP(a,s,n,o)}this._requestQueue.push([t,i,s,r,o])},_createServiceCallback:function(t,i,s,r,o){return e.Util.bind((function(n,a){!n||499!==n.code&&498!==n.code||(this._authenticating=!0,this._requestQueue.push([t,i,s,r,o]),this.fire("authenticationrequired",{authenticate:e.Util.bind(this.authenticate,this)},!0),n.authenticate=e.Util.bind(this.authenticate,this)),r.call(o,n,a),n?this.fire("requesterror",{url:this.options.url+i,params:s,message:n.message,code:n.code,method:t},!0):this.fire("requestsuccess",{url:this.options.url+i,params:s,response:a,method:t},!0),this.fire("requestend",{url:this.options.url+i,params:s,method:t},!0)}),this)},_runQueue:function(){for(var t=this._requestQueue.length-1;t>=0;t--){var e=this._requestQueue[t];this[e.shift()].apply(this,e)}this._requestQueue=[]}});var st=it.extend({identify:function(){return $(this)},find:function(){return H(this)},query:function(){return Q(this)}});function rt(t){return new st(t)}var ot=it.extend({query:function(){return Q(this)},identify:function(){return et(this)}});function nt(t){return new ot(t)}var at=it.extend({options:{idAttribute:"OBJECTID"},query:function(){return Q(this)},addFeature:function(t,e,i){this.addFeatures(t,e,i)},addFeatures:function(t,e,i){for(var s=t.features?t.features:[t],r=s.length-1;r>=0;r--)delete s[r].id;return t=C(t),t=s.length>1?t:[t],this.post("addFeatures",{features:t},(function(t,s){var r=s&&s.addResults?s.addResults.length>1?s.addResults:s.addResults[0]:void 0;e&&e.call(i,t||s.addResults[0].error,r)}),i)},updateFeature:function(t,e,i){this.updateFeatures(t,e,i)},updateFeatures:function(t,e,i){var s=t.features?t.features:[t];return t=C(t,this.options.idAttribute),t=s.length>1?t:[t],this.post("updateFeatures",{features:t},(function(t,s){var r=s&&s.updateResults?s.updateResults.length>1?s.updateResults:s.updateResults[0]:void 0;e&&e.call(i,t||s.updateResults[0].error,r)}),i)},deleteFeature:function(t,e,i){this.deleteFeatures(t,e,i)},deleteFeatures:function(t,e,i){return this.post("deleteFeatures",{objectIds:t},(function(t,s){var r=s&&s.deleteResults?s.deleteResults.length>1?s.deleteResults:s.deleteResults[0]:void 0;e&&e.call(i,t||s.deleteResults[0].error,r)}),i)}});function lt(t){return new at(t)}var ut="https:"!==window.location.protocol?"http:":"https:",ht=e.TileLayer.extend({statics:{TILES:{Streets:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],attribution:"USGS, NOAA",attributionUrl:"https://static.arcgis.com/attribution/World_Street_Map"}},Topographic:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],attribution:"USGS, NOAA",attributionUrl:"https://static.arcgis.com/attribution/World_Topo_Map"}},Oceans:{urlTemplate:ut+"//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],attribution:"USGS, NOAA",attributionUrl:"https://static.arcgis.com/attribution/Ocean_Basemap"}},OceansLabels:{urlTemplate:ut+"//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Reference/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],pane:s?"esri-labels":"tilePane",attribution:""}},NationalGeographic:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],attribution:"National Geographic, DeLorme, HERE, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, increment P Corp."}},DarkGray:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],attribution:"HERE, DeLorme, MapmyIndia, &copy; OpenStreetMap contributors"}},DarkGrayLabels:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Reference/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],pane:s?"esri-labels":"tilePane",attribution:""}},Gray:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],attribution:"HERE, DeLorme, MapmyIndia, &copy; OpenStreetMap contributors"}},GrayLabels:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],pane:s?"esri-labels":"tilePane",attribution:""}},Imagery:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],attribution:"DigitalGlobe, GeoEye, i-cubed, USDA, USGS, AEX, Getmapping, Aerogrid, IGN, IGP, swisstopo, and the GIS User Community",attributionUrl:"https://static.arcgis.com/attribution/World_Imagery"}},ImageryLabels:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],pane:s?"esri-labels":"tilePane",attribution:""}},ImageryTransportation:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Transportation/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],pane:s?"esri-labels":"tilePane",attribution:""}},ShadedRelief:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:13,subdomains:["server","services"],attribution:"USGS"}},ShadedReliefLabels:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places_Alternate/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:12,subdomains:["server","services"],pane:s?"esri-labels":"tilePane",attribution:""}},Terrain:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:13,subdomains:["server","services"],attribution:"USGS, NOAA"}},TerrainLabels:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Reference_Overlay/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:13,subdomains:["server","services"],pane:s?"esri-labels":"tilePane",attribution:""}},USATopo:{urlTemplate:ut+"//{s}.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:15,subdomains:["server","services"],attribution:"USGS, National Geographic Society, i-cubed"}},ImageryClarity:{urlTemplate:ut+"//clarity.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,attribution:"Esri, DigitalGlobe, GeoEye, Earthstar Geographics, CNES/Airbus DS, USDA, USGS, AeroGRID, IGN, and the GIS User Community"}},Physical:{urlTemplate:ut+"//{s}.arcgisonline.com/arcgis/rest/services/World_Physical_Map/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:8,subdomains:["server","services"],attribution:"U.S. National Park Service"}},ImageryFirefly:{urlTemplate:ut+"//fly.maptiles.arcgis.com/arcgis/rest/services/World_Imagery_Firefly/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,attribution:"Esri, DigitalGlobe, GeoEye, Earthstar Geographics, CNES/Airbus DS, USDA, USGS, AeroGRID, IGN, and the GIS User Community",attributionUrl:"https://static.arcgis.com/attribution/World_Imagery"}}}},initialize:function(t,i){var s;if("object"==typeof t&&t.urlTemplate&&t.options)s=t;else{if("string"!=typeof t||!ht.TILES[t])throw new Error('L.esri.BasemapLayer: Invalid parameter. Use one of "Streets", "Topographic", "Oceans", "OceansLabels", "NationalGeographic", "Physical", "Gray", "GrayLabels", "DarkGray", "DarkGrayLabels", "Imagery", "ImageryLabels", "ImageryTransportation", "ImageryClarity", "ImageryFirefly", ShadedRelief", "ShadedReliefLabels", "Terrain", "TerrainLabels" or "USATopo"');s=ht.TILES[t]}var r=e.Util.extend(s.options,i);e.Util.setOptions(this,r),this.options.token&&-1===s.urlTemplate.indexOf("token=")&&(s.urlTemplate+="?token="+this.options.token),this.options.proxy&&(s.urlTemplate=this.options.proxy+"?"+s.urlTemplate),e.TileLayer.prototype.initialize.call(this,s.urlTemplate,r)},onAdd:function(t){B(t),"esri-labels"===this.options.pane&&this._initPane(),this.options.attributionUrl&&N((this.options.proxy?this.options.proxy+"?":"")+this.options.attributionUrl,t),t.on("moveend",j),e.TileLayer.prototype.onAdd.call(this,t)},onRemove:function(t){z(t),t.off("moveend",j),e.TileLayer.prototype.onRemove.call(this,t)},_initPane:function(){if(!this._map.getPane(this.options.pane)){var t=this._map.createPane(this.options.pane);t.style.pointerEvents="none",t.style.zIndex=500}},getAttribution:function(){if(this.options.attribution)var t='<span class="esri-dynamic-attribution">'+this.options.attribution+"</span>";return t}});var ct=e.TileLayer.extend({options:{zoomOffsetAllowance:.1,errorTileUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEABAMAAACuXLVVAAAAA1BMVEUzNDVszlHHAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAAAAAAAAAB6mUWpAAAADZJREFUeJztwQEBAAAAgiD/r25IQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7waBAAABw08RwAAAAABJRU5ErkJggg=="},statics:{MercatorZoomLevels:{0:156543.033928,1:78271.5169639999,2:39135.7584820001,3:19567.8792409999,4:9783.93962049996,5:4891.96981024998,6:2445.98490512499,7:1222.99245256249,8:611.49622628138,9:305.748113140558,10:152.874056570411,11:76.4370282850732,12:38.2185141425366,13:19.1092570712683,14:9.55462853563415,15:4.77731426794937,16:2.38865713397468,17:1.19432856685505,18:.597164283559817,19:.298582141647617,20:.14929107082381,21:.07464553541191,22:.0373227677059525,23:.0186613838529763}},initialize:function(t){t=G(t=e.Util.setOptions(this,t)),this.tileUrl=(t.proxy?t.proxy+"?":"")+t.url+"tile/{z}/{y}/{x}"+(t.requestParams&&Object.keys(t.requestParams).length>0?e.Util.getParamString(t.requestParams):""),-1!==t.url.indexOf("{s}")&&t.subdomains&&(t.url=t.url.replace("{s}",t.subdomains[0])),this.service=rt(t),this.service.addEventParent(this),new RegExp(/tiles.arcgis(online)?\.com/g).test(t.url)&&(this.tileUrl=this.tileUrl.replace("://tiles","://tiles{s}"),t.subdomains=["1","2","3","4"]),this.options.token&&(this.tileUrl+="?token="+this.options.token),e.TileLayer.prototype.initialize.call(this,this.tileUrl,t)},getTileUrl:function(t){var i=this._getZoomForUrl();return e.Util.template(this.tileUrl,e.Util.extend({s:this._getSubdomain(t),x:t.x,y:t.y,z:this._lodMap&&this._lodMap[i]?this._lodMap[i]:i},this.options))},createTile:function(t,i){var s=document.createElement("img");return e.DomEvent.on(s,"load",e.Util.bind(this._tileOnLoad,this,i,s)),e.DomEvent.on(s,"error",e.Util.bind(this._tileOnError,this,i,s)),this.options.crossOrigin&&(s.crossOrigin=""),s.alt="",!this._lodMap||this._lodMap&&this._lodMap[this._getZoomForUrl()]?s.src=this.getTileUrl(t):this.once("lodmap",(function(){s.src=this.getTileUrl(t)}),this),s},onAdd:function(t){B(t),this._lodMap||this.metadata((function(i,s){if(!i&&s.spatialReference){var r=s.spatialReference.latestWkid||s.spatialReference.wkid;if(!this.options.attribution&&t.attributionControl&&s.copyrightText&&(this.options.attribution=s.copyrightText,t.attributionControl.addAttribution(this.getAttribution())),t.options.crs!==e.CRS.EPSG3857||102100!==r&&3857!==r)t.options.crs&&t.options.crs.code&&t.options.crs.code.indexOf(r)>-1||m("L.esri.TiledMapLayer is using a non-mercator spatial reference. Support may be available through Proj4Leaflet http://esri.github.io/esri-leaflet/examples/non-mercator-projection.html");else{this._lodMap={};for(var o=s.tileInfo.lods,n=ct.MercatorZoomLevels,a=0;a<o.length;a++){var l=o[a];for(var u in n){var h=n[u];if(this._withinPercentage(l.resolution,h,this.options.zoomOffsetAllowance)){this._lodMap[u]=l.level;break}}}this.fire("lodmap")}}}),this),e.TileLayer.prototype.onAdd.call(this,t)},onRemove:function(t){z(t)},metadata:function(t,e){return this.service.metadata(t,e),this},identify:function(){return this.service.identify()},find:function(){return this.service.find()},query:function(){return this.service.query()},authenticate:function(t){var e="?token="+t;return this.tileUrl=this.options.token?this.tileUrl.replace(/\?token=(.+)/g,e):this.tileUrl+e,this.options.token=t,this.service.authenticate(t),this},_withinPercentage:function(t,e,i){return Math.abs(t/e-1)<i}});var pt=e.ImageOverlay.extend({onAdd:function(t){this._topLeft=t.getPixelBounds().min,e.ImageOverlay.prototype.onAdd.call(this,t)},_reset:function(){this._map.options.crs===e.CRS.EPSG3857?e.ImageOverlay.prototype._reset.call(this):e.DomUtil.setPosition(this._image,this._topLeft.subtract(this._map.getPixelOrigin()))}}),dt=e.Layer.extend({options:{opacity:1,position:"front",f:"image",useCors:i,attribution:null,interactive:!1,alt:""},onAdd:function(t){B(t),this.options.zIndex&&(this.options.position=null),this._update=e.Util.throttle(this._update,this.options.updateInterval,this),t.on("moveend",this._update,this),this._currentImage&&this._currentImage._bounds.equals(this._map.getBounds())?t.addLayer(this._currentImage):this._currentImage&&(this._map.removeLayer(this._currentImage),this._currentImage=null),this._update(),this._popup&&(this._map.on("click",this._getPopupData,this),this._map.on("dblclick",this._resetPopupState,this)),this.metadata((function(e,i){!e&&!this.options.attribution&&t.attributionControl&&i.copyrightText&&(this.options.attribution=i.copyrightText,t.attributionControl.addAttribution(this.getAttribution()))}),this)},onRemove:function(t){z(t),this._currentImage&&this._map.removeLayer(this._currentImage),this._popup&&(this._map.off("click",this._getPopupData,this),this._map.off("dblclick",this._resetPopupState,this)),this._map.off("moveend",this._update,this)},bindPopup:function(t,i){return this._shouldRenderPopup=!1,this._lastClick=!1,this._popup=e.popup(i),this._popupFunction=t,this._map&&(this._map.on("click",this._getPopupData,this),this._map.on("dblclick",this._resetPopupState,this)),this},unbindPopup:function(){return this._map&&(this._map.closePopup(this._popup),this._map.off("click",this._getPopupData,this),this._map.off("dblclick",this._resetPopupState,this)),this._popup=!1,this},bringToFront:function(){return this.options.position="front",this._currentImage&&(this._currentImage.bringToFront(),this._setAutoZIndex(Math.max)),this},bringToBack:function(){return this.options.position="back",this._currentImage&&(this._currentImage.bringToBack(),this._setAutoZIndex(Math.min)),this},setZIndex:function(t){return this.options.zIndex=t,this._currentImage&&this._currentImage.setZIndex(t),this},_setAutoZIndex:function(t){if(this._currentImage){for(var e,i=this._currentImage.getPane().children,s=-t(-1/0,1/0),r=0,o=i.length;r<o;r++)e=i[r].style.zIndex,i[r]!==this._currentImage._image&&e&&(s=t(s,+e));isFinite(s)&&(this.options.zIndex=s+t(-1,1),this.setZIndex(this.options.zIndex))}},getAttribution:function(){return this.options.attribution},getOpacity:function(){return this.options.opacity},setOpacity:function(t){return this.options.opacity=t,this._currentImage&&this._currentImage.setOpacity(t),this},getTimeRange:function(){return[this.options.from,this.options.to]},setTimeRange:function(t,e){return this.options.from=t,this.options.to=e,this._update(),this},metadata:function(t,e){return this.service.metadata(t,e),this},authenticate:function(t){return this.service.authenticate(t),this},redraw:function(){this._update()},_renderImage:function(t,e,i){if(this._map){if(i&&(t="data:"+i+";base64,"+t),!t)return;var s=new pt(t,e,{opacity:0,crossOrigin:this.options.withCredentials?"use-credentials":this.options.useCors,alt:this.options.alt,pane:this.options.pane||this.getPane(),interactive:this.options.interactive}).addTo(this._map),r=function(t){if(s.off("error",r,this),this._map){var i=t.target,o=this._currentImage;i._bounds.equals(e)&&i._bounds.equals(this._map.getBounds())?(this._currentImage=i,"front"===this.options.position?this.bringToFront():"back"===this.options.position&&this.bringToBack(),this.options.zIndex&&this.setZIndex(this.options.zIndex),this._map&&this._currentImage._map?this._currentImage.setOpacity(this.options.opacity):this._currentImage._map.removeLayer(this._currentImage),o&&this._map&&this._map.removeLayer(o),o&&o._map&&o._map.removeLayer(o)):this._map.removeLayer(i)}this.fire("load",{bounds:e})};s.once("error",(function(){this._map.removeLayer(s),this.fire("error"),s.off("load",r,this)}),this),s.once("load",r,this)}},_update:function(){if(this._map){var t=this._map.getZoom(),i=this._map.getBounds();if(!(this._animatingZoom||this._map._panTransition&&this._map._panTransition._inProgress))if(t>this.options.maxZoom||t<this.options.minZoom)this._currentImage&&(this._currentImage._map.removeLayer(this._currentImage),this._currentImage=null);else{var s=this._buildExportParams();e.Util.extend(s,this.options.requestParams),s?(this._requestExport(s,i),this.fire("loading",{bounds:i})):this._currentImage&&(this._currentImage._map.removeLayer(this._currentImage),this._currentImage=null)}}},_renderPopup:function(t,i,s,r){if(t=e.latLng(t),this._shouldRenderPopup&&this._lastClick.equals(t)){var o=this._popupFunction(i,s,r);o&&this._popup.setLatLng(t).setContent(o).openOn(this._map)}},_resetPopupState:function(t){this._shouldRenderPopup=!1,this._lastClick=t.latlng},_calculateBbox:function(){var t=this._map.getPixelBounds(),i=this._map.unproject(t.getBottomLeft()),s=this._map.unproject(t.getTopRight()),r=this._map.options.crs.project(s),o=this._map.options.crs.project(i),n=e.bounds(r,o);return[n.getBottomLeft().x,n.getBottomLeft().y,n.getTopRight().x,n.getTopRight().y].join(",")},_calculateImageSize:function(){var t=this._map.getPixelBounds(),e=this._map.getSize(),i=this._map.unproject(t.getBottomLeft()),s=this._map.unproject(t.getTopRight()),r=this._map.latLngToLayerPoint(s).y,o=this._map.latLngToLayerPoint(i).y;return(r>0||o<e.y)&&(e.y=o-r),e.x+","+e.y}}),mt=dt.extend({options:{updateInterval:150,format:"jpgpng",transparent:!0,f:"image"},query:function(){return this.service.query()},identify:function(){return this.service.identify()},initialize:function(t){t=G(t),this.service=nt(t),this.service.addEventParent(this),e.Util.setOptions(this,t)},setPixelType:function(t){return this.options.pixelType=t,this._update(),this},getPixelType:function(){return this.options.pixelType},setBandIds:function(t){return e.Util.isArray(t)?this.options.bandIds=t.join(","):this.options.bandIds=t.toString(),this._update(),this},getBandIds:function(){return this.options.bandIds},setNoData:function(t,i){return e.Util.isArray(t)?this.options.noData=t.join(","):this.options.noData=t.toString(),i&&(this.options.noDataInterpretation=i),this._update(),this},getNoData:function(){return this.options.noData},getNoDataInterpretation:function(){return this.options.noDataInterpretation},setRenderingRule:function(t){this.options.renderingRule=t,this._update()},getRenderingRule:function(){return this.options.renderingRule},setMosaicRule:function(t){this.options.mosaicRule=t,this._update()},getMosaicRule:function(){return this.options.mosaicRule},_getPopupData:function(t){var i=e.Util.bind((function(i,s,r){i||setTimeout(e.Util.bind((function(){this._renderPopup(t.latlng,i,s,r)}),this),300)}),this),s=this.identify().at(t.latlng);this.options.mosaicRule&&s.setMosaicRule(this.options.mosaicRule),s.run(i),this._shouldRenderPopup=!0,this._lastClick=t.latlng},_buildExportParams:function(){var t=parseInt(this._map.options.crs.code.split(":")[1],10),e={bbox:this._calculateBbox(),size:this._calculateImageSize(),format:this.options.format,transparent:this.options.transparent,bboxSR:t,imageSR:t};return this.options.from&&this.options.to&&(e.time=this.options.from.valueOf()+","+this.options.to.valueOf()),this.options.pixelType&&(e.pixelType=this.options.pixelType),this.options.interpolation&&(e.interpolation=this.options.interpolation),this.options.compressionQuality&&(e.compressionQuality=this.options.compressionQuality),this.options.bandIds&&(e.bandIds=this.options.bandIds),(0===this.options.noData||this.options.noData)&&(e.noData=this.options.noData),this.options.noDataInterpretation&&(e.noDataInterpretation=this.options.noDataInterpretation),this.service.options.token&&(e.token=this.service.options.token),this.options.renderingRule&&(e.renderingRule=JSON.stringify(this.options.renderingRule)),this.options.mosaicRule&&(e.mosaicRule=JSON.stringify(this.options.mosaicRule)),e},_requestExport:function(t,i){if("json"===this.options.f)this.service.request("exportImage",t,(function(t,e){t||(this.options.token&&(e.href+="?token="+this.options.token),this.options.proxy&&(e.href=this.options.proxy+"?"+e.href),this._renderImage(e.href,i))}),this);else{t.f="image";var s=this.options.url+"exportImage"+e.Util.getParamString(t);this.options.proxy&&(s=this.options.proxy+"?"+s),this._renderImage(s,i)}}});var ft=dt.extend({options:{updateInterval:150,layers:!1,layerDefs:!1,timeOptions:!1,format:"png32",transparent:!0,f:"json"},initialize:function(t){t=G(t),this.service=rt(t),this.service.addEventParent(this),e.Util.setOptions(this,t)},getDynamicLayers:function(){return this.options.dynamicLayers},setDynamicLayers:function(t){return this.options.dynamicLayers=t,this._update(),this},getLayers:function(){return this.options.layers},setLayers:function(t){return this.options.layers=t,this._update(),this},getLayerDefs:function(){return this.options.layerDefs},setLayerDefs:function(t){return this.options.layerDefs=t,this._update(),this},getTimeOptions:function(){return this.options.timeOptions},setTimeOptions:function(t){return this.options.timeOptions=t,this._update(),this},query:function(){return this.service.query()},identify:function(){return this.service.identify()},find:function(){return this.service.find()},_getPopupData:function(t){var i,s=e.Util.bind((function(i,s,r){i||setTimeout(e.Util.bind((function(){this._renderPopup(t.latlng,i,s,r)}),this),300)}),this);if((i=this.options.popup?this.options.popup.on(this._map).at(t.latlng):this.identify().on(this._map).at(t.latlng)).params.maxAllowableOffset||i.simplify(this._map,.5),this.options.popup&&this.options.popup.params&&this.options.popup.params.layers||(this.options.layers?i.layers("visible:"+this.options.layers.join(",")):i.layers("visible")),this.options.layerDefs&&"string"!=typeof this.options.layerDefs&&!i.params.layerDefs)for(var r in this.options.layerDefs)this.options.layerDefs.hasOwnProperty(r)&&i.layerDef(r,this.options.layerDefs[r]);i.run(s),this._shouldRenderPopup=!0,this._lastClick=t.latlng},_buildExportParams:function(){var t=parseInt(this._map.options.crs.code.split(":")[1],10),e={bbox:this._calculateBbox(),size:this._calculateImageSize(),dpi:96,format:this.options.format,transparent:this.options.transparent,bboxSR:t,imageSR:t};if(this.options.dynamicLayers&&(e.dynamicLayers=this.options.dynamicLayers),this.options.layers){if(0===this.options.layers.length)return;e.layers="show:"+this.options.layers.join(",")}return this.options.layerDefs&&(e.layerDefs="string"==typeof this.options.layerDefs?this.options.layerDefs:JSON.stringify(this.options.layerDefs)),this.options.timeOptions&&(e.timeOptions=JSON.stringify(this.options.timeOptions)),this.options.from&&this.options.to&&(e.time=this.options.from.valueOf()+","+this.options.to.valueOf()),this.service.options.token&&(e.token=this.service.options.token),this.options.proxy&&(e.proxy=this.options.proxy),this.options.disableCache&&(e._ts=Date.now()),e},_requestExport:function(t,i){if("json"===this.options.f)this.service.request("export",t,(function(t,e){t||(this.options.token&&e.href&&(e.href+="?token="+this.options.token),this.options.proxy&&e.href&&(e.href=this.options.proxy+"?"+e.href),e.href?this._renderImage(e.href,i):this._renderImage(e.imageData,i,e.contentType))}),this);else{t.f="image";var s=this.options.url+"export"+e.Util.getParamString(t);this.options.proxy&&(s=this.options.proxy+"?"+s),this._renderImage(s,i)}}});var yt=e.Layer.extend({options:{cellSize:512,updateWhenIdle:e.Browser.mobile,updateInterval:150,noWrap:!1,keepBuffer:1.5},initialize:function(t){e.Util.setOptions(this,t)},onAdd:function(t){this._cells={},this._activeCells={},this._resetView(),this._update()},onRemove:function(t){this._removeAllCells(),this._cellZoom=void 0},isLoading:function(){return this._loading},redraw:function(){return this._map&&(this._removeAllCells(),this._update()),this},getEvents:function(){var t={viewprereset:this._invalidateAll,viewreset:this._resetView,zoom:this._resetView,moveend:this._onMoveEnd};return this.options.updateWhenIdle||(this._onMove||(this._onMove=e.Util.throttle(this._onMoveEnd,this.options.updateInterval,this)),t.move=this._onMove),t},createCell:function(){return document.createElement("div")},removeCell:function(){},reuseCell:function(){},cellLeave:function(){},cellEnter:function(){},getCellSize:function(){var t=this.options.cellSize;return t instanceof e.Point?t:new e.Point(t,t)},_pruneCells:function(){if(this._map){var t,e;for(t in this._cells)(e=this._cells[t]).retain=e.current;for(t in this._cells)if((e=this._cells[t]).current&&!e.active){var i=e.coords;this._retainParent(i.x,i.y,i.z,i.z-5)||this._retainChildren(i.x,i.y,i.z,i.z+2)}for(t in this._cells)this._cells[t].retain||this._removeCell(t)}},_removeAllCells:function(){for(var t in this._cells)this._removeCell(t)},_invalidateAll:function(){this._removeAllCells(),this._cellZoom=void 0},_retainParent:function(t,i,s,r){var o=Math.floor(t/2),n=Math.floor(i/2),a=s-1,l=new e.Point(+o,+n);l.z=+a;var u=this._cellCoordsToKey(l),h=this._cells[u];return h&&h.active?(h.retain=!0,!0):(h&&h.loaded&&(h.retain=!0),a>r&&this._retainParent(o,n,a,r))},_retainChildren:function(t,i,s,r){for(var o=2*t;o<2*t+2;o++)for(var n=2*i;n<2*i+2;n++){var a=new e.Point(o,n);a.z=s+1;var l=this._cellCoordsToKey(a),u=this._cells[l];u&&u.active?u.retain=!0:(u&&u.loaded&&(u.retain=!0),s+1<r&&this._retainChildren(o,n,s+1,r))}},_resetView:function(t){var e=t&&(t.pinch||t.flyTo);e||this._setView(this._map.getCenter(),this._map.getZoom(),e,e)},_setView:function(t,e,i,s){var r=Math.round(e);s||(this._cellZoom=r,this._abortLoading&&this._abortLoading(),this._resetGrid(),void 0!==r&&this._update(t),i||this._pruneCells(),this._noPrune=!!i)},_resetGrid:function(){var t=this._map,e=t.options.crs,i=this._cellSize=this.getCellSize(),s=this._cellZoom,r=this._map.getPixelWorldBounds(this._cellZoom);r&&(this._globalCellRange=this._pxBoundsToCellRange(r)),this._wrapX=e.wrapLng&&!this.options.noWrap&&[Math.floor(t.project([0,e.wrapLng[0]],s).x/i.x),Math.ceil(t.project([0,e.wrapLng[1]],s).x/i.y)],this._wrapY=e.wrapLat&&!this.options.noWrap&&[Math.floor(t.project([e.wrapLat[0],0],s).y/i.x),Math.ceil(t.project([e.wrapLat[1],0],s).y/i.y)]},_onMoveEnd:function(t){t&&(t.pinch||t.flyTo)||!this._map||this._map._animatingZoom||this._update()},_getCelldPixelBounds:function(t){var i=this._map,s=i._animatingZoom?Math.max(i._animateToZoom,i.getZoom()):i.getZoom(),r=i.getZoomScale(s,this._cellZoom),o=i.project(t,this._cellZoom).floor(),n=i.getSize().divideBy(2*r);return new e.Bounds(o.subtract(n),o.add(n))},_update:function(t){var i=this._map;if(i){var s=Math.round(i.getZoom());void 0===t&&(t=i.getCenter());var r=this._getCelldPixelBounds(t),o=this._pxBoundsToCellRange(r),n=o.getCenter(),a=[],l=this.options.keepBuffer,u=new e.Bounds(o.getBottomLeft().subtract([l,-l]),o.getTopRight().add([l,-l]));if(!(isFinite(o.min.x)&&isFinite(o.min.y)&&isFinite(o.max.x)&&isFinite(o.max.y)))throw new Error("Attempted to load an infinite number of cells");for(var h in this._cells){var c=this._cells[h].coords;c.z===this._cellZoom&&u.contains(new e.Point(c.x,c.y))||(this._cells[h].current=!1)}if(Math.abs(s-this._cellZoom)>1)this._setView(t,s);else{for(var p=o.min.y;p<=o.max.y;p++)for(var d=o.min.x;d<=o.max.x;d++){var m=new e.Point(d,p);if(m.z=this._cellZoom,this._isValidCell(m)){var f=this._cells[this._cellCoordsToKey(m)];f?f.current=!0:a.push(m)}}if(a.sort((function(t,e){return t.distanceTo(n)-e.distanceTo(n)})),0!==a.length)for(this._loading||(this._loading=!0),d=0;d<a.length;d++){var y=this._cellCoordsToKey(a[d]),g=this._keyToCellCoords(y);this._activeCells[g]?this._reuseCell(a[d]):this._createCell(a[d])}}}},_isValidCell:function(t){var i=this._map.options.crs;if(!i.infinite){var s=this._globalCellRange;if(!i.wrapLng&&(t.x<s.min.x||t.x>s.max.x)||!i.wrapLat&&(t.y<s.min.y||t.y>s.max.y))return!1}if(!this.options.bounds)return!0;var r=this._cellCoordsToBounds(t);return e.toLatLngBounds(this.options.bounds).overlaps(r)},_keyToBounds:function(t){return this._cellCoordsToBounds(this._keyToCellCoords(t))},_cellCoordsToNwSe:function(t){var e=this._map,i=this.getCellSize(),s=t.scaleBy(i),r=s.add(i);return[e.unproject(s,t.z),e.unproject(r,t.z)]},_cellCoordsToBounds:function(t){var i=this._cellCoordsToNwSe(t),s=new e.LatLngBounds(i[0],i[1]);return this.options.noWrap||(s=this._map.wrapLatLngBounds(s)),s},_cellCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToCellCoords:function(t){var i=t.split(":"),s=new e.Point(+i[0],+i[1]);return s.z=+i[2],s},_removeCell:function(t){var e=this._cells[t];if(e){var i=this._keyToCellCoords(t),s=this._wrapCoords(i),r=this._cellCoordsToBounds(this._wrapCoords(i));e.current=!1,delete this._cells[t],this._activeCells[t]=e,this.cellLeave(r,s,t),this.fire("cellleave",{key:t,coords:s,bounds:r})}},_reuseCell:function(t){var e=this._cellCoordsToKey(t);this._cells[e]=this._activeCells[e],this._cells[e].current=!0;var i=this._wrapCoords(t),s=this._cellCoordsToBounds(this._wrapCoords(t));this.cellEnter(s,i,e),this.fire("cellenter",{key:e,coords:i,bounds:s})},_createCell:function(t){var i=this._cellCoordsToKey(t),s=this._wrapCoords(t),r=this._cellCoordsToBounds(this._wrapCoords(t));this.createCell(r,s,i),this.fire("cellcreate",{key:i,coords:s,bounds:r}),this._cells[i]={coords:t,current:!0},e.Util.requestAnimFrame(this._pruneCells,this)},_cellReady:function(t,e,i){var s=this._cellCoordsToKey(t);(i=this._cells[s])&&(i.loaded=+new Date,i.active=!0)},_getCellPos:function(t){return t.scaleBy(this.getCellSize())},_wrapCoords:function(t){var i=new e.Point(this._wrapX?e.Util.wrapNum(t.x,this._wrapX):t.x,this._wrapY?e.Util.wrapNum(t.y,this._wrapY):t.y);return i.z=t.z,i},_pxBoundsToCellRange:function(t){var i=this.getCellSize();return new e.Bounds(t.min.unscaleBy(i).floor(),t.max.unscaleBy(i).ceil().subtract([1,1]))}});function gt(t){this.values=[].concat(t||[])}gt.prototype.query=function(t){var e=this.getIndex(t);return this.values[e]},gt.prototype.getIndex=function(t){this.dirty&&this.sort();for(var e,i,s=0,r=this.values.length-1;s<=r;)if(e=(s+r)/2|0,+(i=this.values[Math.round(e)]).value<+t)s=e+1;else{if(!(+i.value>+t))return e;r=e-1}return Math.abs(~r)},gt.prototype.between=function(t,e){var i=this.getIndex(t),s=this.getIndex(e);if(0===i&&0===s)return[];for(;this.values[i-1]&&this.values[i-1].value===t;)i--;for(;this.values[s+1]&&this.values[s+1].value===e;)s++;return this.values[s]&&this.values[s].value===e&&this.values[s+1]&&s++,this.values.slice(i,s)},gt.prototype.insert=function(t){return this.values.splice(this.getIndex(t.value),0,t),this},gt.prototype.bulkAdd=function(t,e){return this.values=this.values.concat([].concat(t||[])),e?this.sort():this.dirty=!0,this},gt.prototype.sort=function(){return this.values.sort((function(t,e){return+e.value-+t.value})).reverse(),this.dirty=!1,this};var _t=yt.extend({options:{attribution:null,where:"1=1",fields:["*"],from:!1,to:!1,timeField:!1,timeFilterMode:"server",simplifyFactor:0,precision:6,fetchAllFeatures:!1},initialize:function(t){if(yt.prototype.initialize.call(this,t),t=G(t),t=e.Util.setOptions(this,t),this.service=lt(t),this.service.addEventParent(this),"*"!==this.options.fields[0]){for(var i=!1,s=0;s<this.options.fields.length;s++)this.options.fields[s].match(/^(OBJECTID|FID|OID|ID)$/i)&&(i=!0);!1===i&&m("no known esriFieldTypeOID field detected in fields Array.  Please add an attribute field containing unique IDs to ensure the layer can be drawn correctly.")}this.options.timeField.start&&this.options.timeField.end?(this._startTimeIndex=new gt,this._endTimeIndex=new gt):this.options.timeField&&(this._timeIndex=new gt),this._cache={},this._currentSnapshot=[],this._activeRequests=0},onAdd:function(t){return B(t),this.service.metadata((function(e,i){if(!e){var s=i.supportedQueryFormats,r=!1;(!1===this.service.options.isModern||this.options.fetchAllFeatures)&&(r=!0),!r&&s&&-1!==s.indexOf("geoJSON")&&(this.service.options.isModern=!0),i.objectIdField&&(this.service.options.idAttribute=i.objectIdField),!this.options.attribution&&t.attributionControl&&i.copyrightText&&(this.options.attribution=i.copyrightText,t.attributionControl.addAttribution(this.getAttribution()))}}),this),t.on("zoomend",this._handleZoomChange,this),yt.prototype.onAdd.call(this,t)},onRemove:function(t){return z(t),t.off("zoomend",this._handleZoomChange,this),yt.prototype.onRemove.call(this,t)},getAttribution:function(){return this.options.attribution},createCell:function(t,e){this._visibleZoom()&&this._requestFeatures(t,e)},_requestFeatures:function(t,i,s,r){this._activeRequests++,r=r||0;var o=this.options.where;return 1===this._activeRequests&&this.fire("loading",{bounds:t},!0),this._buildQuery(t,r).run((function(n,a,l){l&&l.exceededTransferLimit&&this.fire("drawlimitexceeded"),this.options.where===o&&(!n&&a&&a.features.length&&e.Util.requestAnimFrame(e.Util.bind((function(){this._addFeatures(a.features,i),this._postProcessFeatures(t)}),this)),n||!a||a.features.length||this._postProcessFeatures(t),n&&this._postProcessFeatures(t),s&&s.call(this,n,a),l&&(l.exceededTransferLimit||l.properties&&l.properties.exceededTransferLimit)&&this.options.fetchAllFeatures&&this._requestFeatures(t,i,s,r+a.features.length))}),this)},_postProcessFeatures:function(t){this._activeRequests--,this._activeRequests<=0&&this.fire("load",{bounds:t})},_cacheKey:function(t){return t.z+":"+t.x+":"+t.y},_addFeatures:function(t,e){if(e){var i=this._cacheKey(e);this._cache[i]=this._cache[i]||[]}for(var s=t.length-1;s>=0;s--){var r=t[s].id;-1===this._currentSnapshot.indexOf(r)&&this._currentSnapshot.push(r),void 0!==i&&-1===this._cache[i].indexOf(r)&&this._cache[i].push(r)}this.options.timeField&&this._buildTimeIndexes(t),this.createLayers(t)},_buildQuery:function(t,i){var s=this.service.query().intersects(t).where(this.options.where).fields(this.options.fields).precision(this.options.precision);return this.options.fetchAllFeatures&&!isNaN(parseInt(i))&&(s=s.offset(i)),s.params.resultType="tile",this.options.requestParams&&e.Util.extend(s.params,this.options.requestParams),this.options.simplifyFactor&&s.simplify(this._map,this.options.simplifyFactor),"server"===this.options.timeFilterMode&&this.options.from&&this.options.to&&s.between(this.options.from,this.options.to),s},setWhere:function(t,i,s){this.options.where=t&&t.length?t:"1=1";for(var r=[],o=[],n=0,a=null,l=e.Util.bind((function(l,u){if(l&&(a=l),u)for(var h=u.features.length-1;h>=0;h--)o.push(u.features[h].id);--n<=0&&this._visibleZoom()&&t===this.options.where&&(this._currentSnapshot=o,e.Util.requestAnimFrame(e.Util.bind((function(){this.removeLayers(r),this.addLayers(o),i&&i.call(s,a)}),this)))}),this),u=this._currentSnapshot.length-1;u>=0;u--)r.push(this._currentSnapshot[u]);for(var h in this._cache={},this._cells){n++;var c=this._keyToCellCoords(h),p=this._cellCoordsToBounds(c);this._requestFeatures(p,c,l)}return this},getWhere:function(){return this.options.where},getTimeRange:function(){return[this.options.from,this.options.to]},setTimeRange:function(t,i,s,r){var o=this.options.from,n=this.options.to,a=0,l=null,u=e.Util.bind((function(e){e&&(l=e),this._filterExistingFeatures(o,n,t,i),a--,s&&a<=0&&s.call(r,l)}),this);if(this.options.from=t,this.options.to=i,this._filterExistingFeatures(o,n,t,i),"server"===this.options.timeFilterMode)for(var h in this._cells){a++;var c=this._keyToCellCoords(h),p=this._cellCoordsToBounds(c);this._requestFeatures(p,c,u)}return this},refresh:function(){this.setWhere(this.options.where)},_filterExistingFeatures:function(t,i,s,r){var o=t&&i?this._getFeaturesInTimeRange(t,i):this._currentSnapshot,n=this._getFeaturesInTimeRange(s,r);if(n.indexOf)for(var a=0;a<n.length;a++){var l=o.indexOf(n[a]);l>=0&&o.splice(l,1)}e.Util.requestAnimFrame(e.Util.bind((function(){this.removeLayers(o),this.addLayers(n)}),this))},_getFeaturesInTimeRange:function(t,e){var i,s=[];if(this.options.timeField.start&&this.options.timeField.end){var r=this._startTimeIndex.between(t,e),o=this._endTimeIndex.between(t,e);i=r.concat(o)}else{if(!this._timeIndex)return m("You must set timeField in the layer constructor in order to manipulate the start and end time filter."),[];i=this._timeIndex.between(t,e)}for(var n=i.length-1;n>=0;n--)s.push(i[n].id);return s},_buildTimeIndexes:function(t){var e,i;if(this.options.timeField.start&&this.options.timeField.end){var s=[],r=[];for(e=t.length-1;e>=0;e--)i=t[e],s.push({id:i.id,value:new Date(i.properties[this.options.timeField.start])}),r.push({id:i.id,value:new Date(i.properties[this.options.timeField.end])});this._startTimeIndex.bulkAdd(s),this._endTimeIndex.bulkAdd(r)}else{var o=[];for(e=t.length-1;e>=0;e--)i=t[e],o.push({id:i.id,value:new Date(i.properties[this.options.timeField])});this._timeIndex.bulkAdd(o)}},_featureWithinTimeRange:function(t){if(!this.options.from||!this.options.to)return!0;var e=+this.options.from.valueOf(),i=+this.options.to.valueOf();if("string"==typeof this.options.timeField){var s=+t.properties[this.options.timeField];return s>=e&&s<=i}if(this.options.timeField.start&&this.options.timeField.end){var r=+t.properties[this.options.timeField.start],o=+t.properties[this.options.timeField.end];return r>=e&&r<=i||o>=e&&o<=i||r<=e&&o>=i}},_visibleZoom:function(){if(!this._map)return!1;var t=this._map.getZoom();return!(t>this.options.maxZoom||t<this.options.minZoom)},_handleZoomChange:function(){if(this._visibleZoom())for(var t in this._cells){var e=this._cells[t].coords,i=this._cacheKey(e);this._cache[i]&&this.addLayers(this._cache[i])}else this.removeLayers(this._currentSnapshot)},authenticate:function(t){return this.service.authenticate(t),this},metadata:function(t,e){return this.service.metadata(t,e),this},query:function(){return this.service.query()},_getMetadata:function(t){this._metadata?t(void 0,this._metadata):this.metadata(e.Util.bind((function(e,i){this._metadata=i,t(e,this._metadata)}),this))},addFeature:function(t,e,i){this.addFeatures(t,e,i)},addFeatures:function(t,i,s){this._getMetadata(e.Util.bind((function(r,o){if(r)i&&i.call(this,r,null);else{var n=t.features?t.features:[t];this.service.addFeatures(t,e.Util.bind((function(t,e){if(!t){for(var r=n.length-1;r>=0;r--)n[r].properties[o.objectIdField]=n.length>1?e[r].objectId:e.objectId,n[r].id=n.length>1?e[r].objectId:e.objectId;this._addFeatures(n)}i&&i.call(s,t,e)}),this))}}),this))},updateFeature:function(t,e,i){this.updateFeatures(t,e,i)},updateFeatures:function(t,e,i){var s=t.features?t.features:[t];this.service.updateFeatures(t,(function(t,r){if(!t){for(var o=s.length-1;o>=0;o--)this.removeLayers([s[o].id],!0);this._addFeatures(s)}e&&e.call(i,t,r)}),this)},deleteFeature:function(t,e,i){this.deleteFeatures(t,e,i)},deleteFeatures:function(t,e,i){return this.service.deleteFeatures(t,(function(t,s){var r=s.length?s:[s];if(!t&&r.length>0)for(var o=r.length-1;o>=0;o--)this.removeLayers([r[o].objectId],!0);e&&e.call(i,t,s)}),this)}}),vt=_t.extend({options:{cacheLayers:!0},initialize:function(t){_t.prototype.initialize.call(this,t),this._originalStyle=this.options.style,this._layers={}},onRemove:function(t){for(var e in this._layers)t.removeLayer(this._layers[e]),this.fire("removefeature",{feature:this._layers[e].feature,permanent:!1},!0);return _t.prototype.onRemove.call(this,t)},createNewLayer:function(t){var i=e.GeoJSON.geometryToLayer(t,this.options);return i&&(i.defaultOptions=i.options),i},_updateLayer:function(t,i){var s=[],r=this.options.coordsToLatLng||e.GeoJSON.coordsToLatLng;switch(i.properties&&(t.feature.properties=i.properties),i.geometry.type){case"Point":s=e.GeoJSON.coordsToLatLng(i.geometry.coordinates),t.setLatLng(s);break;case"LineString":s=e.GeoJSON.coordsToLatLngs(i.geometry.coordinates,0,r),t.setLatLngs(s);break;case"MultiLineString":case"Polygon":s=e.GeoJSON.coordsToLatLngs(i.geometry.coordinates,1,r),t.setLatLngs(s);break;case"MultiPolygon":s=e.GeoJSON.coordsToLatLngs(i.geometry.coordinates,2,r),t.setLatLngs(s)}},createLayers:function(t){for(var e=t.length-1;e>=0;e--){var i,s=t[e],r=this._layers[s.id];!this._visibleZoom()||!r||this._map.hasLayer(r)||this.options.timeField&&!this._featureWithinTimeRange(s)||(this._map.addLayer(r),this.fire("addfeature",{feature:r.feature},!0)),r&&this.options.simplifyFactor>0&&(r.setLatLngs||r.setLatLng)&&this._updateLayer(r,s),r||((i=this.createNewLayer(s))?(i.feature=s,i.addEventParent(this),this.options.onEachFeature&&this.options.onEachFeature(i.feature,i),this._layers[i.feature.id]=i,this.setFeatureStyle(i.feature.id,this.options.style),this.fire("createfeature",{feature:i.feature},!0),this._visibleZoom()&&(!this.options.timeField||this.options.timeField&&this._featureWithinTimeRange(s))&&this._map.addLayer(i)):m("invalid GeoJSON encountered"))}},addLayers:function(t){for(var e=t.length-1;e>=0;e--){var i=this._layers[t[e]];!i||this.options.timeField&&!this._featureWithinTimeRange(i.feature)||this._map.addLayer(i)}},removeLayers:function(t,e){for(var i=t.length-1;i>=0;i--){var s=t[i],r=this._layers[s];r&&(this.fire("removefeature",{feature:r.feature,permanent:e},!0),this._map.removeLayer(r)),r&&e&&delete this._layers[s]}},cellEnter:function(t,i){this._visibleZoom()&&!this._zooming&&this._map&&e.Util.requestAnimFrame(e.Util.bind((function(){var t=this._cacheKey(i),e=this._cellCoordsToKey(i),s=this._cache[t];this._activeCells[e]&&s&&this.addLayers(s)}),this))},cellLeave:function(t,i){this._zooming||e.Util.requestAnimFrame(e.Util.bind((function(){if(this._map){var t=this._cacheKey(i),e=this._cellCoordsToKey(i),s=this._cache[t],r=this._map.getBounds();if(!this._activeCells[e]&&s){for(var o=!0,n=0;n<s.length;n++){var a=this._layers[s[n]];a&&a.getBounds&&r.intersects(a.getBounds())&&(o=!1)}o&&this.removeLayers(s,!this.options.cacheLayers),!this.options.cacheLayers&&o&&(delete this._cache[t],delete this._cells[e],delete this._activeCells[e])}}}),this))},resetStyle:function(){return this.options.style=this._originalStyle,this.eachFeature((function(t){this.resetFeatureStyle(t.feature.id)}),this),this},setStyle:function(t){return this.options.style=t,this.eachFeature((function(e){this.setFeatureStyle(e.feature.id,t)}),this),this},resetFeatureStyle:function(t){var i=this._layers[t],s=this._originalStyle||e.Path.prototype.options;return i&&(e.Util.extend(i.options,i.defaultOptions),this.setFeatureStyle(t,s)),this},setFeatureStyle:function(t,e){var i=this._layers[t];return"function"==typeof e&&(e=e(i.feature)),i.setStyle&&i.setStyle(e),this},eachActiveFeature:function(t,e){if(this._map){var i=this._map.getBounds();for(var s in this._layers)-1!==this._currentSnapshot.indexOf(this._layers[s].feature.id)&&("function"==typeof this._layers[s].getLatLng&&i.contains(this._layers[s].getLatLng())?t.call(e,this._layers[s]):"function"==typeof this._layers[s].getBounds&&i.intersects(this._layers[s].getBounds())&&t.call(e,this._layers[s]))}return this},eachFeature:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getFeature:function(t){return this._layers[t]},bringToBack:function(){this.eachFeature((function(t){t.bringToBack&&t.bringToBack()}))},bringToFront:function(){this.eachFeature((function(t){t.bringToFront&&t.bringToFront()}))},redraw:function(t){return t&&this._redraw(t),this},_redraw:function(t){var i=this._layers[t],s=i.feature;if(i&&i.setIcon&&this.options.pointToLayer&&this.options.pointToLayer){var r=this.options.pointToLayer(s,e.latLng(s.geometry.coordinates[1],s.geometry.coordinates[0])).options.icon;i.setIcon(r)}if(i&&i.setStyle&&this.options.pointToLayer){var o=this.options.pointToLayer(s,e.latLng(s.geometry.coordinates[1],s.geometry.coordinates[0])).options;this.setFeatureStyle(s.id,o)}i&&i.setStyle&&this.options.style&&this.resetStyle(s.id)}});t.BasemapLayer=ht,t.DynamicMapLayer=ft,t.FeatureLayer=vt,t.FeatureLayerService=at,t.FeatureManager=_t,t.Find=K,t.Identify=X,t.IdentifyFeatures=Y,t.IdentifyImage=tt,t.ImageMapLayer=mt,t.ImageService=ot,t.MapService=st,t.Query=V,t.RasterLayer=dt,t.Service=it,t.Support=r,t.Task=J,t.TiledMapLayer=ct,t.Util=W,t.VERSION="2.5.3",t.basemapLayer=function(t,e){return new ht(t,e)},t.dynamicMapLayer=function(t,e){return new ft(t,e)},t.featureLayer=function(t){return new vt(t)},t.featureLayerService=lt,t.find=H,t.get=d,t.identify=function(t){return new X(t)},t.identifyFeatures=$,t.identifyImage=et,t.imageMapLayer=function(t,e){return new mt(t,e)},t.imageService=nt,t.mapService=rt,t.options=o,t.post=u,t.query=Q,t.request=c,t.service=function(t){return t=G(t),new it(t)},t.task=function(t){return t=G(t),new J(t)},t.tiledMapLayer=function(t,e){return new ct(t,e)},Object.defineProperty(t,"__esModule",{value:!0})}));
--- a/src/pyams_gis/resources/js/leaflet-esri-cluster-2.0.0.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,185 +0,0 @@
-/* esri-leaflet-cluster - v2.0.0 - Thu Aug 18 2016 17:12:43 GMT-0700 (PDT)
- * Copyright (c) 2016 Environmental Systems Research Institute, Inc.
- * Apache-2.0 */
-(function (global, factory) {
-	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('esri-leaflet')) :
-	typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'esri-leaflet'], factory) :
-	(factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.Cluster = global.L.esri.Cluster || {}),global.L,global.L.esri));
-}(this, function (exports,L,esriLeaflet) { 'use strict';
-
-	L = 'default' in L ? L['default'] : L;
-
-	var version = "2.0.0";
-
-	var FeatureLayer = esriLeaflet.FeatureManager.extend({
-
-	  statics: {
-	    EVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose',
-	    CLUSTEREVENTS: 'clusterclick clusterdblclick clustermouseover clustermouseout clustermousemove clustercontextmenu'
-	  },
-
-	  /**
-	   * Constructor
-	   */
-
-	  initialize: function (options) {
-	    esriLeaflet.FeatureManager.prototype.initialize.call(this, options);
-
-	    options = L.setOptions(this, options);
-
-	    this._layers = {};
-	    this._leafletIds = {};
-
-	    this.cluster = L.markerClusterGroup(options);
-	    this._key = 'c' + (Math.random() * 1e9).toString(36).replace('.', '_');
-
-	    this.cluster.addEventParent(this);
-	  },
-
-	  /**
-	   * Layer Interface
-	   */
-
-	  onAdd: function (map) {
-	    esriLeaflet.FeatureManager.prototype.onAdd.call(this, map);
-	    this._map.addLayer(this.cluster);
-	  },
-
-	  onRemove: function (map) {
-	    esriLeaflet.FeatureManager.prototype.onRemove.call(this, map);
-	    this._map.removeLayer(this.cluster);
-	  },
-
-	  /**
-	   * Feature Management Methods
-	   */
-
-	  createLayers: function (features) {
-	    var markers = [];
-
-	    for (var i = features.length - 1; i >= 0; i--) {
-	      var geojson = features[i];
-	      var layer = this._layers[geojson.id];
-
-	      if (!layer) {
-	        var newLayer = L.GeoJSON.geometryToLayer(geojson, this.options);
-	        newLayer.feature = L.GeoJSON.asFeature(geojson);
-	        newLayer.defaultOptions = newLayer.options;
-	        newLayer._leaflet_id = this._key + '_' + geojson.id;
-
-	        this.resetStyle(newLayer.feature.id);
-
-	        // cache the layer
-	        this._layers[newLayer.feature.id] = newLayer;
-
-	        this._leafletIds[newLayer._leaflet_id] = geojson.id;
-
-	        if (this.options.onEachFeature) {
-	          this.options.onEachFeature(newLayer.feature, newLayer);
-	        }
-
-	        this.fire('createfeature', {
-	          feature: newLayer.feature
-	        });
-
-	        // add the layer if it is within the time bounds or our layer is not time enabled
-	        if (!this.options.timeField || (this.options.timeField && this._featureWithinTimeRange(geojson))) {
-	          markers.push(newLayer);
-	        }
-	      }
-	    }
-
-	    if (markers.length) {
-	      this.cluster.addLayers(markers);
-	    }
-	  },
-
-	  addLayers: function (ids) {
-	    var layersToAdd = [];
-	    for (var i = ids.length - 1; i >= 0; i--) {
-	      var layer = this._layers[ids[i]];
-	      this.fire('addfeature', {
-	        feature: layer.feature
-	      });
-	      layersToAdd.push(layer);
-	    }
-	    this.cluster.addLayers(layersToAdd);
-	  },
-
-	  removeLayers: function (ids, permanent) {
-	    var layersToRemove = [];
-	    for (var i = ids.length - 1; i >= 0; i--) {
-	      var id = ids[i];
-	      var layer = this._layers[id];
-	      this.fire('removefeature', {
-	        feature: layer.feature,
-	        permanent: permanent
-	      });
-	      layersToRemove.push(layer);
-	      if (this._layers[id] && permanent) {
-	        delete this._layers[id];
-	      }
-	    }
-	    this.cluster.removeLayers(layersToRemove);
-	  },
-
-	  /**
-	   * Styling Methods
-	   */
-
-	  resetStyle: function (id) {
-	    var layer = this._layers[id];
-
-	    if (layer) {
-	      layer.options = layer.defaultOptions;
-	      this.setFeatureStyle(layer.feature.id, this.options.style);
-	    }
-
-	    return this;
-	  },
-
-	  setStyle: function (style) {
-	    this.eachFeature(function (layer) {
-	      this.setFeatureStyle(layer.feature.id, style);
-	    }, this);
-	    return this;
-	  },
-
-	  setFeatureStyle: function (id, style) {
-	    var layer = this._layers[id];
-
-	    if (typeof style === 'function') {
-	      style = style(layer.feature);
-	    }
-	    if (layer.setStyle) {
-	      layer.setStyle(style);
-	    }
-	  },
-
-	  /**
-	   * Utility Methods
-	   */
-
-	  eachFeature: function (fn, context) {
-	    for (var i in this._layers) {
-	      fn.call(context, this._layers[i]);
-	    }
-	    return this;
-	  },
-
-	  getFeature: function (id) {
-	    return this._layers[id];
-	  }
-	});
-
-	function featureLayer (options) {
-	  return new FeatureLayer(options);
-	}
-
-	exports.FeatureLayer = FeatureLayer;
-	exports.featureLayer = featureLayer;
-	exports['default'] = featureLayer;
-	exports.VERSION = version;
-
-}));
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWNsdXN0ZXItZGVidWcuanMiLCJzb3VyY2VzIjpbIi4uL3BhY2thZ2UuanNvbiIsIi4uL3NyYy9DbHVzdGVyZWRGZWF0dXJlTGF5ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXQtY2x1c3RlclwiLFxuICBcImRlc2NyaXB0aW9uXCI6IFwiRXNyaSBMZWFmbGV0IHBsdWdpbiBmb3IgdmlzdWFsaXppbmcgRmVhdHVyZSBMYXllcnMgYXMgY2x1c3RlcnMgd2l0aCBMLm1hcmtlcmNsdXN0ZXIuXCIsXG4gIFwidmVyc2lvblwiOiBcIjIuMC4wXCIsXG4gIFwiYXV0aG9yXCI6IFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCIsXG4gIFwiY29udHJpYnV0b3JzXCI6IFtcbiAgICBcIlBhdHJpY2sgQXJsdCA8cGFybHRAZXNyaS5jb20+IChodHRwOi8vcGF0cmlja2FybHQuY29tKVwiLFxuICAgIFwiSm9obiBHcmF2b2lzIDxqZ3Jhdm9pc0Blc3JpLmNvbT4gKGh0dHA6Ly9qb2huZ3Jhdm9pcy5jb20pXCJcbiAgXSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4wXCIsXG4gICAgXCJsZWFmbGV0XCI6IFwiXjEuMC4wLXJjLjNcIixcbiAgICBcImxlYWZsZXQubWFya2VyY2x1c3RlclwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vTGVhZmxldC9MZWFmbGV0Lm1hcmtlcmNsdXN0ZXIuZ2l0I3YxLjAuMC1yYy4xXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiY2hhaVwiOiBcIjIuMy4wXCIsXG4gICAgXCJnaC1yZWxlYXNlXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJodHRwLXNlcnZlclwiOiBcIl4wLjguNVwiLFxuICAgIFwiaXNwYXJ0YVwiOiBcIl4zLjAuM1wiLFxuICAgIFwiaXN0YW5idWxcIjogXCJeMC40LjJcIixcbiAgICBcImthcm1hXCI6IFwiXjAuMTIuMjRcIixcbiAgICBcImthcm1hLWNoYWktc2lub25cIjogXCJeMC4xLjNcIixcbiAgICBcImthcm1hLWNvdmVyYWdlXCI6IFwiXjAuNS4zXCIsXG4gICAgXCJrYXJtYS1tb2NoYVwiOiBcIl4wLjEuMFwiLFxuICAgIFwia2FybWEtbW9jaGEtcmVwb3J0ZXJcIjogXCJeMC4yLjVcIixcbiAgICBcImthcm1hLXBoYW50b21qcy1sYXVuY2hlclwiOiBcIl4wLjEuNFwiLFxuICAgIFwia2FybWEtc291cmNlbWFwLWxvYWRlclwiOiBcIl4wLjMuNVwiLFxuICAgIFwibWtkaXJwXCI6IFwiXjAuNS4xXCIsXG4gICAgXCJub2RlLXNhc3NcIjogXCJeMy4yLjBcIixcbiAgICBcInBoYW50b21qc1wiOiBcIl4xLjkuMTdcIixcbiAgICBcInJvbGx1cFwiOiBcIl4wLjI1LjRcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tanNvblwiOiBcIl4yLjAuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1ub2RlLXJlc29sdmVcIjogXCJeMS40LjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tdWdsaWZ5XCI6IFwiXjAuMy4xXCIsXG4gICAgXCJzZW1pc3RhbmRhcmRcIjogXCJeNy4wLjRcIixcbiAgICBcInNpbm9uXCI6IFwiXjEuMTEuMVwiLFxuICAgIFwic2lub24tY2hhaVwiOiBcIjIuNy4wXCIsXG4gICAgXCJzbmF6enlcIjogXCJeMi4wLjFcIixcbiAgICBcIndhdGNoXCI6IFwiXjAuMTcuMVwiXG4gIH0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vRXNyaS9lc3JpLWxlYWZsZXQtY2x1c3RlclwiLFxuICBcImpzbmV4dDptYWluXCI6IFwic3JjL0NsdXN0ZXJlZEZlYXR1cmVMYXllci5qc1wiLFxuICBcImpzcG1cIjoge1xuICAgIFwicmVnaXN0cnlcIjogXCJucG1cIixcbiAgICBcImZvcm1hdFwiOiBcImVzNlwiLFxuICAgIFwibWFpblwiOiBcInNyYy9DbHVzdGVyZWRGZWF0dXJlTGF5ZXIuanNcIlxuICB9LFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImFyY2dpc1wiLFxuICAgIFwiZXNyaVwiLFxuICAgIFwiZXNyaSBsZWFmbGV0XCIsXG4gICAgXCJnaXNcIixcbiAgICBcImxlYWZsZXQgcGx1Z2luXCIsXG4gICAgXCJtYXBwaW5nXCJcbiAgXSxcbiAgXCJsaWNlbnNlXCI6IFwiQXBhY2hlLTIuMFwiLFxuICBcIm1haW5cIjogXCJkaXN0L2VzcmktbGVhZmxldC1jbHVzdGVyLWRlYnVnLmpzXCIsXG4gIFwicmVhZG1lRmlsZW5hbWVcIjogXCJSRUFETUUubWRcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vRXNyaS9lc3JpLWxlYWZsZXQtY2x1c3Rlci5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwicHJlYnVpbGRcIjogXCJta2RpcnAgZGlzdFwiLFxuICAgIFwiYnVpbGRcIjogXCJyb2xsdXAgLWMgcHJvZmlsZXMvZGVidWcuanMgJiByb2xsdXAgLWMgcHJvZmlsZXMvcHJvZHVjdGlvbi5qc1wiLFxuICAgIFwibGludFwiOiBcInNlbWlzdGFuZGFyZCBzcmMvKi5qcyB8IHNuYXp6eVwiLFxuICAgIFwicHJlcHVibGlzaFwiOiBcIm5wbSBydW4gYnVpbGRcIixcbiAgICBcInByZXRlc3RcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJyZWxlYXNlXCI6IFwiLi9zY3JpcHRzL3JlbGVhc2Uuc2hcIixcbiAgICBcInN0YXJ0XCI6IFwid2F0Y2ggJ25wbSBydW4gYnVpbGQnIHNyYyAmIGh0dHAtc2VydmVyIC1wIDU2NzggLWMtMSAtb1wiLFxuICAgIFwidGVzdFwiOiBcIm5wbSBydW4gbGludCAmJiBrYXJtYSBzdGFydFwiXG4gIH1cbn0iLCJleHBvcnQge3ZlcnNpb24gYXMgVkVSU0lPTn0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcblxuaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBGZWF0dXJlTWFuYWdlciB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5cbmV4cG9ydCB2YXIgRmVhdHVyZUxheWVyID0gRmVhdHVyZU1hbmFnZXIuZXh0ZW5kKHtcblxuICBzdGF0aWNzOiB7XG4gICAgRVZFTlRTOiAnY2xpY2sgZGJsY2xpY2sgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlbW92ZSBjb250ZXh0bWVudSBwb3B1cG9wZW4gcG9wdXBjbG9zZScsXG4gICAgQ0xVU1RFUkVWRU5UUzogJ2NsdXN0ZXJjbGljayBjbHVzdGVyZGJsY2xpY2sgY2x1c3Rlcm1vdXNlb3ZlciBjbHVzdGVybW91c2VvdXQgY2x1c3Rlcm1vdXNlbW92ZSBjbHVzdGVyY29udGV4dG1lbnUnXG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgRmVhdHVyZU1hbmFnZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICAgIG9wdGlvbnMgPSBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG5cbiAgICB0aGlzLl9sYXllcnMgPSB7fTtcbiAgICB0aGlzLl9sZWFmbGV0SWRzID0ge307XG5cbiAgICB0aGlzLmNsdXN0ZXIgPSBMLm1hcmtlckNsdXN0ZXJHcm91cChvcHRpb25zKTtcbiAgICB0aGlzLl9rZXkgPSAnYycgKyAoTWF0aC5yYW5kb20oKSAqIDFlOSkudG9TdHJpbmcoMzYpLnJlcGxhY2UoJy4nLCAnXycpO1xuXG4gICAgdGhpcy5jbHVzdGVyLmFkZEV2ZW50UGFyZW50KHRoaXMpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBMYXllciBJbnRlcmZhY2VcbiAgICovXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApO1xuICAgIHRoaXMuX21hcC5hZGRMYXllcih0aGlzLmNsdXN0ZXIpO1xuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgRmVhdHVyZU1hbmFnZXIucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcywgbWFwKTtcbiAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5jbHVzdGVyKTtcbiAgfSxcblxuICAvKipcbiAgICogRmVhdHVyZSBNYW5hZ2VtZW50IE1ldGhvZHNcbiAgICovXG5cbiAgY3JlYXRlTGF5ZXJzOiBmdW5jdGlvbiAoZmVhdHVyZXMpIHtcbiAgICB2YXIgbWFya2VycyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IGZlYXR1cmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZ2VvanNvbiA9IGZlYXR1cmVzW2ldO1xuICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2dlb2pzb24uaWRdO1xuXG4gICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgIHZhciBuZXdMYXllciA9IEwuR2VvSlNPTi5nZW9tZXRyeVRvTGF5ZXIoZ2VvanNvbiwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgbmV3TGF5ZXIuZmVhdHVyZSA9IEwuR2VvSlNPTi5hc0ZlYXR1cmUoZ2VvanNvbik7XG4gICAgICAgIG5ld0xheWVyLmRlZmF1bHRPcHRpb25zID0gbmV3TGF5ZXIub3B0aW9ucztcbiAgICAgICAgbmV3TGF5ZXIuX2xlYWZsZXRfaWQgPSB0aGlzLl9rZXkgKyAnXycgKyBnZW9qc29uLmlkO1xuXG4gICAgICAgIHRoaXMucmVzZXRTdHlsZShuZXdMYXllci5mZWF0dXJlLmlkKTtcblxuICAgICAgICAvLyBjYWNoZSB0aGUgbGF5ZXJcbiAgICAgICAgdGhpcy5fbGF5ZXJzW25ld0xheWVyLmZlYXR1cmUuaWRdID0gbmV3TGF5ZXI7XG5cbiAgICAgICAgdGhpcy5fbGVhZmxldElkc1tuZXdMYXllci5fbGVhZmxldF9pZF0gPSBnZW9qc29uLmlkO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMub25FYWNoRmVhdHVyZSkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5vbkVhY2hGZWF0dXJlKG5ld0xheWVyLmZlYXR1cmUsIG5ld0xheWVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnY3JlYXRlZmVhdHVyZScsIHtcbiAgICAgICAgICBmZWF0dXJlOiBuZXdMYXllci5mZWF0dXJlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgbGF5ZXIgaWYgaXQgaXMgd2l0aGluIHRoZSB0aW1lIGJvdW5kcyBvciBvdXIgbGF5ZXIgaXMgbm90IHRpbWUgZW5hYmxlZFxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50aW1lRmllbGQgfHwgKHRoaXMub3B0aW9ucy50aW1lRmllbGQgJiYgdGhpcy5fZmVhdHVyZVdpdGhpblRpbWVSYW5nZShnZW9qc29uKSkpIHtcbiAgICAgICAgICBtYXJrZXJzLnB1c2gobmV3TGF5ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hcmtlcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNsdXN0ZXIuYWRkTGF5ZXJzKG1hcmtlcnMpO1xuICAgIH1cbiAgfSxcblxuICBhZGRMYXllcnM6IGZ1bmN0aW9uIChpZHMpIHtcbiAgICB2YXIgbGF5ZXJzVG9BZGQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gaWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRzW2ldXTtcbiAgICAgIHRoaXMuZmlyZSgnYWRkZmVhdHVyZScsIHtcbiAgICAgICAgZmVhdHVyZTogbGF5ZXIuZmVhdHVyZVxuICAgICAgfSk7XG4gICAgICBsYXllcnNUb0FkZC5wdXNoKGxheWVyKTtcbiAgICB9XG4gICAgdGhpcy5jbHVzdGVyLmFkZExheWVycyhsYXllcnNUb0FkZCk7XG4gIH0sXG5cbiAgcmVtb3ZlTGF5ZXJzOiBmdW5jdGlvbiAoaWRzLCBwZXJtYW5lbnQpIHtcbiAgICB2YXIgbGF5ZXJzVG9SZW1vdmUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gaWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgaWQgPSBpZHNbaV07XG4gICAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgdGhpcy5maXJlKCdyZW1vdmVmZWF0dXJlJywge1xuICAgICAgICBmZWF0dXJlOiBsYXllci5mZWF0dXJlLFxuICAgICAgICBwZXJtYW5lbnQ6IHBlcm1hbmVudFxuICAgICAgfSk7XG4gICAgICBsYXllcnNUb1JlbW92ZS5wdXNoKGxheWVyKTtcbiAgICAgIGlmICh0aGlzLl9sYXllcnNbaWRdICYmIHBlcm1hbmVudCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbHVzdGVyLnJlbW92ZUxheWVycyhsYXllcnNUb1JlbW92ZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFN0eWxpbmcgTWV0aG9kc1xuICAgKi9cblxuICByZXNldFN0eWxlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuXG4gICAgaWYgKGxheWVyKSB7XG4gICAgICBsYXllci5vcHRpb25zID0gbGF5ZXIuZGVmYXVsdE9wdGlvbnM7XG4gICAgICB0aGlzLnNldEZlYXR1cmVTdHlsZShsYXllci5mZWF0dXJlLmlkLCB0aGlzLm9wdGlvbnMuc3R5bGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNldFN0eWxlOiBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICB0aGlzLmVhY2hGZWF0dXJlKGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgdGhpcy5zZXRGZWF0dXJlU3R5bGUobGF5ZXIuZmVhdHVyZS5pZCwgc3R5bGUpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNldEZlYXR1cmVTdHlsZTogZnVuY3Rpb24gKGlkLCBzdHlsZSkge1xuICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG5cbiAgICBpZiAodHlwZW9mIHN0eWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdHlsZSA9IHN0eWxlKGxheWVyLmZlYXR1cmUpO1xuICAgIH1cbiAgICBpZiAobGF5ZXIuc2V0U3R5bGUpIHtcbiAgICAgIGxheWVyLnNldFN0eWxlKHN0eWxlKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFV0aWxpdHkgTWV0aG9kc1xuICAgKi9cblxuICBlYWNoRmVhdHVyZTogZnVuY3Rpb24gKGZuLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgIGZuLmNhbGwoY29udGV4dCwgdGhpcy5fbGF5ZXJzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0RmVhdHVyZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xheWVyc1tpZF07XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZUxheWVyIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRmVhdHVyZUxheWVyKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmZWF0dXJlTGF5ZXI7XG4iXSwibmFtZXMiOlsiRmVhdHVyZU1hbmFnZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Q0NLTyxJQUFJLFlBQVksR0FBR0EsMEJBQWMsQ0FBQyxNQUFNLENBQUM7O0FBRWhELENBQUEsRUFBRSxPQUFPLEVBQUU7QUFDWCxDQUFBLElBQUksTUFBTSxFQUFFLDhFQUE4RTtBQUMxRixDQUFBLElBQUksYUFBYSxFQUFFLG1HQUFtRztBQUN0SCxDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUE7QUFDQSxDQUFBOztBQUVBLENBQUEsRUFBRSxVQUFV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
\ No newline at end of file
--- a/src/pyams_gis/resources/js/leaflet-esri-cluster-2.0.0.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-(function(b,a){typeof exports==="object"&&typeof module!=="undefined"?a(exports,require("leaflet"),require("esri-leaflet")):typeof define==="function"&&define.amd?define(["exports","leaflet","esri-leaflet"],a):(a((b.L=b.L||{},b.L.esri=b.L.esri||{},b.L.esri.Cluster=b.L.esri.Cluster||{}),b.L,b.L.esri))}(this,function(c,a,d){a="default" in a?a["default"]:a;var b="2.0.0";var f=d.FeatureManager.extend({statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose",CLUSTEREVENTS:"clusterclick clusterdblclick clustermouseover clustermouseout clustermousemove clustercontextmenu"},initialize:function(g){d.FeatureManager.prototype.initialize.call(this,g);g=a.setOptions(this,g);this._layers={};this._leafletIds={};this.cluster=a.markerClusterGroup(g);this._key="c"+(Math.random()*1000000000).toString(36).replace(".","_");this.cluster.addEventParent(this)},onAdd:function(g){d.FeatureManager.prototype.onAdd.call(this,g);this._map.addLayer(this.cluster)},onRemove:function(g){d.FeatureManager.prototype.onRemove.call(this,g);this._map.removeLayer(this.cluster)},createLayers:function(l){var m=[];for(var j=l.length-1;j>=0;j--){var g=l[j];var h=this._layers[g.id];if(!h){var k=a.GeoJSON.geometryToLayer(g,this.options);k.feature=a.GeoJSON.asFeature(g);k.defaultOptions=k.options;k._leaflet_id=this._key+"_"+g.id;this.resetStyle(k.feature.id);this._layers[k.feature.id]=k;this._leafletIds[k._leaflet_id]=g.id;if(this.options.onEachFeature){this.options.onEachFeature(k.feature,k)}this.fire("createfeature",{feature:k.feature});if(!this.options.timeField||(this.options.timeField&&this._featureWithinTimeRange(g))){m.push(k)}}}if(m.length){this.cluster.addLayers(m)}},addLayers:function(j){var k=[];for(var h=j.length-1;h>=0;h--){var g=this._layers[j[h]];this.fire("addfeature",{feature:g.feature});k.push(g)}this.cluster.addLayers(k)},removeLayers:function(k,l){var j=[];for(var h=k.length-1;h>=0;h--){var m=k[h];var g=this._layers[m];this.fire("removefeature",{feature:g.feature,permanent:l});j.push(g);if(this._layers[m]&&l){delete this._layers[m]}}this.cluster.removeLayers(j)},resetStyle:function(h){var g=this._layers[h];if(g){g.options=g.defaultOptions;this.setFeatureStyle(g.feature.id,this.options.style)}return this},setStyle:function(g){this.eachFeature(function(h){this.setFeatureStyle(h.feature.id,g)},this);return this},setFeatureStyle:function(i,h){var g=this._layers[i];if(typeof h==="function"){h=h(g.feature)}if(g.setStyle){g.setStyle(h)}},eachFeature:function(j,h){for(var g in this._layers){j.call(h,this._layers[g])}return this},getFeature:function(g){return this._layers[g]}});function e(g){return new f(g)}c.FeatureLayer=f;c.featureLayer=e;c["default"]=e;c.VERSION=b}));
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-cluster-2.1.0.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,5 @@
+/* esri-leaflet-cluster - v2.1.0 - Mon Jun 22 2020 14:46:35 GMT-0500 (Central Daylight Time)
+ * Copyright (c) 2020 Environmental Systems Research Institute, Inc.
+ * Apache-2.0 */
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("leaflet"),require("esri-leaflet")):"function"==typeof define&&define.amd?define(["exports","leaflet","esri-leaflet"],t):t(((e=e||self).L=e.L||{},e.L.esri=e.L.esri||{},e.L.esri.Cluster={}),e.L,e.L.esri)}(this,function(e,a,t){"use strict";var r=t.FeatureManager.extend({statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose",CLUSTEREVENTS:"clusterclick clusterdblclick clustermouseover clustermouseout clustermousemove clustercontextmenu"},initialize:function(e){t.FeatureManager.prototype.initialize.call(this,e),e=a.setOptions(this,e),this._layers={},this._leafletIds={},this.cluster=a.markerClusterGroup(e),this._key="c"+(1e9*Math.random()).toString(36).replace(".","_"),this.cluster.addEventParent(this)},onAdd:function(e){t.FeatureManager.prototype.onAdd.call(this,e),this._map.addLayer(this.cluster)},onRemove:function(e){t.FeatureManager.prototype.onRemove.call(this,e),this._map.removeLayer(this.cluster)},createNewLayer:function(e){var t=a.GeoJSON.geometryToLayer(e,this.options);return t&&(t.defaultOptions=t.options),t},createLayers:function(e){for(var t=[],r=e.length-1;0<=r;r--){var s=e[r],i=this._layers[s.id];i||((i=this.createNewLayer(s)).feature=a.GeoJSON.asFeature(s),i.defaultOptions=i.options,i._leaflet_id=this._key+"_"+s.id,this.resetStyle(i.feature.id),this._layers[i.feature.id]=i,this._leafletIds[i._leaflet_id]=s.id,this.options.onEachFeature&&this.options.onEachFeature(i.feature,i),this.fire("createfeature",{feature:i.feature})),(!this.options.timeField||this.options.timeField&&this._featureWithinTimeRange(s))&&t.push(i)}t.length&&this.cluster.addLayers(t)},addLayers:function(e){for(var t=[],r=e.length-1;0<=r;r--){var s=this._layers[e[r]];this.fire("addfeature",{feature:s.feature}),t.push(s)}this.cluster.addLayers(t)},removeLayers:function(e,t){for(var r=[],s=e.length-1;0<=s;s--){var i=e[s],a=this._layers[i];this.fire("removefeature",{feature:a.feature,permanent:t}),r.push(a),this._layers[i]&&t&&delete this._layers[i]}this.cluster.removeLayers(r)},resetStyle:function(e){var t=this._layers[e];return t&&(t.options=t.defaultOptions,this.setFeatureStyle(t.feature.id,this.options.style)),this},setStyle:function(t){return this.eachFeature(function(e){this.setFeatureStyle(e.feature.id,t)},this),this},setFeatureStyle:function(e,t){var r=this._layers[e];"function"==typeof t&&(t=t(r.feature)),r.setStyle&&r.setStyle(t)},eachFeature:function(e,t){for(var r in this._layers)e.call(t,this._layers[r]);return this},getFeature:function(e){return this._layers[e]}});function s(e){return new r(e)}e.FeatureLayer=r,e.VERSION="2.1.0",e.default=s,e.featureLayer=s,Object.defineProperty(e,"__esModule",{value:!0})});
+//# sourceMappingURL=esri-leaflet-cluster.js.map
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-cluster-2.1.0.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("leaflet"),require("esri-leaflet")):"function"==typeof define&&define.amd?define(["exports","leaflet","esri-leaflet"],t):t(((e=e||self).L=e.L||{},e.L.esri=e.L.esri||{},e.L.esri.Cluster={}),e.L,e.L.esri)}(this,(function(e,t,r){"use strict";var s=r.FeatureManager.extend({statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose",CLUSTEREVENTS:"clusterclick clusterdblclick clustermouseover clustermouseout clustermousemove clustercontextmenu"},initialize:function(e){r.FeatureManager.prototype.initialize.call(this,e),e=t.setOptions(this,e),this._layers={},this._leafletIds={},this.cluster=t.markerClusterGroup(e),this._key="c"+(1e9*Math.random()).toString(36).replace(".","_"),this.cluster.addEventParent(this)},onAdd:function(e){r.FeatureManager.prototype.onAdd.call(this,e),this._map.addLayer(this.cluster)},onRemove:function(e){r.FeatureManager.prototype.onRemove.call(this,e),this._map.removeLayer(this.cluster)},createNewLayer:function(e){var r=t.GeoJSON.geometryToLayer(e,this.options);return r&&(r.defaultOptions=r.options),r},createLayers:function(e){for(var r=[],s=e.length-1;0<=s;s--){var i=e[s],a=this._layers[i.id];a||((a=this.createNewLayer(i)).feature=t.GeoJSON.asFeature(i),a.defaultOptions=a.options,a._leaflet_id=this._key+"_"+i.id,this.resetStyle(a.feature.id),this._layers[a.feature.id]=a,this._leafletIds[a._leaflet_id]=i.id,this.options.onEachFeature&&this.options.onEachFeature(a.feature,a),this.fire("createfeature",{feature:a.feature})),(!this.options.timeField||this.options.timeField&&this._featureWithinTimeRange(i))&&r.push(a)}r.length&&this.cluster.addLayers(r)},addLayers:function(e){for(var t=[],r=e.length-1;0<=r;r--){var s=this._layers[e[r]];this.fire("addfeature",{feature:s.feature}),t.push(s)}this.cluster.addLayers(t)},removeLayers:function(e,t){for(var r=[],s=e.length-1;0<=s;s--){var i=e[s],a=this._layers[i];this.fire("removefeature",{feature:a.feature,permanent:t}),r.push(a),this._layers[i]&&t&&delete this._layers[i]}this.cluster.removeLayers(r)},resetStyle:function(e){var t=this._layers[e];return t&&(t.options=t.defaultOptions,this.setFeatureStyle(t.feature.id,this.options.style)),this},setStyle:function(e){return this.eachFeature((function(t){this.setFeatureStyle(t.feature.id,e)}),this),this},setFeatureStyle:function(e,t){var r=this._layers[e];"function"==typeof t&&(t=t(r.feature)),r.setStyle&&r.setStyle(t)},eachFeature:function(e,t){for(var r in this._layers)e.call(t,this._layers[r]);return this},getFeature:function(e){return this._layers[e]}});function i(e){return new s(e)}e.FeatureLayer=s,e.VERSION="2.1.0",e.default=i,e.featureLayer=i,Object.defineProperty(e,"__esModule",{value:!0})}));
--- a/src/pyams_gis/resources/js/leaflet-esri-geocoder-2.2.4.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1194 +0,0 @@
-/* esri-leaflet-geocoder - v2.2.4 - Wed Mar 22 2017 15:48:59 GMT-0700 (PDT)
- * Copyright (c) 2017 Environmental Systems Research Institute, Inc.
- * Apache-2.0 */
-(function (global, factory) {
-	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('esri-leaflet')) :
-	typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'esri-leaflet'], factory) :
-	(factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.Geocoding = global.L.esri.Geocoding || {}),global.L,global.L.esri));
-}(this, function (exports,L,esriLeaflet) { 'use strict';
-
-	L = 'default' in L ? L['default'] : L;
-
-	var version = "2.2.4";
-
-	var Geocode = esriLeaflet.Task.extend({
-	  path: 'findAddressCandidates',
-
-	  params: {
-	    outSr: 4326,
-	    forStorage: false,
-	    outFields: '*',
-	    maxLocations: 20
-	  },
-
-	  setters: {
-	    'address': 'address',
-	    'neighborhood': 'neighborhood',
-	    'city': 'city',
-	    'subregion': 'subregion',
-	    'region': 'region',
-	    'postal': 'postal',
-	    'country': 'country',
-	    'text': 'singleLine',
-	    'category': 'category',
-	    'token': 'token',
-	    'key': 'magicKey',
-	    'fields': 'outFields',
-	    'forStorage': 'forStorage',
-	    'maxLocations': 'maxLocations'
-	  },
-
-	  initialize: function (options) {
-	    options = options || {};
-	    options.url = options.url || WorldGeocodingServiceUrl;
-	    esriLeaflet.Task.prototype.initialize.call(this, options);
-	  },
-
-	  within: function (bounds) {
-	    bounds = L.latLngBounds(bounds);
-	    this.params.searchExtent = esriLeaflet.Util.boundsToExtent(bounds);
-	    return this;
-	  },
-
-	  nearby: function (latlng, radius) {
-	    latlng = L.latLng(latlng);
-	    this.params.location = latlng.lng + ',' + latlng.lat;
-	    this.params.distance = Math.min(Math.max(radius, 2000), 50000);
-	    return this;
-	  },
-
-	  run: function (callback, context) {
-	    if (this.options.customParam) {
-	      this.params[this.options.customParam] = this.params.singleLine;
-	      delete this.params.singleLine;
-	    }
-
-	    return this.request(function (error, response) {
-	      var processor = this._processGeocoderResponse;
-	      var results = (!error) ? processor(response) : undefined;
-	      callback.call(context, error, { results: results }, response);
-	    }, this);
-	  },
-
-	  _processGeocoderResponse: function (response) {
-	    var results = [];
-
-	    for (var i = 0; i < response.candidates.length; i++) {
-	      var candidate = response.candidates[i];
-	      if (candidate.extent) {
-	        var bounds = esriLeaflet.Util.extentToBounds(candidate.extent);
-	      }
-
-	      results.push({
-	        text: candidate.address,
-	        bounds: bounds,
-	        score: candidate.score,
-	        latlng: L.latLng(candidate.location.y, candidate.location.x),
-	        properties: candidate.attributes
-	      });
-	    }
-	    return results;
-	  }
-	});
-
-	function geocode (options) {
-	  return new Geocode(options);
-	}
-
-	var ReverseGeocode = esriLeaflet.Task.extend({
-	  path: 'reverseGeocode',
-
-	  params: {
-	    outSR: 4326,
-	    returnIntersection: false
-	  },
-
-	  setters: {
-	    'distance': 'distance',
-	    'language': 'langCode',
-	    'intersection': 'returnIntersection'
-	  },
-
-	  initialize: function (options) {
-	    options = options || {};
-	    options.url = options.url || WorldGeocodingServiceUrl;
-	    esriLeaflet.Task.prototype.initialize.call(this, options);
-	  },
-
-	  latlng: function (latlng) {
-	    latlng = L.latLng(latlng);
-	    this.params.location = latlng.lng + ',' + latlng.lat;
-	    return this;
-	  },
-
-	  run: function (callback, context) {
-	    return this.request(function (error, response) {
-	      var result;
-
-	      if (!error) {
-	        result = {
-	          latlng: L.latLng(response.location.y, response.location.x),
-	          address: response.address
-	        };
-	      } else {
-	        result = undefined;
-	      }
-
-	      callback.call(context, error, result, response);
-	    }, this);
-	  }
-	});
-
-	function reverseGeocode (options) {
-	  return new ReverseGeocode(options);
-	}
-
-	var Suggest = esriLeaflet.Task.extend({
-	  path: 'suggest',
-
-	  params: {},
-
-	  setters: {
-	    text: 'text',
-	    category: 'category',
-	    countries: 'countryCode',
-	    maxSuggestions: 'maxSuggestions'
-	  },
-
-	  initialize: function (options) {
-	    options = options || {};
-	    if (!options.url) {
-	      options.url = WorldGeocodingServiceUrl;
-	      options.supportsSuggest = true;
-	    }
-	    esriLeaflet.Task.prototype.initialize.call(this, options);
-	  },
-
-	  within: function (bounds) {
-	    bounds = L.latLngBounds(bounds);
-	    bounds = bounds.pad(0.5);
-	    var center = bounds.getCenter();
-	    var ne = bounds.getNorthWest();
-	    this.params.location = center.lng + ',' + center.lat;
-	    this.params.distance = Math.min(Math.max(center.distanceTo(ne), 2000), 50000);
-	    this.params.searchExtent = esriLeaflet.Util.boundsToExtent(bounds);
-	    return this;
-	  },
-
-	  nearby: function (latlng, radius) {
-	    latlng = L.latLng(latlng);
-	    this.params.location = latlng.lng + ',' + latlng.lat;
-	    this.params.distance = Math.min(Math.max(radius, 2000), 50000);
-	    return this;
-	  },
-
-	  run: function (callback, context) {
-	    if (this.options.supportsSuggest) {
-	      return this.request(function (error, response) {
-	        callback.call(context, error, response, response);
-	      }, this);
-	    } else {
-	      console.warn('this geocoding service does not support asking for suggestions');
-	    }
-	  }
-
-	});
-
-	function suggest (options) {
-	  return new Suggest(options);
-	}
-
-	var GeocodeService = esriLeaflet.Service.extend({
-	  initialize: function (options) {
-	    options = options || {};
-	    if (options.url) {
-	      esriLeaflet.Service.prototype.initialize.call(this, options);
-	      this._confirmSuggestSupport();
-	    } else {
-	      options.url = WorldGeocodingServiceUrl;
-	      options.supportsSuggest = true;
-	      esriLeaflet.Service.prototype.initialize.call(this, options);
-	    }
-	  },
-
-	  geocode: function () {
-	    return geocode(this);
-	  },
-
-	  reverse: function () {
-	    return reverseGeocode(this);
-	  },
-
-	  suggest: function () {
-	    // requires either the Esri World Geocoding Service or a <10.3 ArcGIS Server Geocoding Service that supports suggest.
-	    return suggest(this);
-	  },
-
-	  _confirmSuggestSupport: function () {
-	    this.metadata(function (error, response) {
-	      if (error) { return; }
-	      // pre 10.3 geocoding services dont list capabilities (and dont support maxLocations)
-	      // only SOME individual services have been configured to support asking for suggestions
-	      if (!response.capabilities) {
-	        this.options.supportsSuggest = false;
-	        this.options.customParam = response.singleLineAddressField.name;
-	      } else if (response.capabilities.indexOf('Suggest') > -1) {
-	        this.options.supportsSuggest = true;
-	      } else {
-	        this.options.supportsSuggest = false;
-	      }
-	    }, this);
-	  }
-	});
-
-	function geocodeService (options) {
-	  return new GeocodeService(options);
-	}
-
-	var GeosearchCore = L.Evented.extend({
-
-	  options: {
-	    zoomToResult: true,
-	    useMapBounds: 12,
-	    searchBounds: null
-	  },
-
-	  initialize: function (control, options) {
-	    L.Util.setOptions(this, options);
-	    this._control = control;
-
-	    if (!options || !options.providers || !options.providers.length) {
-	      throw new Error('You must specify at least one provider');
-	    }
-
-	    this._providers = options.providers;
-	  },
-
-	  _geocode: function (text, key, provider) {
-	    var activeRequests = 0;
-	    var allResults = [];
-	    var bounds;
-
-	    var callback = L.Util.bind(function (error, results) {
-	      activeRequests--;
-	      if (error) {
-	        return;
-	      }
-
-	      if (results) {
-	        allResults = allResults.concat(results);
-	      }
-
-	      if (activeRequests <= 0) {
-	        bounds = this._boundsFromResults(allResults);
-
-	        this.fire('results', {
-	          results: allResults,
-	          bounds: bounds,
-	          latlng: (bounds) ? bounds.getCenter() : undefined,
-	          text: text
-	        }, true);
-
-	        if (this.options.zoomToResult && bounds) {
-	          this._control._map.fitBounds(bounds);
-	        }
-
-	        this.fire('load');
-	      }
-	    }, this);
-
-	    if (key) {
-	      activeRequests++;
-	      provider.results(text, key, this._searchBounds(), callback);
-	    } else {
-	      for (var i = 0; i < this._providers.length; i++) {
-	        activeRequests++;
-	        this._providers[i].results(text, key, this._searchBounds(), callback);
-	      }
-	    }
-	  },
-
-	  _suggest: function (text) {
-	    var activeRequests = this._providers.length;
-
-	    var createCallback = L.Util.bind(function (text, provider) {
-	      return L.Util.bind(function (error, suggestions) {
-	        if (error) { return; }
-
-	        var i;
-
-	        activeRequests = activeRequests - 1;
-
-	        if (text.length < 2) {
-	          this._suggestions.innerHTML = '';
-	          this._suggestions.style.display = 'none';
-	          return;
-	        }
-
-	        if (suggestions.length) {
-	          for (i = 0; i < suggestions.length; i++) {
-	            suggestions[i].provider = provider;
-	          }
-	        } else {
-	          // we still need to update the UI
-	          this._control._renderSuggestions(suggestions);
-	        }
-
-	        if (provider._lastRender !== text && provider.nodes) {
-	          for (i = 0; i < provider.nodes.length; i++) {
-	            if (provider.nodes[i].parentElement) {
-	              this._control._suggestions.removeChild(provider.nodes[i]);
-	            }
-	          }
-
-	          provider.nodes = [];
-	        }
-
-	        if (suggestions.length && this._control._input.value === text) {
-	          this._control.clearSuggestions(provider.nodes);
-
-	          provider._lastRender = text;
-	          provider.nodes = this._control._renderSuggestions(suggestions);
-	          this._control._nodes = [];
-	        }
-	      }, this);
-	    }, this);
-
-	    this._pendingSuggestions = [];
-
-	    for (var i = 0; i < this._providers.length; i++) {
-	      var provider = this._providers[i];
-	      var request = provider.suggestions(text, this._searchBounds(), createCallback(text, provider));
-	      this._pendingSuggestions.push(request);
-	    }
-	  },
-
-	  _searchBounds: function () {
-	    if (this.options.searchBounds !== null) {
-	      return this.options.searchBounds;
-	    }
-
-	    if (this.options.useMapBounds === false) {
-	      return null;
-	    }
-
-	    if (this.options.useMapBounds === true) {
-	      return this._control._map.getBounds();
-	    }
-
-	    if (this.options.useMapBounds <= this._control._map.getZoom()) {
-	      return this._control._map.getBounds();
-	    }
-
-	    return null;
-	  },
-
-	  _boundsFromResults: function (results) {
-	    if (!results.length) {
-	      return;
-	    }
-
-	    var nullIsland = L.latLngBounds([0, 0], [0, 0]);
-	    var resultBounds = [];
-	    var resultLatlngs = [];
-
-	    // collect the bounds and center of each result
-	    for (var i = results.length - 1; i >= 0; i--) {
-	      var result = results[i];
-
-	      resultLatlngs.push(result.latlng);
-
-	      // make sure bounds are valid and not 0,0. sometimes bounds are incorrect or not present
-	      if (result.bounds && result.bounds.isValid() && !result.bounds.equals(nullIsland)) {
-	        resultBounds.push(result.bounds);
-	      }
-	    }
-
-	    // form a bounds object containing all center points
-	    var bounds = L.latLngBounds(resultLatlngs);
-
-	    // and extend it to contain all bounds objects
-	    for (var j = 0; j < resultBounds.length; j++) {
-	      bounds.extend(resultBounds[j]);
-	    }
-
-	    return bounds;
-	  },
-
-	  _getAttribution: function () {
-	    var attribs = [];
-	    var providers = this._providers;
-
-	    for (var i = 0; i < providers.length; i++) {
-	      if (providers[i].options.attribution) {
-	        attribs.push(providers[i].options.attribution);
-	      }
-	    }
-
-	    return attribs.join(', ');
-	  }
-
-	});
-
-	function geosearchCore (control, options) {
-	  return new GeosearchCore(control, options);
-	}
-
-	var ArcgisOnlineProvider = GeocodeService.extend({
-	  options: {
-	    label: 'Places and Addresses',
-	    maxResults: 5
-	  },
-
-	  suggestions: function (text, bounds, callback) {
-	    var request = this.suggest().text(text);
-
-	    if (bounds) {
-	      request.within(bounds);
-	    }
-
-	    if (this.options.countries) {
-	      request.countries(this.options.countries);
-	    }
-
-	    if (this.options.categories) {
-	      request.category(this.options.categories);
-	    }
-
-	    // 15 is the maximum number of suggestions that can be returned
-	    request.maxSuggestions(this.options.maxResults);
-
-	    return request.run(function (error, results, response) {
-	      var suggestions = [];
-	      if (!error) {
-	        while (response.suggestions.length && suggestions.length <= (this.options.maxResults - 1)) {
-	          var suggestion = response.suggestions.shift();
-	          if (!suggestion.isCollection) {
-	            suggestions.push({
-	              text: suggestion.text,
-	              magicKey: suggestion.magicKey
-	            });
-	          }
-	        }
-	      }
-	      callback(error, suggestions);
-	    }, this);
-	  },
-
-	  results: function (text, key, bounds, callback) {
-	    var request = this.geocode().text(text);
-
-	    if (key) {
-	      request.key(key);
-	    }
-	    // in the future Address/StreetName geocoding requests that include a magicKey will always only return one match
-	    request.maxLocations(this.options.maxResults);
-
-	    if (bounds) {
-	      request.within(bounds);
-	    }
-
-	    if (this.options.forStorage) {
-	      request.forStorage(true);
-	    }
-
-	    return request.run(function (error, response) {
-	      callback(error, response.results);
-	    }, this);
-	  }
-	});
-
-	function arcgisOnlineProvider (options) {
-	  return new ArcgisOnlineProvider(options);
-	}
-
-	var Geosearch = L.Control.extend({
-	  includes: L.Mixin.Events,
-
-	  options: {
-	    position: 'topleft',
-	    collapseAfterResult: true,
-	    expanded: false,
-	    allowMultipleResults: true,
-	    placeholder: 'Search for places or addresses',
-	    title: 'Location Search'
-	  },
-
-	  initialize: function (options) {
-	    L.Util.setOptions(this, options);
-
-	    if (!options || !options.providers || !options.providers.length) {
-	      if (!options) {
-	        options = {};
-	      }
-	      options.providers = [ arcgisOnlineProvider() ];
-	    }
-
-	    // instantiate the underlying class and pass along options
-	    this._geosearchCore = geosearchCore(this, options);
-	    this._geosearchCore._providers = options.providers;
-
-	    // bubble each providers events to the control
-	    this._geosearchCore.addEventParent(this);
-	    for (var i = 0; i < this._geosearchCore._providers.length; i++) {
-	      this._geosearchCore._providers[i].addEventParent(this);
-	    }
-
-	    this._geosearchCore._pendingSuggestions = [];
-
-	    L.Control.prototype.initialize.call(options);
-	  },
-
-	  _renderSuggestions: function (suggestions) {
-	    var currentGroup;
-
-	    if (suggestions.length > 0) {
-	      this._suggestions.style.display = 'block';
-	    }
-	    // set the maxHeight of the suggestions box to
-	    // map height
-	    // - suggestions offset (distance from top of suggestions to top of control)
-	    // - control offset (distance from top of control to top of map)
-	    // - 10 (extra padding)
-	    this._suggestions.style.maxHeight = (this._map.getSize().y - this._suggestions.offsetTop - this._wrapper.offsetTop - 10) + 'px';
-
-	    var nodes = [];
-	    var list;
-	    var header;
-	    var suggestionTextArray = [];
-
-	    for (var i = 0; i < suggestions.length; i++) {
-	      var suggestion = suggestions[i];
-	      if (!header && this._geosearchCore._providers.length > 1 && currentGroup !== suggestion.provider.options.label) {
-	        header = L.DomUtil.create('span', 'geocoder-control-header', this._suggestions);
-	        header.textContent = suggestion.provider.options.label;
-	        header.innerText = suggestion.provider.options.label;
-	        currentGroup = suggestion.provider.options.label;
-	        nodes.push(header);
-	      }
-
-	      if (!list) {
-	        list = L.DomUtil.create('ul', 'geocoder-control-list', this._suggestions);
-	      }
-
-	      if (suggestionTextArray.indexOf(suggestion.text) === -1) {
-	        var suggestionItem = L.DomUtil.create('li', 'geocoder-control-suggestion', list);
-
-	        suggestionItem.innerHTML = suggestion.text;
-	        suggestionItem.provider = suggestion.provider;
-	        suggestionItem['data-magic-key'] = suggestion.magicKey;
-	      } else {
-	        for (var j = 0; j < list.childNodes.length; j++) {
-	          // if the same text already appears in the list of suggestions, append an additional ObjectID to its magicKey instead
-	          if (list.childNodes[j].innerHTML === suggestion.text) {
-	            list.childNodes[j]['data-magic-key'] += ',' + suggestion.magicKey;
-	          }
-	        }
-	      }
-	      suggestionTextArray.push(suggestion.text);
-	    }
-
-	    L.DomUtil.removeClass(this._input, 'geocoder-control-loading');
-
-	    nodes.push(list);
-
-	    return nodes;
-	  },
-
-	  _boundsFromResults: function (results) {
-	    if (!results.length) {
-	      return;
-	    }
-
-	    var nullIsland = L.latLngBounds([0, 0], [0, 0]);
-	    var resultBounds = [];
-	    var resultLatlngs = [];
-
-	    // collect the bounds and center of each result
-	    for (var i = results.length - 1; i >= 0; i--) {
-	      var result = results[i];
-
-	      resultLatlngs.push(result.latlng);
-
-	      // make sure bounds are valid and not 0,0. sometimes bounds are incorrect or not present
-	      if (result.bounds && result.bounds.isValid() && !result.bounds.equals(nullIsland)) {
-	        resultBounds.push(result.bounds);
-	      }
-	    }
-
-	    // form a bounds object containing all center points
-	    var bounds = L.latLngBounds(resultLatlngs);
-
-	    // and extend it to contain all bounds objects
-	    for (var j = 0; j < resultBounds.length; j++) {
-	      bounds.extend(resultBounds[j]);
-	    }
-
-	    return bounds;
-	  },
-
-	  clear: function () {
-	    this._suggestions.innerHTML = '';
-	    this._suggestions.style.display = 'none';
-	    this._input.value = '';
-
-	    if (this.options.collapseAfterResult) {
-	      this._input.placeholder = '';
-	      L.DomUtil.removeClass(this._wrapper, 'geocoder-control-expanded');
-	    }
-
-	    if (!this._map.scrollWheelZoom.enabled() && this._map.options.scrollWheelZoom) {
-	      this._map.scrollWheelZoom.enable();
-	    }
-	  },
-
-	  clearSuggestions: function () {
-	    if (this._nodes) {
-	      for (var k = 0; k < this._nodes.length; k++) {
-	        if (this._nodes[k].parentElement) {
-	          this._suggestions.removeChild(this._nodes[k]);
-	        }
-	      }
-	    }
-	  },
-
-	  _setupClick: function () {
-	    L.DomUtil.addClass(this._wrapper, 'geocoder-control-expanded');
-	    this._input.focus();
-	  },
-
-	  disable: function () {
-	    this._input.disabled = true;
-	    L.DomUtil.addClass(this._input, 'geocoder-control-input-disabled');
-	    L.DomEvent.removeListener(this._wrapper, 'click', this._setupClick, this);
-	  },
-
-	  enable: function () {
-	    this._input.disabled = false;
-	    L.DomUtil.removeClass(this._input, 'geocoder-control-input-disabled');
-	    L.DomEvent.addListener(this._wrapper, 'click', this._setupClick, this);
-	  },
-
-	  getAttribution: function () {
-	    var attribs = [];
-
-	    for (var i = 0; i < this._providers.length; i++) {
-	      if (this._providers[i].options.attribution) {
-	        attribs.push(this._providers[i].options.attribution);
-	      }
-	    }
-
-	    return attribs.join(', ');
-	  },
-
-	  onAdd: function (map) {
-	    // include 'Powered by Esri' in map attribution
-	    esriLeaflet.Util.setEsriAttribution(map);
-
-	    this._map = map;
-	    this._wrapper = L.DomUtil.create('div', 'geocoder-control');
-	    this._input = L.DomUtil.create('input', 'geocoder-control-input leaflet-bar', this._wrapper);
-	    this._input.title = this.options.title;
-
-	    if (this.options.expanded) {
-	      L.DomUtil.addClass(this._wrapper, 'geocoder-control-expanded');
-	      this._input.placeholder = this.options.placeholder;
-	    }
-
-	    this._suggestions = L.DomUtil.create('div', 'geocoder-control-suggestions leaflet-bar', this._wrapper);
-
-	    var credits = this._geosearchCore._getAttribution();
-	    map.attributionControl.addAttribution(credits);
-
-	    L.DomEvent.addListener(this._input, 'focus', function (e) {
-	      this._input.placeholder = this.options.placeholder;
-	      L.DomUtil.addClass(this._wrapper, 'geocoder-control-expanded');
-	    }, this);
-
-	    L.DomEvent.addListener(this._wrapper, 'click', this._setupClick, this);
-
-	    L.DomEvent.addListener(this._suggestions, 'mousedown', function (e) {
-	      var suggestionItem = e.target || e.srcElement;
-	      this._geosearchCore._geocode(suggestionItem.innerHTML, suggestionItem['data-magic-key'], suggestionItem.provider);
-	      this.clear();
-	    }, this);
-
-	    L.DomEvent.addListener(this._input, 'blur', function (e) {
-	      this.clear();
-	    }, this);
-
-	    L.DomEvent.addListener(this._input, 'keydown', function (e) {
-	      var text = (e.target || e.srcElement).value;
-
-	      L.DomUtil.addClass(this._wrapper, 'geocoder-control-expanded');
-
-	      var list = this._suggestions.querySelectorAll('.' + 'geocoder-control-suggestion');
-	      var selected = this._suggestions.querySelectorAll('.' + 'geocoder-control-selected')[0];
-	      var selectedPosition;
-
-	      for (var i = 0; i < list.length; i++) {
-	        if (list[i] === selected) {
-	          selectedPosition = i;
-	          break;
-	        }
-	      }
-
-	      switch (e.keyCode) {
-	        case 13:
-	          /*
-	            if an item has been selected, geocode it
-	            if focus is on the input textbox, geocode only if multiple results are allowed and more than two characters are present, or if a single suggestion is displayed.
-	            if less than two characters have been typed, abort the geocode
-	          */
-	          if (selected) {
-	            this._geosearchCore._geocode(selected.innerHTML, selected['data-magic-key'], selected.provider);
-	            this.clear();
-	          } else if (this.options.allowMultipleResults && text.length >= 2) {
-	            this._geosearchCore._geocode(this._input.value, undefined);
-	            this.clear();
-	          } else {
-	            if (list.length === 1) {
-	              L.DomUtil.addClass(list[0], 'geocoder-control-selected');
-	              this._geosearchCore._geocode(list[0].innerHTML, list[0]['data-magic-key'], list[0].provider);
-	            } else {
-	              this.clear();
-	              this._input.blur();
-	            }
-	          }
-	          L.DomEvent.preventDefault(e);
-	          break;
-	        case 38:
-	          if (selected) {
-	            L.DomUtil.removeClass(selected, 'geocoder-control-selected');
-	          }
-
-	          var previousItem = list[selectedPosition - 1];
-
-	          if (selected && previousItem) {
-	            L.DomUtil.addClass(previousItem, 'geocoder-control-selected');
-	          } else {
-	            L.DomUtil.addClass(list[list.length - 1], 'geocoder-control-selected');
-	          }
-	          L.DomEvent.preventDefault(e);
-	          break;
-	        case 40:
-	          if (selected) {
-	            L.DomUtil.removeClass(selected, 'geocoder-control-selected');
-	          }
-
-	          var nextItem = list[selectedPosition + 1];
-
-	          if (selected && nextItem) {
-	            L.DomUtil.addClass(nextItem, 'geocoder-control-selected');
-	          } else {
-	            L.DomUtil.addClass(list[0], 'geocoder-control-selected');
-	          }
-	          L.DomEvent.preventDefault(e);
-	          break;
-	        default:
-	          // when the input changes we should cancel all pending suggestion requests if possible to avoid result collisions
-	          for (var x = 0; x < this._geosearchCore._pendingSuggestions.length; x++) {
-	            var request = this._geosearchCore._pendingSuggestions[x];
-	            if (request && request.abort && !request.id) {
-	              request.abort();
-	            }
-	          }
-	          break;
-	      }
-	    }, this);
-
-	    L.DomEvent.addListener(this._input, 'keyup', L.Util.throttle(function (e) {
-	      var key = e.which || e.keyCode;
-	      var text = (e.target || e.srcElement).value;
-
-	      // require at least 2 characters for suggestions
-	      if (text.length < 2) {
-	        this._suggestions.innerHTML = '';
-	        this._suggestions.style.display = 'none';
-	        L.DomUtil.removeClass(this._input, 'geocoder-control-loading');
-	        return;
-	      }
-
-	      // if this is the escape key it will clear the input so clear suggestions
-	      if (key === 27) {
-	        this._suggestions.innerHTML = '';
-	        this._suggestions.style.display = 'none';
-	        return;
-	      }
-
-	      // if this is NOT the up/down arrows or enter make a suggestion
-	      if (key !== 13 && key !== 38 && key !== 40) {
-	        if (this._input.value !== this._lastValue) {
-	          this._lastValue = this._input.value;
-	          L.DomUtil.addClass(this._input, 'geocoder-control-loading');
-	          this._geosearchCore._suggest(text);
-	        }
-	      }
-	    }, 50, this), this);
-
-	    L.DomEvent.disableClickPropagation(this._wrapper);
-
-	    // when mouse moves over suggestions disable scroll wheel zoom if its enabled
-	    L.DomEvent.addListener(this._suggestions, 'mouseover', function (e) {
-	      if (map.scrollWheelZoom.enabled() && map.options.scrollWheelZoom) {
-	        map.scrollWheelZoom.disable();
-	      }
-	    });
-
-	    // when mouse moves leaves suggestions enable scroll wheel zoom if its disabled
-	    L.DomEvent.addListener(this._suggestions, 'mouseout', function (e) {
-	      if (!map.scrollWheelZoom.enabled() && map.options.scrollWheelZoom) {
-	        map.scrollWheelZoom.enable();
-	      }
-	    });
-
-	    this._geosearchCore.on('load', function (e) {
-	      L.DomUtil.removeClass(this._input, 'geocoder-control-loading');
-	      this.clear();
-	      this._input.blur();
-	    }, this);
-
-	    return this._wrapper;
-	  }
-	});
-
-	function geosearch (options) {
-	  return new Geosearch(options);
-	}
-
-	var FeatureLayerProvider = esriLeaflet.FeatureLayerService.extend({
-	  options: {
-	    label: 'Feature Layer',
-	    maxResults: 5,
-	    bufferRadius: 1000,
-	    formatSuggestion: function (feature) {
-	      return feature.properties[this.options.searchFields[0]];
-	    }
-	  },
-
-	  initialize: function (options) {
-	    esriLeaflet.FeatureLayerService.prototype.initialize.call(this, options);
-	    if (typeof this.options.searchFields === 'string') {
-	      this.options.searchFields = [this.options.searchFields];
-	    }
-	    this._suggestionsQuery = this.query();
-	    this._resultsQuery = this.query();
-	  },
-
-	  suggestions: function (text, bounds, callback) {
-	    var query = this._suggestionsQuery.where(this._buildQuery(text))
-	      .returnGeometry(false);
-
-	    if (bounds) {
-	      query.intersects(bounds);
-	    }
-
-	    if (this.options.idField) {
-	      query.fields([this.options.idField].concat(this.options.searchFields));
-	    }
-
-	    var request = query.run(function (error, results, raw) {
-	      if (error) {
-	        callback(error, []);
-	      } else {
-	        this.options.idField = raw.objectIdFieldName;
-	        var suggestions = [];
-	        for (var i = results.features.length - 1; i >= 0; i--) {
-	          var feature = results.features[i];
-	          suggestions.push({
-	            text: this.options.formatSuggestion.call(this, feature),
-	            magicKey: feature.id
-	          });
-	        }
-	        callback(error, suggestions.slice(0, this.options.maxResults));
-	      }
-	    }, this);
-
-	    return request;
-	  },
-
-	  results: function (text, key, bounds, callback) {
-	    var query = this._resultsQuery;
-
-	    if (key) {
-	      delete query.params.where;
-	      query.featureIds([key]);
-	    } else {
-	      query.where(this._buildQuery(text));
-	    }
-
-	    if (bounds) {
-	      query.within(bounds);
-	    }
-
-	    return query.run(L.Util.bind(function (error, features) {
-	      var results = [];
-	      for (var i = 0; i < features.features.length; i++) {
-	        var feature = features.features[i];
-	        if (feature) {
-	          var bounds = this._featureBounds(feature);
-
-	          var result = {
-	            latlng: bounds.getCenter(),
-	            bounds: bounds,
-	            text: this.options.formatSuggestion.call(this, feature),
-	            properties: feature.properties,
-	            geojson: feature
-	          };
-
-	          results.push(result);
-
-	          // clear query parameters for the next search
-	          delete this._resultsQuery.params['objectIds'];
-	        }
-	      }
-	      callback(error, results);
-	    }, this));
-	  },
-
-	  orderBy: function (fieldName, order) {
-	    this._suggestionsQuery.orderBy(fieldName, order);
-	  },
-
-	  _buildQuery: function (text) {
-	    var queryString = [];
-
-	    for (var i = this.options.searchFields.length - 1; i >= 0; i--) {
-	      var field = 'upper("' + this.options.searchFields[i] + '")';
-
-	      queryString.push(field + " LIKE upper('%" + text + "%')");
-	    }
-
-	    if (this.options.where) {
-	      return this.options.where + ' AND (' + queryString.join(' OR ') + ')';
-	    } else {
-	      return queryString.join(' OR ');
-	    }
-	  },
-
-	  _featureBounds: function (feature) {
-	    var geojson = L.geoJson(feature);
-	    if (feature.geometry.type === 'Point') {
-	      var center = geojson.getBounds().getCenter();
-	      var lngRadius = ((this.options.bufferRadius / 40075017) * 360) / Math.cos((180 / Math.PI) * center.lat);
-	      var latRadius = (this.options.bufferRadius / 40075017) * 360;
-	      return L.latLngBounds([center.lat - latRadius, center.lng - lngRadius], [center.lat + latRadius, center.lng + lngRadius]);
-	    } else {
-	      return geojson.getBounds();
-	    }
-	  }
-	});
-
-	function featureLayerProvider (options) {
-	  return new FeatureLayerProvider(options);
-	}
-
-	var MapServiceProvider = esriLeaflet.MapService.extend({
-	  options: {
-	    layers: [0],
-	    label: 'Map Service',
-	    bufferRadius: 1000,
-	    maxResults: 5,
-	    formatSuggestion: function (feature) {
-	      return feature.properties[feature.displayFieldName] + ' <small>' + feature.layerName + '</small>';
-	    }
-	  },
-
-	  initialize: function (options) {
-	    esriLeaflet.MapService.prototype.initialize.call(this, options);
-	    this._getIdFields();
-	  },
-
-	  suggestions: function (text, bounds, callback) {
-	    var request = this.find().text(text).fields(this.options.searchFields).returnGeometry(false).layers(this.options.layers);
-
-	    return request.run(function (error, results, raw) {
-	      var suggestions = [];
-	      if (!error) {
-	        var count = Math.min(this.options.maxResults, results.features.length);
-	        raw.results = raw.results.reverse();
-	        for (var i = 0; i < count; i++) {
-	          var feature = results.features[i];
-	          var result = raw.results[i];
-	          var layer = result.layerId;
-	          var idField = this._idFields[layer];
-	          feature.layerId = layer;
-	          feature.layerName = this._layerNames[layer];
-	          feature.displayFieldName = this._displayFields[layer];
-	          if (idField) {
-	            suggestions.push({
-	              text: this.options.formatSuggestion.call(this, feature),
-	              magicKey: result.attributes[idField] + ':' + layer
-	            });
-	          }
-	        }
-	      }
-	      callback(error, suggestions.reverse());
-	    }, this);
-	  },
-
-	  results: function (text, key, bounds, callback) {
-	    var results = [];
-	    var request;
-
-	    if (key) {
-	      var featureId = key.split(':')[0];
-	      var layer = key.split(':')[1];
-	      request = this.query().layer(layer).featureIds(featureId);
-	    } else {
-	      request = this.find().text(text).fields(this.options.searchFields).layers(this.options.layers);
-	    }
-
-	    return request.run(function (error, features, response) {
-	      if (!error) {
-	        if (response.results) {
-	          response.results = response.results.reverse();
-	        }
-	        for (var i = 0; i < features.features.length; i++) {
-	          var feature = features.features[i];
-	          layer = layer || response.results[i].layerId;
-
-	          if (feature && layer !== undefined) {
-	            var bounds = this._featureBounds(feature);
-	            feature.layerId = layer;
-	            feature.layerName = this._layerNames[layer];
-	            feature.displayFieldName = this._displayFields[layer];
-
-	            var result = {
-	              latlng: bounds.getCenter(),
-	              bounds: bounds,
-	              text: this.options.formatSuggestion.call(this, feature),
-	              properties: feature.properties,
-	              geojson: feature
-	            };
-
-	            results.push(result);
-	          }
-	        }
-	      }
-	      callback(error, results.reverse());
-	    }, this);
-	  },
-
-	  _featureBounds: function (feature) {
-	    var geojson = L.geoJson(feature);
-	    if (feature.geometry.type === 'Point') {
-	      var center = geojson.getBounds().getCenter();
-	      var lngRadius = ((this.options.bufferRadius / 40075017) * 360) / Math.cos((180 / Math.PI) * center.lat);
-	      var latRadius = (this.options.bufferRadius / 40075017) * 360;
-	      return L.latLngBounds([center.lat - latRadius, center.lng - lngRadius], [center.lat + latRadius, center.lng + lngRadius]);
-	    } else {
-	      return geojson.getBounds();
-	    }
-	  },
-
-	  _layerMetadataCallback: function (layerid) {
-	    return L.Util.bind(function (error, metadata) {
-	      if (error) { return; }
-	      this._displayFields[layerid] = metadata.displayField;
-	      this._layerNames[layerid] = metadata.name;
-	      for (var i = 0; i < metadata.fields.length; i++) {
-	        var field = metadata.fields[i];
-	        if (field.type === 'esriFieldTypeOID') {
-	          this._idFields[layerid] = field.name;
-	          break;
-	        }
-	      }
-	    }, this);
-	  },
-
-	  _getIdFields: function () {
-	    this._idFields = {};
-	    this._displayFields = {};
-	    this._layerNames = {};
-	    for (var i = 0; i < this.options.layers.length; i++) {
-	      var layer = this.options.layers[i];
-	      this.get(layer, {}, this._layerMetadataCallback(layer));
-	    }
-	  }
-	});
-
-	function mapServiceProvider (options) {
-	  return new MapServiceProvider(options);
-	}
-
-	var GeocodeServiceProvider = GeocodeService.extend({
-	  options: {
-	    label: 'Geocode Server',
-	    maxResults: 5
-	  },
-
-	  suggestions: function (text, bounds, callback) {
-	    if (this.options.supportsSuggest) {
-	      var request = this.suggest().text(text);
-	      if (bounds) {
-	        request.within(bounds);
-	      }
-
-	      return request.run(function (error, results, response) {
-	        var suggestions = [];
-	        if (!error) {
-	          while (response.suggestions.length && suggestions.length <= (this.options.maxResults - 1)) {
-	            var suggestion = response.suggestions.shift();
-	            if (!suggestion.isCollection) {
-	              suggestions.push({
-	                text: suggestion.text,
-	                magicKey: suggestion.magicKey
-	              });
-	            }
-	          }
-	        }
-	        callback(error, suggestions);
-	      }, this);
-	    } else {
-	      callback(undefined, []);
-	      return false;
-	    }
-	  },
-
-	  results: function (text, key, bounds, callback) {
-	    var request = this.geocode().text(text);
-
-	    request.maxLocations(this.options.maxResults);
-
-	    if (bounds) {
-	      request.within(bounds);
-	    }
-
-	    return request.run(function (error, response) {
-	      callback(error, response.results);
-	    }, this);
-	  }
-	});
-
-	function geocodeServiceProvider (options) {
-	  return new GeocodeServiceProvider(options);
-	}
-
-	var WorldGeocodingServiceUrl = 'https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/';
-
-	exports.WorldGeocodingServiceUrl = WorldGeocodingServiceUrl;
-	exports.VERSION = version;
-	exports.Geocode = Geocode;
-	exports.geocode = geocode;
-	exports.ReverseGeocode = ReverseGeocode;
-	exports.reverseGeocode = reverseGeocode;
-	exports.Suggest = Suggest;
-	exports.suggest = suggest;
-	exports.GeocodeService = GeocodeService;
-	exports.geocodeService = geocodeService;
-	exports.Geosearch = Geosearch;
-	exports.geosearch = geosearch;
-	exports.GeosearchCore = GeosearchCore;
-	exports.geosearchCore = geosearchCore;
-	exports.ArcgisOnlineProvider = ArcgisOnlineProvider;
-	exports.arcgisOnlineProvider = arcgisOnlineProvider;
-	exports.FeatureLayerProvider = FeatureLayerProvider;
-	exports.featureLayerProvider = featureLayerProvider;
-	exports.MapServiceProvider = MapServiceProvider;
-	exports.mapServiceProvider = mapServiceProvider;
-	exports.GeocodeServiceProvider = GeocodeServiceProvider;
-	exports.geocodeServiceProvider = geocodeServiceProvider;
-
-}));
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWdlb2NvZGVyLWRlYnVnLmpzIiwic291cmNlcyI6WyIuLi9wYWNrYWdlLmpzb24iLCIuLi9zcmMvVGFza3MvR2VvY29kZS5qcyIsIi4uL3NyYy9UYXNrcy9SZXZlcnNlR2VvY29kZS5qcyIsIi4uL3NyYy9UYXNrcy9TdWdnZXN0LmpzIiwiLi4vc3JjL1NlcnZpY2VzL0dlb2NvZGUuanMiLCIuLi9zcmMvQ2xhc3Nlcy9HZW9zZWFyY2hDb3JlLmpzIiwiLi4vc3JjL1Byb3ZpZGVycy9BcmNnaXNPbmxpbmVHZW9jb2Rlci5qcyIsIi4uL3NyYy9Db250cm9scy9HZW9zZWFyY2guanMiLCIuLi9zcmMvUHJvdmlkZXJzL0ZlYXR1cmVMYXllci5qcyIsIi4uL3NyYy9Qcm92aWRlcnMvTWFwU2VydmljZS5qcyIsIi4uL3NyYy9Qcm92aWRlcnMvR2VvY29kZVNlcnZpY2UuanMiLCIuLi9zcmMvRXNyaUxlYWZsZXRHZW9jb2RpbmcuanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXQtZ2VvY29kZXJcIixcbiAgXCJkZXNjcmlwdGlvblwiOiBcIkVzcmkgR2VvY29kaW5nIHV0aWxpdHkgYW5kIHNlYXJjaCBwbHVnaW4gZm9yIExlYWZsZXQuXCIsXG4gIFwidmVyc2lvblwiOiBcIjIuMi40XCIsXG4gIFwiYXV0aG9yXCI6IFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCIsXG4gIFwiY29udHJpYnV0b3JzXCI6IFtcbiAgICBcIlBhdHJpY2sgQXJsdCA8cGFybHRAZXNyaS5jb20+IChodHRwOi8vcGF0cmlja2FybHQuY29tKVwiLFxuICAgIFwiSm9obiBHcmF2b2lzIDxqZ3Jhdm9pc0Blc3JpLmNvbT4gKGh0dHA6Ly9qb2huZ3Jhdm9pcy5jb20pXCJcbiAgXSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4zXCIsXG4gICAgXCJsZWFmbGV0XCI6IFwiXjEuMC4wXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiY2hhaVwiOiBcIjMuNS4wXCIsXG4gICAgXCJnaC1yZWxlYXNlXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJodHRwLXNlcnZlclwiOiBcIl4wLjguNVwiLFxuICAgIFwiaW1hZ2VtaW5cIjogXCJeMy4yLjBcIixcbiAgICBcImlzcGFydGFcIjogXCJeNC4wLjBcIixcbiAgICBcImlzdGFuYnVsXCI6IFwiXjAuNC4yXCIsXG4gICAgXCJrYXJtYVwiOiBcIl4xLjMuMFwiLFxuICAgIFwia2FybWEtY2hhaS1zaW5vblwiOiBcIl4wLjEuM1wiLFxuICAgIFwia2FybWEtY292ZXJhZ2VcIjogXCJeMS4xLjFcIixcbiAgICBcImthcm1hLW1vY2hhXCI6IFwiXjEuMy4wXCIsXG4gICAgXCJrYXJtYS1tb2NoYS1yZXBvcnRlclwiOiBcIl4yLjIuMVwiLFxuICAgIFwia2FybWEtcGhhbnRvbWpzLWxhdW5jaGVyXCI6IFwiXjAuMi4wXCIsXG4gICAgXCJrYXJtYS1zb3VyY2VtYXAtbG9hZGVyXCI6IFwiXjAuMy41XCIsXG4gICAgXCJta2RpcnBcIjogXCJeMC41LjFcIixcbiAgICBcIm1vY2hhXCI6IFwiXjMuMS4wXCIsXG4gICAgXCJub2RlLXNhc3NcIjogXCJeMy4yLjBcIixcbiAgICBcInBhcmFsbGVsc2hlbGxcIjogXCJeMi4wLjBcIixcbiAgICBcInBoYW50b21qc1wiOiBcIl4xLjkuOFwiLFxuICAgIFwicm9sbHVwXCI6IFwiXjAuMjUuNFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1qc29uXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJyb2xsdXAtcGx1Z2luLW5vZGUtcmVzb2x2ZVwiOiBcIl4xLjQuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi11Z2xpZnlcIjogXCJeMC4zLjFcIixcbiAgICBcInNlbWlzdGFuZGFyZFwiOiBcIl45LjAuMFwiLFxuICAgIFwic2lub25cIjogXCJeMS4xMS4xXCIsXG4gICAgXCJzaW5vbi1jaGFpXCI6IFwiMi44LjBcIixcbiAgICBcInNuYXp6eVwiOiBcIl41LjAuMFwiLFxuICAgIFwidWdsaWZ5LWpzXCI6IFwiXjIuNi4xXCIsXG4gICAgXCJ3YXRjaFwiOiBcIl4wLjE3LjFcIlxuICB9LFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvZXNyaS1sZWFmbGV0LWdlb2NvZGVyXCIsXG4gIFwianNuZXh0Om1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXRHZW9jb2RpbmcuanNcIixcbiAgXCJqc3BtXCI6IHtcbiAgICBcInJlZ2lzdHJ5XCI6IFwibnBtXCIsXG4gICAgXCJmb3JtYXRcIjogXCJlczZcIixcbiAgICBcIm1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXRHZW9jb2RpbmcuanNcIlxuICB9LFxuICBcImxpY2Vuc2VcIjogXCJBcGFjaGUtMi4wXCIsXG4gIFwibWFpblwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LWdlb2NvZGVyLWRlYnVnLmpzXCIsXG4gIFwiYnJvd3NlclwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LWdlb2NvZGVyLWRlYnVnLmpzXCIsXG4gIFwicmVhZG1lRmlsZW5hbWVcIjogXCJSRUFETUUubWRcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdEBnaXRodWIuY29tOkVzcmkvZXNyaS1sZWFmbGV0LWdlb2NvZGVyLmdpdFwiXG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJwcmVidWlsZFwiOiBcIm1rZGlycCBkaXN0XCIsXG4gICAgXCJidWlsZFwiOiBcInJvbGx1cCAtYyBwcm9maWxlcy9kZWJ1Zy5qcyAmIHJvbGx1cCAtYyBwcm9maWxlcy9wcm9kdWN0aW9uLmpzICYgbnBtIHJ1biBjc3MgJiBucG0gcnVuIGltZ1wiLFxuICAgIFwiY3NzXCI6IFwibm9kZS1zYXNzIC4vc3JjL2VzcmktbGVhZmxldC1nZW9jb2Rlci5jc3MgLi9kaXN0L2VzcmktbGVhZmxldC1nZW9jb2Rlci5jc3MgLS1vdXRwdXQtc3R5bGUgY29tcHJlc3NlZFwiLFxuICAgIFwiaW1nXCI6IFwiaW1hZ2VtaW4gLi9zcmMvaW1nIC4vZGlzdC9pbWdcIixcbiAgICBcImxpbnRcIjogXCJzZW1pc3RhbmRhcmQgfCBzbmF6enlcIixcbiAgICBcInByZXB1Ymxpc2hcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJwcmV0ZXN0XCI6IFwibnBtIHJ1biBidWlsZFwiLFxuICAgIFwicmVsZWFzZVwiOiBcIi4vc2NyaXB0cy9yZWxlYXNlLnNoXCIsXG4gICAgXCJzdGFydC13YXRjaFwiOiBcIndhdGNoIFxcXCJucG0gcnVuIGJ1aWxkXFxcIiBzcmNcIixcbiAgICBcInN0YXJ0XCI6IFwicGFyYWxsZWxzaGVsbCBcXFwibnBtIHJ1biBzdGFydC13YXRjaFxcXCIgXFxcImh0dHAtc2VydmVyIC1wIDU2NzggLWMtMSAtb1xcXCJcIixcbiAgICBcInRlc3RcIjogXCJucG0gcnVuIGxpbnQgJiYga2FybWEgc3RhcnRcIlxuICB9LFxuICBcInNlbWlzdGFuZGFyZFwiOiB7XG4gICAgXCJnbG9iYWxzXCI6IFsgXCJleHBlY3RcIiwgXCJMXCIsIFwiWE1MSHR0cFJlcXVlc3RcIiwgXCJzaW5vblwiLCBcInhoclwiIF1cbiAgfSxcbiAgXCJzdHlsZVwiOiBcIi4vZGlzdC9lc3JpLWxlYWZsZXQtZ2VvY29kZXIuY3NzXCJcbn1cbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgVGFzaywgVXRpbCB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5pbXBvcnQgeyBXb3JsZEdlb2NvZGluZ1NlcnZpY2VVcmwgfSBmcm9tICcuLi9Fc3JpTGVhZmxldEdlb2NvZGluZyc7XG5cbmV4cG9ydCB2YXIgR2VvY29kZSA9IFRhc2suZXh0ZW5kKHtcbiAgcGF0aDogJ2ZpbmRBZGRyZXNzQ2FuZGlkYXRlcycsXG5cbiAgcGFyYW1zOiB7XG4gICAgb3V0U3I6IDQzMjYsXG4gICAgZm9yU3RvcmFnZTogZmFsc2UsXG4gICAgb3V0RmllbGRzOiAnKicsXG4gICAgbWF4TG9jYXRpb25zOiAyMFxuICB9LFxuXG4gIHNldHRlcnM6IHtcbiAgICAnYWRkcmVzcyc6ICdhZGRyZXNzJyxcbiAgICAnbmVpZ2hib3Job29kJzogJ25laWdoYm9yaG9vZCcsXG4gICAgJ2NpdHknOiAnY2l0eScsXG4gICAgJ3N1YnJlZ2lvbic6ICdzdWJyZWdpb24nLFxuICAgICdyZWdpb24nOiAncmVnaW9uJyxcbiAgICAncG9zdGFsJzogJ3Bvc3RhbCcsXG4gICAgJ2NvdW50cnknOiAnY291bnRyeScsXG4gICAgJ3RleHQnOiAnc2luZ2xlTGluZScsXG4gICAgJ2NhdGVnb3J5JzogJ2NhdGVnb3J5JyxcbiAgICAndG9rZW4nOiAndG9rZW4nLFxuICAgICdrZXknOiAnbWFnaWNLZXknLFxuICAgICdmaWVsZHMnOiAnb3V0RmllbGRzJyxcbiAgICAnZm9yU3RvcmFnZSc6ICdmb3JTdG9yYWdlJyxcbiAgICAnbWF4TG9jYXRpb25zJzogJ21heExvY2F0aW9ucydcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgfHwgV29ybGRHZW9jb2RpbmdTZXJ2aWNlVXJsO1xuICAgIFRhc2sucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgfSxcblxuICB3aXRoaW46IGZ1bmN0aW9uIChib3VuZHMpIHtcbiAgICBib3VuZHMgPSBMLmxhdExuZ0JvdW5kcyhib3VuZHMpO1xuICAgIHRoaXMucGFyYW1zLnNlYXJjaEV4dGVudCA9IFV0aWwuYm91bmRzVG9FeHRlbnQoYm91bmRzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBuZWFyYnk6IGZ1bmN0aW9uIChsYXRsbmcsIHJhZGl1cykge1xuICAgIGxhdGxuZyA9IEwubGF0TG5nKGxhdGxuZyk7XG4gICAgdGhpcy5wYXJhbXMubG9jYXRpb24gPSBsYXRsbmcubG5nICsgJywnICsgbGF0bG5nLmxhdDtcbiAgICB0aGlzLnBhcmFtcy5kaXN0YW5jZSA9IE1hdGgubWluKE1hdGgubWF4KHJhZGl1cywgMjAwMCksIDUwMDAwKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBydW46IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tUGFyYW0pIHtcbiAgICAgIHRoaXMucGFyYW1zW3RoaXMub3B0aW9ucy5jdXN0b21QYXJhbV0gPSB0aGlzLnBhcmFtcy5zaW5nbGVMaW5lO1xuICAgICAgZGVsZXRlIHRoaXMucGFyYW1zLnNpbmdsZUxpbmU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICB2YXIgcHJvY2Vzc29yID0gdGhpcy5fcHJvY2Vzc0dlb2NvZGVyUmVzcG9uc2U7XG4gICAgICB2YXIgcmVzdWx0cyA9ICghZXJyb3IpID8gcHJvY2Vzc29yKHJlc3BvbnNlKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIHsgcmVzdWx0czogcmVzdWx0cyB9LCByZXNwb25zZSk7XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgX3Byb2Nlc3NHZW9jb2RlclJlc3BvbnNlOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zZS5jYW5kaWRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2FuZGlkYXRlID0gcmVzcG9uc2UuY2FuZGlkYXRlc1tpXTtcbiAgICAgIGlmIChjYW5kaWRhdGUuZXh0ZW50KSB7XG4gICAgICAgIHZhciBib3VuZHMgPSBVdGlsLmV4dGVudFRvQm91bmRzKGNhbmRpZGF0ZS5leHRlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICB0ZXh0OiBjYW5kaWRhdGUuYWRkcmVzcyxcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgIHNjb3JlOiBjYW5kaWRhdGUuc2NvcmUsXG4gICAgICAgIGxhdGxuZzogTC5sYXRMbmcoY2FuZGlkYXRlLmxvY2F0aW9uLnksIGNhbmRpZGF0ZS5sb2NhdGlvbi54KSxcbiAgICAgICAgcHJvcGVydGllczogY2FuZGlkYXRlLmF0dHJpYnV0ZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9jb2RlIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgR2VvY29kZShvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2VvY29kZTtcbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5pbXBvcnQgeyBXb3JsZEdlb2NvZGluZ1NlcnZpY2VVcmwgfSBmcm9tICcuLi9Fc3JpTGVhZmxldEdlb2NvZGluZyc7XG5cbmV4cG9ydCB2YXIgUmV2ZXJzZUdlb2NvZGUgPSBUYXNrLmV4dGVuZCh7XG4gIHBhdGg6ICdyZXZlcnNlR2VvY29kZScsXG5cbiAgcGFyYW1zOiB7XG4gICAgb3V0U1I6IDQzMjYsXG4gICAgcmV0dXJuSW50ZXJzZWN0aW9uOiBmYWxzZVxuICB9LFxuXG4gIHNldHRlcnM6IHtcbiAgICAnZGlzdGFuY2UnOiAnZGlzdGFuY2UnLFxuICAgICdsYW5ndWFnZSc6ICdsYW5nQ29kZScsXG4gICAgJ2ludGVyc2VjdGlvbic6ICdyZXR1cm5JbnRlcnNlY3Rpb24nXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsIHx8IFdvcmxkR2VvY29kaW5nU2VydmljZVVybDtcbiAgICBUYXNrLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIH0sXG5cbiAgbGF0bG5nOiBmdW5jdGlvbiAobGF0bG5nKSB7XG4gICAgbGF0bG5nID0gTC5sYXRMbmcobGF0bG5nKTtcbiAgICB0aGlzLnBhcmFtcy5sb2NhdGlvbiA9IGxhdGxuZy5sbmcgKyAnLCcgKyBsYXRsbmcubGF0O1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJ1bjogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICBsYXRsbmc6IEwubGF0TG5nKHJlc3BvbnNlLmxvY2F0aW9uLnksIHJlc3BvbnNlLmxvY2F0aW9uLngpLFxuICAgICAgICAgIGFkZHJlc3M6IHJlc3BvbnNlLmFkZHJlc3NcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzdWx0LCByZXNwb25zZSk7XG4gICAgfSwgdGhpcyk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJzZUdlb2NvZGUgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBSZXZlcnNlR2VvY29kZShvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmV2ZXJzZUdlb2NvZGU7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFRhc2ssIFV0aWwgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuaW1wb3J0IHsgV29ybGRHZW9jb2RpbmdTZXJ2aWNlVXJsIH0gZnJvbSAnLi4vRXNyaUxlYWZsZXRHZW9jb2RpbmcnO1xuXG5leHBvcnQgdmFyIFN1Z2dlc3QgPSBUYXNrLmV4dGVuZCh7XG4gIHBhdGg6ICdzdWdnZXN0JyxcblxuICBwYXJhbXM6IHt9LFxuXG4gIHNldHRlcnM6IHtcbiAgICB0ZXh0OiAndGV4dCcsXG4gICAgY2F0ZWdvcnk6ICdjYXRlZ29yeScsXG4gICAgY291bnRyaWVzOiAnY291bnRyeUNvZGUnLFxuICAgIG1heFN1Z2dlc3Rpb25zOiAnbWF4U3VnZ2VzdGlvbnMnXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoIW9wdGlvbnMudXJsKSB7XG4gICAgICBvcHRpb25zLnVybCA9IFdvcmxkR2VvY29kaW5nU2VydmljZVVybDtcbiAgICAgIG9wdGlvbnMuc3VwcG9ydHNTdWdnZXN0ID0gdHJ1ZTtcbiAgICB9XG4gICAgVGFzay5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICB9LFxuXG4gIHdpdGhpbjogZnVuY3Rpb24gKGJvdW5kcykge1xuICAgIGJvdW5kcyA9IEwubGF0TG5nQm91bmRzKGJvdW5kcyk7XG4gICAgYm91bmRzID0gYm91bmRzLnBhZCgwLjUpO1xuICAgIHZhciBjZW50ZXIgPSBib3VuZHMuZ2V0Q2VudGVyKCk7XG4gICAgdmFyIG5lID0gYm91bmRzLmdldE5vcnRoV2VzdCgpO1xuICAgIHRoaXMucGFyYW1zLmxvY2F0aW9uID0gY2VudGVyLmxuZyArICcsJyArIGNlbnRlci5sYXQ7XG4gICAgdGhpcy5wYXJhbXMuZGlzdGFuY2UgPSBNYXRoLm1pbihNYXRoLm1heChjZW50ZXIuZGlzdGFuY2VUbyhuZSksIDIwMDApLCA1MDAwMCk7XG4gICAgdGhpcy5wYXJhbXMuc2VhcmNoRXh0ZW50ID0gVXRpbC5ib3VuZHNUb0V4dGVudChib3VuZHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG5lYXJieTogZnVuY3Rpb24gKGxhdGxuZywgcmFkaXVzKSB7XG4gICAgbGF0bG5nID0gTC5sYXRMbmcobGF0bG5nKTtcbiAgICB0aGlzLnBhcmFtcy5sb2NhdGlvbiA9IGxhdGxuZy5sbmcgKyAnLCcgKyBsYXRsbmcubGF0O1xuICAgIHRoaXMucGFyYW1zLmRpc3RhbmNlID0gTWF0aC5taW4oTWF0aC5tYXgocmFkaXVzLCAyMDAwKSwgNTAwMDApO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJ1bjogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdXBwb3J0c1N1Z2dlc3QpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybigndGhpcyBnZW9jb2Rpbmcgc2VydmljZSBkb2VzIG5vdCBzdXBwb3J0IGFza2luZyBmb3Igc3VnZ2VzdGlvbnMnKTtcbiAgICB9XG4gIH1cblxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWdnZXN0IChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgU3VnZ2VzdChvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3VnZ2VzdDtcbiIsImltcG9ydCB7IFNlcnZpY2UgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuaW1wb3J0IHsgV29ybGRHZW9jb2RpbmdTZXJ2aWNlVXJsIH0gZnJvbSAnLi4vRXNyaUxlYWZsZXRHZW9jb2RpbmcnO1xuaW1wb3J0IGdlb2NvZGUgZnJvbSAnLi4vVGFza3MvR2VvY29kZSc7XG5pbXBvcnQgcmV2ZXJzZUdlb2NvZGUgZnJvbSAnLi4vVGFza3MvUmV2ZXJzZUdlb2NvZGUnO1xuaW1wb3J0IHN1Z2dlc3QgZnJvbSAnLi4vVGFza3MvU3VnZ2VzdCc7XG5cbmV4cG9ydCB2YXIgR2VvY29kZVNlcnZpY2UgPSBTZXJ2aWNlLmV4dGVuZCh7XG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKG9wdGlvbnMudXJsKSB7XG4gICAgICBTZXJ2aWNlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgICB0aGlzLl9jb25maXJtU3VnZ2VzdFN1cHBvcnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy51cmwgPSBXb3JsZEdlb2NvZGluZ1NlcnZpY2VVcmw7XG4gICAgICBvcHRpb25zLnN1cHBvcnRzU3VnZ2VzdCA9IHRydWU7XG4gICAgICBTZXJ2aWNlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICB9LFxuXG4gIGdlb2NvZGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2VvY29kZSh0aGlzKTtcbiAgfSxcblxuICByZXZlcnNlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJldmVyc2VHZW9jb2RlKHRoaXMpO1xuICB9LFxuXG4gIHN1Z2dlc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAvLyByZXF1aXJlcyBlaXRoZXIgdGhlIEVzcmkgV29ybGQgR2VvY29kaW5nIFNlcnZpY2Ugb3IgYSA8MTAuMyBBcmNHSVMgU2VydmVyIEdlb2NvZGluZyBTZXJ2aWNlIHRoYXQgc3VwcG9ydHMgc3VnZ2VzdC5cbiAgICByZXR1cm4gc3VnZ2VzdCh0aGlzKTtcbiAgfSxcblxuICBfY29uZmlybVN1Z2dlc3RTdXBwb3J0OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5tZXRhZGF0YShmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9XG4gICAgICAvLyBwcmUgMTAuMyBnZW9jb2Rpbmcgc2VydmljZXMgZG9udCBsaXN0IGNhcGFiaWxpdGllcyAoYW5kIGRvbnQgc3VwcG9ydCBtYXhMb2NhdGlvbnMpXG4gICAgICAvLyBvbmx5IFNPTUUgaW5kaXZpZHVhbCBzZXJ2aWNlcyBoYXZlIGJlZW4gY29uZmlndXJlZCB0byBzdXBwb3J0IGFza2luZyBmb3Igc3VnZ2VzdGlvbnNcbiAgICAgIGlmICghcmVzcG9uc2UuY2FwYWJpbGl0aWVzKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zdXBwb3J0c1N1Z2dlc3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vcHRpb25zLmN1c3RvbVBhcmFtID0gcmVzcG9uc2Uuc2luZ2xlTGluZUFkZHJlc3NGaWVsZC5uYW1lO1xuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5jYXBhYmlsaXRpZXMuaW5kZXhPZignU3VnZ2VzdCcpID4gLTEpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnN1cHBvcnRzU3VnZ2VzdCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc3VwcG9ydHNTdWdnZXN0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VvY29kZVNlcnZpY2UgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBHZW9jb2RlU2VydmljZShvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2VvY29kZVNlcnZpY2U7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcblxuZXhwb3J0IHZhciBHZW9zZWFyY2hDb3JlID0gTC5FdmVudGVkLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIHpvb21Ub1Jlc3VsdDogdHJ1ZSxcbiAgICB1c2VNYXBCb3VuZHM6IDEyLFxuICAgIHNlYXJjaEJvdW5kczogbnVsbFxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChjb250cm9sLCBvcHRpb25zKSB7XG4gICAgTC5VdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5fY29udHJvbCA9IGNvbnRyb2w7XG5cbiAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMucHJvdmlkZXJzIHx8ICFvcHRpb25zLnByb3ZpZGVycy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgcHJvdmlkZXInKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcm92aWRlcnMgPSBvcHRpb25zLnByb3ZpZGVycztcbiAgfSxcblxuICBfZ2VvY29kZTogZnVuY3Rpb24gKHRleHQsIGtleSwgcHJvdmlkZXIpIHtcbiAgICB2YXIgYWN0aXZlUmVxdWVzdHMgPSAwO1xuICAgIHZhciBhbGxSZXN1bHRzID0gW107XG4gICAgdmFyIGJvdW5kcztcblxuICAgIHZhciBjYWxsYmFjayA9IEwuVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvciwgcmVzdWx0cykge1xuICAgICAgYWN0aXZlUmVxdWVzdHMtLTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHRzKSB7XG4gICAgICAgIGFsbFJlc3VsdHMgPSBhbGxSZXN1bHRzLmNvbmNhdChyZXN1bHRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZVJlcXVlc3RzIDw9IDApIHtcbiAgICAgICAgYm91bmRzID0gdGhpcy5fYm91bmRzRnJvbVJlc3VsdHMoYWxsUmVzdWx0cyk7XG5cbiAgICAgICAgdGhpcy5maXJlKCdyZXN1bHRzJywge1xuICAgICAgICAgIHJlc3VsdHM6IGFsbFJlc3VsdHMsXG4gICAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgICAgbGF0bG5nOiAoYm91bmRzKSA/IGJvdW5kcy5nZXRDZW50ZXIoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB0ZXh0OiB0ZXh0XG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuem9vbVRvUmVzdWx0ICYmIGJvdW5kcykge1xuICAgICAgICAgIHRoaXMuX2NvbnRyb2wuX21hcC5maXRCb3VuZHMoYm91bmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnbG9hZCcpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgaWYgKGtleSkge1xuICAgICAgYWN0aXZlUmVxdWVzdHMrKztcbiAgICAgIHByb3ZpZGVyLnJlc3VsdHModGV4dCwga2V5LCB0aGlzLl9zZWFyY2hCb3VuZHMoKSwgY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3Byb3ZpZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhY3RpdmVSZXF1ZXN0cysrO1xuICAgICAgICB0aGlzLl9wcm92aWRlcnNbaV0ucmVzdWx0cyh0ZXh0LCBrZXksIHRoaXMuX3NlYXJjaEJvdW5kcygpLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIF9zdWdnZXN0OiBmdW5jdGlvbiAodGV4dCkge1xuICAgIHZhciBhY3RpdmVSZXF1ZXN0cyA9IHRoaXMuX3Byb3ZpZGVycy5sZW5ndGg7XG5cbiAgICB2YXIgY3JlYXRlQ2FsbGJhY2sgPSBMLlV0aWwuYmluZChmdW5jdGlvbiAodGV4dCwgcHJvdmlkZXIpIHtcbiAgICAgIHJldHVybiBMLlV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIHN1Z2dlc3Rpb25zKSB7XG4gICAgICAgIGlmIChlcnJvcikgeyByZXR1cm47IH1cblxuICAgICAgICB2YXIgaTtcblxuICAgICAgICBhY3RpdmVSZXF1ZXN0cyA9IGFjdGl2ZVJlcXVlc3RzIC0gMTtcblxuICAgICAgICBpZiAodGV4dC5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgdGhpcy5fc3VnZ2VzdGlvbnMuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgdGhpcy5fc3VnZ2VzdGlvbnMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3VnZ2VzdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1Z2dlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzdWdnZXN0aW9uc1tpXS5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB3ZSBzdGlsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgVUlcbiAgICAgICAgICB0aGlzLl9jb250cm9sLl9yZW5kZXJTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvdmlkZXIuX2xhc3RSZW5kZXIgIT09IHRleHQgJiYgcHJvdmlkZXIubm9kZXMpIHtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJvdmlkZXIubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChwcm92aWRlci5ub2Rlc1tpXS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wuX3N1Z2dlc3Rpb25zLnJlbW92ZUNoaWxkKHByb3ZpZGVyLm5vZGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwcm92aWRlci5ub2RlcyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1Z2dlc3Rpb25zLmxlbmd0aCAmJiB0aGlzLl9jb250cm9sLl9pbnB1dC52YWx1ZSA9PT0gdGV4dCkge1xuICAgICAgICAgIHRoaXMuX2NvbnRyb2wuY2xlYXJTdWdnZXN0aW9ucyhwcm92aWRlci5ub2Rlcyk7XG5cbiAgICAgICAgICBwcm92aWRlci5fbGFzdFJlbmRlciA9IHRleHQ7XG4gICAgICAgICAgcHJvdmlkZXIubm9kZXMgPSB0aGlzLl9jb250cm9sLl9yZW5kZXJTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7XG4gICAgICAgICAgdGhpcy5fY29udHJvbC5fbm9kZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcyk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICB0aGlzLl9wZW5kaW5nU3VnZ2VzdGlvbnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fcHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvdmlkZXIgPSB0aGlzLl9wcm92aWRlcnNbaV07XG4gICAgICB2YXIgcmVxdWVzdCA9IHByb3ZpZGVyLnN1Z2dlc3Rpb25zKHRleHQsIHRoaXMuX3NlYXJjaEJvdW5kcygpLCBjcmVhdGVDYWxsYmFjayh0ZXh0LCBwcm92aWRlcikpO1xuICAgICAgdGhpcy5fcGVuZGluZ1N1Z2dlc3Rpb25zLnB1c2gocmVxdWVzdCk7XG4gICAgfVxuICB9LFxuXG4gIF9zZWFyY2hCb3VuZHM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnNlYXJjaEJvdW5kcyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zZWFyY2hCb3VuZHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VNYXBCb3VuZHMgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZU1hcEJvdW5kcyA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbnRyb2wuX21hcC5nZXRCb3VuZHMoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZU1hcEJvdW5kcyA8PSB0aGlzLl9jb250cm9sLl9tYXAuZ2V0Wm9vbSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29udHJvbC5fbWFwLmdldEJvdW5kcygpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9LFxuXG4gIF9ib3VuZHNGcm9tUmVzdWx0czogZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG51bGxJc2xhbmQgPSBMLmxhdExuZ0JvdW5kcyhbMCwgMF0sIFswLCAwXSk7XG4gICAgdmFyIHJlc3VsdEJvdW5kcyA9IFtdO1xuICAgIHZhciByZXN1bHRMYXRsbmdzID0gW107XG5cbiAgICAvLyBjb2xsZWN0IHRoZSBib3VuZHMgYW5kIGNlbnRlciBvZiBlYWNoIHJlc3VsdFxuICAgIGZvciAodmFyIGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gcmVzdWx0c1tpXTtcblxuICAgICAgcmVzdWx0TGF0bG5ncy5wdXNoKHJlc3VsdC5sYXRsbmcpO1xuXG4gICAgICAvLyBtYWtlIHN1cmUgYm91bmRzIGFyZSB2YWxpZCBhbmQgbm90IDAsMC4gc29tZXRpbWVzIGJvdW5kcyBhcmUgaW5jb3JyZWN0IG9yIG5vdCBwcmVzZW50XG4gICAgICBpZiAocmVzdWx0LmJvdW5kcyAmJiByZXN1bHQuYm91bmRzLmlzVmFsaWQoKSAmJiAhcmVzdWx0LmJvdW5kcy5lcXVhbHMobnVsbElzbGFuZCkpIHtcbiAgICAgICAgcmVzdWx0Qm91bmRzLnB1c2gocmVzdWx0LmJvdW5kcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybSBhIGJvdW5kcyBvYmplY3QgY29udGFpbmluZyBhbGwgY2VudGVyIHBvaW50c1xuICAgIHZhciBib3VuZHMgPSBMLmxhdExuZ0JvdW5kcyhyZXN1bHRMYXRsbmdzKTtcblxuICAgIC8vIGFuZCBleHRlbmQgaXQgdG8gY29udGFpbiBhbGwgYm91bmRzIG9iamVjdHNcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJlc3VsdEJvdW5kcy5sZW5ndGg7IGorKykge1xuICAgICAgYm91bmRzLmV4dGVuZChyZXN1bHRCb3VuZHNbal0pO1xuICAgIH1cblxuICAgIHJldHVybiBib3VuZHM7XG4gIH0sXG5cbiAgX2dldEF0dHJpYnV0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGF0dHJpYnMgPSBbXTtcbiAgICB2YXIgcHJvdmlkZXJzID0gdGhpcy5fcHJvdmlkZXJzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwcm92aWRlcnNbaV0ub3B0aW9ucy5hdHRyaWJ1dGlvbikge1xuICAgICAgICBhdHRyaWJzLnB1c2gocHJvdmlkZXJzW2ldLm9wdGlvbnMuYXR0cmlidXRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJzLmpvaW4oJywgJyk7XG4gIH1cblxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9zZWFyY2hDb3JlIChjb250cm9sLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgR2Vvc2VhcmNoQ29yZShjb250cm9sLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2Vvc2VhcmNoQ29yZTtcbiIsImltcG9ydCB7IEdlb2NvZGVTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvR2VvY29kZSc7XG5cbmV4cG9ydCB2YXIgQXJjZ2lzT25saW5lUHJvdmlkZXIgPSBHZW9jb2RlU2VydmljZS5leHRlbmQoe1xuICBvcHRpb25zOiB7XG4gICAgbGFiZWw6ICdQbGFjZXMgYW5kIEFkZHJlc3NlcycsXG4gICAgbWF4UmVzdWx0czogNVxuICB9LFxuXG4gIHN1Z2dlc3Rpb25zOiBmdW5jdGlvbiAodGV4dCwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIHZhciByZXF1ZXN0ID0gdGhpcy5zdWdnZXN0KCkudGV4dCh0ZXh0KTtcblxuICAgIGlmIChib3VuZHMpIHtcbiAgICAgIHJlcXVlc3Qud2l0aGluKGJvdW5kcyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb3VudHJpZXMpIHtcbiAgICAgIHJlcXVlc3QuY291bnRyaWVzKHRoaXMub3B0aW9ucy5jb3VudHJpZXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2F0ZWdvcmllcykge1xuICAgICAgcmVxdWVzdC5jYXRlZ29yeSh0aGlzLm9wdGlvbnMuY2F0ZWdvcmllcyk7XG4gICAgfVxuXG4gICAgLy8gMTUgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN1Z2dlc3Rpb25zIHRoYXQgY2FuIGJlIHJldHVybmVkXG4gICAgcmVxdWVzdC5tYXhTdWdnZXN0aW9ucyh0aGlzLm9wdGlvbnMubWF4UmVzdWx0cyk7XG5cbiAgICByZXR1cm4gcmVxdWVzdC5ydW4oZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzLCByZXNwb25zZSkge1xuICAgICAgdmFyIHN1Z2dlc3Rpb25zID0gW107XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHdoaWxlIChyZXNwb25zZS5zdWdnZXN0aW9ucy5sZW5ndGggJiYgc3VnZ2VzdGlvbnMubGVuZ3RoIDw9ICh0aGlzLm9wdGlvbnMubWF4UmVzdWx0cyAtIDEpKSB7XG4gICAgICAgICAgdmFyIHN1Z2dlc3Rpb24gPSByZXNwb25zZS5zdWdnZXN0aW9ucy5zaGlmdCgpO1xuICAgICAgICAgIGlmICghc3VnZ2VzdGlvbi5pc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICB0ZXh0OiBzdWdnZXN0aW9uLnRleHQsXG4gICAgICAgICAgICAgIG1hZ2ljS2V5OiBzdWdnZXN0aW9uLm1hZ2ljS2V5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKGVycm9yLCBzdWdnZXN0aW9ucyk7XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgcmVzdWx0czogZnVuY3Rpb24gKHRleHQsIGtleSwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIHZhciByZXF1ZXN0ID0gdGhpcy5nZW9jb2RlKCkudGV4dCh0ZXh0KTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIHJlcXVlc3Qua2V5KGtleSk7XG4gICAgfVxuICAgIC8vIGluIHRoZSBmdXR1cmUgQWRkcmVzcy9TdHJlZXROYW1lIGdlb2NvZGluZyByZXF1ZXN0cyB0aGF0IGluY2x1ZGUgYSBtYWdpY0tleSB3aWxsIGFsd2F5cyBvbmx5IHJldHVybiBvbmUgbWF0Y2hcbiAgICByZXF1ZXN0Lm1heExvY2F0aW9ucyh0aGlzLm9wdGlvbnMubWF4UmVzdWx0cyk7XG5cbiAgICBpZiAoYm91bmRzKSB7XG4gICAgICByZXF1ZXN0LndpdGhpbihib3VuZHMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZm9yU3RvcmFnZSkge1xuICAgICAgcmVxdWVzdC5mb3JTdG9yYWdlKHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0LnJ1bihmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgcmVzcG9uc2UucmVzdWx0cyk7XG4gICAgfSwgdGhpcyk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gYXJjZ2lzT25saW5lUHJvdmlkZXIgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBBcmNnaXNPbmxpbmVQcm92aWRlcihvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJjZ2lzT25saW5lUHJvdmlkZXI7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IGdlb3NlYXJjaENvcmUgfSBmcm9tICcuLi9DbGFzc2VzL0dlb3NlYXJjaENvcmUnO1xuaW1wb3J0IHsgYXJjZ2lzT25saW5lUHJvdmlkZXIgfSBmcm9tICcuLi9Qcm92aWRlcnMvQXJjZ2lzT25saW5lR2VvY29kZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5cbmV4cG9ydCB2YXIgR2Vvc2VhcmNoID0gTC5Db250cm9sLmV4dGVuZCh7XG4gIGluY2x1ZGVzOiBMLk1peGluLkV2ZW50cyxcblxuICBvcHRpb25zOiB7XG4gICAgcG9zaXRpb246ICd0b3BsZWZ0JyxcbiAgICBjb2xsYXBzZUFmdGVyUmVzdWx0OiB0cnVlLFxuICAgIGV4cGFuZGVkOiBmYWxzZSxcbiAgICBhbGxvd011bHRpcGxlUmVzdWx0czogdHJ1ZSxcbiAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCBmb3IgcGxhY2VzIG9yIGFkZHJlc3NlcycsXG4gICAgdGl0bGU6ICdMb2NhdGlvbiBTZWFyY2gnXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBMLlV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcblxuICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5wcm92aWRlcnMgfHwgIW9wdGlvbnMucHJvdmlkZXJzLmxlbmd0aCkge1xuICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMucHJvdmlkZXJzID0gWyBhcmNnaXNPbmxpbmVQcm92aWRlcigpIF07XG4gICAgfVxuXG4gICAgLy8gaW5zdGFudGlhdGUgdGhlIHVuZGVybHlpbmcgY2xhc3MgYW5kIHBhc3MgYWxvbmcgb3B0aW9uc1xuICAgIHRoaXMuX2dlb3NlYXJjaENvcmUgPSBnZW9zZWFyY2hDb3JlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX3Byb3ZpZGVycyA9IG9wdGlvbnMucHJvdmlkZXJzO1xuXG4gICAgLy8gYnViYmxlIGVhY2ggcHJvdmlkZXJzIGV2ZW50cyB0byB0aGUgY29udHJvbFxuICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuYWRkRXZlbnRQYXJlbnQodGhpcyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9nZW9zZWFyY2hDb3JlLl9wcm92aWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX3Byb3ZpZGVyc1tpXS5hZGRFdmVudFBhcmVudCh0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9nZW9zZWFyY2hDb3JlLl9wZW5kaW5nU3VnZ2VzdGlvbnMgPSBbXTtcblxuICAgIEwuQ29udHJvbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKG9wdGlvbnMpO1xuICB9LFxuXG4gIF9yZW5kZXJTdWdnZXN0aW9uczogZnVuY3Rpb24gKHN1Z2dlc3Rpb25zKSB7XG4gICAgdmFyIGN1cnJlbnRHcm91cDtcblxuICAgIGlmIChzdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9zdWdnZXN0aW9ucy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG4gICAgLy8gc2V0IHRoZSBtYXhIZWlnaHQgb2YgdGhlIHN1Z2dlc3Rpb25zIGJveCB0b1xuICAgIC8vIG1hcCBoZWlnaHRcbiAgICAvLyAtIHN1Z2dlc3Rpb25zIG9mZnNldCAoZGlzdGFuY2UgZnJvbSB0b3Agb2Ygc3VnZ2VzdGlvbnMgdG8gdG9wIG9mIGNvbnRyb2wpXG4gICAgLy8gLSBjb250cm9sIG9mZnNldCAoZGlzdGFuY2UgZnJvbSB0b3Agb2YgY29udHJvbCB0byB0b3Agb2YgbWFwKVxuICAgIC8vIC0gMTAgKGV4dHJhIHBhZGRpbmcpXG4gICAgdGhpcy5fc3VnZ2VzdGlvbnMuc3R5bGUubWF4SGVpZ2h0ID0gKHRoaXMuX21hcC5nZXRTaXplKCkueSAtIHRoaXMuX3N1Z2dlc3Rpb25zLm9mZnNldFRvcCAtIHRoaXMuX3dyYXBwZXIub2Zmc2V0VG9wIC0gMTApICsgJ3B4JztcblxuICAgIHZhciBub2RlcyA9IFtdO1xuICAgIHZhciBsaXN0O1xuICAgIHZhciBoZWFkZXI7XG4gICAgdmFyIHN1Z2dlc3Rpb25UZXh0QXJyYXkgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VnZ2VzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdWdnZXN0aW9uID0gc3VnZ2VzdGlvbnNbaV07XG4gICAgICBpZiAoIWhlYWRlciAmJiB0aGlzLl9nZW9zZWFyY2hDb3JlLl9wcm92aWRlcnMubGVuZ3RoID4gMSAmJiBjdXJyZW50R3JvdXAgIT09IHN1Z2dlc3Rpb24ucHJvdmlkZXIub3B0aW9ucy5sYWJlbCkge1xuICAgICAgICBoZWFkZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCdzcGFuJywgJ2dlb2NvZGVyLWNvbnRyb2wtaGVhZGVyJywgdGhpcy5fc3VnZ2VzdGlvbnMpO1xuICAgICAgICBoZWFkZXIudGV4dENvbnRlbnQgPSBzdWdnZXN0aW9uLnByb3ZpZGVyLm9wdGlvbnMubGFiZWw7XG4gICAgICAgIGhlYWRlci5pbm5lclRleHQgPSBzdWdnZXN0aW9uLnByb3ZpZGVyLm9wdGlvbnMubGFiZWw7XG4gICAgICAgIGN1cnJlbnRHcm91cCA9IHN1Z2dlc3Rpb24ucHJvdmlkZXIub3B0aW9ucy5sYWJlbDtcbiAgICAgICAgbm9kZXMucHVzaChoZWFkZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgbGlzdCA9IEwuRG9tVXRpbC5jcmVhdGUoJ3VsJywgJ2dlb2NvZGVyLWNvbnRyb2wtbGlzdCcsIHRoaXMuX3N1Z2dlc3Rpb25zKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN1Z2dlc3Rpb25UZXh0QXJyYXkuaW5kZXhPZihzdWdnZXN0aW9uLnRleHQpID09PSAtMSkge1xuICAgICAgICB2YXIgc3VnZ2VzdGlvbkl0ZW0gPSBMLkRvbVV0aWwuY3JlYXRlKCdsaScsICdnZW9jb2Rlci1jb250cm9sLXN1Z2dlc3Rpb24nLCBsaXN0KTtcblxuICAgICAgICBzdWdnZXN0aW9uSXRlbS5pbm5lckhUTUwgPSBzdWdnZXN0aW9uLnRleHQ7XG4gICAgICAgIHN1Z2dlc3Rpb25JdGVtLnByb3ZpZGVyID0gc3VnZ2VzdGlvbi5wcm92aWRlcjtcbiAgICAgICAgc3VnZ2VzdGlvbkl0ZW1bJ2RhdGEtbWFnaWMta2V5J10gPSBzdWdnZXN0aW9uLm1hZ2ljS2V5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsaXN0LmNoaWxkTm9kZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAvLyBpZiB0aGUgc2FtZSB0ZXh0IGFscmVhZHkgYXBwZWFycyBpbiB0aGUgbGlzdCBvZiBzdWdnZXN0aW9ucywgYXBwZW5kIGFuIGFkZGl0aW9uYWwgT2JqZWN0SUQgdG8gaXRzIG1hZ2ljS2V5IGluc3RlYWRcbiAgICAgICAgICBpZiAobGlzdC5jaGlsZE5vZGVzW2pdLmlubmVySFRNTCA9PT0gc3VnZ2VzdGlvbi50ZXh0KSB7XG4gICAgICAgICAgICBsaXN0LmNoaWxkTm9kZXNbal1bJ2RhdGEtbWFnaWMta2V5J10gKz0gJywnICsgc3VnZ2VzdGlvbi5tYWdpY0tleTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN1Z2dlc3Rpb25UZXh0QXJyYXkucHVzaChzdWdnZXN0aW9uLnRleHQpO1xuICAgIH1cblxuICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9pbnB1dCwgJ2dlb2NvZGVyLWNvbnRyb2wtbG9hZGluZycpO1xuXG4gICAgbm9kZXMucHVzaChsaXN0KTtcblxuICAgIHJldHVybiBub2RlcztcbiAgfSxcblxuICBfYm91bmRzRnJvbVJlc3VsdHM6IGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgaWYgKCFyZXN1bHRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBudWxsSXNsYW5kID0gTC5sYXRMbmdCb3VuZHMoWzAsIDBdLCBbMCwgMF0pO1xuICAgIHZhciByZXN1bHRCb3VuZHMgPSBbXTtcbiAgICB2YXIgcmVzdWx0TGF0bG5ncyA9IFtdO1xuXG4gICAgLy8gY29sbGVjdCB0aGUgYm91bmRzIGFuZCBjZW50ZXIgb2YgZWFjaCByZXN1bHRcbiAgICBmb3IgKHZhciBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHJlc3VsdHNbaV07XG5cbiAgICAgIHJlc3VsdExhdGxuZ3MucHVzaChyZXN1bHQubGF0bG5nKTtcblxuICAgICAgLy8gbWFrZSBzdXJlIGJvdW5kcyBhcmUgdmFsaWQgYW5kIG5vdCAwLDAuIHNvbWV0aW1lcyBib3VuZHMgYXJlIGluY29ycmVjdCBvciBub3QgcHJlc2VudFxuICAgICAgaWYgKHJlc3VsdC5ib3VuZHMgJiYgcmVzdWx0LmJvdW5kcy5pc1ZhbGlkKCkgJiYgIXJlc3VsdC5ib3VuZHMuZXF1YWxzKG51bGxJc2xhbmQpKSB7XG4gICAgICAgIHJlc3VsdEJvdW5kcy5wdXNoKHJlc3VsdC5ib3VuZHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZvcm0gYSBib3VuZHMgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGNlbnRlciBwb2ludHNcbiAgICB2YXIgYm91bmRzID0gTC5sYXRMbmdCb3VuZHMocmVzdWx0TGF0bG5ncyk7XG5cbiAgICAvLyBhbmQgZXh0ZW5kIGl0IHRvIGNvbnRhaW4gYWxsIGJvdW5kcyBvYmplY3RzXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByZXN1bHRCb3VuZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGJvdW5kcy5leHRlbmQocmVzdWx0Qm91bmRzW2pdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm91bmRzO1xuICB9LFxuXG4gIGNsZWFyOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fc3VnZ2VzdGlvbnMuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5fc3VnZ2VzdGlvbnMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLl9pbnB1dC52YWx1ZSA9ICcnO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsYXBzZUFmdGVyUmVzdWx0KSB7XG4gICAgICB0aGlzLl9pbnB1dC5wbGFjZWhvbGRlciA9ICcnO1xuICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX3dyYXBwZXIsICdnZW9jb2Rlci1jb250cm9sLWV4cGFuZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9tYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZWQoKSAmJiB0aGlzLl9tYXAub3B0aW9ucy5zY3JvbGxXaGVlbFpvb20pIHtcbiAgICAgIHRoaXMuX21hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlKCk7XG4gICAgfVxuICB9LFxuXG4gIGNsZWFyU3VnZ2VzdGlvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fbm9kZXMpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5fbm9kZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgaWYgKHRoaXMuX25vZGVzW2tdLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLl9zdWdnZXN0aW9ucy5yZW1vdmVDaGlsZCh0aGlzLl9ub2Rlc1trXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX3NldHVwQ2xpY2s6IGZ1bmN0aW9uICgpIHtcbiAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fd3JhcHBlciwgJ2dlb2NvZGVyLWNvbnRyb2wtZXhwYW5kZWQnKTtcbiAgICB0aGlzLl9pbnB1dC5mb2N1cygpO1xuICB9LFxuXG4gIGRpc2FibGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9pbnB1dC5kaXNhYmxlZCA9IHRydWU7XG4gICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2lucHV0LCAnZ2VvY29kZXItY29udHJvbC1pbnB1dC1kaXNhYmxlZCcpO1xuICAgIEwuRG9tRXZlbnQucmVtb3ZlTGlzdGVuZXIodGhpcy5fd3JhcHBlciwgJ2NsaWNrJywgdGhpcy5fc2V0dXBDbGljaywgdGhpcyk7XG4gIH0sXG5cbiAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5faW5wdXQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBMLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5faW5wdXQsICdnZW9jb2Rlci1jb250cm9sLWlucHV0LWRpc2FibGVkJyk7XG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl93cmFwcGVyLCAnY2xpY2snLCB0aGlzLl9zZXR1cENsaWNrLCB0aGlzKTtcbiAgfSxcblxuICBnZXRBdHRyaWJ1dGlvbjogZnVuY3Rpb24gKCkge1xuICAgIHZhciBhdHRyaWJzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3Byb3ZpZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX3Byb3ZpZGVyc1tpXS5vcHRpb25zLmF0dHJpYnV0aW9uKSB7XG4gICAgICAgIGF0dHJpYnMucHVzaCh0aGlzLl9wcm92aWRlcnNbaV0ub3B0aW9ucy5hdHRyaWJ1dGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnMuam9pbignLCAnKTtcbiAgfSxcblxuICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgIC8vIGluY2x1ZGUgJ1Bvd2VyZWQgYnkgRXNyaScgaW4gbWFwIGF0dHJpYnV0aW9uXG4gICAgVXRpbC5zZXRFc3JpQXR0cmlidXRpb24obWFwKTtcblxuICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICB0aGlzLl93cmFwcGVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2dlb2NvZGVyLWNvbnRyb2wnKTtcbiAgICB0aGlzLl9pbnB1dCA9IEwuRG9tVXRpbC5jcmVhdGUoJ2lucHV0JywgJ2dlb2NvZGVyLWNvbnRyb2wtaW5wdXQgbGVhZmxldC1iYXInLCB0aGlzLl93cmFwcGVyKTtcbiAgICB0aGlzLl9pbnB1dC50aXRsZSA9IHRoaXMub3B0aW9ucy50aXRsZTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZXhwYW5kZWQpIHtcbiAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl93cmFwcGVyLCAnZ2VvY29kZXItY29udHJvbC1leHBhbmRlZCcpO1xuICAgICAgdGhpcy5faW5wdXQucGxhY2Vob2xkZXIgPSB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgdGhpcy5fc3VnZ2VzdGlvbnMgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnLCAnZ2VvY29kZXItY29udHJvbC1zdWdnZXN0aW9ucyBsZWFmbGV0LWJhcicsIHRoaXMuX3dyYXBwZXIpO1xuXG4gICAgdmFyIGNyZWRpdHMgPSB0aGlzLl9nZW9zZWFyY2hDb3JlLl9nZXRBdHRyaWJ1dGlvbigpO1xuICAgIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuYWRkQXR0cmlidXRpb24oY3JlZGl0cyk7XG5cbiAgICBMLkRvbUV2ZW50LmFkZExpc3RlbmVyKHRoaXMuX2lucHV0LCAnZm9jdXMnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5faW5wdXQucGxhY2Vob2xkZXIgPSB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fd3JhcHBlciwgJ2dlb2NvZGVyLWNvbnRyb2wtZXhwYW5kZWQnKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIEwuRG9tRXZlbnQuYWRkTGlzdGVuZXIodGhpcy5fd3JhcHBlciwgJ2NsaWNrJywgdGhpcy5fc2V0dXBDbGljaywgdGhpcyk7XG5cbiAgICBMLkRvbUV2ZW50LmFkZExpc3RlbmVyKHRoaXMuX3N1Z2dlc3Rpb25zLCAnbW91c2Vkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBzdWdnZXN0aW9uSXRlbSA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDtcbiAgICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX2dlb2NvZGUoc3VnZ2VzdGlvbkl0ZW0uaW5uZXJIVE1MLCBzdWdnZXN0aW9uSXRlbVsnZGF0YS1tYWdpYy1rZXknXSwgc3VnZ2VzdGlvbkl0ZW0ucHJvdmlkZXIpO1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl9pbnB1dCwgJ2JsdXInLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl9pbnB1dCwgJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHRleHQgPSAoZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50KS52YWx1ZTtcblxuICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX3dyYXBwZXIsICdnZW9jb2Rlci1jb250cm9sLWV4cGFuZGVkJyk7XG5cbiAgICAgIHZhciBsaXN0ID0gdGhpcy5fc3VnZ2VzdGlvbnMucXVlcnlTZWxlY3RvckFsbCgnLicgKyAnZ2VvY29kZXItY29udHJvbC1zdWdnZXN0aW9uJyk7XG4gICAgICB2YXIgc2VsZWN0ZWQgPSB0aGlzLl9zdWdnZXN0aW9ucy5xdWVyeVNlbGVjdG9yQWxsKCcuJyArICdnZW9jb2Rlci1jb250cm9sLXNlbGVjdGVkJylbMF07XG4gICAgICB2YXIgc2VsZWN0ZWRQb3NpdGlvbjtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChsaXN0W2ldID09PSBzZWxlY3RlZCkge1xuICAgICAgICAgIHNlbGVjdGVkUG9zaXRpb24gPSBpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgLypcbiAgICAgICAgICAgIGlmIGFuIGl0ZW0gaGFzIGJlZW4gc2VsZWN0ZWQsIGdlb2NvZGUgaXRcbiAgICAgICAgICAgIGlmIGZvY3VzIGlzIG9uIHRoZSBpbnB1dCB0ZXh0Ym94LCBnZW9jb2RlIG9ubHkgaWYgbXVsdGlwbGUgcmVzdWx0cyBhcmUgYWxsb3dlZCBhbmQgbW9yZSB0aGFuIHR3byBjaGFyYWN0ZXJzIGFyZSBwcmVzZW50LCBvciBpZiBhIHNpbmdsZSBzdWdnZXN0aW9uIGlzIGRpc3BsYXllZC5cbiAgICAgICAgICAgIGlmIGxlc3MgdGhhbiB0d28gY2hhcmFjdGVycyBoYXZlIGJlZW4gdHlwZWQsIGFib3J0IHRoZSBnZW9jb2RlXG4gICAgICAgICAgKi9cbiAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX2dlb2NvZGUoc2VsZWN0ZWQuaW5uZXJIVE1MLCBzZWxlY3RlZFsnZGF0YS1tYWdpYy1rZXknXSwgc2VsZWN0ZWQucHJvdmlkZXIpO1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmFsbG93TXVsdGlwbGVSZXN1bHRzICYmIHRleHQubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX2dlb2NvZGUodGhpcy5faW5wdXQudmFsdWUsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3MobGlzdFswXSwgJ2dlb2NvZGVyLWNvbnRyb2wtc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgdGhpcy5fZ2Vvc2VhcmNoQ29yZS5fZ2VvY29kZShsaXN0WzBdLmlubmVySFRNTCwgbGlzdFswXVsnZGF0YS1tYWdpYy1rZXknXSwgbGlzdFswXS5wcm92aWRlcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICAgIHRoaXMuX2lucHV0LmJsdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgTC5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdChlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyhzZWxlY3RlZCwgJ2dlb2NvZGVyLWNvbnRyb2wtc2VsZWN0ZWQnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcHJldmlvdXNJdGVtID0gbGlzdFtzZWxlY3RlZFBvc2l0aW9uIC0gMV07XG5cbiAgICAgICAgICBpZiAoc2VsZWN0ZWQgJiYgcHJldmlvdXNJdGVtKSB7XG4gICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3MocHJldmlvdXNJdGVtLCAnZ2VvY29kZXItY29udHJvbC1zZWxlY3RlZCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3MobGlzdFtsaXN0Lmxlbmd0aCAtIDFdLCAnZ2VvY29kZXItY29udHJvbC1zZWxlY3RlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBMLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKHNlbGVjdGVkLCAnZ2VvY29kZXItY29udHJvbC1zZWxlY3RlZCcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuZXh0SXRlbSA9IGxpc3Rbc2VsZWN0ZWRQb3NpdGlvbiArIDFdO1xuXG4gICAgICAgICAgaWYgKHNlbGVjdGVkICYmIG5leHRJdGVtKSB7XG4gICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3MobmV4dEl0ZW0sICdnZW9jb2Rlci1jb250cm9sLXNlbGVjdGVkJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyhsaXN0WzBdLCAnZ2VvY29kZXItY29udHJvbC1zZWxlY3RlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBMLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IGNoYW5nZXMgd2Ugc2hvdWxkIGNhbmNlbCBhbGwgcGVuZGluZyBzdWdnZXN0aW9uIHJlcXVlc3RzIGlmIHBvc3NpYmxlIHRvIGF2b2lkIHJlc3VsdCBjb2xsaXNpb25zXG4gICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLl9nZW9zZWFyY2hDb3JlLl9wZW5kaW5nU3VnZ2VzdGlvbnMubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gdGhpcy5fZ2Vvc2VhcmNoQ29yZS5fcGVuZGluZ1N1Z2dlc3Rpb25zW3hdO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QgJiYgcmVxdWVzdC5hYm9ydCAmJiAhcmVxdWVzdC5pZCkge1xuICAgICAgICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl9pbnB1dCwgJ2tleXVwJywgTC5VdGlsLnRocm90dGxlKGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIga2V5ID0gZS53aGljaCB8fCBlLmtleUNvZGU7XG4gICAgICB2YXIgdGV4dCA9IChlLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQpLnZhbHVlO1xuXG4gICAgICAvLyByZXF1aXJlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyBmb3Igc3VnZ2VzdGlvbnNcbiAgICAgIGlmICh0ZXh0Lmxlbmd0aCA8IDIpIHtcbiAgICAgICAgdGhpcy5fc3VnZ2VzdGlvbnMuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHRoaXMuX3N1Z2dlc3Rpb25zLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9pbnB1dCwgJ2dlb2NvZGVyLWNvbnRyb2wtbG9hZGluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGVzY2FwZSBrZXkgaXQgd2lsbCBjbGVhciB0aGUgaW5wdXQgc28gY2xlYXIgc3VnZ2VzdGlvbnNcbiAgICAgIGlmIChrZXkgPT09IDI3KSB7XG4gICAgICAgIHRoaXMuX3N1Z2dlc3Rpb25zLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLl9zdWdnZXN0aW9ucy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoaXMgaXMgTk9UIHRoZSB1cC9kb3duIGFycm93cyBvciBlbnRlciBtYWtlIGEgc3VnZ2VzdGlvblxuICAgICAgaWYgKGtleSAhPT0gMTMgJiYga2V5ICE9PSAzOCAmJiBrZXkgIT09IDQwKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbnB1dC52YWx1ZSAhPT0gdGhpcy5fbGFzdFZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5fbGFzdFZhbHVlID0gdGhpcy5faW5wdXQudmFsdWU7XG4gICAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2lucHV0LCAnZ2VvY29kZXItY29udHJvbC1sb2FkaW5nJyk7XG4gICAgICAgICAgdGhpcy5fZ2Vvc2VhcmNoQ29yZS5fc3VnZ2VzdCh0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDUwLCB0aGlzKSwgdGhpcyk7XG5cbiAgICBMLkRvbUV2ZW50LmRpc2FibGVDbGlja1Byb3BhZ2F0aW9uKHRoaXMuX3dyYXBwZXIpO1xuXG4gICAgLy8gd2hlbiBtb3VzZSBtb3ZlcyBvdmVyIHN1Z2dlc3Rpb25zIGRpc2FibGUgc2Nyb2xsIHdoZWVsIHpvb20gaWYgaXRzIGVuYWJsZWRcbiAgICBMLkRvbUV2ZW50LmFkZExpc3RlbmVyKHRoaXMuX3N1Z2dlc3Rpb25zLCAnbW91c2VvdmVyJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChtYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZWQoKSAmJiBtYXAub3B0aW9ucy5zY3JvbGxXaGVlbFpvb20pIHtcbiAgICAgICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5kaXNhYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyB3aGVuIG1vdXNlIG1vdmVzIGxlYXZlcyBzdWdnZXN0aW9ucyBlbmFibGUgc2Nyb2xsIHdoZWVsIHpvb20gaWYgaXRzIGRpc2FibGVkXG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl9zdWdnZXN0aW9ucywgJ21vdXNlb3V0JywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghbWFwLnNjcm9sbFdoZWVsWm9vbS5lbmFibGVkKCkgJiYgbWFwLm9wdGlvbnMuc2Nyb2xsV2hlZWxab29tKSB7XG4gICAgICAgIG1hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9nZW9zZWFyY2hDb3JlLm9uKCdsb2FkJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9pbnB1dCwgJ2dlb2NvZGVyLWNvbnRyb2wtbG9hZGluZycpO1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgdGhpcy5faW5wdXQuYmx1cigpO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3dyYXBwZXI7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2Vvc2VhcmNoIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgR2Vvc2VhcmNoKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZW9zZWFyY2g7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IEZlYXR1cmVMYXllclNlcnZpY2UgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuXG5leHBvcnQgdmFyIEZlYXR1cmVMYXllclByb3ZpZGVyID0gRmVhdHVyZUxheWVyU2VydmljZS5leHRlbmQoe1xuICBvcHRpb25zOiB7XG4gICAgbGFiZWw6ICdGZWF0dXJlIExheWVyJyxcbiAgICBtYXhSZXN1bHRzOiA1LFxuICAgIGJ1ZmZlclJhZGl1czogMTAwMCxcbiAgICBmb3JtYXRTdWdnZXN0aW9uOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgICAgcmV0dXJuIGZlYXR1cmUucHJvcGVydGllc1t0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzWzBdXTtcbiAgICB9XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBGZWF0dXJlTGF5ZXJTZXJ2aWNlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5vcHRpb25zLnNlYXJjaEZpZWxkcyA9IFt0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzXTtcbiAgICB9XG4gICAgdGhpcy5fc3VnZ2VzdGlvbnNRdWVyeSA9IHRoaXMucXVlcnkoKTtcbiAgICB0aGlzLl9yZXN1bHRzUXVlcnkgPSB0aGlzLnF1ZXJ5KCk7XG4gIH0sXG5cbiAgc3VnZ2VzdGlvbnM6IGZ1bmN0aW9uICh0ZXh0LCBib3VuZHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpcy5fc3VnZ2VzdGlvbnNRdWVyeS53aGVyZSh0aGlzLl9idWlsZFF1ZXJ5KHRleHQpKVxuICAgICAgLnJldHVybkdlb21ldHJ5KGZhbHNlKTtcblxuICAgIGlmIChib3VuZHMpIHtcbiAgICAgIHF1ZXJ5LmludGVyc2VjdHMoYm91bmRzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmlkRmllbGQpIHtcbiAgICAgIHF1ZXJ5LmZpZWxkcyhbdGhpcy5vcHRpb25zLmlkRmllbGRdLmNvbmNhdCh0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzKSk7XG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3QgPSBxdWVyeS5ydW4oZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzLCByYXcpIHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjYWxsYmFjayhlcnJvciwgW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmlkRmllbGQgPSByYXcub2JqZWN0SWRGaWVsZE5hbWU7XG4gICAgICAgIHZhciBzdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gcmVzdWx0cy5mZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHZhciBmZWF0dXJlID0gcmVzdWx0cy5mZWF0dXJlc1tpXTtcbiAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMub3B0aW9ucy5mb3JtYXRTdWdnZXN0aW9uLmNhbGwodGhpcywgZmVhdHVyZSksXG4gICAgICAgICAgICBtYWdpY0tleTogZmVhdHVyZS5pZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKGVycm9yLCBzdWdnZXN0aW9ucy5zbGljZSgwLCB0aGlzLm9wdGlvbnMubWF4UmVzdWx0cykpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH0sXG5cbiAgcmVzdWx0czogZnVuY3Rpb24gKHRleHQsIGtleSwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIHZhciBxdWVyeSA9IHRoaXMuX3Jlc3VsdHNRdWVyeTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIGRlbGV0ZSBxdWVyeS5wYXJhbXMud2hlcmU7XG4gICAgICBxdWVyeS5mZWF0dXJlSWRzKFtrZXldKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkud2hlcmUodGhpcy5fYnVpbGRRdWVyeSh0ZXh0KSk7XG4gICAgfVxuXG4gICAgaWYgKGJvdW5kcykge1xuICAgICAgcXVlcnkud2l0aGluKGJvdW5kcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5LnJ1bihMLlV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIGZlYXR1cmVzKSB7XG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzLmZlYXR1cmVzW2ldO1xuICAgICAgICBpZiAoZmVhdHVyZSkge1xuICAgICAgICAgIHZhciBib3VuZHMgPSB0aGlzLl9mZWF0dXJlQm91bmRzKGZlYXR1cmUpO1xuXG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGxhdGxuZzogYm91bmRzLmdldENlbnRlcigpLFxuICAgICAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgICAgICB0ZXh0OiB0aGlzLm9wdGlvbnMuZm9ybWF0U3VnZ2VzdGlvbi5jYWxsKHRoaXMsIGZlYXR1cmUpLFxuICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgZ2VvanNvbjogZmVhdHVyZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcblxuICAgICAgICAgIC8vIGNsZWFyIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoZSBuZXh0IHNlYXJjaFxuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9yZXN1bHRzUXVlcnkucGFyYW1zWydvYmplY3RJZHMnXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FsbGJhY2soZXJyb3IsIHJlc3VsdHMpO1xuICAgIH0sIHRoaXMpKTtcbiAgfSxcblxuICBvcmRlckJ5OiBmdW5jdGlvbiAoZmllbGROYW1lLCBvcmRlcikge1xuICAgIHRoaXMuX3N1Z2dlc3Rpb25zUXVlcnkub3JkZXJCeShmaWVsZE5hbWUsIG9yZGVyKTtcbiAgfSxcblxuICBfYnVpbGRRdWVyeTogZnVuY3Rpb24gKHRleHQpIHtcbiAgICB2YXIgcXVlcnlTdHJpbmcgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSB0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZmllbGQgPSAndXBwZXIoXCInICsgdGhpcy5vcHRpb25zLnNlYXJjaEZpZWxkc1tpXSArICdcIiknO1xuXG4gICAgICBxdWVyeVN0cmluZy5wdXNoKGZpZWxkICsgXCIgTElLRSB1cHBlcignJVwiICsgdGV4dCArIFwiJScpXCIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMud2hlcmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud2hlcmUgKyAnIEFORCAoJyArIHF1ZXJ5U3RyaW5nLmpvaW4oJyBPUiAnKSArICcpJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1ZXJ5U3RyaW5nLmpvaW4oJyBPUiAnKTtcbiAgICB9XG4gIH0sXG5cbiAgX2ZlYXR1cmVCb3VuZHM6IGZ1bmN0aW9uIChmZWF0dXJlKSB7XG4gICAgdmFyIGdlb2pzb24gPSBMLmdlb0pzb24oZmVhdHVyZSk7XG4gICAgaWYgKGZlYXR1cmUuZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgdmFyIGNlbnRlciA9IGdlb2pzb24uZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7XG4gICAgICB2YXIgbG5nUmFkaXVzID0gKCh0aGlzLm9wdGlvbnMuYnVmZmVyUmFkaXVzIC8gNDAwNzUwMTcpICogMzYwKSAvIE1hdGguY29zKCgxODAgLyBNYXRoLlBJKSAqIGNlbnRlci5sYXQpO1xuICAgICAgdmFyIGxhdFJhZGl1cyA9ICh0aGlzLm9wdGlvbnMuYnVmZmVyUmFkaXVzIC8gNDAwNzUwMTcpICogMzYwO1xuICAgICAgcmV0dXJuIEwubGF0TG5nQm91bmRzKFtjZW50ZXIubGF0IC0gbGF0UmFkaXVzLCBjZW50ZXIubG5nIC0gbG5nUmFkaXVzXSwgW2NlbnRlci5sYXQgKyBsYXRSYWRpdXMsIGNlbnRlci5sbmcgKyBsbmdSYWRpdXNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdlb2pzb24uZ2V0Qm91bmRzKCk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZlYXR1cmVMYXllclByb3ZpZGVyIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRmVhdHVyZUxheWVyUHJvdmlkZXIob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZlYXR1cmVMYXllclByb3ZpZGVyO1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBNYXBTZXJ2aWNlIH0gZnJvbSAnZXNyaS1sZWFmbGV0JztcblxuZXhwb3J0IHZhciBNYXBTZXJ2aWNlUHJvdmlkZXIgPSBNYXBTZXJ2aWNlLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBsYXllcnM6IFswXSxcbiAgICBsYWJlbDogJ01hcCBTZXJ2aWNlJyxcbiAgICBidWZmZXJSYWRpdXM6IDEwMDAsXG4gICAgbWF4UmVzdWx0czogNSxcbiAgICBmb3JtYXRTdWdnZXN0aW9uOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgICAgcmV0dXJuIGZlYXR1cmUucHJvcGVydGllc1tmZWF0dXJlLmRpc3BsYXlGaWVsZE5hbWVdICsgJyA8c21hbGw+JyArIGZlYXR1cmUubGF5ZXJOYW1lICsgJzwvc21hbGw+JztcbiAgICB9XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBNYXBTZXJ2aWNlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5fZ2V0SWRGaWVsZHMoKTtcbiAgfSxcblxuICBzdWdnZXN0aW9uczogZnVuY3Rpb24gKHRleHQsIGJvdW5kcywgY2FsbGJhY2spIHtcbiAgICB2YXIgcmVxdWVzdCA9IHRoaXMuZmluZCgpLnRleHQodGV4dCkuZmllbGRzKHRoaXMub3B0aW9ucy5zZWFyY2hGaWVsZHMpLnJldHVybkdlb21ldHJ5KGZhbHNlKS5sYXllcnModGhpcy5vcHRpb25zLmxheWVycyk7XG5cbiAgICByZXR1cm4gcmVxdWVzdC5ydW4oZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzLCByYXcpIHtcbiAgICAgIHZhciBzdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICB2YXIgY291bnQgPSBNYXRoLm1pbih0aGlzLm9wdGlvbnMubWF4UmVzdWx0cywgcmVzdWx0cy5mZWF0dXJlcy5sZW5ndGgpO1xuICAgICAgICByYXcucmVzdWx0cyA9IHJhdy5yZXN1bHRzLnJldmVyc2UoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZlYXR1cmUgPSByZXN1bHRzLmZlYXR1cmVzW2ldO1xuICAgICAgICAgIHZhciByZXN1bHQgPSByYXcucmVzdWx0c1tpXTtcbiAgICAgICAgICB2YXIgbGF5ZXIgPSByZXN1bHQubGF5ZXJJZDtcbiAgICAgICAgICB2YXIgaWRGaWVsZCA9IHRoaXMuX2lkRmllbGRzW2xheWVyXTtcbiAgICAgICAgICBmZWF0dXJlLmxheWVySWQgPSBsYXllcjtcbiAgICAgICAgICBmZWF0dXJlLmxheWVyTmFtZSA9IHRoaXMuX2xheWVyTmFtZXNbbGF5ZXJdO1xuICAgICAgICAgIGZlYXR1cmUuZGlzcGxheUZpZWxkTmFtZSA9IHRoaXMuX2Rpc3BsYXlGaWVsZHNbbGF5ZXJdO1xuICAgICAgICAgIGlmIChpZEZpZWxkKSB7XG4gICAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgdGV4dDogdGhpcy5vcHRpb25zLmZvcm1hdFN1Z2dlc3Rpb24uY2FsbCh0aGlzLCBmZWF0dXJlKSxcbiAgICAgICAgICAgICAgbWFnaWNLZXk6IHJlc3VsdC5hdHRyaWJ1dGVzW2lkRmllbGRdICsgJzonICsgbGF5ZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FsbGJhY2soZXJyb3IsIHN1Z2dlc3Rpb25zLnJldmVyc2UoKSk7XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgcmVzdWx0czogZnVuY3Rpb24gKHRleHQsIGtleSwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgdmFyIHJlcXVlc3Q7XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICB2YXIgZmVhdHVyZUlkID0ga2V5LnNwbGl0KCc6JylbMF07XG4gICAgICB2YXIgbGF5ZXIgPSBrZXkuc3BsaXQoJzonKVsxXTtcbiAgICAgIHJlcXVlc3QgPSB0aGlzLnF1ZXJ5KCkubGF5ZXIobGF5ZXIpLmZlYXR1cmVJZHMoZmVhdHVyZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdCA9IHRoaXMuZmluZCgpLnRleHQodGV4dCkuZmllbGRzKHRoaXMub3B0aW9ucy5zZWFyY2hGaWVsZHMpLmxheWVycyh0aGlzLm9wdGlvbnMubGF5ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdC5ydW4oZnVuY3Rpb24gKGVycm9yLCBmZWF0dXJlcywgcmVzcG9uc2UpIHtcbiAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdHMpIHtcbiAgICAgICAgICByZXNwb25zZS5yZXN1bHRzID0gcmVzcG9uc2UucmVzdWx0cy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXMuZmVhdHVyZXNbaV07XG4gICAgICAgICAgbGF5ZXIgPSBsYXllciB8fCByZXNwb25zZS5yZXN1bHRzW2ldLmxheWVySWQ7XG5cbiAgICAgICAgICBpZiAoZmVhdHVyZSAmJiBsYXllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgYm91bmRzID0gdGhpcy5fZmVhdHVyZUJvdW5kcyhmZWF0dXJlKTtcbiAgICAgICAgICAgIGZlYXR1cmUubGF5ZXJJZCA9IGxheWVyO1xuICAgICAgICAgICAgZmVhdHVyZS5sYXllck5hbWUgPSB0aGlzLl9sYXllck5hbWVzW2xheWVyXTtcbiAgICAgICAgICAgIGZlYXR1cmUuZGlzcGxheUZpZWxkTmFtZSA9IHRoaXMuX2Rpc3BsYXlGaWVsZHNbbGF5ZXJdO1xuXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICBsYXRsbmc6IGJvdW5kcy5nZXRDZW50ZXIoKSxcbiAgICAgICAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgICAgICAgIHRleHQ6IHRoaXMub3B0aW9ucy5mb3JtYXRTdWdnZXN0aW9uLmNhbGwodGhpcywgZmVhdHVyZSksXG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgZ2VvanNvbjogZmVhdHVyZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYWxsYmFjayhlcnJvciwgcmVzdWx0cy5yZXZlcnNlKCkpO1xuICAgIH0sIHRoaXMpO1xuICB9LFxuXG4gIF9mZWF0dXJlQm91bmRzOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgIHZhciBnZW9qc29uID0gTC5nZW9Kc29uKGZlYXR1cmUpO1xuICAgIGlmIChmZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgIHZhciBjZW50ZXIgPSBnZW9qc29uLmdldEJvdW5kcygpLmdldENlbnRlcigpO1xuICAgICAgdmFyIGxuZ1JhZGl1cyA9ICgodGhpcy5vcHRpb25zLmJ1ZmZlclJhZGl1cyAvIDQwMDc1MDE3KSAqIDM2MCkgLyBNYXRoLmNvcygoMTgwIC8gTWF0aC5QSSkgKiBjZW50ZXIubGF0KTtcbiAgICAgIHZhciBsYXRSYWRpdXMgPSAodGhpcy5vcHRpb25zLmJ1ZmZlclJhZGl1cyAvIDQwMDc1MDE3KSAqIDM2MDtcbiAgICAgIHJldHVybiBMLmxhdExuZ0JvdW5kcyhbY2VudGVyLmxhdCAtIGxhdFJhZGl1cywgY2VudGVyLmxuZyAtIGxuZ1JhZGl1c10sIFtjZW50ZXIubGF0ICsgbGF0UmFkaXVzLCBjZW50ZXIubG5nICsgbG5nUmFkaXVzXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZW9qc29uLmdldEJvdW5kcygpO1xuICAgIH1cbiAgfSxcblxuICBfbGF5ZXJNZXRhZGF0YUNhbGxiYWNrOiBmdW5jdGlvbiAobGF5ZXJpZCkge1xuICAgIHJldHVybiBMLlV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIG1ldGFkYXRhKSB7XG4gICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9XG4gICAgICB0aGlzLl9kaXNwbGF5RmllbGRzW2xheWVyaWRdID0gbWV0YWRhdGEuZGlzcGxheUZpZWxkO1xuICAgICAgdGhpcy5fbGF5ZXJOYW1lc1tsYXllcmlkXSA9IG1ldGFkYXRhLm5hbWU7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGFkYXRhLmZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmllbGQgPSBtZXRhZGF0YS5maWVsZHNbaV07XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZXNyaUZpZWxkVHlwZU9JRCcpIHtcbiAgICAgICAgICB0aGlzLl9pZEZpZWxkc1tsYXllcmlkXSA9IGZpZWxkLm5hbWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICBfZ2V0SWRGaWVsZHM6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9pZEZpZWxkcyA9IHt9O1xuICAgIHRoaXMuX2Rpc3BsYXlGaWVsZHMgPSB7fTtcbiAgICB0aGlzLl9sYXllck5hbWVzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGF5ZXIgPSB0aGlzLm9wdGlvbnMubGF5ZXJzW2ldO1xuICAgICAgdGhpcy5nZXQobGF5ZXIsIHt9LCB0aGlzLl9sYXllck1ldGFkYXRhQ2FsbGJhY2sobGF5ZXIpKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFwU2VydmljZVByb3ZpZGVyIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgTWFwU2VydmljZVByb3ZpZGVyKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBTZXJ2aWNlUHJvdmlkZXI7XG4iLCJpbXBvcnQgeyBHZW9jb2RlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0dlb2NvZGUnO1xuXG5leHBvcnQgdmFyIEdlb2NvZGVTZXJ2aWNlUHJvdmlkZXIgPSBHZW9jb2RlU2VydmljZS5leHRlbmQoe1xuICBvcHRpb25zOiB7XG4gICAgbGFiZWw6ICdHZW9jb2RlIFNlcnZlcicsXG4gICAgbWF4UmVzdWx0czogNVxuICB9LFxuXG4gIHN1Z2dlc3Rpb25zOiBmdW5jdGlvbiAodGV4dCwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydHNTdWdnZXN0KSB7XG4gICAgICB2YXIgcmVxdWVzdCA9IHRoaXMuc3VnZ2VzdCgpLnRleHQodGV4dCk7XG4gICAgICBpZiAoYm91bmRzKSB7XG4gICAgICAgIHJlcXVlc3Qud2l0aGluKGJvdW5kcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXF1ZXN0LnJ1bihmdW5jdGlvbiAoZXJyb3IsIHJlc3VsdHMsIHJlc3BvbnNlKSB7XG4gICAgICAgIHZhciBzdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgd2hpbGUgKHJlc3BvbnNlLnN1Z2dlc3Rpb25zLmxlbmd0aCAmJiBzdWdnZXN0aW9ucy5sZW5ndGggPD0gKHRoaXMub3B0aW9ucy5tYXhSZXN1bHRzIC0gMSkpIHtcbiAgICAgICAgICAgIHZhciBzdWdnZXN0aW9uID0gcmVzcG9uc2Uuc3VnZ2VzdGlvbnMuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmICghc3VnZ2VzdGlvbi5pc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGV4dDogc3VnZ2VzdGlvbi50ZXh0LFxuICAgICAgICAgICAgICAgIG1hZ2ljS2V5OiBzdWdnZXN0aW9uLm1hZ2ljS2V5XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhlcnJvciwgc3VnZ2VzdGlvbnMpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgW10pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcblxuICByZXN1bHRzOiBmdW5jdGlvbiAodGV4dCwga2V5LCBib3VuZHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHJlcXVlc3QgPSB0aGlzLmdlb2NvZGUoKS50ZXh0KHRleHQpO1xuXG4gICAgcmVxdWVzdC5tYXhMb2NhdGlvbnModGhpcy5vcHRpb25zLm1heFJlc3VsdHMpO1xuXG4gICAgaWYgKGJvdW5kcykge1xuICAgICAgcmVxdWVzdC53aXRoaW4oYm91bmRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdC5ydW4oZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgY2FsbGJhY2soZXJyb3IsIHJlc3BvbnNlLnJlc3VsdHMpO1xuICAgIH0sIHRoaXMpO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdlb2NvZGVTZXJ2aWNlUHJvdmlkZXIgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBHZW9jb2RlU2VydmljZVByb3ZpZGVyKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZW9jb2RlU2VydmljZVByb3ZpZGVyO1xuIiwiZXhwb3J0IHsgdmVyc2lvbiBhcyBWRVJTSU9OIH0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcbmV4cG9ydCB2YXIgV29ybGRHZW9jb2RpbmdTZXJ2aWNlVXJsID0gJ2h0dHBzOi8vZ2VvY29kZS5hcmNnaXMuY29tL2FyY2dpcy9yZXN0L3NlcnZpY2VzL1dvcmxkL0dlb2NvZGVTZXJ2ZXIvJztcblxuLy8gaW1wb3J0IHRhc2tzXG5leHBvcnQgeyBHZW9jb2RlLCBnZW9jb2RlIH0gZnJvbSAnLi9UYXNrcy9HZW9jb2RlJztcbmV4cG9ydCB7IFJldmVyc2VHZW9jb2RlLCByZXZlcnNlR2VvY29kZSB9IGZyb20gJy4vVGFza3MvUmV2ZXJzZUdlb2NvZGUnO1xuZXhwb3J0IHsgU3VnZ2VzdCwgc3VnZ2VzdCB9IGZyb20gJy4vVGFza3MvU3VnZ2VzdCc7XG5cbi8vIGltcG9ydCBzZXJ2aWNlXG5leHBvcnQgeyBHZW9jb2RlU2VydmljZSwgZ2VvY29kZVNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2VzL0dlb2NvZGUnO1xuXG4vLyBpbXBvcnQgY29udHJvbFxuZXhwb3J0IHsgR2Vvc2VhcmNoLCBnZW9zZWFyY2ggfSBmcm9tICcuL0NvbnRyb2xzL0dlb3NlYXJjaCc7XG5cbi8vIGltcG9ydCBzdXBwb3J0aW5nIGNsYXNzXG5leHBvcnQgeyBHZW9zZWFyY2hDb3JlLCBnZW9zZWFyY2hDb3JlIH0gZnJvbSAnLi9DbGFzc2VzL0dlb3NlYXJjaENvcmUnO1xuXG4vLyBpbXBvcnQgcHJvdmlkZXJzXG5leHBvcnQgeyBBcmNnaXNPbmxpbmVQcm92aWRlciwgYXJjZ2lzT25saW5lUHJvdmlkZXIgfSBmcm9tICcuL1Byb3ZpZGVycy9BcmNnaXNPbmxpbmVHZW9jb2Rlcic7XG5leHBvcnQgeyBGZWF0dXJlTGF5ZXJQcm92aWRlciwgZmVhdHVyZUxheWVyUHJvdmlkZXIgfSBmcm9tICcuL1Byb3ZpZGVycy9GZWF0dXJlTGF5ZXInO1xuZXhwb3J0IHsgTWFwU2VydmljZVByb3ZpZGVyLCBtYXBTZXJ2aWNlUHJvdmlkZXIgfSBmcm9tICcuL1Byb3ZpZGVycy9NYXBTZXJ2aWNlJztcbmV4cG9ydCB7IEdlb2NvZGVTZXJ2aWNlUHJvdmlkZXIsIGdlb2NvZGVTZXJ2aWNlUHJvdmlkZXIgfSBmcm9tICcuL1Byb3ZpZGVycy9HZW9jb2RlU2VydmljZSc7XG4iXSwibmFtZXMiOlsiVGFzayIsIlV0aWwiLCJTZXJ2aWNlIiwiRmVhdHVyZUxheWVyU2VydmljZSIsIk1hcFNlcnZpY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Q0NJTyxJQUFJLE9BQU8sR0FBR0EsZ0JBQUksQ0FBQyxNQUFNLENBQUM7QUFDakMsQ0FBQSxFQUFFLElBQUksRUFBRSx1QkFBdUI7O0FBRS9CLENBQUEsRUFBRSxNQUFNLEVBQUU7QUFDVixDQUFBLElBQUksS0FBSyxFQUFFLElBQUk7QUFDZixDQUFBLElB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QU07QUFDWCxDQUFBLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDckcsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUM1RCxDQUFBLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNsQixDQUFBLFFBQVEsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO0FBQzlCLENBQUEsVUFBVSxRQUFRLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDeEQsQ0FBQSxTQUFTO0FBQ1QsQ0FBQSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMzRCxDQUFBLFVBQVUsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxDQUFBLFVBQVUsS0FBSyxHQUFHLEtBQUssSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQzs7QUFFdkQsQ0FBQSxVQUFVLElBQUksT0FBTyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFDOUMsQ0FBQSxZQUFZLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEQsQ0FBQSxZQUFZLE9BQU8sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLENBQUEsWUFBWSxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFD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
\ No newline at end of file
--- a/src/pyams_gis/resources/js/leaflet-esri-geocoder-2.2.4.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-q(function(b,a){typeof exports==="object"&&typeof module!=="undefined"?a(exports,require("leaflet"),require("esri-leaflet")):typeof define==="function"&&define.amd?define(["exports","leaflet","esri-leaflet"],a):(a((b.L=b.L||{},b.L.esri=b.L.esri||{},b.L.esri.Geocoding=b.L.esri.Geocoding||{}),b.L,b.L.esri))}(this,function(y,g,w){g="default" in g?g["default"]:g;var d="2.2.4";var t=w.Task.extend({path:"findAddressCandidates",params:{outSr:4326,forStorage:false,outFields:"*",maxLocations:20},setters:{address:"address",neighborhood:"neighborhood",city:"city",subregion:"subregion",region:"region",postal:"postal",country:"country",text:"singleLine",category:"category",token:"token",key:"magicKey",fields:"outFields",forStorage:"forStorage",maxLocations:"maxLocations"},initialize:function(z){z=z||{};z.url=z.url||i;w.Task.prototype.initialize.call(this,z)},within:function(z){z=g.latLngBounds(z);this.params.searchExtent=w.Util.boundsToExtent(z);return this},nearby:function(A,z){A=g.latLng(A);this.params.location=A.lng+","+A.lat;this.params.distance=Math.min(Math.max(z,2000),50000);return this},run:function(A,z){if(this.options.customParam){this.params[this.options.customParam]=this.params.singleLine;delete this.params.singleLine}return this.request(function(C,B){var E=this._processGeocoderResponse;var D=(!C)?E(B):undefined;A.call(z,C,{results:D},B)},this)},_processGeocoderResponse:function(z){var B=[];for(var A=0;A<z.candidates.length;A++){var C=z.candidates[A];if(C.extent){var D=w.Util.extentToBounds(C.extent)}B.push({text:C.address,bounds:D,score:C.score,latlng:g.latLng(C.location.y,C.location.x),properties:C.attributes})}return B}});function e(z){return new t(z)}var x=w.Task.extend({path:"reverseGeocode",params:{outSR:4326,returnIntersection:false},setters:{distance:"distance",language:"langCode",intersection:"returnIntersection"},initialize:function(z){z=z||{};z.url=z.url||i;w.Task.prototype.initialize.call(this,z)},latlng:function(z){z=g.latLng(z);this.params.location=z.lng+","+z.lat;return this},run:function(A,z){return this.request(function(D,C){var B;if(!D){B={latlng:g.latLng(C.location.y,C.location.x),address:C.address}}else{B=undefined}A.call(z,D,B,C)},this)}});function m(z){return new x(z)}var l=w.Task.extend({path:"suggest",params:{},setters:{text:"text",category:"category",countries:"countryCode",maxSuggestions:"maxSuggestions"},initialize:function(z){z=z||{};if(!z.url){z.url=i;z.supportsSuggest=true}w.Task.prototype.initialize.call(this,z)},within:function(A){A=g.latLngBounds(A);A=A.pad(0.5);var z=A.getCenter();var B=A.getNorthWest();this.params.location=z.lng+","+z.lat;this.params.distance=Math.min(Math.max(z.distanceTo(B),2000),50000);this.params.searchExtent=w.Util.boundsToExtent(A);return this},nearby:function(A,z){A=g.latLng(A);this.params.location=A.lng+","+A.lat;this.params.distance=Math.min(Math.max(z,2000),50000);return this},run:function(A,z){if(this.options.supportsSuggest){return this.request(function(C,B){A.call(z,C,B,B)},this)}else{console.warn("this geocoding service does not support asking for suggestions")}}});function h(z){return new l(z)}var c=w.Service.extend({initialize:function(z){z=z||{};if(z.url){w.Service.prototype.initialize.call(this,z);this._confirmSuggestSupport()}else{z.url=i;z.supportsSuggest=true;w.Service.prototype.initialize.call(this,z)}},geocode:function(){return e(this)},reverse:function(){return m(this)},suggest:function(){return h(this)},_confirmSuggestSupport:function(){this.metadata(function(A,z){if(A){return}if(!z.capabilities){this.options.supportsSuggest=false;this.options.customParam=z.singleLineAddressField.name}else{if(z.capabilities.indexOf("Suggest")>-1){this.options.supportsSuggest=true}else{this.options.supportsSuggest=false}}},this)}});function r(z){return new c(z)}var f=g.Evented.extend({options:{zoomToResult:true,useMapBounds:12,searchBounds:null},initialize:function(A,z){g.Util.setOptions(this,z);this._control=A;if(!z||!z.providers||!z.providers.length){throw new Error("You must specify at least one provider")}this._providers=z.providers},_geocode:function(F,C,E){var A=0;var z=[];var D;var G=g.Util.bind(function(H,I){A--;if(H){return}if(I){z=z.concat(I)}if(A<=0){D=this._boundsFromResults(z);this.fire("results",{results:z,bounds:D,latlng:(D)?D.getCenter():undefined,text:F},true);if(this.options.zoomToResult&&D){this._control._map.fitBounds(D)}this.fire("load")}},this);if(C){A++;E.results(F,C,this._searchBounds(),G)}else{for(var B=0;B<this._providers.length;B++){A++;this._providers[B].results(F,C,this._searchBounds(),G)}}},_suggest:function(E){var A=this._providers.length;var z=g.Util.bind(function(G,F){return g.Util.bind(function(I,H){if(I){return}var J;A=A-1;if(G.length<2){this._suggestions.innerHTML="";this._suggestions.style.display="none";return}if(H.length){for(J=0;J<H.length;J++){H[J].provider=F}}else{this._control._renderSuggestions(H)}if(F._lastRender!==G&&F.nodes){for(J=0;J<F.nodes.length;J++){if(F.nodes[J].parentElement){this._control._suggestions.removeChild(F.nodes[J])}}F.nodes=[]}if(H.length&&this._control._input.value===G){this._control.clearSuggestions(F.nodes);F._lastRender=G;F.nodes=this._control._renderSuggestions(H);this._control._nodes=[]}},this)},this);this._pendingSuggestions=[];for(var B=0;B<this._providers.length;B++){var D=this._providers[B];var C=D.suggestions(E,this._searchBounds(),z(E,D));this._pendingSuggestions.push(C)}},_searchBounds:function(){if(this.options.searchBounds!==null){return this.options.searchBounds}if(this.options.useMapBounds===false){return null}if(this.options.useMapBounds===true){return this._control._map.getBounds()}if(this.options.useMapBounds<=this._control._map.getZoom()){return this._control._map.getBounds()}return null},_boundsFromResults:function(E){if(!E.length){return}var B=g.latLngBounds([0,0],[0,0]);var G=[];var A=[];for(var D=E.length-1;D>=0;D--){var z=E[D];A.push(z.latlng);if(z.bounds&&z.bounds.isValid()&&!z.bounds.equals(B)){G.push(z.bounds)}}var F=g.latLngBounds(A);for(var C=0;C<G.length;C++){F.extend(G[C])}return F},_getAttribution:function(){var B=[];var A=this._providers;for(var z=0;z<A.length;z++){if(A[z].options.attribution){B.push(A[z].options.attribution)}}return B.join(", ")}});function k(A,z){return new f(A,z)}var q=c.extend({options:{label:"Places and Addresses",maxResults:5},suggestions:function(B,A,C){var z=this.suggest().text(B);if(A){z.within(A)}if(this.options.countries){z.countries(this.options.countries)}if(this.options.categories){z.category(this.options.categories)}z.maxSuggestions(this.options.maxResults);return z.run(function(G,H,F){var D=[];if(!G){while(F.suggestions.length&&D.length<=(this.options.maxResults-1)){var E=F.suggestions.shift();if(!E.isCollection){D.push({text:E.text,magicKey:E.magicKey})}}}C(G,D)},this)},results:function(C,z,B,D){var A=this.geocode().text(C);if(z){A.key(z)}A.maxLocations(this.options.maxResults);if(B){A.within(B)}if(this.options.forStorage){A.forStorage(true)}return A.run(function(F,E){D(F,E.results)},this)}});function a(z){return new q(z)}var v=g.Control.extend({includes:g.Mixin.Events,options:{position:"topleft",collapseAfterResult:true,expanded:false,allowMultipleResults:true,placeholder:"Search for places or addresses",title:"Location Search"},initialize:function(z){g.Util.setOptions(this,z);if(!z||!z.providers||!z.providers.length){if(!z){z={}}z.providers=[a()]}this._geosearchCore=k(this,z);this._geosearchCore._providers=z.providers;this._geosearchCore.addEventParent(this);for(var A=0;A<this._geosearchCore._providers.length;A++){this._geosearchCore._providers[A].addEventParent(this)}this._geosearchCore._pendingSuggestions=[];g.Control.prototype.initialize.call(z)},_renderSuggestions:function(E){var G;if(E.length>0){this._suggestions.style.display="block"}this._suggestions.style.maxHeight=(this._map.getSize().y-this._suggestions.offsetTop-this._wrapper.offsetTop-10)+"px";var z=[];var F;var D;var H=[];for(var C=0;C<E.length;C++){var B=E[C];if(!D&&this._geosearchCore._providers.length>1&&G!==B.provider.options.label){D=g.DomUtil.create("span","geocoder-control-header",this._suggestions);D.textContent=B.provider.options.label;D.innerText=B.provider.options.label;G=B.provider.options.label;z.push(D)}if(!F){F=g.DomUtil.create("ul","geocoder-control-list",this._suggestions)}if(H.indexOf(B.text)===-1){var I=g.DomUtil.create("li","geocoder-control-suggestion",F);I.innerHTML=B.text;I.provider=B.provider;I["data-magic-key"]=B.magicKey}else{for(var A=0;A<F.childNodes.length;A++){if(F.childNodes[A].innerHTML===B.text){F.childNodes[A]["data-magic-key"]+=","+B.magicKey}}}H.push(B.text)}g.DomUtil.removeClass(this._input,"geocoder-control-loading");z.push(F);return z},_boundsFromResults:function(E){if(!E.length){return}var B=g.latLngBounds([0,0],[0,0]);var G=[];var A=[];for(var D=E.length-1;D>=0;D--){var z=E[D];A.push(z.latlng);if(z.bounds&&z.bounds.isValid()&&!z.bounds.equals(B)){G.push(z.bounds)}}var F=g.latLngBounds(A);for(var C=0;C<G.length;C++){F.extend(G[C])}return F},clear:function(){this._suggestions.innerHTML="";this._suggestions.style.display="none";this._input.value="";if(this.options.collapseAfterResult){this._input.placeholder="";g.DomUtil.removeClass(this._wrapper,"geocoder-control-expanded")}if(!this._map.scrollWheelZoom.enabled()&&this._map.options.scrollWheelZoom){this._map.scrollWheelZoom.enable()}},clearSuggestions:function(){if(this._nodes){for(var z=0;z<this._nodes.length;z++){if(this._nodes[z].parentElement){this._suggestions.removeChild(this._nodes[z])}}}},_setupClick:function(){g.DomUtil.addClass(this._wrapper,"geocoder-control-expanded");this._input.focus()},disable:function(){this._input.disabled=true;g.DomUtil.addClass(this._input,"geocoder-control-input-disabled");g.DomEvent.removeListener(this._wrapper,"click",this._setupClick,this)},enable:function(){this._input.disabled=false;g.DomUtil.removeClass(this._input,"geocoder-control-input-disabled");g.DomEvent.addListener(this._wrapper,"click",this._setupClick,this)},getAttribution:function(){var A=[];for(var z=0;z<this._providers.length;z++){if(this._providers[z].options.attribution){A.push(this._providers[z].options.attribution)}}return A.join(", ")},onAdd:function(A){w.Util.setEsriAttribution(A);this._map=A;this._wrapper=g.DomUtil.create("div","geocoder-control");this._input=g.DomUtil.create("input","geocoder-control-input leaflet-bar",this._wrapper);this._input.title=this.options.title;if(this.options.expanded){g.DomUtil.addClass(this._wrapper,"geocoder-control-expanded");this._input.placeholder=this.options.placeholder}this._suggestions=g.DomUtil.create("div","geocoder-control-suggestions leaflet-bar",this._wrapper);var z=this._geosearchCore._getAttribution();A.attributionControl.addAttribution(z);g.DomEvent.addListener(this._input,"focus",function(B){this._input.placeholder=this.options.placeholder;g.DomUtil.addClass(this._wrapper,"geocoder-control-expanded")},this);g.DomEvent.addListener(this._wrapper,"click",this._setupClick,this);g.DomEvent.addListener(this._suggestions,"mousedown",function(C){var B=C.target||C.srcElement;this._geosearchCore._geocode(B.innerHTML,B["data-magic-key"],B.provider);this.clear()},this);g.DomEvent.addListener(this._input,"blur",function(B){this.clear()},this);g.DomEvent.addListener(this._input,"keydown",function(G){var K=(G.target||G.srcElement).value;g.DomUtil.addClass(this._wrapper,"geocoder-control-expanded");var H=this._suggestions.querySelectorAll(".geocoder-control-suggestion");var D=this._suggestions.querySelectorAll(".geocoder-control-selected")[0];var J;for(var E=0;E<H.length;E++){if(H[E]===D){J=E;break}}switch(G.keyCode){case 13:if(D){this._geosearchCore._geocode(D.innerHTML,D["data-magic-key"],D.provider);this.clear()}else{if(this.options.allowMultipleResults&&K.length>=2){this._geosearchCore._geocode(this._input.value,undefined);this.clear()}else{if(H.length===1){g.DomUtil.addClass(H[0],"geocoder-control-selected");this._geosearchCore._geocode(H[0].innerHTML,H[0]["data-magic-key"],H[0].provider)}else{this.clear();this._input.blur()}}}g.DomEvent.preventDefault(G);break;case 38:if(D){g.DomUtil.removeClass(D,"geocoder-control-selected")}var F=H[J-1];if(D&&F){g.DomUtil.addClass(F,"geocoder-control-selected")}else{g.DomUtil.addClass(H[H.length-1],"geocoder-control-selected")}g.DomEvent.preventDefault(G);break;case 40:if(D){g.DomUtil.removeClass(D,"geocoder-control-selected")}var B=H[J+1];if(D&&B){g.DomUtil.addClass(B,"geocoder-control-selected")}else{g.DomUtil.addClass(H[0],"geocoder-control-selected")}g.DomEvent.preventDefault(G);break;default:for(var I=0;I<this._geosearchCore._pendingSuggestions.length;I++){var C=this._geosearchCore._pendingSuggestions[I];if(C&&C.abort&&!C.id){C.abort()}}break}},this);g.DomEvent.addListener(this._input,"keyup",g.Util.throttle(function(C){var B=C.which||C.keyCode;var D=(C.target||C.srcElement).value;if(D.length<2){this._suggestions.innerHTML="";this._suggestions.style.display="none";g.DomUtil.removeClass(this._input,"geocoder-control-loading");return}if(B===27){this._suggestions.innerHTML="";this._suggestions.style.display="none";return}if(B!==13&&B!==38&&B!==40){if(this._input.value!==this._lastValue){this._lastValue=this._input.value;g.DomUtil.addClass(this._input,"geocoder-control-loading");this._geosearchCore._suggest(D)}}},50,this),this);g.DomEvent.disableClickPropagation(this._wrapper);g.DomEvent.addListener(this._suggestions,"mouseover",function(B){if(A.scrollWheelZoom.enabled()&&A.options.scrollWheelZoom){A.scrollWheelZoom.disable()}});g.DomEvent.addListener(this._suggestions,"mouseout",function(B){if(!A.scrollWheelZoom.enabled()&&A.options.scrollWheelZoom){A.scrollWheelZoom.enable()}});this._geosearchCore.on("load",function(B){g.DomUtil.removeClass(this._input,"geocoder-control-loading");this.clear();this._input.blur()},this);return this._wrapper}});function s(z){return new v(z)}var j=w.FeatureLayerService.extend({options:{label:"Feature Layer",maxResults:5,bufferRadius:1000,formatSuggestion:function(z){return z.properties[this.options.searchFields[0]]}},initialize:function(z){w.FeatureLayerService.prototype.initialize.call(this,z);if(typeof this.options.searchFields==="string"){this.options.searchFields=[this.options.searchFields]}this._suggestionsQuery=this.query();this._resultsQuery=this.query()},suggestions:function(C,A,D){var B=this._suggestionsQuery.where(this._buildQuery(C)).returnGeometry(false);if(A){B.intersects(A)}if(this.options.idField){B.fields([this.options.idField].concat(this.options.searchFields))}var z=B.run(function(G,J,F){if(G){D(G,[])}else{this.options.idField=F.objectIdFieldName;var E=[];for(var I=J.features.length-1;I>=0;I--){var H=J.features[I];E.push({text:this.options.formatSuggestion.call(this,H),magicKey:H.id})}D(G,E.slice(0,this.options.maxResults))}},this);return z},results:function(C,z,A,D){var B=this._resultsQuery;if(z){delete B.params.where;B.featureIds([z])}else{B.where(this._buildQuery(C))}if(A){B.within(A)}return B.run(g.Util.bind(function(F,J){var I=[];for(var H=0;H<J.features.length;H++){var G=J.features[H];if(G){var K=this._featureBounds(G);var E={latlng:K.getCenter(),bounds:K,text:this.options.formatSuggestion.call(this,G),properties:G.properties,geojson:G};I.push(E);delete this._resultsQuery.params.objectIds}}D(F,I)},this))},orderBy:function(A,z){this._suggestionsQuery.orderBy(A,z)},_buildQuery:function(B){var C=[];for(var z=this.options.searchFields.length-1;z>=0;z--){var A='upper("'+this.options.searchFields[z]+'")';C.push(A+" LIKE upper('%"+B+"%')")}if(this.options.where){return this.options.where+" AND ("+C.join(" OR ")+")"}else{return C.join(" OR ")}},_featureBounds:function(B){var A=g.geoJson(B);if(B.geometry.type==="Point"){var z=A.getBounds().getCenter();var D=((this.options.bufferRadius/40075017)*360)/Math.cos((180/Math.PI)*z.lat);var C=(this.options.bufferRadius/40075017)*360;return g.latLngBounds([z.lat-C,z.lng-D],[z.lat+C,z.lng+D])}else{return A.getBounds()}}});function u(z){return new j(z)}var n=w.MapService.extend({options:{layers:[0],label:"Map Service",bufferRadius:1000,maxResults:5,formatSuggestion:function(z){return z.properties[z.displayFieldName]+" <small>"+z.layerName+"</small>"}},initialize:function(z){w.MapService.prototype.initialize.call(this,z);this._getIdFields()},suggestions:function(B,A,C){var z=this.find().text(B).fields(this.options.searchFields).returnGeometry(false).layers(this.options.layers);return z.run(function(J,E,K){var I=[];if(!J){var H=Math.min(this.options.maxResults,E.features.length);K.results=K.results.reverse();for(var F=0;F<H;F++){var L=E.features[F];var M=K.results[F];var G=M.layerId;var D=this._idFields[G];L.layerId=G;L.layerName=this._layerNames[G];L.displayFieldName=this._displayFields[G];if(D){I.push({text:this.options.formatSuggestion.call(this,L),magicKey:M.attributes[D]+":"+G})}}}C(J,I.reverse())},this)},results:function(F,B,D,G){var A=[];var C;if(B){var E=B.split(":")[0];var z=B.split(":")[1];C=this.query().layer(z).featureIds(E)}else{C=this.find().text(F).fields(this.options.searchFields).layers(this.options.layers)}return C.run(function(J,M,I){if(!J){if(I.results){I.results=I.results.reverse()}for(var L=0;L<M.features.length;L++){var K=M.features[L];z=z||I.results[L].layerId;if(K&&z!==undefined){var N=this._featureBounds(K);K.layerId=z;K.layerName=this._layerNames[z];K.displayFieldName=this._displayFields[z];var H={latlng:N.getCenter(),bounds:N,text:this.options.formatSuggestion.call(this,K),properties:K.properties,geojson:K};A.push(H)}}}G(J,A.reverse())},this)},_featureBounds:function(B){var A=g.geoJson(B);if(B.geometry.type==="Point"){var z=A.getBounds().getCenter();var D=((this.options.bufferRadius/40075017)*360)/Math.cos((180/Math.PI)*z.lat);var C=(this.options.bufferRadius/40075017)*360;return g.latLngBounds([z.lat-C,z.lng-D],[z.lat+C,z.lng+D])}else{return A.getBounds()}},_layerMetadataCallback:function(z){return g.Util.bind(function(A,C){if(A){return}this._displayFields[z]=C.displayField;this._layerNames[z]=C.name;for(var B=0;B<C.fields.length;B++){var D=C.fields[B];if(D.type==="esriFieldTypeOID"){this._idFields[z]=D.name;break}}},this)},_getIdFields:function(){this._idFields={};this._displayFields={};this._layerNames={};for(var A=0;A<this.options.layers.length;A++){var z=this.options.layers[A];this.get(z,{},this._layerMetadataCallback(z))}}});function b(z){return new n(z)}var o=c.extend({options:{label:"Geocode Server",maxResults:5},suggestions:function(B,A,C){if(this.options.supportsSuggest){var z=this.suggest().text(B);if(A){z.within(A)}return z.run(function(G,H,F){var D=[];if(!G){while(F.suggestions.length&&D.length<=(this.options.maxResults-1)){var E=F.suggestions.shift();if(!E.isCollection){D.push({text:E.text,magicKey:E.magicKey})}}}C(G,D)},this)}else{C(undefined,[]);return false}},results:function(C,z,B,D){var A=this.geocode().text(C);A.maxLocations(this.options.maxResults);if(B){A.within(B)}return A.run(function(F,E){D(F,E.results)},this)}});function p(z){return new o(z)}var i="https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/";y.WorldGeocodingServiceUrl=i;y.VERSION=d;y.Geocode=t;y.geocode=e;y.ReverseGeocode=x;y.reverseGeocode=m;y.Suggest=l;y.suggest=h;y.GeocodeService=c;y.geocodeService=r;y.Geosearch=v;y.geosearch=s;y.GeosearchCore=f;y.geosearchCore=k;y.ArcgisOnlineProvider=q;y.arcgisOnlineProvider=a;y.FeatureLayerProvider=j;y.featureLayerProvider=u;y.MapServiceProvider=n;y.mapServiceProvider=b;y.GeocodeServiceProvider=o;y.geocodeServiceProvider=p}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-geocoder-2.3.3.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,5 @@
+/* esri-leaflet-geocoder - v2.3.3 - Fri May 29 2020 15:01:40 GMT-0500 (Central Daylight Time)
+ * Copyright (c) 2020 Environmental Systems Research Institute, Inc.
+ * Apache-2.0 */
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("leaflet"),require("esri-leaflet")):"function"==typeof define&&define.amd?define(["exports","leaflet","esri-leaflet"],t):t(((e=e||self).L=e.L||{},e.L.esri=e.L.esri||{},e.L.esri.Geocoding={}),e.L,e.L.esri)}(this,function(e,h,r){"use strict";var t="https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/",s=r.Task.extend({path:"findAddressCandidates",params:{outSr:4326,forStorage:!1,outFields:"*",maxLocations:20},setters:{address:"address",neighborhood:"neighborhood",city:"city",subregion:"subregion",region:"region",postal:"postal",country:"country",text:"singleLine",category:"category",token:"token",key:"magicKey",fields:"outFields",forStorage:"forStorage",maxLocations:"maxLocations",countries:"sourceCountry"},initialize:function(e){(e=e||{}).url=e.url||t,r.Task.prototype.initialize.call(this,e)},within:function(e){return e=h.latLngBounds(e),this.params.searchExtent=r.Util.boundsToExtent(e),this},nearby:function(e,t){var s=h.latLng(e);return this.params.location=s.lng+","+s.lat,this.params.distance=Math.min(Math.max(t,2e3),5e4),this},run:function(o,r){return this.options.customParam&&(this.params[this.options.customParam]=this.params.singleLine,delete this.params.singleLine),this.request(function(e,t){var s=this._processGeocoderResponse,i=e?void 0:s(t);o.call(r,e,{results:i},t)},this)},_processGeocoderResponse:function(e){for(var t=[],s=0;s<e.candidates.length;s++){var i,o=e.candidates[s];o.extent&&(i=r.Util.extentToBounds(o.extent)),t.push({text:o.address,bounds:i,score:o.score,latlng:h.latLng(o.location.y,o.location.x),properties:o.attributes})}return t}});function i(e){return new s(e)}var o=r.Task.extend({path:"reverseGeocode",params:{outSR:4326,returnIntersection:!1},setters:{distance:"distance",language:"langCode",intersection:"returnIntersection"},initialize:function(e){(e=e||{}).url=e.url||t,r.Task.prototype.initialize.call(this,e)},latlng:function(e){var t=h.latLng(e);return this.params.location=t.lng+","+t.lat,this},run:function(i,o){return this.request(function(e,t){var s=e?void 0:{latlng:h.latLng(t.location.y,t.location.x),address:t.address};i.call(o,e,s,t)},this)}});function n(e){return new o(e)}var a=r.Task.extend({path:"suggest",params:{},setters:{text:"text",category:"category",countries:"countryCode",maxSuggestions:"maxSuggestions"},initialize:function(e){(e=e||{}).url||(e.url=t,e.supportsSuggest=!0),r.Task.prototype.initialize.call(this,e)},within:function(e){var t=(e=(e=h.latLngBounds(e)).pad(.5)).getCenter(),s=e.getNorthWest();return this.params.location=t.lng+","+t.lat,this.params.distance=Math.min(Math.max(t.distanceTo(s),2e3),5e4),this.params.searchExtent=r.Util.boundsToExtent(e),this},nearby:function(e,t){var s=h.latLng(e);return this.params.location=s.lng+","+s.lat,this.params.distance=Math.min(Math.max(t,2e3),5e4),this},run:function(s,i){if(this.options.supportsSuggest)return this.request(function(e,t){s.call(i,e,t,t)},this);console.warn("this geocoding service does not support asking for suggestions")}});function l(e){return new a(e)}var u=r.Service.extend({initialize:function(e){(e=e||{}).url?(r.Service.prototype.initialize.call(this,e),this._confirmSuggestSupport()):(e.url=t,e.supportsSuggest=!0,r.Service.prototype.initialize.call(this,e))},geocode:function(){return i(this)},reverse:function(){return n(this)},suggest:function(){return l(this)},_confirmSuggestSupport:function(){this.metadata(function(e,t){e||(t.capabilities&&-1<t.capabilities.indexOf("Suggest")?this.options.supportsSuggest=!0:this.options.supportsSuggest=!1,this.options.customParam=t.singleLineAddressField.name)},this)}});var d=h.Evented.extend({options:{zoomToResult:!0,useMapBounds:12,searchBounds:null},initialize:function(e,t){if(h.Util.setOptions(this,t),this._control=e,!t||!t.providers||!t.providers.length)throw new Error("You must specify at least one provider");this._providers=t.providers},_geocode:function(s,e,t){var i,o=0,r=[],n=h.Util.bind(function(e,t){o--,e||(t&&(r=r.concat(t)),o<=0&&(i=this._boundsFromResults(r),this.fire("results",{results:r,bounds:i,latlng:i?i.getCenter():void 0,text:s},!0),this.options.zoomToResult&&i&&this._control._map.fitBounds(i),this.fire("load")))},this);if(e)o++,t.results(s,e,this._searchBounds(),n);else for(var a=0;a<this._providers.length;a++)o++,this._providers[a].results(s,e,this._searchBounds(),n)},_suggest:function(e){var r=this._providers.length,n=0,t=h.Util.bind(function(i,o){return h.Util.bind(function(e,t){if(--r,n+=t.length,e)return this._control._clearProviderSuggestions(o),void this._control._finalizeSuggestions(r,n);if(t.length)for(var s=0;s<t.length;s++)t[s].provider=o;else this._control._renderSuggestions(t);o._lastRender!==i&&this._control._clearProviderSuggestions(o),t.length&&this._control._input.value===i&&(o._lastRender=i,this._control._renderSuggestions(t)),this._control._finalizeSuggestions(r,n)},this)},this);this._pendingSuggestions=[];for(var s=0;s<this._providers.length;s++){var i=this._providers[s],o=i.suggestions(e,this._searchBounds(),t(e,i));this._pendingSuggestions.push(o)}},_searchBounds:function(){return null!==this.options.searchBounds?this.options.searchBounds:!1!==this.options.useMapBounds&&(!0===this.options.useMapBounds||this.options.useMapBounds<=this._control._map.getZoom())?this._control._map.getBounds():null},_boundsFromResults:function(e){if(e.length){for(var t=h.latLngBounds([0,0],[0,0]),s=[],i=[],o=e.length-1;0<=o;o--){var r=e[o];i.push(r.latlng),r.bounds&&r.bounds.isValid()&&!r.bounds.equals(t)&&s.push(r.bounds)}for(var n=h.latLngBounds(i),a=0;a<s.length;a++)n.extend(s[a]);return n}},_getAttribution:function(){for(var e=[],t=this._providers,s=0;s<t.length;s++)t[s].options.attribution&&e.push(t[s].options.attribution);return e.join(", ")}});function c(e,t){return new d(e,t)}var g=u.extend({options:{label:"Places and Addresses",maxResults:5},suggestions:function(e,t,r){var s=this.suggest().text(e);return t&&s.within(t),this.options.countries&&s.countries(this.options.countries),this.options.categories&&s.category(this.options.categories),s.maxSuggestions(this.options.maxResults),s.run(function(e,t,s){var i=[];if(!e)for(;s.suggestions.length&&i.length<=this.options.maxResults-1;){var o=s.suggestions.shift();o.isCollection||i.push({text:o.text,unformattedText:o.text,magicKey:o.magicKey})}r(e,i)},this)},results:function(e,t,s,i){var o=this.geocode().text(e);return t&&o.key(t),o.maxLocations(this.options.maxResults),s&&o.within(s),this.options.forStorage&&o.forStorage(!0),this.options.countries&&o.countries(this.options.countries),this.options.categories&&o.category(this.options.categories),o.run(function(e,t){i(e,t.results)},this)}});function p(e){return new g(e)}var f=h.Control.extend({includes:h.Evented.prototype,options:{position:"topleft",collapseAfterResult:!0,expanded:!1,allowMultipleResults:!0,placeholder:"Search for places or addresses",title:"Location Search"},initialize:function(e){h.Util.setOptions(this,e),e&&e.providers&&e.providers.length||((e=e||{}).providers=[p()]),this._geosearchCore=c(this,e),this._geosearchCore._providers=e.providers,this._geosearchCore.addEventParent(this);for(var t=0;t<this._geosearchCore._providers.length;t++)this._geosearchCore._providers[t].addEventParent(this);this._geosearchCore._pendingSuggestions=[],h.Control.prototype.initialize.call(this,e)},_renderSuggestions:function(e){var t,s,i;0<e.length&&(this._suggestions.style.display="block");for(var o=[],r=0;r<e.length;r++){var n=e[r];if(!i&&1<this._geosearchCore._providers.length&&t!==n.provider.options.label&&((i=h.DomUtil.create("div","geocoder-control-header",n.provider._contentsElement)).textContent=n.provider.options.label,i.innerText=n.provider.options.label,t=n.provider.options.label),s=s||h.DomUtil.create("ul","geocoder-control-list",n.provider._contentsElement),-1===o.indexOf(n.text)){var a=h.DomUtil.create("li","geocoder-control-suggestion",s);a.innerHTML=n.text,a.provider=n.provider,a["data-magic-key"]=n.magicKey,a.unformattedText=n.unformattedText}else for(var l=0;l<s.childNodes.length;l++)s.childNodes[l].innerHTML===n.text&&(s.childNodes[l]["data-magic-key"]+=","+n.magicKey);o.push(n.text)}-1<this.getPosition().indexOf("top")&&(this._suggestions.style.maxHeight=this._map.getSize().y-this._suggestions.offsetTop-this._wrapper.offsetTop-10+"px"),-1<this.getPosition().indexOf("bottom")&&this._setSuggestionsBottomPosition()},_setSuggestionsBottomPosition:function(){this._suggestions.style.maxHeight=this._map.getSize().y-this._map._controlCorners[this.getPosition()].offsetHeight-this._wrapper.offsetHeight+"px",this._suggestions.style.top=-this._suggestions.offsetHeight-this._wrapper.offsetHeight+20+"px"},_boundsFromResults:function(e){if(e.length){for(var t=h.latLngBounds([0,0],[0,0]),s=[],i=[],o=e.length-1;0<=o;o--){var r=e[o];i.push(r.latlng),r.bounds&&r.bounds.isValid()&&!r.bounds.equals(t)&&s.push(r.bounds)}for(var n=h.latLngBounds(i),a=0;a<s.length;a++)n.extend(s[a]);return n}},clear:function(){this._clearAllSuggestions(),this.options.collapseAfterResult&&(this._input.value="",this._lastValue="",this._input.placeholder="",h.DomUtil.removeClass(this._wrapper,"geocoder-control-expanded")),!this._map.scrollWheelZoom.enabled()&&this._map.options.scrollWheelZoom&&this._map.scrollWheelZoom.enable()},_clearAllSuggestions:function(){this._suggestions.style.display="none";for(var e=0;e<this.options.providers.length;e++)this._clearProviderSuggestions(this.options.providers[e])},_clearProviderSuggestions:function(e){e._contentsElement.innerHTML=""},_finalizeSuggestions:function(e,t){e||(h.DomUtil.removeClass(this._input,"geocoder-control-loading"),-1<this.getPosition().indexOf("bottom")&&this._setSuggestionsBottomPosition(),t||this._clearAllSuggestions())},_setupClick:function(){h.DomUtil.addClass(this._wrapper,"geocoder-control-expanded"),this._input.focus()},disable:function(){this._input.disabled=!0,h.DomUtil.addClass(this._input,"geocoder-control-input-disabled"),h.DomEvent.removeListener(this._wrapper,"click",this._setupClick,this)},enable:function(){this._input.disabled=!1,h.DomUtil.removeClass(this._input,"geocoder-control-input-disabled"),h.DomEvent.addListener(this._wrapper,"click",this._setupClick,this)},getAttribution:function(){for(var e=[],t=0;t<this._providers.length;t++)this._providers[t].options.attribution&&e.push(this._providers[t].options.attribution);return e.join(", ")},geocodeSuggestion:function(e){var t=e.target||e.srcElement;t.classList.contains("geocoder-control-suggestions")||t.classList.contains("geocoder-control-header")||(t.classList.length<1&&(t=t.parentNode),this._geosearchCore._geocode(t.unformattedText,t["data-magic-key"],t.provider),this.clear())},onAdd:function(t){r.Util.setEsriAttribution(t),this._map=t,this._wrapper=h.DomUtil.create("div","geocoder-control"),this._input=h.DomUtil.create("input","geocoder-control-input leaflet-bar",this._wrapper),this._input.title=this.options.title,this.options.expanded&&(h.DomUtil.addClass(this._wrapper,"geocoder-control-expanded"),this._input.placeholder=this.options.placeholder),this._suggestions=h.DomUtil.create("div","geocoder-control-suggestions leaflet-bar",this._wrapper);for(var e=0;e<this.options.providers.length;e++)this.options.providers[e]._contentsElement=h.DomUtil.create("div",null,this._suggestions);var s=this._geosearchCore._getAttribution();return t.attributionControl&&t.attributionControl.addAttribution(s),h.DomEvent.addListener(this._input,"focus",function(e){this._input.placeholder=this.options.placeholder,h.DomUtil.addClass(this._wrapper,"geocoder-control-expanded")},this),h.DomEvent.addListener(this._wrapper,"click",this._setupClick,this),h.DomEvent.addListener(this._suggestions,"mousedown",this.geocodeSuggestion,this),h.DomEvent.addListener(this._input,"blur",function(e){this.clear()},this),h.DomEvent.addListener(this._input,"keydown",function(e){var t=(e.target||e.srcElement).value;h.DomUtil.addClass(this._wrapper,"geocoder-control-expanded");for(var s,i=this._suggestions.querySelectorAll(".geocoder-control-suggestion"),o=this._suggestions.querySelectorAll(".geocoder-control-selected")[0],r=0;r<i.length;r++)if(i[r]===o){s=r;break}switch(e.keyCode){case 13:o?(this._input.value=o.innerText,this._geosearchCore._geocode(o.unformattedText,o["data-magic-key"],o.provider),this.clear()):this.options.allowMultipleResults&&2<=t.length?(this._geosearchCore._geocode(this._input.value,void 0),this.clear()):1===i.length?(h.DomUtil.addClass(i[0],"geocoder-control-selected"),this._geosearchCore._geocode(i[0].innerHTML,i[0]["data-magic-key"],i[0].provider)):(this.clear(),this._input.blur()),h.DomEvent.preventDefault(e);break;case 38:o&&h.DomUtil.removeClass(o,"geocoder-control-selected");var n=i[s-1];o&&n?h.DomUtil.addClass(n,"geocoder-control-selected"):h.DomUtil.addClass(i[i.length-1],"geocoder-control-selected"),h.DomEvent.preventDefault(e);break;case 40:o&&h.DomUtil.removeClass(o,"geocoder-control-selected");var a=i[s+1];o&&a?h.DomUtil.addClass(a,"geocoder-control-selected"):h.DomUtil.addClass(i[0],"geocoder-control-selected"),h.DomEvent.preventDefault(e);break;default:for(var l=0;l<this._geosearchCore._pendingSuggestions.length;l++){var u=this._geosearchCore._pendingSuggestions[l];u&&u.abort&&!u.id&&u.abort()}}},this),h.DomEvent.addListener(this._input,"keyup",h.Util.throttle(function(e){var t=e.which||e.keyCode,s=(e.target||e.srcElement).value;if(s.length<2)return this._lastValue=this._input.value,this._clearAllSuggestions(),void h.DomUtil.removeClass(this._input,"geocoder-control-loading");27!==t?13!==t&&38!==t&&40!==t&&this._input.value!==this._lastValue&&(this._lastValue=this._input.value,h.DomUtil.addClass(this._input,"geocoder-control-loading"),this._geosearchCore._suggest(s)):this._clearAllSuggestions()},50,this),this),h.DomEvent.disableClickPropagation(this._wrapper),h.DomEvent.addListener(this._suggestions,"mouseover",function(e){t.scrollWheelZoom.enabled()&&t.options.scrollWheelZoom&&t.scrollWheelZoom.disable()}),h.DomEvent.addListener(this._suggestions,"mouseout",function(e){!t.scrollWheelZoom.enabled()&&t.options.scrollWheelZoom&&t.scrollWheelZoom.enable()}),this._geosearchCore.on("load",function(e){h.DomUtil.removeClass(this._input,"geocoder-control-loading"),this.clear(),this._input.blur()},this),this._wrapper}});var v=r.FeatureLayerService.extend({options:{label:"Feature Layer",maxResults:5,bufferRadius:1e3,searchMode:"contain",formatSuggestion:function(e){return e.properties[this.options.searchFields[0]]}},initialize:function(e){r.FeatureLayerService.prototype.initialize.call(this,e),"string"==typeof this.options.searchFields&&(this.options.searchFields=[this.options.searchFields]),this._suggestionsQuery=this.query(),this._resultsQuery=this.query()},suggestions:function(e,t,n){var s=this._suggestionsQuery.where(this._buildQuery(e)).returnGeometry(!1);return t&&s.intersects(t),this.options.idField&&s.fields([this.options.idField].concat(this.options.searchFields)),s.run(function(e,t,s){if(e)n(e,[]);else{this.options.idField=s.objectIdFieldName;for(var i=[],o=t.features.length-1;0<=o;o--){var r=t.features[o];i.push({text:this.options.formatSuggestion.call(this,r),unformattedText:r.properties[this.options.searchFields[0]],magicKey:r.id})}n(e,i.slice(0,this.options.maxResults))}},this)},results:function(e,t,s,a){var i=this._resultsQuery;return t?(delete i.params.where,i.featureIds([t])):i.where(this._buildQuery(e)),s&&i.within(s),i.run(h.Util.bind(function(e,t){for(var s=[],i=0;i<t.features.length;i++){var o,r,n=t.features[i];n&&(r={latlng:(o=this._featureBounds(n)).getCenter(),bounds:o,text:this.options.formatSuggestion.call(this,n),properties:n.properties,geojson:n},s.push(r),delete this._resultsQuery.params.objectIds)}a(e,s)},this))},orderBy:function(e,t){this._suggestionsQuery.orderBy(e,t)},_buildQuery:function(e){for(var t=[],s=this.options.searchFields.length-1;0<=s;s--){var i='upper("'+this.options.searchFields[s]+'")';if("contain"===this.options.searchMode)t.push(i+" LIKE upper('%"+e+"%')");else if("startWith"===this.options.searchMode)t.push(i+" LIKE upper('"+e+"%')");else if("endWith"===this.options.searchMode)t.push(i+" LIKE upper('%"+e+"')");else{if("strict"!==this.options.searchMode)throw new Error('L.esri.Geocoding.featureLayerProvider: Invalid parameter for "searchMode". Use one of "contain", "startWith", "endWith", or "strict"');t.push(i+" LIKE upper('"+e+"')")}}return this.options.where?this.options.where+" AND ("+t.join(" OR ")+")":t.join(" OR ")},_featureBounds:function(e){var t=h.geoJson(e);if("Point"!==e.geometry.type)return t.getBounds();var s=t.getBounds().getCenter(),i=this.options.bufferRadius/40075017*360/Math.cos(180/Math.PI*s.lat),o=this.options.bufferRadius/40075017*360;return h.latLngBounds([s.lat-o,s.lng-i],[s.lat+o,s.lng+i])}});var m=r.MapService.extend({options:{layers:[0],label:"Map Service",bufferRadius:1e3,maxResults:5,formatSuggestion:function(e){return e.properties[e.displayFieldName]+" <small>"+e.layerName+"</small>"}},initialize:function(e){r.MapService.prototype.initialize.call(this,e),this._getIdFields()},suggestions:function(e,t,h){return this.find().text(e).fields(this.options.searchFields).returnGeometry(!1).layers(this.options.layers).run(function(e,t,s){var i=[];if(!e){var o=Math.min(this.options.maxResults,t.features.length);s.results=s.results.reverse();for(var r=0;r<o;r++){var n=t.features[r],a=s.results[r],l=a.layerId,u=this._idFields[l];n.layerId=l,n.layerName=this._layerNames[l],n.displayFieldName=this._displayFields[l],u&&i.push({text:this.options.formatSuggestion.call(this,n),unformattedText:n.properties[n.displayFieldName],magicKey:a.attributes[u]+":"+l})}}h(e,i.reverse())},this)},results:function(e,t,s,a){var i,l,u=[];return(t?(i=t.split(":")[0],l=t.split(":")[1],this.query().layer(l).featureIds(i)):this.find().text(e).fields(this.options.searchFields).layers(this.options.layers)).run(function(e,t,s){if(!e){s.results&&(s.results=s.results.reverse());for(var i=0;i<t.features.length;i++){var o,r,n=t.features[i];l=l||s.results[i].layerId,n&&void 0!==l&&(o=this._featureBounds(n),n.layerId=l,n.layerName=this._layerNames[l],n.displayFieldName=this._displayFields[l],r={latlng:o.getCenter(),bounds:o,text:this.options.formatSuggestion.call(this,n),properties:n.properties,geojson:n},u.push(r))}}a(e,u.reverse())},this)},_featureBounds:function(e){var t=h.geoJson(e);if("Point"!==e.geometry.type)return t.getBounds();var s=t.getBounds().getCenter(),i=this.options.bufferRadius/40075017*360/Math.cos(180/Math.PI*s.lat),o=this.options.bufferRadius/40075017*360;return h.latLngBounds([s.lat-o,s.lng-i],[s.lat+o,s.lng+i])},_layerMetadataCallback:function(o){return h.Util.bind(function(e,t){if(!e){this._displayFields[o]=t.displayField,this._layerNames[o]=t.name;for(var s=0;s<t.fields.length;s++){var i=t.fields[s];if("esriFieldTypeOID"===i.type){this._idFields[o]=i.name;break}}}},this)},_getIdFields:function(){this._idFields={},this._displayFields={},this._layerNames={};for(var e=0;e<this.options.layers.length;e++){var t=this.options.layers[e];this.get(t,{},this._layerMetadataCallback(t))}}});var _=u.extend({options:{label:"Geocode Server",maxResults:5},suggestions:function(e,t,r){if(this.options.supportsSuggest){var s=this.suggest().text(e);return t&&s.within(t),s.run(function(e,t,s){var i=[];if(!e)for(;s.suggestions.length&&i.length<=this.options.maxResults-1;){var o=s.suggestions.shift();o.isCollection||i.push({text:o.text,unformattedText:o.text,magicKey:o.magicKey})}r(e,i)},this)}return r(void 0,[]),!1},results:function(e,t,s,i){var o=this.geocode().text(e);return t&&o.key(t),o.maxLocations(this.options.maxResults),s&&o.within(s),o.run(function(e,t){i(e,t.results)},this)}});e.ArcgisOnlineProvider=g,e.FeatureLayerProvider=v,e.Geocode=s,e.GeocodeService=u,e.GeocodeServiceProvider=_,e.Geosearch=f,e.GeosearchCore=d,e.MapServiceProvider=m,e.ReverseGeocode=o,e.Suggest=a,e.VERSION="2.3.3",e.WorldGeocodingServiceUrl=t,e.arcgisOnlineProvider=p,e.featureLayerProvider=function(e){return new v(e)},e.geocode=i,e.geocodeService=function(e){return new u(e)},e.geocodeServiceProvider=function(e){return new _(e)},e.geosearch=function(e){return new f(e)},e.geosearchCore=c,e.mapServiceProvider=function(e){return new m(e)},e.reverseGeocode=n,e.suggest=l,Object.defineProperty(e,"__esModule",{value:!0})});
+//# sourceMappingURL=esri-leaflet-geocoder.js.map
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-geocoder-2.3.3.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("leaflet"),require("esri-leaflet")):"function"==typeof define&&define.amd?define(["exports","leaflet","esri-leaflet"],t):t(((e=e||self).L=e.L||{},e.L.esri=e.L.esri||{},e.L.esri.Geocoding={}),e.L,e.L.esri)}(this,(function(e,t,s){"use strict";var i="https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/",o=s.Task.extend({path:"findAddressCandidates",params:{outSr:4326,forStorage:!1,outFields:"*",maxLocations:20},setters:{address:"address",neighborhood:"neighborhood",city:"city",subregion:"subregion",region:"region",postal:"postal",country:"country",text:"singleLine",category:"category",token:"token",key:"magicKey",fields:"outFields",forStorage:"forStorage",maxLocations:"maxLocations",countries:"sourceCountry"},initialize:function(e){(e=e||{}).url=e.url||i,s.Task.prototype.initialize.call(this,e)},within:function(e){return e=t.latLngBounds(e),this.params.searchExtent=s.Util.boundsToExtent(e),this},nearby:function(e,s){var i=t.latLng(e);return this.params.location=i.lng+","+i.lat,this.params.distance=Math.min(Math.max(s,2e3),5e4),this},run:function(e,t){return this.options.customParam&&(this.params[this.options.customParam]=this.params.singleLine,delete this.params.singleLine),this.request((function(s,i){var o=this._processGeocoderResponse,r=s?void 0:o(i);e.call(t,s,{results:r},i)}),this)},_processGeocoderResponse:function(e){for(var i=[],o=0;o<e.candidates.length;o++){var r,n=e.candidates[o];n.extent&&(r=s.Util.extentToBounds(n.extent)),i.push({text:n.address,bounds:r,score:n.score,latlng:t.latLng(n.location.y,n.location.x),properties:n.attributes})}return i}});function r(e){return new o(e)}var n=s.Task.extend({path:"reverseGeocode",params:{outSR:4326,returnIntersection:!1},setters:{distance:"distance",language:"langCode",intersection:"returnIntersection"},initialize:function(e){(e=e||{}).url=e.url||i,s.Task.prototype.initialize.call(this,e)},latlng:function(e){var s=t.latLng(e);return this.params.location=s.lng+","+s.lat,this},run:function(e,s){return this.request((function(i,o){var r=i?void 0:{latlng:t.latLng(o.location.y,o.location.x),address:o.address};e.call(s,i,r,o)}),this)}});function a(e){return new n(e)}var l=s.Task.extend({path:"suggest",params:{},setters:{text:"text",category:"category",countries:"countryCode",maxSuggestions:"maxSuggestions"},initialize:function(e){(e=e||{}).url||(e.url=i,e.supportsSuggest=!0),s.Task.prototype.initialize.call(this,e)},within:function(e){var i=(e=(e=t.latLngBounds(e)).pad(.5)).getCenter(),o=e.getNorthWest();return this.params.location=i.lng+","+i.lat,this.params.distance=Math.min(Math.max(i.distanceTo(o),2e3),5e4),this.params.searchExtent=s.Util.boundsToExtent(e),this},nearby:function(e,s){var i=t.latLng(e);return this.params.location=i.lng+","+i.lat,this.params.distance=Math.min(Math.max(s,2e3),5e4),this},run:function(e,t){if(this.options.supportsSuggest)return this.request((function(s,i){e.call(t,s,i,i)}),this);console.warn("this geocoding service does not support asking for suggestions")}});function u(e){return new l(e)}var h=s.Service.extend({initialize:function(e){(e=e||{}).url?(s.Service.prototype.initialize.call(this,e),this._confirmSuggestSupport()):(e.url=i,e.supportsSuggest=!0,s.Service.prototype.initialize.call(this,e))},geocode:function(){return r(this)},reverse:function(){return a(this)},suggest:function(){return u(this)},_confirmSuggestSupport:function(){this.metadata((function(e,t){e||(t.capabilities&&-1<t.capabilities.indexOf("Suggest")?this.options.supportsSuggest=!0:this.options.supportsSuggest=!1,this.options.customParam=t.singleLineAddressField.name)}),this)}}),d=t.Evented.extend({options:{zoomToResult:!0,useMapBounds:12,searchBounds:null},initialize:function(e,s){if(t.Util.setOptions(this,s),this._control=e,!s||!s.providers||!s.providers.length)throw new Error("You must specify at least one provider");this._providers=s.providers},_geocode:function(e,s,i){var o,r=0,n=[],a=t.Util.bind((function(t,s){r--,t||(s&&(n=n.concat(s)),r<=0&&(o=this._boundsFromResults(n),this.fire("results",{results:n,bounds:o,latlng:o?o.getCenter():void 0,text:e},!0),this.options.zoomToResult&&o&&this._control._map.fitBounds(o),this.fire("load")))}),this);if(s)r++,i.results(e,s,this._searchBounds(),a);else for(var l=0;l<this._providers.length;l++)r++,this._providers[l].results(e,s,this._searchBounds(),a)},_suggest:function(e){var s=this._providers.length,i=0,o=t.Util.bind((function(e,o){return t.Util.bind((function(t,r){if(--s,i+=r.length,t)return this._control._clearProviderSuggestions(o),void this._control._finalizeSuggestions(s,i);if(r.length)for(var n=0;n<r.length;n++)r[n].provider=o;else this._control._renderSuggestions(r);o._lastRender!==e&&this._control._clearProviderSuggestions(o),r.length&&this._control._input.value===e&&(o._lastRender=e,this._control._renderSuggestions(r)),this._control._finalizeSuggestions(s,i)}),this)}),this);this._pendingSuggestions=[];for(var r=0;r<this._providers.length;r++){var n=this._providers[r],a=n.suggestions(e,this._searchBounds(),o(e,n));this._pendingSuggestions.push(a)}},_searchBounds:function(){return null!==this.options.searchBounds?this.options.searchBounds:!1!==this.options.useMapBounds&&(!0===this.options.useMapBounds||this.options.useMapBounds<=this._control._map.getZoom())?this._control._map.getBounds():null},_boundsFromResults:function(e){if(e.length){for(var s=t.latLngBounds([0,0],[0,0]),i=[],o=[],r=e.length-1;0<=r;r--){var n=e[r];o.push(n.latlng),n.bounds&&n.bounds.isValid()&&!n.bounds.equals(s)&&i.push(n.bounds)}for(var a=t.latLngBounds(o),l=0;l<i.length;l++)a.extend(i[l]);return a}},_getAttribution:function(){for(var e=[],t=this._providers,s=0;s<t.length;s++)t[s].options.attribution&&e.push(t[s].options.attribution);return e.join(", ")}});function c(e,t){return new d(e,t)}var g=h.extend({options:{label:"Places and Addresses",maxResults:5},suggestions:function(e,t,s){var i=this.suggest().text(e);return t&&i.within(t),this.options.countries&&i.countries(this.options.countries),this.options.categories&&i.category(this.options.categories),i.maxSuggestions(this.options.maxResults),i.run((function(e,t,i){var o=[];if(!e)for(;i.suggestions.length&&o.length<=this.options.maxResults-1;){var r=i.suggestions.shift();r.isCollection||o.push({text:r.text,unformattedText:r.text,magicKey:r.magicKey})}s(e,o)}),this)},results:function(e,t,s,i){var o=this.geocode().text(e);return t&&o.key(t),o.maxLocations(this.options.maxResults),s&&o.within(s),this.options.forStorage&&o.forStorage(!0),this.options.countries&&o.countries(this.options.countries),this.options.categories&&o.category(this.options.categories),o.run((function(e,t){i(e,t.results)}),this)}});function p(e){return new g(e)}var f=t.Control.extend({includes:t.Evented.prototype,options:{position:"topleft",collapseAfterResult:!0,expanded:!1,allowMultipleResults:!0,placeholder:"Search for places or addresses",title:"Location Search"},initialize:function(e){t.Util.setOptions(this,e),e&&e.providers&&e.providers.length||((e=e||{}).providers=[p()]),this._geosearchCore=c(this,e),this._geosearchCore._providers=e.providers,this._geosearchCore.addEventParent(this);for(var s=0;s<this._geosearchCore._providers.length;s++)this._geosearchCore._providers[s].addEventParent(this);this._geosearchCore._pendingSuggestions=[],t.Control.prototype.initialize.call(this,e)},_renderSuggestions:function(e){var s,i,o;0<e.length&&(this._suggestions.style.display="block");for(var r=[],n=0;n<e.length;n++){var a=e[n];if(!o&&1<this._geosearchCore._providers.length&&s!==a.provider.options.label&&((o=t.DomUtil.create("div","geocoder-control-header",a.provider._contentsElement)).textContent=a.provider.options.label,o.innerText=a.provider.options.label,s=a.provider.options.label),i=i||t.DomUtil.create("ul","geocoder-control-list",a.provider._contentsElement),-1===r.indexOf(a.text)){var l=t.DomUtil.create("li","geocoder-control-suggestion",i);l.innerHTML=a.text,l.provider=a.provider,l["data-magic-key"]=a.magicKey,l.unformattedText=a.unformattedText}else for(var u=0;u<i.childNodes.length;u++)i.childNodes[u].innerHTML===a.text&&(i.childNodes[u]["data-magic-key"]+=","+a.magicKey);r.push(a.text)}-1<this.getPosition().indexOf("top")&&(this._suggestions.style.maxHeight=this._map.getSize().y-this._suggestions.offsetTop-this._wrapper.offsetTop-10+"px"),-1<this.getPosition().indexOf("bottom")&&this._setSuggestionsBottomPosition()},_setSuggestionsBottomPosition:function(){this._suggestions.style.maxHeight=this._map.getSize().y-this._map._controlCorners[this.getPosition()].offsetHeight-this._wrapper.offsetHeight+"px",this._suggestions.style.top=-this._suggestions.offsetHeight-this._wrapper.offsetHeight+20+"px"},_boundsFromResults:function(e){if(e.length){for(var s=t.latLngBounds([0,0],[0,0]),i=[],o=[],r=e.length-1;0<=r;r--){var n=e[r];o.push(n.latlng),n.bounds&&n.bounds.isValid()&&!n.bounds.equals(s)&&i.push(n.bounds)}for(var a=t.latLngBounds(o),l=0;l<i.length;l++)a.extend(i[l]);return a}},clear:function(){this._clearAllSuggestions(),this.options.collapseAfterResult&&(this._input.value="",this._lastValue="",this._input.placeholder="",t.DomUtil.removeClass(this._wrapper,"geocoder-control-expanded")),!this._map.scrollWheelZoom.enabled()&&this._map.options.scrollWheelZoom&&this._map.scrollWheelZoom.enable()},_clearAllSuggestions:function(){this._suggestions.style.display="none";for(var e=0;e<this.options.providers.length;e++)this._clearProviderSuggestions(this.options.providers[e])},_clearProviderSuggestions:function(e){e._contentsElement.innerHTML=""},_finalizeSuggestions:function(e,s){e||(t.DomUtil.removeClass(this._input,"geocoder-control-loading"),-1<this.getPosition().indexOf("bottom")&&this._setSuggestionsBottomPosition(),s||this._clearAllSuggestions())},_setupClick:function(){t.DomUtil.addClass(this._wrapper,"geocoder-control-expanded"),this._input.focus()},disable:function(){this._input.disabled=!0,t.DomUtil.addClass(this._input,"geocoder-control-input-disabled"),t.DomEvent.removeListener(this._wrapper,"click",this._setupClick,this)},enable:function(){this._input.disabled=!1,t.DomUtil.removeClass(this._input,"geocoder-control-input-disabled"),t.DomEvent.addListener(this._wrapper,"click",this._setupClick,this)},getAttribution:function(){for(var e=[],t=0;t<this._providers.length;t++)this._providers[t].options.attribution&&e.push(this._providers[t].options.attribution);return e.join(", ")},geocodeSuggestion:function(e){var t=e.target||e.srcElement;t.classList.contains("geocoder-control-suggestions")||t.classList.contains("geocoder-control-header")||(t.classList.length<1&&(t=t.parentNode),this._geosearchCore._geocode(t.unformattedText,t["data-magic-key"],t.provider),this.clear())},onAdd:function(e){s.Util.setEsriAttribution(e),this._map=e,this._wrapper=t.DomUtil.create("div","geocoder-control"),this._input=t.DomUtil.create("input","geocoder-control-input leaflet-bar",this._wrapper),this._input.title=this.options.title,this.options.expanded&&(t.DomUtil.addClass(this._wrapper,"geocoder-control-expanded"),this._input.placeholder=this.options.placeholder),this._suggestions=t.DomUtil.create("div","geocoder-control-suggestions leaflet-bar",this._wrapper);for(var i=0;i<this.options.providers.length;i++)this.options.providers[i]._contentsElement=t.DomUtil.create("div",null,this._suggestions);var o=this._geosearchCore._getAttribution();return e.attributionControl&&e.attributionControl.addAttribution(o),t.DomEvent.addListener(this._input,"focus",(function(e){this._input.placeholder=this.options.placeholder,t.DomUtil.addClass(this._wrapper,"geocoder-control-expanded")}),this),t.DomEvent.addListener(this._wrapper,"click",this._setupClick,this),t.DomEvent.addListener(this._suggestions,"mousedown",this.geocodeSuggestion,this),t.DomEvent.addListener(this._input,"blur",(function(e){this.clear()}),this),t.DomEvent.addListener(this._input,"keydown",(function(e){var s=(e.target||e.srcElement).value;t.DomUtil.addClass(this._wrapper,"geocoder-control-expanded");for(var i,o=this._suggestions.querySelectorAll(".geocoder-control-suggestion"),r=this._suggestions.querySelectorAll(".geocoder-control-selected")[0],n=0;n<o.length;n++)if(o[n]===r){i=n;break}switch(e.keyCode){case 13:r?(this._input.value=r.innerText,this._geosearchCore._geocode(r.unformattedText,r["data-magic-key"],r.provider),this.clear()):this.options.allowMultipleResults&&2<=s.length?(this._geosearchCore._geocode(this._input.value,void 0),this.clear()):1===o.length?(t.DomUtil.addClass(o[0],"geocoder-control-selected"),this._geosearchCore._geocode(o[0].innerHTML,o[0]["data-magic-key"],o[0].provider)):(this.clear(),this._input.blur()),t.DomEvent.preventDefault(e);break;case 38:r&&t.DomUtil.removeClass(r,"geocoder-control-selected");var a=o[i-1];r&&a?t.DomUtil.addClass(a,"geocoder-control-selected"):t.DomUtil.addClass(o[o.length-1],"geocoder-control-selected"),t.DomEvent.preventDefault(e);break;case 40:r&&t.DomUtil.removeClass(r,"geocoder-control-selected");var l=o[i+1];r&&l?t.DomUtil.addClass(l,"geocoder-control-selected"):t.DomUtil.addClass(o[0],"geocoder-control-selected"),t.DomEvent.preventDefault(e);break;default:for(var u=0;u<this._geosearchCore._pendingSuggestions.length;u++){var h=this._geosearchCore._pendingSuggestions[u];h&&h.abort&&!h.id&&h.abort()}}}),this),t.DomEvent.addListener(this._input,"keyup",t.Util.throttle((function(e){var s=e.which||e.keyCode,i=(e.target||e.srcElement).value;if(i.length<2)return this._lastValue=this._input.value,this._clearAllSuggestions(),void t.DomUtil.removeClass(this._input,"geocoder-control-loading");27!==s?13!==s&&38!==s&&40!==s&&this._input.value!==this._lastValue&&(this._lastValue=this._input.value,t.DomUtil.addClass(this._input,"geocoder-control-loading"),this._geosearchCore._suggest(i)):this._clearAllSuggestions()}),50,this),this),t.DomEvent.disableClickPropagation(this._wrapper),t.DomEvent.addListener(this._suggestions,"mouseover",(function(t){e.scrollWheelZoom.enabled()&&e.options.scrollWheelZoom&&e.scrollWheelZoom.disable()})),t.DomEvent.addListener(this._suggestions,"mouseout",(function(t){!e.scrollWheelZoom.enabled()&&e.options.scrollWheelZoom&&e.scrollWheelZoom.enable()})),this._geosearchCore.on("load",(function(e){t.DomUtil.removeClass(this._input,"geocoder-control-loading"),this.clear(),this._input.blur()}),this),this._wrapper}}),v=s.FeatureLayerService.extend({options:{label:"Feature Layer",maxResults:5,bufferRadius:1e3,searchMode:"contain",formatSuggestion:function(e){return e.properties[this.options.searchFields[0]]}},initialize:function(e){s.FeatureLayerService.prototype.initialize.call(this,e),"string"==typeof this.options.searchFields&&(this.options.searchFields=[this.options.searchFields]),this._suggestionsQuery=this.query(),this._resultsQuery=this.query()},suggestions:function(e,t,s){var i=this._suggestionsQuery.where(this._buildQuery(e)).returnGeometry(!1);return t&&i.intersects(t),this.options.idField&&i.fields([this.options.idField].concat(this.options.searchFields)),i.run((function(e,t,i){if(e)s(e,[]);else{this.options.idField=i.objectIdFieldName;for(var o=[],r=t.features.length-1;0<=r;r--){var n=t.features[r];o.push({text:this.options.formatSuggestion.call(this,n),unformattedText:n.properties[this.options.searchFields[0]],magicKey:n.id})}s(e,o.slice(0,this.options.maxResults))}}),this)},results:function(e,s,i,o){var r=this._resultsQuery;return s?(delete r.params.where,r.featureIds([s])):r.where(this._buildQuery(e)),i&&r.within(i),r.run(t.Util.bind((function(e,t){for(var s=[],i=0;i<t.features.length;i++){var r,n,a=t.features[i];a&&(n={latlng:(r=this._featureBounds(a)).getCenter(),bounds:r,text:this.options.formatSuggestion.call(this,a),properties:a.properties,geojson:a},s.push(n),delete this._resultsQuery.params.objectIds)}o(e,s)}),this))},orderBy:function(e,t){this._suggestionsQuery.orderBy(e,t)},_buildQuery:function(e){for(var t=[],s=this.options.searchFields.length-1;0<=s;s--){var i='upper("'+this.options.searchFields[s]+'")';if("contain"===this.options.searchMode)t.push(i+" LIKE upper('%"+e+"%')");else if("startWith"===this.options.searchMode)t.push(i+" LIKE upper('"+e+"%')");else if("endWith"===this.options.searchMode)t.push(i+" LIKE upper('%"+e+"')");else{if("strict"!==this.options.searchMode)throw new Error('L.esri.Geocoding.featureLayerProvider: Invalid parameter for "searchMode". Use one of "contain", "startWith", "endWith", or "strict"');t.push(i+" LIKE upper('"+e+"')")}}return this.options.where?this.options.where+" AND ("+t.join(" OR ")+")":t.join(" OR ")},_featureBounds:function(e){var s=t.geoJson(e);if("Point"!==e.geometry.type)return s.getBounds();var i=s.getBounds().getCenter(),o=this.options.bufferRadius/40075017*360/Math.cos(180/Math.PI*i.lat),r=this.options.bufferRadius/40075017*360;return t.latLngBounds([i.lat-r,i.lng-o],[i.lat+r,i.lng+o])}}),m=s.MapService.extend({options:{layers:[0],label:"Map Service",bufferRadius:1e3,maxResults:5,formatSuggestion:function(e){return e.properties[e.displayFieldName]+" <small>"+e.layerName+"</small>"}},initialize:function(e){s.MapService.prototype.initialize.call(this,e),this._getIdFields()},suggestions:function(e,t,s){return this.find().text(e).fields(this.options.searchFields).returnGeometry(!1).layers(this.options.layers).run((function(e,t,i){var o=[];if(!e){var r=Math.min(this.options.maxResults,t.features.length);i.results=i.results.reverse();for(var n=0;n<r;n++){var a=t.features[n],l=i.results[n],u=l.layerId,h=this._idFields[u];a.layerId=u,a.layerName=this._layerNames[u],a.displayFieldName=this._displayFields[u],h&&o.push({text:this.options.formatSuggestion.call(this,a),unformattedText:a.properties[a.displayFieldName],magicKey:l.attributes[h]+":"+u})}}s(e,o.reverse())}),this)},results:function(e,t,s,i){var o,r,n=[];return(t?(o=t.split(":")[0],r=t.split(":")[1],this.query().layer(r).featureIds(o)):this.find().text(e).fields(this.options.searchFields).layers(this.options.layers)).run((function(e,t,s){if(!e){s.results&&(s.results=s.results.reverse());for(var o=0;o<t.features.length;o++){var a,l,u=t.features[o];r=r||s.results[o].layerId,u&&void 0!==r&&(a=this._featureBounds(u),u.layerId=r,u.layerName=this._layerNames[r],u.displayFieldName=this._displayFields[r],l={latlng:a.getCenter(),bounds:a,text:this.options.formatSuggestion.call(this,u),properties:u.properties,geojson:u},n.push(l))}}i(e,n.reverse())}),this)},_featureBounds:function(e){var s=t.geoJson(e);if("Point"!==e.geometry.type)return s.getBounds();var i=s.getBounds().getCenter(),o=this.options.bufferRadius/40075017*360/Math.cos(180/Math.PI*i.lat),r=this.options.bufferRadius/40075017*360;return t.latLngBounds([i.lat-r,i.lng-o],[i.lat+r,i.lng+o])},_layerMetadataCallback:function(e){return t.Util.bind((function(t,s){if(!t){this._displayFields[e]=s.displayField,this._layerNames[e]=s.name;for(var i=0;i<s.fields.length;i++){var o=s.fields[i];if("esriFieldTypeOID"===o.type){this._idFields[e]=o.name;break}}}}),this)},_getIdFields:function(){this._idFields={},this._displayFields={},this._layerNames={};for(var e=0;e<this.options.layers.length;e++){var t=this.options.layers[e];this.get(t,{},this._layerMetadataCallback(t))}}}),_=h.extend({options:{label:"Geocode Server",maxResults:5},suggestions:function(e,t,s){if(this.options.supportsSuggest){var i=this.suggest().text(e);return t&&i.within(t),i.run((function(e,t,i){var o=[];if(!e)for(;i.suggestions.length&&o.length<=this.options.maxResults-1;){var r=i.suggestions.shift();r.isCollection||o.push({text:r.text,unformattedText:r.text,magicKey:r.magicKey})}s(e,o)}),this)}return s(void 0,[]),!1},results:function(e,t,s,i){var o=this.geocode().text(e);return t&&o.key(t),o.maxLocations(this.options.maxResults),s&&o.within(s),o.run((function(e,t){i(e,t.results)}),this)}});e.ArcgisOnlineProvider=g,e.FeatureLayerProvider=v,e.Geocode=o,e.GeocodeService=h,e.GeocodeServiceProvider=_,e.Geosearch=f,e.GeosearchCore=d,e.MapServiceProvider=m,e.ReverseGeocode=n,e.Suggest=l,e.VERSION="2.3.3",e.WorldGeocodingServiceUrl=i,e.arcgisOnlineProvider=p,e.featureLayerProvider=function(e){return new v(e)},e.geocode=r,e.geocodeService=function(e){return new h(e)},e.geocodeServiceProvider=function(e){return new _(e)},e.geosearch=function(e){return new f(e)},e.geosearchCore=c,e.mapServiceProvider=function(e){return new m(e)},e.reverseGeocode=a,e.suggest=u,Object.defineProperty(e,"__esModule",{value:!0})}));
--- a/src/pyams_gis/resources/js/leaflet-esri-gp-2.0.1.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,281 +0,0 @@
-/* esri-leaflet-gp - v2.0.1 - Fri Sep 09 2016 14:42:04 GMT-0700 (PDT)
- * Copyright (c) 2016 Environmental Systems Research Institute, Inc.
- * Apache-2.0 */
-(function (global, factory) {
-	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('esri-leaflet')) :
-	typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'esri-leaflet'], factory) :
-	(factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.GP = global.L.esri.GP || {}),global.L,global.L.esri));
-}(this, function (exports,L,esriLeaflet) { 'use strict';
-
-	L = 'default' in L ? L['default'] : L;
-
-	var version = "2.0.1";
-
-	var Task$1 = esriLeaflet.Task.extend({
-
-	  includes: L.Mixin.Events,
-
-	  // setters: {}, we don't use these because we don't know the ParamName OR value of custom GP services
-	  params: {},
-	  resultParams: {},
-
-	  initialize: function (options) {
-	    // don't replace parent initialize
-	    esriLeaflet.Task.prototype.initialize.call(this, options);
-
-	    // if path isn't supplied in options, try and determine if its sync or async to set automatically
-	    if (!this.options.path) {
-	      // assume initially, that service is synchronous
-	      this.options.async = false;
-	      this.options.path = 'execute';
-
-	      // the parameters below seem wonky to me, but work for both CORS and JSONP requests
-	      this._service.metadata(function (error, results) {
-	        if (!error) {
-	          if (results.executionType === 'esriExecutionTypeSynchronous') {
-	            this.options.async = false;
-	            this.options.path = 'execute';
-	          } else {
-	            this.options.async = true;
-	            this.options.path = 'submitJob';
-	          }
-	          this.fire('initialized');
-	        } else {
-	          // if check fails, hopefully its synchronous
-	          this.options.async = false;
-	          this.options.path = 'execute';
-	          return;
-	        }
-	      }, this);
-	    } else {
-	      // if path is custom, hopefully its synchronous
-	      if (this.options.async !== true && this.options.path !== 'submitJob') {
-	        this.options.async = false;
-	      }
-	    }
-	  },
-
-	  // doc for various GPInput types can be found here
-	  // http://resources.arcgis.com/en/help/arcgis-rest-api/index.html#/GP_Result/02r3000000q7000000/
-
-	  // set booleans, numbers, strings
-	  setParam: function (paramName, paramValue) {
-	    if (typeof paramValue === 'boolean') {
-	      this.params[paramName] = paramValue;
-	      return;
-	    } else if (typeof paramValue !== 'object') { // strings, numbers
-	      this.params[paramName] = paramValue;
-	      return;
-	    } else {
-	      // otherwise assume its latlng, marker, bounds or geojson
-	      this._setGeometry(paramName, paramValue);
-	    }
-	  },
-
-	  // not sure how best to handle passing more than one parameter at once
-	  // setParams: function(inputArray) {
-	  //   if (L.Util.isArray(inputArray)) {
-	  //     for (var i = 0; i < inputArray.length; i++) {
-	  //       this.setParam(inputArray[i]);
-	  //     }
-	  //   }
-	  // },
-
-	  // give developer opportunity to point out where the output is going to be available
-	  setOutputParam: function (paramName) {
-	    this.params.outputParam = paramName;
-	  },
-
-	  /* necessary because of the design requirement that resultParams be specified
-	  for async elevation services in order to get Zs (unnecessarily confusing)*/
-	  gpAsyncResultParam: function (paramName, paramValue) {
-	    this.resultParams[paramName] = paramValue;
-	  },
-
-	  // we currently expect a single geometry or feature (ported from: Tasks.Query._setGeometry)
-	  _setGeometry: function (paramName, geometry) {
-	    var processedInput = {
-	      'geometryType': '',
-	      'features': []
-	    };
-
-	    // convert bounds to extent and finish
-	    if (geometry instanceof L.LatLngBounds) {
-	      // set geometry + type
-	      processedInput.features.push({'geometry': L.esri.Util.boundsToExtent(geometry)});
-	      processedInput.geometryType = L.esri.Util.geojsonTypeToArcGIS(geometry.type);
-	    }
-
-	    // convert L.Marker > L.LatLng
-	    if (geometry.getLatLng) {
-	      geometry = geometry.getLatLng();
-	    }
-
-	    // convert L.LatLng to a geojson point and continue;
-	    if (geometry instanceof L.LatLng) {
-	      geometry = {
-	        type: 'Point',
-	        coordinates: [geometry.lng, geometry.lat]
-	      };
-	    }
-
-	    // handle L.GeoJSON, pull out the first geometry
-	    if (geometry instanceof L.GeoJSON) {
-	      // reassign geometry to the GeoJSON value  (we are assuming that only one feature is present)
-	      geometry = geometry.getLayers()[0].feature.geometry;
-	      processedInput.features.push({'geometry': esriLeaflet.Util.geojsonToArcGIS(geometry)});
-	      processedInput.geometryType = esriLeaflet.Util.geojsonTypeToArcGIS(geometry.type);
-	    }
-
-	    // Handle L.Polyline and L.Polygon
-	    if (geometry.toGeoJSON) {
-	      geometry = geometry.toGeoJSON();
-	    }
-
-	    // handle GeoJSON feature by pulling out the geometry
-	    if (geometry.type === 'Feature') {
-	      // get the geometry of the geojson feature
-	      geometry = geometry.geometry;
-	    }
-
-	    // confirm that our GeoJSON is a point, line or polygon
-	    if (geometry.type === 'Point' || geometry.type === 'LineString' || geometry.type === 'Polygon') {
-	      processedInput.features.push({'geometry': esriLeaflet.Util.geojsonToArcGIS(geometry)});
-	      processedInput.geometryType = esriLeaflet.Util.geojsonTypeToArcGIS(geometry.type);
-	    } else {
-	      if (console && console.warn) {
-	        console.warn('invalid geometry passed as GP input. Should be an L.LatLng, L.LatLngBounds, L.Marker or GeoJSON Point Line or Polygon object');
-	      }
-	    }
-
-	    this.params[paramName] = processedInput;
-	    return;
-	  },
-
-	  run: function (callback, context) {
-	    this._done = false;
-
-	    if (this.options.async === true) {
-	      /* eslint-disable */
-	      this._service.request(this.options.path, this.params, function (error, response) {
-	        this._currentJobId = response.jobId;
-	        this.checkJob(this._currentJobId, callback, context);
-	      }, this);
-	      /* eslint-enable */
-	    } else {
-	      return this._service.request(this.options.path, this.params, function (error, response) {
-	        callback.call(context, error, (response && this.processGPOutput(response)), response);
-	      }, this);
-	    }
-	  },
-
-	  checkJob: function (jobId, callback, context) {
-	    var pollJob = function () {
-	      /* eslint-disable */
-	      this._service.request('jobs/' + jobId, {}, function polledJob (error, response) {
-	        if (response.jobStatus === 'esriJobSucceeded') {
-	          if (!this._done) {
-	            this._done = true;
-	            // to do:
-	            // refactor to make an array of async requests for output
-	            this._service.request('jobs/' + jobId + '/results/' + this.params.outputParam, this.resultParams, function processJobResult (error, response) {
-	              callback.call(context, error, (response && this.processAsyncOutput(response)), response);
-	            }, this);
-	          }
-	          window.clearInterval(counter);
-	        } else if (response.jobStatus === 'esriJobFailed') {
-	          callback.call(context, 'Job Failed', null);
-	          window.clearInterval(counter);
-	        }
-	      }, this);
-	      /* eslint-enable */
-	    }.bind(this);
-
-	    var counter = window.setInterval(pollJob, this._service.options.asyncInterval * 1000);
-	  },
-
-	  processGPOutput: function (response) {
-	    var processedResponse = {};
-
-	    // grab syncronous results
-	    if (this.options.async === false) {
-	      // loop through results and pass back, parsing esri json
-	      for (var i = 0; i < response.results.length; i++) {
-	        /* jshint ignore:start */
-	        processedResponse[response.results[i].paramName];
-	        /* jshint ignore:end */
-	        if (response.results[i].dataType === 'GPFeatureRecordSetLayer') {
-	          var featureCollection = esriLeaflet.Util.responseToFeatureCollection(response.results[i].value);
-	          processedResponse[response.results[i].paramName] = featureCollection;
-	        } else {
-	          processedResponse[response.results[i].paramName] = response.results[i].value;
-	        }
-	      }
-	    } else { // grab async results slightly differently
-	      processedResponse.jobId = this._currentJobId;
-	      // var responseValue = response.value;
-	    }
-
-	    // if output is a raster layer, we also need to stub out a MapService url using jobid
-	    if (this.options.async === true && response.dataType === 'GPRasterDataLayer') {
-	      var baseURL = this.options.url;
-	      var n = baseURL.indexOf('GPServer');
-	      var serviceURL = baseURL.slice(0, n) + 'MapServer/';
-	      processedResponse.outputMapService = serviceURL + 'jobs/' + this._currentJobId;
-	    }
-
-	    return processedResponse;
-	  },
-
-	  processAsyncOutput: function (response) {
-	    var processedResponse = {};
-	    processedResponse.jobId = this._currentJobId;
-
-	    // if output is a raster layer, we also need to stub out a MapService url using jobid
-	    if (this.options.async === true && response.dataType === 'GPRasterDataLayer') {
-	      var baseURL = this.options.url;
-	      var n = baseURL.indexOf('GPServer');
-	      var serviceURL = baseURL.slice(0, n) + 'MapServer/';
-	      processedResponse.outputMapService = serviceURL + 'jobs/' + this._currentJobId;
-	    }
-
-	    // if output is GPFeatureRecordSetLayer, convert to GeoJSON
-	    if (response.dataType === 'GPFeatureRecordSetLayer') {
-	      var featureCollection = esriLeaflet.Util.responseToFeatureCollection(response.value);
-	      processedResponse[response.paramName] = featureCollection;
-	    } else {
-	      processedResponse[response.paramName] = response.value;
-	    }
-
-	    return processedResponse;
-	  }
-
-	});
-
-	function task (options) {
-	  return new Task$1(options);
-	}
-
-	var Service$1 = esriLeaflet.Service.extend({
-	  options: {
-	    asyncInterval: 1
-	  },
-
-	  createTask: function () {
-	    return new Task$1(this, this.options);
-	  }
-
-	});
-
-	function service (options) {
-	  return new Service$1(options);
-	}
-
-	exports.VERSION = version;
-	exports.Task = Task$1;
-	exports.task = task;
-	exports.Service = Service$1;
-	exports.service = service;
-
-}));
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWdwLWRlYnVnLmpzIiwic291cmNlcyI6WyIuLi9wYWNrYWdlLmpzb24iLCIuLi9zcmMvVGFza3MvR2VvcHJvY2Vzc2luZy5qcyIsIi4uL3NyYy9TZXJ2aWNlcy9HZW9wcm9jZXNzaW5nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIntcbiAgXCJuYW1lXCI6IFwiZXNyaS1sZWFmbGV0LWdwXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJBIExlYWZsZXQgcGx1Z2luIGZvciBpbnRlcmFjdGluZyB3aXRoIEFyY0dJUyBnZW9wcm9jZXNzaW5nIHNlcnZpY2VzLlwiLFxuICBcInZlcnNpb25cIjogXCIyLjAuMVwiLFxuICBcImF1dGhvclwiOiBcIkpvaG4gR3Jhdm9pcyA8amdyYXZvaXNAZXNyaS5jb20+IChodHRwOi8vam9obmdyYXZvaXMuY29tKVwiLFxuICBcImJyb3dzZXJcIjogXCJkaXN0L2VzcmktbGVhZmxldC1ncC1kZWJ1Zy5qc1wiLFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2pncmF2b2lzL2VzcmktbGVhZmxldC1ncC9pc3N1ZXNcIlxuICB9LFxuICBcImNvbnRyaWJ1dG9yc1wiOiBbXG4gICAgXCJKb2huIEdyYXZvaXMgPGpncmF2b2lzQGVzcmkuY29tPiAoaHR0cDovL2pvaG5ncmF2b2lzLmNvbSlcIixcbiAgICBcIk5pY2hvbGFzIEZ1cm5lc3MgPG5mdXJuZXNzQGVzcmkuY29tPiAoaHR0cDovL25peHRhLmdpdGh1Yi5pby8pXCIsXG4gICAgXCJQYXRyaWNrIEFybHQgPHBhcmx0QGVzcmkuY29tPiAoaHR0cDovL3BhdHJpY2thcmx0LmNvbSlcIixcbiAgICBcIlJvd2FuIFdpbnNlbWl1c1wiXG4gIF0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImxlYWZsZXRcIjogXCJeMS4wLjAtcmMuM1wiLFxuICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4wXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiY2hhaVwiOiBcIjIuMy4wXCIsXG4gICAgXCJnaC1yZWxlYXNlXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJoaWdobGlnaHQuanNcIjogXCJeOC4wLjBcIixcbiAgICBcImh0dHAtc2VydmVyXCI6IFwiXjAuOC41XCIsXG4gICAgXCJpc3BhcnRhXCI6IFwiXjMuMC4zXCIsXG4gICAgXCJpc3RhbmJ1bFwiOiBcIl4wLjQuMlwiLFxuICAgIFwia2FybWFcIjogXCJeMC4xMi4yNFwiLFxuICAgIFwia2FybWEtY2hhaS1zaW5vblwiOiBcIl4wLjEuM1wiLFxuICAgIFwia2FybWEtY292ZXJhZ2VcIjogXCJeMC41LjNcIixcbiAgICBcImthcm1hLW1vY2hhXCI6IFwiXjAuMS4wXCIsXG4gICAgXCJrYXJtYS1tb2NoYS1yZXBvcnRlclwiOiBcIl4wLjIuNVwiLFxuICAgIFwia2FybWEtcGhhbnRvbWpzLWxhdW5jaGVyXCI6IFwiXjAuMi4wXCIsXG4gICAgXCJrYXJtYS1zb3VyY2VtYXAtbG9hZGVyXCI6IFwiXjAuMy41XCIsXG4gICAgXCJta2RpcnBcIjogXCJeMC41LjFcIixcbiAgICBcInBoYW50b21qc1wiOiBcIl4xLjkuMTdcIixcbiAgICBcInJvbGx1cFwiOiBcIl4wLjI1LjRcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tanNvblwiOiBcIl4yLjAuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1ub2RlLXJlc29sdmVcIjogXCJeMS40LjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tdWdsaWZ5XCI6IFwiXjAuMS4wXCIsXG4gICAgXCJzZW1pc3RhbmRhcmRcIjogXCJeNy4wLjVcIixcbiAgICBcInNpbm9uXCI6IFwiXjEuMTEuMVwiLFxuICAgIFwic2lub24tY2hhaVwiOiBcIjIuNy4wXCIsXG4gICAgXCJzbmF6enlcIjogXCJeMi4wLjFcIixcbiAgICBcInVnbGlmeS1qc1wiOiBcIl4yLjYuMVwiLFxuICAgIFwid2F0Y2hcIjogXCJeMC4xNy4xXCJcbiAgfSxcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9qZ3Jhdm9pcy9lc3JpLWxlYWZsZXQtZ3BcIixcbiAgXCJqc25leHQ6bWFpblwiOiBcInNyYy9Fc3JpTGVhZmxldEdQLmpzXCIsXG4gIFwianNwbVwiOiB7XG4gICAgXCJyZWdpc3RyeVwiOiBcIm5wbVwiLFxuICAgIFwiZm9ybWF0XCI6IFwiZXM2XCIsXG4gICAgXCJtYWluXCI6IFwic3JjL0VzcmlMZWFmbGV0R1AuanNcIlxuICB9LFxuICBcImxpY2Vuc2VcIjogXCJBcGFjaGUtMi4wXCIsXG4gIFwibWFpblwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LWdwLWRlYnVnLmpzXCIsXG4gIFwicmVhZG1lRmlsZW5hbWVcIjogXCJSRUFETUUubWRcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdEBnaXRodWIuY29tOmpncmF2b2lzL2VzcmktbGVhZmxldC1ncC5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwicHJlYnVpbGRcIjogXCJta2RpcnAgZGlzdFwiLFxuICAgIFwiYnVpbGRcIjogXCJyb2xsdXAgLWMgcHJvZmlsZXMvZGVidWcuanMgJiByb2xsdXAgLWMgcHJvZmlsZXMvcHJvZHVjdGlvbi5qc1wiLFxuICAgIFwibGludFwiOiBcInNlbWlzdGFuZGFyZCBzcmMvKiovKi5qcyB8IHNuYXp6eVwiLFxuICAgIFwicHJlcHVibGlzaFwiOiBcIm5wbSBydW4gYnVpbGRcIixcbiAgICBcInByZXRlc3RcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1biBsaW50ICYmIGthcm1hIHN0YXJ0XCIsXG4gICAgXCJyZWxlYXNlXCI6IFwiLi9zY3JpcHRzL3JlbGVhc2Uuc2hcIixcbiAgICBcInN0YXJ0XCI6IFwid2F0Y2ggJ25wbSBydW4gYnVpbGQnIHNyYyAmIGh0dHAtc2VydmVyIC1wIDUwMDAgLWMtMSAtb1wiXG4gIH1cbn1cbiIsIi8qXG50byBkbzpcbnNldFBhcmFtKFtdKVxuKi9cblxuaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBUYXNrIGFzIEJhc2VUYXNrLCBVdGlsIH0gZnJvbSAnZXNyaS1sZWFmbGV0JztcblxuZXhwb3J0IHZhciBUYXNrID0gQmFzZVRhc2suZXh0ZW5kKHtcblxuICBpbmNsdWRlczogTC5NaXhpbi5FdmVudHMsXG5cbiAgLy8gc2V0dGVyczoge30sIHdlIGRvbid0IHVzZSB0aGVzZSBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIFBhcmFtTmFtZSBPUiB2YWx1ZSBvZiBjdXN0b20gR1Agc2VydmljZXNcbiAgcGFyYW1zOiB7fSxcbiAgcmVzdWx0UGFyYW1zOiB7fSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIC8vIGRvbid0IHJlcGxhY2UgcGFyZW50IGluaXRpYWxpemVcbiAgICBCYXNlVGFzay5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgLy8gaWYgcGF0aCBpc24ndCBzdXBwbGllZCBpbiBvcHRpb25zLCB0cnkgYW5kIGRldGVybWluZSBpZiBpdHMgc3luYyBvciBhc3luYyB0byBzZXQgYXV0b21hdGljYWxseVxuICAgIGlmICghdGhpcy5vcHRpb25zLnBhdGgpIHtcbiAgICAgIC8vIGFzc3VtZSBpbml0aWFsbHksIHRoYXQgc2VydmljZSBpcyBzeW5jaHJvbm91c1xuICAgICAgdGhpcy5vcHRpb25zLmFzeW5jID0gZmFsc2U7XG4gICAgICB0aGlzLm9wdGlvbnMucGF0aCA9ICdleGVjdXRlJztcblxuICAgICAgLy8gdGhlIHBhcmFtZXRlcnMgYmVsb3cgc2VlbSB3b25reSB0byBtZSwgYnV0IHdvcmsgZm9yIGJvdGggQ09SUyBhbmQgSlNPTlAgcmVxdWVzdHNcbiAgICAgIHRoaXMuX3NlcnZpY2UubWV0YWRhdGEoZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzKSB7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICBpZiAocmVzdWx0cy5leGVjdXRpb25UeXBlID09PSAnZXNyaUV4ZWN1dGlvblR5cGVTeW5jaHJvbm91cycpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hc3luYyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhdGggPSAnZXhlY3V0ZSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hc3luYyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucGF0aCA9ICdzdWJtaXRKb2InO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZpcmUoJ2luaXRpYWxpemVkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWYgY2hlY2sgZmFpbHMsIGhvcGVmdWxseSBpdHMgc3luY2hyb25vdXNcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucGF0aCA9ICdleGVjdXRlJztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBwYXRoIGlzIGN1c3RvbSwgaG9wZWZ1bGx5IGl0cyBzeW5jaHJvbm91c1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5hc3luYyAhPT0gdHJ1ZSAmJiB0aGlzLm9wdGlvbnMucGF0aCAhPT0gJ3N1Ym1pdEpvYicpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmFzeW5jID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIGRvYyBmb3IgdmFyaW91cyBHUElucHV0IHR5cGVzIGNhbiBiZSBmb3VuZCBoZXJlXG4gIC8vIGh0dHA6Ly9yZXNvdXJjZXMuYXJjZ2lzLmNvbS9lbi9oZWxwL2FyY2dpcy1yZXN0LWFwaS9pbmRleC5odG1sIy9HUF9SZXN1bHQvMDJyMzAwMDAwMHE3MDAwMDAwL1xuXG4gIC8vIHNldCBib29sZWFucywgbnVtYmVycywgc3RyaW5nc1xuICBzZXRQYXJhbTogZnVuY3Rpb24gKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcGFyYW1WYWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLnBhcmFtc1twYXJhbU5hbWVdID0gcGFyYW1WYWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbVZhbHVlICE9PSAnb2JqZWN0JykgeyAvLyBzdHJpbmdzLCBudW1iZXJzXG4gICAgICB0aGlzLnBhcmFtc1twYXJhbU5hbWVdID0gcGFyYW1WYWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIGFzc3VtZSBpdHMgbGF0bG5nLCBtYXJrZXIsIGJvdW5kcyBvciBnZW9qc29uXG4gICAgICB0aGlzLl9zZXRHZW9tZXRyeShwYXJhbU5hbWUsIHBhcmFtVmFsdWUpO1xuICAgIH1cbiAgfSxcblxuICAvLyBub3Qgc3VyZSBob3cgYmVzdCB0byBoYW5kbGUgcGFzc2luZyBtb3JlIHRoYW4gb25lIHBhcmFtZXRlciBhdCBvbmNlXG4gIC8vIHNldFBhcmFtczogZnVuY3Rpb24oaW5wdXRBcnJheSkge1xuICAvLyAgIGlmIChMLlV0aWwuaXNBcnJheShpbnB1dEFycmF5KSkge1xuICAvLyAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gIC8vICAgICAgIHRoaXMuc2V0UGFyYW0oaW5wdXRBcnJheVtpXSk7XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9LFxuXG4gIC8vIGdpdmUgZGV2ZWxvcGVyIG9wcG9ydHVuaXR5IHRvIHBvaW50IG91dCB3aGVyZSB0aGUgb3V0cHV0IGlzIGdvaW5nIHRvIGJlIGF2YWlsYWJsZVxuICBzZXRPdXRwdXRQYXJhbTogZnVuY3Rpb24gKHBhcmFtTmFtZSkge1xuICAgIHRoaXMucGFyYW1zLm91dHB1dFBhcmFtID0gcGFyYW1OYW1lO1xuICB9LFxuXG4gIC8qIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHRoZSBkZXNpZ24gcmVxdWlyZW1lbnQgdGhhdCByZXN1bHRQYXJhbXMgYmUgc3BlY2lmaWVkXG4gIGZvciBhc3luYyBlbGV2YXRpb24gc2VydmljZXMgaW4gb3JkZXIgdG8gZ2V0IFpzICh1bm5lY2Vzc2FyaWx5IGNvbmZ1c2luZykqL1xuICBncEFzeW5jUmVzdWx0UGFyYW06IGZ1bmN0aW9uIChwYXJhbU5hbWUsIHBhcmFtVmFsdWUpIHtcbiAgICB0aGlzLnJlc3VsdFBhcmFtc1twYXJhbU5hbWVdID0gcGFyYW1WYWx1ZTtcbiAgfSxcblxuICAvLyB3ZSBjdXJyZW50bHkgZXhwZWN0IGEgc2luZ2xlIGdlb21ldHJ5IG9yIGZlYXR1cmUgKHBvcnRlZCBmcm9tOiBUYXNrcy5RdWVyeS5fc2V0R2VvbWV0cnkpXG4gIF9zZXRHZW9tZXRyeTogZnVuY3Rpb24gKHBhcmFtTmFtZSwgZ2VvbWV0cnkpIHtcbiAgICB2YXIgcHJvY2Vzc2VkSW5wdXQgPSB7XG4gICAgICAnZ2VvbWV0cnlUeXBlJzogJycsXG4gICAgICAnZmVhdHVyZXMnOiBbXVxuICAgIH07XG5cbiAgICAvLyBjb252ZXJ0IGJvdW5kcyB0byBleHRlbnQgYW5kIGZpbmlzaFxuICAgIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIEwuTGF0TG5nQm91bmRzKSB7XG4gICAgICAvLyBzZXQgZ2VvbWV0cnkgKyB0eXBlXG4gICAgICBwcm9jZXNzZWRJbnB1dC5mZWF0dXJlcy5wdXNoKHsnZ2VvbWV0cnknOiBMLmVzcmkuVXRpbC5ib3VuZHNUb0V4dGVudChnZW9tZXRyeSl9KTtcbiAgICAgIHByb2Nlc3NlZElucHV0Lmdlb21ldHJ5VHlwZSA9IEwuZXNyaS5VdGlsLmdlb2pzb25UeXBlVG9BcmNHSVMoZ2VvbWV0cnkudHlwZSk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBMLk1hcmtlciA+IEwuTGF0TG5nXG4gICAgaWYgKGdlb21ldHJ5LmdldExhdExuZykge1xuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZXRMYXRMbmcoKTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IEwuTGF0TG5nIHRvIGEgZ2VvanNvbiBwb2ludCBhbmQgY29udGludWU7XG4gICAgaWYgKGdlb21ldHJ5IGluc3RhbmNlb2YgTC5MYXRMbmcpIHtcbiAgICAgIGdlb21ldHJ5ID0ge1xuICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICBjb29yZGluYXRlczogW2dlb21ldHJ5LmxuZywgZ2VvbWV0cnkubGF0XVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgTC5HZW9KU09OLCBwdWxsIG91dCB0aGUgZmlyc3QgZ2VvbWV0cnlcbiAgICBpZiAoZ2VvbWV0cnkgaW5zdGFuY2VvZiBMLkdlb0pTT04pIHtcbiAgICAgIC8vIHJlYXNzaWduIGdlb21ldHJ5IHRvIHRoZSBHZW9KU09OIHZhbHVlICAod2UgYXJlIGFzc3VtaW5nIHRoYXQgb25seSBvbmUgZmVhdHVyZSBpcyBwcmVzZW50KVxuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZXRMYXllcnMoKVswXS5mZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgcHJvY2Vzc2VkSW5wdXQuZmVhdHVyZXMucHVzaCh7J2dlb21ldHJ5JzogVXRpbC5nZW9qc29uVG9BcmNHSVMoZ2VvbWV0cnkpfSk7XG4gICAgICBwcm9jZXNzZWRJbnB1dC5nZW9tZXRyeVR5cGUgPSBVdGlsLmdlb2pzb25UeXBlVG9BcmNHSVMoZ2VvbWV0cnkudHlwZSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEwuUG9seWxpbmUgYW5kIEwuUG9seWdvblxuICAgIGlmIChnZW9tZXRyeS50b0dlb0pTT04pIHtcbiAgICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnkudG9HZW9KU09OKCk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIEdlb0pTT04gZmVhdHVyZSBieSBwdWxsaW5nIG91dCB0aGUgZ2VvbWV0cnlcbiAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAvLyBnZXQgdGhlIGdlb21ldHJ5IG9mIHRoZSBnZW9qc29uIGZlYXR1cmVcbiAgICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnkuZ2VvbWV0cnk7XG4gICAgfVxuXG4gICAgLy8gY29uZmlybSB0aGF0IG91ciBHZW9KU09OIGlzIGEgcG9pbnQsIGxpbmUgb3IgcG9seWdvblxuICAgIGlmIChnZW9tZXRyeS50eXBlID09PSAnUG9pbnQnIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCBnZW9tZXRyeS50eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgIHByb2Nlc3NlZElucHV0LmZlYXR1cmVzLnB1c2goeydnZW9tZXRyeSc6IFV0aWwuZ2VvanNvblRvQXJjR0lTKGdlb21ldHJ5KX0pO1xuICAgICAgcHJvY2Vzc2VkSW5wdXQuZ2VvbWV0cnlUeXBlID0gVXRpbC5nZW9qc29uVHlwZVRvQXJjR0lTKGdlb21ldHJ5LnR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdpbnZhbGlkIGdlb21ldHJ5IHBhc3NlZCBhcyBHUCBpbnB1dC4gU2hvdWxkIGJlIGFuIEwuTGF0TG5nLCBMLkxhdExuZ0JvdW5kcywgTC5NYXJrZXIgb3IgR2VvSlNPTiBQb2ludCBMaW5lIG9yIFBvbHlnb24gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wYXJhbXNbcGFyYW1OYW1lXSA9IHByb2Nlc3NlZElucHV0O1xuICAgIHJldHVybjtcbiAgfSxcblxuICBydW46IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXN5bmMgPT09IHRydWUpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgICB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QodGhpcy5vcHRpb25zLnBhdGgsIHRoaXMucGFyYW1zLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRKb2JJZCA9IHJlc3BvbnNlLmpvYklkO1xuICAgICAgICB0aGlzLmNoZWNrSm9iKHRoaXMuX2N1cnJlbnRKb2JJZCwgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QodGhpcy5vcHRpb25zLnBhdGgsIHRoaXMucGFyYW1zLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIChyZXNwb25zZSAmJiB0aGlzLnByb2Nlc3NHUE91dHB1dChyZXNwb25zZSkpLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH0sXG5cbiAgY2hlY2tKb2I6IGZ1bmN0aW9uIChqb2JJZCwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB2YXIgcG9sbEpvYiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgICB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QoJ2pvYnMvJyArIGpvYklkLCB7fSwgZnVuY3Rpb24gcG9sbGVkSm9iIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmpvYlN0YXR1cyA9PT0gJ2VzcmlKb2JTdWNjZWVkZWQnKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLl9kb25lKSB7XG4gICAgICAgICAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIHRvIGRvOlxuICAgICAgICAgICAgLy8gcmVmYWN0b3IgdG8gbWFrZSBhbiBhcnJheSBvZiBhc3luYyByZXF1ZXN0cyBmb3Igb3V0cHV0XG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QoJ2pvYnMvJyArIGpvYklkICsgJy9yZXN1bHRzLycgKyB0aGlzLnBhcmFtcy5vdXRwdXRQYXJhbSwgdGhpcy5yZXN1bHRQYXJhbXMsIGZ1bmN0aW9uIHByb2Nlc3NKb2JSZXN1bHQgKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCAocmVzcG9uc2UgJiYgdGhpcy5wcm9jZXNzQXN5bmNPdXRwdXQocmVzcG9uc2UpKSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGNvdW50ZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmpvYlN0YXR1cyA9PT0gJ2VzcmlKb2JGYWlsZWQnKSB7XG4gICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCAnSm9iIEZhaWxlZCcsIG51bGwpO1xuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGNvdW50ZXIpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzKTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICB2YXIgY291bnRlciA9IHdpbmRvdy5zZXRJbnRlcnZhbChwb2xsSm9iLCB0aGlzLl9zZXJ2aWNlLm9wdGlvbnMuYXN5bmNJbnRlcnZhbCAqIDEwMDApO1xuICB9LFxuXG4gIHByb2Nlc3NHUE91dHB1dDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgdmFyIHByb2Nlc3NlZFJlc3BvbnNlID0ge307XG5cbiAgICAvLyBncmFiIHN5bmNyb25vdXMgcmVzdWx0c1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAvLyBsb29wIHRocm91Z2ggcmVzdWx0cyBhbmQgcGFzcyBiYWNrLCBwYXJzaW5nIGVzcmkganNvblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zZS5yZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcHJvY2Vzc2VkUmVzcG9uc2VbcmVzcG9uc2UucmVzdWx0c1tpXS5wYXJhbU5hbWVdO1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgICBpZiAocmVzcG9uc2UucmVzdWx0c1tpXS5kYXRhVHlwZSA9PT0gJ0dQRmVhdHVyZVJlY29yZFNldExheWVyJykge1xuICAgICAgICAgIHZhciBmZWF0dXJlQ29sbGVjdGlvbiA9IFV0aWwucmVzcG9uc2VUb0ZlYXR1cmVDb2xsZWN0aW9uKHJlc3BvbnNlLnJlc3VsdHNbaV0udmFsdWUpO1xuICAgICAgICAgIHByb2Nlc3NlZFJlc3BvbnNlW3Jlc3BvbnNlLnJlc3VsdHNbaV0ucGFyYW1OYW1lXSA9IGZlYXR1cmVDb2xsZWN0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZFJlc3BvbnNlW3Jlc3BvbnNlLnJlc3VsdHNbaV0ucGFyYW1OYW1lXSA9IHJlc3BvbnNlLnJlc3VsdHNbaV0udmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyBncmFiIGFzeW5jIHJlc3VsdHMgc2xpZ2h0bHkgZGlmZmVyZW50bHlcbiAgICAgIHByb2Nlc3NlZFJlc3BvbnNlLmpvYklkID0gdGhpcy5fY3VycmVudEpvYklkO1xuICAgICAgLy8gdmFyIHJlc3BvbnNlVmFsdWUgPSByZXNwb25zZS52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBpZiBvdXRwdXQgaXMgYSByYXN0ZXIgbGF5ZXIsIHdlIGFsc28gbmVlZCB0byBzdHViIG91dCBhIE1hcFNlcnZpY2UgdXJsIHVzaW5nIGpvYmlkXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hc3luYyA9PT0gdHJ1ZSAmJiByZXNwb25zZS5kYXRhVHlwZSA9PT0gJ0dQUmFzdGVyRGF0YUxheWVyJykge1xuICAgICAgdmFyIGJhc2VVUkwgPSB0aGlzLm9wdGlvbnMudXJsO1xuICAgICAgdmFyIG4gPSBiYXNlVVJMLmluZGV4T2YoJ0dQU2VydmVyJyk7XG4gICAgICB2YXIgc2VydmljZVVSTCA9IGJhc2VVUkwuc2xpY2UoMCwgbikgKyAnTWFwU2VydmVyLyc7XG4gICAgICBwcm9jZXNzZWRSZXNwb25zZS5vdXRwdXRNYXBTZXJ2aWNlID0gc2VydmljZVVSTCArICdqb2JzLycgKyB0aGlzLl9jdXJyZW50Sm9iSWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2Nlc3NlZFJlc3BvbnNlO1xuICB9LFxuXG4gIHByb2Nlc3NBc3luY091dHB1dDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgdmFyIHByb2Nlc3NlZFJlc3BvbnNlID0ge307XG4gICAgcHJvY2Vzc2VkUmVzcG9uc2Uuam9iSWQgPSB0aGlzLl9jdXJyZW50Sm9iSWQ7XG5cbiAgICAvLyBpZiBvdXRwdXQgaXMgYSByYXN0ZXIgbGF5ZXIsIHdlIGFsc28gbmVlZCB0byBzdHViIG91dCBhIE1hcFNlcnZpY2UgdXJsIHVzaW5nIGpvYmlkXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hc3luYyA9PT0gdHJ1ZSAmJiByZXNwb25zZS5kYXRhVHlwZSA9PT0gJ0dQUmFzdGVyRGF0YUxheWVyJykge1xuICAgICAgdmFyIGJhc2VVUkwgPSB0aGlzLm9wdGlvbnMudXJsO1xuICAgICAgdmFyIG4gPSBiYXNlVVJMLmluZGV4T2YoJ0dQU2VydmVyJyk7XG4gICAgICB2YXIgc2VydmljZVVSTCA9IGJhc2VVUkwuc2xpY2UoMCwgbikgKyAnTWFwU2VydmVyLyc7XG4gICAgICBwcm9jZXNzZWRSZXNwb25zZS5vdXRwdXRNYXBTZXJ2aWNlID0gc2VydmljZVVSTCArICdqb2JzLycgKyB0aGlzLl9jdXJyZW50Sm9iSWQ7XG4gICAgfVxuXG4gICAgLy8gaWYgb3V0cHV0IGlzIEdQRmVhdHVyZVJlY29yZFNldExheWVyLCBjb252ZXJ0IHRvIEdlb0pTT05cbiAgICBpZiAocmVzcG9uc2UuZGF0YVR5cGUgPT09ICdHUEZlYXR1cmVSZWNvcmRTZXRMYXllcicpIHtcbiAgICAgIHZhciBmZWF0dXJlQ29sbGVjdGlvbiA9IFV0aWwucmVzcG9uc2VUb0ZlYXR1cmVDb2xsZWN0aW9uKHJlc3BvbnNlLnZhbHVlKTtcbiAgICAgIHByb2Nlc3NlZFJlc3BvbnNlW3Jlc3BvbnNlLnBhcmFtTmFtZV0gPSBmZWF0dXJlQ29sbGVjdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkUmVzcG9uc2VbcmVzcG9uc2UucGFyYW1OYW1lXSA9IHJlc3BvbnNlLnZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzZWRSZXNwb25zZTtcbiAgfVxuXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRhc2sgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBUYXNrKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0YXNrO1xuIiwiaW1wb3J0IHsgU2VydmljZSBhcyBCYXNlU2VydmljZSB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi4vVGFza3MvR2VvcHJvY2Vzc2luZyc7XG5cbmV4cG9ydCB2YXIgU2VydmljZSA9IEJhc2VTZXJ2aWNlLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBhc3luY0ludGVydmFsOiAxXG4gIH0sXG5cbiAgY3JlYXRlVGFzazogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgVGFzayh0aGlzLCB0aGlzLm9wdGlvbnMpO1xuICB9XG5cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZSAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IFNlcnZpY2Uob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNlcnZpY2U7XG4iXSwibmFtZXMiOlsiVGFzayIsIkJhc2VUYXNrIiwiVXRpbCIsIlNlcnZpY2UiLCJCYXNlU2VydmljZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztDQ1FPLElBQUlBLE1BQUksR0FBR0MsZ0JBQVEsQ0FBQyxNQUFNLENBQUM7O0FBRWxDLENBQUEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxD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
\ No newline at end of file
--- a/src/pyams_gis/resources/js/leaflet-esri-gp-2.0.1.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-(function(b,a){typeof exports==="object"&&typeof module!=="undefined"?a(exports,require("leaflet"),require("esri-leaflet")):typeof define==="function"&&define.amd?define(["exports","leaflet","esri-leaflet"],a):(a((b.L=b.L||{},b.L.esri=b.L.esri||{},b.L.esri.GP=b.L.esri.GP||{}),b.L,b.L.esri))}(this,function(f,b,g){b="default" in b?b["default"]:b;var c="2.0.1";var e=g.Task.extend({includes:b.Mixin.Events,params:{},resultParams:{},initialize:function(i){g.Task.prototype.initialize.call(this,i);if(!this.options.path){this.options.async=false;this.options.path="execute";this._service.metadata(function(j,k){if(!j){if(k.executionType==="esriExecutionTypeSynchronous"){this.options.async=false;this.options.path="execute"}else{this.options.async=true;this.options.path="submitJob"}this.fire("initialized")}else{this.options.async=false;this.options.path="execute";return}},this)}else{if(this.options.async!==true&&this.options.path!=="submitJob"){this.options.async=false}}},setParam:function(i,j){if(typeof j==="boolean"){this.params[i]=j;return}else{if(typeof j!=="object"){this.params[i]=j;return}else{this._setGeometry(i,j)}}},setOutputParam:function(i){this.params.outputParam=i},gpAsyncResultParam:function(i,j){this.resultParams[i]=j},_setGeometry:function(j,k){var i={geometryType:"",features:[]};if(k instanceof b.LatLngBounds){i.features.push({geometry:b.esri.Util.boundsToExtent(k)});i.geometryType=b.esri.Util.geojsonTypeToArcGIS(k.type)}if(k.getLatLng){k=k.getLatLng()}if(k instanceof b.LatLng){k={type:"Point",coordinates:[k.lng,k.lat]}}if(k instanceof b.GeoJSON){k=k.getLayers()[0].feature.geometry;i.features.push({geometry:g.Util.geojsonToArcGIS(k)});i.geometryType=g.Util.geojsonTypeToArcGIS(k.type)}if(k.toGeoJSON){k=k.toGeoJSON()}if(k.type==="Feature"){k=k.geometry}if(k.type==="Point"||k.type==="LineString"||k.type==="Polygon"){i.features.push({geometry:g.Util.geojsonToArcGIS(k)});i.geometryType=g.Util.geojsonTypeToArcGIS(k.type)}else{if(console&&console.warn){console.warn("invalid geometry passed as GP input. Should be an L.LatLng, L.LatLngBounds, L.Marker or GeoJSON Point Line or Polygon object")}}this.params[j]=i;return},run:function(j,i){this._done=false;if(this.options.async===true){this._service.request(this.options.path,this.params,function(l,k){this._currentJobId=k.jobId;this.checkJob(this._currentJobId,j,i)},this)}else{return this._service.request(this.options.path,this.params,function(l,k){j.call(i,l,(k&&this.processGPOutput(k)),k)},this)}},checkJob:function(i,m,k){var l=function(){this._service.request("jobs/"+i,{},function n(q,o){if(o.jobStatus==="esriJobSucceeded"){if(!this._done){this._done=true;this._service.request("jobs/"+i+"/results/"+this.params.outputParam,this.resultParams,function p(s,r){m.call(k,s,(r&&this.processAsyncOutput(r)),r)},this)}window.clearInterval(j)}else{if(o.jobStatus==="esriJobFailed"){m.call(k,"Job Failed",null);window.clearInterval(j)}}},this)}.bind(this);var j=window.setInterval(l,this._service.options.asyncInterval*1000)},processGPOutput:function(j){var m={};if(this.options.async===false){for(var k=0;k<j.results.length;k++){m[j.results[k].paramName];if(j.results[k].dataType==="GPFeatureRecordSetLayer"){var p=g.Util.responseToFeatureCollection(j.results[k].value);m[j.results[k].paramName]=p}else{m[j.results[k].paramName]=j.results[k].value}}}else{m.jobId=this._currentJobId}if(this.options.async===true&&j.dataType==="GPRasterDataLayer"){var l=this.options.url;var q=l.indexOf("GPServer");var o=l.slice(0,q)+"MapServer/";m.outputMapService=o+"jobs/"+this._currentJobId}return m},processAsyncOutput:function(i){var k={};k.jobId=this._currentJobId;if(this.options.async===true&&i.dataType==="GPRasterDataLayer"){var j=this.options.url;var o=j.indexOf("GPServer");var m=j.slice(0,o)+"MapServer/";k.outputMapService=m+"jobs/"+this._currentJobId}if(i.dataType==="GPFeatureRecordSetLayer"){var l=g.Util.responseToFeatureCollection(i.value);k[i.paramName]=l}else{k[i.paramName]=i.value}return k}});function d(i){return new e(i)}var h=g.Service.extend({options:{asyncInterval:1},createTask:function(){return new e(this,this.options)}});function a(i){return new h(i)}f.VERSION=c;f.Task=e;f.task=d;f.Service=h;f.service=a}));
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-gp-2.0.3.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,2 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("leaflet"),require("esri-leaflet")):"function"==typeof define&&define.amd?define(["exports","leaflet","esri-leaflet"],t):t((e.L=e.L||{},e.L.esri=e.L.esri||{},e.L.esri.GP=e.L.esri.GP||{}),e.L,e.L.esri)}(this,function(e,t,s){"use strict";function o(e){return new r(e)}function i(e){return new n(e)}t="default"in t?t.default:t;var r=s.Task.extend({includes:t.Evented.prototype,params:{},resultParams:{},initialize:function(e){s.Task.prototype.initialize.call(this,e),this.options.path||void 0!==this.options.async?(this.options.async&&(this.options.path=this.options.path?this.options.path:"submitJob"),this.options.async||(this.options.path=this.options.path?this.options.path:"execute")):(this.options.async=!1,this.options.path="execute",this._service.metadata(function(e,t){e||("esriExecutionTypeSynchronous"===t.executionType?(this.options.async=!1,this.options.path="execute"):(this.options.async=!0,this.options.path="submitJob"),this.fire("initialized"))},this))},setParam:function(e,t){if("boolean"==typeof t||"object"!=typeof t)return void(this.params[e]=t);if("object"==typeof t&&t.units)return void(this.params[e]=t);if("geometry"===e)this.params[e]=this._setGeometry(t);else{var o=this._setGeometryType(t),i={features:[]};if(o&&(i.geometryType=o),"FeatureCollection"===t.type&&"Feature"===t.features[0].type)for(var r=0;r<t.features.length;r++)"Feature"===t.features[r].type?i.features.push(s.Util.geojsonToArcGIS(t.features[r])):i.features.push({geometry:s.Util.geojsonToArcGIS(t.features[r].geometry)});else i.features.push({geometry:this._setGeometry(t)});this.params[e]=i}},setOutputParam:function(e){this.params.outputParam=e},gpAsyncResultParam:function(e,t){this.resultParams[e]=t},_setGeometry:function(e){return e instanceof t.LatLngBounds?t.esri.Util.boundsToExtent(e):(e.getLatLng&&(e=e.getLatLng()),e instanceof t.LatLng&&(e={type:"Point",coordinates:[e.lng,e.lat]}),e instanceof t.GeoJSON?(e=e.getLayers()[0].feature.geometry,s.Util.geojsonToArcGIS(e)):(e.toGeoJSON&&(e=e.toGeoJSON()),"Feature"===e.type&&(e=e.geometry),"Point"===e.type||"LineString"===e.type||"Polygon"===e.type?s.Util.geojsonToArcGIS(e):void s.Util.warn("invalid geometry passed as GP input. Should be an L.LatLng, L.LatLngBounds, L.Marker or GeoJSON Point Line or Polygon object")))},_setGeometryType:function(e){return e instanceof t.LatLngBounds?"esriGeometryEnvelope":e.getLatLng||e instanceof t.LatLng?"esriGeometryPoint":e instanceof t.GeoJSON?(e=e.getLayers()[0].feature.geometry,s.Util.geojsonTypeToArcGIS(e.type)):(e.toGeoJSON&&(e=e.toGeoJSON()),"Feature"===e.type&&(e=e.geometry),"Point"===e.type||"LineString"===e.type||"Polygon"===e.type?s.Util.geojsonTypeToArcGIS(e.type):"FeatureCollection"===e.type?s.Util.geojsonTypeToArcGIS(e.features[0].type):null)},run:function(e,t){if(this._done=!1,!0!==this.options.async)return this._service.request(this.options.path,this.params,function(s,o){s?e.call(t,s,null,null):o.results?e.call(t,s,o&&this._processGPOutput(o),o):o.histograms?e.call(t,s,o,o):o.routes&&e.call(t,s,o&&this._processNetworkAnalystOutput(o),o)},this);this._service.request(this.options.path,this.params,function(s,o){this._currentJobId=o.jobId,this.checkJob(this._currentJobId,e,t)},this)},checkJob:function(e,t,s){var o=function(){this._service.request("jobs/"+e,{},function(o,r){"esriJobSucceeded"===r.jobStatus?(this._done||(this._done=!0,this._service.request("jobs/"+e+"/results/"+this.params.outputParam,this.resultParams,function(e,o){t.call(s,e,o&&this._processAsyncOutput(o),o)},this)),window.clearInterval(i)):"esriJobFailed"===r.jobStatus&&(t.call(s,"Job Failed",null),window.clearInterval(i))},this)}.bind(this),i=window.setInterval(o,1e3*this._service.options.asyncInterval)},_processGPOutput:function(e){var t={},o=e.results;if(!1===this.options.async)for(var i=0;i<o.length;i++)if(t[o[i].paramName],"GPFeatureRecordSetLayer"===o[i].dataType){var r=s.Util.responseToFeatureCollection(o[i].value);t[o[i].paramName]=r}else t[o[i].paramName]=o[i].value;else t.jobId=this._currentJobId;if(!0===this.options.async&&"GPRasterDataLayer"===e.dataType){var n=this.options.url,a=n.indexOf("GPServer"),u=n.slice(0,a)+"MapServer/";t.outputMapService=u+"jobs/"+this._currentJobId}return t},_processNetworkAnalystOutput:function(e){var t={};if(e.routes.features.length>0){var o=s.Util.responseToFeatureCollection(e.routes);t.routes=o}return t},_processAsyncOutput:function(e){var t={};if(t.jobId=this._currentJobId,!0===this.options.async&&"GPRasterDataLayer"===e.dataType){var o=this.options.url,i=o.indexOf("GPServer"),r=o.slice(0,i)+"MapServer/";t.outputMapService=r+"jobs/"+this._currentJobId}if("GPFeatureRecordSetLayer"===e.dataType){var n=s.Util.responseToFeatureCollection(e.value);t[e.paramName]=n}else t[e.paramName]=e.value;return t}}),n=s.Service.extend({options:{asyncInterval:1},createTask:function(){return new r(this,this.options)}});e.VERSION="2.0.3",e.Task=r,e.task=o,e.Service=n,e.service=i});
+//# sourceMappingURL=esri-leaflet-gp.js.map
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-gp-2.0.3.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("leaflet"),require("esri-leaflet")):"function"==typeof define&&define.amd?define(["exports","leaflet","esri-leaflet"],t):t((e.L=e.L||{},e.L.esri=e.L.esri||{},e.L.esri.GP=e.L.esri.GP||{}),e.L,e.L.esri)}(this,(function(e,t,s){"use strict";t="default"in t?t.default:t;var o=s.Task.extend({includes:t.Evented.prototype,params:{},resultParams:{},initialize:function(e){s.Task.prototype.initialize.call(this,e),this.options.path||void 0!==this.options.async?(this.options.async&&(this.options.path=this.options.path?this.options.path:"submitJob"),this.options.async||(this.options.path=this.options.path?this.options.path:"execute")):(this.options.async=!1,this.options.path="execute",this._service.metadata((function(e,t){e||("esriExecutionTypeSynchronous"===t.executionType?(this.options.async=!1,this.options.path="execute"):(this.options.async=!0,this.options.path="submitJob"),this.fire("initialized"))}),this))},setParam:function(e,t){if("boolean"!=typeof t&&"object"==typeof t)if("object"==typeof t&&t.units)this.params[e]=t;else if("geometry"===e)this.params[e]=this._setGeometry(t);else{var o=this._setGeometryType(t),i={features:[]};if(o&&(i.geometryType=o),"FeatureCollection"===t.type&&"Feature"===t.features[0].type)for(var r=0;r<t.features.length;r++)"Feature"===t.features[r].type?i.features.push(s.Util.geojsonToArcGIS(t.features[r])):i.features.push({geometry:s.Util.geojsonToArcGIS(t.features[r].geometry)});else i.features.push({geometry:this._setGeometry(t)});this.params[e]=i}else this.params[e]=t},setOutputParam:function(e){this.params.outputParam=e},gpAsyncResultParam:function(e,t){this.resultParams[e]=t},_setGeometry:function(e){return e instanceof t.LatLngBounds?t.esri.Util.boundsToExtent(e):(e.getLatLng&&(e=e.getLatLng()),e instanceof t.LatLng&&(e={type:"Point",coordinates:[e.lng,e.lat]}),e instanceof t.GeoJSON?(e=e.getLayers()[0].feature.geometry,s.Util.geojsonToArcGIS(e)):(e.toGeoJSON&&(e=e.toGeoJSON()),"Feature"===e.type&&(e=e.geometry),"Point"===e.type||"LineString"===e.type||"Polygon"===e.type?s.Util.geojsonToArcGIS(e):void s.Util.warn("invalid geometry passed as GP input. Should be an L.LatLng, L.LatLngBounds, L.Marker or GeoJSON Point Line or Polygon object")))},_setGeometryType:function(e){return e instanceof t.LatLngBounds?"esriGeometryEnvelope":e.getLatLng||e instanceof t.LatLng?"esriGeometryPoint":e instanceof t.GeoJSON?(e=e.getLayers()[0].feature.geometry,s.Util.geojsonTypeToArcGIS(e.type)):(e.toGeoJSON&&(e=e.toGeoJSON()),"Feature"===e.type&&(e=e.geometry),"Point"===e.type||"LineString"===e.type||"Polygon"===e.type?s.Util.geojsonTypeToArcGIS(e.type):"FeatureCollection"===e.type?s.Util.geojsonTypeToArcGIS(e.features[0].type):null)},run:function(e,t){if(this._done=!1,!0!==this.options.async)return this._service.request(this.options.path,this.params,(function(s,o){s?e.call(t,s,null,null):o.results?e.call(t,s,o&&this._processGPOutput(o),o):o.histograms?e.call(t,s,o,o):o.routes&&e.call(t,s,o&&this._processNetworkAnalystOutput(o),o)}),this);this._service.request(this.options.path,this.params,(function(s,o){this._currentJobId=o.jobId,this.checkJob(this._currentJobId,e,t)}),this)},checkJob:function(e,t,s){var o=function(){this._service.request("jobs/"+e,{},(function(o,r){"esriJobSucceeded"===r.jobStatus?(this._done||(this._done=!0,this._service.request("jobs/"+e+"/results/"+this.params.outputParam,this.resultParams,(function(e,o){t.call(s,e,o&&this._processAsyncOutput(o),o)}),this)),window.clearInterval(i)):"esriJobFailed"===r.jobStatus&&(t.call(s,"Job Failed",null),window.clearInterval(i))}),this)}.bind(this),i=window.setInterval(o,1e3*this._service.options.asyncInterval)},_processGPOutput:function(e){var t={},o=e.results;if(!1===this.options.async)for(var i=0;i<o.length;i++)if(t[o[i].paramName],"GPFeatureRecordSetLayer"===o[i].dataType){var r=s.Util.responseToFeatureCollection(o[i].value);t[o[i].paramName]=r}else t[o[i].paramName]=o[i].value;else t.jobId=this._currentJobId;if(!0===this.options.async&&"GPRasterDataLayer"===e.dataType){var n=this.options.url,a=n.indexOf("GPServer"),u=n.slice(0,a)+"MapServer/";t.outputMapService=u+"jobs/"+this._currentJobId}return t},_processNetworkAnalystOutput:function(e){var t={};if(e.routes.features.length>0){var o=s.Util.responseToFeatureCollection(e.routes);t.routes=o}return t},_processAsyncOutput:function(e){var t={};if(t.jobId=this._currentJobId,!0===this.options.async&&"GPRasterDataLayer"===e.dataType){var o=this.options.url,i=o.indexOf("GPServer"),r=o.slice(0,i)+"MapServer/";t.outputMapService=r+"jobs/"+this._currentJobId}if("GPFeatureRecordSetLayer"===e.dataType){var n=s.Util.responseToFeatureCollection(e.value);t[e.paramName]=n}else t[e.paramName]=e.value;return t}}),i=s.Service.extend({options:{asyncInterval:1},createTask:function(){return new o(this,this.options)}});e.VERSION="2.0.3",e.Task=o,e.task=function(e){return new o(e)},e.Service=i,e.service=function(e){return new i(e)}}));
--- a/src/pyams_gis/resources/js/leaflet-esri-renderers-2.0.2.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1129 +0,0 @@
-/* esri-leaflet-renderers - v2.0.2 - Wed Jun 15 2016 09:56:55 GMT-0700 (PDT)
- * Copyright (c) 2016 Environmental Systems Research Institute, Inc.
- * Apache-2.0 */
-(function (global, factory) {
-	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet')) :
-	typeof define === 'function' && define.amd ? define(['exports', 'leaflet'], factory) :
-	(factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.Renderers = global.L.esri.Renderers || {}),global.L));
-}(this, function (exports,L) { 'use strict';
-
-	L = 'default' in L ? L['default'] : L;
-
-	var version = "2.0.2";
-
-	var Symbol = L.Class.extend({
-	  initialize: function (symbolJson, options) {
-	    this._symbolJson = symbolJson;
-	    this.val = null;
-	    this._styles = {};
-	    this._isDefault = false;
-	    this._layerTransparency = 1;
-	    if (options && options.layerTransparency) {
-	      this._layerTransparency = 1 - (options.layerTransparency / 100.0);
-	    }
-	  },
-
-	  // the geojson values returned are in points
-	  pixelValue: function (pointValue) {
-	    return pointValue * 1.333;
-	  },
-
-	  // color is an array [r,g,b,a]
-	  colorValue: function (color) {
-	    return 'rgb(' + color[0] + ',' + color[1] + ',' + color[2] + ')';
-	  },
-
-	  alphaValue: function (color) {
-	    var alpha = color[3] / 255.0;
-	    return alpha * this._layerTransparency;
-	  },
-
-	  getSize: function (feature, sizeInfo) {
-	    var attr = feature.properties;
-	    var field = sizeInfo.field;
-	    var size = 0;
-	    var featureValue = null;
-
-	    if (field) {
-	      featureValue = attr[field];
-	      var minSize = sizeInfo.minSize;
-	      var maxSize = sizeInfo.maxSize;
-	      var minDataValue = sizeInfo.minDataValue;
-	      var maxDataValue = sizeInfo.maxDataValue;
-	      var featureRatio;
-	      var normField = sizeInfo.normalizationField;
-	      var normValue = attr ? parseFloat(attr[normField]) : undefined;
-
-	      if (featureValue === null || (normField && ((isNaN(normValue) || normValue === 0)))) {
-	        return null;
-	      }
-
-	      if (!isNaN(normValue)) {
-	        featureValue /= normValue;
-	      }
-
-	      if (minSize !== null && maxSize !== null && minDataValue !== null && maxDataValue !== null) {
-	        if (featureValue <= minDataValue) {
-	          size = minSize;
-	        } else if (featureValue >= maxDataValue) {
-	          size = maxSize;
-	        } else {
-	          featureRatio = (featureValue - minDataValue) / (maxDataValue - minDataValue);
-	          size = minSize + (featureRatio * (maxSize - minSize));
-	        }
-	      }
-	      size = isNaN(size) ? 0 : size;
-	    }
-	    return size;
-	  },
-
-	  getColor: function (feature, colorInfo) {
-	    // required information to get color
-	    if (!(feature.properties && colorInfo && colorInfo.field && colorInfo.stops)) {
-	      return null;
-	    }
-
-	    var attr = feature.properties;
-	    var featureValue = attr[colorInfo.field];
-	    var lowerBoundColor, upperBoundColor, lowerBound, upperBound;
-	    var normField = colorInfo.normalizationField;
-	    var normValue = attr ? parseFloat(attr[normField]) : undefined;
-	    if (featureValue === null || (normField && ((isNaN(normValue) || normValue === 0)))) {
-	      return null;
-	    }
-
-	    if (!isNaN(normValue)) {
-	      featureValue /= normValue;
-	    }
-
-	    if (featureValue <= colorInfo.stops[0].value) {
-	      return colorInfo.stops[0].color;
-	    }
-	    var lastStop = colorInfo.stops[colorInfo.stops.length - 1];
-	    if (featureValue >= lastStop.value) {
-	      return lastStop.color;
-	    }
-
-	    // go through the stops to find min and max
-	    for (var i = 0; i < colorInfo.stops.length; i++) {
-	      var stopInfo = colorInfo.stops[i];
-
-	      if (stopInfo.value <= featureValue) {
-	        lowerBoundColor = stopInfo.color;
-	        lowerBound = stopInfo.value;
-	      } else if (stopInfo.value > featureValue) {
-	        upperBoundColor = stopInfo.color;
-	        upperBound = stopInfo.value;
-	        break;
-	      }
-	    }
-
-	    // feature falls between two stops, interplate the colors
-	    if (!isNaN(lowerBound) && !isNaN(upperBound)) {
-	      var range = upperBound - lowerBound;
-	      if (range > 0) {
-	        // more weight the further it is from the lower bound
-	        var upperBoundColorWeight = (featureValue - lowerBound) / range;
-	        if (upperBoundColorWeight) {
-	          // more weight the further it is from the upper bound
-	          var lowerBoundColorWeight = (upperBound - featureValue) / range;
-	          if (lowerBoundColorWeight) {
-	            // interpolate the lower and upper bound color by applying the
-	            // weights to each of the rgba colors and adding them together
-	            var interpolatedColor = [];
-	            for (var j = 0; j < 4; j++) {
-	              interpolatedColor[j] = Math.round(lowerBoundColor[j] * lowerBoundColorWeight + upperBoundColor[j] * upperBoundColorWeight);
-	            }
-	            return interpolatedColor;
-	          } else {
-	            // no difference between featureValue and upperBound, 100% of upperBoundColor
-	            return upperBoundColor;
-	          }
-	        } else {
-	          // no difference between featureValue and lowerBound, 100% of lowerBoundColor
-	          return lowerBoundColor;
-	        }
-	      }
-	    }
-	    // if we get to here, none of the cases apply so return null
-	    return null;
-	  }
-	});
-
-	var ShapeMarker = L.Path.extend({
-
-	  initialize: function (latlng, size, options) {
-	    L.setOptions(this, options);
-	    this._size = size;
-	    this._latlng = L.latLng(latlng);
-	    this._svgCanvasIncludes();
-	  },
-
-	  _svgCanvasIncludes: function () {
-	    // implement in sub class
-	  },
-
-	  _project: function () {
-	    this._point = this._map.latLngToLayerPoint(this._latlng);
-	  },
-
-	  _update: function () {
-	    if (this._map) {
-	      this._updatePath();
-	    }
-	  },
-
-	  _updatePath: function () {
-	    // implement in sub class
-	  },
-
-	  setLatLng: function (latlng) {
-	    this._latlng = L.latLng(latlng);
-	    this.redraw();
-	    return this.fire('move', {latlng: this._latlng});
-	  },
-
-	  getLatLng: function () {
-	    return this._latlng;
-	  },
-
-	  setSize: function (size) {
-	    this._size = size;
-	    return this.redraw();
-	  },
-
-	  getSize: function () {
-	    return this._size;
-	  }
-	});
-
-	var CrossMarker = ShapeMarker.extend({
-
-	  initialize: function (latlng, size, options) {
-	    ShapeMarker.prototype.initialize.call(this, latlng, size, options);
-	  },
-
-	  _updatePath: function () {
-	    this._renderer._updateCrossMarker(this);
-	  },
-
-	  _svgCanvasIncludes: function () {
-	    L.Canvas.include({
-	      _updateCrossMarker: function (layer) {
-	        var latlng = layer._point;
-	        var offset = layer._size / 2.0;
-	        var ctx = this._ctx;
-
-	        ctx.beginPath();
-	        ctx.moveTo(latlng.x, latlng.y + offset);
-	        ctx.lineTo(latlng.x, latlng.y - offset);
-	        this._fillStroke(ctx, layer);
-
-	        ctx.moveTo(latlng.x - offset, latlng.y);
-	        ctx.lineTo(latlng.x + offset, latlng.y);
-	        this._fillStroke(ctx, layer);
-	      }
-	    });
-
-	    L.SVG.include({
-	      _updateCrossMarker: function (layer) {
-	        var latlng = layer._point;
-	        var offset = layer._size / 2.0;
-
-	        if (L.Browser.vml) {
-	          latlng._round();
-	          offset = Math.round(offset);
-	        }
-
-	        var str = 'M' + latlng.x + ',' + (latlng.y + offset) +
-	          'L' + latlng.x + ',' + (latlng.y - offset) +
-	          'M' + (latlng.x - offset) + ',' + latlng.y +
-	          'L' + (latlng.x + offset) + ',' + latlng.y;
-
-	        this._setPath(layer, str);
-	      }
-	    });
-	  }
-	});
-
-	var crossMarker = function (latlng, size, options) {
-	  return new CrossMarker(latlng, size, options);
-	};
-
-	var XMarker = ShapeMarker.extend({
-
-	  initialize: function (latlng, size, options) {
-	    ShapeMarker.prototype.initialize.call(this, latlng, size, options);
-	  },
-
-	  _updatePath: function () {
-	    this._renderer._updateXMarker(this);
-	  },
-
-	  _svgCanvasIncludes: function () {
-	    L.Canvas.include({
-	      _updateXMarker: function (layer) {
-	        var latlng = layer._point;
-	        var offset = layer._size / 2.0;
-	        var ctx = this._ctx;
-
-	        ctx.beginPath();
-
-	        ctx.moveTo(latlng.x + offset, latlng.y + offset);
-	        ctx.lineTo(latlng.x - offset, latlng.y - offset);
-	        this._fillStroke(ctx, layer);
-	      }
-	    });
-
-	    L.SVG.include({
-	      _updateXMarker: function (layer) {
-	        var latlng = layer._point;
-	        var offset = layer._size / 2.0;
-
-	        if (L.Browser.vml) {
-	          latlng._round();
-	          offset = Math.round(offset);
-	        }
-
-	        var str = 'M' + (latlng.x + offset) + ',' + (latlng.y + offset) +
-	          'L' + (latlng.x - offset) + ',' + (latlng.y - offset) +
-	          'M' + (latlng.x - offset) + ',' + (latlng.y + offset) +
-	          'L' + (latlng.x + offset) + ',' + (latlng.y - offset);
-
-	        this._setPath(layer, str);
-	      }
-	    });
-	  }
-	});
-
-	var xMarker = function (latlng, size, options) {
-	  return new XMarker(latlng, size, options);
-	};
-
-	var SquareMarker = ShapeMarker.extend({
-	  options: {
-	    fill: true
-	  },
-
-	  initialize: function (latlng, size, options) {
-	    ShapeMarker.prototype.initialize.call(this, latlng, size, options);
-	  },
-
-	  _updatePath: function () {
-	    this._renderer._updateSquareMarker(this);
-	  },
-
-	  _svgCanvasIncludes: function () {
-	    L.Canvas.include({
-	      _updateSquareMarker: function (layer) {
-	        var latlng = layer._point;
-	        var offset = layer._size / 2.0;
-	        var ctx = this._ctx;
-
-	        ctx.beginPath();
-
-	        ctx.moveTo(latlng.x + offset, latlng.y + offset);
-	        ctx.lineTo(latlng.x - offset, latlng.y + offset);
-	        ctx.lineTo(latlng.x - offset, latlng.y - offset);
-	        ctx.lineTo(latlng.x + offset, latlng.y - offset);
-
-	        ctx.closePath();
-
-	        this._fillStroke(ctx, layer);
-	      }
-	    });
-
-	    L.SVG.include({
-	      _updateSquareMarker: function (layer) {
-	        var latlng = layer._point;
-	        var offset = layer._size / 2.0;
-
-	        if (L.Browser.vml) {
-	          latlng._round();
-	          offset = Math.round(offset);
-	        }
-
-	        var str = 'M' + (latlng.x + offset) + ',' + (latlng.y + offset) +
-	          'L' + (latlng.x - offset) + ',' + (latlng.y + offset) +
-	          'L' + (latlng.x - offset) + ',' + (latlng.y - offset) +
-	          'L' + (latlng.x + offset) + ',' + (latlng.y - offset);
-
-	        str = str + (L.Browser.svg ? 'z' : 'x');
-
-	        this._setPath(layer, str);
-	      }
-	    });
-	  }
-	});
-
-	var squareMarker = function (latlng, size, options) {
-	  return new SquareMarker(latlng, size, options);
-	};
-
-	var DiamondMarker = ShapeMarker.extend({
-	  options: {
-	    fill: true
-	  },
-
-	  initialize: function (latlng, size, options) {
-	    ShapeMarker.prototype.initialize.call(this, latlng, size, options);
-	  },
-
-	  _updatePath: function () {
-	    this._renderer._updateDiamondMarker(this);
-	  },
-
-	  _svgCanvasIncludes: function () {
-	    L.Canvas.include({
-	      _updateDiamondMarker: function (layer) {
-	        var latlng = layer._point;
-	        var offset = layer._size / 2.0;
-	        var ctx = this._ctx;
-
-	        ctx.beginPath();
-
-	        ctx.moveTo(latlng.x, latlng.y + offset);
-	        ctx.lineTo(latlng.x - offset, latlng.y);
-	        ctx.lineTo(latlng.x, latlng.y - offset);
-	        ctx.lineTo(latlng.x + offset, latlng.y);
-
-	        ctx.closePath();
-
-	        this._fillStroke(ctx, layer);
-	      }
-	    });
-
-	    L.SVG.include({
-	      _updateDiamondMarker: function (layer) {
-	        var latlng = layer._point;
-	        var offset = layer._size / 2.0;
-
-	        if (L.Browser.vml) {
-	          latlng._round();
-	          offset = Math.round(offset);
-	        }
-
-	        var str = 'M' + latlng.x + ',' + (latlng.y + offset) +
-	          'L' + (latlng.x - offset) + ',' + latlng.y +
-	          'L' + latlng.x + ',' + (latlng.y - offset) +
-	          'L' + (latlng.x + offset) + ',' + latlng.y;
-
-	        str = str + (L.Browser.svg ? 'z' : 'x');
-
-	        this._setPath(layer, str);
-	      }
-	    });
-	  }
-	});
-
-	var diamondMarker = function (latlng, size, options) {
-	  return new DiamondMarker(latlng, size, options);
-	};
-
-	var PointSymbol = Symbol.extend({
-
-	  statics: {
-	    MARKERTYPES: ['esriSMSCircle', 'esriSMSCross', 'esriSMSDiamond', 'esriSMSSquare', 'esriSMSX', 'esriPMS']
-	  },
-
-	  initialize: function (symbolJson, options) {
-	    Symbol.prototype.initialize.call(this, symbolJson, options);
-	    if (options) {
-	      this.serviceUrl = options.url;
-	    }
-	    if (symbolJson) {
-	      if (symbolJson.type === 'esriPMS') {
-	        var url = this.serviceUrl + 'images/' + this._symbolJson.url;
-	        this._iconUrl = options && options.token ? url + '?token=' + options.token : url;
-	        // leaflet does not allow resizing icons so keep a hash of different
-	        // icon sizes to try and keep down on the number of icons created
-	        this._icons = {};
-	        // create base icon
-	        this.icon = this._createIcon(this._symbolJson);
-	      } else {
-	        this._fillStyles();
-	      }
-	    }
-	  },
-
-	  _fillStyles: function () {
-	    if (this._symbolJson.outline && this._symbolJson.size > 0) {
-	      this._styles.stroke = true;
-	      this._styles.weight = this.pixelValue(this._symbolJson.outline.width);
-	      this._styles.color = this.colorValue(this._symbolJson.outline.color);
-	      this._styles.opacity = this.alphaValue(this._symbolJson.outline.color);
-	    } else {
-	      this._styles.stroke = false;
-	    }
-	    if (this._symbolJson.color) {
-	      this._styles.fillColor = this.colorValue(this._symbolJson.color);
-	      this._styles.fillOpacity = this.alphaValue(this._symbolJson.color);
-	    } else {
-	      this._styles.fillOpacity = 0;
-	    }
-
-	    if (this._symbolJson.style === 'esriSMSCircle') {
-	      this._styles.radius = this.pixelValue(this._symbolJson.size) / 2.0;
-	    }
-	  },
-
-	  _createIcon: function (options) {
-	    var width = this.pixelValue(options.width);
-	    var height = width;
-	    if (options.height) {
-	      height = this.pixelValue(options.height);
-	    }
-	    var xOffset = width / 2.0;
-	    var yOffset = height / 2.0;
-
-	    if (options.xoffset) {
-	      xOffset += this.pixelValue(options.xoffset);
-	    }
-	    if (options.yoffset) {
-	      yOffset += this.pixelValue(options.yoffset);
-	    }
-
-	    var icon = L.icon({
-	      iconUrl: this._iconUrl,
-	      iconSize: [width, height],
-	      iconAnchor: [xOffset, yOffset]
-	    });
-	    this._icons[options.width.toString()] = icon;
-	    return icon;
-	  },
-
-	  _getIcon: function (size) {
-	    // check to see if it is already created by size
-	    var icon = this._icons[size.toString()];
-	    if (!icon) {
-	      icon = this._createIcon({width: size});
-	    }
-	    return icon;
-	  },
-
-	  pointToLayer: function (geojson, latlng, visualVariables, options) {
-	    var size = this._symbolJson.size || this._symbolJson.width;
-	    if (!this._isDefault) {
-	      if (visualVariables.sizeInfo) {
-	        var calculatedSize = this.getSize(geojson, visualVariables.sizeInfo);
-	        if (calculatedSize) {
-	          size = calculatedSize;
-	        }
-	      }
-	      if (visualVariables.colorInfo) {
-	        var color = this.getColor(geojson, visualVariables.colorInfo);
-	        if (color) {
-	          this._styles.fillColor = this.colorValue(color);
-	          this._styles.fillOpacity = this.alphaValue(color);
-	        }
-	      }
-	    }
-
-	    if (this._symbolJson.type === 'esriPMS') {
-	      var layerOptions = L.extend({}, {icon: this._getIcon(size)}, options);
-	      return L.marker(latlng, layerOptions);
-	    }
-	    size = this.pixelValue(size);
-
-	    switch (this._symbolJson.style) {
-	      case 'esriSMSSquare':
-	        return squareMarker(latlng, size, L.extend({}, this._styles, options));
-	      case 'esriSMSDiamond':
-	        return diamondMarker(latlng, size, L.extend({}, this._styles, options));
-	      case 'esriSMSCross':
-	        return crossMarker(latlng, size, L.extend({}, this._styles, options));
-	      case 'esriSMSX':
-	        return xMarker(latlng, size, L.extend({}, this._styles, options));
-	    }
-	    this._styles.radius = size / 2.0;
-	    return L.circleMarker(latlng, L.extend({}, this._styles, options));
-	  }
-	});
-
-	function pointSymbol (symbolJson, options) {
-	  return new PointSymbol(symbolJson, options);
-	}
-
-	var LineSymbol = Symbol.extend({
-	  statics: {
-	    // Not implemented 'esriSLSNull'
-	    LINETYPES: ['esriSLSDash', 'esriSLSDot', 'esriSLSDashDotDot', 'esriSLSDashDot', 'esriSLSSolid']
-	  },
-	  initialize: function (symbolJson, options) {
-	    Symbol.prototype.initialize.call(this, symbolJson, options);
-	    this._fillStyles();
-	  },
-
-	  _fillStyles: function () {
-	    // set the defaults that show up on arcgis online
-	    this._styles.lineCap = 'butt';
-	    this._styles.lineJoin = 'miter';
-	    this._styles.fill = false;
-	    this._styles.weight = 0;
-
-	    if (!this._symbolJson) {
-	      return this._styles;
-	    }
-
-	    if (this._symbolJson.color) {
-	      this._styles.color = this.colorValue(this._symbolJson.color);
-	      this._styles.opacity = this.alphaValue(this._symbolJson.color);
-	    }
-
-	    if (!isNaN(this._symbolJson.width)) {
-	      this._styles.weight = this.pixelValue(this._symbolJson.width);
-
-	      var dashValues = [];
-
-	      switch (this._symbolJson.style) {
-	        case 'esriSLSDash':
-	          dashValues = [4, 3];
-	          break;
-	        case 'esriSLSDot':
-	          dashValues = [1, 3];
-	          break;
-	        case 'esriSLSDashDot':
-	          dashValues = [8, 3, 1, 3];
-	          break;
-	        case 'esriSLSDashDotDot':
-	          dashValues = [8, 3, 1, 3, 1, 3];
-	          break;
-	      }
-
-	      // use the dash values and the line weight to set dash array
-	      if (dashValues.length > 0) {
-	        for (var i = 0; i < dashValues.length; i++) {
-	          dashValues[i] *= this._styles.weight;
-	        }
-
-	        this._styles.dashArray = dashValues.join(',');
-	      }
-	    }
-	  },
-
-	  style: function (feature, visualVariables) {
-	    if (!this._isDefault && visualVariables) {
-	      if (visualVariables.sizeInfo) {
-	        var calculatedSize = this.pixelValue(this.getSize(feature, visualVariables.sizeInfo));
-	        if (calculatedSize) {
-	          this._styles.weight = calculatedSize;
-	        }
-	      }
-	      if (visualVariables.colorInfo) {
-	        var color = this.getColor(feature, visualVariables.colorInfo);
-	        if (color) {
-	          this._styles.color = this.colorValue(color);
-	          this._styles.opacity = this.alphaValue(color);
-	        }
-	      }
-	    }
-	    return this._styles;
-	  }
-	});
-
-	function lineSymbol (symbolJson, options) {
-	  return new LineSymbol(symbolJson, options);
-	}
-
-	var PolygonSymbol = Symbol.extend({
-	  statics: {
-	    // not implemented: 'esriSFSBackwardDiagonal','esriSFSCross','esriSFSDiagonalCross','esriSFSForwardDiagonal','esriSFSHorizontal','esriSFSNull','esriSFSVertical'
-	    POLYGONTYPES: ['esriSFSSolid']
-	  },
-	  initialize: function (symbolJson, options) {
-	    Symbol.prototype.initialize.call(this, symbolJson, options);
-	    if (symbolJson) {
-	      this._lineStyles = lineSymbol(symbolJson.outline, options).style();
-	      this._fillStyles();
-	    }
-	  },
-
-	  _fillStyles: function () {
-	    if (this._lineStyles) {
-	      if (this._lineStyles.weight === 0) {
-	        // when weight is 0, setting the stroke to false can still look bad
-	        // (gaps between the polygons)
-	        this._styles.stroke = false;
-	      } else {
-	        // copy the line symbol styles into this symbol's styles
-	        for (var styleAttr in this._lineStyles) {
-	          this._styles[styleAttr] = this._lineStyles[styleAttr];
-	        }
-	      }
-	    }
-
-	    // set the fill for the polygon
-	    if (this._symbolJson) {
-	      if (this._symbolJson.color &&
-	          // don't fill polygon if type is not supported
-	          PolygonSymbol.POLYGONTYPES.indexOf(this._symbolJson.style >= 0)) {
-	        this._styles.fill = true;
-	        this._styles.fillColor = this.colorValue(this._symbolJson.color);
-	        this._styles.fillOpacity = this.alphaValue(this._symbolJson.color);
-	      } else {
-	        this._styles.fill = false;
-	        this._styles.fillOpacity = 0;
-	      }
-	    }
-	  },
-
-	  style: function (feature, visualVariables) {
-	    if (!this._isDefault && visualVariables && visualVariables.colorInfo) {
-	      var color = this.getColor(feature, visualVariables.colorInfo);
-	      if (color) {
-	        this._styles.fillColor = this.colorValue(color);
-	        this._styles.fillOpacity = this.alphaValue(color);
-	      }
-	    }
-	    return this._styles;
-	  }
-	});
-
-	function polygonSymbol (symbolJson, options) {
-	  return new PolygonSymbol(symbolJson, options);
-	}
-
-	var Renderer = L.Class.extend({
-	  options: {
-	    proportionalPolygon: false,
-	    clickable: true
-	  },
-
-	  initialize: function (rendererJson, options) {
-	    this._rendererJson = rendererJson;
-	    this._pointSymbols = false;
-	    this._symbols = [];
-	    this._visualVariables = this._parseVisualVariables(rendererJson.visualVariables);
-	    L.Util.setOptions(this, options);
-	  },
-
-	  _parseVisualVariables: function (visualVariables) {
-	    var visVars = {};
-	    if (visualVariables) {
-	      for (var i = 0; i < visualVariables.length; i++) {
-	        visVars[visualVariables[i].type] = visualVariables[i];
-	      }
-	    }
-	    return visVars;
-	  },
-
-	  _createDefaultSymbol: function () {
-	    if (this._rendererJson.defaultSymbol) {
-	      this._defaultSymbol = this._newSymbol(this._rendererJson.defaultSymbol);
-	      this._defaultSymbol._isDefault = true;
-	    }
-	  },
-
-	  _newSymbol: function (symbolJson) {
-	    if (symbolJson.type === 'esriSMS' || symbolJson.type === 'esriPMS') {
-	      this._pointSymbols = true;
-	      return pointSymbol(symbolJson, this.options);
-	    }
-	    if (symbolJson.type === 'esriSLS') {
-	      return lineSymbol(symbolJson, this.options);
-	    }
-	    if (symbolJson.type === 'esriSFS') {
-	      return polygonSymbol(symbolJson, this.options);
-	    }
-	  },
-
-	  _getSymbol: function () {
-	    // override
-	  },
-
-	  attachStylesToLayer: function (layer) {
-	    if (this._pointSymbols) {
-	      layer.options.pointToLayer = L.Util.bind(this.pointToLayer, this);
-	    } else {
-	      layer.options.style = L.Util.bind(this.style, this);
-	      layer._originalStyle = layer.options.style;
-	    }
-	  },
-
-	  pointToLayer: function (geojson, latlng) {
-	    var sym = this._getSymbol(geojson);
-	    if (sym && sym.pointToLayer) {
-	      // right now custom panes are the only option pushed through
-	      return sym.pointToLayer(geojson, latlng, this._visualVariables, this.options);
-	    }
-	    // invisible symbology
-	    return L.circleMarker(latlng, {radius: 0, opacity: 0});
-	  },
-
-	  style: function (feature) {
-	    var userStyles;
-	    if (this.options.userDefinedStyle) {
-	      userStyles = this.options.userDefinedStyle(feature);
-	    }
-	    // find the symbol to represent this feature
-	    var sym = this._getSymbol(feature);
-	    if (sym) {
-	      return this.mergeStyles(sym.style(feature, this._visualVariables), userStyles);
-	    } else {
-	      // invisible symbology
-	      return this.mergeStyles({opacity: 0, fillOpacity: 0}, userStyles);
-	    }
-	  },
-
-	  mergeStyles: function (styles, userStyles) {
-	    var mergedStyles = {};
-	    var attr;
-	    // copy renderer style attributes
-	    for (attr in styles) {
-	      if (styles.hasOwnProperty(attr)) {
-	        mergedStyles[attr] = styles[attr];
-	      }
-	    }
-	    // override with user defined style attributes
-	    if (userStyles) {
-	      for (attr in userStyles) {
-	        if (userStyles.hasOwnProperty(attr)) {
-	          mergedStyles[attr] = userStyles[attr];
-	        }
-	      }
-	    }
-	    return mergedStyles;
-	  }
-	});
-
-	var SimpleRenderer = Renderer.extend({
-	  initialize: function (rendererJson, options) {
-	    Renderer.prototype.initialize.call(this, rendererJson, options);
-	    this._createSymbol();
-	  },
-
-	  _createSymbol: function () {
-	    if (this._rendererJson.symbol) {
-	      this._symbols.push(this._newSymbol(this._rendererJson.symbol));
-	    }
-	  },
-
-	  _getSymbol: function () {
-	    return this._symbols[0];
-	  }
-	});
-
-	function simpleRenderer (rendererJson, options) {
-	  return new SimpleRenderer(rendererJson, options);
-	}
-
-	var ClassBreaksRenderer = Renderer.extend({
-	  initialize: function (rendererJson, options) {
-	    Renderer.prototype.initialize.call(this, rendererJson, options);
-	    this._field = this._rendererJson.field;
-	    if (this._rendererJson.normalizationType && this._rendererJson.normalizationType === 'esriNormalizeByField') {
-	      this._normalizationField = this._rendererJson.normalizationField;
-	    }
-	    this._createSymbols();
-	  },
-
-	  _createSymbols: function () {
-	    var symbol;
-	    var classbreaks = this._rendererJson.classBreakInfos;
-
-	    this._symbols = [];
-
-	    // create a symbol for each class break
-	    for (var i = classbreaks.length - 1; i >= 0; i--) {
-	      if (this.options.proportionalPolygon && this._rendererJson.backgroundFillSymbol) {
-	        symbol = this._newSymbol(this._rendererJson.backgroundFillSymbol);
-	      } else {
-	        symbol = this._newSymbol(classbreaks[i].symbol);
-	      }
-	      symbol.val = classbreaks[i].classMaxValue;
-	      this._symbols.push(symbol);
-	    }
-	    // sort the symbols in ascending value
-	    this._symbols.sort(function (a, b) {
-	      return a.val > b.val ? 1 : -1;
-	    });
-	    this._createDefaultSymbol();
-	    this._maxValue = this._symbols[this._symbols.length - 1].val;
-	  },
-
-	  _getSymbol: function (feature) {
-	    var val = feature.properties[this._field];
-	    if (this._normalizationField) {
-	      var normValue = feature.properties[this._normalizationField];
-	      if (!isNaN(normValue) && normValue !== 0) {
-	        val = val / normValue;
-	      } else {
-	        return this._defaultSymbol;
-	      }
-	    }
-
-	    if (val > this._maxValue) {
-	      return this._defaultSymbol;
-	    }
-	    var symbol = this._symbols[0];
-	    for (var i = this._symbols.length - 1; i >= 0; i--) {
-	      if (val > this._symbols[i].val) {
-	        break;
-	      }
-	      symbol = this._symbols[i];
-	    }
-	    return symbol;
-	  }
-	});
-
-	function classBreaksRenderer (rendererJson, options) {
-	  return new ClassBreaksRenderer(rendererJson, options);
-	}
-
-	var UniqueValueRenderer = Renderer.extend({
-	  initialize: function (rendererJson, options) {
-	    Renderer.prototype.initialize.call(this, rendererJson, options);
-	    this._field = this._rendererJson.field1;
-	    this._createSymbols();
-	  },
-
-	  _createSymbols: function () {
-	    var symbol;
-	    var uniques = this._rendererJson.uniqueValueInfos;
-
-	    // create a symbol for each unique value
-	    for (var i = uniques.length - 1; i >= 0; i--) {
-	      symbol = this._newSymbol(uniques[i].symbol);
-	      symbol.val = uniques[i].value;
-	      this._symbols.push(symbol);
-	    }
-	    this._createDefaultSymbol();
-	  },
-
-	  _getSymbol: function (feature) {
-	    var val = feature.properties[this._field];
-	    // accumulate values if there is more than one field defined
-	    if (this._rendererJson.fieldDelimiter && this._rendererJson.field2) {
-	      var val2 = feature.properties[this._rendererJson.field2];
-	      if (val2) {
-	        val += this._rendererJson.fieldDelimiter + val2;
-	        var val3 = feature.properties[this._rendererJson.field3];
-	        if (val3) {
-	          val += this._rendererJson.fieldDelimiter + val3;
-	        }
-	      }
-	    }
-
-	    var symbol = this._defaultSymbol;
-	    for (var i = this._symbols.length - 1; i >= 0; i--) {
-	      // using the === operator does not work if the field
-	      // of the unique renderer is not a string
-	      /*eslint-disable */
-	      if (this._symbols[i].val == val) {
-	        symbol = this._symbols[i];
-	      }
-	      /*eslint-enable */
-	    }
-	    return symbol;
-	  }
-	});
-
-	function uniqueValueRenderer (rendererJson, options) {
-	  return new UniqueValueRenderer(rendererJson, options);
-	}
-
-	L.esri.FeatureLayer.addInitHook(function () {
-	  if (this.options.ignoreRenderer) {
-	    return;
-	  }
-	  var oldOnAdd = L.Util.bind(this.onAdd, this);
-	  var oldUnbindPopup = L.Util.bind(this.unbindPopup, this);
-	  var oldOnRemove = L.Util.bind(this.onRemove, this);
-	  L.Util.bind(this.createNewLayer, this);
-
-	  this.metadata(function (error, response) {
-	    if (error) {
-	      return;
-	    } if (response && response.drawingInfo) {
-	      this._setRenderers(response);
-	    } if (this._alreadyAdded) {
-	      this.setStyle(this._originalStyle);
-	    }
-	  }, this);
-
-	  this.onAdd = function (map) {
-	    oldOnAdd(map);
-	    this._addPointLayer(map);
-	    this._alreadyAdded = true;
-	  };
-
-	  this.onRemove = function (map) {
-	    oldOnRemove(map);
-	    if (this._pointLayer) {
-	      var pointLayers = this._pointLayer.getLayers();
-	      for (var i in pointLayers) {
-	        map.removeLayer(pointLayers[i]);
-	      }
-	    }
-	  };
-
-	  this.unbindPopup = function () {
-	    oldUnbindPopup();
-	    if (this._pointLayer) {
-	      var pointLayers = this._pointLayer.getLayers();
-	      for (var i in pointLayers) {
-	        pointLayers[i].unbindPopup();
-	      }
-	    }
-	  };
-
-	  this._addPointLayer = function (map) {
-	    if (this._pointLayer) {
-	      this._pointLayer.addTo(map);
-	      this._pointLayer.bringToFront();
-	    }
-	  };
-
-	  this._createPointLayer = function () {
-	    if (!this._pointLayer) {
-	      this._pointLayer = L.geoJson();
-	      // store the feature ids that have already been added to the map
-	      this._pointLayerIds = {};
-
-	      if (this._popup) {
-	        var popupFunction = function (feature, layer) {
-	          layer.bindPopup(this._popup(feature, layer), this._popupOptions);
-	        };
-	        this._pointLayer.options.onEachFeature = L.Util.bind(popupFunction, this);
-	      }
-	    }
-	  };
-
-	  this.createNewLayer = function (geojson) {
-	    var fLayer = L.GeoJSON.geometryToLayer(geojson, this.options);
-
-	    // add a point layer when the polygon is represented as proportional marker symbols
-	    if (this._hasProportionalSymbols) {
-	      var centroid = this.getPolygonCentroid(geojson.geometry.coordinates);
-	      if (!(isNaN(centroid[0]) || isNaN(centroid[0]))) {
-	        this._createPointLayer();
-
-	        var featureId = geojson.id.toString();
-	        // only add the feature if it does not already exist on the map
-	        if (!this._pointLayerIds[featureId]) {
-	          var pointjson = this.getPointJson(geojson, centroid);
-
-	          this._pointLayer.addData(pointjson);
-	          this._pointLayerIds[featureId] = true;
-	        }
-
-	        this._pointLayer.bringToFront();
-	      }
-	    }
-	    return fLayer;
-	  };
-
-	  this.getPolygonCentroid = function (coordinates) {
-	    var pts = coordinates[0][0];
-	    if (pts.length === 2) {
-	      pts = coordinates[0];
-	    }
-
-	    var twicearea = 0;
-	    var x = 0;
-	    var y = 0;
-	    var nPts = pts.length;
-	    var p1;
-	    var p2;
-	    var f;
-
-	    for (var i = 0, j = nPts - 1; i < nPts; j = i++) {
-	      p1 = pts[i]; p2 = pts[j];
-	      twicearea += p1[0] * p2[1];
-	      twicearea -= p1[1] * p2[0];
-	      f = p1[0] * p2[1] - p2[0] * p1[1];
-	      x += (p1[0] + p2[0]) * f;
-	      y += (p1[1] + p2[1]) * f;
-	    }
-	    f = twicearea * 3;
-	    return [x / f, y / f];
-	  };
-
-	  this.getPointJson = function (geojson, centroid) {
-	    return {
-	      type: 'Feature',
-	      properties: geojson.properties,
-	      id: geojson.id,
-	      geometry: {
-	        type: 'Point',
-	        coordinates: [centroid[0], centroid[1]]
-	      }
-	    };
-	  };
-
-	  this._checkForProportionalSymbols = function (geometryType, renderer) {
-	    this._hasProportionalSymbols = false;
-	    if (geometryType === 'esriGeometryPolygon') {
-	      if (renderer.backgroundFillSymbol) {
-	        this._hasProportionalSymbols = true;
-	      }
-	      // check to see if the first symbol in the classbreaks is a marker symbol
-	      if (renderer.classBreakInfos && renderer.classBreakInfos.length) {
-	        var sym = renderer.classBreakInfos[0].symbol;
-	        if (sym && (sym.type === 'esriSMS' || sym.type === 'esriPMS')) {
-	          this._hasProportionalSymbols = true;
-	        }
-	      }
-	    }
-	  };
-
-	  this._setRenderers = function (geojson) {
-	    var rend;
-	    var rendererInfo = geojson.drawingInfo.renderer;
-
-	    var options = {
-	      url: this.options.url
-	    };
-
-	    if (this.options.token) {
-	      options.token = this.options.token;
-	    }
-	    if (this.options.pane) {
-	      options.pane = this.options.pane;
-	    }
-	    if (geojson.drawingInfo.transparency) {
-	      options.layerTransparency = geojson.drawingInfo.transparency;
-	    }
-	    if (this.options.style) {
-	      options.userDefinedStyle = this.options.style;
-	    }
-
-	    switch (rendererInfo.type) {
-	      case 'classBreaks':
-	        this._checkForProportionalSymbols(geojson.geometryType, rendererInfo);
-	        if (this._hasProportionalSymbols) {
-	          this._createPointLayer();
-	          var pRend = classBreaksRenderer(rendererInfo, options);
-	          pRend.attachStylesToLayer(this._pointLayer);
-	          options.proportionalPolygon = true;
-	        }
-	        rend = classBreaksRenderer(rendererInfo, options);
-	        break;
-	      case 'uniqueValue':
-	        rend = uniqueValueRenderer(rendererInfo, options);
-	        break;
-	      default:
-	        rend = simpleRenderer(rendererInfo, options);
-	    }
-	    rend.attachStylesToLayer(this);
-	  };
-	});
-
-	exports.VERSION = version;
-	exports.Renderer = Renderer;
-	exports.SimpleRenderer = SimpleRenderer;
-	exports.simpleRenderer = simpleRenderer;
-	exports.ClassBreaksRenderer = ClassBreaksRenderer;
-	exports.classBreaksRenderer = classBreaksRenderer;
-	exports.UniqueValueRenderer = UniqueValueRenderer;
-	exports.uniqueValueRenderer = uniqueValueRenderer;
-	exports.Symbol = Symbol;
-	exports.PointSymbol = PointSymbol;
-	exports.pointSymbol = pointSymbol;
-	exports.LineSymbol = LineSymbol;
-	exports.lineSymbol = lineSymbol;
-	exports.PolygonSymbol = PolygonSymbol;
-	exports.polygonSymbol = polygonSymbol;
-
-}));
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LXJlbmRlcmVycy1kZWJ1Zy5qcyIsInNvdXJjZXMiOlsiLi4vcGFja2FnZS5qc29uIiwiLi4vc3JjL1N5bWJvbHMvU3ltYm9sLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xlYWZsZXQtc2hhcGUtbWFya2Vycy9zcmMvU2hhcGVNYXJrZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbGVhZmxldC1zaGFwZS1tYXJrZXJzL3NyYy9Dcm9zc01hcmtlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9sZWFmbGV0LXNoYXBlLW1hcmtlcnMvc3JjL1hNYXJrZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbGVhZmxldC1zaGFwZS1tYXJrZXJzL3NyYy9TcXVhcmVNYXJrZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbGVhZmxldC1zaGFwZS1tYXJrZXJzL3NyYy9EaWFtb25kTWFya2VyLmpzIiwiLi4vc3JjL1N5bWJvbHMvUG9pbnRTeW1ib2wuanMiLCIuLi9zcmMvU3ltYm9scy9MaW5lU3ltYm9sLmpzIiwiLi4vc3JjL1N5bWJvbHMvUG9seWdvblN5bWJvbC5qcyIsIi4uL3NyYy9SZW5kZXJlcnMvUmVuZGVyZXIuanMiLCIuLi9zcmMvUmVuZGVyZXJzL1NpbXBsZVJlbmRlcmVyLmpzIiwiLi4vc3JjL1JlbmRlcmVycy9DbGFzc0JyZWFrc1JlbmRlcmVyLmpzIiwiLi4vc3JjL1JlbmRlcmVycy9VbmlxdWVWYWx1ZVJlbmRlcmVyLmpzIiwiLi4vc3JjL0ZlYXR1cmVMYXllckhvb2suanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXQtcmVuZGVyZXJzXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJlc3JpLWxlYWZsZXQgcGx1Z2luIGZvciByZW5kZXJpbmdcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMi4wLjJcIixcbiAgXCJhdXRob3JcIjogXCJSYWNoZWwgTmVobWVyIDxybmVobWVyQGVzcmkuY29tPlwiLFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VzcmkvZXNyaS1sZWFmbGV0LXJlbmRlcmVycy9pc3N1ZXNcIlxuICB9LFxuICBcImNvbnRyaWJ1dG9yc1wiOiBbXG4gICAgXCJSYWNoZWwgTmVobWVyIDxybmVobWVyQGVzcmkuY29tPlwiLFxuICAgIFwiSm9obiBHcmF2b2lzIDxqZ3Jhdm9pc0Blc3JpLmNvbT5cIlxuICBdLFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4wLWJldGEuOFwiLFxuICAgICBcImxlYWZsZXRcIjogXCJeMS4wLjAtYmV0YS4yXCIsXG4gICAgIFwibGVhZmxldC1zaGFwZS1tYXJrZXJzXCI6IFwiXjEuMC40XCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYmFiZWxpZnlcIjogXCJeNi4xLjNcIixcbiAgICBcImNoYWlcIjogXCIyLjMuMFwiLFxuICAgIFwiZ2gtcmVsZWFzZVwiOiBcIl4yLjAuMFwiLFxuICAgIFwiaHR0cC1zZXJ2ZXJcIjogXCJeMC44LjVcIixcbiAgICBcImlzcGFydGFcIjogXCJeMy4wLjNcIixcbiAgICBcImlzdGFuYnVsXCI6IFwiXjAuNC4yXCIsXG4gICAgXCJrYXJtYVwiOiBcIl4wLjEyLjI0XCIsXG4gICAgXCJrYXJtYS1jaGFpLXNpbm9uXCI6IFwiXjAuMS4zXCIsXG4gICAgXCJrYXJtYS1jb3ZlcmFnZVwiOiBcIl4wLjUuM1wiLFxuICAgIFwia2FybWEtbW9jaGFcIjogXCJeMC4xLjBcIixcbiAgICBcImthcm1hLW1vY2hhLXJlcG9ydGVyXCI6IFwiXjAuMi41XCIsXG4gICAgXCJrYXJtYS1waGFudG9tanMtbGF1bmNoZXJcIjogXCJeMC4xLjRcIixcbiAgICBcImthcm1hLXNvdXJjZW1hcC1sb2FkZXJcIjogXCJeMC4zLjVcIixcbiAgICBcIm1rZGlycFwiOiBcIl4wLjUuMVwiLFxuICAgIFwibW9jaGFcIjogXCJeMi4zLjRcIixcbiAgICBcInBoYW50b21qc1wiOiBcIl4xLjkuMTdcIixcbiAgICBcInJvbGx1cFwiOiBcIl4wLjI1LjRcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tanNvblwiOiBcIl4yLjAuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1ub2RlLXJlc29sdmVcIjogXCJeMS40LjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tdWdsaWZ5XCI6IFwiXjAuMi4wXCIsXG4gICAgXCJzZW1pc3RhbmRhcmRcIjogXCJeNy4wLjVcIixcbiAgICBcInNpbm9uXCI6IFwiXjEuMTEuMVwiLFxuICAgIFwic2lub24tY2hhaVwiOiBcIjIuNy4wXCIsXG4gICAgXCJ1Z2xpZnktanNcIjogXCJeMi40LjIzXCIsXG4gICAgXCJ3YXRjaFwiOiBcIl4wLjE3LjFcIlxuICB9LFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cDovL2VzcmkuZ2l0aHViLmlvL2VzcmktbGVhZmxldFwiLFxuICBcImpzbmV4dDptYWluXCI6IFwic3JjL0VzcmlMZWFmbGV0UmVuZGVyZXJzLmpzXCIsXG4gIFwianNwbVwiOiB7XG4gICAgXCJyZWdpc3RyeVwiOiBcIm5wbVwiLFxuICAgIFwiZm9ybWF0XCI6IFwiZXM2XCIsXG4gICAgXCJtYWluXCI6IFwic3JjL0VzcmlMZWFmbGV0UmVuZGVyZXJzLmpzXCJcbiAgfSxcbiAgXCJrZXl3b3Jkc1wiOiBbXG4gICAgXCJhcmNnaXNcIixcbiAgICBcImVzcmlcIixcbiAgICBcImVzcmkgbGVhZmxldFwiLFxuICAgIFwiZ2lzXCIsXG4gICAgXCJsZWFmbGV0IHBsdWdpblwiLFxuICAgIFwibWFwcGluZ1wiLFxuICAgIFwicmVuZGVyZXJzXCIsXG4gICAgXCJzeW1ib2xvZ3lcIlxuICBdLFxuICBcImxpY2Vuc2VcIjogXCJBcGFjaGUtMi4wXCIsXG4gIFwibWFpblwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LXJlbmRlcmVycy1kZWJ1Zy5qc1wiLFxuICBcImJyb3dzZXJcIjogXCJkaXN0L2VzcmktbGVhZmxldC1yZW5kZXJlcnMtZGVidWcuanNcIixcbiAgXCJyZWFkbWVGaWxlbmFtZVwiOiBcIlJFQURNRS5tZFwiLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0QGdpdGh1Yi5jb206RXNyaS9lc3JpLWxlYWZsZXQtcmVuZGVyZXJzLmdpdFwiXG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG5cbiAgICBcInByZWJ1aWxkXCI6IFwibWtkaXJwIGRpc3RcIixcbiAgICBcImJ1aWxkXCI6IFwicm9sbHVwIC1jIHByb2ZpbGVzL2RlYnVnLmpzICYgcm9sbHVwIC1jIHByb2ZpbGVzL3Byb2R1Y3Rpb24uanNcIixcbiAgICBcImxpbnRcIjogXCJzZW1pc3RhbmRhcmQgc3JjLyoqLyouanNcIixcbiAgICBcInByZXB1Ymxpc2hcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJwcmV0ZXN0XCI6IFwibnBtIHJ1biBidWlsZFwiLFxuICAgIFwicmVsZWFzZVwiOiBcIi4vc2NyaXB0cy9yZWxlYXNlLnNoXCIsXG4gICAgXCJzdGFydFwiOiBcIndhdGNoICducG0gcnVuIGJ1aWxkJyBzcmMgJiBodHRwLXNlcnZlciAtcCA1MDAwIC1jLTEgLW9cIixcbiAgICBcInRlc3RcIjogXCJucG0gcnVuIGxpbnQgJiYgbnBtIHJ1biBidWlsZCAmJiBrYXJtYSBzdGFydFwiXG4gIH1cbn1cbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuXG5leHBvcnQgdmFyIFN5bWJvbCA9IEwuQ2xhc3MuZXh0ZW5kKHtcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKHN5bWJvbEpzb24sIG9wdGlvbnMpIHtcbiAgICB0aGlzLl9zeW1ib2xKc29uID0gc3ltYm9sSnNvbjtcbiAgICB0aGlzLnZhbCA9IG51bGw7XG4gICAgdGhpcy5fc3R5bGVzID0ge307XG4gICAgdGhpcy5faXNEZWZhdWx0ID0gZmFsc2U7XG4gICAgdGhpcy5fbGF5ZXJUcmFuc3BhcmVuY3kgPSAxO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubGF5ZXJUcmFuc3BhcmVuY3kpIHtcbiAgICAgIHRoaXMuX2xheWVyVHJhbnNwYXJlbmN5ID0gMSAtIChvcHRpb25zLmxheWVyVHJhbnNwYXJlbmN5IC8gMTAwLjApO1xuICAgIH1cbiAgfSxcblxuICAvLyB0aGUgZ2VvanNvbiB2YWx1ZXMgcmV0dXJuZWQgYXJlIGluIHBvaW50c1xuICBwaXhlbFZhbHVlOiBmdW5jdGlvbiAocG9pbnRWYWx1ZSkge1xuICAgIHJldHVybiBwb2ludFZhbHVlICogMS4zMzM7XG4gIH0sXG5cbiAgLy8gY29sb3IgaXMgYW4gYXJyYXkgW3IsZyxiLGFdXG4gIGNvbG9yVmFsdWU6IGZ1bmN0aW9uIChjb2xvcikge1xuICAgIHJldHVybiAncmdiKCcgKyBjb2xvclswXSArICcsJyArIGNvbG9yWzFdICsgJywnICsgY29sb3JbMl0gKyAnKSc7XG4gIH0sXG5cbiAgYWxwaGFWYWx1ZTogZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgdmFyIGFscGhhID0gY29sb3JbM10gLyAyNTUuMDtcbiAgICByZXR1cm4gYWxwaGEgKiB0aGlzLl9sYXllclRyYW5zcGFyZW5jeTtcbiAgfSxcblxuICBnZXRTaXplOiBmdW5jdGlvbiAoZmVhdHVyZSwgc2l6ZUluZm8pIHtcbiAgICB2YXIgYXR0ciA9IGZlYXR1cmUucHJvcGVydGllcztcbiAgICB2YXIgZmllbGQgPSBzaXplSW5mby5maWVsZDtcbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgdmFyIGZlYXR1cmVWYWx1ZSA9IG51bGw7XG5cbiAgICBpZiAoZmllbGQpIHtcbiAgICAgIGZlYXR1cmVWYWx1ZSA9IGF0dHJbZmllbGRdO1xuICAgICAgdmFyIG1pblNpemUgPSBzaXplSW5mby5taW5TaXplO1xuICAgICAgdmFyIG1heFNpemUgPSBzaXplSW5mby5tYXhTaXplO1xuICAgICAgdmFyIG1pbkRhdGFWYWx1ZSA9IHNpemVJbmZvLm1pbkRhdGFWYWx1ZTtcbiAgICAgIHZhciBtYXhEYXRhVmFsdWUgPSBzaXplSW5mby5tYXhEYXRhVmFsdWU7XG4gICAgICB2YXIgZmVhdHVyZVJhdGlvO1xuICAgICAgdmFyIG5vcm1GaWVsZCA9IHNpemVJbmZvLm5vcm1hbGl6YXRpb25GaWVsZDtcbiAgICAgIHZhciBub3JtVmFsdWUgPSBhdHRyID8gcGFyc2VGbG9hdChhdHRyW25vcm1GaWVsZF0pIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoZmVhdHVyZVZhbHVlID09PSBudWxsIHx8IChub3JtRmllbGQgJiYgKChpc05hTihub3JtVmFsdWUpIHx8IG5vcm1WYWx1ZSA9PT0gMCkpKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihub3JtVmFsdWUpKSB7XG4gICAgICAgIGZlYXR1cmVWYWx1ZSAvPSBub3JtVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChtaW5TaXplICE9PSBudWxsICYmIG1heFNpemUgIT09IG51bGwgJiYgbWluRGF0YVZhbHVlICE9PSBudWxsICYmIG1heERhdGFWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoZmVhdHVyZVZhbHVlIDw9IG1pbkRhdGFWYWx1ZSkge1xuICAgICAgICAgIHNpemUgPSBtaW5TaXplO1xuICAgICAgICB9IGVsc2UgaWYgKGZlYXR1cmVWYWx1ZSA+PSBtYXhEYXRhVmFsdWUpIHtcbiAgICAgICAgICBzaXplID0gbWF4U2l6ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmZWF0dXJlUmF0aW8gPSAoZmVhdHVyZVZhbHVlIC0gbWluRGF0YVZhbHVlKSAvIChtYXhEYXRhVmFsdWUgLSBtaW5EYXRhVmFsdWUpO1xuICAgICAgICAgIHNpemUgPSBtaW5TaXplICsgKGZlYXR1cmVSYXRpbyAqIChtYXhTaXplIC0gbWluU2l6ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzaXplID0gaXNOYU4oc2l6ZSkgPyAwIDogc2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIHNpemU7XG4gIH0sXG5cbiAgZ2V0Q29sb3I6IGZ1bmN0aW9uIChmZWF0dXJlLCBjb2xvckluZm8pIHtcbiAgICAvLyByZXF1aXJlZCBpbmZvcm1hdGlvbiB0byBnZXQgY29sb3JcbiAgICBpZiAoIShmZWF0dXJlLnByb3BlcnRpZXMgJiYgY29sb3JJbmZvICYmIGNvbG9ySW5mby5maWVsZCAmJiBjb2xvckluZm8uc3RvcHMpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgYXR0ciA9IGZlYXR1cmUucHJvcGVydGllcztcbiAgICB2YXIgZmVhdHVyZVZhbHVlID0gYXR0cltjb2xvckluZm8uZmllbGRdO1xuICAgIHZhciBsb3dlckJvdW5kQ29sb3IsIHVwcGVyQm91bmRDb2xvciwgbG93ZXJCb3VuZCwgdXBwZXJCb3VuZDtcbiAgICB2YXIgbm9ybUZpZWxkID0gY29sb3JJbmZvLm5vcm1hbGl6YXRpb25GaWVsZDtcbiAgICB2YXIgbm9ybVZhbHVlID0gYXR0ciA/IHBhcnNlRmxvYXQoYXR0cltub3JtRmllbGRdKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoZmVhdHVyZVZhbHVlID09PSBudWxsIHx8IChub3JtRmllbGQgJiYgKChpc05hTihub3JtVmFsdWUpIHx8IG5vcm1WYWx1ZSA9PT0gMCkpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTihub3JtVmFsdWUpKSB7XG4gICAgICBmZWF0dXJlVmFsdWUgLz0gbm9ybVZhbHVlO1xuICAgIH1cblxuICAgIGlmIChmZWF0dXJlVmFsdWUgPD0gY29sb3JJbmZvLnN0b3BzWzBdLnZhbHVlKSB7XG4gICAgICByZXR1cm4gY29sb3JJbmZvLnN0b3BzWzBdLmNvbG9yO1xuICAgIH1cbiAgICB2YXIgbGFzdFN0b3AgPSBjb2xvckluZm8uc3RvcHNbY29sb3JJbmZvLnN0b3BzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChmZWF0dXJlVmFsdWUgPj0gbGFzdFN0b3AudmFsdWUpIHtcbiAgICAgIHJldHVybiBsYXN0U3RvcC5jb2xvcjtcbiAgICB9XG5cbiAgICAvLyBnbyB0aHJvdWdoIHRoZSBzdG9wcyB0byBmaW5kIG1pbiBhbmQgbWF4XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xvckluZm8uc3RvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdG9wSW5mbyA9IGNvbG9ySW5mby5zdG9wc1tpXTtcblxuICAgICAgaWYgKHN0b3BJbmZvLnZhbHVlIDw9IGZlYXR1cmVWYWx1ZSkge1xuICAgICAgICBsb3dlckJvdW5kQ29sb3IgPSBzdG9wSW5mby5jb2xvcjtcbiAgICAgICAgbG93ZXJCb3VuZCA9IHN0b3BJbmZvLnZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChzdG9wSW5mby52YWx1ZSA+IGZlYXR1cmVWYWx1ZSkge1xuICAgICAgICB1cHBlckJvdW5kQ29sb3IgPSBzdG9wSW5mby5jb2xvcjtcbiAgICAgICAgdXBwZXJCb3VuZCA9IHN0b3BJbmZvLnZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmZWF0dXJlIGZhbGxzIGJldHdlZW4gdHdvIHN0b3BzLCBpbnRlcnBsYXRlIHRoZSBjb2xvcnNcbiAgICBpZiAoIWlzTmFOKGxvd2VyQm91bmQpICYmICFpc05hTih1cHBlckJvdW5kKSkge1xuICAgICAgdmFyIHJhbmdlID0gdXBwZXJCb3VuZCAtIGxvd2VyQm91bmQ7XG4gICAgICBpZiAocmFuZ2UgPiAwKSB7XG4gICAgICAgIC8vIG1vcmUgd2VpZ2h0IHRoZSBmdXJ0aGVyIGl0IGlzIGZyb20gdGhlIGxvd2VyIGJvdW5kXG4gICAgICAgIHZhciB1cHBlckJvdW5kQ29sb3JXZWlnaHQgPSAoZmVhdHVyZVZhbHVlIC0gbG93ZXJCb3VuZCkgLyByYW5nZTtcbiAgICAgICAgaWYgKHVwcGVyQm91bmRDb2xvcldlaWdodCkge1xuICAgICAgICAgIC8vIG1vcmUgd2VpZ2h0IHRoZSBmdXJ0aGVyIGl0IGlzIGZyb20gdGhlIHVwcGVyIGJvdW5kXG4gICAgICAgICAgdmFyIGxvd2VyQm91bmRDb2xvcldlaWdodCA9ICh1cHBlckJvdW5kIC0gZmVhdHVyZVZhbHVlKSAvIHJhbmdlO1xuICAgICAgICAgIGlmIChsb3dlckJvdW5kQ29sb3JXZWlnaHQpIHtcbiAgICAgICAgICAgIC8vIGludGVycG9sYXRlIHRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmQgY29sb3IgYnkgYXBwbHlpbmcgdGhlXG4gICAgICAgICAgICAvLyB3ZWlnaHRzIHRvIGVhY2ggb2YgdGhlIHJnYmEgY29sb3JzIGFuZCBhZGRpbmcgdGhlbSB0b2dldGhlclxuICAgICAgICAgICAgdmFyIGludGVycG9sYXRlZENvbG9yID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICBpbnRlcnBvbGF0ZWRDb2xvcltqXSA9IE1hdGgucm91bmQobG93ZXJCb3VuZENvbG9yW2pdICogbG93ZXJCb3VuZENvbG9yV2VpZ2h0ICsgdXBwZXJCb3VuZENvbG9yW2pdICogdXBwZXJCb3VuZENvbG9yV2VpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZWRDb2xvcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGZlYXR1cmVWYWx1ZSBhbmQgdXBwZXJCb3VuZCwgMTAwJSBvZiB1cHBlckJvdW5kQ29sb3JcbiAgICAgICAgICAgIHJldHVybiB1cHBlckJvdW5kQ29sb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBmZWF0dXJlVmFsdWUgYW5kIGxvd2VyQm91bmQsIDEwMCUgb2YgbG93ZXJCb3VuZENvbG9yXG4gICAgICAgICAgcmV0dXJuIGxvd2VyQm91bmRDb2xvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBpZiB3ZSBnZXQgdG8gaGVyZSwgbm9uZSBvZiB0aGUgY2FzZXMgYXBwbHkgc28gcmV0dXJuIG51bGxcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufSk7XG5cbi8vIGV4cG9ydCBmdW5jdGlvbiBzeW1ib2wgKHN5bWJvbEpzb24pIHtcbi8vICAgcmV0dXJuIG5ldyBTeW1ib2woc3ltYm9sSnNvbik7XG4vLyB9XG5cbmV4cG9ydCBkZWZhdWx0IFN5bWJvbDtcbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuXG5leHBvcnQgdmFyIFNoYXBlTWFya2VyID0gTC5QYXRoLmV4dGVuZCh7XG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLl9zaXplID0gc2l6ZTtcbiAgICB0aGlzLl9sYXRsbmcgPSBMLmxhdExuZyhsYXRsbmcpO1xuICAgIHRoaXMuX3N2Z0NhbnZhc0luY2x1ZGVzKCk7XG4gIH0sXG5cbiAgX3N2Z0NhbnZhc0luY2x1ZGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gaW1wbGVtZW50IGluIHN1YiBjbGFzc1xuICB9LFxuXG4gIF9wcm9qZWN0OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fcG9pbnQgPSB0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyk7XG4gIH0sXG5cbiAgX3VwZGF0ZTogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVBhdGgoKTtcbiAgICB9XG4gIH0sXG5cbiAgX3VwZGF0ZVBhdGg6IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBpbXBsZW1lbnQgaW4gc3ViIGNsYXNzXG4gIH0sXG5cbiAgc2V0TGF0TG5nOiBmdW5jdGlvbiAobGF0bG5nKSB7XG4gICAgdGhpcy5fbGF0bG5nID0gTC5sYXRMbmcobGF0bG5nKTtcbiAgICB0aGlzLnJlZHJhdygpO1xuICAgIHJldHVybiB0aGlzLmZpcmUoJ21vdmUnLCB7bGF0bG5nOiB0aGlzLl9sYXRsbmd9KTtcbiAgfSxcblxuICBnZXRMYXRMbmc6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF0bG5nO1xuICB9LFxuXG4gIHNldFNpemU6IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgdGhpcy5fc2l6ZSA9IHNpemU7XG4gICAgcmV0dXJuIHRoaXMucmVkcmF3KCk7XG4gIH0sXG5cbiAgZ2V0U2l6ZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG59KTtcbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgU2hhcGVNYXJrZXIgfSBmcm9tICcuL1NoYXBlTWFya2VyJztcblxuZXhwb3J0IHZhciBDcm9zc01hcmtlciA9IFNoYXBlTWFya2VyLmV4dGVuZCh7XG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIFNoYXBlTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbGF0bG5nLCBzaXplLCBvcHRpb25zKTtcbiAgfSxcblxuICBfdXBkYXRlUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbmRlcmVyLl91cGRhdGVDcm9zc01hcmtlcih0aGlzKTtcbiAgfSxcblxuICBfc3ZnQ2FudmFzSW5jbHVkZXM6IGZ1bmN0aW9uICgpIHtcbiAgICBMLkNhbnZhcy5pbmNsdWRlKHtcbiAgICAgIF91cGRhdGVDcm9zc01hcmtlcjogZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICAgIHZhciBsYXRsbmcgPSBsYXllci5fcG9pbnQ7XG4gICAgICAgIHZhciBvZmZzZXQgPSBsYXllci5fc2l6ZSAvIDIuMDtcbiAgICAgICAgdmFyIGN0eCA9IHRoaXMuX2N0eDtcblxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5tb3ZlVG8obGF0bG5nLngsIGxhdGxuZy55ICsgb2Zmc2V0KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCwgbGF0bG5nLnkgLSBvZmZzZXQpO1xuICAgICAgICB0aGlzLl9maWxsU3Ryb2tlKGN0eCwgbGF5ZXIpO1xuXG4gICAgICAgIGN0eC5tb3ZlVG8obGF0bG5nLnggLSBvZmZzZXQsIGxhdGxuZy55KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCArIG9mZnNldCwgbGF0bG5nLnkpO1xuICAgICAgICB0aGlzLl9maWxsU3Ryb2tlKGN0eCwgbGF5ZXIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgTC5TVkcuaW5jbHVkZSh7XG4gICAgICBfdXBkYXRlQ3Jvc3NNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG5cbiAgICAgICAgaWYgKEwuQnJvd3Nlci52bWwpIHtcbiAgICAgICAgICBsYXRsbmcuX3JvdW5kKCk7XG4gICAgICAgICAgb2Zmc2V0ID0gTWF0aC5yb3VuZChvZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0ciA9ICdNJyArIGxhdGxuZy54ICsgJywnICsgKGxhdGxuZy55ICsgb2Zmc2V0KSArXG4gICAgICAgICAgJ0wnICsgbGF0bG5nLnggKyAnLCcgKyAobGF0bG5nLnkgLSBvZmZzZXQpICtcbiAgICAgICAgICAnTScgKyAobGF0bG5nLnggLSBvZmZzZXQpICsgJywnICsgbGF0bG5nLnkgK1xuICAgICAgICAgICdMJyArIChsYXRsbmcueCArIG9mZnNldCkgKyAnLCcgKyBsYXRsbmcueTtcblxuICAgICAgICB0aGlzLl9zZXRQYXRoKGxheWVyLCBzdHIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59KTtcblxuZXhwb3J0IHZhciBjcm9zc01hcmtlciA9IGZ1bmN0aW9uIChsYXRsbmcsIHNpemUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBDcm9zc01hcmtlcihsYXRsbmcsIHNpemUsIG9wdGlvbnMpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY3Jvc3NNYXJrZXI7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFNoYXBlTWFya2VyIH0gZnJvbSAnLi9TaGFwZU1hcmtlcic7XG5cbmV4cG9ydCB2YXIgWE1hcmtlciA9IFNoYXBlTWFya2VyLmV4dGVuZCh7XG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIFNoYXBlTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbGF0bG5nLCBzaXplLCBvcHRpb25zKTtcbiAgfSxcblxuICBfdXBkYXRlUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbmRlcmVyLl91cGRhdGVYTWFya2VyKHRoaXMpO1xuICB9LFxuXG4gIF9zdmdDYW52YXNJbmNsdWRlczogZnVuY3Rpb24gKCkge1xuICAgIEwuQ2FudmFzLmluY2x1ZGUoe1xuICAgICAgX3VwZGF0ZVhNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG4gICAgICAgIHZhciBjdHggPSB0aGlzLl9jdHg7XG5cbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuXG4gICAgICAgIGN0eC5tb3ZlVG8obGF0bG5nLnggKyBvZmZzZXQsIGxhdGxuZy55ICsgb2Zmc2V0KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCAtIG9mZnNldCwgbGF0bG5nLnkgLSBvZmZzZXQpO1xuICAgICAgICB0aGlzLl9maWxsU3Ryb2tlKGN0eCwgbGF5ZXIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgTC5TVkcuaW5jbHVkZSh7XG4gICAgICBfdXBkYXRlWE1hcmtlcjogZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICAgIHZhciBsYXRsbmcgPSBsYXllci5fcG9pbnQ7XG4gICAgICAgIHZhciBvZmZzZXQgPSBsYXllci5fc2l6ZSAvIDIuMDtcblxuICAgICAgICBpZiAoTC5Ccm93c2VyLnZtbCkge1xuICAgICAgICAgIGxhdGxuZy5fcm91bmQoKTtcbiAgICAgICAgICBvZmZzZXQgPSBNYXRoLnJvdW5kKG9mZnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RyID0gJ00nICsgKGxhdGxuZy54ICsgb2Zmc2V0KSArICcsJyArIChsYXRsbmcueSArIG9mZnNldCkgK1xuICAgICAgICAgICdMJyArIChsYXRsbmcueCAtIG9mZnNldCkgKyAnLCcgKyAobGF0bG5nLnkgLSBvZmZzZXQpICtcbiAgICAgICAgICAnTScgKyAobGF0bG5nLnggLSBvZmZzZXQpICsgJywnICsgKGxhdGxuZy55ICsgb2Zmc2V0KSArXG4gICAgICAgICAgJ0wnICsgKGxhdGxuZy54ICsgb2Zmc2V0KSArICcsJyArIChsYXRsbmcueSAtIG9mZnNldCk7XG5cbiAgICAgICAgdGhpcy5fc2V0UGF0aChsYXllciwgc3RyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG5cbmV4cG9ydCB2YXIgeE1hcmtlciA9IGZ1bmN0aW9uIChsYXRsbmcsIHNpemUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBYTWFya2VyKGxhdGxuZywgc2l6ZSwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCB4TWFya2VyO1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBTaGFwZU1hcmtlciB9IGZyb20gJy4vU2hhcGVNYXJrZXInO1xuXG5leHBvcnQgdmFyIFNxdWFyZU1hcmtlciA9IFNoYXBlTWFya2VyLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBmaWxsOiB0cnVlXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIFNoYXBlTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbGF0bG5nLCBzaXplLCBvcHRpb25zKTtcbiAgfSxcblxuICBfdXBkYXRlUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbmRlcmVyLl91cGRhdGVTcXVhcmVNYXJrZXIodGhpcyk7XG4gIH0sXG5cbiAgX3N2Z0NhbnZhc0luY2x1ZGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgTC5DYW52YXMuaW5jbHVkZSh7XG4gICAgICBfdXBkYXRlU3F1YXJlTWFya2VyOiBmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgICAgdmFyIGxhdGxuZyA9IGxheWVyLl9wb2ludDtcbiAgICAgICAgdmFyIG9mZnNldCA9IGxheWVyLl9zaXplIC8gMi4wO1xuICAgICAgICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuXG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcblxuICAgICAgICBjdHgubW92ZVRvKGxhdGxuZy54ICsgb2Zmc2V0LCBsYXRsbmcueSArIG9mZnNldCk7XG4gICAgICAgIGN0eC5saW5lVG8obGF0bG5nLnggLSBvZmZzZXQsIGxhdGxuZy55ICsgb2Zmc2V0KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCAtIG9mZnNldCwgbGF0bG5nLnkgLSBvZmZzZXQpO1xuICAgICAgICBjdHgubGluZVRvKGxhdGxuZy54ICsgb2Zmc2V0LCBsYXRsbmcueSAtIG9mZnNldCk7XG5cbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuXG4gICAgICAgIHRoaXMuX2ZpbGxTdHJva2UoY3R4LCBsYXllcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBMLlNWRy5pbmNsdWRlKHtcbiAgICAgIF91cGRhdGVTcXVhcmVNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG5cbiAgICAgICAgaWYgKEwuQnJvd3Nlci52bWwpIHtcbiAgICAgICAgICBsYXRsbmcuX3JvdW5kKCk7XG4gICAgICAgICAgb2Zmc2V0ID0gTWF0aC5yb3VuZChvZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0ciA9ICdNJyArIChsYXRsbmcueCArIG9mZnNldCkgKyAnLCcgKyAobGF0bG5nLnkgKyBvZmZzZXQpICtcbiAgICAgICAgICAnTCcgKyAobGF0bG5nLnggLSBvZmZzZXQpICsgJywnICsgKGxhdGxuZy55ICsgb2Zmc2V0KSArXG4gICAgICAgICAgJ0wnICsgKGxhdGxuZy54IC0gb2Zmc2V0KSArICcsJyArIChsYXRsbmcueSAtIG9mZnNldCkgK1xuICAgICAgICAgICdMJyArIChsYXRsbmcueCArIG9mZnNldCkgKyAnLCcgKyAobGF0bG5nLnkgLSBvZmZzZXQpO1xuXG4gICAgICAgIHN0ciA9IHN0ciArIChMLkJyb3dzZXIuc3ZnID8gJ3onIDogJ3gnKTtcblxuICAgICAgICB0aGlzLl9zZXRQYXRoKGxheWVyLCBzdHIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59KTtcblxuZXhwb3J0IHZhciBzcXVhcmVNYXJrZXIgPSBmdW5jdGlvbiAobGF0bG5nLCBzaXplLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgU3F1YXJlTWFya2VyKGxhdGxuZywgc2l6ZSwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBzcXVhcmVNYXJrZXI7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFNoYXBlTWFya2VyIH0gZnJvbSAnLi9TaGFwZU1hcmtlcic7XG5cbmV4cG9ydCB2YXIgRGlhbW9uZE1hcmtlciA9IFNoYXBlTWFya2VyLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBmaWxsOiB0cnVlXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIFNoYXBlTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbGF0bG5nLCBzaXplLCBvcHRpb25zKTtcbiAgfSxcblxuICBfdXBkYXRlUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbmRlcmVyLl91cGRhdGVEaWFtb25kTWFya2VyKHRoaXMpO1xuICB9LFxuXG4gIF9zdmdDYW52YXNJbmNsdWRlczogZnVuY3Rpb24gKCkge1xuICAgIEwuQ2FudmFzLmluY2x1ZGUoe1xuICAgICAgX3VwZGF0ZURpYW1vbmRNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG4gICAgICAgIHZhciBjdHggPSB0aGlzLl9jdHg7XG5cbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuXG4gICAgICAgIGN0eC5tb3ZlVG8obGF0bG5nLngsIGxhdGxuZy55ICsgb2Zmc2V0KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCAtIG9mZnNldCwgbGF0bG5nLnkpO1xuICAgICAgICBjdHgubGluZVRvKGxhdGxuZy54LCBsYXRsbmcueSAtIG9mZnNldCk7XG4gICAgICAgIGN0eC5saW5lVG8obGF0bG5nLnggKyBvZmZzZXQsIGxhdGxuZy55KTtcblxuICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG5cbiAgICAgICAgdGhpcy5fZmlsbFN0cm9rZShjdHgsIGxheWVyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIEwuU1ZHLmluY2x1ZGUoe1xuICAgICAgX3VwZGF0ZURpYW1vbmRNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG5cbiAgICAgICAgaWYgKEwuQnJvd3Nlci52bWwpIHtcbiAgICAgICAgICBsYXRsbmcuX3JvdW5kKCk7XG4gICAgICAgICAgb2Zmc2V0ID0gTWF0aC5yb3VuZChvZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0ciA9ICdNJyArIGxhdGxuZy54ICsgJywnICsgKGxhdGxuZy55ICsgb2Zmc2V0KSArXG4gICAgICAgICAgJ0wnICsgKGxhdGxuZy54IC0gb2Zmc2V0KSArICcsJyArIGxhdGxuZy55ICtcbiAgICAgICAgICAnTCcgKyBsYXRsbmcueCArICcsJyArIChsYXRsbmcueSAtIG9mZnNldCkgK1xuICAgICAgICAgICdMJyArIChsYXRsbmcueCArIG9mZnNldCkgKyAnLCcgKyBsYXRsbmcueTtcblxuICAgICAgICBzdHIgPSBzdHIgKyAoTC5Ccm93c2VyLnN2ZyA/ICd6JyA6ICd4Jyk7XG5cbiAgICAgICAgdGhpcy5fc2V0UGF0aChsYXllciwgc3RyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG5cbmV4cG9ydCB2YXIgZGlhbW9uZE1hcmtlciA9IGZ1bmN0aW9uIChsYXRsbmcsIHNpemUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBEaWFtb25kTWFya2VyKGxhdGxuZywgc2l6ZSwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBkaWFtb25kTWFya2VyO1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgU3ltYm9sIGZyb20gJy4vU3ltYm9sJztcbmltcG9ydCB7c3F1YXJlTWFya2VyLCB4TWFya2VyLCBjcm9zc01hcmtlciwgZGlhbW9uZE1hcmtlcn0gZnJvbSAnbGVhZmxldC1zaGFwZS1tYXJrZXJzJztcblxuZXhwb3J0IHZhciBQb2ludFN5bWJvbCA9IFN5bWJvbC5leHRlbmQoe1xuXG4gIHN0YXRpY3M6IHtcbiAgICBNQVJLRVJUWVBFUzogWydlc3JpU01TQ2lyY2xlJywgJ2VzcmlTTVNDcm9zcycsICdlc3JpU01TRGlhbW9uZCcsICdlc3JpU01TU3F1YXJlJywgJ2VzcmlTTVNYJywgJ2VzcmlQTVMnXVxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChzeW1ib2xKc29uLCBvcHRpb25zKSB7XG4gICAgU3ltYm9sLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgc3ltYm9sSnNvbiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuc2VydmljZVVybCA9IG9wdGlvbnMudXJsO1xuICAgIH1cbiAgICBpZiAoc3ltYm9sSnNvbikge1xuICAgICAgaWYgKHN5bWJvbEpzb24udHlwZSA9PT0gJ2VzcmlQTVMnKSB7XG4gICAgICAgIHZhciB1cmwgPSB0aGlzLnNlcnZpY2VVcmwgKyAnaW1hZ2VzLycgKyB0aGlzLl9zeW1ib2xKc29uLnVybDtcbiAgICAgICAgdGhpcy5faWNvblVybCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50b2tlbiA/IHVybCArICc/dG9rZW49JyArIG9wdGlvbnMudG9rZW4gOiB1cmw7XG4gICAgICAgIC8vIGxlYWZsZXQgZG9lcyBub3QgYWxsb3cgcmVzaXppbmcgaWNvbnMgc28ga2VlcCBhIGhhc2ggb2YgZGlmZmVyZW50XG4gICAgICAgIC8vIGljb24gc2l6ZXMgdG8gdHJ5IGFuZCBrZWVwIGRvd24gb24gdGhlIG51bWJlciBvZiBpY29ucyBjcmVhdGVkXG4gICAgICAgIHRoaXMuX2ljb25zID0ge307XG4gICAgICAgIC8vIGNyZWF0ZSBiYXNlIGljb25cbiAgICAgICAgdGhpcy5pY29uID0gdGhpcy5fY3JlYXRlSWNvbih0aGlzLl9zeW1ib2xKc29uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2ZpbGxTdHlsZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX2ZpbGxTdHlsZXM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fc3ltYm9sSnNvbi5vdXRsaW5lICYmIHRoaXMuX3N5bWJvbEpzb24uc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMuX3N0eWxlcy5zdHJva2UgPSB0cnVlO1xuICAgICAgdGhpcy5fc3R5bGVzLndlaWdodCA9IHRoaXMucGl4ZWxWYWx1ZSh0aGlzLl9zeW1ib2xKc29uLm91dGxpbmUud2lkdGgpO1xuICAgICAgdGhpcy5fc3R5bGVzLmNvbG9yID0gdGhpcy5jb2xvclZhbHVlKHRoaXMuX3N5bWJvbEpzb24ub3V0bGluZS5jb2xvcik7XG4gICAgICB0aGlzLl9zdHlsZXMub3BhY2l0eSA9IHRoaXMuYWxwaGFWYWx1ZSh0aGlzLl9zeW1ib2xKc29uLm91dGxpbmUuY29sb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdHlsZXMuc3Ryb2tlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zeW1ib2xKc29uLmNvbG9yKSB7XG4gICAgICB0aGlzLl9zdHlsZXMuZmlsbENvbG9yID0gdGhpcy5jb2xvclZhbHVlKHRoaXMuX3N5bWJvbEpzb24uY29sb3IpO1xuICAgICAgdGhpcy5fc3R5bGVzLmZpbGxPcGFjaXR5ID0gdGhpcy5hbHBoYVZhbHVlKHRoaXMuX3N5bWJvbEpzb24uY29sb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdHlsZXMuZmlsbE9wYWNpdHkgPSAwO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zeW1ib2xKc29uLnN0eWxlID09PSAnZXNyaVNNU0NpcmNsZScpIHtcbiAgICAgIHRoaXMuX3N0eWxlcy5yYWRpdXMgPSB0aGlzLnBpeGVsVmFsdWUodGhpcy5fc3ltYm9sSnNvbi5zaXplKSAvIDIuMDtcbiAgICB9XG4gIH0sXG5cbiAgX2NyZWF0ZUljb246IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHdpZHRoID0gdGhpcy5waXhlbFZhbHVlKG9wdGlvbnMud2lkdGgpO1xuICAgIHZhciBoZWlnaHQgPSB3aWR0aDtcbiAgICBpZiAob3B0aW9ucy5oZWlnaHQpIHtcbiAgICAgIGhlaWdodCA9IHRoaXMucGl4ZWxWYWx1ZShvcHRpb25zLmhlaWdodCk7XG4gICAgfVxuICAgIHZhciB4T2Zmc2V0ID0gd2lkdGggLyAyLjA7XG4gICAgdmFyIHlPZmZzZXQgPSBoZWlnaHQgLyAyLjA7XG5cbiAgICBpZiAob3B0aW9ucy54b2Zmc2V0KSB7XG4gICAgICB4T2Zmc2V0ICs9IHRoaXMucGl4ZWxWYWx1ZShvcHRpb25zLnhvZmZzZXQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy55b2Zmc2V0KSB7XG4gICAgICB5T2Zmc2V0ICs9IHRoaXMucGl4ZWxWYWx1ZShvcHRpb25zLnlvZmZzZXQpO1xuICAgIH1cblxuICAgIHZhciBpY29uID0gTC5pY29uKHtcbiAgICAgIGljb25Vcmw6IHRoaXMuX2ljb25VcmwsXG4gICAgICBpY29uU2l6ZTogW3dpZHRoLCBoZWlnaHRdLFxuICAgICAgaWNvbkFuY2hvcjogW3hPZmZzZXQsIHlPZmZzZXRdXG4gICAgfSk7XG4gICAgdGhpcy5faWNvbnNbb3B0aW9ucy53aWR0aC50b1N0cmluZygpXSA9IGljb247XG4gICAgcmV0dXJuIGljb247XG4gIH0sXG5cbiAgX2dldEljb246IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgLy8gY2hlY2sgdG8gc2VlIGlmIGl0IGlzIGFscmVhZHkgY3JlYXRlZCBieSBzaXplXG4gICAgdmFyIGljb24gPSB0aGlzLl9pY29uc1tzaXplLnRvU3RyaW5nKCldO1xuICAgIGlmICghaWNvbikge1xuICAgICAgaWNvbiA9IHRoaXMuX2NyZWF0ZUljb24oe3dpZHRoOiBzaXplfSk7XG4gICAgfVxuICAgIHJldHVybiBpY29uO1xuICB9LFxuXG4gIHBvaW50VG9MYXllcjogZnVuY3Rpb24gKGdlb2pzb24sIGxhdGxuZywgdmlzdWFsVmFyaWFibGVzLCBvcHRpb25zKSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLl9zeW1ib2xKc29uLnNpemUgfHwgdGhpcy5fc3ltYm9sSnNvbi53aWR0aDtcbiAgICBpZiAoIXRoaXMuX2lzRGVmYXVsdCkge1xuICAgICAgaWYgKHZpc3VhbFZhcmlhYmxlcy5zaXplSW5mbykge1xuICAgICAgICB2YXIgY2FsY3VsYXRlZFNpemUgPSB0aGlzLmdldFNpemUoZ2VvanNvbiwgdmlzdWFsVmFyaWFibGVzLnNpemVJbmZvKTtcbiAgICAgICAgaWYgKGNhbGN1bGF0ZWRTaXplKSB7XG4gICAgICAgICAgc2l6ZSA9IGNhbGN1bGF0ZWRTaXplO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodmlzdWFsVmFyaWFibGVzLmNvbG9ySW5mbykge1xuICAgICAgICB2YXIgY29sb3IgPSB0aGlzLmdldENvbG9yKGdlb2pzb24sIHZpc3VhbFZhcmlhYmxlcy5jb2xvckluZm8pO1xuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICB0aGlzLl9zdHlsZXMuZmlsbENvbG9yID0gdGhpcy5jb2xvclZhbHVlKGNvbG9yKTtcbiAgICAgICAgICB0aGlzLl9zdHlsZXMuZmlsbE9wYWNpdHkgPSB0aGlzLmFscGhhVmFsdWUoY29sb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3N5bWJvbEpzb24udHlwZSA9PT0gJ2VzcmlQTVMnKSB7XG4gICAgICB2YXIgbGF5ZXJPcHRpb25zID0gTC5leHRlbmQoe30sIHtpY29uOiB0aGlzLl9nZXRJY29uKHNpemUpfSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gTC5tYXJrZXIobGF0bG5nLCBsYXllck9wdGlvbnMpO1xuICAgIH1cbiAgICBzaXplID0gdGhpcy5waXhlbFZhbHVlKHNpemUpO1xuXG4gICAgc3dpdGNoICh0aGlzLl9zeW1ib2xKc29uLnN0eWxlKSB7XG4gICAgICBjYXNlICdlc3JpU01TU3F1YXJlJzpcbiAgICAgICAgcmV0dXJuIHNxdWFyZU1hcmtlcihsYXRsbmcsIHNpemUsIEwuZXh0ZW5kKHt9LCB0aGlzLl9zdHlsZXMsIG9wdGlvbnMpKTtcbiAgICAgIGNhc2UgJ2VzcmlTTVNEaWFtb25kJzpcbiAgICAgICAgcmV0dXJuIGRpYW1vbmRNYXJrZXIobGF0bG5nLCBzaXplLCBMLmV4dGVuZCh7fSwgdGhpcy5fc3R5bGVzLCBvcHRpb25zKSk7XG4gICAgICBjYXNlICdlc3JpU01TQ3Jvc3MnOlxuICAgICAgICByZXR1cm4gY3Jvc3NNYXJrZXIobGF0bG5nLCBzaXplLCBMLmV4dGVuZCh7fSwgdGhpcy5fc3R5bGVzLCBvcHRpb25zKSk7XG4gICAgICBjYXNlICdlc3JpU01TWCc6XG4gICAgICAgIHJldHVybiB4TWFya2VyKGxhdGxuZywgc2l6ZSwgTC5leHRlbmQoe30sIHRoaXMuX3N0eWxlcywgb3B0aW9ucykpO1xuICAgIH1cbiAgICB0aGlzLl9zdHlsZXMucmFkaXVzID0gc2l6ZSAvIDIuMDtcbiAgICByZXR1cm4gTC5jaXJjbGVNYXJrZXIobGF0bG5nLCBMLmV4dGVuZCh7fSwgdGhpcy5fc3R5bGVzLCBvcHRpb25zKSk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRTeW1ib2wgKHN5bWJvbEpzb24sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBQb2ludFN5bWJvbChzeW1ib2xKc29uLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcG9pbnRTeW1ib2w7XG4iLCJpbXBvcnQgU3ltYm9sIGZyb20gJy4vU3ltYm9sJztcblxuZXhwb3J0IHZhciBMaW5lU3ltYm9sID0gU3ltYm9sLmV4dGVuZCh7XG4gIHN0YXRpY3M6IHtcbiAgICAvLyBOb3QgaW1wbGVtZW50ZWQgJ2VzcmlTTFNOdWxsJ1xuICAgIExJTkVUWVBFUzogWydlc3JpU0xTRGFzaCcsICdlc3JpU0xTRG90JywgJ2VzcmlTTFNEYXNoRG90RG90JywgJ2VzcmlTTFNEYXNoRG90JywgJ2VzcmlTTFNTb2xpZCddXG4gIH0sXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChzeW1ib2xKc29uLCBvcHRpb25zKSB7XG4gICAgU3ltYm9sLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgc3ltYm9sSnNvbiwgb3B0aW9ucyk7XG4gICAgdGhpcy5fZmlsbFN0eWxlcygpO1xuICB9LFxuXG4gIF9maWxsU3R5bGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gc2V0IHRoZSBkZWZhdWx0cyB0aGF0IHNob3cgdXAgb24gYXJjZ2lzIG9ubGluZVxuICAgIHRoaXMuX3N0eWxlcy5saW5lQ2FwID0gJ2J1dHQnO1xuICAgIHRoaXMuX3N0eWxlcy5saW5lSm9pbiA9ICdtaXRlcic7XG4gICAgdGhpcy5fc3R5bGVzLmZpbGwgPSBmYWxzZTtcbiAgICB0aGlzLl9zdHlsZXMud2VpZ2h0ID0gMDtcblxuICAgIGlmICghdGhpcy5fc3ltYm9sSnNvbikge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc3ltYm9sSnNvbi5jb2xvcikge1xuICAgICAgdGhpcy5fc3R5bGVzLmNvbG9yID0gdGhpcy5jb2xvclZhbHVlKHRoaXMuX3N5bWJvbEpzb24uY29sb3IpO1xuICAgICAgdGhpcy5fc3R5bGVzLm9wYWNpdHkgPSB0aGlzLmFscGhhVmFsdWUodGhpcy5fc3ltYm9sSnNvbi5jb2xvcik7XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTih0aGlzLl9zeW1ib2xKc29uLndpZHRoKSkge1xuICAgICAgdGhpcy5fc3R5bGVzLndlaWdodCA9IHRoaXMucGl4ZWxWYWx1ZSh0aGlzLl9zeW1ib2xKc29uLndpZHRoKTtcblxuICAgICAgdmFyIGRhc2hWYWx1ZXMgPSBbXTtcblxuICAgICAgc3dpdGNoICh0aGlzLl9zeW1ib2xKc29uLnN0eWxlKSB7XG4gICAgICAgIGNhc2UgJ2VzcmlTTFNEYXNoJzpcbiAgICAgICAgICBkYXNoVmFsdWVzID0gWzQsIDNdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlc3JpU0xTRG90JzpcbiAgICAgICAgICBkYXNoVmFsdWVzID0gWzEsIDNdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlc3JpU0xTRGFzaERvdCc6XG4gICAgICAgICAgZGFzaFZhbHVlcyA9IFs4LCAzLCAxLCAzXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZXNyaVNMU0Rhc2hEb3REb3QnOlxuICAgICAgICAgIGRhc2hWYWx1ZXMgPSBbOCwgMywgMSwgMywgMSwgM107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIHVzZSB0aGUgZGFzaCB2YWx1ZXMgYW5kIHRoZSBsaW5lIHdlaWdodCB0byBzZXQgZGFzaCBhcnJheVxuICAgICAgaWYgKGRhc2hWYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhc2hWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBkYXNoVmFsdWVzW2ldICo9IHRoaXMuX3N0eWxlcy53ZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdHlsZXMuZGFzaEFycmF5ID0gZGFzaFZhbHVlcy5qb2luKCcsJyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHN0eWxlOiBmdW5jdGlvbiAoZmVhdHVyZSwgdmlzdWFsVmFyaWFibGVzKSB7XG4gICAgaWYgKCF0aGlzLl9pc0RlZmF1bHQgJiYgdmlzdWFsVmFyaWFibGVzKSB7XG4gICAgICBpZiAodmlzdWFsVmFyaWFibGVzLnNpemVJbmZvKSB7XG4gICAgICAgIHZhciBjYWxjdWxhdGVkU2l6ZSA9IHRoaXMucGl4ZWxWYWx1ZSh0aGlzLmdldFNpemUoZmVhdHVyZSwgdmlzdWFsVmFyaWFibGVzLnNpemVJbmZvKSk7XG4gICAgICAgIGlmIChjYWxjdWxhdGVkU2l6ZSkge1xuICAgICAgICAgIHRoaXMuX3N0eWxlcy53ZWlnaHQgPSBjYWxjdWxhdGVkU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHZpc3VhbFZhcmlhYmxlcy5jb2xvckluZm8pIHtcbiAgICAgICAgdmFyIGNvbG9yID0gdGhpcy5nZXRDb2xvcihmZWF0dXJlLCB2aXN1YWxWYXJpYWJsZXMuY29sb3JJbmZvKTtcbiAgICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgICAgdGhpcy5fc3R5bGVzLmNvbG9yID0gdGhpcy5jb2xvclZhbHVlKGNvbG9yKTtcbiAgICAgICAgICB0aGlzLl9zdHlsZXMub3BhY2l0eSA9IHRoaXMuYWxwaGFWYWx1ZShjb2xvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0eWxlcztcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5lU3ltYm9sIChzeW1ib2xKc29uLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgTGluZVN5bWJvbChzeW1ib2xKc29uLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGluZVN5bWJvbDtcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9TeW1ib2wnO1xuaW1wb3J0IGxpbmVTeW1ib2wgZnJvbSAnLi9MaW5lU3ltYm9sJztcblxuZXhwb3J0IHZhciBQb2x5Z29uU3ltYm9sID0gU3ltYm9sLmV4dGVuZCh7XG4gIHN0YXRpY3M6IHtcbiAgICAvLyBub3QgaW1wbGVtZW50ZWQ6ICdlc3JpU0ZTQmFja3dhcmREaWFnb25hbCcsJ2VzcmlTRlNDcm9zcycsJ2VzcmlTRlNEaWFnb25hbENyb3NzJywnZXNyaVNGU0ZvcndhcmREaWFnb25hbCcsJ2VzcmlTRlNIb3Jpem9udGFsJywnZXNyaVNGU051bGwnLCdlc3JpU0ZTVmVydGljYWwnXG4gICAgUE9MWUdPTlRZUEVTOiBbJ2VzcmlTRlNTb2xpZCddXG4gIH0sXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChzeW1ib2xKc29uLCBvcHRpb25zKSB7XG4gICAgU3ltYm9sLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgc3ltYm9sSnNvbiwgb3B0aW9ucyk7XG4gICAgaWYgKHN5bWJvbEpzb24pIHtcbiAgICAgIHRoaXMuX2xpbmVTdHlsZXMgPSBsaW5lU3ltYm9sKHN5bWJvbEpzb24ub3V0bGluZSwgb3B0aW9ucykuc3R5bGUoKTtcbiAgICAgIHRoaXMuX2ZpbGxTdHlsZXMoKTtcbiAgICB9XG4gIH0sXG5cbiAgX2ZpbGxTdHlsZXM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fbGluZVN0eWxlcykge1xuICAgICAgaWYgKHRoaXMuX2xpbmVTdHlsZXMud2VpZ2h0ID09PSAwKSB7XG4gICAgICAgIC8vIHdoZW4gd2VpZ2h0IGlzIDAsIHNldHRpbmcgdGhlIHN0cm9rZSB0byBmYWxzZSBjYW4gc3RpbGwgbG9vayBiYWRcbiAgICAgICAgLy8gKGdhcHMgYmV0d2VlbiB0aGUgcG9seWdvbnMpXG4gICAgICAgIHRoaXMuX3N0eWxlcy5zdHJva2UgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNvcHkgdGhlIGxpbmUgc3ltYm9sIHN0eWxlcyBpbnRvIHRoaXMgc3ltYm9sJ3Mgc3R5bGVzXG4gICAgICAgIGZvciAodmFyIHN0eWxlQXR0ciBpbiB0aGlzLl9saW5lU3R5bGVzKSB7XG4gICAgICAgICAgdGhpcy5fc3R5bGVzW3N0eWxlQXR0cl0gPSB0aGlzLl9saW5lU3R5bGVzW3N0eWxlQXR0cl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgdGhlIGZpbGwgZm9yIHRoZSBwb2x5Z29uXG4gICAgaWYgKHRoaXMuX3N5bWJvbEpzb24pIHtcbiAgICAgIGlmICh0aGlzLl9zeW1ib2xKc29uLmNvbG9yICYmXG4gICAgICAgICAgLy8gZG9uJ3QgZmlsbCBwb2x5Z29uIGlmIHR5cGUgaXMgbm90IHN1cHBvcnRlZFxuICAgICAgICAgIFBvbHlnb25TeW1ib2wuUE9MWUdPTlRZUEVTLmluZGV4T2YodGhpcy5fc3ltYm9sSnNvbi5zdHlsZSA+PSAwKSkge1xuICAgICAgICB0aGlzLl9zdHlsZXMuZmlsbCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsQ29sb3IgPSB0aGlzLmNvbG9yVmFsdWUodGhpcy5fc3ltYm9sSnNvbi5jb2xvcik7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsT3BhY2l0eSA9IHRoaXMuYWxwaGFWYWx1ZSh0aGlzLl9zeW1ib2xKc29uLmNvbG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsT3BhY2l0eSA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHN0eWxlOiBmdW5jdGlvbiAoZmVhdHVyZSwgdmlzdWFsVmFyaWFibGVzKSB7XG4gICAgaWYgKCF0aGlzLl9pc0RlZmF1bHQgJiYgdmlzdWFsVmFyaWFibGVzICYmIHZpc3VhbFZhcmlhYmxlcy5jb2xvckluZm8pIHtcbiAgICAgIHZhciBjb2xvciA9IHRoaXMuZ2V0Q29sb3IoZmVhdHVyZSwgdmlzdWFsVmFyaWFibGVzLmNvbG9ySW5mbyk7XG4gICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgdGhpcy5fc3R5bGVzLmZpbGxDb2xvciA9IHRoaXMuY29sb3JWYWx1ZShjb2xvcik7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsT3BhY2l0eSA9IHRoaXMuYWxwaGFWYWx1ZShjb2xvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdHlsZXM7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9seWdvblN5bWJvbCAoc3ltYm9sSnNvbiwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFBvbHlnb25TeW1ib2woc3ltYm9sSnNvbiwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBvbHlnb25TeW1ib2w7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcblxuaW1wb3J0IHBvaW50U3ltYm9sIGZyb20gJy4uL1N5bWJvbHMvUG9pbnRTeW1ib2wnO1xuaW1wb3J0IGxpbmVTeW1ib2wgZnJvbSAnLi4vU3ltYm9scy9MaW5lU3ltYm9sJztcbmltcG9ydCBwb2x5Z29uU3ltYm9sIGZyb20gJy4uL1N5bWJvbHMvUG9seWdvblN5bWJvbCc7XG5cbmV4cG9ydCB2YXIgUmVuZGVyZXIgPSBMLkNsYXNzLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBwcm9wb3J0aW9uYWxQb2x5Z29uOiBmYWxzZSxcbiAgICBjbGlja2FibGU6IHRydWVcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAocmVuZGVyZXJKc29uLCBvcHRpb25zKSB7XG4gICAgdGhpcy5fcmVuZGVyZXJKc29uID0gcmVuZGVyZXJKc29uO1xuICAgIHRoaXMuX3BvaW50U3ltYm9scyA9IGZhbHNlO1xuICAgIHRoaXMuX3N5bWJvbHMgPSBbXTtcbiAgICB0aGlzLl92aXN1YWxWYXJpYWJsZXMgPSB0aGlzLl9wYXJzZVZpc3VhbFZhcmlhYmxlcyhyZW5kZXJlckpzb24udmlzdWFsVmFyaWFibGVzKTtcbiAgICBMLlV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgfSxcblxuICBfcGFyc2VWaXN1YWxWYXJpYWJsZXM6IGZ1bmN0aW9uICh2aXN1YWxWYXJpYWJsZXMpIHtcbiAgICB2YXIgdmlzVmFycyA9IHt9O1xuICAgIGlmICh2aXN1YWxWYXJpYWJsZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlzdWFsVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZpc1ZhcnNbdmlzdWFsVmFyaWFibGVzW2ldLnR5cGVdID0gdmlzdWFsVmFyaWFibGVzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmlzVmFycztcbiAgfSxcblxuICBfY3JlYXRlRGVmYXVsdFN5bWJvbDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZW5kZXJlckpzb24uZGVmYXVsdFN5bWJvbCkge1xuICAgICAgdGhpcy5fZGVmYXVsdFN5bWJvbCA9IHRoaXMuX25ld1N5bWJvbCh0aGlzLl9yZW5kZXJlckpzb24uZGVmYXVsdFN5bWJvbCk7XG4gICAgICB0aGlzLl9kZWZhdWx0U3ltYm9sLl9pc0RlZmF1bHQgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICBfbmV3U3ltYm9sOiBmdW5jdGlvbiAoc3ltYm9sSnNvbikge1xuICAgIGlmIChzeW1ib2xKc29uLnR5cGUgPT09ICdlc3JpU01TJyB8fCBzeW1ib2xKc29uLnR5cGUgPT09ICdlc3JpUE1TJykge1xuICAgICAgdGhpcy5fcG9pbnRTeW1ib2xzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBwb2ludFN5bWJvbChzeW1ib2xKc29uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoc3ltYm9sSnNvbi50eXBlID09PSAnZXNyaVNMUycpIHtcbiAgICAgIHJldHVybiBsaW5lU3ltYm9sKHN5bWJvbEpzb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChzeW1ib2xKc29uLnR5cGUgPT09ICdlc3JpU0ZTJykge1xuICAgICAgcmV0dXJuIHBvbHlnb25TeW1ib2woc3ltYm9sSnNvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG4gIH0sXG5cbiAgX2dldFN5bWJvbDogZnVuY3Rpb24gKCkge1xuICAgIC8vIG92ZXJyaWRlXG4gIH0sXG5cbiAgYXR0YWNoU3R5bGVzVG9MYXllcjogZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgaWYgKHRoaXMuX3BvaW50U3ltYm9scykge1xuICAgICAgbGF5ZXIub3B0aW9ucy5wb2ludFRvTGF5ZXIgPSBMLlV0aWwuYmluZCh0aGlzLnBvaW50VG9MYXllciwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyLm9wdGlvbnMuc3R5bGUgPSBMLlV0aWwuYmluZCh0aGlzLnN0eWxlLCB0aGlzKTtcbiAgICAgIGxheWVyLl9vcmlnaW5hbFN0eWxlID0gbGF5ZXIub3B0aW9ucy5zdHlsZTtcbiAgICB9XG4gIH0sXG5cbiAgcG9pbnRUb0xheWVyOiBmdW5jdGlvbiAoZ2VvanNvbiwgbGF0bG5nKSB7XG4gICAgdmFyIHN5bSA9IHRoaXMuX2dldFN5bWJvbChnZW9qc29uKTtcbiAgICBpZiAoc3ltICYmIHN5bS5wb2ludFRvTGF5ZXIpIHtcbiAgICAgIC8vIHJpZ2h0IG5vdyBjdXN0b20gcGFuZXMgYXJlIHRoZSBvbmx5IG9wdGlvbiBwdXNoZWQgdGhyb3VnaFxuICAgICAgcmV0dXJuIHN5bS5wb2ludFRvTGF5ZXIoZ2VvanNvbiwgbGF0bG5nLCB0aGlzLl92aXN1YWxWYXJpYWJsZXMsIHRoaXMub3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIGludmlzaWJsZSBzeW1ib2xvZ3lcbiAgICByZXR1cm4gTC5jaXJjbGVNYXJrZXIobGF0bG5nLCB7cmFkaXVzOiAwLCBvcGFjaXR5OiAwfSk7XG4gIH0sXG5cbiAgc3R5bGU6IGZ1bmN0aW9uIChmZWF0dXJlKSB7XG4gICAgdmFyIHVzZXJTdHlsZXM7XG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZFN0eWxlKSB7XG4gICAgICB1c2VyU3R5bGVzID0gdGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkU3R5bGUoZmVhdHVyZSk7XG4gICAgfVxuICAgIC8vIGZpbmQgdGhlIHN5bWJvbCB0byByZXByZXNlbnQgdGhpcyBmZWF0dXJlXG4gICAgdmFyIHN5bSA9IHRoaXMuX2dldFN5bWJvbChmZWF0dXJlKTtcbiAgICBpZiAoc3ltKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXJnZVN0eWxlcyhzeW0uc3R5bGUoZmVhdHVyZSwgdGhpcy5fdmlzdWFsVmFyaWFibGVzKSwgdXNlclN0eWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGludmlzaWJsZSBzeW1ib2xvZ3lcbiAgICAgIHJldHVybiB0aGlzLm1lcmdlU3R5bGVzKHtvcGFjaXR5OiAwLCBmaWxsT3BhY2l0eTogMH0sIHVzZXJTdHlsZXMpO1xuICAgIH1cbiAgfSxcblxuICBtZXJnZVN0eWxlczogZnVuY3Rpb24gKHN0eWxlcywgdXNlclN0eWxlcykge1xuICAgIHZhciBtZXJnZWRTdHlsZXMgPSB7fTtcbiAgICB2YXIgYXR0cjtcbiAgICAvLyBjb3B5IHJlbmRlcmVyIHN0eWxlIGF0dHJpYnV0ZXNcbiAgICBmb3IgKGF0dHIgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoc3R5bGVzLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgIG1lcmdlZFN0eWxlc1thdHRyXSA9IHN0eWxlc1thdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gb3ZlcnJpZGUgd2l0aCB1c2VyIGRlZmluZWQgc3R5bGUgYXR0cmlidXRlc1xuICAgIGlmICh1c2VyU3R5bGVzKSB7XG4gICAgICBmb3IgKGF0dHIgaW4gdXNlclN0eWxlcykge1xuICAgICAgICBpZiAodXNlclN0eWxlcy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICAgIG1lcmdlZFN0eWxlc1thdHRyXSA9IHVzZXJTdHlsZXNbYXR0cl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFN0eWxlcztcbiAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFJlbmRlcmVyO1xuIiwiaW1wb3J0IFJlbmRlcmVyIGZyb20gJy4vUmVuZGVyZXInO1xuXG5leHBvcnQgdmFyIFNpbXBsZVJlbmRlcmVyID0gUmVuZGVyZXIuZXh0ZW5kKHtcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKHJlbmRlcmVySnNvbiwgb3B0aW9ucykge1xuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgcmVuZGVyZXJKc29uLCBvcHRpb25zKTtcbiAgICB0aGlzLl9jcmVhdGVTeW1ib2woKTtcbiAgfSxcblxuICBfY3JlYXRlU3ltYm9sOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3JlbmRlcmVySnNvbi5zeW1ib2wpIHtcbiAgICAgIHRoaXMuX3N5bWJvbHMucHVzaCh0aGlzLl9uZXdTeW1ib2wodGhpcy5fcmVuZGVyZXJKc29uLnN5bWJvbCkpO1xuICAgIH1cbiAgfSxcblxuICBfZ2V0U3ltYm9sOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N5bWJvbHNbMF07XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gc2ltcGxlUmVuZGVyZXIgKHJlbmRlcmVySnNvbiwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFNpbXBsZVJlbmRlcmVyKHJlbmRlcmVySnNvbiwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNpbXBsZVJlbmRlcmVyO1xuIiwiaW1wb3J0IFJlbmRlcmVyIGZyb20gJy4vUmVuZGVyZXInO1xuXG5leHBvcnQgdmFyIENsYXNzQnJlYWtzUmVuZGVyZXIgPSBSZW5kZXJlci5leHRlbmQoe1xuICBpbml0aWFsaXplOiBmdW5jdGlvbiAocmVuZGVyZXJKc29uLCBvcHRpb25zKSB7XG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCByZW5kZXJlckpzb24sIG9wdGlvbnMpO1xuICAgIHRoaXMuX2ZpZWxkID0gdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkO1xuICAgIGlmICh0aGlzLl9yZW5kZXJlckpzb24ubm9ybWFsaXphdGlvblR5cGUgJiYgdGhpcy5fcmVuZGVyZXJKc29uLm5vcm1hbGl6YXRpb25UeXBlID09PSAnZXNyaU5vcm1hbGl6ZUJ5RmllbGQnKSB7XG4gICAgICB0aGlzLl9ub3JtYWxpemF0aW9uRmllbGQgPSB0aGlzLl9yZW5kZXJlckpzb24ubm9ybWFsaXphdGlvbkZpZWxkO1xuICAgIH1cbiAgICB0aGlzLl9jcmVhdGVTeW1ib2xzKCk7XG4gIH0sXG5cbiAgX2NyZWF0ZVN5bWJvbHM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3ltYm9sO1xuICAgIHZhciBjbGFzc2JyZWFrcyA9IHRoaXMuX3JlbmRlcmVySnNvbi5jbGFzc0JyZWFrSW5mb3M7XG5cbiAgICB0aGlzLl9zeW1ib2xzID0gW107XG5cbiAgICAvLyBjcmVhdGUgYSBzeW1ib2wgZm9yIGVhY2ggY2xhc3MgYnJlYWtcbiAgICBmb3IgKHZhciBpID0gY2xhc3NicmVha3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJvcG9ydGlvbmFsUG9seWdvbiAmJiB0aGlzLl9yZW5kZXJlckpzb24uYmFja2dyb3VuZEZpbGxTeW1ib2wpIHtcbiAgICAgICAgc3ltYm9sID0gdGhpcy5fbmV3U3ltYm9sKHRoaXMuX3JlbmRlcmVySnNvbi5iYWNrZ3JvdW5kRmlsbFN5bWJvbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW1ib2wgPSB0aGlzLl9uZXdTeW1ib2woY2xhc3NicmVha3NbaV0uc3ltYm9sKTtcbiAgICAgIH1cbiAgICAgIHN5bWJvbC52YWwgPSBjbGFzc2JyZWFrc1tpXS5jbGFzc01heFZhbHVlO1xuICAgICAgdGhpcy5fc3ltYm9scy5wdXNoKHN5bWJvbCk7XG4gICAgfVxuICAgIC8vIHNvcnQgdGhlIHN5bWJvbHMgaW4gYXNjZW5kaW5nIHZhbHVlXG4gICAgdGhpcy5fc3ltYm9scy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS52YWwgPiBiLnZhbCA/IDEgOiAtMTtcbiAgICB9KTtcbiAgICB0aGlzLl9jcmVhdGVEZWZhdWx0U3ltYm9sKCk7XG4gICAgdGhpcy5fbWF4VmFsdWUgPSB0aGlzLl9zeW1ib2xzW3RoaXMuX3N5bWJvbHMubGVuZ3RoIC0gMV0udmFsO1xuICB9LFxuXG4gIF9nZXRTeW1ib2w6IGZ1bmN0aW9uIChmZWF0dXJlKSB7XG4gICAgdmFyIHZhbCA9IGZlYXR1cmUucHJvcGVydGllc1t0aGlzLl9maWVsZF07XG4gICAgaWYgKHRoaXMuX25vcm1hbGl6YXRpb25GaWVsZCkge1xuICAgICAgdmFyIG5vcm1WYWx1ZSA9IGZlYXR1cmUucHJvcGVydGllc1t0aGlzLl9ub3JtYWxpemF0aW9uRmllbGRdO1xuICAgICAgaWYgKCFpc05hTihub3JtVmFsdWUpICYmIG5vcm1WYWx1ZSAhPT0gMCkge1xuICAgICAgICB2YWwgPSB2YWwgLyBub3JtVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFN5bWJvbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsID4gdGhpcy5fbWF4VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0U3ltYm9sO1xuICAgIH1cbiAgICB2YXIgc3ltYm9sID0gdGhpcy5fc3ltYm9sc1swXTtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5fc3ltYm9scy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKHZhbCA+IHRoaXMuX3N5bWJvbHNbaV0udmFsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3ltYm9sID0gdGhpcy5fc3ltYm9sc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHN5bWJvbDtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc0JyZWFrc1JlbmRlcmVyIChyZW5kZXJlckpzb24sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBDbGFzc0JyZWFrc1JlbmRlcmVyKHJlbmRlcmVySnNvbiwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzQnJlYWtzUmVuZGVyZXI7XG4iLCJpbXBvcnQgUmVuZGVyZXIgZnJvbSAnLi9SZW5kZXJlcic7XG5cbmV4cG9ydCB2YXIgVW5pcXVlVmFsdWVSZW5kZXJlciA9IFJlbmRlcmVyLmV4dGVuZCh7XG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChyZW5kZXJlckpzb24sIG9wdGlvbnMpIHtcbiAgICBSZW5kZXJlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHJlbmRlcmVySnNvbiwgb3B0aW9ucyk7XG4gICAgdGhpcy5fZmllbGQgPSB0aGlzLl9yZW5kZXJlckpzb24uZmllbGQxO1xuICAgIHRoaXMuX2NyZWF0ZVN5bWJvbHMoKTtcbiAgfSxcblxuICBfY3JlYXRlU3ltYm9sczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzeW1ib2w7XG4gICAgdmFyIHVuaXF1ZXMgPSB0aGlzLl9yZW5kZXJlckpzb24udW5pcXVlVmFsdWVJbmZvcztcblxuICAgIC8vIGNyZWF0ZSBhIHN5bWJvbCBmb3IgZWFjaCB1bmlxdWUgdmFsdWVcbiAgICBmb3IgKHZhciBpID0gdW5pcXVlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgc3ltYm9sID0gdGhpcy5fbmV3U3ltYm9sKHVuaXF1ZXNbaV0uc3ltYm9sKTtcbiAgICAgIHN5bWJvbC52YWwgPSB1bmlxdWVzW2ldLnZhbHVlO1xuICAgICAgdGhpcy5fc3ltYm9scy5wdXNoKHN5bWJvbCk7XG4gICAgfVxuICAgIHRoaXMuX2NyZWF0ZURlZmF1bHRTeW1ib2woKTtcbiAgfSxcblxuICBfZ2V0U3ltYm9sOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgIHZhciB2YWwgPSBmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5fZmllbGRdO1xuICAgIC8vIGFjY3VtdWxhdGUgdmFsdWVzIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZmllbGQgZGVmaW5lZFxuICAgIGlmICh0aGlzLl9yZW5kZXJlckpzb24uZmllbGREZWxpbWl0ZXIgJiYgdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkMikge1xuICAgICAgdmFyIHZhbDIgPSBmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkMl07XG4gICAgICBpZiAodmFsMikge1xuICAgICAgICB2YWwgKz0gdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkRGVsaW1pdGVyICsgdmFsMjtcbiAgICAgICAgdmFyIHZhbDMgPSBmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkM107XG4gICAgICAgIGlmICh2YWwzKSB7XG4gICAgICAgICAgdmFsICs9IHRoaXMuX3JlbmRlcmVySnNvbi5maWVsZERlbGltaXRlciArIHZhbDM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3ltYm9sID0gdGhpcy5fZGVmYXVsdFN5bWJvbDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5fc3ltYm9scy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgLy8gdXNpbmcgdGhlID09PSBvcGVyYXRvciBkb2VzIG5vdCB3b3JrIGlmIHRoZSBmaWVsZFxuICAgICAgLy8gb2YgdGhlIHVuaXF1ZSByZW5kZXJlciBpcyBub3QgYSBzdHJpbmdcbiAgICAgIC8qZXNsaW50LWRpc2FibGUgKi9cbiAgICAgIGlmICh0aGlzLl9zeW1ib2xzW2ldLnZhbCA9PSB2YWwpIHtcbiAgICAgICAgc3ltYm9sID0gdGhpcy5fc3ltYm9sc1tpXTtcbiAgICAgIH1cbiAgICAgIC8qZXNsaW50LWVuYWJsZSAqL1xuICAgIH1cbiAgICByZXR1cm4gc3ltYm9sO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZVZhbHVlUmVuZGVyZXIgKHJlbmRlcmVySnNvbiwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFVuaXF1ZVZhbHVlUmVuZGVyZXIocmVuZGVyZXJKc29uLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdW5pcXVlVmFsdWVSZW5kZXJlcjtcbiIsIiBpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcblxuaW1wb3J0IGNsYXNzQnJlYWtzUmVuZGVyZXIgZnJvbSAnLi9SZW5kZXJlcnMvQ2xhc3NCcmVha3NSZW5kZXJlcic7XG5pbXBvcnQgdW5pcXVlVmFsdWVSZW5kZXJlciBmcm9tICcuL1JlbmRlcmVycy9VbmlxdWVWYWx1ZVJlbmRlcmVyJztcbmltcG9ydCBzaW1wbGVSZW5kZXJlciBmcm9tICcuL1JlbmRlcmVycy9TaW1wbGVSZW5kZXJlcic7XG5cbkwuZXNyaS5GZWF0dXJlTGF5ZXIuYWRkSW5pdEhvb2soZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZVJlbmRlcmVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBvbGRPbkFkZCA9IEwuVXRpbC5iaW5kKHRoaXMub25BZGQsIHRoaXMpO1xuICB2YXIgb2xkVW5iaW5kUG9wdXAgPSBMLlV0aWwuYmluZCh0aGlzLnVuYmluZFBvcHVwLCB0aGlzKTtcbiAgdmFyIG9sZE9uUmVtb3ZlID0gTC5VdGlsLmJpbmQodGhpcy5vblJlbW92ZSwgdGhpcyk7XG4gIEwuVXRpbC5iaW5kKHRoaXMuY3JlYXRlTmV3TGF5ZXIsIHRoaXMpO1xuXG4gIHRoaXMubWV0YWRhdGEoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH0gaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmRyYXdpbmdJbmZvKSB7XG4gICAgICB0aGlzLl9zZXRSZW5kZXJlcnMocmVzcG9uc2UpO1xuICAgIH0gaWYgKHRoaXMuX2FscmVhZHlBZGRlZCkge1xuICAgICAgdGhpcy5zZXRTdHlsZSh0aGlzLl9vcmlnaW5hbFN0eWxlKTtcbiAgICB9XG4gIH0sIHRoaXMpO1xuXG4gIHRoaXMub25BZGQgPSBmdW5jdGlvbiAobWFwKSB7XG4gICAgb2xkT25BZGQobWFwKTtcbiAgICB0aGlzLl9hZGRQb2ludExheWVyKG1hcCk7XG4gICAgdGhpcy5fYWxyZWFkeUFkZGVkID0gdHJ1ZTtcbiAgfTtcblxuICB0aGlzLm9uUmVtb3ZlID0gZnVuY3Rpb24gKG1hcCkge1xuICAgIG9sZE9uUmVtb3ZlKG1hcCk7XG4gICAgaWYgKHRoaXMuX3BvaW50TGF5ZXIpIHtcbiAgICAgIHZhciBwb2ludExheWVycyA9IHRoaXMuX3BvaW50TGF5ZXIuZ2V0TGF5ZXJzKCk7XG4gICAgICBmb3IgKHZhciBpIGluIHBvaW50TGF5ZXJzKSB7XG4gICAgICAgIG1hcC5yZW1vdmVMYXllcihwb2ludExheWVyc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHRoaXMudW5iaW5kUG9wdXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgb2xkVW5iaW5kUG9wdXAoKTtcbiAgICBpZiAodGhpcy5fcG9pbnRMYXllcikge1xuICAgICAgdmFyIHBvaW50TGF5ZXJzID0gdGhpcy5fcG9pbnRMYXllci5nZXRMYXllcnMoKTtcbiAgICAgIGZvciAodmFyIGkgaW4gcG9pbnRMYXllcnMpIHtcbiAgICAgICAgcG9pbnRMYXllcnNbaV0udW5iaW5kUG9wdXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5fYWRkUG9pbnRMYXllciA9IGZ1bmN0aW9uIChtYXApIHtcbiAgICBpZiAodGhpcy5fcG9pbnRMYXllcikge1xuICAgICAgdGhpcy5fcG9pbnRMYXllci5hZGRUbyhtYXApO1xuICAgICAgdGhpcy5fcG9pbnRMYXllci5icmluZ1RvRnJvbnQoKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5fY3JlYXRlUG9pbnRMYXllciA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX3BvaW50TGF5ZXIpIHtcbiAgICAgIHRoaXMuX3BvaW50TGF5ZXIgPSBMLmdlb0pzb24oKTtcbiAgICAgIC8vIHN0b3JlIHRoZSBmZWF0dXJlIGlkcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBtYXBcbiAgICAgIHRoaXMuX3BvaW50TGF5ZXJJZHMgPSB7fTtcblxuICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XG4gICAgICAgIHZhciBwb3B1cEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZlYXR1cmUsIGxheWVyKSB7XG4gICAgICAgICAgbGF5ZXIuYmluZFBvcHVwKHRoaXMuX3BvcHVwKGZlYXR1cmUsIGxheWVyKSwgdGhpcy5fcG9wdXBPcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fcG9pbnRMYXllci5vcHRpb25zLm9uRWFjaEZlYXR1cmUgPSBMLlV0aWwuYmluZChwb3B1cEZ1bmN0aW9uLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5jcmVhdGVOZXdMYXllciA9IGZ1bmN0aW9uIChnZW9qc29uKSB7XG4gICAgdmFyIGZMYXllciA9IEwuR2VvSlNPTi5nZW9tZXRyeVRvTGF5ZXIoZ2VvanNvbiwgdGhpcy5vcHRpb25zKTtcblxuICAgIC8vIGFkZCBhIHBvaW50IGxheWVyIHdoZW4gdGhlIHBvbHlnb24gaXMgcmVwcmVzZW50ZWQgYXMgcHJvcG9ydGlvbmFsIG1hcmtlciBzeW1ib2xzXG4gICAgaWYgKHRoaXMuX2hhc1Byb3BvcnRpb25hbFN5bWJvbHMpIHtcbiAgICAgIHZhciBjZW50cm9pZCA9IHRoaXMuZ2V0UG9seWdvbkNlbnRyb2lkKGdlb2pzb24uZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgaWYgKCEoaXNOYU4oY2VudHJvaWRbMF0pIHx8IGlzTmFOKGNlbnRyb2lkWzBdKSkpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlUG9pbnRMYXllcigpO1xuXG4gICAgICAgIHZhciBmZWF0dXJlSWQgPSBnZW9qc29uLmlkLnRvU3RyaW5nKCk7XG4gICAgICAgIC8vIG9ubHkgYWRkIHRoZSBmZWF0dXJlIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3Qgb24gdGhlIG1hcFxuICAgICAgICBpZiAoIXRoaXMuX3BvaW50TGF5ZXJJZHNbZmVhdHVyZUlkXSkge1xuICAgICAgICAgIHZhciBwb2ludGpzb24gPSB0aGlzLmdldFBvaW50SnNvbihnZW9qc29uLCBjZW50cm9pZCk7XG5cbiAgICAgICAgICB0aGlzLl9wb2ludExheWVyLmFkZERhdGEocG9pbnRqc29uKTtcbiAgICAgICAgICB0aGlzLl9wb2ludExheWVySWRzW2ZlYXR1cmVJZF0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcG9pbnRMYXllci5icmluZ1RvRnJvbnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZMYXllcjtcbiAgfTtcblxuICB0aGlzLmdldFBvbHlnb25DZW50cm9pZCA9IGZ1bmN0aW9uIChjb29yZGluYXRlcykge1xuICAgIHZhciBwdHMgPSBjb29yZGluYXRlc1swXVswXTtcbiAgICBpZiAocHRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcHRzID0gY29vcmRpbmF0ZXNbMF07XG4gICAgfVxuXG4gICAgdmFyIHR3aWNlYXJlYSA9IDA7XG4gICAgdmFyIHggPSAwO1xuICAgIHZhciB5ID0gMDtcbiAgICB2YXIgblB0cyA9IHB0cy5sZW5ndGg7XG4gICAgdmFyIHAxO1xuICAgIHZhciBwMjtcbiAgICB2YXIgZjtcblxuICAgIGZvciAodmFyIGkgPSAwLCBqID0gblB0cyAtIDE7IGkgPCBuUHRzOyBqID0gaSsrKSB7XG4gICAgICBwMSA9IHB0c1tpXTsgcDIgPSBwdHNbal07XG4gICAgICB0d2ljZWFyZWEgKz0gcDFbMF0gKiBwMlsxXTtcbiAgICAgIHR3aWNlYXJlYSAtPSBwMVsxXSAqIHAyWzBdO1xuICAgICAgZiA9IHAxWzBdICogcDJbMV0gLSBwMlswXSAqIHAxWzFdO1xuICAgICAgeCArPSAocDFbMF0gKyBwMlswXSkgKiBmO1xuICAgICAgeSArPSAocDFbMV0gKyBwMlsxXSkgKiBmO1xuICAgIH1cbiAgICBmID0gdHdpY2VhcmVhICogMztcbiAgICByZXR1cm4gW3ggLyBmLCB5IC8gZl07XG4gIH07XG5cbiAgdGhpcy5nZXRQb2ludEpzb24gPSBmdW5jdGlvbiAoZ2VvanNvbiwgY2VudHJvaWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgcHJvcGVydGllczogZ2VvanNvbi5wcm9wZXJ0aWVzLFxuICAgICAgaWQ6IGdlb2pzb24uaWQsXG4gICAgICBnZW9tZXRyeToge1xuICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICBjb29yZGluYXRlczogW2NlbnRyb2lkWzBdLCBjZW50cm9pZFsxXV1cbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIHRoaXMuX2NoZWNrRm9yUHJvcG9ydGlvbmFsU3ltYm9scyA9IGZ1bmN0aW9uIChnZW9tZXRyeVR5cGUsIHJlbmRlcmVyKSB7XG4gICAgdGhpcy5faGFzUHJvcG9ydGlvbmFsU3ltYm9scyA9IGZhbHNlO1xuICAgIGlmIChnZW9tZXRyeVR5cGUgPT09ICdlc3JpR2VvbWV0cnlQb2x5Z29uJykge1xuICAgICAgaWYgKHJlbmRlcmVyLmJhY2tncm91bmRGaWxsU3ltYm9sKSB7XG4gICAgICAgIHRoaXMuX2hhc1Byb3BvcnRpb25hbFN5bWJvbHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIGNsYXNzYnJlYWtzIGlzIGEgbWFya2VyIHN5bWJvbFxuICAgICAgaWYgKHJlbmRlcmVyLmNsYXNzQnJlYWtJbmZvcyAmJiByZW5kZXJlci5jbGFzc0JyZWFrSW5mb3MubGVuZ3RoKSB7XG4gICAgICAgIHZhciBzeW0gPSByZW5kZXJlci5jbGFzc0JyZWFrSW5mb3NbMF0uc3ltYm9sO1xuICAgICAgICBpZiAoc3ltICYmIChzeW0udHlwZSA9PT0gJ2VzcmlTTVMnIHx8IHN5bS50eXBlID09PSAnZXNyaVBNUycpKSB7XG4gICAgICAgICAgdGhpcy5faGFzUHJvcG9ydGlvbmFsU3ltYm9scyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5fc2V0UmVuZGVyZXJzID0gZnVuY3Rpb24gKGdlb2pzb24pIHtcbiAgICB2YXIgcmVuZDtcbiAgICB2YXIgcmVuZGVyZXJJbmZvID0gZ2VvanNvbi5kcmF3aW5nSW5mby5yZW5kZXJlcjtcblxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIG9wdGlvbnMudG9rZW4gPSB0aGlzLm9wdGlvbnMudG9rZW47XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMucGFuZSkge1xuICAgICAgb3B0aW9ucy5wYW5lID0gdGhpcy5vcHRpb25zLnBhbmU7XG4gICAgfVxuICAgIGlmIChnZW9qc29uLmRyYXdpbmdJbmZvLnRyYW5zcGFyZW5jeSkge1xuICAgICAgb3B0aW9ucy5sYXllclRyYW5zcGFyZW5jeSA9IGdlb2pzb24uZHJhd2luZ0luZm8udHJhbnNwYXJlbmN5O1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnN0eWxlKSB7XG4gICAgICBvcHRpb25zLnVzZXJEZWZpbmVkU3R5bGUgPSB0aGlzLm9wdGlvbnMuc3R5bGU7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZW5kZXJlckluZm8udHlwZSkge1xuICAgICAgY2FzZSAnY2xhc3NCcmVha3MnOlxuICAgICAgICB0aGlzLl9jaGVja0ZvclByb3BvcnRpb25hbFN5bWJvbHMoZ2VvanNvbi5nZW9tZXRyeVR5cGUsIHJlbmRlcmVySW5mbyk7XG4gICAgICAgIGlmICh0aGlzLl9oYXNQcm9wb3J0aW9uYWxTeW1ib2xzKSB7XG4gICAgICAgICAgdGhpcy5fY3JlYXRlUG9pbnRMYXllcigpO1xuICAgICAgICAgIHZhciBwUmVuZCA9IGNsYXNzQnJlYWtzUmVuZGVyZXIocmVuZGVyZXJJbmZvLCBvcHRpb25zKTtcbiAgICAgICAgICBwUmVuZC5hdHRhY2hTdHlsZXNUb0xheWVyKHRoaXMuX3BvaW50TGF5ZXIpO1xuICAgICAgICAgIG9wdGlvbnMucHJvcG9ydGlvbmFsUG9seWdvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZCA9IGNsYXNzQnJlYWtzUmVuZGVyZXIocmVuZGVyZXJJbmZvLCBvcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1bmlxdWVWYWx1ZSc6XG4gICAgICAgIHJlbmQgPSB1bmlxdWVWYWx1ZVJlbmRlcmVyKHJlbmRlcmVySW5mbywgb3B0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmVuZCA9IHNpbXBsZVJlbmRlcmVyKHJlbmRlcmVySW5mbywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJlbmQuYXR0YWNoU3R5bGVzVG9MYXllcih0aGlzKTtcbiAgfTtcbn0pO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Q0NFTyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUNuQyxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsVUFBVSxFQUFFLE9BQU8sRUFBRTtBQUM3QyxDQUFBLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7QUFDbEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ3BCLENBQUEsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUN0QixDQUFBLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFDNUIsQ0FBQSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtBQUM5QyxDQUFBLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUN4RSxDQUFBLEtBQUs7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R0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3JDLENBQUEsT0FBTztBQUNQLENBQUEsS0FBSyxDQUFDLENBQUM7O0FBRVAsQ0FBQSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO0FBQ2xCLENBQUEsTUFBTSxtQkFBbUIsRUFBRSxVQUFVLEtBQUssRUFBRTtBQUM1QyxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUNsQyxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7O0FBRXZDLENBQUEsUUFBUSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQzNCLENBQUEsVUFBVSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDMUIsQ0FBQSxVQUFVLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RDLENBQUEsU0FBUzs7QUFFVCxDQUFBLFFBQVEsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUN2RSxDQUFBLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUMvRCxDQUFBLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUMvRCxDQUFBLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFD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
\ No newline at end of file
--- a/src/pyams_gis/resources/js/leaflet-esri-renderers-2.0.2.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-(function(b,a){typeof exports==="object"&&typeof module!=="undefined"?a(exports,require("leaflet")):typeof define==="function"&&define.amd?define(["exports","leaflet"],a):(a((b.L=b.L||{},b.L.esri=b.L.esri||{},b.L.esri.Renderers=b.L.esri.Renderers||{}),b.L))}(this,function(y,j){j="default" in j?j["default"]:j;var g="2.0.2";var p=j.Class.extend({initialize:function(B,A){this._symbolJson=B;this.val=null;this._styles={};this._isDefault=false;this._layerTransparency=1;if(A&&A.layerTransparency){this._layerTransparency=1-(A.layerTransparency/100)}},pixelValue:function(A){return A*1.333},colorValue:function(A){return"rgb("+A[0]+","+A[1]+","+A[2]+")"},alphaValue:function(A){var B=A[3]/255;return B*this._layerTransparency},getSize:function(L,E){var G=L.properties;var J=E.field;var M=0;var C=null;if(J){C=G[J];var B=E.minSize;var K=E.maxSize;var D=E.minDataValue;var I=E.maxDataValue;var A;var F=E.normalizationField;var H=G?parseFloat(G[F]):undefined;if(C===null||(F&&((isNaN(H)||H===0)))){return null}if(!isNaN(H)){C/=H}if(B!==null&&K!==null&&D!==null&&I!==null){if(C<=D){M=B}else{if(C>=I){M=K}else{A=(C-D)/(I-D);M=B+(A*(K-B))}}}M=isNaN(M)?0:M}return M},getColor:function(E,J){if(!(E.properties&&J&&J.field&&J.stops)){return null}var L=E.properties;var Q=L[J.field];var D,A,F,H;var K=J.normalizationField;var C=L?parseFloat(L[K]):undefined;if(Q===null||(K&&((isNaN(C)||C===0)))){return null}if(!isNaN(C)){Q/=C}if(Q<=J.stops[0].value){return J.stops[0].color}var G=J.stops[J.stops.length-1];if(Q>=G.value){return G.color}for(var N=0;N<J.stops.length;N++){var O=J.stops[N];if(O.value<=Q){D=O.color;F=O.value}else{if(O.value>Q){A=O.color;H=O.value;break}}}if(!isNaN(F)&&!isNaN(H)){var I=H-F;if(I>0){var P=(Q-F)/I;if(P){var R=(H-Q)/I;if(R){var B=[];for(var M=0;M<4;M++){B[M]=Math.round(D[M]*R+A[M]*P)}return B}else{return A}}else{return D}}}return null}});var b=j.Path.extend({initialize:function(C,B,A){j.setOptions(this,A);this._size=B;this._latlng=j.latLng(C);this._svgCanvasIncludes()},_svgCanvasIncludes:function(){},_project:function(){this._point=this._map.latLngToLayerPoint(this._latlng)},_update:function(){if(this._map){this._updatePath()}},_updatePath:function(){},setLatLng:function(A){this._latlng=j.latLng(A);this.redraw();return this.fire("move",{latlng:this._latlng})},getLatLng:function(){return this._latlng},setSize:function(A){this._size=A;return this.redraw()},getSize:function(){return this._size}});var m=b.extend({initialize:function(C,B,A){b.prototype.initialize.call(this,C,B,A)},_updatePath:function(){this._renderer._updateCrossMarker(this)},_svgCanvasIncludes:function(){j.Canvas.include({_updateCrossMarker:function(B){var D=B._point;var C=B._size/2;var A=this._ctx;A.beginPath();A.moveTo(D.x,D.y+C);A.lineTo(D.x,D.y-C);this._fillStroke(A,B);A.moveTo(D.x-C,D.y);A.lineTo(D.x+C,D.y);this._fillStroke(A,B)}});j.SVG.include({_updateCrossMarker:function(A){var D=A._point;var C=A._size/2;if(j.Browser.vml){D._round();C=Math.round(C)}var B="M"+D.x+","+(D.y+C)+"L"+D.x+","+(D.y-C)+"M"+(D.x-C)+","+D.y+"L"+(D.x+C)+","+D.y;this._setPath(A,B)}})}});var w=function(C,B,A){return new m(C,B,A)};var o=b.extend({initialize:function(C,B,A){b.prototype.initialize.call(this,C,B,A)},_updatePath:function(){this._renderer._updateXMarker(this)},_svgCanvasIncludes:function(){j.Canvas.include({_updateXMarker:function(B){var D=B._point;var C=B._size/2;var A=this._ctx;A.beginPath();A.moveTo(D.x+C,D.y+C);A.lineTo(D.x-C,D.y-C);this._fillStroke(A,B)}});j.SVG.include({_updateXMarker:function(A){var D=A._point;var C=A._size/2;if(j.Browser.vml){D._round();C=Math.round(C)}var B="M"+(D.x+C)+","+(D.y+C)+"L"+(D.x-C)+","+(D.y-C)+"M"+(D.x-C)+","+(D.y+C)+"L"+(D.x+C)+","+(D.y-C);this._setPath(A,B)}})}});var a=function(C,B,A){return new o(C,B,A)};var u=b.extend({options:{fill:true},initialize:function(C,B,A){b.prototype.initialize.call(this,C,B,A)},_updatePath:function(){this._renderer._updateSquareMarker(this)},_svgCanvasIncludes:function(){j.Canvas.include({_updateSquareMarker:function(B){var D=B._point;var C=B._size/2;var A=this._ctx;A.beginPath();A.moveTo(D.x+C,D.y+C);A.lineTo(D.x-C,D.y+C);A.lineTo(D.x-C,D.y-C);A.lineTo(D.x+C,D.y-C);A.closePath();this._fillStroke(A,B)}});j.SVG.include({_updateSquareMarker:function(A){var D=A._point;var C=A._size/2;if(j.Browser.vml){D._round();C=Math.round(C)}var B="M"+(D.x+C)+","+(D.y+C)+"L"+(D.x-C)+","+(D.y+C)+"L"+(D.x-C)+","+(D.y-C)+"L"+(D.x+C)+","+(D.y-C);B=B+(j.Browser.svg?"z":"x");this._setPath(A,B)}})}});var d=function(C,B,A){return new u(C,B,A)};var n=b.extend({options:{fill:true},initialize:function(C,B,A){b.prototype.initialize.call(this,C,B,A)},_updatePath:function(){this._renderer._updateDiamondMarker(this)},_svgCanvasIncludes:function(){j.Canvas.include({_updateDiamondMarker:function(B){var D=B._point;var C=B._size/2;var A=this._ctx;A.beginPath();A.moveTo(D.x,D.y+C);A.lineTo(D.x-C,D.y);A.lineTo(D.x,D.y-C);A.lineTo(D.x+C,D.y);A.closePath();this._fillStroke(A,B)}});j.SVG.include({_updateDiamondMarker:function(A){var D=A._point;var C=A._size/2;if(j.Browser.vml){D._round();C=Math.round(C)}var B="M"+D.x+","+(D.y+C)+"L"+(D.x-C)+","+D.y+"L"+D.x+","+(D.y-C)+"L"+(D.x+C)+","+D.y;B=B+(j.Browser.svg?"z":"x");this._setPath(A,B)}})}});var v=function(C,B,A){return new n(C,B,A)};var r=p.extend({statics:{MARKERTYPES:["esriSMSCircle","esriSMSCross","esriSMSDiamond","esriSMSSquare","esriSMSX","esriPMS"]},initialize:function(C,B){p.prototype.initialize.call(this,C,B);if(B){this.serviceUrl=B.url}if(C){if(C.type==="esriPMS"){var A=this.serviceUrl+"images/"+this._symbolJson.url;this._iconUrl=B&&B.token?A+"?token="+B.token:A;this._icons={};this.icon=this._createIcon(this._symbolJson)}else{this._fillStyles()}}},_fillStyles:function(){if(this._symbolJson.outline&&this._symbolJson.size>0){this._styles.stroke=true;this._styles.weight=this.pixelValue(this._symbolJson.outline.width);this._styles.color=this.colorValue(this._symbolJson.outline.color);this._styles.opacity=this.alphaValue(this._symbolJson.outline.color)}else{this._styles.stroke=false}if(this._symbolJson.color){this._styles.fillColor=this.colorValue(this._symbolJson.color);this._styles.fillOpacity=this.alphaValue(this._symbolJson.color)}else{this._styles.fillOpacity=0}if(this._symbolJson.style==="esriSMSCircle"){this._styles.radius=this.pixelValue(this._symbolJson.size)/2}},_createIcon:function(B){var E=this.pixelValue(B.width);var A=E;if(B.height){A=this.pixelValue(B.height)}var D=E/2;var F=A/2;if(B.xoffset){D+=this.pixelValue(B.xoffset)}if(B.yoffset){F+=this.pixelValue(B.yoffset)}var C=j.icon({iconUrl:this._iconUrl,iconSize:[E,A],iconAnchor:[D,F]});this._icons[B.width.toString()]=C;return C},_getIcon:function(A){var B=this._icons[A.toString()];if(!B){B=this._createIcon({width:A})}return B},pointToLayer:function(C,H,E,B){var D=this._symbolJson.size||this._symbolJson.width;if(!this._isDefault){if(E.sizeInfo){var G=this.getSize(C,E.sizeInfo);if(G){D=G}}if(E.colorInfo){var A=this.getColor(C,E.colorInfo);if(A){this._styles.fillColor=this.colorValue(A);this._styles.fillOpacity=this.alphaValue(A)}}}if(this._symbolJson.type==="esriPMS"){var F=j.extend({},{icon:this._getIcon(D)},B);return j.marker(H,F)}D=this.pixelValue(D);switch(this._symbolJson.style){case"esriSMSSquare":return d(H,D,j.extend({},this._styles,B));case"esriSMSDiamond":return v(H,D,j.extend({},this._styles,B));case"esriSMSCross":return w(H,D,j.extend({},this._styles,B));case"esriSMSX":return a(H,D,j.extend({},this._styles,B))}this._styles.radius=D/2;return j.circleMarker(H,j.extend({},this._styles,B))}});function l(B,A){return new r(B,A)}var s=p.extend({statics:{LINETYPES:["esriSLSDash","esriSLSDot","esriSLSDashDotDot","esriSLSDashDot","esriSLSSolid"]},initialize:function(B,A){p.prototype.initialize.call(this,B,A);this._fillStyles()},_fillStyles:function(){this._styles.lineCap="butt";this._styles.lineJoin="miter";this._styles.fill=false;this._styles.weight=0;if(!this._symbolJson){return this._styles}if(this._symbolJson.color){this._styles.color=this.colorValue(this._symbolJson.color);this._styles.opacity=this.alphaValue(this._symbolJson.color)}if(!isNaN(this._symbolJson.width)){this._styles.weight=this.pixelValue(this._symbolJson.width);var A=[];switch(this._symbolJson.style){case"esriSLSDash":A=[4,3];break;case"esriSLSDot":A=[1,3];break;case"esriSLSDashDot":A=[8,3,1,3];break;case"esriSLSDashDotDot":A=[8,3,1,3,1,3];break}if(A.length>0){for(var B=0;B<A.length;B++){A[B]*=this._styles.weight}this._styles.dashArray=A.join(",")}}},style:function(B,C){if(!this._isDefault&&C){if(C.sizeInfo){var D=this.pixelValue(this.getSize(B,C.sizeInfo));if(D){this._styles.weight=D}}if(C.colorInfo){var A=this.getColor(B,C.colorInfo);if(A){this._styles.color=this.colorValue(A);this._styles.opacity=this.alphaValue(A)}}}return this._styles}});function i(B,A){return new s(B,A)}var z=p.extend({statics:{POLYGONTYPES:["esriSFSSolid"]},initialize:function(B,A){p.prototype.initialize.call(this,B,A);if(B){this._lineStyles=i(B.outline,A).style();this._fillStyles()}},_fillStyles:function(){if(this._lineStyles){if(this._lineStyles.weight===0){this._styles.stroke=false}else{for(var A in this._lineStyles){this._styles[A]=this._lineStyles[A]}}}if(this._symbolJson){if(this._symbolJson.color&&z.POLYGONTYPES.indexOf(this._symbolJson.style>=0)){this._styles.fill=true;this._styles.fillColor=this.colorValue(this._symbolJson.color);this._styles.fillOpacity=this.alphaValue(this._symbolJson.color)}else{this._styles.fill=false;this._styles.fillOpacity=0}}},style:function(B,C){if(!this._isDefault&&C&&C.colorInfo){var A=this.getColor(B,C.colorInfo);if(A){this._styles.fillColor=this.colorValue(A);this._styles.fillOpacity=this.alphaValue(A)}}return this._styles}});function f(B,A){return new z(B,A)}var t=j.Class.extend({options:{proportionalPolygon:false,clickable:true},initialize:function(B,A){this._rendererJson=B;this._pointSymbols=false;this._symbols=[];this._visualVariables=this._parseVisualVariables(B.visualVariables);j.Util.setOptions(this,A)},_parseVisualVariables:function(C){var A={};if(C){for(var B=0;B<C.length;B++){A[C[B].type]=C[B]}}return A},_createDefaultSymbol:function(){if(this._rendererJson.defaultSymbol){this._defaultSymbol=this._newSymbol(this._rendererJson.defaultSymbol);this._defaultSymbol._isDefault=true}},_newSymbol:function(A){if(A.type==="esriSMS"||A.type==="esriPMS"){this._pointSymbols=true;return l(A,this.options)}if(A.type==="esriSLS"){return i(A,this.options)}if(A.type==="esriSFS"){return f(A,this.options)}},_getSymbol:function(){},attachStylesToLayer:function(A){if(this._pointSymbols){A.options.pointToLayer=j.Util.bind(this.pointToLayer,this)}else{A.options.style=j.Util.bind(this.style,this);A._originalStyle=A.options.style}},pointToLayer:function(B,C){var A=this._getSymbol(B);if(A&&A.pointToLayer){return A.pointToLayer(B,C,this._visualVariables,this.options)}return j.circleMarker(C,{radius:0,opacity:0})},style:function(B){var C;if(this.options.userDefinedStyle){C=this.options.userDefinedStyle(B)}var A=this._getSymbol(B);if(A){return this.mergeStyles(A.style(B,this._visualVariables),C)}else{return this.mergeStyles({opacity:0,fillOpacity:0},C)}},mergeStyles:function(C,D){var B={};var A;for(A in C){if(C.hasOwnProperty(A)){B[A]=C[A]}}if(D){for(A in D){if(D.hasOwnProperty(A)){B[A]=D[A]}}}return B}});var x=t.extend({initialize:function(B,A){t.prototype.initialize.call(this,B,A);this._createSymbol()},_createSymbol:function(){if(this._rendererJson.symbol){this._symbols.push(this._newSymbol(this._rendererJson.symbol))}},_getSymbol:function(){return this._symbols[0]}});function k(B,A){return new x(B,A)}var e=t.extend({initialize:function(B,A){t.prototype.initialize.call(this,B,A);this._field=this._rendererJson.field;if(this._rendererJson.normalizationType&&this._rendererJson.normalizationType==="esriNormalizeByField"){this._normalizationField=this._rendererJson.normalizationField}this._createSymbols()},_createSymbols:function(){var C;var A=this._rendererJson.classBreakInfos;this._symbols=[];for(var B=A.length-1;B>=0;B--){if(this.options.proportionalPolygon&&this._rendererJson.backgroundFillSymbol){C=this._newSymbol(this._rendererJson.backgroundFillSymbol)}else{C=this._newSymbol(A[B].symbol)}C.val=A[B].classMaxValue;this._symbols.push(C)}this._symbols.sort(function(E,D){return E.val>D.val?1:-1});this._createDefaultSymbol();this._maxValue=this._symbols[this._symbols.length-1].val},_getSymbol:function(C){var E=C.properties[this._field];if(this._normalizationField){var A=C.properties[this._normalizationField];if(!isNaN(A)&&A!==0){E=E/A}else{return this._defaultSymbol}}if(E>this._maxValue){return this._defaultSymbol}var D=this._symbols[0];for(var B=this._symbols.length-1;B>=0;B--){if(E>this._symbols[B].val){break}D=this._symbols[B]}return D}});function c(B,A){return new e(B,A)}var h=t.extend({initialize:function(B,A){t.prototype.initialize.call(this,B,A);this._field=this._rendererJson.field1;this._createSymbols()},_createSymbols:function(){var B;var C=this._rendererJson.uniqueValueInfos;for(var A=C.length-1;A>=0;A--){B=this._newSymbol(C[A].symbol);B.val=C[A].value;this._symbols.push(B)}this._createDefaultSymbol()},_getSymbol:function(B){var F=B.properties[this._field];if(this._rendererJson.fieldDelimiter&&this._rendererJson.field2){var D=B.properties[this._rendererJson.field2];if(D){F+=this._rendererJson.fieldDelimiter+D;var C=B.properties[this._rendererJson.field3];if(C){F+=this._rendererJson.fieldDelimiter+C}}}var E=this._defaultSymbol;for(var A=this._symbols.length-1;A>=0;A--){if(this._symbols[A].val==F){E=this._symbols[A]}}return E}});function q(B,A){return new h(B,A)}j.esri.FeatureLayer.addInitHook(function(){if(this.options.ignoreRenderer){return}var A=j.Util.bind(this.onAdd,this);var C=j.Util.bind(this.unbindPopup,this);var B=j.Util.bind(this.onRemove,this);j.Util.bind(this.createNewLayer,this);this.metadata(function(E,D){if(E){return}if(D&&D.drawingInfo){this._setRenderers(D)}if(this._alreadyAdded){this.setStyle(this._originalStyle)}},this);this.onAdd=function(D){A(D);this._addPointLayer(D);this._alreadyAdded=true};this.onRemove=function(F){B(F);if(this._pointLayer){var D=this._pointLayer.getLayers();for(var E in D){F.removeLayer(D[E])}}};this.unbindPopup=function(){C();if(this._pointLayer){var D=this._pointLayer.getLayers();for(var E in D){D[E].unbindPopup()}}};this._addPointLayer=function(D){if(this._pointLayer){this._pointLayer.addTo(D);this._pointLayer.bringToFront()}};this._createPointLayer=function(){if(!this._pointLayer){this._pointLayer=j.geoJson();this._pointLayerIds={};if(this._popup){var D=function(F,E){E.bindPopup(this._popup(F,E),this._popupOptions)};this._pointLayer.options.onEachFeature=j.Util.bind(D,this)}}};this.createNewLayer=function(E){var H=j.GeoJSON.geometryToLayer(E,this.options);if(this._hasProportionalSymbols){var F=this.getPolygonCentroid(E.geometry.coordinates);if(!(isNaN(F[0])||isNaN(F[0]))){this._createPointLayer();var G=E.id.toString();if(!this._pointLayerIds[G]){var D=this.getPointJson(E,F);this._pointLayer.addData(D);this._pointLayerIds[G]=true}this._pointLayer.bringToFront()}}return H};this.getPolygonCentroid=function(K){var N=K[0][0];if(N.length===2){N=K[0]}var G=0;var J=0;var I=0;var D=N.length;var M;var L;var H;for(var F=0,E=D-1;F<D;E=F++){M=N[F];L=N[E];G+=M[0]*L[1];G-=M[1]*L[0];H=M[0]*L[1]-L[0]*M[1];J+=(M[0]+L[0])*H;I+=(M[1]+L[1])*H}H=G*3;return[J/H,I/H]};this.getPointJson=function(D,E){return{type:"Feature",properties:D.properties,id:D.id,geometry:{type:"Point",coordinates:[E[0],E[1]]}}};this._checkForProportionalSymbols=function(D,F){this._hasProportionalSymbols=false;if(D==="esriGeometryPolygon"){if(F.backgroundFillSymbol){this._hasProportionalSymbols=true}if(F.classBreakInfos&&F.classBreakInfos.length){var E=F.classBreakInfos[0].symbol;if(E&&(E.type==="esriSMS"||E.type==="esriPMS")){this._hasProportionalSymbols=true}}}};this._setRenderers=function(F){var D;var G=F.drawingInfo.renderer;var E={url:this.options.url};if(this.options.token){E.token=this.options.token}if(this.options.pane){E.pane=this.options.pane}if(F.drawingInfo.transparency){E.layerTransparency=F.drawingInfo.transparency}if(this.options.style){E.userDefinedStyle=this.options.style}switch(G.type){case"classBreaks":this._checkForProportionalSymbols(F.geometryType,G);if(this._hasProportionalSymbols){this._createPointLayer();var H=c(G,E);H.attachStylesToLayer(this._pointLayer);E.proportionalPolygon=true}D=c(G,E);break;case"uniqueValue":D=q(G,E);break;default:D=k(G,E)}D.attachStylesToLayer(this)}});y.VERSION=g;y.Renderer=t;y.SimpleRenderer=x;y.simpleRenderer=k;y.ClassBreaksRenderer=e;y.classBreaksRenderer=c;y.UniqueValueRenderer=h;y.uniqueValueRenderer=q;y.Symbol=p;y.PointSymbol=r;y.pointSymbol=l;y.LineSymbol=s;y.lineSymbol=i;y.PolygonSymbol=z;y.polygonSymbol=f}));
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-renderers-2.1.2.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,5 @@
+/* esri-leaflet-renderers - v2.1.2 - Mon Jul 06 2020 10:16:26 GMT-0500 (Central Daylight Time)
+ * Copyright (c) 2020 Environmental Systems Research Institute, Inc.
+ * Apache-2.0 */
+!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports,require("leaflet"),require("esri-leaflet"),require("esri-leaflet-cluster")):"function"==typeof define&&define.amd?define(["exports","leaflet","esri-leaflet","esri-leaflet-cluster"],i):i(((t=t||self).L=t.L||{},t.L.esri=t.L.esri||{},t.L.esri.Renderers={}),t.L,t.L.esri,t.L.esri.Cluster)}(this,function(t,v,i,e){"use strict";var o="default"in v?v.default:v,n=v.Class.extend({initialize:function(t,i){this._symbolJson=t,this.val=null,this._styles={},this._isDefault=!1,this._layerTransparency=1,i&&i.layerTransparency&&(this._layerTransparency=1-i.layerTransparency/100)},pixelValue:function(t){return 1.333*t},colorValue:function(t){return"rgb("+t[0]+","+t[1]+","+t[2]+")"},alphaValue:function(t){return t[3]/255*this._layerTransparency},getSize:function(t,i){var e=t.properties,s=i.field,o=0,n=null;if(s){n=e[s];var r=i.minSize,l=i.maxSize,a=i.minDataValue,h=i.maxDataValue,y=i.normalizationField,u=e?parseFloat(e[y]):void 0;if(null===n||y&&(isNaN(u)||0===u))return null;isNaN(u)||(n/=u),null!==r&&null!==l&&null!==a&&null!==h&&(o=n<=a?r:h<=n?l:r+(n-a)/(h-a)*(l-r)),o=isNaN(o)?0:o}return o},getColor:function(t,i){if(!(t.properties&&i&&i.field&&i.stops))return null;var e,s,o,n,r=t.properties,l=r[i.field],a=i.normalizationField,h=r?parseFloat(r[a]):void 0;if(null===l||a&&(isNaN(h)||0===h))return null;if(isNaN(h)||(l/=h),l<=i.stops[0].value)return i.stops[0].color;var y=i.stops[i.stops.length-1];if(l>=y.value)return y.color;for(var u=0;u<i.stops.length;u++){var _=i.stops[u];if(_.value<=l)e=_.color,o=_.value;else if(_.value>l){s=_.color,n=_.value;break}}if(!isNaN(o)&&!isNaN(n)){var c=n-o;if(0<c){var p=(l-o)/c;if(p){var f=(n-l)/c;if(f){for(var d=[],S=0;S<4;S++)d[S]=Math.round(e[S]*f+s[S]*p);return d}return s}return e}}return null}}),s=o.Path.extend({initialize:function(t,i,e){o.setOptions(this,e),this._size=i,this._latlng=o.latLng(t),this._svgCanvasIncludes()},toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})},_svgCanvasIncludes:function(){},_project:function(){this._point=this._map.latLngToLayerPoint(this._latlng)},_update:function(){this._map&&this._updatePath()},_updatePath:function(){},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw(),this.fire("move",{latlng:this._latlng})},getLatLng:function(){return this._latlng},setSize:function(t){return this._size=t,this.redraw()},getSize:function(){return this._size}}),g=s.extend({initialize:function(t,i,e){s.prototype.initialize.call(this,t,i,e)},_updatePath:function(){this._renderer._updateCrossMarker(this)},_svgCanvasIncludes:function(){o.Canvas.include({_updateCrossMarker:function(t){var i=t._point,e=t._size/2,s=this._ctx;s.beginPath(),s.moveTo(i.x,i.y+e),s.lineTo(i.x,i.y-e),this._fillStroke(s,t),s.moveTo(i.x-e,i.y),s.lineTo(i.x+e,i.y),this._fillStroke(s,t)}}),o.SVG.include({_updateCrossMarker:function(t){var i=t._point,e=t._size/2;o.Browser.vml&&(i._round(),e=Math.round(e));var s="M"+i.x+","+(i.y+e)+"L"+i.x+","+(i.y-e)+"M"+(i.x-e)+","+i.y+"L"+(i.x+e)+","+i.y;this._setPath(t,s)}})}}),L=s.extend({initialize:function(t,i,e){s.prototype.initialize.call(this,t,i,e)},_updatePath:function(){this._renderer._updateXMarker(this)},_svgCanvasIncludes:function(){o.Canvas.include({_updateXMarker:function(t){var i=t._point,e=t._size/2,s=this._ctx;s.beginPath(),s.moveTo(i.x+e,i.y+e),s.lineTo(i.x-e,i.y-e),this._fillStroke(s,t)}}),o.SVG.include({_updateXMarker:function(t){var i=t._point,e=t._size/2;o.Browser.vml&&(i._round(),e=Math.round(e));var s="M"+(i.x+e)+","+(i.y+e)+"L"+(i.x-e)+","+(i.y-e)+"M"+(i.x-e)+","+(i.y+e)+"L"+(i.x+e)+","+(i.y-e);this._setPath(t,s)}})}}),x=s.extend({options:{fill:!0},initialize:function(t,i,e){s.prototype.initialize.call(this,t,i,e)},_updatePath:function(){this._renderer._updateSquareMarker(this)},_svgCanvasIncludes:function(){o.Canvas.include({_updateSquareMarker:function(t){var i=t._point,e=t._size/2,s=this._ctx;s.beginPath(),s.moveTo(i.x+e,i.y+e),s.lineTo(i.x-e,i.y+e),s.lineTo(i.x-e,i.y-e),s.lineTo(i.x+e,i.y-e),s.closePath(),this._fillStroke(s,t)}}),o.SVG.include({_updateSquareMarker:function(t){var i=t._point,e=t._size/2;o.Browser.vml&&(i._round(),e=Math.round(e));var s="M"+(i.x+e)+","+(i.y+e)+"L"+(i.x-e)+","+(i.y+e)+"L"+(i.x-e)+","+(i.y-e)+"L"+(i.x+e)+","+(i.y-e);s+=o.Browser.svg?"z":"x",this._setPath(t,s)}})}}),P=s.extend({options:{fill:!0},initialize:function(t,i,e){s.prototype.initialize.call(this,t,i,e)},_updatePath:function(){this._renderer._updateDiamondMarker(this)},_svgCanvasIncludes:function(){o.Canvas.include({_updateDiamondMarker:function(t){var i=t._point,e=t._size/2,s=this._ctx;s.beginPath(),s.moveTo(i.x,i.y+e),s.lineTo(i.x-e,i.y),s.lineTo(i.x,i.y-e),s.lineTo(i.x+e,i.y),s.closePath(),this._fillStroke(s,t)}}),o.SVG.include({_updateDiamondMarker:function(t){var i=t._point,e=t._size/2;o.Browser.vml&&(i._round(),e=Math.round(e));var s="M"+i.x+","+(i.y+e)+"L"+(i.x-e)+","+i.y+"L"+i.x+","+(i.y-e)+"L"+(i.x+e)+","+i.y;s+=o.Browser.svg?"z":"x",this._setPath(t,s)}})}}),r=n.extend({statics:{MARKERTYPES:["esriSMSCircle","esriSMSCross","esriSMSDiamond","esriSMSSquare","esriSMSX","esriPMS"]},initialize:function(t,i){var e,s;n.prototype.initialize.call(this,t,i),i&&(this.serviceUrl=i.url),t&&("esriPMS"===t.type?((s=this._symbolJson.url)&&"http://"===s.substr(0,7)||"https://"===s.substr(0,8)?(e=this.sanitize(s),this._iconUrl=e):(e=this.serviceUrl+"images/"+s,this._iconUrl=i&&i.token?e+"?token="+i.token:e),t.imageData&&(this._iconUrl="data:"+t.contentType+";base64,"+t.imageData),this._icons={},this.icon=this._createIcon(this._symbolJson)):this._fillStyles())},sanitize:function(t){if(!t)return"";var i;try{i=(i=(i=(i=t.replace(/<br>/gi,"\n")).replace(/<p.*>/gi,"\n")).replace(/<a.*href='(.*?)'.*>(.*?)<\/a>/gi," $2 ($1) ")).replace(/<(?:.|\s)*?>/g,"")}catch(t){i=null}return i},_fillStyles:function(){this._symbolJson.outline&&0<this._symbolJson.size&&"esriSLSNull"!==this._symbolJson.outline.style?(this._styles.stroke=!0,this._styles.weight=this.pixelValue(this._symbolJson.outline.width),this._styles.color=this.colorValue(this._symbolJson.outline.color),this._styles.opacity=this.alphaValue(this._symbolJson.outline.color)):this._styles.stroke=!1,this._symbolJson.color?(this._styles.fillColor=this.colorValue(this._symbolJson.color),this._styles.fillOpacity=this.alphaValue(this._symbolJson.color)):this._styles.fillOpacity=0,"esriSMSCircle"===this._symbolJson.style&&(this._styles.radius=this.pixelValue(this._symbolJson.size)/2)},_createIcon:function(t){var i=this.pixelValue(t.width),e=i;t.height&&(e=this.pixelValue(t.height));var s=i/2,o=e/2;t.xoffset&&(s+=this.pixelValue(t.xoffset)),t.yoffset&&(o+=this.pixelValue(t.yoffset));var n=v.icon({iconUrl:this._iconUrl,iconSize:[i,e],iconAnchor:[s,o]});return this._icons[t.width.toString()]=n},_getIcon:function(t){return this._icons[t.toString()]||this._createIcon({width:t})},pointToLayer:function(t,i,e,s){var o,n,r,l,a,h,y,u,_,c,p,f,d,S,m=this._symbolJson.size||this._symbolJson.width;if(this._isDefault||(!e.sizeInfo||(o=this.getSize(t,e.sizeInfo))&&(m=o),!e.colorInfo||(n=this.getColor(t,e.colorInfo))&&(this._styles.fillColor=this.colorValue(n),this._styles.fillOpacity=this.alphaValue(n))),"esriPMS"===this._symbolJson.type){var b=v.extend({},{icon:this._getIcon(m)},s);return v.marker(i,b)}switch(m=this.pixelValue(m),this._symbolJson.style){case"esriSMSSquare":return f=i,d=m,S=v.extend({},this._styles,s),new x(f,d,S);case"esriSMSDiamond":return _=i,c=m,p=v.extend({},this._styles,s),new P(_,c,p);case"esriSMSCross":return h=i,y=m,u=v.extend({},this._styles,s),new g(h,y,u);case"esriSMSX":return r=i,l=m,a=v.extend({},this._styles,s),new L(r,l,a)}return this._styles.radius=m/2,v.circleMarker(i,v.extend({},this._styles,s))}});function l(t,i){return new r(t,i)}var a=n.extend({statics:{LINETYPES:["esriSLSDash","esriSLSDot","esriSLSDashDotDot","esriSLSDashDot","esriSLSSolid"]},initialize:function(t,i){n.prototype.initialize.call(this,t,i),this._fillStyles()},_fillStyles:function(){if(this._styles.lineCap="butt",this._styles.lineJoin="miter",this._styles.fill=!1,this._styles.weight=0,!this._symbolJson)return this._styles;if(this._symbolJson.color&&(this._styles.color=this.colorValue(this._symbolJson.color),this._styles.opacity=this.alphaValue(this._symbolJson.color)),!isNaN(this._symbolJson.width)){this._styles.weight=this.pixelValue(this._symbolJson.width);var t=[];switch(this._symbolJson.style){case"esriSLSDash":t=[4,3];break;case"esriSLSDot":t=[1,3];break;case"esriSLSDashDot":t=[8,3,1,3];break;case"esriSLSDashDotDot":t=[8,3,1,3,1,3]}if(0<t.length){for(var i=0;i<t.length;i++)t[i]*=this._styles.weight;this._styles.dashArray=t.join(",")}}},style:function(t,i){var e,s;return!this._isDefault&&i&&(!i.sizeInfo||(e=this.pixelValue(this.getSize(t,i.sizeInfo)))&&(this._styles.weight=e),!i.colorInfo||(s=this.getColor(t,i.colorInfo))&&(this._styles.color=this.colorValue(s),this._styles.opacity=this.alphaValue(s))),this._styles}});function h(t,i){return new a(t,i)}var y=n.extend({statics:{POLYGONTYPES:["esriSFSSolid"]},initialize:function(t,i){n.prototype.initialize.call(this,t,i),t&&(t.outline&&"esriSLSNull"===t.outline.style?this._lineStyles={weight:0}:this._lineStyles=h(t.outline,i).style(),this._fillStyles())},_fillStyles:function(){if(this._lineStyles)if(0===this._lineStyles.weight)this._styles.stroke=!1;else for(var t in this._lineStyles)this._styles[t]=this._lineStyles[t];this._symbolJson&&(this._symbolJson.color&&y.POLYGONTYPES.indexOf(0<=this._symbolJson.style)?(this._styles.fill=!0,this._styles.fillColor=this.colorValue(this._symbolJson.color),this._styles.fillOpacity=this.alphaValue(this._symbolJson.color)):(this._styles.fill=!1,this._styles.fillOpacity=0))},style:function(t,i){var e;return this._isDefault||!i||!i.colorInfo||(e=this.getColor(t,i.colorInfo))&&(this._styles.fillColor=this.colorValue(e),this._styles.fillOpacity=this.alphaValue(e)),this._styles}});function u(t,i){return new y(t,i)}var _=v.Class.extend({options:{proportionalPolygon:!1,clickable:!0},initialize:function(t,i){this._rendererJson=t,this._pointSymbols=!1,this._symbols=[],this._visualVariables=this._parseVisualVariables(t.visualVariables),v.Util.setOptions(this,i)},_parseVisualVariables:function(t){var i={};if(t)for(var e=0;e<t.length;e++)i[t[e].type]=t[e];return i},_createDefaultSymbol:function(){this._rendererJson.defaultSymbol&&(this._defaultSymbol=this._newSymbol(this._rendererJson.defaultSymbol),this._defaultSymbol._isDefault=!0)},_newSymbol:function(t){return"esriSMS"===t.type||"esriPMS"===t.type?(this._pointSymbols=!0,l(t,this.options)):"esriSLS"===t.type?h(t,this.options):"esriSFS"===t.type?u(t,this.options):void 0},_getSymbol:function(){},attachStylesToLayer:function(t){this._pointSymbols?t.options.pointToLayer=v.Util.bind(this.pointToLayer,this):(t.options.style=v.Util.bind(this.style,this),t._originalStyle=t.options.style)},pointToLayer:function(t,i){var e=this._getSymbol(t);return e&&e.pointToLayer?e.pointToLayer(t,i,this._visualVariables,this.options):v.circleMarker(i,{radius:0,opacity:0})},style:function(t){var i;this.options.userDefinedStyle&&(i=this.options.userDefinedStyle(t));var e=this._getSymbol(t);return e?this.mergeStyles(e.style(t,this._visualVariables),i):this.mergeStyles({opacity:0,fillOpacity:0},i)},mergeStyles:function(t,i){var e,s={};for(e in t)t.hasOwnProperty(e)&&(s[e]=t[e]);if(i)for(e in i)i.hasOwnProperty(e)&&(s[e]=i[e]);return s}}),c=_.extend({initialize:function(t,i){_.prototype.initialize.call(this,t,i),this._createSymbol()},_createSymbol:function(){this._rendererJson.symbol&&this._symbols.push(this._newSymbol(this._rendererJson.symbol))},_getSymbol:function(){return this._symbols[0]}});function p(t,i){return new c(t,i)}var f=_.extend({initialize:function(t,i){_.prototype.initialize.call(this,t,i),this._field=this._rendererJson.field,this._rendererJson.normalizationType&&"esriNormalizeByField"===this._rendererJson.normalizationType&&(this._normalizationField=this._rendererJson.normalizationField),this._createSymbols()},_createSymbols:function(){var t,i=this._rendererJson.classBreakInfos;this._symbols=[];for(var e=i.length-1;0<=e;e--)(t=this.options.proportionalPolygon&&this._rendererJson.backgroundFillSymbol?this._newSymbol(this._rendererJson.backgroundFillSymbol):this._newSymbol(i[e].symbol)).val=i[e].classMaxValue,this._symbols.push(t);this._symbols.sort(function(t,i){return t.val>i.val?1:-1}),this._createDefaultSymbol(),this._maxValue=this._symbols[this._symbols.length-1].val},_getSymbol:function(t){var i=t.properties[this._field];if(this._normalizationField){var e=t.properties[this._normalizationField];if(isNaN(e)||0===e)return this._defaultSymbol;i/=e}if(i>this._maxValue)return this._defaultSymbol;for(var s=this._symbols[0],o=this._symbols.length-1;0<=o&&!(i>this._symbols[o].val);o--)s=this._symbols[o];return s}});function d(t,i){return new f(t,i)}var S=_.extend({initialize:function(t,i){_.prototype.initialize.call(this,t,i),this._field=this._rendererJson.field1,this._createSymbols()},_createSymbols:function(){for(var t,i=this._rendererJson.uniqueValueInfos,e=i.length-1;0<=e;e--)(t=this._newSymbol(i[e].symbol)).val=i[e].value,this._symbols.push(t);this._createDefaultSymbol()},_getSymbol:function(t){var i,e,s=t.properties[this._field];this._rendererJson.fieldDelimiter&&this._rendererJson.field2&&((i=t.properties[this._rendererJson.field2])&&(s+=this._rendererJson.fieldDelimiter+i,(e=t.properties[this._rendererJson.field3])&&(s+=this._rendererJson.fieldDelimiter+e)));for(var o=this._defaultSymbol,n=this._symbols.length-1;0<=n;n--)this._symbols[n].val==s&&(o=this._symbols[n]);return o}});function m(t,i){return new S(t,i)}function b(){var s,e,o;this.options.ignoreRenderer||(s=v.Util.bind(this.onAdd,this),e=v.Util.bind(this.unbindPopup,this),o=v.Util.bind(this.onRemove,this),v.Util.bind(this.createNewLayer,this),this.onAdd=function(e){this.metadata(function(t,i){t?console.warn("failed to load metadata from the service."):i&&i.drawingInfo&&(this.options.drawingInfo&&(i.drawingInfo=this.options.drawingInfo),"overlayPane"===this.options.pane&&"esriGeometryPoint"===i.geometryType&&(this.options.pane="markerPane"),this._setRenderers(i),s(e),this._addPointLayer(e))},this)},this.onRemove=function(t){if(o(t),this._pointLayer){var i=this._pointLayer.getLayers();for(var e in i)t.removeLayer(i[e])}},this.unbindPopup=function(){if(e(),this._pointLayer){var t=this._pointLayer.getLayers();for(var i in t)t[i].unbindPopup()}},this._addPointLayer=function(t){this._pointLayer&&(this._pointLayer.addTo(t),this._pointLayer.bringToFront())},this._createPointLayer=function(){this._pointLayer||(this._pointLayer=v.geoJson(),this._pointLayerIds={},this._popup&&(this._pointLayer.options.onEachFeature=v.Util.bind(function(t,i){i.bindPopup(this._popup(t,i),this._popupOptions)},this)))},this.createNewLayer=function(t){var i,e,s,o=v.GeoJSON.geometryToLayer(t,this.options);return this._hasProportionalSymbols&&(i=this.getPolygonCentroid(t.geometry.coordinates),isNaN(i[0])||isNaN(i[0])||(this._createPointLayer(),e=t.id.toString(),this._pointLayerIds[e]||(s=this.getPointJson(t,i),this._pointLayer.addData(s),this._pointLayerIds[e]=!0),this._pointLayer.bringToFront())),o},this.getPolygonCentroid=function(t){var i=t[0][0];2===i.length&&(i=t[0]);for(var e,s,o,n=0,r=0,l=0,a=i.length,h=0,y=a-1;h<a;y=h++)e=i[h],s=i[y],n+=e[0]*s[1],n-=e[1]*s[0],o=e[0]*s[1]-s[0]*e[1],r+=(e[0]+s[0])*o,l+=(e[1]+s[1])*o;return[r/(o=3*n),l/o]},this.getPointJson=function(t,i){return{type:"Feature",properties:t.properties,id:t.id,geometry:{type:"Point",coordinates:[i[0],i[1]]}}},this._checkForProportionalSymbols=function(t,i){var e;this._hasProportionalSymbols=!1,"esriGeometryPolygon"===t&&(i.backgroundFillSymbol&&(this._hasProportionalSymbols=!0),i.classBreakInfos&&i.classBreakInfos.length&&(!(e=i.classBreakInfos[0].symbol)||"esriSMS"!==e.type&&"esriPMS"!==e.type||(this._hasProportionalSymbols=!0)))},this._setRenderers=function(t){var i,e=t.drawingInfo.renderer,s={url:this.options.url};switch(this.options.token&&(s.token=this.options.token),this.options.pane&&(s.pane=this.options.pane),t.drawingInfo.transparency&&(s.layerTransparency=t.drawingInfo.transparency),this.options.style&&(s.userDefinedStyle=this.options.style),e.type){case"classBreaks":this._checkForProportionalSymbols(t.geometryType,e),this._hasProportionalSymbols&&(this._createPointLayer(),d(e,s).attachStylesToLayer(this._pointLayer),s.proportionalPolygon=!0),i=d(e,s);break;case"uniqueValue":i=m(e,s);break;default:i=p(e,s)}i.attachStylesToLayer(this)})}i.FeatureLayer.addInitHook(b),void 0!==e&&e.FeatureLayer.addInitHook(b),t.ClassBreaksRenderer=f,t.LineSymbol=a,t.PointSymbol=r,t.PolygonSymbol=y,t.Renderer=_,t.SimpleRenderer=c,t.Symbol=n,t.UniqueValueRenderer=S,t.VERSION="2.1.2",t.classBreaksRenderer=d,t.lineSymbol=h,t.pointSymbol=l,t.polygonSymbol=u,t.simpleRenderer=p,t.uniqueValueRenderer=m,Object.defineProperty(t,"__esModule",{value:!0})});
+//# sourceMappingURL=esri-leaflet-renderers.js.map
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-renderers-2.1.2.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports,require("leaflet"),require("esri-leaflet"),require("esri-leaflet-cluster")):"function"==typeof define&&define.amd?define(["exports","leaflet","esri-leaflet","esri-leaflet-cluster"],i):i(((t=t||self).L=t.L||{},t.L.esri=t.L.esri||{},t.L.esri.Renderers={}),t.L,t.L.esri,t.L.esri.Cluster)}(this,(function(t,i,e,s){"use strict";var o="default"in i?i.default:i,n=i.Class.extend({initialize:function(t,i){this._symbolJson=t,this.val=null,this._styles={},this._isDefault=!1,this._layerTransparency=1,i&&i.layerTransparency&&(this._layerTransparency=1-i.layerTransparency/100)},pixelValue:function(t){return 1.333*t},colorValue:function(t){return"rgb("+t[0]+","+t[1]+","+t[2]+")"},alphaValue:function(t){return t[3]/255*this._layerTransparency},getSize:function(t,i){var e=t.properties,s=i.field,o=0,n=null;if(s){n=e[s];var r=i.minSize,l=i.maxSize,a=i.minDataValue,h=i.maxDataValue,y=i.normalizationField,u=e?parseFloat(e[y]):void 0;if(null===n||y&&(isNaN(u)||0===u))return null;isNaN(u)||(n/=u),null!==r&&null!==l&&null!==a&&null!==h&&(o=n<=a?r:h<=n?l:r+(n-a)/(h-a)*(l-r)),o=isNaN(o)?0:o}return o},getColor:function(t,i){if(!(t.properties&&i&&i.field&&i.stops))return null;var e,s,o,n,r=t.properties,l=r[i.field],a=i.normalizationField,h=r?parseFloat(r[a]):void 0;if(null===l||a&&(isNaN(h)||0===h))return null;if(isNaN(h)||(l/=h),l<=i.stops[0].value)return i.stops[0].color;var y=i.stops[i.stops.length-1];if(l>=y.value)return y.color;for(var u=0;u<i.stops.length;u++){var _=i.stops[u];if(_.value<=l)e=_.color,o=_.value;else if(_.value>l){s=_.color,n=_.value;break}}if(!isNaN(o)&&!isNaN(n)){var c=n-o;if(0<c){var p=(l-o)/c;if(p){var f=(n-l)/c;if(f){for(var d=[],S=0;S<4;S++)d[S]=Math.round(e[S]*f+s[S]*p);return d}return s}return e}}return null}}),r=o.Path.extend({initialize:function(t,i,e){o.setOptions(this,e),this._size=i,this._latlng=o.latLng(t),this._svgCanvasIncludes()},toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})},_svgCanvasIncludes:function(){},_project:function(){this._point=this._map.latLngToLayerPoint(this._latlng)},_update:function(){this._map&&this._updatePath()},_updatePath:function(){},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw(),this.fire("move",{latlng:this._latlng})},getLatLng:function(){return this._latlng},setSize:function(t){return this._size=t,this.redraw()},getSize:function(){return this._size}}),l=r.extend({initialize:function(t,i,e){r.prototype.initialize.call(this,t,i,e)},_updatePath:function(){this._renderer._updateCrossMarker(this)},_svgCanvasIncludes:function(){o.Canvas.include({_updateCrossMarker:function(t){var i=t._point,e=t._size/2,s=this._ctx;s.beginPath(),s.moveTo(i.x,i.y+e),s.lineTo(i.x,i.y-e),this._fillStroke(s,t),s.moveTo(i.x-e,i.y),s.lineTo(i.x+e,i.y),this._fillStroke(s,t)}}),o.SVG.include({_updateCrossMarker:function(t){var i=t._point,e=t._size/2;o.Browser.vml&&(i._round(),e=Math.round(e));var s="M"+i.x+","+(i.y+e)+"L"+i.x+","+(i.y-e)+"M"+(i.x-e)+","+i.y+"L"+(i.x+e)+","+i.y;this._setPath(t,s)}})}}),a=r.extend({initialize:function(t,i,e){r.prototype.initialize.call(this,t,i,e)},_updatePath:function(){this._renderer._updateXMarker(this)},_svgCanvasIncludes:function(){o.Canvas.include({_updateXMarker:function(t){var i=t._point,e=t._size/2,s=this._ctx;s.beginPath(),s.moveTo(i.x+e,i.y+e),s.lineTo(i.x-e,i.y-e),this._fillStroke(s,t)}}),o.SVG.include({_updateXMarker:function(t){var i=t._point,e=t._size/2;o.Browser.vml&&(i._round(),e=Math.round(e));var s="M"+(i.x+e)+","+(i.y+e)+"L"+(i.x-e)+","+(i.y-e)+"M"+(i.x-e)+","+(i.y+e)+"L"+(i.x+e)+","+(i.y-e);this._setPath(t,s)}})}}),h=r.extend({options:{fill:!0},initialize:function(t,i,e){r.prototype.initialize.call(this,t,i,e)},_updatePath:function(){this._renderer._updateSquareMarker(this)},_svgCanvasIncludes:function(){o.Canvas.include({_updateSquareMarker:function(t){var i=t._point,e=t._size/2,s=this._ctx;s.beginPath(),s.moveTo(i.x+e,i.y+e),s.lineTo(i.x-e,i.y+e),s.lineTo(i.x-e,i.y-e),s.lineTo(i.x+e,i.y-e),s.closePath(),this._fillStroke(s,t)}}),o.SVG.include({_updateSquareMarker:function(t){var i=t._point,e=t._size/2;o.Browser.vml&&(i._round(),e=Math.round(e));var s="M"+(i.x+e)+","+(i.y+e)+"L"+(i.x-e)+","+(i.y+e)+"L"+(i.x-e)+","+(i.y-e)+"L"+(i.x+e)+","+(i.y-e);s+=o.Browser.svg?"z":"x",this._setPath(t,s)}})}}),y=r.extend({options:{fill:!0},initialize:function(t,i,e){r.prototype.initialize.call(this,t,i,e)},_updatePath:function(){this._renderer._updateDiamondMarker(this)},_svgCanvasIncludes:function(){o.Canvas.include({_updateDiamondMarker:function(t){var i=t._point,e=t._size/2,s=this._ctx;s.beginPath(),s.moveTo(i.x,i.y+e),s.lineTo(i.x-e,i.y),s.lineTo(i.x,i.y-e),s.lineTo(i.x+e,i.y),s.closePath(),this._fillStroke(s,t)}}),o.SVG.include({_updateDiamondMarker:function(t){var i=t._point,e=t._size/2;o.Browser.vml&&(i._round(),e=Math.round(e));var s="M"+i.x+","+(i.y+e)+"L"+(i.x-e)+","+i.y+"L"+i.x+","+(i.y-e)+"L"+(i.x+e)+","+i.y;s+=o.Browser.svg?"z":"x",this._setPath(t,s)}})}}),u=n.extend({statics:{MARKERTYPES:["esriSMSCircle","esriSMSCross","esriSMSDiamond","esriSMSSquare","esriSMSX","esriPMS"]},initialize:function(t,i){var e,s;n.prototype.initialize.call(this,t,i),i&&(this.serviceUrl=i.url),t&&("esriPMS"===t.type?((s=this._symbolJson.url)&&"http://"===s.substr(0,7)||"https://"===s.substr(0,8)?(e=this.sanitize(s),this._iconUrl=e):(e=this.serviceUrl+"images/"+s,this._iconUrl=i&&i.token?e+"?token="+i.token:e),t.imageData&&(this._iconUrl="data:"+t.contentType+";base64,"+t.imageData),this._icons={},this.icon=this._createIcon(this._symbolJson)):this._fillStyles())},sanitize:function(t){if(!t)return"";var i;try{i=(i=(i=(i=t.replace(/<br>/gi,"\n")).replace(/<p.*>/gi,"\n")).replace(/<a.*href='(.*?)'.*>(.*?)<\/a>/gi," $2 ($1) ")).replace(/<(?:.|\s)*?>/g,"")}catch(t){i=null}return i},_fillStyles:function(){this._symbolJson.outline&&0<this._symbolJson.size&&"esriSLSNull"!==this._symbolJson.outline.style?(this._styles.stroke=!0,this._styles.weight=this.pixelValue(this._symbolJson.outline.width),this._styles.color=this.colorValue(this._symbolJson.outline.color),this._styles.opacity=this.alphaValue(this._symbolJson.outline.color)):this._styles.stroke=!1,this._symbolJson.color?(this._styles.fillColor=this.colorValue(this._symbolJson.color),this._styles.fillOpacity=this.alphaValue(this._symbolJson.color)):this._styles.fillOpacity=0,"esriSMSCircle"===this._symbolJson.style&&(this._styles.radius=this.pixelValue(this._symbolJson.size)/2)},_createIcon:function(t){var e=this.pixelValue(t.width),s=e;t.height&&(s=this.pixelValue(t.height));var o=e/2,n=s/2;t.xoffset&&(o+=this.pixelValue(t.xoffset)),t.yoffset&&(n+=this.pixelValue(t.yoffset));var r=i.icon({iconUrl:this._iconUrl,iconSize:[e,s],iconAnchor:[o,n]});return this._icons[t.width.toString()]=r},_getIcon:function(t){return this._icons[t.toString()]||this._createIcon({width:t})},pointToLayer:function(t,e,s,o){var n,r,u,_,c,p,f,d,S,m,b,v,g,L,x=this._symbolJson.size||this._symbolJson.width;if(this._isDefault||(!s.sizeInfo||(n=this.getSize(t,s.sizeInfo))&&(x=n),!s.colorInfo||(r=this.getColor(t,s.colorInfo))&&(this._styles.fillColor=this.colorValue(r),this._styles.fillOpacity=this.alphaValue(r))),"esriPMS"===this._symbolJson.type){var P=i.extend({},{icon:this._getIcon(x)},o);return i.marker(e,P)}switch(x=this.pixelValue(x),this._symbolJson.style){case"esriSMSSquare":return v=e,g=x,L=i.extend({},this._styles,o),new h(v,g,L);case"esriSMSDiamond":return S=e,m=x,b=i.extend({},this._styles,o),new y(S,m,b);case"esriSMSCross":return p=e,f=x,d=i.extend({},this._styles,o),new l(p,f,d);case"esriSMSX":return u=e,_=x,c=i.extend({},this._styles,o),new a(u,_,c)}return this._styles.radius=x/2,i.circleMarker(e,i.extend({},this._styles,o))}});function _(t,i){return new u(t,i)}var c=n.extend({statics:{LINETYPES:["esriSLSDash","esriSLSDot","esriSLSDashDotDot","esriSLSDashDot","esriSLSSolid"]},initialize:function(t,i){n.prototype.initialize.call(this,t,i),this._fillStyles()},_fillStyles:function(){if(this._styles.lineCap="butt",this._styles.lineJoin="miter",this._styles.fill=!1,this._styles.weight=0,!this._symbolJson)return this._styles;if(this._symbolJson.color&&(this._styles.color=this.colorValue(this._symbolJson.color),this._styles.opacity=this.alphaValue(this._symbolJson.color)),!isNaN(this._symbolJson.width)){this._styles.weight=this.pixelValue(this._symbolJson.width);var t=[];switch(this._symbolJson.style){case"esriSLSDash":t=[4,3];break;case"esriSLSDot":t=[1,3];break;case"esriSLSDashDot":t=[8,3,1,3];break;case"esriSLSDashDotDot":t=[8,3,1,3,1,3]}if(0<t.length){for(var i=0;i<t.length;i++)t[i]*=this._styles.weight;this._styles.dashArray=t.join(",")}}},style:function(t,i){var e,s;return!this._isDefault&&i&&(!i.sizeInfo||(e=this.pixelValue(this.getSize(t,i.sizeInfo)))&&(this._styles.weight=e),!i.colorInfo||(s=this.getColor(t,i.colorInfo))&&(this._styles.color=this.colorValue(s),this._styles.opacity=this.alphaValue(s))),this._styles}});function p(t,i){return new c(t,i)}var f=n.extend({statics:{POLYGONTYPES:["esriSFSSolid"]},initialize:function(t,i){n.prototype.initialize.call(this,t,i),t&&(t.outline&&"esriSLSNull"===t.outline.style?this._lineStyles={weight:0}:this._lineStyles=p(t.outline,i).style(),this._fillStyles())},_fillStyles:function(){if(this._lineStyles)if(0===this._lineStyles.weight)this._styles.stroke=!1;else for(var t in this._lineStyles)this._styles[t]=this._lineStyles[t];this._symbolJson&&(this._symbolJson.color&&f.POLYGONTYPES.indexOf(0<=this._symbolJson.style)?(this._styles.fill=!0,this._styles.fillColor=this.colorValue(this._symbolJson.color),this._styles.fillOpacity=this.alphaValue(this._symbolJson.color)):(this._styles.fill=!1,this._styles.fillOpacity=0))},style:function(t,i){var e;return this._isDefault||!i||!i.colorInfo||(e=this.getColor(t,i.colorInfo))&&(this._styles.fillColor=this.colorValue(e),this._styles.fillOpacity=this.alphaValue(e)),this._styles}});function d(t,i){return new f(t,i)}var S=i.Class.extend({options:{proportionalPolygon:!1,clickable:!0},initialize:function(t,e){this._rendererJson=t,this._pointSymbols=!1,this._symbols=[],this._visualVariables=this._parseVisualVariables(t.visualVariables),i.Util.setOptions(this,e)},_parseVisualVariables:function(t){var i={};if(t)for(var e=0;e<t.length;e++)i[t[e].type]=t[e];return i},_createDefaultSymbol:function(){this._rendererJson.defaultSymbol&&(this._defaultSymbol=this._newSymbol(this._rendererJson.defaultSymbol),this._defaultSymbol._isDefault=!0)},_newSymbol:function(t){return"esriSMS"===t.type||"esriPMS"===t.type?(this._pointSymbols=!0,_(t,this.options)):"esriSLS"===t.type?p(t,this.options):"esriSFS"===t.type?d(t,this.options):void 0},_getSymbol:function(){},attachStylesToLayer:function(t){this._pointSymbols?t.options.pointToLayer=i.Util.bind(this.pointToLayer,this):(t.options.style=i.Util.bind(this.style,this),t._originalStyle=t.options.style)},pointToLayer:function(t,e){var s=this._getSymbol(t);return s&&s.pointToLayer?s.pointToLayer(t,e,this._visualVariables,this.options):i.circleMarker(e,{radius:0,opacity:0})},style:function(t){var i;this.options.userDefinedStyle&&(i=this.options.userDefinedStyle(t));var e=this._getSymbol(t);return e?this.mergeStyles(e.style(t,this._visualVariables),i):this.mergeStyles({opacity:0,fillOpacity:0},i)},mergeStyles:function(t,i){var e,s={};for(e in t)t.hasOwnProperty(e)&&(s[e]=t[e]);if(i)for(e in i)i.hasOwnProperty(e)&&(s[e]=i[e]);return s}}),m=S.extend({initialize:function(t,i){S.prototype.initialize.call(this,t,i),this._createSymbol()},_createSymbol:function(){this._rendererJson.symbol&&this._symbols.push(this._newSymbol(this._rendererJson.symbol))},_getSymbol:function(){return this._symbols[0]}});function b(t,i){return new m(t,i)}var v=S.extend({initialize:function(t,i){S.prototype.initialize.call(this,t,i),this._field=this._rendererJson.field,this._rendererJson.normalizationType&&"esriNormalizeByField"===this._rendererJson.normalizationType&&(this._normalizationField=this._rendererJson.normalizationField),this._createSymbols()},_createSymbols:function(){var t,i=this._rendererJson.classBreakInfos;this._symbols=[];for(var e=i.length-1;0<=e;e--)(t=this.options.proportionalPolygon&&this._rendererJson.backgroundFillSymbol?this._newSymbol(this._rendererJson.backgroundFillSymbol):this._newSymbol(i[e].symbol)).val=i[e].classMaxValue,this._symbols.push(t);this._symbols.sort((function(t,i){return t.val>i.val?1:-1})),this._createDefaultSymbol(),this._maxValue=this._symbols[this._symbols.length-1].val},_getSymbol:function(t){var i=t.properties[this._field];if(this._normalizationField){var e=t.properties[this._normalizationField];if(isNaN(e)||0===e)return this._defaultSymbol;i/=e}if(i>this._maxValue)return this._defaultSymbol;for(var s=this._symbols[0],o=this._symbols.length-1;0<=o&&!(i>this._symbols[o].val);o--)s=this._symbols[o];return s}});function g(t,i){return new v(t,i)}var L=S.extend({initialize:function(t,i){S.prototype.initialize.call(this,t,i),this._field=this._rendererJson.field1,this._createSymbols()},_createSymbols:function(){for(var t,i=this._rendererJson.uniqueValueInfos,e=i.length-1;0<=e;e--)(t=this._newSymbol(i[e].symbol)).val=i[e].value,this._symbols.push(t);this._createDefaultSymbol()},_getSymbol:function(t){var i,e,s=t.properties[this._field];this._rendererJson.fieldDelimiter&&this._rendererJson.field2&&(i=t.properties[this._rendererJson.field2])&&(s+=this._rendererJson.fieldDelimiter+i,(e=t.properties[this._rendererJson.field3])&&(s+=this._rendererJson.fieldDelimiter+e));for(var o=this._defaultSymbol,n=this._symbols.length-1;0<=n;n--)this._symbols[n].val==s&&(o=this._symbols[n]);return o}});function x(t,i){return new L(t,i)}function P(){var t,e,s;this.options.ignoreRenderer||(t=i.Util.bind(this.onAdd,this),e=i.Util.bind(this.unbindPopup,this),s=i.Util.bind(this.onRemove,this),i.Util.bind(this.createNewLayer,this),this.onAdd=function(i){this.metadata((function(e,s){e?console.warn("failed to load metadata from the service."):s&&s.drawingInfo&&(this.options.drawingInfo&&(s.drawingInfo=this.options.drawingInfo),"overlayPane"===this.options.pane&&"esriGeometryPoint"===s.geometryType&&(this.options.pane="markerPane"),this._setRenderers(s),t(i),this._addPointLayer(i))}),this)},this.onRemove=function(t){if(s(t),this._pointLayer){var i=this._pointLayer.getLayers();for(var e in i)t.removeLayer(i[e])}},this.unbindPopup=function(){if(e(),this._pointLayer){var t=this._pointLayer.getLayers();for(var i in t)t[i].unbindPopup()}},this._addPointLayer=function(t){this._pointLayer&&(this._pointLayer.addTo(t),this._pointLayer.bringToFront())},this._createPointLayer=function(){this._pointLayer||(this._pointLayer=i.geoJson(),this._pointLayerIds={},this._popup&&(this._pointLayer.options.onEachFeature=i.Util.bind((function(t,i){i.bindPopup(this._popup(t,i),this._popupOptions)}),this)))},this.createNewLayer=function(t){var e,s,o,n=i.GeoJSON.geometryToLayer(t,this.options);return this._hasProportionalSymbols&&(e=this.getPolygonCentroid(t.geometry.coordinates),isNaN(e[0])||isNaN(e[0])||(this._createPointLayer(),s=t.id.toString(),this._pointLayerIds[s]||(o=this.getPointJson(t,e),this._pointLayer.addData(o),this._pointLayerIds[s]=!0),this._pointLayer.bringToFront())),n},this.getPolygonCentroid=function(t){var i=t[0][0];2===i.length&&(i=t[0]);for(var e,s,o,n=0,r=0,l=0,a=i.length,h=0,y=a-1;h<a;y=h++)e=i[h],s=i[y],n+=e[0]*s[1],n-=e[1]*s[0],o=e[0]*s[1]-s[0]*e[1],r+=(e[0]+s[0])*o,l+=(e[1]+s[1])*o;return[r/(o=3*n),l/o]},this.getPointJson=function(t,i){return{type:"Feature",properties:t.properties,id:t.id,geometry:{type:"Point",coordinates:[i[0],i[1]]}}},this._checkForProportionalSymbols=function(t,i){var e;this._hasProportionalSymbols=!1,"esriGeometryPolygon"===t&&(i.backgroundFillSymbol&&(this._hasProportionalSymbols=!0),i.classBreakInfos&&i.classBreakInfos.length&&(!(e=i.classBreakInfos[0].symbol)||"esriSMS"!==e.type&&"esriPMS"!==e.type||(this._hasProportionalSymbols=!0)))},this._setRenderers=function(t){var i,e=t.drawingInfo.renderer,s={url:this.options.url};switch(this.options.token&&(s.token=this.options.token),this.options.pane&&(s.pane=this.options.pane),t.drawingInfo.transparency&&(s.layerTransparency=t.drawingInfo.transparency),this.options.style&&(s.userDefinedStyle=this.options.style),e.type){case"classBreaks":this._checkForProportionalSymbols(t.geometryType,e),this._hasProportionalSymbols&&(this._createPointLayer(),g(e,s).attachStylesToLayer(this._pointLayer),s.proportionalPolygon=!0),i=g(e,s);break;case"uniqueValue":i=x(e,s);break;default:i=b(e,s)}i.attachStylesToLayer(this)})}e.FeatureLayer.addInitHook(P),void 0!==s&&s.FeatureLayer.addInitHook(P),t.ClassBreaksRenderer=v,t.LineSymbol=c,t.PointSymbol=u,t.PolygonSymbol=f,t.Renderer=S,t.SimpleRenderer=m,t.Symbol=n,t.UniqueValueRenderer=L,t.VERSION="2.1.2",t.classBreaksRenderer=g,t.lineSymbol=p,t.pointSymbol=_,t.polygonSymbol=d,t.simpleRenderer=b,t.uniqueValueRenderer=x,Object.defineProperty(t,"__esModule",{value:!0})}));
--- a/src/pyams_gis/resources/js/leaflet-esri-vector-1.0.6.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,785 +0,0 @@
-/* esri-leaflet-vector - v1.0.6 - Wed Jan 04 2017 15:02:16 GMT-0800 (PST)
- * Copyright (c) 2017 Environmental Systems Research Institute, Inc.
- * Apache-2.0 */
-(function (global, factory) {
-	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('esri-leaflet')) :
-	typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'esri-leaflet'], factory) :
-	(factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.Vector = global.L.esri.Vector || {}),global.L,global.L.esri));
-}(this, function (exports,L$1,esriLeaflet) { 'use strict';
-
-	L$1 = 'default' in L$1 ? L$1['default'] : L$1;
-
-	var version = "1.0.6";
-
-	(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mapboxgl = f()}})(function(){var define,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);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.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){
-	"use strict";function Buffer(t){t?(this.array=t.array,this.pos=t.pos):(this.array=new ArrayBuffer(this.defaultLength),this.length=this.defaultLength,this.setupViews())}module.exports=Buffer,Buffer.prototype={pos:0,itemSize:4,defaultLength:8192,arrayType:"ARRAY_BUFFER",get index(){return this.pos/this.itemSize},setupViews:function(){this.ubytes=new Uint8Array(this.array),this.bytes=new Int8Array(this.array),this.ushorts=new Uint16Array(this.array),this.shorts=new Int16Array(this.array)},bind:function(t){var e=t[this.arrayType];this.buffer?t.bindBuffer(e,this.buffer):(this.buffer=t.createBuffer(),t.bindBuffer(e,this.buffer),t.bufferData(e,this.array.slice(0,this.pos),t.STATIC_DRAW),this.array=null)},destroy:function(t){this.buffer&&t.deleteBuffer(this.buffer)},resize:function(){if(this.length<this.pos+this.itemSize){for(;this.length<this.pos+this.itemSize;)this.length=2*Math.round(1.5*this.length/2);this.array=new ArrayBuffer(this.length);var t=new Uint8Array(this.array);t.set(this.ubytes),this.setupViews()}}};
-	},{}],2:[function(require,module,exports){
-	"use strict";var LineVertexBuffer=require("./line_vertex_buffer"),LineElementBuffer=require("./line_element_buffer"),FillVertexBuffer=require("./fill_vertex_buffer"),FillElementBuffer=require("./triangle_element_buffer"),OutlineElementBuffer=require("./outline_element_buffer"),GlyphVertexBuffer=require("./glyph_vertex_buffer"),GlyphElementBuffer=require("./triangle_element_buffer"),IconVertexBuffer=require("./icon_vertex_buffer"),IconElementBuffer=require("./triangle_element_buffer"),CollisionBoxVertexBuffer=require("./collision_box_vertex_buffer"),CircleVertexBuffer=require("./circle_vertex_buffer"),CircleElementBuffer=require("./triangle_element_buffer");module.exports=function(e){return e=e||{},{glyphVertex:new GlyphVertexBuffer(e.glyphVertex),glyphElement:new GlyphElementBuffer(e.glyphElement),iconVertex:new IconVertexBuffer(e.iconVertex),iconElement:new IconElementBuffer(e.iconElement),circleVertex:new CircleVertexBuffer(e.circleVertex),circleElement:new CircleElementBuffer(e.circleElement),fillVertex:new FillVertexBuffer(e.fillVertex),fillElement:new FillElementBuffer(e.fillElement),outlineElement:new OutlineElementBuffer(e.outlineElement),lineVertex:new LineVertexBuffer(e.lineVertex),lineElement:new LineElementBuffer(e.lineElement),collisionBoxVertex:new CollisionBoxVertexBuffer(e.collisionBoxVertex)}};
-	},{"./circle_vertex_buffer":3,"./collision_box_vertex_buffer":4,"./fill_vertex_buffer":5,"./glyph_vertex_buffer":6,"./icon_vertex_buffer":7,"./line_element_buffer":8,"./line_vertex_buffer":9,"./outline_element_buffer":10,"./triangle_element_buffer":11}],3:[function(require,module,exports){
-	"use strict";function CircleVertexBuffer(e){Buffer.call(this,e)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=CircleVertexBuffer,CircleVertexBuffer.prototype=util.inherit(Buffer,{defaultLength:32768,itemSize:4,add:function(e,t,i,r){var f=this.pos,s=f/2;this.resize(),this.shorts[s+0]=2*e+(i+1)/2,this.shorts[s+1]=2*t+(r+1)/2,this.pos+=this.itemSize},bind:function(e,t,i){Buffer.prototype.bind.call(this,e),e.vertexAttribPointer(t.a_pos,2,e.SHORT,!1,this.itemSize,i+0)}});
-	},{"../../util/util":106,"./buffer":1}],4:[function(require,module,exports){
-	"use strict";function CollisionBoxVertexBuffer(t){Buffer.call(this,t)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=CollisionBoxVertexBuffer,CollisionBoxVertexBuffer.prototype=util.inherit(Buffer,{itemSize:12,defaultLength:32768,add:function(t,i,e,r){var s=this.pos,o=s/2,u=this.index;return this.resize(),this.shorts[o+0]=t.x,this.shorts[o+1]=t.y,this.shorts[o+2]=Math.round(i.x),this.shorts[o+3]=Math.round(i.y),this.ubytes[s+8]=Math.floor(10*e),this.ubytes[s+9]=Math.floor(10*r),this.pos+=this.itemSize,u}});
-	},{"../../util/util":106,"./buffer":1}],5:[function(require,module,exports){
-	"use strict";function FillVertexBuffer(e){Buffer.call(this,e)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=FillVertexBuffer,FillVertexBuffer.prototype=util.inherit(Buffer,{itemSize:4,add:function(e,i){var t=this.pos/2;this.resize(),this.shorts[t+0]=e,this.shorts[t+1]=i,this.pos+=this.itemSize}});
-	},{"../../util/util":106,"./buffer":1}],6:[function(require,module,exports){
-	"use strict";function GlyphVertexBuffer(t){Buffer.call(this,t)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=GlyphVertexBuffer,GlyphVertexBuffer.prototype=util.inherit(Buffer,{defaultLength:32768,itemSize:16,add:function(t,e,r,i,s,h,o,f,u){var a=this.pos,l=a/2;this.resize(),this.shorts[l+0]=t,this.shorts[l+1]=e,this.shorts[l+2]=Math.round(64*r),this.shorts[l+3]=Math.round(64*i),this.ubytes[a+8]=Math.floor(s/4),this.ubytes[a+9]=Math.floor(h/4),this.ubytes[a+10]=Math.floor(10*u),this.ubytes[a+12]=Math.floor(10*o),this.ubytes[a+13]=Math.floor(10*Math.min(f,25)),this.pos+=this.itemSize},bind:function(t,e,r){Buffer.prototype.bind.call(this,t);var i=this.itemSize;t.vertexAttribPointer(e.a_pos,2,t.SHORT,!1,i,r+0),t.vertexAttribPointer(e.a_offset,2,t.SHORT,!1,i,r+4),t.vertexAttribPointer(e.a_data1,4,t.UNSIGNED_BYTE,!1,i,r+8),t.vertexAttribPointer(e.a_data2,2,t.UNSIGNED_BYTE,!1,i,r+12)}});
-	},{"../../util/util":106,"./buffer":1}],7:[function(require,module,exports){
-	"use strict";function IconVertexBuffer(t){Buffer.call(this,t)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=IconVertexBuffer,IconVertexBuffer.prototype=util.inherit(Buffer,{defaultLength:32768,itemSize:16,add:function(t,e,i,r,s,o,h,u,f){var a=this.pos,n=a/2;this.resize(),this.shorts[n+0]=t,this.shorts[n+1]=e,this.shorts[n+2]=Math.round(64*i),this.shorts[n+3]=Math.round(64*r),this.ubytes[a+8]=s/4,this.ubytes[a+9]=o/4,this.ubytes[a+10]=Math.floor(10*(f||0)),this.ubytes[a+12]=Math.floor(10*(h||0)),this.ubytes[a+13]=Math.floor(10*Math.min(u||25,25)),this.pos+=this.itemSize},bind:function(t,e,i){Buffer.prototype.bind.call(this,t);var r=this.itemSize;t.vertexAttribPointer(e.a_pos,2,t.SHORT,!1,r,i+0),t.vertexAttribPointer(e.a_offset,2,t.SHORT,!1,r,i+4),t.vertexAttribPointer(e.a_data1,4,t.UNSIGNED_BYTE,!1,r,i+8),t.vertexAttribPointer(e.a_data2,2,t.UNSIGNED_BYTE,!1,r,i+12)}});
-	},{"../../util/util":106,"./buffer":1}],8:[function(require,module,exports){
-	"use strict";function LineElementBuffer(e){Buffer.call(this,e)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=LineElementBuffer,LineElementBuffer.prototype=util.inherit(Buffer,{itemSize:6,arrayType:"ELEMENT_ARRAY_BUFFER",add:function(e,t,i){var r=this.pos/2;this.resize(),this.ushorts[r+0]=e,this.ushorts[r+1]=t,this.ushorts[r+2]=i,this.pos+=this.itemSize}});
-	},{"../../util/util":106,"./buffer":1}],9:[function(require,module,exports){
-	"use strict";function LineVertexBuffer(e){Buffer.call(this,e)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=LineVertexBuffer,LineVertexBuffer.extrudeScale=63,LineVertexBuffer.prototype=util.inherit(Buffer,{itemSize:8,defaultLength:32768,add:function(e,t,r,i,s){var u=this.pos,f=u/2,h=this.index,o=LineVertexBuffer.extrudeScale;return this.resize(),this.shorts[f+0]=2*Math.floor(e.x)|r,this.shorts[f+1]=2*Math.floor(e.y)|i,this.bytes[u+4]=Math.round(o*t.x),this.bytes[u+5]=Math.round(o*t.y),this.bytes[u+6]=(s||0)/128,this.bytes[u+7]=(s||0)%128,this.pos+=this.itemSize,h}});
-	},{"../../util/util":106,"./buffer":1}],10:[function(require,module,exports){
-	"use strict";function OutlineElementBuffer(e){Buffer.call(this,e)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=OutlineElementBuffer,OutlineElementBuffer.prototype=util.inherit(Buffer,{itemSize:4,arrayType:"ELEMENT_ARRAY_BUFFER",add:function(e,t){var i=this.pos/2;this.resize(),this.ushorts[i+0]=e,this.ushorts[i+1]=t,this.pos+=this.itemSize}});
-	},{"../../util/util":106,"./buffer":1}],11:[function(require,module,exports){
-	"use strict";function TriangleElementBuffer(e){Buffer.call(this,e)}var util=require("../../util/util"),Buffer=require("./buffer");module.exports=TriangleElementBuffer,TriangleElementBuffer.prototype=util.inherit(Buffer,{itemSize:6,arrayType:"ELEMENT_ARRAY_BUFFER",add:function(e,t,i){var r=this.pos/2;this.resize(),this.ushorts[r+0]=e,this.ushorts[r+1]=t,this.ushorts[r+2]=i,this.pos+=this.itemSize}});
-	},{"../../util/util":106,"./buffer":1}],12:[function(require,module,exports){
-	"use strict";function CircleBucket(e){this.buffers=e,this.elementGroups=new ElementGroups(e.circleVertex,e.circleElement)}var ElementGroups=require("./element_groups");module.exports=CircleBucket,CircleBucket.prototype.addFeatures=function(){for(var e=4096,r=0;r<this.features.length;r++)for(var t=this.features[r].loadGeometry()[0],s=0;s<t.length;s++){this.elementGroups.makeRoomFor(6);var u=t[s].x,i=t[s].y;if(!(0>u||u>=e||0>i||i>=e)){var l=this.buffers.circleVertex.index-this.elementGroups.current.vertexStartIndex;this.buffers.circleVertex.add(u,i,-1,-1),this.buffers.circleVertex.add(u,i,1,-1),this.buffers.circleVertex.add(u,i,1,1),this.buffers.circleVertex.add(u,i,-1,1),this.elementGroups.elementBuffer.add(l,l+1,l+2),this.elementGroups.elementBuffer.add(l,l+3,l+2),this.elementGroups.current.vertexLength+=4,this.elementGroups.current.elementLength+=2}}};
-	},{"./element_groups":14}],13:[function(require,module,exports){
-	"use strict";function createBucket(e,t,i,r,l){var c=new StyleDeclarationSet("layout",e.type,e.layout,{}).values(),a={lastIntegerZoom:1/0,lastIntegerZoomTime:0,lastZoom:0},u={};for(var o in c)u[o]=c[o].calculate(i,a);"symbol"===e.type&&(c["text-size"]&&(u["text-max-size"]=c["text-size"].calculate(18,a),u["text-size"]=c["text-size"].calculate(i+1,a)),c["icon-size"]&&(u["icon-max-size"]=c["icon-size"].calculate(18,a),u["icon-size"]=c["icon-size"].calculate(i+1,a)));var s="line"===e.type?LineBucket:"fill"===e.type?FillBucket:"symbol"===e.type?SymbolBucket:"circle"===e.type?CircleBucket:null,n=new s(t,new LayoutProperties[e.type](u),r,i,l);return n.id=e.id,n.type=e.type,n["source-layer"]=e["source-layer"],n.interactive=e.interactive,n.minZoom=e.minzoom,n.maxZoom=e.maxzoom,n.filter=featureFilter(e.filter),n.features=[],n}module.exports=createBucket;var LineBucket=require("./line_bucket"),FillBucket=require("./fill_bucket"),SymbolBucket=require("./symbol_bucket"),CircleBucket=require("./circle_bucket"),LayoutProperties=require("../style/layout_properties"),featureFilter=require("feature-filter"),StyleDeclarationSet=require("../style/style_declaration_set");
-	},{"../style/layout_properties":53,"../style/style_declaration_set":59,"./circle_bucket":12,"./fill_bucket":16,"./line_bucket":17,"./symbol_bucket":18,"feature-filter":108}],14:[function(require,module,exports){
-	"use strict";function ElementGroups(e,t,n){this.vertexBuffer=e,this.elementBuffer=t,this.secondElementBuffer=n,this.groups=[]}function ElementGroup(e,t,n){this.vertexStartIndex=e,this.elementStartIndex=t,this.secondElementStartIndex=n,this.elementLength=0,this.vertexLength=0,this.secondElementLength=0}module.exports=ElementGroups,ElementGroups.prototype.makeRoomFor=function(e){(!this.current||this.current.vertexLength+e>65535)&&(this.current=new ElementGroup(this.vertexBuffer.index,this.elementBuffer&&this.elementBuffer.index,this.secondElementBuffer&&this.secondElementBuffer.index),this.groups.push(this.current))};
-	},{}],15:[function(require,module,exports){
-	"use strict";function FeatureTree(t,e){this.x=t.x,this.y=t.y,this.z=t.z-Math.log(e)/Math.LN2,this.rtree=rbush(9),this.toBeInserted=[]}function geometryIntersectsBox(t,e,n){return"Point"===e?pointIntersectsBox(t,n):"LineString"===e?lineIntersectsBox(t,n):"Polygon"===e?polyIntersectsBox(t,n)||lineIntersectsBox(t,n):!1}function polyIntersectsBox(t,e){return polyContainsPoint(t,new Point(e[0],e[1]))||polyContainsPoint(t,new Point(e[0],e[3]))||polyContainsPoint(t,new Point(e[2],e[1]))||polyContainsPoint(t,new Point(e[2],e[3]))?!0:lineIntersectsBox(t,e)}function lineIntersectsBox(t,e){for(var n=0;n<t.length;n++)for(var r=t[n],o=0,i=r.length-1;o<r.length;i=o++){var s=r[o],a=r[i],u=new Point(s.y,s.x),l=new Point(a.y,a.x);if(segmentCrossesHorizontal(s,a,e[0],e[2],e[1])||segmentCrossesHorizontal(s,a,e[0],e[2],e[3])||segmentCrossesHorizontal(u,l,e[1],e[3],e[0])||segmentCrossesHorizontal(u,l,e[1],e[3],e[2]))return!0}return pointIntersectsBox(t,e)}function segmentCrossesHorizontal(t,e,n,r,o){if(e.y===t.y)return e.y===o&&Math.min(t.x,e.x)<=r&&Math.max(t.x,e.x)>=n;var i=(o-t.y)/(e.y-t.y),s=t.x+i*(e.x-t.x);return s>=n&&r>=s&&1>=i&&i>=0}function pointIntersectsBox(t,e){for(var n=0;n<t.length;n++)for(var r=t[n],o=0;o<r.length;o++)if(r[o].x>=e[0]&&r[o].y>=e[1]&&r[o].x<=e[2]&&r[o].y<=e[3])return!0;return!1}function geometryContainsPoint(t,e,n,r){return"Point"===e?pointContainsPoint(t,n,r):"LineString"===e?lineContainsPoint(t,n,r):"Polygon"===e?polyContainsPoint(t,n)||lineContainsPoint(t,n,r):!1}function distToSegmentSquared(t,e,n){var r=e.distSqr(n);if(0===r)return t.distSqr(e);var o=((t.x-e.x)*(n.x-e.x)+(t.y-e.y)*(n.y-e.y))/r;return 0>o?t.distSqr(e):o>1?t.distSqr(n):t.distSqr(n.sub(e)._mult(o)._add(e))}function lineContainsPoint(t,e,n){for(var r=n*n,o=0;o<t.length;o++)for(var i=t[o],s=1;s<i.length;s++){var a=i[s-1],u=i[s];if(distToSegmentSquared(e,a,u)<r)return!0}return!1}function polyContainsPoint(t,e){for(var n,r,o,i=!1,s=0;s<t.length;s++){n=t[s];for(var a=0,u=n.length-1;a<n.length;u=a++)r=n[a],o=n[u],r.y>e.y!=o.y>e.y&&e.x<(o.x-r.x)*(e.y-r.y)/(o.y-r.y)+r.x&&(i=!i)}return i}function pointContainsPoint(t,e,n){for(var r=n*n,o=0;o<t.length;o++)for(var i=t[o],s=0;s<i.length;s++)if(i[s].distSqr(e)<=r)return!0;return!1}var rbush=require("rbush"),Point=require("point-geometry"),vt=require("vector-tile"),util=require("../util/util");module.exports=FeatureTree,FeatureTree.prototype.insert=function(t,e,n){t.layers=e,t.feature=n,this.toBeInserted.push(t)},FeatureTree.prototype._load=function(){this.rtree.load(this.toBeInserted),this.toBeInserted=[]},FeatureTree.prototype.query=function(t,e){this.toBeInserted.length&&this._load();var n,r,o=t.params||{},i=t.x,s=t.y,a=[];"undefined"!=typeof i&&"undefined"!=typeof s?(n=(o.radius||0)*(t.tileExtent||4096)/t.scale,r=[i-n,s-n,i+n,s+n]):r=[t.minX,t.minY,t.maxX,t.maxY];for(var u=this.rtree.search(r),l=0;l<u.length;l++){var y=u[l].feature,x=u[l].layers,f=vt.VectorTileFeature.types[y.type];if((!o.$type||f===o.$type)&&(!n||geometryContainsPoint(y.loadGeometry(),f,new Point(i,s),n))&&geometryIntersectsBox(y.loadGeometry(),f,r)){var h=y.toGeoJSON(this.x,this.y,this.z);o.includeGeometry||(h.geometry=null);for(var d=0;d<x.length;d++){var g=x[d];o.layerIds&&o.layerIds.indexOf(g)<0||a.push(util.extend({layer:g},h))}}}e(null,a)};
-	},{"../util/util":106,"point-geometry":137,"rbush":139,"vector-tile":144}],16:[function(require,module,exports){
-	"use strict";function FillBucket(e){this.buffers=e,this.elementGroups=new ElementGroups(e.fillVertex,e.fillElement,e.outlineElement)}var ElementGroups=require("./element_groups");module.exports=FillBucket,FillBucket.prototype.addFeatures=function(){for(var e=this.features,t=0;t<e.length;t++){var l=e[t],r=l.loadGeometry();r&&this.addFeature(r)}},FillBucket.prototype.addFeature=function(e){for(var t=0;t<e.length;t++)this.addFill(e[t])},FillBucket.prototype.addFill=function(e){if(!(e.length<3)){var t=e.length;this.elementGroups.makeRoomFor(t+1);for(var l,r,n,i=this.elementGroups.current,o=this.buffers.fillVertex,u=this.buffers.fillElement,s=this.buffers.outlineElement,d=o.index-i.vertexStartIndex,a=0;a<e.length;a++)r=o.index-i.vertexStartIndex,n=e[a],o.add(n.x,n.y),i.vertexLength++,a>=2&&(n.x!==e[0].x||n.y!==e[0].y)&&(u.add(d,l,r),i.elementLength++),a>=1&&(s.add(l,r),i.secondElementLength++),l=r}};
-	},{"./element_groups":14}],17:[function(require,module,exports){
-	"use strict";function LineBucket(e,t){this.buffers=e,this.elementGroups=new ElementGroups(e.lineVertex,e.lineElement),this.layoutProperties=t}var ElementGroups=require("./element_groups");module.exports=LineBucket,LineBucket.prototype.addFeatures=function(){for(var e=this.features,t=0;t<e.length;t++){var r=e[t],i=r.loadGeometry();i&&this.addFeature(i)}},LineBucket.prototype.addFeature=function(e){for(var t=this.layoutProperties,r=0;r<e.length;r++)this.addLine(e[r],t["line-join"],t["line-cap"],t["line-miter-limit"],t["line-round-limit"])},LineBucket.prototype.addLine=function(e,t,r,i,s){for(var n=e.length;n>2&&e[n-1].equals(e[n-2]);)n--;if(!(e.length<2)){"bevel"===t&&(i=1.05);var u=e[0],h=e[n-1],d=u.equals(h);if(this.elementGroups.makeRoomFor(10*n),2!==n||!d){var a,l,o,f,m,p,x,v=r,c=d?"butt":r,V=1,b=0,_=!0;this.e1=this.e2=this.e3=-1,d&&(a=e[n-2],m=u.sub(a)._unit()._perp());for(var y=0;n>y;y++)if(o=d&&y===n-1?e[1]:e[y+1],!o||!e[y].equals(o)){m&&(f=m),a&&(l=a),a=e[y],l&&(b+=a.dist(l)),m=o?o.sub(a)._unit()._perp():f,f=f||m;var L=f.add(m)._unit(),C=L.x*m.x+L.y*m.y,g=1/C,k=l&&o,G=k?t:o?v:c;if(k&&"round"===G&&(s>g?G="miter":2>=g&&(G="fakeround")),"miter"===G&&g>i&&(G="bevel"),"bevel"===G&&(g>2&&(G="flipbevel"),i>g&&(G="miter")),"miter"===G)L._mult(g),this.addCurrentVertex(a,V,b,L,0,0,!1);else if("flipbevel"===G){if(g>100)L=m.clone();else{var B=f.x*m.y-f.y*m.x>0?-1:1,q=g*f.add(m).mag()/f.sub(m).mag();L._perp()._mult(q*B)}this.addCurrentVertex(a,V,b,L,0,0,!1),V=-V}else if("bevel"===G||"fakeround"===G){var P=V*(f.x*m.y-f.y*m.x)>0,S=-Math.sqrt(g*g-1);if(P?(x=0,p=S):(p=0,x=S),_||this.addCurrentVertex(a,V,b,f,p,x,!1),"fakeround"===G){for(var E,F=Math.floor(8*(.5-(C-.5))),I=0;F>I;I++)E=m.mult((I+1)/(F+1))._add(f)._unit(),this.addPieSliceVertex(a,V,b,E,P);this.addPieSliceVertex(a,V,b,L,P);for(var M=F-1;M>=0;M--)E=f.mult((M+1)/(F+1))._add(m)._unit(),this.addPieSliceVertex(a,V,b,E,P)}o&&this.addCurrentVertex(a,V,b,m,-p,-x,!1)}else"butt"===G?(_||this.addCurrentVertex(a,V,b,f,0,0,!1),o&&this.addCurrentVertex(a,V,b,m,0,0,!1)):"square"===G?(_||(this.addCurrentVertex(a,V,b,f,1,1,!1),this.e1=this.e2=-1,V=1),o&&this.addCurrentVertex(a,V,b,m,-1,-1,!1)):"round"===G&&(_||(this.addCurrentVertex(a,V,b,f,0,0,!1),this.addCurrentVertex(a,V,b,f,1,1,!0),this.e1=this.e2=-1,V=1),o&&(this.addCurrentVertex(a,V,b,m,-1,-1,!0),this.addCurrentVertex(a,V,b,m,0,0,!1)));_=!1}}}},LineBucket.prototype.addCurrentVertex=function(e,t,r,i,s,n,u){var h,d=u?1:0,a=this.buffers.lineVertex,l=this.buffers.lineElement,o=this.elementGroups.current,f=this.elementGroups.current.vertexStartIndex;h=i.mult(t),s&&h._sub(i.perp()._mult(s)),this.e3=a.add(e,h,d,0,r)-f,this.e1>=0&&this.e2>=0&&(l.add(this.e1,this.e2,this.e3),o.elementLength++),this.e1=this.e2,this.e2=this.e3,h=i.mult(-t),n&&h._sub(i.perp()._mult(n)),this.e3=a.add(e,h,d,1,r)-f,this.e1>=0&&this.e2>=0&&(l.add(this.e1,this.e2,this.e3),o.elementLength++),this.e1=this.e2,this.e2=this.e3,o.vertexLength+=2},LineBucket.prototype.addPieSliceVertex=function(e,t,r,i,s){var n=this.buffers.lineVertex,u=this.buffers.lineElement,h=this.elementGroups.current,d=this.elementGroups.current.vertexStartIndex,a=s;i=i.mult(t*(s?-1:1)),this.e3=n.add(e,i,0,a,r)-d,h.vertexLength+=1,this.e1>=0&&this.e2>=0&&(u.add(this.e1,this.e2,this.e3),h.elementLength++),s?this.e2=this.e3:this.e1=this.e3};
-	},{"./element_groups":14}],18:[function(require,module,exports){
-	"use strict";function SymbolBucket(e,t,o,i,s){this.buffers=e,this.layoutProperties=t,this.overscaling=o,this.zoom=i,this.collisionDebug=s;var n=512*o,a=4096;this.tilePixelRatio=a/n,this.compareText={},this.symbolInstances=[]}function SymbolInstance(e,t,o,i,s,n,a,l,r,c,h,u){this.x=e.x,this.y=e.y,this.hasText=!!o,this.hasIcon=!!i,this.hasText&&(this.glyphQuads=n?getGlyphQuads(e,o,a,t,s,r):[],this.textCollisionFeature=new CollisionFeature(t,e,o,a,l,r)),this.hasIcon&&(this.iconQuads=n?getIconQuads(e,i,c,t,s,u):[],this.iconCollisionFeature=new CollisionFeature(t,e,i,c,h,u))}var ElementGroups=require("./element_groups"),Anchor=require("../symbol/anchor"),getAnchors=require("../symbol/get_anchors"),resolveTokens=require("../util/token"),Quads=require("../symbol/quads"),Shaping=require("../symbol/shaping"),resolveText=require("../symbol/resolve_text"),resolveIcons=require("../symbol/resolve_icons"),mergeLines=require("../symbol/mergelines"),shapeText=Shaping.shapeText,shapeIcon=Shaping.shapeIcon,getGlyphQuads=Quads.getGlyphQuads,getIconQuads=Quads.getIconQuads,clipLine=require("../symbol/clip_line"),Point=require("point-geometry"),CollisionFeature=require("../symbol/collision_feature");module.exports=SymbolBucket,SymbolBucket.prototype.needsPlacement=!0,SymbolBucket.prototype.addFeatures=function(e){var t=this.layoutProperties,o=this.features,i=this.textFeatures,s=.5,n=.5;switch(t["text-anchor"]){case"right":case"top-right":case"bottom-right":s=1;break;case"left":case"top-left":case"bottom-left":s=0}switch(t["text-anchor"]){case"bottom":case"bottom-right":case"bottom-left":n=1;break;case"top":case"top-right":case"top-left":n=0}for(var a="right"===t["text-justify"]?1:"left"===t["text-justify"]?0:.5,l=24,r=t["text-line-height"]*l,c="line"!==t["symbol-placement"]?t["text-max-width"]*l:0,h=t["text-letter-spacing"]*l,u=[t["text-offset"][0]*l,t["text-offset"][1]*l],m=t["text-font"].join(","),p=[],x=0;x<o.length;x++)p.push(o[x].loadGeometry());if("line"===t["symbol-placement"]){var y=mergeLines(o,i,p);p=y.geometries,o=y.features,i=y.textFeatures}for(var d,g,f=0;f<o.length;f++)if(p[f]){if(d=i[f]?shapeText(i[f],this.stacks[m],c,r,s,n,a,h,u):null,t["icon-image"]){var b=resolveTokens(o[f].properties,t["icon-image"]),v=this.icons[b];g=shapeIcon(v,t),v&&(void 0===this.sdfIcons?this.sdfIcons=v.sdf:this.sdfIcons!==v.sdf&&console.warn("Style sheet warning: Cannot mix SDF and non-SDF icons in one bucket"))}else g=null;(d||g)&&this.addFeature(p[f],d,g)}this.placeFeatures(e,this.buffers,this.collisionDebug)},SymbolBucket.prototype.addFeature=function(e,t,o){var i=this.layoutProperties,s=24,n=i["text-size"]/s,a=this.tilePixelRatio*n,l=this.tilePixelRatio*i["text-max-size"]/s,r=this.tilePixelRatio*i["icon-size"],c=this.tilePixelRatio*i["symbol-spacing"],h=i["symbol-avoid-edges"],u=i["text-padding"]*this.tilePixelRatio,m=i["icon-padding"]*this.tilePixelRatio,p=i["text-max-angle"]/180*Math.PI,x="map"===i["text-rotation-alignment"]&&"line"===i["symbol-placement"],y="map"===i["icon-rotation-alignment"]&&"line"===i["symbol-placement"],d=i["text-allow-overlap"]||i["icon-allow-overlap"]||i["text-ignore-placement"]||i["icon-ignore-placement"],g="line"===i["symbol-placement"],f=c/2;g&&(e=clipLine(e,0,0,4096,4096));for(var b=0;b<e.length;b++)for(var v=e[b],I=g?getAnchors(v,c,p,t,o,s,l,this.overscaling):[new Anchor(v[0].x,v[0].y,0)],S=0,F=I.length;F>S;S++){var P=I[S];if(!(t&&g&&this.anchorIsTooClose(t.text,f,P))){var M=!(P.x<0||P.x>4096||P.y<0||P.y>4096);if(!h||M){var k=M||d;this.symbolInstances.push(new SymbolInstance(P,v,t,o,i,k,a,u,x,r,m,y))}}}},SymbolBucket.prototype.anchorIsTooClose=function(e,t,o){var i=this.compareText;if(e in i){for(var s=i[e],n=s.length-1;n>=0;n--)if(o.dist(s[n])<t)return!0}else i[e]=[];return i[e].push(o),!1},SymbolBucket.prototype.placeFeatures=function(e,t,o){this.buffers=t;var i=this.elementGroups={text:new ElementGroups(t.glyphVertex,t.glyphElement),icon:new ElementGroups(t.iconVertex,t.iconElement),sdfIcons:this.sdfIcons},s=this.layoutProperties,n=e.maxScale;i.text["text-size"]=s["text-size"],i.icon["icon-size"]=s["icon-size"];var a="map"===s["text-rotation-alignment"]&&"line"===s["symbol-placement"],l="map"===s["icon-rotation-alignment"]&&"line"===s["symbol-placement"],r=s["text-allow-overlap"]||s["icon-allow-overlap"]||s["text-ignore-placement"]||s["icon-ignore-placement"];if(r){var c=e.angle,h=Math.sin(c),u=Math.cos(c);this.symbolInstances.sort(function(e,t){var o=h*e.x+u*e.y,i=h*t.x+u*t.y;return i-o})}for(var m=0;m<this.symbolInstances.length;m++){var p=this.symbolInstances[m],x=p.hasText,y=p.hasIcon,d=s["text-optional"]||!x,g=s["icon-optional"]||!y,f=x&&!s["text-allow-overlap"]?e.placeCollisionFeature(p.textCollisionFeature):e.minScale,b=y&&!s["icon-allow-overlap"]?e.placeCollisionFeature(p.iconCollisionFeature):e.minScale;d||g?!g&&f?f=Math.max(b,f):!d&&b&&(b=Math.max(b,f)):b=f=Math.max(b,f),x&&(s["text-ignore-placement"]||e.insertCollisionFeature(p.textCollisionFeature,f),n>=f&&this.addSymbols(t.glyphVertex,t.glyphElement,i.text,p.glyphQuads,f,s["text-keep-upright"],a,e.angle)),y&&(s["icon-ignore-placement"]||e.insertCollisionFeature(p.iconCollisionFeature,b),n>=b&&this.addSymbols(t.iconVertex,t.iconElement,i.icon,p.iconQuads,b,s["icon-keep-upright"],l,e.angle))}o&&this.addToDebugBuffers(e)},SymbolBucket.prototype.addSymbols=function(e,t,o,i,s,n,a,l){o.makeRoomFor(4*i.length);for(var r=o.current,c=this.zoom,h=Math.max(Math.log(s)/Math.LN2+c,0),u=0;u<i.length;u++){var m=i[u],p=m.angle,x=(p+l+Math.PI)%(2*Math.PI);if(!(n&&a&&(x<=Math.PI/2||x>3*Math.PI/2))){var y=m.tl,d=m.tr,g=m.bl,f=m.br,b=m.tex,v=m.anchorPoint,I=Math.max(c+Math.log(m.minScale)/Math.LN2,h),S=Math.min(c+Math.log(m.maxScale)/Math.LN2,25);if(!(I>=S)){I===h&&(I=0);var F=e.index-r.vertexStartIndex;e.add(v.x,v.y,y.x,y.y,b.x,b.y,I,S,h),e.add(v.x,v.y,d.x,d.y,b.x+b.w,b.y,I,S,h),e.add(v.x,v.y,g.x,g.y,b.x,b.y+b.h,I,S,h),e.add(v.x,v.y,f.x,f.y,b.x+b.w,b.y+b.h,I,S,h),r.vertexLength+=4,t.add(F,F+1,F+2),t.add(F+1,F+2,F+3),r.elementLength+=2}}}},SymbolBucket.prototype.getDependencies=function(e,t,o){function i(e){return e||s?o(e):void(s=!0)}var s=!1;this.getTextDependencies(e,t,i),this.getIconDependencies(e,t,i)},SymbolBucket.prototype.getIconDependencies=function(e,t,o){function i(e,t){return e?o(e):(this.icons=t,void o())}if(this.layoutProperties["icon-image"]){var s=this.features,n=resolveIcons(s,this.layoutProperties);n.length?t.send("get icons",{icons:n},i.bind(this)):o()}else o()},SymbolBucket.prototype.getTextDependencies=function(e,t,o){var i=this.features,s=this.layoutProperties["text-font"],n=this.stacks=e.stacks;void 0===n[s]&&(n[s]={});var a=n[s],l=resolveText(i,this.layoutProperties,a);this.textFeatures=l.textFeatures,t.send("get glyphs",{uid:e.uid,fontstack:s,codepoints:l.codepoints},function(e,t){if(e)return o(e);for(var i in t)a[i]=t[i];o()})},SymbolBucket.prototype.addToDebugBuffers=function(e){this.elementGroups.collisionBox=new ElementGroups(this.buffers.collisionBoxVertex),this.elementGroups.collisionBox.makeRoomFor(0);for(var t=this.buffers.collisionBoxVertex,o=-e.angle,i=e.yStretch,s=0;s<this.symbolInstances.length;s++)for(var n=0;2>n;n++){var a=this.symbolInstances[s][0===n?"textCollisionFeature":"iconCollisionFeature"];if(a)for(var l=a.boxes,r=0;r<l.length;r++){var c=l[r],h=c.anchorPoint,u=new Point(c.x1,c.y1*i)._rotate(o),m=new Point(c.x2,c.y1*i)._rotate(o),p=new Point(c.x1,c.y2*i)._rotate(o),x=new Point(c.x2,c.y2*i)._rotate(o),y=Math.max(0,Math.min(25,this.zoom+Math.log(c.maxScale)/Math.LN2)),d=Math.max(0,Math.min(25,this.zoom+Math.log(c.placementScale)/Math.LN2));t.add(h,u,y,d),t.add(h,m,y,d),t.add(h,m,y,d),t.add(h,x,y,d),t.add(h,x,y,d),t.add(h,p,y,d),t.add(h,p,y,d),t.add(h,u,y,d),this.elementGroups.collisionBox.current.vertexLength+=8}}};
-	},{"../symbol/anchor":62,"../symbol/clip_line":65,"../symbol/collision_feature":67,"../symbol/get_anchors":69,"../symbol/mergelines":72,"../symbol/quads":73,"../symbol/resolve_icons":74,"../symbol/resolve_text":75,"../symbol/shaping":76,"../util/token":105,"./element_groups":14,"point-geometry":137}],19:[function(require,module,exports){
-	"use strict";function Coordinate(o,t,n){this.column=o,this.row=t,this.zoom=n}module.exports=Coordinate,Coordinate.prototype={clone:function(){return new Coordinate(this.column,this.row,this.zoom)},zoomTo:function(o){return this.clone()._zoomTo(o)},sub:function(o){return this.clone()._sub(o)},_zoomTo:function(o){var t=Math.pow(2,o-this.zoom);return this.column*=t,this.row*=t,this.zoom=o,this},_sub:function(o){return o=o.zoomTo(this.zoom),this.column-=o.column,this.row-=o.row,this}};
-	},{}],20:[function(require,module,exports){
-	"use strict";function LngLat(t,n){if(isNaN(t)||isNaN(n))throw new Error("Invalid LngLat object: ("+t+", "+n+")");if(this.lng=+t,this.lat=+n,this.lat>90||this.lat<-90)throw new Error("Invalid LngLat latitude value: must be between -90 and 90")}module.exports=LngLat;var wrap=require("../util/util").wrap;LngLat.prototype.wrap=function(){return new LngLat(wrap(this.lng,-180,180),this.lat)},LngLat.convert=function(t){return t instanceof LngLat?t:Array.isArray(t)?new LngLat(t[0],t[1]):t};
-	},{"../util/util":106}],21:[function(require,module,exports){
-	"use strict";function LngLatBounds(t,n){if(t)for(var e=n?[t,n]:t,s=0,i=e.length;i>s;s++)this.extend(e[s])}module.exports=LngLatBounds;var LngLat=require("./lng_lat");LngLatBounds.prototype={extend:function(t){var n,e,s=this._sw,i=this._ne;if(t instanceof LngLat)n=t,e=t;else{if(!(t instanceof LngLatBounds))return t?this.extend(LngLat.convert(t)||LngLatBounds.convert(t)):this;if(n=t._sw,e=t._ne,!n||!e)return this}return s||i?(s.lng=Math.min(n.lng,s.lng),s.lat=Math.min(n.lat,s.lat),i.lng=Math.max(e.lng,i.lng),i.lat=Math.max(e.lat,i.lat)):(this._sw=new LngLat(n.lng,n.lat),this._ne=new LngLat(e.lng,e.lat)),this},getCenter:function(){return new LngLat((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)},getSouthWest:function(){return this._sw},getNorthEast:function(){return this._ne},getNorthWest:function(){return new LngLat(this.getWest(),this.getNorth())},getSouthEast:function(){return new LngLat(this.getEast(),this.getSouth())},getWest:function(){return this._sw.lng},getSouth:function(){return this._sw.lat},getEast:function(){return this._ne.lng},getNorth:function(){return this._ne.lat}},LngLatBounds.convert=function(t){return!t||t instanceof LngLatBounds?t:new LngLatBounds(t)};
-	},{"./lng_lat":20}],22:[function(require,module,exports){
-	"use strict";function Transform(t,i){this.tileSize=512,this._minZoom=t||0,this._maxZoom=i||22,this.latRange=[-85.05113,85.05113],this.width=0,this.height=0,this.zoom=0,this.center=new LngLat(0,0),this.angle=0,this._altitude=1.5,this._pitch=0}var LngLat=require("./lng_lat"),Point=require("point-geometry"),Coordinate=require("./coordinate"),wrap=require("../util/util").wrap,interp=require("../util/interpolate"),vec4=require("gl-matrix").vec4,mat4=require("gl-matrix").mat4;module.exports=Transform,Transform.prototype={get minZoom(){return this._minZoom},set minZoom(t){this._minZoom=t,this.zoom=Math.max(this.zoom,t)},get maxZoom(){return this._maxZoom},set maxZoom(t){this._maxZoom=t,this.zoom=Math.min(this.zoom,t)},get worldSize(){return this.tileSize*this.scale},get centerPoint(){return this.size._div(2)},get size(){return new Point(this.width,this.height)},get bearing(){return-this.angle/Math.PI*180},set bearing(t){this.angle=-wrap(t,-180,180)*Math.PI/180},get pitch(){return this._pitch/Math.PI*180},set pitch(t){this._pitch=Math.min(60,t)/180*Math.PI},get altitude(){return this._altitude},set altitude(t){this._altitude=Math.max(.75,t)},get zoom(){return this._zoom},set zoom(t){t=Math.min(Math.max(t,this.minZoom),this.maxZoom),this._zoom=t,this.scale=this.zoomScale(t),this.tileZoom=Math.floor(t),this.zoomFraction=t-this.tileZoom,this._constrain()},get center(){return this._center},set center(t){this._center=t,this._constrain()},zoomScale:function(t){return Math.pow(2,t)},scaleZoom:function(t){return Math.log(t)/Math.LN2},project:function(t,i){return new Point(this.lngX(t.lng,i),this.latY(t.lat,i))},unproject:function(t,i){return new LngLat(this.xLng(t.x,i),this.yLat(t.y,i))},get x(){return this.lngX(this.center.lng)},get y(){return this.latY(this.center.lat)},get point(){return new Point(this.x,this.y)},lngX:function(t,i){return(180+t)*(i||this.worldSize)/360},latY:function(t,i){var n=180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360));return(180-n)*(i||this.worldSize)/360},xLng:function(t,i){return 360*t/(i||this.worldSize)-180},yLat:function(t,i){var n=180-360*t/(i||this.worldSize);return 360/Math.PI*Math.atan(Math.exp(n*Math.PI/180))-90},panBy:function(t){var i=this.centerPoint._add(t);this.center=this.pointLocation(i)},setLocationAtPoint:function(t,i){var n=this.locationCoordinate(t),o=this.pointCoordinate(i),e=this.pointCoordinate(this.centerPoint),a=o._sub(n);this.center=this.coordinateLocation(e._sub(a))},setZoomAround:function(t,i){var n;i&&(n=this.locationPoint(i)),this.zoom=t,i&&this.setLocationAtPoint(i,n)},setBearingAround:function(t,i){var n;i&&(n=this.locationPoint(i)),this.bearing=t,i&&this.setLocationAtPoint(i,n)},locationPoint:function(t){return this.coordinatePoint(this.locationCoordinate(t))},pointLocation:function(t){return this.coordinateLocation(this.pointCoordinate(t))},locationCoordinate:function(t){var i=this.zoomScale(this.tileZoom)/this.worldSize,n=LngLat.convert(t);return new Coordinate(this.lngX(n.lng)*i,this.latY(n.lat)*i,this.tileZoom)},coordinateLocation:function(t){var i=this.zoomScale(t.zoom);return new LngLat(this.xLng(t.column,i),this.yLat(t.row,i))},pointCoordinate:function(t,i){void 0===i&&(i=0);var n=this.coordinatePointMatrix(this.tileZoom),o=mat4.invert(new Float64Array(16),n);if(!o)throw new Error("failed to invert matrix");var e=vec4.transformMat4([],[t.x,t.y,0,1],o),a=vec4.transformMat4([],[t.x,t.y,1,1],o),r=e[3],h=a[3],s=e[0]/r,c=a[0]/h,u=e[1]/r,l=a[1]/h,m=e[2]/r,g=a[2]/h,f=m===g?0:(i-m)/(g-m);return new Coordinate(interp(s,c,f),interp(u,l,f),this.tileZoom)},coordinatePoint:function(t){var i=this.coordinatePointMatrix(t.zoom),n=vec4.transformMat4([],[t.column,t.row,0,1],i);return new Point(n[0]/n[3],n[1]/n[3])},coordinatePointMatrix:function(t){var i=this.getProjMatrix(),n=this.worldSize/this.zoomScale(t);return mat4.scale(i,i,[n,n,1]),mat4.multiply(i,this.getPixelMatrix(),i),i},getPixelMatrix:function(){var t=mat4.create();return mat4.scale(t,t,[this.width/2,-this.height/2,1]),mat4.translate(t,t,[1,-1,0]),t},_constrain:function(){if(this.center&&this.width&&this.height&&!this._constraining){this._constraining=!0;var t,i,n,o,e,a,r,h,s=this.size;this.latRange&&(t=this.latY(this.latRange[1]),i=this.latY(this.latRange[0]),e=i-t<s.y?s.y/(i-t):0),this.lngRange&&(n=this.lngX(this.lngRange[0]),o=this.lngX(this.lngRange[1]),a=o-n<s.x?s.x/(o-n):0);var c=Math.max(a||0,e||0);if(c)return this.center=this.unproject(new Point(a?(o+n)/2:this.x,e?(i+t)/2:this.y)),this.zoom+=this.scaleZoom(c),void(this._constraining=!1);if(this.latRange){var u=this.y,l=s.y/2;t>u-l&&(h=t+l),u+l>i&&(h=i-l)}if(this.lngRange){var m=this.x,g=s.x/2;n>m-g&&(r=n+g),m+g>o&&(r=o-g)}(void 0!==r||void 0!==h)&&(this.center=this.unproject(new Point(void 0!==r?r:this.x,void 0!==h?h:this.y))),this._constraining=!1}},getProjMatrix:function(){var t=new Float64Array(16),i=Math.atan(.5/this.altitude),n=Math.sin(i)*this.altitude/Math.sin(Math.PI/2-this._pitch-i),o=Math.cos(Math.PI/2-this._pitch)*n+this.altitude;return mat4.perspective(t,2*Math.atan(this.height/2/this.altitude),this.width/this.height,.1,o),mat4.translate(t,t,[0,0,-this.altitude]),mat4.scale(t,t,[1,-1,1/this.height]),mat4.rotateX(t,t,this._pitch),mat4.rotateZ(t,t,this.angle),mat4.translate(t,t,[-this.x,-this.y,0]),t}};
-	},{"../util/interpolate":102,"../util/util":106,"./coordinate":19,"./lng_lat":20,"gl-matrix":116,"point-geometry":137}],23:[function(require,module,exports){
-	"use strict";var simplexFont={" ":[16,[]],"!":[10,[5,21,5,7,-1,-1,5,2,4,1,5,0,6,1,5,2]],'"':[16,[4,21,4,14,-1,-1,12,21,12,14]],"#":[21,[11,25,4,-7,-1,-1,17,25,10,-7,-1,-1,4,12,18,12,-1,-1,3,6,17,6]],$:[20,[8,25,8,-4,-1,-1,12,25,12,-4,-1,-1,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],"%":[24,[21,21,3,0,-1,-1,8,21,10,19,10,17,9,15,7,14,5,14,3,16,3,18,4,20,6,21,8,21,10,20,13,19,16,19,19,20,21,21,-1,-1,17,7,15,6,14,4,14,2,16,0,18,0,20,1,21,3,21,5,19,7,17,7]],"&":[26,[23,12,23,13,22,14,21,14,20,13,19,11,17,6,15,3,13,1,11,0,7,0,5,1,4,2,3,4,3,6,4,8,5,9,12,13,13,14,14,16,14,18,13,20,11,21,9,20,8,18,8,16,9,13,11,10,16,3,18,1,20,0,22,0,23,1,23,2]],"'":[10,[5,19,4,20,5,21,6,20,6,18,5,16,4,15]],"(":[14,[11,25,9,23,7,20,5,16,4,11,4,7,5,2,7,-2,9,-5,11,-7]],")":[14,[3,25,5,23,7,20,9,16,10,11,10,7,9,2,7,-2,5,-5,3,-7]],"*":[16,[8,21,8,9,-1,-1,3,18,13,12,-1,-1,13,18,3,12]],"+":[26,[13,18,13,0,-1,-1,4,9,22,9]],",":[10,[6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"-":[26,[4,9,22,9]],".":[10,[5,2,4,1,5,0,6,1,5,2]],"/":[22,[20,25,2,-7]],0:[20,[9,21,6,20,4,17,3,12,3,9,4,4,6,1,9,0,11,0,14,1,16,4,17,9,17,12,16,17,14,20,11,21,9,21]],1:[20,[6,17,8,18,11,21,11,0]],2:[20,[4,16,4,17,5,19,6,20,8,21,12,21,14,20,15,19,16,17,16,15,15,13,13,10,3,0,17,0]],3:[20,[5,21,16,21,10,13,13,13,15,12,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],4:[20,[13,21,3,7,18,7,-1,-1,13,21,13,0]],5:[20,[15,21,5,21,4,12,5,13,8,14,11,14,14,13,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],6:[20,[16,18,15,20,12,21,10,21,7,20,5,17,4,12,4,7,5,3,7,1,10,0,11,0,14,1,16,3,17,6,17,7,16,10,14,12,11,13,10,13,7,12,5,10,4,7]],7:[20,[17,21,7,0,-1,-1,3,21,17,21]],8:[20,[8,21,5,20,4,18,4,16,5,14,7,13,11,12,14,11,16,9,17,7,17,4,16,2,15,1,12,0,8,0,5,1,4,2,3,4,3,7,4,9,6,11,9,12,13,13,15,14,16,16,16,18,15,20,12,21,8,21]],9:[20,[16,14,15,11,13,9,10,8,9,8,6,9,4,11,3,14,3,15,4,18,6,20,9,21,10,21,13,20,15,18,16,14,16,9,15,4,13,1,10,0,8,0,5,1,4,3]],":":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,5,2,4,1,5,0,6,1,5,2]],";":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"<":[24,[20,18,4,9,20,0]],"=":[26,[4,12,22,12,-1,-1,4,6,22,6]],">":[24,[4,18,20,9,4,0]],"?":[18,[3,16,3,17,4,19,5,20,7,21,11,21,13,20,14,19,15,17,15,15,14,13,13,12,9,10,9,7,-1,-1,9,2,8,1,9,0,10,1,9,2]],"@":[27,[18,13,17,15,15,16,12,16,10,15,9,14,8,11,8,8,9,6,11,5,14,5,16,6,17,8,-1,-1,12,16,10,14,9,11,9,8,10,6,11,5,-1,-1,18,16,17,8,17,6,19,5,21,5,23,7,24,10,24,12,23,15,22,17,20,19,18,20,15,21,12,21,9,20,7,19,5,17,4,15,3,12,3,9,4,6,5,4,7,2,9,1,12,0,15,0,18,1,20,2,21,3,-1,-1,19,16,18,8,18,6,19,5]],A:[18,[9,21,1,0,-1,-1,9,21,17,0,-1,-1,4,7,14,7]],B:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,-1,-1,4,11,13,11,16,10,17,9,18,7,18,4,17,2,16,1,13,0,4,0]],C:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5]],D:[21,[4,21,4,0,-1,-1,4,21,11,21,14,20,16,18,17,16,18,13,18,8,17,5,16,3,14,1,11,0,4,0]],E:[19,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11,-1,-1,4,0,17,0]],F:[18,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11]],G:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,18,8,-1,-1,13,8,18,8]],H:[22,[4,21,4,0,-1,-1,18,21,18,0,-1,-1,4,11,18,11]],I:[8,[4,21,4,0]],J:[16,[12,21,12,5,11,2,10,1,8,0,6,0,4,1,3,2,2,5,2,7]],K:[21,[4,21,4,0,-1,-1,18,21,4,7,-1,-1,9,12,18,0]],L:[17,[4,21,4,0,-1,-1,4,0,16,0]],M:[24,[4,21,4,0,-1,-1,4,21,12,0,-1,-1,20,21,12,0,-1,-1,20,21,20,0]],N:[22,[4,21,4,0,-1,-1,4,21,18,0,-1,-1,18,21,18,0]],O:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21]],P:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,14,17,12,16,11,13,10,4,10]],Q:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21,-1,-1,12,4,18,-2]],R:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,4,11,-1,-1,11,11,18,0]],S:[20,[17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],T:[16,[8,21,8,0,-1,-1,1,21,15,21]],U:[22,[4,21,4,6,5,3,7,1,10,0,12,0,15,1,17,3,18,6,18,21]],V:[18,[1,21,9,0,-1,-1,17,21,9,0]],W:[24,[2,21,7,0,-1,-1,12,21,7,0,-1,-1,12,21,17,0,-1,-1,22,21,17,0]],X:[20,[3,21,17,0,-1,-1,17,21,3,0]],Y:[18,[1,21,9,11,9,0,-1,-1,17,21,9,11]],Z:[20,[17,21,3,0,-1,-1,3,21,17,21,-1,-1,3,0,17,0]],"[":[14,[4,25,4,-7,-1,-1,5,25,5,-7,-1,-1,4,25,11,25,-1,-1,4,-7,11,-7]],"\\":[14,[0,21,14,-3]],"]":[14,[9,25,9,-7,-1,-1,10,25,10,-7,-1,-1,3,25,10,25,-1,-1,3,-7,10,-7]],"^":[16,[6,15,8,18,10,15,-1,-1,3,12,8,17,13,12,-1,-1,8,17,8,0]],_:[16,[0,-2,16,-2]],"`":[10,[6,21,5,20,4,18,4,16,5,15,6,16,5,17]],a:[19,[15,14,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],b:[19,[4,21,4,0,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],c:[18,[15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],d:[19,[15,21,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],e:[18,[3,8,15,8,15,10,14,12,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],f:[12,[10,21,8,21,6,20,5,17,5,0,-1,-1,2,14,9,14]],g:[19,[15,14,15,-2,14,-5,13,-6,11,-7,8,-7,6,-6,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],h:[19,[4,21,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],i:[8,[3,21,4,20,5,21,4,22,3,21,-1,-1,4,14,4,0]],j:[10,[5,21,6,20,7,21,6,22,5,21,-1,-1,6,14,6,-3,5,-6,3,-7,1,-7]],k:[17,[4,21,4,0,-1,-1,14,14,4,4,-1,-1,8,8,15,0]],l:[8,[4,21,4,0]],m:[30,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0,-1,-1,15,10,18,13,20,14,23,14,25,13,26,10,26,0]],n:[19,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],o:[19,[8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3,16,6,16,8,15,11,13,13,11,14,8,14]],p:[19,[4,14,4,-7,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],q:[19,[15,14,15,-7,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],r:[13,[4,14,4,0,-1,-1,4,8,5,11,7,13,9,14,12,14]],s:[17,[14,11,13,13,10,14,7,14,4,13,3,11,4,9,6,8,11,7,13,6,14,4,14,3,13,1,10,0,7,0,4,1,3,3]],t:[12,[5,21,5,4,6,1,8,0,10,0,-1,-1,2,14,9,14]],u:[19,[4,14,4,4,5,1,7,0,10,0,12,1,15,4,-1,-1,15,14,15,0]],v:[16,[2,14,8,0,-1,-1,14,14,8,0]],w:[22,[3,14,7,0,-1,-1,11,14,7,0,-1,-1,11,14,15,0,-1,-1,19,14,15,0]],x:[17,[3,14,14,0,-1,-1,14,14,3,0]],y:[16,[2,14,8,0,-1,-1,14,14,8,0,6,-4,4,-6,2,-7,1,-7]],z:[17,[14,14,3,0,-1,-1,3,14,14,14,-1,-1,3,0,14,0]],"{":[14,[9,25,7,24,6,23,5,21,5,19,6,17,7,16,8,14,8,12,6,10,-1,-1,7,24,6,22,6,20,7,18,8,17,9,15,9,13,8,11,4,9,8,7,9,5,9,3,8,1,7,0,6,-2,6,-4,7,-6,-1,-1,6,8,8,6,8,4,7,2,6,1,5,-1,5,-3,6,-5,7,-6,9,-7]],"|":[8,[4,25,4,-7]],"}":[14,[5,25,7,24,8,23,9,21,9,19,8,17,7,16,6,14,6,12,8,10,-1,-1,7,24,8,22,8,20,7,18,6,17,5,15,5,13,6,11,10,9,6,7,5,5,5,3,6,1,7,0,8,-2,8,-4,7,-6,-1,-1,8,8,6,6,6,4,7,2,8,1,9,-1,9,-3,8,-5,7,-6,5,-7]],"~":[24,[3,6,3,8,4,11,6,12,8,12,10,11,14,8,16,7,18,7,20,8,21,10,-1,-1,3,8,4,10,6,11,8,11,10,10,14,7,16,6,18,6,20,7,21,10,21,12]]};module.exports=function(l,n,t,e){e=e||1;var r,o,u,s,i,x,f,p,h=[];for(r=0,o=l.length;o>r;r++)if(i=simplexFont[l[r]]){for(p=null,u=0,s=i[1].length;s>u;u+=2)-1===i[1][u]&&-1===i[1][u+1]?p=null:(x=n+i[1][u]*e,f=t-i[1][u+1]*e,p&&h.push(p.x,p.y,x,f),p={x:x,y:f});n+=i[0]*e}return h};
-	},{}],24:[function(require,module,exports){
-	"use strict";var mapboxgl=module.exports={};mapboxgl.Map=require("./ui/map"),mapboxgl.Control=require("./ui/control/control"),mapboxgl.Navigation=require("./ui/control/navigation"),mapboxgl.Attribution=require("./ui/control/attribution"),mapboxgl.Popup=require("./ui/popup"),mapboxgl.GeoJSONSource=require("./source/geojson_source"),mapboxgl.VideoSource=require("./source/video_source"),mapboxgl.ImageSource=require("./source/image_source"),mapboxgl.Style=require("./style/style"),mapboxgl.LngLat=require("./geo/lng_lat"),mapboxgl.LngLatBounds=require("./geo/lng_lat_bounds"),mapboxgl.Point=require("point-geometry"),mapboxgl.Evented=require("./util/evented"),mapboxgl.util=require("./util/util"),mapboxgl.supported=require("./util/browser").supported;var ajax=require("./util/ajax");mapboxgl.util.getJSON=ajax.getJSON,mapboxgl.util.getArrayBuffer=ajax.getArrayBuffer;var config=require("./util/config");mapboxgl.config=config,Object.defineProperty(mapboxgl,"accessToken",{get:function(){return config.ACCESS_TOKEN},set:function(e){config.ACCESS_TOKEN=e}});
-	},{"./geo/lng_lat":20,"./geo/lng_lat_bounds":21,"./source/geojson_source":39,"./source/image_source":41,"./source/video_source":48,"./style/style":56,"./ui/control/attribution":79,"./ui/control/control":80,"./ui/control/navigation":81,"./ui/map":91,"./ui/popup":92,"./util/ajax":94,"./util/browser":95,"./util/config":99,"./util/evented":100,"./util/util":106,"point-geometry":137}],25:[function(require,module,exports){
-	"use strict";function drawBackground(t,a,r){var e,i=t.gl,o=a.paint["background-color"],n=a.paint["background-pattern"],l=a.paint["background-opacity"],u=n?t.spriteAtlas.getPosition(n.from,!0):null,m=n?t.spriteAtlas.getPosition(n.to,!0):null;if(u&&m){e=t.patternShader,i.switchShader(e,r),i.uniform1i(e.u_image,0),i.uniform2fv(e.u_pattern_tl_a,u.tl),i.uniform2fv(e.u_pattern_br_a,u.br),i.uniform2fv(e.u_pattern_tl_b,m.tl),i.uniform2fv(e.u_pattern_br_b,m.br),i.uniform1f(e.u_opacity,l);var c=t.transform,f=u.size,s=m.size,_=c.locationCoordinate(c.center),S=1/Math.pow(2,c.zoomFraction);i.uniform1f(e.u_mix,n.t);var d=mat3.create();mat3.scale(d,d,[1/(f[0]*n.fromScale),1/(f[1]*n.fromScale)]),mat3.translate(d,d,[_.column*c.tileSize%(f[0]*n.fromScale),_.row*c.tileSize%(f[1]*n.fromScale)]),mat3.rotate(d,d,-c.angle),mat3.scale(d,d,[S*c.width/2,-S*c.height/2]);var p=mat3.create();mat3.scale(p,p,[1/(s[0]*n.toScale),1/(s[1]*n.toScale)]),mat3.translate(p,p,[_.column*c.tileSize%(s[0]*n.toScale),_.row*c.tileSize%(s[1]*n.toScale)]),mat3.rotate(p,p,-c.angle),mat3.scale(p,p,[S*c.width/2,-S*c.height/2]),i.uniformMatrix3fv(e.u_patternmatrix_a,!1,d),i.uniformMatrix3fv(e.u_patternmatrix_b,!1,p),t.spriteAtlas.bind(i,!0)}else e=t.fillShader,i.switchShader(e,r),i.uniform4fv(e.u_color,o);i.disable(i.STENCIL_TEST),i.bindBuffer(i.ARRAY_BUFFER,t.backgroundBuffer),i.vertexAttribPointer(e.a_pos,t.backgroundBuffer.itemSize,i.SHORT,!1,0,0),i.drawArrays(i.TRIANGLE_STRIP,0,t.backgroundBuffer.itemCount),i.enable(i.STENCIL_TEST),i.stencilMask(0),i.stencilFunc(i.EQUAL,128,128)}var mat3=require("gl-matrix").mat3;module.exports=drawBackground;
-	},{"gl-matrix":116}],26:[function(require,module,exports){
-	"use strict";function drawCircles(e,r,i,a){if(a.buffers){i=e.translateMatrix(i,a,r.paint["circle-translate"],r.paint["circle-translate-anchor"]);var t=a.elementGroups[r.ref||r.id];if(t){var l=e.gl;l.disable(l.STENCIL_TEST),l.switchShader(e.circleShader,i,a.exMatrix);var c=a.buffers.circleVertex,n=e.circleShader,s=a.buffers.circleElement,u=1/browser.devicePixelRatio/r.paint["circle-radius"];l.uniform4fv(n.u_color,r.paint["circle-color"]),l.uniform1f(n.u_blur,Math.max(r.paint["circle-blur"],u)),l.uniform1f(n.u_size,r.paint["circle-radius"]);for(var o=0;o<t.groups.length;o++){var f=t.groups[o],d=f.vertexStartIndex*c.itemSize;c.bind(l,n,d),s.bind(l,n,d);var S=3*f.elementLength,b=f.elementStartIndex*s.itemSize;l.drawElements(l.TRIANGLES,S,l.UNSIGNED_SHORT,b)}l.enable(l.STENCIL_TEST)}}}var browser=require("../util/browser.js");module.exports=drawCircles;
-	},{"../util/browser.js":95}],27:[function(require,module,exports){
-	"use strict";function drawPlacementDebug(r,e,o,t){var a=t.elementGroups[e.ref||e.id].collisionBox;if(a){var i=r.gl,n=t.buffers.collisionBoxVertex,s=r.collisionBoxShader;i.enable(i.STENCIL_TEST),i.switchShader(s,o),n.bind(i,s),i.lineWidth(1);var u=12;i.vertexAttribPointer(s.a_pos,2,i.SHORT,!1,u,0),i.vertexAttribPointer(s.a_extrude,2,i.SHORT,!1,u,4),i.vertexAttribPointer(s.a_data,2,i.UNSIGNED_BYTE,!1,u,8),i.uniform1f(s.u_scale,Math.pow(2,r.transform.zoom-t.coord.z)),i.uniform1f(s.u_zoom,10*r.transform.zoom),i.uniform1f(s.u_maxzoom,10*(t.coord.z+1));var d=a.groups[0].vertexStartIndex,l=a.groups[0].vertexLength;i.drawArrays(i.LINES,d,l),i.disable(i.STENCIL_TEST)}}module.exports=drawPlacementDebug;
-	},{}],28:[function(require,module,exports){
-	"use strict";function drawDebug(e,r){var t=e.gl;t.blendFunc(t.ONE,t.ONE_MINUS_SRC_ALPHA),t.switchShader(e.debugShader,r.posMatrix),t.bindBuffer(t.ARRAY_BUFFER,e.debugBuffer),t.vertexAttribPointer(e.debugShader.a_pos,e.debugBuffer.itemSize,t.SHORT,!1,0,0),t.uniform4f(e.debugShader.u_color,1,0,0,1),t.lineWidth(4),t.drawArrays(t.LINE_STRIP,0,e.debugBuffer.itemCount);var i=textVertices(r.coord.toString(),50,200,5);t.bindBuffer(t.ARRAY_BUFFER,e.debugTextBuffer),t.bufferData(t.ARRAY_BUFFER,new Int16Array(i),t.STREAM_DRAW),t.vertexAttribPointer(e.debugShader.a_pos,e.debugTextBuffer.itemSize,t.SHORT,!1,0,0),t.lineWidth(8*browser.devicePixelRatio),t.uniform4f(e.debugShader.u_color,1,1,1,1),t.drawArrays(t.LINES,0,i.length/e.debugTextBuffer.itemSize),t.lineWidth(2*browser.devicePixelRatio),t.uniform4f(e.debugShader.u_color,0,0,0,1),t.drawArrays(t.LINES,0,i.length/e.debugTextBuffer.itemSize),t.blendFunc(t.ONE_MINUS_DST_ALPHA,t.ONE)}var textVertices=require("../lib/debugtext"),browser=require("../util/browser");module.exports=drawDebug;
-	},{"../lib/debugtext":23,"../util/browser":95}],29:[function(require,module,exports){
-	"use strict";function drawFill(e,t,r,i){if(i.buffers){var a=i.elementGroups[t.ref||t.id];if(a){var l,n,o,f,s=e.gl,u=e.translateMatrix(r,i,t.paint["fill-translate"],t.paint["fill-translate-anchor"]),c=t.paint["fill-color"];s.stencilMask(63),s.clear(s.STENCIL_BUFFER_BIT),s.stencilFunc(s.NOTEQUAL,128,128),s.stencilOpSeparate(s.FRONT,s.INCR_WRAP,s.KEEP,s.KEEP),s.stencilOpSeparate(s.BACK,s.DECR_WRAP,s.KEEP,s.KEEP),s.colorMask(!1,!1,!1,!1),s.switchShader(e.fillShader,u),l=i.buffers.fillVertex,l.bind(s),n=i.buffers.fillElement,n.bind(s);for(var m,S,E=0;E<a.groups.length;E++)o=a.groups[E],m=o.vertexStartIndex*l.itemSize,s.vertexAttribPointer(e.fillShader.a_pos,2,s.SHORT,!1,4,m+0),f=3*o.elementLength,S=o.elementStartIndex*n.itemSize,s.drawElements(s.TRIANGLES,f,s.UNSIGNED_SHORT,S);s.colorMask(!0,!0,!0,!0),s.stencilOp(s.KEEP,s.KEEP,s.KEEP),s.stencilMask(0);var d=t.paint["fill-outline-color"];if(t.paint["fill-antialias"]===!0&&(!t.paint["fill-pattern"]||d)){s.switchShader(e.outlineShader,u),s.lineWidth(2*browser.devicePixelRatio),d?s.stencilFunc(s.EQUAL,128,128):s.stencilFunc(s.EQUAL,128,191),s.uniform2f(e.outlineShader.u_world,s.drawingBufferWidth,s.drawingBufferHeight),s.uniform4fv(e.outlineShader.u_color,d?d:c),l=i.buffers.fillVertex,n=i.buffers.outlineElement,n.bind(s);for(var p=0;p<a.groups.length;p++)o=a.groups[p],m=o.vertexStartIndex*l.itemSize,s.vertexAttribPointer(e.outlineShader.a_pos,2,s.SHORT,!1,4,m+0),f=2*o.secondElementLength,S=o.secondElementStartIndex*n.itemSize,s.drawElements(s.LINES,f,s.UNSIGNED_SHORT,S)}var _,h=t.paint["fill-pattern"],v=t.paint["fill-opacity"]||1;if(h){var x=e.spriteAtlas.getPosition(h.from,!0),b=e.spriteAtlas.getPosition(h.to,!0);if(!x||!b)return;_=e.patternShader,s.switchShader(_,r),s.uniform1i(_.u_image,0),s.uniform2fv(_.u_pattern_tl_a,x.tl),s.uniform2fv(_.u_pattern_br_a,x.br),s.uniform2fv(_.u_pattern_tl_b,b.tl),s.uniform2fv(_.u_pattern_br_b,b.br),s.uniform1f(_.u_opacity,v),s.uniform1f(_.u_mix,h.t);var A=i.tileExtent/i.tileSize/Math.pow(2,e.transform.tileZoom-i.coord.z),R=mat3.create();mat3.scale(R,R,[1/(x.size[0]*A*h.fromScale),1/(x.size[1]*A*h.fromScale)]);var g=mat3.create();mat3.scale(g,g,[1/(b.size[0]*A*h.toScale),1/(b.size[1]*A*h.toScale)]),s.uniformMatrix3fv(_.u_patternmatrix_a,!1,R),s.uniformMatrix3fv(_.u_patternmatrix_b,!1,g),e.spriteAtlas.bind(s,!0)}else _=e.fillShader,s.switchShader(_,r),s.uniform4fv(_.u_color,c);s.stencilFunc(s.NOTEQUAL,0,63),s.bindBuffer(s.ARRAY_BUFFER,e.tileExtentBuffer),s.vertexAttribPointer(_.a_pos,e.tileExtentBuffer.itemSize,s.SHORT,!1,0,0),s.drawArrays(s.TRIANGLE_STRIP,0,e.tileExtentBuffer.itemCount),s.stencilMask(0),s.stencilFunc(s.EQUAL,128,128)}}}var browser=require("../util/browser"),mat3=require("gl-matrix").mat3;module.exports=drawFill;
-	},{"../util/browser":95,"gl-matrix":116}],30:[function(require,module,exports){
-	"use strict";var browser=require("../util/browser"),mat2=require("gl-matrix").mat2;module.exports=function(t,i,e,r){if(r.buffers){var a=r.elementGroups[i.ref||i.id];if(a){var n=t.gl;if(!(i.paint["line-width"]<=0)){var o=1/browser.devicePixelRatio,f=i.paint["line-blur"]+o,l=i.paint["line-width"]/2,u=-1,m=0,s=0;i.paint["line-gap-width"]>0&&(u=i.paint["line-gap-width"]/2+.5*o,l=i.paint["line-width"],m=u-o/2);var _=m+l+o/2+s,h=i.paint["line-color"],d=t.transform.scale/(1<<r.coord.z)/(r.tileExtent/r.tileSize),p=t.translateMatrix(e,r,i.paint["line-translate"],i.paint["line-translate-anchor"]),v=t.transform,c=mat2.create();mat2.scale(c,c,[1,Math.cos(v._pitch)]),mat2.rotate(c,c,t.transform.angle);var x,b=Math.sqrt(v.height*v.height/4*(1+v.altitude*v.altitude)),w=v.height/2*Math.tan(v._pitch),g=(b+w)/b-1,S=r.tileSize/t.transform.tileSize,M=i.paint["line-dasharray"],z=i.paint["line-pattern"];if(M){x=t.linesdfpatternShader,n.switchShader(x,p,r.exMatrix),n.uniform2fv(x.u_linewidth,[_,u]),n.uniform1f(x.u_ratio,d),n.uniform1f(x.u_blur,f),n.uniform4fv(x.u_color,h);var A=t.lineAtlas.getDash(M.from,"round"===i.layout["line-cap"]),y=t.lineAtlas.getDash(M.to,"round"===i.layout["line-cap"]);t.lineAtlas.bind(n);var E=Math.pow(2,Math.floor(Math.log(t.transform.scale)/Math.LN2)-r.coord.z)/8*S,P=[E/A.width/M.fromScale,-A.height/2],R=t.lineAtlas.width/(M.fromScale*A.width*256*browser.devicePixelRatio)/2,I=[E/y.width/M.toScale,-y.height/2],N=t.lineAtlas.width/(M.toScale*y.width*256*browser.devicePixelRatio)/2;n.uniform2fv(x.u_patternscale_a,P),n.uniform1f(x.u_tex_y_a,A.y),n.uniform2fv(x.u_patternscale_b,I),n.uniform1f(x.u_tex_y_b,y.y),n.uniform1i(x.u_image,0),n.uniform1f(x.u_sdfgamma,Math.max(R,N)),n.uniform1f(x.u_mix,M.t),n.uniform1f(x.u_extra,g),n.uniformMatrix2fv(x.u_antialiasingmatrix,!1,c)}else if(z){var T=t.spriteAtlas.getPosition(z.from,!0),q=t.spriteAtlas.getPosition(z.to,!0);if(!T||!q)return;var D=r.tileExtent/r.tileSize/Math.pow(2,t.transform.tileZoom-r.coord.z)*S;t.spriteAtlas.bind(n,!0),x=t.linepatternShader,n.switchShader(x,p,r.exMatrix),n.uniform2fv(x.u_linewidth,[_,u]),n.uniform1f(x.u_ratio,d),n.uniform1f(x.u_blur,f),n.uniform2fv(x.u_pattern_size_a,[T.size[0]*D*z.fromScale,q.size[1]]),n.uniform2fv(x.u_pattern_size_b,[q.size[0]*D*z.toScale,q.size[1]]),n.uniform2fv(x.u_pattern_tl_a,T.tl),n.uniform2fv(x.u_pattern_br_a,T.br),n.uniform2fv(x.u_pattern_tl_b,q.tl),n.uniform2fv(x.u_pattern_br_b,q.br),n.uniform1f(x.u_fade,z.t),n.uniform1f(x.u_opacity,i.paint["line-opacity"]),n.uniform1f(x.u_extra,g),n.uniformMatrix2fv(x.u_antialiasingmatrix,!1,c)}else x=t.lineShader,n.switchShader(x,p,r.exMatrix),n.uniform2fv(x.u_linewidth,[_,u]),n.uniform1f(x.u_ratio,d),n.uniform1f(x.u_blur,f),n.uniform1f(x.u_extra,g),n.uniformMatrix2fv(x.u_antialiasingmatrix,!1,c),n.uniform4fv(x.u_color,h);var G=r.buffers.lineVertex;G.bind(n);var L=r.buffers.lineElement;L.bind(n);for(var H=0;H<a.groups.length;H++){var O=a.groups[H],B=O.vertexStartIndex*G.itemSize;n.vertexAttribPointer(x.a_pos,2,n.SHORT,!1,8,B+0),n.vertexAttribPointer(x.a_data,4,n.BYTE,!1,8,B+4);var U=3*O.elementLength,V=O.elementStartIndex*L.itemSize;n.drawElements(n.TRIANGLES,U,n.UNSIGNED_SHORT,V)}}}}};
-	},{"../util/browser":95,"gl-matrix":116}],31:[function(require,module,exports){
-	"use strict";function drawRaster(t,r,e,a){var i=t.gl;i.disable(i.STENCIL_TEST);var o=t.rasterShader;i.switchShader(o,e),i.uniform1f(o.u_brightness_low,r.paint["raster-brightness-min"]),i.uniform1f(o.u_brightness_high,r.paint["raster-brightness-max"]),i.uniform1f(o.u_saturation_factor,saturationFactor(r.paint["raster-saturation"])),i.uniform1f(o.u_contrast_factor,contrastFactor(r.paint["raster-contrast"])),i.uniform3fv(o.u_spin_weights,spinWeights(r.paint["raster-hue-rotate"]));var n,u,s=a.source&&a.source._pyramid.findLoadedParent(a.coord,0,{}),c=getOpacities(a,s,r,t.transform);i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,a.texture),s?(i.activeTexture(i.TEXTURE1),i.bindTexture(i.TEXTURE_2D,s.texture),n=Math.pow(2,s.coord.z-a.coord.z),u=[a.coord.x*n%1,a.coord.y*n%1]):c[1]=0,i.uniform2fv(o.u_tl_parent,u||[0,0]),i.uniform1f(o.u_scale_parent,n||1),i.uniform1f(o.u_buffer_scale,1),i.uniform1f(o.u_opacity0,c[0]),i.uniform1f(o.u_opacity1,c[1]),i.uniform1i(o.u_image0,0),i.uniform1i(o.u_image1,1),i.bindBuffer(i.ARRAY_BUFFER,a.boundsBuffer||t.tileExtentBuffer),i.vertexAttribPointer(o.a_pos,2,i.SHORT,!1,8,0),i.vertexAttribPointer(o.a_texture_pos,2,i.SHORT,!1,8,4),i.drawArrays(i.TRIANGLE_STRIP,0,4),i.enable(i.STENCIL_TEST)}function spinWeights(t){t*=Math.PI/180;var r=Math.sin(t),e=Math.cos(t);return[(2*e+1)/3,(-Math.sqrt(3)*r-e+1)/3,(Math.sqrt(3)*r-e+1)/3]}function contrastFactor(t){return t>0?1/(1-t):1+t}function saturationFactor(t){return t>0?1-1/(1.001-t):-t}function getOpacities(t,r,e,a){if(!t.source)return[1,0];var i=(new Date).getTime(),o=e.paint["raster-fade-duration"],n=(i-t.timeAdded)/o,u=r?(i-r.timeAdded)/o:-1,s=t.source._pyramid.coveringZoomLevel(a),c=r?Math.abs(r.coord.z-s)>Math.abs(t.coord.z-s):!1,f=[];!r||c?(f[0]=util.clamp(n,0,1),f[1]=1-f[0]):(f[0]=util.clamp(1-u,0,1),f[1]=1-f[0]);var d=e.paint["raster-opacity"];return f[0]*=d,f[1]*=d,f}var util=require("../util/util");module.exports=drawRaster;
-	},{"../util/util":106}],32:[function(require,module,exports){
-	"use strict";function drawSymbols(e,t,r,a){if(a.buffers){var o=a.elementGroups[t.ref||t.id];if(o){var i=!(t.layout["text-allow-overlap"]||t.layout["icon-allow-overlap"]||t.layout["text-ignore-placement"]||t.layout["icon-ignore-placement"]),n=e.gl;i&&n.disable(n.STENCIL_TEST),o.text.groups.length&&drawSymbol(e,t,r,a,o.text,"text",!0),o.icon.groups.length&&drawSymbol(e,t,r,a,o.icon,"icon",o.sdfIcons),drawCollisionDebug(e,t,r,a),i&&n.enable(n.STENCIL_TEST)}}}function drawSymbol(e,t,r,a,o,i,n){var l=e.gl;r=e.translateMatrix(r,a,t.paint[i+"-translate"],t.paint[i+"-translate-anchor"]);var m,f,u,s=e.transform,d="map"===t.layout[i+"-rotation-alignment"],h=d;h?(m=mat4.create(),f=a.tileExtent/a.tileSize/Math.pow(2,e.transform.zoom-a.coord.z),u=1/Math.cos(s._pitch)):(m=mat4.clone(a.exMatrix),f=e.transform.altitude,u=1),mat4.scale(m,m,[f,f,1]);var p=t.paint[i+"-size"],g=p/defaultSizes[i];mat4.scale(m,m,[g,g,1]);var S,c,x,b,v=Math.sqrt(s.height*s.height/4*(1+s.altitude*s.altitude)),_=s.height/2*Math.tan(s._pitch),z=(v+_)/v-1,w="text"===i;if(w||e.style.sprite.loaded()){l.activeTexture(l.TEXTURE0),S=n?e.sdfShader:e.iconShader,w?(e.glyphAtlas.updateTexture(l),c=a.buffers.glyphVertex,x=a.buffers.glyphElement,b=[e.glyphAtlas.width/4,e.glyphAtlas.height/4]):(e.spriteAtlas.bind(l,d||e.options.rotating||e.options.zooming||1!==g||n||e.transform.pitch),c=a.buffers.iconVertex,x=a.buffers.iconElement,b=[e.spriteAtlas.width/4,e.spriteAtlas.height/4]),l.switchShader(S,r,m),l.uniform1i(S.u_texture,0),l.uniform2fv(S.u_texsize,b),l.uniform1i(S.u_skewed,h),l.uniform1f(S.u_extra,z);var y=Math.log(p/o[i+"-size"])/Math.LN2||0;l.uniform1f(S.u_zoom,10*(e.transform.zoom-y));var E=e.frameHistory.getFadeProperties(300);l.uniform1f(S.u_fadedist,10*E.fadedist),l.uniform1f(S.u_minfadezoom,Math.floor(10*E.minfadezoom)),l.uniform1f(S.u_maxfadezoom,Math.floor(10*E.maxfadezoom)),l.uniform1f(S.u_fadezoom,10*(e.transform.zoom+E.bump));var T,I,N,M;if(x.bind(l),n){var A=8,L=1.19,R=6,G=.105*defaultSizes[i]/p/browser.devicePixelRatio;l.uniform1f(S.u_gamma,G*u),l.uniform4fv(S.u_color,t.paint[i+"-color"]),l.uniform1f(S.u_buffer,.75);for(var D=0;D<o.groups.length;D++)T=o.groups[D],I=T.vertexStartIndex*c.itemSize,c.bind(l,S,I),N=3*T.elementLength,M=T.elementStartIndex*x.itemSize,l.drawElements(l.TRIANGLES,N,l.UNSIGNED_SHORT,M);if(t.paint[i+"-halo-width"]){l.uniform1f(S.u_gamma,(t.paint[i+"-halo-blur"]*L/g/A+G)*u),l.uniform4fv(S.u_color,t.paint[i+"-halo-color"]),l.uniform1f(S.u_buffer,(R-t.paint[i+"-halo-width"]/g)/A);for(var q=0;q<o.groups.length;q++)T=o.groups[q],I=T.vertexStartIndex*c.itemSize,c.bind(l,S,I),N=3*T.elementLength,M=T.elementStartIndex*x.itemSize,l.drawElements(l.TRIANGLES,N,l.UNSIGNED_SHORT,M)}}else{l.uniform1f(S.u_opacity,t.paint["icon-opacity"]);for(var C=0;C<o.groups.length;C++)T=o.groups[C],I=T.vertexStartIndex*c.itemSize,c.bind(l,S,I),N=3*T.elementLength,M=T.elementStartIndex*x.itemSize,l.drawElements(l.TRIANGLES,N,l.UNSIGNED_SHORT,M)}}}var browser=require("../util/browser"),mat4=require("gl-matrix").mat4,drawCollisionDebug=require("./draw_collision_debug");module.exports=drawSymbols;var defaultSizes={icon:1,text:24};
-	},{"../util/browser":95,"./draw_collision_debug":27,"gl-matrix":116}],33:[function(require,module,exports){
-	"use strict";function drawVertices(e,r,t,i){function o(r,t,i,o){f.switchShader(e.dotShader,i),f.uniform1f(e.dotShader.u_size,4*browser.devicePixelRatio),f.uniform1f(e.dotShader.u_blur,.25),f.uniform4fv(e.dotShader.u_color,[.1,0,0,.1]),r.bind(f,e.dotShader,0);for(var a=0;a<t.length;a++){var s=t[a],u=s.vertexStartIndex,d=s.vertexLength;f.vertexAttribPointer(e.dotShader.a_pos,2,f.SHORT,!1,o,0),f.drawArrays(f.POINTS,u,d)}}var f=e.gl;if(i&&i.buffers){var a=i.elementGroups[r.ref||r.id];if(a){if(f.blendFunc(f.ONE,f.ONE_MINUS_SRC_ALPHA),"fill"===r.type)o(i.buffers.fillVertex,a.groups,t,4);else if("symbol"===r.type)o(i.buffers.iconVertex,a.icon.groups,t,16),o(i.buffers.glyphVertex,a.text.groups,t,16);else if("line"===r.type){var s=mat4.clone(t);mat4.scale(s,s,[.5,.5,1]),o(i.buffers.lineVertex,a.groups,s,8)}f.blendFunc(f.ONE_MINUS_DST_ALPHA,f.ONE)}}}var browser=require("../util/browser"),mat4=require("gl-matrix").mat4;module.exports=drawVertices;
-	},{"../util/browser":95,"gl-matrix":116}],34:[function(require,module,exports){
-	"use strict";function FrameHistory(){this.frameHistory=[]}module.exports=FrameHistory,FrameHistory.prototype.getFadeProperties=function(t){void 0===t&&(t=300);for(var e=(new Date).getTime();this.frameHistory.length>3&&this.frameHistory[1].time+t<e;)this.frameHistory.shift();this.frameHistory[1].time+t<e&&(this.frameHistory[0].z=this.frameHistory[1].z);var r=this.frameHistory.length;3>r&&console.warn("there should never be less than three frames in the history");var i=this.frameHistory[0].z,s=this.frameHistory[r-1],o=s.z,a=Math.min(i,o),m=Math.max(i,o),h=s.z-this.frameHistory[1].z,f=s.time-this.frameHistory[1].time,y=h/(f/t);isNaN(y)&&console.warn("fadedist should never be NaN");var n=(e-s.time)/t*y;return{fadedist:y,minfadezoom:a,maxfadezoom:m,bump:n}},FrameHistory.prototype.record=function(t){var e=(new Date).getTime();this.frameHistory.length||this.frameHistory.push({time:0,z:t},{time:0,z:t}),(2===this.frameHistory.length||this.frameHistory[this.frameHistory.length-1].z!==t)&&this.frameHistory.push({time:e,z:t})};
-	},{}],35:[function(require,module,exports){
-	"use strict";var shaders=require("./shaders"),util=require("../util/util");exports.extend=function(r){var t=r.lineWidth,e=r.getParameter(r.ALIASED_LINE_WIDTH_RANGE);return r.lineWidth=function(i){t.call(r,util.clamp(i,e[0],e[1]))},r.getShader=function(r,t){var e=t===this.FRAGMENT_SHADER?"fragment":"vertex";if(!shaders[r]||!shaders[r][e])throw new Error("Could not find shader "+r);var i=this.createShader(t),a=shaders[r][e];if("undefined"==typeof orientation&&(a=a.replace(/ highp /g," ")),this.shaderSource(i,a),this.compileShader(i),!this.getShaderParameter(i,this.COMPILE_STATUS))throw new Error(this.getShaderInfoLog(i));return i},r.initializeShader=function(r,t,e){var i={program:this.createProgram(),fragment:this.getShader(r,this.FRAGMENT_SHADER),vertex:this.getShader(r,this.VERTEX_SHADER),attributes:[]};if(this.attachShader(i.program,i.vertex),this.attachShader(i.program,i.fragment),this.linkProgram(i.program),this.getProgramParameter(i.program,this.LINK_STATUS)){for(var a=0;a<t.length;a++)i[t[a]]=this.getAttribLocation(i.program,t[a]),i.attributes.push(i[t[a]]);for(var h=0;h<e.length;h++)i[e[h]]=this.getUniformLocation(i.program,e[h])}else console.error(this.getProgramInfoLog(i.program));return i},r.switchShader=function(r,t,e){if(t||console.trace("posMatrix does not have required argument"),this.currentShader!==r){this.useProgram(r.program);for(var i=this.currentShader?this.currentShader.attributes:[],a=r.attributes,h=0;h<i.length;h++)a.indexOf(i[h])<0&&this.disableVertexAttribArray(i[h]);for(var o=0;o<a.length;o++)i.indexOf(a[o])<0&&this.enableVertexAttribArray(a[o]);this.currentShader=r}r.posMatrix!==t&&(this.uniformMatrix4fv(r.u_matrix,!1,t),r.posMatrix=t),e&&r.exMatrix!==e&&r.u_exmatrix&&(this.uniformMatrix4fv(r.u_exmatrix,!1,e),r.exMatrix=e)},r.vertexAttrib2fv=function(t,e){r.vertexAttrib2f(t,e[0],e[1])},r.vertexAttrib3fv=function(t,e){r.vertexAttrib3f(t,e[0],e[1],e[2])},r.vertexAttrib4fv=function(t,e){r.vertexAttrib4f(t,e[0],e[1],e[2],e[3])},r};
-	},{"../util/util":106,"./shaders":38}],36:[function(require,module,exports){
-	"use strict";function LineAtlas(t,i){this.width=t,this.height=i,this.nextRow=0,this.bytes=4,this.data=new Uint8Array(this.width*this.height*this.bytes),this.positions={}}module.exports=LineAtlas,LineAtlas.prototype.setSprite=function(t){this.sprite=t},LineAtlas.prototype.getDash=function(t,i){var e=t.join(",")+i;return this.positions[e]||(this.positions[e]=this.addDash(t,i)),this.positions[e]},LineAtlas.prototype.addDash=function(t,i){var e=i?7:0,h=2*e+1,s=128;if(this.nextRow+h>this.height)return console.warn("LineAtlas out of space"),null;for(var a=0,r=0;r<t.length;r++)a+=t[r];for(var n=this.width/a,o=n/2,d=t.length%2===1,E=-e;e>=E;E++)for(var T=this.nextRow+e+E,l=this.width*T,R=d?-t[t.length-1]:0,u=t[0],g=1,p=0;p<this.width;p++){for(;p/n>u;)R=u,u+=t[g],d&&g===t.length-1&&(u+=t[0]),g++;var x,f=Math.abs(p-R*n),A=Math.abs(p-u*n),w=Math.min(f,A),_=g%2===1;if(i){var y=e?E/e*(o+1):0;if(_){var D=o-Math.abs(y);x=Math.sqrt(w*w+D*D)}else x=o-Math.sqrt(w*w+y*y)}else x=(_?1:-1)*w;this.data[3+4*(l+p)]=Math.max(0,Math.min(255,x+s))}var c={y:(this.nextRow+e+.5)/this.height,height:2*e/this.height,width:a};return this.nextRow+=h,this.dirty=!0,c},LineAtlas.prototype.bind=function(t){this.texture?(t.bindTexture(t.TEXTURE_2D,this.texture),this.dirty&&(this.dirty=!1,t.texSubImage2D(t.TEXTURE_2D,0,0,0,this.width,this.height,t.RGBA,t.UNSIGNED_BYTE,this.data))):(this.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texture),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,this.data))},LineAtlas.prototype.debug=function(){var t=document.createElement("canvas");document.body.appendChild(t),t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.background="#ff0",t.width=this.width,t.height=this.height;for(var i=t.getContext("2d"),e=i.getImageData(0,0,this.width,this.height),h=0;h<this.data.length;h++)if(this.sdf){var s=4*h;e.data[s]=e.data[s+1]=e.data[s+2]=0,e.data[s+3]=this.data[h]}else e.data[h]=this.data[h];i.putImageData(e,0,0)};
-	},{}],37:[function(require,module,exports){
-	"use strict";function Painter(t,e){this.gl=glutil.extend(t),this.transform=e,this.reusableTextures={},this.preFbos={},this.frameHistory=new FrameHistory,this.setup()}var glutil=require("./gl_util"),browser=require("../util/browser"),mat4=require("gl-matrix").mat4,FrameHistory=require("./frame_history");module.exports=Painter,Painter.prototype.resize=function(t,e){var i=this.gl;this.width=t*browser.devicePixelRatio,this.height=e*browser.devicePixelRatio,i.viewport(0,0,this.width,this.height)},Painter.prototype.setup=function(){var t=this.gl;t.verbose=!0,t.enable(t.BLEND),t.blendFunc(t.ONE_MINUS_DST_ALPHA,t.ONE),t.enable(t.STENCIL_TEST),this.debugShader=t.initializeShader("debug",["a_pos"],["u_matrix","u_color"]),this.rasterShader=t.initializeShader("raster",["a_pos","a_texture_pos"],["u_matrix","u_brightness_low","u_brightness_high","u_saturation_factor","u_spin_weights","u_contrast_factor","u_opacity0","u_opacity1","u_image0","u_image1","u_tl_parent","u_scale_parent","u_buffer_scale"]),this.circleShader=t.initializeShader("circle",["a_pos"],["u_matrix","u_exmatrix","u_blur","u_size","u_color"]),this.lineShader=t.initializeShader("line",["a_pos","a_data"],["u_matrix","u_linewidth","u_color","u_ratio","u_blur","u_extra","u_antialiasingmatrix"]),this.linepatternShader=t.initializeShader("linepattern",["a_pos","a_data"],["u_matrix","u_linewidth","u_ratio","u_pattern_size_a","u_pattern_size_b","u_pattern_tl_a","u_pattern_br_a","u_pattern_tl_b","u_pattern_br_b","u_blur","u_fade","u_opacity","u_extra","u_antialiasingmatrix"]),this.linesdfpatternShader=t.initializeShader("linesdfpattern",["a_pos","a_data"],["u_matrix","u_linewidth","u_color","u_ratio","u_blur","u_patternscale_a","u_tex_y_a","u_patternscale_b","u_tex_y_b","u_image","u_sdfgamma","u_mix","u_extra","u_antialiasingmatrix"]),this.dotShader=t.initializeShader("dot",["a_pos"],["u_matrix","u_size","u_color","u_blur"]),this.sdfShader=t.initializeShader("sdf",["a_pos","a_offset","a_data1","a_data2"],["u_matrix","u_exmatrix","u_texture","u_texsize","u_color","u_gamma","u_buffer","u_zoom","u_fadedist","u_minfadezoom","u_maxfadezoom","u_fadezoom","u_skewed","u_extra"]),this.iconShader=t.initializeShader("icon",["a_pos","a_offset","a_data1","a_data2"],["u_matrix","u_exmatrix","u_texture","u_texsize","u_zoom","u_fadedist","u_minfadezoom","u_maxfadezoom","u_fadezoom","u_opacity","u_skewed","u_extra"]),this.outlineShader=t.initializeShader("outline",["a_pos"],["u_matrix","u_color","u_world"]),this.patternShader=t.initializeShader("pattern",["a_pos"],["u_matrix","u_pattern_tl_a","u_pattern_br_a","u_pattern_tl_b","u_pattern_br_b","u_mix","u_patternmatrix_a","u_patternmatrix_b","u_opacity","u_image"]),this.fillShader=t.initializeShader("fill",["a_pos"],["u_matrix","u_color"]),this.collisionBoxShader=t.initializeShader("collisionbox",["a_pos","a_extrude","a_data"],["u_matrix","u_scale","u_zoom","u_maxzoom"]),this.identityMatrix=mat4.create(),this.backgroundBuffer=t.createBuffer(),this.backgroundBuffer.itemSize=2,this.backgroundBuffer.itemCount=4,t.bindBuffer(t.ARRAY_BUFFER,this.backgroundBuffer),t.bufferData(t.ARRAY_BUFFER,new Int16Array([-1,-1,1,-1,-1,1,1,1]),t.STATIC_DRAW),this.setExtent(4096),this.debugTextBuffer=t.createBuffer(),this.debugTextBuffer.itemSize=2},Painter.prototype.setExtent=function(t){if(t&&t!==this.tileExtent){this.tileExtent=t;var e=this.gl;this.tileExtentBuffer=e.createBuffer(),this.tileExtentBuffer.itemSize=4,this.tileExtentBuffer.itemCount=4,e.bindBuffer(e.ARRAY_BUFFER,this.tileExtentBuffer),e.bufferData(e.ARRAY_BUFFER,new Int16Array([0,0,0,0,this.tileExtent,0,32767,0,0,this.tileExtent,0,32767,this.tileExtent,this.tileExtent,32767,32767]),e.STATIC_DRAW),this.debugBuffer=e.createBuffer(),this.debugBuffer.itemSize=2,this.debugBuffer.itemCount=5,e.bindBuffer(e.ARRAY_BUFFER,this.debugBuffer),e.bufferData(e.ARRAY_BUFFER,new Int16Array([0,0,this.tileExtent-1,0,this.tileExtent-1,this.tileExtent-1,0,this.tileExtent-1,0,0]),e.STATIC_DRAW)}},Painter.prototype.clearColor=function(){var t=this.gl;t.clearColor(0,0,0,0),t.clear(t.COLOR_BUFFER_BIT)},Painter.prototype.clearStencil=function(){var t=this.gl;t.clearStencil(0),t.stencilMask(255),t.clear(t.STENCIL_BUFFER_BIT)},Painter.prototype.drawClippingMask=function(t){var e=this.gl;e.switchShader(this.fillShader,t.posMatrix),e.colorMask(!1,!1,!1,!1),e.clearStencil(0),e.stencilMask(191),e.clear(e.STENCIL_BUFFER_BIT),e.stencilFunc(e.EQUAL,192,64),e.stencilMask(192),e.stencilOp(e.REPLACE,e.KEEP,e.KEEP),e.bindBuffer(e.ARRAY_BUFFER,this.tileExtentBuffer),e.vertexAttribPointer(this.fillShader.a_pos,this.tileExtentBuffer.itemSize,e.SHORT,!1,8,0),e.drawArrays(e.TRIANGLE_STRIP,0,this.tileExtentBuffer.itemCount),e.stencilFunc(e.EQUAL,128,128),e.stencilOp(e.KEEP,e.KEEP,e.REPLACE),e.stencilMask(0),e.colorMask(!0,!0,!0,!0)},Painter.prototype.prepareBuffers=function(){},Painter.prototype.bindDefaultFramebuffer=function(){var t=this.gl;t.bindFramebuffer(t.FRAMEBUFFER,null)};var draw={symbol:require("./draw_symbol"),circle:require("./draw_circle"),line:require("./draw_line"),fill:require("./draw_fill"),raster:require("./draw_raster"),background:require("./draw_background"),debug:require("./draw_debug"),vertices:require("./draw_vertices")};Painter.prototype.render=function(t,e){this.style=t,this.options=e,this.lineAtlas=t.lineAtlas,this.spriteAtlas=t.spriteAtlas,this.spriteAtlas.setSprite(t.sprite),this.glyphAtlas=t.glyphAtlas,this.glyphAtlas.bind(this.gl),this.frameHistory.record(this.transform.zoom),this.prepareBuffers(),this.clearColor();for(var i=t._groups.length-1;i>=0;i--){var r=t._groups[i],a=t.sources[r.source];a?(this.clearStencil(),a.render(r,this)):void 0===r.source&&this.drawLayers(r,this.identityMatrix)}},Painter.prototype.drawTile=function(t,e){this.setExtent(t.tileExtent),this.drawClippingMask(t),this.drawLayers(e,t.posMatrix,t),this.options.debug&&draw.debug(this,t)},Painter.prototype.drawLayers=function(t,e,i){for(var r=t.length-1;r>=0;r--){var a=t[r];a.hidden||(draw[a.type](this,a,e,i),this.options.vertices&&draw.vertices(this,a,e,i))}},Painter.prototype.drawStencilBuffer=function(){var t=this.gl;t.switchShader(this.fillShader,this.identityMatrix),t.blendFunc(t.ONE,t.ONE_MINUS_SRC_ALPHA),t.stencilMask(0),t.stencilFunc(t.EQUAL,128,128),t.bindBuffer(t.ARRAY_BUFFER,this.backgroundBuffer),t.vertexAttribPointer(this.fillShader.a_pos,this.backgroundBuffer.itemSize,t.SHORT,!1,0,0),t.uniform4fv(this.fillShader.u_color,[0,0,0,.5]),t.drawArrays(t.TRIANGLE_STRIP,0,this.tileExtentBuffer.itemCount),t.blendFunc(t.ONE_MINUS_DST_ALPHA,t.ONE)},Painter.prototype.translateMatrix=function(t,e,i,r){if(!i[0]&&!i[1])return t;if("viewport"===r){var a=Math.sin(-this.transform.angle),s=Math.cos(-this.transform.angle);i=[i[0]*s-i[1]*a,i[0]*a+i[1]*s]}var u=this.transform.scale/(1<<e.coord.z)/(e.tileExtent/e.tileSize),n=[i[0]/u,i[1]/u,0],_=new Float32Array(16);return mat4.translate(_,t,n),_},Painter.prototype.saveTexture=function(t){var e=this.reusableTextures[t.size];e?e.push(t):this.reusableTextures[t.size]=[t]},Painter.prototype.getTexture=function(t){var e=this.reusableTextures[t];return e&&e.length>0?e.pop():null};
-	},{"../util/browser":95,"./draw_background":25,"./draw_circle":26,"./draw_debug":28,"./draw_fill":29,"./draw_line":30,"./draw_raster":31,"./draw_symbol":32,"./draw_vertices":33,"./frame_history":34,"./gl_util":35,"gl-matrix":116}],38:[function(require,module,exports){
-	"use strict";var glify=void 0;module.exports={debug:{vertex:"precision mediump float;attribute vec2 a_pos;uniform mat4 u_matrix;void main(){gl_Position=u_matrix*vec4(a_pos,step(32767.,a_pos.x),1);}",fragment:"precision mediump float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}"},dot:{vertex:"precision mediump float;uniform mat4 u_matrix;uniform float u_size;attribute vec2 a_pos;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);gl_PointSize=u_size;}",fragment:"precision mediump float;uniform vec4 u_color;uniform float u_blur;void main(){float a,b;a=length(gl_PointCoord-.5);b=smoothstep(.5,.5-u_blur,a);gl_FragColor=u_color*b;}"},fill:{vertex:"precision mediump float;attribute vec2 a_pos;uniform mat4 u_matrix;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);}",fragment:"precision mediump float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}"},circle:{vertex:"precision mediump float;uniform float u_size;attribute vec2 a_pos;uniform mat4 u_matrix,u_exmatrix;varying vec2 a;void main(){a=vec2(mod(a_pos,2.)*2.-1.);vec4 b=u_exmatrix*vec4(a*u_size,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5),0,1);gl_Position+=b*gl_Position.w;}",fragment:"precision mediump float;uniform vec4 u_color;uniform float u_blur,u_size;varying vec2 a;void main(){float b=smoothstep(1.-u_blur,1.,length(a));gl_FragColor=u_color*(1.-b);}"},line:{vertex:"precision mediump float;attribute vec2 a_pos;attribute vec4 a_data;uniform highp mat4 u_matrix;uniform float u_ratio,u_extra;uniform vec2 u_linewidth;uniform mat2 u_antialiasingmatrix;varying vec2 a;varying float b,c;void main(){vec2 d,e;d=a_data.xy;e=mod(a_pos,2.);e.y=sign(e.y-.5);a=e;vec4 f=vec4(u_linewidth.s*d*.015873016,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5)+f.xy/u_ratio,0,1);float g,h,i;g=gl_Position.y/gl_Position.w;h=length(d)/length(u_antialiasingmatrix*d);i=1./(1.-min(g*u_extra,.9));c=i*h;}",fragment:"precision mediump float;uniform vec2 u_linewidth;uniform vec4 u_color;uniform float u_blur;varying vec2 a;varying float b,c;void main(){float d,e,f;d=length(a)*u_linewidth.s;e=u_blur*c;f=clamp(min(d-(u_linewidth.t-e),u_linewidth.s-d)/e,0.,1.);gl_FragColor=u_color*f;}"},linepattern:{vertex:"precision mediump float;attribute vec2 a_pos;attribute vec4 a_data;uniform highp mat4 u_matrix;uniform float u_ratio,u_extra;uniform vec2 u_linewidth;uniform vec4 u_color;uniform mat2 u_antialiasingmatrix;varying vec2 a;varying float b,c;void main(){vec2 d,f,g,h;d=a_data.xy;float e,i,j,k;e=a_data.z*128.+a_data.w;f=mod(a_pos,2.);f.y=sign(f.y-.5);a=f;g=d*.015873016;h=u_linewidth.s*g;gl_Position=u_matrix*vec4(floor(a_pos*.5)+h.xy/u_ratio,0,1);b=e;i=gl_Position.y/gl_Position.w;j=length(d)/length(u_antialiasingmatrix*d);k=1./(1.-min(i*u_extra,.9));c=k*j;}",fragment:"precision mediump float;uniform vec2 u_linewidth,u_pattern_size_a,u_pattern_size_b,u_pattern_tl_a,u_pattern_br_a,u_pattern_tl_b,u_pattern_br_b;uniform float u_point,u_blur,u_fade,u_opacity;uniform sampler2D u_image;varying vec2 a;varying float b,c;void main(){float d,e,f,g,h,i,j;d=length(a)*u_linewidth.s;e=u_blur*c;f=clamp(min(d-(u_linewidth.t-e),u_linewidth.s-d)/e,0.,1.);g=mod(b/u_pattern_size_a.x,1.);h=mod(b/u_pattern_size_b.x,1.);i=.5+a.y*u_linewidth.s/u_pattern_size_a.y;j=.5+a.y*u_linewidth.s/u_pattern_size_b.y;vec2 k,l;k=mix(u_pattern_tl_a,u_pattern_br_a,vec2(g,i));l=mix(u_pattern_tl_b,u_pattern_br_b,vec2(h,j));vec4 m=mix(texture2D(u_image,k),texture2D(u_image,l),u_fade);f*=u_opacity;gl_FragColor=m*f;}"},linesdfpattern:{vertex:"precision mediump float;attribute vec2 a_pos;attribute vec4 a_data;uniform highp mat4 u_matrix;uniform vec2 u_linewidth,u_patternscale_a,u_patternscale_b;uniform float u_ratio,u_tex_y_a,u_tex_y_b,u_extra;uniform mat2 u_antialiasingmatrix;varying vec2 a,b,c;varying float d;void main(){vec2 e,g;e=a_data.xy;float f,i,j,k;f=a_data.z*128.+a_data.w;g=mod(a_pos,2.);g.y=sign(g.y-.5);a=g;vec4 h=vec4(u_linewidth.s*e*.015873016,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5)+h.xy/u_ratio,0,1);b=vec2(f*u_patternscale_a.x,g.y*u_patternscale_a.y+u_tex_y_a);c=vec2(f*u_patternscale_b.x,g.y*u_patternscale_b.y+u_tex_y_b);i=gl_Position.y/gl_Position.w;j=length(e)/length(u_antialiasingmatrix*e);k=1./(1.-min(i*u_extra,.9));d=k*j;}",fragment:"precision mediump float;uniform vec2 u_linewidth;uniform vec4 u_color;uniform float u_blur,u_sdfgamma,u_mix;uniform sampler2D u_image;varying vec2 a,b,c;varying float d;void main(){float e,f,g,h,i,j;e=length(a)*u_linewidth.s;f=u_blur*d;g=clamp(min(e-(u_linewidth.t-f),u_linewidth.s-e)/f,0.,1.);h=texture2D(u_image,b).a;i=texture2D(u_image,c).a;j=mix(h,i,u_mix);g*=smoothstep(.5-u_sdfgamma,.5+u_sdfgamma,j);gl_FragColor=u_color*g;}"},outline:{vertex:"precision mediump float;attribute vec2 a_pos;uniform highp mat4 u_matrix;uniform vec2 u_world;varying vec2 a;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(gl_Position.xy/gl_Position.w+1.)/2.*u_world;}",fragment:"precision mediump float;uniform vec4 u_color;varying vec2 a;void main(){float b,c;b=length(a-gl_FragCoord.xy);c=smoothstep(1.,0.,b);gl_FragColor=u_color*c;}"},pattern:{vertex:"precision mediump float;uniform mat4 u_matrix;uniform mat3 u_patternmatrix_a,u_patternmatrix_b;attribute vec2 a_pos;varying vec2 a,b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(u_patternmatrix_a*vec3(a_pos,1)).xy;b=(u_patternmatrix_b*vec3(a_pos,1)).xy;}",fragment:"precision mediump float;uniform float u_opacity,u_mix;uniform vec2 u_pattern_tl_a,u_pattern_br_a,u_pattern_tl_b,u_pattern_br_b;uniform sampler2D u_image;varying vec2 a,b;void main(){vec2 c,d,f,g;c=mod(a,1.);d=mix(u_pattern_tl_a,u_pattern_br_a,c);vec4 e,h;e=texture2D(u_image,d);f=mod(b,1.);g=mix(u_pattern_tl_b,u_pattern_br_b,f);h=texture2D(u_image,g);gl_FragColor=mix(e,h,u_mix)*u_opacity;}"},raster:{vertex:"precision mediump float;uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent,u_buffer_scale;attribute vec2 a_pos,a_texture_pos;varying vec2 a,b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(a_texture_pos/32767.-.5)/u_buffer_scale+.5;b=a*u_scale_parent+u_tl_parent;}",fragment:"precision mediump float;uniform float u_opacity0,u_opacity1,u_brightness_low,u_brightness_high,u_saturation_factor,u_contrast_factor;uniform sampler2D u_image0,u_image1;varying vec2 a,b;uniform vec3 u_spin_weights;void main(){vec4 c,d,e;c=texture2D(u_image0,a);d=texture2D(u_image1,b);e=c*u_opacity0+d*u_opacity1;vec3 f,h,i;f=e.rgb;f=vec3(dot(f,u_spin_weights.xyz),dot(f,u_spin_weights.zxy),dot(f,u_spin_weights.yzx));float g=(e.r+e.g+e.b)/3.;f+=(g-f)*u_saturation_factor;f=(f-.5)*u_contrast_factor+.5;h=vec3(u_brightness_low);i=vec3(u_brightness_high);gl_FragColor=vec4(mix(h,i,f),e.a);}"},icon:{vertex:"precision mediump float;attribute vec2 a_pos,a_offset;attribute vec4 a_data1,a_data2;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_zoom,u_fadedist,u_minfadezoom,u_maxfadezoom,u_fadezoom,u_opacity,u_extra;uniform bool u_skewed;uniform vec2 u_texsize;varying vec2 a;varying float b;void main(){vec2 c,e;c=a_data1.xy;float d,f,g,h,i,j;d=a_data1[2];e=a_data2.st;f=e[0];g=e[1];h=10.;i=2.-step(f,u_zoom)-(1.-step(g,u_zoom));j=clamp((u_fadezoom-d)/u_fadedist,0.,1.);if(u_fadedist>=0.)b=j;else b=1.-j;if(u_maxfadezoom<d)b=0.;if(u_minfadezoom>=d)b=1.;i+=step(b,0.);if(u_skewed){vec4 k=u_exmatrix*vec4(a_offset/64.,0,0);gl_Position=u_matrix*vec4(a_pos+k.xy,0,1);gl_Position.z+=i*gl_Position.w;}else{vec4 k=u_exmatrix*vec4(a_offset/64.,i,0);gl_Position=u_matrix*vec4(a_pos,0,1)+k;}a=c/u_texsize;b*=u_opacity;}",fragment:"precision mediump float;uniform sampler2D u_texture;varying vec2 a;varying float b;void main(){gl_FragColor=texture2D(u_texture,a)*b;}"},sdf:{vertex:"precision mediump float;attribute vec2 a_pos,a_offset;attribute vec4 a_data1,a_data2;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_zoom,u_fadedist,u_minfadezoom,u_maxfadezoom,u_fadezoom,u_extra;uniform bool u_skewed;uniform vec2 u_texsize;varying vec2 a;varying float b,c;void main(){vec2 d,f;d=a_data1.xy;float e,g,h,i,j,k,l;e=a_data1[2];f=a_data2.st;g=f[0];h=f[1];i=2.-step(g,u_zoom)-(1.-step(h,u_zoom));j=clamp((u_fadezoom-e)/u_fadedist,0.,1.);if(u_fadedist>=0.)b=j;else b=1.-j;if(u_maxfadezoom<e)b=0.;if(u_minfadezoom>=e)b=1.;i+=step(b,0.);if(u_skewed){vec4 k=u_exmatrix*vec4(a_offset/64.,0,0);gl_Position=u_matrix*vec4(a_pos+k.xy,0,1);gl_Position.z+=i*gl_Position.w;}else{vec4 k=u_exmatrix*vec4(a_offset/64.,i,0);gl_Position=u_matrix*vec4(a_pos,0,1)+k;}k=gl_Position.y/gl_Position.w;l=1./(1.-k*u_extra);c=l;a=d/u_texsize;}",fragment:"precision mediump float;uniform sampler2D u_texture;uniform vec4 u_color;uniform float u_buffer,u_gamma;varying vec2 a;varying float b,c;void main(){float d,e,f;d=u_gamma*c;e=texture2D(u_texture,a).a;f=smoothstep(u_buffer-d,u_buffer+d,e)*b;gl_FragColor=u_color*f;}"},collisionbox:{vertex:"precision mediump float;attribute vec2 a_pos,a_extrude,a_data;uniform mat4 u_matrix;uniform float u_scale;varying float a,b;void main(){gl_Position=u_matrix*vec4(a_pos+a_extrude/u_scale,0,1);a=a_data.x;b=a_data.y;}",fragment:"precision mediump float;uniform float u_zoom,u_maxzoom;varying float a,b;void main(){float c=.5;gl_FragColor=vec4(0,1,0,1)*c;if(b>u_zoom)gl_FragColor=vec4(1,0,0,1)*c;if(u_zoom>=a)gl_FragColor=vec4(0,0,0,1)*c*.25;if(b>=u_maxzoom)gl_FragColor=vec4(0,0,1,1)*c*.2;}"}};
-	},{}],39:[function(require,module,exports){
-	"use strict";function GeoJSONSource(i){i=i||{},this._data=i.data,void 0!==i.maxzoom&&(this.maxzoom=i.maxzoom),this.geojsonVtOptions={maxZoom:this.maxzoom},void 0!==i.buffer&&(this.geojsonVtOptions.buffer=i.buffer),void 0!==i.tolerance&&(this.geojsonVtOptions.tolerance=i.tolerance),this._pyramid=new TilePyramid({tileSize:512,minzoom:this.minzoom,maxzoom:this.maxzoom,cacheSize:20,load:this._loadTile.bind(this),abort:this._abortTile.bind(this),unload:this._unloadTile.bind(this),add:this._addTile.bind(this),remove:this._removeTile.bind(this)})}var util=require("../util/util"),Evented=require("../util/evented"),TilePyramid=require("./tile_pyramid"),Source=require("./source"),urlResolve=require("resolve-url");module.exports=GeoJSONSource,GeoJSONSource.prototype=util.inherit(Evented,{minzoom:0,maxzoom:14,_dirty:!0,setData:function(i){return this._data=i,this._dirty=!0,this.fire("change"),this.map&&this.update(this.map.transform),this},onAdd:function(i){this.map=i},loaded:function(){return this._loaded&&this._pyramid.loaded()},update:function(i){this._dirty&&this._updateData(),this._loaded&&this._pyramid.update(this.used,i)},reload:function(){this._loaded&&this._pyramid.reload()},render:Source._renderTiles,featuresAt:Source._vectorFeaturesAt,featuresIn:Source._vectorFeaturesIn,_updateData:function(){this._dirty=!1;var i=this._data;"string"==typeof i&&(i=urlResolve(window.location.href,i)),this.workerID=this.dispatcher.send("parse geojson",{data:i,tileSize:512,source:this.id,geojsonVtOptions:this.geojsonVtOptions},function(i){return i?void this.fire("error",{error:i}):(this._loaded=!0,this._pyramid.reload(),void this.fire("change"))}.bind(this))},_loadTile:function(i){var t=i.coord.z>this.maxzoom?Math.pow(2,i.coord.z-this.maxzoom):1,e={uid:i.uid,coord:i.coord,zoom:i.coord.z,maxZoom:this.maxzoom,tileSize:512,source:this.id,overscaling:t,angle:this.map.transform.angle,pitch:this.map.transform.pitch,collisionDebug:this.map.collisionDebug};i.workerID=this.dispatcher.send("load geojson tile",e,function(t,e){if(i.unloadVectorData(this.map.painter),!i.aborted){if(t)return void this.fire("tile.error",{tile:i});i.loadVectorData(e),this.fire("tile.load",{tile:i})}}.bind(this),this.workerID)},_abortTile:function(i){i.aborted=!0},_addTile:function(i){this.fire("tile.add",{tile:i})},_removeTile:function(i){this.fire("tile.remove",{tile:i})},_unloadTile:function(i){i.unloadVectorData(this.map.painter),this.glyphAtlas.removeGlyphs(i.uid),this.dispatcher.send("remove tile",{uid:i.uid,source:this.id},null,i.workerID)}});
-	},{"../util/evented":100,"../util/util":106,"./source":43,"./tile_pyramid":46,"resolve-url":140}],40:[function(require,module,exports){
-	"use strict";function GeoJSONWrapper(e){this.features=e,this.length=e.length}function FeatureWrapper(e){this.type=e.type,this.rawGeometry=1===e.type?[e.geometry]:e.geometry,this.properties=e.tags,this.extent=4096}var Point=require("point-geometry"),VectorTileFeature=require("vector-tile").VectorTileFeature;module.exports=GeoJSONWrapper,GeoJSONWrapper.prototype.feature=function(e){return new FeatureWrapper(this.features[e])},FeatureWrapper.prototype.loadGeometry=function(){var e=this.rawGeometry;this.geometry=[];for(var t=0;t<e.length;t++){for(var r=e[t],o=[],a=0;a<r.length;a++)o.push(new Point(r[a][0],r[a][1]));this.geometry.push(o)}return this.geometry},FeatureWrapper.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var e=this.geometry,t=1/0,r=-(1/0),o=1/0,a=-(1/0),p=0;p<e.length;p++)for(var i=e[p],n=0;n<i.length;n++){var h=i[n];t=Math.min(t,h.x),r=Math.max(r,h.x),o=Math.min(o,h.y),a=Math.max(a,h.y)}return[t,o,r,a]},FeatureWrapper.prototype.toGeoJSON=VectorTileFeature.prototype.toGeoJSON;
-	},{"point-geometry":137,"vector-tile":144}],41:[function(require,module,exports){
-	"use strict";function ImageSource(e){this.coordinates=e.coordinates,ajax.getImage(e.url,function(e,t){e||(this.image=t,this.image.addEventListener("load",function(){this.map._rerender()}.bind(this)),this._loaded=!0,this.map&&(this.createTile(),this.fire("change")))}.bind(this))}var util=require("../util/util"),Tile=require("./tile"),LngLat=require("../geo/lng_lat"),Point=require("point-geometry"),Evented=require("../util/evented"),ajax=require("../util/ajax");module.exports=ImageSource,ImageSource.prototype=util.inherit(Evented,{onAdd:function(e){this.map=e,this.image&&this.createTile()},createTile:function(){var e=this.map,t=this.coordinates.map(function(t){var i=LngLat.convert(t);return e.transform.locationCoordinate(i).zoomTo(0)}),i=util.getCoordinatesCenter(t),r=4096,a=t.map(function(e){var t=e.zoomTo(i.zoom);return new Point(Math.round((t.column-i.column)*r),Math.round((t.row-i.row)*r))}),n=e.painter.gl,o=32767,u=new Int16Array([a[0].x,a[0].y,0,0,a[1].x,a[1].y,o,0,a[3].x,a[3].y,0,o,a[2].x,a[2].y,o,o]);this.tile=new Tile,this.tile.buckets={},this.tile.boundsBuffer=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,this.tile.boundsBuffer),n.bufferData(n.ARRAY_BUFFER,u,n.STATIC_DRAW),this.center=i},loaded:function(){return this.image&&this.image.complete},update:function(){},reload:function(){},render:function(e,t){if(this._loaded&&this.loaded()){var i=this.center;this.tile.calculateMatrices(i.zoom,i.column,i.row,this.map.transform,t);var r=t.gl;this.tile.texture?(r.bindTexture(r.TEXTURE_2D,this.tile.texture),r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,r.UNSIGNED_BYTE,this.image)):(this.tile.texture=r.createTexture(),r.bindTexture(r.TEXTURE_2D,this.tile.texture),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,this.image)),t.drawLayers(e,this.tile.posMatrix,this.tile)}},featuresAt:function(e,t,i){return i(null,[])}});
-	},{"../geo/lng_lat":20,"../util/ajax":94,"../util/evented":100,"../util/util":106,"./tile":44,"point-geometry":137}],42:[function(require,module,exports){
-	"use strict";function RasterTileSource(e){util.extend(this,util.pick(e,["url","tileSize"])),Source._loadTileJSON.call(this,e)}var util=require("../util/util"),ajax=require("../util/ajax"),Evented=require("../util/evented"),Source=require("./source"),normalizeURL=require("../util/mapbox").normalizeTileURL;module.exports=RasterTileSource,RasterTileSource.prototype=util.inherit(Evented,{minzoom:0,maxzoom:22,roundZoom:!0,tileSize:512,_loaded:!1,onAdd:function(e){this.map=e},loaded:function(){return this._pyramid&&this._pyramid.loaded()},update:function(e){this._pyramid&&this._pyramid.update(this.used,e,this.map.style.rasterFadeDuration)},reload:function(){},render:Source._renderTiles,_loadTile:function(e){function t(t,i){if(delete e.request,!e.aborted){if(t)return void this.fire("tile.error",{tile:e});var r=this.map.painter.gl;e.texture=this.map.painter.getTexture(i.width),e.texture?(r.bindTexture(r.TEXTURE_2D,e.texture),r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,r.UNSIGNED_BYTE,i)):(e.texture=r.createTexture(),r.bindTexture(r.TEXTURE_2D,e.texture),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR_MIPMAP_NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,i),e.texture.size=i.width),r.generateMipmap(r.TEXTURE_2D),e.timeAdded=(new Date).getTime(),this.map.animationLoop.set(this.style.rasterFadeDuration),e.source=this,e.loaded=!0,this.fire("tile.load",{tile:e})}}var i=normalizeURL(e.coord.url(this.tiles),this.url);e.request=ajax.getImage(i,t.bind(this))},_abortTile:function(e){e.aborted=!0,e.request&&(e.request.abort(),delete e.request)},_addTile:function(e){this.fire("tile.add",{tile:e})},_removeTile:function(e){this.fire("tile.remove",{tile:e})},_unloadTile:function(e){e.texture&&this.map.painter.saveTexture(e.texture)},featuresAt:function(e,t,i){i(null,[])},featuresIn:function(e,t,i){i(null,[])}});
-	},{"../util/ajax":94,"../util/evented":100,"../util/mapbox":103,"../util/util":106,"./source":43}],43:[function(require,module,exports){
-	"use strict";var util=require("../util/util"),ajax=require("../util/ajax"),browser=require("../util/browser"),TilePyramid=require("./tile_pyramid"),TileCoord=require("./tile_coord"),normalizeURL=require("../util/mapbox").normalizeSourceURL;exports._loadTileJSON=function(i){var e=function(i){this._pyramid=new TilePyramid({index:i,tileSize:this.tileSize,cacheSize:20,minzoom:this.minzoom,maxzoom:this.maxzoom,roundZoom:this.roundZoom,reparseOverscaled:this.reparseOverscaled,load:this._loadTile.bind(this),abort:this._abortTile.bind(this),unload:this._unloadTile.bind(this),add:this._addTile.bind(this),remove:this._removeTile.bind(this),redoPlacement:this._redoTilePlacement?this._redoTilePlacement.bind(this):void 0})}.bind(this),r=function(i,r){return i?void this.fire("error",{error:i}):(util.extend(this,util.pick(r,["tiles","minzoom","maxzoom","attribution"])),void(r.index?ajax.getJSON(normalizeURL(r.index),function(i,r){return i?void this.fire("error",{error:i}):(e(r.index),void this.fire("load"))}.bind(this)):(e(),this.fire("load"))))}.bind(this);i.url?ajax.getJSON(normalizeURL(i.url),r):browser.frame(r.bind(this,null,i))},exports._renderTiles=function(i,e){if(this._pyramid)for(var r=this._pyramid.renderedIDs(),t=0;t<r.length;t++){var o=this._pyramid.getTile(r[t]),n=TileCoord.fromID(r[t]),a=n.z,s=n.x,l=n.y,d=n.w;a=Math.min(a,this.maxzoom),(o.tileExtent>4096||o.parentId)&&(o.tileExtent=4096),s+=d*(1<<a),o.calculateMatrices(a,s,l,e.transform,e),e.drawTile(o,i)}},exports._vectorFeaturesAt=function(i,e,r){if(!this._pyramid)return r(null,[]);var t=this._pyramid.tileAt(i);return t?void this.dispatcher.send("query features",{uid:t.tile.uid,x:t.x,y:t.y,tileExtent:t.tile.tileExtent,scale:t.scale,source:this.id,params:e},r,t.tile.workerID):r(null,[])},exports._vectorFeaturesIn=function(i,e,r){if(!this._pyramid)return r(null,[]);var t=this._pyramid.tilesIn(i);return t?void util.asyncAll(t,function(i,r){this.dispatcher.send("query features",{uid:i.tile.uid,source:this.id,minX:i.minX,maxX:i.maxX,minY:i.minY,maxY:i.maxY,params:e},r,i.tile.workerID)}.bind(this),function(i,e){r(i,Array.prototype.concat.apply([],e))}):r(null,[])},exports.create=function(i){var e={vector:require("./vector_tile_source"),raster:require("./raster_tile_source"),geojson:require("./geojson_source"),video:require("./video_source"),image:require("./image_source")};for(var r in e)if(i instanceof e[r])return i;return new e[i.type](i)};
-	},{"../util/ajax":94,"../util/browser":95,"../util/mapbox":103,"../util/util":106,"./geojson_source":39,"./image_source":41,"./raster_tile_source":42,"./tile_coord":45,"./tile_pyramid":46,"./vector_tile_source":47,"./video_source":48}],44:[function(require,module,exports){
-	"use strict";function Tile(t,e){this.coord=t,this.uid=util.uniqueId(),this.loaded=!1,this.uses=0,this.tileSize=e}var glmatrix=require("gl-matrix"),mat2=glmatrix.mat2,mat4=glmatrix.mat4,util=require("../util/util"),BufferSet=require("../data/buffer/buffer_set");module.exports=Tile,Tile.prototype={tileExtent:4096,calculateMatrices:function(t,e,i,r){var s=Math.pow(2,t),o=r.worldSize/s;this.scale=o,this.posMatrix=new Float64Array(16),mat4.identity(this.posMatrix),mat4.translate(this.posMatrix,this.posMatrix,[e*o,i*o,0]),mat4.scale(this.posMatrix,this.posMatrix,[o/this.tileExtent,o/this.tileExtent,1]),mat4.multiply(this.posMatrix,r.getProjMatrix(),this.posMatrix),this.exMatrix=mat4.create(),mat4.ortho(this.exMatrix,0,r.width,r.height,0,0,-1),this.rotationMatrix=mat2.create(),mat2.rotate(this.rotationMatrix,this.rotationMatrix,r.angle),this.posMatrix=new Float32Array(this.posMatrix)},positionAt:function(t,e){return t=t.zoomTo(Math.min(this.coord.z,e)),{x:(t.column-this.coord.x)*this.tileExtent,y:(t.row-this.coord.y)*this.tileExtent,scale:this.scale}},loadVectorData:function(t){this.loaded=!0,t&&(this.buffers=new BufferSet(t.buffers),this.elementGroups=t.elementGroups,this.tileExtent=t.extent)},reloadSymbolData:function(t,e){if(this.buffers){this.buffers.glyphVertex.destroy(e.gl),this.buffers.glyphElement.destroy(e.gl),this.buffers.iconVertex.destroy(e.gl),this.buffers.iconElement.destroy(e.gl),this.buffers.collisionBoxVertex.destroy(e.gl);var i=new BufferSet(t.buffers);this.buffers.glyphVertex=i.glyphVertex,this.buffers.glyphElement=i.glyphElement,this.buffers.iconVertex=i.iconVertex,this.buffers.iconElement=i.iconElement,this.buffers.collisionBoxVertex=i.collisionBoxVertex;for(var r in t.elementGroups)this.elementGroups[r]=t.elementGroups[r]}},unloadVectorData:function(t){for(var e in this.buffers)this.buffers[e].destroy(t.gl);this.buffers=null}};
-	},{"../data/buffer/buffer_set":2,"../util/util":106,"gl-matrix":116}],45:[function(require,module,exports){
-	"use strict";function TileCoord(t,i,o,r){isNaN(r)&&(r=0),this.z=+t,this.x=+i,this.y=+o,this.w=+r,r*=2,0>r&&(r=-1*r-1);var e=1<<this.z;this.id=32*(e*e*r+e*this.y+this.x)+this.z}function edge(t,i){if(t.row>i.row){var o=t;t=i,i=o}return{x0:t.column,y0:t.row,x1:i.column,y1:i.row,dx:i.column-t.column,dy:i.row-t.row}}function scanSpans(t,i,o,r,e){var n=Math.max(o,Math.floor(i.y0)),h=Math.min(r,Math.ceil(i.y1));if(t.x0===i.x0&&t.y0===i.y0?t.x0+i.dy/t.dy*t.dx<i.x1:t.x1-i.dy/t.dy*t.dx<i.x0){var s=t;t=i,i=s}for(var d=t.dx/t.dy,a=i.dx/i.dy,l=t.dx>0,y=i.dx<0,x=n;h>x;x++){var c=d*Math.max(0,Math.min(t.dy,x+l-t.y0))+t.x0,u=a*Math.max(0,Math.min(i.dy,x+y-i.y0))+i.x0;e(Math.floor(u),Math.ceil(c),x)}}function scanTriangle(t,i,o,r,e,n){var h,s=edge(t,i),d=edge(i,o),a=edge(o,t);s.dy>d.dy&&(h=s,s=d,d=h),s.dy>a.dy&&(h=s,s=a,a=h),d.dy>a.dy&&(h=d,d=a,a=h),s.dy&&scanSpans(a,s,r,e,n),d.dy&&scanSpans(a,d,r,e,n)}module.exports=TileCoord,TileCoord.prototype.toString=function(){return this.z+"/"+this.x+"/"+this.y},TileCoord.fromID=function(t){var i=t%32,o=1<<i,r=(t-i)/32,e=r%o,n=(r-e)/o%o,h=Math.floor(r/(o*o));return h%2!==0&&(h=-1*h-1),h/=2,new TileCoord(i,e,n,h)},TileCoord.prototype.url=function(t,i){return t[(this.x+this.y)%t.length].replace("{prefix}",(this.x%16).toString(16)+(this.y%16).toString(16)).replace("{z}",Math.min(this.z,i||this.z)).replace("{x}",this.x).replace("{y}",this.y)},TileCoord.prototype.parent=function(t){return 0===this.z?null:this.z>t?new TileCoord(this.z-1,this.x,this.y,this.w):new TileCoord(this.z-1,Math.floor(this.x/2),Math.floor(this.y/2),this.w)},TileCoord.prototype.wrapped=function(){return new TileCoord(this.z,this.x,this.y,0)},TileCoord.prototype.children=function(t){if(this.z>=t)return[new TileCoord(this.z+1,this.x,this.y,this.w)];var i=this.z+1,o=2*this.x,r=2*this.y;return[new TileCoord(i,o,r,this.w),new TileCoord(i,o+1,r,this.w),new TileCoord(i,o,r+1,this.w),new TileCoord(i,o+1,r+1,this.w)]},TileCoord.cover=function(t,i,o){function r(t,i,r){var h,s,d;if(r>=0&&e>=r)for(h=t;i>h;h++)s=(h%e+e)%e,d=new TileCoord(o,s,r,Math.floor(h/e)),n[d.id]=d}var e=1<<t,n={};return scanTriangle(i[0],i[1],i[2],0,e,r),scanTriangle(i[2],i[3],i[0],0,e,r),Object.keys(n).map(function(t){return n[t]})};
-	},{}],46:[function(require,module,exports){
-	"use strict";function TilePyramid(i){this.tileSize=i.tileSize,this.minzoom=i.minzoom,this.maxzoom=i.maxzoom,this.roundZoom=i.roundZoom,this.reparseOverscaled=i.reparseOverscaled,this.index=i.index,this._load=i.load,this._abort=i.abort,this._unload=i.unload,this._add=i.add,this._remove=i.remove,this._redoPlacement=i.redoPlacement,this._tiles={},this._cache=new Cache(i.cacheSize,function(i){return this._unload(i)}.bind(this))}var Tile=require("./tile"),TileCoord=require("./tile_coord"),Point=require("point-geometry"),Cache=require("../util/mru_cache"),util=require("../util/util");module.exports=TilePyramid,TilePyramid.prototype={loaded:function(){for(var i in this._tiles)if(!this._tiles[i].loaded)return!1;return!0},orderedIDs:function(){return Object.keys(this._tiles).sort(function(i,e){return e%32-i%32}).map(function(i){return+i})},renderedIDs:function(){return this.orderedIDs().filter(function(i){return this._tiles[i].loaded&&!this._coveredTiles[i]}.bind(this))},reload:function(){this._cache.reset();for(var i in this._tiles)this._load(this._tiles[i])},getTile:function(i){return this._tiles[i]},getZoom:function(i){return i.zoom+Math.log(i.tileSize/this.tileSize)/Math.LN2},coveringZoomLevel:function(i){return(this.roundZoom?Math.round:Math.floor)(this.getZoom(i))},coveringTiles:function(i){var e=this.coveringZoomLevel(i),t=e;if(e<this.minzoom)return[];e>this.maxzoom&&(e=this.maxzoom);var o=i,r=o.locationCoordinate(o.center)._zoomTo(e),n=new Point(r.column-.5,r.row-.5);return TileCoord.cover(e,[o.pointCoordinate(new Point(0,0))._zoomTo(e),o.pointCoordinate(new Point(o.width,0))._zoomTo(e),o.pointCoordinate(new Point(o.width,o.height))._zoomTo(e),o.pointCoordinate(new Point(0,o.height))._zoomTo(e)],this.reparseOverscaled?t:e).sort(function(i,e){return n.dist(i)-n.dist(e)})},findLoadedChildren:function(i,e,t){for(var o=!0,r=i.z,n=i.children(this.maxzoom),s=0;s<n.length;s++){var d=n[s].id;this._tiles[d]&&this._tiles[d].loaded?t[d]=!0:(o=!1,e>r&&this.findLoadedChildren(n[s],e,t))}return o},findLoadedParent:function(i,e,t){for(var o=i.z-1;o>=e;o--){i=i.parent(this.maxzoom);var r=this._tiles[i.id];if(r&&r.loaded)return t[i.id]=!0,r}},update:function(i,e,t){var o,r,n,s=(this.roundZoom?Math.round:Math.floor)(this.getZoom(e)),d=util.clamp(s-10,this.minzoom,this.maxzoom),h=util.clamp(s+1,this.minzoom,this.maxzoom),a={},l=(new Date).getTime();this._coveredTiles={};var m=i?this.coveringTiles(e):[];for(o=0;o<m.length;o++)r=m[o],n=this.addTile(r),a[r.id]=!0,n.loaded||this.findLoadedChildren(r,h,a)||this.findLoadedParent(r,d,a);for(var u in a)r=TileCoord.fromID(u),n=this._tiles[u],n&&n.timeAdded>l-(t||0)&&(this.findLoadedChildren(r,h,a)?(this._coveredTiles[u]=!0,a[u]=!0):this.findLoadedParent(r,d,a));var c=util.keysDifference(this._tiles,a);for(o=0;o<c.length;o++)this.removeTile(+c[o])},addTile:function(i){var e=this._tiles[i.id];if(e)return e;var t=i.wrapped();if(e=this._tiles[t.id],e||(e=this._cache.get(t.id),e&&this._redoPlacement&&this._redoPlacement(e)),!e){var o=i.z,r=o>this.maxzoom?Math.pow(2,o-this.maxzoom):1;e=new Tile(t,this.tileSize*r),this.index&&(e.parentId=this.indexSearch(i.id)),this._load(e)}return e.uses++,this._tiles[i.id]=e,this._add(e,i),e},removeTile:function(i){var e=this._tiles[i];e&&(e.uses--,delete this._tiles[i],this._remove(e),e.uses>0||(e.loaded?this._cache.add(e.coord.wrapped().id,e):(this._abort(e),this._unload(e))))},clearTiles:function(){for(var i in this._tiles)this.removeTile(i);this._cache.reset()},tileAt:function(i){for(var e=this.orderedIDs(),t=0;t<e.length;t++){var o=this._tiles[e[t]],r=o.positionAt(i,this.maxzoom);if(r&&r.x>=0&&r.x<o.tileExtent&&r.y>=0&&r.y<o.tileExtent)return{tile:o,x:r.x,y:r.y,scale:r.scale}}},tilesIn:function(i){for(var e=[],t=this.orderedIDs(),o=0;o<t.length;o++){var r=this._tiles[t[o]],n=[r.positionAt(i[0],this.maxzoom),r.positionAt(i[1],this.maxzoom)];n[0].x<r.tileExtent&&n[0].y<r.tileExtent&&n[1].x>=0&&n[1].y>=0&&e.push({tile:r,minX:n[0].x,maxX:n[1].x,minY:n[0].y,maxY:n[1].y})}return e},indexSearch:function(i){for(var e=TileCoord.fromID(i),t=[i],o=e;0!==o.z;)o=o.parent(),t.push(o.id);for(var r,n=this.index,s=t.pop(),d=function(i){return i.id};t.length;)if(i=t.pop(),e=TileCoord.fromID(s),r=e.children(this.maxzoom).map(d).indexOf(i),n){if(0===n[r]){s=i;break}if(1===n[r]){s=i;break}s=i,n=n[r]}return 0===t.length?null:s}};
-	},{"../util/mru_cache":104,"../util/util":106,"./tile":44,"./tile_coord":45,"point-geometry":137}],47:[function(require,module,exports){
-	"use strict";function VectorTileSource(e){if(util.extend(this,util.pick(e,["url","tileSize"])),512!==this.tileSize)throw new Error("vector tile sources must have a tileSize of 512");Source._loadTileJSON.call(this,e)}var util=require("../util/util"),Evented=require("../util/evented"),Source=require("./source"),TileCoord=require("./tile_coord");module.exports=VectorTileSource,VectorTileSource.prototype=util.inherit(Evented,{minzoom:0,maxzoom:22,tileSize:512,reparseOverscaled:!0,_loaded:!1,onAdd:function(e){this.map=e},loaded:function(){return this._pyramid&&this._pyramid.loaded()},update:function(e){this._pyramid&&this._pyramid.update(this.used,e)},reload:function(){this._pyramid&&this._pyramid.reload()},redoPlacement:function(){if(this._pyramid)for(var e=this._pyramid.orderedIDs(),i=0;i<e.length;i++){var t=this._pyramid.getTile(e[i]);this._redoTilePlacement(t)}},render:Source._renderTiles,featuresAt:Source._vectorFeaturesAt,featuresIn:Source._vectorFeaturesIn,_loadTile:function(e){var i=e.coord.z>this.maxzoom?Math.pow(2,e.coord.z-this.maxzoom):1,t={url:e.coord.url(this.tiles,this.maxzoom),uid:e.uid,coord:e.coord,zoom:e.coord.z,maxZoom:this.maxzoom,tileSize:this.tileSize*i,source:this.id,overscaling:i,angle:this.map.transform.angle,pitch:this.map.transform.pitch,collisionDebug:this.map.collisionDebug,parentId:e.parentId};e.parentId&&(t.url=TileCoord.fromID(e.parentId).url(this.tiles,this.maxzoom)),e.workerID?this.dispatcher.send("reload tile",t,this._tileLoaded.bind(this,e),e.workerID):e.workerID=this.dispatcher.send("load tile",t,this._tileLoaded.bind(this,e))},_tileLoaded:function(e,i,t){if(!e.aborted){if(i)return void this.fire("tile.error",{tile:e});e.loadVectorData(t),e.redoWhenDone&&(e.redoWhenDone=!1,this._redoTilePlacement(e)),this.fire("tile.load",{tile:e}),this.fire("tile.stats",t.bucketStats)}},_abortTile:function(e){e.aborted=!0,this.dispatcher.send("abort tile",{uid:e.uid,source:this.id},null,e.workerID)},_addTile:function(e){this.fire("tile.add",{tile:e})},_removeTile:function(e){this.fire("tile.remove",{tile:e})},_unloadTile:function(e){e.unloadVectorData(this.map.painter),this.glyphAtlas.removeGlyphs(e.uid),this.dispatcher.send("remove tile",{uid:e.uid,source:this.id},null,e.workerID)},_redoTilePlacement:function(e){function i(i,t){e.reloadSymbolData(t,this.map.painter),this.fire("tile.load",{tile:e}),e.redoingPlacement=!1,e.redoWhenDone&&(this._redoTilePlacement(e),e.redoWhenDone=!1)}return!e.loaded||e.redoingPlacement?void(e.redoWhenDone=!0):(e.redoingPlacement=!0,void this.dispatcher.send("redo placement",{uid:e.uid,source:this.id,angle:this.map.transform.angle,pitch:this.map.transform.pitch,collisionDebug:this.map.collisionDebug},i.bind(this),e.workerID))}});
-	},{"../util/evented":100,"../util/util":106,"./source":43,"./tile_coord":45}],48:[function(require,module,exports){
-	"use strict";function VideoSource(e){this.coordinates=e.coordinates,ajax.getVideo(e.urls,function(e,t){if(!e){this.video=t,this.video.loop=!0;var i;this.video.addEventListener("playing",function(){i=this.map.style.animationLoop.set(1/0),this.map._rerender()}.bind(this)),this.video.addEventListener("pause",function(){this.map.style.animationLoop.cancel(i)}.bind(this)),this._loaded=!0,this.map&&(this.video.play(),this.createTile(),this.fire("change"))}}.bind(this))}var util=require("../util/util"),Tile=require("./tile"),LngLat=require("../geo/lng_lat"),Point=require("point-geometry"),Evented=require("../util/evented"),ajax=require("../util/ajax");module.exports=VideoSource,VideoSource.prototype=util.inherit(Evented,{roundZoom:!0,getVideo:function(){return this.video},onAdd:function(e){this.map=e,this.video&&(this.video.play(),this.createTile())},createTile:function(){var e=this.map,t=this.coordinates.map(function(t){var i=LngLat.convert(t);return e.transform.locationCoordinate(i).zoomTo(0)}),i=util.getCoordinatesCenter(t),r=4096,o=t.map(function(e){var t=e.zoomTo(i.zoom);return new Point(Math.round((t.column-i.column)*r),Math.round((t.row-i.row)*r))}),n=e.painter.gl,a=32767,u=new Int16Array([o[0].x,o[0].y,0,0,o[1].x,o[1].y,a,0,o[3].x,o[3].y,0,a,o[2].x,o[2].y,a,a]);this.tile=new Tile,this.tile.buckets={},this.tile.boundsBuffer=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,this.tile.boundsBuffer),n.bufferData(n.ARRAY_BUFFER,u,n.STATIC_DRAW),this.center=i},loaded:function(){return this.video&&this.video.readyState>=2},update:function(){},reload:function(){},render:function(e,t){if(this._loaded&&!(this.video.readyState<2)){var i=this.center;this.tile.calculateMatrices(i.zoom,i.column,i.row,this.map.transform,t);var r=t.gl;this.tile.texture?(r.bindTexture(r.TEXTURE_2D,this.tile.texture),r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,r.UNSIGNED_BYTE,this.video)):(this.tile.texture=r.createTexture(),r.bindTexture(r.TEXTURE_2D,this.tile.texture),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,this.video)),t.drawLayers(e,this.tile.posMatrix,this.tile)}},featuresAt:function(e,t,i){return i(null,[])},featuresIn:function(e,t,i){return i(null,[])}});
-	},{"../geo/lng_lat":20,"../util/ajax":94,"../util/evented":100,"../util/util":106,"./tile":44,"point-geometry":137}],49:[function(require,module,exports){
-	"use strict";function Worker(e){this.self=e,this.actor=new Actor(e,this),this.loading={},this.loaded={},this.layers=[],this.geoJSONIndexes={}}var Actor=require("../util/actor"),WorkerTile=require("./worker_tile"),util=require("../util/util"),ajax=require("../util/ajax"),vt=require("vector-tile"),Protobuf=require("pbf"),TileCoord=require("./tile_coord"),geojsonvt=require("geojson-vt"),GeoJSONWrapper=require("./geojson_wrapper");module.exports=function(e){return new Worker(e)},util.extend(Worker.prototype,{"set layers":function(e){this.layers=e},"load tile":function(e,r){function t(t,s){if(delete this.loading[o][i],t)return r(t);if(a.data=new vt.VectorTile(new Protobuf(new Uint8Array(s))),e.parentId&&a.data.layers){var l=this.getChildPosition(e.coord.id,e.parentId);a.parse(a.data,this.layers,this.actor,r,l.dz,l.xPos,l.yPos)}else a.parse(a.data,this.layers,this.actor,r);this.loaded[o]=this.loaded[o]||{},this.loaded[o][i]=a}var o=e.source,i=e.uid;this.loading[o]||(this.loading[o]={});var a=this.loading[o][i]=new WorkerTile(e);a.xhr=ajax.getArrayBuffer(e.url,t.bind(this))},"reload tile":function(e,r){var t=this.loaded[e.source],o=e.uid;if(t&&t[o]){var i=t[o];i.parse(i.data,this.layers,this.actor,r)}},"abort tile":function(e){var r=this.loading[e.source],t=e.uid;r&&r[t]&&(r[t].xhr.abort(),delete r[t])},"remove tile":function(e){var r=this.loaded[e.source],t=e.uid;r&&r[t]&&delete r[t]},"redo placement":function(e,r){var t=this.loaded[e.source],o=this.loading[e.source],i=e.uid;if(t&&t[i]){var a=t[i],s=a.redoPlacement(e.angle,e.pitch,e.collisionDebug);s.result&&r(null,s.result,s.transferables)}else o&&o[i]&&(o[i].angle=e.angle)},"parse geojson":function(e,r){var t=function(t,o){return t?r(t):(this.geoJSONIndexes[e.source]=geojsonvt(o,e.geojsonVtOptions),void r(null))}.bind(this);"string"==typeof e.data?ajax.getJSON(e.data,t):t(null,e.data)},"load geojson tile":function(e,r){var t=e.source,o=e.coord,i=this.geoJSONIndexes[t].getTile(o.z,o.x,o.y);if(!i)return r(null,null);var a=new WorkerTile(e);a.parse(new GeoJSONWrapper(i.features),this.layers,this.actor,r),this.loaded[t]=this.loaded[t]||{},this.loaded[t][e.uid]=a},"query features":function(e,r){var t=this.loaded[e.source]&&this.loaded[e.source][e.uid];t?t.featureTree.query(e,r):r(null,[])},getChildPosition:function(e,r){var t=TileCoord.fromID(e),o=TileCoord.fromID(r),i=t.z-o.z,a=t.x&(1<<i)-1,s=t.y&(1<<i)-1;return{dz:i,xPos:a,yPos:s}}});
-	},{"../util/actor":93,"../util/ajax":94,"../util/util":106,"./geojson_wrapper":40,"./tile_coord":45,"./worker_tile":50,"geojson-vt":111,"pbf":136,"vector-tile":144}],50:[function(require,module,exports){
-	"use strict";function WorkerTile(e){this.coord=e.coord,this.uid=e.uid,this.zoom=e.zoom,this.maxZoom=e.maxZoom,this.tileSize=e.tileSize,this.source=e.source,this.overscaling=e.overscaling,this.angle=e.angle,this.pitch=e.pitch,this.collisionDebug=e.collisionDebug,this.stacks={}}var FeatureTree=require("../data/feature_tree"),CollisionTile=require("../symbol/collision_tile"),BufferSet=require("../data/buffer/buffer_set"),createBucket=require("../data/create_bucket");module.exports=WorkerTile,WorkerTile.prototype.parse=function(e,t,r,i,s,o,n){function a(e,t,r,i,s){for(var o=0;o<e.length;o++){var n=e.feature(o);n.dz=r,n.xPos=i,n.yPos=s;for(var a in t){var l=t[a];l.filter(n)&&l.features.push(n)}}}function l(e){return function(t){e.dependenciesLoaded=!0,u(v,e,t)}}function u(e,t,r){if((!t.getDependencies||t.dependenciesLoaded)&&(!t.needsPlacement||t.previousPlaced)){if(!r){var i=Date.now();t.features.length&&t.addFeatures(g);var s=Date.now()-i;if(t.interactive)for(var o=0;o<t.features.length;o++){var n=t.features[o];e.featureTree.insert(n.bbox(),t.layers,n)}"undefined"!=typeof self&&(self.bucketStats=self.bucketStats||{_total:0},self.bucketStats._total+=s,self.bucketStats[t.id]=(self.bucketStats[t.id]||0)+s),t.features=null}return w--,w?void(t.next&&(t.next.previousPlaced=!0,u(e,t.next))):void f()}}function f(){if(v.status="done",v.redoPlacementAfterDone){var e=v.redoPlacement(v.angle,v.pitch).result;m.glyphVertex=e.buffers.glyphVertex,m.iconVertex=e.buffers.iconVertex,m.collisionBoxVertex=e.buffers.collisionBoxVertex}var t=[],r={};for(d in m)t.push(m[d].array);for(d in b)r[d]=b[d].elementGroups;i(null,{elementGroups:r,buffers:m,extent:T,bucketStats:"undefined"!=typeof self?self.bucketStats:null},t)}this.status="parsing",this.featureTree=new FeatureTree(this.coord,this.overscaling);var c,d,h,p,v=this,m=new BufferSet,g=new CollisionTile(this.angle,this.pitch),b={},x=this.bucketsInOrder=[],y={};for(c=0;c<t.length;c++)if(h=t[c],h.source===this.source&&!h.ref){var k=h.minzoom;if(!(k&&this.zoom<k&&k<this.maxZoom)){var P=h.maxzoom;if(!(P&&this.zoom>=P)){var S=h.layout.visibility;if("none"!==S)if(p=createBucket(h,m,this.zoom,this.overscaling,this.collisionDebug),p.layers=[h.id],b[p.id]=p,x.push(p),e.layers){var D=h["source-layer"];y[D]||(y[D]={}),y[D][p.id]=p}else y[p.id]=p}}}for(c=0;c<t.length;c++)h=t[c],h.source===this.source&&h.ref&&(p=b[h.ref],p&&p.layers.push(h.id));var T=4096;if(e.layers)for(d in y)h=e.layers[d],h&&(h.extent&&(T=h.extent),a(h,y[d],s,o,n));else a(e,y);var z,w=x.length;for(c=x.length-1;c>=0;c--)p=x[c],p.needsPlacement&&(z?z.next=p:p.previousPlaced=!0,z=p),p.getDependencies&&p.getDependencies(this,r,l(p)),p.needsPlacement||p.getDependencies||u(v,p)},WorkerTile.prototype.redoPlacement=function(e,t,r){if("done"!==this.status)return this.redoPlacementAfterDone=!0,this.angle=e,{};for(var i=new BufferSet,s=[],o={},n=new CollisionTile(e,t),a=this.bucketsInOrder,l=a.length-1;l>=0;l--){var u=a[l];"symbol"===u.type&&(u.placeFeatures(n,i,r),o[u.id]=u.elementGroups)}for(var f in i)s.push(i[f].array);return{result:{elementGroups:o,buffers:i},transferables:s}};
-	},{"../data/buffer/buffer_set":2,"../data/create_bucket":13,"../data/feature_tree":15,"../symbol/collision_tile":68}],51:[function(require,module,exports){
-	"use strict";function AnimationLoop(){this.n=0,this.times=[]}module.exports=AnimationLoop,AnimationLoop.prototype.stopped=function(){return this.times=this.times.filter(function(t){return t.time>=(new Date).getTime()}),!this.times.length},AnimationLoop.prototype.set=function(t){return this.times.push({id:this.n,time:t+(new Date).getTime()}),this.n++},AnimationLoop.prototype.cancel=function(t){this.times=this.times.filter(function(i){return i.id!==t})};
-	},{}],52:[function(require,module,exports){
-	"use strict";function ImageSprite(t){this.base=t,this.retina=browser.devicePixelRatio>1;var i=this.retina?"@2x":"";ajax.getJSON(normalizeURL(t,i,".json"),function(t,i){return t?void this.fire("error",{error:t}):(this.data=i,void(this.img&&this.fire("load")))}.bind(this)),ajax.getImage(normalizeURL(t,i,".png"),function(t,i){if(t)return void this.fire("error",{error:t});for(var e=i.getData(),r=i.data=new Uint8Array(e.length),a=0;a<e.length;a+=4){var o=e[a+3]/255;r[a+0]=e[a+0]*o,r[a+1]=e[a+1]*o,r[a+2]=e[a+2]*o,r[a+3]=e[a+3]}this.img=i,this.data&&this.fire("load")}.bind(this))}function SpritePosition(){}var Evented=require("../util/evented"),ajax=require("../util/ajax"),browser=require("../util/browser"),normalizeURL=require("../util/mapbox").normalizeSpriteURL;module.exports=ImageSprite,ImageSprite.prototype=Object.create(Evented),ImageSprite.prototype.toJSON=function(){return this.base},ImageSprite.prototype.loaded=function(){return!(!this.data||!this.img)},ImageSprite.prototype.resize=function(){if(browser.devicePixelRatio>1!==this.retina){var t=new ImageSprite(this.base);t.on("load",function(){this.img=t.img,this.data=t.data,this.retina=t.retina}.bind(this))}},SpritePosition.prototype={x:0,y:0,width:0,height:0,pixelRatio:1,sdf:!1},ImageSprite.prototype.getSpritePosition=function(t){if(!this.loaded())return new SpritePosition;var i=this.data&&this.data[t];return i&&this.img?i:new SpritePosition};
-	},{"../util/ajax":94,"../util/browser":95,"../util/evented":100,"../util/mapbox":103}],53:[function(require,module,exports){
-	"use strict";var reference=require("./reference");module.exports={},reference.layout.forEach(function(e){var r=function(e){for(var r in e)this[r]=e[r]},o=reference[e];for(var t in o)void 0!==o[t]["default"]&&(r.prototype[t]=o[t]["default"]);module.exports[e.replace("layout_","")]=r});
-	},{"./reference":55}],54:[function(require,module,exports){
-	"use strict";var reference=require("./reference"),parseCSSColor=require("csscolorparser").parseCSSColor;module.exports={},reference.paint.forEach(function(e){var r=function(){},o=reference[e];for(var p in o){var t=o[p],a=t["default"];void 0!==a&&("color"===t.type&&(a=parseCSSColor(a)),r.prototype[p]=a)}r.prototype.hidden=!1,module.exports[e.replace("paint_","")]=r});
-	},{"./reference":55,"csscolorparser":107}],55:[function(require,module,exports){
-	"use strict";module.exports=require("mapbox-gl-style-spec/reference/latest");
-	},{"mapbox-gl-style-spec/reference/latest":131}],56:[function(require,module,exports){
-	"use strict";function Style(e,t){this.animationLoop=t||new AnimationLoop,this.dispatcher=new Dispatcher(Math.max(browser.hardwareConcurrency-1,1),this),this.glyphAtlas=new GlyphAtlas(1024,1024),this.spriteAtlas=new SpriteAtlas(512,512),this.spriteAtlas.resize(browser.devicePixelRatio),this.lineAtlas=new LineAtlas(256,512),this._layers={},this._order=[],this._groups=[],this.sources={},this.zoomHistory={},util.bindAll(["_forwardSourceEvent","_forwardTileEvent","_redoPlacement"],this);var r=function(e,t){if(e)return void this.fire("error",{error:e});var r=validate(t);if(r.length)for(var i=0;i<r.length;i++)this.fire("error",{error:new Error(r[i].message)});else{this._loaded=!0,this.stylesheet=t;var s=t.sources;for(var o in s)this.addSource(o,s[o]);t.sprite&&(this.sprite=new ImageSprite(t.sprite),this.sprite.on("load",this.fire.bind(this,"change"))),this.glyphSource=new GlyphSource(t.glyphs,this.glyphAtlas),this._resolve(),this.fire("load")}}.bind(this);"string"==typeof e?ajax.getJSON(normalizeURL(e),r):browser.frame(r.bind(this,null,e))}var Evented=require("../util/evented"),styleBatch=require("./style_batch"),StyleLayer=require("./style_layer"),ImageSprite=require("./image_sprite"),GlyphSource=require("../symbol/glyph_source"),GlyphAtlas=require("../symbol/glyph_atlas"),SpriteAtlas=require("../symbol/sprite_atlas"),LineAtlas=require("../render/line_atlas"),util=require("../util/util"),ajax=require("../util/ajax"),normalizeURL=require("../util/mapbox").normalizeStyleURL,browser=require("../util/browser"),Dispatcher=require("../util/dispatcher"),AnimationLoop=require("./animation_loop"),validate=require("mapbox-gl-style-spec/lib/validate/latest");module.exports=Style,Style.prototype=util.inherit(Evented,{_loaded:!1,loaded:function(){if(!this._loaded)return!1;for(var e in this.sources)if(!this.sources[e].loaded())return!1;return this.sprite&&!this.sprite.loaded()?!1:!0},_resolve:function(){var e,t;this._layers={},this._order=[];for(var r=0;r<this.stylesheet.layers.length;r++)t=new StyleLayer(this.stylesheet.layers[r]),this._layers[t.id]=t,this._order.push(t.id);for(e in this._layers)this._layers[e].resolveLayout();for(e in this._layers)this._layers[e].resolveReference(this._layers),this._layers[e].resolvePaint();this._groupLayers(),this._broadcastLayers()},_groupLayers:function(){var e;this._groups=[];for(var t=0;t<this._order.length;++t){var r=this._layers[this._order[t]];e&&r.source===e.source||(e=[],e.source=r.source,this._groups.push(e)),e.push(r)}},_broadcastLayers:function(){var e=[];for(var t in this._layers)e.push(this._layers[t].json());this.dispatcher.broadcast("set layers",e)},_cascade:function(e,t){if(this._loaded){t=t||{transition:!0};for(var r in this._layers)this._layers[r].cascade(e,t,this.stylesheet.transition||{},this.animationLoop);this.fire("change")}},_recalculate:function(e){for(var t in this.sources)this.sources[t].used=!1;this._updateZoomHistory(e),this.rasterFadeDuration=300;for(t in this._layers){var r=this._layers[t];r.recalculate(e,this.zoomHistory)&&r.source&&(this.sources[r.source].used=!0)}var i=300;Math.floor(this.z)!==Math.floor(e)&&this.animationLoop.set(i),this.z=e,this.fire("zoom")},_updateZoomHistory:function(e){var t=this.zoomHistory;void 0===t.lastIntegerZoom&&(t.lastIntegerZoom=Math.floor(e),t.lastIntegerZoomTime=0,t.lastZoom=e),Math.floor(t.lastZoom)<Math.floor(e)?(t.lastIntegerZoom=Math.floor(e),t.lastIntegerZoomTime=Date.now()):Math.floor(t.lastZoom)>Math.floor(e)&&(t.lastIntegerZoom=Math.floor(e+1),t.lastIntegerZoomTime=Date.now()),t.lastZoom=e},batch:function(e){styleBatch(this,e)},addSource:function(e,t){return this.batch(function(r){r.addSource(e,t)}),this},removeSource:function(e){return this.batch(function(t){t.removeSource(e)}),this},getSource:function(e){return this.sources[e]},addLayer:function(e,t){return this.batch(function(r){r.addLayer(e,t)}),this},removeLayer:function(e){return this.batch(function(t){t.removeLayer(e)}),this},getLayer:function(e){return this._layers[e]},getReferentLayer:function(e){var t=this.getLayer(e);return t.ref&&(t=this.getLayer(t.ref)),t},setFilter:function(e,t){return this.batch(function(r){r.setFilter(e,t)}),this},setLayerZoomRange:function(e,t,r){return this.batch(function(i){i.setLayerZoomRange(e,t,r)}),this},getFilter:function(e){return this.getReferentLayer(e).filter},getLayoutProperty:function(e,t){return this.getReferentLayer(e).getLayoutProperty(t)},getPaintProperty:function(e,t,r){return this.getLayer(e).getPaintProperty(t,r)},featuresAt:function(e,t,r){var i=[],s=null;t.layer&&(t.layerIds=Array.isArray(t.layer)?t.layer:[t.layer]),util.asyncEach(Object.keys(this.sources),function(r,o){var a=this.sources[r];a.featuresAt(e,t,function(e,t){t&&(i=i.concat(t)),e&&(s=e),o()})}.bind(this),function(){return s?r(s):void r(null,i.filter(function(e){return void 0!==this._layers[e.layer]}.bind(this)).map(function(e){return e.layer=this._layers[e.layer].json(),e}.bind(this)))}.bind(this))},featuresIn:function(e,t,r){var i=[],s=null;t.layer&&(t.layer={id:t.layer}),util.asyncEach(Object.keys(this.sources),function(r,o){var a=this.sources[r];a.featuresIn(e,t,function(e,t){t&&(i=i.concat(t)),e&&(s=e),o()})}.bind(this),function(){return s?r(s):void r(null,i.filter(function(e){return void 0!==this._layers[e.layer]}.bind(this)).map(function(e){return e.layer=this._layers[e.layer].json(),e}.bind(this)))}.bind(this))},_remove:function(){this.dispatcher.remove()},_reloadSource:function(e){this.sources[e].reload()},_updateSources:function(e){for(var t in this.sources)this.sources[t].update(e)},_redoPlacement:function(){for(var e in this.sources)this.sources[e].redoPlacement&&this.sources[e].redoPlacement()},_forwardSourceEvent:function(e){this.fire("source."+e.type,util.extend({source:e.target},e))},_forwardTileEvent:function(e){this.fire(e.type,util.extend({source:e.target},e))},"get sprite json":function(e,t){var r=this.sprite;r.loaded()?t(null,{sprite:r.data,retina:r.retina}):r.on("load",function(){t(null,{sprite:r.data,retina:r.retina})})},"get icons":function(e,t){var r=this.sprite,i=this.spriteAtlas;r.loaded()?(i.setSprite(r),i.addIcons(e.icons,t)):r.on("load",function(){i.setSprite(r),i.addIcons(e.icons,t)})},"get glyphs":function(e,t){this.glyphSource.getSimpleGlyphs(e.fontstack,e.codepoints,e.uid,t)}});
-	},{"../render/line_atlas":36,"../symbol/glyph_atlas":70,"../symbol/glyph_source":71,"../symbol/sprite_atlas":77,"../util/ajax":94,"../util/browser":95,"../util/dispatcher":97,"../util/evented":100,"../util/mapbox":103,"../util/util":106,"./animation_loop":51,"./image_sprite":52,"./style_batch":57,"./style_layer":60,"mapbox-gl-style-spec/lib/validate/latest":129}],57:[function(require,module,exports){
-	"use strict";function styleBatch(e,t){if(!e._loaded)throw new Error("Style is not done loading");var r=Object.create(styleBatch.prototype);r._style=e,r._groupLayers=!1,r._broadcastLayers=!1,r._reloadSources={},r._events=[],r._change=!1,t(r),r._groupLayers&&r._style._groupLayers(),r._broadcastLayers&&r._style._broadcastLayers(),Object.keys(r._reloadSources).forEach(function(e){r._style._reloadSource(e)}),r._events.forEach(function(e){r._style.fire.apply(r._style,e)}),r._change&&r._style.fire("change")}var Source=require("../source/source"),StyleLayer=require("./style_layer");styleBatch.prototype={addLayer:function(e,t){if(void 0!==this._style._layers[e.id])throw new Error("There is already a layer with this ID");return e instanceof StyleLayer||(e=new StyleLayer(e)),this._style._layers[e.id]=e,this._style._order.splice(t?this._style._order.indexOf(t):1/0,0,e.id),e.resolveLayout(),e.resolveReference(this._style._layers),e.resolvePaint(),this._groupLayers=!0,this._broadcastLayers=!0,e.source&&(this._reloadSources[e.source]=!0),this._events.push(["layer.add",{layer:e}]),this._change=!0,this},removeLayer:function(e){var t=this._style._layers[e];if(void 0===t)throw new Error("There is no layer with this ID");for(var r in this._style._layers)this._style._layers[r].ref===e&&this.removeLayer(r);return delete this._style._layers[e],this._style._order.splice(this._style._order.indexOf(e),1),this._groupLayers=!0,this._broadcastLayers=!0,this._events.push(["layer.remove",{layer:t}]),this._change=!0,this},setPaintProperty:function(e,t,r,s){return this._style.getLayer(e).setPaintProperty(t,r,s),this._change=!0,this},setLayoutProperty:function(e,t,r){return e=this._style.getReferentLayer(e),e.setLayoutProperty(t,r),this._broadcastLayers=!0,e.source&&(this._reloadSources[e.source]=!0),this._change=!0,this},setFilter:function(e,t){return e=this._style.getReferentLayer(e),e.filter=t,this._broadcastLayers=!0,e.source&&(this._reloadSources[e.source]=!0),this._change=!0,this},setLayerZoomRange:function(e,t,r){var s=this._style.getReferentLayer(e);return null!=t&&(s.minzoom=t),null!=r&&(s.maxzoom=r),this._broadcastLayers=!0,s.source&&(this._reloadSources[s.source]=!0),this._change=!0,this},addSource:function(e,t){if(!this._style._loaded)throw new Error("Style is not done loading");if(void 0!==this._style.sources[e])throw new Error("There is already a source with this ID");return t=Source.create(t),this._style.sources[e]=t,t.id=e,t.style=this._style,t.dispatcher=this._style.dispatcher,t.glyphAtlas=this._style.glyphAtlas,t.on("load",this._style._forwardSourceEvent).on("error",this._style._forwardSourceEvent).on("change",this._style._forwardSourceEvent).on("tile.add",this._style._forwardTileEvent).on("tile.load",this._style._forwardTileEvent).on("tile.error",this._style._forwardTileEvent).on("tile.remove",this._style._forwardTileEvent).on("tile.stats",this._style._forwardTileEvent),this._events.push(["source.add",{source:t}]),this._change=!0,this},removeSource:function(e){if(void 0===this._style.sources[e])throw new Error("There is no source with this ID");var t=this._style.sources[e];return delete this._style.sources[e],t.off("load",this._style._forwardSourceEvent).off("error",this._style._forwardSourceEvent).off("change",this._style._forwardSourceEvent).off("tile.add",this._style._forwardTileEvent).off("tile.load",this._style._forwardTileEvent).off("tile.error",this._style._forwardTileEvent).off("tile.remove",this._style._forwardTileEvent).off("tile.stats",this._style._forwardTileEvent),this._events.push(["source.remove",{source:t}]),this._change=!0,this}},module.exports=styleBatch;
-	},{"../source/source":43,"./style_layer":60}],58:[function(require,module,exports){
-	"use strict";function StyleDeclaration(t,r){this.type=t.type,this.transitionable=t.transition,null==r&&(r=t["default"]),this.json=JSON.stringify(r),"color"===this.type?this.value=parseColor(r):this.value=r,"interpolated"===t["function"]?this.calculate=MapboxGLFunction.interpolated(this.value):(this.calculate=MapboxGLFunction["piecewise-constant"](this.value),t.transition&&(this.calculate=transitioned(this.calculate)))}function transitioned(t){return function(r,o,e){var n,i,a,l=r%1,s=Math.min((Date.now()-o.lastIntegerZoomTime)/e,1),c=1,u=1;return r>o.lastIntegerZoom?(n=l+(1-l)*s,c*=2,i=t(r-1),a=t(r)):(n=1-(1-s)*l,a=t(r),i=t(r+1),c/=2),{from:i,fromScale:c,to:a,toScale:u,t:n}}}function parseColor(t){if(colorCache[t])return colorCache[t];if(Array.isArray(t))return t;if(t.stops)return util.extend({},t,{stops:t.stops.map(function(t){return[t[0],parseColor(t[1])]})});if("string"==typeof t){var r=colorDowngrade(parseCSSColor(t));return colorCache[t]=r,r}throw new Error("Invalid color "+t)}function colorDowngrade(t){return[t[0]/255,t[1]/255,t[2]/255,t[3]/1]}var parseCSSColor=require("csscolorparser").parseCSSColor,MapboxGLFunction=require("mapbox-gl-function"),util=require("../util/util");module.exports=StyleDeclaration;var colorCache={};
-	},{"../util/util":106,"csscolorparser":107,"mapbox-gl-function":128}],59:[function(require,module,exports){
-	"use strict";function makeConstructor(t){function e(t){this._values={},this._transitions={};for(var e in t)this[e]=t[e]}return Object.keys(t).forEach(function(n){var r=t[n];Object.defineProperty(e.prototype,n,{set:function(t){this._values[n]=new StyleDeclaration(r,t)},get:function(){return this._values[n].value}}),r.transition&&Object.defineProperty(e.prototype,n+"-transition",{set:function(t){this._transitions[n]=t},get:function(){return this._transitions[n]}})}),e.prototype.values=function(){return this._values},e.prototype.transition=function(t,e){var n=this._transitions[t]||{};return{duration:util.coalesce(n.duration,e.duration,300),delay:util.coalesce(n.delay,e.delay,0)}},e.prototype.json=function(){var t={};for(var e in this._values)t[e]=this._values[e].value;for(var n in this._transitions)t[n+"-transition"]=this._transitions[e];return t},e}var util=require("../util/util"),reference=require("./reference"),StyleDeclaration=require("./style_declaration"),lookup={paint:{},layout:{}};reference.layer.type.values.forEach(function(t){lookup.paint[t]=makeConstructor(reference["paint_"+t]),lookup.layout[t]=makeConstructor(reference["layout_"+t])}),module.exports=function(t,e,n){return new lookup[t][e](n)};
-	},{"../util/util":106,"./reference":55,"./style_declaration":58}],60:[function(require,module,exports){
-	"use strict";function StyleLayer(t){this._layer=t,this.id=t.id,this.ref=t.ref,this._resolved={},this._cascaded={},this.assign(t)}function premultiplyLayer(t,i){var e=i+"-color",a=i+"-halo-color",o=i+"-outline-color",r=t[e],s=t[a],n=t[o],l=t[i+"-opacity"],y=r&&l*r[3],u=s&&l*s[3],h=n&&l*n[3];void 0!==y&&1>y&&(t[e]=util.premultiply([r[0],r[1],r[2],y])),void 0!==u&&1>u&&(t[a]=util.premultiply([s[0],s[1],s[2],u])),void 0!==h&&1>h&&(t[o]=util.premultiply([n[0],n[1],n[2],h]))}var util=require("../util/util"),StyleTransition=require("./style_transition"),StyleDeclarationSet=require("./style_declaration_set"),LayoutProperties=require("./layout_properties"),PaintProperties=require("./paint_properties");module.exports=StyleLayer,StyleLayer.prototype={resolveLayout:function(){this.ref||(this.layout=new LayoutProperties[this.type](this._layer.layout),"line"===this.layout["symbol-placement"]&&(this.layout.hasOwnProperty("text-rotation-alignment")||(this.layout["text-rotation-alignment"]="map"),this.layout.hasOwnProperty("icon-rotation-alignment")||(this.layout["icon-rotation-alignment"]="map"),this.layout["symbol-avoid-edges"]=!0))},setLayoutProperty:function(t,i){null==i?delete this.layout[t]:this.layout[t]=i},getLayoutProperty:function(t){return this.layout[t]},resolveReference:function(t){this.ref&&this.assign(t[this.ref])},resolvePaint:function(){for(var t in this._layer){var i=t.match(/^paint(?:\.(.*))?$/);i&&(this._resolved[i[1]||""]=new StyleDeclarationSet("paint",this.type,this._layer[t]))}},setPaintProperty:function(t,i,e){var a=this._resolved[e||""];a||(a=this._resolved[e||""]=new StyleDeclarationSet("paint",this.type,{})),a[t]=i},getPaintProperty:function(t,i){var e=this._resolved[i||""];if(e)return e[t]},cascade:function(t,i,e,a){for(var o in this._resolved)if(""===o||t[o]){var r=this._resolved[o],s=r.values();for(var n in s){var l=s[n],y=i.transition?this._cascaded[n]:void 0;if(!y||y.declaration.json!==l.json){var u=r.transition(n,e),h=this._cascaded[n]=new StyleTransition(l,y,u);h.instant()||(h.loopID=a.set(h.endTime-(new Date).getTime())),y&&a.cancel(y.loopID)}}}if("symbol"===this.type){var c=new StyleDeclarationSet("layout",this.type,this.layout);this._cascaded["text-size"]=new StyleTransition(c.values()["text-size"],void 0,e),this._cascaded["icon-size"]=new StyleTransition(c.values()["icon-size"],void 0,e)}},recalculate:function(t,i){var e=this.type,a=this.paint=new PaintProperties[e];for(var o in this._cascaded)a[o]=this._cascaded[o].at(t,i);if(this.hidden=this.minzoom&&t<this.minzoom||this.maxzoom&&t>=this.maxzoom||"none"===this.layout.visibility,"symbol"===e?0!==a["text-opacity"]&&this.layout["text-field"]||0!==a["icon-opacity"]&&this.layout["icon-image"]?(premultiplyLayer(a,"text"),premultiplyLayer(a,"icon")):this.hidden=!0:0===a[e+"-opacity"]?this.hidden=!0:premultiplyLayer(a,e),this._cascaded["line-dasharray"]){var r=a["line-dasharray"],s=this._cascaded["line-width"]?this._cascaded["line-width"].at(Math.floor(t),1/0):a["line-width"];r.fromScale*=s,r.toScale*=s}return!this.hidden},assign:function(t){util.extend(this,util.pick(t,["type","source","source-layer","minzoom","maxzoom","filter","layout"]))},json:function(){return util.extend({},this._layer,util.pick(this,["type","source","source-layer","minzoom","maxzoom","filter","layout","paint"]))}};
-	},{"../util/util":106,"./layout_properties":53,"./paint_properties":54,"./style_declaration_set":59,"./style_transition":61}],61:[function(require,module,exports){
-	"use strict";function StyleTransition(t,i,e){this.declaration=t,this.startTime=this.endTime=(new Date).getTime();var n=t.type;"string"!==n&&"array"!==n||!t.transitionable?this.interp=interpolate[n]:this.interp=interpZoomTransitioned,this.oldTransition=i,this.duration=e.duration||0,this.delay=e.delay||0,this.instant()||(this.endTime=this.startTime+this.duration+this.delay,this.ease=util.easeCubicInOut),i&&i.endTime<=this.startTime&&delete i.oldTransition}function interpZoomTransitioned(t,i,e){return{from:t.to,fromScale:t.toScale,to:i.to,toScale:i.toScale,t:e}}var util=require("../util/util"),interpolate=require("../util/interpolate");module.exports=StyleTransition,StyleTransition.prototype.instant=function(){return!this.oldTransition||!this.interp||0===this.duration&&0===this.delay},StyleTransition.prototype.at=function(t,i,e){var n=this.declaration.calculate(t,i,this.duration);if(this.instant())return n;if(e=e||Date.now(),e<this.endTime){var r=this.oldTransition.at(t,i,this.startTime),a=this.ease((e-this.startTime-this.delay)/this.duration);n=this.interp(r,n,a)}return n};
-	},{"../util/interpolate":102,"../util/util":106}],62:[function(require,module,exports){
-	"use strict";function Anchor(t,e,o,n){this.x=t,this.y=e,this.angle=o,void 0!==n&&(this.segment=n)}var Point=require("point-geometry");module.exports=Anchor,Anchor.prototype=Object.create(Point.prototype),Anchor.prototype.clone=function(){return new Anchor(this.x,this.y,this.angle,this.segment)};
-	},{"point-geometry":137}],63:[function(require,module,exports){
-	"use strict";function BinPack(e,h){this.width=e,this.height=h,this.free=[{x:0,y:0,w:e,h:h}]}module.exports=BinPack,BinPack.prototype.release=function(e){for(var h=0;h<this.free.length;h++){var i=this.free[h];if(i.y===e.y&&i.h===e.h&&i.x+i.w===e.x)i.w+=e.w;else if(i.x===e.x&&i.w===e.w&&i.y+i.h===e.y)i.h+=e.h;else if(e.y===i.y&&e.h===i.h&&e.x+e.w===i.x)i.x=e.x,i.w+=e.w;else{if(e.x!==i.x||e.w!==i.w||e.y+e.h!==i.y)continue;i.y=e.y,i.h+=e.h}return this.free.splice(h,1),void this.release(i)}this.free.push(e)},BinPack.prototype.allocate=function(e,h){for(var i={x:1/0,y:1/0,w:1/0,h:1/0},t=-1,s=0;s<this.free.length;s++){var r=this.free[s];e<=r.w&&h<=r.h&&r.y<=i.y&&r.x<=i.x&&(i=r,t=s)}return 0>t?{x:-1,y:-1}:(this.free.splice(t,1),i.w<i.h?(i.w>e&&this.free.push({x:i.x+e,y:i.y,w:i.w-e,h:h}),i.h>h&&this.free.push({x:i.x,y:i.y+h,w:i.w,h:i.h-h})):(i.w>e&&this.free.push({x:i.x+e,y:i.y,w:i.w-e,h:i.h}),i.h>h&&this.free.push({x:i.x,y:i.y+h,w:e,h:i.h-h})),{x:i.x,y:i.y,w:e,h:h})};
-	},{}],64:[function(require,module,exports){
-	"use strict";function checkMaxAngle(e,t,a,r,n){if(void 0===t.segment)return!0;for(var i=t,s=t.segment+1,f=0;f>-a/2;){if(s--,0>s)return!1;f-=e[s].dist(i),i=e[s]}f+=e[s].dist(e[s+1]),s++;for(var l=[],o=0;a/2>f;){var u=e[s-1],c=e[s],g=e[s+1];if(!g)return!1;var h=u.angleTo(c)-c.angleTo(g);for(h=(h+3*Math.PI)%(2*Math.PI)-Math.PI,l.push({distance:f,angleDelta:h}),o+=h;f-l[0].distance>r;)o-=l.shift().angleDelta;if(Math.abs(o)>n)return!1;s++,f+=c.dist(g)}return!0}module.exports=checkMaxAngle;
-	},{}],65:[function(require,module,exports){
-	"use strict";function clipLine(x,y,n,e,t){for(var i=[],o=0;o<x.length;o++)for(var r,P=x[o],u=0;u<P.length-1;u++){var w=P[u],l=P[u+1];w.x<y&&l.x<y||(w.x<y?w=new Point(y,w.y+(l.y-w.y)*((y-w.x)/(l.x-w.x))):l.x<y&&(l=new Point(y,w.y+(l.y-w.y)*((y-w.x)/(l.x-w.x)))),w.y<n&&l.y<n||(w.y<n?w=new Point(w.x+(l.x-w.x)*((n-w.y)/(l.y-w.y)),n):l.y<n&&(l=new Point(w.x+(l.x-w.x)*((n-w.y)/(l.y-w.y)),n)),w.x>=e&&l.x>=e||(w.x>=e?w=new Point(e,w.y+(l.y-w.y)*((e-w.x)/(l.x-w.x))):l.x>=e&&(l=new Point(e,w.y+(l.y-w.y)*((e-w.x)/(l.x-w.x)))),w.y>=t&&l.y>=t||(w.y>=t?w=new Point(w.x+(l.x-w.x)*((t-w.y)/(l.y-w.y)),t):l.y>=t&&(l=new Point(w.x+(l.x-w.x)*((t-w.y)/(l.y-w.y)),t)),r&&w.equals(r[r.length-1])||(r=[w],i.push(r)),r.push(l)))))}return i}var Point=require("point-geometry");module.exports=clipLine;
-	},{"point-geometry":137}],66:[function(require,module,exports){
-	"use strict";function CollisionBox(i,t,s,h,o,l){this.anchorPoint=i,this.x1=t,this.y1=s,this.x2=h,this.y2=o,this.maxScale=l,this.placementScale=0,this[0]=this[1]=this[2]=this[3]=0}module.exports=CollisionBox;
-	},{}],67:[function(require,module,exports){
-	"use strict";function CollisionFeature(o,i,t,e,r,s){var n=t.top*e-r,l=t.bottom*e+r,a=t.left*e-r,u=t.right*e+r;if(this.boxes=[],s){var h=l-n,x=u-a;if(0>=h)return;h=Math.max(10*e,h),this._addLineCollisionBoxes(o,i,x,h)}else this.boxes.push(new CollisionBox(new Point(i.x,i.y),a,n,u,l,1/0))}var CollisionBox=require("./collision_box"),Point=require("point-geometry");module.exports=CollisionFeature,CollisionFeature.prototype._addLineCollisionBoxes=function(o,i,t,e){var r=e/2,s=Math.floor(t/r),n=-e/2,l=this.boxes,a=i,u=i.segment+1,h=n;do{if(u--,0>u)return l;h-=o[u].dist(a),a=o[u]}while(h>-t/2);for(var x=o[u].dist(o[u+1]),d=0;s>d;d++){for(var f=-t/2+d*r;f>h+x;){if(h+=x,u++,u+1>=o.length)return l;x=o[u].dist(o[u+1])}var C=f-h,b=o[u],m=o[u+1],p=m.sub(b)._unit()._mult(C)._add(b),v=Math.max(Math.abs(f-n)-r/2,0),_=t/2/v;l.push(new CollisionBox(p,-e/2,-e/2,e/2,e/2,_))}return l};
-	},{"./collision_box":66,"point-geometry":137}],68:[function(require,module,exports){
-	"use strict";function CollisionTile(t,a){this.tree=rbush(),this.angle=t;var e=Math.sin(t),i=Math.cos(t);this.rotationMatrix=[i,-e,e,i],this.yStretch=1/Math.cos(a/180*Math.PI),this.yStretch=Math.pow(this.yStretch,1.3)}var rbush=require("rbush");module.exports=CollisionTile,CollisionTile.prototype.minScale=.25,CollisionTile.prototype.maxScale=2,CollisionTile.prototype.placeCollisionFeature=function(t){for(var a=this.minScale,e=this.rotationMatrix,i=this.yStretch,o=0;o<t.boxes.length;o++){var l=t.boxes[o],r=l.anchorPoint.matMult(e),s=r.x,h=r.y;l[0]=s+l.x1,l[1]=h+l.y1*i,l[2]=s+l.x2,l[3]=h+l.y2*i;for(var n=this.tree.search(l),c=0;c<n.length;c++){var x=n[c],m=x.anchorPoint.matMult(e),y=(x.x1-l.x2)/(s-m.x),u=(x.x2-l.x1)/(s-m.x),S=(x.y1-l.y2)*i/(h-m.y),p=(x.y2-l.y1)*i/(h-m.y);(isNaN(y)||isNaN(u))&&(y=u=1),(isNaN(S)||isNaN(p))&&(S=p=1);var M=Math.min(Math.max(y,u),Math.max(S,p));if(M>x.maxScale&&(M=x.maxScale),M>l.maxScale&&(M=l.maxScale),M>a&&M>=x.placementScale&&(a=M),a>=this.maxScale)return a}}return a},CollisionTile.prototype.insertCollisionFeature=function(t,a){for(var e=t.boxes,i=0;i<e.length;i++)e[i].placementScale=a;a<this.maxScale&&this.tree.load(e)};
-	},{"rbush":139}],69:[function(require,module,exports){
-	"use strict";function getAnchors(e,r,t,a,n,o,l,h){var i=a?.6*o*l:0,c=Math.max(a?a.right-a.left:0,n?n.right-n.left:0);if(0===e[0].x||4096===e[0].x||0===e[0].y||4096===e[0].y)var u=!0;r/4>r-c*l&&(r=c*l+r/4);var s=2*o,g=u?r/2*h%r:(c/2+s)*l*h%r;return resample(e,g,r,i,t,c*l,u,!1)}function resample(e,r,t,a,n,o,l,h){for(var i=0,c=r-t,u=[],s=0;s<e.length-1;s++){for(var g=e[s],p=e[s+1],x=g.dist(p),f=p.angleTo(g);i+x>c+t;){c+=t;var v=(c-i)/x,m=interpolate(g.x,p.x,v),A=interpolate(g.y,p.y,v);if(m>=0&&4096>m&&A>=0&&4096>A){m=Math.round(m),A=Math.round(A);var y=new Anchor(m,A,f,s);(!a||checkMaxAngle(e,y,o,a,n))&&u.push(y)}}i+=x}return h||u.length||l||(u=resample(e,i/2,t,a,n,o,l,!0)),u}var interpolate=require("../util/interpolate"),Anchor=require("../symbol/anchor"),checkMaxAngle=require("./check_max_angle");module.exports=getAnchors;
-	},{"../symbol/anchor":62,"../util/interpolate":102,"./check_max_angle":64}],70:[function(require,module,exports){
-	"use strict";function GlyphAtlas(t,i){this.width=t,this.height=i,this.bin=new BinPack(t,i),this.index={},this.ids={},this.data=new Uint8Array(t*i)}var BinPack=require("./bin_pack");module.exports=GlyphAtlas,GlyphAtlas.prototype={get debug(){return"canvas"in this},set debug(t){t&&!this.canvas?(this.canvas=document.createElement("canvas"),this.canvas.width=this.width,this.canvas.height=this.height,document.body.appendChild(this.canvas),this.ctx=this.canvas.getContext("2d")):!t&&this.canvas&&(this.canvas.parentNode.removeChild(this.canvas),delete this.ctx,delete this.canvas)}},GlyphAtlas.prototype.getGlyphs=function(){var t,i,e,s={};for(var h in this.ids)t=h.split("#"),i=t[0],e=t[1],s[i]||(s[i]=[]),s[i].push(e);return s},GlyphAtlas.prototype.getRects=function(){var t,i,e,s={};for(var h in this.ids)t=h.split("#"),i=t[0],e=t[1],s[i]||(s[i]={}),s[i][e]=this.index[h];return s},GlyphAtlas.prototype.removeGlyphs=function(t){for(var i in this.ids){var e=this.ids[i],s=e.indexOf(t);if(s>=0&&e.splice(s,1),this.ids[i]=e,!e.length){for(var h=this.index[i],a=this.data,r=0;r<h.h;r++)for(var n=this.width*(h.y+r)+h.x,d=0;d<h.w;d++)a[n+d]=0;this.dirty=!0,this.bin.release(h),delete this.index[i],delete this.ids[i]}}this.updateTexture(this.gl)},GlyphAtlas.prototype.addGlyph=function(t,i,e,s){if(!e)return null;var h=i+"#"+e.id;if(this.index[h])return this.ids[h].indexOf(t)<0&&this.ids[h].push(t),this.index[h];if(!e.bitmap)return null;var a=e.width+2*s,r=e.height+2*s,n=1,d=a+2*n,l=r+2*n;d+=4-d%4,l+=4-l%4;var o=this.bin.allocate(d,l);if(o.x<0)return console.warn("glyph bitmap overflow"),{glyph:e,rect:null};this.index[h]=o,this.ids[h]=[t];for(var c=this.data,p=e.bitmap,u=0;r>u;u++)for(var x=this.width*(o.y+u+n)+o.x+n,E=a*u,T=0;a>T;T++)c[x+T]=p[E+T];return this.dirty=!0,o},GlyphAtlas.prototype.bind=function(t){this.gl=t,this.texture?t.bindTexture(t.TEXTURE_2D,this.texture):(this.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texture),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texImage2D(t.TEXTURE_2D,0,t.ALPHA,this.width,this.height,0,t.ALPHA,t.UNSIGNED_BYTE,null))},GlyphAtlas.prototype.updateTexture=function(t){if(this.bind(t),this.dirty){if(t.texSubImage2D(t.TEXTURE_2D,0,0,0,this.width,this.height,t.ALPHA,t.UNSIGNED_BYTE,this.data),this.ctx){for(var i=this.ctx.getImageData(0,0,this.width,this.height),e=0,s=0;e<this.data.length;e++,s+=4)i.data[s]=this.data[e],i.data[s+1]=this.data[e],i.data[s+2]=this.data[e],i.data[s+3]=255;this.ctx.putImageData(i,0,0),this.ctx.strokeStyle="red";for(var h=0;h<this.bin.free.length;h++){var a=this.bin.free[h];this.ctx.strokeRect(a.x,a.y,a.w,a.h)}}this.dirty=!1}};
-	},{"./bin_pack":63}],71:[function(require,module,exports){
-	"use strict";function GlyphSource(t,e){this.url=t&&normalizeURL(t),this.glyphAtlas=e,this.stacks=[],this.loading={}}function SimpleGlyph(t,e,r){var i=1;this.advance=t.advance,this.left=t.left-r-i,this.top=t.top+r+i,this.rect=e}function glyphUrl(t,e,r,i){return i=i||"abc",r.replace("{s}",i[t.length%i.length]).replace("{fontstack}",t).replace("{range}",e)}var normalizeURL=require("../util/mapbox").normalizeGlyphsURL,getArrayBuffer=require("../util/ajax").getArrayBuffer,Glyphs=require("../util/glyphs"),Protobuf=require("pbf");module.exports=GlyphSource,GlyphSource.prototype.getSimpleGlyphs=function(t,e,r,i){void 0===this.stacks[t]&&(this.stacks[t]={});for(var l,a={},s=this.stacks[t],h=this.glyphAtlas,o=3,n={},p=0,u=0;u<e.length;u++){var f=e[u];if(l=Math.floor(f/256),s[l]){var y=s[l].glyphs[f],c=h.addGlyph(r,t,y,o);y&&(a[f]=new SimpleGlyph(y,c,o))}else void 0===n[l]&&(n[l]=[],p++),n[l].push(f)}p||i(void 0,a);var g=function(e,l,s){if(!e)for(var u=this.stacks[t][l]=s.stacks[0],f=0;f<n[l].length;f++){var y=n[l][f],c=u.glyphs[y],g=h.addGlyph(r,t,c,o);c&&(a[y]=new SimpleGlyph(c,g,o))}p--,p||i(void 0,a)}.bind(this);for(var d in n)this.loadRange(t,d,g)},GlyphSource.prototype.loadRange=function(t,e,r){if(256*e>65535)return r("gyphs > 65535 not supported");void 0===this.loading[t]&&(this.loading[t]={});var i=this.loading[t];if(i[e])i[e].push(r);else{i[e]=[r];var l=256*e+"-"+(256*e+255),a=glyphUrl(t,l,this.url);getArrayBuffer(a,function(t,r){for(var l=!t&&new Glyphs(new Protobuf(new Uint8Array(r))),a=0;a<i[e].length;a++)i[e][a](t,e,l);delete i[e]})}};
-	},{"../util/ajax":94,"../util/glyphs":101,"../util/mapbox":103,"pbf":136}],72:[function(require,module,exports){
-	"use strict";module.exports=function(e,t,n){function r(r){l.push(e[r]),c.push(n[r]),v.push(t[r]),h++}function u(e,t,n){var r=f[e];return delete f[e],f[t]=r,c[r][0].pop(),c[r][0]=c[r][0].concat(n[0]),r}function i(e,t,n){var r=a[t];return delete a[t],a[e]=r,c[r][0].shift(),c[r][0]=n[0].concat(c[r][0]),r}function o(e,t,n){var r=n?t[0][t[0].length-1]:t[0][0];return e+":"+r.x+":"+r.y}var s,a={},f={},l=[],c=[],v=[],h=0;for(s=0;s<e.length;s++){var p=n[s],d=t[s];if(p)if(d){var g=o(d,p),x=o(d,p,!0);if(g in f&&x in a&&f[g]!==a[x]){var m=i(g,x,p),y=u(g,x,c[m]);delete a[g],delete f[x],f[o(d,c[y],!0)]=y,c[m]=null}else g in f?u(g,x,p):x in a?i(g,x,p):(r(s),a[g]=h-1,f[x]=h-1)}else r(s)}return{features:l,textFeatures:v,geometries:c}};
-	},{}],73:[function(require,module,exports){
-	"use strict";function SymbolQuad(t,a,e,n,i,o,r,h,l){this.anchorPoint=t,this.tl=a,this.tr=e,this.bl=n,this.br=i,this.tex=o,this.angle=r,this.minScale=h,this.maxScale=l}function getIconQuads(t,a,e,n,i,o){var r=a.image.rect,h=1,l=a.left-h,s=l+r.w,m=a.top-h,u=m+r.h,c=new Point(l,m),g=new Point(s,m),M=new Point(s,u),P=new Point(l,u),f=i["icon-rotate"]*Math.PI/180;if(o){var y=n[t.segment];f+=Math.atan2(t.y-y.y,t.x-y.x)}if(f){var S=Math.sin(f),v=Math.cos(f),x=[v,-S,S,v];c=c.matMult(x),g=g.matMult(x),P=P.matMult(x),M=M.matMult(x)}return[new SymbolQuad(new Point(t.x,t.y),c,g,P,M,a.image.rect,0,minScale,1/0)]}function getGlyphQuads(t,a,e,n,i,o){for(var r=i["text-rotate"]*Math.PI/180,h=i["text-keep-upright"],l=a.positionedGlyphs,s=[],m=0;m<l.length;m++){var u=l[m],c=u.glyph,g=c.rect;if(g){var M,P=(u.x+c.advance/2)*e,f=minScale;o?(M=[],f=getSegmentGlyphs(M,t,P,n,t.segment,!0),h&&(f=Math.min(f,getSegmentGlyphs(M,t,P,n,t.segment,!1)))):M=[{anchorPoint:new Point(t.x,t.y),offset:0,angle:0,maxScale:1/0,minScale:minScale}];for(var y=u.x+c.left,S=u.y-c.top,v=y+g.w,x=S+g.h,p=new Point(y,S),w=new Point(v,S),d=new Point(y,x),I=new Point(v,x),b=0;b<M.length;b++){var Q=M[b],G=p,k=w,q=d,_=I,j=Q.angle+r;if(j){var z=Math.sin(j),A=Math.cos(j),B=[A,-z,z,A];G=G.matMult(B),k=k.matMult(B),q=q.matMult(B),_=_.matMult(B)}var C=Math.max(Q.minScale,f),D=(t.angle+r+Q.offset+2*Math.PI)%(2*Math.PI);s.push(new SymbolQuad(Q.anchorPoint,G,k,q,_,g,D,C,Q.maxScale))}}}return s}function getSegmentGlyphs(t,a,e,n,i,o){var r=!o;0>e&&(o=!o),o&&i++;var h=new Point(a.x,a.y),l=n[i],s=1/0;e=Math.abs(e);for(var m=minScale;;){var u=h.dist(l),c=e/u,g=Math.atan2(l.y-h.y,l.x-h.x);if(o||(g+=Math.PI),r&&(g+=Math.PI),t.push({anchorPoint:h,offset:r?Math.PI:0,minScale:c,maxScale:s,angle:(g+2*Math.PI)%(2*Math.PI)}),m>=c)break;for(h=l;h.equals(l);)if(i+=o?1:-1,l=n[i],!l)return c;var M=l.sub(h)._unit();h=h.sub(M._mult(u)),s=c}return m}var Point=require("point-geometry");module.exports={getIconQuads:getIconQuads,getGlyphQuads:getGlyphQuads};var minScale=.5;
-	},{"point-geometry":137}],74:[function(require,module,exports){
-	"use strict";function resolveIcons(e,r){for(var o=[],s=0,n=e.length;n>s;s++){var t=resolveTokens(e[s].properties,r["icon-image"]);t&&o.indexOf(t)<0&&o.push(t)}return o}var resolveTokens=require("../util/token");module.exports=resolveIcons;
-	},{"../util/token":105}],75:[function(require,module,exports){
-	"use strict";function resolveText(e,r,t){for(var o=[],s=[],n=0,u=e.length;u>n;n++){var a=resolveTokens(e[n].properties,r["text-field"]);if(a){a=a.toString();var l=r["text-transform"];"uppercase"===l?a=a.toLocaleUpperCase():"lowercase"===l&&(a=a.toLocaleLowerCase());for(var i=0,v=a.length;v>i;i++)s.push(a.charCodeAt(i));o[n]=a}else o[n]=null}return s=uniq(s,t),{textFeatures:o,codepoints:s}}function uniq(e,r){var t,o=[];e.sort(sortNumbers);for(var s=0;s<e.length;s++)e[s]!==t&&(t=e[s],r[t]||o.push(e[s]));return o}function sortNumbers(e,r){return e-r}var resolveTokens=require("../util/token");module.exports=resolveText;
-	},{"../util/token":105}],76:[function(require,module,exports){
-	"use strict";function PositionedGlyph(t,i,n,e){this.codePoint=t,this.x=i,this.y=n,this.glyph=e}function Shaping(t,i,n,e,o,h){this.positionedGlyphs=t,this.text=i,this.top=n,this.bottom=e,this.left=o,this.right=h}function shapeText(t,i,n,e,o,h,a,s,r){for(var l=[],f=new Shaping(l,t,r[1],r[1],r[0],r[0]),c=-17,p=r[0],u=r[1]+c,d=0;d<t.length;d++){var g=t.charCodeAt(d),v=i[g];v&&(l.push(new PositionedGlyph(g,p,u,v)),p+=v.advance+s)}return l.length?(linewrap(f,i,e,n,o,h,a),f):!1}function linewrap(t,i,n,e,o,h,a){var s=null,r=0,l=0,f=0,c=0,p=t.positionedGlyphs;if(e)for(var u=0;u<p.length;u++){var d=p[u];if(d.x-=r,d.y+=n*f,d.x>e&&null!==s){var g=p[s+1].x;c=Math.max(g,c);for(var v=s+1;u>=v;v++)p[v].y+=n,p[v].x-=g;a&&justifyLine(p,i,l,s-1,a),l=s+1,s=null,r+=g,f++}breakable[d.codePoint]&&(s=u)}var x=p[p.length-1],y=x.x+i[x.codePoint].advance;c=Math.max(c,y);var P=(f+1)*n;justifyLine(p,i,l,p.length-1,a),align(p,a,o,h,c,n,f),t.top+=-h*P,t.bottom=t.top+P,t.left+=-o*c,t.right=t.left+c}function justifyLine(t,i,n,e,o){for(var h=i[t[e].codePoint].advance,a=(t[e].x+h)*o,s=n;e>=s;s++)t[s].x-=a}function align(t,i,n,e,o,h,a){for(var s=(i-n)*o,r=(-e*(a+1)+.5)*h,l=0;l<t.length;l++)t[l].x+=s,t[l].y+=r}function shapeIcon(t,i){if(!t||!t.rect)return null;var n=i["icon-offset"][0],e=i["icon-offset"][1],o=n-t.width/2,h=o+t.width,a=e-t.height/2,s=a+t.height;return new PositionedIcon(t,a,s,o,h)}function PositionedIcon(t,i,n,e,o){this.image=t,this.top=i,this.bottom=n,this.left=e,this.right=o}module.exports={shapeText:shapeText,shapeIcon:shapeIcon};var breakable={32:!0};
-	},{}],77:[function(require,module,exports){
-	"use strict";function SpriteAtlas(t,i){this.width=t,this.height=i,this.bin=new BinPack(t,i),this.images={},this.data=!1,this.texture=0,this.filter=0,this.pixelRatio=1,this.dirty=!0}function copyBitmap(t,i,e,h,a,s,r,o,n,l,p){var d,c,x=h*i+e,f=o*s+r;if(p)for(f-=s,c=-1;l>=c;c++,x=((c+l)%l+h)*i+e,f+=s)for(d=-1;n>=d;d++)a[f+d]=t[x+(d+n)%n];else for(c=0;l>c;c++,x+=i,f+=s)for(d=0;n>d;d++)a[f+d]=t[x+d]}function AtlasImage(t,i,e,h){this.rect=t,this.width=i,this.height=e,this.sdf=h}var BinPack=require("./bin_pack");module.exports=SpriteAtlas,SpriteAtlas.prototype={get debug(){return"canvas"in this},set debug(t){t&&!this.canvas?(this.canvas=document.createElement("canvas"),this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio,this.canvas.style.width=this.width+"px",this.canvas.style.width=this.width+"px",document.body.appendChild(this.canvas),this.ctx=this.canvas.getContext("2d")):!t&&this.canvas&&(this.canvas.parentNode.removeChild(this.canvas),delete this.ctx,delete this.canvas)}},SpriteAtlas.prototype.resize=function(t){if(this.pixelRatio===t)return!1;var i=this.pixelRatio;if(this.pixelRatio=t,this.canvas&&(this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio),this.data){var e=this.data;this.data=!1,this.allocate(),this.texture=!1;for(var h=this.width*i,a=this.height*i,s=this.width*t,r=this.height*t,o=this.data,n=e,l=0;r>l;l++)for(var p=Math.floor(l*a/r)*h,d=l*s,c=0;s>c;c++){var x=Math.floor(c*h/s);o[d+c]=n[p+x]}e=null,this.dirty=!0}return this.dirty},SpriteAtlas.prototype.allocateImage=function(t,i){var e=2,h=t+e+(4-(t+e)%4),a=i+e+(4-(i+e)%4),s=this.bin.allocate(h,a);return 0===s.w?s:(s.originalWidth=t,s.originalHeight=i,s)},SpriteAtlas.prototype.getImage=function(t,i){if(this.images[t])return this.images[t];if(!this.sprite)return null;var e=this.sprite.getSpritePosition(t);if(!e.width||!e.height)return null;var h=e.width/e.pixelRatio,a=e.height/e.pixelRatio,s=this.allocateImage(h,a);if(0===s.w)return s;var r=new AtlasImage(s,h,a,e.sdf);return this.images[t]=r,this.copy(s,e,i),r},SpriteAtlas.prototype.getPosition=function(t,i){var e=this.getImage(t,i),h=e&&e.rect;if(!h)return null;var a=i?e.width:h.w,s=i?e.height:h.h,r=1;return{size:[a,s],tl:[(h.x+r)/this.width,(h.y+r)/this.height],br:[(h.x+r+a)/this.width,(h.y+r+s)/this.height]}},SpriteAtlas.prototype.allocate=function(){if(!this.data){var t=Math.floor(this.width*this.pixelRatio),i=Math.floor(this.height*this.pixelRatio);this.data=new Uint32Array(t*i);for(var e=0;e<this.data.length;e++)this.data[e]=0}},SpriteAtlas.prototype.copy=function(t,i,e){if(this.sprite.img.data){var h=new Uint32Array(this.sprite.img.data.buffer);this.allocate();var a=this.data,s=1;copyBitmap(h,this.sprite.img.width,i.x,i.y,a,this.width*this.pixelRatio,(t.x+s)*this.pixelRatio,(t.y+s)*this.pixelRatio,i.width,i.height,e),this.dirty=!0}},SpriteAtlas.prototype.setSprite=function(t){this.sprite=t},SpriteAtlas.prototype.addIcons=function(t,i){for(var e=0;e<t.length;e++)this.getImage(t[e]);i(null,this.images)},SpriteAtlas.prototype.bind=function(t,i){var e=!1;this.texture?t.bindTexture(t.TEXTURE_2D,this.texture):(this.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texture),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),e=!0);var h=i?t.LINEAR:t.NEAREST;if(h!==this.filter&&(t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,h),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,h),this.filter=h),this.dirty&&(this.allocate(),e?t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width*this.pixelRatio,this.height*this.pixelRatio,0,t.RGBA,t.UNSIGNED_BYTE,new Uint8Array(this.data.buffer)):t.texSubImage2D(t.TEXTURE_2D,0,0,0,this.width*this.pixelRatio,this.height*this.pixelRatio,t.RGBA,t.UNSIGNED_BYTE,new Uint8Array(this.data.buffer)),this.dirty=!1,this.ctx)){var a=this.ctx.getImageData(0,0,this.width*this.pixelRatio,this.height*this.pixelRatio);a.data.set(new Uint8ClampedArray(this.data.buffer)),this.ctx.putImageData(a,0,0),this.ctx.strokeStyle="red";for(var s=0;s<this.bin.free.length;s++){var r=this.bin.free[s];this.ctx.strokeRect(r.x*this.pixelRatio,r.y*this.pixelRatio,r.w*this.pixelRatio,r.h*this.pixelRatio)}}};
-	},{"./bin_pack":63}],78:[function(require,module,exports){
-	"use strict";var util=require("../util/util"),interpolate=require("../util/interpolate"),browser=require("../util/browser"),LngLat=require("../geo/lng_lat"),LngLatBounds=require("../geo/lng_lat_bounds"),Point=require("point-geometry"),Camera=module.exports=function(){};util.extend(Camera.prototype,{getCenter:function(){return this.transform.center},setCenter:function(t){return this.jumpTo({center:t}),this},panBy:function(t,i){return this.panTo(this.transform.center,util.extend({offset:Point.convert(t).mult(-1)},i)),this},panTo:function(t,i){this.stop(),t=LngLat.convert(t),i=util.extend({duration:500,easing:util.ease,offset:[0,0]},i);var e=this.transform,n=Point.convert(i.offset).rotate(-e.angle),o=e.point,r=e.project(t).sub(n);return i.noMoveStart||this.fire("movestart"),this._ease(function(t){e.center=e.unproject(o.add(r.sub(o).mult(t))),this.fire("move")},function(){this.fire("moveend")},i),this},getZoom:function(){return this.transform.zoom},setZoom:function(t){return this.jumpTo({zoom:t}),this},zoomTo:function(t,i){this.stop(),i=util.extend({duration:500},i),i.easing=this._updateEasing(i.duration,t,i.easing);var e=this.transform,n=e.center,o=e.zoom;return i.around?n=LngLat.convert(i.around):i.offset&&(n=e.pointLocation(e.centerPoint.add(Point.convert(i.offset)))),i.animate===!1&&(i.duration=0),this.zooming||(this.zooming=!0,this.fire("movestart")),this._ease(function(i){e.setZoomAround(interpolate(o,t,i),n),this.fire("move").fire("zoom")},function(){this.ease=null,i.duration>=200&&(this.zooming=!1,this.fire("moveend"))},i),i.duration<200&&(clearTimeout(this._onZoomEnd),this._onZoomEnd=setTimeout(function(){this.zooming=!1,this.fire("moveend")}.bind(this),200)),this},zoomIn:function(t){return this.zoomTo(this.getZoom()+1,t),this},zoomOut:function(t){return this.zoomTo(this.getZoom()-1,t),this},getBearing:function(){return this.transform.bearing},setBearing:function(t){return this.jumpTo({bearing:t}),this},rotateTo:function(t,i){this.stop(),i=util.extend({duration:500,easing:util.ease},i);var e=this.transform,n=this.getBearing(),o=e.center;return i.around?o=LngLat.convert(i.around):i.offset&&(o=e.pointLocation(e.centerPoint.add(Point.convert(i.offset)))),t=this._normalizeBearing(t,n),this.rotating=!0,this.fire("movestart"),this._ease(function(i){e.setBearingAround(interpolate(n,t,i),o),this.fire("move").fire("rotate")},function(){this.rotating=!1,this.fire("moveend")},i),this},resetNorth:function(t){return this.rotateTo(0,util.extend({duration:1e3},t)),this},snapToNorth:function(t){return Math.abs(this.getBearing())<this.options.bearingSnap?this.resetNorth(t):this},getPitch:function(){return this.transform.pitch},setPitch:function(t){return this.jumpTo({pitch:t}),this},fitBounds:function(t,i){i=util.extend({padding:0,offset:[0,0],maxZoom:1/0},i),t=LngLatBounds.convert(t);var e=Point.convert(i.offset),n=this.transform,o=n.project(t.getNorthWest()),r=n.project(t.getSouthEast()),s=r.sub(o),a=(n.width-2*i.padding-2*Math.abs(e.x))/s.x,h=(n.height-2*i.padding-2*Math.abs(e.y))/s.y;return i.center=n.unproject(o.add(r).div(2)),i.zoom=Math.min(n.scaleZoom(n.scale*Math.min(a,h)),i.maxZoom),i.bearing=0,i.linear?this.easeTo(i):this.flyTo(i)},jumpTo:function(t){this.stop();var i=this.transform,e=!1,n=!1,o=!1;return"center"in t&&(i.center=LngLat.convert(t.center)),"zoom"in t&&i.zoom!==+t.zoom&&(e=!0,i.zoom=+t.zoom),"bearing"in t&&i.bearing!==+t.bearing&&(n=!0,i.bearing=+t.bearing),"pitch"in t&&i.pitch!==+t.pitch&&(o=!0,i.pitch=+t.pitch),this.fire("movestart").fire("move"),e&&this.fire("zoom"),n&&this.fire("rotate"),o&&this.fire("pitch"),this.fire("moveend")},easeTo:function(t){this.stop(),t=util.extend({offset:[0,0],duration:500,easing:util.ease},t);var i=this.transform,e=Point.convert(t.offset).rotate(-i.angle),n=i.point,o=this.getZoom(),r=this.getBearing(),s=this.getPitch(),a="zoom"in t?+t.zoom:o,h="bearing"in t?this._normalizeBearing(t.bearing,r):r,u="pitch"in t?+t.pitch:s,f=i.zoomScale(a-o),c="center"in t?i.project(LngLat.convert(t.center)).sub(e.div(f)):n,m=LngLat.convert(t.around);return a!==o&&(this.zooming=!0),r!==h&&(this.rotating=!0),this.zooming&&!m&&(m=i.pointLocation(i.centerPoint.add(c.sub(n).div(1-1/f)))),this.fire("movestart"),this._ease(function(t){this.zooming?i.setZoomAround(interpolate(o,a,t),m):i.center=i.unproject(n.add(c.sub(n).mult(t))),this.rotating&&(i.bearing=interpolate(r,h,t)),u!==s&&(i.pitch=interpolate(s,u,t)),this.fire("move"),this.zooming&&this.fire("zoom"),this.rotating&&this.fire("rotate")},function(){this.zooming=!1,this.rotating=!1,this.fire("moveend")},t),this},flyTo:function(t){function i(t){var i=(z*z-b*b+(t?-1:1)*M*M*_*_)/(2*(t?z:b)*M*_);return Math.log(Math.sqrt(i*i+1)-i)}function e(t){return(Math.exp(t)-Math.exp(-t))/2}function n(t){return(Math.exp(t)+Math.exp(-t))/2}function o(t){return e(t)/n(t)}this.stop(),t=util.extend({offset:[0,0],speed:1.2,curve:1.42,easing:util.ease},t);var r=this.transform,s=Point.convert(t.offset),a=this.getZoom(),h=this.getBearing(),u="center"in t?LngLat.convert(t.center):this.getCenter(),f="zoom"in t?+t.zoom:a,c="bearing"in t?this._normalizeBearing(t.bearing,h):h,m=r.zoomScale(f-a),g=r.point,d=r.project(u).sub(s.div(m)),p=r.worldSize,l=t.curve,v=t.speed,b=Math.max(r.width,r.height),z=b/m,_=d.sub(g).mag(),M=l*l,L=i(0),x=function(t){return n(L)/n(L+l*t)},T=function(t){return b*((n(L)*o(L+l*t)-e(L))/M)/_},B=(i(1)-L)/l;if(Math.abs(_)<1e-6){if(Math.abs(b-z)<1e-6)return this;var j=b>z?-1:1;B=Math.abs(Math.log(z/b))/l,T=function(){return 0},x=function(t){return Math.exp(j*l*t)}}return t.duration=1e3*B/v,this.zooming=!0,h!==c&&(this.rotating=!0),this.fire("movestart"),this._ease(function(t){var i=t*B,e=T(i);r.zoom=a+r.scaleZoom(1/x(i)),r.center=r.unproject(g.add(d.sub(g).mult(e)),p),c!==h&&(r.bearing=interpolate(h,c,t)),this.fire("move").fire("zoom"),c!==h&&this.fire("rotate")},function(){this.zooming=!1,this.rotating=!1,this.fire("moveend")},t),this},isEasing:function(){return!!this._abortFn},stop:function(){return this._abortFn&&(this._abortFn(),this._finishEase()),this},_ease:function(t,i,e){this._finishFn=i,this._abortFn=browser.timed(function(i){t.call(this,e.easing(i)),1===i&&this._finishEase()},e.animate===!1?0:e.duration,this)},_finishEase:function(){delete this._abortFn;var t=this._finishFn;delete this._finishFn,t.call(this)},_normalizeBearing:function(t,i){t=util.wrap(t,-180,180);var e=Math.abs(t-i);return Math.abs(t-360-i)<e&&(t-=360),Math.abs(t+360-i)<e&&(t+=360),t},_updateEasing:function(t,i,e){var n;if(this.ease){var o=this.ease,r=(Date.now()-o.start)/o.duration,s=o.easing(r+.01)-o.easing(r),a=.27/Math.sqrt(s*s+1e-4)*.01,h=Math.sqrt(.0729-a*a);n=util.bezier(a,h,.25,1)}else n=e?util.bezier.apply(util,e):util.ease;return this.ease={start:(new Date).getTime(),to:Math.pow(2,i),duration:t,easing:n},n}});
-	},{"../geo/lng_lat":20,"../geo/lng_lat_bounds":21,"../util/browser":95,"../util/interpolate":102,"../util/util":106,"point-geometry":137}],79:[function(require,module,exports){
-	"use strict";function Attribution(){}var Control=require("./control"),DOM=require("../../util/dom"),util=require("../../util/util");module.exports=Attribution,Attribution.prototype=util.inherit(Control,{options:{position:"bottom-right"},onAdd:function(t){var i="mapboxgl-ctrl-attrib",e=this._container=DOM.create("div",i,t.getContainer());return this._update(),t.on("source.load",this._update.bind(this)),t.on("source.change",this._update.bind(this)),t.on("source.remove",this._update.bind(this)),t.on("moveend",this._updateEditLink.bind(this)),e},_update:function(){var t=[];if(this._map.style)for(var i in this._map.style.sources){var e=this._map.style.sources[i];e.attribution&&t.indexOf(e.attribution)<0&&t.push(e.attribution)}this._container.innerHTML=t.join(" | "),this._editLink=this._container.getElementsByClassName("mapbox-improve-map")[0],this._updateEditLink()},_updateEditLink:function(){if(this._editLink){var t=this._map.getCenter();this._editLink.href="https://www.mapbox.com/map-feedback/#/"+t.lng+"/"+t.lat+"/"+Math.round(this._map.getZoom()+1)}}});
-	},{"../../util/dom":98,"../../util/util":106,"./control":80}],80:[function(require,module,exports){
-	"use strict";function Control(){}module.exports=Control,Control.prototype={addTo:function(o){this._map=o;var t=this._container=this.onAdd(o);if(this.options&&this.options.position){var i=this.options.position,n=o._controlCorners[i];t.className+=" mapboxgl-ctrl",-1!==i.indexOf("bottom")?n.insertBefore(t,n.firstChild):n.appendChild(t)}return this},remove:function(){return this._container.parentNode.removeChild(this._container),this.onRemove&&this.onRemove(this._map),this._map=null,this}};
-	},{}],81:[function(require,module,exports){
-	"use strict";function Navigation(t){util.setOptions(this,t)}var Control=require("./control"),DOM=require("../../util/dom"),util=require("../../util/util");module.exports=Navigation,Navigation.prototype=util.inherit(Control,{options:{position:"top-right"},onAdd:function(t){var o="mapboxgl-ctrl",s=this._container=DOM.create("div",o+"-group",t.getContainer());this._zoomInButton=this._createButton(o+"-icon "+o+"-zoom-in",t.zoomIn.bind(t)),this._zoomOutButton=this._createButton(o+"-icon "+o+"-zoom-out",t.zoomOut.bind(t)),this._compass=this._createButton(o+"-compass",t.resetNorth.bind(t));var e=this._compassCanvas=DOM.create("canvas",o+"-compass-canvas",this._compass);return e.style.cssText="width:30px; height:30px;",e.width=52,e.height=52,this._compass.addEventListener("mousedown",this._onCompassDown.bind(this)),this._onCompassMove=this._onCompassMove.bind(this),this._onCompassUp=this._onCompassUp.bind(this),this._compassCtx=e.getContext("2d"),t.on("rotate",this._drawNorth.bind(this)),this._drawNorth(),s},_onCompassDown:function(t){DOM.disableDrag(),document.addEventListener("mousemove",this._onCompassMove),document.addEventListener("mouseup",this._onCompassUp),this._prevX=t.screenX,t.stopPropagation()},_onCompassMove:function(t){var o=t.screenX,s=2>o?-5:o>window.screen.width-2?5:(o-this._prevX)/4;this._map.setBearing(this._map.getBearing()-s),this._prevX=t.screenX,this._moved=!0,t.preventDefault()},_onCompassUp:function(){document.removeEventListener("mousemove",this._onCompassMove),document.removeEventListener("mouseup",this._onCompassUp),DOM.enableDrag(),this._moved&&(this._moved=!1,DOM.suppressClick()),this._map.snapToNorth()},_createButton:function(t,o){var s=DOM.create("button",t,this._container);return s.addEventListener("click",function(){o()}),s},_drawNorth:function(){var t=20,o=8,s=26,e=this._map.transform.angle+Math.PI/2,i=this._compassCtx;this._compassCanvas.width=this._compassCanvas.width,i.translate(s,s),i.rotate(e),i.beginPath(),i.fillStyle="#000",i.lineTo(0,-o),i.lineTo(-t,0),i.lineTo(0,o),i.fill(),i.beginPath(),i.fillStyle="#bbb",i.moveTo(0,0),i.lineTo(0,o),i.lineTo(t,0),i.lineTo(0,-o),i.fill(),i.beginPath(),i.strokeStyle="#fff",i.lineWidth=4,i.moveTo(0,-o),i.lineTo(0,o),i.stroke()}});
-	},{"../../util/dom":98,"../../util/util":106,"./control":80}],82:[function(require,module,exports){
-	"use strict";function BoxZoom(o){this._map=o,this._el=o.getCanvasContainer(),this._container=o.getContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),LngLatBounds=require("../../geo/lng_lat_bounds"),util=require("../../util/util");module.exports=BoxZoom,BoxZoom.prototype={enable:function(){this._el.addEventListener("mousedown",this._onMouseDown,!1)},disable:function(){this._el.removeEventListener("mousedown",this._onMouseDown)},_onMouseDown:function(o){(o.shiftKey||1===o.which&&1===o.button)&&(document.addEventListener("mousemove",this._onMouseMove,!1),document.addEventListener("keydown",this._onKeyDown,!1),document.addEventListener("mouseup",this._onMouseUp,!1),this._startPos=DOM.mousePos(this._el,o),this.active=!0)},_onMouseMove:function(o){var e=this._startPos,t=DOM.mousePos(this._el,o);this._box||(this._box=DOM.create("div","mapboxgl-boxzoom",this._container),this._container.classList.add("mapboxgl-crosshair"),DOM.disableDrag(),this._map.fire("boxzoomstart"));var s=Math.min(e.x,t.x),n=Math.max(e.x,t.x),i=Math.min(e.y,t.y),a=Math.max(e.y,t.y);DOM.setTransform(this._box,"translate("+s+"px,"+i+"px)"),this._box.style.width=n-s+"px",this._box.style.height=a-i+"px"},_onMouseUp:function(o){var e=this._startPos,t=DOM.mousePos(this._el,o),s=new LngLatBounds(this._map.unproject(e),this._map.unproject(t));this._finish(),this._map.fitBounds(s,{linear:!0}).fire("boxzoomend",{boxZoomBounds:s})},_onKeyDown:function(o){27===o.keyCode&&(this._finish(),this._map.fire("boxzoomcancel"))},_finish:function(){this._box&&(this.active=!1,document.removeEventListener("mousemove",this._onMouseMove,!1),document.removeEventListener("keydown",this._onKeyDown,!1),document.removeEventListener("mouseup",this._onMouseUp,!1),this._container.classList.remove("mapboxgl-crosshair"),this._box.parentNode.removeChild(this._box),this._box=null,DOM.enableDrag())}};
-	},{"../../geo/lng_lat_bounds":21,"../../util/dom":98,"../../util/util":106}],83:[function(require,module,exports){
-	"use strict";function DoubleClickZoom(o){this._map=o,this._onDblClick=this._onDblClick.bind(this)}module.exports=DoubleClickZoom,DoubleClickZoom.prototype={enable:function(){this._map.on("dblclick",this._onDblClick)},disable:function(){this._map.off("dblclick",this._onDblClick)},_onDblClick:function(o){this._map.zoomTo(Math.round(this._map.getZoom())+1,{around:o.lngLat})}};
-	},{}],84:[function(require,module,exports){
-	"use strict";function DragPan(e){this._map=e,this._el=e.getCanvasContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),util=require("../../util/util");module.exports=DragPan;var inertiaLinearity=.25,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaMaxSpeed=3e3,inertiaDeceleration=4e3;DragPan.prototype={enable:function(){this._el.addEventListener("mousedown",this._onDown,!1),this._el.addEventListener("touchstart",this._onDown,!1)},disable:function(){this._el.removeEventListener("mousedown",this._onDown),this._el.removeEventListener("touchstart",this._onDown)},_onDown:function(e){this._startPos=this._pos=DOM.mousePos(this._el,e),this._inertia=[[Date.now(),this._pos]],e.touches?1===e.touches.length&&(document.addEventListener("touchmove",this._onMove,!1),document.addEventListener("touchend",this._onTouchEnd,!1)):(document.addEventListener("mousemove",this._onMove,!1),document.addEventListener("mouseup",this._onMouseUp,!1))},_onMove:function(e){var t=this._map;if(!(t.boxZoom.active||t.dragRotate.active||e.touches&&e.touches.length>1)){this.active=!0;var n=DOM.mousePos(this._el,e),i=this._inertia,o=Date.now();for(i.push([o,n]);i.length>2&&o-i[0][0]>50;)i.shift();t.stop(),t.transform.setLocationAtPoint(t.transform.pointLocation(this._pos),n),t.fire("move"),this._pos=n,e.preventDefault()}},_onUp:function(){var e=this._inertia;if(e.length<2)return void this._map.fire("moveend");var t=e[e.length-1],n=e[0],i=t[1].sub(n[1]),o=(t[0]-n[0])/1e3,s=i.mult(inertiaLinearity/o),a=s.mag();a>inertiaMaxSpeed&&(a=inertiaMaxSpeed,s._unit()._mult(a));var r=a/(inertiaDeceleration*inertiaLinearity),u=s.mult(-r/2);this._map.panBy(u,{duration:1e3*r,easing:inertiaEasing,noMoveStart:!0}),this.active=!1},_onMouseUp:function(){this._onUp(),document.removeEventListener("mousemove",this._onMove,!1),document.removeEventListener("mouseup",this._onMouseUp,!1)},_onTouchEnd:function(){this._onUp(),document.removeEventListener("touchmove",this._onMove),document.removeEventListener("touchend",this._onTouchEnd)}};
-	},{"../../util/dom":98,"../../util/util":106}],85:[function(require,module,exports){
-	"use strict";function DragRotate(t){this._map=t,this._el=t.getCanvasContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),Point=require("point-geometry"),util=require("../../util/util");module.exports=DragRotate,DragRotate.prototype={enable:function(){this._el.addEventListener("contextmenu",this._onContextMenu,!1)},disable:function(){this._el.removeEventListener("contextmenu",this._onContextMenu)},_onContextMenu:function(t){this._map.stop(),this._startPos=this._pos=DOM.mousePos(this._el,t),document.addEventListener("mousemove",this._onMouseMove,!1),document.addEventListener("mouseup",this._onMouseUp,!1),t.preventDefault()},_onMouseMove:function(t){var e=this._startPos,o=this._pos,n=DOM.mousePos(this._el,t),i=this._map,s=i.transform.centerPoint,r=e.sub(s),u=r.mag();this.active=!0,i.rotating||(i.fire("movestart"),i.rotating=!0),200>u&&(s=e.add(new Point(-200,0)._rotate(r.angle())));var a=o.sub(s).angleWith(n.sub(s))/Math.PI*180;i.transform.bearing=i.getBearing()-a,i.fire("move").fire("rotate"),clearTimeout(this._timeout),this._timeout=setTimeout(this._onTimeout,200),this._pos=n},_onTimeout:function(){var t=this._map;t.rotating=!1,t.snapToNorth(),t.rotating||(t._rerender(),t.fire("moveend"))},_onMouseUp:function(){this.active=!1,document.removeEventListener("mousemove",this._onMouseMove,!1),document.removeEventListener("mouseup",this._onMouseUp,!1)}};
-	},{"../../util/dom":98,"../../util/util":106,"point-geometry":137}],86:[function(require,module,exports){
-	"use strict";function Keyboard(e){this._map=e,this._el=e.getCanvasContainer(),this._onKeyDown=this._onKeyDown.bind(this)}module.exports=Keyboard;var panDelta=80,rotateDelta=2;Keyboard.prototype={enable:function(){this._el.addEventListener("keydown",this._onKeyDown,!1)},disable:function(){this._el.removeEventListener("keydown",this._onKeyDown)},_onKeyDown:function(e){if(!(e.altKey||e.ctrlKey||e.metaKey)){var a=this._map;switch(e.keyCode){case 61:case 107:case 171:case 187:a.zoomTo(Math.round(a.getZoom())+(e.shiftKey?2:1));break;case 189:case 109:case 173:a.zoomTo(Math.round(a.getZoom())-(e.shiftKey?2:1));break;case 37:e.shiftKey?a.setBearing(a.getBearing()-rotateDelta):a.panBy([-panDelta,0]);break;case 39:e.shiftKey?a.setBearing(a.getBearing()+rotateDelta):a.panBy([panDelta,0]);break;case 38:a.panBy([0,-panDelta]);break;case 40:a.panBy([0,panDelta])}}}};
-	},{}],87:[function(require,module,exports){
-	"use strict";function Pinch(t){this._map=t,this._el=t.getCanvasContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),util=require("../../util/util");module.exports=Pinch,Pinch.prototype={enable:function(){this._el.addEventListener("touchstart",this._onStart,!1)},disable:function(){this._el.removeEventListener("touchstart",this._onStart)},_onStart:function(t){if(2===t.touches.length){var e=DOM.mousePos(this._el,t.touches[0]),s=DOM.mousePos(this._el,t.touches[1]);this._startVec=e.sub(s),this._startScale=this._map.transform.scale,this._startBearing=this._map.transform.bearing,document.addEventListener("touchmove",this._onMove,!1),document.addEventListener("touchend",this._onEnd,!1)}},_onMove:function(t){if(2===t.touches.length){var e=DOM.mousePos(this._el,t.touches[0]),s=DOM.mousePos(this._el,t.touches[1]),n=e.add(s).div(2),o=e.sub(s),i=o.mag()/this._startVec.mag(),a=180*o.angleWith(this._startVec)/Math.PI,r=this._map;r.easeTo({zoom:r.transform.scaleZoom(this._startScale*i),bearing:this._startBearing+a,duration:0,around:r.unproject(n)}),t.preventDefault()}},_onEnd:function(){this._map.snapToNorth(),document.removeEventListener("touchmove",this._onMove),document.removeEventListener("touchend",this._onEnd)}};
-	},{"../../util/dom":98,"../../util/util":106}],88:[function(require,module,exports){
-	"use strict";function ScrollZoom(e){this._map=e,this._el=e.getCanvasContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),browser=require("../../util/browser"),util=require("../../util/util");module.exports=ScrollZoom;var ua="undefined"!=typeof navigator?navigator.userAgent.toLowerCase():"",firefox=-1!==ua.indexOf("firefox"),safari=-1!==ua.indexOf("safari")&&-1===ua.indexOf("chrom");ScrollZoom.prototype={enable:function(){this._el.addEventListener("wheel",this._onWheel,!1),this._el.addEventListener("mousewheel",this._onWheel,!1)},disable:function(){this._el.removeEventListener("wheel",this._onWheel),this._el.removeEventListener("mousewheel",this._onWheel)},_onWheel:function(e){var t;"wheel"===e.type?(t=e.deltaY,firefox&&e.deltaMode===window.WheelEvent.DOM_DELTA_PIXEL&&(t/=browser.devicePixelRatio),e.deltaMode===window.WheelEvent.DOM_DELTA_LINE&&(t*=40)):"mousewheel"===e.type&&(t=-e.wheelDeltaY,safari&&(t/=3));var i=(window.performance||Date).now(),o=i-(this._time||0);this._pos=DOM.mousePos(this._el,e),this._time=i,0!==t&&t%4.000244140625===0?(this._type="wheel",t=Math.floor(t/4)):0!==t&&Math.abs(t)<4?this._type="trackpad":o>400?(this._type=null,this._lastValue=t,this._timeout=setTimeout(this._onTimeout,40)):this._type||(this._type=Math.abs(o*t)<200?"trackpad":"wheel",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,t+=this._lastValue)),e.shiftKey&&t&&(t/=4),this._type&&this._zoom(-t),e.preventDefault()},_onTimeout:function(){this._type="wheel",this._zoom(-this._lastValue)},_zoom:function(e){var t=this._map,i=2/(1+Math.exp(-Math.abs(e/100)));0>e&&0!==i&&(i=1/i);var o=t.ease?t.ease.to:t.transform.scale,s=t.transform.scaleZoom(o*i);t.zoomTo(s,{duration:0,around:t.unproject(this._pos)})}};
-	},{"../../util/browser":95,"../../util/dom":98,"../../util/util":106}],89:[function(require,module,exports){
-	"use strict";function Hash(){util.bindAll(["_onHashChange","_updateHash"],this)}module.exports=Hash;var util=require("../util/util");Hash.prototype={addTo:function(t){return this._map=t,window.addEventListener("hashchange",this._onHashChange,!1),this._map.on("moveend",this._updateHash),this},remove:function(){return window.removeEventListener("hashchange",this._onHashChange,!1),this._map.off("moveend",this._updateHash),delete this._map,this},_onHashChange:function(){var t=location.hash.replace("#","").split("/");return t.length>=3?(this._map.jumpTo({center:[+t[2],+t[1]],zoom:+t[0],bearing:+(t[3]||0)}),!0):!1},_updateHash:function(){var t=this._map.getCenter(),e=this._map.getZoom(),a=this._map.getBearing(),h=Math.max(0,Math.ceil(Math.log(e)/Math.LN2)),n="#"+Math.round(100*e)/100+"/"+t.lat.toFixed(h)+"/"+t.lng.toFixed(h)+(a?"/"+Math.round(10*a)/10:"");window.history.replaceState("","",n)}};
-	},{"../util/util":106}],90:[function(require,module,exports){
-	"use strict";function Interaction(e){this._map=e,this._el=e.getCanvasContainer();for(var t in handlers)e[t]=new handlers[t](e);util.bindHandlers(this)}var handlers={scrollZoom:require("./handler/scroll_zoom"),boxZoom:require("./handler/box_zoom"),dragRotate:require("./handler/drag_rotate"),dragPan:require("./handler/drag_pan"),keyboard:require("./handler/keyboard"),doubleClickZoom:require("./handler/dblclick_zoom"),pinch:require("./handler/pinch")},DOM=require("../util/dom"),util=require("../util/util");module.exports=Interaction,Interaction.prototype={enable:function(){var e=this._map.options,t=this._el;for(var n in handlers)e[n]&&this._map[n].enable();t.addEventListener("mousedown",this._onMouseDown,!1),t.addEventListener("mouseup",this._onMouseUp,!1),t.addEventListener("touchstart",this._onTouchStart,!1),t.addEventListener("click",this._onClick,!1),t.addEventListener("mousemove",this._onMouseMove,!1),t.addEventListener("dblclick",this._onDblClick,!1),t.addEventListener("contextmenu",this._onContextMenu,!1)},disable:function(){var e=this._map.options,t=this._el;for(var n in handlers)e[n]&&this._map[n].disable();t.removeEventListener("mousedown",this._onMouseDown),t.removeEventListener("mouseup",this._onMouseUp),t.removeEventListener("touchstart",this._onTouchStart),t.removeEventListener("click",this._onClick),t.removeEventListener("mousemove",this._onMouseMove),t.removeEventListener("dblclick",this._onDblClick),t.removeEventListener("contextmenu",this._onContextMenu)},_onMouseDown:function(e){this._startPos=DOM.mousePos(this._el,e)},_onMouseUp:function(e){!this._contextMenuFired||this._map.dragRotate.active||this._map.dragPan.active||this._fireEvent("contextmenu",e),this._contextMenuFired=null},_onTouchStart:function(e){!e.touches||e.touches.length>1||(this._tapped?(clearTimeout(this._tapped),this._tapped=null,this._fireEvent("dblclick",e)):this._tapped=setTimeout(this._onTimeout,300))},_onTimeout:function(){this._tapped=null},_onMouseMove:function(e){var t=this._map,n=this._el;if(!t.dragPan.active&&!t.dragRotate.active){for(var o=e.toElement||e.target;o&&o!==n;)o=o.parentNode;o===n&&this._fireEvent("mousemove",e)}},_onClick:function(e){var t=DOM.mousePos(this._el,e);t.equals(this._startPos)&&this._fireEvent("click",e)},_onDblClick:function(e){this._fireEvent("dblclick",e),e.preventDefault()},_onContextMenu:function(){this._contextMenuFired=!0},_fireEvent:function(e,t){var n=DOM.mousePos(this._el,t);this._map.fire(e,{lngLat:this._map.unproject(n),point:n,originalEvent:t})}};
-	},{"../util/dom":98,"../util/util":106,"./handler/box_zoom":82,"./handler/dblclick_zoom":83,"./handler/drag_pan":84,"./handler/drag_rotate":85,"./handler/keyboard":86,"./handler/pinch":87,"./handler/scroll_zoom":88}],91:[function(require,module,exports){
-	"use strict";var Canvas=require("../util/canvas"),util=require("../util/util"),browser=require("../util/browser"),Evented=require("../util/evented"),DOM=require("../util/dom"),Style=require("../style/style"),AnimationLoop=require("../style/animation_loop"),Painter=require("../render/painter"),Transform=require("../geo/transform"),Hash=require("./hash"),Interaction=require("./interaction"),Camera=require("./camera"),LngLat=require("../geo/lng_lat"),LngLatBounds=require("../geo/lng_lat_bounds"),Point=require("point-geometry"),Attribution=require("./control/attribution"),Map=module.exports=function(t){if(t=this.options=util.inherit(this.options,t),this.animationLoop=new AnimationLoop,this.transform=new Transform(t.minZoom,t.maxZoom),t.maxBounds){var e=LngLatBounds.convert(t.maxBounds);this.transform.lngRange=[e.getWest(),e.getEast()],this.transform.latRange=[e.getSouth(),e.getNorth()]}util.bindAll(["_forwardStyleEvent","_forwardSourceEvent","_forwardLayerEvent","_forwardTileEvent","_onStyleLoad","_onStyleChange","_onSourceAdd","_onSourceRemove","_onSourceUpdate","_onWindowResize","onError","update","render"],this),this._setupContainer(),this._setupPainter(),this.on("move",this.update),this.on("zoom",this.update.bind(this,!0)),this.on("moveend",function(){this.animationLoop.set(300),this._rerender()}.bind(this)),"undefined"!=typeof window&&window.addEventListener("resize",this._onWindowResize,!1),this.interaction=new Interaction(this),t.interactive&&this.interaction.enable(),this._hash=t.hash&&(new Hash).addTo(this),this._hash&&this._hash._onHashChange()||this.jumpTo(t),this.sources={},this.stacks={},this._classes={},this.resize(),t.classes&&this.setClasses(t.classes),t.style&&this.setStyle(t.style),t.attributionControl&&this.addControl(new Attribution),this.on("style.error",this.onError),this.on("source.error",this.onError),this.on("tile.error",this.onError)};util.extend(Map.prototype,Evented),util.extend(Map.prototype,Camera.prototype),util.extend(Map.prototype,{options:{center:[0,0],zoom:0,bearing:0,pitch:0,minZoom:0,maxZoom:20,interactive:!0,scrollZoom:!0,boxZoom:!0,dragRotate:!0,dragPan:!0,keyboard:!0,doubleClickZoom:!0,pinch:!0,bearingSnap:7,hash:!1,attributionControl:!0,failIfMajorPerformanceCaveat:!1,preserveDrawingBuffer:!1},addControl:function(t){return t.addTo(this),this},addClass:function(t,e){this._classes[t]||(this._classes[t]=!0,this.style&&this.style._cascade(this._classes,e))},removeClass:function(t,e){this._classes[t]&&(delete this._classes[t],this.style&&this.style._cascade(this._classes,e))},setClasses:function(t,e){this._classes={};for(var i=0;i<t.length;i++)this._classes[t[i]]=!0;this.style&&this.style._cascade(this._classes,e)},hasClass:function(t){return!!this._classes[t]},getClasses:function(){return Object.keys(this._classes)},resize:function(){var t=0,e=0;return this._container&&(t=this._container.offsetWidth||400,e=this._container.offsetHeight||300),this._canvas.resize(t,e),this.transform.width=t,this.transform.height=e,this.transform._constrain(),this.painter.resize(t,e),this.fire("movestart").fire("move").fire("resize").fire("moveend")},getBounds:function(){return new LngLatBounds(this.transform.pointLocation(new Point(0,0)),this.transform.pointLocation(this.transform.size))},project:function(t){return this.transform.locationPoint(LngLat.convert(t))},unproject:function(t){return this.transform.pointLocation(Point.convert(t))},featuresAt:function(t,e,i){var r=this.unproject(t).wrap(),s=this.transform.locationCoordinate(r);return this.style.featuresAt(s,e,i),this},featuresIn:function(t,e,i){return"undefined"==typeof i&&(i=e,e=t,t=[Point.convert([0,0]),Point.convert([this.transform.width,this.transform.height])]),t=t.map(Point.convert.bind(Point)),t=[new Point(Math.min(t[0].x,t[1].x),Math.min(t[0].y,t[1].y)),new Point(Math.max(t[0].x,t[1].x),Math.max(t[0].y,t[1].y))].map(this.transform.pointCoordinate.bind(this.transform)),this.style.featuresIn(t,e,i),this},batch:function(t){this.style.batch(t),this.style._cascade(this._classes),this.update(!0)},setStyle:function(t){return this.style&&(this.style.off("load",this._onStyleLoad).off("error",this._forwardStyleEvent).off("change",this._onStyleChange).off("source.add",this._onSourceAdd).off("source.remove",this._onSourceRemove).off("source.load",this._onSourceUpdate).off("source.error",this._forwardSourceEvent).off("source.change",this._onSourceUpdate).off("layer.add",this._forwardLayerEvent).off("layer.remove",this._forwardLayerEvent).off("tile.add",this._forwardTileEvent).off("tile.remove",this._forwardTileEvent).off("tile.load",this.update).off("tile.error",this._forwardTileEvent).off("tile.stats",this._forwardTileEvent)._remove(),this.off("rotate",this.style._redoPlacement),this.off("pitch",this.style._redoPlacement)),t?(t instanceof Style?this.style=t:this.style=new Style(t,this.animationLoop),this.style.on("load",this._onStyleLoad).on("error",this._forwardStyleEvent).on("change",this._onStyleChange).on("source.add",this._onSourceAdd).on("source.remove",this._onSourceRemove).on("source.load",this._onSourceUpdate).on("source.error",this._forwardSourceEvent).on("source.change",this._onSourceUpdate).on("layer.add",this._forwardLayerEvent).on("layer.remove",this._forwardLayerEvent).on("tile.add",this._forwardTileEvent).on("tile.remove",this._forwardTileEvent).on("tile.load",this.update).on("tile.error",this._forwardTileEvent).on("tile.stats",this._forwardTileEvent),this.on("rotate",this.style._redoPlacement),this.on("pitch",this.style._redoPlacement),this):(this.style=null,this)},addSource:function(t,e){return this.style.addSource(t,e),this},removeSource:function(t){return this.style.removeSource(t),this},getSource:function(t){return this.style.getSource(t)},addLayer:function(t,e){return this.style.addLayer(t,e),this.style._cascade(this._classes),this},removeLayer:function(t){return this.style.removeLayer(t),this.style._cascade(this._classes),this},setFilter:function(t,e){return this.style.setFilter(t,e),this},setLayerZoomRange:function(t,e,i){return this.style.setLayerZoomRange(t,e,i),this},getFilter:function(t){return this.style.getFilter(t)},setPaintProperty:function(t,e,i,r){return this.batch(function(s){s.setPaintProperty(t,e,i,r)}),this},getPaintProperty:function(t,e,i){return this.style.getPaintProperty(t,e,i)},setLayoutProperty:function(t,e,i){return this.batch(function(r){r.setLayoutProperty(t,e,i)}),this},getLayoutProperty:function(t,e){return this.style.getLayoutProperty(t,e)},getContainer:function(){return this._container},getCanvasContainer:function(){return this._canvasContainer},getCanvas:function(){return this._canvas.getElement()},_setupContainer:function(){var t=this.options.container,e=this._container="string"==typeof t?document.getElementById(t):t;e.classList.add("mapboxgl-map");var i=this._canvasContainer=DOM.create("div","mapboxgl-canvas-container",e);this.options.interactive&&i.classList.add("mapboxgl-interactive"),this._canvas=new Canvas(this,i);var r=DOM.create("div","mapboxgl-control-container",e),s=this._controlCorners={};["top-left","top-right","bottom-left","bottom-right"].forEach(function(t){s[t]=DOM.create("div","mapboxgl-ctrl-"+t,r)})},_setupPainter:function(){var t=this._canvas.getWebGLContext({failIfMajorPerformanceCaveat:this.options.failIfMajorPerformanceCaveat,preserveDrawingBuffer:this.options.preserveDrawingBuffer});return t?void(this.painter=new Painter(t,this.transform)):void console.error("Failed to initialize WebGL")},_contextLost:function(t){t.preventDefault(),this._frameId&&browser.cancelFrame(this._frameId)},_contextRestored:function(){this._setupPainter(),this.resize(),this.update()},loaded:function(){return this._styleDirty||this._sourcesDirty?!1:this.style&&!this.style.loaded()?!1:!0},update:function(t){return this.style?(this._styleDirty=this._styleDirty||t,this._sourcesDirty=!0,this._rerender(),this):this},render:function(){return this.style&&this._styleDirty&&(this._styleDirty=!1,this.style._recalculate(this.transform.zoom)),this.style&&this._sourcesDirty&&!this._sourcesDirtyTimeout&&(this._sourcesDirty=!1,this._sourcesDirtyTimeout=setTimeout(function(){this._sourcesDirtyTimeout=null}.bind(this),50),this.style._updateSources(this.transform)),this.painter.render(this.style,{debug:this.debug,vertices:this.vertices,rotating:this.rotating,zooming:this.zooming}),this.fire("render"),this.loaded()&&!this._loaded&&(this._loaded=!0,this.fire("load")),this._frameId=null,this.animationLoop.stopped()||(this._styleDirty=!0),(this._sourcesDirty||this._repaint||!this.animationLoop.stopped())&&this._rerender(),this},remove:function(){return this._hash&&this._hash.remove(),browser.cancelFrame(this._frameId),clearTimeout(this._sourcesDirtyTimeout),this.setStyle(null),"undefined"!=typeof window&&window.removeEventListener("resize",this._onWindowResize,!1),this},onError:function(t){console.error(t.error)},_rerender:function(){this.style&&!this._frameId&&(this._frameId=browser.frame(this.render))},_forwardStyleEvent:function(t){this.fire("style."+t.type,util.extend({style:t.target},t))},_forwardSourceEvent:function(t){this.fire(t.type,util.extend({style:t.target},t))},_forwardLayerEvent:function(t){this.fire(t.type,util.extend({style:t.target},t))},_forwardTileEvent:function(t){this.fire(t.type,util.extend({style:t.target},t))},_onStyleLoad:function(t){var e=new Transform,i=this.transform;i.center.lng===e.center.lng&&i.center.lat===e.center.lat&&i.zoom===e.zoom&&i.bearing===e.bearing&&i.pitch===e.pitch&&this.jumpTo(this.style.stylesheet),this.style._cascade(this._classes,{transition:!1}),this._forwardStyleEvent(t)},_onStyleChange:function(t){this.update(!0),this._forwardStyleEvent(t)},_onSourceAdd:function(t){var e=t.source;e.onAdd&&e.onAdd(this),this._forwardSourceEvent(t)},_onSourceRemove:function(t){var e=t.source;e.onRemove&&e.onRemove(this),this._forwardSourceEvent(t)},_onSourceUpdate:function(t){this.update(),this._forwardSourceEvent(t)},_onWindowResize:function(){this.stop().resize().update()}}),util.extendAll(Map.prototype,{_debug:!1,get debug(){return this._debug},set debug(t){this._debug=t,this.update()},_collisionDebug:!1,get collisionDebug(){return this._collisionDebug},set collisionDebug(t){this._collisionDebug=t,this.style._redoPlacement()},_repaint:!1,get repaint(){return this._repaint},set repaint(t){this._repaint=t,this.update()},_vertices:!1,get vertices(){return this._vertices},set vertices(t){this._vertices=t,this.update()}});
-	},{"../geo/lng_lat":20,"../geo/lng_lat_bounds":21,"../geo/transform":22,"../render/painter":37,"../style/animation_loop":51,"../style/style":56,"../util/browser":95,"../util/canvas":96,"../util/dom":98,"../util/evented":100,"../util/util":106,"./camera":78,"./control/attribution":79,"./hash":89,"./interaction":90,"point-geometry":137}],92:[function(require,module,exports){
-	"use strict";function Popup(t){util.setOptions(this,t),util.bindAll(["_updatePosition","_onClickClose"],this)}module.exports=Popup;var util=require("../util/util"),Evented=require("../util/evented"),DOM=require("../util/dom"),LngLat=require("../geo/lng_lat");Popup.prototype=util.inherit(Evented,{options:{closeButton:!0,closeOnClick:!0},addTo:function(t){return this._map=t,this._map.on("move",this._updatePosition),this.options.closeOnClick&&this._map.on("click",this._onClickClose),this._update(),this},remove:function(){return this._container&&this._container.parentNode.removeChild(this._container),this._map&&(this._map.off("move",this._updatePosition),this._map.off("click",this._onClickClose),delete this._map),this},getLngLat:function(){return this._lngLat},setLngLat:function(t){return this._lngLat=LngLat.convert(t),this._update(),this},setText:function(t){return this._content=document.createTextNode(t),this._updateContent(),this},setHTML:function(t){this._content=document.createDocumentFragment();var i,e=document.createElement("body");for(e.innerHTML=t;;){if(i=e.firstChild,!i)break;this._content.appendChild(i)}return this._updateContent(),this},_update:function(){this._map&&(this._container||(this._container=DOM.create("div","mapboxgl-popup",this._map.getContainer()),this._tip=DOM.create("div","mapboxgl-popup-tip",this._container),this._wrapper=DOM.create("div","mapboxgl-popup-content",this._container),this.options.closeButton&&(this._closeButton=DOM.create("button","mapboxgl-popup-close-button",this._wrapper),this._closeButton.innerHTML="&#215;",this._closeButton.addEventListener("click",this._onClickClose))),this._updateContent(),this._updatePosition())},_updateContent:function(){if(this._content&&this._container){for(var t=this._wrapper;t.hasChildNodes();)t.removeChild(t.firstChild);this.options.closeButton&&t.appendChild(this._closeButton),t.appendChild(this._content)}},_updatePosition:function(){if(this._lngLat&&this._container){var t=this._map.project(this._lngLat).round(),i=this.options.anchor;if(!i){var e=this._container.offsetWidth,o=this._container.offsetHeight;i=t.y<o?["top"]:t.y>this._map.transform.height-o?["bottom"]:[],t.x<e/2?i.push("left"):t.x>this._map.transform.width-e/2&&i.push("right"),i=0===i.length?"bottom":i.join("-"),this.options.anchor=i}var n={top:"translate(-50%,0)","top-left":"translate(0,0)","top-right":"translate(-100%,0)",bottom:"translate(-50%,-100%)","bottom-left":"translate(0,-100%)","bottom-right":"translate(-100%,-100%)",left:"translate(0,-50%)",right:"translate(-100%,-50%)"},s=this._container.classList;for(var a in n)s.remove("mapboxgl-popup-anchor-"+a);s.add("mapboxgl-popup-anchor-"+i),DOM.setTransform(this._container,n[i]+" translate("+t.x+"px,"+t.y+"px)")}},_onClickClose:function(){this.remove()}});
-	},{"../geo/lng_lat":20,"../util/dom":98,"../util/evented":100,"../util/util":106}],93:[function(require,module,exports){
-	"use strict";function Actor(t,e){this.target=t,this.parent=e,this.callbacks={},this.callbackID=0,this.receive=this.receive.bind(this),this.target.addEventListener("message",this.receive,!1)}module.exports=Actor,Actor.prototype.receive=function(t){var e,s=t.data;if("<response>"===s.type)e=this.callbacks[s.id],delete this.callbacks[s.id],e(s.error||null,s.data);else if("undefined"!=typeof s.id){var i=s.id;this.parent[s.type](s.data,function(t,e,s){this.postMessage({type:"<response>",id:String(i),error:t?String(t):null,data:e},s)}.bind(this))}else this.parent[s.type](s.data)},Actor.prototype.send=function(t,e,s,i){var a=null;s&&(this.callbacks[a=this.callbackID++]=s),this.postMessage({type:t,id:String(a),data:e},i)},Actor.prototype.postMessage=function(t,e){try{this.target.postMessage(t,e)}catch(s){this.target.postMessage(t)}};
-	},{}],94:[function(require,module,exports){
-	"use strict";function sameOrigin(e){var t=document.createElement("a");return t.href=e,t.protocol===document.location.protocol&&t.host===document.location.host}exports.getJSON=function(e,t){var n=new XMLHttpRequest;return n.open("GET",e,!0),n.setRequestHeader("Accept","application/json"),n.onerror=function(e){t(e)},n.onload=function(){if(n.status>=200&&n.status<300&&n.response){var e;try{e=JSON.parse(n.response)}catch(r){return t(r)}t(null,e)}else t(new Error(n.statusText))},n.send(),n},exports.getArrayBuffer=function(e,t){var n=new XMLHttpRequest;return n.open("GET",e,!0),n.responseType="arraybuffer",n.onerror=function(e){t(e)},n.onload=function(){n.status>=200&&n.status<300&&n.response?t(null,n.response):t(new Error(n.statusText))},n.send(),n},exports.getImage=function(e,t){return exports.getArrayBuffer(e,function(e,n){e&&t(e);var r=new Image;r.onload=function(){t(null,r),(window.URL||window.webkitURL).revokeObjectURL(r.src)};var o=new Blob([new Uint8Array(n)],{type:"image/png"});return r.src=(window.URL||window.webkitURL).createObjectURL(o),r.getData=function(){var e=document.createElement("canvas"),t=e.getContext("2d");return e.width=r.width,e.height=r.height,t.drawImage(r,0,0),t.getImageData(0,0,r.width,r.height).data},r})},exports.getVideo=function(e,t){var n=document.createElement("video");n.onloadstart=function(){t(null,n)};for(var r=0;r<e.length;r++){var o=document.createElement("source");sameOrigin(e[r])||(n.crossOrigin="Anonymous"),o.src=e[r],n.appendChild(o)}return n.getData=function(){return n},n};
-	},{}],95:[function(require,module,exports){
-	"use strict";var Canvas=require("./canvas"),frame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame;exports.frame=function(e){return frame(e)};var cancel=window.cancelAnimationFrame||window.mozCancelAnimationFrame||window.webkitCancelAnimationFrame||window.msCancelAnimationFrame;exports.cancelFrame=function(e){cancel(e)},exports.timed=function(e,r,t){function n(a){o||(window.performance||(a=Date.now()),a>=i+r?e.call(t,1):(e.call(t,(a-i)/r),exports.frame(n)))}if(!r)return e.call(t,1),null;var o=!1,i=window.performance?window.performance.now():Date.now();return exports.frame(n),function(){o=!0}},exports.supported=function(e){for(var r=([function(){return"undefined"!=typeof window},function(){return"undefined"!=typeof document},function(){return!!(Array.prototype&&Array.prototype.every&&Array.prototype.filter&&Array.prototype.forEach&&Array.prototype.indexOf&&Array.prototype.lastIndexOf&&Array.prototype.map&&Array.prototype.some&&Array.prototype.reduce&&Array.prototype.reduceRight&&Array.isArray)},function(){return!(!Function.prototype||!Function.prototype.bind||!(Object.keys&&Object.create&&Object.getPrototypeOf&&Object.getOwnPropertyNames&&Object.isSealed&&Object.isFrozen&&Object.isExtensible&&Object.getOwnPropertyDescriptor&&Object.defineProperty&&Object.defineProperties&&Object.seal&&Object.freeze&&Object.preventExtensions))},function(){return"JSON"in window&&"parse"in JSON&&"stringify"in JSON},function(){return(new Canvas).supportsWebGLContext(e&&e.failIfMajorPerformanceCaveat||!1)},function(){return"Worker"in window}]),t=0;t<r.length;t++)if(!r[t]())return!1;return!0},exports.hardwareConcurrency=navigator.hardwareConcurrency||8,Object.defineProperty(exports,"devicePixelRatio",{get:function(){return window.devicePixelRatio}});
-	},{"./canvas":96}],96:[function(require,module,exports){
-	"use strict";function Canvas(t,e){this.canvas=document.createElement("canvas"),t&&e&&(this.canvas.style.position="absolute",this.canvas.classList.add("mapboxgl-canvas"),this.canvas.addEventListener("webglcontextlost",t._contextLost.bind(t),!1),this.canvas.addEventListener("webglcontextrestored",t._contextRestored.bind(t),!1),this.canvas.setAttribute("tabindex",0),e.appendChild(this.canvas))}var util=require("../util");module.exports=Canvas,Canvas.prototype.resize=function(t,e){var a=window.devicePixelRatio||1;this.canvas.width=a*t,this.canvas.height=a*e,this.canvas.style.width=t+"px",this.canvas.style.height=e+"px"};var requiredContextAttributes={antialias:!1,alpha:!0,stencil:!0,depth:!1};Canvas.prototype.getWebGLContext=function(t){return t=util.extend({},t,requiredContextAttributes),this.canvas.getContext("webgl",t)||this.canvas.getContext("experimental-webgl",t)},Canvas.prototype.supportsWebGLContext=function(t){var e=util.extend({failIfMajorPerformanceCaveat:t},requiredContextAttributes);return"probablySupportsContext"in this.canvas?this.canvas.probablySupportsContext("webgl",e)||this.canvas.probablySupportsContext("experimental-webgl",e):"supportsContext"in this.canvas?this.canvas.supportsContext("webgl",e)||this.canvas.supportsContext("experimental-webgl",e):!!window.WebGLRenderingContext&&!!this.getWebGLContext(t)},Canvas.prototype.getElement=function(){return this.canvas};
-	},{"../util":106}],97:[function(require,module,exports){
-	"use strict";function Dispatcher(r,t){this.actors=[],this.currentActor=0;for(var e=0;r>e;e++){var o=new WebWorkify(require("../../source/worker")),s=new Actor(o,t);s.name="Worker "+e,this.actors.push(s)}}var Actor=require("../actor"),WebWorkify=require("webworkify");module.exports=Dispatcher,Dispatcher.prototype={broadcast:function(r,t){for(var e=0;e<this.actors.length;e++)this.actors[e].send(r,t)},send:function(r,t,e,o,s){return("number"!=typeof o||isNaN(o))&&(o=this.currentActor=(this.currentActor+1)%this.actors.length),this.actors[o].send(r,t,e,s),o},remove:function(){for(var r=0;r<this.actors.length;r++)this.actors[r].target.terminate();this.actors=[]}};
-	},{"../../source/worker":49,"../actor":93,"webworkify":149}],98:[function(require,module,exports){
-	"use strict";function testProp(e){for(var t=0;t<e.length;t++)if(e[t]in docStyle)return e[t]}function suppressClick(e){e.preventDefault(),e.stopPropagation(),window.removeEventListener("click",suppressClick,!0)}var Point=require("point-geometry");exports.create=function(e,t,r){var o=document.createElement(e);return t&&(o.className=t),r&&r.appendChild(o),o};var docStyle=document.documentElement.style,selectProp=testProp(["userSelect","MozUserSelect","WebkitUserSelect","msUserSelect"]),userSelect;exports.disableDrag=function(){selectProp&&(userSelect=docStyle[selectProp],docStyle[selectProp]="none")},exports.enableDrag=function(){selectProp&&(docStyle[selectProp]=userSelect)};var transformProp=testProp(["transform","WebkitTransform"]);exports.setTransform=function(e,t){e.style[transformProp]=t},exports.suppressClick=function(){window.addEventListener("click",suppressClick,!0),window.setTimeout(function(){window.removeEventListener("click",suppressClick,!0)},0)},exports.mousePos=function(e,t){var r=e.getBoundingClientRect();return t=t.touches?t.touches[0]:t,new Point(t.clientX-r.left-e.clientLeft,t.clientY-r.top-e.clientTop)};
-	},{"point-geometry":137}],99:[function(require,module,exports){
-	"use strict";module.exports={API_URL:"https://api.mapbox.com",REQUIRE_ACCESS_TOKEN:!0};
-	},{}],100:[function(require,module,exports){
-	"use strict";var util=require("./util"),Evented={on:function(t,e){return this._events=this._events||{},this._events[t]=this._events[t]||[],this._events[t].push(e),this},off:function(t,e){if(!t)return delete this._events,this;if(!this.listens(t))return this;if(e){var s=this._events[t].indexOf(e);s>=0&&this._events[t].splice(s,1),this._events[t].length||delete this._events[t]}else delete this._events[t];return this},once:function(t,e){var s=function(i){this.off(t,s),e.call(this,i)}.bind(this);return this.on(t,s),this},fire:function(t,e){if(!this.listens(t))return this;e=util.extend({},e),util.extend(e,{type:t,target:this});for(var s=this._events[t].slice(),i=0;i<s.length;i++)s[i].call(this,e);return this},listens:function(t){return!(!this._events||!this._events[t])}};module.exports=Evented;
-	},{"./util":106}],101:[function(require,module,exports){
-	"use strict";function Glyphs(a,e){this.stacks=a.readFields(readFontstacks,[],e)}function readFontstacks(a,e,r){if(1===a){var t=r.readMessage(readFontstack,{glyphs:{}});e.push(t)}}function readFontstack(a,e,r){if(1===a)e.name=r.readString();else if(2===a)e.range=r.readString();else if(3===a){var t=r.readMessage(readGlyph,{});e.glyphs[t.id]=t}}function readGlyph(a,e,r){1===a?e.id=r.readVarint():2===a?e.bitmap=r.readBytes():3===a?e.width=r.readVarint():4===a?e.height=r.readVarint():5===a?e.left=r.readSVarint():6===a?e.top=r.readSVarint():7===a&&(e.advance=r.readVarint())}module.exports=Glyphs;
-	},{}],102:[function(require,module,exports){
-	"use strict";function interpolate(t,e,n){return t*(1-n)+e*n}module.exports=interpolate,interpolate.number=interpolate,interpolate.vec2=function(t,e,n){return[interpolate(t[0],e[0],n),interpolate(t[1],e[1],n)]},interpolate.color=function(t,e,n){return[interpolate(t[0],e[0],n),interpolate(t[1],e[1],n),interpolate(t[2],e[2],n),interpolate(t[3],e[3],n)]},interpolate.array=function(t,e,n){return t.map(function(t,r){return interpolate(t,e[r],n)})};
-	},{}],103:[function(require,module,exports){
-	"use strict";function normalizeURL(e,r,o){if(o=o||config.ACCESS_TOKEN,!o&&config.REQUIRE_ACCESS_TOKEN)throw new Error("An API access token is required to use Mapbox GL. See https://www.mapbox.com/developers/api/#access-tokens");if(e=e.replace(/^mapbox:\/\//,config.API_URL+r),e+=-1!==e.indexOf("?")?"&access_token=":"?access_token=",config.REQUIRE_ACCESS_TOKEN){if("s"===o[0])throw new Error("Use a public access token (pk.*) with Mapbox GL JS, not a secret access token (sk.*). See https://www.mapbox.com/developers/api/#access-tokens");e+=o}return e}var config=require("./config"),browser=require("./browser");module.exports.normalizeStyleURL=function(e,r){if(!e.match(/^mapbox:\/\/styles\//))return e;var o=e.split("/"),t=o[3],n=o[4],s=o[5]?"/draft":"";return normalizeURL("mapbox://"+t+"/"+n+s,"/styles/v1/",r)},module.exports.normalizeSourceURL=function(e,r){return e.match(/^mapbox:\/\//)?normalizeURL(e+".json","/v4/",r)+"&secure":e},module.exports.normalizeGlyphsURL=function(e,r){if(!e.match(/^mapbox:\/\//))return e;var o=e.split("/")[3];return normalizeURL("mapbox://"+o+"/{fontstack}/{range}.pbf","/fonts/v1/",r)},module.exports.normalizeSpriteURL=function(e,r,o,t){if(!e.match(/^mapbox:\/\/sprites\//))return e+r+o;var n=e.split("/"),s=n[3],a=n[4],i=n[5]?"/draft":"";return normalizeURL("mapbox://"+s+"/"+a+i+"/sprite"+r+o,"/styles/v1/",t)},module.exports.normalizeTileURL=function(e,r){return r&&r.match(/^mapbox:\/\//)?e.replace(/\.((?:png|jpg)\d*)(?=$|\?)/,browser.devicePixelRatio>=2?"@2x.$1":".$1"):e};
-	},{"./browser":95,"./config":99}],104:[function(require,module,exports){
-	"use strict";function MRUCache(t,e){this.max=t,this.onRemove=e,this.reset()}module.exports=MRUCache,MRUCache.prototype.reset=function(){for(var t in this.list)this.onRemove(this.list[t]);return this.list={},this.order=[],this},MRUCache.prototype.add=function(t,e){if(this.list[t]=e,this.order.push(t),this.order.length>this.max){var i=this.get(this.order[0]);i&&this.onRemove(i)}return this},MRUCache.prototype.has=function(t){return t in this.list},MRUCache.prototype.keys=function(){return this.order},MRUCache.prototype.get=function(t){if(!this.has(t))return null;var e=this.list[t];return delete this.list[t],this.order.splice(this.order.indexOf(t),1),e};
-	},{}],105:[function(require,module,exports){
-	"use strict";function resolveTokens(e,n){return n.replace(/{([^{}()\[\]<>$=:;.,^]+)}/g,function(n,r){return r in e?e[r]:""})}module.exports=resolveTokens;
-	},{}],106:[function(require,module,exports){
-	"use strict";var UnitBezier=require("unitbezier"),Coordinate=require("../geo/coordinate");exports.easeCubicInOut=function(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,r=t*n;return 4*(.5>n?r:3*(n-t)+r-.75)},exports.bezier=function(n,t,r,e){var o=new UnitBezier(n,t,r,e);return function(n){return o.solve(n)}},exports.ease=exports.bezier(.25,.1,.25,1),exports.premultiply=function(n){return n[0]*=n[3],n[1]*=n[3],n[2]*=n[3],n},exports.clamp=function(n,t,r){return Math.min(r,Math.max(t,n))},exports.wrap=function(n,t,r){var e=r-t,o=((n-t)%e+e)%e+t;return o===t?r:o},exports.coalesce=function(){for(var n=0;n<arguments.length;n++){var t=arguments[n];if(null!==t&&void 0!==t)return t}},exports.asyncEach=function(n,t,r){function e(){0===--o&&r()}var o=n.length;if(0===o)return r();for(var i=0;i<n.length;i++)t(n[i],e)},exports.asyncAll=function(n,t,r){var e=n.length,o=new Array(n.length),i=null;n.forEach(function(n,u){t(n,function(n,t){n&&(i=n),o[u]=t,0===--e&&r(i,o)})})},exports.keysDifference=function(n,t){var r=[];for(var e in n)e in t||r.push(e);return r},exports.extend=function(n){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var e in r)n[e]=r[e]}return n},exports.extendAll=function(n,t){for(var r in t)Object.defineProperty(n,r,Object.getOwnPropertyDescriptor(t,r));return n},exports.inherit=function(n,t){var r="function"==typeof n?n.prototype:n,e=Object.create(r);return exports.extendAll(e,t),e},exports.pick=function(n,t){for(var r={},e=0;e<t.length;e++){var o=t[e];o in n&&(r[o]=n[o])}return r};var id=1;exports.uniqueId=function(){return id++},exports.throttle=function(n,t,r){var e,o,i,u;return u=function(){e=!1,o&&(i.apply(r,o),o=!1)},i=function(){e?o=arguments:(n.apply(r,arguments),setTimeout(u,t),e=!0)}},exports.debounce=function(n,t){var r,e;return function(){e=arguments,clearTimeout(r),r=setTimeout(function(){n.apply(null,e)},t)}},exports.bindAll=function(n,t){n.forEach(function(n){t[n]=t[n].bind(t)})},exports.bindHandlers=function(n){for(var t in n)"function"==typeof n[t]&&0===t.indexOf("_on")&&(n[t]=n[t].bind(n))},exports.setOptions=function(n,t){n.hasOwnProperty("options")||(n.options=n.options?Object.create(n.options):{});for(var r in t)n.options[r]=t[r];return n.options},exports.getCoordinatesCenter=function(n){for(var t=1/0,r=1/0,e=-(1/0),o=-(1/0),i=0;i<n.length;i++)t=Math.min(t,n[i].column),r=Math.min(r,n[i].row),e=Math.max(e,n[i].column),o=Math.max(o,n[i].row);var u=e-t,a=o-r,c=Math.max(u,a);return new Coordinate((t+e)/2,(r+o)/2,0).zoomTo(Math.floor(-Math.log(c)/Math.LN2))};
-	},{"../geo/coordinate":19,"unitbezier":141}],107:[function(require,module,exports){
-	function clamp_css_byte(e){return e=Math.round(e),0>e?0:e>255?255:e}function clamp_css_float(e){return 0>e?0:e>1?1:e}function parse_css_int(e){return clamp_css_byte("%"===e[e.length-1]?parseFloat(e)/100*255:parseInt(e))}function parse_css_float(e){return clamp_css_float("%"===e[e.length-1]?parseFloat(e)/100:parseFloat(e))}function css_hue_to_rgb(e,r,l){return 0>l?l+=1:l>1&&(l-=1),1>6*l?e+(r-e)*l*6:1>2*l?r:2>3*l?e+(r-e)*(2/3-l)*6:e}function parseCSSColor(e){var r=e.replace(/ /g,"").toLowerCase();if(r in kCSSColorTable)return kCSSColorTable[r].slice();if("#"===r[0]){if(4===r.length){var l=parseInt(r.substr(1),16);return l>=0&&4095>=l?[(3840&l)>>4|(3840&l)>>8,240&l|(240&l)>>4,15&l|(15&l)<<4,1]:null}if(7===r.length){var l=parseInt(r.substr(1),16);return l>=0&&16777215>=l?[(16711680&l)>>16,(65280&l)>>8,255&l,1]:null}return null}var a=r.indexOf("("),t=r.indexOf(")");if(-1!==a&&t+1===r.length){var n=r.substr(0,a),s=r.substr(a+1,t-(a+1)).split(","),o=1;switch(n){case"rgba":if(4!==s.length)return null;o=parse_css_float(s.pop());case"rgb":return 3!==s.length?null:[parse_css_int(s[0]),parse_css_int(s[1]),parse_css_int(s[2]),o];case"hsla":if(4!==s.length)return null;o=parse_css_float(s.pop());case"hsl":if(3!==s.length)return null;var i=(parseFloat(s[0])%360+360)%360/360,u=parse_css_float(s[1]),g=parse_css_float(s[2]),d=.5>=g?g*(u+1):g+u-g*u,c=2*g-d;return[clamp_css_byte(255*css_hue_to_rgb(c,d,i+1/3)),clamp_css_byte(255*css_hue_to_rgb(c,d,i)),clamp_css_byte(255*css_hue_to_rgb(c,d,i-1/3)),o];default:return null}}return null}var kCSSColorTable={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{exports.parseCSSColor=parseCSSColor}catch(e){}
-	},{}],108:[function(require,module,exports){
-	"use strict";function infix(t){return function(n,r,i){return"$type"===r?"t"+t+VectorTileFeatureTypes.indexOf(i):"p["+JSON.stringify(r)+"]"+t+JSON.stringify(i)}}function strictInfix(t){var n=infix(t);return function(t,r,i){return"$type"===r?n(t,r,i):"typeof(p["+JSON.stringify(r)+"]) === typeof("+JSON.stringify(i)+") && "+n(t,r,i)}}function compile(t){return operators[t[0]].apply(t,t)}function truth(){return!0}var VectorTileFeatureTypes=["Unknown","Point","LineString","Polygon"],operators={"==":infix("==="),"!=":infix("!=="),">":strictInfix(">"),"<":strictInfix("<"),"<=":strictInfix("<="),">=":strictInfix(">="),"in":function(t,n){return"(function(){"+Array.prototype.slice.call(arguments,2).map(function(r){return"if ("+operators["=="](t,n,r)+") return true;"}).join("")+"return false;})()"},"!in":function(){return"!("+operators["in"].apply(this,arguments)+")"},any:function(){return Array.prototype.slice.call(arguments,1).map(function(t){return"("+compile(t)+")"}).join("||")||"false"},all:function(){return Array.prototype.slice.call(arguments,1).map(function(t){return"("+compile(t)+")"}).join("&&")||"true"},none:function(){return"!("+operators.any.apply(this,arguments)+")"}};module.exports=function(t){if(!t)return truth;var n="var p = f.properties || f.tags || {}, t = f.type; return "+compile(t)+";";return new Function("f",n)};
-	},{}],109:[function(require,module,exports){
-	"use strict";function clip(e,n,t,r,l,u,i,s){if(t/=n,r/=n,i>=t&&r>=s)return e;if(i>r||t>s)return null;for(var p=[],h=0;h<e.length;h++){var c,a,o=e[h],f=o.geometry,g=o.type;if(c=o.min[l],a=o.max[l],c>=t&&r>=a)p.push(o);else if(!(c>r||t>a)){var m=1===g?clipPoints(f,t,r,l):clipGeometry(f,t,r,l,u,3===g);m.length&&p.push({geometry:m,type:g,tags:e[h].tags||null,min:o.min,max:o.max})}}return p.length?p:null}function clipPoints(e,n,t,r){for(var l=[],u=0;u<e.length;u++){var i=e[u],s=i[r];s>=n&&t>=s&&l.push(i)}return l}function clipGeometry(e,n,t,r,l,u){for(var i=[],s=0;s<e.length;s++){var p,h,c,a=0,o=0,f=null,g=e[s],m=g.area,v=g.dist,w=g.length,y=[];for(h=0;w-1>h;h++)p=f||g[h],f=g[h+1],a=o||p[r],o=f[r],n>a?o>t?(y.push(l(p,f,n),l(p,f,t)),u||(y=newSlice(i,y,m,v))):o>=n&&y.push(l(p,f,n)):a>t?n>o?(y.push(l(p,f,t),l(p,f,n)),u||(y=newSlice(i,y,m,v))):t>=o&&y.push(l(p,f,t)):(y.push(p),n>o?(y.push(l(p,f,n)),u||(y=newSlice(i,y,m,v))):o>t&&(y.push(l(p,f,t)),u||(y=newSlice(i,y,m,v))));p=g[w-1],a=p[r],a>=n&&t>=a&&y.push(p),c=y[y.length-1],u&&c&&(y[0][0]!==c[0]||y[0][1]!==c[1])&&y.push(y[0]),newSlice(i,y,m,v)}return i}function newSlice(e,n,t,r){return n.length&&(n.area=t,n.dist=r,e.push(n)),[]}module.exports=clip;
-	},{}],110:[function(require,module,exports){
-	"use strict";function convert(e,t){var r=[];if("FeatureCollection"===e.type)for(var o=0;o<e.features.length;o++)convertFeature(r,e.features[o],t);else"Feature"===e.type?convertFeature(r,e,t):convertFeature(r,{geometry:e},t);return r}function convertFeature(e,t,r){var o,n,a,i=t.geometry,c=i.type,l=i.coordinates,u=t.properties;if("Point"===c)e.push(create(u,1,[projectPoint(l)]));else if("MultiPoint"===c)e.push(create(u,1,project(l)));else if("LineString"===c)e.push(create(u,2,[project(l,r)]));else if("MultiLineString"===c||"Polygon"===c){for(a=[],o=0;o<l.length;o++)a.push(project(l[o],r));e.push(create(u,"Polygon"===c?3:2,a))}else if("MultiPolygon"===c){for(a=[],o=0;o<l.length;o++)for(n=0;n<l[o].length;n++)a.push(project(l[o][n],r));e.push(create(u,3,a))}else{if("GeometryCollection"!==c)throw new Error("Input data is not a valid GeoJSON object.");for(o=0;o<i.geometries.length;o++)convertFeature(e,{geometry:i.geometries[o],properties:u},r)}}function create(e,t,r){var o={geometry:r,type:t,tags:e||null,min:[2,1],max:[-1,0]};return calcBBox(o),o}function project(e,t){for(var r=[],o=0;o<e.length;o++)r.push(projectPoint(e[o]));return t&&(simplify(r,t),calcSize(r)),r}function projectPoint(e){var t=Math.sin(e[1]*Math.PI/180),r=e[0]/360+.5,o=.5-.25*Math.log((1+t)/(1-t))/Math.PI;return o=-1>o?-1:o>1?1:o,[r,o,0]}function calcSize(e){for(var t,r,o=0,n=0,a=0;a<e.length-1;a++)t=r||e[a],r=e[a+1],o+=t[0]*r[1]-r[0]*t[1],n+=Math.abs(r[0]-t[0])+Math.abs(r[1]-t[1]);e.area=Math.abs(o/2),e.dist=n}function calcBBox(e){var t=e.geometry,r=e.min,o=e.max;if(1===e.type)calcRingBBox(r,o,t);else for(var n=0;n<t.length;n++)calcRingBBox(r,o,t[n]);return e}function calcRingBBox(e,t,r){for(var o,n=0;n<r.length;n++)o=r[n],e[0]=Math.min(o[0],e[0]),t[0]=Math.max(o[0],t[0]),e[1]=Math.min(o[1],e[1]),t[1]=Math.max(o[1],t[1])}module.exports=convert;var simplify=require("./simplify");
-	},{"./simplify":112}],111:[function(require,module,exports){
-	"use strict";function geojsonvt(e,t){return new GeoJSONVT(e,t)}function GeoJSONVT(e,t){t=this.options=extend(Object.create(this.options),t);var i=t.debug;i&&console.time("preprocess data");var o=1<<t.maxZoom,n=convert(e,t.tolerance/(o*t.extent));this.tiles={},this.tileCoords=[],i&&(console.timeEnd("preprocess data"),console.log("index: maxZoom: %d, maxPoints: %d",t.indexMaxZoom,t.indexMaxPoints),console.time("generate tiles"),this.stats={},this.total=0),n=wrap(n,t.buffer/t.extent,intersectX),n.length&&this.splitTile(n,0,0,0),i&&(n.length&&console.log("features: %d, points: %d",this.tiles[0].numFeatures,this.tiles[0].numPoints),console.timeEnd("generate tiles"),console.log("tiles generated:",this.total,JSON.stringify(this.stats)))}function toID(e,t,i){return 32*((1<<e)*i+t)+e}function intersectX(e,t,i){return[i,(i-e[0])*(t[1]-e[1])/(t[0]-e[0])+e[1],1]}function intersectY(e,t,i){return[(i-e[1])*(t[0]-e[0])/(t[1]-e[1])+e[0],i,1]}function extend(e,t){for(var i in t)e[i]=t[i];return e}function isClippedSquare(e,t,i){var o=e.source;if(1!==o.length)return!1;var n=o[0];if(3!==n.type||n.geometry.length>1)return!1;var r=n.geometry[0].length;if(5!==r)return!1;for(var s=0;r>s;s++){var l=transform.point(n.geometry[0][s],t,e.z2,e.x,e.y);if(l[0]!==-i&&l[0]!==t+i||l[1]!==-i&&l[1]!==t+i)return!1}return!0}module.exports=geojsonvt;var convert=require("./convert"),transform=require("./transform"),clip=require("./clip"),wrap=require("./wrap"),createTile=require("./tile");GeoJSONVT.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,solidChildren:!1,tolerance:3,extent:4096,buffer:64,debug:0},GeoJSONVT.prototype.splitTile=function(e,t,i,o,n,r,s){for(var l=[e,t,i,o],a=this.options,u=a.debug,c=null;l.length;){o=l.pop(),i=l.pop(),t=l.pop(),e=l.pop();var p=1<<t,d=toID(t,i,o),m=this.tiles[d],f=t===a.maxZoom?0:a.tolerance/(p*a.extent);if(!m&&(u>1&&console.time("creation"),m=this.tiles[d]=createTile(e,p,i,o,f,t===a.maxZoom),this.tileCoords.push({z:t,x:i,y:o}),u)){u>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,i,o,m.numFeatures,m.numPoints,m.numSimplified),console.timeEnd("creation"));var h="z"+t;this.stats[h]=(this.stats[h]||0)+1,this.total++}if(m.source=e,n){if(t===a.maxZoom||t===n)continue;var x=1<<n-t;if(i!==Math.floor(r/x)||o!==Math.floor(s/x))continue}else if(t===a.indexMaxZoom||m.numPoints<=a.indexMaxPoints)continue;if(a.solidChildren||!isClippedSquare(m,a.extent,a.buffer)){m.source=null,u>1&&console.time("clipping");var g,v,M,T,b,y,S=.5*a.buffer/a.extent,Z=.5-S,q=.5+S,w=1+S;g=v=M=T=null,b=clip(e,p,i-S,i+q,0,intersectX,m.min[0],m.max[0]),y=clip(e,p,i+Z,i+w,0,intersectX,m.min[0],m.max[0]),b&&(g=clip(b,p,o-S,o+q,1,intersectY,m.min[1],m.max[1]),v=clip(b,p,o+Z,o+w,1,intersectY,m.min[1],m.max[1])),y&&(M=clip(y,p,o-S,o+q,1,intersectY,m.min[1],m.max[1]),T=clip(y,p,o+Z,o+w,1,intersectY,m.min[1],m.max[1])),u>1&&console.timeEnd("clipping"),g&&l.push(g,t+1,2*i,2*o),v&&l.push(v,t+1,2*i,2*o+1),M&&l.push(M,t+1,2*i+1,2*o),T&&l.push(T,t+1,2*i+1,2*o+1)}else n&&(c=t)}return c},GeoJSONVT.prototype.getTile=function(e,t,i){var o=this.options,n=o.extent,r=o.debug,s=1<<e;t=(t%s+s)%s;var l=toID(e,t,i);if(this.tiles[l])return transform.tile(this.tiles[l],n);r>1&&console.log("drilling down to z%d-%d-%d",e,t,i);for(var a,u=e,c=t,p=i;!a&&u>0;)u--,c=Math.floor(c/2),p=Math.floor(p/2),a=this.tiles[toID(u,c,p)];if(!a||!a.source)return null;if(r>1&&console.log("found parent tile z%d-%d-%d",u,c,p),isClippedSquare(a,n,o.buffer))return transform.tile(a,n);r>1&&console.time("drilling down");var d=this.splitTile(a.source,u,c,p,e,t,i);if(r>1&&console.timeEnd("drilling down"),null!==d){var m=1<<e-d;l=toID(d,Math.floor(t/m),Math.floor(i/m))}return this.tiles[l]?transform.tile(this.tiles[l],n):null};
-	},{"./clip":109,"./convert":110,"./tile":113,"./transform":114,"./wrap":115}],112:[function(require,module,exports){
-	"use strict";function simplify(t,i){var e,p,r,s,o=i*i,f=t.length,u=0,n=f-1,g=[];for(t[u][2]=1,t[n][2]=1;n;){for(p=0,e=u+1;n>e;e++)r=getSqSegDist(t[e],t[u],t[n]),r>p&&(s=e,p=r);p>o?(t[s][2]=p,g.push(u),g.push(s),u=s):(n=g.pop(),u=g.pop())}}function getSqSegDist(t,i,e){var p=i[0],r=i[1],s=e[0],o=e[1],f=t[0],u=t[1],n=s-p,g=o-r;if(0!==n||0!==g){var l=((f-p)*n+(u-r)*g)/(n*n+g*g);l>1?(p=s,r=o):l>0&&(p+=n*l,r+=g*l)}return n=f-p,g=u-r,n*n+g*g}module.exports=simplify;
-	},{}],113:[function(require,module,exports){
-	"use strict";function createTile(e,n,t,m,i,u){for(var r={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:t,y:m,z2:n,transformed:!1,min:[2,1],max:[-1,0]},a=0;a<e.length;a++){r.numFeatures++,addFeature(r,e[a],i,u);var s=e[a].min,l=e[a].max;s[0]<r.min[0]&&(r.min[0]=s[0]),s[1]<r.min[1]&&(r.min[1]=s[1]),l[0]>r.max[0]&&(r.max[0]=l[0]),l[1]>r.max[1]&&(r.max[1]=l[1])}return r}function addFeature(e,n,t,m){var i,u,r,a,s=n.geometry,l=n.type,o=[],f=t*t;if(1===l)for(i=0;i<s.length;i++)o.push(s[i]),e.numPoints++,e.numSimplified++;else for(i=0;i<s.length;i++)if(r=s[i],m||!(2===l&&r.dist<t||3===l&&r.area<f)){var d=[];for(u=0;u<r.length;u++)a=r[u],(m||a[2]>f)&&(d.push(a),e.numSimplified++),e.numPoints++;o.push(d)}else e.numPoints+=r.length;o.length&&e.features.push({geometry:o,type:l,tags:n.tags||null})}module.exports=createTile;
-	},{}],114:[function(require,module,exports){
-	"use strict";function transformTile(r,t){if(r.transformed)return r;var n,e,o,f=r.z2,a=r.x,s=r.y;for(n=0;n<r.features.length;n++){var i=r.features[n],u=i.geometry,m=i.type;if(1===m)for(e=0;e<u.length;e++)u[e]=transformPoint(u[e],t,f,a,s);else for(e=0;e<u.length;e++){var l=u[e];for(o=0;o<l.length;o++)l[o]=transformPoint(l[o],t,f,a,s)}}return r.transformed=!0,r}function transformPoint(r,t,n,e,o){var f=Math.round(t*(r[0]*n-e)),a=Math.round(t*(r[1]*n-o));return[f,a]}exports.tile=transformTile,exports.point=transformPoint;
-	},{}],115:[function(require,module,exports){
-	"use strict";function wrap(r,t,e){var o=r,a=clip(r,1,-1-t,t,0,e,-1,2),s=clip(r,1,1-t,2+t,0,e,-1,2);return(a||s)&&(o=clip(r,1,-t,1+t,0,e,-1,2),a&&(o=shiftFeatureCoords(a,1).concat(o)),s&&(o=o.concat(shiftFeatureCoords(s,-1)))),o}function shiftFeatureCoords(r,t){for(var e=[],o=0;o<r.length;o++){var a,s=r[o],i=s.type;if(1===i)a=shiftCoords(s.geometry,t);else{a=[];for(var n=0;n<s.geometry.length;n++)a.push(shiftCoords(s.geometry[n],t))}e.push({geometry:a,type:i,tags:s.tags,min:[s.min[0]+t,s.min[1]],max:[s.max[0]+t,s.max[1]]})}return e}function shiftCoords(r,t){var e=[];e.area=r.area,e.dist=r.dist;for(var o=0;o<r.length;o++)e.push([r[o][0]+t,r[o][1],r[o][2]]);return e}var clip=require("./clip");module.exports=wrap;
-	},{"./clip":109}],116:[function(require,module,exports){
-	exports.glMatrix=require("./gl-matrix/common.js"),exports.mat2=require("./gl-matrix/mat2.js"),exports.mat2d=require("./gl-matrix/mat2d.js"),exports.mat3=require("./gl-matrix/mat3.js"),exports.mat4=require("./gl-matrix/mat4.js"),exports.quat=require("./gl-matrix/quat.js"),exports.vec2=require("./gl-matrix/vec2.js"),exports.vec3=require("./gl-matrix/vec3.js"),exports.vec4=require("./gl-matrix/vec4.js");
-	},{"./gl-matrix/common.js":117,"./gl-matrix/mat2.js":118,"./gl-matrix/mat2d.js":119,"./gl-matrix/mat3.js":120,"./gl-matrix/mat4.js":121,"./gl-matrix/quat.js":122,"./gl-matrix/vec2.js":123,"./gl-matrix/vec3.js":124,"./gl-matrix/vec4.js":125}],117:[function(require,module,exports){
-	var glMatrix={};glMatrix.EPSILON=1e-6,glMatrix.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,glMatrix.RANDOM=Math.random,glMatrix.setMatrixArrayType=function(r){GLMAT_ARRAY_TYPE=r};var degree=Math.PI/180;glMatrix.toRadian=function(r){return r*degree},module.exports=glMatrix;
-	},{}],118:[function(require,module,exports){
-	var glMatrix=require("./common.js"),mat2={};mat2.create=function(){var t=new glMatrix.ARRAY_TYPE(4);return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},mat2.clone=function(t){var n=new glMatrix.ARRAY_TYPE(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n},mat2.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t},mat2.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},mat2.transpose=function(t,n){if(t===n){var r=n[1];t[1]=n[2],t[2]=r}else t[0]=n[0],t[1]=n[2],t[2]=n[1],t[3]=n[3];return t},mat2.invert=function(t,n){var r=n[0],a=n[1],u=n[2],o=n[3],e=r*o-u*a;return e?(e=1/e,t[0]=o*e,t[1]=-a*e,t[2]=-u*e,t[3]=r*e,t):null},mat2.adjoint=function(t,n){var r=n[0];return t[0]=n[3],t[1]=-n[1],t[2]=-n[2],t[3]=r,t},mat2.determinant=function(t){return t[0]*t[3]-t[2]*t[1]},mat2.multiply=function(t,n,r){var a=n[0],u=n[1],o=n[2],e=n[3],i=r[0],m=r[1],c=r[2],f=r[3];return t[0]=a*i+o*m,t[1]=u*i+e*m,t[2]=a*c+o*f,t[3]=u*c+e*f,t},mat2.mul=mat2.multiply,mat2.rotate=function(t,n,r){var a=n[0],u=n[1],o=n[2],e=n[3],i=Math.sin(r),m=Math.cos(r);return t[0]=a*m+o*i,t[1]=u*m+e*i,t[2]=a*-i+o*m,t[3]=u*-i+e*m,t},mat2.scale=function(t,n,r){var a=n[0],u=n[1],o=n[2],e=n[3],i=r[0],m=r[1];return t[0]=a*i,t[1]=u*i,t[2]=o*m,t[3]=e*m,t},mat2.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=-r,t[3]=a,t},mat2.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t},mat2.str=function(t){return"mat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},mat2.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2))},mat2.LDU=function(t,n,r,a){return t[2]=a[2]/a[0],r[0]=a[0],r[1]=a[1],r[3]=a[3]-t[2]*r[1],[t,n,r]},module.exports=mat2;
-	},{"./common.js":117}],119:[function(require,module,exports){
-	var glMatrix=require("./common.js"),mat2d={};mat2d.create=function(){var t=new glMatrix.ARRAY_TYPE(6);return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},mat2d.clone=function(t){var n=new glMatrix.ARRAY_TYPE(6);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n},mat2d.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t},mat2d.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},mat2d.invert=function(t,n){var r=n[0],a=n[1],o=n[2],u=n[3],e=n[4],i=n[5],m=r*u-a*o;return m?(m=1/m,t[0]=u*m,t[1]=-a*m,t[2]=-o*m,t[3]=r*m,t[4]=(o*i-u*e)*m,t[5]=(a*e-r*i)*m,t):null},mat2d.determinant=function(t){return t[0]*t[3]-t[1]*t[2]},mat2d.multiply=function(t,n,r){var a=n[0],o=n[1],u=n[2],e=n[3],i=n[4],m=n[5],c=r[0],d=r[1],f=r[2],l=r[3],M=r[4],h=r[5];return t[0]=a*c+u*d,t[1]=o*c+e*d,t[2]=a*f+u*l,t[3]=o*f+e*l,t[4]=a*M+u*h+i,t[5]=o*M+e*h+m,t},mat2d.mul=mat2d.multiply,mat2d.rotate=function(t,n,r){var a=n[0],o=n[1],u=n[2],e=n[3],i=n[4],m=n[5],c=Math.sin(r),d=Math.cos(r);return t[0]=a*d+u*c,t[1]=o*d+e*c,t[2]=a*-c+u*d,t[3]=o*-c+e*d,t[4]=i,t[5]=m,t},mat2d.scale=function(t,n,r){var a=n[0],o=n[1],u=n[2],e=n[3],i=n[4],m=n[5],c=r[0],d=r[1];return t[0]=a*c,t[1]=o*c,t[2]=u*d,t[3]=e*d,t[4]=i,t[5]=m,t},mat2d.translate=function(t,n,r){var a=n[0],o=n[1],u=n[2],e=n[3],i=n[4],m=n[5],c=r[0],d=r[1];return t[0]=a,t[1]=o,t[2]=u,t[3]=e,t[4]=a*c+u*d+i,t[5]=o*c+e*d+m,t},mat2d.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=-r,t[3]=a,t[4]=0,t[5]=0,t},mat2d.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t[4]=0,t[5]=0,t},mat2d.fromTranslation=function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=n[0],t[5]=n[1],t},mat2d.str=function(t){return"mat2d("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+")"},mat2d.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+1)},module.exports=mat2d;
-	},{"./common.js":117}],120:[function(require,module,exports){
-	var glMatrix=require("./common.js"),mat3={};mat3.create=function(){var t=new glMatrix.ARRAY_TYPE(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},mat3.fromMat4=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[4],t[4]=n[5],t[5]=n[6],t[6]=n[8],t[7]=n[9],t[8]=n[10],t},mat3.clone=function(t){var n=new glMatrix.ARRAY_TYPE(9);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n},mat3.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},mat3.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},mat3.transpose=function(t,n){if(t===n){var r=n[1],a=n[2],o=n[5];t[1]=n[3],t[2]=n[6],t[3]=r,t[5]=n[7],t[6]=a,t[7]=o}else t[0]=n[0],t[1]=n[3],t[2]=n[6],t[3]=n[1],t[4]=n[4],t[5]=n[7],t[6]=n[2],t[7]=n[5],t[8]=n[8];return t},mat3.invert=function(t,n){var r=n[0],a=n[1],o=n[2],u=n[3],m=n[4],e=n[5],i=n[6],c=n[7],f=n[8],l=f*m-e*c,M=-f*u+e*i,v=c*u-m*i,h=r*l+a*M+o*v;return h?(h=1/h,t[0]=l*h,t[1]=(-f*a+o*c)*h,t[2]=(e*a-o*m)*h,t[3]=M*h,t[4]=(f*r-o*i)*h,t[5]=(-e*r+o*u)*h,t[6]=v*h,t[7]=(-c*r+a*i)*h,t[8]=(m*r-a*u)*h,t):null},mat3.adjoint=function(t,n){var r=n[0],a=n[1],o=n[2],u=n[3],m=n[4],e=n[5],i=n[6],c=n[7],f=n[8];return t[0]=m*f-e*c,t[1]=o*c-a*f,t[2]=a*e-o*m,t[3]=e*i-u*f,t[4]=r*f-o*i,t[5]=o*u-r*e,t[6]=u*c-m*i,t[7]=a*i-r*c,t[8]=r*m-a*u,t},mat3.determinant=function(t){var n=t[0],r=t[1],a=t[2],o=t[3],u=t[4],m=t[5],e=t[6],i=t[7],c=t[8];return n*(c*u-m*i)+r*(-c*o+m*e)+a*(i*o-u*e)},mat3.multiply=function(t,n,r){var a=n[0],o=n[1],u=n[2],m=n[3],e=n[4],i=n[5],c=n[6],f=n[7],l=n[8],M=r[0],v=r[1],h=r[2],p=r[3],s=r[4],w=r[5],d=r[6],R=r[7],g=r[8];return t[0]=M*a+v*m+h*c,t[1]=M*o+v*e+h*f,t[2]=M*u+v*i+h*l,t[3]=p*a+s*m+w*c,t[4]=p*o+s*e+w*f,t[5]=p*u+s*i+w*l,t[6]=d*a+R*m+g*c,t[7]=d*o+R*e+g*f,t[8]=d*u+R*i+g*l,t},mat3.mul=mat3.multiply,mat3.translate=function(t,n,r){var a=n[0],o=n[1],u=n[2],m=n[3],e=n[4],i=n[5],c=n[6],f=n[7],l=n[8],M=r[0],v=r[1];return t[0]=a,t[1]=o,t[2]=u,t[3]=m,t[4]=e,t[5]=i,t[6]=M*a+v*m+c,t[7]=M*o+v*e+f,t[8]=M*u+v*i+l,t},mat3.rotate=function(t,n,r){var a=n[0],o=n[1],u=n[2],m=n[3],e=n[4],i=n[5],c=n[6],f=n[7],l=n[8],M=Math.sin(r),v=Math.cos(r);return t[0]=v*a+M*m,t[1]=v*o+M*e,t[2]=v*u+M*i,t[3]=v*m-M*a,t[4]=v*e-M*o,t[5]=v*i-M*u,t[6]=c,t[7]=f,t[8]=l,t},mat3.scale=function(t,n,r){var a=r[0],o=r[1];return t[0]=a*n[0],t[1]=a*n[1],t[2]=a*n[2],t[3]=o*n[3],t[4]=o*n[4],t[5]=o*n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},mat3.fromTranslation=function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=n[0],t[7]=n[1],t[8]=1,t},mat3.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=0,t[3]=-r,t[4]=a,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},mat3.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=0,t[4]=n[1],t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},mat3.fromMat2d=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=0,t[3]=n[2],t[4]=n[3],t[5]=0,t[6]=n[4],t[7]=n[5],t[8]=1,t},mat3.fromQuat=function(t,n){var r=n[0],a=n[1],o=n[2],u=n[3],m=r+r,e=a+a,i=o+o,c=r*m,f=a*m,l=a*e,M=o*m,v=o*e,h=o*i,p=u*m,s=u*e,w=u*i;return t[0]=1-l-h,t[3]=f-w,t[6]=M+s,t[1]=f+w,t[4]=1-c-h,t[7]=v-p,t[2]=M-s,t[5]=v+p,t[8]=1-c-l,t},mat3.normalFromMat4=function(t,n){var r=n[0],a=n[1],o=n[2],u=n[3],m=n[4],e=n[5],i=n[6],c=n[7],f=n[8],l=n[9],M=n[10],v=n[11],h=n[12],p=n[13],s=n[14],w=n[15],d=r*e-a*m,R=r*i-o*m,g=r*c-u*m,x=a*i-o*e,y=a*c-u*e,A=o*c-u*i,Y=f*p-l*h,T=f*s-M*h,j=f*w-v*h,q=l*s-M*p,E=l*w-v*p,P=M*w-v*s,_=d*P-R*E+g*q+x*j-y*T+A*Y;return _?(_=1/_,t[0]=(e*P-i*E+c*q)*_,t[1]=(i*j-m*P-c*T)*_,t[2]=(m*E-e*j+c*Y)*_,t[3]=(o*E-a*P-u*q)*_,t[4]=(r*P-o*j+u*T)*_,t[5]=(a*j-r*E-u*Y)*_,t[6]=(p*A-s*y+w*x)*_,t[7]=(s*g-h*A-w*R)*_,t[8]=(h*y-p*g+w*d)*_,t):null},mat3.str=function(t){return"mat3("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+")"},mat3.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2))},module.exports=mat3;
-	},{"./common.js":117}],121:[function(require,module,exports){
-	var glMatrix=require("./common.js"),mat4={};mat4.create=function(){var t=new glMatrix.ARRAY_TYPE(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4.clone=function(t){var a=new glMatrix.ARRAY_TYPE(16);return a[0]=t[0],a[1]=t[1],a[2]=t[2],a[3]=t[3],a[4]=t[4],a[5]=t[5],a[6]=t[6],a[7]=t[7],a[8]=t[8],a[9]=t[9],a[10]=t[10],a[11]=t[11],a[12]=t[12],a[13]=t[13],a[14]=t[14],a[15]=t[15],a},mat4.copy=function(t,a){return t[0]=a[0],t[1]=a[1],t[2]=a[2],t[3]=a[3],t[4]=a[4],t[5]=a[5],t[6]=a[6],t[7]=a[7],t[8]=a[8],t[9]=a[9],t[10]=a[10],t[11]=a[11],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15],t},mat4.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4.transpose=function(t,a){if(t===a){var r=a[1],n=a[2],o=a[3],e=a[6],i=a[7],u=a[11];t[1]=a[4],t[2]=a[8],t[3]=a[12],t[4]=r,t[6]=a[9],t[7]=a[13],t[8]=n,t[9]=e,t[11]=a[14],t[12]=o,t[13]=i,t[14]=u}else t[0]=a[0],t[1]=a[4],t[2]=a[8],t[3]=a[12],t[4]=a[1],t[5]=a[5],t[6]=a[9],t[7]=a[13],t[8]=a[2],t[9]=a[6],t[10]=a[10],t[11]=a[14],t[12]=a[3],t[13]=a[7],t[14]=a[11],t[15]=a[15];return t},mat4.invert=function(t,a){var r=a[0],n=a[1],o=a[2],e=a[3],i=a[4],u=a[5],M=a[6],m=a[7],h=a[8],c=a[9],f=a[10],s=a[11],l=a[12],v=a[13],p=a[14],w=a[15],g=r*u-n*i,P=r*M-o*i,R=r*m-e*i,x=n*M-o*u,I=n*m-e*u,S=o*m-e*M,d=h*v-c*l,q=h*p-f*l,E=h*w-s*l,O=c*p-f*v,b=c*w-s*v,T=f*w-s*p,Y=g*T-P*b+R*O+x*E-I*q+S*d;return Y?(Y=1/Y,t[0]=(u*T-M*b+m*O)*Y,t[1]=(o*b-n*T-e*O)*Y,t[2]=(v*S-p*I+w*x)*Y,t[3]=(f*I-c*S-s*x)*Y,t[4]=(M*E-i*T-m*q)*Y,t[5]=(r*T-o*E+e*q)*Y,t[6]=(p*R-l*S-w*P)*Y,t[7]=(h*S-f*R+s*P)*Y,t[8]=(i*b-u*E+m*d)*Y,t[9]=(n*E-r*b-e*d)*Y,t[10]=(l*I-v*R+w*g)*Y,t[11]=(c*R-h*I-s*g)*Y,t[12]=(u*q-i*O-M*d)*Y,t[13]=(r*O-n*q+o*d)*Y,t[14]=(v*P-l*x-p*g)*Y,t[15]=(h*x-c*P+f*g)*Y,t):null},mat4.adjoint=function(t,a){var r=a[0],n=a[1],o=a[2],e=a[3],i=a[4],u=a[5],M=a[6],m=a[7],h=a[8],c=a[9],f=a[10],s=a[11],l=a[12],v=a[13],p=a[14],w=a[15];return t[0]=u*(f*w-s*p)-c*(M*w-m*p)+v*(M*s-m*f),t[1]=-(n*(f*w-s*p)-c*(o*w-e*p)+v*(o*s-e*f)),t[2]=n*(M*w-m*p)-u*(o*w-e*p)+v*(o*m-e*M),t[3]=-(n*(M*s-m*f)-u*(o*s-e*f)+c*(o*m-e*M)),t[4]=-(i*(f*w-s*p)-h*(M*w-m*p)+l*(M*s-m*f)),t[5]=r*(f*w-s*p)-h*(o*w-e*p)+l*(o*s-e*f),t[6]=-(r*(M*w-m*p)-i*(o*w-e*p)+l*(o*m-e*M)),t[7]=r*(M*s-m*f)-i*(o*s-e*f)+h*(o*m-e*M),t[8]=i*(c*w-s*v)-h*(u*w-m*v)+l*(u*s-m*c),t[9]=-(r*(c*w-s*v)-h*(n*w-e*v)+l*(n*s-e*c)),t[10]=r*(u*w-m*v)-i*(n*w-e*v)+l*(n*m-e*u),t[11]=-(r*(u*s-m*c)-i*(n*s-e*c)+h*(n*m-e*u)),t[12]=-(i*(c*p-f*v)-h*(u*p-M*v)+l*(u*f-M*c)),t[13]=r*(c*p-f*v)-h*(n*p-o*v)+l*(n*f-o*c),t[14]=-(r*(u*p-M*v)-i*(n*p-o*v)+l*(n*M-o*u)),t[15]=r*(u*f-M*c)-i*(n*f-o*c)+h*(n*M-o*u),t},mat4.determinant=function(t){var a=t[0],r=t[1],n=t[2],o=t[3],e=t[4],i=t[5],u=t[6],M=t[7],m=t[8],h=t[9],c=t[10],f=t[11],s=t[12],l=t[13],v=t[14],p=t[15],w=a*i-r*e,g=a*u-n*e,P=a*M-o*e,R=r*u-n*i,x=r*M-o*i,I=n*M-o*u,S=m*l-h*s,d=m*v-c*s,q=m*p-f*s,E=h*v-c*l,O=h*p-f*l,b=c*p-f*v;return w*b-g*O+P*E+R*q-x*d+I*S},mat4.multiply=function(t,a,r){var n=a[0],o=a[1],e=a[2],i=a[3],u=a[4],M=a[5],m=a[6],h=a[7],c=a[8],f=a[9],s=a[10],l=a[11],v=a[12],p=a[13],w=a[14],g=a[15],P=r[0],R=r[1],x=r[2],I=r[3];return t[0]=P*n+R*u+x*c+I*v,t[1]=P*o+R*M+x*f+I*p,t[2]=P*e+R*m+x*s+I*w,t[3]=P*i+R*h+x*l+I*g,P=r[4],R=r[5],x=r[6],I=r[7],t[4]=P*n+R*u+x*c+I*v,t[5]=P*o+R*M+x*f+I*p,t[6]=P*e+R*m+x*s+I*w,t[7]=P*i+R*h+x*l+I*g,P=r[8],R=r[9],x=r[10],I=r[11],t[8]=P*n+R*u+x*c+I*v,t[9]=P*o+R*M+x*f+I*p,t[10]=P*e+R*m+x*s+I*w,t[11]=P*i+R*h+x*l+I*g,P=r[12],R=r[13],x=r[14],I=r[15],t[12]=P*n+R*u+x*c+I*v,t[13]=P*o+R*M+x*f+I*p,t[14]=P*e+R*m+x*s+I*w,t[15]=P*i+R*h+x*l+I*g,t},mat4.mul=mat4.multiply,mat4.translate=function(t,a,r){var n,o,e,i,u,M,m,h,c,f,s,l,v=r[0],p=r[1],w=r[2];return a===t?(t[12]=a[0]*v+a[4]*p+a[8]*w+a[12],t[13]=a[1]*v+a[5]*p+a[9]*w+a[13],t[14]=a[2]*v+a[6]*p+a[10]*w+a[14],t[15]=a[3]*v+a[7]*p+a[11]*w+a[15]):(n=a[0],o=a[1],e=a[2],i=a[3],u=a[4],M=a[5],m=a[6],h=a[7],c=a[8],f=a[9],s=a[10],l=a[11],t[0]=n,t[1]=o,t[2]=e,t[3]=i,t[4]=u,t[5]=M,t[6]=m,t[7]=h,t[8]=c,t[9]=f,t[10]=s,t[11]=l,t[12]=n*v+u*p+c*w+a[12],t[13]=o*v+M*p+f*w+a[13],t[14]=e*v+m*p+s*w+a[14],t[15]=i*v+h*p+l*w+a[15]),t},mat4.scale=function(t,a,r){var n=r[0],o=r[1],e=r[2];return t[0]=a[0]*n,t[1]=a[1]*n,t[2]=a[2]*n,t[3]=a[3]*n,t[4]=a[4]*o,t[5]=a[5]*o,t[6]=a[6]*o,t[7]=a[7]*o,t[8]=a[8]*e,t[9]=a[9]*e,t[10]=a[10]*e,t[11]=a[11]*e,t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15],t},mat4.rotate=function(t,a,r,n){var o,e,i,u,M,m,h,c,f,s,l,v,p,w,g,P,R,x,I,S,d,q,E,O,b=n[0],T=n[1],Y=n[2],y=Math.sqrt(b*b+T*T+Y*Y);return Math.abs(y)<glMatrix.EPSILON?null:(y=1/y,b*=y,T*=y,Y*=y,o=Math.sin(r),e=Math.cos(r),i=1-e,u=a[0],M=a[1],m=a[2],h=a[3],c=a[4],f=a[5],s=a[6],l=a[7],v=a[8],p=a[9],w=a[10],g=a[11],P=b*b*i+e,R=T*b*i+Y*o,x=Y*b*i-T*o,I=b*T*i-Y*o,S=T*T*i+e,d=Y*T*i+b*o,q=b*Y*i+T*o,E=T*Y*i-b*o,O=Y*Y*i+e,t[0]=u*P+c*R+v*x,t[1]=M*P+f*R+p*x,t[2]=m*P+s*R+w*x,t[3]=h*P+l*R+g*x,t[4]=u*I+c*S+v*d,t[5]=M*I+f*S+p*d,t[6]=m*I+s*S+w*d,t[7]=h*I+l*S+g*d,t[8]=u*q+c*E+v*O,t[9]=M*q+f*E+p*O,t[10]=m*q+s*E+w*O,t[11]=h*q+l*E+g*O,a!==t&&(t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]),t)},mat4.rotateX=function(t,a,r){var n=Math.sin(r),o=Math.cos(r),e=a[4],i=a[5],u=a[6],M=a[7],m=a[8],h=a[9],c=a[10],f=a[11];return a!==t&&(t[0]=a[0],t[1]=a[1],t[2]=a[2],t[3]=a[3],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]),t[4]=e*o+m*n,t[5]=i*o+h*n,t[6]=u*o+c*n,t[7]=M*o+f*n,t[8]=m*o-e*n,t[9]=h*o-i*n,t[10]=c*o-u*n,t[11]=f*o-M*n,t},mat4.rotateY=function(t,a,r){var n=Math.sin(r),o=Math.cos(r),e=a[0],i=a[1],u=a[2],M=a[3],m=a[8],h=a[9],c=a[10],f=a[11];return a!==t&&(t[4]=a[4],t[5]=a[5],t[6]=a[6],t[7]=a[7],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]),t[0]=e*o-m*n,t[1]=i*o-h*n,t[2]=u*o-c*n,t[3]=M*o-f*n,t[8]=e*n+m*o,t[9]=i*n+h*o,t[10]=u*n+c*o,t[11]=M*n+f*o,t},mat4.rotateZ=function(t,a,r){var n=Math.sin(r),o=Math.cos(r),e=a[0],i=a[1],u=a[2],M=a[3],m=a[4],h=a[5],c=a[6],f=a[7];return a!==t&&(t[8]=a[8],t[9]=a[9],t[10]=a[10],t[11]=a[11],t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]),t[0]=e*o+m*n,t[1]=i*o+h*n,t[2]=u*o+c*n,t[3]=M*o+f*n,t[4]=m*o-e*n,t[5]=h*o-i*n,t[6]=c*o-u*n,t[7]=f*o-M*n,t},mat4.fromTranslation=function(t,a){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=a[0],t[13]=a[1],t[14]=a[2],t[15]=1,t},mat4.fromScaling=function(t,a){return t[0]=a[0],t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a[1],t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=a[2],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4.fromRotation=function(t,a,r){var n,o,e,i=r[0],u=r[1],M=r[2],m=Math.sqrt(i*i+u*u+M*M);return Math.abs(m)<glMatrix.EPSILON?null:(m=1/m,i*=m,u*=m,M*=m,n=Math.sin(a),o=Math.cos(a),e=1-o,t[0]=i*i*e+o,t[1]=u*i*e+M*n,t[2]=M*i*e-u*n,t[3]=0,t[4]=i*u*e-M*n,t[5]=u*u*e+o,t[6]=M*u*e+i*n,t[7]=0,t[8]=i*M*e+u*n,t[9]=u*M*e-i*n,t[10]=M*M*e+o,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t)},mat4.fromXRotation=function(t,a){var r=Math.sin(a),n=Math.cos(a);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=n,t[6]=r,t[7]=0,t[8]=0,t[9]=-r,t[10]=n,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4.fromYRotation=function(t,a){var r=Math.sin(a),n=Math.cos(a);return t[0]=n,t[1]=0,t[2]=-r,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=r,t[9]=0,t[10]=n,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4.fromZRotation=function(t,a){var r=Math.sin(a),n=Math.cos(a);return t[0]=n,t[1]=r,t[2]=0,t[3]=0,t[4]=-r,t[5]=n,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4.fromRotationTranslation=function(t,a,r){var n=a[0],o=a[1],e=a[2],i=a[3],u=n+n,M=o+o,m=e+e,h=n*u,c=n*M,f=n*m,s=o*M,l=o*m,v=e*m,p=i*u,w=i*M,g=i*m;return t[0]=1-(s+v),t[1]=c+g,t[2]=f-w,t[3]=0,t[4]=c-g,t[5]=1-(h+v),t[6]=l+p,t[7]=0,t[8]=f+w,t[9]=l-p,t[10]=1-(h+s),t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t},mat4.fromRotationTranslationScale=function(t,a,r,n){var o=a[0],e=a[1],i=a[2],u=a[3],M=o+o,m=e+e,h=i+i,c=o*M,f=o*m,s=o*h,l=e*m,v=e*h,p=i*h,w=u*M,g=u*m,P=u*h,R=n[0],x=n[1],I=n[2];return t[0]=(1-(l+p))*R,t[1]=(f+P)*R,t[2]=(s-g)*R,t[3]=0,t[4]=(f-P)*x,t[5]=(1-(c+p))*x,t[6]=(v+w)*x,t[7]=0,t[8]=(s+g)*I,t[9]=(v-w)*I,t[10]=(1-(c+l))*I,t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t},mat4.fromRotationTranslationScaleOrigin=function(t,a,r,n,o){var e=a[0],i=a[1],u=a[2],M=a[3],m=e+e,h=i+i,c=u+u,f=e*m,s=e*h,l=e*c,v=i*h,p=i*c,w=u*c,g=M*m,P=M*h,R=M*c,x=n[0],I=n[1],S=n[2],d=o[0],q=o[1],E=o[2];return t[0]=(1-(v+w))*x,t[1]=(s+R)*x,t[2]=(l-P)*x,t[3]=0,t[4]=(s-R)*I,t[5]=(1-(f+w))*I,t[6]=(p+g)*I,t[7]=0,t[8]=(l+P)*S,t[9]=(p-g)*S,t[10]=(1-(f+v))*S,t[11]=0,t[12]=r[0]+d-(t[0]*d+t[4]*q+t[8]*E),t[13]=r[1]+q-(t[1]*d+t[5]*q+t[9]*E),t[14]=r[2]+E-(t[2]*d+t[6]*q+t[10]*E),t[15]=1,t},mat4.fromQuat=function(t,a){var r=a[0],n=a[1],o=a[2],e=a[3],i=r+r,u=n+n,M=o+o,m=r*i,h=n*i,c=n*u,f=o*i,s=o*u,l=o*M,v=e*i,p=e*u,w=e*M;return t[0]=1-c-l,t[1]=h+w,t[2]=f-p,t[3]=0,t[4]=h-w,t[5]=1-m-l,t[6]=s+v,t[7]=0,t[8]=f+p,t[9]=s-v,t[10]=1-m-c,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},mat4.frustum=function(t,a,r,n,o,e,i){var u=1/(r-a),M=1/(o-n),m=1/(e-i);return t[0]=2*e*u,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*e*M,t[6]=0,t[7]=0,t[8]=(r+a)*u,t[9]=(o+n)*M,t[10]=(i+e)*m,t[11]=-1,t[12]=0,t[13]=0,t[14]=i*e*2*m,t[15]=0,t},mat4.perspective=function(t,a,r,n,o){var e=1/Math.tan(a/2),i=1/(n-o);return t[0]=e/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=(o+n)*i,t[11]=-1,t[12]=0,t[13]=0,t[14]=2*o*n*i,t[15]=0,t},mat4.perspectiveFromFieldOfView=function(t,a,r,n){var o=Math.tan(a.upDegrees*Math.PI/180),e=Math.tan(a.downDegrees*Math.PI/180),i=Math.tan(a.leftDegrees*Math.PI/180),u=Math.tan(a.rightDegrees*Math.PI/180),M=2/(i+u),m=2/(o+e);return t[0]=M,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=m,t[6]=0,t[7]=0,t[8]=-((i-u)*M*.5),t[9]=(o-e)*m*.5,t[10]=n/(r-n),t[11]=-1,t[12]=0,t[13]=0,t[14]=n*r/(r-n),t[15]=0,t},mat4.ortho=function(t,a,r,n,o,e,i){var u=1/(a-r),M=1/(n-o),m=1/(e-i);return t[0]=-2*u,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*M,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*m,t[11]=0,t[12]=(a+r)*u,t[13]=(o+n)*M,t[14]=(i+e)*m,t[15]=1,t},mat4.lookAt=function(t,a,r,n){var o,e,i,u,M,m,h,c,f,s,l=a[0],v=a[1],p=a[2],w=n[0],g=n[1],P=n[2],R=r[0],x=r[1],I=r[2];return Math.abs(l-R)<glMatrix.EPSILON&&Math.abs(v-x)<glMatrix.EPSILON&&Math.abs(p-I)<glMatrix.EPSILON?mat4.identity(t):(h=l-R,c=v-x,f=p-I,s=1/Math.sqrt(h*h+c*c+f*f),h*=s,c*=s,f*=s,o=g*f-P*c,e=P*h-w*f,i=w*c-g*h,s=Math.sqrt(o*o+e*e+i*i),s?(s=1/s,o*=s,e*=s,i*=s):(o=0,e=0,i=0),u=c*i-f*e,M=f*o-h*i,m=h*e-c*o,s=Math.sqrt(u*u+M*M+m*m),s?(s=1/s,u*=s,M*=s,m*=s):(u=0,M=0,m=0),t[0]=o,t[1]=u,t[2]=h,t[3]=0,t[4]=e,t[5]=M,t[6]=c,t[7]=0,t[8]=i,t[9]=m,t[10]=f,t[11]=0,t[12]=-(o*l+e*v+i*p),t[13]=-(u*l+M*v+m*p),t[14]=-(h*l+c*v+f*p),t[15]=1,t)},mat4.str=function(t){return"mat4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+", "+t[9]+", "+t[10]+", "+t[11]+", "+t[12]+", "+t[13]+", "+t[14]+", "+t[15]+")"},mat4.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2)+Math.pow(t[9],2)+Math.pow(t[10],2)+Math.pow(t[11],2)+Math.pow(t[12],2)+Math.pow(t[13],2)+Math.pow(t[14],2)+Math.pow(t[15],2))},module.exports=mat4;
-	},{"./common.js":117}],122:[function(require,module,exports){
-	var glMatrix=require("./common.js"),mat3=require("./mat3.js"),vec3=require("./vec3.js"),vec4=require("./vec4.js"),quat={};quat.create=function(){var t=new glMatrix.ARRAY_TYPE(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},quat.rotationTo=function(){var t=vec3.create(),a=vec3.fromValues(1,0,0),e=vec3.fromValues(0,1,0);return function(r,u,n){var c=vec3.dot(u,n);return-.999999>c?(vec3.cross(t,a,u),vec3.length(t)<1e-6&&vec3.cross(t,e,u),vec3.normalize(t,t),quat.setAxisAngle(r,t,Math.PI),r):c>.999999?(r[0]=0,r[1]=0,r[2]=0,r[3]=1,r):(vec3.cross(t,u,n),r[0]=t[0],r[1]=t[1],r[2]=t[2],r[3]=1+c,quat.normalize(r,r))}}(),quat.setAxes=function(){var t=mat3.create();return function(a,e,r,u){return t[0]=r[0],t[3]=r[1],t[6]=r[2],t[1]=u[0],t[4]=u[1],t[7]=u[2],t[2]=-e[0],t[5]=-e[1],t[8]=-e[2],quat.normalize(a,quat.fromMat3(a,t))}}(),quat.clone=vec4.clone,quat.fromValues=vec4.fromValues,quat.copy=vec4.copy,quat.set=vec4.set,quat.identity=function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},quat.setAxisAngle=function(t,a,e){e=.5*e;var r=Math.sin(e);return t[0]=r*a[0],t[1]=r*a[1],t[2]=r*a[2],t[3]=Math.cos(e),t},quat.add=vec4.add,quat.multiply=function(t,a,e){var r=a[0],u=a[1],n=a[2],c=a[3],q=e[0],o=e[1],s=e[2],i=e[3];return t[0]=r*i+c*q+u*s-n*o,t[1]=u*i+c*o+n*q-r*s,t[2]=n*i+c*s+r*o-u*q,t[3]=c*i-r*q-u*o-n*s,t},quat.mul=quat.multiply,quat.scale=vec4.scale,quat.rotateX=function(t,a,e){e*=.5;var r=a[0],u=a[1],n=a[2],c=a[3],q=Math.sin(e),o=Math.cos(e);return t[0]=r*o+c*q,t[1]=u*o+n*q,t[2]=n*o-u*q,t[3]=c*o-r*q,t},quat.rotateY=function(t,a,e){e*=.5;var r=a[0],u=a[1],n=a[2],c=a[3],q=Math.sin(e),o=Math.cos(e);return t[0]=r*o-n*q,t[1]=u*o+c*q,t[2]=n*o+r*q,t[3]=c*o-u*q,t},quat.rotateZ=function(t,a,e){e*=.5;var r=a[0],u=a[1],n=a[2],c=a[3],q=Math.sin(e),o=Math.cos(e);return t[0]=r*o+u*q,t[1]=u*o-r*q,t[2]=n*o+c*q,t[3]=c*o-n*q,t},quat.calculateW=function(t,a){var e=a[0],r=a[1],u=a[2];return t[0]=e,t[1]=r,t[2]=u,t[3]=Math.sqrt(Math.abs(1-e*e-r*r-u*u)),t},quat.dot=vec4.dot,quat.lerp=vec4.lerp,quat.slerp=function(t,a,e,r){var u,n,c,q,o,s=a[0],i=a[1],v=a[2],l=a[3],f=e[0],h=e[1],M=e[2],m=e[3];return n=s*f+i*h+v*M+l*m,0>n&&(n=-n,f=-f,h=-h,M=-M,m=-m),1-n>1e-6?(u=Math.acos(n),c=Math.sin(u),q=Math.sin((1-r)*u)/c,o=Math.sin(r*u)/c):(q=1-r,o=r),t[0]=q*s+o*f,t[1]=q*i+o*h,t[2]=q*v+o*M,t[3]=q*l+o*m,t},quat.sqlerp=function(){var t=quat.create(),a=quat.create();return function(e,r,u,n,c,q){return quat.slerp(t,r,c,q),quat.slerp(a,u,n,q),quat.slerp(e,t,a,2*q*(1-q)),e}}(),quat.invert=function(t,a){var e=a[0],r=a[1],u=a[2],n=a[3],c=e*e+r*r+u*u+n*n,q=c?1/c:0;return t[0]=-e*q,t[1]=-r*q,t[2]=-u*q,t[3]=n*q,t},quat.conjugate=function(t,a){return t[0]=-a[0],t[1]=-a[1],t[2]=-a[2],t[3]=a[3],t},quat.length=vec4.length,quat.len=quat.length,quat.squaredLength=vec4.squaredLength,quat.sqrLen=quat.squaredLength,quat.normalize=vec4.normalize,quat.fromMat3=function(t,a){var e,r=a[0]+a[4]+a[8];if(r>0)e=Math.sqrt(r+1),t[3]=.5*e,e=.5/e,t[0]=(a[5]-a[7])*e,t[1]=(a[6]-a[2])*e,t[2]=(a[1]-a[3])*e;else{var u=0;a[4]>a[0]&&(u=1),a[8]>a[3*u+u]&&(u=2);var n=(u+1)%3,c=(u+2)%3;e=Math.sqrt(a[3*u+u]-a[3*n+n]-a[3*c+c]+1),t[u]=.5*e,e=.5/e,t[3]=(a[3*n+c]-a[3*c+n])*e,t[n]=(a[3*n+u]+a[3*u+n])*e,t[c]=(a[3*c+u]+a[3*u+c])*e}return t},quat.str=function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},module.exports=quat;
-	},{"./common.js":117,"./mat3.js":120,"./vec3.js":124,"./vec4.js":125}],123:[function(require,module,exports){
-	var glMatrix=require("./common.js"),vec2={};vec2.create=function(){var n=new glMatrix.ARRAY_TYPE(2);return n[0]=0,n[1]=0,n},vec2.clone=function(n){var e=new glMatrix.ARRAY_TYPE(2);return e[0]=n[0],e[1]=n[1],e},vec2.fromValues=function(n,e){var r=new glMatrix.ARRAY_TYPE(2);return r[0]=n,r[1]=e,r},vec2.copy=function(n,e){return n[0]=e[0],n[1]=e[1],n},vec2.set=function(n,e,r){return n[0]=e,n[1]=r,n},vec2.add=function(n,e,r){return n[0]=e[0]+r[0],n[1]=e[1]+r[1],n},vec2.subtract=function(n,e,r){return n[0]=e[0]-r[0],n[1]=e[1]-r[1],n},vec2.sub=vec2.subtract,vec2.multiply=function(n,e,r){return n[0]=e[0]*r[0],n[1]=e[1]*r[1],n},vec2.mul=vec2.multiply,vec2.divide=function(n,e,r){return n[0]=e[0]/r[0],n[1]=e[1]/r[1],n},vec2.div=vec2.divide,vec2.min=function(n,e,r){return n[0]=Math.min(e[0],r[0]),n[1]=Math.min(e[1],r[1]),n},vec2.max=function(n,e,r){return n[0]=Math.max(e[0],r[0]),n[1]=Math.max(e[1],r[1]),n},vec2.scale=function(n,e,r){return n[0]=e[0]*r,n[1]=e[1]*r,n},vec2.scaleAndAdd=function(n,e,r,t){return n[0]=e[0]+r[0]*t,n[1]=e[1]+r[1]*t,n},vec2.distance=function(n,e){var r=e[0]-n[0],t=e[1]-n[1];return Math.sqrt(r*r+t*t)},vec2.dist=vec2.distance,vec2.squaredDistance=function(n,e){var r=e[0]-n[0],t=e[1]-n[1];return r*r+t*t},vec2.sqrDist=vec2.squaredDistance,vec2.length=function(n){var e=n[0],r=n[1];return Math.sqrt(e*e+r*r)},vec2.len=vec2.length,vec2.squaredLength=function(n){var e=n[0],r=n[1];return e*e+r*r},vec2.sqrLen=vec2.squaredLength,vec2.negate=function(n,e){return n[0]=-e[0],n[1]=-e[1],n},vec2.inverse=function(n,e){return n[0]=1/e[0],n[1]=1/e[1],n},vec2.normalize=function(n,e){var r=e[0],t=e[1],c=r*r+t*t;return c>0&&(c=1/Math.sqrt(c),n[0]=e[0]*c,n[1]=e[1]*c),n},vec2.dot=function(n,e){return n[0]*e[0]+n[1]*e[1]},vec2.cross=function(n,e,r){var t=e[0]*r[1]-e[1]*r[0];return n[0]=n[1]=0,n[2]=t,n},vec2.lerp=function(n,e,r,t){var c=e[0],u=e[1];return n[0]=c+t*(r[0]-c),n[1]=u+t*(r[1]-u),n},vec2.random=function(n,e){e=e||1;var r=2*glMatrix.RANDOM()*Math.PI;return n[0]=Math.cos(r)*e,n[1]=Math.sin(r)*e,n},vec2.transformMat2=function(n,e,r){var t=e[0],c=e[1];return n[0]=r[0]*t+r[2]*c,n[1]=r[1]*t+r[3]*c,n},vec2.transformMat2d=function(n,e,r){var t=e[0],c=e[1];return n[0]=r[0]*t+r[2]*c+r[4],n[1]=r[1]*t+r[3]*c+r[5],n},vec2.transformMat3=function(n,e,r){var t=e[0],c=e[1];return n[0]=r[0]*t+r[3]*c+r[6],n[1]=r[1]*t+r[4]*c+r[7],n},vec2.transformMat4=function(n,e,r){var t=e[0],c=e[1];return n[0]=r[0]*t+r[4]*c+r[12],n[1]=r[1]*t+r[5]*c+r[13],n},vec2.forEach=function(){var n=vec2.create();return function(e,r,t,c,u,v){var a,i;for(r||(r=2),t||(t=0),i=c?Math.min(c*r+t,e.length):e.length,a=t;i>a;a+=r)n[0]=e[a],n[1]=e[a+1],u(n,n,v),e[a]=n[0],e[a+1]=n[1];return e}}(),vec2.str=function(n){return"vec2("+n[0]+", "+n[1]+")"},module.exports=vec2;
-	},{"./common.js":117}],124:[function(require,module,exports){
-	var glMatrix=require("./common.js"),vec3={};vec3.create=function(){var n=new glMatrix.ARRAY_TYPE(3);return n[0]=0,n[1]=0,n[2]=0,n},vec3.clone=function(n){var t=new glMatrix.ARRAY_TYPE(3);return t[0]=n[0],t[1]=n[1],t[2]=n[2],t},vec3.fromValues=function(n,t,e){var r=new glMatrix.ARRAY_TYPE(3);return r[0]=n,r[1]=t,r[2]=e,r},vec3.copy=function(n,t){return n[0]=t[0],n[1]=t[1],n[2]=t[2],n},vec3.set=function(n,t,e,r){return n[0]=t,n[1]=e,n[2]=r,n},vec3.add=function(n,t,e){return n[0]=t[0]+e[0],n[1]=t[1]+e[1],n[2]=t[2]+e[2],n},vec3.subtract=function(n,t,e){return n[0]=t[0]-e[0],n[1]=t[1]-e[1],n[2]=t[2]-e[2],n},vec3.sub=vec3.subtract,vec3.multiply=function(n,t,e){return n[0]=t[0]*e[0],n[1]=t[1]*e[1],n[2]=t[2]*e[2],n},vec3.mul=vec3.multiply,vec3.divide=function(n,t,e){return n[0]=t[0]/e[0],n[1]=t[1]/e[1],n[2]=t[2]/e[2],n},vec3.div=vec3.divide,vec3.min=function(n,t,e){return n[0]=Math.min(t[0],e[0]),n[1]=Math.min(t[1],e[1]),n[2]=Math.min(t[2],e[2]),n},vec3.max=function(n,t,e){return n[0]=Math.max(t[0],e[0]),n[1]=Math.max(t[1],e[1]),n[2]=Math.max(t[2],e[2]),n},vec3.scale=function(n,t,e){return n[0]=t[0]*e,n[1]=t[1]*e,n[2]=t[2]*e,n},vec3.scaleAndAdd=function(n,t,e,r){return n[0]=t[0]+e[0]*r,n[1]=t[1]+e[1]*r,n[2]=t[2]+e[2]*r,n},vec3.distance=function(n,t){var e=t[0]-n[0],r=t[1]-n[1],c=t[2]-n[2];return Math.sqrt(e*e+r*r+c*c)},vec3.dist=vec3.distance,vec3.squaredDistance=function(n,t){var e=t[0]-n[0],r=t[1]-n[1],c=t[2]-n[2];return e*e+r*r+c*c},vec3.sqrDist=vec3.squaredDistance,vec3.length=function(n){var t=n[0],e=n[1],r=n[2];return Math.sqrt(t*t+e*e+r*r)},vec3.len=vec3.length,vec3.squaredLength=function(n){var t=n[0],e=n[1],r=n[2];return t*t+e*e+r*r},vec3.sqrLen=vec3.squaredLength,vec3.negate=function(n,t){return n[0]=-t[0],n[1]=-t[1],n[2]=-t[2],n},vec3.inverse=function(n,t){return n[0]=1/t[0],n[1]=1/t[1],n[2]=1/t[2],n},vec3.normalize=function(n,t){var e=t[0],r=t[1],c=t[2],a=e*e+r*r+c*c;return a>0&&(a=1/Math.sqrt(a),n[0]=t[0]*a,n[1]=t[1]*a,n[2]=t[2]*a),n},vec3.dot=function(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]},vec3.cross=function(n,t,e){var r=t[0],c=t[1],a=t[2],u=e[0],v=e[1],i=e[2];return n[0]=c*i-a*v,n[1]=a*u-r*i,n[2]=r*v-c*u,n},vec3.lerp=function(n,t,e,r){var c=t[0],a=t[1],u=t[2];return n[0]=c+r*(e[0]-c),n[1]=a+r*(e[1]-a),n[2]=u+r*(e[2]-u),n},vec3.hermite=function(n,t,e,r,c,a){var u=a*a,v=u*(2*a-3)+1,i=u*(a-2)+a,o=u*(a-1),s=u*(3-2*a);return n[0]=t[0]*v+e[0]*i+r[0]*o+c[0]*s,n[1]=t[1]*v+e[1]*i+r[1]*o+c[1]*s,n[2]=t[2]*v+e[2]*i+r[2]*o+c[2]*s,n},vec3.bezier=function(n,t,e,r,c,a){var u=1-a,v=u*u,i=a*a,o=v*u,s=3*a*v,f=3*i*u,M=i*a;return n[0]=t[0]*o+e[0]*s+r[0]*f+c[0]*M,n[1]=t[1]*o+e[1]*s+r[1]*f+c[1]*M,n[2]=t[2]*o+e[2]*s+r[2]*f+c[2]*M,n},vec3.random=function(n,t){t=t||1;var e=2*glMatrix.RANDOM()*Math.PI,r=2*glMatrix.RANDOM()-1,c=Math.sqrt(1-r*r)*t;return n[0]=Math.cos(e)*c,n[1]=Math.sin(e)*c,n[2]=r*t,n},vec3.transformMat4=function(n,t,e){var r=t[0],c=t[1],a=t[2],u=e[3]*r+e[7]*c+e[11]*a+e[15];return u=u||1,n[0]=(e[0]*r+e[4]*c+e[8]*a+e[12])/u,n[1]=(e[1]*r+e[5]*c+e[9]*a+e[13])/u,n[2]=(e[2]*r+e[6]*c+e[10]*a+e[14])/u,n},vec3.transformMat3=function(n,t,e){var r=t[0],c=t[1],a=t[2];return n[0]=r*e[0]+c*e[3]+a*e[6],n[1]=r*e[1]+c*e[4]+a*e[7],n[2]=r*e[2]+c*e[5]+a*e[8],n},vec3.transformQuat=function(n,t,e){var r=t[0],c=t[1],a=t[2],u=e[0],v=e[1],i=e[2],o=e[3],s=o*r+v*a-i*c,f=o*c+i*r-u*a,M=o*a+u*c-v*r,h=-u*r-v*c-i*a;return n[0]=s*o+h*-u+f*-i-M*-v,n[1]=f*o+h*-v+M*-u-s*-i,n[2]=M*o+h*-i+s*-v-f*-u,n},vec3.rotateX=function(n,t,e,r){var c=[],a=[];return c[0]=t[0]-e[0],c[1]=t[1]-e[1],c[2]=t[2]-e[2],a[0]=c[0],a[1]=c[1]*Math.cos(r)-c[2]*Math.sin(r),a[2]=c[1]*Math.sin(r)+c[2]*Math.cos(r),n[0]=a[0]+e[0],n[1]=a[1]+e[1],n[2]=a[2]+e[2],n},vec3.rotateY=function(n,t,e,r){var c=[],a=[];return c[0]=t[0]-e[0],c[1]=t[1]-e[1],c[2]=t[2]-e[2],a[0]=c[2]*Math.sin(r)+c[0]*Math.cos(r),a[1]=c[1],a[2]=c[2]*Math.cos(r)-c[0]*Math.sin(r),n[0]=a[0]+e[0],n[1]=a[1]+e[1],n[2]=a[2]+e[2],n},vec3.rotateZ=function(n,t,e,r){var c=[],a=[];return c[0]=t[0]-e[0],c[1]=t[1]-e[1],c[2]=t[2]-e[2],a[0]=c[0]*Math.cos(r)-c[1]*Math.sin(r),a[1]=c[0]*Math.sin(r)+c[1]*Math.cos(r),a[2]=c[2],n[0]=a[0]+e[0],n[1]=a[1]+e[1],n[2]=a[2]+e[2],n},vec3.forEach=function(){var n=vec3.create();return function(t,e,r,c,a,u){var v,i;for(e||(e=3),r||(r=0),i=c?Math.min(c*e+r,t.length):t.length,v=r;i>v;v+=e)n[0]=t[v],n[1]=t[v+1],n[2]=t[v+2],a(n,n,u),t[v]=n[0],t[v+1]=n[1],t[v+2]=n[2];return t}}(),vec3.angle=function(n,t){var e=vec3.fromValues(n[0],n[1],n[2]),r=vec3.fromValues(t[0],t[1],t[2]);vec3.normalize(e,e),vec3.normalize(r,r);var c=vec3.dot(e,r);return c>1?0:Math.acos(c)},vec3.str=function(n){return"vec3("+n[0]+", "+n[1]+", "+n[2]+")"},module.exports=vec3;
-	},{"./common.js":117}],125:[function(require,module,exports){
-	var glMatrix=require("./common.js"),vec4={};vec4.create=function(){var e=new glMatrix.ARRAY_TYPE(4);return e[0]=0,e[1]=0,e[2]=0,e[3]=0,e},vec4.clone=function(e){var n=new glMatrix.ARRAY_TYPE(4);return n[0]=e[0],n[1]=e[1],n[2]=e[2],n[3]=e[3],n},vec4.fromValues=function(e,n,t,r){var c=new glMatrix.ARRAY_TYPE(4);return c[0]=e,c[1]=n,c[2]=t,c[3]=r,c},vec4.copy=function(e,n){return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e},vec4.set=function(e,n,t,r,c){return e[0]=n,e[1]=t,e[2]=r,e[3]=c,e},vec4.add=function(e,n,t){return e[0]=n[0]+t[0],e[1]=n[1]+t[1],e[2]=n[2]+t[2],e[3]=n[3]+t[3],e},vec4.subtract=function(e,n,t){return e[0]=n[0]-t[0],e[1]=n[1]-t[1],e[2]=n[2]-t[2],e[3]=n[3]-t[3],e},vec4.sub=vec4.subtract,vec4.multiply=function(e,n,t){return e[0]=n[0]*t[0],e[1]=n[1]*t[1],e[2]=n[2]*t[2],e[3]=n[3]*t[3],e},vec4.mul=vec4.multiply,vec4.divide=function(e,n,t){return e[0]=n[0]/t[0],e[1]=n[1]/t[1],e[2]=n[2]/t[2],e[3]=n[3]/t[3],e},vec4.div=vec4.divide,vec4.min=function(e,n,t){return e[0]=Math.min(n[0],t[0]),e[1]=Math.min(n[1],t[1]),e[2]=Math.min(n[2],t[2]),e[3]=Math.min(n[3],t[3]),e},vec4.max=function(e,n,t){return e[0]=Math.max(n[0],t[0]),e[1]=Math.max(n[1],t[1]),e[2]=Math.max(n[2],t[2]),e[3]=Math.max(n[3],t[3]),e},vec4.scale=function(e,n,t){return e[0]=n[0]*t,e[1]=n[1]*t,e[2]=n[2]*t,e[3]=n[3]*t,e},vec4.scaleAndAdd=function(e,n,t,r){return e[0]=n[0]+t[0]*r,e[1]=n[1]+t[1]*r,e[2]=n[2]+t[2]*r,e[3]=n[3]+t[3]*r,e},vec4.distance=function(e,n){var t=n[0]-e[0],r=n[1]-e[1],c=n[2]-e[2],u=n[3]-e[3];return Math.sqrt(t*t+r*r+c*c+u*u)},vec4.dist=vec4.distance,vec4.squaredDistance=function(e,n){var t=n[0]-e[0],r=n[1]-e[1],c=n[2]-e[2],u=n[3]-e[3];return t*t+r*r+c*c+u*u},vec4.sqrDist=vec4.squaredDistance,vec4.length=function(e){var n=e[0],t=e[1],r=e[2],c=e[3];return Math.sqrt(n*n+t*t+r*r+c*c)},vec4.len=vec4.length,vec4.squaredLength=function(e){var n=e[0],t=e[1],r=e[2],c=e[3];return n*n+t*t+r*r+c*c},vec4.sqrLen=vec4.squaredLength,vec4.negate=function(e,n){return e[0]=-n[0],e[1]=-n[1],e[2]=-n[2],e[3]=-n[3],e},vec4.inverse=function(e,n){return e[0]=1/n[0],e[1]=1/n[1],e[2]=1/n[2],e[3]=1/n[3],e},vec4.normalize=function(e,n){var t=n[0],r=n[1],c=n[2],u=n[3],a=t*t+r*r+c*c+u*u;return a>0&&(a=1/Math.sqrt(a),e[0]=t*a,e[1]=r*a,e[2]=c*a,e[3]=u*a),e},vec4.dot=function(e,n){return e[0]*n[0]+e[1]*n[1]+e[2]*n[2]+e[3]*n[3]},vec4.lerp=function(e,n,t,r){var c=n[0],u=n[1],a=n[2],v=n[3];return e[0]=c+r*(t[0]-c),e[1]=u+r*(t[1]-u),e[2]=a+r*(t[2]-a),e[3]=v+r*(t[3]-v),e},vec4.random=function(e,n){return n=n||1,e[0]=glMatrix.RANDOM(),e[1]=glMatrix.RANDOM(),e[2]=glMatrix.RANDOM(),e[3]=glMatrix.RANDOM(),vec4.normalize(e,e),vec4.scale(e,e,n),e},vec4.transformMat4=function(e,n,t){var r=n[0],c=n[1],u=n[2],a=n[3];return e[0]=t[0]*r+t[4]*c+t[8]*u+t[12]*a,e[1]=t[1]*r+t[5]*c+t[9]*u+t[13]*a,e[2]=t[2]*r+t[6]*c+t[10]*u+t[14]*a,e[3]=t[3]*r+t[7]*c+t[11]*u+t[15]*a,e},vec4.transformQuat=function(e,n,t){var r=n[0],c=n[1],u=n[2],a=t[0],v=t[1],i=t[2],o=t[3],f=o*r+v*u-i*c,s=o*c+i*r-a*u,l=o*u+a*c-v*r,M=-a*r-v*c-i*u;return e[0]=f*o+M*-a+s*-i-l*-v,e[1]=s*o+M*-v+l*-a-f*-i,e[2]=l*o+M*-i+f*-v-s*-a,e[3]=n[3],e},vec4.forEach=function(){var e=vec4.create();return function(n,t,r,c,u,a){var v,i;for(t||(t=4),r||(r=0),i=c?Math.min(c*t+r,n.length):n.length,v=r;i>v;v+=t)e[0]=n[v],e[1]=n[v+1],e[2]=n[v+2],e[3]=n[v+3],u(e,e,a),n[v]=e[0],n[v+1]=e[1],n[v+2]=e[2],n[v+3]=e[3];return n}}(),vec4.str=function(e){return"vec4("+e[0]+", "+e[1]+", "+e[2]+", "+e[3]+")"},module.exports=vec4;
-	},{"./common.js":117}],126:[function(require,module,exports){
-	exports.read=function(a,o,t,r,h){var M,p,w=8*h-r-1,f=(1<<w)-1,e=f>>1,i=-7,N=t?h-1:0,n=t?-1:1,s=a[o+N];for(N+=n,M=s&(1<<-i)-1,s>>=-i,i+=w;i>0;M=256*M+a[o+N],N+=n,i-=8);for(p=M&(1<<-i)-1,M>>=-i,i+=r;i>0;p=256*p+a[o+N],N+=n,i-=8);if(0===M)M=1-e;else{if(M===f)return p?NaN:(s?-1:1)*(1/0);p+=Math.pow(2,r),M-=e}return(s?-1:1)*p*Math.pow(2,M-r)},exports.write=function(a,o,t,r,h,M){var p,w,f,e=8*M-h-1,i=(1<<e)-1,N=i>>1,n=23===h?Math.pow(2,-24)-Math.pow(2,-77):0,s=r?0:M-1,u=r?1:-1,l=0>o||0===o&&0>1/o?1:0;for(o=Math.abs(o),isNaN(o)||o===1/0?(w=isNaN(o)?1:0,p=i):(p=Math.floor(Math.log(o)/Math.LN2),o*(f=Math.pow(2,-p))<1&&(p--,f*=2),o+=p+N>=1?n/f:n*Math.pow(2,1-N),o*f>=2&&(p++,f/=2),p+N>=i?(w=0,p=i):p+N>=1?(w=(o*f-1)*Math.pow(2,h),p+=N):(w=o*Math.pow(2,N-1)*Math.pow(2,h),p=0));h>=8;a[t+s]=255&w,s+=u,w/=256,h-=8);for(p=p<<h|w,e+=h;e>0;a[t+s]=255&p,s+=u,p/=256,e-=8);a[t+s-u]|=128*l};
-	},{}],127:[function(require,module,exports){
-	"function"==typeof Object.create?module.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(t,e){t.super_=e;var o=function(){};o.prototype=e.prototype,t.prototype=new o,t.prototype.constructor=t};
-	},{}],128:[function(require,module,exports){
-	"use strict";function constant(r){return function(){return r}}function interpolateNumber(r,t,n){return r*(1-n)+t*n}function interpolateArray(r,t,n){for(var e=[],o=0;o<r.length;o++)e[o]=interpolateNumber(r[o],t[o],n);return e}exports.interpolated=function(r){if(!r.stops)return constant(r);var t=r.stops,n=r.base||1,e=Array.isArray(t[0][1])?interpolateArray:interpolateNumber;return function(r){for(var o,a,i=0;i<t.length;i++){var u=t[i];if(u[0]<=r&&(o=u),u[0]>r){a=u;break}}if(o&&a){var s=a[0]-o[0],f=r-o[0],p=1===n?f/s:(Math.pow(n,f)-1)/(Math.pow(n,s)-1);return e(o[1],a[1],p)}return o?o[1]:a?a[1]:void 0}},exports["piecewise-constant"]=function(r){if(!r.stops)return constant(r);var t=r.stops;return function(r){for(var n=0;n<t.length;n++)if(t[n][0]>r)return t[0===n?0:n-1][1];return t[t.length-1][1]}};
-	},{}],129:[function(require,module,exports){
-	"use strict";var reference=require("../../reference/latest.min.js"),validate=require("./parsed");module.exports=function(e){return validate(e,reference)};
-	},{"../../reference/latest.min.js":132,"./parsed":130}],130:[function(require,module,exports){
-	"use strict";function typeof_(e){return e instanceof Number?"number":e instanceof String?"string":e instanceof Boolean?"boolean":Array.isArray(e)?"array":null===e?"null":typeof e}function unbundle(e){return e instanceof Number||e instanceof String||e instanceof Boolean?e.valueOf():e}var parseCSSColor=require("csscolorparser").parseCSSColor,format=require("util").format;module.exports=function(e,t){function r(e,t){var r={message:(e?e+": ":"")+format.apply(format,Array.prototype.slice.call(arguments,2))};null!==t&&void 0!==t&&t.__line__&&(r.line=t.__line__),s.push(r)}function n(e,o,i){var s=typeof_(o);if("string"===s&&"@"===o[0]){if(t.$version>7)return r(e,o,"constants have been deprecated as of v8");if(!(o in a))return r(e,o,'constant "%s" not found',o);o=a[o],s=typeof_(o)}if(i["function"]&&"object"===s)return n["function"](e,o,i);if(i.type){var u=n[i.type];if(u)return u(e,o,i);i=t[i.type]}n.object(e,o,i)}function o(e){return function(t,n,o){var a=typeof_(n);a!==e&&r(t,n,"%s expected, %s found",e,a),"minimum"in o&&n<o.minimum&&r(t,n,"%s is less than the minimum value %s",n,o.minimum),"maximum"in o&&n>o.maximum&&r(t,n,"%s is greater than the maximum value %s",n,o.maximum)}}var a=e.constants||{},i={},s=[];return n.constants=function(e,n){if(t.$version>7){if(n)return r(e,n,"constants have been deprecated as of v8")}else{var o=typeof_(n);if("object"!==o)return r(e,n,"object expected, %s found",o);for(var a in n)"@"!==a[0]&&r(e+"."+a,n[a],'constants must start with "@"')}},n.source=function(e,o){if(!o.type)return void r(e,o,'"type" is required');var a=unbundle(o.type);switch(a){case"vector":case"raster":if(n.object(e,o,t.source_tile),"url"in o)for(var i in o)["type","url","tileSize"].indexOf(i)<0&&r(e+"."+i,o[i],'a source with a "url" property may not include a "%s" property',i);break;case"geojson":n.object(e,o,t.source_geojson);break;case"video":n.object(e,o,t.source_video);break;case"image":n.object(e,o,t.source_image);break;default:n["enum"](e+".type",o.type,{values:["vector","raster","geojson","video","image"]})}},n.layer=function(o,a){a.type||a.ref||r(o,a,'either "type" or "ref" is required');var s=unbundle(a.type),u=unbundle(a.ref);if(a.id&&(i[a.id]?r(o,a.id,'duplicate layer id "%s", previously used at line %d',a.id,i[a.id]):i[a.id]=a.id.__line__),"ref"in a){["type","source","source-layer","filter","layout"].forEach(function(e){e in a&&r(o,a[e],'"%s" is prohibited for ref layers',e)});var c;e.layers.forEach(function(e){e.id==u&&(c=e)}),c?c.ref?r(o,a.ref,"ref cannot reference another ref layer"):s=c.type:r(o,a.ref,'ref layer "%s" not found',u)}else if("background"!==s)if(a.source){var f=e.sources[a.source];f?"vector"==f.type&&"raster"==s?r(o,a.source,'layer "%s" requires a raster source',a.id):"raster"==f.type&&"raster"!=s?r(o,a.source,'layer "%s" requires a vector source',a.id):"vector"!=f.type||a["source-layer"]||r(o,a,'layer "%s" must specify a "source-layer"',a.id):r(o,a.source,'source "%s" not found',a.source)}else r(o,a,'missing required property "source"');n.object(o,a,t.layer,{filter:n.filter,layout:function(e,r){var o=t["layout_"+s];return s&&o&&n(e,r,o)},paint:function(e,r){var o=t["paint_"+s];return s&&o&&n(e,r,o)}})},n.object=function(e,o,a,i){i=i||{};var s=typeof_(o);if("object"!==s)return r(e,o,"object expected, %s found",s);for(var u in o){var c=u.split(".")[0],f=a[c]||a["*"],l=c.match(/^(.*)-transition$/);f?(i[c]||n)((e?e+".":e)+u,o[u],f):l&&a[l[1]]&&a[l[1]].transition?n((e?e+".":e)+u,o[u],t.transition):""!==e&&1!==e.split(".").length&&r(e,o[u],'unknown property "%s"',u)}for(var p in a)a[p].required&&void 0===a[p]["default"]&&void 0===o[p]&&r(e,o,'missing required property "%s"',p)},n.array=function(t,o,a,i){if("array"!==typeof_(o))return r(t,o,"array expected, %s found",typeof_(o));if(a.length&&o.length!==a.length)return r(t,o,"array length %d expected, length %d found",a.length,o.length);if(a["min-length"]&&o.length<a["min-length"])return r(t,o,"array length at least %d expected, length %d found",a["min-length"],o.length);var s={type:a.value};e.version<7&&(s["function"]=a["function"]),"object"===typeof_(a.value)&&(s=a.value);for(var u=0;u<o.length;u++)(i||n)(t+"["+u+"]",o[u],s)},n.filter=function(e,o){var a;if("array"!==typeof_(o))return r(e,o,"array expected, %s found",typeof_(o));if(o.length<1)return r(e,o,"filter array must have at least 1 element");switch(n["enum"](e+"[0]",o[0],t.filter_operator),unbundle(o[0])){case"<":case"<=":case">":case">=":o.length>=2&&"$type"==o[1]&&r(e,o,'"$type" cannot be use with operator "%s"',o[0]);case"==":case"!=":3!=o.length&&r(e,o,'filter array for operator "%s" must have 3 elements',o[0]);case"in":case"!in":o.length>=2&&(a=typeof_(o[1]),"string"!==a?r(e+"[1]",o[1],"string expected, %s found",a):"@"===o[1][0]&&r(e+"[1]",o[1],"filter key cannot be a constant"));for(var i=2;i<o.length;i++)a=typeof_(o[i]),"$type"==o[1]?n["enum"](e+"["+i+"]",o[i],t.geometry_type):"string"===a&&"@"===o[i][0]?r(e+"["+i+"]",o[i],"filter value cannot be a constant"):"string"!==a&&"number"!==a&&"boolean"!==a&&r(e+"["+i+"]",o[i],"string, number, or boolean expected, %s found",a);break;case"any":case"all":case"none":for(i=1;i<o.length;i++)n.filter(e+"["+i+"]",o[i])}},n["function"]=function(e,o,a){n.object(e,o,t["function"],{stops:function(e,t,o){var i=-(1/0);n.array(e,t,o,function(e,t){return"array"!==typeof_(t)?r(e,t,"array expected, %s found",typeof_(t)):2!==t.length?r(e,t,"array length %d expected, length %d found",2,t.length):(n(e+"[0]",t[0],{type:"number"}),n(e+"[1]",t[1],a),void("number"===typeof_(t[0])&&("piecewise-constant"===a["function"]&&t[0]%1!==0&&r(e+"[0]",t[0],"zoom level for piecewise-constant functions must be an integer"),t[0]<=i&&r(e+"[0]",t[0],"array stops must appear in ascending order and have no duplicates"),i=t[0])))}),"array"===typeof_(t)&&0===t.length&&r(e,t,"array must have at least one stop")}})},n["enum"]=function(e,t,n){-1===n.values.indexOf(unbundle(t))&&r(e,t,"expected one of [%s], %s found",n.values.join(", "),t)},n.color=function(e,t){var n=typeof_(t);return"string"!==n?r(e,t,"color expected, %s found",n):null===parseCSSColor(t)?r(e,t,'color expected, "%s" found',t):void 0},n.number=o("number"),n.string=o("string"),n["boolean"]=o("boolean"),n["*"]=function(){},n("",e,t.$root),t.$version>7&&e.constants&&n.constants("constants",e.constants),s.sort(function(e,t){return e.line-t.line}),s};
-	},{"csscolorparser":107,"util":143}],131:[function(require,module,exports){
-	module.exports=require("./v8.json");
-	},{"./v8.json":133}],132:[function(require,module,exports){
-	module.exports=require("./v8.min.json");
-	},{"./v8.min.json":134}],133:[function(require,module,exports){
-	module.exports={"$version":8,"$root":{"version":{"required":true,"type":"enum","values":[8],"doc":"Stylesheet version number. Must be 8.","example":8},"name":{"type":"string","doc":"A human-readable name for the style.","example":"Bright"},"metadata":{"type":"*","doc":"Arbitrary properties useful to track with the stylesheet, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'."},"center":{"type":"array","value":"number","doc":"Default map center in longitude and latitude.  The style center will be used only if the map has not been positioned by other means (e.g. map options or user interaction).","example":[-73.9749,40.7736]},"zoom":{"type":"number","doc":"Default zoom level.  The style zoom will be used only if the map has not been positioned by other means (e.g. map options or user interaction).","example":12.5},"bearing":{"type":"number","default":0,"period":360,"units":"degrees","doc":"Default bearing, in degrees.  The style bearing will be used only if the map has not been positioned by other means (e.g. map options or user interaction).","example":29},"pitch":{"type":"number","default":0,"units":"degrees","doc":"Default pitch, in degrees. Zero is perpendicular to the surface.  The style pitch will be used only if the map has not been positioned by other means (e.g. map options or user interaction).","example":50},"sources":{"required":true,"type":"sources","doc":"Data source specifications.","example":{"mapbox-streets":{"type":"vector","url":"mapbox://mapbox.mapbox-streets-v6"}}},"sprite":{"type":"string","doc":"A base URL for retrieving the sprite image and metadata. The extensions `.png`, `.json` and scale factor `@2x.png` will be automatically appended.","example":"mapbox://sprites/mapbox/bright-v8"},"glyphs":{"type":"string","doc":"A URL template for loading signed-distance-field glyph sets in PBF format. Valid tokens are {fontstack} and {range}.","example":"mapbox://fonts/mapbox/{fontstack}/{range}.pbf"},"transition":{"type":"transition","doc":"A global transition definition to use as a default across properties.","example":{"duration":300,"delay":0}},"layers":{"required":true,"type":"array","value":"layer","doc":"Layers will be drawn in the order of this array.","example":[{"id":"water","source":"mapbox-streets","source-layer":"water","type":"fill","paint":{"fill-color":"#00ffff"}}]}},"sources":{"*":{"type":"source","doc":"Specification of a data source. For vector and raster sources, either TileJSON or a URL to a TileJSON must be provided. For GeoJSON and video sources, a URL must be provided."}},"source":["source_tile","source_geojson","source_video","source_image"],"source_tile":{"type":{"required":true,"type":"enum","values":["vector","raster"],"doc":"The data type of the tile source."},"url":{"type":"string","doc":"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<mapid>`."},"tiles":{"type":"array","value":"string","doc":"An array of one or more tile source URLs, as in the TileJSON spec."},"minzoom":{"type":"number","default":0,"doc":"Minimum zoom level for which tiles are available, as in the TileJSON spec."},"maxzoom":{"type":"number","default":22,"doc":"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels."},"tileSize":{"type":"number","default":512,"units":"pixels","doc":"The minimum visual size to display tiles for this layer. Only configurable for raster layers."},"*":{"type":"*","doc":"Other keys to configure the data source."}},"source_geojson":{"type":{"required":true,"type":"enum","values":["geojson"],"doc":"The data type of the GeoJSON source."},"data":{"type":"*","doc":"A URL to a GeoJSON file, or inline GeoJSON."},"maxzoom":{"type":"number","default":14,"doc":"Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom levels)."},"buffer":{"type":"number","default":64,"doc":"Tile buffer size on each side (higher means fewer rendering artifacts near tile edges but slower performance)."},"tolerance":{"type":"number","default":3,"doc":"Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance)."},"cluster":{"type":"boolean","default":false,"doc":"If the data is a collection of point features, setting this to true clusters the points by radius into groups."},"clusterRadius":{"type":"number","default":400,"doc":"Radius of each cluster when clustering points, relative to 4096 tile."},"clusterMaxZoom":{"type":"number","doc":"Max zoom to cluster points on. Defaults to one zoom less than maxzoom (so that last zoom features are not clustered)."}},"source_video":{"type":{"required":true,"type":"enum","values":["video"],"doc":"The data type of the video source."},"urls":{"required":true,"type":"array","value":"string","doc":"URLs to video content in order of preferred format."},"coordinates":{"required":true,"doc":"Corners of video specified in longitude, latitude pairs.","type":"array","length":4,"value":{"type":"array","length":2,"value":"number","doc":"A single longitude, latitude pair."}}},"source_image":{"type":{"required":true,"type":"enum","values":["image"],"doc":"The data type of the image source."},"url":{"required":true,"type":"string","doc":"URL that points to an image"},"coordinates":{"required":true,"doc":"Corners of image specified in longitude, latitude pairs.","type":"array","length":4,"value":{"type":"array","length":2,"value":"number","doc":"A single longitude, latitude pair."}}},"layer":{"id":{"type":"string","doc":"Unique layer name.","required":true},"type":{"type":"enum","values":["fill","line","symbol","circle","raster","background"],"doc":"Rendering type of this layer."},"metadata":{"type":"*","doc":"Arbitrary properties useful to track with the layer, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'."},"ref":{"type":"string","doc":"References another layer to copy `type`, `source`, `source-layer`, `minzoom`, `maxzoom`, `filter`, and `layout` properties from. This allows the layers to share processing and be more efficient."},"source":{"type":"string","doc":"Name of a source description to be used for this layer."},"source-layer":{"type":"string","doc":"Layer to use from a vector tile source. Required if the source supports multiple layers."},"minzoom":{"type":"number","minimum":0,"maximum":22,"doc":"The minimum zoom level on which the layer gets parsed and appears on."},"maxzoom":{"type":"number","minimum":0,"maximum":22,"doc":"The maximum zoom level on which the layer gets parsed and appears on."},"interactive":{"type":"boolean","doc":"Enable querying of feature data from this layer for interactivity.","default":false},"filter":{"type":"filter","doc":"A expression specifying conditions on source features. Only features that match the filter are displayed."},"layout":{"type":"layout","doc":"Layout properties for the layer."},"paint":{"type":"paint","doc":"Default paint properties for this layer."},"paint.*":{"type":"paint","doc":"Class-specific paint properties for this layer. The class name is the part after the first dot."}},"layout":["layout_fill","layout_line","layout_circle","layout_symbol","layout_raster","layout_background"],"layout_background":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_fill":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_circle":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_line":{"line-cap":{"type":"enum","function":"piecewise-constant","values":["butt","round","square"],"default":"butt","doc":"The display of line endings."},"line-join":{"type":"enum","function":"piecewise-constant","values":["bevel","round","miter"],"default":"miter","doc":"The display of lines when joining."},"line-miter-limit":{"type":"number","default":2,"function":"interpolated","doc":"Used to automatically convert miter joins to bevel joins for sharp angles.","requires":[{"line-join":"miter"}]},"line-round-limit":{"type":"number","default":1.05,"function":"interpolated","doc":"Used to automatically convert round joins to miter joins for shallow angles.","requires":[{"line-join":"round"}]},"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_symbol":{"symbol-placement":{"type":"enum","function":"piecewise-constant","values":["point","line"],"default":"point","doc":"Label placement relative to its geometry. `line` can only be used on LineStrings and Polygons."},"symbol-spacing":{"type":"number","default":250,"minimum":1,"function":"interpolated","units":"pixels","doc":"Distance between two symbol anchors.","requires":[{"symbol-placement":"line"}]},"symbol-avoid-edges":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer."},"icon-allow-overlap":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, the icon will be visible even if it collides with other previously drawn symbols.","requires":["icon-image"]},"icon-ignore-placement":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, other symbols can be visible even if they collide with the icon.","requires":["icon-image"]},"icon-optional":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not.","requires":["icon-image","text-field"]},"icon-rotation-alignment":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"viewport","doc":"Orientation of icon when map is rotated.","requires":["icon-image"]},"icon-size":{"type":"number","default":1,"minimum":0,"function":"interpolated","doc":"Scale factor for icon. 1 is original size, 3 triples the size.","requires":["icon-image"]},"icon-image":{"type":"string","function":"piecewise-constant","doc":"A string with {tokens} replaced, referencing the data property to pull from.","tokens":true},"icon-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","units":"degrees","doc":"Rotates the icon clockwise.","requires":["icon-image"]},"icon-padding":{"type":"number","default":2,"minimum":0,"function":"interpolated","units":"pixels","doc":"Size of the additional area around the icon bounding box used for detecting symbol collisions.","requires":["icon-image"]},"icon-keep-upright":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, the icon may be flipped to prevent it from being rendered upside-down.","requires":["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":"line"}]},"icon-offset":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","doc":"Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up.","requires":["icon-image"]},"text-rotation-alignment":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"viewport","doc":"Orientation of text when map is rotated.","requires":["text-field"]},"text-field":{"type":"string","function":"piecewise-constant","default":"","tokens":true,"doc":"Value to use for a text label. Feature properties are specified using tokens like {field_name}."},"text-font":{"type":"array","value":"string","function":"piecewise-constant","default":["Open Sans Regular","Arial Unicode MS Regular"],"doc":"Font stack to use for displaying text.","requires":["text-field"]},"text-size":{"type":"number","default":16,"minimum":0,"units":"pixels","function":"interpolated","doc":"Font size.","requires":["text-field"]},"text-max-width":{"type":"number","default":10,"minimum":0,"units":"em","function":"interpolated","doc":"The maximum line width for text wrapping.","requires":["text-field"]},"text-line-height":{"type":"number","default":1.2,"units":"em","function":"interpolated","doc":"Text leading value for multi-line text.","requires":["text-field"]},"text-letter-spacing":{"type":"number","default":0,"units":"em","function":"interpolated","doc":"Text tracking amount.","requires":["text-field"]},"text-justify":{"type":"enum","function":"piecewise-constant","values":["left","center","right"],"default":"center","doc":"Text justification options.","requires":["text-field"]},"text-anchor":{"type":"enum","function":"piecewise-constant","values":["center","left","right","top","bottom","top-left","top-right","bottom-left","bottom-right"],"default":"center","doc":"Part of the text placed closest to the anchor.","requires":["text-field"]},"text-max-angle":{"type":"number","default":45,"units":"degrees","function":"interpolated","doc":"Maximum angle change between adjacent characters.","requires":["text-field",{"symbol-placement":"line"}]},"text-rotate":{"type":"number","default":0,"period":360,"units":"degrees","function":"interpolated","doc":"Rotates the text clockwise.","requires":["text-field"]},"text-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","function":"interpolated","doc":"Size of the additional area around the text bounding box used for detecting symbol collisions.","requires":["text-field"]},"text-keep-upright":{"type":"boolean","function":"piecewise-constant","default":true,"doc":"If true, the text may be flipped vertically to prevent it from being rendered upside-down.","requires":["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":"line"}]},"text-transform":{"type":"enum","function":"piecewise-constant","values":["none","uppercase","lowercase"],"default":"none","doc":"Specifies how to capitalize text, similar to the CSS `text-transform` property.","requires":["text-field"]},"text-offset":{"type":"array","doc":"Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up.","value":"number","units":"ems","function":"interpolated","length":2,"default":[0,0],"requires":["text-field"]},"text-allow-overlap":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, the text will be visible even if it collides with other previously drawn symbols.","requires":["text-field"]},"text-ignore-placement":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, other symbols can be visible even if they collide with the text.","requires":["text-field"]},"text-optional":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not.","requires":["text-field","icon-image"]},"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_raster":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"filter":{"type":"array","value":"*","doc":"A filter selects specific features from a layer."},"filter_operator":{"type":"enum","values":["==","!=",">",">=","<","<=","in","!in","all","any","none"],"doc":"The filter operator."},"geometry_type":{"type":"enum","values":["Point","LineString","Polygon"],"doc":"The geometry type for the filter to select."},"color_operation":{"type":"enum","values":["lighten","saturate","spin","fade","mix"],"doc":"A color operation to apply."},"function":{"stops":{"type":"array","required":true,"doc":"An array of stops.","value":"function_stop"},"base":{"type":"number","default":1,"minimum":0,"doc":"The exponential base of the interpolation curve. It controls the rate at which the result increases. Higher values make the result increase more towards the high end of the range. With `1` the stops are interpolated linearly."}},"function_stop":{"type":"array","minimum":0,"maximum":22,"value":["number","color"],"length":2,"doc":"Zoom level and value pair."},"paint":["paint_fill","paint_line","paint_circle","paint_symbol","paint_raster","paint_background"],"paint_fill":{"fill-antialias":{"type":"boolean","function":"piecewise-constant","default":true,"doc":"Whether or not the fill should be antialiased."},"fill-opacity":{"type":"number","function":"interpolated","default":1,"minimum":0,"maximum":1,"doc":"The opacity given to the fill color.","transition":true},"fill-color":{"type":"color","default":"#000000","doc":"The color of the fill.","function":"interpolated","transition":true,"requires":[{"!":"fill-pattern"}]},"fill-outline-color":{"type":"color","doc":"The outline color of the fill. Matches the value of `fill-color` if unspecified.","function":"interpolated","transition":true,"requires":[{"!":"fill-pattern"},{"fill-antialias":true}]},"fill-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","doc":"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively."},"fill-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen)","default":"map","requires":["fill-translate"]},"fill-pattern":{"type":"string","function":"piecewise-constant","transition":true,"doc":"Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512)."}},"paint_line":{"line-opacity":{"type":"number","doc":"The opacity at which the line will be drawn.","function":"interpolated","default":1,"minimum":0,"maximum":1,"transition":true},"line-color":{"type":"color","doc":"The color with which the line will be drawn.","default":"#000000","function":"interpolated","transition":true,"requires":[{"!":"line-pattern"}]},"line-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","doc":"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively."},"line-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen)","default":"map","requires":["line-translate"]},"line-width":{"type":"number","default":1,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Stroke thickness."},"line-gap-width":{"type":"number","default":0,"minimum":0,"doc":"Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.","function":"interpolated","transition":true,"units":"pixels"},"line-offset":{"type":"number","default":0,"doc":"The line's offset perpendicular to its direction. Values may be positive or negative, where positive indicates \"rightwards\" (if you were moving in the direction of the line) and negative indicates \"leftwards.\"","function":"interpolated","transition":true,"units":"pixels"},"line-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Blur applied to the line, in pixels."},"line-dasharray":{"type":"array","value":"number","function":"piecewise-constant","doc":"Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width.","minimum":0,"transition":true,"units":"line widths","requires":[{"!":"line-pattern"}]},"line-pattern":{"type":"string","function":"piecewise-constant","transition":true,"doc":"Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512)."}},"paint_circle":{"circle-radius":{"type":"number","default":5,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Circle radius."},"circle-color":{"type":"color","default":"#000000","doc":"The color of the circle.","function":"interpolated","transition":true},"circle-blur":{"type":"number","default":0,"doc":"Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity.","function":"interpolated","transition":true},"circle-opacity":{"type":"number","doc":"The opacity at which the circle will be drawn.","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true},"circle-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","doc":"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively."},"circle-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen)","default":"map","requires":["circle-translate"]}},"paint_symbol":{"icon-opacity":{"doc":"The opacity at which the icon will be drawn.","type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true,"requires":["icon-image"]},"icon-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"doc":"The color of the icon. This can only be used with sdf icons.","requires":["icon-image"]},"icon-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","transition":true,"doc":"The color of the icon's halo. Icon halos can only be used with sdf icons.","requires":["icon-image"]},"icon-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Distance of halo to the icon outline.","requires":["icon-image"]},"icon-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Fade out the halo towards the outside.","requires":["icon-image"]},"icon-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","doc":"Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.","requires":["icon-image"]},"icon-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen).","default":"map","requires":["icon-image","icon-translate"]},"text-opacity":{"type":"number","doc":"The opacity at which the text will be drawn.","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true,"requires":["text-field"]},"text-color":{"type":"color","doc":"The color with which the text will be drawn.","default":"#000000","function":"interpolated","transition":true,"requires":["text-field"]},"text-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","transition":true,"doc":"The color of the text's halo, which helps it stand out from backgrounds.","requires":["text-field"]},"text-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.","requires":["text-field"]},"text-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"The halo's fadeout distance towards the outside.","requires":["text-field"]},"text-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","doc":"Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.","requires":["text-field"]},"text-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen).","default":"map","requires":["text-field","text-translate"]}},"paint_raster":{"raster-opacity":{"type":"number","doc":"The opacity at which the image will be drawn.","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true},"raster-hue-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","transition":true,"units":"degrees","doc":"Rotates hues around the color wheel."},"raster-brightness-min":{"type":"number","function":"interpolated","doc":"Increase or reduce the brightness of the image. The value is the minimum brightness.","default":0,"minimum":0,"maximum":1,"transition":true},"raster-brightness-max":{"type":"number","function":"interpolated","doc":"Increase or reduce the brightness of the image. The value is the maximum brightness.","default":1,"minimum":0,"maximum":1,"transition":true},"raster-saturation":{"type":"number","doc":"Increase or reduce the saturation of the image.","default":0,"minimum":-1,"maximum":1,"function":"interpolated","transition":true},"raster-contrast":{"type":"number","doc":"Increase or reduce the contrast of the image.","default":0,"minimum":-1,"maximum":1,"function":"interpolated","transition":true},"raster-fade-duration":{"type":"number","default":300,"minimum":0,"function":"interpolated","transition":true,"units":"milliseconds","doc":"Fade duration when a new tile is added."}},"paint_background":{"background-color":{"type":"color","default":"#000000","doc":"The color with which the background will be drawn.","function":"interpolated","transition":true,"requires":[{"!":"background-pattern"}]},"background-pattern":{"type":"string","function":"piecewise-constant","transition":true,"doc":"Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512)."},"background-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"doc":"The opacity at which the background will be drawn.","function":"interpolated","transition":true}},"transition":{"duration":{"type":"number","default":300,"minimum":0,"units":"milliseconds","doc":"Time allotted for transitions to complete."},"delay":{"type":"number","default":0,"minimum":0,"units":"milliseconds","doc":"Length of time before a transition begins."}}}
-	},{}],134:[function(require,module,exports){
-	module.exports={"$version":8,"$root":{"version":{"required":true,"type":"enum","values":[8]},"name":{"type":"string"},"metadata":{"type":"*"},"center":{"type":"array","value":"number"},"zoom":{"type":"number"},"bearing":{"type":"number","default":0,"period":360,"units":"degrees"},"pitch":{"type":"number","default":0,"units":"degrees"},"sources":{"required":true,"type":"sources"},"sprite":{"type":"string"},"glyphs":{"type":"string"},"transition":{"type":"transition"},"layers":{"required":true,"type":"array","value":"layer"}},"sources":{"*":{"type":"source"}},"source":["source_tile","source_geojson","source_video","source_image"],"source_tile":{"type":{"required":true,"type":"enum","values":["vector","raster"]},"url":{"type":"string"},"tiles":{"type":"array","value":"string"},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"tileSize":{"type":"number","default":512,"units":"pixels"},"*":{"type":"*"}},"source_geojson":{"type":{"required":true,"type":"enum","values":["geojson"]},"data":{"type":"*"},"maxzoom":{"type":"number","default":14},"buffer":{"type":"number","default":64},"tolerance":{"type":"number","default":3},"cluster":{"type":"boolean","default":false},"clusterRadius":{"type":"number","default":400},"clusterMaxZoom":{"type":"number"}},"source_video":{"type":{"required":true,"type":"enum","values":["video"]},"urls":{"required":true,"type":"array","value":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"source_image":{"type":{"required":true,"type":"enum","values":["image"]},"url":{"required":true,"type":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"layer":{"id":{"type":"string","required":true},"type":{"type":"enum","values":["fill","line","symbol","circle","raster","background"]},"metadata":{"type":"*"},"ref":{"type":"string"},"source":{"type":"string"},"source-layer":{"type":"string"},"minzoom":{"type":"number","minimum":0,"maximum":22},"maxzoom":{"type":"number","minimum":0,"maximum":22},"interactive":{"type":"boolean","default":false},"filter":{"type":"filter"},"layout":{"type":"layout"},"paint":{"type":"paint"},"paint.*":{"type":"paint"}},"layout":["layout_fill","layout_line","layout_circle","layout_symbol","layout_raster","layout_background"],"layout_background":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_fill":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_circle":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_line":{"line-cap":{"type":"enum","function":"piecewise-constant","values":["butt","round","square"],"default":"butt"},"line-join":{"type":"enum","function":"piecewise-constant","values":["bevel","round","miter"],"default":"miter"},"line-miter-limit":{"type":"number","default":2,"function":"interpolated","requires":[{"line-join":"miter"}]},"line-round-limit":{"type":"number","default":1.05,"function":"interpolated","requires":[{"line-join":"round"}]},"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_symbol":{"symbol-placement":{"type":"enum","function":"piecewise-constant","values":["point","line"],"default":"point"},"symbol-spacing":{"type":"number","default":250,"minimum":1,"function":"interpolated","units":"pixels","requires":[{"symbol-placement":"line"}]},"symbol-avoid-edges":{"type":"boolean","function":"piecewise-constant","default":false},"icon-allow-overlap":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["icon-image"]},"icon-ignore-placement":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["icon-image"]},"icon-optional":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["icon-image","text-field"]},"icon-rotation-alignment":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"viewport","requires":["icon-image"]},"icon-size":{"type":"number","default":1,"minimum":0,"function":"interpolated","requires":["icon-image"]},"icon-image":{"type":"string","function":"piecewise-constant","tokens":true},"icon-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","units":"degrees","requires":["icon-image"]},"icon-padding":{"type":"number","default":2,"minimum":0,"function":"interpolated","units":"pixels","requires":["icon-image"]},"icon-keep-upright":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":"line"}]},"icon-offset":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","requires":["icon-image"]},"text-rotation-alignment":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"viewport","requires":["text-field"]},"text-field":{"type":"string","function":"piecewise-constant","default":"","tokens":true},"text-font":{"type":"array","value":"string","function":"piecewise-constant","default":["Open Sans Regular","Arial Unicode MS Regular"],"requires":["text-field"]},"text-size":{"type":"number","default":16,"minimum":0,"units":"pixels","function":"interpolated","requires":["text-field"]},"text-max-width":{"type":"number","default":10,"minimum":0,"units":"em","function":"interpolated","requires":["text-field"]},"text-line-height":{"type":"number","default":1.2,"units":"em","function":"interpolated","requires":["text-field"]},"text-letter-spacing":{"type":"number","default":0,"units":"em","function":"interpolated","requires":["text-field"]},"text-justify":{"type":"enum","function":"piecewise-constant","values":["left","center","right"],"default":"center","requires":["text-field"]},"text-anchor":{"type":"enum","function":"piecewise-constant","values":["center","left","right","top","bottom","top-left","top-right","bottom-left","bottom-right"],"default":"center","requires":["text-field"]},"text-max-angle":{"type":"number","default":45,"units":"degrees","function":"interpolated","requires":["text-field",{"symbol-placement":"line"}]},"text-rotate":{"type":"number","default":0,"period":360,"units":"degrees","function":"interpolated","requires":["text-field"]},"text-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","function":"interpolated","requires":["text-field"]},"text-keep-upright":{"type":"boolean","function":"piecewise-constant","default":true,"requires":["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":"line"}]},"text-transform":{"type":"enum","function":"piecewise-constant","values":["none","uppercase","lowercase"],"default":"none","requires":["text-field"]},"text-offset":{"type":"array","value":"number","units":"ems","function":"interpolated","length":2,"default":[0,0],"requires":["text-field"]},"text-allow-overlap":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["text-field"]},"text-ignore-placement":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["text-field"]},"text-optional":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["text-field","icon-image"]},"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_raster":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"filter":{"type":"array","value":"*"},"filter_operator":{"type":"enum","values":["==","!=",">",">=","<","<=","in","!in","all","any","none"]},"geometry_type":{"type":"enum","values":["Point","LineString","Polygon"]},"color_operation":{"type":"enum","values":["lighten","saturate","spin","fade","mix"]},"function":{"stops":{"type":"array","required":true,"value":"function_stop"},"base":{"type":"number","default":1,"minimum":0}},"function_stop":{"type":"array","minimum":0,"maximum":22,"value":["number","color"],"length":2},"paint":["paint_fill","paint_line","paint_circle","paint_symbol","paint_raster","paint_background"],"paint_fill":{"fill-antialias":{"type":"boolean","function":"piecewise-constant","default":true},"fill-opacity":{"type":"number","function":"interpolated","default":1,"minimum":0,"maximum":1,"transition":true},"fill-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":[{"!":"fill-pattern"}]},"fill-outline-color":{"type":"color","function":"interpolated","transition":true,"requires":[{"!":"fill-pattern"},{"fill-antialias":true}]},"fill-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels"},"fill-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["fill-translate"]},"fill-pattern":{"type":"string","function":"piecewise-constant","transition":true}},"paint_line":{"line-opacity":{"type":"number","function":"interpolated","default":1,"minimum":0,"maximum":1,"transition":true},"line-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":[{"!":"line-pattern"}]},"line-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels"},"line-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["line-translate"]},"line-width":{"type":"number","default":1,"minimum":0,"function":"interpolated","transition":true,"units":"pixels"},"line-gap-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels"},"line-offset":{"type":"number","default":0,"function":"interpolated","transition":true,"units":"pixels"},"line-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels"},"line-dasharray":{"type":"array","value":"number","function":"piecewise-constant","minimum":0,"transition":true,"units":"line widths","requires":[{"!":"line-pattern"}]},"line-pattern":{"type":"string","function":"piecewise-constant","transition":true}},"paint_circle":{"circle-radius":{"type":"number","default":5,"minimum":0,"function":"interpolated","transition":true,"units":"pixels"},"circle-color":{"type":"color","default":"#000000","function":"interpolated","transition":true},"circle-blur":{"type":"number","default":0,"function":"interpolated","transition":true},"circle-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true},"circle-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels"},"circle-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["circle-translate"]}},"paint_symbol":{"icon-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true,"requires":["icon-image"]},"icon-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":["icon-image"]},"icon-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","transition":true,"requires":["icon-image"]},"icon-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","requires":["icon-image"]},"icon-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["icon-image","icon-translate"]},"text-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true,"requires":["text-field"]},"text-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":["text-field"]},"text-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","transition":true,"requires":["text-field"]},"text-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","requires":["text-field"]},"text-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","requires":["text-field"]},"text-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","requires":["text-field"]},"text-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["text-field","text-translate"]}},"paint_raster":{"raster-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true},"raster-hue-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","transition":true,"units":"degrees"},"raster-brightness-min":{"type":"number","function":"interpolated","default":0,"minimum":0,"maximum":1,"transition":true},"raster-brightness-max":{"type":"number","function":"interpolated","default":1,"minimum":0,"maximum":1,"transition":true},"raster-saturation":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","transition":true},"raster-contrast":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","transition":true},"raster-fade-duration":{"type":"number","default":300,"minimum":0,"function":"interpolated","transition":true,"units":"milliseconds"}},"paint_background":{"background-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":[{"!":"background-pattern"}]},"background-pattern":{"type":"string","function":"piecewise-constant","transition":true},"background-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true}},"transition":{"duration":{"type":"number","default":300,"minimum":0,"units":"milliseconds"},"delay":{"type":"number","default":0,"minimum":0,"units":"milliseconds"}}}
-	},{}],135:[function(require,module,exports){
-	"use strict";function Buffer(t){var e;t&&t.length&&(e=t,t=e.length);var r=new Uint8Array(t||0);return e&&r.set(e),r.readUInt32LE=BufferMethods.readUInt32LE,r.writeUInt32LE=BufferMethods.writeUInt32LE,r.readInt32LE=BufferMethods.readInt32LE,r.writeInt32LE=BufferMethods.writeInt32LE,r.readFloatLE=BufferMethods.readFloatLE,r.writeFloatLE=BufferMethods.writeFloatLE,r.readDoubleLE=BufferMethods.readDoubleLE,r.writeDoubleLE=BufferMethods.writeDoubleLE,r.toString=BufferMethods.toString,r.write=BufferMethods.write,r.slice=BufferMethods.slice,r.copy=BufferMethods.copy,r._isBuffer=!0,r}function encodeString(t){for(var e,r,n=t.length,i=[],o=0;n>o;o++){if(e=t.charCodeAt(o),e>55295&&57344>e){if(!r){e>56319||o+1===n?i.push(239,191,189):r=e;continue}if(56320>e){i.push(239,191,189),r=e;continue}e=r-55296<<10|e-56320|65536,r=null}else r&&(i.push(239,191,189),r=null);128>e?i.push(e):2048>e?i.push(e>>6|192,63&e|128):65536>e?i.push(e>>12|224,e>>6&63|128,63&e|128):i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}return i}module.exports=Buffer;var ieee754=require("ieee754"),BufferMethods,lastStr,lastStrEncoded;BufferMethods={readUInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},writeUInt32LE:function(t,e){this[e]=t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24},readInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+(this[t+3]<<24)},readFloatLE:function(t){return ieee754.read(this,t,!0,23,4)},readDoubleLE:function(t){return ieee754.read(this,t,!0,52,8)},writeFloatLE:function(t,e){return ieee754.write(this,t,e,!0,23,4)},writeDoubleLE:function(t,e){return ieee754.write(this,t,e,!0,52,8)},toString:function(t,e,r){var n="",i="";e=e||0,r=Math.min(this.length,r||this.length);for(var o=e;r>o;o++){var u=this[o];127>=u?(n+=decodeURIComponent(i)+String.fromCharCode(u),i=""):i+="%"+u.toString(16)}return n+=decodeURIComponent(i)},write:function(t,e){for(var r=t===lastStr?lastStrEncoded:encodeString(t),n=0;n<r.length;n++)this[e+n]=r[n]},slice:function(t,e){return this.subarray(t,e)},copy:function(t,e){e=e||0;for(var r=0;r<this.length;r++)t[e+r]=this[r]}},BufferMethods.writeInt32LE=BufferMethods.writeUInt32LE,Buffer.byteLength=function(t){return lastStr=t,lastStrEncoded=encodeString(t),lastStrEncoded.length},Buffer.isBuffer=function(t){return!(!t||!t._isBuffer)};
-	},{"ieee754":126}],136:[function(require,module,exports){
-	(function (global){
-	"use strict";function Pbf(t){this.buf=Buffer.isBuffer(t)?t:new Buffer(t||0),this.pos=0,this.length=this.buf.length}function writePackedVarint(t,i){for(var e=0;e<t.length;e++)i.writeVarint(t[e])}function writePackedSVarint(t,i){for(var e=0;e<t.length;e++)i.writeSVarint(t[e])}function writePackedFloat(t,i){for(var e=0;e<t.length;e++)i.writeFloat(t[e])}function writePackedDouble(t,i){for(var e=0;e<t.length;e++)i.writeDouble(t[e])}function writePackedBoolean(t,i){for(var e=0;e<t.length;e++)i.writeBoolean(t[e])}function writePackedFixed32(t,i){for(var e=0;e<t.length;e++)i.writeFixed32(t[e])}function writePackedSFixed32(t,i){for(var e=0;e<t.length;e++)i.writeSFixed32(t[e])}function writePackedFixed64(t,i){for(var e=0;e<t.length;e++)i.writeFixed64(t[e])}function writePackedSFixed64(t,i){for(var e=0;e<t.length;e++)i.writeSFixed64(t[e])}module.exports=Pbf;var Buffer=global.Buffer||require("./buffer");Pbf.Varint=0,Pbf.Fixed64=1,Pbf.Bytes=2,Pbf.Fixed32=5;var SHIFT_LEFT_32=4294967296,SHIFT_RIGHT_32=1/SHIFT_LEFT_32,POW_2_63=Math.pow(2,63);Pbf.prototype={destroy:function(){this.buf=null},readFields:function(t,i,e){for(e=e||this.length;this.pos<e;){var r=this.readVarint(),s=r>>3,n=this.pos;t(s,i,this),this.pos===n&&this.skip(r)}return i},readMessage:function(t,i){return this.readFields(t,i,this.readVarint()+this.pos)},readFixed32:function(){var t=this.buf.readUInt32LE(this.pos);return this.pos+=4,t},readSFixed32:function(){var t=this.buf.readInt32LE(this.pos);return this.pos+=4,t},readFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+this.buf.readUInt32LE(this.pos+4)*SHIFT_LEFT_32;return this.pos+=8,t},readSFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+this.buf.readInt32LE(this.pos+4)*SHIFT_LEFT_32;return this.pos+=8,t},readFloat:function(){var t=this.buf.readFloatLE(this.pos);return this.pos+=4,t},readDouble:function(){var t=this.buf.readDoubleLE(this.pos);return this.pos+=8,t},readVarint:function(){var t,i,e,r,s,n,o=this.buf;if(e=o[this.pos++],128>e)return e;if(e=127&e,r=o[this.pos++],128>r)return e|r<<7;if(r=(127&r)<<7,s=o[this.pos++],128>s)return e|r|s<<14;if(s=(127&s)<<14,n=o[this.pos++],128>n)return e|r|s|n<<21;if(t=e|r|s|(127&n)<<21,i=o[this.pos++],t+=268435456*(127&i),128>i)return t;if(i=o[this.pos++],t+=34359738368*(127&i),128>i)return t;if(i=o[this.pos++],t+=4398046511104*(127&i),128>i)return t;if(i=o[this.pos++],t+=562949953421312*(127&i),128>i)return t;if(i=o[this.pos++],t+=72057594037927940*(127&i),128>i)return t;if(i=o[this.pos++],t+=0x8000000000000000*(127&i),128>i)return t;throw new Error("Expected varint not more than 10 bytes")},readVarint64:function(){var t=this.pos,i=this.readVarint();if(POW_2_63>i)return i;for(var e=this.pos-2;255===this.buf[e];)e--;t>e&&(e=t),i=0;for(var r=0;e-t+1>r;r++){var s=127&~this.buf[t+r];i+=4>r?s<<7*r:s*Math.pow(2,7*r)}return-i-1},readSVarint:function(){var t=this.readVarint();return t%2===1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,i=this.buf.toString("utf8",this.pos,t);return this.pos=t,i},readBytes:function(){var t=this.readVarint()+this.pos,i=this.buf.slice(this.pos,t);return this.pos=t,i},readPackedVarint:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readVarint());return i},readPackedSVarint:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readSVarint());return i},readPackedBoolean:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readBoolean());return i},readPackedFloat:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readFloat());return i},readPackedDouble:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readDouble());return i},readPackedFixed32:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readFixed32());return i},readPackedSFixed32:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readSFixed32());return i},readPackedFixed64:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readFixed64());return i},readPackedSFixed64:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readSFixed64());return i},skip:function(t){var i=7&t;if(i===Pbf.Varint)for(;this.buf[this.pos++]>127;);else if(i===Pbf.Bytes)this.pos=this.readVarint()+this.pos;else if(i===Pbf.Fixed32)this.pos+=4;else{if(i!==Pbf.Fixed64)throw new Error("Unimplemented type: "+i);this.pos+=8}},writeTag:function(t,i){this.writeVarint(t<<3|i)},realloc:function(t){for(var i=this.length||16;i<this.pos+t;)i*=2;if(i!==this.length){var e=new Buffer(i);this.buf.copy(e),this.buf=e,this.length=i}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.slice(0,this.length)},writeFixed32:function(t){this.realloc(4),this.buf.writeUInt32LE(t,this.pos),this.pos+=4},writeSFixed32:function(t){this.realloc(4),this.buf.writeInt32LE(t,this.pos),this.pos+=4},writeFixed64:function(t){this.realloc(8),this.buf.writeInt32LE(-1&t,this.pos),this.buf.writeUInt32LE(Math.floor(t*SHIFT_RIGHT_32),this.pos+4),this.pos+=8},writeSFixed64:function(t){this.realloc(8),this.buf.writeInt32LE(-1&t,this.pos),this.buf.writeInt32LE(Math.floor(t*SHIFT_RIGHT_32),this.pos+4),this.pos+=8},writeVarint:function(t){if(t=+t,127>=t)this.realloc(1),this.buf[this.pos++]=t;else if(16383>=t)this.realloc(2),this.buf[this.pos++]=t>>>0&127|128,this.buf[this.pos++]=t>>>7&127;else if(2097151>=t)this.realloc(3),this.buf[this.pos++]=t>>>0&127|128,this.buf[this.pos++]=t>>>7&127|128,this.buf[this.pos++]=t>>>14&127;else if(268435455>=t)this.realloc(4),this.buf[this.pos++]=t>>>0&127|128,this.buf[this.pos++]=t>>>7&127|128,this.buf[this.pos++]=t>>>14&127|128,this.buf[this.pos++]=t>>>21&127;else{for(var i=this.pos;t>=128;)this.realloc(1),this.buf[this.pos++]=255&t|128,t/=128;if(this.realloc(1),this.buf[this.pos++]=0|t,this.pos-i>10)throw new Error("Given varint doesn't fit into 10 bytes")}},writeSVarint:function(t){this.writeVarint(0>t?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t);var i=Buffer.byteLength(t);this.writeVarint(i),this.realloc(i),this.buf.write(t,this.pos),this.pos+=i},writeFloat:function(t){this.realloc(4),this.buf.writeFloatLE(t,this.pos),this.pos+=4},writeDouble:function(t){this.realloc(8),this.buf.writeDoubleLE(t,this.pos),this.pos+=8},writeBytes:function(t){var i=t.length;this.writeVarint(i),this.realloc(i);for(var e=0;i>e;e++)this.buf[this.pos++]=t[e]},writeRawMessage:function(t,i){this.pos++;var e=this.pos;t(i,this);var r=this.pos-e,s=127>=r?1:16383>=r?2:2097151>=r?3:268435455>=r?4:Math.ceil(Math.log(r)/(7*Math.LN2));if(s>1){this.realloc(s-1);for(var n=this.pos-1;n>=e;n--)this.buf[n+s-1]=this.buf[n]}this.pos=e-1,this.writeVarint(r),this.pos+=r},writeMessage:function(t,i,e){this.writeTag(t,Pbf.Bytes),this.writeRawMessage(i,e)},writePackedVarint:function(t,i){this.writeMessage(t,writePackedVarint,i)},writePackedSVarint:function(t,i){this.writeMessage(t,writePackedSVarint,i)},writePackedBoolean:function(t,i){this.writeMessage(t,writePackedBoolean,i)},writePackedFloat:function(t,i){this.writeMessage(t,writePackedFloat,i)},writePackedDouble:function(t,i){this.writeMessage(t,writePackedDouble,i)},writePackedFixed32:function(t,i){this.writeMessage(t,writePackedFixed32,i)},writePackedSFixed32:function(t,i){this.writeMessage(t,writePackedSFixed32,i)},writePackedFixed64:function(t,i){this.writeMessage(t,writePackedFixed64,i)},writePackedSFixed64:function(t,i){this.writeMessage(t,writePackedSFixed64,i)},writeBytesField:function(t,i){this.writeTag(t,Pbf.Bytes),this.writeBytes(i)},writeFixed32Field:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeFixed32(i)},writeSFixed32Field:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeSFixed32(i)},writeFixed64Field:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeFixed64(i)},writeSFixed64Field:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeSFixed64(i)},writeVarintField:function(t,i){this.writeTag(t,Pbf.Varint),this.writeVarint(i)},writeSVarintField:function(t,i){this.writeTag(t,Pbf.Varint),this.writeSVarint(i)},writeStringField:function(t,i){this.writeTag(t,Pbf.Bytes),this.writeString(i)},writeFloatField:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeFloat(i)},writeDoubleField:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeDouble(i)},writeBooleanField:function(t,i){this.writeVarintField(t,Boolean(i))}};
-	}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-	},{"./buffer":135}],137:[function(require,module,exports){
-	"use strict";function Point(t,n){this.x=t,this.y=n}module.exports=Point,Point.prototype={clone:function(){return new Point(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var n=t.x-this.x,i=t.y-this.y;return n*n+i*i},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,n){return Math.atan2(this.x*n-this.y*t,this.x*t+this.y*n)},_matMult:function(t){var n=t[0]*this.x+t[1]*this.y,i=t[2]*this.x+t[3]*this.y;return this.x=n,this.y=i,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var n=Math.cos(t),i=Math.sin(t),s=n*this.x-i*this.y,r=i*this.x+n*this.y;return this.x=s,this.y=r,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},Point.convert=function(t){return t instanceof Point?t:Array.isArray(t)?new Point(t[0],t[1]):t};
-	},{}],138:[function(require,module,exports){
-	function cleanUpNextTick(){draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue()}function drainQueue(){if(!draining){var e=setTimeout(cleanUpNextTick);draining=!0;for(var n=queue.length;n;){for(currentQueue=queue,queue=[];++queueIndex<n;)currentQueue&&currentQueue[queueIndex].run();queueIndex=-1,n=queue.length}currentQueue=null,draining=!1,clearTimeout(e)}}function Item(e,n){this.fun=e,this.array=n}function noop(){}var process=module.exports={},queue=[],draining=!1,currentQueue,queueIndex=-1;process.nextTick=function(e){var n=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)n[r-1]=arguments[r];queue.push(new Item(e,n)),1!==queue.length||draining||setTimeout(drainQueue,0)},Item.prototype.run=function(){this.fun.apply(null,this.array)},process.title="browser",process.browser=!0,process.env={},process.argv=[],process.version="",process.versions={},process.on=noop,process.addListener=noop,process.once=noop,process.off=noop,process.removeListener=noop,process.removeAllListeners=noop,process.emit=noop,process.binding=function(e){throw new Error("process.binding is not supported")},process.cwd=function(){return"/"},process.chdir=function(e){throw new Error("process.chdir is not supported")},process.umask=function(){return 0};
-	},{}],139:[function(require,module,exports){
-	!function(){"use strict";function t(i,n){return this instanceof t?(this._maxEntries=Math.max(4,i||9),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),n&&this._initFormat(n),void this.clear()):new t(i,n)}function i(t,i){t.bbox=n(t,0,t.children.length,i)}function n(t,i,n,r){for(var o,a=e(),s=i;n>s;s++)o=t.children[s],h(a,t.leaf?r(o):o.bbox);return a}function e(){return[1/0,1/0,-(1/0),-(1/0)]}function h(t,i){return t[0]=Math.min(t[0],i[0]),t[1]=Math.min(t[1],i[1]),t[2]=Math.max(t[2],i[2]),t[3]=Math.max(t[3],i[3]),t}function r(t,i){return t.bbox[0]-i.bbox[0]}function o(t,i){return t.bbox[1]-i.bbox[1]}function a(t){return(t[2]-t[0])*(t[3]-t[1])}function s(t){return t[2]-t[0]+(t[3]-t[1])}function l(t,i){return(Math.max(i[2],t[2])-Math.min(i[0],t[0]))*(Math.max(i[3],t[3])-Math.min(i[1],t[1]))}function u(t,i){var n=Math.max(t[0],i[0]),e=Math.max(t[1],i[1]),h=Math.min(t[2],i[2]),r=Math.min(t[3],i[3]);return Math.max(0,h-n)*Math.max(0,r-e)}function f(t,i){return t[0]<=i[0]&&t[1]<=i[1]&&i[2]<=t[2]&&i[3]<=t[3]}function c(t,i){return i[0]<=t[2]&&i[1]<=t[3]&&i[2]>=t[0]&&i[3]>=t[1]}function d(t,i,n,e,h){for(var r,o=[i,n];o.length;)n=o.pop(),i=o.pop(),e>=n-i||(r=i+Math.ceil((n-i)/e/2)*e,x(t,i,n,r,h),o.push(i,r,r,n))}function x(t,i,n,e,h){for(var r,o,a,s,l,u,f,c,d;n>i;){for(n-i>600&&(r=n-i+1,o=e-i+1,a=Math.log(r),s=.5*Math.exp(2*a/3),l=.5*Math.sqrt(a*s*(r-s)/r)*(0>o-r/2?-1:1),u=Math.max(i,Math.floor(e-o*s/r+l)),f=Math.min(n,Math.floor(e+(r-o)*s/r+l)),x(t,u,f,e,h)),c=t[e],o=i,d=n,p(t,i,e),h(t[n],c)>0&&p(t,i,n);d>o;){for(p(t,o,d),o++,d--;h(t[o],c)<0;)o++;for(;h(t[d],c)>0;)d--}0===h(t[i],c)?p(t,i,d):(d++,p(t,d,n)),e>=d&&(i=d+1),d>=e&&(n=d-1)}}function p(t,i,n){var e=t[i];t[i]=t[n],t[n]=e}t.prototype={all:function(){return this._all(this.data,[])},search:function(t){var i=this.data,n=[],e=this.toBBox;if(!c(t,i.bbox))return n;for(var h,r,o,a,s=[];i;){for(h=0,r=i.children.length;r>h;h++)o=i.children[h],a=i.leaf?e(o):o.bbox,c(t,a)&&(i.leaf?n.push(o):f(t,a)?this._all(o,n):s.push(o));i=s.pop()}return n},collides:function(t){var i=this.data,n=this.toBBox;if(!c(t,i.bbox))return!1;for(var e,h,r,o,a=[];i;){for(e=0,h=i.children.length;h>e;e++)if(r=i.children[e],o=i.leaf?n(r):r.bbox,c(t,o)){if(i.leaf||f(t,o))return!0;a.push(r)}i=a.pop()}return!1},load:function(t){if(!t||!t.length)return this;if(t.length<this._minEntries){for(var i=0,n=t.length;n>i;i++)this.insert(t[i]);return this}var e=this._build(t.slice(),0,t.length-1,0);if(this.data.children.length)if(this.data.height===e.height)this._splitRoot(this.data,e);else{if(this.data.height<e.height){var h=this.data;this.data=e,e=h}this._insert(e,this.data.height-e.height-1,!0)}else this.data=e;return this},insert:function(t){return t&&this._insert(t,this.data.height-1),this},clear:function(){return this.data={children:[],height:1,bbox:e(),leaf:!0},this},remove:function(t){if(!t)return this;for(var i,n,e,h,r=this.data,o=this.toBBox(t),a=[],s=[];r||a.length;){if(r||(r=a.pop(),n=a[a.length-1],i=s.pop(),h=!0),r.leaf&&(e=r.children.indexOf(t),-1!==e))return r.children.splice(e,1),a.push(r),this._condense(a),this;h||r.leaf||!f(r.bbox,o)?n?(i++,r=n.children[i],h=!1):r=null:(a.push(r),s.push(i),i=0,n=r,r=r.children[0])}return this},toBBox:function(t){return t},compareMinX:function(t,i){return t[0]-i[0]},compareMinY:function(t,i){return t[1]-i[1]},toJSON:function(){return this.data},fromJSON:function(t){return this.data=t,this},_all:function(t,i){for(var n=[];t;)t.leaf?i.push.apply(i,t.children):n.push.apply(n,t.children),t=n.pop();return i},_build:function(t,n,e,h){var r,o=e-n+1,a=this._maxEntries;if(a>=o)return r={children:t.slice(n,e+1),height:1,bbox:null,leaf:!0},i(r,this.toBBox),r;h||(h=Math.ceil(Math.log(o)/Math.log(a)),a=Math.ceil(o/Math.pow(a,h-1))),r={children:[],height:h,bbox:null,leaf:!1};var s,l,u,f,c=Math.ceil(o/a),x=c*Math.ceil(Math.sqrt(a));for(d(t,n,e,x,this.compareMinX),s=n;e>=s;s+=x)for(u=Math.min(s+x-1,e),d(t,s,u,c,this.compareMinY),l=s;u>=l;l+=c)f=Math.min(l+c-1,u),r.children.push(this._build(t,l,f,h-1));return i(r,this.toBBox),r},_chooseSubtree:function(t,i,n,e){for(var h,r,o,s,u,f,c,d;;){if(e.push(i),i.leaf||e.length-1===n)break;for(c=d=1/0,h=0,r=i.children.length;r>h;h++)o=i.children[h],u=a(o.bbox),f=l(t,o.bbox)-u,d>f?(d=f,c=c>u?u:c,s=o):f===d&&c>u&&(c=u,s=o);i=s}return i},_insert:function(t,i,n){var e=this.toBBox,r=n?t.bbox:e(t),o=[],a=this._chooseSubtree(r,this.data,i,o);for(a.children.push(t),h(a.bbox,r);i>=0&&o[i].children.length>this._maxEntries;)this._split(o,i),i--;this._adjustParentBBoxes(r,o,i)},_split:function(t,n){var e=t[n],h=e.children.length,r=this._minEntries;this._chooseSplitAxis(e,r,h);var o=this._chooseSplitIndex(e,r,h),a={children:e.children.splice(o,e.children.length-o),height:e.height,bbox:null,leaf:!1};e.leaf&&(a.leaf=!0),i(e,this.toBBox),i(a,this.toBBox),n?t[n-1].children.push(a):this._splitRoot(e,a)},_splitRoot:function(t,n){this.data={children:[t,n],height:t.height+1,bbox:null,leaf:!1},i(this.data,this.toBBox)},_chooseSplitIndex:function(t,i,e){var h,r,o,s,l,f,c,d;for(f=c=1/0,h=i;e-i>=h;h++)r=n(t,0,h,this.toBBox),o=n(t,h,e,this.toBBox),s=u(r,o),l=a(r)+a(o),f>s?(f=s,d=h,c=c>l?l:c):s===f&&c>l&&(c=l,d=h);return d},_chooseSplitAxis:function(t,i,n){var e=t.leaf?this.compareMinX:r,h=t.leaf?this.compareMinY:o,a=this._allDistMargin(t,i,n,e),s=this._allDistMargin(t,i,n,h);s>a&&t.children.sort(e)},_allDistMargin:function(t,i,e,r){t.children.sort(r);var o,a,l=this.toBBox,u=n(t,0,i,l),f=n(t,e-i,e,l),c=s(u)+s(f);for(o=i;e-i>o;o++)a=t.children[o],h(u,t.leaf?l(a):a.bbox),c+=s(u);for(o=e-i-1;o>=i;o--)a=t.children[o],h(f,t.leaf?l(a):a.bbox),c+=s(f);return c},_adjustParentBBoxes:function(t,i,n){for(var e=n;e>=0;e--)h(i[e].bbox,t)},_condense:function(t){for(var n,e=t.length-1;e>=0;e--)0===t[e].children.length?e>0?(n=t[e-1].children,n.splice(n.indexOf(t[e]),1)):this.clear():i(t[e],this.toBBox)},_initFormat:function(t){var i=["return a"," - b",";"];this.compareMinX=new Function("a","b",i.join(t[0])),this.compareMinY=new Function("a","b",i.join(t[1])),this.toBBox=new Function("a","return [a"+t.join(", a")+"];")}},"function"==typeof define&&define.amd?define("rbush",function(){return t}):"undefined"!=typeof module?module.exports=t:"undefined"!=typeof self?self.rbush=t:window.rbush=t}();
-	},{}],140:[function(require,module,exports){
-	void function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():e.resolveUrl=r()}(this,function(){function e(){var e=arguments.length;if(0===e)throw new Error("resolveUrl requires at least one argument; got none.");var r=document.createElement("base");if(r.href=arguments[0],1===e)return r.href;var t=document.getElementsByTagName("head")[0];t.insertBefore(r,t.firstChild);for(var n,o=document.createElement("a"),f=1;e>f;f++)o.href=arguments[f],n=o.href,r.href=n;return t.removeChild(r),n}return e});
-	},{}],141:[function(require,module,exports){
-	function UnitBezier(t,i,e,r){this.cx=3*t,this.bx=3*(e-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*i,this.by=3*(r-i)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=r,this.p2x=e,this.p2y=r}module.exports=UnitBezier,UnitBezier.prototype.sampleCurveX=function(t){return((this.ax*t+this.bx)*t+this.cx)*t},UnitBezier.prototype.sampleCurveY=function(t){return((this.ay*t+this.by)*t+this.cy)*t},UnitBezier.prototype.sampleCurveDerivativeX=function(t){return(3*this.ax*t+2*this.bx)*t+this.cx},UnitBezier.prototype.solveCurveX=function(t,i){"undefined"==typeof i&&(i=1e-6);var e,r,s,h,n;for(s=t,n=0;8>n;n++){if(h=this.sampleCurveX(s)-t,Math.abs(h)<i)return s;var u=this.sampleCurveDerivativeX(s);if(Math.abs(u)<1e-6)break;s-=h/u}if(e=0,r=1,s=t,e>s)return e;if(s>r)return r;for(;r>e;){if(h=this.sampleCurveX(s),Math.abs(h-t)<i)return s;t>h?e=s:r=s,s=.5*(r-e)+e}return s},UnitBezier.prototype.solve=function(t,i){return this.sampleCurveY(this.solveCurveX(t,i))};
-	},{}],142:[function(require,module,exports){
-	module.exports=function(o){return o&&"object"==typeof o&&"function"==typeof o.copy&&"function"==typeof o.fill&&"function"==typeof o.readUInt8};
-	},{}],143:[function(require,module,exports){
-	(function (process,global){
-	function inspect(e,r){var t={seen:[],stylize:stylizeNoColor};return arguments.length>=3&&(t.depth=arguments[2]),arguments.length>=4&&(t.colors=arguments[3]),isBoolean(r)?t.showHidden=r:r&&exports._extend(t,r),isUndefined(t.showHidden)&&(t.showHidden=!1),isUndefined(t.depth)&&(t.depth=2),isUndefined(t.colors)&&(t.colors=!1),isUndefined(t.customInspect)&&(t.customInspect=!0),t.colors&&(t.stylize=stylizeWithColor),formatValue(t,e,t.depth)}function stylizeWithColor(e,r){var t=inspect.styles[r];return t?"["+inspect.colors[t][0]+"m"+e+"["+inspect.colors[t][1]+"m":e}function stylizeNoColor(e,r){return e}function arrayToHash(e){var r={};return e.forEach(function(e,t){r[e]=!0}),r}function formatValue(e,r,t){if(e.customInspect&&r&&isFunction(r.inspect)&&r.inspect!==exports.inspect&&(!r.constructor||r.constructor.prototype!==r)){var n=r.inspect(t,e);return isString(n)||(n=formatValue(e,n,t)),n}var i=formatPrimitive(e,r);if(i)return i;var o=Object.keys(r),s=arrayToHash(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(r)),isError(r)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return formatError(r);if(0===o.length){if(isFunction(r)){var u=r.name?": "+r.name:"";return e.stylize("[Function"+u+"]","special")}if(isRegExp(r))return e.stylize(RegExp.prototype.toString.call(r),"regexp");if(isDate(r))return e.stylize(Date.prototype.toString.call(r),"date");if(isError(r))return formatError(r)}var a="",c=!1,l=["{","}"];if(isArray(r)&&(c=!0,l=["[","]"]),isFunction(r)){var p=r.name?": "+r.name:"";a=" [Function"+p+"]"}if(isRegExp(r)&&(a=" "+RegExp.prototype.toString.call(r)),isDate(r)&&(a=" "+Date.prototype.toUTCString.call(r)),isError(r)&&(a=" "+formatError(r)),0===o.length&&(!c||0==r.length))return l[0]+a+l[1];if(0>t)return isRegExp(r)?e.stylize(RegExp.prototype.toString.call(r),"regexp"):e.stylize("[Object]","special");e.seen.push(r);var f;return f=c?formatArray(e,r,t,s,o):o.map(function(n){return formatProperty(e,r,t,s,n,c)}),e.seen.pop(),reduceToSingleString(f,a,l)}function formatPrimitive(e,r){if(isUndefined(r))return e.stylize("undefined","undefined");if(isString(r)){var t="'"+JSON.stringify(r).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(t,"string")}return isNumber(r)?e.stylize(""+r,"number"):isBoolean(r)?e.stylize(""+r,"boolean"):isNull(r)?e.stylize("null","null"):void 0}function formatError(e){return"["+Error.prototype.toString.call(e)+"]"}function formatArray(e,r,t,n,i){for(var o=[],s=0,u=r.length;u>s;++s)hasOwnProperty(r,String(s))?o.push(formatProperty(e,r,t,n,String(s),!0)):o.push("");return i.forEach(function(i){i.match(/^\d+$/)||o.push(formatProperty(e,r,t,n,i,!0))}),o}function formatProperty(e,r,t,n,i,o){var s,u,a;if(a=Object.getOwnPropertyDescriptor(r,i)||{value:r[i]},a.get?u=a.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):a.set&&(u=e.stylize("[Setter]","special")),hasOwnProperty(n,i)||(s="["+i+"]"),u||(e.seen.indexOf(a.value)<0?(u=isNull(t)?formatValue(e,a.value,null):formatValue(e,a.value,t-1),u.indexOf("\n")>-1&&(u=o?u.split("\n").map(function(e){return"  "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return"   "+e}).join("\n"))):u=e.stylize("[Circular]","special")),isUndefined(s)){if(o&&i.match(/^\d+$/))return u;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+u}function reduceToSingleString(e,r,t){var n=0,i=e.reduce(function(e,r){return n++,r.indexOf("\n")>=0&&n++,e+r.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?t[0]+(""===r?"":r+"\n ")+" "+e.join(",\n  ")+" "+t[1]:t[0]+r+" "+e.join(", ")+" "+t[1]}function isArray(e){return Array.isArray(e)}function isBoolean(e){return"boolean"==typeof e}function isNull(e){return null===e}function isNullOrUndefined(e){return null==e}function isNumber(e){return"number"==typeof e}function isString(e){return"string"==typeof e}function isSymbol(e){return"symbol"==typeof e}function isUndefined(e){return void 0===e}function isRegExp(e){return isObject(e)&&"[object RegExp]"===objectToString(e)}function isObject(e){return"object"==typeof e&&null!==e}function isDate(e){return isObject(e)&&"[object Date]"===objectToString(e)}function isError(e){return isObject(e)&&("[object Error]"===objectToString(e)||e instanceof Error)}function isFunction(e){return"function"==typeof e}function isPrimitive(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function objectToString(e){return Object.prototype.toString.call(e)}function pad(e){return 10>e?"0"+e.toString(10):e.toString(10)}function timestamp(){var e=new Date,r=[pad(e.getHours()),pad(e.getMinutes()),pad(e.getSeconds())].join(":");return[e.getDate(),months[e.getMonth()],r].join(" ")}function hasOwnProperty(e,r){return Object.prototype.hasOwnProperty.call(e,r)}var formatRegExp=/%[sdj%]/g;exports.format=function(e){if(!isString(e)){for(var r=[],t=0;t<arguments.length;t++)r.push(inspect(arguments[t]));return r.join(" ")}for(var t=1,n=arguments,i=n.length,o=String(e).replace(formatRegExp,function(e){if("%%"===e)return"%";if(t>=i)return e;switch(e){case"%s":return String(n[t++]);case"%d":return Number(n[t++]);case"%j":try{return JSON.stringify(n[t++])}catch(r){return"[Circular]"}default:return e}}),s=n[t];i>t;s=n[++t])o+=isNull(s)||!isObject(s)?" "+s:" "+inspect(s);return o},exports.deprecate=function(e,r){function t(){if(!n){if(process.throwDeprecation)throw new Error(r);process.traceDeprecation?console.trace(r):console.error(r),n=!0}return e.apply(this,arguments)}if(isUndefined(global.process))return function(){return exports.deprecate(e,r).apply(this,arguments)};if(process.noDeprecation===!0)return e;var n=!1;return t};var debugs={},debugEnviron;exports.debuglog=function(e){if(isUndefined(debugEnviron)&&(debugEnviron=process.env.NODE_DEBUG||""),e=e.toUpperCase(),!debugs[e])if(new RegExp("\\b"+e+"\\b","i").test(debugEnviron)){var r=process.pid;debugs[e]=function(){var t=exports.format.apply(exports,arguments);console.error("%s %d: %s",e,r,t)}}else debugs[e]=function(){};return debugs[e]},exports.inspect=inspect,inspect.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},inspect.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},exports.isArray=isArray,exports.isBoolean=isBoolean,exports.isNull=isNull,exports.isNullOrUndefined=isNullOrUndefined,exports.isNumber=isNumber,exports.isString=isString,exports.isSymbol=isSymbol,exports.isUndefined=isUndefined,exports.isRegExp=isRegExp,exports.isObject=isObject,exports.isDate=isDate,exports.isError=isError,exports.isFunction=isFunction,exports.isPrimitive=isPrimitive,exports.isBuffer=require("./support/isBuffer");var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];exports.log=function(){console.log("%s - %s",timestamp(),exports.format.apply(exports,arguments))},exports.inherits=require("inherits"),exports._extend=function(e,r){if(!r||!isObject(r))return e;for(var t=Object.keys(r),n=t.length;n--;)e[t[n]]=r[t[n]];return e};
-	}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-	},{"./support/isBuffer":142,"_process":138,"inherits":127}],144:[function(require,module,exports){
-	module.exports.VectorTile=require("./lib/vectortile.js"),module.exports.VectorTileFeature=require("./lib/vectortilefeature.js"),module.exports.VectorTileLayer=require("./lib/vectortilelayer.js");
-	},{"./lib/vectortile.js":145,"./lib/vectortilefeature.js":147,"./lib/vectortilelayer.js":148}],145:[function(require,module,exports){
-	"use strict";function VectorTile(e,r){this.layers=e.readFields(readTile,{},r)}function readTile(e,r,i){if(3===e){var t=new VectorTileLayer(i,i.readVarint()+i.pos);t.length&&(r[t.name]=t)}}var VectorTileLayer=require("./vectortilelayer");module.exports=VectorTile;
-	},{"./vectortilelayer":148}],146:[function(require,module,exports){
-	"use strict";function VectorTileClipper(i){this.feature=i,this.finalRatio=4096/i.extent*Math.pow(2,i.dz);var t=64;t/=this.finalRatio;var s=i.extent>>i.dz;t>s&&(t=s),this.dz=i.dz,this.margin=t,this.xmin=s*i.xPos-t,this.ymin=s*i.yPos-t,this.xmax=this.xmin+s+2*t,this.ymax=this.ymin+s+2*t,this.lines=[],this._prevIsIn=!1,this.type=i.type}var Point=require("point-geometry");module.exports=VectorTileClipper,VectorTileClipper.prototype.loadGeometry=function(){var i=this.feature._pbf;i.pos=this.feature._geometry;for(var t=i.readVarint()+i.pos,s=1,h=0,n=0,e=0;i.pos<t;){if(!h){var x=i.readVarint();s=7&x,h=x>>3}if(h--,1===s||2===s)n+=i.readSVarint(),e+=i.readSVarint(),1===s?this.moveTo(n,e):this.lineTo(n,e);else{if(7!==s)throw new Error("unknown command "+s);this.closePolygon()}}return this.result()},VectorTileClipper.prototype.moveTo=function(i,t){this._push_line(),this._prevIsIn=this._isIn(i,t),this._moveTo(i,t,this._prevIsIn),this._prevPt=new Point(i,t),this._firstPt=new Point(i,t)},VectorTileClipper.prototype.lineTo=function(i,t){var s,h,n,e,x,y,l,o,m,r,a,p,_=this._isIn(i,t);if(_)this._prevIsIn?this._lineTo(i,t,!0):(s=this._prevPt,h=new Point(i,t),n=this._intersect(h,s),this._lineTo(n.x,n.y,!0),this._lineTo(h.x,h.y,!0));else if(this._prevIsIn)h=this._prevPt,s=new Point(i,t),n=this._intersect(h,s),this._lineTo(n.x,n.y,!0),this._lineTo(s.x,s.y,!1);else if(e=this._prevPt,x=new Point(i,t),e.x<=this.xmin&&x.x<=this.xmin||e.x>=this.xmax&&x.x>=this.xmax||e.y<=this.ymin&&x.y<=this.ymin||e.y>=this.ymax&&x.y>=this.ymax)this._lineTo(x.x,x.y,!1);else{if(o=[],(e.x<this.xmin&&x.x>this.xmin||e.x>this.xmin&&x.x<this.xmin)&&(y=(this.xmin-e.x)/(x.x-e.x),p=e.y+y*(x.y-e.y),p<=this.ymin?r=!1:p>=this.ymax?r=!0:(l={},l.ratio=y,l.x=this.xmin,l.y=p,o.push(l))),(e.x<this.xmax&&x.x>this.xmax||e.x>this.xmax&&x.x<this.xmax)&&(y=(this.xmax-e.x)/(x.x-e.x),p=e.y+y*(x.y-e.y),p<=this.ymin?r=!1:p>=this.ymax?r=!0:(l={},l.ratio=y,l.x=this.xmax,l.y=p,o.push(l))),(e.y<this.ymin&&x.y>this.ymin||e.y>this.ymin&&x.y<this.ymin)&&(y=(this.ymin-e.y)/(x.y-e.y),a=e.x+y*(x.x-e.x),a<=this.xmin?m=!1:a>=this.xmax?m=!0:(l={},l.ratio=y,l.x=a,l.y=this.ymin,o.push(l))),(e.y<this.ymax&&x.y>this.ymax||e.y>this.ymax&&x.y<this.ymax)&&(y=(this.ymax-e.y)/(x.y-e.y),a=e.x+y*(x.x-e.x),a<=this.xmin?m=!1:a>=this.xmax?m=!0:(l={},l.ratio=y,l.x=a,l.y=this.ymax,o.push(l))),0===o.length)m?r?this._lineTo(this.xmax,this.ymax,!0):this._lineTo(this.xmax,this.ymin,!0):r?this._lineTo(this.xmin,this.ymax,!0):this._lineTo(this.xmin,this.ymin,!0);else if(o.length>1&&o[0].ratio>o[1].ratio)this._lineTo(o[1].x,o[1].y,!0),this._lineTo(o[0].x,o[0].y,!0);else for(var u=0;u<o.length;u++)this._lineTo(o[u].x,o[u].y,!0);this._lineTo(x.x,x.y,!1)}this._prevIsIn=_,this._prevPt=new Point(i,t)},VectorTileClipper.prototype.closePolygon=function(){var i,t;this.line.length>0&&(i=this._firstPt,t=this._prevPt,(i.x!==t.x||i.y!==t.y)&&this.lineTo(i.x,i.y))},VectorTileClipper.prototype.result=function(){return this._push_line(),0===this.lines.length?null:this.lines},VectorTileClipper.prototype._isIn=function(i,t){return i>=this.xmin&&i<=this.xmax&&t>=this.ymin&&t<=this.ymax},VectorTileClipper.prototype._intersect=function(i,t){var s,h,n,e;return t.x>=this.xmin&&t.x<=this.xmax?(h=t.y<=this.ymin?this.ymin:this.ymax,s=i.x+(h-i.y)/(t.y-i.y)*(t.x-i.x)):t.y>=this.ymin&&t.y<=this.ymax?(s=t.x<=this.xmin?this.xmin:this.xmax,h=i.y+(s-i.x)/(t.x-i.x)*(t.y-i.y)):(h=t.y<=this.ymin?this.ymin:this.ymax,s=t.x<=this.xmin?this.xmin:this.xmax,n=(s-i.x)/(t.x-i.x),e=(h-i.y)/(t.y-i.y),e>n?h=i.y+n*(t.y-i.y):s=i.x+e*(t.x-i.x)),new Point(s,h)},VectorTileClipper.prototype._push_line=function(){this.line&&(1===this.type?this.line.length>0&&this.lines.push(this.line):2===this.type?this.line.length>1&&this.lines.push(this.line):3===this.type&&this.line.length>3&&this.lines.push(this.line)),this.line=[]},VectorTileClipper.prototype._moveTo=function(i,t,s){3!==this.type?s&&(i=(i-(this.xmin+this.margin))*this.finalRatio,t=(t-(this.ymin+this.margin))*this.finalRatio,this.line.push(new Point(i,t))):(s||(i<this.xmin&&(i=this.xmin),i>this.xmax&&(i=this.xmax),t<this.ymin&&(t=this.ymin),t>this.ymax&&(t=this.ymax)),i=(i-(this.xmin+this.margin))*this.finalRatio,t=(t-(this.ymin+this.margin))*this.finalRatio,this.line.push(new Point(i,t)),this._is_h=!1,this._is_v=!1)},VectorTileClipper.prototype._lineTo=function(i,t,s){var h,n;if(3!==this.type)if(s){if(i=(i-(this.xmin+this.margin))*this.finalRatio,t=(t-(this.ymin+this.margin))*this.finalRatio,this.line.length>0&&(h=this.line[this.line.length-1],h.x===i&&h.y===t))return;this.line.push(new Point(i,t))}else this.line&&this.line.length>0&&this._push_line();else if(s||(i<this.xmin&&(i=this.xmin),i>this.xmax&&(i=this.xmax),t<this.ymin&&(t=this.ymin),t>this.ymax&&(t=this.ymax)),i=(i-(this.xmin+this.margin))*this.finalRatio,t=(t-(this.ymin+this.margin))*this.finalRatio,this.line&&this.line.length>0){h=this.line[this.line.length-1];var e=h.x===i,x=h.y===t;if(e&&x)return;this._is_h&&e?(h.x=i,h.y=t,n=this.line[this.line.length-2],this._is_h=n.x===i,this._is_v=n.y===t):this._is_v&&x?(h.x=i,h.y=t,n=this.line[this.line.length-2],this._is_h=n.x===i,this._is_v=n.y===t):(this.line.push(new Point(i,t)),this._is_h=e,this._is_v=x)}else this.line.push(new Point(i,t))};
-	},{"point-geometry":137}],147:[function(require,module,exports){
-	"use strict";function VectorTileFeature(e,t,r,i,o){this.properties={},this.extent=r,this.type=0,this._pbf=e,this._geometry=-1,this._keys=i,this._values=o,e.readFields(readFeature,this,t)}function readFeature(e,t,r){1==e?t._id=r.readVarint():2==e?readTag(r,t):3==e?t.type=r.readVarint():4==e&&(t._geometry=r.pos)}function readTag(e,t){for(var r=e.readVarint()+e.pos;e.pos<r;){var i=t._keys[e.readVarint()],o=t._values[e.readVarint()];t.properties[i]=o}}var Point=require("point-geometry"),VectorTileClipper=require("./vectortileclipper");module.exports=VectorTileFeature,VectorTileFeature.types=["Unknown","Point","LineString","Polygon"],VectorTileFeature.prototype.loadGeometry=function(){var e;if(this.dz){var t=new VectorTileClipper(this);e=t.loadGeometry()}else{for(var r=0,i=this.extent;i>4096;)r+=1,i>>=1;var o=this._pbf;o.pos=this._geometry;var a,n=o.readVarint()+o.pos,s=1,p=0,h=0,u=0;for(e=[];o.pos<n;){if(!p){var l=o.readVarint();s=7&l,p=l>>3}if(p--,1===s||2===s)h+=o.readSVarint(),u+=o.readSVarint(),1===s&&(a&&e.push(a),a=[]),a.push(new Point(h>>r,u>>r));else{if(7!==s)throw new Error("unknown command "+s);a&&a.push(a[0].clone())}}a&&e.push(a)}return e},VectorTileFeature.prototype.bbox=function(){var e=this._pbf;e.pos=this._geometry;for(var t=e.readVarint()+e.pos,r=1,i=0,o=0,a=0,n=1/0,s=-(1/0),p=1/0,h=-(1/0);e.pos<t;){if(!i){var u=e.readVarint();r=7&u,i=u>>3}if(i--,1===r||2===r)o+=e.readSVarint(),a+=e.readSVarint(),n>o&&(n=o),o>s&&(s=o),p>a&&(p=a),a>h&&(h=a);else if(7!==r)throw new Error("unknown command "+r)}return[n,p,s,h]},VectorTileFeature.prototype.toGeoJSON=function(e,t,r){for(var i=this.extent*Math.pow(2,r),o=this.extent*e,a=this.extent*t,n=this.loadGeometry(),s=VectorTileFeature.types[this.type],p=0;p<n.length;p++)for(var h=n[p],u=0;u<h.length;u++){var l=h[u],d=180-360*(l.y+a)/i;h[u]=[360*(l.x+o)/i-180,360/Math.PI*Math.atan(Math.exp(d*Math.PI/180))-90]}return"Point"===s&&1===n.length?n=n[0][0]:"Point"===s?(n=n[0],s="MultiPoint"):"LineString"===s&&1===n.length?n=n[0]:"LineString"===s&&(s="MultiLineString"),{type:"Feature",geometry:{type:s,coordinates:n},properties:this.properties}};
-	},{"./vectortileclipper":146,"point-geometry":137}],148:[function(require,module,exports){
-	"use strict";function VectorTileLayer(e,t){this.version=1,this.name=null,this.extent=4096,this.length=0,this._pbf=e,this._keys=[],this._values=[],this._features=[],e.readFields(readLayer,this,t),this.length=this._features.length}function readLayer(e,t,r){15===e?t.version=r.readVarint():1===e?t.name=r.readString():5===e?t.extent=r.readVarint():2===e?t._features.push(r.pos):3===e?t._keys.push(r.readString()):4===e&&t._values.push(readValueMessage(r))}function readValueMessage(e){for(var t=null,r=e.readVarint()+e.pos;e.pos<r;){var a=e.readVarint()>>3;t=1===a?e.readString():2===a?e.readFloat():3===a?e.readDouble():4===a?e.readVarint64():5===a?e.readVarint():6===a?e.readSVarint():7===a?e.readBoolean():null}return t}var VectorTileFeature=require("./vectortilefeature.js");module.exports=VectorTileLayer,VectorTileLayer.prototype.feature=function(e){if(0>e||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];var t=this._pbf.readVarint()+this._pbf.pos;return new VectorTileFeature(this._pbf,t,this.extent,this._keys,this._values)};
-	},{"./vectortilefeature.js":147}],149:[function(require,module,exports){
-	var bundleFn=arguments[3],sources=arguments[4],cache=arguments[5],stringify=JSON.stringify;module.exports=function(r){for(var e,t=Object.keys(cache),n=0,o=t.length;o>n;n++){var a=t[n],i=cache[a].exports;if(i===r||i["default"]===r){e=a;break}}if(!e){e=Math.floor(Math.pow(16,8)*Math.random()).toString(16);for(var s={},n=0,o=t.length;o>n;n++){var a=t[n];s[a]=a}sources[e]=[Function(["require","module","exports"],"("+r+")(self)"),s]}var u=Math.floor(Math.pow(16,8)*Math.random()).toString(16),f={};f[e]=e,sources[u]=[Function(["require"],"var f = require("+stringify(e)+");(f.default ? f.default : f)(self);"),f];var c="("+bundleFn+")({"+Object.keys(sources).map(function(r){return stringify(r)+":["+sources[r][0]+","+stringify(sources[r][1])+"]"}).join(",")+"},{},["+stringify(u)+"])",l=window.URL||window.webkitURL||window.mozURL||window.msURL;return new Worker(l.createObjectURL(new Blob([c],{type:"text/javascript"})))};
-	},{}]},{},[24])(24)
-	});
-
-	L.MapboxGL = L.Layer.extend({
-	    options: {
-	      updateInterval: 32
-	    },
-
-	    initialize: function (options) {
-	        L.setOptions(this, options);
-
-	        if (options.accessToken) {
-	            mapboxgl.accessToken = options.accessToken;
-	        } else {
-	            throw new Error('You should provide a Mapbox GL access token as a token option.');
-	        }
-
-	         /**
-	         * Create a version of `fn` that only fires once every `time` millseconds.
-	         *
-	         * @param {Function} fn the function to be throttled
-	         * @param {number} time millseconds required between function calls
-	         * @param {*} context the value of `this` with which the function is called
-	         * @returns {Function} debounced function
-	         * @private
-	         */
-	        var throttle = function (fn, time, context) {
-	            var lock, args, wrapperFn, later;
-
-	            later = function () {
-	                // reset lock and call if queued
-	                lock = false;
-	                if (args) {
-	                    wrapperFn.apply(context, args);
-	                    args = false;
-	                }
-	            };
-
-	            wrapperFn = function () {
-	                if (lock) {
-	                    // called too soon, queue to call later
-	                    args = arguments;
-
-	                } else {
-	                    // call and lock until later
-	                    fn.apply(context, arguments);
-	                    setTimeout(later, time);
-	                    lock = true;
-	                }
-	            };
-
-	            return wrapperFn;
-	        };
-
-	        // setup throttling the update event when panning
-	        this._throttledUpdate = throttle(L.Util.bind(this._update, this), this.options.updateInterval);
-	    },
-
-	    onAdd: function (map) {
-	        if (!this._glContainer) {
-	            this._initContainer();
-	        }
-
-	        map._panes.tilePane.appendChild(this._glContainer);
-
-	        this._initGL();
-
-	        this._offset = this._map.containerPointToLayerPoint([0, 0]);
-
-	        // work around https://github.com/mapbox/mapbox-gl-leaflet/issues/47
-	        if (map.options.zoomAnimation) {
-	            L.DomEvent.on(map._proxy, L.DomUtil.TRANSITION_END, this._transitionEnd, this);
-	        }
-	    },
-
-	    onRemove: function (map) {
-	        if (this._map.options.zoomAnimation) {
-	            L.DomEvent.off(this._map._proxy, L.DomUtil.TRANSITION_END, this._transitionEnd, this);
-	        }
-
-	        map.getPanes().tilePane.removeChild(this._glContainer);
-	        this._glMap.remove();
-	        this._glMap = null;
-	    },
-
-	    getEvents: function () {
-	        return {
-	            move: this._throttledUpdate, // sensibly throttle updating while panning
-	            zoomanim: this._animateZoom, // applys the zoom animation to the <canvas>
-	            zoom: this._pinchZoom, // animate every zoom event for smoother pinch-zooming
-	            zoomstart: this._zoomStart, // flag starting a zoom to disable panning
-	            zoomend: this._zoomEnd
-	        };
-	    },
-
-	    _initContainer: function () {
-	        var container = this._glContainer = L.DomUtil.create('div', 'leaflet-gl-layer');
-
-	        var size = this._map.getSize();
-	        container.style.width  = size.x + 'px';
-	        container.style.height = size.y + 'px';
-	    },
-
-	    _initGL: function () {
-	        var center = this._map.getCenter();
-
-	        var options = L.extend({}, this.options, {
-	            container: this._glContainer,
-	            interactive: false,
-	            center: [center.lng, center.lat],
-	            zoom: this._map.getZoom() - 1,
-	            attributionControl: false
-	        });
-
-	        this._glMap = new mapboxgl.Map(options);
-
-	        // allow GL base map to pan beyond min/max latitudes
-	        this._glMap.transform.latRange = null;
-
-	        // treat child <canvas> element like L.ImageOverlay
-	        L.DomUtil.addClass(this._glMap._canvas.canvas, 'leaflet-image-layer');
-	        L.DomUtil.addClass(this._glMap._canvas.canvas, 'leaflet-zoom-animated');
-	    },
-
-	    _update: function (e) {
-	        // update the offset so we can correct for it later when we zoom
-	        this._offset = this._map.containerPointToLayerPoint([0, 0]);
-
-	        if (this._zooming) {
-	          return;
-	        }
-
-	        var size = this._map.getSize(),
-	            container = this._glContainer,
-	            gl = this._glMap,
-	            topLeft = this._map.containerPointToLayerPoint([0, 0]);
-
-	        L.DomUtil.setPosition(container, topLeft);
-
-	        var center = this._map.getCenter();
-
-	        // gl.setView([center.lat, center.lng], this._map.getZoom() - 1, 0);
-	        // calling setView directly causes sync issues because it uses requestAnimFrame
-
-	        var tr = gl.transform;
-	        tr.center = mapboxgl.LngLat.convert([center.lng, center.lat]);
-	        tr.zoom = this._map.getZoom() - 1;
-
-	        if (gl.transform.width !== size.x || gl.transform.height !== size.y) {
-	            container.style.width  = size.x + 'px';
-	            container.style.height = size.y + 'px';
-	            gl._resize();
-	        } else {
-	          gl.update();
-	        }
-	    },
-
-	    // update the map constantly during a pinch zoom
-	    _pinchZoom: function (e) {
-	      this._glMap.jumpTo({
-	        zoom: this._map.getZoom() - 1,
-	        center: this._map.getCenter()
-	      });
-	    },
-
-	    // borrowed from L.ImageOverlay https://github.com/Leaflet/Leaflet/blob/master/src/layer/ImageOverlay.js#L139-L144
-	    _animateZoom: function (e) {
-	      var scale = this._map.getZoomScale(e.zoom),
-	          offset = this._map._latLngToNewLayerPoint(this._map.getBounds().getNorthWest(), e.zoom, e.center);
-
-	      L.DomUtil.setTransform(this._glMap._canvas.canvas, offset.subtract(this._offset), scale);
-	    },
-
-	    _zoomStart: function (e) {
-	      this._zooming = true;
-	    },
-
-	    _zoomEnd: function () {
-	      var scale = this._map.getZoomScale(this._map.getZoom()),
-	          offset = this._map._latLngToNewLayerPoint(this._map.getBounds().getNorthWest(), this._map.getZoom(), this._map.getCenter());
-
-	      L.DomUtil.setTransform(this._glMap._canvas.canvas, offset.subtract(this._offset), scale);
-	    },
-
-	    _transitionEnd: function (e) {
-	      L.Util.requestAnimFrame(function () {
-	          var zoom = this._map.getZoom(),
-	          center = this._map.getCenter(),
-	          offset = this._map.latLngToContainerPoint(this._map.getBounds().getNorthWest());
-
-	          // reset the scale and offset
-	          L.DomUtil.setTransform(this._glMap._canvas.canvas, offset, 1);
-
-	          // enable panning once the gl map is ready again
-	          this._glMap.once('moveend', L.Util.bind(function () {
-	              this._zooming = false;
-	              this._zoomEnd();
-	          }, this));
-
-	          // update the map position
-	          this._glMap.jumpTo({
-	              center: center,
-	              zoom: zoom - 1
-	          });
-	      }, this)
-	    }
-	});
-
-	L.mapboxGL = function (options) {
-	    return new L.MapboxGL(options);
-	};
-
-	function fetchMetadata (url, context) {
-	  esriLeaflet.request(url, {}, function (error, style) {
-	    if (!error) {
-	      esriLeaflet.request(style.sources.esri.url, {}, function (error, tileMetadata) {
-	        if (!error) {
-	          formatStyle(style, tileMetadata, url);
-	          context._mapboxGL = L$1.mapboxGL({
-	            accessToken: 'ezree',
-	            style: style
-	          });
-
-	          context._ready = true;
-	          context.fire('ready', {}, true);
-	        }
-	      }, context);
-	    } else {
-	      throw new Error('Unable to fetch vector tile style metadata');
-	    }
-	  }, context);
-	}
-
-	function formatStyle (style, metadata, styleUrl) {
-	  // if a relative path is referenced, the default style can be found in a standard location
-	  if (style.sources.esri.url && style.sources.esri.url.indexOf('http') === -1) {
-	    style.sources.esri.url = styleUrl.replace('/resources/styles/root.json', '');
-	  }
-
-	  // right now ArcGIS Pro published vector services have a slightly different signature
-	  if (metadata.tiles && metadata.tiles[0].charAt(0) !== '/') {
-	    metadata.tiles[0] = '/' + metadata.tiles[0];
-	  }
-
-	  if (metadata.tileMap && metadata.tileMap.charAt(0) !== '/') {
-	    metadata.tileMap = '/' + metadata.tileMap;
-	  }
-
-	  style.sources.esri = {
-	    type: 'vector',
-	    scheme: 'xyz',
-	    tilejson: metadata.tilejson || '2.0.0',
-	    format: (metadata.tileInfo && metadata.tileInfo.format) || 'pbf',
-	    index: metadata.tileMap ? style.sources.esri.url + metadata.tileMap : null,
-	    tiles: [
-	      style.sources.esri.url + metadata.tiles[0]
-	    ],
-	    description: metadata.description,
-	    name: metadata.name
-	  };
-
-	  if (style.glyphs.indexOf('http') === -1) {
-	    // set paths to sprite and glyphs
-	    style.glyphs = styleUrl.replace('styles/root.json', style.glyphs.replace('../', ''));
-	    style.sprite = styleUrl.replace('styles/root.json', style.sprite.replace('../', ''));
-	  }
-	}
-
-	var Basemap = L$1.Layer.extend({
-	  statics: {
-	    URLPREFIX: 'https://www.arcgis.com/sharing/rest/content/items/',
-	    URLSUFFIX: '/resources/styles/root.json',
-	    STYLES: {
-	      'DarkGray': '57436c01bc754dbb87dfb636b6484022',
-	      'Gray': '1e47168d181248e491541ffd5a91c0de',
-	      'Hybrid': 'af6063d6906c4eb589dfe03819610660',
-	      'Navigation': 'e19e9330bf08490ca8353d76b5e2e658',
-	      'Streets': 'a60a37a27cc140ddad15f919cd5a69f2',
-	      'StreetsNight': '92c551c9f07b4147846aae273e822714',
-	      'StreetsRelief': '78c0a9ab4fbf4198a8b951848aab19d8',
-	      'Topographic': '86d5ed4b6dc741de9dad5f0fbe09ae95',
-	      'Spring': '763884983d3544c0a418a97992881fce',
-	      'Newspaper': '4f4843d99c34436f82920932317893ae',
-	      'MidCentury': '267f44f08a844c7abee2b62b00600540',
-	      'ModernAntique': '996d9e7a3aac4514bb692ce7a990f1c1',
-	      'BlackAndWhite': '3161443179244702a5e0449010013b54'
-	    }
-	  },
-
-	  initialize: function (options) {
-	    // L.Layer expects a JSON object literal to be passed in constructor
-	    options = {
-	      key: options
-	    };
-
-	    if (typeof options.key === 'string' && Basemap.STYLES[options.key]) {
-	      var url = Basemap.URLPREFIX + Basemap.STYLES[options.key] + Basemap.URLSUFFIX;
-	      fetchMetadata(url, this);
-	    } else {
-	      throw new Error('L.esri.Vector.Basemap: Invalid parameter. Use one of "DarkGray", "Gray", "Hybrid", "Navigation", "Streets", "StreetsNight", "StreetsRelief", "Topographic"');
-	    }
-	  },
-
-	  onAdd: function (map) {
-	    this._map = map;
-
-	    esriLeaflet.Util.setEsriAttribution(map);
-
-	    if (map.attributionControl) {
-	      // 95% sure this is the right static attribution url
-	      esriLeaflet.Util._getAttributionData('https://static.arcgis.com/attribution/World_Street_Map', map);
-	      map.attributionControl.addAttribution('<span class="esri-dynamic-attribution">USGS, NOAA</span>');
-	    }
-
-	    if (this._ready) {
-	      this._asyncAdd();
-	    } else {
-	      this.once('ready', function () {
-	        this._asyncAdd();
-	      }, this);
-	    }
-	  },
-
-	  onRemove: function (map) {
-	    map.off('moveend', esriLeaflet.Util._updateMapAttribution);
-	    map.removeLayer(this._mapboxGL);
-
-	    if (map.attributionControl) {
-	      var vectorAttribution = document.getElementsByClassName('esri-dynamic-attribution')[0].outerHTML;
-	      // this doesn't work, not sure why.
-	      map.attributionControl.removeAttribution(vectorAttribution);
-	    }
-	  },
-
-	  _asyncAdd: function () {
-	    var map = this._map;
-
-	    // set the background color of the map to the background color of the tiles
-	    map.getContainer().style.background = this._mapboxGL.options.style.layers[0].paint['background-color'];
-
-	    map.on('moveend', esriLeaflet.Util._updateMapAttribution);
-	    this._mapboxGL.addTo(map, this);
-	  }
-	});
-
-	function basemap (key) {
-	  return new Basemap(key);
-	}
-
-	var Layer = L$1.Layer.extend({
-	  statics: {
-	    URLPREFIX: 'https://www.arcgis.com/sharing/rest/content/items/'
-	  },
-
-	  initialize: function (options) {
-	    // L.Layer expects a JSON object literal to be passed in constructor
-	    options = {
-	      id: options
-	    };
-
-	    if (typeof options.id === 'string') {
-	      var itemMetadataUrl = Layer.URLPREFIX + options.id;
-	      var tileUrl;
-	      var styleUrl;
-
-	      esriLeaflet.request(itemMetadataUrl, {}, function (error, metadata) {
-	        if (!error) {
-	          tileUrl = metadata.url;
-
-	          // custom tileset published using ArcGIS Pro
-	          if (tileUrl.indexOf('basemaps.arcgis.com') === -1) {
-	            this._customTileset = true;
-	            // if copyright info was published, display it.
-	            if (metadata.accessInformation) {
-	              this._copyrightText = metadata.accessInformation;
-	            }
-	            esriLeaflet.request(tileUrl, {}, function (error, tileMetadata) {
-	              if (!error) {
-	                // right now ArcGIS Pro published vector services have a slightly different signature
-	                if (tileMetadata.defaultStyles.charAt(0) !== '/') {
-	                  tileMetadata.defaultStyles = '/' + tileMetadata.defaultStyles;
-	                }
-
-	                styleUrl = tileUrl + tileMetadata.defaultStyles + '/root.json';
-	                esriLeaflet.request(styleUrl, {}, function (error, style) {
-	                  if (!error) {
-	                    formatStyle(style, tileMetadata, styleUrl);
-
-	                    this._mapboxGL = L$1.mapboxGL({
-	                      accessToken: 'ezree',
-	                      style: style
-	                    });
-
-	                    this._ready = true;
-	                    this.fire('ready', {}, true);
-	                  }
-	                }, this);
-	              }
-	            }, this);
-	          } else {
-	            // custom symbology applied to hosted basemap tiles
-	            fetchMetadata(itemMetadataUrl + '/resources/styles/root.json', this);
-	          }
-	        }
-	      }, this);
-	    } else {
-	      throw new Error('L.esri.Vector.Layer: Invalid parameter. Use the id of an ArcGIS Online vector tile item');
-	    }
-	  },
-
-	  onAdd: function (map) {
-	    this._map = map;
-	    esriLeaflet.Util.setEsriAttribution(map);
-
-	    if (this._ready) {
-	      this._asyncAdd();
-	    } else {
-	      this.once('ready', function () {
-	        this._asyncAdd();
-	      }, this);
-	    }
-	  },
-
-	  onRemove: function (map) {
-	    map.off('moveend', esriLeaflet.Util._updateMapAttribution);
-	    map.removeLayer(this._mapboxGL);
-
-	    if (map.attributionControl) {
-	      var vectorAttribution = document.getElementsByClassName('esri-dynamic-attribution')[0].outerHTML;
-	      // this doesn't work, not sure why.
-	      map.attributionControl.removeAttribution(vectorAttribution);
-	    }
-	  },
-
-	  _asyncAdd: function () {
-	    var map = this._map;
-	    if (map.attributionControl) {
-	      if (this._customTileset) {
-	        if (this._copyrightText) {
-	          // pull static copyright text for services published with Pro
-	          map.attributionControl.addAttribution('<span class="esri-dynamic-attribution">' + this._copyrightText + '</span>');
-	        }
-	      } else {
-	        // provide dynamic attribution for Esri basemaps
-	        esriLeaflet.Util._getAttributionData('https://static.arcgis.com/attribution/World_Street_Map', map);
-	        map.attributionControl.addAttribution('<span class="esri-dynamic-attribution">USGS, NOAA</span>');
-	        map.on('moveend', esriLeaflet.Util._updateMapAttribution);
-	      }
-	    }
-
-	    // set the background color of the map to the background color of the tiles
-	    map.getContainer().style.background = this._mapboxGL.options.style.layers[0].paint['background-color'];
-	    this._mapboxGL.addTo(map, this);
-	  }
-	});
-
-	function layer (id) {
-	  return new Layer(id);
-	}
-
-	exports.VERSION = version;
-	exports.Basemap = Basemap;
-	exports.basemap = basemap;
-	exports.Layer = Layer;
-	exports.layer = layer;
-
-}));
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LXZlY3Rvci1kZWJ1Zy5qcyIsInNvdXJjZXMiOlsiLi4vcGFja2FnZS5qc29uIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21hcGJveC1nbC9kaXN0L21hcGJveC1nbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9tYXBib3gtZ2wtbGVhZmxldC9sZWFmbGV0LW1hcGJveC1nbC5qcyIsIi4uL3NyYy9VdGlsLmpzIiwiLi4vc3JjL0Jhc2VtYXAuanMiLCIuLi9zcmMvTGF5ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXQtdmVjdG9yXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJFc3JpIHZlY3RvciBiYXNlbWFwIHBsdWdpbiBmb3IgTGVhZmxldC5cIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMS4wLjZcIixcbiAgXCJhdXRob3JcIjogXCJKb2huIEdyYXZvaXMgPGpncmF2b2lzQGVzcmkuY29tPiAoaHR0cDovL2pvaG5ncmF2b2lzLmNvbSlcIixcbiAgXCJjb250cmlidXRvcnNcIjogW1xuICAgIFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCJcbiAgXSxcbiAgXCJidWdzXCI6IHtcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9Fc3JpL2VzcmktbGVhZmxldC12ZWN0b3IvaXNzdWVzXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4zXCIsXG4gICAgXCJsZWFmbGV0XCI6IFwiXjEuMC4wXCIsXG4gICAgXCJtYXBib3gtZ2xcIjogXCJnaXQraHR0cHM6Ly9naXRodWIuY29tL0VzcmkvbWFwYm94LWdsLWpzLmdpdCNpbmRleGVkLXZlY3Rvci1zb3VyY2VzXCIsXG4gICAgXCJtYXBib3gtZ2wtbGVhZmxldFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vamdyYXZvaXMvbWFwYm94LWdsLWxlYWZsZXQjaW5kZXhlZC12ZWN0b3Itc291cmNlc1wiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImdoLXJlbGVhc2VcIjogXCJeMi4wLjBcIixcbiAgICBcImh0dHAtc2VydmVyXCI6IFwiXjAuOC41XCIsXG4gICAgXCJta2RpcnBcIjogXCJeMC41LjFcIixcbiAgICBcIm5vZGVtb25cIjogXCJeMS45LjJcIixcbiAgICBcInJvbGx1cFwiOiBcIl4wLjI1LjRcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tanNvblwiOiBcIl4yLjAuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1ub2RlLXJlc29sdmVcIjogXCJeMS40LjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tdWdsaWZ5XCI6IFwiXjAuMy4xXCIsXG4gICAgXCJzZW1pc3RhbmRhcmRcIjogXCJeNy4wLjVcIixcbiAgICBcInNuYXp6eVwiOiBcIl4yLjAuMVwiLFxuICAgIFwid2F0Y2hcIjogXCJeMC4xNy4xXCJcbiAgfSxcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9Fc3JpL2VzcmktbGVhZmxldC12ZWN0b3IjcmVhZG1lXCIsXG4gIFwianNuZXh0Om1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXRWZWN0b3IuanNcIixcbiAgXCJqc3BtXCI6IHtcbiAgICBcInJlZ2lzdHJ5XCI6IFwibnBtXCIsXG4gICAgXCJmb3JtYXRcIjogXCJlczZcIixcbiAgICBcIm1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXRWZWN0b3IuanNcIlxuICB9LFxuICBcImxpY2Vuc2VcIjogXCJBcGFjaGUtMi4wXCIsXG4gIFwibWFpblwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LXZlY3Rvci1kZWJ1Zy5qc1wiLFxuICBcImJyb3dzZXJcIjogXCJkaXN0L2VzcmktbGVhZmxldC12ZWN0b3ItZGVidWcuanNcIixcbiAgXCJyZWFkbWVGaWxlbmFtZVwiOiBcIlJFQURNRS5tZFwiLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9Fc3JpL2VzcmktbGVhZmxldC12ZWN0b3IuZ2l0XCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInByZWJ1aWxkXCI6IFwibWtkaXJwIGRpc3RcIixcbiAgICBcImJ1aWxkXCI6IFwicm9sbHVwIC1jIHByb2ZpbGVzL2RlYnVnLmpzICYgcm9sbHVwIC1jIHByb2ZpbGVzL3Byb2R1Y3Rpb24uanNcIixcbiAgICBcImxpbnRcIjogXCJzZW1pc3RhbmRhcmQgfCBzbmF6enlcIixcbiAgICBcInByZXB1Ymxpc2hcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJwcmV0ZXN0XCI6IFwibnBtIHJ1biBidWlsZFwiLFxuICAgIFwic3RhcnRcIjogXCJ3YXRjaCAnbnBtIHJ1biBidWlsZCcgc3JjICYgaHR0cC1zZXJ2ZXIgLXAgODc2NSAtYy0xIC1vXCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1biBsaW50XCIsXG4gICAgXCJyZWxlYXNlXCI6IFwiLi9zY3JpcHRzL3JlbGVhc2Uuc2hcIlxuICB9XG59XG4iLCIoZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT1cIm9iamVjdFwiJiZ0eXBlb2YgbW9kdWxlIT09XCJ1bmRlZmluZWRcIil7bW9kdWxlLmV4cG9ydHM9ZigpfWVsc2UgaWYodHlwZW9mIGRlZmluZT09PVwiZnVuY3Rpb25cIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKFtdLGYpfWVsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCIpe2c9Z2xvYmFsfWVsc2UgaWYodHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiKXtnPXNlbGZ9ZWxzZXtnPXRoaXN9Zy5tYXBib3hnbCA9IGYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIChmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pKHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEJ1ZmZlcih0KXt0Pyh0aGlzLmFycmF5PXQuYXJyYXksdGhpcy5wb3M9dC5wb3MpOih0aGlzLmFycmF5PW5ldyBBcnJheUJ1ZmZlcih0aGlzLmRlZmF1bHRMZW5ndGgpLHRoaXMubGVuZ3RoPXRoaXMuZGVmYXVsdExlbmd0aCx0aGlzLnNldHVwVmlld3MoKSl9bW9kdWxlLmV4cG9ydHM9QnVmZmVyLEJ1ZmZlci5wcm90b3R5cGU9e3BvczowLGl0ZW1TaXplOjQsZGVmYXVsdExlbmd0aDo4MTkyLGFycmF5VHlwZTpcIkFSUkFZX0JVRkZFUlwiLGdldCBpbmRleCgpe3JldHVybiB0aGlzLnBvcy90aGlzLml0ZW1TaXplfSxzZXR1cFZpZXdzOmZ1bmN0aW9uKCl7dGhpcy51Ynl0ZXM9bmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheSksdGhpcy5ieXRlcz1uZXcgSW50OEFycmF5KHRoaXMuYXJyYXkpLHRoaXMudXNob3J0cz1uZXcgVWludDE2QXJyYXkodGhpcy5hcnJheSksdGhpcy5zaG9ydHM9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheSl9LGJpbmQ6ZnVuY3Rpb24odCl7dmFyIGU9dFt0aGlzLmFycmF5VHlwZV07dGhpcy5idWZmZXI/dC5iaW5kQnVmZmVyKGUsdGhpcy5idWZmZXIpOih0aGlzLmJ1ZmZlcj10LmNyZWF0ZUJ1ZmZlcigpLHQuYmluZEJ1ZmZlcihlLHRoaXMuYnVmZmVyKSx0LmJ1ZmZlckRhdGEoZSx0aGlzLmFycmF5LnNsaWNlKDAsdGhpcy5wb3MpLHQuU1RBVElDX0RSQVcpLHRoaXMuYXJyYXk9bnVsbCl9LGRlc3Ryb3k6ZnVuY3Rpb24odCl7dGhpcy5idWZmZXImJnQuZGVsZXRlQnVmZmVyKHRoaXMuYnVmZmVyKX0scmVzaXplOmZ1bmN0aW9uKCl7aWYodGhpcy5sZW5ndGg8dGhpcy5wb3MrdGhpcy5pdGVtU2l6ZSl7Zm9yKDt0aGlzLmxlbmd0aDx0aGlzLnBvcyt0aGlzLml0ZW1TaXplOyl0aGlzLmxlbmd0aD0yKk1hdGgucm91bmQoMS41KnRoaXMubGVuZ3RoLzIpO3RoaXMuYXJyYXk9bmV3IEFycmF5QnVmZmVyKHRoaXMubGVuZ3RoKTt2YXIgdD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5KTt0LnNldCh0aGlzLnVieXRlcyksdGhpcy5zZXR1cFZpZXdzKCl9fX07XG59LHt9XSwyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBMaW5lVmVydGV4QnVmZmVyPXJlcXVpcmUoXCIuL2xpbmVfdmVydGV4X2J1ZmZlclwiKSxMaW5lRWxlbWVudEJ1ZmZlcj1yZXF1aXJlKFwiLi9saW5lX2VsZW1lbnRfYnVmZmVyXCIpLEZpbGxWZXJ0ZXhCdWZmZXI9cmVxdWlyZShcIi4vZmlsbF92ZXJ0ZXhfYnVmZmVyXCIpLEZpbGxFbGVtZW50QnVmZmVyPXJlcXVpcmUoXCIuL3RyaWFuZ2xlX2VsZW1lbnRfYnVmZmVyXCIpLE91dGxpbmVFbGVtZW50QnVmZmVyPXJlcXVpcmUoXCIuL291dGxpbmVfZWxlbWVudF9idWZmZXJcIiksR2x5cGhWZXJ0ZXhCdWZmZXI9cmVxdWlyZShcIi4vZ2x5cGhfdmVydGV4X2J1ZmZlclwiKSxHbHlwaEVsZW1lbnRCdWZmZXI9cmVxdWlyZShcIi4vdHJpYW5nbGVfZWxlbWVudF9idWZmZXJcIiksSWNvblZlcnRleEJ1ZmZlcj1yZXF1aXJlKFwiLi9pY29uX3ZlcnRleF9idWZmZXJcIiksSWNvbkVsZW1lbnRCdWZmZXI9cmVxdWlyZShcIi4vdHJpYW5nbGVfZWxlbWVudF9idWZmZXJcIiksQ29sbGlzaW9uQm94VmVydGV4QnVmZmVyPXJlcXVpcmUoXCIuL2NvbGxpc2lvbl9ib3hfdmVydGV4X2J1ZmZlclwiKSxDaXJjbGVWZXJ0ZXhCdWZmZXI9cmVxdWlyZShcIi4vY2lyY2xlX3ZlcnRleF9idWZmZXJcIiksQ2lyY2xlRWxlbWVudEJ1ZmZlcj1yZXF1aXJlKFwiLi90cmlhbmdsZV9lbGVtZW50X2J1ZmZlclwiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZT1lfHx7fSx7Z2x5cGhWZXJ0ZXg6bmV3IEdseXBoVmVydGV4QnVmZmVyKGUuZ2x5cGhWZXJ0ZXgpLGdseXBoRWxlbWVudDpuZXcgR2x5cGhFbGVtZW50QnVmZmVyKGUuZ2x5cGhFbGVtZW50KSxpY29uVmVydGV4Om5ldyBJY29uVmVydGV4QnVmZmVyKGUuaWNvblZlcnRleCksaWNvbkVsZW1lbnQ6bmV3IEljb25FbGVtZW50QnVmZmVyKGUuaWNvbkVsZW1lbnQpLGNpcmNsZVZlcnRleDpuZXcgQ2lyY2xlVmVydGV4QnVmZmVyKGUuY2lyY2xlVmVydGV4KSxjaXJjbGVFbGVtZW50Om5ldyBDaXJjbGVFbGVtZW50QnVmZmVyKGUuY2lyY2xlRWxlbWVudCksZmlsbFZlcnRleDpuZXcgRmlsbFZlcnRleEJ1ZmZlcihlLmZpbGxWZXJ0ZXgpLGZpbGxFbGVtZW50Om5ldyBGaWxsRWxlbWVudEJ1ZmZlcihlLmZpbGxFbGVtZW50KSxvdXRsaW5lRWxlbWVudDpuZXcgT3V0bGluZUVsZW1lbnRCdWZmZXIoZS5vdXRsaW5lRWxlbWVudCksbGluZVZlcnRleDpuZXcgTGluZVZlcnRleEJ1ZmZlcihlLmxpbmVWZXJ0ZXgpLGxpbmVFbGVtZW50Om5ldyBMaW5lRWxlbWVudEJ1ZmZlcihlLmxpbmVFbGVtZW50KSxjb2xsaXNpb25Cb3hWZXJ0ZXg6bmV3IENvbGxpc2lvbkJveFZlcnRleEJ1ZmZlcihlLmNvbGxpc2lvbkJveFZlcnRleCl9fTtcbn0se1wiLi9jaXJjbGVfdmVydGV4X2J1ZmZlclwiOjMsXCIuL2NvbGxpc2lvbl9ib3hfdmVydGV4X2J1ZmZlclwiOjQsXCIuL2ZpbGxfdmVydGV4X2J1ZmZlclwiOjUsXCIuL2dseXBoX3ZlcnRleF9idWZmZXJcIjo2LFwiLi9pY29uX3ZlcnRleF9idWZmZXJcIjo3LFwiLi9saW5lX2VsZW1lbnRfYnVmZmVyXCI6OCxcIi4vbGluZV92ZXJ0ZXhfYnVmZmVyXCI6OSxcIi4vb3V0bGluZV9lbGVtZW50X2J1ZmZlclwiOjEwLFwiLi90cmlhbmdsZV9lbGVtZW50X2J1ZmZlclwiOjExfV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBDaXJjbGVWZXJ0ZXhCdWZmZXIoZSl7QnVmZmVyLmNhbGwodGhpcyxlKX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpLEJ1ZmZlcj1yZXF1aXJlKFwiLi9idWZmZXJcIik7bW9kdWxlLmV4cG9ydHM9Q2lyY2xlVmVydGV4QnVmZmVyLENpcmNsZVZlcnRleEJ1ZmZlci5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEJ1ZmZlcix7ZGVmYXVsdExlbmd0aDozMjc2OCxpdGVtU2l6ZTo0LGFkZDpmdW5jdGlvbihlLHQsaSxyKXt2YXIgZj10aGlzLnBvcyxzPWYvMjt0aGlzLnJlc2l6ZSgpLHRoaXMuc2hvcnRzW3MrMF09MiplKyhpKzEpLzIsdGhpcy5zaG9ydHNbcysxXT0yKnQrKHIrMSkvMix0aGlzLnBvcys9dGhpcy5pdGVtU2l6ZX0sYmluZDpmdW5jdGlvbihlLHQsaSl7QnVmZmVyLnByb3RvdHlwZS5iaW5kLmNhbGwodGhpcyxlKSxlLnZlcnRleEF0dHJpYlBvaW50ZXIodC5hX3BvcywyLGUuU0hPUlQsITEsdGhpcy5pdGVtU2l6ZSxpKzApfX0pO1xufSx7XCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2J1ZmZlclwiOjF9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIENvbGxpc2lvbkJveFZlcnRleEJ1ZmZlcih0KXtCdWZmZXIuY2FsbCh0aGlzLHQpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi8uLi91dGlsL3V0aWxcIiksQnVmZmVyPXJlcXVpcmUoXCIuL2J1ZmZlclwiKTttb2R1bGUuZXhwb3J0cz1Db2xsaXNpb25Cb3hWZXJ0ZXhCdWZmZXIsQ29sbGlzaW9uQm94VmVydGV4QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtpdGVtU2l6ZToxMixkZWZhdWx0TGVuZ3RoOjMyNzY4LGFkZDpmdW5jdGlvbih0LGksZSxyKXt2YXIgcz10aGlzLnBvcyxvPXMvMix1PXRoaXMuaW5kZXg7cmV0dXJuIHRoaXMucmVzaXplKCksdGhpcy5zaG9ydHNbbyswXT10LngsdGhpcy5zaG9ydHNbbysxXT10LnksdGhpcy5zaG9ydHNbbysyXT1NYXRoLnJvdW5kKGkueCksdGhpcy5zaG9ydHNbbyszXT1NYXRoLnJvdW5kKGkueSksdGhpcy51Ynl0ZXNbcys4XT1NYXRoLmZsb29yKDEwKmUpLHRoaXMudWJ5dGVzW3MrOV09TWF0aC5mbG9vcigxMCpyKSx0aGlzLnBvcys9dGhpcy5pdGVtU2l6ZSx1fX0pO1xufSx7XCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2J1ZmZlclwiOjF9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEZpbGxWZXJ0ZXhCdWZmZXIoZSl7QnVmZmVyLmNhbGwodGhpcyxlKX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpLEJ1ZmZlcj1yZXF1aXJlKFwiLi9idWZmZXJcIik7bW9kdWxlLmV4cG9ydHM9RmlsbFZlcnRleEJ1ZmZlcixGaWxsVmVydGV4QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtpdGVtU2l6ZTo0LGFkZDpmdW5jdGlvbihlLGkpe3ZhciB0PXRoaXMucG9zLzI7dGhpcy5yZXNpemUoKSx0aGlzLnNob3J0c1t0KzBdPWUsdGhpcy5zaG9ydHNbdCsxXT1pLHRoaXMucG9zKz10aGlzLml0ZW1TaXplfX0pO1xufSx7XCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2J1ZmZlclwiOjF9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEdseXBoVmVydGV4QnVmZmVyKHQpe0J1ZmZlci5jYWxsKHRoaXMsdCl9dmFyIHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKSxCdWZmZXI9cmVxdWlyZShcIi4vYnVmZmVyXCIpO21vZHVsZS5leHBvcnRzPUdseXBoVmVydGV4QnVmZmVyLEdseXBoVmVydGV4QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtkZWZhdWx0TGVuZ3RoOjMyNzY4LGl0ZW1TaXplOjE2LGFkZDpmdW5jdGlvbih0LGUscixpLHMsaCxvLGYsdSl7dmFyIGE9dGhpcy5wb3MsbD1hLzI7dGhpcy5yZXNpemUoKSx0aGlzLnNob3J0c1tsKzBdPXQsdGhpcy5zaG9ydHNbbCsxXT1lLHRoaXMuc2hvcnRzW2wrMl09TWF0aC5yb3VuZCg2NCpyKSx0aGlzLnNob3J0c1tsKzNdPU1hdGgucm91bmQoNjQqaSksdGhpcy51Ynl0ZXNbYSs4XT1NYXRoLmZsb29yKHMvNCksdGhpcy51Ynl0ZXNbYSs5XT1NYXRoLmZsb29yKGgvNCksdGhpcy51Ynl0ZXNbYSsxMF09TWF0aC5mbG9vcigxMCp1KSx0aGlzLnVieXRlc1thKzEyXT1NYXRoLmZsb29yKDEwKm8pLHRoaXMudWJ5dGVzW2ErMTNdPU1hdGguZmxvb3IoMTAqTWF0aC5taW4oZiwyNSkpLHRoaXMucG9zKz10aGlzLml0ZW1TaXplfSxiaW5kOmZ1bmN0aW9uKHQsZSxyKXtCdWZmZXIucHJvdG90eXBlLmJpbmQuY2FsbCh0aGlzLHQpO3ZhciBpPXRoaXMuaXRlbVNpemU7dC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuYV9wb3MsMix0LlNIT1JULCExLGksciswKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoZS5hX29mZnNldCwyLHQuU0hPUlQsITEsaSxyKzQpLHQudmVydGV4QXR0cmliUG9pbnRlcihlLmFfZGF0YTEsNCx0LlVOU0lHTkVEX0JZVEUsITEsaSxyKzgpLHQudmVydGV4QXR0cmliUG9pbnRlcihlLmFfZGF0YTIsMix0LlVOU0lHTkVEX0JZVEUsITEsaSxyKzEyKX19KTtcbn0se1wiLi4vLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9idWZmZXJcIjoxfV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBJY29uVmVydGV4QnVmZmVyKHQpe0J1ZmZlci5jYWxsKHRoaXMsdCl9dmFyIHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKSxCdWZmZXI9cmVxdWlyZShcIi4vYnVmZmVyXCIpO21vZHVsZS5leHBvcnRzPUljb25WZXJ0ZXhCdWZmZXIsSWNvblZlcnRleEJ1ZmZlci5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEJ1ZmZlcix7ZGVmYXVsdExlbmd0aDozMjc2OCxpdGVtU2l6ZToxNixhZGQ6ZnVuY3Rpb24odCxlLGkscixzLG8saCx1LGYpe3ZhciBhPXRoaXMucG9zLG49YS8yO3RoaXMucmVzaXplKCksdGhpcy5zaG9ydHNbbiswXT10LHRoaXMuc2hvcnRzW24rMV09ZSx0aGlzLnNob3J0c1tuKzJdPU1hdGgucm91bmQoNjQqaSksdGhpcy5zaG9ydHNbbiszXT1NYXRoLnJvdW5kKDY0KnIpLHRoaXMudWJ5dGVzW2ErOF09cy80LHRoaXMudWJ5dGVzW2ErOV09by80LHRoaXMudWJ5dGVzW2ErMTBdPU1hdGguZmxvb3IoMTAqKGZ8fDApKSx0aGlzLnVieXRlc1thKzEyXT1NYXRoLmZsb29yKDEwKihofHwwKSksdGhpcy51Ynl0ZXNbYSsxM109TWF0aC5mbG9vcigxMCpNYXRoLm1pbih1fHwyNSwyNSkpLHRoaXMucG9zKz10aGlzLml0ZW1TaXplfSxiaW5kOmZ1bmN0aW9uKHQsZSxpKXtCdWZmZXIucHJvdG90eXBlLmJpbmQuY2FsbCh0aGlzLHQpO3ZhciByPXRoaXMuaXRlbVNpemU7dC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuYV9wb3MsMix0LlNIT1JULCExLHIsaSswKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoZS5hX29mZnNldCwyLHQuU0hPUlQsITEscixpKzQpLHQudmVydGV4QXR0cmliUG9pbnRlcihlLmFfZGF0YTEsNCx0LlVOU0lHTkVEX0JZVEUsITEscixpKzgpLHQudmVydGV4QXR0cmliUG9pbnRlcihlLmFfZGF0YTIsMix0LlVOU0lHTkVEX0JZVEUsITEscixpKzEyKX19KTtcbn0se1wiLi4vLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9idWZmZXJcIjoxfV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBMaW5lRWxlbWVudEJ1ZmZlcihlKXtCdWZmZXIuY2FsbCh0aGlzLGUpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi8uLi91dGlsL3V0aWxcIiksQnVmZmVyPXJlcXVpcmUoXCIuL2J1ZmZlclwiKTttb2R1bGUuZXhwb3J0cz1MaW5lRWxlbWVudEJ1ZmZlcixMaW5lRWxlbWVudEJ1ZmZlci5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEJ1ZmZlcix7aXRlbVNpemU6NixhcnJheVR5cGU6XCJFTEVNRU5UX0FSUkFZX0JVRkZFUlwiLGFkZDpmdW5jdGlvbihlLHQsaSl7dmFyIHI9dGhpcy5wb3MvMjt0aGlzLnJlc2l6ZSgpLHRoaXMudXNob3J0c1tyKzBdPWUsdGhpcy51c2hvcnRzW3IrMV09dCx0aGlzLnVzaG9ydHNbcisyXT1pLHRoaXMucG9zKz10aGlzLml0ZW1TaXplfX0pO1xufSx7XCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2J1ZmZlclwiOjF9XSw5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIExpbmVWZXJ0ZXhCdWZmZXIoZSl7QnVmZmVyLmNhbGwodGhpcyxlKX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpLEJ1ZmZlcj1yZXF1aXJlKFwiLi9idWZmZXJcIik7bW9kdWxlLmV4cG9ydHM9TGluZVZlcnRleEJ1ZmZlcixMaW5lVmVydGV4QnVmZmVyLmV4dHJ1ZGVTY2FsZT02MyxMaW5lVmVydGV4QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtpdGVtU2l6ZTo4LGRlZmF1bHRMZW5ndGg6MzI3NjgsYWRkOmZ1bmN0aW9uKGUsdCxyLGkscyl7dmFyIHU9dGhpcy5wb3MsZj11LzIsaD10aGlzLmluZGV4LG89TGluZVZlcnRleEJ1ZmZlci5leHRydWRlU2NhbGU7cmV0dXJuIHRoaXMucmVzaXplKCksdGhpcy5zaG9ydHNbZiswXT0yKk1hdGguZmxvb3IoZS54KXxyLHRoaXMuc2hvcnRzW2YrMV09MipNYXRoLmZsb29yKGUueSl8aSx0aGlzLmJ5dGVzW3UrNF09TWF0aC5yb3VuZChvKnQueCksdGhpcy5ieXRlc1t1KzVdPU1hdGgucm91bmQobyp0LnkpLHRoaXMuYnl0ZXNbdSs2XT0oc3x8MCkvMTI4LHRoaXMuYnl0ZXNbdSs3XT0oc3x8MCklMTI4LHRoaXMucG9zKz10aGlzLml0ZW1TaXplLGh9fSk7XG59LHtcIi4uLy4uL3V0aWwvdXRpbFwiOjEwNixcIi4vYnVmZmVyXCI6MX1dLDEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIE91dGxpbmVFbGVtZW50QnVmZmVyKGUpe0J1ZmZlci5jYWxsKHRoaXMsZSl9dmFyIHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKSxCdWZmZXI9cmVxdWlyZShcIi4vYnVmZmVyXCIpO21vZHVsZS5leHBvcnRzPU91dGxpbmVFbGVtZW50QnVmZmVyLE91dGxpbmVFbGVtZW50QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtpdGVtU2l6ZTo0LGFycmF5VHlwZTpcIkVMRU1FTlRfQVJSQVlfQlVGRkVSXCIsYWRkOmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5wb3MvMjt0aGlzLnJlc2l6ZSgpLHRoaXMudXNob3J0c1tpKzBdPWUsdGhpcy51c2hvcnRzW2krMV09dCx0aGlzLnBvcys9dGhpcy5pdGVtU2l6ZX19KTtcbn0se1wiLi4vLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9idWZmZXJcIjoxfV0sMTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gVHJpYW5nbGVFbGVtZW50QnVmZmVyKGUpe0J1ZmZlci5jYWxsKHRoaXMsZSl9dmFyIHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKSxCdWZmZXI9cmVxdWlyZShcIi4vYnVmZmVyXCIpO21vZHVsZS5leHBvcnRzPVRyaWFuZ2xlRWxlbWVudEJ1ZmZlcixUcmlhbmdsZUVsZW1lbnRCdWZmZXIucHJvdG90eXBlPXV0aWwuaW5oZXJpdChCdWZmZXIse2l0ZW1TaXplOjYsYXJyYXlUeXBlOlwiRUxFTUVOVF9BUlJBWV9CVUZGRVJcIixhZGQ6ZnVuY3Rpb24oZSx0LGkpe3ZhciByPXRoaXMucG9zLzI7dGhpcy5yZXNpemUoKSx0aGlzLnVzaG9ydHNbciswXT1lLHRoaXMudXNob3J0c1tyKzFdPXQsdGhpcy51c2hvcnRzW3IrMl09aSx0aGlzLnBvcys9dGhpcy5pdGVtU2l6ZX19KTtcbn0se1wiLi4vLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9idWZmZXJcIjoxfV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQ2lyY2xlQnVja2V0KGUpe3RoaXMuYnVmZmVycz1lLHRoaXMuZWxlbWVudEdyb3Vwcz1uZXcgRWxlbWVudEdyb3VwcyhlLmNpcmNsZVZlcnRleCxlLmNpcmNsZUVsZW1lbnQpfXZhciBFbGVtZW50R3JvdXBzPXJlcXVpcmUoXCIuL2VsZW1lbnRfZ3JvdXBzXCIpO21vZHVsZS5leHBvcnRzPUNpcmNsZUJ1Y2tldCxDaXJjbGVCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTQwOTYscj0wO3I8dGhpcy5mZWF0dXJlcy5sZW5ndGg7cisrKWZvcih2YXIgdD10aGlzLmZlYXR1cmVzW3JdLmxvYWRHZW9tZXRyeSgpWzBdLHM9MDtzPHQubGVuZ3RoO3MrKyl7dGhpcy5lbGVtZW50R3JvdXBzLm1ha2VSb29tRm9yKDYpO3ZhciB1PXRbc10ueCxpPXRbc10ueTtpZighKDA+dXx8dT49ZXx8MD5pfHxpPj1lKSl7dmFyIGw9dGhpcy5idWZmZXJzLmNpcmNsZVZlcnRleC5pbmRleC10aGlzLmVsZW1lbnRHcm91cHMuY3VycmVudC52ZXJ0ZXhTdGFydEluZGV4O3RoaXMuYnVmZmVycy5jaXJjbGVWZXJ0ZXguYWRkKHUsaSwtMSwtMSksdGhpcy5idWZmZXJzLmNpcmNsZVZlcnRleC5hZGQodSxpLDEsLTEpLHRoaXMuYnVmZmVycy5jaXJjbGVWZXJ0ZXguYWRkKHUsaSwxLDEpLHRoaXMuYnVmZmVycy5jaXJjbGVWZXJ0ZXguYWRkKHUsaSwtMSwxKSx0aGlzLmVsZW1lbnRHcm91cHMuZWxlbWVudEJ1ZmZlci5hZGQobCxsKzEsbCsyKSx0aGlzLmVsZW1lbnRHcm91cHMuZWxlbWVudEJ1ZmZlci5hZGQobCxsKzMsbCsyKSx0aGlzLmVsZW1lbnRHcm91cHMuY3VycmVudC52ZXJ0ZXhMZW5ndGgrPTQsdGhpcy5lbGVtZW50R3JvdXBzLmN1cnJlbnQuZWxlbWVudExlbmd0aCs9Mn19fTtcbn0se1wiLi9lbGVtZW50X2dyb3Vwc1wiOjE0fV0sMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gY3JlYXRlQnVja2V0KGUsdCxpLHIsbCl7dmFyIGM9bmV3IFN0eWxlRGVjbGFyYXRpb25TZXQoXCJsYXlvdXRcIixlLnR5cGUsZS5sYXlvdXQse30pLnZhbHVlcygpLGE9e2xhc3RJbnRlZ2VyWm9vbToxLzAsbGFzdEludGVnZXJab29tVGltZTowLGxhc3Rab29tOjB9LHU9e307Zm9yKHZhciBvIGluIGMpdVtvXT1jW29dLmNhbGN1bGF0ZShpLGEpO1wic3ltYm9sXCI9PT1lLnR5cGUmJihjW1widGV4dC1zaXplXCJdJiYodVtcInRleHQtbWF4LXNpemVcIl09Y1tcInRleHQtc2l6ZVwiXS5jYWxjdWxhdGUoMTgsYSksdVtcInRleHQtc2l6ZVwiXT1jW1widGV4dC1zaXplXCJdLmNhbGN1bGF0ZShpKzEsYSkpLGNbXCJpY29uLXNpemVcIl0mJih1W1wiaWNvbi1tYXgtc2l6ZVwiXT1jW1wiaWNvbi1zaXplXCJdLmNhbGN1bGF0ZSgxOCxhKSx1W1wiaWNvbi1zaXplXCJdPWNbXCJpY29uLXNpemVcIl0uY2FsY3VsYXRlKGkrMSxhKSkpO3ZhciBzPVwibGluZVwiPT09ZS50eXBlP0xpbmVCdWNrZXQ6XCJmaWxsXCI9PT1lLnR5cGU/RmlsbEJ1Y2tldDpcInN5bWJvbFwiPT09ZS50eXBlP1N5bWJvbEJ1Y2tldDpcImNpcmNsZVwiPT09ZS50eXBlP0NpcmNsZUJ1Y2tldDpudWxsLG49bmV3IHModCxuZXcgTGF5b3V0UHJvcGVydGllc1tlLnR5cGVdKHUpLHIsaSxsKTtyZXR1cm4gbi5pZD1lLmlkLG4udHlwZT1lLnR5cGUsbltcInNvdXJjZS1sYXllclwiXT1lW1wic291cmNlLWxheWVyXCJdLG4uaW50ZXJhY3RpdmU9ZS5pbnRlcmFjdGl2ZSxuLm1pblpvb209ZS5taW56b29tLG4ubWF4Wm9vbT1lLm1heHpvb20sbi5maWx0ZXI9ZmVhdHVyZUZpbHRlcihlLmZpbHRlciksbi5mZWF0dXJlcz1bXSxufW1vZHVsZS5leHBvcnRzPWNyZWF0ZUJ1Y2tldDt2YXIgTGluZUJ1Y2tldD1yZXF1aXJlKFwiLi9saW5lX2J1Y2tldFwiKSxGaWxsQnVja2V0PXJlcXVpcmUoXCIuL2ZpbGxfYnVja2V0XCIpLFN5bWJvbEJ1Y2tldD1yZXF1aXJlKFwiLi9zeW1ib2xfYnVja2V0XCIpLENpcmNsZUJ1Y2tldD1yZXF1aXJlKFwiLi9jaXJjbGVfYnVja2V0XCIpLExheW91dFByb3BlcnRpZXM9cmVxdWlyZShcIi4uL3N0eWxlL2xheW91dF9wcm9wZXJ0aWVzXCIpLGZlYXR1cmVGaWx0ZXI9cmVxdWlyZShcImZlYXR1cmUtZmlsdGVyXCIpLFN0eWxlRGVjbGFyYXRpb25TZXQ9cmVxdWlyZShcIi4uL3N0eWxlL3N0eWxlX2RlY2xhcmF0aW9uX3NldFwiKTtcbn0se1wiLi4vc3R5bGUvbGF5b3V0X3Byb3BlcnRpZXNcIjo1MyxcIi4uL3N0eWxlL3N0eWxlX2RlY2xhcmF0aW9uX3NldFwiOjU5LFwiLi9jaXJjbGVfYnVja2V0XCI6MTIsXCIuL2ZpbGxfYnVja2V0XCI6MTYsXCIuL2xpbmVfYnVja2V0XCI6MTcsXCIuL3N5bWJvbF9idWNrZXRcIjoxOCxcImZlYXR1cmUtZmlsdGVyXCI6MTA4fV0sMTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gRWxlbWVudEdyb3VwcyhlLHQsbil7dGhpcy52ZXJ0ZXhCdWZmZXI9ZSx0aGlzLmVsZW1lbnRCdWZmZXI9dCx0aGlzLnNlY29uZEVsZW1lbnRCdWZmZXI9bix0aGlzLmdyb3Vwcz1bXX1mdW5jdGlvbiBFbGVtZW50R3JvdXAoZSx0LG4pe3RoaXMudmVydGV4U3RhcnRJbmRleD1lLHRoaXMuZWxlbWVudFN0YXJ0SW5kZXg9dCx0aGlzLnNlY29uZEVsZW1lbnRTdGFydEluZGV4PW4sdGhpcy5lbGVtZW50TGVuZ3RoPTAsdGhpcy52ZXJ0ZXhMZW5ndGg9MCx0aGlzLnNlY29uZEVsZW1lbnRMZW5ndGg9MH1tb2R1bGUuZXhwb3J0cz1FbGVtZW50R3JvdXBzLEVsZW1lbnRHcm91cHMucHJvdG90eXBlLm1ha2VSb29tRm9yPWZ1bmN0aW9uKGUpeyghdGhpcy5jdXJyZW50fHx0aGlzLmN1cnJlbnQudmVydGV4TGVuZ3RoK2U+NjU1MzUpJiYodGhpcy5jdXJyZW50PW5ldyBFbGVtZW50R3JvdXAodGhpcy52ZXJ0ZXhCdWZmZXIuaW5kZXgsdGhpcy5lbGVtZW50QnVmZmVyJiZ0aGlzLmVsZW1lbnRCdWZmZXIuaW5kZXgsdGhpcy5zZWNvbmRFbGVtZW50QnVmZmVyJiZ0aGlzLnNlY29uZEVsZW1lbnRCdWZmZXIuaW5kZXgpLHRoaXMuZ3JvdXBzLnB1c2godGhpcy5jdXJyZW50KSl9O1xufSx7fV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gRmVhdHVyZVRyZWUodCxlKXt0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQuei1NYXRoLmxvZyhlKS9NYXRoLkxOMix0aGlzLnJ0cmVlPXJidXNoKDkpLHRoaXMudG9CZUluc2VydGVkPVtdfWZ1bmN0aW9uIGdlb21ldHJ5SW50ZXJzZWN0c0JveCh0LGUsbil7cmV0dXJuXCJQb2ludFwiPT09ZT9wb2ludEludGVyc2VjdHNCb3godCxuKTpcIkxpbmVTdHJpbmdcIj09PWU/bGluZUludGVyc2VjdHNCb3godCxuKTpcIlBvbHlnb25cIj09PWU/cG9seUludGVyc2VjdHNCb3godCxuKXx8bGluZUludGVyc2VjdHNCb3godCxuKTohMX1mdW5jdGlvbiBwb2x5SW50ZXJzZWN0c0JveCh0LGUpe3JldHVybiBwb2x5Q29udGFpbnNQb2ludCh0LG5ldyBQb2ludChlWzBdLGVbMV0pKXx8cG9seUNvbnRhaW5zUG9pbnQodCxuZXcgUG9pbnQoZVswXSxlWzNdKSl8fHBvbHlDb250YWluc1BvaW50KHQsbmV3IFBvaW50KGVbMl0sZVsxXSkpfHxwb2x5Q29udGFpbnNQb2ludCh0LG5ldyBQb2ludChlWzJdLGVbM10pKT8hMDpsaW5lSW50ZXJzZWN0c0JveCh0LGUpfWZ1bmN0aW9uIGxpbmVJbnRlcnNlY3RzQm94KHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZm9yKHZhciByPXRbbl0sbz0wLGk9ci5sZW5ndGgtMTtvPHIubGVuZ3RoO2k9bysrKXt2YXIgcz1yW29dLGE9cltpXSx1PW5ldyBQb2ludChzLnkscy54KSxsPW5ldyBQb2ludChhLnksYS54KTtpZihzZWdtZW50Q3Jvc3Nlc0hvcml6b250YWwocyxhLGVbMF0sZVsyXSxlWzFdKXx8c2VnbWVudENyb3NzZXNIb3Jpem9udGFsKHMsYSxlWzBdLGVbMl0sZVszXSl8fHNlZ21lbnRDcm9zc2VzSG9yaXpvbnRhbCh1LGwsZVsxXSxlWzNdLGVbMF0pfHxzZWdtZW50Q3Jvc3Nlc0hvcml6b250YWwodSxsLGVbMV0sZVszXSxlWzJdKSlyZXR1cm4hMH1yZXR1cm4gcG9pbnRJbnRlcnNlY3RzQm94KHQsZSl9ZnVuY3Rpb24gc2VnbWVudENyb3NzZXNIb3Jpem9udGFsKHQsZSxuLHIsbyl7aWYoZS55PT09dC55KXJldHVybiBlLnk9PT1vJiZNYXRoLm1pbih0LngsZS54KTw9ciYmTWF0aC5tYXgodC54LGUueCk+PW47dmFyIGk9KG8tdC55KS8oZS55LXQueSkscz10LngraSooZS54LXQueCk7cmV0dXJuIHM+PW4mJnI+PXMmJjE+PWkmJmk+PTB9ZnVuY3Rpb24gcG9pbnRJbnRlcnNlY3RzQm94KHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZm9yKHZhciByPXRbbl0sbz0wO288ci5sZW5ndGg7bysrKWlmKHJbb10ueD49ZVswXSYmcltvXS55Pj1lWzFdJiZyW29dLng8PWVbMl0mJnJbb10ueTw9ZVszXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBnZW9tZXRyeUNvbnRhaW5zUG9pbnQodCxlLG4scil7cmV0dXJuXCJQb2ludFwiPT09ZT9wb2ludENvbnRhaW5zUG9pbnQodCxuLHIpOlwiTGluZVN0cmluZ1wiPT09ZT9saW5lQ29udGFpbnNQb2ludCh0LG4scik6XCJQb2x5Z29uXCI9PT1lP3BvbHlDb250YWluc1BvaW50KHQsbil8fGxpbmVDb250YWluc1BvaW50KHQsbixyKTohMX1mdW5jdGlvbiBkaXN0VG9TZWdtZW50U3F1YXJlZCh0LGUsbil7dmFyIHI9ZS5kaXN0U3FyKG4pO2lmKDA9PT1yKXJldHVybiB0LmRpc3RTcXIoZSk7dmFyIG89KCh0LngtZS54KSoobi54LWUueCkrKHQueS1lLnkpKihuLnktZS55KSkvcjtyZXR1cm4gMD5vP3QuZGlzdFNxcihlKTpvPjE/dC5kaXN0U3FyKG4pOnQuZGlzdFNxcihuLnN1YihlKS5fbXVsdChvKS5fYWRkKGUpKX1mdW5jdGlvbiBsaW5lQ29udGFpbnNQb2ludCh0LGUsbil7Zm9yKHZhciByPW4qbixvPTA7bzx0Lmxlbmd0aDtvKyspZm9yKHZhciBpPXRbb10scz0xO3M8aS5sZW5ndGg7cysrKXt2YXIgYT1pW3MtMV0sdT1pW3NdO2lmKGRpc3RUb1NlZ21lbnRTcXVhcmVkKGUsYSx1KTxyKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIHBvbHlDb250YWluc1BvaW50KHQsZSl7Zm9yKHZhciBuLHIsbyxpPSExLHM9MDtzPHQubGVuZ3RoO3MrKyl7bj10W3NdO2Zvcih2YXIgYT0wLHU9bi5sZW5ndGgtMTthPG4ubGVuZ3RoO3U9YSsrKXI9blthXSxvPW5bdV0sci55PmUueSE9by55PmUueSYmZS54PChvLngtci54KSooZS55LXIueSkvKG8ueS1yLnkpK3IueCYmKGk9IWkpfXJldHVybiBpfWZ1bmN0aW9uIHBvaW50Q29udGFpbnNQb2ludCh0LGUsbil7Zm9yKHZhciByPW4qbixvPTA7bzx0Lmxlbmd0aDtvKyspZm9yKHZhciBpPXRbb10scz0wO3M8aS5sZW5ndGg7cysrKWlmKGlbc10uZGlzdFNxcihlKTw9cilyZXR1cm4hMDtyZXR1cm4hMX12YXIgcmJ1c2g9cmVxdWlyZShcInJidXNoXCIpLFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKSx2dD1yZXF1aXJlKFwidmVjdG9yLXRpbGVcIiksdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPUZlYXR1cmVUcmVlLEZlYXR1cmVUcmVlLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxlLG4pe3QubGF5ZXJzPWUsdC5mZWF0dXJlPW4sdGhpcy50b0JlSW5zZXJ0ZWQucHVzaCh0KX0sRmVhdHVyZVRyZWUucHJvdG90eXBlLl9sb2FkPWZ1bmN0aW9uKCl7dGhpcy5ydHJlZS5sb2FkKHRoaXMudG9CZUluc2VydGVkKSx0aGlzLnRvQmVJbnNlcnRlZD1bXX0sRmVhdHVyZVRyZWUucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQsZSl7dGhpcy50b0JlSW5zZXJ0ZWQubGVuZ3RoJiZ0aGlzLl9sb2FkKCk7dmFyIG4scixvPXQucGFyYW1zfHx7fSxpPXQueCxzPXQueSxhPVtdO1widW5kZWZpbmVkXCIhPXR5cGVvZiBpJiZcInVuZGVmaW5lZFwiIT10eXBlb2Ygcz8obj0oby5yYWRpdXN8fDApKih0LnRpbGVFeHRlbnR8fDQwOTYpL3Quc2NhbGUscj1baS1uLHMtbixpK24scytuXSk6cj1bdC5taW5YLHQubWluWSx0Lm1heFgsdC5tYXhZXTtmb3IodmFyIHU9dGhpcy5ydHJlZS5zZWFyY2gociksbD0wO2w8dS5sZW5ndGg7bCsrKXt2YXIgeT11W2xdLmZlYXR1cmUseD11W2xdLmxheWVycyxmPXZ0LlZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW3kudHlwZV07aWYoKCFvLiR0eXBlfHxmPT09by4kdHlwZSkmJighbnx8Z2VvbWV0cnlDb250YWluc1BvaW50KHkubG9hZEdlb21ldHJ5KCksZixuZXcgUG9pbnQoaSxzKSxuKSkmJmdlb21ldHJ5SW50ZXJzZWN0c0JveCh5LmxvYWRHZW9tZXRyeSgpLGYscikpe3ZhciBoPXkudG9HZW9KU09OKHRoaXMueCx0aGlzLnksdGhpcy56KTtvLmluY2x1ZGVHZW9tZXRyeXx8KGguZ2VvbWV0cnk9bnVsbCk7Zm9yKHZhciBkPTA7ZDx4Lmxlbmd0aDtkKyspe3ZhciBnPXhbZF07by5sYXllcklkcyYmby5sYXllcklkcy5pbmRleE9mKGcpPDB8fGEucHVzaCh1dGlsLmV4dGVuZCh7bGF5ZXI6Z30saCkpfX19ZShudWxsLGEpfTtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2LFwicG9pbnQtZ2VvbWV0cnlcIjoxMzcsXCJyYnVzaFwiOjEzOSxcInZlY3Rvci10aWxlXCI6MTQ0fV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gRmlsbEJ1Y2tldChlKXt0aGlzLmJ1ZmZlcnM9ZSx0aGlzLmVsZW1lbnRHcm91cHM9bmV3IEVsZW1lbnRHcm91cHMoZS5maWxsVmVydGV4LGUuZmlsbEVsZW1lbnQsZS5vdXRsaW5lRWxlbWVudCl9dmFyIEVsZW1lbnRHcm91cHM9cmVxdWlyZShcIi4vZWxlbWVudF9ncm91cHNcIik7bW9kdWxlLmV4cG9ydHM9RmlsbEJ1Y2tldCxGaWxsQnVja2V0LnByb3RvdHlwZS5hZGRGZWF0dXJlcz1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmZlYXR1cmVzLHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIGw9ZVt0XSxyPWwubG9hZEdlb21ldHJ5KCk7ciYmdGhpcy5hZGRGZWF0dXJlKHIpfX0sRmlsbEJ1Y2tldC5wcm90b3R5cGUuYWRkRmVhdHVyZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl0aGlzLmFkZEZpbGwoZVt0XSl9LEZpbGxCdWNrZXQucHJvdG90eXBlLmFkZEZpbGw9ZnVuY3Rpb24oZSl7aWYoIShlLmxlbmd0aDwzKSl7dmFyIHQ9ZS5sZW5ndGg7dGhpcy5lbGVtZW50R3JvdXBzLm1ha2VSb29tRm9yKHQrMSk7Zm9yKHZhciBsLHIsbixpPXRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50LG89dGhpcy5idWZmZXJzLmZpbGxWZXJ0ZXgsdT10aGlzLmJ1ZmZlcnMuZmlsbEVsZW1lbnQscz10aGlzLmJ1ZmZlcnMub3V0bGluZUVsZW1lbnQsZD1vLmluZGV4LWkudmVydGV4U3RhcnRJbmRleCxhPTA7YTxlLmxlbmd0aDthKyspcj1vLmluZGV4LWkudmVydGV4U3RhcnRJbmRleCxuPWVbYV0sby5hZGQobi54LG4ueSksaS52ZXJ0ZXhMZW5ndGgrKyxhPj0yJiYobi54IT09ZVswXS54fHxuLnkhPT1lWzBdLnkpJiYodS5hZGQoZCxsLHIpLGkuZWxlbWVudExlbmd0aCsrKSxhPj0xJiYocy5hZGQobCxyKSxpLnNlY29uZEVsZW1lbnRMZW5ndGgrKyksbD1yfX07XG59LHtcIi4vZWxlbWVudF9ncm91cHNcIjoxNH1dLDE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIExpbmVCdWNrZXQoZSx0KXt0aGlzLmJ1ZmZlcnM9ZSx0aGlzLmVsZW1lbnRHcm91cHM9bmV3IEVsZW1lbnRHcm91cHMoZS5saW5lVmVydGV4LGUubGluZUVsZW1lbnQpLHRoaXMubGF5b3V0UHJvcGVydGllcz10fXZhciBFbGVtZW50R3JvdXBzPXJlcXVpcmUoXCIuL2VsZW1lbnRfZ3JvdXBzXCIpO21vZHVsZS5leHBvcnRzPUxpbmVCdWNrZXQsTGluZUJ1Y2tldC5wcm90b3R5cGUuYWRkRmVhdHVyZXM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5mZWF0dXJlcyx0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF0saT1yLmxvYWRHZW9tZXRyeSgpO2kmJnRoaXMuYWRkRmVhdHVyZShpKX19LExpbmVCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMubGF5b3V0UHJvcGVydGllcyxyPTA7cjxlLmxlbmd0aDtyKyspdGhpcy5hZGRMaW5lKGVbcl0sdFtcImxpbmUtam9pblwiXSx0W1wibGluZS1jYXBcIl0sdFtcImxpbmUtbWl0ZXItbGltaXRcIl0sdFtcImxpbmUtcm91bmQtbGltaXRcIl0pfSxMaW5lQnVja2V0LnByb3RvdHlwZS5hZGRMaW5lPWZ1bmN0aW9uKGUsdCxyLGkscyl7Zm9yKHZhciBuPWUubGVuZ3RoO24+MiYmZVtuLTFdLmVxdWFscyhlW24tMl0pOyluLS07aWYoIShlLmxlbmd0aDwyKSl7XCJiZXZlbFwiPT09dCYmKGk9MS4wNSk7dmFyIHU9ZVswXSxoPWVbbi0xXSxkPXUuZXF1YWxzKGgpO2lmKHRoaXMuZWxlbWVudEdyb3Vwcy5tYWtlUm9vbUZvcigxMCpuKSwyIT09bnx8IWQpe3ZhciBhLGwsbyxmLG0scCx4LHY9cixjPWQ/XCJidXR0XCI6cixWPTEsYj0wLF89ITA7dGhpcy5lMT10aGlzLmUyPXRoaXMuZTM9LTEsZCYmKGE9ZVtuLTJdLG09dS5zdWIoYSkuX3VuaXQoKS5fcGVycCgpKTtmb3IodmFyIHk9MDtuPnk7eSsrKWlmKG89ZCYmeT09PW4tMT9lWzFdOmVbeSsxXSwhb3x8IWVbeV0uZXF1YWxzKG8pKXttJiYoZj1tKSxhJiYobD1hKSxhPWVbeV0sbCYmKGIrPWEuZGlzdChsKSksbT1vP28uc3ViKGEpLl91bml0KCkuX3BlcnAoKTpmLGY9Znx8bTt2YXIgTD1mLmFkZChtKS5fdW5pdCgpLEM9TC54Km0ueCtMLnkqbS55LGc9MS9DLGs9bCYmbyxHPWs/dDpvP3Y6YztpZihrJiZcInJvdW5kXCI9PT1HJiYocz5nP0c9XCJtaXRlclwiOjI+PWcmJihHPVwiZmFrZXJvdW5kXCIpKSxcIm1pdGVyXCI9PT1HJiZnPmkmJihHPVwiYmV2ZWxcIiksXCJiZXZlbFwiPT09RyYmKGc+MiYmKEc9XCJmbGlwYmV2ZWxcIiksaT5nJiYoRz1cIm1pdGVyXCIpKSxcIm1pdGVyXCI9PT1HKUwuX211bHQoZyksdGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLEwsMCwwLCExKTtlbHNlIGlmKFwiZmxpcGJldmVsXCI9PT1HKXtpZihnPjEwMClMPW0uY2xvbmUoKTtlbHNle3ZhciBCPWYueCptLnktZi55Km0ueD4wPy0xOjEscT1nKmYuYWRkKG0pLm1hZygpL2Yuc3ViKG0pLm1hZygpO0wuX3BlcnAoKS5fbXVsdChxKkIpfXRoaXMuYWRkQ3VycmVudFZlcnRleChhLFYsYixMLDAsMCwhMSksVj0tVn1lbHNlIGlmKFwiYmV2ZWxcIj09PUd8fFwiZmFrZXJvdW5kXCI9PT1HKXt2YXIgUD1WKihmLngqbS55LWYueSptLngpPjAsUz0tTWF0aC5zcXJ0KGcqZy0xKTtpZihQPyh4PTAscD1TKToocD0wLHg9UyksX3x8dGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLGYscCx4LCExKSxcImZha2Vyb3VuZFwiPT09Ryl7Zm9yKHZhciBFLEY9TWF0aC5mbG9vcig4KiguNS0oQy0uNSkpKSxJPTA7Rj5JO0krKylFPW0ubXVsdCgoSSsxKS8oRisxKSkuX2FkZChmKS5fdW5pdCgpLHRoaXMuYWRkUGllU2xpY2VWZXJ0ZXgoYSxWLGIsRSxQKTt0aGlzLmFkZFBpZVNsaWNlVmVydGV4KGEsVixiLEwsUCk7Zm9yKHZhciBNPUYtMTtNPj0wO00tLSlFPWYubXVsdCgoTSsxKS8oRisxKSkuX2FkZChtKS5fdW5pdCgpLHRoaXMuYWRkUGllU2xpY2VWZXJ0ZXgoYSxWLGIsRSxQKX1vJiZ0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoYSxWLGIsbSwtcCwteCwhMSl9ZWxzZVwiYnV0dFwiPT09Rz8oX3x8dGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLGYsMCwwLCExKSxvJiZ0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoYSxWLGIsbSwwLDAsITEpKTpcInNxdWFyZVwiPT09Rz8oX3x8KHRoaXMuYWRkQ3VycmVudFZlcnRleChhLFYsYixmLDEsMSwhMSksdGhpcy5lMT10aGlzLmUyPS0xLFY9MSksbyYmdGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLG0sLTEsLTEsITEpKTpcInJvdW5kXCI9PT1HJiYoX3x8KHRoaXMuYWRkQ3VycmVudFZlcnRleChhLFYsYixmLDAsMCwhMSksdGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLGYsMSwxLCEwKSx0aGlzLmUxPXRoaXMuZTI9LTEsVj0xKSxvJiYodGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLG0sLTEsLTEsITApLHRoaXMuYWRkQ3VycmVudFZlcnRleChhLFYsYixtLDAsMCwhMSkpKTtfPSExfX19fSxMaW5lQnVja2V0LnByb3RvdHlwZS5hZGRDdXJyZW50VmVydGV4PWZ1bmN0aW9uKGUsdCxyLGkscyxuLHUpe3ZhciBoLGQ9dT8xOjAsYT10aGlzLmJ1ZmZlcnMubGluZVZlcnRleCxsPXRoaXMuYnVmZmVycy5saW5lRWxlbWVudCxvPXRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50LGY9dGhpcy5lbGVtZW50R3JvdXBzLmN1cnJlbnQudmVydGV4U3RhcnRJbmRleDtoPWkubXVsdCh0KSxzJiZoLl9zdWIoaS5wZXJwKCkuX211bHQocykpLHRoaXMuZTM9YS5hZGQoZSxoLGQsMCxyKS1mLHRoaXMuZTE+PTAmJnRoaXMuZTI+PTAmJihsLmFkZCh0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyksby5lbGVtZW50TGVuZ3RoKyspLHRoaXMuZTE9dGhpcy5lMix0aGlzLmUyPXRoaXMuZTMsaD1pLm11bHQoLXQpLG4mJmguX3N1YihpLnBlcnAoKS5fbXVsdChuKSksdGhpcy5lMz1hLmFkZChlLGgsZCwxLHIpLWYsdGhpcy5lMT49MCYmdGhpcy5lMj49MCYmKGwuYWRkKHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzKSxvLmVsZW1lbnRMZW5ndGgrKyksdGhpcy5lMT10aGlzLmUyLHRoaXMuZTI9dGhpcy5lMyxvLnZlcnRleExlbmd0aCs9Mn0sTGluZUJ1Y2tldC5wcm90b3R5cGUuYWRkUGllU2xpY2VWZXJ0ZXg9ZnVuY3Rpb24oZSx0LHIsaSxzKXt2YXIgbj10aGlzLmJ1ZmZlcnMubGluZVZlcnRleCx1PXRoaXMuYnVmZmVycy5saW5lRWxlbWVudCxoPXRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50LGQ9dGhpcy5lbGVtZW50R3JvdXBzLmN1cnJlbnQudmVydGV4U3RhcnRJbmRleCxhPXM7aT1pLm11bHQodCoocz8tMToxKSksdGhpcy5lMz1uLmFkZChlLGksMCxhLHIpLWQsaC52ZXJ0ZXhMZW5ndGgrPTEsdGhpcy5lMT49MCYmdGhpcy5lMj49MCYmKHUuYWRkKHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzKSxoLmVsZW1lbnRMZW5ndGgrKykscz90aGlzLmUyPXRoaXMuZTM6dGhpcy5lMT10aGlzLmUzfTtcbn0se1wiLi9lbGVtZW50X2dyb3Vwc1wiOjE0fV0sMTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3ltYm9sQnVja2V0KGUsdCxvLGkscyl7dGhpcy5idWZmZXJzPWUsdGhpcy5sYXlvdXRQcm9wZXJ0aWVzPXQsdGhpcy5vdmVyc2NhbGluZz1vLHRoaXMuem9vbT1pLHRoaXMuY29sbGlzaW9uRGVidWc9czt2YXIgbj01MTIqbyxhPTQwOTY7dGhpcy50aWxlUGl4ZWxSYXRpbz1hL24sdGhpcy5jb21wYXJlVGV4dD17fSx0aGlzLnN5bWJvbEluc3RhbmNlcz1bXX1mdW5jdGlvbiBTeW1ib2xJbnN0YW5jZShlLHQsbyxpLHMsbixhLGwscixjLGgsdSl7dGhpcy54PWUueCx0aGlzLnk9ZS55LHRoaXMuaGFzVGV4dD0hIW8sdGhpcy5oYXNJY29uPSEhaSx0aGlzLmhhc1RleHQmJih0aGlzLmdseXBoUXVhZHM9bj9nZXRHbHlwaFF1YWRzKGUsbyxhLHQscyxyKTpbXSx0aGlzLnRleHRDb2xsaXNpb25GZWF0dXJlPW5ldyBDb2xsaXNpb25GZWF0dXJlKHQsZSxvLGEsbCxyKSksdGhpcy5oYXNJY29uJiYodGhpcy5pY29uUXVhZHM9bj9nZXRJY29uUXVhZHMoZSxpLGMsdCxzLHUpOltdLHRoaXMuaWNvbkNvbGxpc2lvbkZlYXR1cmU9bmV3IENvbGxpc2lvbkZlYXR1cmUodCxlLGksYyxoLHUpKX12YXIgRWxlbWVudEdyb3Vwcz1yZXF1aXJlKFwiLi9lbGVtZW50X2dyb3Vwc1wiKSxBbmNob3I9cmVxdWlyZShcIi4uL3N5bWJvbC9hbmNob3JcIiksZ2V0QW5jaG9ycz1yZXF1aXJlKFwiLi4vc3ltYm9sL2dldF9hbmNob3JzXCIpLHJlc29sdmVUb2tlbnM9cmVxdWlyZShcIi4uL3V0aWwvdG9rZW5cIiksUXVhZHM9cmVxdWlyZShcIi4uL3N5bWJvbC9xdWFkc1wiKSxTaGFwaW5nPXJlcXVpcmUoXCIuLi9zeW1ib2wvc2hhcGluZ1wiKSxyZXNvbHZlVGV4dD1yZXF1aXJlKFwiLi4vc3ltYm9sL3Jlc29sdmVfdGV4dFwiKSxyZXNvbHZlSWNvbnM9cmVxdWlyZShcIi4uL3N5bWJvbC9yZXNvbHZlX2ljb25zXCIpLG1lcmdlTGluZXM9cmVxdWlyZShcIi4uL3N5bWJvbC9tZXJnZWxpbmVzXCIpLHNoYXBlVGV4dD1TaGFwaW5nLnNoYXBlVGV4dCxzaGFwZUljb249U2hhcGluZy5zaGFwZUljb24sZ2V0R2x5cGhRdWFkcz1RdWFkcy5nZXRHbHlwaFF1YWRzLGdldEljb25RdWFkcz1RdWFkcy5nZXRJY29uUXVhZHMsY2xpcExpbmU9cmVxdWlyZShcIi4uL3N5bWJvbC9jbGlwX2xpbmVcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLENvbGxpc2lvbkZlYXR1cmU9cmVxdWlyZShcIi4uL3N5bWJvbC9jb2xsaXNpb25fZmVhdHVyZVwiKTttb2R1bGUuZXhwb3J0cz1TeW1ib2xCdWNrZXQsU3ltYm9sQnVja2V0LnByb3RvdHlwZS5uZWVkc1BsYWNlbWVudD0hMCxTeW1ib2xCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmVzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubGF5b3V0UHJvcGVydGllcyxvPXRoaXMuZmVhdHVyZXMsaT10aGlzLnRleHRGZWF0dXJlcyxzPS41LG49LjU7c3dpdGNoKHRbXCJ0ZXh0LWFuY2hvclwiXSl7Y2FzZVwicmlnaHRcIjpjYXNlXCJ0b3AtcmlnaHRcIjpjYXNlXCJib3R0b20tcmlnaHRcIjpzPTE7YnJlYWs7Y2FzZVwibGVmdFwiOmNhc2VcInRvcC1sZWZ0XCI6Y2FzZVwiYm90dG9tLWxlZnRcIjpzPTB9c3dpdGNoKHRbXCJ0ZXh0LWFuY2hvclwiXSl7Y2FzZVwiYm90dG9tXCI6Y2FzZVwiYm90dG9tLXJpZ2h0XCI6Y2FzZVwiYm90dG9tLWxlZnRcIjpuPTE7YnJlYWs7Y2FzZVwidG9wXCI6Y2FzZVwidG9wLXJpZ2h0XCI6Y2FzZVwidG9wLWxlZnRcIjpuPTB9Zm9yKHZhciBhPVwicmlnaHRcIj09PXRbXCJ0ZXh0LWp1c3RpZnlcIl0/MTpcImxlZnRcIj09PXRbXCJ0ZXh0LWp1c3RpZnlcIl0/MDouNSxsPTI0LHI9dFtcInRleHQtbGluZS1oZWlnaHRcIl0qbCxjPVwibGluZVwiIT09dFtcInN5bWJvbC1wbGFjZW1lbnRcIl0/dFtcInRleHQtbWF4LXdpZHRoXCJdKmw6MCxoPXRbXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCJdKmwsdT1bdFtcInRleHQtb2Zmc2V0XCJdWzBdKmwsdFtcInRleHQtb2Zmc2V0XCJdWzFdKmxdLG09dFtcInRleHQtZm9udFwiXS5qb2luKFwiLFwiKSxwPVtdLHg9MDt4PG8ubGVuZ3RoO3grKylwLnB1c2gob1t4XS5sb2FkR2VvbWV0cnkoKSk7aWYoXCJsaW5lXCI9PT10W1wic3ltYm9sLXBsYWNlbWVudFwiXSl7dmFyIHk9bWVyZ2VMaW5lcyhvLGkscCk7cD15Lmdlb21ldHJpZXMsbz15LmZlYXR1cmVzLGk9eS50ZXh0RmVhdHVyZXN9Zm9yKHZhciBkLGcsZj0wO2Y8by5sZW5ndGg7ZisrKWlmKHBbZl0pe2lmKGQ9aVtmXT9zaGFwZVRleHQoaVtmXSx0aGlzLnN0YWNrc1ttXSxjLHIscyxuLGEsaCx1KTpudWxsLHRbXCJpY29uLWltYWdlXCJdKXt2YXIgYj1yZXNvbHZlVG9rZW5zKG9bZl0ucHJvcGVydGllcyx0W1wiaWNvbi1pbWFnZVwiXSksdj10aGlzLmljb25zW2JdO2c9c2hhcGVJY29uKHYsdCksdiYmKHZvaWQgMD09PXRoaXMuc2RmSWNvbnM/dGhpcy5zZGZJY29ucz12LnNkZjp0aGlzLnNkZkljb25zIT09di5zZGYmJmNvbnNvbGUud2FybihcIlN0eWxlIHNoZWV0IHdhcm5pbmc6IENhbm5vdCBtaXggU0RGIGFuZCBub24tU0RGIGljb25zIGluIG9uZSBidWNrZXRcIikpfWVsc2UgZz1udWxsOyhkfHxnKSYmdGhpcy5hZGRGZWF0dXJlKHBbZl0sZCxnKX10aGlzLnBsYWNlRmVhdHVyZXMoZSx0aGlzLmJ1ZmZlcnMsdGhpcy5jb2xsaXNpb25EZWJ1Zyl9LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYWRkRmVhdHVyZT1mdW5jdGlvbihlLHQsbyl7dmFyIGk9dGhpcy5sYXlvdXRQcm9wZXJ0aWVzLHM9MjQsbj1pW1widGV4dC1zaXplXCJdL3MsYT10aGlzLnRpbGVQaXhlbFJhdGlvKm4sbD10aGlzLnRpbGVQaXhlbFJhdGlvKmlbXCJ0ZXh0LW1heC1zaXplXCJdL3Mscj10aGlzLnRpbGVQaXhlbFJhdGlvKmlbXCJpY29uLXNpemVcIl0sYz10aGlzLnRpbGVQaXhlbFJhdGlvKmlbXCJzeW1ib2wtc3BhY2luZ1wiXSxoPWlbXCJzeW1ib2wtYXZvaWQtZWRnZXNcIl0sdT1pW1widGV4dC1wYWRkaW5nXCJdKnRoaXMudGlsZVBpeGVsUmF0aW8sbT1pW1wiaWNvbi1wYWRkaW5nXCJdKnRoaXMudGlsZVBpeGVsUmF0aW8scD1pW1widGV4dC1tYXgtYW5nbGVcIl0vMTgwKk1hdGguUEkseD1cIm1hcFwiPT09aVtcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCJdJiZcImxpbmVcIj09PWlbXCJzeW1ib2wtcGxhY2VtZW50XCJdLHk9XCJtYXBcIj09PWlbXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiXSYmXCJsaW5lXCI9PT1pW1wic3ltYm9sLXBsYWNlbWVudFwiXSxkPWlbXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIl18fGlbXCJpY29uLWFsbG93LW92ZXJsYXBcIl18fGlbXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIl18fGlbXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIl0sZz1cImxpbmVcIj09PWlbXCJzeW1ib2wtcGxhY2VtZW50XCJdLGY9Yy8yO2cmJihlPWNsaXBMaW5lKGUsMCwwLDQwOTYsNDA5NikpO2Zvcih2YXIgYj0wO2I8ZS5sZW5ndGg7YisrKWZvcih2YXIgdj1lW2JdLEk9Zz9nZXRBbmNob3JzKHYsYyxwLHQsbyxzLGwsdGhpcy5vdmVyc2NhbGluZyk6W25ldyBBbmNob3IodlswXS54LHZbMF0ueSwwKV0sUz0wLEY9SS5sZW5ndGg7Rj5TO1MrKyl7dmFyIFA9SVtTXTtpZighKHQmJmcmJnRoaXMuYW5jaG9ySXNUb29DbG9zZSh0LnRleHQsZixQKSkpe3ZhciBNPSEoUC54PDB8fFAueD40MDk2fHxQLnk8MHx8UC55PjQwOTYpO2lmKCFofHxNKXt2YXIgaz1NfHxkO3RoaXMuc3ltYm9sSW5zdGFuY2VzLnB1c2gobmV3IFN5bWJvbEluc3RhbmNlKFAsdix0LG8saSxrLGEsdSx4LHIsbSx5KSl9fX19LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYW5jaG9ySXNUb29DbG9zZT1mdW5jdGlvbihlLHQsbyl7dmFyIGk9dGhpcy5jb21wYXJlVGV4dDtpZihlIGluIGkpe2Zvcih2YXIgcz1pW2VdLG49cy5sZW5ndGgtMTtuPj0wO24tLSlpZihvLmRpc3Qoc1tuXSk8dClyZXR1cm4hMH1lbHNlIGlbZV09W107cmV0dXJuIGlbZV0ucHVzaChvKSwhMX0sU3ltYm9sQnVja2V0LnByb3RvdHlwZS5wbGFjZUZlYXR1cmVzPWZ1bmN0aW9uKGUsdCxvKXt0aGlzLmJ1ZmZlcnM9dDt2YXIgaT10aGlzLmVsZW1lbnRHcm91cHM9e3RleHQ6bmV3IEVsZW1lbnRHcm91cHModC5nbHlwaFZlcnRleCx0LmdseXBoRWxlbWVudCksaWNvbjpuZXcgRWxlbWVudEdyb3Vwcyh0Lmljb25WZXJ0ZXgsdC5pY29uRWxlbWVudCksc2RmSWNvbnM6dGhpcy5zZGZJY29uc30scz10aGlzLmxheW91dFByb3BlcnRpZXMsbj1lLm1heFNjYWxlO2kudGV4dFtcInRleHQtc2l6ZVwiXT1zW1widGV4dC1zaXplXCJdLGkuaWNvbltcImljb24tc2l6ZVwiXT1zW1wiaWNvbi1zaXplXCJdO3ZhciBhPVwibWFwXCI9PT1zW1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIl0mJlwibGluZVwiPT09c1tcInN5bWJvbC1wbGFjZW1lbnRcIl0sbD1cIm1hcFwiPT09c1tcImljb24tcm90YXRpb24tYWxpZ25tZW50XCJdJiZcImxpbmVcIj09PXNbXCJzeW1ib2wtcGxhY2VtZW50XCJdLHI9c1tcInRleHQtYWxsb3ctb3ZlcmxhcFwiXXx8c1tcImljb24tYWxsb3ctb3ZlcmxhcFwiXXx8c1tcInRleHQtaWdub3JlLXBsYWNlbWVudFwiXXx8c1tcImljb24taWdub3JlLXBsYWNlbWVudFwiXTtpZihyKXt2YXIgYz1lLmFuZ2xlLGg9TWF0aC5zaW4oYyksdT1NYXRoLmNvcyhjKTt0aGlzLnN5bWJvbEluc3RhbmNlcy5zb3J0KGZ1bmN0aW9uKGUsdCl7dmFyIG89aCplLngrdSplLnksaT1oKnQueCt1KnQueTtyZXR1cm4gaS1vfSl9Zm9yKHZhciBtPTA7bTx0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7bSsrKXt2YXIgcD10aGlzLnN5bWJvbEluc3RhbmNlc1ttXSx4PXAuaGFzVGV4dCx5PXAuaGFzSWNvbixkPXNbXCJ0ZXh0LW9wdGlvbmFsXCJdfHwheCxnPXNbXCJpY29uLW9wdGlvbmFsXCJdfHwheSxmPXgmJiFzW1widGV4dC1hbGxvdy1vdmVybGFwXCJdP2UucGxhY2VDb2xsaXNpb25GZWF0dXJlKHAudGV4dENvbGxpc2lvbkZlYXR1cmUpOmUubWluU2NhbGUsYj15JiYhc1tcImljb24tYWxsb3ctb3ZlcmxhcFwiXT9lLnBsYWNlQ29sbGlzaW9uRmVhdHVyZShwLmljb25Db2xsaXNpb25GZWF0dXJlKTplLm1pblNjYWxlO2R8fGc/IWcmJmY/Zj1NYXRoLm1heChiLGYpOiFkJiZiJiYoYj1NYXRoLm1heChiLGYpKTpiPWY9TWF0aC5tYXgoYixmKSx4JiYoc1tcInRleHQtaWdub3JlLXBsYWNlbWVudFwiXXx8ZS5pbnNlcnRDb2xsaXNpb25GZWF0dXJlKHAudGV4dENvbGxpc2lvbkZlYXR1cmUsZiksbj49ZiYmdGhpcy5hZGRTeW1ib2xzKHQuZ2x5cGhWZXJ0ZXgsdC5nbHlwaEVsZW1lbnQsaS50ZXh0LHAuZ2x5cGhRdWFkcyxmLHNbXCJ0ZXh0LWtlZXAtdXByaWdodFwiXSxhLGUuYW5nbGUpKSx5JiYoc1tcImljb24taWdub3JlLXBsYWNlbWVudFwiXXx8ZS5pbnNlcnRDb2xsaXNpb25GZWF0dXJlKHAuaWNvbkNvbGxpc2lvbkZlYXR1cmUsYiksbj49YiYmdGhpcy5hZGRTeW1ib2xzKHQuaWNvblZlcnRleCx0Lmljb25FbGVtZW50LGkuaWNvbixwLmljb25RdWFkcyxiLHNbXCJpY29uLWtlZXAtdXByaWdodFwiXSxsLGUuYW5nbGUpKX1vJiZ0aGlzLmFkZFRvRGVidWdCdWZmZXJzKGUpfSxTeW1ib2xCdWNrZXQucHJvdG90eXBlLmFkZFN5bWJvbHM9ZnVuY3Rpb24oZSx0LG8saSxzLG4sYSxsKXtvLm1ha2VSb29tRm9yKDQqaS5sZW5ndGgpO2Zvcih2YXIgcj1vLmN1cnJlbnQsYz10aGlzLnpvb20saD1NYXRoLm1heChNYXRoLmxvZyhzKS9NYXRoLkxOMitjLDApLHU9MDt1PGkubGVuZ3RoO3UrKyl7dmFyIG09aVt1XSxwPW0uYW5nbGUseD0ocCtsK01hdGguUEkpJSgyKk1hdGguUEkpO2lmKCEobiYmYSYmKHg8PU1hdGguUEkvMnx8eD4zKk1hdGguUEkvMikpKXt2YXIgeT1tLnRsLGQ9bS50cixnPW0uYmwsZj1tLmJyLGI9bS50ZXgsdj1tLmFuY2hvclBvaW50LEk9TWF0aC5tYXgoYytNYXRoLmxvZyhtLm1pblNjYWxlKS9NYXRoLkxOMixoKSxTPU1hdGgubWluKGMrTWF0aC5sb2cobS5tYXhTY2FsZSkvTWF0aC5MTjIsMjUpO2lmKCEoST49Uykpe0k9PT1oJiYoST0wKTt2YXIgRj1lLmluZGV4LXIudmVydGV4U3RhcnRJbmRleDtlLmFkZCh2Lngsdi55LHkueCx5LnksYi54LGIueSxJLFMsaCksZS5hZGQodi54LHYueSxkLngsZC55LGIueCtiLncsYi55LEksUyxoKSxlLmFkZCh2Lngsdi55LGcueCxnLnksYi54LGIueStiLmgsSSxTLGgpLGUuYWRkKHYueCx2LnksZi54LGYueSxiLngrYi53LGIueStiLmgsSSxTLGgpLHIudmVydGV4TGVuZ3RoKz00LHQuYWRkKEYsRisxLEYrMiksdC5hZGQoRisxLEYrMixGKzMpLHIuZWxlbWVudExlbmd0aCs9Mn19fX0sU3ltYm9sQnVja2V0LnByb3RvdHlwZS5nZXREZXBlbmRlbmNpZXM9ZnVuY3Rpb24oZSx0LG8pe2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGV8fHM/byhlKTp2b2lkKHM9ITApfXZhciBzPSExO3RoaXMuZ2V0VGV4dERlcGVuZGVuY2llcyhlLHQsaSksdGhpcy5nZXRJY29uRGVwZW5kZW5jaWVzKGUsdCxpKX0sU3ltYm9sQnVja2V0LnByb3RvdHlwZS5nZXRJY29uRGVwZW5kZW5jaWVzPWZ1bmN0aW9uKGUsdCxvKXtmdW5jdGlvbiBpKGUsdCl7cmV0dXJuIGU/byhlKToodGhpcy5pY29ucz10LHZvaWQgbygpKX1pZih0aGlzLmxheW91dFByb3BlcnRpZXNbXCJpY29uLWltYWdlXCJdKXt2YXIgcz10aGlzLmZlYXR1cmVzLG49cmVzb2x2ZUljb25zKHMsdGhpcy5sYXlvdXRQcm9wZXJ0aWVzKTtuLmxlbmd0aD90LnNlbmQoXCJnZXQgaWNvbnNcIix7aWNvbnM6bn0saS5iaW5kKHRoaXMpKTpvKCl9ZWxzZSBvKCl9LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuZ2V0VGV4dERlcGVuZGVuY2llcz1mdW5jdGlvbihlLHQsbyl7dmFyIGk9dGhpcy5mZWF0dXJlcyxzPXRoaXMubGF5b3V0UHJvcGVydGllc1tcInRleHQtZm9udFwiXSxuPXRoaXMuc3RhY2tzPWUuc3RhY2tzO3ZvaWQgMD09PW5bc10mJihuW3NdPXt9KTt2YXIgYT1uW3NdLGw9cmVzb2x2ZVRleHQoaSx0aGlzLmxheW91dFByb3BlcnRpZXMsYSk7dGhpcy50ZXh0RmVhdHVyZXM9bC50ZXh0RmVhdHVyZXMsdC5zZW5kKFwiZ2V0IGdseXBoc1wiLHt1aWQ6ZS51aWQsZm9udHN0YWNrOnMsY29kZXBvaW50czpsLmNvZGVwb2ludHN9LGZ1bmN0aW9uKGUsdCl7aWYoZSlyZXR1cm4gbyhlKTtmb3IodmFyIGkgaW4gdClhW2ldPXRbaV07bygpfSl9LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYWRkVG9EZWJ1Z0J1ZmZlcnM9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50R3JvdXBzLmNvbGxpc2lvbkJveD1uZXcgRWxlbWVudEdyb3Vwcyh0aGlzLmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4KSx0aGlzLmVsZW1lbnRHcm91cHMuY29sbGlzaW9uQm94Lm1ha2VSb29tRm9yKDApO2Zvcih2YXIgdD10aGlzLmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4LG89LWUuYW5nbGUsaT1lLnlTdHJldGNoLHM9MDtzPHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDtzKyspZm9yKHZhciBuPTA7Mj5uO24rKyl7dmFyIGE9dGhpcy5zeW1ib2xJbnN0YW5jZXNbc11bMD09PW4/XCJ0ZXh0Q29sbGlzaW9uRmVhdHVyZVwiOlwiaWNvbkNvbGxpc2lvbkZlYXR1cmVcIl07aWYoYSlmb3IodmFyIGw9YS5ib3hlcyxyPTA7cjxsLmxlbmd0aDtyKyspe3ZhciBjPWxbcl0saD1jLmFuY2hvclBvaW50LHU9bmV3IFBvaW50KGMueDEsYy55MSppKS5fcm90YXRlKG8pLG09bmV3IFBvaW50KGMueDIsYy55MSppKS5fcm90YXRlKG8pLHA9bmV3IFBvaW50KGMueDEsYy55MippKS5fcm90YXRlKG8pLHg9bmV3IFBvaW50KGMueDIsYy55MippKS5fcm90YXRlKG8pLHk9TWF0aC5tYXgoMCxNYXRoLm1pbigyNSx0aGlzLnpvb20rTWF0aC5sb2coYy5tYXhTY2FsZSkvTWF0aC5MTjIpKSxkPU1hdGgubWF4KDAsTWF0aC5taW4oMjUsdGhpcy56b29tK01hdGgubG9nKGMucGxhY2VtZW50U2NhbGUpL01hdGguTE4yKSk7dC5hZGQoaCx1LHksZCksdC5hZGQoaCxtLHksZCksdC5hZGQoaCxtLHksZCksdC5hZGQoaCx4LHksZCksdC5hZGQoaCx4LHksZCksdC5hZGQoaCxwLHksZCksdC5hZGQoaCxwLHksZCksdC5hZGQoaCx1LHksZCksdGhpcy5lbGVtZW50R3JvdXBzLmNvbGxpc2lvbkJveC5jdXJyZW50LnZlcnRleExlbmd0aCs9OH19fTtcbn0se1wiLi4vc3ltYm9sL2FuY2hvclwiOjYyLFwiLi4vc3ltYm9sL2NsaXBfbGluZVwiOjY1LFwiLi4vc3ltYm9sL2NvbGxpc2lvbl9mZWF0dXJlXCI6NjcsXCIuLi9zeW1ib2wvZ2V0X2FuY2hvcnNcIjo2OSxcIi4uL3N5bWJvbC9tZXJnZWxpbmVzXCI6NzIsXCIuLi9zeW1ib2wvcXVhZHNcIjo3MyxcIi4uL3N5bWJvbC9yZXNvbHZlX2ljb25zXCI6NzQsXCIuLi9zeW1ib2wvcmVzb2x2ZV90ZXh0XCI6NzUsXCIuLi9zeW1ib2wvc2hhcGluZ1wiOjc2LFwiLi4vdXRpbC90b2tlblwiOjEwNSxcIi4vZWxlbWVudF9ncm91cHNcIjoxNCxcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sMTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQ29vcmRpbmF0ZShvLHQsbil7dGhpcy5jb2x1bW49byx0aGlzLnJvdz10LHRoaXMuem9vbT1ufW1vZHVsZS5leHBvcnRzPUNvb3JkaW5hdGUsQ29vcmRpbmF0ZS5wcm90b3R5cGU9e2Nsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBDb29yZGluYXRlKHRoaXMuY29sdW1uLHRoaXMucm93LHRoaXMuem9vbSl9LHpvb21UbzpmdW5jdGlvbihvKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl96b29tVG8obyl9LHN1YjpmdW5jdGlvbihvKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9zdWIobyl9LF96b29tVG86ZnVuY3Rpb24obyl7dmFyIHQ9TWF0aC5wb3coMixvLXRoaXMuem9vbSk7cmV0dXJuIHRoaXMuY29sdW1uKj10LHRoaXMucm93Kj10LHRoaXMuem9vbT1vLHRoaXN9LF9zdWI6ZnVuY3Rpb24obyl7cmV0dXJuIG89by56b29tVG8odGhpcy56b29tKSx0aGlzLmNvbHVtbi09by5jb2x1bW4sdGhpcy5yb3ctPW8ucm93LHRoaXN9fTtcbn0se31dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIExuZ0xhdCh0LG4pe2lmKGlzTmFOKHQpfHxpc05hTihuKSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIExuZ0xhdCBvYmplY3Q6IChcIit0K1wiLCBcIituK1wiKVwiKTtpZih0aGlzLmxuZz0rdCx0aGlzLmxhdD0rbix0aGlzLmxhdD45MHx8dGhpcy5sYXQ8LTkwKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTG5nTGF0IGxhdGl0dWRlIHZhbHVlOiBtdXN0IGJlIGJldHdlZW4gLTkwIGFuZCA5MFwiKX1tb2R1bGUuZXhwb3J0cz1MbmdMYXQ7dmFyIHdyYXA9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKS53cmFwO0xuZ0xhdC5wcm90b3R5cGUud3JhcD1mdW5jdGlvbigpe3JldHVybiBuZXcgTG5nTGF0KHdyYXAodGhpcy5sbmcsLTE4MCwxODApLHRoaXMubGF0KX0sTG5nTGF0LmNvbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBMbmdMYXQ/dDpBcnJheS5pc0FycmF5KHQpP25ldyBMbmdMYXQodFswXSx0WzFdKTp0fTtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2fV0sMjE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gTG5nTGF0Qm91bmRzKHQsbil7aWYodClmb3IodmFyIGU9bj9bdCxuXTp0LHM9MCxpPWUubGVuZ3RoO2k+cztzKyspdGhpcy5leHRlbmQoZVtzXSl9bW9kdWxlLmV4cG9ydHM9TG5nTGF0Qm91bmRzO3ZhciBMbmdMYXQ9cmVxdWlyZShcIi4vbG5nX2xhdFwiKTtMbmdMYXRCb3VuZHMucHJvdG90eXBlPXtleHRlbmQ6ZnVuY3Rpb24odCl7dmFyIG4sZSxzPXRoaXMuX3N3LGk9dGhpcy5fbmU7aWYodCBpbnN0YW5jZW9mIExuZ0xhdCluPXQsZT10O2Vsc2V7aWYoISh0IGluc3RhbmNlb2YgTG5nTGF0Qm91bmRzKSlyZXR1cm4gdD90aGlzLmV4dGVuZChMbmdMYXQuY29udmVydCh0KXx8TG5nTGF0Qm91bmRzLmNvbnZlcnQodCkpOnRoaXM7aWYobj10Ll9zdyxlPXQuX25lLCFufHwhZSlyZXR1cm4gdGhpc31yZXR1cm4gc3x8aT8ocy5sbmc9TWF0aC5taW4obi5sbmcscy5sbmcpLHMubGF0PU1hdGgubWluKG4ubGF0LHMubGF0KSxpLmxuZz1NYXRoLm1heChlLmxuZyxpLmxuZyksaS5sYXQ9TWF0aC5tYXgoZS5sYXQsaS5sYXQpKToodGhpcy5fc3c9bmV3IExuZ0xhdChuLmxuZyxuLmxhdCksdGhpcy5fbmU9bmV3IExuZ0xhdChlLmxuZyxlLmxhdCkpLHRoaXN9LGdldENlbnRlcjpmdW5jdGlvbigpe3JldHVybiBuZXcgTG5nTGF0KCh0aGlzLl9zdy5sbmcrdGhpcy5fbmUubG5nKS8yLCh0aGlzLl9zdy5sYXQrdGhpcy5fbmUubGF0KS8yKX0sZ2V0U291dGhXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N3fSxnZXROb3J0aEVhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmV9LGdldE5vcnRoV2VzdDpmdW5jdGlvbigpe3JldHVybiBuZXcgTG5nTGF0KHRoaXMuZ2V0V2VzdCgpLHRoaXMuZ2V0Tm9ydGgoKSl9LGdldFNvdXRoRWFzdDpmdW5jdGlvbigpe3JldHVybiBuZXcgTG5nTGF0KHRoaXMuZ2V0RWFzdCgpLHRoaXMuZ2V0U291dGgoKSl9LGdldFdlc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3cubG5nfSxnZXRTb3V0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdy5sYXR9LGdldEVhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmUubG5nfSxnZXROb3J0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9uZS5sYXR9fSxMbmdMYXRCb3VuZHMuY29udmVydD1mdW5jdGlvbih0KXtyZXR1cm4hdHx8dCBpbnN0YW5jZW9mIExuZ0xhdEJvdW5kcz90Om5ldyBMbmdMYXRCb3VuZHModCl9O1xufSx7XCIuL2xuZ19sYXRcIjoyMH1dLDIyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFRyYW5zZm9ybSh0LGkpe3RoaXMudGlsZVNpemU9NTEyLHRoaXMuX21pblpvb209dHx8MCx0aGlzLl9tYXhab29tPWl8fDIyLHRoaXMubGF0UmFuZ2U9Wy04NS4wNTExMyw4NS4wNTExM10sdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy56b29tPTAsdGhpcy5jZW50ZXI9bmV3IExuZ0xhdCgwLDApLHRoaXMuYW5nbGU9MCx0aGlzLl9hbHRpdHVkZT0xLjUsdGhpcy5fcGl0Y2g9MH12YXIgTG5nTGF0PXJlcXVpcmUoXCIuL2xuZ19sYXRcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLENvb3JkaW5hdGU9cmVxdWlyZShcIi4vY29vcmRpbmF0ZVwiKSx3cmFwPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIikud3JhcCxpbnRlcnA9cmVxdWlyZShcIi4uL3V0aWwvaW50ZXJwb2xhdGVcIiksdmVjND1yZXF1aXJlKFwiZ2wtbWF0cml4XCIpLnZlYzQsbWF0ND1yZXF1aXJlKFwiZ2wtbWF0cml4XCIpLm1hdDQ7bW9kdWxlLmV4cG9ydHM9VHJhbnNmb3JtLFRyYW5zZm9ybS5wcm90b3R5cGU9e2dldCBtaW5ab29tKCl7cmV0dXJuIHRoaXMuX21pblpvb219LHNldCBtaW5ab29tKHQpe3RoaXMuX21pblpvb209dCx0aGlzLnpvb209TWF0aC5tYXgodGhpcy56b29tLHQpfSxnZXQgbWF4Wm9vbSgpe3JldHVybiB0aGlzLl9tYXhab29tfSxzZXQgbWF4Wm9vbSh0KXt0aGlzLl9tYXhab29tPXQsdGhpcy56b29tPU1hdGgubWluKHRoaXMuem9vbSx0KX0sZ2V0IHdvcmxkU2l6ZSgpe3JldHVybiB0aGlzLnRpbGVTaXplKnRoaXMuc2NhbGV9LGdldCBjZW50ZXJQb2ludCgpe3JldHVybiB0aGlzLnNpemUuX2RpdigyKX0sZ2V0IHNpemUoKXtyZXR1cm4gbmV3IFBvaW50KHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpfSxnZXQgYmVhcmluZygpe3JldHVybi10aGlzLmFuZ2xlL01hdGguUEkqMTgwfSxzZXQgYmVhcmluZyh0KXt0aGlzLmFuZ2xlPS13cmFwKHQsLTE4MCwxODApKk1hdGguUEkvMTgwfSxnZXQgcGl0Y2goKXtyZXR1cm4gdGhpcy5fcGl0Y2gvTWF0aC5QSSoxODB9LHNldCBwaXRjaCh0KXt0aGlzLl9waXRjaD1NYXRoLm1pbig2MCx0KS8xODAqTWF0aC5QSX0sZ2V0IGFsdGl0dWRlKCl7cmV0dXJuIHRoaXMuX2FsdGl0dWRlfSxzZXQgYWx0aXR1ZGUodCl7dGhpcy5fYWx0aXR1ZGU9TWF0aC5tYXgoLjc1LHQpfSxnZXQgem9vbSgpe3JldHVybiB0aGlzLl96b29tfSxzZXQgem9vbSh0KXt0PU1hdGgubWluKE1hdGgubWF4KHQsdGhpcy5taW5ab29tKSx0aGlzLm1heFpvb20pLHRoaXMuX3pvb209dCx0aGlzLnNjYWxlPXRoaXMuem9vbVNjYWxlKHQpLHRoaXMudGlsZVpvb209TWF0aC5mbG9vcih0KSx0aGlzLnpvb21GcmFjdGlvbj10LXRoaXMudGlsZVpvb20sdGhpcy5fY29uc3RyYWluKCl9LGdldCBjZW50ZXIoKXtyZXR1cm4gdGhpcy5fY2VudGVyfSxzZXQgY2VudGVyKHQpe3RoaXMuX2NlbnRlcj10LHRoaXMuX2NvbnN0cmFpbigpfSx6b29tU2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsdCl9LHNjYWxlWm9vbTpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5MTjJ9LHByb2plY3Q6ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IFBvaW50KHRoaXMubG5nWCh0LmxuZyxpKSx0aGlzLmxhdFkodC5sYXQsaSkpfSx1bnByb2plY3Q6ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IExuZ0xhdCh0aGlzLnhMbmcodC54LGkpLHRoaXMueUxhdCh0LnksaSkpfSxnZXQgeCgpe3JldHVybiB0aGlzLmxuZ1godGhpcy5jZW50ZXIubG5nKX0sZ2V0IHkoKXtyZXR1cm4gdGhpcy5sYXRZKHRoaXMuY2VudGVyLmxhdCl9LGdldCBwb2ludCgpe3JldHVybiBuZXcgUG9pbnQodGhpcy54LHRoaXMueSl9LGxuZ1g6ZnVuY3Rpb24odCxpKXtyZXR1cm4oMTgwK3QpKihpfHx0aGlzLndvcmxkU2l6ZSkvMzYwfSxsYXRZOmZ1bmN0aW9uKHQsaSl7dmFyIG49MTgwL01hdGguUEkqTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSS80K3QqTWF0aC5QSS8zNjApKTtyZXR1cm4oMTgwLW4pKihpfHx0aGlzLndvcmxkU2l6ZSkvMzYwfSx4TG5nOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIDM2MCp0LyhpfHx0aGlzLndvcmxkU2l6ZSktMTgwfSx5TGF0OmZ1bmN0aW9uKHQsaSl7dmFyIG49MTgwLTM2MCp0LyhpfHx0aGlzLndvcmxkU2l6ZSk7cmV0dXJuIDM2MC9NYXRoLlBJKk1hdGguYXRhbihNYXRoLmV4cChuKk1hdGguUEkvMTgwKSktOTB9LHBhbkJ5OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuY2VudGVyUG9pbnQuX2FkZCh0KTt0aGlzLmNlbnRlcj10aGlzLnBvaW50TG9jYXRpb24oaSl9LHNldExvY2F0aW9uQXRQb2ludDpmdW5jdGlvbih0LGkpe3ZhciBuPXRoaXMubG9jYXRpb25Db29yZGluYXRlKHQpLG89dGhpcy5wb2ludENvb3JkaW5hdGUoaSksZT10aGlzLnBvaW50Q29vcmRpbmF0ZSh0aGlzLmNlbnRlclBvaW50KSxhPW8uX3N1YihuKTt0aGlzLmNlbnRlcj10aGlzLmNvb3JkaW5hdGVMb2NhdGlvbihlLl9zdWIoYSkpfSxzZXRab29tQXJvdW5kOmZ1bmN0aW9uKHQsaSl7dmFyIG47aSYmKG49dGhpcy5sb2NhdGlvblBvaW50KGkpKSx0aGlzLnpvb209dCxpJiZ0aGlzLnNldExvY2F0aW9uQXRQb2ludChpLG4pfSxzZXRCZWFyaW5nQXJvdW5kOmZ1bmN0aW9uKHQsaSl7dmFyIG47aSYmKG49dGhpcy5sb2NhdGlvblBvaW50KGkpKSx0aGlzLmJlYXJpbmc9dCxpJiZ0aGlzLnNldExvY2F0aW9uQXRQb2ludChpLG4pfSxsb2NhdGlvblBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvb3JkaW5hdGVQb2ludCh0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZSh0KSl9LHBvaW50TG9jYXRpb246ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRoaXMucG9pbnRDb29yZGluYXRlKHQpKX0sbG9jYXRpb25Db29yZGluYXRlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuem9vbVNjYWxlKHRoaXMudGlsZVpvb20pL3RoaXMud29ybGRTaXplLG49TG5nTGF0LmNvbnZlcnQodCk7cmV0dXJuIG5ldyBDb29yZGluYXRlKHRoaXMubG5nWChuLmxuZykqaSx0aGlzLmxhdFkobi5sYXQpKmksdGhpcy50aWxlWm9vbSl9LGNvb3JkaW5hdGVMb2NhdGlvbjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLnpvb21TY2FsZSh0Lnpvb20pO3JldHVybiBuZXcgTG5nTGF0KHRoaXMueExuZyh0LmNvbHVtbixpKSx0aGlzLnlMYXQodC5yb3csaSkpfSxwb2ludENvb3JkaW5hdGU6ZnVuY3Rpb24odCxpKXt2b2lkIDA9PT1pJiYoaT0wKTt2YXIgbj10aGlzLmNvb3JkaW5hdGVQb2ludE1hdHJpeCh0aGlzLnRpbGVab29tKSxvPW1hdDQuaW52ZXJ0KG5ldyBGbG9hdDY0QXJyYXkoMTYpLG4pO2lmKCFvKXRocm93IG5ldyBFcnJvcihcImZhaWxlZCB0byBpbnZlcnQgbWF0cml4XCIpO3ZhciBlPXZlYzQudHJhbnNmb3JtTWF0NChbXSxbdC54LHQueSwwLDFdLG8pLGE9dmVjNC50cmFuc2Zvcm1NYXQ0KFtdLFt0LngsdC55LDEsMV0sbykscj1lWzNdLGg9YVszXSxzPWVbMF0vcixjPWFbMF0vaCx1PWVbMV0vcixsPWFbMV0vaCxtPWVbMl0vcixnPWFbMl0vaCxmPW09PT1nPzA6KGktbSkvKGctbSk7cmV0dXJuIG5ldyBDb29yZGluYXRlKGludGVycChzLGMsZiksaW50ZXJwKHUsbCxmKSx0aGlzLnRpbGVab29tKX0sY29vcmRpbmF0ZVBvaW50OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuY29vcmRpbmF0ZVBvaW50TWF0cml4KHQuem9vbSksbj12ZWM0LnRyYW5zZm9ybU1hdDQoW10sW3QuY29sdW1uLHQucm93LDAsMV0saSk7cmV0dXJuIG5ldyBQb2ludChuWzBdL25bM10sblsxXS9uWzNdKX0sY29vcmRpbmF0ZVBvaW50TWF0cml4OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZ2V0UHJvak1hdHJpeCgpLG49dGhpcy53b3JsZFNpemUvdGhpcy56b29tU2NhbGUodCk7cmV0dXJuIG1hdDQuc2NhbGUoaSxpLFtuLG4sMV0pLG1hdDQubXVsdGlwbHkoaSx0aGlzLmdldFBpeGVsTWF0cml4KCksaSksaX0sZ2V0UGl4ZWxNYXRyaXg6ZnVuY3Rpb24oKXt2YXIgdD1tYXQ0LmNyZWF0ZSgpO3JldHVybiBtYXQ0LnNjYWxlKHQsdCxbdGhpcy53aWR0aC8yLC10aGlzLmhlaWdodC8yLDFdKSxtYXQ0LnRyYW5zbGF0ZSh0LHQsWzEsLTEsMF0pLHR9LF9jb25zdHJhaW46ZnVuY3Rpb24oKXtpZih0aGlzLmNlbnRlciYmdGhpcy53aWR0aCYmdGhpcy5oZWlnaHQmJiF0aGlzLl9jb25zdHJhaW5pbmcpe3RoaXMuX2NvbnN0cmFpbmluZz0hMDt2YXIgdCxpLG4sbyxlLGEscixoLHM9dGhpcy5zaXplO3RoaXMubGF0UmFuZ2UmJih0PXRoaXMubGF0WSh0aGlzLmxhdFJhbmdlWzFdKSxpPXRoaXMubGF0WSh0aGlzLmxhdFJhbmdlWzBdKSxlPWktdDxzLnk/cy55LyhpLXQpOjApLHRoaXMubG5nUmFuZ2UmJihuPXRoaXMubG5nWCh0aGlzLmxuZ1JhbmdlWzBdKSxvPXRoaXMubG5nWCh0aGlzLmxuZ1JhbmdlWzFdKSxhPW8tbjxzLng/cy54LyhvLW4pOjApO3ZhciBjPU1hdGgubWF4KGF8fDAsZXx8MCk7aWYoYylyZXR1cm4gdGhpcy5jZW50ZXI9dGhpcy51bnByb2plY3QobmV3IFBvaW50KGE/KG8rbikvMjp0aGlzLngsZT8oaSt0KS8yOnRoaXMueSkpLHRoaXMuem9vbSs9dGhpcy5zY2FsZVpvb20oYyksdm9pZCh0aGlzLl9jb25zdHJhaW5pbmc9ITEpO2lmKHRoaXMubGF0UmFuZ2Upe3ZhciB1PXRoaXMueSxsPXMueS8yO3Q+dS1sJiYoaD10K2wpLHUrbD5pJiYoaD1pLWwpfWlmKHRoaXMubG5nUmFuZ2Upe3ZhciBtPXRoaXMueCxnPXMueC8yO24+bS1nJiYocj1uK2cpLG0rZz5vJiYocj1vLWcpfSh2b2lkIDAhPT1yfHx2b2lkIDAhPT1oKSYmKHRoaXMuY2VudGVyPXRoaXMudW5wcm9qZWN0KG5ldyBQb2ludCh2b2lkIDAhPT1yP3I6dGhpcy54LHZvaWQgMCE9PWg/aDp0aGlzLnkpKSksdGhpcy5fY29uc3RyYWluaW5nPSExfX0sZ2V0UHJvak1hdHJpeDpmdW5jdGlvbigpe3ZhciB0PW5ldyBGbG9hdDY0QXJyYXkoMTYpLGk9TWF0aC5hdGFuKC41L3RoaXMuYWx0aXR1ZGUpLG49TWF0aC5zaW4oaSkqdGhpcy5hbHRpdHVkZS9NYXRoLnNpbihNYXRoLlBJLzItdGhpcy5fcGl0Y2gtaSksbz1NYXRoLmNvcyhNYXRoLlBJLzItdGhpcy5fcGl0Y2gpKm4rdGhpcy5hbHRpdHVkZTtyZXR1cm4gbWF0NC5wZXJzcGVjdGl2ZSh0LDIqTWF0aC5hdGFuKHRoaXMuaGVpZ2h0LzIvdGhpcy5hbHRpdHVkZSksdGhpcy53aWR0aC90aGlzLmhlaWdodCwuMSxvKSxtYXQ0LnRyYW5zbGF0ZSh0LHQsWzAsMCwtdGhpcy5hbHRpdHVkZV0pLG1hdDQuc2NhbGUodCx0LFsxLC0xLDEvdGhpcy5oZWlnaHRdKSxtYXQ0LnJvdGF0ZVgodCx0LHRoaXMuX3BpdGNoKSxtYXQ0LnJvdGF0ZVoodCx0LHRoaXMuYW5nbGUpLG1hdDQudHJhbnNsYXRlKHQsdCxbLXRoaXMueCwtdGhpcy55LDBdKSx0fX07XG59LHtcIi4uL3V0aWwvaW50ZXJwb2xhdGVcIjoxMDIsXCIuLi91dGlsL3V0aWxcIjoxMDYsXCIuL2Nvb3JkaW5hdGVcIjoxOSxcIi4vbG5nX2xhdFwiOjIwLFwiZ2wtbWF0cml4XCI6MTE2LFwicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSwyMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgc2ltcGxleEZvbnQ9e1wiIFwiOlsxNixbXV0sXCIhXCI6WzEwLFs1LDIxLDUsNywtMSwtMSw1LDIsNCwxLDUsMCw2LDEsNSwyXV0sJ1wiJzpbMTYsWzQsMjEsNCwxNCwtMSwtMSwxMiwyMSwxMiwxNF1dLFwiI1wiOlsyMSxbMTEsMjUsNCwtNywtMSwtMSwxNywyNSwxMCwtNywtMSwtMSw0LDEyLDE4LDEyLC0xLC0xLDMsNiwxNyw2XV0sJDpbMjAsWzgsMjUsOCwtNCwtMSwtMSwxMiwyNSwxMiwtNCwtMSwtMSwxNywxOCwxNSwyMCwxMiwyMSw4LDIxLDUsMjAsMywxOCwzLDE2LDQsMTQsNSwxMyw3LDEyLDEzLDEwLDE1LDksMTYsOCwxNyw2LDE3LDMsMTUsMSwxMiwwLDgsMCw1LDEsMywzXV0sXCIlXCI6WzI0LFsyMSwyMSwzLDAsLTEsLTEsOCwyMSwxMCwxOSwxMCwxNyw5LDE1LDcsMTQsNSwxNCwzLDE2LDMsMTgsNCwyMCw2LDIxLDgsMjEsMTAsMjAsMTMsMTksMTYsMTksMTksMjAsMjEsMjEsLTEsLTEsMTcsNywxNSw2LDE0LDQsMTQsMiwxNiwwLDE4LDAsMjAsMSwyMSwzLDIxLDUsMTksNywxNyw3XV0sXCImXCI6WzI2LFsyMywxMiwyMywxMywyMiwxNCwyMSwxNCwyMCwxMywxOSwxMSwxNyw2LDE1LDMsMTMsMSwxMSwwLDcsMCw1LDEsNCwyLDMsNCwzLDYsNCw4LDUsOSwxMiwxMywxMywxNCwxNCwxNiwxNCwxOCwxMywyMCwxMSwyMSw5LDIwLDgsMTgsOCwxNiw5LDEzLDExLDEwLDE2LDMsMTgsMSwyMCwwLDIyLDAsMjMsMSwyMywyXV0sXCInXCI6WzEwLFs1LDE5LDQsMjAsNSwyMSw2LDIwLDYsMTgsNSwxNiw0LDE1XV0sXCIoXCI6WzE0LFsxMSwyNSw5LDIzLDcsMjAsNSwxNiw0LDExLDQsNyw1LDIsNywtMiw5LC01LDExLC03XV0sXCIpXCI6WzE0LFszLDI1LDUsMjMsNywyMCw5LDE2LDEwLDExLDEwLDcsOSwyLDcsLTIsNSwtNSwzLC03XV0sXCIqXCI6WzE2LFs4LDIxLDgsOSwtMSwtMSwzLDE4LDEzLDEyLC0xLC0xLDEzLDE4LDMsMTJdXSxcIitcIjpbMjYsWzEzLDE4LDEzLDAsLTEsLTEsNCw5LDIyLDldXSxcIixcIjpbMTAsWzYsMSw1LDAsNCwxLDUsMiw2LDEsNiwtMSw1LC0zLDQsLTRdXSxcIi1cIjpbMjYsWzQsOSwyMiw5XV0sXCIuXCI6WzEwLFs1LDIsNCwxLDUsMCw2LDEsNSwyXV0sXCIvXCI6WzIyLFsyMCwyNSwyLC03XV0sMDpbMjAsWzksMjEsNiwyMCw0LDE3LDMsMTIsMyw5LDQsNCw2LDEsOSwwLDExLDAsMTQsMSwxNiw0LDE3LDksMTcsMTIsMTYsMTcsMTQsMjAsMTEsMjEsOSwyMV1dLDE6WzIwLFs2LDE3LDgsMTgsMTEsMjEsMTEsMF1dLDI6WzIwLFs0LDE2LDQsMTcsNSwxOSw2LDIwLDgsMjEsMTIsMjEsMTQsMjAsMTUsMTksMTYsMTcsMTYsMTUsMTUsMTMsMTMsMTAsMywwLDE3LDBdXSwzOlsyMCxbNSwyMSwxNiwyMSwxMCwxMywxMywxMywxNSwxMiwxNiwxMSwxNyw4LDE3LDYsMTYsMywxNCwxLDExLDAsOCwwLDUsMSw0LDIsMyw0XV0sNDpbMjAsWzEzLDIxLDMsNywxOCw3LC0xLC0xLDEzLDIxLDEzLDBdXSw1OlsyMCxbMTUsMjEsNSwyMSw0LDEyLDUsMTMsOCwxNCwxMSwxNCwxNCwxMywxNiwxMSwxNyw4LDE3LDYsMTYsMywxNCwxLDExLDAsOCwwLDUsMSw0LDIsMyw0XV0sNjpbMjAsWzE2LDE4LDE1LDIwLDEyLDIxLDEwLDIxLDcsMjAsNSwxNyw0LDEyLDQsNyw1LDMsNywxLDEwLDAsMTEsMCwxNCwxLDE2LDMsMTcsNiwxNyw3LDE2LDEwLDE0LDEyLDExLDEzLDEwLDEzLDcsMTIsNSwxMCw0LDddXSw3OlsyMCxbMTcsMjEsNywwLC0xLC0xLDMsMjEsMTcsMjFdXSw4OlsyMCxbOCwyMSw1LDIwLDQsMTgsNCwxNiw1LDE0LDcsMTMsMTEsMTIsMTQsMTEsMTYsOSwxNyw3LDE3LDQsMTYsMiwxNSwxLDEyLDAsOCwwLDUsMSw0LDIsMyw0LDMsNyw0LDksNiwxMSw5LDEyLDEzLDEzLDE1LDE0LDE2LDE2LDE2LDE4LDE1LDIwLDEyLDIxLDgsMjFdXSw5OlsyMCxbMTYsMTQsMTUsMTEsMTMsOSwxMCw4LDksOCw2LDksNCwxMSwzLDE0LDMsMTUsNCwxOCw2LDIwLDksMjEsMTAsMjEsMTMsMjAsMTUsMTgsMTYsMTQsMTYsOSwxNSw0LDEzLDEsMTAsMCw4LDAsNSwxLDQsM11dLFwiOlwiOlsxMCxbNSwxNCw0LDEzLDUsMTIsNiwxMyw1LDE0LC0xLC0xLDUsMiw0LDEsNSwwLDYsMSw1LDJdXSxcIjtcIjpbMTAsWzUsMTQsNCwxMyw1LDEyLDYsMTMsNSwxNCwtMSwtMSw2LDEsNSwwLDQsMSw1LDIsNiwxLDYsLTEsNSwtMyw0LC00XV0sXCI8XCI6WzI0LFsyMCwxOCw0LDksMjAsMF1dLFwiPVwiOlsyNixbNCwxMiwyMiwxMiwtMSwtMSw0LDYsMjIsNl1dLFwiPlwiOlsyNCxbNCwxOCwyMCw5LDQsMF1dLFwiP1wiOlsxOCxbMywxNiwzLDE3LDQsMTksNSwyMCw3LDIxLDExLDIxLDEzLDIwLDE0LDE5LDE1LDE3LDE1LDE1LDE0LDEzLDEzLDEyLDksMTAsOSw3LC0xLC0xLDksMiw4LDEsOSwwLDEwLDEsOSwyXV0sXCJAXCI6WzI3LFsxOCwxMywxNywxNSwxNSwxNiwxMiwxNiwxMCwxNSw5LDE0LDgsMTEsOCw4LDksNiwxMSw1LDE0LDUsMTYsNiwxNyw4LC0xLC0xLDEyLDE2LDEwLDE0LDksMTEsOSw4LDEwLDYsMTEsNSwtMSwtMSwxOCwxNiwxNyw4LDE3LDYsMTksNSwyMSw1LDIzLDcsMjQsMTAsMjQsMTIsMjMsMTUsMjIsMTcsMjAsMTksMTgsMjAsMTUsMjEsMTIsMjEsOSwyMCw3LDE5LDUsMTcsNCwxNSwzLDEyLDMsOSw0LDYsNSw0LDcsMiw5LDEsMTIsMCwxNSwwLDE4LDEsMjAsMiwyMSwzLC0xLC0xLDE5LDE2LDE4LDgsMTgsNiwxOSw1XV0sQTpbMTgsWzksMjEsMSwwLC0xLC0xLDksMjEsMTcsMCwtMSwtMSw0LDcsMTQsN11dLEI6WzIxLFs0LDIxLDQsMCwtMSwtMSw0LDIxLDEzLDIxLDE2LDIwLDE3LDE5LDE4LDE3LDE4LDE1LDE3LDEzLDE2LDEyLDEzLDExLC0xLC0xLDQsMTEsMTMsMTEsMTYsMTAsMTcsOSwxOCw3LDE4LDQsMTcsMiwxNiwxLDEzLDAsNCwwXV0sQzpbMjEsWzE4LDE2LDE3LDE4LDE1LDIwLDEzLDIxLDksMjEsNywyMCw1LDE4LDQsMTYsMywxMywzLDgsNCw1LDUsMyw3LDEsOSwwLDEzLDAsMTUsMSwxNywzLDE4LDVdXSxEOlsyMSxbNCwyMSw0LDAsLTEsLTEsNCwyMSwxMSwyMSwxNCwyMCwxNiwxOCwxNywxNiwxOCwxMywxOCw4LDE3LDUsMTYsMywxNCwxLDExLDAsNCwwXV0sRTpbMTksWzQsMjEsNCwwLC0xLC0xLDQsMjEsMTcsMjEsLTEsLTEsNCwxMSwxMiwxMSwtMSwtMSw0LDAsMTcsMF1dLEY6WzE4LFs0LDIxLDQsMCwtMSwtMSw0LDIxLDE3LDIxLC0xLC0xLDQsMTEsMTIsMTFdXSxHOlsyMSxbMTgsMTYsMTcsMTgsMTUsMjAsMTMsMjEsOSwyMSw3LDIwLDUsMTgsNCwxNiwzLDEzLDMsOCw0LDUsNSwzLDcsMSw5LDAsMTMsMCwxNSwxLDE3LDMsMTgsNSwxOCw4LC0xLC0xLDEzLDgsMTgsOF1dLEg6WzIyLFs0LDIxLDQsMCwtMSwtMSwxOCwyMSwxOCwwLC0xLC0xLDQsMTEsMTgsMTFdXSxJOls4LFs0LDIxLDQsMF1dLEo6WzE2LFsxMiwyMSwxMiw1LDExLDIsMTAsMSw4LDAsNiwwLDQsMSwzLDIsMiw1LDIsN11dLEs6WzIxLFs0LDIxLDQsMCwtMSwtMSwxOCwyMSw0LDcsLTEsLTEsOSwxMiwxOCwwXV0sTDpbMTcsWzQsMjEsNCwwLC0xLC0xLDQsMCwxNiwwXV0sTTpbMjQsWzQsMjEsNCwwLC0xLC0xLDQsMjEsMTIsMCwtMSwtMSwyMCwyMSwxMiwwLC0xLC0xLDIwLDIxLDIwLDBdXSxOOlsyMixbNCwyMSw0LDAsLTEsLTEsNCwyMSwxOCwwLC0xLC0xLDE4LDIxLDE4LDBdXSxPOlsyMixbOSwyMSw3LDIwLDUsMTgsNCwxNiwzLDEzLDMsOCw0LDUsNSwzLDcsMSw5LDAsMTMsMCwxNSwxLDE3LDMsMTgsNSwxOSw4LDE5LDEzLDE4LDE2LDE3LDE4LDE1LDIwLDEzLDIxLDksMjFdXSxQOlsyMSxbNCwyMSw0LDAsLTEsLTEsNCwyMSwxMywyMSwxNiwyMCwxNywxOSwxOCwxNywxOCwxNCwxNywxMiwxNiwxMSwxMywxMCw0LDEwXV0sUTpbMjIsWzksMjEsNywyMCw1LDE4LDQsMTYsMywxMywzLDgsNCw1LDUsMyw3LDEsOSwwLDEzLDAsMTUsMSwxNywzLDE4LDUsMTksOCwxOSwxMywxOCwxNiwxNywxOCwxNSwyMCwxMywyMSw5LDIxLC0xLC0xLDEyLDQsMTgsLTJdXSxSOlsyMSxbNCwyMSw0LDAsLTEsLTEsNCwyMSwxMywyMSwxNiwyMCwxNywxOSwxOCwxNywxOCwxNSwxNywxMywxNiwxMiwxMywxMSw0LDExLC0xLC0xLDExLDExLDE4LDBdXSxTOlsyMCxbMTcsMTgsMTUsMjAsMTIsMjEsOCwyMSw1LDIwLDMsMTgsMywxNiw0LDE0LDUsMTMsNywxMiwxMywxMCwxNSw5LDE2LDgsMTcsNiwxNywzLDE1LDEsMTIsMCw4LDAsNSwxLDMsM11dLFQ6WzE2LFs4LDIxLDgsMCwtMSwtMSwxLDIxLDE1LDIxXV0sVTpbMjIsWzQsMjEsNCw2LDUsMyw3LDEsMTAsMCwxMiwwLDE1LDEsMTcsMywxOCw2LDE4LDIxXV0sVjpbMTgsWzEsMjEsOSwwLC0xLC0xLDE3LDIxLDksMF1dLFc6WzI0LFsyLDIxLDcsMCwtMSwtMSwxMiwyMSw3LDAsLTEsLTEsMTIsMjEsMTcsMCwtMSwtMSwyMiwyMSwxNywwXV0sWDpbMjAsWzMsMjEsMTcsMCwtMSwtMSwxNywyMSwzLDBdXSxZOlsxOCxbMSwyMSw5LDExLDksMCwtMSwtMSwxNywyMSw5LDExXV0sWjpbMjAsWzE3LDIxLDMsMCwtMSwtMSwzLDIxLDE3LDIxLC0xLC0xLDMsMCwxNywwXV0sXCJbXCI6WzE0LFs0LDI1LDQsLTcsLTEsLTEsNSwyNSw1LC03LC0xLC0xLDQsMjUsMTEsMjUsLTEsLTEsNCwtNywxMSwtN11dLFwiXFxcXFwiOlsxNCxbMCwyMSwxNCwtM11dLFwiXVwiOlsxNCxbOSwyNSw5LC03LC0xLC0xLDEwLDI1LDEwLC03LC0xLC0xLDMsMjUsMTAsMjUsLTEsLTEsMywtNywxMCwtN11dLFwiXlwiOlsxNixbNiwxNSw4LDE4LDEwLDE1LC0xLC0xLDMsMTIsOCwxNywxMywxMiwtMSwtMSw4LDE3LDgsMF1dLF86WzE2LFswLC0yLDE2LC0yXV0sXCJgXCI6WzEwLFs2LDIxLDUsMjAsNCwxOCw0LDE2LDUsMTUsNiwxNiw1LDE3XV0sYTpbMTksWzE1LDE0LDE1LDAsLTEsLTEsMTUsMTEsMTMsMTMsMTEsMTQsOCwxNCw2LDEzLDQsMTEsMyw4LDMsNiw0LDMsNiwxLDgsMCwxMSwwLDEzLDEsMTUsM11dLGI6WzE5LFs0LDIxLDQsMCwtMSwtMSw0LDExLDYsMTMsOCwxNCwxMSwxNCwxMywxMywxNSwxMSwxNiw4LDE2LDYsMTUsMywxMywxLDExLDAsOCwwLDYsMSw0LDNdXSxjOlsxOCxbMTUsMTEsMTMsMTMsMTEsMTQsOCwxNCw2LDEzLDQsMTEsMyw4LDMsNiw0LDMsNiwxLDgsMCwxMSwwLDEzLDEsMTUsM11dLGQ6WzE5LFsxNSwyMSwxNSwwLC0xLC0xLDE1LDExLDEzLDEzLDExLDE0LDgsMTQsNiwxMyw0LDExLDMsOCwzLDYsNCwzLDYsMSw4LDAsMTEsMCwxMywxLDE1LDNdXSxlOlsxOCxbMyw4LDE1LDgsMTUsMTAsMTQsMTIsMTMsMTMsMTEsMTQsOCwxNCw2LDEzLDQsMTEsMyw4LDMsNiw0LDMsNiwxLDgsMCwxMSwwLDEzLDEsMTUsM11dLGY6WzEyLFsxMCwyMSw4LDIxLDYsMjAsNSwxNyw1LDAsLTEsLTEsMiwxNCw5LDE0XV0sZzpbMTksWzE1LDE0LDE1LC0yLDE0LC01LDEzLC02LDExLC03LDgsLTcsNiwtNiwtMSwtMSwxNSwxMSwxMywxMywxMSwxNCw4LDE0LDYsMTMsNCwxMSwzLDgsMyw2LDQsMyw2LDEsOCwwLDExLDAsMTMsMSwxNSwzXV0saDpbMTksWzQsMjEsNCwwLC0xLC0xLDQsMTAsNywxMyw5LDE0LDEyLDE0LDE0LDEzLDE1LDEwLDE1LDBdXSxpOls4LFszLDIxLDQsMjAsNSwyMSw0LDIyLDMsMjEsLTEsLTEsNCwxNCw0LDBdXSxqOlsxMCxbNSwyMSw2LDIwLDcsMjEsNiwyMiw1LDIxLC0xLC0xLDYsMTQsNiwtMyw1LC02LDMsLTcsMSwtN11dLGs6WzE3LFs0LDIxLDQsMCwtMSwtMSwxNCwxNCw0LDQsLTEsLTEsOCw4LDE1LDBdXSxsOls4LFs0LDIxLDQsMF1dLG06WzMwLFs0LDE0LDQsMCwtMSwtMSw0LDEwLDcsMTMsOSwxNCwxMiwxNCwxNCwxMywxNSwxMCwxNSwwLC0xLC0xLDE1LDEwLDE4LDEzLDIwLDE0LDIzLDE0LDI1LDEzLDI2LDEwLDI2LDBdXSxuOlsxOSxbNCwxNCw0LDAsLTEsLTEsNCwxMCw3LDEzLDksMTQsMTIsMTQsMTQsMTMsMTUsMTAsMTUsMF1dLG86WzE5LFs4LDE0LDYsMTMsNCwxMSwzLDgsMyw2LDQsMyw2LDEsOCwwLDExLDAsMTMsMSwxNSwzLDE2LDYsMTYsOCwxNSwxMSwxMywxMywxMSwxNCw4LDE0XV0scDpbMTksWzQsMTQsNCwtNywtMSwtMSw0LDExLDYsMTMsOCwxNCwxMSwxNCwxMywxMywxNSwxMSwxNiw4LDE2LDYsMTUsMywxMywxLDExLDAsOCwwLDYsMSw0LDNdXSxxOlsxOSxbMTUsMTQsMTUsLTcsLTEsLTEsMTUsMTEsMTMsMTMsMTEsMTQsOCwxNCw2LDEzLDQsMTEsMyw4LDMsNiw0LDMsNiwxLDgsMCwxMSwwLDEzLDEsMTUsM11dLHI6WzEzLFs0LDE0LDQsMCwtMSwtMSw0LDgsNSwxMSw3LDEzLDksMTQsMTIsMTRdXSxzOlsxNyxbMTQsMTEsMTMsMTMsMTAsMTQsNywxNCw0LDEzLDMsMTEsNCw5LDYsOCwxMSw3LDEzLDYsMTQsNCwxNCwzLDEzLDEsMTAsMCw3LDAsNCwxLDMsM11dLHQ6WzEyLFs1LDIxLDUsNCw2LDEsOCwwLDEwLDAsLTEsLTEsMiwxNCw5LDE0XV0sdTpbMTksWzQsMTQsNCw0LDUsMSw3LDAsMTAsMCwxMiwxLDE1LDQsLTEsLTEsMTUsMTQsMTUsMF1dLHY6WzE2LFsyLDE0LDgsMCwtMSwtMSwxNCwxNCw4LDBdXSx3OlsyMixbMywxNCw3LDAsLTEsLTEsMTEsMTQsNywwLC0xLC0xLDExLDE0LDE1LDAsLTEsLTEsMTksMTQsMTUsMF1dLHg6WzE3LFszLDE0LDE0LDAsLTEsLTEsMTQsMTQsMywwXV0seTpbMTYsWzIsMTQsOCwwLC0xLC0xLDE0LDE0LDgsMCw2LC00LDQsLTYsMiwtNywxLC03XV0sejpbMTcsWzE0LDE0LDMsMCwtMSwtMSwzLDE0LDE0LDE0LC0xLC0xLDMsMCwxNCwwXV0sXCJ7XCI6WzE0LFs5LDI1LDcsMjQsNiwyMyw1LDIxLDUsMTksNiwxNyw3LDE2LDgsMTQsOCwxMiw2LDEwLC0xLC0xLDcsMjQsNiwyMiw2LDIwLDcsMTgsOCwxNyw5LDE1LDksMTMsOCwxMSw0LDksOCw3LDksNSw5LDMsOCwxLDcsMCw2LC0yLDYsLTQsNywtNiwtMSwtMSw2LDgsOCw2LDgsNCw3LDIsNiwxLDUsLTEsNSwtMyw2LC01LDcsLTYsOSwtN11dLFwifFwiOls4LFs0LDI1LDQsLTddXSxcIn1cIjpbMTQsWzUsMjUsNywyNCw4LDIzLDksMjEsOSwxOSw4LDE3LDcsMTYsNiwxNCw2LDEyLDgsMTAsLTEsLTEsNywyNCw4LDIyLDgsMjAsNywxOCw2LDE3LDUsMTUsNSwxMyw2LDExLDEwLDksNiw3LDUsNSw1LDMsNiwxLDcsMCw4LC0yLDgsLTQsNywtNiwtMSwtMSw4LDgsNiw2LDYsNCw3LDIsOCwxLDksLTEsOSwtMyw4LC01LDcsLTYsNSwtN11dLFwiflwiOlsyNCxbMyw2LDMsOCw0LDExLDYsMTIsOCwxMiwxMCwxMSwxNCw4LDE2LDcsMTgsNywyMCw4LDIxLDEwLC0xLC0xLDMsOCw0LDEwLDYsMTEsOCwxMSwxMCwxMCwxNCw3LDE2LDYsMTgsNiwyMCw3LDIxLDEwLDIxLDEyXV19O21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGwsbix0LGUpe2U9ZXx8MTt2YXIgcixvLHUscyxpLHgsZixwLGg9W107Zm9yKHI9MCxvPWwubGVuZ3RoO28+cjtyKyspaWYoaT1zaW1wbGV4Rm9udFtsW3JdXSl7Zm9yKHA9bnVsbCx1PTAscz1pWzFdLmxlbmd0aDtzPnU7dSs9MiktMT09PWlbMV1bdV0mJi0xPT09aVsxXVt1KzFdP3A9bnVsbDooeD1uK2lbMV1bdV0qZSxmPXQtaVsxXVt1KzFdKmUscCYmaC5wdXNoKHAueCxwLnkseCxmKSxwPXt4OngseTpmfSk7bis9aVswXSplfXJldHVybiBofTtcbn0se31dLDI0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBtYXBib3hnbD1tb2R1bGUuZXhwb3J0cz17fTttYXBib3hnbC5NYXA9cmVxdWlyZShcIi4vdWkvbWFwXCIpLG1hcGJveGdsLkNvbnRyb2w9cmVxdWlyZShcIi4vdWkvY29udHJvbC9jb250cm9sXCIpLG1hcGJveGdsLk5hdmlnYXRpb249cmVxdWlyZShcIi4vdWkvY29udHJvbC9uYXZpZ2F0aW9uXCIpLG1hcGJveGdsLkF0dHJpYnV0aW9uPXJlcXVpcmUoXCIuL3VpL2NvbnRyb2wvYXR0cmlidXRpb25cIiksbWFwYm94Z2wuUG9wdXA9cmVxdWlyZShcIi4vdWkvcG9wdXBcIiksbWFwYm94Z2wuR2VvSlNPTlNvdXJjZT1yZXF1aXJlKFwiLi9zb3VyY2UvZ2VvanNvbl9zb3VyY2VcIiksbWFwYm94Z2wuVmlkZW9Tb3VyY2U9cmVxdWlyZShcIi4vc291cmNlL3ZpZGVvX3NvdXJjZVwiKSxtYXBib3hnbC5JbWFnZVNvdXJjZT1yZXF1aXJlKFwiLi9zb3VyY2UvaW1hZ2Vfc291cmNlXCIpLG1hcGJveGdsLlN0eWxlPXJlcXVpcmUoXCIuL3N0eWxlL3N0eWxlXCIpLG1hcGJveGdsLkxuZ0xhdD1yZXF1aXJlKFwiLi9nZW8vbG5nX2xhdFwiKSxtYXBib3hnbC5MbmdMYXRCb3VuZHM9cmVxdWlyZShcIi4vZ2VvL2xuZ19sYXRfYm91bmRzXCIpLG1hcGJveGdsLlBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKSxtYXBib3hnbC5FdmVudGVkPXJlcXVpcmUoXCIuL3V0aWwvZXZlbnRlZFwiKSxtYXBib3hnbC51dGlsPXJlcXVpcmUoXCIuL3V0aWwvdXRpbFwiKSxtYXBib3hnbC5zdXBwb3J0ZWQ9cmVxdWlyZShcIi4vdXRpbC9icm93c2VyXCIpLnN1cHBvcnRlZDt2YXIgYWpheD1yZXF1aXJlKFwiLi91dGlsL2FqYXhcIik7bWFwYm94Z2wudXRpbC5nZXRKU09OPWFqYXguZ2V0SlNPTixtYXBib3hnbC51dGlsLmdldEFycmF5QnVmZmVyPWFqYXguZ2V0QXJyYXlCdWZmZXI7dmFyIGNvbmZpZz1yZXF1aXJlKFwiLi91dGlsL2NvbmZpZ1wiKTttYXBib3hnbC5jb25maWc9Y29uZmlnLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYXBib3hnbCxcImFjY2Vzc1Rva2VuXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBjb25maWcuQUNDRVNTX1RPS0VOfSxzZXQ6ZnVuY3Rpb24oZSl7Y29uZmlnLkFDQ0VTU19UT0tFTj1lfX0pO1xufSx7XCIuL2dlby9sbmdfbGF0XCI6MjAsXCIuL2dlby9sbmdfbGF0X2JvdW5kc1wiOjIxLFwiLi9zb3VyY2UvZ2VvanNvbl9zb3VyY2VcIjozOSxcIi4vc291cmNlL2ltYWdlX3NvdXJjZVwiOjQxLFwiLi9zb3VyY2UvdmlkZW9fc291cmNlXCI6NDgsXCIuL3N0eWxlL3N0eWxlXCI6NTYsXCIuL3VpL2NvbnRyb2wvYXR0cmlidXRpb25cIjo3OSxcIi4vdWkvY29udHJvbC9jb250cm9sXCI6ODAsXCIuL3VpL2NvbnRyb2wvbmF2aWdhdGlvblwiOjgxLFwiLi91aS9tYXBcIjo5MSxcIi4vdWkvcG9wdXBcIjo5MixcIi4vdXRpbC9hamF4XCI6OTQsXCIuL3V0aWwvYnJvd3NlclwiOjk1LFwiLi91dGlsL2NvbmZpZ1wiOjk5LFwiLi91dGlsL2V2ZW50ZWRcIjoxMDAsXCIuL3V0aWwvdXRpbFwiOjEwNixcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sMjU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd0JhY2tncm91bmQodCxhLHIpe3ZhciBlLGk9dC5nbCxvPWEucGFpbnRbXCJiYWNrZ3JvdW5kLWNvbG9yXCJdLG49YS5wYWludFtcImJhY2tncm91bmQtcGF0dGVyblwiXSxsPWEucGFpbnRbXCJiYWNrZ3JvdW5kLW9wYWNpdHlcIl0sdT1uP3Quc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24obi5mcm9tLCEwKTpudWxsLG09bj90LnNwcml0ZUF0bGFzLmdldFBvc2l0aW9uKG4udG8sITApOm51bGw7aWYodSYmbSl7ZT10LnBhdHRlcm5TaGFkZXIsaS5zd2l0Y2hTaGFkZXIoZSxyKSxpLnVuaWZvcm0xaShlLnVfaW1hZ2UsMCksaS51bmlmb3JtMmZ2KGUudV9wYXR0ZXJuX3RsX2EsdS50bCksaS51bmlmb3JtMmZ2KGUudV9wYXR0ZXJuX2JyX2EsdS5iciksaS51bmlmb3JtMmZ2KGUudV9wYXR0ZXJuX3RsX2IsbS50bCksaS51bmlmb3JtMmZ2KGUudV9wYXR0ZXJuX2JyX2IsbS5iciksaS51bmlmb3JtMWYoZS51X29wYWNpdHksbCk7dmFyIGM9dC50cmFuc2Zvcm0sZj11LnNpemUscz1tLnNpemUsXz1jLmxvY2F0aW9uQ29vcmRpbmF0ZShjLmNlbnRlciksUz0xL01hdGgucG93KDIsYy56b29tRnJhY3Rpb24pO2kudW5pZm9ybTFmKGUudV9taXgsbi50KTt2YXIgZD1tYXQzLmNyZWF0ZSgpO21hdDMuc2NhbGUoZCxkLFsxLyhmWzBdKm4uZnJvbVNjYWxlKSwxLyhmWzFdKm4uZnJvbVNjYWxlKV0pLG1hdDMudHJhbnNsYXRlKGQsZCxbXy5jb2x1bW4qYy50aWxlU2l6ZSUoZlswXSpuLmZyb21TY2FsZSksXy5yb3cqYy50aWxlU2l6ZSUoZlsxXSpuLmZyb21TY2FsZSldKSxtYXQzLnJvdGF0ZShkLGQsLWMuYW5nbGUpLG1hdDMuc2NhbGUoZCxkLFtTKmMud2lkdGgvMiwtUypjLmhlaWdodC8yXSk7dmFyIHA9bWF0My5jcmVhdGUoKTttYXQzLnNjYWxlKHAscCxbMS8oc1swXSpuLnRvU2NhbGUpLDEvKHNbMV0qbi50b1NjYWxlKV0pLG1hdDMudHJhbnNsYXRlKHAscCxbXy5jb2x1bW4qYy50aWxlU2l6ZSUoc1swXSpuLnRvU2NhbGUpLF8ucm93KmMudGlsZVNpemUlKHNbMV0qbi50b1NjYWxlKV0pLG1hdDMucm90YXRlKHAscCwtYy5hbmdsZSksbWF0My5zY2FsZShwLHAsW1MqYy53aWR0aC8yLC1TKmMuaGVpZ2h0LzJdKSxpLnVuaWZvcm1NYXRyaXgzZnYoZS51X3BhdHRlcm5tYXRyaXhfYSwhMSxkKSxpLnVuaWZvcm1NYXRyaXgzZnYoZS51X3BhdHRlcm5tYXRyaXhfYiwhMSxwKSx0LnNwcml0ZUF0bGFzLmJpbmQoaSwhMCl9ZWxzZSBlPXQuZmlsbFNoYWRlcixpLnN3aXRjaFNoYWRlcihlLHIpLGkudW5pZm9ybTRmdihlLnVfY29sb3Isbyk7aS5kaXNhYmxlKGkuU1RFTkNJTF9URVNUKSxpLmJpbmRCdWZmZXIoaS5BUlJBWV9CVUZGRVIsdC5iYWNrZ3JvdW5kQnVmZmVyKSxpLnZlcnRleEF0dHJpYlBvaW50ZXIoZS5hX3Bvcyx0LmJhY2tncm91bmRCdWZmZXIuaXRlbVNpemUsaS5TSE9SVCwhMSwwLDApLGkuZHJhd0FycmF5cyhpLlRSSUFOR0xFX1NUUklQLDAsdC5iYWNrZ3JvdW5kQnVmZmVyLml0ZW1Db3VudCksaS5lbmFibGUoaS5TVEVOQ0lMX1RFU1QpLGkuc3RlbmNpbE1hc2soMCksaS5zdGVuY2lsRnVuYyhpLkVRVUFMLDEyOCwxMjgpfXZhciBtYXQzPXJlcXVpcmUoXCJnbC1tYXRyaXhcIikubWF0Mzttb2R1bGUuZXhwb3J0cz1kcmF3QmFja2dyb3VuZDtcbn0se1wiZ2wtbWF0cml4XCI6MTE2fV0sMjY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd0NpcmNsZXMoZSxyLGksYSl7aWYoYS5idWZmZXJzKXtpPWUudHJhbnNsYXRlTWF0cml4KGksYSxyLnBhaW50W1wiY2lyY2xlLXRyYW5zbGF0ZVwiXSxyLnBhaW50W1wiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIl0pO3ZhciB0PWEuZWxlbWVudEdyb3Vwc1tyLnJlZnx8ci5pZF07aWYodCl7dmFyIGw9ZS5nbDtsLmRpc2FibGUobC5TVEVOQ0lMX1RFU1QpLGwuc3dpdGNoU2hhZGVyKGUuY2lyY2xlU2hhZGVyLGksYS5leE1hdHJpeCk7dmFyIGM9YS5idWZmZXJzLmNpcmNsZVZlcnRleCxuPWUuY2lyY2xlU2hhZGVyLHM9YS5idWZmZXJzLmNpcmNsZUVsZW1lbnQsdT0xL2Jyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpby9yLnBhaW50W1wiY2lyY2xlLXJhZGl1c1wiXTtsLnVuaWZvcm00ZnYobi51X2NvbG9yLHIucGFpbnRbXCJjaXJjbGUtY29sb3JcIl0pLGwudW5pZm9ybTFmKG4udV9ibHVyLE1hdGgubWF4KHIucGFpbnRbXCJjaXJjbGUtYmx1clwiXSx1KSksbC51bmlmb3JtMWYobi51X3NpemUsci5wYWludFtcImNpcmNsZS1yYWRpdXNcIl0pO2Zvcih2YXIgbz0wO288dC5ncm91cHMubGVuZ3RoO28rKyl7dmFyIGY9dC5ncm91cHNbb10sZD1mLnZlcnRleFN0YXJ0SW5kZXgqYy5pdGVtU2l6ZTtjLmJpbmQobCxuLGQpLHMuYmluZChsLG4sZCk7dmFyIFM9MypmLmVsZW1lbnRMZW5ndGgsYj1mLmVsZW1lbnRTdGFydEluZGV4KnMuaXRlbVNpemU7bC5kcmF3RWxlbWVudHMobC5UUklBTkdMRVMsUyxsLlVOU0lHTkVEX1NIT1JULGIpfWwuZW5hYmxlKGwuU1RFTkNJTF9URVNUKX19fXZhciBicm93c2VyPXJlcXVpcmUoXCIuLi91dGlsL2Jyb3dzZXIuanNcIik7bW9kdWxlLmV4cG9ydHM9ZHJhd0NpcmNsZXM7XG59LHtcIi4uL3V0aWwvYnJvd3Nlci5qc1wiOjk1fV0sMjc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd1BsYWNlbWVudERlYnVnKHIsZSxvLHQpe3ZhciBhPXQuZWxlbWVudEdyb3Vwc1tlLnJlZnx8ZS5pZF0uY29sbGlzaW9uQm94O2lmKGEpe3ZhciBpPXIuZ2wsbj10LmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4LHM9ci5jb2xsaXNpb25Cb3hTaGFkZXI7aS5lbmFibGUoaS5TVEVOQ0lMX1RFU1QpLGkuc3dpdGNoU2hhZGVyKHMsbyksbi5iaW5kKGkscyksaS5saW5lV2lkdGgoMSk7dmFyIHU9MTI7aS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHMuYV9wb3MsMixpLlNIT1JULCExLHUsMCksaS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHMuYV9leHRydWRlLDIsaS5TSE9SVCwhMSx1LDQpLGkudmVydGV4QXR0cmliUG9pbnRlcihzLmFfZGF0YSwyLGkuVU5TSUdORURfQllURSwhMSx1LDgpLGkudW5pZm9ybTFmKHMudV9zY2FsZSxNYXRoLnBvdygyLHIudHJhbnNmb3JtLnpvb20tdC5jb29yZC56KSksaS51bmlmb3JtMWYocy51X3pvb20sMTAqci50cmFuc2Zvcm0uem9vbSksaS51bmlmb3JtMWYocy51X21heHpvb20sMTAqKHQuY29vcmQueisxKSk7dmFyIGQ9YS5ncm91cHNbMF0udmVydGV4U3RhcnRJbmRleCxsPWEuZ3JvdXBzWzBdLnZlcnRleExlbmd0aDtpLmRyYXdBcnJheXMoaS5MSU5FUyxkLGwpLGkuZGlzYWJsZShpLlNURU5DSUxfVEVTVCl9fW1vZHVsZS5leHBvcnRzPWRyYXdQbGFjZW1lbnREZWJ1Zztcbn0se31dLDI4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGRyYXdEZWJ1ZyhlLHIpe3ZhciB0PWUuZ2w7dC5ibGVuZEZ1bmModC5PTkUsdC5PTkVfTUlOVVNfU1JDX0FMUEhBKSx0LnN3aXRjaFNoYWRlcihlLmRlYnVnU2hhZGVyLHIucG9zTWF0cml4KSx0LmJpbmRCdWZmZXIodC5BUlJBWV9CVUZGRVIsZS5kZWJ1Z0J1ZmZlciksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuZGVidWdTaGFkZXIuYV9wb3MsZS5kZWJ1Z0J1ZmZlci5pdGVtU2l6ZSx0LlNIT1JULCExLDAsMCksdC51bmlmb3JtNGYoZS5kZWJ1Z1NoYWRlci51X2NvbG9yLDEsMCwwLDEpLHQubGluZVdpZHRoKDQpLHQuZHJhd0FycmF5cyh0LkxJTkVfU1RSSVAsMCxlLmRlYnVnQnVmZmVyLml0ZW1Db3VudCk7dmFyIGk9dGV4dFZlcnRpY2VzKHIuY29vcmQudG9TdHJpbmcoKSw1MCwyMDAsNSk7dC5iaW5kQnVmZmVyKHQuQVJSQVlfQlVGRkVSLGUuZGVidWdUZXh0QnVmZmVyKSx0LmJ1ZmZlckRhdGEodC5BUlJBWV9CVUZGRVIsbmV3IEludDE2QXJyYXkoaSksdC5TVFJFQU1fRFJBVyksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuZGVidWdTaGFkZXIuYV9wb3MsZS5kZWJ1Z1RleHRCdWZmZXIuaXRlbVNpemUsdC5TSE9SVCwhMSwwLDApLHQubGluZVdpZHRoKDgqYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKSx0LnVuaWZvcm00ZihlLmRlYnVnU2hhZGVyLnVfY29sb3IsMSwxLDEsMSksdC5kcmF3QXJyYXlzKHQuTElORVMsMCxpLmxlbmd0aC9lLmRlYnVnVGV4dEJ1ZmZlci5pdGVtU2l6ZSksdC5saW5lV2lkdGgoMipicm93c2VyLmRldmljZVBpeGVsUmF0aW8pLHQudW5pZm9ybTRmKGUuZGVidWdTaGFkZXIudV9jb2xvciwwLDAsMCwxKSx0LmRyYXdBcnJheXModC5MSU5FUywwLGkubGVuZ3RoL2UuZGVidWdUZXh0QnVmZmVyLml0ZW1TaXplKSx0LmJsZW5kRnVuYyh0Lk9ORV9NSU5VU19EU1RfQUxQSEEsdC5PTkUpfXZhciB0ZXh0VmVydGljZXM9cmVxdWlyZShcIi4uL2xpYi9kZWJ1Z3RleHRcIiksYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpO21vZHVsZS5leHBvcnRzPWRyYXdEZWJ1Zztcbn0se1wiLi4vbGliL2RlYnVndGV4dFwiOjIzLFwiLi4vdXRpbC9icm93c2VyXCI6OTV9XSwyOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkcmF3RmlsbChlLHQscixpKXtpZihpLmJ1ZmZlcnMpe3ZhciBhPWkuZWxlbWVudEdyb3Vwc1t0LnJlZnx8dC5pZF07aWYoYSl7dmFyIGwsbixvLGYscz1lLmdsLHU9ZS50cmFuc2xhdGVNYXRyaXgocixpLHQucGFpbnRbXCJmaWxsLXRyYW5zbGF0ZVwiXSx0LnBhaW50W1wiZmlsbC10cmFuc2xhdGUtYW5jaG9yXCJdKSxjPXQucGFpbnRbXCJmaWxsLWNvbG9yXCJdO3Muc3RlbmNpbE1hc2soNjMpLHMuY2xlYXIocy5TVEVOQ0lMX0JVRkZFUl9CSVQpLHMuc3RlbmNpbEZ1bmMocy5OT1RFUVVBTCwxMjgsMTI4KSxzLnN0ZW5jaWxPcFNlcGFyYXRlKHMuRlJPTlQscy5JTkNSX1dSQVAscy5LRUVQLHMuS0VFUCkscy5zdGVuY2lsT3BTZXBhcmF0ZShzLkJBQ0sscy5ERUNSX1dSQVAscy5LRUVQLHMuS0VFUCkscy5jb2xvck1hc2soITEsITEsITEsITEpLHMuc3dpdGNoU2hhZGVyKGUuZmlsbFNoYWRlcix1KSxsPWkuYnVmZmVycy5maWxsVmVydGV4LGwuYmluZChzKSxuPWkuYnVmZmVycy5maWxsRWxlbWVudCxuLmJpbmQocyk7Zm9yKHZhciBtLFMsRT0wO0U8YS5ncm91cHMubGVuZ3RoO0UrKylvPWEuZ3JvdXBzW0VdLG09by52ZXJ0ZXhTdGFydEluZGV4KmwuaXRlbVNpemUscy52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuZmlsbFNoYWRlci5hX3BvcywyLHMuU0hPUlQsITEsNCxtKzApLGY9MypvLmVsZW1lbnRMZW5ndGgsUz1vLmVsZW1lbnRTdGFydEluZGV4Km4uaXRlbVNpemUscy5kcmF3RWxlbWVudHMocy5UUklBTkdMRVMsZixzLlVOU0lHTkVEX1NIT1JULFMpO3MuY29sb3JNYXNrKCEwLCEwLCEwLCEwKSxzLnN0ZW5jaWxPcChzLktFRVAscy5LRUVQLHMuS0VFUCkscy5zdGVuY2lsTWFzaygwKTt2YXIgZD10LnBhaW50W1wiZmlsbC1vdXRsaW5lLWNvbG9yXCJdO2lmKHQucGFpbnRbXCJmaWxsLWFudGlhbGlhc1wiXT09PSEwJiYoIXQucGFpbnRbXCJmaWxsLXBhdHRlcm5cIl18fGQpKXtzLnN3aXRjaFNoYWRlcihlLm91dGxpbmVTaGFkZXIsdSkscy5saW5lV2lkdGgoMipicm93c2VyLmRldmljZVBpeGVsUmF0aW8pLGQ/cy5zdGVuY2lsRnVuYyhzLkVRVUFMLDEyOCwxMjgpOnMuc3RlbmNpbEZ1bmMocy5FUVVBTCwxMjgsMTkxKSxzLnVuaWZvcm0yZihlLm91dGxpbmVTaGFkZXIudV93b3JsZCxzLmRyYXdpbmdCdWZmZXJXaWR0aCxzLmRyYXdpbmdCdWZmZXJIZWlnaHQpLHMudW5pZm9ybTRmdihlLm91dGxpbmVTaGFkZXIudV9jb2xvcixkP2Q6YyksbD1pLmJ1ZmZlcnMuZmlsbFZlcnRleCxuPWkuYnVmZmVycy5vdXRsaW5lRWxlbWVudCxuLmJpbmQocyk7Zm9yKHZhciBwPTA7cDxhLmdyb3Vwcy5sZW5ndGg7cCsrKW89YS5ncm91cHNbcF0sbT1vLnZlcnRleFN0YXJ0SW5kZXgqbC5pdGVtU2l6ZSxzLnZlcnRleEF0dHJpYlBvaW50ZXIoZS5vdXRsaW5lU2hhZGVyLmFfcG9zLDIscy5TSE9SVCwhMSw0LG0rMCksZj0yKm8uc2Vjb25kRWxlbWVudExlbmd0aCxTPW8uc2Vjb25kRWxlbWVudFN0YXJ0SW5kZXgqbi5pdGVtU2l6ZSxzLmRyYXdFbGVtZW50cyhzLkxJTkVTLGYscy5VTlNJR05FRF9TSE9SVCxTKX12YXIgXyxoPXQucGFpbnRbXCJmaWxsLXBhdHRlcm5cIl0sdj10LnBhaW50W1wiZmlsbC1vcGFjaXR5XCJdfHwxO2lmKGgpe3ZhciB4PWUuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oaC5mcm9tLCEwKSxiPWUuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oaC50bywhMCk7aWYoIXh8fCFiKXJldHVybjtfPWUucGF0dGVyblNoYWRlcixzLnN3aXRjaFNoYWRlcihfLHIpLHMudW5pZm9ybTFpKF8udV9pbWFnZSwwKSxzLnVuaWZvcm0yZnYoXy51X3BhdHRlcm5fdGxfYSx4LnRsKSxzLnVuaWZvcm0yZnYoXy51X3BhdHRlcm5fYnJfYSx4LmJyKSxzLnVuaWZvcm0yZnYoXy51X3BhdHRlcm5fdGxfYixiLnRsKSxzLnVuaWZvcm0yZnYoXy51X3BhdHRlcm5fYnJfYixiLmJyKSxzLnVuaWZvcm0xZihfLnVfb3BhY2l0eSx2KSxzLnVuaWZvcm0xZihfLnVfbWl4LGgudCk7dmFyIEE9aS50aWxlRXh0ZW50L2kudGlsZVNpemUvTWF0aC5wb3coMixlLnRyYW5zZm9ybS50aWxlWm9vbS1pLmNvb3JkLnopLFI9bWF0My5jcmVhdGUoKTttYXQzLnNjYWxlKFIsUixbMS8oeC5zaXplWzBdKkEqaC5mcm9tU2NhbGUpLDEvKHguc2l6ZVsxXSpBKmguZnJvbVNjYWxlKV0pO3ZhciBnPW1hdDMuY3JlYXRlKCk7bWF0My5zY2FsZShnLGcsWzEvKGIuc2l6ZVswXSpBKmgudG9TY2FsZSksMS8oYi5zaXplWzFdKkEqaC50b1NjYWxlKV0pLHMudW5pZm9ybU1hdHJpeDNmdihfLnVfcGF0dGVybm1hdHJpeF9hLCExLFIpLHMudW5pZm9ybU1hdHJpeDNmdihfLnVfcGF0dGVybm1hdHJpeF9iLCExLGcpLGUuc3ByaXRlQXRsYXMuYmluZChzLCEwKX1lbHNlIF89ZS5maWxsU2hhZGVyLHMuc3dpdGNoU2hhZGVyKF8scikscy51bmlmb3JtNGZ2KF8udV9jb2xvcixjKTtzLnN0ZW5jaWxGdW5jKHMuTk9URVFVQUwsMCw2Mykscy5iaW5kQnVmZmVyKHMuQVJSQVlfQlVGRkVSLGUudGlsZUV4dGVudEJ1ZmZlcikscy52ZXJ0ZXhBdHRyaWJQb2ludGVyKF8uYV9wb3MsZS50aWxlRXh0ZW50QnVmZmVyLml0ZW1TaXplLHMuU0hPUlQsITEsMCwwKSxzLmRyYXdBcnJheXMocy5UUklBTkdMRV9TVFJJUCwwLGUudGlsZUV4dGVudEJ1ZmZlci5pdGVtQ291bnQpLHMuc3RlbmNpbE1hc2soMCkscy5zdGVuY2lsRnVuYyhzLkVRVUFMLDEyOCwxMjgpfX19dmFyIGJyb3dzZXI9cmVxdWlyZShcIi4uL3V0aWwvYnJvd3NlclwiKSxtYXQzPXJlcXVpcmUoXCJnbC1tYXRyaXhcIikubWF0Mzttb2R1bGUuZXhwb3J0cz1kcmF3RmlsbDtcbn0se1wiLi4vdXRpbC9icm93c2VyXCI6OTUsXCJnbC1tYXRyaXhcIjoxMTZ9XSwzMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLG1hdDI9cmVxdWlyZShcImdsLW1hdHJpeFwiKS5tYXQyO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQsaSxlLHIpe2lmKHIuYnVmZmVycyl7dmFyIGE9ci5lbGVtZW50R3JvdXBzW2kucmVmfHxpLmlkXTtpZihhKXt2YXIgbj10LmdsO2lmKCEoaS5wYWludFtcImxpbmUtd2lkdGhcIl08PTApKXt2YXIgbz0xL2Jyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxmPWkucGFpbnRbXCJsaW5lLWJsdXJcIl0rbyxsPWkucGFpbnRbXCJsaW5lLXdpZHRoXCJdLzIsdT0tMSxtPTAscz0wO2kucGFpbnRbXCJsaW5lLWdhcC13aWR0aFwiXT4wJiYodT1pLnBhaW50W1wibGluZS1nYXAtd2lkdGhcIl0vMisuNSpvLGw9aS5wYWludFtcImxpbmUtd2lkdGhcIl0sbT11LW8vMik7dmFyIF89bStsK28vMitzLGg9aS5wYWludFtcImxpbmUtY29sb3JcIl0sZD10LnRyYW5zZm9ybS5zY2FsZS8oMTw8ci5jb29yZC56KS8oci50aWxlRXh0ZW50L3IudGlsZVNpemUpLHA9dC50cmFuc2xhdGVNYXRyaXgoZSxyLGkucGFpbnRbXCJsaW5lLXRyYW5zbGF0ZVwiXSxpLnBhaW50W1wibGluZS10cmFuc2xhdGUtYW5jaG9yXCJdKSx2PXQudHJhbnNmb3JtLGM9bWF0Mi5jcmVhdGUoKTttYXQyLnNjYWxlKGMsYyxbMSxNYXRoLmNvcyh2Ll9waXRjaCldKSxtYXQyLnJvdGF0ZShjLGMsdC50cmFuc2Zvcm0uYW5nbGUpO3ZhciB4LGI9TWF0aC5zcXJ0KHYuaGVpZ2h0KnYuaGVpZ2h0LzQqKDErdi5hbHRpdHVkZSp2LmFsdGl0dWRlKSksdz12LmhlaWdodC8yKk1hdGgudGFuKHYuX3BpdGNoKSxnPShiK3cpL2ItMSxTPXIudGlsZVNpemUvdC50cmFuc2Zvcm0udGlsZVNpemUsTT1pLnBhaW50W1wibGluZS1kYXNoYXJyYXlcIl0sej1pLnBhaW50W1wibGluZS1wYXR0ZXJuXCJdO2lmKE0pe3g9dC5saW5lc2RmcGF0dGVyblNoYWRlcixuLnN3aXRjaFNoYWRlcih4LHAsci5leE1hdHJpeCksbi51bmlmb3JtMmZ2KHgudV9saW5ld2lkdGgsW18sdV0pLG4udW5pZm9ybTFmKHgudV9yYXRpbyxkKSxuLnVuaWZvcm0xZih4LnVfYmx1cixmKSxuLnVuaWZvcm00ZnYoeC51X2NvbG9yLGgpO3ZhciBBPXQubGluZUF0bGFzLmdldERhc2goTS5mcm9tLFwicm91bmRcIj09PWkubGF5b3V0W1wibGluZS1jYXBcIl0pLHk9dC5saW5lQXRsYXMuZ2V0RGFzaChNLnRvLFwicm91bmRcIj09PWkubGF5b3V0W1wibGluZS1jYXBcIl0pO3QubGluZUF0bGFzLmJpbmQobik7dmFyIEU9TWF0aC5wb3coMixNYXRoLmZsb29yKE1hdGgubG9nKHQudHJhbnNmb3JtLnNjYWxlKS9NYXRoLkxOMiktci5jb29yZC56KS84KlMsUD1bRS9BLndpZHRoL00uZnJvbVNjYWxlLC1BLmhlaWdodC8yXSxSPXQubGluZUF0bGFzLndpZHRoLyhNLmZyb21TY2FsZSpBLndpZHRoKjI1Nipicm93c2VyLmRldmljZVBpeGVsUmF0aW8pLzIsST1bRS95LndpZHRoL00udG9TY2FsZSwteS5oZWlnaHQvMl0sTj10LmxpbmVBdGxhcy53aWR0aC8oTS50b1NjYWxlKnkud2lkdGgqMjU2KmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbykvMjtuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5zY2FsZV9hLFApLG4udW5pZm9ybTFmKHgudV90ZXhfeV9hLEEueSksbi51bmlmb3JtMmZ2KHgudV9wYXR0ZXJuc2NhbGVfYixJKSxuLnVuaWZvcm0xZih4LnVfdGV4X3lfYix5LnkpLG4udW5pZm9ybTFpKHgudV9pbWFnZSwwKSxuLnVuaWZvcm0xZih4LnVfc2RmZ2FtbWEsTWF0aC5tYXgoUixOKSksbi51bmlmb3JtMWYoeC51X21peCxNLnQpLG4udW5pZm9ybTFmKHgudV9leHRyYSxnKSxuLnVuaWZvcm1NYXRyaXgyZnYoeC51X2FudGlhbGlhc2luZ21hdHJpeCwhMSxjKX1lbHNlIGlmKHope3ZhciBUPXQuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oei5mcm9tLCEwKSxxPXQuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oei50bywhMCk7aWYoIVR8fCFxKXJldHVybjt2YXIgRD1yLnRpbGVFeHRlbnQvci50aWxlU2l6ZS9NYXRoLnBvdygyLHQudHJhbnNmb3JtLnRpbGVab29tLXIuY29vcmQueikqUzt0LnNwcml0ZUF0bGFzLmJpbmQobiwhMCkseD10LmxpbmVwYXR0ZXJuU2hhZGVyLG4uc3dpdGNoU2hhZGVyKHgscCxyLmV4TWF0cml4KSxuLnVuaWZvcm0yZnYoeC51X2xpbmV3aWR0aCxbXyx1XSksbi51bmlmb3JtMWYoeC51X3JhdGlvLGQpLG4udW5pZm9ybTFmKHgudV9ibHVyLGYpLG4udW5pZm9ybTJmdih4LnVfcGF0dGVybl9zaXplX2EsW1Quc2l6ZVswXSpEKnouZnJvbVNjYWxlLHEuc2l6ZVsxXV0pLG4udW5pZm9ybTJmdih4LnVfcGF0dGVybl9zaXplX2IsW3Euc2l6ZVswXSpEKnoudG9TY2FsZSxxLnNpemVbMV1dKSxuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5fdGxfYSxULnRsKSxuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5fYnJfYSxULmJyKSxuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5fdGxfYixxLnRsKSxuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5fYnJfYixxLmJyKSxuLnVuaWZvcm0xZih4LnVfZmFkZSx6LnQpLG4udW5pZm9ybTFmKHgudV9vcGFjaXR5LGkucGFpbnRbXCJsaW5lLW9wYWNpdHlcIl0pLG4udW5pZm9ybTFmKHgudV9leHRyYSxnKSxuLnVuaWZvcm1NYXRyaXgyZnYoeC51X2FudGlhbGlhc2luZ21hdHJpeCwhMSxjKX1lbHNlIHg9dC5saW5lU2hhZGVyLG4uc3dpdGNoU2hhZGVyKHgscCxyLmV4TWF0cml4KSxuLnVuaWZvcm0yZnYoeC51X2xpbmV3aWR0aCxbXyx1XSksbi51bmlmb3JtMWYoeC51X3JhdGlvLGQpLG4udW5pZm9ybTFmKHgudV9ibHVyLGYpLG4udW5pZm9ybTFmKHgudV9leHRyYSxnKSxuLnVuaWZvcm1NYXRyaXgyZnYoeC51X2FudGlhbGlhc2luZ21hdHJpeCwhMSxjKSxuLnVuaWZvcm00ZnYoeC51X2NvbG9yLGgpO3ZhciBHPXIuYnVmZmVycy5saW5lVmVydGV4O0cuYmluZChuKTt2YXIgTD1yLmJ1ZmZlcnMubGluZUVsZW1lbnQ7TC5iaW5kKG4pO2Zvcih2YXIgSD0wO0g8YS5ncm91cHMubGVuZ3RoO0grKyl7dmFyIE89YS5ncm91cHNbSF0sQj1PLnZlcnRleFN0YXJ0SW5kZXgqRy5pdGVtU2l6ZTtuLnZlcnRleEF0dHJpYlBvaW50ZXIoeC5hX3BvcywyLG4uU0hPUlQsITEsOCxCKzApLG4udmVydGV4QXR0cmliUG9pbnRlcih4LmFfZGF0YSw0LG4uQllURSwhMSw4LEIrNCk7dmFyIFU9MypPLmVsZW1lbnRMZW5ndGgsVj1PLmVsZW1lbnRTdGFydEluZGV4KkwuaXRlbVNpemU7bi5kcmF3RWxlbWVudHMobi5UUklBTkdMRVMsVSxuLlVOU0lHTkVEX1NIT1JULFYpfX19fX07XG59LHtcIi4uL3V0aWwvYnJvd3NlclwiOjk1LFwiZ2wtbWF0cml4XCI6MTE2fV0sMzE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd1Jhc3Rlcih0LHIsZSxhKXt2YXIgaT10LmdsO2kuZGlzYWJsZShpLlNURU5DSUxfVEVTVCk7dmFyIG89dC5yYXN0ZXJTaGFkZXI7aS5zd2l0Y2hTaGFkZXIobyxlKSxpLnVuaWZvcm0xZihvLnVfYnJpZ2h0bmVzc19sb3csci5wYWludFtcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiXSksaS51bmlmb3JtMWYoby51X2JyaWdodG5lc3NfaGlnaCxyLnBhaW50W1wicmFzdGVyLWJyaWdodG5lc3MtbWF4XCJdKSxpLnVuaWZvcm0xZihvLnVfc2F0dXJhdGlvbl9mYWN0b3Isc2F0dXJhdGlvbkZhY3RvcihyLnBhaW50W1wicmFzdGVyLXNhdHVyYXRpb25cIl0pKSxpLnVuaWZvcm0xZihvLnVfY29udHJhc3RfZmFjdG9yLGNvbnRyYXN0RmFjdG9yKHIucGFpbnRbXCJyYXN0ZXItY29udHJhc3RcIl0pKSxpLnVuaWZvcm0zZnYoby51X3NwaW5fd2VpZ2h0cyxzcGluV2VpZ2h0cyhyLnBhaW50W1wicmFzdGVyLWh1ZS1yb3RhdGVcIl0pKTt2YXIgbix1LHM9YS5zb3VyY2UmJmEuc291cmNlLl9weXJhbWlkLmZpbmRMb2FkZWRQYXJlbnQoYS5jb29yZCwwLHt9KSxjPWdldE9wYWNpdGllcyhhLHMscix0LnRyYW5zZm9ybSk7aS5hY3RpdmVUZXh0dXJlKGkuVEVYVFVSRTApLGkuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELGEudGV4dHVyZSkscz8oaS5hY3RpdmVUZXh0dXJlKGkuVEVYVFVSRTEpLGkuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELHMudGV4dHVyZSksbj1NYXRoLnBvdygyLHMuY29vcmQuei1hLmNvb3JkLnopLHU9W2EuY29vcmQueCpuJTEsYS5jb29yZC55Km4lMV0pOmNbMV09MCxpLnVuaWZvcm0yZnYoby51X3RsX3BhcmVudCx1fHxbMCwwXSksaS51bmlmb3JtMWYoby51X3NjYWxlX3BhcmVudCxufHwxKSxpLnVuaWZvcm0xZihvLnVfYnVmZmVyX3NjYWxlLDEpLGkudW5pZm9ybTFmKG8udV9vcGFjaXR5MCxjWzBdKSxpLnVuaWZvcm0xZihvLnVfb3BhY2l0eTEsY1sxXSksaS51bmlmb3JtMWkoby51X2ltYWdlMCwwKSxpLnVuaWZvcm0xaShvLnVfaW1hZ2UxLDEpLGkuYmluZEJ1ZmZlcihpLkFSUkFZX0JVRkZFUixhLmJvdW5kc0J1ZmZlcnx8dC50aWxlRXh0ZW50QnVmZmVyKSxpLnZlcnRleEF0dHJpYlBvaW50ZXIoby5hX3BvcywyLGkuU0hPUlQsITEsOCwwKSxpLnZlcnRleEF0dHJpYlBvaW50ZXIoby5hX3RleHR1cmVfcG9zLDIsaS5TSE9SVCwhMSw4LDQpLGkuZHJhd0FycmF5cyhpLlRSSUFOR0xFX1NUUklQLDAsNCksaS5lbmFibGUoaS5TVEVOQ0lMX1RFU1QpfWZ1bmN0aW9uIHNwaW5XZWlnaHRzKHQpe3QqPU1hdGguUEkvMTgwO3ZhciByPU1hdGguc2luKHQpLGU9TWF0aC5jb3ModCk7cmV0dXJuWygyKmUrMSkvMywoLU1hdGguc3FydCgzKSpyLWUrMSkvMywoTWF0aC5zcXJ0KDMpKnItZSsxKS8zXX1mdW5jdGlvbiBjb250cmFzdEZhY3Rvcih0KXtyZXR1cm4gdD4wPzEvKDEtdCk6MSt0fWZ1bmN0aW9uIHNhdHVyYXRpb25GYWN0b3IodCl7cmV0dXJuIHQ+MD8xLTEvKDEuMDAxLXQpOi10fWZ1bmN0aW9uIGdldE9wYWNpdGllcyh0LHIsZSxhKXtpZighdC5zb3VyY2UpcmV0dXJuWzEsMF07dmFyIGk9KG5ldyBEYXRlKS5nZXRUaW1lKCksbz1lLnBhaW50W1wicmFzdGVyLWZhZGUtZHVyYXRpb25cIl0sbj0oaS10LnRpbWVBZGRlZCkvbyx1PXI/KGktci50aW1lQWRkZWQpL286LTEscz10LnNvdXJjZS5fcHlyYW1pZC5jb3ZlcmluZ1pvb21MZXZlbChhKSxjPXI/TWF0aC5hYnMoci5jb29yZC56LXMpPk1hdGguYWJzKHQuY29vcmQuei1zKTohMSxmPVtdOyFyfHxjPyhmWzBdPXV0aWwuY2xhbXAobiwwLDEpLGZbMV09MS1mWzBdKTooZlswXT11dGlsLmNsYW1wKDEtdSwwLDEpLGZbMV09MS1mWzBdKTt2YXIgZD1lLnBhaW50W1wicmFzdGVyLW9wYWNpdHlcIl07cmV0dXJuIGZbMF0qPWQsZlsxXSo9ZCxmfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIik7bW9kdWxlLmV4cG9ydHM9ZHJhd1Jhc3Rlcjtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2fV0sMzI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd1N5bWJvbHMoZSx0LHIsYSl7aWYoYS5idWZmZXJzKXt2YXIgbz1hLmVsZW1lbnRHcm91cHNbdC5yZWZ8fHQuaWRdO2lmKG8pe3ZhciBpPSEodC5sYXlvdXRbXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIl18fHQubGF5b3V0W1wiaWNvbi1hbGxvdy1vdmVybGFwXCJdfHx0LmxheW91dFtcInRleHQtaWdub3JlLXBsYWNlbWVudFwiXXx8dC5sYXlvdXRbXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIl0pLG49ZS5nbDtpJiZuLmRpc2FibGUobi5TVEVOQ0lMX1RFU1QpLG8udGV4dC5ncm91cHMubGVuZ3RoJiZkcmF3U3ltYm9sKGUsdCxyLGEsby50ZXh0LFwidGV4dFwiLCEwKSxvLmljb24uZ3JvdXBzLmxlbmd0aCYmZHJhd1N5bWJvbChlLHQscixhLG8uaWNvbixcImljb25cIixvLnNkZkljb25zKSxkcmF3Q29sbGlzaW9uRGVidWcoZSx0LHIsYSksaSYmbi5lbmFibGUobi5TVEVOQ0lMX1RFU1QpfX19ZnVuY3Rpb24gZHJhd1N5bWJvbChlLHQscixhLG8saSxuKXt2YXIgbD1lLmdsO3I9ZS50cmFuc2xhdGVNYXRyaXgocixhLHQucGFpbnRbaStcIi10cmFuc2xhdGVcIl0sdC5wYWludFtpK1wiLXRyYW5zbGF0ZS1hbmNob3JcIl0pO3ZhciBtLGYsdSxzPWUudHJhbnNmb3JtLGQ9XCJtYXBcIj09PXQubGF5b3V0W2krXCItcm90YXRpb24tYWxpZ25tZW50XCJdLGg9ZDtoPyhtPW1hdDQuY3JlYXRlKCksZj1hLnRpbGVFeHRlbnQvYS50aWxlU2l6ZS9NYXRoLnBvdygyLGUudHJhbnNmb3JtLnpvb20tYS5jb29yZC56KSx1PTEvTWF0aC5jb3Mocy5fcGl0Y2gpKToobT1tYXQ0LmNsb25lKGEuZXhNYXRyaXgpLGY9ZS50cmFuc2Zvcm0uYWx0aXR1ZGUsdT0xKSxtYXQ0LnNjYWxlKG0sbSxbZixmLDFdKTt2YXIgcD10LnBhaW50W2krXCItc2l6ZVwiXSxnPXAvZGVmYXVsdFNpemVzW2ldO21hdDQuc2NhbGUobSxtLFtnLGcsMV0pO3ZhciBTLGMseCxiLHY9TWF0aC5zcXJ0KHMuaGVpZ2h0KnMuaGVpZ2h0LzQqKDErcy5hbHRpdHVkZSpzLmFsdGl0dWRlKSksXz1zLmhlaWdodC8yKk1hdGgudGFuKHMuX3BpdGNoKSx6PSh2K18pL3YtMSx3PVwidGV4dFwiPT09aTtpZih3fHxlLnN0eWxlLnNwcml0ZS5sb2FkZWQoKSl7bC5hY3RpdmVUZXh0dXJlKGwuVEVYVFVSRTApLFM9bj9lLnNkZlNoYWRlcjplLmljb25TaGFkZXIsdz8oZS5nbHlwaEF0bGFzLnVwZGF0ZVRleHR1cmUobCksYz1hLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXgseD1hLmJ1ZmZlcnMuZ2x5cGhFbGVtZW50LGI9W2UuZ2x5cGhBdGxhcy53aWR0aC80LGUuZ2x5cGhBdGxhcy5oZWlnaHQvNF0pOihlLnNwcml0ZUF0bGFzLmJpbmQobCxkfHxlLm9wdGlvbnMucm90YXRpbmd8fGUub3B0aW9ucy56b29taW5nfHwxIT09Z3x8bnx8ZS50cmFuc2Zvcm0ucGl0Y2gpLGM9YS5idWZmZXJzLmljb25WZXJ0ZXgseD1hLmJ1ZmZlcnMuaWNvbkVsZW1lbnQsYj1bZS5zcHJpdGVBdGxhcy53aWR0aC80LGUuc3ByaXRlQXRsYXMuaGVpZ2h0LzRdKSxsLnN3aXRjaFNoYWRlcihTLHIsbSksbC51bmlmb3JtMWkoUy51X3RleHR1cmUsMCksbC51bmlmb3JtMmZ2KFMudV90ZXhzaXplLGIpLGwudW5pZm9ybTFpKFMudV9za2V3ZWQsaCksbC51bmlmb3JtMWYoUy51X2V4dHJhLHopO3ZhciB5PU1hdGgubG9nKHAvb1tpK1wiLXNpemVcIl0pL01hdGguTE4yfHwwO2wudW5pZm9ybTFmKFMudV96b29tLDEwKihlLnRyYW5zZm9ybS56b29tLXkpKTt2YXIgRT1lLmZyYW1lSGlzdG9yeS5nZXRGYWRlUHJvcGVydGllcygzMDApO2wudW5pZm9ybTFmKFMudV9mYWRlZGlzdCwxMCpFLmZhZGVkaXN0KSxsLnVuaWZvcm0xZihTLnVfbWluZmFkZXpvb20sTWF0aC5mbG9vcigxMCpFLm1pbmZhZGV6b29tKSksbC51bmlmb3JtMWYoUy51X21heGZhZGV6b29tLE1hdGguZmxvb3IoMTAqRS5tYXhmYWRlem9vbSkpLGwudW5pZm9ybTFmKFMudV9mYWRlem9vbSwxMCooZS50cmFuc2Zvcm0uem9vbStFLmJ1bXApKTt2YXIgVCxJLE4sTTtpZih4LmJpbmQobCksbil7dmFyIEE9OCxMPTEuMTksUj02LEc9LjEwNSpkZWZhdWx0U2l6ZXNbaV0vcC9icm93c2VyLmRldmljZVBpeGVsUmF0aW87bC51bmlmb3JtMWYoUy51X2dhbW1hLEcqdSksbC51bmlmb3JtNGZ2KFMudV9jb2xvcix0LnBhaW50W2krXCItY29sb3JcIl0pLGwudW5pZm9ybTFmKFMudV9idWZmZXIsLjc1KTtmb3IodmFyIEQ9MDtEPG8uZ3JvdXBzLmxlbmd0aDtEKyspVD1vLmdyb3Vwc1tEXSxJPVQudmVydGV4U3RhcnRJbmRleCpjLml0ZW1TaXplLGMuYmluZChsLFMsSSksTj0zKlQuZWxlbWVudExlbmd0aCxNPVQuZWxlbWVudFN0YXJ0SW5kZXgqeC5pdGVtU2l6ZSxsLmRyYXdFbGVtZW50cyhsLlRSSUFOR0xFUyxOLGwuVU5TSUdORURfU0hPUlQsTSk7aWYodC5wYWludFtpK1wiLWhhbG8td2lkdGhcIl0pe2wudW5pZm9ybTFmKFMudV9nYW1tYSwodC5wYWludFtpK1wiLWhhbG8tYmx1clwiXSpML2cvQStHKSp1KSxsLnVuaWZvcm00ZnYoUy51X2NvbG9yLHQucGFpbnRbaStcIi1oYWxvLWNvbG9yXCJdKSxsLnVuaWZvcm0xZihTLnVfYnVmZmVyLChSLXQucGFpbnRbaStcIi1oYWxvLXdpZHRoXCJdL2cpL0EpO2Zvcih2YXIgcT0wO3E8by5ncm91cHMubGVuZ3RoO3ErKylUPW8uZ3JvdXBzW3FdLEk9VC52ZXJ0ZXhTdGFydEluZGV4KmMuaXRlbVNpemUsYy5iaW5kKGwsUyxJKSxOPTMqVC5lbGVtZW50TGVuZ3RoLE09VC5lbGVtZW50U3RhcnRJbmRleCp4Lml0ZW1TaXplLGwuZHJhd0VsZW1lbnRzKGwuVFJJQU5HTEVTLE4sbC5VTlNJR05FRF9TSE9SVCxNKX19ZWxzZXtsLnVuaWZvcm0xZihTLnVfb3BhY2l0eSx0LnBhaW50W1wiaWNvbi1vcGFjaXR5XCJdKTtmb3IodmFyIEM9MDtDPG8uZ3JvdXBzLmxlbmd0aDtDKyspVD1vLmdyb3Vwc1tDXSxJPVQudmVydGV4U3RhcnRJbmRleCpjLml0ZW1TaXplLGMuYmluZChsLFMsSSksTj0zKlQuZWxlbWVudExlbmd0aCxNPVQuZWxlbWVudFN0YXJ0SW5kZXgqeC5pdGVtU2l6ZSxsLmRyYXdFbGVtZW50cyhsLlRSSUFOR0xFUyxOLGwuVU5TSUdORURfU0hPUlQsTSl9fX12YXIgYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLG1hdDQ9cmVxdWlyZShcImdsLW1hdHJpeFwiKS5tYXQ0LGRyYXdDb2xsaXNpb25EZWJ1Zz1yZXF1aXJlKFwiLi9kcmF3X2NvbGxpc2lvbl9kZWJ1Z1wiKTttb2R1bGUuZXhwb3J0cz1kcmF3U3ltYm9sczt2YXIgZGVmYXVsdFNpemVzPXtpY29uOjEsdGV4dDoyNH07XG59LHtcIi4uL3V0aWwvYnJvd3NlclwiOjk1LFwiLi9kcmF3X2NvbGxpc2lvbl9kZWJ1Z1wiOjI3LFwiZ2wtbWF0cml4XCI6MTE2fV0sMzM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd1ZlcnRpY2VzKGUscix0LGkpe2Z1bmN0aW9uIG8ocix0LGksbyl7Zi5zd2l0Y2hTaGFkZXIoZS5kb3RTaGFkZXIsaSksZi51bmlmb3JtMWYoZS5kb3RTaGFkZXIudV9zaXplLDQqYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKSxmLnVuaWZvcm0xZihlLmRvdFNoYWRlci51X2JsdXIsLjI1KSxmLnVuaWZvcm00ZnYoZS5kb3RTaGFkZXIudV9jb2xvcixbLjEsMCwwLC4xXSksci5iaW5kKGYsZS5kb3RTaGFkZXIsMCk7Zm9yKHZhciBhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciBzPXRbYV0sdT1zLnZlcnRleFN0YXJ0SW5kZXgsZD1zLnZlcnRleExlbmd0aDtmLnZlcnRleEF0dHJpYlBvaW50ZXIoZS5kb3RTaGFkZXIuYV9wb3MsMixmLlNIT1JULCExLG8sMCksZi5kcmF3QXJyYXlzKGYuUE9JTlRTLHUsZCl9fXZhciBmPWUuZ2w7aWYoaSYmaS5idWZmZXJzKXt2YXIgYT1pLmVsZW1lbnRHcm91cHNbci5yZWZ8fHIuaWRdO2lmKGEpe2lmKGYuYmxlbmRGdW5jKGYuT05FLGYuT05FX01JTlVTX1NSQ19BTFBIQSksXCJmaWxsXCI9PT1yLnR5cGUpbyhpLmJ1ZmZlcnMuZmlsbFZlcnRleCxhLmdyb3Vwcyx0LDQpO2Vsc2UgaWYoXCJzeW1ib2xcIj09PXIudHlwZSlvKGkuYnVmZmVycy5pY29uVmVydGV4LGEuaWNvbi5ncm91cHMsdCwxNiksbyhpLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXgsYS50ZXh0Lmdyb3Vwcyx0LDE2KTtlbHNlIGlmKFwibGluZVwiPT09ci50eXBlKXt2YXIgcz1tYXQ0LmNsb25lKHQpO21hdDQuc2NhbGUocyxzLFsuNSwuNSwxXSksbyhpLmJ1ZmZlcnMubGluZVZlcnRleCxhLmdyb3VwcyxzLDgpfWYuYmxlbmRGdW5jKGYuT05FX01JTlVTX0RTVF9BTFBIQSxmLk9ORSl9fX12YXIgYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLG1hdDQ9cmVxdWlyZShcImdsLW1hdHJpeFwiKS5tYXQ0O21vZHVsZS5leHBvcnRzPWRyYXdWZXJ0aWNlcztcbn0se1wiLi4vdXRpbC9icm93c2VyXCI6OTUsXCJnbC1tYXRyaXhcIjoxMTZ9XSwzNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBGcmFtZUhpc3RvcnkoKXt0aGlzLmZyYW1lSGlzdG9yeT1bXX1tb2R1bGUuZXhwb3J0cz1GcmFtZUhpc3RvcnksRnJhbWVIaXN0b3J5LnByb3RvdHlwZS5nZXRGYWRlUHJvcGVydGllcz1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0zMDApO2Zvcih2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmZyYW1lSGlzdG9yeS5sZW5ndGg+MyYmdGhpcy5mcmFtZUhpc3RvcnlbMV0udGltZSt0PGU7KXRoaXMuZnJhbWVIaXN0b3J5LnNoaWZ0KCk7dGhpcy5mcmFtZUhpc3RvcnlbMV0udGltZSt0PGUmJih0aGlzLmZyYW1lSGlzdG9yeVswXS56PXRoaXMuZnJhbWVIaXN0b3J5WzFdLnopO3ZhciByPXRoaXMuZnJhbWVIaXN0b3J5Lmxlbmd0aDszPnImJmNvbnNvbGUud2FybihcInRoZXJlIHNob3VsZCBuZXZlciBiZSBsZXNzIHRoYW4gdGhyZWUgZnJhbWVzIGluIHRoZSBoaXN0b3J5XCIpO3ZhciBpPXRoaXMuZnJhbWVIaXN0b3J5WzBdLnoscz10aGlzLmZyYW1lSGlzdG9yeVtyLTFdLG89cy56LGE9TWF0aC5taW4oaSxvKSxtPU1hdGgubWF4KGksbyksaD1zLnotdGhpcy5mcmFtZUhpc3RvcnlbMV0ueixmPXMudGltZS10aGlzLmZyYW1lSGlzdG9yeVsxXS50aW1lLHk9aC8oZi90KTtpc05hTih5KSYmY29uc29sZS53YXJuKFwiZmFkZWRpc3Qgc2hvdWxkIG5ldmVyIGJlIE5hTlwiKTt2YXIgbj0oZS1zLnRpbWUpL3QqeTtyZXR1cm57ZmFkZWRpc3Q6eSxtaW5mYWRlem9vbTphLG1heGZhZGV6b29tOm0sYnVtcDpufX0sRnJhbWVIaXN0b3J5LnByb3RvdHlwZS5yZWNvcmQ9ZnVuY3Rpb24odCl7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7dGhpcy5mcmFtZUhpc3RvcnkubGVuZ3RofHx0aGlzLmZyYW1lSGlzdG9yeS5wdXNoKHt0aW1lOjAsejp0fSx7dGltZTowLHo6dH0pLCgyPT09dGhpcy5mcmFtZUhpc3RvcnkubGVuZ3RofHx0aGlzLmZyYW1lSGlzdG9yeVt0aGlzLmZyYW1lSGlzdG9yeS5sZW5ndGgtMV0ueiE9PXQpJiZ0aGlzLmZyYW1lSGlzdG9yeS5wdXNoKHt0aW1lOmUsejp0fSl9O1xufSx7fV0sMzU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIHNoYWRlcnM9cmVxdWlyZShcIi4vc2hhZGVyc1wiKSx1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIik7ZXhwb3J0cy5leHRlbmQ9ZnVuY3Rpb24ocil7dmFyIHQ9ci5saW5lV2lkdGgsZT1yLmdldFBhcmFtZXRlcihyLkFMSUFTRURfTElORV9XSURUSF9SQU5HRSk7cmV0dXJuIHIubGluZVdpZHRoPWZ1bmN0aW9uKGkpe3QuY2FsbChyLHV0aWwuY2xhbXAoaSxlWzBdLGVbMV0pKX0sci5nZXRTaGFkZXI9ZnVuY3Rpb24ocix0KXt2YXIgZT10PT09dGhpcy5GUkFHTUVOVF9TSEFERVI/XCJmcmFnbWVudFwiOlwidmVydGV4XCI7aWYoIXNoYWRlcnNbcl18fCFzaGFkZXJzW3JdW2VdKXRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHNoYWRlciBcIityKTt2YXIgaT10aGlzLmNyZWF0ZVNoYWRlcih0KSxhPXNoYWRlcnNbcl1bZV07aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIG9yaWVudGF0aW9uJiYoYT1hLnJlcGxhY2UoLyBoaWdocCAvZyxcIiBcIikpLHRoaXMuc2hhZGVyU291cmNlKGksYSksdGhpcy5jb21waWxlU2hhZGVyKGkpLCF0aGlzLmdldFNoYWRlclBhcmFtZXRlcihpLHRoaXMuQ09NUElMRV9TVEFUVVMpKXRocm93IG5ldyBFcnJvcih0aGlzLmdldFNoYWRlckluZm9Mb2coaSkpO3JldHVybiBpfSxyLmluaXRpYWxpemVTaGFkZXI9ZnVuY3Rpb24ocix0LGUpe3ZhciBpPXtwcm9ncmFtOnRoaXMuY3JlYXRlUHJvZ3JhbSgpLGZyYWdtZW50OnRoaXMuZ2V0U2hhZGVyKHIsdGhpcy5GUkFHTUVOVF9TSEFERVIpLHZlcnRleDp0aGlzLmdldFNoYWRlcihyLHRoaXMuVkVSVEVYX1NIQURFUiksYXR0cmlidXRlczpbXX07aWYodGhpcy5hdHRhY2hTaGFkZXIoaS5wcm9ncmFtLGkudmVydGV4KSx0aGlzLmF0dGFjaFNoYWRlcihpLnByb2dyYW0saS5mcmFnbWVudCksdGhpcy5saW5rUHJvZ3JhbShpLnByb2dyYW0pLHRoaXMuZ2V0UHJvZ3JhbVBhcmFtZXRlcihpLnByb2dyYW0sdGhpcy5MSU5LX1NUQVRVUykpe2Zvcih2YXIgYT0wO2E8dC5sZW5ndGg7YSsrKWlbdFthXV09dGhpcy5nZXRBdHRyaWJMb2NhdGlvbihpLnByb2dyYW0sdFthXSksaS5hdHRyaWJ1dGVzLnB1c2goaVt0W2FdXSk7Zm9yKHZhciBoPTA7aDxlLmxlbmd0aDtoKyspaVtlW2hdXT10aGlzLmdldFVuaWZvcm1Mb2NhdGlvbihpLnByb2dyYW0sZVtoXSl9ZWxzZSBjb25zb2xlLmVycm9yKHRoaXMuZ2V0UHJvZ3JhbUluZm9Mb2coaS5wcm9ncmFtKSk7cmV0dXJuIGl9LHIuc3dpdGNoU2hhZGVyPWZ1bmN0aW9uKHIsdCxlKXtpZih0fHxjb25zb2xlLnRyYWNlKFwicG9zTWF0cml4IGRvZXMgbm90IGhhdmUgcmVxdWlyZWQgYXJndW1lbnRcIiksdGhpcy5jdXJyZW50U2hhZGVyIT09cil7dGhpcy51c2VQcm9ncmFtKHIucHJvZ3JhbSk7Zm9yKHZhciBpPXRoaXMuY3VycmVudFNoYWRlcj90aGlzLmN1cnJlbnRTaGFkZXIuYXR0cmlidXRlczpbXSxhPXIuYXR0cmlidXRlcyxoPTA7aDxpLmxlbmd0aDtoKyspYS5pbmRleE9mKGlbaF0pPDAmJnRoaXMuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGlbaF0pO2Zvcih2YXIgbz0wO288YS5sZW5ndGg7bysrKWkuaW5kZXhPZihhW29dKTwwJiZ0aGlzLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGFbb10pO3RoaXMuY3VycmVudFNoYWRlcj1yfXIucG9zTWF0cml4IT09dCYmKHRoaXMudW5pZm9ybU1hdHJpeDRmdihyLnVfbWF0cml4LCExLHQpLHIucG9zTWF0cml4PXQpLGUmJnIuZXhNYXRyaXghPT1lJiZyLnVfZXhtYXRyaXgmJih0aGlzLnVuaWZvcm1NYXRyaXg0ZnYoci51X2V4bWF0cml4LCExLGUpLHIuZXhNYXRyaXg9ZSl9LHIudmVydGV4QXR0cmliMmZ2PWZ1bmN0aW9uKHQsZSl7ci52ZXJ0ZXhBdHRyaWIyZih0LGVbMF0sZVsxXSl9LHIudmVydGV4QXR0cmliM2Z2PWZ1bmN0aW9uKHQsZSl7ci52ZXJ0ZXhBdHRyaWIzZih0LGVbMF0sZVsxXSxlWzJdKX0sci52ZXJ0ZXhBdHRyaWI0ZnY9ZnVuY3Rpb24odCxlKXtyLnZlcnRleEF0dHJpYjRmKHQsZVswXSxlWzFdLGVbMl0sZVszXSl9LHJ9O1xufSx7XCIuLi91dGlsL3V0aWxcIjoxMDYsXCIuL3NoYWRlcnNcIjozOH1dLDM2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIExpbmVBdGxhcyh0LGkpe3RoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1pLHRoaXMubmV4dFJvdz0wLHRoaXMuYnl0ZXM9NCx0aGlzLmRhdGE9bmV3IFVpbnQ4QXJyYXkodGhpcy53aWR0aCp0aGlzLmhlaWdodCp0aGlzLmJ5dGVzKSx0aGlzLnBvc2l0aW9ucz17fX1tb2R1bGUuZXhwb3J0cz1MaW5lQXRsYXMsTGluZUF0bGFzLnByb3RvdHlwZS5zZXRTcHJpdGU9ZnVuY3Rpb24odCl7dGhpcy5zcHJpdGU9dH0sTGluZUF0bGFzLnByb3RvdHlwZS5nZXREYXNoPWZ1bmN0aW9uKHQsaSl7dmFyIGU9dC5qb2luKFwiLFwiKStpO3JldHVybiB0aGlzLnBvc2l0aW9uc1tlXXx8KHRoaXMucG9zaXRpb25zW2VdPXRoaXMuYWRkRGFzaCh0LGkpKSx0aGlzLnBvc2l0aW9uc1tlXX0sTGluZUF0bGFzLnByb3RvdHlwZS5hZGREYXNoPWZ1bmN0aW9uKHQsaSl7dmFyIGU9aT83OjAsaD0yKmUrMSxzPTEyODtpZih0aGlzLm5leHRSb3craD50aGlzLmhlaWdodClyZXR1cm4gY29uc29sZS53YXJuKFwiTGluZUF0bGFzIG91dCBvZiBzcGFjZVwiKSxudWxsO2Zvcih2YXIgYT0wLHI9MDtyPHQubGVuZ3RoO3IrKylhKz10W3JdO2Zvcih2YXIgbj10aGlzLndpZHRoL2Esbz1uLzIsZD10Lmxlbmd0aCUyPT09MSxFPS1lO2U+PUU7RSsrKWZvcih2YXIgVD10aGlzLm5leHRSb3crZStFLGw9dGhpcy53aWR0aCpULFI9ZD8tdFt0Lmxlbmd0aC0xXTowLHU9dFswXSxnPTEscD0wO3A8dGhpcy53aWR0aDtwKyspe2Zvcig7cC9uPnU7KVI9dSx1Kz10W2ddLGQmJmc9PT10Lmxlbmd0aC0xJiYodSs9dFswXSksZysrO3ZhciB4LGY9TWF0aC5hYnMocC1SKm4pLEE9TWF0aC5hYnMocC11Km4pLHc9TWF0aC5taW4oZixBKSxfPWclMj09PTE7aWYoaSl7dmFyIHk9ZT9FL2UqKG8rMSk6MDtpZihfKXt2YXIgRD1vLU1hdGguYWJzKHkpO3g9TWF0aC5zcXJ0KHcqdytEKkQpfWVsc2UgeD1vLU1hdGguc3FydCh3KncreSp5KX1lbHNlIHg9KF8/MTotMSkqdzt0aGlzLmRhdGFbMys0KihsK3ApXT1NYXRoLm1heCgwLE1hdGgubWluKDI1NSx4K3MpKX12YXIgYz17eToodGhpcy5uZXh0Um93K2UrLjUpL3RoaXMuaGVpZ2h0LGhlaWdodDoyKmUvdGhpcy5oZWlnaHQsd2lkdGg6YX07cmV0dXJuIHRoaXMubmV4dFJvdys9aCx0aGlzLmRpcnR5PSEwLGN9LExpbmVBdGxhcy5wcm90b3R5cGUuYmluZD1mdW5jdGlvbih0KXt0aGlzLnRleHR1cmU/KHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELHRoaXMudGV4dHVyZSksdGhpcy5kaXJ0eSYmKHRoaXMuZGlydHk9ITEsdC50ZXhTdWJJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LHQuUkdCQSx0LlVOU0lHTkVEX0JZVEUsdGhpcy5kYXRhKSkpOih0aGlzLnRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCksdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9XUkFQX1MsdC5SRVBFQVQpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX1dSQVBfVCx0LlJFUEVBVCksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUlOX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUFHX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLHQuUkdCQSx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LDAsdC5SR0JBLHQuVU5TSUdORURfQllURSx0aGlzLmRhdGEpKX0sTGluZUF0bGFzLnByb3RvdHlwZS5kZWJ1Zz1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KSx0LnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIix0LnN0eWxlLnRvcD0wLHQuc3R5bGUubGVmdD0wLHQuc3R5bGUuYmFja2dyb3VuZD1cIiNmZjBcIix0LndpZHRoPXRoaXMud2lkdGgsdC5oZWlnaHQ9dGhpcy5oZWlnaHQ7Zm9yKHZhciBpPXQuZ2V0Q29udGV4dChcIjJkXCIpLGU9aS5nZXRJbWFnZURhdGEoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLGg9MDtoPHRoaXMuZGF0YS5sZW5ndGg7aCsrKWlmKHRoaXMuc2RmKXt2YXIgcz00Kmg7ZS5kYXRhW3NdPWUuZGF0YVtzKzFdPWUuZGF0YVtzKzJdPTAsZS5kYXRhW3MrM109dGhpcy5kYXRhW2hdfWVsc2UgZS5kYXRhW2hdPXRoaXMuZGF0YVtoXTtpLnB1dEltYWdlRGF0YShlLDAsMCl9O1xufSx7fV0sMzc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gUGFpbnRlcih0LGUpe3RoaXMuZ2w9Z2x1dGlsLmV4dGVuZCh0KSx0aGlzLnRyYW5zZm9ybT1lLHRoaXMucmV1c2FibGVUZXh0dXJlcz17fSx0aGlzLnByZUZib3M9e30sdGhpcy5mcmFtZUhpc3Rvcnk9bmV3IEZyYW1lSGlzdG9yeSx0aGlzLnNldHVwKCl9dmFyIGdsdXRpbD1yZXF1aXJlKFwiLi9nbF91dGlsXCIpLGJyb3dzZXI9cmVxdWlyZShcIi4uL3V0aWwvYnJvd3NlclwiKSxtYXQ0PXJlcXVpcmUoXCJnbC1tYXRyaXhcIikubWF0NCxGcmFtZUhpc3Rvcnk9cmVxdWlyZShcIi4vZnJhbWVfaGlzdG9yeVwiKTttb2R1bGUuZXhwb3J0cz1QYWludGVyLFBhaW50ZXIucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2w7dGhpcy53aWR0aD10KmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyx0aGlzLmhlaWdodD1lKmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxpLnZpZXdwb3J0KDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX0sUGFpbnRlci5wcm90b3R5cGUuc2V0dXA9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdsO3QudmVyYm9zZT0hMCx0LmVuYWJsZSh0LkJMRU5EKSx0LmJsZW5kRnVuYyh0Lk9ORV9NSU5VU19EU1RfQUxQSEEsdC5PTkUpLHQuZW5hYmxlKHQuU1RFTkNJTF9URVNUKSx0aGlzLmRlYnVnU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcImRlYnVnXCIsW1wiYV9wb3NcIl0sW1widV9tYXRyaXhcIixcInVfY29sb3JcIl0pLHRoaXMucmFzdGVyU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcInJhc3RlclwiLFtcImFfcG9zXCIsXCJhX3RleHR1cmVfcG9zXCJdLFtcInVfbWF0cml4XCIsXCJ1X2JyaWdodG5lc3NfbG93XCIsXCJ1X2JyaWdodG5lc3NfaGlnaFwiLFwidV9zYXR1cmF0aW9uX2ZhY3RvclwiLFwidV9zcGluX3dlaWdodHNcIixcInVfY29udHJhc3RfZmFjdG9yXCIsXCJ1X29wYWNpdHkwXCIsXCJ1X29wYWNpdHkxXCIsXCJ1X2ltYWdlMFwiLFwidV9pbWFnZTFcIixcInVfdGxfcGFyZW50XCIsXCJ1X3NjYWxlX3BhcmVudFwiLFwidV9idWZmZXJfc2NhbGVcIl0pLHRoaXMuY2lyY2xlU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcImNpcmNsZVwiLFtcImFfcG9zXCJdLFtcInVfbWF0cml4XCIsXCJ1X2V4bWF0cml4XCIsXCJ1X2JsdXJcIixcInVfc2l6ZVwiLFwidV9jb2xvclwiXSksdGhpcy5saW5lU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcImxpbmVcIixbXCJhX3Bvc1wiLFwiYV9kYXRhXCJdLFtcInVfbWF0cml4XCIsXCJ1X2xpbmV3aWR0aFwiLFwidV9jb2xvclwiLFwidV9yYXRpb1wiLFwidV9ibHVyXCIsXCJ1X2V4dHJhXCIsXCJ1X2FudGlhbGlhc2luZ21hdHJpeFwiXSksdGhpcy5saW5lcGF0dGVyblNoYWRlcj10LmluaXRpYWxpemVTaGFkZXIoXCJsaW5lcGF0dGVyblwiLFtcImFfcG9zXCIsXCJhX2RhdGFcIl0sW1widV9tYXRyaXhcIixcInVfbGluZXdpZHRoXCIsXCJ1X3JhdGlvXCIsXCJ1X3BhdHRlcm5fc2l6ZV9hXCIsXCJ1X3BhdHRlcm5fc2l6ZV9iXCIsXCJ1X3BhdHRlcm5fdGxfYVwiLFwidV9wYXR0ZXJuX2JyX2FcIixcInVfcGF0dGVybl90bF9iXCIsXCJ1X3BhdHRlcm5fYnJfYlwiLFwidV9ibHVyXCIsXCJ1X2ZhZGVcIixcInVfb3BhY2l0eVwiLFwidV9leHRyYVwiLFwidV9hbnRpYWxpYXNpbmdtYXRyaXhcIl0pLHRoaXMubGluZXNkZnBhdHRlcm5TaGFkZXI9dC5pbml0aWFsaXplU2hhZGVyKFwibGluZXNkZnBhdHRlcm5cIixbXCJhX3Bvc1wiLFwiYV9kYXRhXCJdLFtcInVfbWF0cml4XCIsXCJ1X2xpbmV3aWR0aFwiLFwidV9jb2xvclwiLFwidV9yYXRpb1wiLFwidV9ibHVyXCIsXCJ1X3BhdHRlcm5zY2FsZV9hXCIsXCJ1X3RleF95X2FcIixcInVfcGF0dGVybnNjYWxlX2JcIixcInVfdGV4X3lfYlwiLFwidV9pbWFnZVwiLFwidV9zZGZnYW1tYVwiLFwidV9taXhcIixcInVfZXh0cmFcIixcInVfYW50aWFsaWFzaW5nbWF0cml4XCJdKSx0aGlzLmRvdFNoYWRlcj10LmluaXRpYWxpemVTaGFkZXIoXCJkb3RcIixbXCJhX3Bvc1wiXSxbXCJ1X21hdHJpeFwiLFwidV9zaXplXCIsXCJ1X2NvbG9yXCIsXCJ1X2JsdXJcIl0pLHRoaXMuc2RmU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcInNkZlwiLFtcImFfcG9zXCIsXCJhX29mZnNldFwiLFwiYV9kYXRhMVwiLFwiYV9kYXRhMlwiXSxbXCJ1X21hdHJpeFwiLFwidV9leG1hdHJpeFwiLFwidV90ZXh0dXJlXCIsXCJ1X3RleHNpemVcIixcInVfY29sb3JcIixcInVfZ2FtbWFcIixcInVfYnVmZmVyXCIsXCJ1X3pvb21cIixcInVfZmFkZWRpc3RcIixcInVfbWluZmFkZXpvb21cIixcInVfbWF4ZmFkZXpvb21cIixcInVfZmFkZXpvb21cIixcInVfc2tld2VkXCIsXCJ1X2V4dHJhXCJdKSx0aGlzLmljb25TaGFkZXI9dC5pbml0aWFsaXplU2hhZGVyKFwiaWNvblwiLFtcImFfcG9zXCIsXCJhX29mZnNldFwiLFwiYV9kYXRhMVwiLFwiYV9kYXRhMlwiXSxbXCJ1X21hdHJpeFwiLFwidV9leG1hdHJpeFwiLFwidV90ZXh0dXJlXCIsXCJ1X3RleHNpemVcIixcInVfem9vbVwiLFwidV9mYWRlZGlzdFwiLFwidV9taW5mYWRlem9vbVwiLFwidV9tYXhmYWRlem9vbVwiLFwidV9mYWRlem9vbVwiLFwidV9vcGFjaXR5XCIsXCJ1X3NrZXdlZFwiLFwidV9leHRyYVwiXSksdGhpcy5vdXRsaW5lU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcIm91dGxpbmVcIixbXCJhX3Bvc1wiXSxbXCJ1X21hdHJpeFwiLFwidV9jb2xvclwiLFwidV93b3JsZFwiXSksdGhpcy5wYXR0ZXJuU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcInBhdHRlcm5cIixbXCJhX3Bvc1wiXSxbXCJ1X21hdHJpeFwiLFwidV9wYXR0ZXJuX3RsX2FcIixcInVfcGF0dGVybl9icl9hXCIsXCJ1X3BhdHRlcm5fdGxfYlwiLFwidV9wYXR0ZXJuX2JyX2JcIixcInVfbWl4XCIsXCJ1X3BhdHRlcm5tYXRyaXhfYVwiLFwidV9wYXR0ZXJubWF0cml4X2JcIixcInVfb3BhY2l0eVwiLFwidV9pbWFnZVwiXSksdGhpcy5maWxsU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcImZpbGxcIixbXCJhX3Bvc1wiXSxbXCJ1X21hdHJpeFwiLFwidV9jb2xvclwiXSksdGhpcy5jb2xsaXNpb25Cb3hTaGFkZXI9dC5pbml0aWFsaXplU2hhZGVyKFwiY29sbGlzaW9uYm94XCIsW1wiYV9wb3NcIixcImFfZXh0cnVkZVwiLFwiYV9kYXRhXCJdLFtcInVfbWF0cml4XCIsXCJ1X3NjYWxlXCIsXCJ1X3pvb21cIixcInVfbWF4em9vbVwiXSksdGhpcy5pZGVudGl0eU1hdHJpeD1tYXQ0LmNyZWF0ZSgpLHRoaXMuYmFja2dyb3VuZEJ1ZmZlcj10LmNyZWF0ZUJ1ZmZlcigpLHRoaXMuYmFja2dyb3VuZEJ1ZmZlci5pdGVtU2l6ZT0yLHRoaXMuYmFja2dyb3VuZEJ1ZmZlci5pdGVtQ291bnQ9NCx0LmJpbmRCdWZmZXIodC5BUlJBWV9CVUZGRVIsdGhpcy5iYWNrZ3JvdW5kQnVmZmVyKSx0LmJ1ZmZlckRhdGEodC5BUlJBWV9CVUZGRVIsbmV3IEludDE2QXJyYXkoWy0xLC0xLDEsLTEsLTEsMSwxLDFdKSx0LlNUQVRJQ19EUkFXKSx0aGlzLnNldEV4dGVudCg0MDk2KSx0aGlzLmRlYnVnVGV4dEJ1ZmZlcj10LmNyZWF0ZUJ1ZmZlcigpLHRoaXMuZGVidWdUZXh0QnVmZmVyLml0ZW1TaXplPTJ9LFBhaW50ZXIucHJvdG90eXBlLnNldEV4dGVudD1mdW5jdGlvbih0KXtpZih0JiZ0IT09dGhpcy50aWxlRXh0ZW50KXt0aGlzLnRpbGVFeHRlbnQ9dDt2YXIgZT10aGlzLmdsO3RoaXMudGlsZUV4dGVudEJ1ZmZlcj1lLmNyZWF0ZUJ1ZmZlcigpLHRoaXMudGlsZUV4dGVudEJ1ZmZlci5pdGVtU2l6ZT00LHRoaXMudGlsZUV4dGVudEJ1ZmZlci5pdGVtQ291bnQ9NCxlLmJpbmRCdWZmZXIoZS5BUlJBWV9CVUZGRVIsdGhpcy50aWxlRXh0ZW50QnVmZmVyKSxlLmJ1ZmZlckRhdGEoZS5BUlJBWV9CVUZGRVIsbmV3IEludDE2QXJyYXkoWzAsMCwwLDAsdGhpcy50aWxlRXh0ZW50LDAsMzI3NjcsMCwwLHRoaXMudGlsZUV4dGVudCwwLDMyNzY3LHRoaXMudGlsZUV4dGVudCx0aGlzLnRpbGVFeHRlbnQsMzI3NjcsMzI3NjddKSxlLlNUQVRJQ19EUkFXKSx0aGlzLmRlYnVnQnVmZmVyPWUuY3JlYXRlQnVmZmVyKCksdGhpcy5kZWJ1Z0J1ZmZlci5pdGVtU2l6ZT0yLHRoaXMuZGVidWdCdWZmZXIuaXRlbUNvdW50PTUsZS5iaW5kQnVmZmVyKGUuQVJSQVlfQlVGRkVSLHRoaXMuZGVidWdCdWZmZXIpLGUuYnVmZmVyRGF0YShlLkFSUkFZX0JVRkZFUixuZXcgSW50MTZBcnJheShbMCwwLHRoaXMudGlsZUV4dGVudC0xLDAsdGhpcy50aWxlRXh0ZW50LTEsdGhpcy50aWxlRXh0ZW50LTEsMCx0aGlzLnRpbGVFeHRlbnQtMSwwLDBdKSxlLlNUQVRJQ19EUkFXKX19LFBhaW50ZXIucHJvdG90eXBlLmNsZWFyQ29sb3I9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdsO3QuY2xlYXJDb2xvcigwLDAsMCwwKSx0LmNsZWFyKHQuQ09MT1JfQlVGRkVSX0JJVCl9LFBhaW50ZXIucHJvdG90eXBlLmNsZWFyU3RlbmNpbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2w7dC5jbGVhclN0ZW5jaWwoMCksdC5zdGVuY2lsTWFzaygyNTUpLHQuY2xlYXIodC5TVEVOQ0lMX0JVRkZFUl9CSVQpfSxQYWludGVyLnByb3RvdHlwZS5kcmF3Q2xpcHBpbmdNYXNrPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2w7ZS5zd2l0Y2hTaGFkZXIodGhpcy5maWxsU2hhZGVyLHQucG9zTWF0cml4KSxlLmNvbG9yTWFzayghMSwhMSwhMSwhMSksZS5jbGVhclN0ZW5jaWwoMCksZS5zdGVuY2lsTWFzaygxOTEpLGUuY2xlYXIoZS5TVEVOQ0lMX0JVRkZFUl9CSVQpLGUuc3RlbmNpbEZ1bmMoZS5FUVVBTCwxOTIsNjQpLGUuc3RlbmNpbE1hc2soMTkyKSxlLnN0ZW5jaWxPcChlLlJFUExBQ0UsZS5LRUVQLGUuS0VFUCksZS5iaW5kQnVmZmVyKGUuQVJSQVlfQlVGRkVSLHRoaXMudGlsZUV4dGVudEJ1ZmZlciksZS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMuZmlsbFNoYWRlci5hX3Bvcyx0aGlzLnRpbGVFeHRlbnRCdWZmZXIuaXRlbVNpemUsZS5TSE9SVCwhMSw4LDApLGUuZHJhd0FycmF5cyhlLlRSSUFOR0xFX1NUUklQLDAsdGhpcy50aWxlRXh0ZW50QnVmZmVyLml0ZW1Db3VudCksZS5zdGVuY2lsRnVuYyhlLkVRVUFMLDEyOCwxMjgpLGUuc3RlbmNpbE9wKGUuS0VFUCxlLktFRVAsZS5SRVBMQUNFKSxlLnN0ZW5jaWxNYXNrKDApLGUuY29sb3JNYXNrKCEwLCEwLCEwLCEwKX0sUGFpbnRlci5wcm90b3R5cGUucHJlcGFyZUJ1ZmZlcnM9ZnVuY3Rpb24oKXt9LFBhaW50ZXIucHJvdG90eXBlLmJpbmREZWZhdWx0RnJhbWVidWZmZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdsO3QuYmluZEZyYW1lYnVmZmVyKHQuRlJBTUVCVUZGRVIsbnVsbCl9O3ZhciBkcmF3PXtzeW1ib2w6cmVxdWlyZShcIi4vZHJhd19zeW1ib2xcIiksY2lyY2xlOnJlcXVpcmUoXCIuL2RyYXdfY2lyY2xlXCIpLGxpbmU6cmVxdWlyZShcIi4vZHJhd19saW5lXCIpLGZpbGw6cmVxdWlyZShcIi4vZHJhd19maWxsXCIpLHJhc3RlcjpyZXF1aXJlKFwiLi9kcmF3X3Jhc3RlclwiKSxiYWNrZ3JvdW5kOnJlcXVpcmUoXCIuL2RyYXdfYmFja2dyb3VuZFwiKSxkZWJ1ZzpyZXF1aXJlKFwiLi9kcmF3X2RlYnVnXCIpLHZlcnRpY2VzOnJlcXVpcmUoXCIuL2RyYXdfdmVydGljZXNcIil9O1BhaW50ZXIucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUpe3RoaXMuc3R5bGU9dCx0aGlzLm9wdGlvbnM9ZSx0aGlzLmxpbmVBdGxhcz10LmxpbmVBdGxhcyx0aGlzLnNwcml0ZUF0bGFzPXQuc3ByaXRlQXRsYXMsdGhpcy5zcHJpdGVBdGxhcy5zZXRTcHJpdGUodC5zcHJpdGUpLHRoaXMuZ2x5cGhBdGxhcz10LmdseXBoQXRsYXMsdGhpcy5nbHlwaEF0bGFzLmJpbmQodGhpcy5nbCksdGhpcy5mcmFtZUhpc3RvcnkucmVjb3JkKHRoaXMudHJhbnNmb3JtLnpvb20pLHRoaXMucHJlcGFyZUJ1ZmZlcnMoKSx0aGlzLmNsZWFyQ29sb3IoKTtmb3IodmFyIGk9dC5fZ3JvdXBzLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgcj10Ll9ncm91cHNbaV0sYT10LnNvdXJjZXNbci5zb3VyY2VdO2E/KHRoaXMuY2xlYXJTdGVuY2lsKCksYS5yZW5kZXIocix0aGlzKSk6dm9pZCAwPT09ci5zb3VyY2UmJnRoaXMuZHJhd0xheWVycyhyLHRoaXMuaWRlbnRpdHlNYXRyaXgpfX0sUGFpbnRlci5wcm90b3R5cGUuZHJhd1RpbGU9ZnVuY3Rpb24odCxlKXt0aGlzLnNldEV4dGVudCh0LnRpbGVFeHRlbnQpLHRoaXMuZHJhd0NsaXBwaW5nTWFzayh0KSx0aGlzLmRyYXdMYXllcnMoZSx0LnBvc01hdHJpeCx0KSx0aGlzLm9wdGlvbnMuZGVidWcmJmRyYXcuZGVidWcodGhpcyx0KX0sUGFpbnRlci5wcm90b3R5cGUuZHJhd0xheWVycz1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciByPXQubGVuZ3RoLTE7cj49MDtyLS0pe3ZhciBhPXRbcl07YS5oaWRkZW58fChkcmF3W2EudHlwZV0odGhpcyxhLGUsaSksdGhpcy5vcHRpb25zLnZlcnRpY2VzJiZkcmF3LnZlcnRpY2VzKHRoaXMsYSxlLGkpKX19LFBhaW50ZXIucHJvdG90eXBlLmRyYXdTdGVuY2lsQnVmZmVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nbDt0LnN3aXRjaFNoYWRlcih0aGlzLmZpbGxTaGFkZXIsdGhpcy5pZGVudGl0eU1hdHJpeCksdC5ibGVuZEZ1bmModC5PTkUsdC5PTkVfTUlOVVNfU1JDX0FMUEhBKSx0LnN0ZW5jaWxNYXNrKDApLHQuc3RlbmNpbEZ1bmModC5FUVVBTCwxMjgsMTI4KSx0LmJpbmRCdWZmZXIodC5BUlJBWV9CVUZGRVIsdGhpcy5iYWNrZ3JvdW5kQnVmZmVyKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIodGhpcy5maWxsU2hhZGVyLmFfcG9zLHRoaXMuYmFja2dyb3VuZEJ1ZmZlci5pdGVtU2l6ZSx0LlNIT1JULCExLDAsMCksdC51bmlmb3JtNGZ2KHRoaXMuZmlsbFNoYWRlci51X2NvbG9yLFswLDAsMCwuNV0pLHQuZHJhd0FycmF5cyh0LlRSSUFOR0xFX1NUUklQLDAsdGhpcy50aWxlRXh0ZW50QnVmZmVyLml0ZW1Db3VudCksdC5ibGVuZEZ1bmModC5PTkVfTUlOVVNfRFNUX0FMUEhBLHQuT05FKX0sUGFpbnRlci5wcm90b3R5cGUudHJhbnNsYXRlTWF0cml4PWZ1bmN0aW9uKHQsZSxpLHIpe2lmKCFpWzBdJiYhaVsxXSlyZXR1cm4gdDtpZihcInZpZXdwb3J0XCI9PT1yKXt2YXIgYT1NYXRoLnNpbigtdGhpcy50cmFuc2Zvcm0uYW5nbGUpLHM9TWF0aC5jb3MoLXRoaXMudHJhbnNmb3JtLmFuZ2xlKTtpPVtpWzBdKnMtaVsxXSphLGlbMF0qYStpWzFdKnNdfXZhciB1PXRoaXMudHJhbnNmb3JtLnNjYWxlLygxPDxlLmNvb3JkLnopLyhlLnRpbGVFeHRlbnQvZS50aWxlU2l6ZSksbj1baVswXS91LGlbMV0vdSwwXSxfPW5ldyBGbG9hdDMyQXJyYXkoMTYpO3JldHVybiBtYXQ0LnRyYW5zbGF0ZShfLHQsbiksX30sUGFpbnRlci5wcm90b3R5cGUuc2F2ZVRleHR1cmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yZXVzYWJsZVRleHR1cmVzW3Quc2l6ZV07ZT9lLnB1c2godCk6dGhpcy5yZXVzYWJsZVRleHR1cmVzW3Quc2l6ZV09W3RdfSxQYWludGVyLnByb3RvdHlwZS5nZXRUZXh0dXJlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucmV1c2FibGVUZXh0dXJlc1t0XTtyZXR1cm4gZSYmZS5sZW5ndGg+MD9lLnBvcCgpOm51bGx9O1xufSx7XCIuLi91dGlsL2Jyb3dzZXJcIjo5NSxcIi4vZHJhd19iYWNrZ3JvdW5kXCI6MjUsXCIuL2RyYXdfY2lyY2xlXCI6MjYsXCIuL2RyYXdfZGVidWdcIjoyOCxcIi4vZHJhd19maWxsXCI6MjksXCIuL2RyYXdfbGluZVwiOjMwLFwiLi9kcmF3X3Jhc3RlclwiOjMxLFwiLi9kcmF3X3N5bWJvbFwiOjMyLFwiLi9kcmF3X3ZlcnRpY2VzXCI6MzMsXCIuL2ZyYW1lX2hpc3RvcnlcIjozNCxcIi4vZ2xfdXRpbFwiOjM1LFwiZ2wtbWF0cml4XCI6MTE2fV0sMzg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIGdsaWZ5PXZvaWQgMDttb2R1bGUuZXhwb3J0cz17ZGVidWc6e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLHN0ZXAoMzI3NjcuLGFfcG9zLngpLDEpO31cIixmcmFnbWVudDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gdmVjNCB1X2NvbG9yO3ZvaWQgbWFpbigpe2dsX0ZyYWdDb2xvcj11X2NvbG9yO31cIn0sZG90Ont2ZXJ0ZXg6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3NpemU7YXR0cmlidXRlIHZlYzIgYV9wb3M7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2dsX1BvaW50U2l6ZT11X3NpemU7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWM0IHVfY29sb3I7dW5pZm9ybSBmbG9hdCB1X2JsdXI7dm9pZCBtYWluKCl7ZmxvYXQgYSxiO2E9bGVuZ3RoKGdsX1BvaW50Q29vcmQtLjUpO2I9c21vb3Roc3RlcCguNSwuNS11X2JsdXIsYSk7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqYjt9XCJ9LGZpbGw6e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWM0IHVfY29sb3I7dm9pZCBtYWluKCl7Z2xfRnJhZ0NvbG9yPXVfY29sb3I7fVwifSxjaXJjbGU6e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gZmxvYXQgdV9zaXplO2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gbWF0NCB1X21hdHJpeCx1X2V4bWF0cml4O3ZhcnlpbmcgdmVjMiBhO3ZvaWQgbWFpbigpe2E9dmVjMihtb2QoYV9wb3MsMi4pKjIuLTEuKTt2ZWM0IGI9dV9leG1hdHJpeCp2ZWM0KGEqdV9zaXplLDAsMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChmbG9vcihhX3BvcyouNSksMCwxKTtnbF9Qb3NpdGlvbis9YipnbF9Qb3NpdGlvbi53O31cIixmcmFnbWVudDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9ibHVyLHVfc2l6ZTt2YXJ5aW5nIHZlYzIgYTt2b2lkIG1haW4oKXtmbG9hdCBiPXNtb290aHN0ZXAoMS4tdV9ibHVyLDEuLGxlbmd0aChhKSk7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqKDEuLWIpO31cIn0sbGluZTp7dmVydGV4OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzQgYV9kYXRhO3VuaWZvcm0gaGlnaHAgbWF0NCB1X21hdHJpeDt1bmlmb3JtIGZsb2F0IHVfcmF0aW8sdV9leHRyYTt1bmlmb3JtIHZlYzIgdV9saW5ld2lkdGg7dW5pZm9ybSBtYXQyIHVfYW50aWFsaWFzaW5nbWF0cml4O3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjO3ZvaWQgbWFpbigpe3ZlYzIgZCxlO2Q9YV9kYXRhLnh5O2U9bW9kKGFfcG9zLDIuKTtlLnk9c2lnbihlLnktLjUpO2E9ZTt2ZWM0IGY9dmVjNCh1X2xpbmV3aWR0aC5zKmQqLjAxNTg3MzAxNiwwLDApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoZmxvb3IoYV9wb3MqLjUpK2YueHkvdV9yYXRpbywwLDEpO2Zsb2F0IGcsaCxpO2c9Z2xfUG9zaXRpb24ueS9nbF9Qb3NpdGlvbi53O2g9bGVuZ3RoKGQpL2xlbmd0aCh1X2FudGlhbGlhc2luZ21hdHJpeCpkKTtpPTEuLygxLi1taW4oZyp1X2V4dHJhLC45KSk7Yz1pKmg7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWMyIHVfbGluZXdpZHRoO3VuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9ibHVyO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjO3ZvaWQgbWFpbigpe2Zsb2F0IGQsZSxmO2Q9bGVuZ3RoKGEpKnVfbGluZXdpZHRoLnM7ZT11X2JsdXIqYztmPWNsYW1wKG1pbihkLSh1X2xpbmV3aWR0aC50LWUpLHVfbGluZXdpZHRoLnMtZCkvZSwwLiwxLik7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqZjt9XCJ9LGxpbmVwYXR0ZXJuOnt2ZXJ0ZXg6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjNCBhX2RhdGE7dW5pZm9ybSBoaWdocCBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gZmxvYXQgdV9yYXRpbyx1X2V4dHJhO3VuaWZvcm0gdmVjMiB1X2xpbmV3aWR0aDt1bmlmb3JtIHZlYzQgdV9jb2xvcjt1bmlmb3JtIG1hdDIgdV9hbnRpYWxpYXNpbmdtYXRyaXg7dmFyeWluZyB2ZWMyIGE7dmFyeWluZyBmbG9hdCBiLGM7dm9pZCBtYWluKCl7dmVjMiBkLGYsZyxoO2Q9YV9kYXRhLnh5O2Zsb2F0IGUsaSxqLGs7ZT1hX2RhdGEueioxMjguK2FfZGF0YS53O2Y9bW9kKGFfcG9zLDIuKTtmLnk9c2lnbihmLnktLjUpO2E9ZjtnPWQqLjAxNTg3MzAxNjtoPXVfbGluZXdpZHRoLnMqZztnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGZsb29yKGFfcG9zKi41KStoLnh5L3VfcmF0aW8sMCwxKTtiPWU7aT1nbF9Qb3NpdGlvbi55L2dsX1Bvc2l0aW9uLnc7aj1sZW5ndGgoZCkvbGVuZ3RoKHVfYW50aWFsaWFzaW5nbWF0cml4KmQpO2s9MS4vKDEuLW1pbihpKnVfZXh0cmEsLjkpKTtjPWsqajt9XCIsZnJhZ21lbnQ6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIHZlYzIgdV9saW5ld2lkdGgsdV9wYXR0ZXJuX3NpemVfYSx1X3BhdHRlcm5fc2l6ZV9iLHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHVfcGF0dGVybl90bF9iLHVfcGF0dGVybl9icl9iO3VuaWZvcm0gZmxvYXQgdV9wb2ludCx1X2JsdXIsdV9mYWRlLHVfb3BhY2l0eTt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjO3ZvaWQgbWFpbigpe2Zsb2F0IGQsZSxmLGcsaCxpLGo7ZD1sZW5ndGgoYSkqdV9saW5ld2lkdGgucztlPXVfYmx1cipjO2Y9Y2xhbXAobWluKGQtKHVfbGluZXdpZHRoLnQtZSksdV9saW5ld2lkdGgucy1kKS9lLDAuLDEuKTtnPW1vZChiL3VfcGF0dGVybl9zaXplX2EueCwxLik7aD1tb2QoYi91X3BhdHRlcm5fc2l6ZV9iLngsMS4pO2k9LjUrYS55KnVfbGluZXdpZHRoLnMvdV9wYXR0ZXJuX3NpemVfYS55O2o9LjUrYS55KnVfbGluZXdpZHRoLnMvdV9wYXR0ZXJuX3NpemVfYi55O3ZlYzIgayxsO2s9bWl4KHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHZlYzIoZyxpKSk7bD1taXgodV9wYXR0ZXJuX3RsX2IsdV9wYXR0ZXJuX2JyX2IsdmVjMihoLGopKTt2ZWM0IG09bWl4KHRleHR1cmUyRCh1X2ltYWdlLGspLHRleHR1cmUyRCh1X2ltYWdlLGwpLHVfZmFkZSk7Zio9dV9vcGFjaXR5O2dsX0ZyYWdDb2xvcj1tKmY7fVwifSxsaW5lc2RmcGF0dGVybjp7dmVydGV4OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzQgYV9kYXRhO3VuaWZvcm0gaGlnaHAgbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV9saW5ld2lkdGgsdV9wYXR0ZXJuc2NhbGVfYSx1X3BhdHRlcm5zY2FsZV9iO3VuaWZvcm0gZmxvYXQgdV9yYXRpbyx1X3RleF95X2EsdV90ZXhfeV9iLHVfZXh0cmE7dW5pZm9ybSBtYXQyIHVfYW50aWFsaWFzaW5nbWF0cml4O3ZhcnlpbmcgdmVjMiBhLGIsYzt2YXJ5aW5nIGZsb2F0IGQ7dm9pZCBtYWluKCl7dmVjMiBlLGc7ZT1hX2RhdGEueHk7ZmxvYXQgZixpLGosaztmPWFfZGF0YS56KjEyOC4rYV9kYXRhLnc7Zz1tb2QoYV9wb3MsMi4pO2cueT1zaWduKGcueS0uNSk7YT1nO3ZlYzQgaD12ZWM0KHVfbGluZXdpZHRoLnMqZSouMDE1ODczMDE2LDAsMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChmbG9vcihhX3BvcyouNSkraC54eS91X3JhdGlvLDAsMSk7Yj12ZWMyKGYqdV9wYXR0ZXJuc2NhbGVfYS54LGcueSp1X3BhdHRlcm5zY2FsZV9hLnkrdV90ZXhfeV9hKTtjPXZlYzIoZip1X3BhdHRlcm5zY2FsZV9iLngsZy55KnVfcGF0dGVybnNjYWxlX2IueSt1X3RleF95X2IpO2k9Z2xfUG9zaXRpb24ueS9nbF9Qb3NpdGlvbi53O2o9bGVuZ3RoKGUpL2xlbmd0aCh1X2FudGlhbGlhc2luZ21hdHJpeCplKTtrPTEuLygxLi1taW4oaSp1X2V4dHJhLC45KSk7ZD1rKmo7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWMyIHVfbGluZXdpZHRoO3VuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9ibHVyLHVfc2RmZ2FtbWEsdV9taXg7dW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTt2YXJ5aW5nIHZlYzIgYSxiLGM7dmFyeWluZyBmbG9hdCBkO3ZvaWQgbWFpbigpe2Zsb2F0IGUsZixnLGgsaSxqO2U9bGVuZ3RoKGEpKnVfbGluZXdpZHRoLnM7Zj11X2JsdXIqZDtnPWNsYW1wKG1pbihlLSh1X2xpbmV3aWR0aC50LWYpLHVfbGluZXdpZHRoLnMtZSkvZiwwLiwxLik7aD10ZXh0dXJlMkQodV9pbWFnZSxiKS5hO2k9dGV4dHVyZTJEKHVfaW1hZ2UsYykuYTtqPW1peChoLGksdV9taXgpO2cqPXNtb290aHN0ZXAoLjUtdV9zZGZnYW1tYSwuNSt1X3NkZmdhbW1hLGopO2dsX0ZyYWdDb2xvcj11X2NvbG9yKmc7fVwifSxvdXRsaW5lOnt2ZXJ0ZXg6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3Bvczt1bmlmb3JtIGhpZ2hwIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSB2ZWMyIHVfd29ybGQ7dmFyeWluZyB2ZWMyIGE7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2E9KGdsX1Bvc2l0aW9uLnh5L2dsX1Bvc2l0aW9uLncrMS4pLzIuKnVfd29ybGQ7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWM0IHVfY29sb3I7dmFyeWluZyB2ZWMyIGE7dm9pZCBtYWluKCl7ZmxvYXQgYixjO2I9bGVuZ3RoKGEtZ2xfRnJhZ0Nvb3JkLnh5KTtjPXNtb290aHN0ZXAoMS4sMC4sYik7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqYzt9XCJ9LHBhdHRlcm46e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDMgdV9wYXR0ZXJubWF0cml4X2EsdV9wYXR0ZXJubWF0cml4X2I7YXR0cmlidXRlIHZlYzIgYV9wb3M7dmFyeWluZyB2ZWMyIGEsYjt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7YT0odV9wYXR0ZXJubWF0cml4X2EqdmVjMyhhX3BvcywxKSkueHk7Yj0odV9wYXR0ZXJubWF0cml4X2IqdmVjMyhhX3BvcywxKSkueHk7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHksdV9taXg7dW5pZm9ybSB2ZWMyIHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHVfcGF0dGVybl90bF9iLHVfcGF0dGVybl9icl9iO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIGEsYjt2b2lkIG1haW4oKXt2ZWMyIGMsZCxmLGc7Yz1tb2QoYSwxLik7ZD1taXgodV9wYXR0ZXJuX3RsX2EsdV9wYXR0ZXJuX2JyX2EsYyk7dmVjNCBlLGg7ZT10ZXh0dXJlMkQodV9pbWFnZSxkKTtmPW1vZChiLDEuKTtnPW1peCh1X3BhdHRlcm5fdGxfYix1X3BhdHRlcm5fYnJfYixmKTtoPXRleHR1cmUyRCh1X2ltYWdlLGcpO2dsX0ZyYWdDb2xvcj1taXgoZSxoLHVfbWl4KSp1X29wYWNpdHk7fVwifSxyYXN0ZXI6e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV90bF9wYXJlbnQ7dW5pZm9ybSBmbG9hdCB1X3NjYWxlX3BhcmVudCx1X2J1ZmZlcl9zY2FsZTthdHRyaWJ1dGUgdmVjMiBhX3BvcyxhX3RleHR1cmVfcG9zO3ZhcnlpbmcgdmVjMiBhLGI7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2E9KGFfdGV4dHVyZV9wb3MvMzI3NjcuLS41KS91X2J1ZmZlcl9zY2FsZSsuNTtiPWEqdV9zY2FsZV9wYXJlbnQrdV90bF9wYXJlbnQ7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHkwLHVfb3BhY2l0eTEsdV9icmlnaHRuZXNzX2xvdyx1X2JyaWdodG5lc3NfaGlnaCx1X3NhdHVyYXRpb25fZmFjdG9yLHVfY29udHJhc3RfZmFjdG9yO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2UwLHVfaW1hZ2UxO3ZhcnlpbmcgdmVjMiBhLGI7dW5pZm9ybSB2ZWMzIHVfc3Bpbl93ZWlnaHRzO3ZvaWQgbWFpbigpe3ZlYzQgYyxkLGU7Yz10ZXh0dXJlMkQodV9pbWFnZTAsYSk7ZD10ZXh0dXJlMkQodV9pbWFnZTEsYik7ZT1jKnVfb3BhY2l0eTArZCp1X29wYWNpdHkxO3ZlYzMgZixoLGk7Zj1lLnJnYjtmPXZlYzMoZG90KGYsdV9zcGluX3dlaWdodHMueHl6KSxkb3QoZix1X3NwaW5fd2VpZ2h0cy56eHkpLGRvdChmLHVfc3Bpbl93ZWlnaHRzLnl6eCkpO2Zsb2F0IGc9KGUucitlLmcrZS5iKS8zLjtmKz0oZy1mKSp1X3NhdHVyYXRpb25fZmFjdG9yO2Y9KGYtLjUpKnVfY29udHJhc3RfZmFjdG9yKy41O2g9dmVjMyh1X2JyaWdodG5lc3NfbG93KTtpPXZlYzModV9icmlnaHRuZXNzX2hpZ2gpO2dsX0ZyYWdDb2xvcj12ZWM0KG1peChoLGksZiksZS5hKTt9XCJ9LGljb246e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zLGFfb2Zmc2V0O2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTEsYV9kYXRhMjt1bmlmb3JtIGhpZ2hwIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfZXhtYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3pvb20sdV9mYWRlZGlzdCx1X21pbmZhZGV6b29tLHVfbWF4ZmFkZXpvb20sdV9mYWRlem9vbSx1X29wYWNpdHksdV9leHRyYTt1bmlmb3JtIGJvb2wgdV9za2V3ZWQ7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt2YXJ5aW5nIHZlYzIgYTt2YXJ5aW5nIGZsb2F0IGI7dm9pZCBtYWluKCl7dmVjMiBjLGU7Yz1hX2RhdGExLnh5O2Zsb2F0IGQsZixnLGgsaSxqO2Q9YV9kYXRhMVsyXTtlPWFfZGF0YTIuc3Q7Zj1lWzBdO2c9ZVsxXTtoPTEwLjtpPTIuLXN0ZXAoZix1X3pvb20pLSgxLi1zdGVwKGcsdV96b29tKSk7aj1jbGFtcCgodV9mYWRlem9vbS1kKS91X2ZhZGVkaXN0LDAuLDEuKTtpZih1X2ZhZGVkaXN0Pj0wLiliPWo7ZWxzZSBiPTEuLWo7aWYodV9tYXhmYWRlem9vbTxkKWI9MC47aWYodV9taW5mYWRlem9vbT49ZCliPTEuO2krPXN0ZXAoYiwwLik7aWYodV9za2V3ZWQpe3ZlYzQgaz11X2V4bWF0cml4KnZlYzQoYV9vZmZzZXQvNjQuLDAsMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcytrLnh5LDAsMSk7Z2xfUG9zaXRpb24ueis9aSpnbF9Qb3NpdGlvbi53O31lbHNle3ZlYzQgaz11X2V4bWF0cml4KnZlYzQoYV9vZmZzZXQvNjQuLGksMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpK2s7fWE9Yy91X3RleHNpemU7Yio9dV9vcGFjaXR5O31cIixmcmFnbWVudDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTt2YXJ5aW5nIHZlYzIgYTt2YXJ5aW5nIGZsb2F0IGI7dm9pZCBtYWluKCl7Z2xfRnJhZ0NvbG9yPXRleHR1cmUyRCh1X3RleHR1cmUsYSkqYjt9XCJ9LHNkZjp7dmVydGV4OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3MsYV9vZmZzZXQ7YXR0cmlidXRlIHZlYzQgYV9kYXRhMSxhX2RhdGEyO3VuaWZvcm0gaGlnaHAgbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDQgdV9leG1hdHJpeDt1bmlmb3JtIGZsb2F0IHVfem9vbSx1X2ZhZGVkaXN0LHVfbWluZmFkZXpvb20sdV9tYXhmYWRlem9vbSx1X2ZhZGV6b29tLHVfZXh0cmE7dW5pZm9ybSBib29sIHVfc2tld2VkO3VuaWZvcm0gdmVjMiB1X3RleHNpemU7dmFyeWluZyB2ZWMyIGE7dmFyeWluZyBmbG9hdCBiLGM7dm9pZCBtYWluKCl7dmVjMiBkLGY7ZD1hX2RhdGExLnh5O2Zsb2F0IGUsZyxoLGksaixrLGw7ZT1hX2RhdGExWzJdO2Y9YV9kYXRhMi5zdDtnPWZbMF07aD1mWzFdO2k9Mi4tc3RlcChnLHVfem9vbSktKDEuLXN0ZXAoaCx1X3pvb20pKTtqPWNsYW1wKCh1X2ZhZGV6b29tLWUpL3VfZmFkZWRpc3QsMC4sMS4pO2lmKHVfZmFkZWRpc3Q+PTAuKWI9ajtlbHNlIGI9MS4tajtpZih1X21heGZhZGV6b29tPGUpYj0wLjtpZih1X21pbmZhZGV6b29tPj1lKWI9MS47aSs9c3RlcChiLDAuKTtpZih1X3NrZXdlZCl7dmVjNCBrPXVfZXhtYXRyaXgqdmVjNChhX29mZnNldC82NC4sMCwwKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zK2sueHksMCwxKTtnbF9Qb3NpdGlvbi56Kz1pKmdsX1Bvc2l0aW9uLnc7fWVsc2V7dmVjNCBrPXVfZXhtYXRyaXgqdmVjNChhX29mZnNldC82NC4saSwwKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSkrazt9az1nbF9Qb3NpdGlvbi55L2dsX1Bvc2l0aW9uLnc7bD0xLi8oMS4tayp1X2V4dHJhKTtjPWw7YT1kL3VfdGV4c2l6ZTt9XCIsZnJhZ21lbnQ6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7dW5pZm9ybSB2ZWM0IHVfY29sb3I7dW5pZm9ybSBmbG9hdCB1X2J1ZmZlcix1X2dhbW1hO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjO3ZvaWQgbWFpbigpe2Zsb2F0IGQsZSxmO2Q9dV9nYW1tYSpjO2U9dGV4dHVyZTJEKHVfdGV4dHVyZSxhKS5hO2Y9c21vb3Roc3RlcCh1X2J1ZmZlci1kLHVfYnVmZmVyK2QsZSkqYjtnbF9GcmFnQ29sb3I9dV9jb2xvcipmO31cIn0sY29sbGlzaW9uYm94Ont2ZXJ0ZXg6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3BvcyxhX2V4dHJ1ZGUsYV9kYXRhO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIGZsb2F0IHVfc2NhbGU7dmFyeWluZyBmbG9hdCBhLGI7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcythX2V4dHJ1ZGUvdV9zY2FsZSwwLDEpO2E9YV9kYXRhLng7Yj1hX2RhdGEueTt9XCIsZnJhZ21lbnQ6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIGZsb2F0IHVfem9vbSx1X21heHpvb207dmFyeWluZyBmbG9hdCBhLGI7dm9pZCBtYWluKCl7ZmxvYXQgYz0uNTtnbF9GcmFnQ29sb3I9dmVjNCgwLDEsMCwxKSpjO2lmKGI+dV96b29tKWdsX0ZyYWdDb2xvcj12ZWM0KDEsMCwwLDEpKmM7aWYodV96b29tPj1hKWdsX0ZyYWdDb2xvcj12ZWM0KDAsMCwwLDEpKmMqLjI1O2lmKGI+PXVfbWF4em9vbSlnbF9GcmFnQ29sb3I9dmVjNCgwLDAsMSwxKSpjKi4yO31cIn19O1xufSx7fV0sMzk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gR2VvSlNPTlNvdXJjZShpKXtpPWl8fHt9LHRoaXMuX2RhdGE9aS5kYXRhLHZvaWQgMCE9PWkubWF4em9vbSYmKHRoaXMubWF4em9vbT1pLm1heHpvb20pLHRoaXMuZ2VvanNvblZ0T3B0aW9ucz17bWF4Wm9vbTp0aGlzLm1heHpvb219LHZvaWQgMCE9PWkuYnVmZmVyJiYodGhpcy5nZW9qc29uVnRPcHRpb25zLmJ1ZmZlcj1pLmJ1ZmZlciksdm9pZCAwIT09aS50b2xlcmFuY2UmJih0aGlzLmdlb2pzb25WdE9wdGlvbnMudG9sZXJhbmNlPWkudG9sZXJhbmNlKSx0aGlzLl9weXJhbWlkPW5ldyBUaWxlUHlyYW1pZCh7dGlsZVNpemU6NTEyLG1pbnpvb206dGhpcy5taW56b29tLG1heHpvb206dGhpcy5tYXh6b29tLGNhY2hlU2l6ZToyMCxsb2FkOnRoaXMuX2xvYWRUaWxlLmJpbmQodGhpcyksYWJvcnQ6dGhpcy5fYWJvcnRUaWxlLmJpbmQodGhpcyksdW5sb2FkOnRoaXMuX3VubG9hZFRpbGUuYmluZCh0aGlzKSxhZGQ6dGhpcy5fYWRkVGlsZS5iaW5kKHRoaXMpLHJlbW92ZTp0aGlzLl9yZW1vdmVUaWxlLmJpbmQodGhpcyl9KX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpLEV2ZW50ZWQ9cmVxdWlyZShcIi4uL3V0aWwvZXZlbnRlZFwiKSxUaWxlUHlyYW1pZD1yZXF1aXJlKFwiLi90aWxlX3B5cmFtaWRcIiksU291cmNlPXJlcXVpcmUoXCIuL3NvdXJjZVwiKSx1cmxSZXNvbHZlPXJlcXVpcmUoXCJyZXNvbHZlLXVybFwiKTttb2R1bGUuZXhwb3J0cz1HZW9KU09OU291cmNlLEdlb0pTT05Tb3VyY2UucHJvdG90eXBlPXV0aWwuaW5oZXJpdChFdmVudGVkLHttaW56b29tOjAsbWF4em9vbToxNCxfZGlydHk6ITAsc2V0RGF0YTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5fZGF0YT1pLHRoaXMuX2RpcnR5PSEwLHRoaXMuZmlyZShcImNoYW5nZVwiKSx0aGlzLm1hcCYmdGhpcy51cGRhdGUodGhpcy5tYXAudHJhbnNmb3JtKSx0aGlzfSxvbkFkZDpmdW5jdGlvbihpKXt0aGlzLm1hcD1pfSxsb2FkZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9hZGVkJiZ0aGlzLl9weXJhbWlkLmxvYWRlZCgpfSx1cGRhdGU6ZnVuY3Rpb24oaSl7dGhpcy5fZGlydHkmJnRoaXMuX3VwZGF0ZURhdGEoKSx0aGlzLl9sb2FkZWQmJnRoaXMuX3B5cmFtaWQudXBkYXRlKHRoaXMudXNlZCxpKX0scmVsb2FkOmZ1bmN0aW9uKCl7dGhpcy5fbG9hZGVkJiZ0aGlzLl9weXJhbWlkLnJlbG9hZCgpfSxyZW5kZXI6U291cmNlLl9yZW5kZXJUaWxlcyxmZWF0dXJlc0F0OlNvdXJjZS5fdmVjdG9yRmVhdHVyZXNBdCxmZWF0dXJlc0luOlNvdXJjZS5fdmVjdG9yRmVhdHVyZXNJbixfdXBkYXRlRGF0YTpmdW5jdGlvbigpe3RoaXMuX2RpcnR5PSExO3ZhciBpPXRoaXMuX2RhdGE7XCJzdHJpbmdcIj09dHlwZW9mIGkmJihpPXVybFJlc29sdmUod2luZG93LmxvY2F0aW9uLmhyZWYsaSkpLHRoaXMud29ya2VySUQ9dGhpcy5kaXNwYXRjaGVyLnNlbmQoXCJwYXJzZSBnZW9qc29uXCIse2RhdGE6aSx0aWxlU2l6ZTo1MTIsc291cmNlOnRoaXMuaWQsZ2VvanNvblZ0T3B0aW9uczp0aGlzLmdlb2pzb25WdE9wdGlvbnN9LGZ1bmN0aW9uKGkpe3JldHVybiBpP3ZvaWQgdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6aX0pOih0aGlzLl9sb2FkZWQ9ITAsdGhpcy5fcHlyYW1pZC5yZWxvYWQoKSx2b2lkIHRoaXMuZmlyZShcImNoYW5nZVwiKSl9LmJpbmQodGhpcykpfSxfbG9hZFRpbGU6ZnVuY3Rpb24oaSl7dmFyIHQ9aS5jb29yZC56PnRoaXMubWF4em9vbT9NYXRoLnBvdygyLGkuY29vcmQuei10aGlzLm1heHpvb20pOjEsZT17dWlkOmkudWlkLGNvb3JkOmkuY29vcmQsem9vbTppLmNvb3JkLnosbWF4Wm9vbTp0aGlzLm1heHpvb20sdGlsZVNpemU6NTEyLHNvdXJjZTp0aGlzLmlkLG92ZXJzY2FsaW5nOnQsYW5nbGU6dGhpcy5tYXAudHJhbnNmb3JtLmFuZ2xlLHBpdGNoOnRoaXMubWFwLnRyYW5zZm9ybS5waXRjaCxjb2xsaXNpb25EZWJ1Zzp0aGlzLm1hcC5jb2xsaXNpb25EZWJ1Z307aS53b3JrZXJJRD10aGlzLmRpc3BhdGNoZXIuc2VuZChcImxvYWQgZ2VvanNvbiB0aWxlXCIsZSxmdW5jdGlvbih0LGUpe2lmKGkudW5sb2FkVmVjdG9yRGF0YSh0aGlzLm1hcC5wYWludGVyKSwhaS5hYm9ydGVkKXtpZih0KXJldHVybiB2b2lkIHRoaXMuZmlyZShcInRpbGUuZXJyb3JcIix7dGlsZTppfSk7aS5sb2FkVmVjdG9yRGF0YShlKSx0aGlzLmZpcmUoXCJ0aWxlLmxvYWRcIix7dGlsZTppfSl9fS5iaW5kKHRoaXMpLHRoaXMud29ya2VySUQpfSxfYWJvcnRUaWxlOmZ1bmN0aW9uKGkpe2kuYWJvcnRlZD0hMH0sX2FkZFRpbGU6ZnVuY3Rpb24oaSl7dGhpcy5maXJlKFwidGlsZS5hZGRcIix7dGlsZTppfSl9LF9yZW1vdmVUaWxlOmZ1bmN0aW9uKGkpe3RoaXMuZmlyZShcInRpbGUucmVtb3ZlXCIse3RpbGU6aX0pfSxfdW5sb2FkVGlsZTpmdW5jdGlvbihpKXtpLnVubG9hZFZlY3RvckRhdGEodGhpcy5tYXAucGFpbnRlciksdGhpcy5nbHlwaEF0bGFzLnJlbW92ZUdseXBocyhpLnVpZCksdGhpcy5kaXNwYXRjaGVyLnNlbmQoXCJyZW1vdmUgdGlsZVwiLHt1aWQ6aS51aWQsc291cmNlOnRoaXMuaWR9LG51bGwsaS53b3JrZXJJRCl9fSk7XG59LHtcIi4uL3V0aWwvZXZlbnRlZFwiOjEwMCxcIi4uL3V0aWwvdXRpbFwiOjEwNixcIi4vc291cmNlXCI6NDMsXCIuL3RpbGVfcHlyYW1pZFwiOjQ2LFwicmVzb2x2ZS11cmxcIjoxNDB9XSw0MDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBHZW9KU09OV3JhcHBlcihlKXt0aGlzLmZlYXR1cmVzPWUsdGhpcy5sZW5ndGg9ZS5sZW5ndGh9ZnVuY3Rpb24gRmVhdHVyZVdyYXBwZXIoZSl7dGhpcy50eXBlPWUudHlwZSx0aGlzLnJhd0dlb21ldHJ5PTE9PT1lLnR5cGU/W2UuZ2VvbWV0cnldOmUuZ2VvbWV0cnksdGhpcy5wcm9wZXJ0aWVzPWUudGFncyx0aGlzLmV4dGVudD00MDk2fXZhciBQb2ludD1yZXF1aXJlKFwicG9pbnQtZ2VvbWV0cnlcIiksVmVjdG9yVGlsZUZlYXR1cmU9cmVxdWlyZShcInZlY3Rvci10aWxlXCIpLlZlY3RvclRpbGVGZWF0dXJlO21vZHVsZS5leHBvcnRzPUdlb0pTT05XcmFwcGVyLEdlb0pTT05XcmFwcGVyLnByb3RvdHlwZS5mZWF0dXJlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgRmVhdHVyZVdyYXBwZXIodGhpcy5mZWF0dXJlc1tlXSl9LEZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS5sb2FkR2VvbWV0cnk9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJhd0dlb21ldHJ5O3RoaXMuZ2VvbWV0cnk9W107Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe2Zvcih2YXIgcj1lW3RdLG89W10sYT0wO2E8ci5sZW5ndGg7YSsrKW8ucHVzaChuZXcgUG9pbnQoclthXVswXSxyW2FdWzFdKSk7dGhpcy5nZW9tZXRyeS5wdXNoKG8pfXJldHVybiB0aGlzLmdlb21ldHJ5fSxGZWF0dXJlV3JhcHBlci5wcm90b3R5cGUuYmJveD1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnl8fHRoaXMubG9hZEdlb21ldHJ5KCk7Zm9yKHZhciBlPXRoaXMuZ2VvbWV0cnksdD0xLzAscj0tKDEvMCksbz0xLzAsYT0tKDEvMCkscD0wO3A8ZS5sZW5ndGg7cCsrKWZvcih2YXIgaT1lW3BdLG49MDtuPGkubGVuZ3RoO24rKyl7dmFyIGg9aVtuXTt0PU1hdGgubWluKHQsaC54KSxyPU1hdGgubWF4KHIsaC54KSxvPU1hdGgubWluKG8saC55KSxhPU1hdGgubWF4KGEsaC55KX1yZXR1cm5bdCxvLHIsYV19LEZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS50b0dlb0pTT049VmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTjtcbn0se1wicG9pbnQtZ2VvbWV0cnlcIjoxMzcsXCJ2ZWN0b3ItdGlsZVwiOjE0NH1dLDQxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEltYWdlU291cmNlKGUpe3RoaXMuY29vcmRpbmF0ZXM9ZS5jb29yZGluYXRlcyxhamF4LmdldEltYWdlKGUudXJsLGZ1bmN0aW9uKGUsdCl7ZXx8KHRoaXMuaW1hZ2U9dCx0aGlzLmltYWdlLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsZnVuY3Rpb24oKXt0aGlzLm1hcC5fcmVyZW5kZXIoKX0uYmluZCh0aGlzKSksdGhpcy5fbG9hZGVkPSEwLHRoaXMubWFwJiYodGhpcy5jcmVhdGVUaWxlKCksdGhpcy5maXJlKFwiY2hhbmdlXCIpKSl9LmJpbmQodGhpcykpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksVGlsZT1yZXF1aXJlKFwiLi90aWxlXCIpLExuZ0xhdD1yZXF1aXJlKFwiLi4vZ2VvL2xuZ19sYXRcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLEV2ZW50ZWQ9cmVxdWlyZShcIi4uL3V0aWwvZXZlbnRlZFwiKSxhamF4PXJlcXVpcmUoXCIuLi91dGlsL2FqYXhcIik7bW9kdWxlLmV4cG9ydHM9SW1hZ2VTb3VyY2UsSW1hZ2VTb3VyY2UucHJvdG90eXBlPXV0aWwuaW5oZXJpdChFdmVudGVkLHtvbkFkZDpmdW5jdGlvbihlKXt0aGlzLm1hcD1lLHRoaXMuaW1hZ2UmJnRoaXMuY3JlYXRlVGlsZSgpfSxjcmVhdGVUaWxlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5tYXAsdD10aGlzLmNvb3JkaW5hdGVzLm1hcChmdW5jdGlvbih0KXt2YXIgaT1MbmdMYXQuY29udmVydCh0KTtyZXR1cm4gZS50cmFuc2Zvcm0ubG9jYXRpb25Db29yZGluYXRlKGkpLnpvb21UbygwKX0pLGk9dXRpbC5nZXRDb29yZGluYXRlc0NlbnRlcih0KSxyPTQwOTYsYT10Lm1hcChmdW5jdGlvbihlKXt2YXIgdD1lLnpvb21UbyhpLnpvb20pO3JldHVybiBuZXcgUG9pbnQoTWF0aC5yb3VuZCgodC5jb2x1bW4taS5jb2x1bW4pKnIpLE1hdGgucm91bmQoKHQucm93LWkucm93KSpyKSl9KSxuPWUucGFpbnRlci5nbCxvPTMyNzY3LHU9bmV3IEludDE2QXJyYXkoW2FbMF0ueCxhWzBdLnksMCwwLGFbMV0ueCxhWzFdLnksbywwLGFbM10ueCxhWzNdLnksMCxvLGFbMl0ueCxhWzJdLnksbyxvXSk7dGhpcy50aWxlPW5ldyBUaWxlLHRoaXMudGlsZS5idWNrZXRzPXt9LHRoaXMudGlsZS5ib3VuZHNCdWZmZXI9bi5jcmVhdGVCdWZmZXIoKSxuLmJpbmRCdWZmZXIobi5BUlJBWV9CVUZGRVIsdGhpcy50aWxlLmJvdW5kc0J1ZmZlciksbi5idWZmZXJEYXRhKG4uQVJSQVlfQlVGRkVSLHUsbi5TVEFUSUNfRFJBVyksdGhpcy5jZW50ZXI9aX0sbG9hZGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW1hZ2UmJnRoaXMuaW1hZ2UuY29tcGxldGV9LHVwZGF0ZTpmdW5jdGlvbigpe30scmVsb2FkOmZ1bmN0aW9uKCl7fSxyZW5kZXI6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLl9sb2FkZWQmJnRoaXMubG9hZGVkKCkpe3ZhciBpPXRoaXMuY2VudGVyO3RoaXMudGlsZS5jYWxjdWxhdGVNYXRyaWNlcyhpLnpvb20saS5jb2x1bW4saS5yb3csdGhpcy5tYXAudHJhbnNmb3JtLHQpO3ZhciByPXQuZ2w7dGhpcy50aWxlLnRleHR1cmU/KHIuYmluZFRleHR1cmUoci5URVhUVVJFXzJELHRoaXMudGlsZS50ZXh0dXJlKSxyLnRleFN1YkltYWdlMkQoci5URVhUVVJFXzJELDAsMCwwLHIuUkdCQSxyLlVOU0lHTkVEX0JZVEUsdGhpcy5pbWFnZSkpOih0aGlzLnRpbGUudGV4dHVyZT1yLmNyZWF0ZVRleHR1cmUoKSxyLmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8yRCx0aGlzLnRpbGUudGV4dHVyZSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfV1JBUF9TLHIuQ0xBTVBfVE9fRURHRSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfV1JBUF9ULHIuQ0xBTVBfVE9fRURHRSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfTUlOX0ZJTFRFUixyLkxJTkVBUiksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfTUFHX0ZJTFRFUixyLkxJTkVBUiksci50ZXhJbWFnZTJEKHIuVEVYVFVSRV8yRCwwLHIuUkdCQSxyLlJHQkEsci5VTlNJR05FRF9CWVRFLHRoaXMuaW1hZ2UpKSx0LmRyYXdMYXllcnMoZSx0aGlzLnRpbGUucG9zTWF0cml4LHRoaXMudGlsZSl9fSxmZWF0dXJlc0F0OmZ1bmN0aW9uKGUsdCxpKXtyZXR1cm4gaShudWxsLFtdKX19KTtcbn0se1wiLi4vZ2VvL2xuZ19sYXRcIjoyMCxcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9ldmVudGVkXCI6MTAwLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi90aWxlXCI6NDQsXCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDQyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFJhc3RlclRpbGVTb3VyY2UoZSl7dXRpbC5leHRlbmQodGhpcyx1dGlsLnBpY2soZSxbXCJ1cmxcIixcInRpbGVTaXplXCJdKSksU291cmNlLl9sb2FkVGlsZUpTT04uY2FsbCh0aGlzLGUpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksYWpheD1yZXF1aXJlKFwiLi4vdXRpbC9hamF4XCIpLEV2ZW50ZWQ9cmVxdWlyZShcIi4uL3V0aWwvZXZlbnRlZFwiKSxTb3VyY2U9cmVxdWlyZShcIi4vc291cmNlXCIpLG5vcm1hbGl6ZVVSTD1yZXF1aXJlKFwiLi4vdXRpbC9tYXBib3hcIikubm9ybWFsaXplVGlsZVVSTDttb2R1bGUuZXhwb3J0cz1SYXN0ZXJUaWxlU291cmNlLFJhc3RlclRpbGVTb3VyY2UucHJvdG90eXBlPXV0aWwuaW5oZXJpdChFdmVudGVkLHttaW56b29tOjAsbWF4em9vbToyMixyb3VuZFpvb206ITAsdGlsZVNpemU6NTEyLF9sb2FkZWQ6ITEsb25BZGQ6ZnVuY3Rpb24oZSl7dGhpcy5tYXA9ZX0sbG9hZGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B5cmFtaWQmJnRoaXMuX3B5cmFtaWQubG9hZGVkKCl9LHVwZGF0ZTpmdW5jdGlvbihlKXt0aGlzLl9weXJhbWlkJiZ0aGlzLl9weXJhbWlkLnVwZGF0ZSh0aGlzLnVzZWQsZSx0aGlzLm1hcC5zdHlsZS5yYXN0ZXJGYWRlRHVyYXRpb24pfSxyZWxvYWQ6ZnVuY3Rpb24oKXt9LHJlbmRlcjpTb3VyY2UuX3JlbmRlclRpbGVzLF9sb2FkVGlsZTpmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQsaSl7aWYoZGVsZXRlIGUucmVxdWVzdCwhZS5hYm9ydGVkKXtpZih0KXJldHVybiB2b2lkIHRoaXMuZmlyZShcInRpbGUuZXJyb3JcIix7dGlsZTplfSk7dmFyIHI9dGhpcy5tYXAucGFpbnRlci5nbDtlLnRleHR1cmU9dGhpcy5tYXAucGFpbnRlci5nZXRUZXh0dXJlKGkud2lkdGgpLGUudGV4dHVyZT8oci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsZS50ZXh0dXJlKSxyLnRleFN1YkltYWdlMkQoci5URVhUVVJFXzJELDAsMCwwLHIuUkdCQSxyLlVOU0lHTkVEX0JZVEUsaSkpOihlLnRleHR1cmU9ci5jcmVhdGVUZXh0dXJlKCksci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsZS50ZXh0dXJlKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NSU5fRklMVEVSLHIuTElORUFSX01JUE1BUF9ORUFSRVNUKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NQUdfRklMVEVSLHIuTElORUFSKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Msci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Qsci5DTEFNUF9UT19FREdFKSxyLnRleEltYWdlMkQoci5URVhUVVJFXzJELDAsci5SR0JBLHIuUkdCQSxyLlVOU0lHTkVEX0JZVEUsaSksZS50ZXh0dXJlLnNpemU9aS53aWR0aCksci5nZW5lcmF0ZU1pcG1hcChyLlRFWFRVUkVfMkQpLGUudGltZUFkZGVkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMubWFwLmFuaW1hdGlvbkxvb3Auc2V0KHRoaXMuc3R5bGUucmFzdGVyRmFkZUR1cmF0aW9uKSxlLnNvdXJjZT10aGlzLGUubG9hZGVkPSEwLHRoaXMuZmlyZShcInRpbGUubG9hZFwiLHt0aWxlOmV9KX19dmFyIGk9bm9ybWFsaXplVVJMKGUuY29vcmQudXJsKHRoaXMudGlsZXMpLHRoaXMudXJsKTtlLnJlcXVlc3Q9YWpheC5nZXRJbWFnZShpLHQuYmluZCh0aGlzKSl9LF9hYm9ydFRpbGU6ZnVuY3Rpb24oZSl7ZS5hYm9ydGVkPSEwLGUucmVxdWVzdCYmKGUucmVxdWVzdC5hYm9ydCgpLGRlbGV0ZSBlLnJlcXVlc3QpfSxfYWRkVGlsZTpmdW5jdGlvbihlKXt0aGlzLmZpcmUoXCJ0aWxlLmFkZFwiLHt0aWxlOmV9KX0sX3JlbW92ZVRpbGU6ZnVuY3Rpb24oZSl7dGhpcy5maXJlKFwidGlsZS5yZW1vdmVcIix7dGlsZTplfSl9LF91bmxvYWRUaWxlOmZ1bmN0aW9uKGUpe2UudGV4dHVyZSYmdGhpcy5tYXAucGFpbnRlci5zYXZlVGV4dHVyZShlLnRleHR1cmUpfSxmZWF0dXJlc0F0OmZ1bmN0aW9uKGUsdCxpKXtpKG51bGwsW10pfSxmZWF0dXJlc0luOmZ1bmN0aW9uKGUsdCxpKXtpKG51bGwsW10pfX0pO1xufSx7XCIuLi91dGlsL2FqYXhcIjo5NCxcIi4uL3V0aWwvZXZlbnRlZFwiOjEwMCxcIi4uL3V0aWwvbWFwYm94XCI6MTAzLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9zb3VyY2VcIjo0M31dLDQzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksYWpheD1yZXF1aXJlKFwiLi4vdXRpbC9hamF4XCIpLGJyb3dzZXI9cmVxdWlyZShcIi4uL3V0aWwvYnJvd3NlclwiKSxUaWxlUHlyYW1pZD1yZXF1aXJlKFwiLi90aWxlX3B5cmFtaWRcIiksVGlsZUNvb3JkPXJlcXVpcmUoXCIuL3RpbGVfY29vcmRcIiksbm9ybWFsaXplVVJMPXJlcXVpcmUoXCIuLi91dGlsL21hcGJveFwiKS5ub3JtYWxpemVTb3VyY2VVUkw7ZXhwb3J0cy5fbG9hZFRpbGVKU09OPWZ1bmN0aW9uKGkpe3ZhciBlPWZ1bmN0aW9uKGkpe3RoaXMuX3B5cmFtaWQ9bmV3IFRpbGVQeXJhbWlkKHtpbmRleDppLHRpbGVTaXplOnRoaXMudGlsZVNpemUsY2FjaGVTaXplOjIwLG1pbnpvb206dGhpcy5taW56b29tLG1heHpvb206dGhpcy5tYXh6b29tLHJvdW5kWm9vbTp0aGlzLnJvdW5kWm9vbSxyZXBhcnNlT3ZlcnNjYWxlZDp0aGlzLnJlcGFyc2VPdmVyc2NhbGVkLGxvYWQ6dGhpcy5fbG9hZFRpbGUuYmluZCh0aGlzKSxhYm9ydDp0aGlzLl9hYm9ydFRpbGUuYmluZCh0aGlzKSx1bmxvYWQ6dGhpcy5fdW5sb2FkVGlsZS5iaW5kKHRoaXMpLGFkZDp0aGlzLl9hZGRUaWxlLmJpbmQodGhpcykscmVtb3ZlOnRoaXMuX3JlbW92ZVRpbGUuYmluZCh0aGlzKSxyZWRvUGxhY2VtZW50OnRoaXMuX3JlZG9UaWxlUGxhY2VtZW50P3RoaXMuX3JlZG9UaWxlUGxhY2VtZW50LmJpbmQodGhpcyk6dm9pZCAwfSl9LmJpbmQodGhpcykscj1mdW5jdGlvbihpLHIpe3JldHVybiBpP3ZvaWQgdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6aX0pOih1dGlsLmV4dGVuZCh0aGlzLHV0aWwucGljayhyLFtcInRpbGVzXCIsXCJtaW56b29tXCIsXCJtYXh6b29tXCIsXCJhdHRyaWJ1dGlvblwiXSkpLHZvaWQoci5pbmRleD9hamF4LmdldEpTT04obm9ybWFsaXplVVJMKHIuaW5kZXgpLGZ1bmN0aW9uKGkscil7cmV0dXJuIGk/dm9pZCB0aGlzLmZpcmUoXCJlcnJvclwiLHtlcnJvcjppfSk6KGUoci5pbmRleCksdm9pZCB0aGlzLmZpcmUoXCJsb2FkXCIpKX0uYmluZCh0aGlzKSk6KGUoKSx0aGlzLmZpcmUoXCJsb2FkXCIpKSkpfS5iaW5kKHRoaXMpO2kudXJsP2FqYXguZ2V0SlNPTihub3JtYWxpemVVUkwoaS51cmwpLHIpOmJyb3dzZXIuZnJhbWUoci5iaW5kKHRoaXMsbnVsbCxpKSl9LGV4cG9ydHMuX3JlbmRlclRpbGVzPWZ1bmN0aW9uKGksZSl7aWYodGhpcy5fcHlyYW1pZClmb3IodmFyIHI9dGhpcy5fcHlyYW1pZC5yZW5kZXJlZElEcygpLHQ9MDt0PHIubGVuZ3RoO3QrKyl7dmFyIG89dGhpcy5fcHlyYW1pZC5nZXRUaWxlKHJbdF0pLG49VGlsZUNvb3JkLmZyb21JRChyW3RdKSxhPW4ueixzPW4ueCxsPW4ueSxkPW4udzthPU1hdGgubWluKGEsdGhpcy5tYXh6b29tKSwoby50aWxlRXh0ZW50PjQwOTZ8fG8ucGFyZW50SWQpJiYoby50aWxlRXh0ZW50PTQwOTYpLHMrPWQqKDE8PGEpLG8uY2FsY3VsYXRlTWF0cmljZXMoYSxzLGwsZS50cmFuc2Zvcm0sZSksZS5kcmF3VGlsZShvLGkpfX0sZXhwb3J0cy5fdmVjdG9yRmVhdHVyZXNBdD1mdW5jdGlvbihpLGUscil7aWYoIXRoaXMuX3B5cmFtaWQpcmV0dXJuIHIobnVsbCxbXSk7dmFyIHQ9dGhpcy5fcHlyYW1pZC50aWxlQXQoaSk7cmV0dXJuIHQ/dm9pZCB0aGlzLmRpc3BhdGNoZXIuc2VuZChcInF1ZXJ5IGZlYXR1cmVzXCIse3VpZDp0LnRpbGUudWlkLHg6dC54LHk6dC55LHRpbGVFeHRlbnQ6dC50aWxlLnRpbGVFeHRlbnQsc2NhbGU6dC5zY2FsZSxzb3VyY2U6dGhpcy5pZCxwYXJhbXM6ZX0scix0LnRpbGUud29ya2VySUQpOnIobnVsbCxbXSl9LGV4cG9ydHMuX3ZlY3RvckZlYXR1cmVzSW49ZnVuY3Rpb24oaSxlLHIpe2lmKCF0aGlzLl9weXJhbWlkKXJldHVybiByKG51bGwsW10pO3ZhciB0PXRoaXMuX3B5cmFtaWQudGlsZXNJbihpKTtyZXR1cm4gdD92b2lkIHV0aWwuYXN5bmNBbGwodCxmdW5jdGlvbihpLHIpe3RoaXMuZGlzcGF0Y2hlci5zZW5kKFwicXVlcnkgZmVhdHVyZXNcIix7dWlkOmkudGlsZS51aWQsc291cmNlOnRoaXMuaWQsbWluWDppLm1pblgsbWF4WDppLm1heFgsbWluWTppLm1pblksbWF4WTppLm1heFkscGFyYW1zOmV9LHIsaS50aWxlLndvcmtlcklEKX0uYmluZCh0aGlzKSxmdW5jdGlvbihpLGUpe3IoaSxBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGUpKX0pOnIobnVsbCxbXSl9LGV4cG9ydHMuY3JlYXRlPWZ1bmN0aW9uKGkpe3ZhciBlPXt2ZWN0b3I6cmVxdWlyZShcIi4vdmVjdG9yX3RpbGVfc291cmNlXCIpLHJhc3RlcjpyZXF1aXJlKFwiLi9yYXN0ZXJfdGlsZV9zb3VyY2VcIiksZ2VvanNvbjpyZXF1aXJlKFwiLi9nZW9qc29uX3NvdXJjZVwiKSx2aWRlbzpyZXF1aXJlKFwiLi92aWRlb19zb3VyY2VcIiksaW1hZ2U6cmVxdWlyZShcIi4vaW1hZ2Vfc291cmNlXCIpfTtmb3IodmFyIHIgaW4gZSlpZihpIGluc3RhbmNlb2YgZVtyXSlyZXR1cm4gaTtyZXR1cm4gbmV3IGVbaS50eXBlXShpKX07XG59LHtcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9icm93c2VyXCI6OTUsXCIuLi91dGlsL21hcGJveFwiOjEwMyxcIi4uL3V0aWwvdXRpbFwiOjEwNixcIi4vZ2VvanNvbl9zb3VyY2VcIjozOSxcIi4vaW1hZ2Vfc291cmNlXCI6NDEsXCIuL3Jhc3Rlcl90aWxlX3NvdXJjZVwiOjQyLFwiLi90aWxlX2Nvb3JkXCI6NDUsXCIuL3RpbGVfcHlyYW1pZFwiOjQ2LFwiLi92ZWN0b3JfdGlsZV9zb3VyY2VcIjo0NyxcIi4vdmlkZW9fc291cmNlXCI6NDh9XSw0NDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBUaWxlKHQsZSl7dGhpcy5jb29yZD10LHRoaXMudWlkPXV0aWwudW5pcXVlSWQoKSx0aGlzLmxvYWRlZD0hMSx0aGlzLnVzZXM9MCx0aGlzLnRpbGVTaXplPWV9dmFyIGdsbWF0cml4PXJlcXVpcmUoXCJnbC1tYXRyaXhcIiksbWF0Mj1nbG1hdHJpeC5tYXQyLG1hdDQ9Z2xtYXRyaXgubWF0NCx1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksQnVmZmVyU2V0PXJlcXVpcmUoXCIuLi9kYXRhL2J1ZmZlci9idWZmZXJfc2V0XCIpO21vZHVsZS5leHBvcnRzPVRpbGUsVGlsZS5wcm90b3R5cGU9e3RpbGVFeHRlbnQ6NDA5NixjYWxjdWxhdGVNYXRyaWNlczpmdW5jdGlvbih0LGUsaSxyKXt2YXIgcz1NYXRoLnBvdygyLHQpLG89ci53b3JsZFNpemUvczt0aGlzLnNjYWxlPW8sdGhpcy5wb3NNYXRyaXg9bmV3IEZsb2F0NjRBcnJheSgxNiksbWF0NC5pZGVudGl0eSh0aGlzLnBvc01hdHJpeCksbWF0NC50cmFuc2xhdGUodGhpcy5wb3NNYXRyaXgsdGhpcy5wb3NNYXRyaXgsW2UqbyxpKm8sMF0pLG1hdDQuc2NhbGUodGhpcy5wb3NNYXRyaXgsdGhpcy5wb3NNYXRyaXgsW28vdGhpcy50aWxlRXh0ZW50LG8vdGhpcy50aWxlRXh0ZW50LDFdKSxtYXQ0Lm11bHRpcGx5KHRoaXMucG9zTWF0cml4LHIuZ2V0UHJvak1hdHJpeCgpLHRoaXMucG9zTWF0cml4KSx0aGlzLmV4TWF0cml4PW1hdDQuY3JlYXRlKCksbWF0NC5vcnRobyh0aGlzLmV4TWF0cml4LDAsci53aWR0aCxyLmhlaWdodCwwLDAsLTEpLHRoaXMucm90YXRpb25NYXRyaXg9bWF0Mi5jcmVhdGUoKSxtYXQyLnJvdGF0ZSh0aGlzLnJvdGF0aW9uTWF0cml4LHRoaXMucm90YXRpb25NYXRyaXgsci5hbmdsZSksdGhpcy5wb3NNYXRyaXg9bmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvc01hdHJpeCl9LHBvc2l0aW9uQXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD10Lnpvb21UbyhNYXRoLm1pbih0aGlzLmNvb3JkLnosZSkpLHt4Oih0LmNvbHVtbi10aGlzLmNvb3JkLngpKnRoaXMudGlsZUV4dGVudCx5Oih0LnJvdy10aGlzLmNvb3JkLnkpKnRoaXMudGlsZUV4dGVudCxzY2FsZTp0aGlzLnNjYWxlfX0sbG9hZFZlY3RvckRhdGE6ZnVuY3Rpb24odCl7dGhpcy5sb2FkZWQ9ITAsdCYmKHRoaXMuYnVmZmVycz1uZXcgQnVmZmVyU2V0KHQuYnVmZmVycyksdGhpcy5lbGVtZW50R3JvdXBzPXQuZWxlbWVudEdyb3Vwcyx0aGlzLnRpbGVFeHRlbnQ9dC5leHRlbnQpfSxyZWxvYWRTeW1ib2xEYXRhOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5idWZmZXJzKXt0aGlzLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXguZGVzdHJveShlLmdsKSx0aGlzLmJ1ZmZlcnMuZ2x5cGhFbGVtZW50LmRlc3Ryb3koZS5nbCksdGhpcy5idWZmZXJzLmljb25WZXJ0ZXguZGVzdHJveShlLmdsKSx0aGlzLmJ1ZmZlcnMuaWNvbkVsZW1lbnQuZGVzdHJveShlLmdsKSx0aGlzLmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4LmRlc3Ryb3koZS5nbCk7dmFyIGk9bmV3IEJ1ZmZlclNldCh0LmJ1ZmZlcnMpO3RoaXMuYnVmZmVycy5nbHlwaFZlcnRleD1pLmdseXBoVmVydGV4LHRoaXMuYnVmZmVycy5nbHlwaEVsZW1lbnQ9aS5nbHlwaEVsZW1lbnQsdGhpcy5idWZmZXJzLmljb25WZXJ0ZXg9aS5pY29uVmVydGV4LHRoaXMuYnVmZmVycy5pY29uRWxlbWVudD1pLmljb25FbGVtZW50LHRoaXMuYnVmZmVycy5jb2xsaXNpb25Cb3hWZXJ0ZXg9aS5jb2xsaXNpb25Cb3hWZXJ0ZXg7Zm9yKHZhciByIGluIHQuZWxlbWVudEdyb3Vwcyl0aGlzLmVsZW1lbnRHcm91cHNbcl09dC5lbGVtZW50R3JvdXBzW3JdfX0sdW5sb2FkVmVjdG9yRGF0YTpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcy5idWZmZXJzKXRoaXMuYnVmZmVyc1tlXS5kZXN0cm95KHQuZ2wpO3RoaXMuYnVmZmVycz1udWxsfX07XG59LHtcIi4uL2RhdGEvYnVmZmVyL2J1ZmZlcl9zZXRcIjoyLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiZ2wtbWF0cml4XCI6MTE2fV0sNDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gVGlsZUNvb3JkKHQsaSxvLHIpe2lzTmFOKHIpJiYocj0wKSx0aGlzLno9K3QsdGhpcy54PStpLHRoaXMueT0rbyx0aGlzLnc9K3Iscio9MiwwPnImJihyPS0xKnItMSk7dmFyIGU9MTw8dGhpcy56O3RoaXMuaWQ9MzIqKGUqZSpyK2UqdGhpcy55K3RoaXMueCkrdGhpcy56fWZ1bmN0aW9uIGVkZ2UodCxpKXtpZih0LnJvdz5pLnJvdyl7dmFyIG89dDt0PWksaT1vfXJldHVybnt4MDp0LmNvbHVtbix5MDp0LnJvdyx4MTppLmNvbHVtbix5MTppLnJvdyxkeDppLmNvbHVtbi10LmNvbHVtbixkeTppLnJvdy10LnJvd319ZnVuY3Rpb24gc2NhblNwYW5zKHQsaSxvLHIsZSl7dmFyIG49TWF0aC5tYXgobyxNYXRoLmZsb29yKGkueTApKSxoPU1hdGgubWluKHIsTWF0aC5jZWlsKGkueTEpKTtpZih0LngwPT09aS54MCYmdC55MD09PWkueTA/dC54MCtpLmR5L3QuZHkqdC5keDxpLngxOnQueDEtaS5keS90LmR5KnQuZHg8aS54MCl7dmFyIHM9dDt0PWksaT1zfWZvcih2YXIgZD10LmR4L3QuZHksYT1pLmR4L2kuZHksbD10LmR4PjAseT1pLmR4PDAseD1uO2g+eDt4Kyspe3ZhciBjPWQqTWF0aC5tYXgoMCxNYXRoLm1pbih0LmR5LHgrbC10LnkwKSkrdC54MCx1PWEqTWF0aC5tYXgoMCxNYXRoLm1pbihpLmR5LHgreS1pLnkwKSkraS54MDtlKE1hdGguZmxvb3IodSksTWF0aC5jZWlsKGMpLHgpfX1mdW5jdGlvbiBzY2FuVHJpYW5nbGUodCxpLG8scixlLG4pe3ZhciBoLHM9ZWRnZSh0LGkpLGQ9ZWRnZShpLG8pLGE9ZWRnZShvLHQpO3MuZHk+ZC5keSYmKGg9cyxzPWQsZD1oKSxzLmR5PmEuZHkmJihoPXMscz1hLGE9aCksZC5keT5hLmR5JiYoaD1kLGQ9YSxhPWgpLHMuZHkmJnNjYW5TcGFucyhhLHMscixlLG4pLGQuZHkmJnNjYW5TcGFucyhhLGQscixlLG4pfW1vZHVsZS5leHBvcnRzPVRpbGVDb29yZCxUaWxlQ29vcmQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueitcIi9cIit0aGlzLngrXCIvXCIrdGhpcy55fSxUaWxlQ29vcmQuZnJvbUlEPWZ1bmN0aW9uKHQpe3ZhciBpPXQlMzIsbz0xPDxpLHI9KHQtaSkvMzIsZT1yJW8sbj0oci1lKS9vJW8saD1NYXRoLmZsb29yKHIvKG8qbykpO3JldHVybiBoJTIhPT0wJiYoaD0tMSpoLTEpLGgvPTIsbmV3IFRpbGVDb29yZChpLGUsbixoKX0sVGlsZUNvb3JkLnByb3RvdHlwZS51cmw9ZnVuY3Rpb24odCxpKXtyZXR1cm4gdFsodGhpcy54K3RoaXMueSkldC5sZW5ndGhdLnJlcGxhY2UoXCJ7cHJlZml4fVwiLCh0aGlzLnglMTYpLnRvU3RyaW5nKDE2KSsodGhpcy55JTE2KS50b1N0cmluZygxNikpLnJlcGxhY2UoXCJ7en1cIixNYXRoLm1pbih0aGlzLnosaXx8dGhpcy56KSkucmVwbGFjZShcInt4fVwiLHRoaXMueCkucmVwbGFjZShcInt5fVwiLHRoaXMueSl9LFRpbGVDb29yZC5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy56P251bGw6dGhpcy56PnQ/bmV3IFRpbGVDb29yZCh0aGlzLnotMSx0aGlzLngsdGhpcy55LHRoaXMudyk6bmV3IFRpbGVDb29yZCh0aGlzLnotMSxNYXRoLmZsb29yKHRoaXMueC8yKSxNYXRoLmZsb29yKHRoaXMueS8yKSx0aGlzLncpfSxUaWxlQ29vcmQucHJvdG90eXBlLndyYXBwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFRpbGVDb29yZCh0aGlzLnosdGhpcy54LHRoaXMueSwwKX0sVGlsZUNvb3JkLnByb3RvdHlwZS5jaGlsZHJlbj1mdW5jdGlvbih0KXtpZih0aGlzLno+PXQpcmV0dXJuW25ldyBUaWxlQ29vcmQodGhpcy56KzEsdGhpcy54LHRoaXMueSx0aGlzLncpXTt2YXIgaT10aGlzLnorMSxvPTIqdGhpcy54LHI9Mip0aGlzLnk7cmV0dXJuW25ldyBUaWxlQ29vcmQoaSxvLHIsdGhpcy53KSxuZXcgVGlsZUNvb3JkKGksbysxLHIsdGhpcy53KSxuZXcgVGlsZUNvb3JkKGksbyxyKzEsdGhpcy53KSxuZXcgVGlsZUNvb3JkKGksbysxLHIrMSx0aGlzLncpXX0sVGlsZUNvb3JkLmNvdmVyPWZ1bmN0aW9uKHQsaSxvKXtmdW5jdGlvbiByKHQsaSxyKXt2YXIgaCxzLGQ7aWYocj49MCYmZT49cilmb3IoaD10O2k+aDtoKyspcz0oaCVlK2UpJWUsZD1uZXcgVGlsZUNvb3JkKG8scyxyLE1hdGguZmxvb3IoaC9lKSksbltkLmlkXT1kfXZhciBlPTE8PHQsbj17fTtyZXR1cm4gc2NhblRyaWFuZ2xlKGlbMF0saVsxXSxpWzJdLDAsZSxyKSxzY2FuVHJpYW5nbGUoaVsyXSxpWzNdLGlbMF0sMCxlLHIpLE9iamVjdC5rZXlzKG4pLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gblt0XX0pfTtcbn0se31dLDQ2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFRpbGVQeXJhbWlkKGkpe3RoaXMudGlsZVNpemU9aS50aWxlU2l6ZSx0aGlzLm1pbnpvb209aS5taW56b29tLHRoaXMubWF4em9vbT1pLm1heHpvb20sdGhpcy5yb3VuZFpvb209aS5yb3VuZFpvb20sdGhpcy5yZXBhcnNlT3ZlcnNjYWxlZD1pLnJlcGFyc2VPdmVyc2NhbGVkLHRoaXMuaW5kZXg9aS5pbmRleCx0aGlzLl9sb2FkPWkubG9hZCx0aGlzLl9hYm9ydD1pLmFib3J0LHRoaXMuX3VubG9hZD1pLnVubG9hZCx0aGlzLl9hZGQ9aS5hZGQsdGhpcy5fcmVtb3ZlPWkucmVtb3ZlLHRoaXMuX3JlZG9QbGFjZW1lbnQ9aS5yZWRvUGxhY2VtZW50LHRoaXMuX3RpbGVzPXt9LHRoaXMuX2NhY2hlPW5ldyBDYWNoZShpLmNhY2hlU2l6ZSxmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5fdW5sb2FkKGkpfS5iaW5kKHRoaXMpKX12YXIgVGlsZT1yZXF1aXJlKFwiLi90aWxlXCIpLFRpbGVDb29yZD1yZXF1aXJlKFwiLi90aWxlX2Nvb3JkXCIpLFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKSxDYWNoZT1yZXF1aXJlKFwiLi4vdXRpbC9tcnVfY2FjaGVcIiksdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPVRpbGVQeXJhbWlkLFRpbGVQeXJhbWlkLnByb3RvdHlwZT17bG9hZGVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBpIGluIHRoaXMuX3RpbGVzKWlmKCF0aGlzLl90aWxlc1tpXS5sb2FkZWQpcmV0dXJuITE7cmV0dXJuITB9LG9yZGVyZWRJRHM6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5fdGlsZXMpLnNvcnQoZnVuY3Rpb24oaSxlKXtyZXR1cm4gZSUzMi1pJTMyfSkubWFwKGZ1bmN0aW9uKGkpe3JldHVybitpfSl9LHJlbmRlcmVkSURzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3JkZXJlZElEcygpLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5fdGlsZXNbaV0ubG9hZGVkJiYhdGhpcy5fY292ZXJlZFRpbGVzW2ldfS5iaW5kKHRoaXMpKX0scmVsb2FkOmZ1bmN0aW9uKCl7dGhpcy5fY2FjaGUucmVzZXQoKTtmb3IodmFyIGkgaW4gdGhpcy5fdGlsZXMpdGhpcy5fbG9hZCh0aGlzLl90aWxlc1tpXSl9LGdldFRpbGU6ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMuX3RpbGVzW2ldfSxnZXRab29tOmZ1bmN0aW9uKGkpe3JldHVybiBpLnpvb20rTWF0aC5sb2coaS50aWxlU2l6ZS90aGlzLnRpbGVTaXplKS9NYXRoLkxOMn0sY292ZXJpbmdab29tTGV2ZWw6ZnVuY3Rpb24oaSl7cmV0dXJuKHRoaXMucm91bmRab29tP01hdGgucm91bmQ6TWF0aC5mbG9vcikodGhpcy5nZXRab29tKGkpKX0sY292ZXJpbmdUaWxlczpmdW5jdGlvbihpKXt2YXIgZT10aGlzLmNvdmVyaW5nWm9vbUxldmVsKGkpLHQ9ZTtpZihlPHRoaXMubWluem9vbSlyZXR1cm5bXTtlPnRoaXMubWF4em9vbSYmKGU9dGhpcy5tYXh6b29tKTt2YXIgbz1pLHI9by5sb2NhdGlvbkNvb3JkaW5hdGUoby5jZW50ZXIpLl96b29tVG8oZSksbj1uZXcgUG9pbnQoci5jb2x1bW4tLjUsci5yb3ctLjUpO3JldHVybiBUaWxlQ29vcmQuY292ZXIoZSxbby5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsMCkpLl96b29tVG8oZSksby5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KG8ud2lkdGgsMCkpLl96b29tVG8oZSksby5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KG8ud2lkdGgsby5oZWlnaHQpKS5fem9vbVRvKGUpLG8ucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCgwLG8uaGVpZ2h0KSkuX3pvb21UbyhlKV0sdGhpcy5yZXBhcnNlT3ZlcnNjYWxlZD90OmUpLnNvcnQoZnVuY3Rpb24oaSxlKXtyZXR1cm4gbi5kaXN0KGkpLW4uZGlzdChlKX0pfSxmaW5kTG9hZGVkQ2hpbGRyZW46ZnVuY3Rpb24oaSxlLHQpe2Zvcih2YXIgbz0hMCxyPWkueixuPWkuY2hpbGRyZW4odGhpcy5tYXh6b29tKSxzPTA7czxuLmxlbmd0aDtzKyspe3ZhciBkPW5bc10uaWQ7dGhpcy5fdGlsZXNbZF0mJnRoaXMuX3RpbGVzW2RdLmxvYWRlZD90W2RdPSEwOihvPSExLGU+ciYmdGhpcy5maW5kTG9hZGVkQ2hpbGRyZW4obltzXSxlLHQpKX1yZXR1cm4gb30sZmluZExvYWRlZFBhcmVudDpmdW5jdGlvbihpLGUsdCl7Zm9yKHZhciBvPWkuei0xO28+PWU7by0tKXtpPWkucGFyZW50KHRoaXMubWF4em9vbSk7dmFyIHI9dGhpcy5fdGlsZXNbaS5pZF07aWYociYmci5sb2FkZWQpcmV0dXJuIHRbaS5pZF09ITAscn19LHVwZGF0ZTpmdW5jdGlvbihpLGUsdCl7dmFyIG8scixuLHM9KHRoaXMucm91bmRab29tP01hdGgucm91bmQ6TWF0aC5mbG9vcikodGhpcy5nZXRab29tKGUpKSxkPXV0aWwuY2xhbXAocy0xMCx0aGlzLm1pbnpvb20sdGhpcy5tYXh6b29tKSxoPXV0aWwuY2xhbXAocysxLHRoaXMubWluem9vbSx0aGlzLm1heHpvb20pLGE9e30sbD0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLl9jb3ZlcmVkVGlsZXM9e307dmFyIG09aT90aGlzLmNvdmVyaW5nVGlsZXMoZSk6W107Zm9yKG89MDtvPG0ubGVuZ3RoO28rKylyPW1bb10sbj10aGlzLmFkZFRpbGUociksYVtyLmlkXT0hMCxuLmxvYWRlZHx8dGhpcy5maW5kTG9hZGVkQ2hpbGRyZW4ocixoLGEpfHx0aGlzLmZpbmRMb2FkZWRQYXJlbnQocixkLGEpO2Zvcih2YXIgdSBpbiBhKXI9VGlsZUNvb3JkLmZyb21JRCh1KSxuPXRoaXMuX3RpbGVzW3VdLG4mJm4udGltZUFkZGVkPmwtKHR8fDApJiYodGhpcy5maW5kTG9hZGVkQ2hpbGRyZW4ocixoLGEpPyh0aGlzLl9jb3ZlcmVkVGlsZXNbdV09ITAsYVt1XT0hMCk6dGhpcy5maW5kTG9hZGVkUGFyZW50KHIsZCxhKSk7dmFyIGM9dXRpbC5rZXlzRGlmZmVyZW5jZSh0aGlzLl90aWxlcyxhKTtmb3Iobz0wO288Yy5sZW5ndGg7bysrKXRoaXMucmVtb3ZlVGlsZSgrY1tvXSl9LGFkZFRpbGU6ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcy5fdGlsZXNbaS5pZF07aWYoZSlyZXR1cm4gZTt2YXIgdD1pLndyYXBwZWQoKTtpZihlPXRoaXMuX3RpbGVzW3QuaWRdLGV8fChlPXRoaXMuX2NhY2hlLmdldCh0LmlkKSxlJiZ0aGlzLl9yZWRvUGxhY2VtZW50JiZ0aGlzLl9yZWRvUGxhY2VtZW50KGUpKSwhZSl7dmFyIG89aS56LHI9bz50aGlzLm1heHpvb20/TWF0aC5wb3coMixvLXRoaXMubWF4em9vbSk6MTtlPW5ldyBUaWxlKHQsdGhpcy50aWxlU2l6ZSpyKSx0aGlzLmluZGV4JiYoZS5wYXJlbnRJZD10aGlzLmluZGV4U2VhcmNoKGkuaWQpKSx0aGlzLl9sb2FkKGUpfXJldHVybiBlLnVzZXMrKyx0aGlzLl90aWxlc1tpLmlkXT1lLHRoaXMuX2FkZChlLGkpLGV9LHJlbW92ZVRpbGU6ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcy5fdGlsZXNbaV07ZSYmKGUudXNlcy0tLGRlbGV0ZSB0aGlzLl90aWxlc1tpXSx0aGlzLl9yZW1vdmUoZSksZS51c2VzPjB8fChlLmxvYWRlZD90aGlzLl9jYWNoZS5hZGQoZS5jb29yZC53cmFwcGVkKCkuaWQsZSk6KHRoaXMuX2Fib3J0KGUpLHRoaXMuX3VubG9hZChlKSkpKX0sY2xlYXJUaWxlczpmdW5jdGlvbigpe2Zvcih2YXIgaSBpbiB0aGlzLl90aWxlcyl0aGlzLnJlbW92ZVRpbGUoaSk7dGhpcy5fY2FjaGUucmVzZXQoKX0sdGlsZUF0OmZ1bmN0aW9uKGkpe2Zvcih2YXIgZT10aGlzLm9yZGVyZWRJRHMoKSx0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBvPXRoaXMuX3RpbGVzW2VbdF1dLHI9by5wb3NpdGlvbkF0KGksdGhpcy5tYXh6b29tKTtpZihyJiZyLng+PTAmJnIueDxvLnRpbGVFeHRlbnQmJnIueT49MCYmci55PG8udGlsZUV4dGVudClyZXR1cm57dGlsZTpvLHg6ci54LHk6ci55LHNjYWxlOnIuc2NhbGV9fX0sdGlsZXNJbjpmdW5jdGlvbihpKXtmb3IodmFyIGU9W10sdD10aGlzLm9yZGVyZWRJRHMoKSxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciByPXRoaXMuX3RpbGVzW3Rbb11dLG49W3IucG9zaXRpb25BdChpWzBdLHRoaXMubWF4em9vbSksci5wb3NpdGlvbkF0KGlbMV0sdGhpcy5tYXh6b29tKV07blswXS54PHIudGlsZUV4dGVudCYmblswXS55PHIudGlsZUV4dGVudCYmblsxXS54Pj0wJiZuWzFdLnk+PTAmJmUucHVzaCh7dGlsZTpyLG1pblg6blswXS54LG1heFg6blsxXS54LG1pblk6blswXS55LG1heFk6blsxXS55fSl9cmV0dXJuIGV9LGluZGV4U2VhcmNoOmZ1bmN0aW9uKGkpe2Zvcih2YXIgZT1UaWxlQ29vcmQuZnJvbUlEKGkpLHQ9W2ldLG89ZTswIT09by56OylvPW8ucGFyZW50KCksdC5wdXNoKG8uaWQpO2Zvcih2YXIgcixuPXRoaXMuaW5kZXgscz10LnBvcCgpLGQ9ZnVuY3Rpb24oaSl7cmV0dXJuIGkuaWR9O3QubGVuZ3RoOylpZihpPXQucG9wKCksZT1UaWxlQ29vcmQuZnJvbUlEKHMpLHI9ZS5jaGlsZHJlbih0aGlzLm1heHpvb20pLm1hcChkKS5pbmRleE9mKGkpLG4pe2lmKDA9PT1uW3JdKXtzPWk7YnJlYWt9aWYoMT09PW5bcl0pe3M9aTticmVha31zPWksbj1uW3JdfXJldHVybiAwPT09dC5sZW5ndGg/bnVsbDpzfX07XG59LHtcIi4uL3V0aWwvbXJ1X2NhY2hlXCI6MTA0LFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi90aWxlXCI6NDQsXCIuL3RpbGVfY29vcmRcIjo0NSxcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sNDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gVmVjdG9yVGlsZVNvdXJjZShlKXtpZih1dGlsLmV4dGVuZCh0aGlzLHV0aWwucGljayhlLFtcInVybFwiLFwidGlsZVNpemVcIl0pKSw1MTIhPT10aGlzLnRpbGVTaXplKXRocm93IG5ldyBFcnJvcihcInZlY3RvciB0aWxlIHNvdXJjZXMgbXVzdCBoYXZlIGEgdGlsZVNpemUgb2YgNTEyXCIpO1NvdXJjZS5fbG9hZFRpbGVKU09OLmNhbGwodGhpcyxlKX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpLEV2ZW50ZWQ9cmVxdWlyZShcIi4uL3V0aWwvZXZlbnRlZFwiKSxTb3VyY2U9cmVxdWlyZShcIi4vc291cmNlXCIpLFRpbGVDb29yZD1yZXF1aXJlKFwiLi90aWxlX2Nvb3JkXCIpO21vZHVsZS5leHBvcnRzPVZlY3RvclRpbGVTb3VyY2UsVmVjdG9yVGlsZVNvdXJjZS5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEV2ZW50ZWQse21pbnpvb206MCxtYXh6b29tOjIyLHRpbGVTaXplOjUxMixyZXBhcnNlT3ZlcnNjYWxlZDohMCxfbG9hZGVkOiExLG9uQWRkOmZ1bmN0aW9uKGUpe3RoaXMubWFwPWV9LGxvYWRlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9weXJhbWlkJiZ0aGlzLl9weXJhbWlkLmxvYWRlZCgpfSx1cGRhdGU6ZnVuY3Rpb24oZSl7dGhpcy5fcHlyYW1pZCYmdGhpcy5fcHlyYW1pZC51cGRhdGUodGhpcy51c2VkLGUpfSxyZWxvYWQ6ZnVuY3Rpb24oKXt0aGlzLl9weXJhbWlkJiZ0aGlzLl9weXJhbWlkLnJlbG9hZCgpfSxyZWRvUGxhY2VtZW50OmZ1bmN0aW9uKCl7aWYodGhpcy5fcHlyYW1pZClmb3IodmFyIGU9dGhpcy5fcHlyYW1pZC5vcmRlcmVkSURzKCksaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgdD10aGlzLl9weXJhbWlkLmdldFRpbGUoZVtpXSk7dGhpcy5fcmVkb1RpbGVQbGFjZW1lbnQodCl9fSxyZW5kZXI6U291cmNlLl9yZW5kZXJUaWxlcyxmZWF0dXJlc0F0OlNvdXJjZS5fdmVjdG9yRmVhdHVyZXNBdCxmZWF0dXJlc0luOlNvdXJjZS5fdmVjdG9yRmVhdHVyZXNJbixfbG9hZFRpbGU6ZnVuY3Rpb24oZSl7dmFyIGk9ZS5jb29yZC56PnRoaXMubWF4em9vbT9NYXRoLnBvdygyLGUuY29vcmQuei10aGlzLm1heHpvb20pOjEsdD17dXJsOmUuY29vcmQudXJsKHRoaXMudGlsZXMsdGhpcy5tYXh6b29tKSx1aWQ6ZS51aWQsY29vcmQ6ZS5jb29yZCx6b29tOmUuY29vcmQueixtYXhab29tOnRoaXMubWF4em9vbSx0aWxlU2l6ZTp0aGlzLnRpbGVTaXplKmksc291cmNlOnRoaXMuaWQsb3ZlcnNjYWxpbmc6aSxhbmdsZTp0aGlzLm1hcC50cmFuc2Zvcm0uYW5nbGUscGl0Y2g6dGhpcy5tYXAudHJhbnNmb3JtLnBpdGNoLGNvbGxpc2lvbkRlYnVnOnRoaXMubWFwLmNvbGxpc2lvbkRlYnVnLHBhcmVudElkOmUucGFyZW50SWR9O2UucGFyZW50SWQmJih0LnVybD1UaWxlQ29vcmQuZnJvbUlEKGUucGFyZW50SWQpLnVybCh0aGlzLnRpbGVzLHRoaXMubWF4em9vbSkpLGUud29ya2VySUQ/dGhpcy5kaXNwYXRjaGVyLnNlbmQoXCJyZWxvYWQgdGlsZVwiLHQsdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsZSksZS53b3JrZXJJRCk6ZS53b3JrZXJJRD10aGlzLmRpc3BhdGNoZXIuc2VuZChcImxvYWQgdGlsZVwiLHQsdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsZSkpfSxfdGlsZUxvYWRlZDpmdW5jdGlvbihlLGksdCl7aWYoIWUuYWJvcnRlZCl7aWYoaSlyZXR1cm4gdm9pZCB0aGlzLmZpcmUoXCJ0aWxlLmVycm9yXCIse3RpbGU6ZX0pO2UubG9hZFZlY3RvckRhdGEodCksZS5yZWRvV2hlbkRvbmUmJihlLnJlZG9XaGVuRG9uZT0hMSx0aGlzLl9yZWRvVGlsZVBsYWNlbWVudChlKSksdGhpcy5maXJlKFwidGlsZS5sb2FkXCIse3RpbGU6ZX0pLHRoaXMuZmlyZShcInRpbGUuc3RhdHNcIix0LmJ1Y2tldFN0YXRzKX19LF9hYm9ydFRpbGU6ZnVuY3Rpb24oZSl7ZS5hYm9ydGVkPSEwLHRoaXMuZGlzcGF0Y2hlci5zZW5kKFwiYWJvcnQgdGlsZVwiLHt1aWQ6ZS51aWQsc291cmNlOnRoaXMuaWR9LG51bGwsZS53b3JrZXJJRCl9LF9hZGRUaWxlOmZ1bmN0aW9uKGUpe3RoaXMuZmlyZShcInRpbGUuYWRkXCIse3RpbGU6ZX0pfSxfcmVtb3ZlVGlsZTpmdW5jdGlvbihlKXt0aGlzLmZpcmUoXCJ0aWxlLnJlbW92ZVwiLHt0aWxlOmV9KX0sX3VubG9hZFRpbGU6ZnVuY3Rpb24oZSl7ZS51bmxvYWRWZWN0b3JEYXRhKHRoaXMubWFwLnBhaW50ZXIpLHRoaXMuZ2x5cGhBdGxhcy5yZW1vdmVHbHlwaHMoZS51aWQpLHRoaXMuZGlzcGF0Y2hlci5zZW5kKFwicmVtb3ZlIHRpbGVcIix7dWlkOmUudWlkLHNvdXJjZTp0aGlzLmlkfSxudWxsLGUud29ya2VySUQpfSxfcmVkb1RpbGVQbGFjZW1lbnQ6ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gaShpLHQpe2UucmVsb2FkU3ltYm9sRGF0YSh0LHRoaXMubWFwLnBhaW50ZXIpLHRoaXMuZmlyZShcInRpbGUubG9hZFwiLHt0aWxlOmV9KSxlLnJlZG9pbmdQbGFjZW1lbnQ9ITEsZS5yZWRvV2hlbkRvbmUmJih0aGlzLl9yZWRvVGlsZVBsYWNlbWVudChlKSxlLnJlZG9XaGVuRG9uZT0hMSl9cmV0dXJuIWUubG9hZGVkfHxlLnJlZG9pbmdQbGFjZW1lbnQ/dm9pZChlLnJlZG9XaGVuRG9uZT0hMCk6KGUucmVkb2luZ1BsYWNlbWVudD0hMCx2b2lkIHRoaXMuZGlzcGF0Y2hlci5zZW5kKFwicmVkbyBwbGFjZW1lbnRcIix7dWlkOmUudWlkLHNvdXJjZTp0aGlzLmlkLGFuZ2xlOnRoaXMubWFwLnRyYW5zZm9ybS5hbmdsZSxwaXRjaDp0aGlzLm1hcC50cmFuc2Zvcm0ucGl0Y2gsY29sbGlzaW9uRGVidWc6dGhpcy5tYXAuY29sbGlzaW9uRGVidWd9LGkuYmluZCh0aGlzKSxlLndvcmtlcklEKSl9fSk7XG59LHtcIi4uL3V0aWwvZXZlbnRlZFwiOjEwMCxcIi4uL3V0aWwvdXRpbFwiOjEwNixcIi4vc291cmNlXCI6NDMsXCIuL3RpbGVfY29vcmRcIjo0NX1dLDQ4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFZpZGVvU291cmNlKGUpe3RoaXMuY29vcmRpbmF0ZXM9ZS5jb29yZGluYXRlcyxhamF4LmdldFZpZGVvKGUudXJscyxmdW5jdGlvbihlLHQpe2lmKCFlKXt0aGlzLnZpZGVvPXQsdGhpcy52aWRlby5sb29wPSEwO3ZhciBpO3RoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihcInBsYXlpbmdcIixmdW5jdGlvbigpe2k9dGhpcy5tYXAuc3R5bGUuYW5pbWF0aW9uTG9vcC5zZXQoMS8wKSx0aGlzLm1hcC5fcmVyZW5kZXIoKX0uYmluZCh0aGlzKSksdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKFwicGF1c2VcIixmdW5jdGlvbigpe3RoaXMubWFwLnN0eWxlLmFuaW1hdGlvbkxvb3AuY2FuY2VsKGkpfS5iaW5kKHRoaXMpKSx0aGlzLl9sb2FkZWQ9ITAsdGhpcy5tYXAmJih0aGlzLnZpZGVvLnBsYXkoKSx0aGlzLmNyZWF0ZVRpbGUoKSx0aGlzLmZpcmUoXCJjaGFuZ2VcIikpfX0uYmluZCh0aGlzKSl9dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxUaWxlPXJlcXVpcmUoXCIuL3RpbGVcIiksTG5nTGF0PXJlcXVpcmUoXCIuLi9nZW8vbG5nX2xhdFwiKSxQb2ludD1yZXF1aXJlKFwicG9pbnQtZ2VvbWV0cnlcIiksRXZlbnRlZD1yZXF1aXJlKFwiLi4vdXRpbC9ldmVudGVkXCIpLGFqYXg9cmVxdWlyZShcIi4uL3V0aWwvYWpheFwiKTttb2R1bGUuZXhwb3J0cz1WaWRlb1NvdXJjZSxWaWRlb1NvdXJjZS5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEV2ZW50ZWQse3JvdW5kWm9vbTohMCxnZXRWaWRlbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvfSxvbkFkZDpmdW5jdGlvbihlKXt0aGlzLm1hcD1lLHRoaXMudmlkZW8mJih0aGlzLnZpZGVvLnBsYXkoKSx0aGlzLmNyZWF0ZVRpbGUoKSl9LGNyZWF0ZVRpbGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm1hcCx0PXRoaXMuY29vcmRpbmF0ZXMubWFwKGZ1bmN0aW9uKHQpe3ZhciBpPUxuZ0xhdC5jb252ZXJ0KHQpO3JldHVybiBlLnRyYW5zZm9ybS5sb2NhdGlvbkNvb3JkaW5hdGUoaSkuem9vbVRvKDApfSksaT11dGlsLmdldENvb3JkaW5hdGVzQ2VudGVyKHQpLHI9NDA5NixvPXQubWFwKGZ1bmN0aW9uKGUpe3ZhciB0PWUuem9vbVRvKGkuem9vbSk7cmV0dXJuIG5ldyBQb2ludChNYXRoLnJvdW5kKCh0LmNvbHVtbi1pLmNvbHVtbikqciksTWF0aC5yb3VuZCgodC5yb3ctaS5yb3cpKnIpKX0pLG49ZS5wYWludGVyLmdsLGE9MzI3NjcsdT1uZXcgSW50MTZBcnJheShbb1swXS54LG9bMF0ueSwwLDAsb1sxXS54LG9bMV0ueSxhLDAsb1szXS54LG9bM10ueSwwLGEsb1syXS54LG9bMl0ueSxhLGFdKTt0aGlzLnRpbGU9bmV3IFRpbGUsdGhpcy50aWxlLmJ1Y2tldHM9e30sdGhpcy50aWxlLmJvdW5kc0J1ZmZlcj1uLmNyZWF0ZUJ1ZmZlcigpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUix0aGlzLnRpbGUuYm91bmRzQnVmZmVyKSxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsdSxuLlNUQVRJQ19EUkFXKSx0aGlzLmNlbnRlcj1pfSxsb2FkZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlbyYmdGhpcy52aWRlby5yZWFkeVN0YXRlPj0yfSx1cGRhdGU6ZnVuY3Rpb24oKXt9LHJlbG9hZDpmdW5jdGlvbigpe30scmVuZGVyOmZ1bmN0aW9uKGUsdCl7aWYodGhpcy5fbG9hZGVkJiYhKHRoaXMudmlkZW8ucmVhZHlTdGF0ZTwyKSl7dmFyIGk9dGhpcy5jZW50ZXI7dGhpcy50aWxlLmNhbGN1bGF0ZU1hdHJpY2VzKGkuem9vbSxpLmNvbHVtbixpLnJvdyx0aGlzLm1hcC50cmFuc2Zvcm0sdCk7dmFyIHI9dC5nbDt0aGlzLnRpbGUudGV4dHVyZT8oci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsdGhpcy50aWxlLnRleHR1cmUpLHIudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfMkQsMCwwLDAsci5SR0JBLHIuVU5TSUdORURfQllURSx0aGlzLnZpZGVvKSk6KHRoaXMudGlsZS50ZXh0dXJlPXIuY3JlYXRlVGV4dHVyZSgpLHIuYmluZFRleHR1cmUoci5URVhUVVJFXzJELHRoaXMudGlsZS50ZXh0dXJlKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Msci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Qsci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NSU5fRklMVEVSLHIuTElORUFSKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NQUdfRklMVEVSLHIuTElORUFSKSxyLnRleEltYWdlMkQoci5URVhUVVJFXzJELDAsci5SR0JBLHIuUkdCQSxyLlVOU0lHTkVEX0JZVEUsdGhpcy52aWRlbykpLHQuZHJhd0xheWVycyhlLHRoaXMudGlsZS5wb3NNYXRyaXgsdGhpcy50aWxlKX19LGZlYXR1cmVzQXQ6ZnVuY3Rpb24oZSx0LGkpe3JldHVybiBpKG51bGwsW10pfSxmZWF0dXJlc0luOmZ1bmN0aW9uKGUsdCxpKXtyZXR1cm4gaShudWxsLFtdKX19KTtcbn0se1wiLi4vZ2VvL2xuZ19sYXRcIjoyMCxcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9ldmVudGVkXCI6MTAwLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi90aWxlXCI6NDQsXCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDQ5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFdvcmtlcihlKXt0aGlzLnNlbGY9ZSx0aGlzLmFjdG9yPW5ldyBBY3RvcihlLHRoaXMpLHRoaXMubG9hZGluZz17fSx0aGlzLmxvYWRlZD17fSx0aGlzLmxheWVycz1bXSx0aGlzLmdlb0pTT05JbmRleGVzPXt9fXZhciBBY3Rvcj1yZXF1aXJlKFwiLi4vdXRpbC9hY3RvclwiKSxXb3JrZXJUaWxlPXJlcXVpcmUoXCIuL3dvcmtlcl90aWxlXCIpLHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxhamF4PXJlcXVpcmUoXCIuLi91dGlsL2FqYXhcIiksdnQ9cmVxdWlyZShcInZlY3Rvci10aWxlXCIpLFByb3RvYnVmPXJlcXVpcmUoXCJwYmZcIiksVGlsZUNvb3JkPXJlcXVpcmUoXCIuL3RpbGVfY29vcmRcIiksZ2VvanNvbnZ0PXJlcXVpcmUoXCJnZW9qc29uLXZ0XCIpLEdlb0pTT05XcmFwcGVyPXJlcXVpcmUoXCIuL2dlb2pzb25fd3JhcHBlclwiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFdvcmtlcihlKX0sdXRpbC5leHRlbmQoV29ya2VyLnByb3RvdHlwZSx7XCJzZXQgbGF5ZXJzXCI6ZnVuY3Rpb24oZSl7dGhpcy5sYXllcnM9ZX0sXCJsb2FkIHRpbGVcIjpmdW5jdGlvbihlLHIpe2Z1bmN0aW9uIHQodCxzKXtpZihkZWxldGUgdGhpcy5sb2FkaW5nW29dW2ldLHQpcmV0dXJuIHIodCk7aWYoYS5kYXRhPW5ldyB2dC5WZWN0b3JUaWxlKG5ldyBQcm90b2J1ZihuZXcgVWludDhBcnJheShzKSkpLGUucGFyZW50SWQmJmEuZGF0YS5sYXllcnMpe3ZhciBsPXRoaXMuZ2V0Q2hpbGRQb3NpdGlvbihlLmNvb3JkLmlkLGUucGFyZW50SWQpO2EucGFyc2UoYS5kYXRhLHRoaXMubGF5ZXJzLHRoaXMuYWN0b3IscixsLmR6LGwueFBvcyxsLnlQb3MpfWVsc2UgYS5wYXJzZShhLmRhdGEsdGhpcy5sYXllcnMsdGhpcy5hY3RvcixyKTt0aGlzLmxvYWRlZFtvXT10aGlzLmxvYWRlZFtvXXx8e30sdGhpcy5sb2FkZWRbb11baV09YX12YXIgbz1lLnNvdXJjZSxpPWUudWlkO3RoaXMubG9hZGluZ1tvXXx8KHRoaXMubG9hZGluZ1tvXT17fSk7dmFyIGE9dGhpcy5sb2FkaW5nW29dW2ldPW5ldyBXb3JrZXJUaWxlKGUpO2EueGhyPWFqYXguZ2V0QXJyYXlCdWZmZXIoZS51cmwsdC5iaW5kKHRoaXMpKX0sXCJyZWxvYWQgdGlsZVwiOmZ1bmN0aW9uKGUscil7dmFyIHQ9dGhpcy5sb2FkZWRbZS5zb3VyY2VdLG89ZS51aWQ7aWYodCYmdFtvXSl7dmFyIGk9dFtvXTtpLnBhcnNlKGkuZGF0YSx0aGlzLmxheWVycyx0aGlzLmFjdG9yLHIpfX0sXCJhYm9ydCB0aWxlXCI6ZnVuY3Rpb24oZSl7dmFyIHI9dGhpcy5sb2FkaW5nW2Uuc291cmNlXSx0PWUudWlkO3ImJnJbdF0mJihyW3RdLnhoci5hYm9ydCgpLGRlbGV0ZSByW3RdKX0sXCJyZW1vdmUgdGlsZVwiOmZ1bmN0aW9uKGUpe3ZhciByPXRoaXMubG9hZGVkW2Uuc291cmNlXSx0PWUudWlkO3ImJnJbdF0mJmRlbGV0ZSByW3RdfSxcInJlZG8gcGxhY2VtZW50XCI6ZnVuY3Rpb24oZSxyKXt2YXIgdD10aGlzLmxvYWRlZFtlLnNvdXJjZV0sbz10aGlzLmxvYWRpbmdbZS5zb3VyY2VdLGk9ZS51aWQ7aWYodCYmdFtpXSl7dmFyIGE9dFtpXSxzPWEucmVkb1BsYWNlbWVudChlLmFuZ2xlLGUucGl0Y2gsZS5jb2xsaXNpb25EZWJ1Zyk7cy5yZXN1bHQmJnIobnVsbCxzLnJlc3VsdCxzLnRyYW5zZmVyYWJsZXMpfWVsc2UgbyYmb1tpXSYmKG9baV0uYW5nbGU9ZS5hbmdsZSl9LFwicGFyc2UgZ2VvanNvblwiOmZ1bmN0aW9uKGUscil7dmFyIHQ9ZnVuY3Rpb24odCxvKXtyZXR1cm4gdD9yKHQpOih0aGlzLmdlb0pTT05JbmRleGVzW2Uuc291cmNlXT1nZW9qc29udnQobyxlLmdlb2pzb25WdE9wdGlvbnMpLHZvaWQgcihudWxsKSl9LmJpbmQodGhpcyk7XCJzdHJpbmdcIj09dHlwZW9mIGUuZGF0YT9hamF4LmdldEpTT04oZS5kYXRhLHQpOnQobnVsbCxlLmRhdGEpfSxcImxvYWQgZ2VvanNvbiB0aWxlXCI6ZnVuY3Rpb24oZSxyKXt2YXIgdD1lLnNvdXJjZSxvPWUuY29vcmQsaT10aGlzLmdlb0pTT05JbmRleGVzW3RdLmdldFRpbGUoby56LG8ueCxvLnkpO2lmKCFpKXJldHVybiByKG51bGwsbnVsbCk7dmFyIGE9bmV3IFdvcmtlclRpbGUoZSk7YS5wYXJzZShuZXcgR2VvSlNPTldyYXBwZXIoaS5mZWF0dXJlcyksdGhpcy5sYXllcnMsdGhpcy5hY3RvcixyKSx0aGlzLmxvYWRlZFt0XT10aGlzLmxvYWRlZFt0XXx8e30sdGhpcy5sb2FkZWRbdF1bZS51aWRdPWF9LFwicXVlcnkgZmVhdHVyZXNcIjpmdW5jdGlvbihlLHIpe3ZhciB0PXRoaXMubG9hZGVkW2Uuc291cmNlXSYmdGhpcy5sb2FkZWRbZS5zb3VyY2VdW2UudWlkXTt0P3QuZmVhdHVyZVRyZWUucXVlcnkoZSxyKTpyKG51bGwsW10pfSxnZXRDaGlsZFBvc2l0aW9uOmZ1bmN0aW9uKGUscil7dmFyIHQ9VGlsZUNvb3JkLmZyb21JRChlKSxvPVRpbGVDb29yZC5mcm9tSUQociksaT10Lnotby56LGE9dC54JigxPDxpKS0xLHM9dC55JigxPDxpKS0xO3JldHVybntkejppLHhQb3M6YSx5UG9zOnN9fX0pO1xufSx7XCIuLi91dGlsL2FjdG9yXCI6OTMsXCIuLi91dGlsL2FqYXhcIjo5NCxcIi4uL3V0aWwvdXRpbFwiOjEwNixcIi4vZ2VvanNvbl93cmFwcGVyXCI6NDAsXCIuL3RpbGVfY29vcmRcIjo0NSxcIi4vd29ya2VyX3RpbGVcIjo1MCxcImdlb2pzb24tdnRcIjoxMTEsXCJwYmZcIjoxMzYsXCJ2ZWN0b3ItdGlsZVwiOjE0NH1dLDUwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFdvcmtlclRpbGUoZSl7dGhpcy5jb29yZD1lLmNvb3JkLHRoaXMudWlkPWUudWlkLHRoaXMuem9vbT1lLnpvb20sdGhpcy5tYXhab29tPWUubWF4Wm9vbSx0aGlzLnRpbGVTaXplPWUudGlsZVNpemUsdGhpcy5zb3VyY2U9ZS5zb3VyY2UsdGhpcy5vdmVyc2NhbGluZz1lLm92ZXJzY2FsaW5nLHRoaXMuYW5nbGU9ZS5hbmdsZSx0aGlzLnBpdGNoPWUucGl0Y2gsdGhpcy5jb2xsaXNpb25EZWJ1Zz1lLmNvbGxpc2lvbkRlYnVnLHRoaXMuc3RhY2tzPXt9fXZhciBGZWF0dXJlVHJlZT1yZXF1aXJlKFwiLi4vZGF0YS9mZWF0dXJlX3RyZWVcIiksQ29sbGlzaW9uVGlsZT1yZXF1aXJlKFwiLi4vc3ltYm9sL2NvbGxpc2lvbl90aWxlXCIpLEJ1ZmZlclNldD1yZXF1aXJlKFwiLi4vZGF0YS9idWZmZXIvYnVmZmVyX3NldFwiKSxjcmVhdGVCdWNrZXQ9cmVxdWlyZShcIi4uL2RhdGEvY3JlYXRlX2J1Y2tldFwiKTttb2R1bGUuZXhwb3J0cz1Xb3JrZXJUaWxlLFdvcmtlclRpbGUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGUsdCxyLGkscyxvLG4pe2Z1bmN0aW9uIGEoZSx0LHIsaSxzKXtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIG49ZS5mZWF0dXJlKG8pO24uZHo9cixuLnhQb3M9aSxuLnlQb3M9cztmb3IodmFyIGEgaW4gdCl7dmFyIGw9dFthXTtsLmZpbHRlcihuKSYmbC5mZWF0dXJlcy5wdXNoKG4pfX19ZnVuY3Rpb24gbChlKXtyZXR1cm4gZnVuY3Rpb24odCl7ZS5kZXBlbmRlbmNpZXNMb2FkZWQ9ITAsdSh2LGUsdCl9fWZ1bmN0aW9uIHUoZSx0LHIpe2lmKCghdC5nZXREZXBlbmRlbmNpZXN8fHQuZGVwZW5kZW5jaWVzTG9hZGVkKSYmKCF0Lm5lZWRzUGxhY2VtZW50fHx0LnByZXZpb3VzUGxhY2VkKSl7aWYoIXIpe3ZhciBpPURhdGUubm93KCk7dC5mZWF0dXJlcy5sZW5ndGgmJnQuYWRkRmVhdHVyZXMoZyk7dmFyIHM9RGF0ZS5ub3coKS1pO2lmKHQuaW50ZXJhY3RpdmUpZm9yKHZhciBvPTA7bzx0LmZlYXR1cmVzLmxlbmd0aDtvKyspe3ZhciBuPXQuZmVhdHVyZXNbb107ZS5mZWF0dXJlVHJlZS5pbnNlcnQobi5iYm94KCksdC5sYXllcnMsbil9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGYmJihzZWxmLmJ1Y2tldFN0YXRzPXNlbGYuYnVja2V0U3RhdHN8fHtfdG90YWw6MH0sc2VsZi5idWNrZXRTdGF0cy5fdG90YWwrPXMsc2VsZi5idWNrZXRTdGF0c1t0LmlkXT0oc2VsZi5idWNrZXRTdGF0c1t0LmlkXXx8MCkrcyksdC5mZWF0dXJlcz1udWxsfXJldHVybiB3LS0sdz92b2lkKHQubmV4dCYmKHQubmV4dC5wcmV2aW91c1BsYWNlZD0hMCx1KGUsdC5uZXh0KSkpOnZvaWQgZigpfX1mdW5jdGlvbiBmKCl7aWYodi5zdGF0dXM9XCJkb25lXCIsdi5yZWRvUGxhY2VtZW50QWZ0ZXJEb25lKXt2YXIgZT12LnJlZG9QbGFjZW1lbnQodi5hbmdsZSx2LnBpdGNoKS5yZXN1bHQ7bS5nbHlwaFZlcnRleD1lLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXgsbS5pY29uVmVydGV4PWUuYnVmZmVycy5pY29uVmVydGV4LG0uY29sbGlzaW9uQm94VmVydGV4PWUuYnVmZmVycy5jb2xsaXNpb25Cb3hWZXJ0ZXh9dmFyIHQ9W10scj17fTtmb3IoZCBpbiBtKXQucHVzaChtW2RdLmFycmF5KTtmb3IoZCBpbiBiKXJbZF09YltkXS5lbGVtZW50R3JvdXBzO2kobnVsbCx7ZWxlbWVudEdyb3VwczpyLGJ1ZmZlcnM6bSxleHRlbnQ6VCxidWNrZXRTdGF0czpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmLmJ1Y2tldFN0YXRzOm51bGx9LHQpfXRoaXMuc3RhdHVzPVwicGFyc2luZ1wiLHRoaXMuZmVhdHVyZVRyZWU9bmV3IEZlYXR1cmVUcmVlKHRoaXMuY29vcmQsdGhpcy5vdmVyc2NhbGluZyk7dmFyIGMsZCxoLHAsdj10aGlzLG09bmV3IEJ1ZmZlclNldCxnPW5ldyBDb2xsaXNpb25UaWxlKHRoaXMuYW5nbGUsdGhpcy5waXRjaCksYj17fSx4PXRoaXMuYnVja2V0c0luT3JkZXI9W10seT17fTtmb3IoYz0wO2M8dC5sZW5ndGg7YysrKWlmKGg9dFtjXSxoLnNvdXJjZT09PXRoaXMuc291cmNlJiYhaC5yZWYpe3ZhciBrPWgubWluem9vbTtpZighKGsmJnRoaXMuem9vbTxrJiZrPHRoaXMubWF4Wm9vbSkpe3ZhciBQPWgubWF4em9vbTtpZighKFAmJnRoaXMuem9vbT49UCkpe3ZhciBTPWgubGF5b3V0LnZpc2liaWxpdHk7aWYoXCJub25lXCIhPT1TKWlmKHA9Y3JlYXRlQnVja2V0KGgsbSx0aGlzLnpvb20sdGhpcy5vdmVyc2NhbGluZyx0aGlzLmNvbGxpc2lvbkRlYnVnKSxwLmxheWVycz1baC5pZF0sYltwLmlkXT1wLHgucHVzaChwKSxlLmxheWVycyl7dmFyIEQ9aFtcInNvdXJjZS1sYXllclwiXTt5W0RdfHwoeVtEXT17fSkseVtEXVtwLmlkXT1wfWVsc2UgeVtwLmlkXT1wfX19Zm9yKGM9MDtjPHQubGVuZ3RoO2MrKyloPXRbY10saC5zb3VyY2U9PT10aGlzLnNvdXJjZSYmaC5yZWYmJihwPWJbaC5yZWZdLHAmJnAubGF5ZXJzLnB1c2goaC5pZCkpO3ZhciBUPTQwOTY7aWYoZS5sYXllcnMpZm9yKGQgaW4geSloPWUubGF5ZXJzW2RdLGgmJihoLmV4dGVudCYmKFQ9aC5leHRlbnQpLGEoaCx5W2RdLHMsbyxuKSk7ZWxzZSBhKGUseSk7dmFyIHosdz14Lmxlbmd0aDtmb3IoYz14Lmxlbmd0aC0xO2M+PTA7Yy0tKXA9eFtjXSxwLm5lZWRzUGxhY2VtZW50JiYoej96Lm5leHQ9cDpwLnByZXZpb3VzUGxhY2VkPSEwLHo9cCkscC5nZXREZXBlbmRlbmNpZXMmJnAuZ2V0RGVwZW5kZW5jaWVzKHRoaXMscixsKHApKSxwLm5lZWRzUGxhY2VtZW50fHxwLmdldERlcGVuZGVuY2llc3x8dSh2LHApfSxXb3JrZXJUaWxlLnByb3RvdHlwZS5yZWRvUGxhY2VtZW50PWZ1bmN0aW9uKGUsdCxyKXtpZihcImRvbmVcIiE9PXRoaXMuc3RhdHVzKXJldHVybiB0aGlzLnJlZG9QbGFjZW1lbnRBZnRlckRvbmU9ITAsdGhpcy5hbmdsZT1lLHt9O2Zvcih2YXIgaT1uZXcgQnVmZmVyU2V0LHM9W10sbz17fSxuPW5ldyBDb2xsaXNpb25UaWxlKGUsdCksYT10aGlzLmJ1Y2tldHNJbk9yZGVyLGw9YS5sZW5ndGgtMTtsPj0wO2wtLSl7dmFyIHU9YVtsXTtcInN5bWJvbFwiPT09dS50eXBlJiYodS5wbGFjZUZlYXR1cmVzKG4saSxyKSxvW3UuaWRdPXUuZWxlbWVudEdyb3Vwcyl9Zm9yKHZhciBmIGluIGkpcy5wdXNoKGlbZl0uYXJyYXkpO3JldHVybntyZXN1bHQ6e2VsZW1lbnRHcm91cHM6byxidWZmZXJzOml9LHRyYW5zZmVyYWJsZXM6c319O1xufSx7XCIuLi9kYXRhL2J1ZmZlci9idWZmZXJfc2V0XCI6MixcIi4uL2RhdGEvY3JlYXRlX2J1Y2tldFwiOjEzLFwiLi4vZGF0YS9mZWF0dXJlX3RyZWVcIjoxNSxcIi4uL3N5bWJvbC9jb2xsaXNpb25fdGlsZVwiOjY4fV0sNTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQW5pbWF0aW9uTG9vcCgpe3RoaXMubj0wLHRoaXMudGltZXM9W119bW9kdWxlLmV4cG9ydHM9QW5pbWF0aW9uTG9vcCxBbmltYXRpb25Mb29wLnByb3RvdHlwZS5zdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZXM9dGhpcy50aW1lcy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQudGltZT49KG5ldyBEYXRlKS5nZXRUaW1lKCl9KSwhdGhpcy50aW1lcy5sZW5ndGh9LEFuaW1hdGlvbkxvb3AucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lcy5wdXNoKHtpZDp0aGlzLm4sdGltZTp0KyhuZXcgRGF0ZSkuZ2V0VGltZSgpfSksdGhpcy5uKyt9LEFuaW1hdGlvbkxvb3AucHJvdG90eXBlLmNhbmNlbD1mdW5jdGlvbih0KXt0aGlzLnRpbWVzPXRoaXMudGltZXMuZmlsdGVyKGZ1bmN0aW9uKGkpe3JldHVybiBpLmlkIT09dH0pfTtcbn0se31dLDUyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEltYWdlU3ByaXRlKHQpe3RoaXMuYmFzZT10LHRoaXMucmV0aW5hPWJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbz4xO3ZhciBpPXRoaXMucmV0aW5hP1wiQDJ4XCI6XCJcIjthamF4LmdldEpTT04obm9ybWFsaXplVVJMKHQsaSxcIi5qc29uXCIpLGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQ/dm9pZCB0aGlzLmZpcmUoXCJlcnJvclwiLHtlcnJvcjp0fSk6KHRoaXMuZGF0YT1pLHZvaWQodGhpcy5pbWcmJnRoaXMuZmlyZShcImxvYWRcIikpKX0uYmluZCh0aGlzKSksYWpheC5nZXRJbWFnZShub3JtYWxpemVVUkwodCxpLFwiLnBuZ1wiKSxmdW5jdGlvbih0LGkpe2lmKHQpcmV0dXJuIHZvaWQgdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6dH0pO2Zvcih2YXIgZT1pLmdldERhdGEoKSxyPWkuZGF0YT1uZXcgVWludDhBcnJheShlLmxlbmd0aCksYT0wO2E8ZS5sZW5ndGg7YSs9NCl7dmFyIG89ZVthKzNdLzI1NTtyW2ErMF09ZVthKzBdKm8sclthKzFdPWVbYSsxXSpvLHJbYSsyXT1lW2ErMl0qbyxyW2ErM109ZVthKzNdfXRoaXMuaW1nPWksdGhpcy5kYXRhJiZ0aGlzLmZpcmUoXCJsb2FkXCIpfS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBTcHJpdGVQb3NpdGlvbigpe312YXIgRXZlbnRlZD1yZXF1aXJlKFwiLi4vdXRpbC9ldmVudGVkXCIpLGFqYXg9cmVxdWlyZShcIi4uL3V0aWwvYWpheFwiKSxicm93c2VyPXJlcXVpcmUoXCIuLi91dGlsL2Jyb3dzZXJcIiksbm9ybWFsaXplVVJMPXJlcXVpcmUoXCIuLi91dGlsL21hcGJveFwiKS5ub3JtYWxpemVTcHJpdGVVUkw7bW9kdWxlLmV4cG9ydHM9SW1hZ2VTcHJpdGUsSW1hZ2VTcHJpdGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXZlbnRlZCksSW1hZ2VTcHJpdGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJhc2V9LEltYWdlU3ByaXRlLnByb3RvdHlwZS5sb2FkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hKCF0aGlzLmRhdGF8fCF0aGlzLmltZyl9LEltYWdlU3ByaXRlLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXtpZihicm93c2VyLmRldmljZVBpeGVsUmF0aW8+MSE9PXRoaXMucmV0aW5hKXt2YXIgdD1uZXcgSW1hZ2VTcHJpdGUodGhpcy5iYXNlKTt0Lm9uKFwibG9hZFwiLGZ1bmN0aW9uKCl7dGhpcy5pbWc9dC5pbWcsdGhpcy5kYXRhPXQuZGF0YSx0aGlzLnJldGluYT10LnJldGluYX0uYmluZCh0aGlzKSl9fSxTcHJpdGVQb3NpdGlvbi5wcm90b3R5cGU9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MCxwaXhlbFJhdGlvOjEsc2RmOiExfSxJbWFnZVNwcml0ZS5wcm90b3R5cGUuZ2V0U3ByaXRlUG9zaXRpb249ZnVuY3Rpb24odCl7aWYoIXRoaXMubG9hZGVkKCkpcmV0dXJuIG5ldyBTcHJpdGVQb3NpdGlvbjt2YXIgaT10aGlzLmRhdGEmJnRoaXMuZGF0YVt0XTtyZXR1cm4gaSYmdGhpcy5pbWc/aTpuZXcgU3ByaXRlUG9zaXRpb259O1xufSx7XCIuLi91dGlsL2FqYXhcIjo5NCxcIi4uL3V0aWwvYnJvd3NlclwiOjk1LFwiLi4vdXRpbC9ldmVudGVkXCI6MTAwLFwiLi4vdXRpbC9tYXBib3hcIjoxMDN9XSw1MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgcmVmZXJlbmNlPXJlcXVpcmUoXCIuL3JlZmVyZW5jZVwiKTttb2R1bGUuZXhwb3J0cz17fSxyZWZlcmVuY2UubGF5b3V0LmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9ZnVuY3Rpb24oZSl7Zm9yKHZhciByIGluIGUpdGhpc1tyXT1lW3JdfSxvPXJlZmVyZW5jZVtlXTtmb3IodmFyIHQgaW4gbyl2b2lkIDAhPT1vW3RdW1wiZGVmYXVsdFwiXSYmKHIucHJvdG90eXBlW3RdPW9bdF1bXCJkZWZhdWx0XCJdKTttb2R1bGUuZXhwb3J0c1tlLnJlcGxhY2UoXCJsYXlvdXRfXCIsXCJcIildPXJ9KTtcbn0se1wiLi9yZWZlcmVuY2VcIjo1NX1dLDU0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciByZWZlcmVuY2U9cmVxdWlyZShcIi4vcmVmZXJlbmNlXCIpLHBhcnNlQ1NTQ29sb3I9cmVxdWlyZShcImNzc2NvbG9ycGFyc2VyXCIpLnBhcnNlQ1NTQ29sb3I7bW9kdWxlLmV4cG9ydHM9e30scmVmZXJlbmNlLnBhaW50LmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9ZnVuY3Rpb24oKXt9LG89cmVmZXJlbmNlW2VdO2Zvcih2YXIgcCBpbiBvKXt2YXIgdD1vW3BdLGE9dFtcImRlZmF1bHRcIl07dm9pZCAwIT09YSYmKFwiY29sb3JcIj09PXQudHlwZSYmKGE9cGFyc2VDU1NDb2xvcihhKSksci5wcm90b3R5cGVbcF09YSl9ci5wcm90b3R5cGUuaGlkZGVuPSExLG1vZHVsZS5leHBvcnRzW2UucmVwbGFjZShcInBhaW50X1wiLFwiXCIpXT1yfSk7XG59LHtcIi4vcmVmZXJlbmNlXCI6NTUsXCJjc3Njb2xvcnBhcnNlclwiOjEwN31dLDU1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO21vZHVsZS5leHBvcnRzPXJlcXVpcmUoXCJtYXBib3gtZ2wtc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0XCIpO1xufSx7XCJtYXBib3gtZ2wtc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0XCI6MTMxfV0sNTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3R5bGUoZSx0KXt0aGlzLmFuaW1hdGlvbkxvb3A9dHx8bmV3IEFuaW1hdGlvbkxvb3AsdGhpcy5kaXNwYXRjaGVyPW5ldyBEaXNwYXRjaGVyKE1hdGgubWF4KGJyb3dzZXIuaGFyZHdhcmVDb25jdXJyZW5jeS0xLDEpLHRoaXMpLHRoaXMuZ2x5cGhBdGxhcz1uZXcgR2x5cGhBdGxhcygxMDI0LDEwMjQpLHRoaXMuc3ByaXRlQXRsYXM9bmV3IFNwcml0ZUF0bGFzKDUxMiw1MTIpLHRoaXMuc3ByaXRlQXRsYXMucmVzaXplKGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyksdGhpcy5saW5lQXRsYXM9bmV3IExpbmVBdGxhcygyNTYsNTEyKSx0aGlzLl9sYXllcnM9e30sdGhpcy5fb3JkZXI9W10sdGhpcy5fZ3JvdXBzPVtdLHRoaXMuc291cmNlcz17fSx0aGlzLnpvb21IaXN0b3J5PXt9LHV0aWwuYmluZEFsbChbXCJfZm9yd2FyZFNvdXJjZUV2ZW50XCIsXCJfZm9yd2FyZFRpbGVFdmVudFwiLFwiX3JlZG9QbGFjZW1lbnRcIl0sdGhpcyk7dmFyIHI9ZnVuY3Rpb24oZSx0KXtpZihlKXJldHVybiB2b2lkIHRoaXMuZmlyZShcImVycm9yXCIse2Vycm9yOmV9KTt2YXIgcj12YWxpZGF0ZSh0KTtpZihyLmxlbmd0aClmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKyl0aGlzLmZpcmUoXCJlcnJvclwiLHtlcnJvcjpuZXcgRXJyb3IocltpXS5tZXNzYWdlKX0pO2Vsc2V7dGhpcy5fbG9hZGVkPSEwLHRoaXMuc3R5bGVzaGVldD10O3ZhciBzPXQuc291cmNlcztmb3IodmFyIG8gaW4gcyl0aGlzLmFkZFNvdXJjZShvLHNbb10pO3Quc3ByaXRlJiYodGhpcy5zcHJpdGU9bmV3IEltYWdlU3ByaXRlKHQuc3ByaXRlKSx0aGlzLnNwcml0ZS5vbihcImxvYWRcIix0aGlzLmZpcmUuYmluZCh0aGlzLFwiY2hhbmdlXCIpKSksdGhpcy5nbHlwaFNvdXJjZT1uZXcgR2x5cGhTb3VyY2UodC5nbHlwaHMsdGhpcy5nbHlwaEF0bGFzKSx0aGlzLl9yZXNvbHZlKCksdGhpcy5maXJlKFwibG9hZFwiKX19LmJpbmQodGhpcyk7XCJzdHJpbmdcIj09dHlwZW9mIGU/YWpheC5nZXRKU09OKG5vcm1hbGl6ZVVSTChlKSxyKTpicm93c2VyLmZyYW1lKHIuYmluZCh0aGlzLG51bGwsZSkpfXZhciBFdmVudGVkPXJlcXVpcmUoXCIuLi91dGlsL2V2ZW50ZWRcIiksc3R5bGVCYXRjaD1yZXF1aXJlKFwiLi9zdHlsZV9iYXRjaFwiKSxTdHlsZUxheWVyPXJlcXVpcmUoXCIuL3N0eWxlX2xheWVyXCIpLEltYWdlU3ByaXRlPXJlcXVpcmUoXCIuL2ltYWdlX3Nwcml0ZVwiKSxHbHlwaFNvdXJjZT1yZXF1aXJlKFwiLi4vc3ltYm9sL2dseXBoX3NvdXJjZVwiKSxHbHlwaEF0bGFzPXJlcXVpcmUoXCIuLi9zeW1ib2wvZ2x5cGhfYXRsYXNcIiksU3ByaXRlQXRsYXM9cmVxdWlyZShcIi4uL3N5bWJvbC9zcHJpdGVfYXRsYXNcIiksTGluZUF0bGFzPXJlcXVpcmUoXCIuLi9yZW5kZXIvbGluZV9hdGxhc1wiKSx1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksYWpheD1yZXF1aXJlKFwiLi4vdXRpbC9hamF4XCIpLG5vcm1hbGl6ZVVSTD1yZXF1aXJlKFwiLi4vdXRpbC9tYXBib3hcIikubm9ybWFsaXplU3R5bGVVUkwsYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLERpc3BhdGNoZXI9cmVxdWlyZShcIi4uL3V0aWwvZGlzcGF0Y2hlclwiKSxBbmltYXRpb25Mb29wPXJlcXVpcmUoXCIuL2FuaW1hdGlvbl9sb29wXCIpLHZhbGlkYXRlPXJlcXVpcmUoXCJtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGUvbGF0ZXN0XCIpO21vZHVsZS5leHBvcnRzPVN0eWxlLFN0eWxlLnByb3RvdHlwZT11dGlsLmluaGVyaXQoRXZlbnRlZCx7X2xvYWRlZDohMSxsb2FkZWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5fbG9hZGVkKXJldHVybiExO2Zvcih2YXIgZSBpbiB0aGlzLnNvdXJjZXMpaWYoIXRoaXMuc291cmNlc1tlXS5sb2FkZWQoKSlyZXR1cm4hMTtyZXR1cm4gdGhpcy5zcHJpdGUmJiF0aGlzLnNwcml0ZS5sb2FkZWQoKT8hMTohMH0sX3Jlc29sdmU6ZnVuY3Rpb24oKXt2YXIgZSx0O3RoaXMuX2xheWVycz17fSx0aGlzLl9vcmRlcj1bXTtmb3IodmFyIHI9MDtyPHRoaXMuc3R5bGVzaGVldC5sYXllcnMubGVuZ3RoO3IrKyl0PW5ldyBTdHlsZUxheWVyKHRoaXMuc3R5bGVzaGVldC5sYXllcnNbcl0pLHRoaXMuX2xheWVyc1t0LmlkXT10LHRoaXMuX29yZGVyLnB1c2godC5pZCk7Zm9yKGUgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1tlXS5yZXNvbHZlTGF5b3V0KCk7Zm9yKGUgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1tlXS5yZXNvbHZlUmVmZXJlbmNlKHRoaXMuX2xheWVycyksdGhpcy5fbGF5ZXJzW2VdLnJlc29sdmVQYWludCgpO3RoaXMuX2dyb3VwTGF5ZXJzKCksdGhpcy5fYnJvYWRjYXN0TGF5ZXJzKCl9LF9ncm91cExheWVyczpmdW5jdGlvbigpe3ZhciBlO3RoaXMuX2dyb3Vwcz1bXTtmb3IodmFyIHQ9MDt0PHRoaXMuX29yZGVyLmxlbmd0aDsrK3Qpe3ZhciByPXRoaXMuX2xheWVyc1t0aGlzLl9vcmRlclt0XV07ZSYmci5zb3VyY2U9PT1lLnNvdXJjZXx8KGU9W10sZS5zb3VyY2U9ci5zb3VyY2UsdGhpcy5fZ3JvdXBzLnB1c2goZSkpLGUucHVzaChyKX19LF9icm9hZGNhc3RMYXllcnM6ZnVuY3Rpb24oKXt2YXIgZT1bXTtmb3IodmFyIHQgaW4gdGhpcy5fbGF5ZXJzKWUucHVzaCh0aGlzLl9sYXllcnNbdF0uanNvbigpKTt0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwic2V0IGxheWVyc1wiLGUpfSxfY2FzY2FkZTpmdW5jdGlvbihlLHQpe2lmKHRoaXMuX2xvYWRlZCl7dD10fHx7dHJhbnNpdGlvbjohMH07Zm9yKHZhciByIGluIHRoaXMuX2xheWVycyl0aGlzLl9sYXllcnNbcl0uY2FzY2FkZShlLHQsdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb258fHt9LHRoaXMuYW5pbWF0aW9uTG9vcCk7dGhpcy5maXJlKFwiY2hhbmdlXCIpfX0sX3JlY2FsY3VsYXRlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiB0aGlzLnNvdXJjZXMpdGhpcy5zb3VyY2VzW3RdLnVzZWQ9ITE7dGhpcy5fdXBkYXRlWm9vbUhpc3RvcnkoZSksdGhpcy5yYXN0ZXJGYWRlRHVyYXRpb249MzAwO2Zvcih0IGluIHRoaXMuX2xheWVycyl7dmFyIHI9dGhpcy5fbGF5ZXJzW3RdO3IucmVjYWxjdWxhdGUoZSx0aGlzLnpvb21IaXN0b3J5KSYmci5zb3VyY2UmJih0aGlzLnNvdXJjZXNbci5zb3VyY2VdLnVzZWQ9ITApfXZhciBpPTMwMDtNYXRoLmZsb29yKHRoaXMueikhPT1NYXRoLmZsb29yKGUpJiZ0aGlzLmFuaW1hdGlvbkxvb3Auc2V0KGkpLHRoaXMuej1lLHRoaXMuZmlyZShcInpvb21cIil9LF91cGRhdGVab29tSGlzdG9yeTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnpvb21IaXN0b3J5O3ZvaWQgMD09PXQubGFzdEludGVnZXJab29tJiYodC5sYXN0SW50ZWdlclpvb209TWF0aC5mbG9vcihlKSx0Lmxhc3RJbnRlZ2VyWm9vbVRpbWU9MCx0Lmxhc3Rab29tPWUpLE1hdGguZmxvb3IodC5sYXN0Wm9vbSk8TWF0aC5mbG9vcihlKT8odC5sYXN0SW50ZWdlclpvb209TWF0aC5mbG9vcihlKSx0Lmxhc3RJbnRlZ2VyWm9vbVRpbWU9RGF0ZS5ub3coKSk6TWF0aC5mbG9vcih0Lmxhc3Rab29tKT5NYXRoLmZsb29yKGUpJiYodC5sYXN0SW50ZWdlclpvb209TWF0aC5mbG9vcihlKzEpLHQubGFzdEludGVnZXJab29tVGltZT1EYXRlLm5vdygpKSx0Lmxhc3Rab29tPWV9LGJhdGNoOmZ1bmN0aW9uKGUpe3N0eWxlQmF0Y2godGhpcyxlKX0sYWRkU291cmNlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYmF0Y2goZnVuY3Rpb24ocil7ci5hZGRTb3VyY2UoZSx0KX0pLHRoaXN9LHJlbW92ZVNvdXJjZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5iYXRjaChmdW5jdGlvbih0KXt0LnJlbW92ZVNvdXJjZShlKX0pLHRoaXN9LGdldFNvdXJjZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zb3VyY2VzW2VdfSxhZGRMYXllcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmJhdGNoKGZ1bmN0aW9uKHIpe3IuYWRkTGF5ZXIoZSx0KX0pLHRoaXN9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJhdGNoKGZ1bmN0aW9uKHQpe3QucmVtb3ZlTGF5ZXIoZSl9KSx0aGlzfSxnZXRMYXllcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbGF5ZXJzW2VdfSxnZXRSZWZlcmVudExheWVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0TGF5ZXIoZSk7cmV0dXJuIHQucmVmJiYodD10aGlzLmdldExheWVyKHQucmVmKSksdH0sc2V0RmlsdGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYmF0Y2goZnVuY3Rpb24ocil7ci5zZXRGaWx0ZXIoZSx0KX0pLHRoaXN9LHNldExheWVyWm9vbVJhbmdlOmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdGhpcy5iYXRjaChmdW5jdGlvbihpKXtpLnNldExheWVyWm9vbVJhbmdlKGUsdCxyKX0pLHRoaXN9LGdldEZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRSZWZlcmVudExheWVyKGUpLmZpbHRlcn0sZ2V0TGF5b3V0UHJvcGVydHk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5nZXRSZWZlcmVudExheWVyKGUpLmdldExheW91dFByb3BlcnR5KHQpfSxnZXRQYWludFByb3BlcnR5OmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdGhpcy5nZXRMYXllcihlKS5nZXRQYWludFByb3BlcnR5KHQscil9LGZlYXR1cmVzQXQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBpPVtdLHM9bnVsbDt0LmxheWVyJiYodC5sYXllcklkcz1BcnJheS5pc0FycmF5KHQubGF5ZXIpP3QubGF5ZXI6W3QubGF5ZXJdKSx1dGlsLmFzeW5jRWFjaChPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpLGZ1bmN0aW9uKHIsbyl7dmFyIGE9dGhpcy5zb3VyY2VzW3JdO2EuZmVhdHVyZXNBdChlLHQsZnVuY3Rpb24oZSx0KXt0JiYoaT1pLmNvbmNhdCh0KSksZSYmKHM9ZSksbygpfSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtyZXR1cm4gcz9yKHMpOnZvaWQgcihudWxsLGkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT10aGlzLl9sYXllcnNbZS5sYXllcl19LmJpbmQodGhpcykpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5sYXllcj10aGlzLl9sYXllcnNbZS5sYXllcl0uanNvbigpLGV9LmJpbmQodGhpcykpKX0uYmluZCh0aGlzKSl9LGZlYXR1cmVzSW46ZnVuY3Rpb24oZSx0LHIpe3ZhciBpPVtdLHM9bnVsbDt0LmxheWVyJiYodC5sYXllcj17aWQ6dC5sYXllcn0pLHV0aWwuYXN5bmNFYWNoKE9iamVjdC5rZXlzKHRoaXMuc291cmNlcyksZnVuY3Rpb24ocixvKXt2YXIgYT10aGlzLnNvdXJjZXNbcl07YS5mZWF0dXJlc0luKGUsdCxmdW5jdGlvbihlLHQpe3QmJihpPWkuY29uY2F0KHQpKSxlJiYocz1lKSxvKCl9KX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3JldHVybiBzP3Iocyk6dm9pZCByKG51bGwsaS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX2xheWVyc1tlLmxheWVyXX0uYmluZCh0aGlzKSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmxheWVyPXRoaXMuX2xheWVyc1tlLmxheWVyXS5qc29uKCksZX0uYmluZCh0aGlzKSkpfS5iaW5kKHRoaXMpKX0sX3JlbW92ZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hlci5yZW1vdmUoKX0sX3JlbG9hZFNvdXJjZTpmdW5jdGlvbihlKXt0aGlzLnNvdXJjZXNbZV0ucmVsb2FkKCl9LF91cGRhdGVTb3VyY2VzOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiB0aGlzLnNvdXJjZXMpdGhpcy5zb3VyY2VzW3RdLnVwZGF0ZShlKX0sX3JlZG9QbGFjZW1lbnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5zb3VyY2VzKXRoaXMuc291cmNlc1tlXS5yZWRvUGxhY2VtZW50JiZ0aGlzLnNvdXJjZXNbZV0ucmVkb1BsYWNlbWVudCgpfSxfZm9yd2FyZFNvdXJjZUV2ZW50OmZ1bmN0aW9uKGUpe3RoaXMuZmlyZShcInNvdXJjZS5cIitlLnR5cGUsdXRpbC5leHRlbmQoe3NvdXJjZTplLnRhcmdldH0sZSkpfSxfZm9yd2FyZFRpbGVFdmVudDpmdW5jdGlvbihlKXt0aGlzLmZpcmUoZS50eXBlLHV0aWwuZXh0ZW5kKHtzb3VyY2U6ZS50YXJnZXR9LGUpKX0sXCJnZXQgc3ByaXRlIGpzb25cIjpmdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuc3ByaXRlO3IubG9hZGVkKCk/dChudWxsLHtzcHJpdGU6ci5kYXRhLHJldGluYTpyLnJldGluYX0pOnIub24oXCJsb2FkXCIsZnVuY3Rpb24oKXt0KG51bGwse3Nwcml0ZTpyLmRhdGEscmV0aW5hOnIucmV0aW5hfSl9KX0sXCJnZXQgaWNvbnNcIjpmdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuc3ByaXRlLGk9dGhpcy5zcHJpdGVBdGxhcztyLmxvYWRlZCgpPyhpLnNldFNwcml0ZShyKSxpLmFkZEljb25zKGUuaWNvbnMsdCkpOnIub24oXCJsb2FkXCIsZnVuY3Rpb24oKXtpLnNldFNwcml0ZShyKSxpLmFkZEljb25zKGUuaWNvbnMsdCl9KX0sXCJnZXQgZ2x5cGhzXCI6ZnVuY3Rpb24oZSx0KXt0aGlzLmdseXBoU291cmNlLmdldFNpbXBsZUdseXBocyhlLmZvbnRzdGFjayxlLmNvZGVwb2ludHMsZS51aWQsdCl9fSk7XG59LHtcIi4uL3JlbmRlci9saW5lX2F0bGFzXCI6MzYsXCIuLi9zeW1ib2wvZ2x5cGhfYXRsYXNcIjo3MCxcIi4uL3N5bWJvbC9nbHlwaF9zb3VyY2VcIjo3MSxcIi4uL3N5bWJvbC9zcHJpdGVfYXRsYXNcIjo3NyxcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9icm93c2VyXCI6OTUsXCIuLi91dGlsL2Rpc3BhdGNoZXJcIjo5NyxcIi4uL3V0aWwvZXZlbnRlZFwiOjEwMCxcIi4uL3V0aWwvbWFwYm94XCI6MTAzLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9hbmltYXRpb25fbG9vcFwiOjUxLFwiLi9pbWFnZV9zcHJpdGVcIjo1MixcIi4vc3R5bGVfYmF0Y2hcIjo1NyxcIi4vc3R5bGVfbGF5ZXJcIjo2MCxcIm1hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZS9sYXRlc3RcIjoxMjl9XSw1NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBzdHlsZUJhdGNoKGUsdCl7aWYoIWUuX2xvYWRlZCl0aHJvdyBuZXcgRXJyb3IoXCJTdHlsZSBpcyBub3QgZG9uZSBsb2FkaW5nXCIpO3ZhciByPU9iamVjdC5jcmVhdGUoc3R5bGVCYXRjaC5wcm90b3R5cGUpO3IuX3N0eWxlPWUsci5fZ3JvdXBMYXllcnM9ITEsci5fYnJvYWRjYXN0TGF5ZXJzPSExLHIuX3JlbG9hZFNvdXJjZXM9e30sci5fZXZlbnRzPVtdLHIuX2NoYW5nZT0hMSx0KHIpLHIuX2dyb3VwTGF5ZXJzJiZyLl9zdHlsZS5fZ3JvdXBMYXllcnMoKSxyLl9icm9hZGNhc3RMYXllcnMmJnIuX3N0eWxlLl9icm9hZGNhc3RMYXllcnMoKSxPYmplY3Qua2V5cyhyLl9yZWxvYWRTb3VyY2VzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IuX3N0eWxlLl9yZWxvYWRTb3VyY2UoZSl9KSxyLl9ldmVudHMuZm9yRWFjaChmdW5jdGlvbihlKXtyLl9zdHlsZS5maXJlLmFwcGx5KHIuX3N0eWxlLGUpfSksci5fY2hhbmdlJiZyLl9zdHlsZS5maXJlKFwiY2hhbmdlXCIpfXZhciBTb3VyY2U9cmVxdWlyZShcIi4uL3NvdXJjZS9zb3VyY2VcIiksU3R5bGVMYXllcj1yZXF1aXJlKFwiLi9zdHlsZV9sYXllclwiKTtzdHlsZUJhdGNoLnByb3RvdHlwZT17YWRkTGF5ZXI6ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDAhPT10aGlzLl9zdHlsZS5fbGF5ZXJzW2UuaWRdKXRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIGFscmVhZHkgYSBsYXllciB3aXRoIHRoaXMgSURcIik7cmV0dXJuIGUgaW5zdGFuY2VvZiBTdHlsZUxheWVyfHwoZT1uZXcgU3R5bGVMYXllcihlKSksdGhpcy5fc3R5bGUuX2xheWVyc1tlLmlkXT1lLHRoaXMuX3N0eWxlLl9vcmRlci5zcGxpY2UodD90aGlzLl9zdHlsZS5fb3JkZXIuaW5kZXhPZih0KToxLzAsMCxlLmlkKSxlLnJlc29sdmVMYXlvdXQoKSxlLnJlc29sdmVSZWZlcmVuY2UodGhpcy5fc3R5bGUuX2xheWVycyksZS5yZXNvbHZlUGFpbnQoKSx0aGlzLl9ncm91cExheWVycz0hMCx0aGlzLl9icm9hZGNhc3RMYXllcnM9ITAsZS5zb3VyY2UmJih0aGlzLl9yZWxvYWRTb3VyY2VzW2Uuc291cmNlXT0hMCksdGhpcy5fZXZlbnRzLnB1c2goW1wibGF5ZXIuYWRkXCIse2xheWVyOmV9XSksdGhpcy5fY2hhbmdlPSEwLHRoaXN9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3N0eWxlLl9sYXllcnNbZV07aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBsYXllciB3aXRoIHRoaXMgSURcIik7Zm9yKHZhciByIGluIHRoaXMuX3N0eWxlLl9sYXllcnMpdGhpcy5fc3R5bGUuX2xheWVyc1tyXS5yZWY9PT1lJiZ0aGlzLnJlbW92ZUxheWVyKHIpO3JldHVybiBkZWxldGUgdGhpcy5fc3R5bGUuX2xheWVyc1tlXSx0aGlzLl9zdHlsZS5fb3JkZXIuc3BsaWNlKHRoaXMuX3N0eWxlLl9vcmRlci5pbmRleE9mKGUpLDEpLHRoaXMuX2dyb3VwTGF5ZXJzPSEwLHRoaXMuX2Jyb2FkY2FzdExheWVycz0hMCx0aGlzLl9ldmVudHMucHVzaChbXCJsYXllci5yZW1vdmVcIix7bGF5ZXI6dH1dKSx0aGlzLl9jaGFuZ2U9ITAsdGhpc30sc2V0UGFpbnRQcm9wZXJ0eTpmdW5jdGlvbihlLHQscixzKXtyZXR1cm4gdGhpcy5fc3R5bGUuZ2V0TGF5ZXIoZSkuc2V0UGFpbnRQcm9wZXJ0eSh0LHIscyksdGhpcy5fY2hhbmdlPSEwLHRoaXN9LHNldExheW91dFByb3BlcnR5OmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT10aGlzLl9zdHlsZS5nZXRSZWZlcmVudExheWVyKGUpLGUuc2V0TGF5b3V0UHJvcGVydHkodCxyKSx0aGlzLl9icm9hZGNhc3RMYXllcnM9ITAsZS5zb3VyY2UmJih0aGlzLl9yZWxvYWRTb3VyY2VzW2Uuc291cmNlXT0hMCksdGhpcy5fY2hhbmdlPSEwLHRoaXN9LHNldEZpbHRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlPXRoaXMuX3N0eWxlLmdldFJlZmVyZW50TGF5ZXIoZSksZS5maWx0ZXI9dCx0aGlzLl9icm9hZGNhc3RMYXllcnM9ITAsZS5zb3VyY2UmJih0aGlzLl9yZWxvYWRTb3VyY2VzW2Uuc291cmNlXT0hMCksdGhpcy5fY2hhbmdlPSEwLHRoaXN9LHNldExheWVyWm9vbVJhbmdlOmZ1bmN0aW9uKGUsdCxyKXt2YXIgcz10aGlzLl9zdHlsZS5nZXRSZWZlcmVudExheWVyKGUpO3JldHVybiBudWxsIT10JiYocy5taW56b29tPXQpLG51bGwhPXImJihzLm1heHpvb209ciksdGhpcy5fYnJvYWRjYXN0TGF5ZXJzPSEwLHMuc291cmNlJiYodGhpcy5fcmVsb2FkU291cmNlc1tzLnNvdXJjZV09ITApLHRoaXMuX2NoYW5nZT0hMCx0aGlzfSxhZGRTb3VyY2U6ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5fc3R5bGUuX2xvYWRlZCl0aHJvdyBuZXcgRXJyb3IoXCJTdHlsZSBpcyBub3QgZG9uZSBsb2FkaW5nXCIpO2lmKHZvaWQgMCE9PXRoaXMuX3N0eWxlLnNvdXJjZXNbZV0pdGhyb3cgbmV3IEVycm9yKFwiVGhlcmUgaXMgYWxyZWFkeSBhIHNvdXJjZSB3aXRoIHRoaXMgSURcIik7cmV0dXJuIHQ9U291cmNlLmNyZWF0ZSh0KSx0aGlzLl9zdHlsZS5zb3VyY2VzW2VdPXQsdC5pZD1lLHQuc3R5bGU9dGhpcy5fc3R5bGUsdC5kaXNwYXRjaGVyPXRoaXMuX3N0eWxlLmRpc3BhdGNoZXIsdC5nbHlwaEF0bGFzPXRoaXMuX3N0eWxlLmdseXBoQXRsYXMsdC5vbihcImxvYWRcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFNvdXJjZUV2ZW50KS5vbihcImVycm9yXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudCkub24oXCJjaGFuZ2VcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFNvdXJjZUV2ZW50KS5vbihcInRpbGUuYWRkXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpLm9uKFwidGlsZS5sb2FkXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpLm9uKFwidGlsZS5lcnJvclwiLHRoaXMuX3N0eWxlLl9mb3J3YXJkVGlsZUV2ZW50KS5vbihcInRpbGUucmVtb3ZlXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpLm9uKFwidGlsZS5zdGF0c1wiLHRoaXMuX3N0eWxlLl9mb3J3YXJkVGlsZUV2ZW50KSx0aGlzLl9ldmVudHMucHVzaChbXCJzb3VyY2UuYWRkXCIse3NvdXJjZTp0fV0pLHRoaXMuX2NoYW5nZT0hMCx0aGlzfSxyZW1vdmVTb3VyY2U6ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09dGhpcy5fc3R5bGUuc291cmNlc1tlXSl0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBzb3VyY2Ugd2l0aCB0aGlzIElEXCIpO3ZhciB0PXRoaXMuX3N0eWxlLnNvdXJjZXNbZV07cmV0dXJuIGRlbGV0ZSB0aGlzLl9zdHlsZS5zb3VyY2VzW2VdLHQub2ZmKFwibG9hZFwiLHRoaXMuX3N0eWxlLl9mb3J3YXJkU291cmNlRXZlbnQpLm9mZihcImVycm9yXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudCkub2ZmKFwiY2hhbmdlXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudCkub2ZmKFwidGlsZS5hZGRcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudCkub2ZmKFwidGlsZS5sb2FkXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpLm9mZihcInRpbGUuZXJyb3JcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudCkub2ZmKFwidGlsZS5yZW1vdmVcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudCkub2ZmKFwidGlsZS5zdGF0c1wiLHRoaXMuX3N0eWxlLl9mb3J3YXJkVGlsZUV2ZW50KSx0aGlzLl9ldmVudHMucHVzaChbXCJzb3VyY2UucmVtb3ZlXCIse3NvdXJjZTp0fV0pLHRoaXMuX2NoYW5nZT0hMCx0aGlzfX0sbW9kdWxlLmV4cG9ydHM9c3R5bGVCYXRjaDtcbn0se1wiLi4vc291cmNlL3NvdXJjZVwiOjQzLFwiLi9zdHlsZV9sYXllclwiOjYwfV0sNTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3R5bGVEZWNsYXJhdGlvbih0LHIpe3RoaXMudHlwZT10LnR5cGUsdGhpcy50cmFuc2l0aW9uYWJsZT10LnRyYW5zaXRpb24sbnVsbD09ciYmKHI9dFtcImRlZmF1bHRcIl0pLHRoaXMuanNvbj1KU09OLnN0cmluZ2lmeShyKSxcImNvbG9yXCI9PT10aGlzLnR5cGU/dGhpcy52YWx1ZT1wYXJzZUNvbG9yKHIpOnRoaXMudmFsdWU9cixcImludGVycG9sYXRlZFwiPT09dFtcImZ1bmN0aW9uXCJdP3RoaXMuY2FsY3VsYXRlPU1hcGJveEdMRnVuY3Rpb24uaW50ZXJwb2xhdGVkKHRoaXMudmFsdWUpOih0aGlzLmNhbGN1bGF0ZT1NYXBib3hHTEZ1bmN0aW9uW1wicGllY2V3aXNlLWNvbnN0YW50XCJdKHRoaXMudmFsdWUpLHQudHJhbnNpdGlvbiYmKHRoaXMuY2FsY3VsYXRlPXRyYW5zaXRpb25lZCh0aGlzLmNhbGN1bGF0ZSkpKX1mdW5jdGlvbiB0cmFuc2l0aW9uZWQodCl7cmV0dXJuIGZ1bmN0aW9uKHIsbyxlKXt2YXIgbixpLGEsbD1yJTEscz1NYXRoLm1pbigoRGF0ZS5ub3coKS1vLmxhc3RJbnRlZ2VyWm9vbVRpbWUpL2UsMSksYz0xLHU9MTtyZXR1cm4gcj5vLmxhc3RJbnRlZ2VyWm9vbT8obj1sKygxLWwpKnMsYyo9MixpPXQoci0xKSxhPXQocikpOihuPTEtKDEtcykqbCxhPXQociksaT10KHIrMSksYy89Mikse2Zyb206aSxmcm9tU2NhbGU6Yyx0bzphLHRvU2NhbGU6dSx0Om59fX1mdW5jdGlvbiBwYXJzZUNvbG9yKHQpe2lmKGNvbG9yQ2FjaGVbdF0pcmV0dXJuIGNvbG9yQ2FjaGVbdF07aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdDtpZih0LnN0b3BzKXJldHVybiB1dGlsLmV4dGVuZCh7fSx0LHtzdG9wczp0LnN0b3BzLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bdFswXSxwYXJzZUNvbG9yKHRbMV0pXX0pfSk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe3ZhciByPWNvbG9yRG93bmdyYWRlKHBhcnNlQ1NTQ29sb3IodCkpO3JldHVybiBjb2xvckNhY2hlW3RdPXIscn10aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbG9yIFwiK3QpfWZ1bmN0aW9uIGNvbG9yRG93bmdyYWRlKHQpe3JldHVyblt0WzBdLzI1NSx0WzFdLzI1NSx0WzJdLzI1NSx0WzNdLzFdfXZhciBwYXJzZUNTU0NvbG9yPXJlcXVpcmUoXCJjc3Njb2xvcnBhcnNlclwiKS5wYXJzZUNTU0NvbG9yLE1hcGJveEdMRnVuY3Rpb249cmVxdWlyZShcIm1hcGJveC1nbC1mdW5jdGlvblwiKSx1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIik7bW9kdWxlLmV4cG9ydHM9U3R5bGVEZWNsYXJhdGlvbjt2YXIgY29sb3JDYWNoZT17fTtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2LFwiY3NzY29sb3JwYXJzZXJcIjoxMDcsXCJtYXBib3gtZ2wtZnVuY3Rpb25cIjoxMjh9XSw1OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBtYWtlQ29uc3RydWN0b3IodCl7ZnVuY3Rpb24gZSh0KXt0aGlzLl92YWx1ZXM9e30sdGhpcy5fdHJhbnNpdGlvbnM9e307Zm9yKHZhciBlIGluIHQpdGhpc1tlXT10W2VdfXJldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciByPXRbbl07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLG4se3NldDpmdW5jdGlvbih0KXt0aGlzLl92YWx1ZXNbbl09bmV3IFN0eWxlRGVjbGFyYXRpb24ocix0KX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZhbHVlc1tuXS52YWx1ZX19KSxyLnRyYW5zaXRpb24mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxuK1wiLXRyYW5zaXRpb25cIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3RyYW5zaXRpb25zW25dPXR9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90cmFuc2l0aW9uc1tuXX19KX0pLGUucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl92YWx1ZXN9LGUucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl90cmFuc2l0aW9uc1t0XXx8e307cmV0dXJue2R1cmF0aW9uOnV0aWwuY29hbGVzY2Uobi5kdXJhdGlvbixlLmR1cmF0aW9uLDMwMCksZGVsYXk6dXRpbC5jb2FsZXNjZShuLmRlbGF5LGUuZGVsYXksMCl9fSxlLnByb3RvdHlwZS5qc29uPWZ1bmN0aW9uKCl7dmFyIHQ9e307Zm9yKHZhciBlIGluIHRoaXMuX3ZhbHVlcyl0W2VdPXRoaXMuX3ZhbHVlc1tlXS52YWx1ZTtmb3IodmFyIG4gaW4gdGhpcy5fdHJhbnNpdGlvbnMpdFtuK1wiLXRyYW5zaXRpb25cIl09dGhpcy5fdHJhbnNpdGlvbnNbZV07cmV0dXJuIHR9LGV9dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxyZWZlcmVuY2U9cmVxdWlyZShcIi4vcmVmZXJlbmNlXCIpLFN0eWxlRGVjbGFyYXRpb249cmVxdWlyZShcIi4vc3R5bGVfZGVjbGFyYXRpb25cIiksbG9va3VwPXtwYWludDp7fSxsYXlvdXQ6e319O3JlZmVyZW5jZS5sYXllci50eXBlLnZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe2xvb2t1cC5wYWludFt0XT1tYWtlQ29uc3RydWN0b3IocmVmZXJlbmNlW1wicGFpbnRfXCIrdF0pLGxvb2t1cC5sYXlvdXRbdF09bWFrZUNvbnN0cnVjdG9yKHJlZmVyZW5jZVtcImxheW91dF9cIit0XSl9KSxtb2R1bGUuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyBsb29rdXBbdF1bZV0obil9O1xufSx7XCIuLi91dGlsL3V0aWxcIjoxMDYsXCIuL3JlZmVyZW5jZVwiOjU1LFwiLi9zdHlsZV9kZWNsYXJhdGlvblwiOjU4fV0sNjA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3R5bGVMYXllcih0KXt0aGlzLl9sYXllcj10LHRoaXMuaWQ9dC5pZCx0aGlzLnJlZj10LnJlZix0aGlzLl9yZXNvbHZlZD17fSx0aGlzLl9jYXNjYWRlZD17fSx0aGlzLmFzc2lnbih0KX1mdW5jdGlvbiBwcmVtdWx0aXBseUxheWVyKHQsaSl7dmFyIGU9aStcIi1jb2xvclwiLGE9aStcIi1oYWxvLWNvbG9yXCIsbz1pK1wiLW91dGxpbmUtY29sb3JcIixyPXRbZV0scz10W2FdLG49dFtvXSxsPXRbaStcIi1vcGFjaXR5XCJdLHk9ciYmbCpyWzNdLHU9cyYmbCpzWzNdLGg9biYmbCpuWzNdO3ZvaWQgMCE9PXkmJjE+eSYmKHRbZV09dXRpbC5wcmVtdWx0aXBseShbclswXSxyWzFdLHJbMl0seV0pKSx2b2lkIDAhPT11JiYxPnUmJih0W2FdPXV0aWwucHJlbXVsdGlwbHkoW3NbMF0sc1sxXSxzWzJdLHVdKSksdm9pZCAwIT09aCYmMT5oJiYodFtvXT11dGlsLnByZW11bHRpcGx5KFtuWzBdLG5bMV0sblsyXSxoXSkpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksU3R5bGVUcmFuc2l0aW9uPXJlcXVpcmUoXCIuL3N0eWxlX3RyYW5zaXRpb25cIiksU3R5bGVEZWNsYXJhdGlvblNldD1yZXF1aXJlKFwiLi9zdHlsZV9kZWNsYXJhdGlvbl9zZXRcIiksTGF5b3V0UHJvcGVydGllcz1yZXF1aXJlKFwiLi9sYXlvdXRfcHJvcGVydGllc1wiKSxQYWludFByb3BlcnRpZXM9cmVxdWlyZShcIi4vcGFpbnRfcHJvcGVydGllc1wiKTttb2R1bGUuZXhwb3J0cz1TdHlsZUxheWVyLFN0eWxlTGF5ZXIucHJvdG90eXBlPXtyZXNvbHZlTGF5b3V0OmZ1bmN0aW9uKCl7dGhpcy5yZWZ8fCh0aGlzLmxheW91dD1uZXcgTGF5b3V0UHJvcGVydGllc1t0aGlzLnR5cGVdKHRoaXMuX2xheWVyLmxheW91dCksXCJsaW5lXCI9PT10aGlzLmxheW91dFtcInN5bWJvbC1wbGFjZW1lbnRcIl0mJih0aGlzLmxheW91dC5oYXNPd25Qcm9wZXJ0eShcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCIpfHwodGhpcy5sYXlvdXRbXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiXT1cIm1hcFwiKSx0aGlzLmxheW91dC5oYXNPd25Qcm9wZXJ0eShcImljb24tcm90YXRpb24tYWxpZ25tZW50XCIpfHwodGhpcy5sYXlvdXRbXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiXT1cIm1hcFwiKSx0aGlzLmxheW91dFtcInN5bWJvbC1hdm9pZC1lZGdlc1wiXT0hMCkpfSxzZXRMYXlvdXRQcm9wZXJ0eTpmdW5jdGlvbih0LGkpe251bGw9PWk/ZGVsZXRlIHRoaXMubGF5b3V0W3RdOnRoaXMubGF5b3V0W3RdPWl9LGdldExheW91dFByb3BlcnR5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxheW91dFt0XX0scmVzb2x2ZVJlZmVyZW5jZTpmdW5jdGlvbih0KXt0aGlzLnJlZiYmdGhpcy5hc3NpZ24odFt0aGlzLnJlZl0pfSxyZXNvbHZlUGFpbnQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fbGF5ZXIpe3ZhciBpPXQubWF0Y2goL15wYWludCg/OlxcLiguKikpPyQvKTtpJiYodGhpcy5fcmVzb2x2ZWRbaVsxXXx8XCJcIl09bmV3IFN0eWxlRGVjbGFyYXRpb25TZXQoXCJwYWludFwiLHRoaXMudHlwZSx0aGlzLl9sYXllclt0XSkpfX0sc2V0UGFpbnRQcm9wZXJ0eTpmdW5jdGlvbih0LGksZSl7dmFyIGE9dGhpcy5fcmVzb2x2ZWRbZXx8XCJcIl07YXx8KGE9dGhpcy5fcmVzb2x2ZWRbZXx8XCJcIl09bmV3IFN0eWxlRGVjbGFyYXRpb25TZXQoXCJwYWludFwiLHRoaXMudHlwZSx7fSkpLGFbdF09aX0sZ2V0UGFpbnRQcm9wZXJ0eTpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMuX3Jlc29sdmVkW2l8fFwiXCJdO2lmKGUpcmV0dXJuIGVbdF19LGNhc2NhZGU6ZnVuY3Rpb24odCxpLGUsYSl7Zm9yKHZhciBvIGluIHRoaXMuX3Jlc29sdmVkKWlmKFwiXCI9PT1vfHx0W29dKXt2YXIgcj10aGlzLl9yZXNvbHZlZFtvXSxzPXIudmFsdWVzKCk7Zm9yKHZhciBuIGluIHMpe3ZhciBsPXNbbl0seT1pLnRyYW5zaXRpb24/dGhpcy5fY2FzY2FkZWRbbl06dm9pZCAwO2lmKCF5fHx5LmRlY2xhcmF0aW9uLmpzb24hPT1sLmpzb24pe3ZhciB1PXIudHJhbnNpdGlvbihuLGUpLGg9dGhpcy5fY2FzY2FkZWRbbl09bmV3IFN0eWxlVHJhbnNpdGlvbihsLHksdSk7aC5pbnN0YW50KCl8fChoLmxvb3BJRD1hLnNldChoLmVuZFRpbWUtKG5ldyBEYXRlKS5nZXRUaW1lKCkpKSx5JiZhLmNhbmNlbCh5Lmxvb3BJRCl9fX1pZihcInN5bWJvbFwiPT09dGhpcy50eXBlKXt2YXIgYz1uZXcgU3R5bGVEZWNsYXJhdGlvblNldChcImxheW91dFwiLHRoaXMudHlwZSx0aGlzLmxheW91dCk7dGhpcy5fY2FzY2FkZWRbXCJ0ZXh0LXNpemVcIl09bmV3IFN0eWxlVHJhbnNpdGlvbihjLnZhbHVlcygpW1widGV4dC1zaXplXCJdLHZvaWQgMCxlKSx0aGlzLl9jYXNjYWRlZFtcImljb24tc2l6ZVwiXT1uZXcgU3R5bGVUcmFuc2l0aW9uKGMudmFsdWVzKClbXCJpY29uLXNpemVcIl0sdm9pZCAwLGUpfX0scmVjYWxjdWxhdGU6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLnR5cGUsYT10aGlzLnBhaW50PW5ldyBQYWludFByb3BlcnRpZXNbZV07Zm9yKHZhciBvIGluIHRoaXMuX2Nhc2NhZGVkKWFbb109dGhpcy5fY2FzY2FkZWRbb10uYXQodCxpKTtpZih0aGlzLmhpZGRlbj10aGlzLm1pbnpvb20mJnQ8dGhpcy5taW56b29tfHx0aGlzLm1heHpvb20mJnQ+PXRoaXMubWF4em9vbXx8XCJub25lXCI9PT10aGlzLmxheW91dC52aXNpYmlsaXR5LFwic3ltYm9sXCI9PT1lPzAhPT1hW1widGV4dC1vcGFjaXR5XCJdJiZ0aGlzLmxheW91dFtcInRleHQtZmllbGRcIl18fDAhPT1hW1wiaWNvbi1vcGFjaXR5XCJdJiZ0aGlzLmxheW91dFtcImljb24taW1hZ2VcIl0/KHByZW11bHRpcGx5TGF5ZXIoYSxcInRleHRcIikscHJlbXVsdGlwbHlMYXllcihhLFwiaWNvblwiKSk6dGhpcy5oaWRkZW49ITA6MD09PWFbZStcIi1vcGFjaXR5XCJdP3RoaXMuaGlkZGVuPSEwOnByZW11bHRpcGx5TGF5ZXIoYSxlKSx0aGlzLl9jYXNjYWRlZFtcImxpbmUtZGFzaGFycmF5XCJdKXt2YXIgcj1hW1wibGluZS1kYXNoYXJyYXlcIl0scz10aGlzLl9jYXNjYWRlZFtcImxpbmUtd2lkdGhcIl0/dGhpcy5fY2FzY2FkZWRbXCJsaW5lLXdpZHRoXCJdLmF0KE1hdGguZmxvb3IodCksMS8wKTphW1wibGluZS13aWR0aFwiXTtyLmZyb21TY2FsZSo9cyxyLnRvU2NhbGUqPXN9cmV0dXJuIXRoaXMuaGlkZGVufSxhc3NpZ246ZnVuY3Rpb24odCl7dXRpbC5leHRlbmQodGhpcyx1dGlsLnBpY2sodCxbXCJ0eXBlXCIsXCJzb3VyY2VcIixcInNvdXJjZS1sYXllclwiLFwibWluem9vbVwiLFwibWF4em9vbVwiLFwiZmlsdGVyXCIsXCJsYXlvdXRcIl0pKX0sanNvbjpmdW5jdGlvbigpe3JldHVybiB1dGlsLmV4dGVuZCh7fSx0aGlzLl9sYXllcix1dGlsLnBpY2sodGhpcyxbXCJ0eXBlXCIsXCJzb3VyY2VcIixcInNvdXJjZS1sYXllclwiLFwibWluem9vbVwiLFwibWF4em9vbVwiLFwiZmlsdGVyXCIsXCJsYXlvdXRcIixcInBhaW50XCJdKSl9fTtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9sYXlvdXRfcHJvcGVydGllc1wiOjUzLFwiLi9wYWludF9wcm9wZXJ0aWVzXCI6NTQsXCIuL3N0eWxlX2RlY2xhcmF0aW9uX3NldFwiOjU5LFwiLi9zdHlsZV90cmFuc2l0aW9uXCI6NjF9XSw2MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBTdHlsZVRyYW5zaXRpb24odCxpLGUpe3RoaXMuZGVjbGFyYXRpb249dCx0aGlzLnN0YXJ0VGltZT10aGlzLmVuZFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7dmFyIG49dC50eXBlO1wic3RyaW5nXCIhPT1uJiZcImFycmF5XCIhPT1ufHwhdC50cmFuc2l0aW9uYWJsZT90aGlzLmludGVycD1pbnRlcnBvbGF0ZVtuXTp0aGlzLmludGVycD1pbnRlcnBab29tVHJhbnNpdGlvbmVkLHRoaXMub2xkVHJhbnNpdGlvbj1pLHRoaXMuZHVyYXRpb249ZS5kdXJhdGlvbnx8MCx0aGlzLmRlbGF5PWUuZGVsYXl8fDAsdGhpcy5pbnN0YW50KCl8fCh0aGlzLmVuZFRpbWU9dGhpcy5zdGFydFRpbWUrdGhpcy5kdXJhdGlvbit0aGlzLmRlbGF5LHRoaXMuZWFzZT11dGlsLmVhc2VDdWJpY0luT3V0KSxpJiZpLmVuZFRpbWU8PXRoaXMuc3RhcnRUaW1lJiZkZWxldGUgaS5vbGRUcmFuc2l0aW9ufWZ1bmN0aW9uIGludGVycFpvb21UcmFuc2l0aW9uZWQodCxpLGUpe3JldHVybntmcm9tOnQudG8sZnJvbVNjYWxlOnQudG9TY2FsZSx0bzppLnRvLHRvU2NhbGU6aS50b1NjYWxlLHQ6ZX19dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxpbnRlcnBvbGF0ZT1yZXF1aXJlKFwiLi4vdXRpbC9pbnRlcnBvbGF0ZVwiKTttb2R1bGUuZXhwb3J0cz1TdHlsZVRyYW5zaXRpb24sU3R5bGVUcmFuc2l0aW9uLnByb3RvdHlwZS5pbnN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMub2xkVHJhbnNpdGlvbnx8IXRoaXMuaW50ZXJwfHwwPT09dGhpcy5kdXJhdGlvbiYmMD09PXRoaXMuZGVsYXl9LFN0eWxlVHJhbnNpdGlvbi5wcm90b3R5cGUuYXQ9ZnVuY3Rpb24odCxpLGUpe3ZhciBuPXRoaXMuZGVjbGFyYXRpb24uY2FsY3VsYXRlKHQsaSx0aGlzLmR1cmF0aW9uKTtpZih0aGlzLmluc3RhbnQoKSlyZXR1cm4gbjtpZihlPWV8fERhdGUubm93KCksZTx0aGlzLmVuZFRpbWUpe3ZhciByPXRoaXMub2xkVHJhbnNpdGlvbi5hdCh0LGksdGhpcy5zdGFydFRpbWUpLGE9dGhpcy5lYXNlKChlLXRoaXMuc3RhcnRUaW1lLXRoaXMuZGVsYXkpL3RoaXMuZHVyYXRpb24pO249dGhpcy5pbnRlcnAocixuLGEpfXJldHVybiBufTtcbn0se1wiLi4vdXRpbC9pbnRlcnBvbGF0ZVwiOjEwMixcIi4uL3V0aWwvdXRpbFwiOjEwNn1dLDYyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEFuY2hvcih0LGUsbyxuKXt0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLmFuZ2xlPW8sdm9pZCAwIT09biYmKHRoaXMuc2VnbWVudD1uKX12YXIgUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpO21vZHVsZS5leHBvcnRzPUFuY2hvcixBbmNob3IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUG9pbnQucHJvdG90eXBlKSxBbmNob3IucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBbmNob3IodGhpcy54LHRoaXMueSx0aGlzLmFuZ2xlLHRoaXMuc2VnbWVudCl9O1xufSx7XCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDYzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEJpblBhY2soZSxoKXt0aGlzLndpZHRoPWUsdGhpcy5oZWlnaHQ9aCx0aGlzLmZyZWU9W3t4OjAseTowLHc6ZSxoOmh9XX1tb2R1bGUuZXhwb3J0cz1CaW5QYWNrLEJpblBhY2sucHJvdG90eXBlLnJlbGVhc2U9ZnVuY3Rpb24oZSl7Zm9yKHZhciBoPTA7aDx0aGlzLmZyZWUubGVuZ3RoO2grKyl7dmFyIGk9dGhpcy5mcmVlW2hdO2lmKGkueT09PWUueSYmaS5oPT09ZS5oJiZpLngraS53PT09ZS54KWkudys9ZS53O2Vsc2UgaWYoaS54PT09ZS54JiZpLnc9PT1lLncmJmkueStpLmg9PT1lLnkpaS5oKz1lLmg7ZWxzZSBpZihlLnk9PT1pLnkmJmUuaD09PWkuaCYmZS54K2Uudz09PWkueClpLng9ZS54LGkudys9ZS53O2Vsc2V7aWYoZS54IT09aS54fHxlLnchPT1pLnd8fGUueStlLmghPT1pLnkpY29udGludWU7aS55PWUueSxpLmgrPWUuaH1yZXR1cm4gdGhpcy5mcmVlLnNwbGljZShoLDEpLHZvaWQgdGhpcy5yZWxlYXNlKGkpfXRoaXMuZnJlZS5wdXNoKGUpfSxCaW5QYWNrLnByb3RvdHlwZS5hbGxvY2F0ZT1mdW5jdGlvbihlLGgpe2Zvcih2YXIgaT17eDoxLzAseToxLzAsdzoxLzAsaDoxLzB9LHQ9LTEscz0wO3M8dGhpcy5mcmVlLmxlbmd0aDtzKyspe3ZhciByPXRoaXMuZnJlZVtzXTtlPD1yLncmJmg8PXIuaCYmci55PD1pLnkmJnIueDw9aS54JiYoaT1yLHQ9cyl9cmV0dXJuIDA+dD97eDotMSx5Oi0xfToodGhpcy5mcmVlLnNwbGljZSh0LDEpLGkudzxpLmg/KGkudz5lJiZ0aGlzLmZyZWUucHVzaCh7eDppLngrZSx5OmkueSx3Omkudy1lLGg6aH0pLGkuaD5oJiZ0aGlzLmZyZWUucHVzaCh7eDppLngseTppLnkraCx3OmkudyxoOmkuaC1ofSkpOihpLnc+ZSYmdGhpcy5mcmVlLnB1c2goe3g6aS54K2UseTppLnksdzppLnctZSxoOmkuaH0pLGkuaD5oJiZ0aGlzLmZyZWUucHVzaCh7eDppLngseTppLnkraCx3OmUsaDppLmgtaH0pKSx7eDppLngseTppLnksdzplLGg6aH0pfTtcbn0se31dLDY0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNoZWNrTWF4QW5nbGUoZSx0LGEscixuKXtpZih2b2lkIDA9PT10LnNlZ21lbnQpcmV0dXJuITA7Zm9yKHZhciBpPXQscz10LnNlZ21lbnQrMSxmPTA7Zj4tYS8yOyl7aWYocy0tLDA+cylyZXR1cm4hMTtmLT1lW3NdLmRpc3QoaSksaT1lW3NdfWYrPWVbc10uZGlzdChlW3MrMV0pLHMrKztmb3IodmFyIGw9W10sbz0wO2EvMj5mOyl7dmFyIHU9ZVtzLTFdLGM9ZVtzXSxnPWVbcysxXTtpZighZylyZXR1cm4hMTt2YXIgaD11LmFuZ2xlVG8oYyktYy5hbmdsZVRvKGcpO2ZvcihoPShoKzMqTWF0aC5QSSklKDIqTWF0aC5QSSktTWF0aC5QSSxsLnB1c2goe2Rpc3RhbmNlOmYsYW5nbGVEZWx0YTpofSksbys9aDtmLWxbMF0uZGlzdGFuY2U+cjspby09bC5zaGlmdCgpLmFuZ2xlRGVsdGE7aWYoTWF0aC5hYnMobyk+bilyZXR1cm4hMTtzKyssZis9Yy5kaXN0KGcpfXJldHVybiEwfW1vZHVsZS5leHBvcnRzPWNoZWNrTWF4QW5nbGU7XG59LHt9XSw2NTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjbGlwTGluZSh4LHksbixlLHQpe2Zvcih2YXIgaT1bXSxvPTA7bzx4Lmxlbmd0aDtvKyspZm9yKHZhciByLFA9eFtvXSx1PTA7dTxQLmxlbmd0aC0xO3UrKyl7dmFyIHc9UFt1XSxsPVBbdSsxXTt3Lng8eSYmbC54PHl8fCh3Lng8eT93PW5ldyBQb2ludCh5LHcueSsobC55LXcueSkqKCh5LXcueCkvKGwueC13LngpKSk6bC54PHkmJihsPW5ldyBQb2ludCh5LHcueSsobC55LXcueSkqKCh5LXcueCkvKGwueC13LngpKSkpLHcueTxuJiZsLnk8bnx8KHcueTxuP3c9bmV3IFBvaW50KHcueCsobC54LXcueCkqKChuLXcueSkvKGwueS13LnkpKSxuKTpsLnk8biYmKGw9bmV3IFBvaW50KHcueCsobC54LXcueCkqKChuLXcueSkvKGwueS13LnkpKSxuKSksdy54Pj1lJiZsLng+PWV8fCh3Lng+PWU/dz1uZXcgUG9pbnQoZSx3LnkrKGwueS13LnkpKigoZS13LngpLyhsLngtdy54KSkpOmwueD49ZSYmKGw9bmV3IFBvaW50KGUsdy55KyhsLnktdy55KSooKGUtdy54KS8obC54LXcueCkpKSksdy55Pj10JiZsLnk+PXR8fCh3Lnk+PXQ/dz1uZXcgUG9pbnQody54KyhsLngtdy54KSooKHQtdy55KS8obC55LXcueSkpLHQpOmwueT49dCYmKGw9bmV3IFBvaW50KHcueCsobC54LXcueCkqKCh0LXcueSkvKGwueS13LnkpKSx0KSksciYmdy5lcXVhbHMocltyLmxlbmd0aC0xXSl8fChyPVt3XSxpLnB1c2gocikpLHIucHVzaChsKSkpKSl9cmV0dXJuIGl9dmFyIFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKTttb2R1bGUuZXhwb3J0cz1jbGlwTGluZTtcbn0se1wicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSw2NjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBDb2xsaXNpb25Cb3goaSx0LHMsaCxvLGwpe3RoaXMuYW5jaG9yUG9pbnQ9aSx0aGlzLngxPXQsdGhpcy55MT1zLHRoaXMueDI9aCx0aGlzLnkyPW8sdGhpcy5tYXhTY2FsZT1sLHRoaXMucGxhY2VtZW50U2NhbGU9MCx0aGlzWzBdPXRoaXNbMV09dGhpc1syXT10aGlzWzNdPTB9bW9kdWxlLmV4cG9ydHM9Q29sbGlzaW9uQm94O1xufSx7fV0sNjc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQ29sbGlzaW9uRmVhdHVyZShvLGksdCxlLHIscyl7dmFyIG49dC50b3AqZS1yLGw9dC5ib3R0b20qZStyLGE9dC5sZWZ0KmUtcix1PXQucmlnaHQqZStyO2lmKHRoaXMuYm94ZXM9W10scyl7dmFyIGg9bC1uLHg9dS1hO2lmKDA+PWgpcmV0dXJuO2g9TWF0aC5tYXgoMTAqZSxoKSx0aGlzLl9hZGRMaW5lQ29sbGlzaW9uQm94ZXMobyxpLHgsaCl9ZWxzZSB0aGlzLmJveGVzLnB1c2gobmV3IENvbGxpc2lvbkJveChuZXcgUG9pbnQoaS54LGkueSksYSxuLHUsbCwxLzApKX12YXIgQ29sbGlzaW9uQm94PXJlcXVpcmUoXCIuL2NvbGxpc2lvbl9ib3hcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpO21vZHVsZS5leHBvcnRzPUNvbGxpc2lvbkZlYXR1cmUsQ29sbGlzaW9uRmVhdHVyZS5wcm90b3R5cGUuX2FkZExpbmVDb2xsaXNpb25Cb3hlcz1mdW5jdGlvbihvLGksdCxlKXt2YXIgcj1lLzIscz1NYXRoLmZsb29yKHQvciksbj0tZS8yLGw9dGhpcy5ib3hlcyxhPWksdT1pLnNlZ21lbnQrMSxoPW47ZG97aWYodS0tLDA+dSlyZXR1cm4gbDtoLT1vW3VdLmRpc3QoYSksYT1vW3VdfXdoaWxlKGg+LXQvMik7Zm9yKHZhciB4PW9bdV0uZGlzdChvW3UrMV0pLGQ9MDtzPmQ7ZCsrKXtmb3IodmFyIGY9LXQvMitkKnI7Zj5oK3g7KXtpZihoKz14LHUrKyx1KzE+PW8ubGVuZ3RoKXJldHVybiBsO3g9b1t1XS5kaXN0KG9bdSsxXSl9dmFyIEM9Zi1oLGI9b1t1XSxtPW9bdSsxXSxwPW0uc3ViKGIpLl91bml0KCkuX211bHQoQykuX2FkZChiKSx2PU1hdGgubWF4KE1hdGguYWJzKGYtbiktci8yLDApLF89dC8yL3Y7bC5wdXNoKG5ldyBDb2xsaXNpb25Cb3gocCwtZS8yLC1lLzIsZS8yLGUvMixfKSl9cmV0dXJuIGx9O1xufSx7XCIuL2NvbGxpc2lvbl9ib3hcIjo2NixcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sNjg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQ29sbGlzaW9uVGlsZSh0LGEpe3RoaXMudHJlZT1yYnVzaCgpLHRoaXMuYW5nbGU9dDt2YXIgZT1NYXRoLnNpbih0KSxpPU1hdGguY29zKHQpO3RoaXMucm90YXRpb25NYXRyaXg9W2ksLWUsZSxpXSx0aGlzLnlTdHJldGNoPTEvTWF0aC5jb3MoYS8xODAqTWF0aC5QSSksdGhpcy55U3RyZXRjaD1NYXRoLnBvdyh0aGlzLnlTdHJldGNoLDEuMyl9dmFyIHJidXNoPXJlcXVpcmUoXCJyYnVzaFwiKTttb2R1bGUuZXhwb3J0cz1Db2xsaXNpb25UaWxlLENvbGxpc2lvblRpbGUucHJvdG90eXBlLm1pblNjYWxlPS4yNSxDb2xsaXNpb25UaWxlLnByb3RvdHlwZS5tYXhTY2FsZT0yLENvbGxpc2lvblRpbGUucHJvdG90eXBlLnBsYWNlQ29sbGlzaW9uRmVhdHVyZT1mdW5jdGlvbih0KXtmb3IodmFyIGE9dGhpcy5taW5TY2FsZSxlPXRoaXMucm90YXRpb25NYXRyaXgsaT10aGlzLnlTdHJldGNoLG89MDtvPHQuYm94ZXMubGVuZ3RoO28rKyl7dmFyIGw9dC5ib3hlc1tvXSxyPWwuYW5jaG9yUG9pbnQubWF0TXVsdChlKSxzPXIueCxoPXIueTtsWzBdPXMrbC54MSxsWzFdPWgrbC55MSppLGxbMl09cytsLngyLGxbM109aCtsLnkyKmk7Zm9yKHZhciBuPXRoaXMudHJlZS5zZWFyY2gobCksYz0wO2M8bi5sZW5ndGg7YysrKXt2YXIgeD1uW2NdLG09eC5hbmNob3JQb2ludC5tYXRNdWx0KGUpLHk9KHgueDEtbC54MikvKHMtbS54KSx1PSh4LngyLWwueDEpLyhzLW0ueCksUz0oeC55MS1sLnkyKSppLyhoLW0ueSkscD0oeC55Mi1sLnkxKSppLyhoLW0ueSk7KGlzTmFOKHkpfHxpc05hTih1KSkmJih5PXU9MSksKGlzTmFOKFMpfHxpc05hTihwKSkmJihTPXA9MSk7dmFyIE09TWF0aC5taW4oTWF0aC5tYXgoeSx1KSxNYXRoLm1heChTLHApKTtpZihNPngubWF4U2NhbGUmJihNPXgubWF4U2NhbGUpLE0+bC5tYXhTY2FsZSYmKE09bC5tYXhTY2FsZSksTT5hJiZNPj14LnBsYWNlbWVudFNjYWxlJiYoYT1NKSxhPj10aGlzLm1heFNjYWxlKXJldHVybiBhfX1yZXR1cm4gYX0sQ29sbGlzaW9uVGlsZS5wcm90b3R5cGUuaW5zZXJ0Q29sbGlzaW9uRmVhdHVyZT1mdW5jdGlvbih0LGEpe2Zvcih2YXIgZT10LmJveGVzLGk9MDtpPGUubGVuZ3RoO2krKyllW2ldLnBsYWNlbWVudFNjYWxlPWE7YTx0aGlzLm1heFNjYWxlJiZ0aGlzLnRyZWUubG9hZChlKX07XG59LHtcInJidXNoXCI6MTM5fV0sNjk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZ2V0QW5jaG9ycyhlLHIsdCxhLG4sbyxsLGgpe3ZhciBpPWE/LjYqbypsOjAsYz1NYXRoLm1heChhP2EucmlnaHQtYS5sZWZ0OjAsbj9uLnJpZ2h0LW4ubGVmdDowKTtpZigwPT09ZVswXS54fHw0MDk2PT09ZVswXS54fHwwPT09ZVswXS55fHw0MDk2PT09ZVswXS55KXZhciB1PSEwO3IvND5yLWMqbCYmKHI9YypsK3IvNCk7dmFyIHM9MipvLGc9dT9yLzIqaCVyOihjLzIrcykqbCpoJXI7cmV0dXJuIHJlc2FtcGxlKGUsZyxyLGksdCxjKmwsdSwhMSl9ZnVuY3Rpb24gcmVzYW1wbGUoZSxyLHQsYSxuLG8sbCxoKXtmb3IodmFyIGk9MCxjPXItdCx1PVtdLHM9MDtzPGUubGVuZ3RoLTE7cysrKXtmb3IodmFyIGc9ZVtzXSxwPWVbcysxXSx4PWcuZGlzdChwKSxmPXAuYW5nbGVUbyhnKTtpK3g+Yyt0Oyl7Yys9dDt2YXIgdj0oYy1pKS94LG09aW50ZXJwb2xhdGUoZy54LHAueCx2KSxBPWludGVycG9sYXRlKGcueSxwLnksdik7aWYobT49MCYmNDA5Nj5tJiZBPj0wJiY0MDk2PkEpe209TWF0aC5yb3VuZChtKSxBPU1hdGgucm91bmQoQSk7dmFyIHk9bmV3IEFuY2hvcihtLEEsZixzKTsoIWF8fGNoZWNrTWF4QW5nbGUoZSx5LG8sYSxuKSkmJnUucHVzaCh5KX19aSs9eH1yZXR1cm4gaHx8dS5sZW5ndGh8fGx8fCh1PXJlc2FtcGxlKGUsaS8yLHQsYSxuLG8sbCwhMCkpLHV9dmFyIGludGVycG9sYXRlPXJlcXVpcmUoXCIuLi91dGlsL2ludGVycG9sYXRlXCIpLEFuY2hvcj1yZXF1aXJlKFwiLi4vc3ltYm9sL2FuY2hvclwiKSxjaGVja01heEFuZ2xlPXJlcXVpcmUoXCIuL2NoZWNrX21heF9hbmdsZVwiKTttb2R1bGUuZXhwb3J0cz1nZXRBbmNob3JzO1xufSx7XCIuLi9zeW1ib2wvYW5jaG9yXCI6NjIsXCIuLi91dGlsL2ludGVycG9sYXRlXCI6MTAyLFwiLi9jaGVja19tYXhfYW5nbGVcIjo2NH1dLDcwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEdseXBoQXRsYXModCxpKXt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9aSx0aGlzLmJpbj1uZXcgQmluUGFjayh0LGkpLHRoaXMuaW5kZXg9e30sdGhpcy5pZHM9e30sdGhpcy5kYXRhPW5ldyBVaW50OEFycmF5KHQqaSl9dmFyIEJpblBhY2s9cmVxdWlyZShcIi4vYmluX3BhY2tcIik7bW9kdWxlLmV4cG9ydHM9R2x5cGhBdGxhcyxHbHlwaEF0bGFzLnByb3RvdHlwZT17Z2V0IGRlYnVnKCl7cmV0dXJuXCJjYW52YXNcImluIHRoaXN9LHNldCBkZWJ1Zyh0KXt0JiYhdGhpcy5jYW52YXM/KHRoaXMuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksdGhpcy5jYW52YXMud2lkdGg9dGhpcy53aWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQ9dGhpcy5oZWlnaHQsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyksdGhpcy5jdHg9dGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpKTohdCYmdGhpcy5jYW52YXMmJih0aGlzLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2FudmFzKSxkZWxldGUgdGhpcy5jdHgsZGVsZXRlIHRoaXMuY2FudmFzKX19LEdseXBoQXRsYXMucHJvdG90eXBlLmdldEdseXBocz1mdW5jdGlvbigpe3ZhciB0LGksZSxzPXt9O2Zvcih2YXIgaCBpbiB0aGlzLmlkcyl0PWguc3BsaXQoXCIjXCIpLGk9dFswXSxlPXRbMV0sc1tpXXx8KHNbaV09W10pLHNbaV0ucHVzaChlKTtyZXR1cm4gc30sR2x5cGhBdGxhcy5wcm90b3R5cGUuZ2V0UmVjdHM9ZnVuY3Rpb24oKXt2YXIgdCxpLGUscz17fTtmb3IodmFyIGggaW4gdGhpcy5pZHMpdD1oLnNwbGl0KFwiI1wiKSxpPXRbMF0sZT10WzFdLHNbaV18fChzW2ldPXt9KSxzW2ldW2VdPXRoaXMuaW5kZXhbaF07cmV0dXJuIHN9LEdseXBoQXRsYXMucHJvdG90eXBlLnJlbW92ZUdseXBocz1mdW5jdGlvbih0KXtmb3IodmFyIGkgaW4gdGhpcy5pZHMpe3ZhciBlPXRoaXMuaWRzW2ldLHM9ZS5pbmRleE9mKHQpO2lmKHM+PTAmJmUuc3BsaWNlKHMsMSksdGhpcy5pZHNbaV09ZSwhZS5sZW5ndGgpe2Zvcih2YXIgaD10aGlzLmluZGV4W2ldLGE9dGhpcy5kYXRhLHI9MDtyPGguaDtyKyspZm9yKHZhciBuPXRoaXMud2lkdGgqKGgueStyKStoLngsZD0wO2Q8aC53O2QrKylhW24rZF09MDt0aGlzLmRpcnR5PSEwLHRoaXMuYmluLnJlbGVhc2UoaCksZGVsZXRlIHRoaXMuaW5kZXhbaV0sZGVsZXRlIHRoaXMuaWRzW2ldfX10aGlzLnVwZGF0ZVRleHR1cmUodGhpcy5nbCl9LEdseXBoQXRsYXMucHJvdG90eXBlLmFkZEdseXBoPWZ1bmN0aW9uKHQsaSxlLHMpe2lmKCFlKXJldHVybiBudWxsO3ZhciBoPWkrXCIjXCIrZS5pZDtpZih0aGlzLmluZGV4W2hdKXJldHVybiB0aGlzLmlkc1toXS5pbmRleE9mKHQpPDAmJnRoaXMuaWRzW2hdLnB1c2godCksdGhpcy5pbmRleFtoXTtpZighZS5iaXRtYXApcmV0dXJuIG51bGw7dmFyIGE9ZS53aWR0aCsyKnMscj1lLmhlaWdodCsyKnMsbj0xLGQ9YSsyKm4sbD1yKzIqbjtkKz00LWQlNCxsKz00LWwlNDt2YXIgbz10aGlzLmJpbi5hbGxvY2F0ZShkLGwpO2lmKG8ueDwwKXJldHVybiBjb25zb2xlLndhcm4oXCJnbHlwaCBiaXRtYXAgb3ZlcmZsb3dcIikse2dseXBoOmUscmVjdDpudWxsfTt0aGlzLmluZGV4W2hdPW8sdGhpcy5pZHNbaF09W3RdO2Zvcih2YXIgYz10aGlzLmRhdGEscD1lLmJpdG1hcCx1PTA7cj51O3UrKylmb3IodmFyIHg9dGhpcy53aWR0aCooby55K3Urbikrby54K24sRT1hKnUsVD0wO2E+VDtUKyspY1t4K1RdPXBbRStUXTtyZXR1cm4gdGhpcy5kaXJ0eT0hMCxvfSxHbHlwaEF0bGFzLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKHQpe3RoaXMuZ2w9dCx0aGlzLnRleHR1cmU/dC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKToodGhpcy50ZXh0dXJlPXQuY3JlYXRlVGV4dHVyZSgpLHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELHRoaXMudGV4dHVyZSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUFHX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUlOX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9TLHQuQ0xBTVBfVE9fRURHRSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9ULHQuQ0xBTVBfVE9fRURHRSksdC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLHQuQUxQSEEsdGhpcy53aWR0aCx0aGlzLmhlaWdodCwwLHQuQUxQSEEsdC5VTlNJR05FRF9CWVRFLG51bGwpKX0sR2x5cGhBdGxhcy5wcm90b3R5cGUudXBkYXRlVGV4dHVyZT1mdW5jdGlvbih0KXtpZih0aGlzLmJpbmQodCksdGhpcy5kaXJ0eSl7aWYodC50ZXhTdWJJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LHQuQUxQSEEsdC5VTlNJR05FRF9CWVRFLHRoaXMuZGF0YSksdGhpcy5jdHgpe2Zvcih2YXIgaT10aGlzLmN0eC5nZXRJbWFnZURhdGEoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLGU9MCxzPTA7ZTx0aGlzLmRhdGEubGVuZ3RoO2UrKyxzKz00KWkuZGF0YVtzXT10aGlzLmRhdGFbZV0saS5kYXRhW3MrMV09dGhpcy5kYXRhW2VdLGkuZGF0YVtzKzJdPXRoaXMuZGF0YVtlXSxpLmRhdGFbcyszXT0yNTU7dGhpcy5jdHgucHV0SW1hZ2VEYXRhKGksMCwwKSx0aGlzLmN0eC5zdHJva2VTdHlsZT1cInJlZFwiO2Zvcih2YXIgaD0wO2g8dGhpcy5iaW4uZnJlZS5sZW5ndGg7aCsrKXt2YXIgYT10aGlzLmJpbi5mcmVlW2hdO3RoaXMuY3R4LnN0cm9rZVJlY3QoYS54LGEueSxhLncsYS5oKX19dGhpcy5kaXJ0eT0hMX19O1xufSx7XCIuL2Jpbl9wYWNrXCI6NjN9XSw3MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBHbHlwaFNvdXJjZSh0LGUpe3RoaXMudXJsPXQmJm5vcm1hbGl6ZVVSTCh0KSx0aGlzLmdseXBoQXRsYXM9ZSx0aGlzLnN0YWNrcz1bXSx0aGlzLmxvYWRpbmc9e319ZnVuY3Rpb24gU2ltcGxlR2x5cGgodCxlLHIpe3ZhciBpPTE7dGhpcy5hZHZhbmNlPXQuYWR2YW5jZSx0aGlzLmxlZnQ9dC5sZWZ0LXItaSx0aGlzLnRvcD10LnRvcCtyK2ksdGhpcy5yZWN0PWV9ZnVuY3Rpb24gZ2x5cGhVcmwodCxlLHIsaSl7cmV0dXJuIGk9aXx8XCJhYmNcIixyLnJlcGxhY2UoXCJ7c31cIixpW3QubGVuZ3RoJWkubGVuZ3RoXSkucmVwbGFjZShcIntmb250c3RhY2t9XCIsdCkucmVwbGFjZShcIntyYW5nZX1cIixlKX12YXIgbm9ybWFsaXplVVJMPXJlcXVpcmUoXCIuLi91dGlsL21hcGJveFwiKS5ub3JtYWxpemVHbHlwaHNVUkwsZ2V0QXJyYXlCdWZmZXI9cmVxdWlyZShcIi4uL3V0aWwvYWpheFwiKS5nZXRBcnJheUJ1ZmZlcixHbHlwaHM9cmVxdWlyZShcIi4uL3V0aWwvZ2x5cGhzXCIpLFByb3RvYnVmPXJlcXVpcmUoXCJwYmZcIik7bW9kdWxlLmV4cG9ydHM9R2x5cGhTb3VyY2UsR2x5cGhTb3VyY2UucHJvdG90eXBlLmdldFNpbXBsZUdseXBocz1mdW5jdGlvbih0LGUscixpKXt2b2lkIDA9PT10aGlzLnN0YWNrc1t0XSYmKHRoaXMuc3RhY2tzW3RdPXt9KTtmb3IodmFyIGwsYT17fSxzPXRoaXMuc3RhY2tzW3RdLGg9dGhpcy5nbHlwaEF0bGFzLG89MyxuPXt9LHA9MCx1PTA7dTxlLmxlbmd0aDt1Kyspe3ZhciBmPWVbdV07aWYobD1NYXRoLmZsb29yKGYvMjU2KSxzW2xdKXt2YXIgeT1zW2xdLmdseXBoc1tmXSxjPWguYWRkR2x5cGgocix0LHksbyk7eSYmKGFbZl09bmV3IFNpbXBsZUdseXBoKHksYyxvKSl9ZWxzZSB2b2lkIDA9PT1uW2xdJiYobltsXT1bXSxwKyspLG5bbF0ucHVzaChmKX1wfHxpKHZvaWQgMCxhKTt2YXIgZz1mdW5jdGlvbihlLGwscyl7aWYoIWUpZm9yKHZhciB1PXRoaXMuc3RhY2tzW3RdW2xdPXMuc3RhY2tzWzBdLGY9MDtmPG5bbF0ubGVuZ3RoO2YrKyl7dmFyIHk9bltsXVtmXSxjPXUuZ2x5cGhzW3ldLGc9aC5hZGRHbHlwaChyLHQsYyxvKTtjJiYoYVt5XT1uZXcgU2ltcGxlR2x5cGgoYyxnLG8pKX1wLS0scHx8aSh2b2lkIDAsYSl9LmJpbmQodGhpcyk7Zm9yKHZhciBkIGluIG4pdGhpcy5sb2FkUmFuZ2UodCxkLGcpfSxHbHlwaFNvdXJjZS5wcm90b3R5cGUubG9hZFJhbmdlPWZ1bmN0aW9uKHQsZSxyKXtpZigyNTYqZT42NTUzNSlyZXR1cm4gcihcImd5cGhzID4gNjU1MzUgbm90IHN1cHBvcnRlZFwiKTt2b2lkIDA9PT10aGlzLmxvYWRpbmdbdF0mJih0aGlzLmxvYWRpbmdbdF09e30pO3ZhciBpPXRoaXMubG9hZGluZ1t0XTtpZihpW2VdKWlbZV0ucHVzaChyKTtlbHNle2lbZV09W3JdO3ZhciBsPTI1NiplK1wiLVwiKygyNTYqZSsyNTUpLGE9Z2x5cGhVcmwodCxsLHRoaXMudXJsKTtnZXRBcnJheUJ1ZmZlcihhLGZ1bmN0aW9uKHQscil7Zm9yKHZhciBsPSF0JiZuZXcgR2x5cGhzKG5ldyBQcm90b2J1ZihuZXcgVWludDhBcnJheShyKSkpLGE9MDthPGlbZV0ubGVuZ3RoO2ErKylpW2VdW2FdKHQsZSxsKTtkZWxldGUgaVtlXX0pfX07XG59LHtcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9nbHlwaHNcIjoxMDEsXCIuLi91dGlsL21hcGJveFwiOjEwMyxcInBiZlwiOjEzNn1dLDcyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKHIpe2wucHVzaChlW3JdKSxjLnB1c2gobltyXSksdi5wdXNoKHRbcl0pLGgrK31mdW5jdGlvbiB1KGUsdCxuKXt2YXIgcj1mW2VdO3JldHVybiBkZWxldGUgZltlXSxmW3RdPXIsY1tyXVswXS5wb3AoKSxjW3JdWzBdPWNbcl1bMF0uY29uY2F0KG5bMF0pLHJ9ZnVuY3Rpb24gaShlLHQsbil7dmFyIHI9YVt0XTtyZXR1cm4gZGVsZXRlIGFbdF0sYVtlXT1yLGNbcl1bMF0uc2hpZnQoKSxjW3JdWzBdPW5bMF0uY29uY2F0KGNbcl1bMF0pLHJ9ZnVuY3Rpb24gbyhlLHQsbil7dmFyIHI9bj90WzBdW3RbMF0ubGVuZ3RoLTFdOnRbMF1bMF07cmV0dXJuIGUrXCI6XCIrci54K1wiOlwiK3IueX12YXIgcyxhPXt9LGY9e30sbD1bXSxjPVtdLHY9W10saD0wO2ZvcihzPTA7czxlLmxlbmd0aDtzKyspe3ZhciBwPW5bc10sZD10W3NdO2lmKHApaWYoZCl7dmFyIGc9byhkLHApLHg9byhkLHAsITApO2lmKGcgaW4gZiYmeCBpbiBhJiZmW2ddIT09YVt4XSl7dmFyIG09aShnLHgscCkseT11KGcseCxjW21dKTtkZWxldGUgYVtnXSxkZWxldGUgZlt4XSxmW28oZCxjW3ldLCEwKV09eSxjW21dPW51bGx9ZWxzZSBnIGluIGY/dShnLHgscCk6eCBpbiBhP2koZyx4LHApOihyKHMpLGFbZ109aC0xLGZbeF09aC0xKX1lbHNlIHIocyl9cmV0dXJue2ZlYXR1cmVzOmwsdGV4dEZlYXR1cmVzOnYsZ2VvbWV0cmllczpjfX07XG59LHt9XSw3MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBTeW1ib2xRdWFkKHQsYSxlLG4saSxvLHIsaCxsKXt0aGlzLmFuY2hvclBvaW50PXQsdGhpcy50bD1hLHRoaXMudHI9ZSx0aGlzLmJsPW4sdGhpcy5icj1pLHRoaXMudGV4PW8sdGhpcy5hbmdsZT1yLHRoaXMubWluU2NhbGU9aCx0aGlzLm1heFNjYWxlPWx9ZnVuY3Rpb24gZ2V0SWNvblF1YWRzKHQsYSxlLG4saSxvKXt2YXIgcj1hLmltYWdlLnJlY3QsaD0xLGw9YS5sZWZ0LWgscz1sK3IudyxtPWEudG9wLWgsdT1tK3IuaCxjPW5ldyBQb2ludChsLG0pLGc9bmV3IFBvaW50KHMsbSksTT1uZXcgUG9pbnQocyx1KSxQPW5ldyBQb2ludChsLHUpLGY9aVtcImljb24tcm90YXRlXCJdKk1hdGguUEkvMTgwO2lmKG8pe3ZhciB5PW5bdC5zZWdtZW50XTtmKz1NYXRoLmF0YW4yKHQueS15LnksdC54LXkueCl9aWYoZil7dmFyIFM9TWF0aC5zaW4oZiksdj1NYXRoLmNvcyhmKSx4PVt2LC1TLFMsdl07Yz1jLm1hdE11bHQoeCksZz1nLm1hdE11bHQoeCksUD1QLm1hdE11bHQoeCksTT1NLm1hdE11bHQoeCl9cmV0dXJuW25ldyBTeW1ib2xRdWFkKG5ldyBQb2ludCh0LngsdC55KSxjLGcsUCxNLGEuaW1hZ2UucmVjdCwwLG1pblNjYWxlLDEvMCldfWZ1bmN0aW9uIGdldEdseXBoUXVhZHModCxhLGUsbixpLG8pe2Zvcih2YXIgcj1pW1widGV4dC1yb3RhdGVcIl0qTWF0aC5QSS8xODAsaD1pW1widGV4dC1rZWVwLXVwcmlnaHRcIl0sbD1hLnBvc2l0aW9uZWRHbHlwaHMscz1bXSxtPTA7bTxsLmxlbmd0aDttKyspe3ZhciB1PWxbbV0sYz11LmdseXBoLGc9Yy5yZWN0O2lmKGcpe3ZhciBNLFA9KHUueCtjLmFkdmFuY2UvMikqZSxmPW1pblNjYWxlO28/KE09W10sZj1nZXRTZWdtZW50R2x5cGhzKE0sdCxQLG4sdC5zZWdtZW50LCEwKSxoJiYoZj1NYXRoLm1pbihmLGdldFNlZ21lbnRHbHlwaHMoTSx0LFAsbix0LnNlZ21lbnQsITEpKSkpOk09W3thbmNob3JQb2ludDpuZXcgUG9pbnQodC54LHQueSksb2Zmc2V0OjAsYW5nbGU6MCxtYXhTY2FsZToxLzAsbWluU2NhbGU6bWluU2NhbGV9XTtmb3IodmFyIHk9dS54K2MubGVmdCxTPXUueS1jLnRvcCx2PXkrZy53LHg9UytnLmgscD1uZXcgUG9pbnQoeSxTKSx3PW5ldyBQb2ludCh2LFMpLGQ9bmV3IFBvaW50KHkseCksST1uZXcgUG9pbnQodix4KSxiPTA7YjxNLmxlbmd0aDtiKyspe3ZhciBRPU1bYl0sRz1wLGs9dyxxPWQsXz1JLGo9US5hbmdsZStyO2lmKGope3ZhciB6PU1hdGguc2luKGopLEE9TWF0aC5jb3MoaiksQj1bQSwteix6LEFdO0c9Ry5tYXRNdWx0KEIpLGs9ay5tYXRNdWx0KEIpLHE9cS5tYXRNdWx0KEIpLF89Xy5tYXRNdWx0KEIpfXZhciBDPU1hdGgubWF4KFEubWluU2NhbGUsZiksRD0odC5hbmdsZStyK1Eub2Zmc2V0KzIqTWF0aC5QSSklKDIqTWF0aC5QSSk7cy5wdXNoKG5ldyBTeW1ib2xRdWFkKFEuYW5jaG9yUG9pbnQsRyxrLHEsXyxnLEQsQyxRLm1heFNjYWxlKSl9fX1yZXR1cm4gc31mdW5jdGlvbiBnZXRTZWdtZW50R2x5cGhzKHQsYSxlLG4saSxvKXt2YXIgcj0hbzswPmUmJihvPSFvKSxvJiZpKys7dmFyIGg9bmV3IFBvaW50KGEueCxhLnkpLGw9bltpXSxzPTEvMDtlPU1hdGguYWJzKGUpO2Zvcih2YXIgbT1taW5TY2FsZTs7KXt2YXIgdT1oLmRpc3QobCksYz1lL3UsZz1NYXRoLmF0YW4yKGwueS1oLnksbC54LWgueCk7aWYob3x8KGcrPU1hdGguUEkpLHImJihnKz1NYXRoLlBJKSx0LnB1c2goe2FuY2hvclBvaW50Omgsb2Zmc2V0OnI/TWF0aC5QSTowLG1pblNjYWxlOmMsbWF4U2NhbGU6cyxhbmdsZTooZysyKk1hdGguUEkpJSgyKk1hdGguUEkpfSksbT49YylicmVhaztmb3IoaD1sO2guZXF1YWxzKGwpOylpZihpKz1vPzE6LTEsbD1uW2ldLCFsKXJldHVybiBjO3ZhciBNPWwuc3ViKGgpLl91bml0KCk7aD1oLnN1YihNLl9tdWx0KHUpKSxzPWN9cmV0dXJuIG19dmFyIFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKTttb2R1bGUuZXhwb3J0cz17Z2V0SWNvblF1YWRzOmdldEljb25RdWFkcyxnZXRHbHlwaFF1YWRzOmdldEdseXBoUXVhZHN9O3ZhciBtaW5TY2FsZT0uNTtcbn0se1wicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSw3NDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByZXNvbHZlSWNvbnMoZSxyKXtmb3IodmFyIG89W10scz0wLG49ZS5sZW5ndGg7bj5zO3MrKyl7dmFyIHQ9cmVzb2x2ZVRva2VucyhlW3NdLnByb3BlcnRpZXMscltcImljb24taW1hZ2VcIl0pO3QmJm8uaW5kZXhPZih0KTwwJiZvLnB1c2godCl9cmV0dXJuIG99dmFyIHJlc29sdmVUb2tlbnM9cmVxdWlyZShcIi4uL3V0aWwvdG9rZW5cIik7bW9kdWxlLmV4cG9ydHM9cmVzb2x2ZUljb25zO1xufSx7XCIuLi91dGlsL3Rva2VuXCI6MTA1fV0sNzU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcmVzb2x2ZVRleHQoZSxyLHQpe2Zvcih2YXIgbz1bXSxzPVtdLG49MCx1PWUubGVuZ3RoO3U+bjtuKyspe3ZhciBhPXJlc29sdmVUb2tlbnMoZVtuXS5wcm9wZXJ0aWVzLHJbXCJ0ZXh0LWZpZWxkXCJdKTtpZihhKXthPWEudG9TdHJpbmcoKTt2YXIgbD1yW1widGV4dC10cmFuc2Zvcm1cIl07XCJ1cHBlcmNhc2VcIj09PWw/YT1hLnRvTG9jYWxlVXBwZXJDYXNlKCk6XCJsb3dlcmNhc2VcIj09PWwmJihhPWEudG9Mb2NhbGVMb3dlckNhc2UoKSk7Zm9yKHZhciBpPTAsdj1hLmxlbmd0aDt2Pmk7aSsrKXMucHVzaChhLmNoYXJDb2RlQXQoaSkpO29bbl09YX1lbHNlIG9bbl09bnVsbH1yZXR1cm4gcz11bmlxKHMsdCkse3RleHRGZWF0dXJlczpvLGNvZGVwb2ludHM6c319ZnVuY3Rpb24gdW5pcShlLHIpe3ZhciB0LG89W107ZS5zb3J0KHNvcnROdW1iZXJzKTtmb3IodmFyIHM9MDtzPGUubGVuZ3RoO3MrKyllW3NdIT09dCYmKHQ9ZVtzXSxyW3RdfHxvLnB1c2goZVtzXSkpO3JldHVybiBvfWZ1bmN0aW9uIHNvcnROdW1iZXJzKGUscil7cmV0dXJuIGUtcn12YXIgcmVzb2x2ZVRva2Vucz1yZXF1aXJlKFwiLi4vdXRpbC90b2tlblwiKTttb2R1bGUuZXhwb3J0cz1yZXNvbHZlVGV4dDtcbn0se1wiLi4vdXRpbC90b2tlblwiOjEwNX1dLDc2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFBvc2l0aW9uZWRHbHlwaCh0LGksbixlKXt0aGlzLmNvZGVQb2ludD10LHRoaXMueD1pLHRoaXMueT1uLHRoaXMuZ2x5cGg9ZX1mdW5jdGlvbiBTaGFwaW5nKHQsaSxuLGUsbyxoKXt0aGlzLnBvc2l0aW9uZWRHbHlwaHM9dCx0aGlzLnRleHQ9aSx0aGlzLnRvcD1uLHRoaXMuYm90dG9tPWUsdGhpcy5sZWZ0PW8sdGhpcy5yaWdodD1ofWZ1bmN0aW9uIHNoYXBlVGV4dCh0LGksbixlLG8saCxhLHMscil7Zm9yKHZhciBsPVtdLGY9bmV3IFNoYXBpbmcobCx0LHJbMV0sclsxXSxyWzBdLHJbMF0pLGM9LTE3LHA9clswXSx1PXJbMV0rYyxkPTA7ZDx0Lmxlbmd0aDtkKyspe3ZhciBnPXQuY2hhckNvZGVBdChkKSx2PWlbZ107diYmKGwucHVzaChuZXcgUG9zaXRpb25lZEdseXBoKGcscCx1LHYpKSxwKz12LmFkdmFuY2Urcyl9cmV0dXJuIGwubGVuZ3RoPyhsaW5ld3JhcChmLGksZSxuLG8saCxhKSxmKTohMX1mdW5jdGlvbiBsaW5ld3JhcCh0LGksbixlLG8saCxhKXt2YXIgcz1udWxsLHI9MCxsPTAsZj0wLGM9MCxwPXQucG9zaXRpb25lZEdseXBocztpZihlKWZvcih2YXIgdT0wO3U8cC5sZW5ndGg7dSsrKXt2YXIgZD1wW3VdO2lmKGQueC09cixkLnkrPW4qZixkLng+ZSYmbnVsbCE9PXMpe3ZhciBnPXBbcysxXS54O2M9TWF0aC5tYXgoZyxjKTtmb3IodmFyIHY9cysxO3U+PXY7disrKXBbdl0ueSs9bixwW3ZdLngtPWc7YSYmanVzdGlmeUxpbmUocCxpLGwscy0xLGEpLGw9cysxLHM9bnVsbCxyKz1nLGYrK31icmVha2FibGVbZC5jb2RlUG9pbnRdJiYocz11KX12YXIgeD1wW3AubGVuZ3RoLTFdLHk9eC54K2lbeC5jb2RlUG9pbnRdLmFkdmFuY2U7Yz1NYXRoLm1heChjLHkpO3ZhciBQPShmKzEpKm47anVzdGlmeUxpbmUocCxpLGwscC5sZW5ndGgtMSxhKSxhbGlnbihwLGEsbyxoLGMsbixmKSx0LnRvcCs9LWgqUCx0LmJvdHRvbT10LnRvcCtQLHQubGVmdCs9LW8qYyx0LnJpZ2h0PXQubGVmdCtjfWZ1bmN0aW9uIGp1c3RpZnlMaW5lKHQsaSxuLGUsbyl7Zm9yKHZhciBoPWlbdFtlXS5jb2RlUG9pbnRdLmFkdmFuY2UsYT0odFtlXS54K2gpKm8scz1uO2U+PXM7cysrKXRbc10ueC09YX1mdW5jdGlvbiBhbGlnbih0LGksbixlLG8saCxhKXtmb3IodmFyIHM9KGktbikqbyxyPSgtZSooYSsxKSsuNSkqaCxsPTA7bDx0Lmxlbmd0aDtsKyspdFtsXS54Kz1zLHRbbF0ueSs9cn1mdW5jdGlvbiBzaGFwZUljb24odCxpKXtpZighdHx8IXQucmVjdClyZXR1cm4gbnVsbDt2YXIgbj1pW1wiaWNvbi1vZmZzZXRcIl1bMF0sZT1pW1wiaWNvbi1vZmZzZXRcIl1bMV0sbz1uLXQud2lkdGgvMixoPW8rdC53aWR0aCxhPWUtdC5oZWlnaHQvMixzPWErdC5oZWlnaHQ7cmV0dXJuIG5ldyBQb3NpdGlvbmVkSWNvbih0LGEscyxvLGgpfWZ1bmN0aW9uIFBvc2l0aW9uZWRJY29uKHQsaSxuLGUsbyl7dGhpcy5pbWFnZT10LHRoaXMudG9wPWksdGhpcy5ib3R0b209bix0aGlzLmxlZnQ9ZSx0aGlzLnJpZ2h0PW99bW9kdWxlLmV4cG9ydHM9e3NoYXBlVGV4dDpzaGFwZVRleHQsc2hhcGVJY29uOnNoYXBlSWNvbn07dmFyIGJyZWFrYWJsZT17MzI6ITB9O1xufSx7fV0sNzc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3ByaXRlQXRsYXModCxpKXt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9aSx0aGlzLmJpbj1uZXcgQmluUGFjayh0LGkpLHRoaXMuaW1hZ2VzPXt9LHRoaXMuZGF0YT0hMSx0aGlzLnRleHR1cmU9MCx0aGlzLmZpbHRlcj0wLHRoaXMucGl4ZWxSYXRpbz0xLHRoaXMuZGlydHk9ITB9ZnVuY3Rpb24gY29weUJpdG1hcCh0LGksZSxoLGEscyxyLG8sbixsLHApe3ZhciBkLGMseD1oKmkrZSxmPW8qcytyO2lmKHApZm9yKGYtPXMsYz0tMTtsPj1jO2MrKyx4PSgoYytsKSVsK2gpKmkrZSxmKz1zKWZvcihkPS0xO24+PWQ7ZCsrKWFbZitkXT10W3grKGQrbiklbl07ZWxzZSBmb3IoYz0wO2w+YztjKysseCs9aSxmKz1zKWZvcihkPTA7bj5kO2QrKylhW2YrZF09dFt4K2RdfWZ1bmN0aW9uIEF0bGFzSW1hZ2UodCxpLGUsaCl7dGhpcy5yZWN0PXQsdGhpcy53aWR0aD1pLHRoaXMuaGVpZ2h0PWUsdGhpcy5zZGY9aH12YXIgQmluUGFjaz1yZXF1aXJlKFwiLi9iaW5fcGFja1wiKTttb2R1bGUuZXhwb3J0cz1TcHJpdGVBdGxhcyxTcHJpdGVBdGxhcy5wcm90b3R5cGU9e2dldCBkZWJ1Zygpe3JldHVyblwiY2FudmFzXCJpbiB0aGlzfSxzZXQgZGVidWcodCl7dCYmIXRoaXMuY2FudmFzPyh0aGlzLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHRoaXMuY2FudmFzLndpZHRoPXRoaXMud2lkdGgqdGhpcy5waXhlbFJhdGlvLHRoaXMuY2FudmFzLmhlaWdodD10aGlzLmhlaWdodCp0aGlzLnBpeGVsUmF0aW8sdGhpcy5jYW52YXMuc3R5bGUud2lkdGg9dGhpcy53aWR0aCtcInB4XCIsdGhpcy5jYW52YXMuc3R5bGUud2lkdGg9dGhpcy53aWR0aCtcInB4XCIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyksdGhpcy5jdHg9dGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpKTohdCYmdGhpcy5jYW52YXMmJih0aGlzLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2FudmFzKSxkZWxldGUgdGhpcy5jdHgsZGVsZXRlIHRoaXMuY2FudmFzKX19LFNwcml0ZUF0bGFzLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24odCl7aWYodGhpcy5waXhlbFJhdGlvPT09dClyZXR1cm4hMTt2YXIgaT10aGlzLnBpeGVsUmF0aW87aWYodGhpcy5waXhlbFJhdGlvPXQsdGhpcy5jYW52YXMmJih0aGlzLmNhbnZhcy53aWR0aD10aGlzLndpZHRoKnRoaXMucGl4ZWxSYXRpbyx0aGlzLmNhbnZhcy5oZWlnaHQ9dGhpcy5oZWlnaHQqdGhpcy5waXhlbFJhdGlvKSx0aGlzLmRhdGEpe3ZhciBlPXRoaXMuZGF0YTt0aGlzLmRhdGE9ITEsdGhpcy5hbGxvY2F0ZSgpLHRoaXMudGV4dHVyZT0hMTtmb3IodmFyIGg9dGhpcy53aWR0aCppLGE9dGhpcy5oZWlnaHQqaSxzPXRoaXMud2lkdGgqdCxyPXRoaXMuaGVpZ2h0KnQsbz10aGlzLmRhdGEsbj1lLGw9MDtyPmw7bCsrKWZvcih2YXIgcD1NYXRoLmZsb29yKGwqYS9yKSpoLGQ9bCpzLGM9MDtzPmM7YysrKXt2YXIgeD1NYXRoLmZsb29yKGMqaC9zKTtvW2QrY109bltwK3hdfWU9bnVsbCx0aGlzLmRpcnR5PSEwfXJldHVybiB0aGlzLmRpcnR5fSxTcHJpdGVBdGxhcy5wcm90b3R5cGUuYWxsb2NhdGVJbWFnZT1mdW5jdGlvbih0LGkpe3ZhciBlPTIsaD10K2UrKDQtKHQrZSklNCksYT1pK2UrKDQtKGkrZSklNCkscz10aGlzLmJpbi5hbGxvY2F0ZShoLGEpO3JldHVybiAwPT09cy53P3M6KHMub3JpZ2luYWxXaWR0aD10LHMub3JpZ2luYWxIZWlnaHQ9aSxzKX0sU3ByaXRlQXRsYXMucHJvdG90eXBlLmdldEltYWdlPWZ1bmN0aW9uKHQsaSl7aWYodGhpcy5pbWFnZXNbdF0pcmV0dXJuIHRoaXMuaW1hZ2VzW3RdO2lmKCF0aGlzLnNwcml0ZSlyZXR1cm4gbnVsbDt2YXIgZT10aGlzLnNwcml0ZS5nZXRTcHJpdGVQb3NpdGlvbih0KTtpZighZS53aWR0aHx8IWUuaGVpZ2h0KXJldHVybiBudWxsO3ZhciBoPWUud2lkdGgvZS5waXhlbFJhdGlvLGE9ZS5oZWlnaHQvZS5waXhlbFJhdGlvLHM9dGhpcy5hbGxvY2F0ZUltYWdlKGgsYSk7aWYoMD09PXMudylyZXR1cm4gczt2YXIgcj1uZXcgQXRsYXNJbWFnZShzLGgsYSxlLnNkZik7cmV0dXJuIHRoaXMuaW1hZ2VzW3RdPXIsdGhpcy5jb3B5KHMsZSxpKSxyfSxTcHJpdGVBdGxhcy5wcm90b3R5cGUuZ2V0UG9zaXRpb249ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLmdldEltYWdlKHQsaSksaD1lJiZlLnJlY3Q7aWYoIWgpcmV0dXJuIG51bGw7dmFyIGE9aT9lLndpZHRoOmgudyxzPWk/ZS5oZWlnaHQ6aC5oLHI9MTtyZXR1cm57c2l6ZTpbYSxzXSx0bDpbKGgueCtyKS90aGlzLndpZHRoLChoLnkrcikvdGhpcy5oZWlnaHRdLGJyOlsoaC54K3IrYSkvdGhpcy53aWR0aCwoaC55K3IrcykvdGhpcy5oZWlnaHRdfX0sU3ByaXRlQXRsYXMucHJvdG90eXBlLmFsbG9jYXRlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuZGF0YSl7dmFyIHQ9TWF0aC5mbG9vcih0aGlzLndpZHRoKnRoaXMucGl4ZWxSYXRpbyksaT1NYXRoLmZsb29yKHRoaXMuaGVpZ2h0KnRoaXMucGl4ZWxSYXRpbyk7dGhpcy5kYXRhPW5ldyBVaW50MzJBcnJheSh0KmkpO2Zvcih2YXIgZT0wO2U8dGhpcy5kYXRhLmxlbmd0aDtlKyspdGhpcy5kYXRhW2VdPTB9fSxTcHJpdGVBdGxhcy5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGksZSl7aWYodGhpcy5zcHJpdGUuaW1nLmRhdGEpe3ZhciBoPW5ldyBVaW50MzJBcnJheSh0aGlzLnNwcml0ZS5pbWcuZGF0YS5idWZmZXIpO3RoaXMuYWxsb2NhdGUoKTt2YXIgYT10aGlzLmRhdGEscz0xO2NvcHlCaXRtYXAoaCx0aGlzLnNwcml0ZS5pbWcud2lkdGgsaS54LGkueSxhLHRoaXMud2lkdGgqdGhpcy5waXhlbFJhdGlvLCh0LngrcykqdGhpcy5waXhlbFJhdGlvLCh0LnkrcykqdGhpcy5waXhlbFJhdGlvLGkud2lkdGgsaS5oZWlnaHQsZSksdGhpcy5kaXJ0eT0hMH19LFNwcml0ZUF0bGFzLnByb3RvdHlwZS5zZXRTcHJpdGU9ZnVuY3Rpb24odCl7dGhpcy5zcHJpdGU9dH0sU3ByaXRlQXRsYXMucHJvdG90eXBlLmFkZEljb25zPWZ1bmN0aW9uKHQsaSl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspdGhpcy5nZXRJbWFnZSh0W2VdKTtpKG51bGwsdGhpcy5pbWFnZXMpfSxTcHJpdGVBdGxhcy5wcm90b3R5cGUuYmluZD1mdW5jdGlvbih0LGkpe3ZhciBlPSExO3RoaXMudGV4dHVyZT90LmJpbmRUZXh0dXJlKHQuVEVYVFVSRV8yRCx0aGlzLnRleHR1cmUpOih0aGlzLnRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCksdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9XUkFQX1MsdC5DTEFNUF9UT19FREdFKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9XUkFQX1QsdC5DTEFNUF9UT19FREdFKSxlPSEwKTt2YXIgaD1pP3QuTElORUFSOnQuTkVBUkVTVDtpZihoIT09dGhpcy5maWx0ZXImJih0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9NSU5fRklMVEVSLGgpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX01BR19GSUxURVIsaCksdGhpcy5maWx0ZXI9aCksdGhpcy5kaXJ0eSYmKHRoaXMuYWxsb2NhdGUoKSxlP3QudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsMCx0LlJHQkEsdGhpcy53aWR0aCp0aGlzLnBpeGVsUmF0aW8sdGhpcy5oZWlnaHQqdGhpcy5waXhlbFJhdGlvLDAsdC5SR0JBLHQuVU5TSUdORURfQllURSxuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSk6dC50ZXhTdWJJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLDAsMCx0aGlzLndpZHRoKnRoaXMucGl4ZWxSYXRpbyx0aGlzLmhlaWdodCp0aGlzLnBpeGVsUmF0aW8sdC5SR0JBLHQuVU5TSUdORURfQllURSxuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSksdGhpcy5kaXJ0eT0hMSx0aGlzLmN0eCkpe3ZhciBhPXRoaXMuY3R4LmdldEltYWdlRGF0YSgwLDAsdGhpcy53aWR0aCp0aGlzLnBpeGVsUmF0aW8sdGhpcy5oZWlnaHQqdGhpcy5waXhlbFJhdGlvKTthLmRhdGEuc2V0KG5ldyBVaW50OENsYW1wZWRBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSksdGhpcy5jdHgucHV0SW1hZ2VEYXRhKGEsMCwwKSx0aGlzLmN0eC5zdHJva2VTdHlsZT1cInJlZFwiO2Zvcih2YXIgcz0wO3M8dGhpcy5iaW4uZnJlZS5sZW5ndGg7cysrKXt2YXIgcj10aGlzLmJpbi5mcmVlW3NdO3RoaXMuY3R4LnN0cm9rZVJlY3Qoci54KnRoaXMucGl4ZWxSYXRpbyxyLnkqdGhpcy5waXhlbFJhdGlvLHIudyp0aGlzLnBpeGVsUmF0aW8sci5oKnRoaXMucGl4ZWxSYXRpbyl9fX07XG59LHtcIi4vYmluX3BhY2tcIjo2M31dLDc4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksaW50ZXJwb2xhdGU9cmVxdWlyZShcIi4uL3V0aWwvaW50ZXJwb2xhdGVcIiksYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLExuZ0xhdD1yZXF1aXJlKFwiLi4vZ2VvL2xuZ19sYXRcIiksTG5nTGF0Qm91bmRzPXJlcXVpcmUoXCIuLi9nZW8vbG5nX2xhdF9ib3VuZHNcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLENhbWVyYT1tb2R1bGUuZXhwb3J0cz1mdW5jdGlvbigpe307dXRpbC5leHRlbmQoQ2FtZXJhLnByb3RvdHlwZSx7Z2V0Q2VudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLmNlbnRlcn0sc2V0Q2VudGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmp1bXBUbyh7Y2VudGVyOnR9KSx0aGlzfSxwYW5CeTpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLnBhblRvKHRoaXMudHJhbnNmb3JtLmNlbnRlcix1dGlsLmV4dGVuZCh7b2Zmc2V0OlBvaW50LmNvbnZlcnQodCkubXVsdCgtMSl9LGkpKSx0aGlzfSxwYW5UbzpmdW5jdGlvbih0LGkpe3RoaXMuc3RvcCgpLHQ9TG5nTGF0LmNvbnZlcnQodCksaT11dGlsLmV4dGVuZCh7ZHVyYXRpb246NTAwLGVhc2luZzp1dGlsLmVhc2Usb2Zmc2V0OlswLDBdfSxpKTt2YXIgZT10aGlzLnRyYW5zZm9ybSxuPVBvaW50LmNvbnZlcnQoaS5vZmZzZXQpLnJvdGF0ZSgtZS5hbmdsZSksbz1lLnBvaW50LHI9ZS5wcm9qZWN0KHQpLnN1YihuKTtyZXR1cm4gaS5ub01vdmVTdGFydHx8dGhpcy5maXJlKFwibW92ZXN0YXJ0XCIpLHRoaXMuX2Vhc2UoZnVuY3Rpb24odCl7ZS5jZW50ZXI9ZS51bnByb2plY3Qoby5hZGQoci5zdWIobykubXVsdCh0KSkpLHRoaXMuZmlyZShcIm1vdmVcIil9LGZ1bmN0aW9uKCl7dGhpcy5maXJlKFwibW92ZWVuZFwiKX0saSksdGhpc30sZ2V0Wm9vbTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRyYW5zZm9ybS56b29tfSxzZXRab29tOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmp1bXBUbyh7em9vbTp0fSksdGhpc30sem9vbVRvOmZ1bmN0aW9uKHQsaSl7dGhpcy5zdG9wKCksaT11dGlsLmV4dGVuZCh7ZHVyYXRpb246NTAwfSxpKSxpLmVhc2luZz10aGlzLl91cGRhdGVFYXNpbmcoaS5kdXJhdGlvbix0LGkuZWFzaW5nKTt2YXIgZT10aGlzLnRyYW5zZm9ybSxuPWUuY2VudGVyLG89ZS56b29tO3JldHVybiBpLmFyb3VuZD9uPUxuZ0xhdC5jb252ZXJ0KGkuYXJvdW5kKTppLm9mZnNldCYmKG49ZS5wb2ludExvY2F0aW9uKGUuY2VudGVyUG9pbnQuYWRkKFBvaW50LmNvbnZlcnQoaS5vZmZzZXQpKSkpLGkuYW5pbWF0ZT09PSExJiYoaS5kdXJhdGlvbj0wKSx0aGlzLnpvb21pbmd8fCh0aGlzLnpvb21pbmc9ITAsdGhpcy5maXJlKFwibW92ZXN0YXJ0XCIpKSx0aGlzLl9lYXNlKGZ1bmN0aW9uKGkpe2Uuc2V0Wm9vbUFyb3VuZChpbnRlcnBvbGF0ZShvLHQsaSksbiksdGhpcy5maXJlKFwibW92ZVwiKS5maXJlKFwiem9vbVwiKX0sZnVuY3Rpb24oKXt0aGlzLmVhc2U9bnVsbCxpLmR1cmF0aW9uPj0yMDAmJih0aGlzLnpvb21pbmc9ITEsdGhpcy5maXJlKFwibW92ZWVuZFwiKSl9LGkpLGkuZHVyYXRpb248MjAwJiYoY2xlYXJUaW1lb3V0KHRoaXMuX29uWm9vbUVuZCksdGhpcy5fb25ab29tRW5kPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpvb21pbmc9ITEsdGhpcy5maXJlKFwibW92ZWVuZFwiKX0uYmluZCh0aGlzKSwyMDApKSx0aGlzfSx6b29tSW46ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpKzEsdCksdGhpc30sem9vbU91dDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy56b29tVG8odGhpcy5nZXRab29tKCktMSx0KSx0aGlzfSxnZXRCZWFyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLmJlYXJpbmd9LHNldEJlYXJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuanVtcFRvKHtiZWFyaW5nOnR9KSx0aGlzfSxyb3RhdGVUbzpmdW5jdGlvbih0LGkpe3RoaXMuc3RvcCgpLGk9dXRpbC5leHRlbmQoe2R1cmF0aW9uOjUwMCxlYXNpbmc6dXRpbC5lYXNlfSxpKTt2YXIgZT10aGlzLnRyYW5zZm9ybSxuPXRoaXMuZ2V0QmVhcmluZygpLG89ZS5jZW50ZXI7cmV0dXJuIGkuYXJvdW5kP289TG5nTGF0LmNvbnZlcnQoaS5hcm91bmQpOmkub2Zmc2V0JiYobz1lLnBvaW50TG9jYXRpb24oZS5jZW50ZXJQb2ludC5hZGQoUG9pbnQuY29udmVydChpLm9mZnNldCkpKSksdD10aGlzLl9ub3JtYWxpemVCZWFyaW5nKHQsbiksdGhpcy5yb3RhdGluZz0hMCx0aGlzLmZpcmUoXCJtb3Zlc3RhcnRcIiksdGhpcy5fZWFzZShmdW5jdGlvbihpKXtlLnNldEJlYXJpbmdBcm91bmQoaW50ZXJwb2xhdGUobix0LGkpLG8pLHRoaXMuZmlyZShcIm1vdmVcIikuZmlyZShcInJvdGF0ZVwiKX0sZnVuY3Rpb24oKXt0aGlzLnJvdGF0aW5nPSExLHRoaXMuZmlyZShcIm1vdmVlbmRcIil9LGkpLHRoaXN9LHJlc2V0Tm9ydGg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucm90YXRlVG8oMCx1dGlsLmV4dGVuZCh7ZHVyYXRpb246MWUzfSx0KSksdGhpc30sc25hcFRvTm9ydGg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMuZ2V0QmVhcmluZygpKTx0aGlzLm9wdGlvbnMuYmVhcmluZ1NuYXA/dGhpcy5yZXNldE5vcnRoKHQpOnRoaXN9LGdldFBpdGNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLnBpdGNofSxzZXRQaXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5qdW1wVG8oe3BpdGNoOnR9KSx0aGlzfSxmaXRCb3VuZHM6ZnVuY3Rpb24odCxpKXtpPXV0aWwuZXh0ZW5kKHtwYWRkaW5nOjAsb2Zmc2V0OlswLDBdLG1heFpvb206MS8wfSxpKSx0PUxuZ0xhdEJvdW5kcy5jb252ZXJ0KHQpO3ZhciBlPVBvaW50LmNvbnZlcnQoaS5vZmZzZXQpLG49dGhpcy50cmFuc2Zvcm0sbz1uLnByb2plY3QodC5nZXROb3J0aFdlc3QoKSkscj1uLnByb2plY3QodC5nZXRTb3V0aEVhc3QoKSkscz1yLnN1YihvKSxhPShuLndpZHRoLTIqaS5wYWRkaW5nLTIqTWF0aC5hYnMoZS54KSkvcy54LGg9KG4uaGVpZ2h0LTIqaS5wYWRkaW5nLTIqTWF0aC5hYnMoZS55KSkvcy55O3JldHVybiBpLmNlbnRlcj1uLnVucHJvamVjdChvLmFkZChyKS5kaXYoMikpLGkuem9vbT1NYXRoLm1pbihuLnNjYWxlWm9vbShuLnNjYWxlKk1hdGgubWluKGEsaCkpLGkubWF4Wm9vbSksaS5iZWFyaW5nPTAsaS5saW5lYXI/dGhpcy5lYXNlVG8oaSk6dGhpcy5mbHlUbyhpKX0sanVtcFRvOmZ1bmN0aW9uKHQpe3RoaXMuc3RvcCgpO3ZhciBpPXRoaXMudHJhbnNmb3JtLGU9ITEsbj0hMSxvPSExO3JldHVyblwiY2VudGVyXCJpbiB0JiYoaS5jZW50ZXI9TG5nTGF0LmNvbnZlcnQodC5jZW50ZXIpKSxcInpvb21cImluIHQmJmkuem9vbSE9PSt0Lnpvb20mJihlPSEwLGkuem9vbT0rdC56b29tKSxcImJlYXJpbmdcImluIHQmJmkuYmVhcmluZyE9PSt0LmJlYXJpbmcmJihuPSEwLGkuYmVhcmluZz0rdC5iZWFyaW5nKSxcInBpdGNoXCJpbiB0JiZpLnBpdGNoIT09K3QucGl0Y2gmJihvPSEwLGkucGl0Y2g9K3QucGl0Y2gpLHRoaXMuZmlyZShcIm1vdmVzdGFydFwiKS5maXJlKFwibW92ZVwiKSxlJiZ0aGlzLmZpcmUoXCJ6b29tXCIpLG4mJnRoaXMuZmlyZShcInJvdGF0ZVwiKSxvJiZ0aGlzLmZpcmUoXCJwaXRjaFwiKSx0aGlzLmZpcmUoXCJtb3ZlZW5kXCIpfSxlYXNlVG86ZnVuY3Rpb24odCl7dGhpcy5zdG9wKCksdD11dGlsLmV4dGVuZCh7b2Zmc2V0OlswLDBdLGR1cmF0aW9uOjUwMCxlYXNpbmc6dXRpbC5lYXNlfSx0KTt2YXIgaT10aGlzLnRyYW5zZm9ybSxlPVBvaW50LmNvbnZlcnQodC5vZmZzZXQpLnJvdGF0ZSgtaS5hbmdsZSksbj1pLnBvaW50LG89dGhpcy5nZXRab29tKCkscj10aGlzLmdldEJlYXJpbmcoKSxzPXRoaXMuZ2V0UGl0Y2goKSxhPVwiem9vbVwiaW4gdD8rdC56b29tOm8saD1cImJlYXJpbmdcImluIHQ/dGhpcy5fbm9ybWFsaXplQmVhcmluZyh0LmJlYXJpbmcscik6cix1PVwicGl0Y2hcImluIHQ/K3QucGl0Y2g6cyxmPWkuem9vbVNjYWxlKGEtbyksYz1cImNlbnRlclwiaW4gdD9pLnByb2plY3QoTG5nTGF0LmNvbnZlcnQodC5jZW50ZXIpKS5zdWIoZS5kaXYoZikpOm4sbT1MbmdMYXQuY29udmVydCh0LmFyb3VuZCk7cmV0dXJuIGEhPT1vJiYodGhpcy56b29taW5nPSEwKSxyIT09aCYmKHRoaXMucm90YXRpbmc9ITApLHRoaXMuem9vbWluZyYmIW0mJihtPWkucG9pbnRMb2NhdGlvbihpLmNlbnRlclBvaW50LmFkZChjLnN1YihuKS5kaXYoMS0xL2YpKSkpLHRoaXMuZmlyZShcIm1vdmVzdGFydFwiKSx0aGlzLl9lYXNlKGZ1bmN0aW9uKHQpe3RoaXMuem9vbWluZz9pLnNldFpvb21Bcm91bmQoaW50ZXJwb2xhdGUobyxhLHQpLG0pOmkuY2VudGVyPWkudW5wcm9qZWN0KG4uYWRkKGMuc3ViKG4pLm11bHQodCkpKSx0aGlzLnJvdGF0aW5nJiYoaS5iZWFyaW5nPWludGVycG9sYXRlKHIsaCx0KSksdSE9PXMmJihpLnBpdGNoPWludGVycG9sYXRlKHMsdSx0KSksdGhpcy5maXJlKFwibW92ZVwiKSx0aGlzLnpvb21pbmcmJnRoaXMuZmlyZShcInpvb21cIiksdGhpcy5yb3RhdGluZyYmdGhpcy5maXJlKFwicm90YXRlXCIpfSxmdW5jdGlvbigpe3RoaXMuem9vbWluZz0hMSx0aGlzLnJvdGF0aW5nPSExLHRoaXMuZmlyZShcIm1vdmVlbmRcIil9LHQpLHRoaXN9LGZseVRvOmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGkodCl7dmFyIGk9KHoqei1iKmIrKHQ/LTE6MSkqTSpNKl8qXykvKDIqKHQ/ejpiKSpNKl8pO3JldHVybiBNYXRoLmxvZyhNYXRoLnNxcnQoaSppKzEpLWkpfWZ1bmN0aW9uIGUodCl7cmV0dXJuKE1hdGguZXhwKHQpLU1hdGguZXhwKC10KSkvMn1mdW5jdGlvbiBuKHQpe3JldHVybihNYXRoLmV4cCh0KStNYXRoLmV4cCgtdCkpLzJ9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gZSh0KS9uKHQpfXRoaXMuc3RvcCgpLHQ9dXRpbC5leHRlbmQoe29mZnNldDpbMCwwXSxzcGVlZDoxLjIsY3VydmU6MS40MixlYXNpbmc6dXRpbC5lYXNlfSx0KTt2YXIgcj10aGlzLnRyYW5zZm9ybSxzPVBvaW50LmNvbnZlcnQodC5vZmZzZXQpLGE9dGhpcy5nZXRab29tKCksaD10aGlzLmdldEJlYXJpbmcoKSx1PVwiY2VudGVyXCJpbiB0P0xuZ0xhdC5jb252ZXJ0KHQuY2VudGVyKTp0aGlzLmdldENlbnRlcigpLGY9XCJ6b29tXCJpbiB0Pyt0Lnpvb206YSxjPVwiYmVhcmluZ1wiaW4gdD90aGlzLl9ub3JtYWxpemVCZWFyaW5nKHQuYmVhcmluZyxoKTpoLG09ci56b29tU2NhbGUoZi1hKSxnPXIucG9pbnQsZD1yLnByb2plY3QodSkuc3ViKHMuZGl2KG0pKSxwPXIud29ybGRTaXplLGw9dC5jdXJ2ZSx2PXQuc3BlZWQsYj1NYXRoLm1heChyLndpZHRoLHIuaGVpZ2h0KSx6PWIvbSxfPWQuc3ViKGcpLm1hZygpLE09bCpsLEw9aSgwKSx4PWZ1bmN0aW9uKHQpe3JldHVybiBuKEwpL24oTCtsKnQpfSxUPWZ1bmN0aW9uKHQpe3JldHVybiBiKigobihMKSpvKEwrbCp0KS1lKEwpKS9NKS9ffSxCPShpKDEpLUwpL2w7aWYoTWF0aC5hYnMoXyk8MWUtNil7aWYoTWF0aC5hYnMoYi16KTwxZS02KXJldHVybiB0aGlzO3ZhciBqPWI+ej8tMToxO0I9TWF0aC5hYnMoTWF0aC5sb2coei9iKSkvbCxUPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LHg9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguZXhwKGoqbCp0KX19cmV0dXJuIHQuZHVyYXRpb249MWUzKkIvdix0aGlzLnpvb21pbmc9ITAsaCE9PWMmJih0aGlzLnJvdGF0aW5nPSEwKSx0aGlzLmZpcmUoXCJtb3Zlc3RhcnRcIiksdGhpcy5fZWFzZShmdW5jdGlvbih0KXt2YXIgaT10KkIsZT1UKGkpO3Iuem9vbT1hK3Iuc2NhbGVab29tKDEveChpKSksci5jZW50ZXI9ci51bnByb2plY3QoZy5hZGQoZC5zdWIoZykubXVsdChlKSkscCksYyE9PWgmJihyLmJlYXJpbmc9aW50ZXJwb2xhdGUoaCxjLHQpKSx0aGlzLmZpcmUoXCJtb3ZlXCIpLmZpcmUoXCJ6b29tXCIpLGMhPT1oJiZ0aGlzLmZpcmUoXCJyb3RhdGVcIil9LGZ1bmN0aW9uKCl7dGhpcy56b29taW5nPSExLHRoaXMucm90YXRpbmc9ITEsdGhpcy5maXJlKFwibW92ZWVuZFwiKX0sdCksdGhpc30saXNFYXNpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX2Fib3J0Rm59LHN0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWJvcnRGbiYmKHRoaXMuX2Fib3J0Rm4oKSx0aGlzLl9maW5pc2hFYXNlKCkpLHRoaXN9LF9lYXNlOmZ1bmN0aW9uKHQsaSxlKXt0aGlzLl9maW5pc2hGbj1pLHRoaXMuX2Fib3J0Rm49YnJvd3Nlci50aW1lZChmdW5jdGlvbihpKXt0LmNhbGwodGhpcyxlLmVhc2luZyhpKSksMT09PWkmJnRoaXMuX2ZpbmlzaEVhc2UoKX0sZS5hbmltYXRlPT09ITE/MDplLmR1cmF0aW9uLHRoaXMpfSxfZmluaXNoRWFzZTpmdW5jdGlvbigpe2RlbGV0ZSB0aGlzLl9hYm9ydEZuO3ZhciB0PXRoaXMuX2ZpbmlzaEZuO2RlbGV0ZSB0aGlzLl9maW5pc2hGbix0LmNhbGwodGhpcyl9LF9ub3JtYWxpemVCZWFyaW5nOmZ1bmN0aW9uKHQsaSl7dD11dGlsLndyYXAodCwtMTgwLDE4MCk7dmFyIGU9TWF0aC5hYnModC1pKTtyZXR1cm4gTWF0aC5hYnModC0zNjAtaSk8ZSYmKHQtPTM2MCksTWF0aC5hYnModCszNjAtaSk8ZSYmKHQrPTM2MCksdH0sX3VwZGF0ZUVhc2luZzpmdW5jdGlvbih0LGksZSl7dmFyIG47aWYodGhpcy5lYXNlKXt2YXIgbz10aGlzLmVhc2Uscj0oRGF0ZS5ub3coKS1vLnN0YXJ0KS9vLmR1cmF0aW9uLHM9by5lYXNpbmcocisuMDEpLW8uZWFzaW5nKHIpLGE9LjI3L01hdGguc3FydChzKnMrMWUtNCkqLjAxLGg9TWF0aC5zcXJ0KC4wNzI5LWEqYSk7bj11dGlsLmJlemllcihhLGgsLjI1LDEpfWVsc2Ugbj1lP3V0aWwuYmV6aWVyLmFwcGx5KHV0aWwsZSk6dXRpbC5lYXNlO3JldHVybiB0aGlzLmVhc2U9e3N0YXJ0OihuZXcgRGF0ZSkuZ2V0VGltZSgpLHRvOk1hdGgucG93KDIsaSksZHVyYXRpb246dCxlYXNpbmc6bn0sbn19KTtcbn0se1wiLi4vZ2VvL2xuZ19sYXRcIjoyMCxcIi4uL2dlby9sbmdfbGF0X2JvdW5kc1wiOjIxLFwiLi4vdXRpbC9icm93c2VyXCI6OTUsXCIuLi91dGlsL2ludGVycG9sYXRlXCI6MTAyLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSw3OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBBdHRyaWJ1dGlvbigpe312YXIgQ29udHJvbD1yZXF1aXJlKFwiLi9jb250cm9sXCIpLERPTT1yZXF1aXJlKFwiLi4vLi4vdXRpbC9kb21cIiksdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPUF0dHJpYnV0aW9uLEF0dHJpYnV0aW9uLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQ29udHJvbCx7b3B0aW9uczp7cG9zaXRpb246XCJib3R0b20tcmlnaHRcIn0sb25BZGQ6ZnVuY3Rpb24odCl7dmFyIGk9XCJtYXBib3hnbC1jdHJsLWF0dHJpYlwiLGU9dGhpcy5fY29udGFpbmVyPURPTS5jcmVhdGUoXCJkaXZcIixpLHQuZ2V0Q29udGFpbmVyKCkpO3JldHVybiB0aGlzLl91cGRhdGUoKSx0Lm9uKFwic291cmNlLmxvYWRcIix0aGlzLl91cGRhdGUuYmluZCh0aGlzKSksdC5vbihcInNvdXJjZS5jaGFuZ2VcIix0aGlzLl91cGRhdGUuYmluZCh0aGlzKSksdC5vbihcInNvdXJjZS5yZW1vdmVcIix0aGlzLl91cGRhdGUuYmluZCh0aGlzKSksdC5vbihcIm1vdmVlbmRcIix0aGlzLl91cGRhdGVFZGl0TGluay5iaW5kKHRoaXMpKSxlfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5fbWFwLnN0eWxlKWZvcih2YXIgaSBpbiB0aGlzLl9tYXAuc3R5bGUuc291cmNlcyl7dmFyIGU9dGhpcy5fbWFwLnN0eWxlLnNvdXJjZXNbaV07ZS5hdHRyaWJ1dGlvbiYmdC5pbmRleE9mKGUuYXR0cmlidXRpb24pPDAmJnQucHVzaChlLmF0dHJpYnV0aW9uKX10aGlzLl9jb250YWluZXIuaW5uZXJIVE1MPXQuam9pbihcIiB8IFwiKSx0aGlzLl9lZGl0TGluaz10aGlzLl9jb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcIm1hcGJveC1pbXByb3ZlLW1hcFwiKVswXSx0aGlzLl91cGRhdGVFZGl0TGluaygpfSxfdXBkYXRlRWRpdExpbms6ZnVuY3Rpb24oKXtpZih0aGlzLl9lZGl0TGluayl7dmFyIHQ9dGhpcy5fbWFwLmdldENlbnRlcigpO3RoaXMuX2VkaXRMaW5rLmhyZWY9XCJodHRwczovL3d3dy5tYXBib3guY29tL21hcC1mZWVkYmFjay8jL1wiK3QubG5nK1wiL1wiK3QubGF0K1wiL1wiK01hdGgucm91bmQodGhpcy5fbWFwLmdldFpvb20oKSsxKX19fSk7XG59LHtcIi4uLy4uL3V0aWwvZG9tXCI6OTgsXCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2NvbnRyb2xcIjo4MH1dLDgwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIENvbnRyb2woKXt9bW9kdWxlLmV4cG9ydHM9Q29udHJvbCxDb250cm9sLnByb3RvdHlwZT17YWRkVG86ZnVuY3Rpb24obyl7dGhpcy5fbWFwPW87dmFyIHQ9dGhpcy5fY29udGFpbmVyPXRoaXMub25BZGQobyk7aWYodGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMucG9zaXRpb24pe3ZhciBpPXRoaXMub3B0aW9ucy5wb3NpdGlvbixuPW8uX2NvbnRyb2xDb3JuZXJzW2ldO3QuY2xhc3NOYW1lKz1cIiBtYXBib3hnbC1jdHJsXCIsLTEhPT1pLmluZGV4T2YoXCJib3R0b21cIik/bi5pbnNlcnRCZWZvcmUodCxuLmZpcnN0Q2hpbGQpOm4uYXBwZW5kQ2hpbGQodCl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpLHRoaXMub25SZW1vdmUmJnRoaXMub25SZW1vdmUodGhpcy5fbWFwKSx0aGlzLl9tYXA9bnVsbCx0aGlzfX07XG59LHt9XSw4MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBOYXZpZ2F0aW9uKHQpe3V0aWwuc2V0T3B0aW9ucyh0aGlzLHQpfXZhciBDb250cm9sPXJlcXVpcmUoXCIuL2NvbnRyb2xcIiksRE9NPXJlcXVpcmUoXCIuLi8uLi91dGlsL2RvbVwiKSx1dGlsPXJlcXVpcmUoXCIuLi8uLi91dGlsL3V0aWxcIik7bW9kdWxlLmV4cG9ydHM9TmF2aWdhdGlvbixOYXZpZ2F0aW9uLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQ29udHJvbCx7b3B0aW9uczp7cG9zaXRpb246XCJ0b3AtcmlnaHRcIn0sb25BZGQ6ZnVuY3Rpb24odCl7dmFyIG89XCJtYXBib3hnbC1jdHJsXCIscz10aGlzLl9jb250YWluZXI9RE9NLmNyZWF0ZShcImRpdlwiLG8rXCItZ3JvdXBcIix0LmdldENvbnRhaW5lcigpKTt0aGlzLl96b29tSW5CdXR0b249dGhpcy5fY3JlYXRlQnV0dG9uKG8rXCItaWNvbiBcIitvK1wiLXpvb20taW5cIix0Lnpvb21Jbi5iaW5kKHQpKSx0aGlzLl96b29tT3V0QnV0dG9uPXRoaXMuX2NyZWF0ZUJ1dHRvbihvK1wiLWljb24gXCIrbytcIi16b29tLW91dFwiLHQuem9vbU91dC5iaW5kKHQpKSx0aGlzLl9jb21wYXNzPXRoaXMuX2NyZWF0ZUJ1dHRvbihvK1wiLWNvbXBhc3NcIix0LnJlc2V0Tm9ydGguYmluZCh0KSk7dmFyIGU9dGhpcy5fY29tcGFzc0NhbnZhcz1ET00uY3JlYXRlKFwiY2FudmFzXCIsbytcIi1jb21wYXNzLWNhbnZhc1wiLHRoaXMuX2NvbXBhc3MpO3JldHVybiBlLnN0eWxlLmNzc1RleHQ9XCJ3aWR0aDozMHB4OyBoZWlnaHQ6MzBweDtcIixlLndpZHRoPTUyLGUuaGVpZ2h0PTUyLHRoaXMuX2NvbXBhc3MuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMuX29uQ29tcGFzc0Rvd24uYmluZCh0aGlzKSksdGhpcy5fb25Db21wYXNzTW92ZT10aGlzLl9vbkNvbXBhc3NNb3ZlLmJpbmQodGhpcyksdGhpcy5fb25Db21wYXNzVXA9dGhpcy5fb25Db21wYXNzVXAuYmluZCh0aGlzKSx0aGlzLl9jb21wYXNzQ3R4PWUuZ2V0Q29udGV4dChcIjJkXCIpLHQub24oXCJyb3RhdGVcIix0aGlzLl9kcmF3Tm9ydGguYmluZCh0aGlzKSksdGhpcy5fZHJhd05vcnRoKCksc30sX29uQ29tcGFzc0Rvd246ZnVuY3Rpb24odCl7RE9NLmRpc2FibGVEcmFnKCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuX29uQ29tcGFzc01vdmUpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25Db21wYXNzVXApLHRoaXMuX3ByZXZYPXQuc2NyZWVuWCx0LnN0b3BQcm9wYWdhdGlvbigpfSxfb25Db21wYXNzTW92ZTpmdW5jdGlvbih0KXt2YXIgbz10LnNjcmVlblgscz0yPm8/LTU6bz53aW5kb3cuc2NyZWVuLndpZHRoLTI/NTooby10aGlzLl9wcmV2WCkvNDt0aGlzLl9tYXAuc2V0QmVhcmluZyh0aGlzLl9tYXAuZ2V0QmVhcmluZygpLXMpLHRoaXMuX3ByZXZYPXQuc2NyZWVuWCx0aGlzLl9tb3ZlZD0hMCx0LnByZXZlbnREZWZhdWx0KCl9LF9vbkNvbXBhc3NVcDpmdW5jdGlvbigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbkNvbXBhc3NNb3ZlKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uQ29tcGFzc1VwKSxET00uZW5hYmxlRHJhZygpLHRoaXMuX21vdmVkJiYodGhpcy5fbW92ZWQ9ITEsRE9NLnN1cHByZXNzQ2xpY2soKSksdGhpcy5fbWFwLnNuYXBUb05vcnRoKCl9LF9jcmVhdGVCdXR0b246ZnVuY3Rpb24odCxvKXt2YXIgcz1ET00uY3JlYXRlKFwiYnV0dG9uXCIsdCx0aGlzLl9jb250YWluZXIpO3JldHVybiBzLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGZ1bmN0aW9uKCl7bygpfSksc30sX2RyYXdOb3J0aDpmdW5jdGlvbigpe3ZhciB0PTIwLG89OCxzPTI2LGU9dGhpcy5fbWFwLnRyYW5zZm9ybS5hbmdsZStNYXRoLlBJLzIsaT10aGlzLl9jb21wYXNzQ3R4O3RoaXMuX2NvbXBhc3NDYW52YXMud2lkdGg9dGhpcy5fY29tcGFzc0NhbnZhcy53aWR0aCxpLnRyYW5zbGF0ZShzLHMpLGkucm90YXRlKGUpLGkuYmVnaW5QYXRoKCksaS5maWxsU3R5bGU9XCIjMDAwXCIsaS5saW5lVG8oMCwtbyksaS5saW5lVG8oLXQsMCksaS5saW5lVG8oMCxvKSxpLmZpbGwoKSxpLmJlZ2luUGF0aCgpLGkuZmlsbFN0eWxlPVwiI2JiYlwiLGkubW92ZVRvKDAsMCksaS5saW5lVG8oMCxvKSxpLmxpbmVUbyh0LDApLGkubGluZVRvKDAsLW8pLGkuZmlsbCgpLGkuYmVnaW5QYXRoKCksaS5zdHJva2VTdHlsZT1cIiNmZmZcIixpLmxpbmVXaWR0aD00LGkubW92ZVRvKDAsLW8pLGkubGluZVRvKDAsbyksaS5zdHJva2UoKX19KTtcbn0se1wiLi4vLi4vdXRpbC9kb21cIjo5OCxcIi4uLy4uL3V0aWwvdXRpbFwiOjEwNixcIi4vY29udHJvbFwiOjgwfV0sODI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQm94Wm9vbShvKXt0aGlzLl9tYXA9byx0aGlzLl9lbD1vLmdldENhbnZhc0NvbnRhaW5lcigpLHRoaXMuX2NvbnRhaW5lcj1vLmdldENvbnRhaW5lcigpLHV0aWwuYmluZEhhbmRsZXJzKHRoaXMpfXZhciBET009cmVxdWlyZShcIi4uLy4uL3V0aWwvZG9tXCIpLExuZ0xhdEJvdW5kcz1yZXF1aXJlKFwiLi4vLi4vZ2VvL2xuZ19sYXRfYm91bmRzXCIpLHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKTttb2R1bGUuZXhwb3J0cz1Cb3hab29tLEJveFpvb20ucHJvdG90eXBlPXtlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsdGhpcy5fb25Nb3VzZURvd24sITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMuX29uTW91c2VEb3duKX0sX29uTW91c2VEb3duOmZ1bmN0aW9uKG8peyhvLnNoaWZ0S2V5fHwxPT09by53aGljaCYmMT09PW8uYnV0dG9uKSYmKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdXNlTW92ZSwhMSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIix0aGlzLl9vbktleURvd24sITEpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25Nb3VzZVVwLCExKSx0aGlzLl9zdGFydFBvcz1ET00ubW91c2VQb3ModGhpcy5fZWwsbyksdGhpcy5hY3RpdmU9ITApfSxfb25Nb3VzZU1vdmU6ZnVuY3Rpb24obyl7dmFyIGU9dGhpcy5fc3RhcnRQb3MsdD1ET00ubW91c2VQb3ModGhpcy5fZWwsbyk7dGhpcy5fYm94fHwodGhpcy5fYm94PURPTS5jcmVhdGUoXCJkaXZcIixcIm1hcGJveGdsLWJveHpvb21cIix0aGlzLl9jb250YWluZXIpLHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY3Jvc3NoYWlyXCIpLERPTS5kaXNhYmxlRHJhZygpLHRoaXMuX21hcC5maXJlKFwiYm94em9vbXN0YXJ0XCIpKTt2YXIgcz1NYXRoLm1pbihlLngsdC54KSxuPU1hdGgubWF4KGUueCx0LngpLGk9TWF0aC5taW4oZS55LHQueSksYT1NYXRoLm1heChlLnksdC55KTtET00uc2V0VHJhbnNmb3JtKHRoaXMuX2JveCxcInRyYW5zbGF0ZShcIitzK1wicHgsXCIraStcInB4KVwiKSx0aGlzLl9ib3guc3R5bGUud2lkdGg9bi1zK1wicHhcIix0aGlzLl9ib3guc3R5bGUuaGVpZ2h0PWEtaStcInB4XCJ9LF9vbk1vdXNlVXA6ZnVuY3Rpb24obyl7dmFyIGU9dGhpcy5fc3RhcnRQb3MsdD1ET00ubW91c2VQb3ModGhpcy5fZWwsbykscz1uZXcgTG5nTGF0Qm91bmRzKHRoaXMuX21hcC51bnByb2plY3QoZSksdGhpcy5fbWFwLnVucHJvamVjdCh0KSk7dGhpcy5fZmluaXNoKCksdGhpcy5fbWFwLmZpdEJvdW5kcyhzLHtsaW5lYXI6ITB9KS5maXJlKFwiYm94em9vbWVuZFwiLHtib3hab29tQm91bmRzOnN9KX0sX29uS2V5RG93bjpmdW5jdGlvbihvKXsyNz09PW8ua2V5Q29kZSYmKHRoaXMuX2ZpbmlzaCgpLHRoaXMuX21hcC5maXJlKFwiYm94em9vbWNhbmNlbFwiKSl9LF9maW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9ib3gmJih0aGlzLmFjdGl2ZT0hMSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5fb25Nb3VzZU1vdmUsITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsdGhpcy5fb25LZXlEb3duLCExKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCwhMSksdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBib3hnbC1jcm9zc2hhaXJcIiksdGhpcy5fYm94LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fYm94KSx0aGlzLl9ib3g9bnVsbCxET00uZW5hYmxlRHJhZygpKX19O1xufSx7XCIuLi8uLi9nZW8vbG5nX2xhdF9ib3VuZHNcIjoyMSxcIi4uLy4uL3V0aWwvZG9tXCI6OTgsXCIuLi8uLi91dGlsL3V0aWxcIjoxMDZ9XSw4MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBEb3VibGVDbGlja1pvb20obyl7dGhpcy5fbWFwPW8sdGhpcy5fb25EYmxDbGljaz10aGlzLl9vbkRibENsaWNrLmJpbmQodGhpcyl9bW9kdWxlLmV4cG9ydHM9RG91YmxlQ2xpY2tab29tLERvdWJsZUNsaWNrWm9vbS5wcm90b3R5cGU9e2VuYWJsZTpmdW5jdGlvbigpe3RoaXMuX21hcC5vbihcImRibGNsaWNrXCIsdGhpcy5fb25EYmxDbGljayl9LGRpc2FibGU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAub2ZmKFwiZGJsY2xpY2tcIix0aGlzLl9vbkRibENsaWNrKX0sX29uRGJsQ2xpY2s6ZnVuY3Rpb24obyl7dGhpcy5fbWFwLnpvb21UbyhNYXRoLnJvdW5kKHRoaXMuX21hcC5nZXRab29tKCkpKzEse2Fyb3VuZDpvLmxuZ0xhdH0pfX07XG59LHt9XSw4NDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBEcmFnUGFuKGUpe3RoaXMuX21hcD1lLHRoaXMuX2VsPWUuZ2V0Q2FudmFzQ29udGFpbmVyKCksdXRpbC5iaW5kSGFuZGxlcnModGhpcyl9dmFyIERPTT1yZXF1aXJlKFwiLi4vLi4vdXRpbC9kb21cIiksdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPURyYWdQYW47dmFyIGluZXJ0aWFMaW5lYXJpdHk9LjI1LGluZXJ0aWFFYXNpbmc9dXRpbC5iZXppZXIoMCwwLGluZXJ0aWFMaW5lYXJpdHksMSksaW5lcnRpYU1heFNwZWVkPTNlMyxpbmVydGlhRGVjZWxlcmF0aW9uPTRlMztEcmFnUGFuLnByb3RvdHlwZT17ZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMuX29uRG93biwhMSksdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIix0aGlzLl9vbkRvd24sITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMuX29uRG93biksdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIix0aGlzLl9vbkRvd24pfSxfb25Eb3duOmZ1bmN0aW9uKGUpe3RoaXMuX3N0YXJ0UG9zPXRoaXMuX3Bvcz1ET00ubW91c2VQb3ModGhpcy5fZWwsZSksdGhpcy5faW5lcnRpYT1bW0RhdGUubm93KCksdGhpcy5fcG9zXV0sZS50b3VjaGVzPzE9PT1lLnRvdWNoZXMubGVuZ3RoJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuX29uTW92ZSwhMSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5fb25Ub3VjaEVuZCwhMSkpOihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5fb25Nb3ZlLCExKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCwhMSkpfSxfb25Nb3ZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX21hcDtpZighKHQuYm94Wm9vbS5hY3RpdmV8fHQuZHJhZ1JvdGF0ZS5hY3RpdmV8fGUudG91Y2hlcyYmZS50b3VjaGVzLmxlbmd0aD4xKSl7dGhpcy5hY3RpdmU9ITA7dmFyIG49RE9NLm1vdXNlUG9zKHRoaXMuX2VsLGUpLGk9dGhpcy5faW5lcnRpYSxvPURhdGUubm93KCk7Zm9yKGkucHVzaChbbyxuXSk7aS5sZW5ndGg+MiYmby1pWzBdWzBdPjUwOylpLnNoaWZ0KCk7dC5zdG9wKCksdC50cmFuc2Zvcm0uc2V0TG9jYXRpb25BdFBvaW50KHQudHJhbnNmb3JtLnBvaW50TG9jYXRpb24odGhpcy5fcG9zKSxuKSx0LmZpcmUoXCJtb3ZlXCIpLHRoaXMuX3Bvcz1uLGUucHJldmVudERlZmF1bHQoKX19LF9vblVwOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5faW5lcnRpYTtpZihlLmxlbmd0aDwyKXJldHVybiB2b2lkIHRoaXMuX21hcC5maXJlKFwibW92ZWVuZFwiKTt2YXIgdD1lW2UubGVuZ3RoLTFdLG49ZVswXSxpPXRbMV0uc3ViKG5bMV0pLG89KHRbMF0tblswXSkvMWUzLHM9aS5tdWx0KGluZXJ0aWFMaW5lYXJpdHkvbyksYT1zLm1hZygpO2E+aW5lcnRpYU1heFNwZWVkJiYoYT1pbmVydGlhTWF4U3BlZWQscy5fdW5pdCgpLl9tdWx0KGEpKTt2YXIgcj1hLyhpbmVydGlhRGVjZWxlcmF0aW9uKmluZXJ0aWFMaW5lYXJpdHkpLHU9cy5tdWx0KC1yLzIpO3RoaXMuX21hcC5wYW5CeSh1LHtkdXJhdGlvbjoxZTMqcixlYXNpbmc6aW5lcnRpYUVhc2luZyxub01vdmVTdGFydDohMH0pLHRoaXMuYWN0aXZlPSExfSxfb25Nb3VzZVVwOmZ1bmN0aW9uKCl7dGhpcy5fb25VcCgpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdmUsITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25Nb3VzZVVwLCExKX0sX29uVG91Y2hFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9vblVwKCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuX29uTW92ZSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5fb25Ub3VjaEVuZCl9fTtcbn0se1wiLi4vLi4vdXRpbC9kb21cIjo5OCxcIi4uLy4uL3V0aWwvdXRpbFwiOjEwNn1dLDg1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIERyYWdSb3RhdGUodCl7dGhpcy5fbWFwPXQsdGhpcy5fZWw9dC5nZXRDYW52YXNDb250YWluZXIoKSx1dGlsLmJpbmRIYW5kbGVycyh0aGlzKX12YXIgRE9NPXJlcXVpcmUoXCIuLi8uLi91dGlsL2RvbVwiKSxQb2ludD1yZXF1aXJlKFwicG9pbnQtZ2VvbWV0cnlcIiksdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPURyYWdSb3RhdGUsRHJhZ1JvdGF0ZS5wcm90b3R5cGU9e2VuYWJsZTpmdW5jdGlvbigpe3RoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLHRoaXMuX29uQ29udGV4dE1lbnUsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsdGhpcy5fb25Db250ZXh0TWVudSl9LF9vbkNvbnRleHRNZW51OmZ1bmN0aW9uKHQpe3RoaXMuX21hcC5zdG9wKCksdGhpcy5fc3RhcnRQb3M9dGhpcy5fcG9zPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5fb25Nb3VzZU1vdmUsITEpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25Nb3VzZVVwLCExKSx0LnByZXZlbnREZWZhdWx0KCl9LF9vbk1vdXNlTW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zdGFydFBvcyxvPXRoaXMuX3BvcyxuPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0KSxpPXRoaXMuX21hcCxzPWkudHJhbnNmb3JtLmNlbnRlclBvaW50LHI9ZS5zdWIocyksdT1yLm1hZygpO3RoaXMuYWN0aXZlPSEwLGkucm90YXRpbmd8fChpLmZpcmUoXCJtb3Zlc3RhcnRcIiksaS5yb3RhdGluZz0hMCksMjAwPnUmJihzPWUuYWRkKG5ldyBQb2ludCgtMjAwLDApLl9yb3RhdGUoci5hbmdsZSgpKSkpO3ZhciBhPW8uc3ViKHMpLmFuZ2xlV2l0aChuLnN1YihzKSkvTWF0aC5QSSoxODA7aS50cmFuc2Zvcm0uYmVhcmluZz1pLmdldEJlYXJpbmcoKS1hLGkuZmlyZShcIm1vdmVcIikuZmlyZShcInJvdGF0ZVwiKSxjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCksdGhpcy5fdGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX29uVGltZW91dCwyMDApLHRoaXMuX3Bvcz1ufSxfb25UaW1lb3V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwO3Qucm90YXRpbmc9ITEsdC5zbmFwVG9Ob3J0aCgpLHQucm90YXRpbmd8fCh0Ll9yZXJlbmRlcigpLHQuZmlyZShcIm1vdmVlbmRcIikpfSxfb25Nb3VzZVVwOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmU9ITEsZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuX29uTW91c2VNb3ZlLCExKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCwhMSl9fTtcbn0se1wiLi4vLi4vdXRpbC9kb21cIjo5OCxcIi4uLy4uL3V0aWwvdXRpbFwiOjEwNixcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sODY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gS2V5Ym9hcmQoZSl7dGhpcy5fbWFwPWUsdGhpcy5fZWw9ZS5nZXRDYW52YXNDb250YWluZXIoKSx0aGlzLl9vbktleURvd249dGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyl9bW9kdWxlLmV4cG9ydHM9S2V5Ym9hcmQ7dmFyIHBhbkRlbHRhPTgwLHJvdGF0ZURlbHRhPTI7S2V5Ym9hcmQucHJvdG90eXBlPXtlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLHRoaXMuX29uS2V5RG93biwhMSl9LGRpc2FibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLHRoaXMuX29uS2V5RG93bil9LF9vbktleURvd246ZnVuY3Rpb24oZSl7aWYoIShlLmFsdEtleXx8ZS5jdHJsS2V5fHxlLm1ldGFLZXkpKXt2YXIgYT10aGlzLl9tYXA7c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSA2MTpjYXNlIDEwNzpjYXNlIDE3MTpjYXNlIDE4NzphLnpvb21UbyhNYXRoLnJvdW5kKGEuZ2V0Wm9vbSgpKSsoZS5zaGlmdEtleT8yOjEpKTticmVhaztjYXNlIDE4OTpjYXNlIDEwOTpjYXNlIDE3MzphLnpvb21UbyhNYXRoLnJvdW5kKGEuZ2V0Wm9vbSgpKS0oZS5zaGlmdEtleT8yOjEpKTticmVhaztjYXNlIDM3OmUuc2hpZnRLZXk/YS5zZXRCZWFyaW5nKGEuZ2V0QmVhcmluZygpLXJvdGF0ZURlbHRhKTphLnBhbkJ5KFstcGFuRGVsdGEsMF0pO2JyZWFrO2Nhc2UgMzk6ZS5zaGlmdEtleT9hLnNldEJlYXJpbmcoYS5nZXRCZWFyaW5nKCkrcm90YXRlRGVsdGEpOmEucGFuQnkoW3BhbkRlbHRhLDBdKTticmVhaztjYXNlIDM4OmEucGFuQnkoWzAsLXBhbkRlbHRhXSk7YnJlYWs7Y2FzZSA0MDphLnBhbkJ5KFswLHBhbkRlbHRhXSl9fX19O1xufSx7fV0sODc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gUGluY2godCl7dGhpcy5fbWFwPXQsdGhpcy5fZWw9dC5nZXRDYW52YXNDb250YWluZXIoKSx1dGlsLmJpbmRIYW5kbGVycyh0aGlzKX12YXIgRE9NPXJlcXVpcmUoXCIuLi8uLi91dGlsL2RvbVwiKSx1dGlsPXJlcXVpcmUoXCIuLi8uLi91dGlsL3V0aWxcIik7bW9kdWxlLmV4cG9ydHM9UGluY2gsUGluY2gucHJvdG90eXBlPXtlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLHRoaXMuX29uU3RhcnQsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIix0aGlzLl9vblN0YXJ0KX0sX29uU3RhcnQ6ZnVuY3Rpb24odCl7aWYoMj09PXQudG91Y2hlcy5sZW5ndGgpe3ZhciBlPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0LnRvdWNoZXNbMF0pLHM9RE9NLm1vdXNlUG9zKHRoaXMuX2VsLHQudG91Y2hlc1sxXSk7dGhpcy5fc3RhcnRWZWM9ZS5zdWIocyksdGhpcy5fc3RhcnRTY2FsZT10aGlzLl9tYXAudHJhbnNmb3JtLnNjYWxlLHRoaXMuX3N0YXJ0QmVhcmluZz10aGlzLl9tYXAudHJhbnNmb3JtLmJlYXJpbmcsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuX29uTW92ZSwhMSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5fb25FbmQsITEpfX0sX29uTW92ZTpmdW5jdGlvbih0KXtpZigyPT09dC50b3VjaGVzLmxlbmd0aCl7dmFyIGU9RE9NLm1vdXNlUG9zKHRoaXMuX2VsLHQudG91Y2hlc1swXSkscz1ET00ubW91c2VQb3ModGhpcy5fZWwsdC50b3VjaGVzWzFdKSxuPWUuYWRkKHMpLmRpdigyKSxvPWUuc3ViKHMpLGk9by5tYWcoKS90aGlzLl9zdGFydFZlYy5tYWcoKSxhPTE4MCpvLmFuZ2xlV2l0aCh0aGlzLl9zdGFydFZlYykvTWF0aC5QSSxyPXRoaXMuX21hcDtyLmVhc2VUbyh7em9vbTpyLnRyYW5zZm9ybS5zY2FsZVpvb20odGhpcy5fc3RhcnRTY2FsZSppKSxiZWFyaW5nOnRoaXMuX3N0YXJ0QmVhcmluZythLGR1cmF0aW9uOjAsYXJvdW5kOnIudW5wcm9qZWN0KG4pfSksdC5wcmV2ZW50RGVmYXVsdCgpfX0sX29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLnNuYXBUb05vcnRoKCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuX29uTW92ZSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5fb25FbmQpfX07XG59LHtcIi4uLy4uL3V0aWwvZG9tXCI6OTgsXCIuLi8uLi91dGlsL3V0aWxcIjoxMDZ9XSw4ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBTY3JvbGxab29tKGUpe3RoaXMuX21hcD1lLHRoaXMuX2VsPWUuZ2V0Q2FudmFzQ29udGFpbmVyKCksdXRpbC5iaW5kSGFuZGxlcnModGhpcyl9dmFyIERPTT1yZXF1aXJlKFwiLi4vLi4vdXRpbC9kb21cIiksYnJvd3Nlcj1yZXF1aXJlKFwiLi4vLi4vdXRpbC9icm93c2VyXCIpLHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKTttb2R1bGUuZXhwb3J0cz1TY3JvbGxab29tO3ZhciB1YT1cInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yP25hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTpcIlwiLGZpcmVmb3g9LTEhPT11YS5pbmRleE9mKFwiZmlyZWZveFwiKSxzYWZhcmk9LTEhPT11YS5pbmRleE9mKFwic2FmYXJpXCIpJiYtMT09PXVhLmluZGV4T2YoXCJjaHJvbVwiKTtTY3JvbGxab29tLnByb3RvdHlwZT17ZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsdGhpcy5fb25XaGVlbCwhMSksdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNld2hlZWxcIix0aGlzLl9vbldoZWVsLCExKX0sZGlzYWJsZTpmdW5jdGlvbigpe3RoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLHRoaXMuX29uV2hlZWwpLHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXdoZWVsXCIsdGhpcy5fb25XaGVlbCl9LF9vbldoZWVsOmZ1bmN0aW9uKGUpe3ZhciB0O1wid2hlZWxcIj09PWUudHlwZT8odD1lLmRlbHRhWSxmaXJlZm94JiZlLmRlbHRhTW9kZT09PXdpbmRvdy5XaGVlbEV2ZW50LkRPTV9ERUxUQV9QSVhFTCYmKHQvPWJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyksZS5kZWx0YU1vZGU9PT13aW5kb3cuV2hlZWxFdmVudC5ET01fREVMVEFfTElORSYmKHQqPTQwKSk6XCJtb3VzZXdoZWVsXCI9PT1lLnR5cGUmJih0PS1lLndoZWVsRGVsdGFZLHNhZmFyaSYmKHQvPTMpKTt2YXIgaT0od2luZG93LnBlcmZvcm1hbmNlfHxEYXRlKS5ub3coKSxvPWktKHRoaXMuX3RpbWV8fDApO3RoaXMuX3Bvcz1ET00ubW91c2VQb3ModGhpcy5fZWwsZSksdGhpcy5fdGltZT1pLDAhPT10JiZ0JTQuMDAwMjQ0MTQwNjI1PT09MD8odGhpcy5fdHlwZT1cIndoZWVsXCIsdD1NYXRoLmZsb29yKHQvNCkpOjAhPT10JiZNYXRoLmFicyh0KTw0P3RoaXMuX3R5cGU9XCJ0cmFja3BhZFwiOm8+NDAwPyh0aGlzLl90eXBlPW51bGwsdGhpcy5fbGFzdFZhbHVlPXQsdGhpcy5fdGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX29uVGltZW91dCw0MCkpOnRoaXMuX3R5cGV8fCh0aGlzLl90eXBlPU1hdGguYWJzKG8qdCk8MjAwP1widHJhY2twYWRcIjpcIndoZWVsXCIsdGhpcy5fdGltZW91dCYmKGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KSx0aGlzLl90aW1lb3V0PW51bGwsdCs9dGhpcy5fbGFzdFZhbHVlKSksZS5zaGlmdEtleSYmdCYmKHQvPTQpLHRoaXMuX3R5cGUmJnRoaXMuX3pvb20oLXQpLGUucHJldmVudERlZmF1bHQoKX0sX29uVGltZW91dDpmdW5jdGlvbigpe3RoaXMuX3R5cGU9XCJ3aGVlbFwiLHRoaXMuX3pvb20oLXRoaXMuX2xhc3RWYWx1ZSl9LF96b29tOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX21hcCxpPTIvKDErTWF0aC5leHAoLU1hdGguYWJzKGUvMTAwKSkpOzA+ZSYmMCE9PWkmJihpPTEvaSk7dmFyIG89dC5lYXNlP3QuZWFzZS50bzp0LnRyYW5zZm9ybS5zY2FsZSxzPXQudHJhbnNmb3JtLnNjYWxlWm9vbShvKmkpO3Quem9vbVRvKHMse2R1cmF0aW9uOjAsYXJvdW5kOnQudW5wcm9qZWN0KHRoaXMuX3Bvcyl9KX19O1xufSx7XCIuLi8uLi91dGlsL2Jyb3dzZXJcIjo5NSxcIi4uLy4uL3V0aWwvZG9tXCI6OTgsXCIuLi8uLi91dGlsL3V0aWxcIjoxMDZ9XSw4OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBIYXNoKCl7dXRpbC5iaW5kQWxsKFtcIl9vbkhhc2hDaGFuZ2VcIixcIl91cGRhdGVIYXNoXCJdLHRoaXMpfW1vZHVsZS5leHBvcnRzPUhhc2g7dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKTtIYXNoLnByb3RvdHlwZT17YWRkVG86ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21hcD10LHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiaGFzaGNoYW5nZVwiLHRoaXMuX29uSGFzaENoYW5nZSwhMSksdGhpcy5fbWFwLm9uKFwibW92ZWVuZFwiLHRoaXMuX3VwZGF0ZUhhc2gpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImhhc2hjaGFuZ2VcIix0aGlzLl9vbkhhc2hDaGFuZ2UsITEpLHRoaXMuX21hcC5vZmYoXCJtb3ZlZW5kXCIsdGhpcy5fdXBkYXRlSGFzaCksZGVsZXRlIHRoaXMuX21hcCx0aGlzfSxfb25IYXNoQ2hhbmdlOmZ1bmN0aW9uKCl7dmFyIHQ9bG9jYXRpb24uaGFzaC5yZXBsYWNlKFwiI1wiLFwiXCIpLnNwbGl0KFwiL1wiKTtyZXR1cm4gdC5sZW5ndGg+PTM/KHRoaXMuX21hcC5qdW1wVG8oe2NlbnRlcjpbK3RbMl0sK3RbMV1dLHpvb206K3RbMF0sYmVhcmluZzorKHRbM118fDApfSksITApOiExfSxfdXBkYXRlSGFzaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5nZXRDZW50ZXIoKSxlPXRoaXMuX21hcC5nZXRab29tKCksYT10aGlzLl9tYXAuZ2V0QmVhcmluZygpLGg9TWF0aC5tYXgoMCxNYXRoLmNlaWwoTWF0aC5sb2coZSkvTWF0aC5MTjIpKSxuPVwiI1wiK01hdGgucm91bmQoMTAwKmUpLzEwMCtcIi9cIit0LmxhdC50b0ZpeGVkKGgpK1wiL1wiK3QubG5nLnRvRml4ZWQoaCkrKGE/XCIvXCIrTWF0aC5yb3VuZCgxMCphKS8xMDpcIlwiKTt3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoXCJcIixcIlwiLG4pfX07XG59LHtcIi4uL3V0aWwvdXRpbFwiOjEwNn1dLDkwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEludGVyYWN0aW9uKGUpe3RoaXMuX21hcD1lLHRoaXMuX2VsPWUuZ2V0Q2FudmFzQ29udGFpbmVyKCk7Zm9yKHZhciB0IGluIGhhbmRsZXJzKWVbdF09bmV3IGhhbmRsZXJzW3RdKGUpO3V0aWwuYmluZEhhbmRsZXJzKHRoaXMpfXZhciBoYW5kbGVycz17c2Nyb2xsWm9vbTpyZXF1aXJlKFwiLi9oYW5kbGVyL3Njcm9sbF96b29tXCIpLGJveFpvb206cmVxdWlyZShcIi4vaGFuZGxlci9ib3hfem9vbVwiKSxkcmFnUm90YXRlOnJlcXVpcmUoXCIuL2hhbmRsZXIvZHJhZ19yb3RhdGVcIiksZHJhZ1BhbjpyZXF1aXJlKFwiLi9oYW5kbGVyL2RyYWdfcGFuXCIpLGtleWJvYXJkOnJlcXVpcmUoXCIuL2hhbmRsZXIva2V5Ym9hcmRcIiksZG91YmxlQ2xpY2tab29tOnJlcXVpcmUoXCIuL2hhbmRsZXIvZGJsY2xpY2tfem9vbVwiKSxwaW5jaDpyZXF1aXJlKFwiLi9oYW5kbGVyL3BpbmNoXCIpfSxET009cmVxdWlyZShcIi4uL3V0aWwvZG9tXCIpLHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKTttb2R1bGUuZXhwb3J0cz1JbnRlcmFjdGlvbixJbnRlcmFjdGlvbi5wcm90b3R5cGU9e2VuYWJsZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX21hcC5vcHRpb25zLHQ9dGhpcy5fZWw7Zm9yKHZhciBuIGluIGhhbmRsZXJzKWVbbl0mJnRoaXMuX21hcFtuXS5lbmFibGUoKTt0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIix0aGlzLl9vbk1vdXNlRG93biwhMSksdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCwhMSksdC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLHRoaXMuX29uVG91Y2hTdGFydCwhMSksdC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0aGlzLl9vbkNsaWNrLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdXNlTW92ZSwhMSksdC5hZGRFdmVudExpc3RlbmVyKFwiZGJsY2xpY2tcIix0aGlzLl9vbkRibENsaWNrLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLHRoaXMuX29uQ29udGV4dE1lbnUsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fbWFwLm9wdGlvbnMsdD10aGlzLl9lbDtmb3IodmFyIG4gaW4gaGFuZGxlcnMpZVtuXSYmdGhpcy5fbWFwW25dLmRpc2FibGUoKTt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIix0aGlzLl9vbk1vdXNlRG93biksdC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCksdC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLHRoaXMuX29uVG91Y2hTdGFydCksdC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0aGlzLl9vbkNsaWNrKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdXNlTW92ZSksdC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZGJsY2xpY2tcIix0aGlzLl9vbkRibENsaWNrKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLHRoaXMuX29uQ29udGV4dE1lbnUpfSxfb25Nb3VzZURvd246ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnRQb3M9RE9NLm1vdXNlUG9zKHRoaXMuX2VsLGUpfSxfb25Nb3VzZVVwOmZ1bmN0aW9uKGUpeyF0aGlzLl9jb250ZXh0TWVudUZpcmVkfHx0aGlzLl9tYXAuZHJhZ1JvdGF0ZS5hY3RpdmV8fHRoaXMuX21hcC5kcmFnUGFuLmFjdGl2ZXx8dGhpcy5fZmlyZUV2ZW50KFwiY29udGV4dG1lbnVcIixlKSx0aGlzLl9jb250ZXh0TWVudUZpcmVkPW51bGx9LF9vblRvdWNoU3RhcnQ6ZnVuY3Rpb24oZSl7IWUudG91Y2hlc3x8ZS50b3VjaGVzLmxlbmd0aD4xfHwodGhpcy5fdGFwcGVkPyhjbGVhclRpbWVvdXQodGhpcy5fdGFwcGVkKSx0aGlzLl90YXBwZWQ9bnVsbCx0aGlzLl9maXJlRXZlbnQoXCJkYmxjbGlja1wiLGUpKTp0aGlzLl90YXBwZWQ9c2V0VGltZW91dCh0aGlzLl9vblRpbWVvdXQsMzAwKSl9LF9vblRpbWVvdXQ6ZnVuY3Rpb24oKXt0aGlzLl90YXBwZWQ9bnVsbH0sX29uTW91c2VNb3ZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX21hcCxuPXRoaXMuX2VsO2lmKCF0LmRyYWdQYW4uYWN0aXZlJiYhdC5kcmFnUm90YXRlLmFjdGl2ZSl7Zm9yKHZhciBvPWUudG9FbGVtZW50fHxlLnRhcmdldDtvJiZvIT09bjspbz1vLnBhcmVudE5vZGU7bz09PW4mJnRoaXMuX2ZpcmVFdmVudChcIm1vdXNlbW92ZVwiLGUpfX0sX29uQ2xpY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9RE9NLm1vdXNlUG9zKHRoaXMuX2VsLGUpO3QuZXF1YWxzKHRoaXMuX3N0YXJ0UG9zKSYmdGhpcy5fZmlyZUV2ZW50KFwiY2xpY2tcIixlKX0sX29uRGJsQ2xpY2s6ZnVuY3Rpb24oZSl7dGhpcy5fZmlyZUV2ZW50KFwiZGJsY2xpY2tcIixlKSxlLnByZXZlbnREZWZhdWx0KCl9LF9vbkNvbnRleHRNZW51OmZ1bmN0aW9uKCl7dGhpcy5fY29udGV4dE1lbnVGaXJlZD0hMH0sX2ZpcmVFdmVudDpmdW5jdGlvbihlLHQpe3ZhciBuPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0KTt0aGlzLl9tYXAuZmlyZShlLHtsbmdMYXQ6dGhpcy5fbWFwLnVucHJvamVjdChuKSxwb2ludDpuLG9yaWdpbmFsRXZlbnQ6dH0pfX07XG59LHtcIi4uL3V0aWwvZG9tXCI6OTgsXCIuLi91dGlsL3V0aWxcIjoxMDYsXCIuL2hhbmRsZXIvYm94X3pvb21cIjo4MixcIi4vaGFuZGxlci9kYmxjbGlja196b29tXCI6ODMsXCIuL2hhbmRsZXIvZHJhZ19wYW5cIjo4NCxcIi4vaGFuZGxlci9kcmFnX3JvdGF0ZVwiOjg1LFwiLi9oYW5kbGVyL2tleWJvYXJkXCI6ODYsXCIuL2hhbmRsZXIvcGluY2hcIjo4NyxcIi4vaGFuZGxlci9zY3JvbGxfem9vbVwiOjg4fV0sOTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIENhbnZhcz1yZXF1aXJlKFwiLi4vdXRpbC9jYW52YXNcIiksdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpLGJyb3dzZXI9cmVxdWlyZShcIi4uL3V0aWwvYnJvd3NlclwiKSxFdmVudGVkPXJlcXVpcmUoXCIuLi91dGlsL2V2ZW50ZWRcIiksRE9NPXJlcXVpcmUoXCIuLi91dGlsL2RvbVwiKSxTdHlsZT1yZXF1aXJlKFwiLi4vc3R5bGUvc3R5bGVcIiksQW5pbWF0aW9uTG9vcD1yZXF1aXJlKFwiLi4vc3R5bGUvYW5pbWF0aW9uX2xvb3BcIiksUGFpbnRlcj1yZXF1aXJlKFwiLi4vcmVuZGVyL3BhaW50ZXJcIiksVHJhbnNmb3JtPXJlcXVpcmUoXCIuLi9nZW8vdHJhbnNmb3JtXCIpLEhhc2g9cmVxdWlyZShcIi4vaGFzaFwiKSxJbnRlcmFjdGlvbj1yZXF1aXJlKFwiLi9pbnRlcmFjdGlvblwiKSxDYW1lcmE9cmVxdWlyZShcIi4vY2FtZXJhXCIpLExuZ0xhdD1yZXF1aXJlKFwiLi4vZ2VvL2xuZ19sYXRcIiksTG5nTGF0Qm91bmRzPXJlcXVpcmUoXCIuLi9nZW8vbG5nX2xhdF9ib3VuZHNcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLEF0dHJpYnV0aW9uPXJlcXVpcmUoXCIuL2NvbnRyb2wvYXR0cmlidXRpb25cIiksTWFwPW1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHQ9dGhpcy5vcHRpb25zPXV0aWwuaW5oZXJpdCh0aGlzLm9wdGlvbnMsdCksdGhpcy5hbmltYXRpb25Mb29wPW5ldyBBbmltYXRpb25Mb29wLHRoaXMudHJhbnNmb3JtPW5ldyBUcmFuc2Zvcm0odC5taW5ab29tLHQubWF4Wm9vbSksdC5tYXhCb3VuZHMpe3ZhciBlPUxuZ0xhdEJvdW5kcy5jb252ZXJ0KHQubWF4Qm91bmRzKTt0aGlzLnRyYW5zZm9ybS5sbmdSYW5nZT1bZS5nZXRXZXN0KCksZS5nZXRFYXN0KCldLHRoaXMudHJhbnNmb3JtLmxhdFJhbmdlPVtlLmdldFNvdXRoKCksZS5nZXROb3J0aCgpXX11dGlsLmJpbmRBbGwoW1wiX2ZvcndhcmRTdHlsZUV2ZW50XCIsXCJfZm9yd2FyZFNvdXJjZUV2ZW50XCIsXCJfZm9yd2FyZExheWVyRXZlbnRcIixcIl9mb3J3YXJkVGlsZUV2ZW50XCIsXCJfb25TdHlsZUxvYWRcIixcIl9vblN0eWxlQ2hhbmdlXCIsXCJfb25Tb3VyY2VBZGRcIixcIl9vblNvdXJjZVJlbW92ZVwiLFwiX29uU291cmNlVXBkYXRlXCIsXCJfb25XaW5kb3dSZXNpemVcIixcIm9uRXJyb3JcIixcInVwZGF0ZVwiLFwicmVuZGVyXCJdLHRoaXMpLHRoaXMuX3NldHVwQ29udGFpbmVyKCksdGhpcy5fc2V0dXBQYWludGVyKCksdGhpcy5vbihcIm1vdmVcIix0aGlzLnVwZGF0ZSksdGhpcy5vbihcInpvb21cIix0aGlzLnVwZGF0ZS5iaW5kKHRoaXMsITApKSx0aGlzLm9uKFwibW92ZWVuZFwiLGZ1bmN0aW9uKCl7dGhpcy5hbmltYXRpb25Mb29wLnNldCgzMDApLHRoaXMuX3JlcmVuZGVyKCl9LmJpbmQodGhpcykpLFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsdGhpcy5fb25XaW5kb3dSZXNpemUsITEpLHRoaXMuaW50ZXJhY3Rpb249bmV3IEludGVyYWN0aW9uKHRoaXMpLHQuaW50ZXJhY3RpdmUmJnRoaXMuaW50ZXJhY3Rpb24uZW5hYmxlKCksdGhpcy5faGFzaD10Lmhhc2gmJihuZXcgSGFzaCkuYWRkVG8odGhpcyksdGhpcy5faGFzaCYmdGhpcy5faGFzaC5fb25IYXNoQ2hhbmdlKCl8fHRoaXMuanVtcFRvKHQpLHRoaXMuc291cmNlcz17fSx0aGlzLnN0YWNrcz17fSx0aGlzLl9jbGFzc2VzPXt9LHRoaXMucmVzaXplKCksdC5jbGFzc2VzJiZ0aGlzLnNldENsYXNzZXModC5jbGFzc2VzKSx0LnN0eWxlJiZ0aGlzLnNldFN0eWxlKHQuc3R5bGUpLHQuYXR0cmlidXRpb25Db250cm9sJiZ0aGlzLmFkZENvbnRyb2wobmV3IEF0dHJpYnV0aW9uKSx0aGlzLm9uKFwic3R5bGUuZXJyb3JcIix0aGlzLm9uRXJyb3IpLHRoaXMub24oXCJzb3VyY2UuZXJyb3JcIix0aGlzLm9uRXJyb3IpLHRoaXMub24oXCJ0aWxlLmVycm9yXCIsdGhpcy5vbkVycm9yKX07dXRpbC5leHRlbmQoTWFwLnByb3RvdHlwZSxFdmVudGVkKSx1dGlsLmV4dGVuZChNYXAucHJvdG90eXBlLENhbWVyYS5wcm90b3R5cGUpLHV0aWwuZXh0ZW5kKE1hcC5wcm90b3R5cGUse29wdGlvbnM6e2NlbnRlcjpbMCwwXSx6b29tOjAsYmVhcmluZzowLHBpdGNoOjAsbWluWm9vbTowLG1heFpvb206MjAsaW50ZXJhY3RpdmU6ITAsc2Nyb2xsWm9vbTohMCxib3hab29tOiEwLGRyYWdSb3RhdGU6ITAsZHJhZ1BhbjohMCxrZXlib2FyZDohMCxkb3VibGVDbGlja1pvb206ITAscGluY2g6ITAsYmVhcmluZ1NuYXA6NyxoYXNoOiExLGF0dHJpYnV0aW9uQ29udHJvbDohMCxmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiExLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjohMX0sYWRkQ29udHJvbDpmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGRUbyh0aGlzKSx0aGlzfSxhZGRDbGFzczpmdW5jdGlvbih0LGUpe3RoaXMuX2NsYXNzZXNbdF18fCh0aGlzLl9jbGFzc2VzW3RdPSEwLHRoaXMuc3R5bGUmJnRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3NlcyxlKSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQsZSl7dGhpcy5fY2xhc3Nlc1t0XSYmKGRlbGV0ZSB0aGlzLl9jbGFzc2VzW3RdLHRoaXMuc3R5bGUmJnRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3NlcyxlKSl9LHNldENsYXNzZXM6ZnVuY3Rpb24odCxlKXt0aGlzLl9jbGFzc2VzPXt9O2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRoaXMuX2NsYXNzZXNbdFtpXV09ITA7dGhpcy5zdHlsZSYmdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzLGUpfSxoYXNDbGFzczpmdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMuX2NsYXNzZXNbdF19LGdldENsYXNzZXM6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5fY2xhc3Nlcyl9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTAsZT0wO3JldHVybiB0aGlzLl9jb250YWluZXImJih0PXRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aHx8NDAwLGU9dGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodHx8MzAwKSx0aGlzLl9jYW52YXMucmVzaXplKHQsZSksdGhpcy50cmFuc2Zvcm0ud2lkdGg9dCx0aGlzLnRyYW5zZm9ybS5oZWlnaHQ9ZSx0aGlzLnRyYW5zZm9ybS5fY29uc3RyYWluKCksdGhpcy5wYWludGVyLnJlc2l6ZSh0LGUpLHRoaXMuZmlyZShcIm1vdmVzdGFydFwiKS5maXJlKFwibW92ZVwiKS5maXJlKFwicmVzaXplXCIpLmZpcmUoXCJtb3ZlZW5kXCIpfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IExuZ0xhdEJvdW5kcyh0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKG5ldyBQb2ludCgwLDApKSx0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKHRoaXMudHJhbnNmb3JtLnNpemUpKX0scHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0ubG9jYXRpb25Qb2ludChMbmdMYXQuY29udmVydCh0KSl9LHVucHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihQb2ludC5jb252ZXJ0KHQpKX0sZmVhdHVyZXNBdDpmdW5jdGlvbih0LGUsaSl7dmFyIHI9dGhpcy51bnByb2plY3QodCkud3JhcCgpLHM9dGhpcy50cmFuc2Zvcm0ubG9jYXRpb25Db29yZGluYXRlKHIpO3JldHVybiB0aGlzLnN0eWxlLmZlYXR1cmVzQXQocyxlLGkpLHRoaXN9LGZlYXR1cmVzSW46ZnVuY3Rpb24odCxlLGkpe3JldHVyblwidW5kZWZpbmVkXCI9PXR5cGVvZiBpJiYoaT1lLGU9dCx0PVtQb2ludC5jb252ZXJ0KFswLDBdKSxQb2ludC5jb252ZXJ0KFt0aGlzLnRyYW5zZm9ybS53aWR0aCx0aGlzLnRyYW5zZm9ybS5oZWlnaHRdKV0pLHQ9dC5tYXAoUG9pbnQuY29udmVydC5iaW5kKFBvaW50KSksdD1bbmV3IFBvaW50KE1hdGgubWluKHRbMF0ueCx0WzFdLngpLE1hdGgubWluKHRbMF0ueSx0WzFdLnkpKSxuZXcgUG9pbnQoTWF0aC5tYXgodFswXS54LHRbMV0ueCksTWF0aC5tYXgodFswXS55LHRbMV0ueSkpXS5tYXAodGhpcy50cmFuc2Zvcm0ucG9pbnRDb29yZGluYXRlLmJpbmQodGhpcy50cmFuc2Zvcm0pKSx0aGlzLnN0eWxlLmZlYXR1cmVzSW4odCxlLGkpLHRoaXN9LGJhdGNoOmZ1bmN0aW9uKHQpe3RoaXMuc3R5bGUuYmF0Y2godCksdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzKSx0aGlzLnVwZGF0ZSghMCl9LHNldFN0eWxlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0eWxlJiYodGhpcy5zdHlsZS5vZmYoXCJsb2FkXCIsdGhpcy5fb25TdHlsZUxvYWQpLm9mZihcImVycm9yXCIsdGhpcy5fZm9yd2FyZFN0eWxlRXZlbnQpLm9mZihcImNoYW5nZVwiLHRoaXMuX29uU3R5bGVDaGFuZ2UpLm9mZihcInNvdXJjZS5hZGRcIix0aGlzLl9vblNvdXJjZUFkZCkub2ZmKFwic291cmNlLnJlbW92ZVwiLHRoaXMuX29uU291cmNlUmVtb3ZlKS5vZmYoXCJzb3VyY2UubG9hZFwiLHRoaXMuX29uU291cmNlVXBkYXRlKS5vZmYoXCJzb3VyY2UuZXJyb3JcIix0aGlzLl9mb3J3YXJkU291cmNlRXZlbnQpLm9mZihcInNvdXJjZS5jaGFuZ2VcIix0aGlzLl9vblNvdXJjZVVwZGF0ZSkub2ZmKFwibGF5ZXIuYWRkXCIsdGhpcy5fZm9yd2FyZExheWVyRXZlbnQpLm9mZihcImxheWVyLnJlbW92ZVwiLHRoaXMuX2ZvcndhcmRMYXllckV2ZW50KS5vZmYoXCJ0aWxlLmFkZFwiLHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpLm9mZihcInRpbGUucmVtb3ZlXCIsdGhpcy5fZm9yd2FyZFRpbGVFdmVudCkub2ZmKFwidGlsZS5sb2FkXCIsdGhpcy51cGRhdGUpLm9mZihcInRpbGUuZXJyb3JcIix0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KS5vZmYoXCJ0aWxlLnN0YXRzXCIsdGhpcy5fZm9yd2FyZFRpbGVFdmVudCkuX3JlbW92ZSgpLHRoaXMub2ZmKFwicm90YXRlXCIsdGhpcy5zdHlsZS5fcmVkb1BsYWNlbWVudCksdGhpcy5vZmYoXCJwaXRjaFwiLHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQpKSx0Pyh0IGluc3RhbmNlb2YgU3R5bGU/dGhpcy5zdHlsZT10OnRoaXMuc3R5bGU9bmV3IFN0eWxlKHQsdGhpcy5hbmltYXRpb25Mb29wKSx0aGlzLnN0eWxlLm9uKFwibG9hZFwiLHRoaXMuX29uU3R5bGVMb2FkKS5vbihcImVycm9yXCIsdGhpcy5fZm9yd2FyZFN0eWxlRXZlbnQpLm9uKFwiY2hhbmdlXCIsdGhpcy5fb25TdHlsZUNoYW5nZSkub24oXCJzb3VyY2UuYWRkXCIsdGhpcy5fb25Tb3VyY2VBZGQpLm9uKFwic291cmNlLnJlbW92ZVwiLHRoaXMuX29uU291cmNlUmVtb3ZlKS5vbihcInNvdXJjZS5sb2FkXCIsdGhpcy5fb25Tb3VyY2VVcGRhdGUpLm9uKFwic291cmNlLmVycm9yXCIsdGhpcy5fZm9yd2FyZFNvdXJjZUV2ZW50KS5vbihcInNvdXJjZS5jaGFuZ2VcIix0aGlzLl9vblNvdXJjZVVwZGF0ZSkub24oXCJsYXllci5hZGRcIix0aGlzLl9mb3J3YXJkTGF5ZXJFdmVudCkub24oXCJsYXllci5yZW1vdmVcIix0aGlzLl9mb3J3YXJkTGF5ZXJFdmVudCkub24oXCJ0aWxlLmFkZFwiLHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpLm9uKFwidGlsZS5yZW1vdmVcIix0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KS5vbihcInRpbGUubG9hZFwiLHRoaXMudXBkYXRlKS5vbihcInRpbGUuZXJyb3JcIix0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KS5vbihcInRpbGUuc3RhdHNcIix0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KSx0aGlzLm9uKFwicm90YXRlXCIsdGhpcy5zdHlsZS5fcmVkb1BsYWNlbWVudCksdGhpcy5vbihcInBpdGNoXCIsdGhpcy5zdHlsZS5fcmVkb1BsYWNlbWVudCksdGhpcyk6KHRoaXMuc3R5bGU9bnVsbCx0aGlzKX0sYWRkU291cmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc3R5bGUuYWRkU291cmNlKHQsZSksdGhpc30scmVtb3ZlU291cmNlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0eWxlLnJlbW92ZVNvdXJjZSh0KSx0aGlzfSxnZXRTb3VyY2U6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc3R5bGUuZ2V0U291cmNlKHQpfSxhZGRMYXllcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnN0eWxlLmFkZExheWVyKHQsZSksdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzKSx0aGlzfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdHlsZS5yZW1vdmVMYXllcih0KSx0aGlzLnN0eWxlLl9jYXNjYWRlKHRoaXMuX2NsYXNzZXMpLHRoaXN9LHNldEZpbHRlcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnN0eWxlLnNldEZpbHRlcih0LGUpLHRoaXN9LHNldExheWVyWm9vbVJhbmdlOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5zdHlsZS5zZXRMYXllclpvb21SYW5nZSh0LGUsaSksdGhpc30sZ2V0RmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0eWxlLmdldEZpbHRlcih0KX0sc2V0UGFpbnRQcm9wZXJ0eTpmdW5jdGlvbih0LGUsaSxyKXtyZXR1cm4gdGhpcy5iYXRjaChmdW5jdGlvbihzKXtzLnNldFBhaW50UHJvcGVydHkodCxlLGkscil9KSx0aGlzfSxnZXRQYWludFByb3BlcnR5OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5zdHlsZS5nZXRQYWludFByb3BlcnR5KHQsZSxpKX0sc2V0TGF5b3V0UHJvcGVydHk6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmJhdGNoKGZ1bmN0aW9uKHIpe3Iuc2V0TGF5b3V0UHJvcGVydHkodCxlLGkpfSksdGhpc30sZ2V0TGF5b3V0UHJvcGVydHk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5zdHlsZS5nZXRMYXlvdXRQcm9wZXJ0eSh0LGUpfSxnZXRDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSxnZXRDYW52YXNDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2FudmFzQ29udGFpbmVyfSxnZXRDYW52YXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2FudmFzLmdldEVsZW1lbnQoKX0sX3NldHVwQ29udGFpbmVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLmNvbnRhaW5lcixlPXRoaXMuX2NvbnRhaW5lcj1cInN0cmluZ1wiPT10eXBlb2YgdD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTp0O2UuY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLW1hcFwiKTt2YXIgaT10aGlzLl9jYW52YXNDb250YWluZXI9RE9NLmNyZWF0ZShcImRpdlwiLFwibWFwYm94Z2wtY2FudmFzLWNvbnRhaW5lclwiLGUpO3RoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZSYmaS5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtaW50ZXJhY3RpdmVcIiksdGhpcy5fY2FudmFzPW5ldyBDYW52YXModGhpcyxpKTt2YXIgcj1ET00uY3JlYXRlKFwiZGl2XCIsXCJtYXBib3hnbC1jb250cm9sLWNvbnRhaW5lclwiLGUpLHM9dGhpcy5fY29udHJvbENvcm5lcnM9e307W1widG9wLWxlZnRcIixcInRvcC1yaWdodFwiLFwiYm90dG9tLWxlZnRcIixcImJvdHRvbS1yaWdodFwiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3NbdF09RE9NLmNyZWF0ZShcImRpdlwiLFwibWFwYm94Z2wtY3RybC1cIit0LHIpfSl9LF9zZXR1cFBhaW50ZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jYW52YXMuZ2V0V2ViR0xDb250ZXh0KHtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OnRoaXMub3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0LHByZXNlcnZlRHJhd2luZ0J1ZmZlcjp0aGlzLm9wdGlvbnMucHJlc2VydmVEcmF3aW5nQnVmZmVyfSk7cmV0dXJuIHQ/dm9pZCh0aGlzLnBhaW50ZXI9bmV3IFBhaW50ZXIodCx0aGlzLnRyYW5zZm9ybSkpOnZvaWQgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIFdlYkdMXCIpfSxfY29udGV4dExvc3Q6ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZyYW1lSWQmJmJyb3dzZXIuY2FuY2VsRnJhbWUodGhpcy5fZnJhbWVJZCl9LF9jb250ZXh0UmVzdG9yZWQ6ZnVuY3Rpb24oKXt0aGlzLl9zZXR1cFBhaW50ZXIoKSx0aGlzLnJlc2l6ZSgpLHRoaXMudXBkYXRlKCl9LGxvYWRlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdHlsZURpcnR5fHx0aGlzLl9zb3VyY2VzRGlydHk/ITE6dGhpcy5zdHlsZSYmIXRoaXMuc3R5bGUubG9hZGVkKCk/ITE6ITB9LHVwZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdHlsZT8odGhpcy5fc3R5bGVEaXJ0eT10aGlzLl9zdHlsZURpcnR5fHx0LHRoaXMuX3NvdXJjZXNEaXJ0eT0hMCx0aGlzLl9yZXJlbmRlcigpLHRoaXMpOnRoaXN9LHJlbmRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0eWxlJiZ0aGlzLl9zdHlsZURpcnR5JiYodGhpcy5fc3R5bGVEaXJ0eT0hMSx0aGlzLnN0eWxlLl9yZWNhbGN1bGF0ZSh0aGlzLnRyYW5zZm9ybS56b29tKSksdGhpcy5zdHlsZSYmdGhpcy5fc291cmNlc0RpcnR5JiYhdGhpcy5fc291cmNlc0RpcnR5VGltZW91dCYmKHRoaXMuX3NvdXJjZXNEaXJ0eT0hMSx0aGlzLl9zb3VyY2VzRGlydHlUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl9zb3VyY2VzRGlydHlUaW1lb3V0PW51bGx9LmJpbmQodGhpcyksNTApLHRoaXMuc3R5bGUuX3VwZGF0ZVNvdXJjZXModGhpcy50cmFuc2Zvcm0pKSx0aGlzLnBhaW50ZXIucmVuZGVyKHRoaXMuc3R5bGUse2RlYnVnOnRoaXMuZGVidWcsdmVydGljZXM6dGhpcy52ZXJ0aWNlcyxyb3RhdGluZzp0aGlzLnJvdGF0aW5nLHpvb21pbmc6dGhpcy56b29taW5nfSksdGhpcy5maXJlKFwicmVuZGVyXCIpLHRoaXMubG9hZGVkKCkmJiF0aGlzLl9sb2FkZWQmJih0aGlzLl9sb2FkZWQ9ITAsdGhpcy5maXJlKFwibG9hZFwiKSksdGhpcy5fZnJhbWVJZD1udWxsLHRoaXMuYW5pbWF0aW9uTG9vcC5zdG9wcGVkKCl8fCh0aGlzLl9zdHlsZURpcnR5PSEwKSwodGhpcy5fc291cmNlc0RpcnR5fHx0aGlzLl9yZXBhaW50fHwhdGhpcy5hbmltYXRpb25Mb29wLnN0b3BwZWQoKSkmJnRoaXMuX3JlcmVuZGVyKCksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc2gmJnRoaXMuX2hhc2gucmVtb3ZlKCksYnJvd3Nlci5jYW5jZWxGcmFtZSh0aGlzLl9mcmFtZUlkKSxjbGVhclRpbWVvdXQodGhpcy5fc291cmNlc0RpcnR5VGltZW91dCksdGhpcy5zZXRTdHlsZShudWxsKSxcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHRoaXMuX29uV2luZG93UmVzaXplLCExKSx0aGlzfSxvbkVycm9yOmZ1bmN0aW9uKHQpe2NvbnNvbGUuZXJyb3IodC5lcnJvcil9LF9yZXJlbmRlcjpmdW5jdGlvbigpe3RoaXMuc3R5bGUmJiF0aGlzLl9mcmFtZUlkJiYodGhpcy5fZnJhbWVJZD1icm93c2VyLmZyYW1lKHRoaXMucmVuZGVyKSl9LF9mb3J3YXJkU3R5bGVFdmVudDpmdW5jdGlvbih0KXt0aGlzLmZpcmUoXCJzdHlsZS5cIit0LnR5cGUsdXRpbC5leHRlbmQoe3N0eWxlOnQudGFyZ2V0fSx0KSl9LF9mb3J3YXJkU291cmNlRXZlbnQ6ZnVuY3Rpb24odCl7dGhpcy5maXJlKHQudHlwZSx1dGlsLmV4dGVuZCh7c3R5bGU6dC50YXJnZXR9LHQpKX0sX2ZvcndhcmRMYXllckV2ZW50OmZ1bmN0aW9uKHQpe3RoaXMuZmlyZSh0LnR5cGUsdXRpbC5leHRlbmQoe3N0eWxlOnQudGFyZ2V0fSx0KSl9LF9mb3J3YXJkVGlsZUV2ZW50OmZ1bmN0aW9uKHQpe3RoaXMuZmlyZSh0LnR5cGUsdXRpbC5leHRlbmQoe3N0eWxlOnQudGFyZ2V0fSx0KSl9LF9vblN0eWxlTG9hZDpmdW5jdGlvbih0KXt2YXIgZT1uZXcgVHJhbnNmb3JtLGk9dGhpcy50cmFuc2Zvcm07aS5jZW50ZXIubG5nPT09ZS5jZW50ZXIubG5nJiZpLmNlbnRlci5sYXQ9PT1lLmNlbnRlci5sYXQmJmkuem9vbT09PWUuem9vbSYmaS5iZWFyaW5nPT09ZS5iZWFyaW5nJiZpLnBpdGNoPT09ZS5waXRjaCYmdGhpcy5qdW1wVG8odGhpcy5zdHlsZS5zdHlsZXNoZWV0KSx0aGlzLnN0eWxlLl9jYXNjYWRlKHRoaXMuX2NsYXNzZXMse3RyYW5zaXRpb246ITF9KSx0aGlzLl9mb3J3YXJkU3R5bGVFdmVudCh0KX0sX29uU3R5bGVDaGFuZ2U6ZnVuY3Rpb24odCl7dGhpcy51cGRhdGUoITApLHRoaXMuX2ZvcndhcmRTdHlsZUV2ZW50KHQpfSxfb25Tb3VyY2VBZGQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5zb3VyY2U7ZS5vbkFkZCYmZS5vbkFkZCh0aGlzKSx0aGlzLl9mb3J3YXJkU291cmNlRXZlbnQodCl9LF9vblNvdXJjZVJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10LnNvdXJjZTtlLm9uUmVtb3ZlJiZlLm9uUmVtb3ZlKHRoaXMpLHRoaXMuX2ZvcndhcmRTb3VyY2VFdmVudCh0KX0sX29uU291cmNlVXBkYXRlOmZ1bmN0aW9uKHQpe3RoaXMudXBkYXRlKCksdGhpcy5fZm9yd2FyZFNvdXJjZUV2ZW50KHQpfSxfb25XaW5kb3dSZXNpemU6ZnVuY3Rpb24oKXt0aGlzLnN0b3AoKS5yZXNpemUoKS51cGRhdGUoKX19KSx1dGlsLmV4dGVuZEFsbChNYXAucHJvdG90eXBlLHtfZGVidWc6ITEsZ2V0IGRlYnVnKCl7cmV0dXJuIHRoaXMuX2RlYnVnfSxzZXQgZGVidWcodCl7dGhpcy5fZGVidWc9dCx0aGlzLnVwZGF0ZSgpfSxfY29sbGlzaW9uRGVidWc6ITEsZ2V0IGNvbGxpc2lvbkRlYnVnKCl7cmV0dXJuIHRoaXMuX2NvbGxpc2lvbkRlYnVnfSxzZXQgY29sbGlzaW9uRGVidWcodCl7dGhpcy5fY29sbGlzaW9uRGVidWc9dCx0aGlzLnN0eWxlLl9yZWRvUGxhY2VtZW50KCl9LF9yZXBhaW50OiExLGdldCByZXBhaW50KCl7cmV0dXJuIHRoaXMuX3JlcGFpbnR9LHNldCByZXBhaW50KHQpe3RoaXMuX3JlcGFpbnQ9dCx0aGlzLnVwZGF0ZSgpfSxfdmVydGljZXM6ITEsZ2V0IHZlcnRpY2VzKCl7cmV0dXJuIHRoaXMuX3ZlcnRpY2VzfSxzZXQgdmVydGljZXModCl7dGhpcy5fdmVydGljZXM9dCx0aGlzLnVwZGF0ZSgpfX0pO1xufSx7XCIuLi9nZW8vbG5nX2xhdFwiOjIwLFwiLi4vZ2VvL2xuZ19sYXRfYm91bmRzXCI6MjEsXCIuLi9nZW8vdHJhbnNmb3JtXCI6MjIsXCIuLi9yZW5kZXIvcGFpbnRlclwiOjM3LFwiLi4vc3R5bGUvYW5pbWF0aW9uX2xvb3BcIjo1MSxcIi4uL3N0eWxlL3N0eWxlXCI6NTYsXCIuLi91dGlsL2Jyb3dzZXJcIjo5NSxcIi4uL3V0aWwvY2FudmFzXCI6OTYsXCIuLi91dGlsL2RvbVwiOjk4LFwiLi4vdXRpbC9ldmVudGVkXCI6MTAwLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9jYW1lcmFcIjo3OCxcIi4vY29udHJvbC9hdHRyaWJ1dGlvblwiOjc5LFwiLi9oYXNoXCI6ODksXCIuL2ludGVyYWN0aW9uXCI6OTAsXCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDkyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFBvcHVwKHQpe3V0aWwuc2V0T3B0aW9ucyh0aGlzLHQpLHV0aWwuYmluZEFsbChbXCJfdXBkYXRlUG9zaXRpb25cIixcIl9vbkNsaWNrQ2xvc2VcIl0sdGhpcyl9bW9kdWxlLmV4cG9ydHM9UG9wdXA7dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxFdmVudGVkPXJlcXVpcmUoXCIuLi91dGlsL2V2ZW50ZWRcIiksRE9NPXJlcXVpcmUoXCIuLi91dGlsL2RvbVwiKSxMbmdMYXQ9cmVxdWlyZShcIi4uL2dlby9sbmdfbGF0XCIpO1BvcHVwLnByb3RvdHlwZT11dGlsLmluaGVyaXQoRXZlbnRlZCx7b3B0aW9uczp7Y2xvc2VCdXR0b246ITAsY2xvc2VPbkNsaWNrOiEwfSxhZGRUbzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwPXQsdGhpcy5fbWFwLm9uKFwibW92ZVwiLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKSx0aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrJiZ0aGlzLl9tYXAub24oXCJjbGlja1wiLHRoaXMuX29uQ2xpY2tDbG9zZSksdGhpcy5fdXBkYXRlKCksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRhaW5lciYmdGhpcy5fY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fY29udGFpbmVyKSx0aGlzLl9tYXAmJih0aGlzLl9tYXAub2ZmKFwibW92ZVwiLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKSx0aGlzLl9tYXAub2ZmKFwiY2xpY2tcIix0aGlzLl9vbkNsaWNrQ2xvc2UpLGRlbGV0ZSB0aGlzLl9tYXApLHRoaXN9LGdldExuZ0xhdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sbmdMYXR9LHNldExuZ0xhdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbG5nTGF0PUxuZ0xhdC5jb252ZXJ0KHQpLHRoaXMuX3VwZGF0ZSgpLHRoaXN9LHNldFRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NvbnRlbnQ9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodCksdGhpcy5fdXBkYXRlQ29udGVudCgpLHRoaXN9LHNldEhUTUw6ZnVuY3Rpb24odCl7dGhpcy5fY29udGVudD1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7dmFyIGksZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYm9keVwiKTtmb3IoZS5pbm5lckhUTUw9dDs7KXtpZihpPWUuZmlyc3RDaGlsZCwhaSlicmVhazt0aGlzLl9jb250ZW50LmFwcGVuZENoaWxkKGkpfXJldHVybiB0aGlzLl91cGRhdGVDb250ZW50KCksdGhpc30sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX21hcCYmKHRoaXMuX2NvbnRhaW5lcnx8KHRoaXMuX2NvbnRhaW5lcj1ET00uY3JlYXRlKFwiZGl2XCIsXCJtYXBib3hnbC1wb3B1cFwiLHRoaXMuX21hcC5nZXRDb250YWluZXIoKSksdGhpcy5fdGlwPURPTS5jcmVhdGUoXCJkaXZcIixcIm1hcGJveGdsLXBvcHVwLXRpcFwiLHRoaXMuX2NvbnRhaW5lciksdGhpcy5fd3JhcHBlcj1ET00uY3JlYXRlKFwiZGl2XCIsXCJtYXBib3hnbC1wb3B1cC1jb250ZW50XCIsdGhpcy5fY29udGFpbmVyKSx0aGlzLm9wdGlvbnMuY2xvc2VCdXR0b24mJih0aGlzLl9jbG9zZUJ1dHRvbj1ET00uY3JlYXRlKFwiYnV0dG9uXCIsXCJtYXBib3hnbC1wb3B1cC1jbG9zZS1idXR0b25cIix0aGlzLl93cmFwcGVyKSx0aGlzLl9jbG9zZUJ1dHRvbi5pbm5lckhUTUw9XCImIzIxNTtcIix0aGlzLl9jbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0aGlzLl9vbkNsaWNrQ2xvc2UpKSksdGhpcy5fdXBkYXRlQ29udGVudCgpLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCkpfSxfdXBkYXRlQ29udGVudDpmdW5jdGlvbigpe2lmKHRoaXMuX2NvbnRlbnQmJnRoaXMuX2NvbnRhaW5lcil7Zm9yKHZhciB0PXRoaXMuX3dyYXBwZXI7dC5oYXNDaGlsZE5vZGVzKCk7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTt0aGlzLm9wdGlvbnMuY2xvc2VCdXR0b24mJnQuYXBwZW5kQ2hpbGQodGhpcy5fY2xvc2VCdXR0b24pLHQuYXBwZW5kQ2hpbGQodGhpcy5fY29udGVudCl9fSxfdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzLl9sbmdMYXQmJnRoaXMuX2NvbnRhaW5lcil7dmFyIHQ9dGhpcy5fbWFwLnByb2plY3QodGhpcy5fbG5nTGF0KS5yb3VuZCgpLGk9dGhpcy5vcHRpb25zLmFuY2hvcjtpZighaSl7dmFyIGU9dGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRoLG89dGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodDtpPXQueTxvP1tcInRvcFwiXTp0Lnk+dGhpcy5fbWFwLnRyYW5zZm9ybS5oZWlnaHQtbz9bXCJib3R0b21cIl06W10sdC54PGUvMj9pLnB1c2goXCJsZWZ0XCIpOnQueD50aGlzLl9tYXAudHJhbnNmb3JtLndpZHRoLWUvMiYmaS5wdXNoKFwicmlnaHRcIiksaT0wPT09aS5sZW5ndGg/XCJib3R0b21cIjppLmpvaW4oXCItXCIpLHRoaXMub3B0aW9ucy5hbmNob3I9aX12YXIgbj17dG9wOlwidHJhbnNsYXRlKC01MCUsMClcIixcInRvcC1sZWZ0XCI6XCJ0cmFuc2xhdGUoMCwwKVwiLFwidG9wLXJpZ2h0XCI6XCJ0cmFuc2xhdGUoLTEwMCUsMClcIixib3R0b206XCJ0cmFuc2xhdGUoLTUwJSwtMTAwJSlcIixcImJvdHRvbS1sZWZ0XCI6XCJ0cmFuc2xhdGUoMCwtMTAwJSlcIixcImJvdHRvbS1yaWdodFwiOlwidHJhbnNsYXRlKC0xMDAlLC0xMDAlKVwiLGxlZnQ6XCJ0cmFuc2xhdGUoMCwtNTAlKVwiLHJpZ2h0OlwidHJhbnNsYXRlKC0xMDAlLC01MCUpXCJ9LHM9dGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdDtmb3IodmFyIGEgaW4gbilzLnJlbW92ZShcIm1hcGJveGdsLXBvcHVwLWFuY2hvci1cIithKTtzLmFkZChcIm1hcGJveGdsLXBvcHVwLWFuY2hvci1cIitpKSxET00uc2V0VHJhbnNmb3JtKHRoaXMuX2NvbnRhaW5lcixuW2ldK1wiIHRyYW5zbGF0ZShcIit0LngrXCJweCxcIit0LnkrXCJweClcIil9fSxfb25DbGlja0Nsb3NlOmZ1bmN0aW9uKCl7dGhpcy5yZW1vdmUoKX19KTtcbn0se1wiLi4vZ2VvL2xuZ19sYXRcIjoyMCxcIi4uL3V0aWwvZG9tXCI6OTgsXCIuLi91dGlsL2V2ZW50ZWRcIjoxMDAsXCIuLi91dGlsL3V0aWxcIjoxMDZ9XSw5MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBBY3Rvcih0LGUpe3RoaXMudGFyZ2V0PXQsdGhpcy5wYXJlbnQ9ZSx0aGlzLmNhbGxiYWNrcz17fSx0aGlzLmNhbGxiYWNrSUQ9MCx0aGlzLnJlY2VpdmU9dGhpcy5yZWNlaXZlLmJpbmQodGhpcyksdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIix0aGlzLnJlY2VpdmUsITEpfW1vZHVsZS5leHBvcnRzPUFjdG9yLEFjdG9yLnByb3RvdHlwZS5yZWNlaXZlPWZ1bmN0aW9uKHQpe3ZhciBlLHM9dC5kYXRhO2lmKFwiPHJlc3BvbnNlPlwiPT09cy50eXBlKWU9dGhpcy5jYWxsYmFja3Nbcy5pZF0sZGVsZXRlIHRoaXMuY2FsbGJhY2tzW3MuaWRdLGUocy5lcnJvcnx8bnVsbCxzLmRhdGEpO2Vsc2UgaWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHMuaWQpe3ZhciBpPXMuaWQ7dGhpcy5wYXJlbnRbcy50eXBlXShzLmRhdGEsZnVuY3Rpb24odCxlLHMpe3RoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6XCI8cmVzcG9uc2U+XCIsaWQ6U3RyaW5nKGkpLGVycm9yOnQ/U3RyaW5nKHQpOm51bGwsZGF0YTplfSxzKX0uYmluZCh0aGlzKSl9ZWxzZSB0aGlzLnBhcmVudFtzLnR5cGVdKHMuZGF0YSl9LEFjdG9yLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKHQsZSxzLGkpe3ZhciBhPW51bGw7cyYmKHRoaXMuY2FsbGJhY2tzW2E9dGhpcy5jYWxsYmFja0lEKytdPXMpLHRoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6dCxpZDpTdHJpbmcoYSksZGF0YTplfSxpKX0sQWN0b3IucHJvdG90eXBlLnBvc3RNZXNzYWdlPWZ1bmN0aW9uKHQsZSl7dHJ5e3RoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKHQsZSl9Y2F0Y2gocyl7dGhpcy50YXJnZXQucG9zdE1lc3NhZ2UodCl9fTtcbn0se31dLDk0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHNhbWVPcmlnaW4oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7cmV0dXJuIHQuaHJlZj1lLHQucHJvdG9jb2w9PT1kb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCYmdC5ob3N0PT09ZG9jdW1lbnQubG9jYXRpb24uaG9zdH1leHBvcnRzLmdldEpTT049ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIG4ub3BlbihcIkdFVFwiLGUsITApLG4uc2V0UmVxdWVzdEhlYWRlcihcIkFjY2VwdFwiLFwiYXBwbGljYXRpb24vanNvblwiKSxuLm9uZXJyb3I9ZnVuY3Rpb24oZSl7dChlKX0sbi5vbmxvYWQ9ZnVuY3Rpb24oKXtpZihuLnN0YXR1cz49MjAwJiZuLnN0YXR1czwzMDAmJm4ucmVzcG9uc2Upe3ZhciBlO3RyeXtlPUpTT04ucGFyc2Uobi5yZXNwb25zZSl9Y2F0Y2gocil7cmV0dXJuIHQocil9dChudWxsLGUpfWVsc2UgdChuZXcgRXJyb3Iobi5zdGF0dXNUZXh0KSl9LG4uc2VuZCgpLG59LGV4cG9ydHMuZ2V0QXJyYXlCdWZmZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIG4ub3BlbihcIkdFVFwiLGUsITApLG4ucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIixuLm9uZXJyb3I9ZnVuY3Rpb24oZSl7dChlKX0sbi5vbmxvYWQ9ZnVuY3Rpb24oKXtuLnN0YXR1cz49MjAwJiZuLnN0YXR1czwzMDAmJm4ucmVzcG9uc2U/dChudWxsLG4ucmVzcG9uc2UpOnQobmV3IEVycm9yKG4uc3RhdHVzVGV4dCkpfSxuLnNlbmQoKSxufSxleHBvcnRzLmdldEltYWdlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGV4cG9ydHMuZ2V0QXJyYXlCdWZmZXIoZSxmdW5jdGlvbihlLG4pe2UmJnQoZSk7dmFyIHI9bmV3IEltYWdlO3Iub25sb2FkPWZ1bmN0aW9uKCl7dChudWxsLHIpLCh3aW5kb3cuVVJMfHx3aW5kb3cud2Via2l0VVJMKS5yZXZva2VPYmplY3RVUkwoci5zcmMpfTt2YXIgbz1uZXcgQmxvYihbbmV3IFVpbnQ4QXJyYXkobildLHt0eXBlOlwiaW1hZ2UvcG5nXCJ9KTtyZXR1cm4gci5zcmM9KHdpbmRvdy5VUkx8fHdpbmRvdy53ZWJraXRVUkwpLmNyZWF0ZU9iamVjdFVSTChvKSxyLmdldERhdGE9ZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHQ9ZS5nZXRDb250ZXh0KFwiMmRcIik7cmV0dXJuIGUud2lkdGg9ci53aWR0aCxlLmhlaWdodD1yLmhlaWdodCx0LmRyYXdJbWFnZShyLDAsMCksdC5nZXRJbWFnZURhdGEoMCwwLHIud2lkdGgsci5oZWlnaHQpLmRhdGF9LHJ9KX0sZXhwb3J0cy5nZXRWaWRlbz1mdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ2aWRlb1wiKTtuLm9ubG9hZHN0YXJ0PWZ1bmN0aW9uKCl7dChudWxsLG4pfTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNvdXJjZVwiKTtzYW1lT3JpZ2luKGVbcl0pfHwobi5jcm9zc09yaWdpbj1cIkFub255bW91c1wiKSxvLnNyYz1lW3JdLG4uYXBwZW5kQ2hpbGQobyl9cmV0dXJuIG4uZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiBufSxufTtcbn0se31dLDk1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBDYW52YXM9cmVxdWlyZShcIi4vY2FudmFzXCIpLGZyYW1lPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZTtleHBvcnRzLmZyYW1lPWZ1bmN0aW9uKGUpe3JldHVybiBmcmFtZShlKX07dmFyIGNhbmNlbD13aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNDYW5jZWxBbmltYXRpb25GcmFtZTtleHBvcnRzLmNhbmNlbEZyYW1lPWZ1bmN0aW9uKGUpe2NhbmNlbChlKX0sZXhwb3J0cy50aW1lZD1mdW5jdGlvbihlLHIsdCl7ZnVuY3Rpb24gbihhKXtvfHwod2luZG93LnBlcmZvcm1hbmNlfHwoYT1EYXRlLm5vdygpKSxhPj1pK3I/ZS5jYWxsKHQsMSk6KGUuY2FsbCh0LChhLWkpL3IpLGV4cG9ydHMuZnJhbWUobikpKX1pZighcilyZXR1cm4gZS5jYWxsKHQsMSksbnVsbDt2YXIgbz0hMSxpPXdpbmRvdy5wZXJmb3JtYW5jZT93aW5kb3cucGVyZm9ybWFuY2Uubm93KCk6RGF0ZS5ub3coKTtyZXR1cm4gZXhwb3J0cy5mcmFtZShuKSxmdW5jdGlvbigpe289ITB9fSxleHBvcnRzLnN1cHBvcnRlZD1mdW5jdGlvbihlKXtmb3IodmFyIHI9KFtmdW5jdGlvbigpe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3d9LGZ1bmN0aW9uKCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGRvY3VtZW50fSxmdW5jdGlvbigpe3JldHVybiEhKEFycmF5LnByb3RvdHlwZSYmQXJyYXkucHJvdG90eXBlLmV2ZXJ5JiZBcnJheS5wcm90b3R5cGUuZmlsdGVyJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaCYmQXJyYXkucHJvdG90eXBlLmluZGV4T2YmJkFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZiYmQXJyYXkucHJvdG90eXBlLm1hcCYmQXJyYXkucHJvdG90eXBlLnNvbWUmJkFycmF5LnByb3RvdHlwZS5yZWR1Y2UmJkFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodCYmQXJyYXkuaXNBcnJheSl9LGZ1bmN0aW9uKCl7cmV0dXJuISghRnVuY3Rpb24ucHJvdG90eXBlfHwhRnVuY3Rpb24ucHJvdG90eXBlLmJpbmR8fCEoT2JqZWN0LmtleXMmJk9iamVjdC5jcmVhdGUmJk9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMmJk9iamVjdC5pc1NlYWxlZCYmT2JqZWN0LmlzRnJvemVuJiZPYmplY3QuaXNFeHRlbnNpYmxlJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJiZPYmplY3QuZGVmaW5lUHJvcGVydHkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzJiZPYmplY3Quc2VhbCYmT2JqZWN0LmZyZWV6ZSYmT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKSl9LGZ1bmN0aW9uKCl7cmV0dXJuXCJKU09OXCJpbiB3aW5kb3cmJlwicGFyc2VcImluIEpTT04mJlwic3RyaW5naWZ5XCJpbiBKU09OfSxmdW5jdGlvbigpe3JldHVybihuZXcgQ2FudmFzKS5zdXBwb3J0c1dlYkdMQ29udGV4dChlJiZlLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXR8fCExKX0sZnVuY3Rpb24oKXtyZXR1cm5cIldvcmtlclwiaW4gd2luZG93fV0pLHQ9MDt0PHIubGVuZ3RoO3QrKylpZighclt0XSgpKXJldHVybiExO3JldHVybiEwfSxleHBvcnRzLmhhcmR3YXJlQ29uY3VycmVuY3k9bmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3l8fDgsT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsXCJkZXZpY2VQaXhlbFJhdGlvXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb319KTtcbn0se1wiLi9jYW52YXNcIjo5Nn1dLDk2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIENhbnZhcyh0LGUpe3RoaXMuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksdCYmZSYmKHRoaXMuY2FudmFzLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIix0aGlzLmNhbnZhcy5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY2FudmFzXCIpLHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJ3ZWJnbGNvbnRleHRsb3N0XCIsdC5fY29udGV4dExvc3QuYmluZCh0KSwhMSksdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmdsY29udGV4dHJlc3RvcmVkXCIsdC5fY29udGV4dFJlc3RvcmVkLmJpbmQodCksITEpLHRoaXMuY2FudmFzLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsMCksZS5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcykpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsXCIpO21vZHVsZS5leHBvcnRzPUNhbnZhcyxDYW52YXMucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUpe3ZhciBhPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxO3RoaXMuY2FudmFzLndpZHRoPWEqdCx0aGlzLmNhbnZhcy5oZWlnaHQ9YSplLHRoaXMuY2FudmFzLnN0eWxlLndpZHRoPXQrXCJweFwiLHRoaXMuY2FudmFzLnN0eWxlLmhlaWdodD1lK1wicHhcIn07dmFyIHJlcXVpcmVkQ29udGV4dEF0dHJpYnV0ZXM9e2FudGlhbGlhczohMSxhbHBoYTohMCxzdGVuY2lsOiEwLGRlcHRoOiExfTtDYW52YXMucHJvdG90eXBlLmdldFdlYkdMQ29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gdD11dGlsLmV4dGVuZCh7fSx0LHJlcXVpcmVkQ29udGV4dEF0dHJpYnV0ZXMpLHRoaXMuY2FudmFzLmdldENvbnRleHQoXCJ3ZWJnbFwiLHQpfHx0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiZXhwZXJpbWVudGFsLXdlYmdsXCIsdCl9LENhbnZhcy5wcm90b3R5cGUuc3VwcG9ydHNXZWJHTENvbnRleHQ9ZnVuY3Rpb24odCl7dmFyIGU9dXRpbC5leHRlbmQoe2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6dH0scmVxdWlyZWRDb250ZXh0QXR0cmlidXRlcyk7cmV0dXJuXCJwcm9iYWJseVN1cHBvcnRzQ29udGV4dFwiaW4gdGhpcy5jYW52YXM/dGhpcy5jYW52YXMucHJvYmFibHlTdXBwb3J0c0NvbnRleHQoXCJ3ZWJnbFwiLGUpfHx0aGlzLmNhbnZhcy5wcm9iYWJseVN1cHBvcnRzQ29udGV4dChcImV4cGVyaW1lbnRhbC13ZWJnbFwiLGUpOlwic3VwcG9ydHNDb250ZXh0XCJpbiB0aGlzLmNhbnZhcz90aGlzLmNhbnZhcy5zdXBwb3J0c0NvbnRleHQoXCJ3ZWJnbFwiLGUpfHx0aGlzLmNhbnZhcy5zdXBwb3J0c0NvbnRleHQoXCJleHBlcmltZW50YWwtd2ViZ2xcIixlKTohIXdpbmRvdy5XZWJHTFJlbmRlcmluZ0NvbnRleHQmJiEhdGhpcy5nZXRXZWJHTENvbnRleHQodCl9LENhbnZhcy5wcm90b3R5cGUuZ2V0RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbnZhc307XG59LHtcIi4uL3V0aWxcIjoxMDZ9XSw5NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBEaXNwYXRjaGVyKHIsdCl7dGhpcy5hY3RvcnM9W10sdGhpcy5jdXJyZW50QWN0b3I9MDtmb3IodmFyIGU9MDtyPmU7ZSsrKXt2YXIgbz1uZXcgV2ViV29ya2lmeShyZXF1aXJlKFwiLi4vLi4vc291cmNlL3dvcmtlclwiKSkscz1uZXcgQWN0b3Iobyx0KTtzLm5hbWU9XCJXb3JrZXIgXCIrZSx0aGlzLmFjdG9ycy5wdXNoKHMpfX12YXIgQWN0b3I9cmVxdWlyZShcIi4uL2FjdG9yXCIpLFdlYldvcmtpZnk9cmVxdWlyZShcIndlYndvcmtpZnlcIik7bW9kdWxlLmV4cG9ydHM9RGlzcGF0Y2hlcixEaXNwYXRjaGVyLnByb3RvdHlwZT17YnJvYWRjYXN0OmZ1bmN0aW9uKHIsdCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmFjdG9ycy5sZW5ndGg7ZSsrKXRoaXMuYWN0b3JzW2VdLnNlbmQocix0KX0sc2VuZDpmdW5jdGlvbihyLHQsZSxvLHMpe3JldHVybihcIm51bWJlclwiIT10eXBlb2Ygb3x8aXNOYU4obykpJiYobz10aGlzLmN1cnJlbnRBY3Rvcj0odGhpcy5jdXJyZW50QWN0b3IrMSkldGhpcy5hY3RvcnMubGVuZ3RoKSx0aGlzLmFjdG9yc1tvXS5zZW5kKHIsdCxlLHMpLG99LHJlbW92ZTpmdW5jdGlvbigpe2Zvcih2YXIgcj0wO3I8dGhpcy5hY3RvcnMubGVuZ3RoO3IrKyl0aGlzLmFjdG9yc1tyXS50YXJnZXQudGVybWluYXRlKCk7dGhpcy5hY3RvcnM9W119fTtcbn0se1wiLi4vLi4vc291cmNlL3dvcmtlclwiOjQ5LFwiLi4vYWN0b3JcIjo5MyxcIndlYndvcmtpZnlcIjoxNDl9XSw5ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0ZXN0UHJvcChlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZihlW3RdaW4gZG9jU3R5bGUpcmV0dXJuIGVbdF19ZnVuY3Rpb24gc3VwcHJlc3NDbGljayhlKXtlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsc3VwcHJlc3NDbGljaywhMCl9dmFyIFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKTtleHBvcnRzLmNyZWF0ZT1mdW5jdGlvbihlLHQscil7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlKTtyZXR1cm4gdCYmKG8uY2xhc3NOYW1lPXQpLHImJnIuYXBwZW5kQ2hpbGQobyksb307dmFyIGRvY1N0eWxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxzZWxlY3RQcm9wPXRlc3RQcm9wKFtcInVzZXJTZWxlY3RcIixcIk1velVzZXJTZWxlY3RcIixcIldlYmtpdFVzZXJTZWxlY3RcIixcIm1zVXNlclNlbGVjdFwiXSksdXNlclNlbGVjdDtleHBvcnRzLmRpc2FibGVEcmFnPWZ1bmN0aW9uKCl7c2VsZWN0UHJvcCYmKHVzZXJTZWxlY3Q9ZG9jU3R5bGVbc2VsZWN0UHJvcF0sZG9jU3R5bGVbc2VsZWN0UHJvcF09XCJub25lXCIpfSxleHBvcnRzLmVuYWJsZURyYWc9ZnVuY3Rpb24oKXtzZWxlY3RQcm9wJiYoZG9jU3R5bGVbc2VsZWN0UHJvcF09dXNlclNlbGVjdCl9O3ZhciB0cmFuc2Zvcm1Qcm9wPXRlc3RQcm9wKFtcInRyYW5zZm9ybVwiLFwiV2Via2l0VHJhbnNmb3JtXCJdKTtleHBvcnRzLnNldFRyYW5zZm9ybT1mdW5jdGlvbihlLHQpe2Uuc3R5bGVbdHJhbnNmb3JtUHJvcF09dH0sZXhwb3J0cy5zdXBwcmVzc0NsaWNrPWZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHN1cHByZXNzQ2xpY2ssITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHN1cHByZXNzQ2xpY2ssITApfSwwKX0sZXhwb3J0cy5tb3VzZVBvcz1mdW5jdGlvbihlLHQpe3ZhciByPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHQ9dC50b3VjaGVzP3QudG91Y2hlc1swXTp0LG5ldyBQb2ludCh0LmNsaWVudFgtci5sZWZ0LWUuY2xpZW50TGVmdCx0LmNsaWVudFktci50b3AtZS5jbGllbnRUb3ApfTtcbn0se1wicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSw5OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjttb2R1bGUuZXhwb3J0cz17QVBJX1VSTDpcImh0dHBzOi8vYXBpLm1hcGJveC5jb21cIixSRVFVSVJFX0FDQ0VTU19UT0tFTjohMH07XG59LHt9XSwxMDA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIHV0aWw9cmVxdWlyZShcIi4vdXRpbFwiKSxFdmVudGVkPXtvbjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9ldmVudHM9dGhpcy5fZXZlbnRzfHx7fSx0aGlzLl9ldmVudHNbdF09dGhpcy5fZXZlbnRzW3RdfHxbXSx0aGlzLl9ldmVudHNbdF0ucHVzaChlKSx0aGlzfSxvZmY6ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gZGVsZXRlIHRoaXMuX2V2ZW50cyx0aGlzO2lmKCF0aGlzLmxpc3RlbnModCkpcmV0dXJuIHRoaXM7aWYoZSl7dmFyIHM9dGhpcy5fZXZlbnRzW3RdLmluZGV4T2YoZSk7cz49MCYmdGhpcy5fZXZlbnRzW3RdLnNwbGljZShzLDEpLHRoaXMuX2V2ZW50c1t0XS5sZW5ndGh8fGRlbGV0ZSB0aGlzLl9ldmVudHNbdF19ZWxzZSBkZWxldGUgdGhpcy5fZXZlbnRzW3RdO3JldHVybiB0aGlzfSxvbmNlOmZ1bmN0aW9uKHQsZSl7dmFyIHM9ZnVuY3Rpb24oaSl7dGhpcy5vZmYodCxzKSxlLmNhbGwodGhpcyxpKX0uYmluZCh0aGlzKTtyZXR1cm4gdGhpcy5vbih0LHMpLHRoaXN9LGZpcmU6ZnVuY3Rpb24odCxlKXtpZighdGhpcy5saXN0ZW5zKHQpKXJldHVybiB0aGlzO2U9dXRpbC5leHRlbmQoe30sZSksdXRpbC5leHRlbmQoZSx7dHlwZTp0LHRhcmdldDp0aGlzfSk7Zm9yKHZhciBzPXRoaXMuX2V2ZW50c1t0XS5zbGljZSgpLGk9MDtpPHMubGVuZ3RoO2krKylzW2ldLmNhbGwodGhpcyxlKTtyZXR1cm4gdGhpc30sbGlzdGVuczpmdW5jdGlvbih0KXtyZXR1cm4hKCF0aGlzLl9ldmVudHN8fCF0aGlzLl9ldmVudHNbdF0pfX07bW9kdWxlLmV4cG9ydHM9RXZlbnRlZDtcbn0se1wiLi91dGlsXCI6MTA2fV0sMTAxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEdseXBocyhhLGUpe3RoaXMuc3RhY2tzPWEucmVhZEZpZWxkcyhyZWFkRm9udHN0YWNrcyxbXSxlKX1mdW5jdGlvbiByZWFkRm9udHN0YWNrcyhhLGUscil7aWYoMT09PWEpe3ZhciB0PXIucmVhZE1lc3NhZ2UocmVhZEZvbnRzdGFjayx7Z2x5cGhzOnt9fSk7ZS5wdXNoKHQpfX1mdW5jdGlvbiByZWFkRm9udHN0YWNrKGEsZSxyKXtpZigxPT09YSllLm5hbWU9ci5yZWFkU3RyaW5nKCk7ZWxzZSBpZigyPT09YSllLnJhbmdlPXIucmVhZFN0cmluZygpO2Vsc2UgaWYoMz09PWEpe3ZhciB0PXIucmVhZE1lc3NhZ2UocmVhZEdseXBoLHt9KTtlLmdseXBoc1t0LmlkXT10fX1mdW5jdGlvbiByZWFkR2x5cGgoYSxlLHIpezE9PT1hP2UuaWQ9ci5yZWFkVmFyaW50KCk6Mj09PWE/ZS5iaXRtYXA9ci5yZWFkQnl0ZXMoKTozPT09YT9lLndpZHRoPXIucmVhZFZhcmludCgpOjQ9PT1hP2UuaGVpZ2h0PXIucmVhZFZhcmludCgpOjU9PT1hP2UubGVmdD1yLnJlYWRTVmFyaW50KCk6Nj09PWE/ZS50b3A9ci5yZWFkU1ZhcmludCgpOjc9PT1hJiYoZS5hZHZhbmNlPXIucmVhZFZhcmludCgpKX1tb2R1bGUuZXhwb3J0cz1HbHlwaHM7XG59LHt9XSwxMDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaW50ZXJwb2xhdGUodCxlLG4pe3JldHVybiB0KigxLW4pK2Uqbn1tb2R1bGUuZXhwb3J0cz1pbnRlcnBvbGF0ZSxpbnRlcnBvbGF0ZS5udW1iZXI9aW50ZXJwb2xhdGUsaW50ZXJwb2xhdGUudmVjMj1mdW5jdGlvbih0LGUsbil7cmV0dXJuW2ludGVycG9sYXRlKHRbMF0sZVswXSxuKSxpbnRlcnBvbGF0ZSh0WzFdLGVbMV0sbildfSxpbnRlcnBvbGF0ZS5jb2xvcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuW2ludGVycG9sYXRlKHRbMF0sZVswXSxuKSxpbnRlcnBvbGF0ZSh0WzFdLGVbMV0sbiksaW50ZXJwb2xhdGUodFsyXSxlWzJdLG4pLGludGVycG9sYXRlKHRbM10sZVszXSxuKV19LGludGVycG9sYXRlLmFycmF5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCxyKXtyZXR1cm4gaW50ZXJwb2xhdGUodCxlW3JdLG4pfSl9O1xufSx7fV0sMTAzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIG5vcm1hbGl6ZVVSTChlLHIsbyl7aWYobz1vfHxjb25maWcuQUNDRVNTX1RPS0VOLCFvJiZjb25maWcuUkVRVUlSRV9BQ0NFU1NfVE9LRU4pdGhyb3cgbmV3IEVycm9yKFwiQW4gQVBJIGFjY2VzcyB0b2tlbiBpcyByZXF1aXJlZCB0byB1c2UgTWFwYm94IEdMLiBTZWUgaHR0cHM6Ly93d3cubWFwYm94LmNvbS9kZXZlbG9wZXJzL2FwaS8jYWNjZXNzLXRva2Vuc1wiKTtpZihlPWUucmVwbGFjZSgvXm1hcGJveDpcXC9cXC8vLGNvbmZpZy5BUElfVVJMK3IpLGUrPS0xIT09ZS5pbmRleE9mKFwiP1wiKT9cIiZhY2Nlc3NfdG9rZW49XCI6XCI/YWNjZXNzX3Rva2VuPVwiLGNvbmZpZy5SRVFVSVJFX0FDQ0VTU19UT0tFTil7aWYoXCJzXCI9PT1vWzBdKXRocm93IG5ldyBFcnJvcihcIlVzZSBhIHB1YmxpYyBhY2Nlc3MgdG9rZW4gKHBrLiopIHdpdGggTWFwYm94IEdMIEpTLCBub3QgYSBzZWNyZXQgYWNjZXNzIHRva2VuIChzay4qKS4gU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vZGV2ZWxvcGVycy9hcGkvI2FjY2Vzcy10b2tlbnNcIik7ZSs9b31yZXR1cm4gZX12YXIgY29uZmlnPXJlcXVpcmUoXCIuL2NvbmZpZ1wiKSxicm93c2VyPXJlcXVpcmUoXCIuL2Jyb3dzZXJcIik7bW9kdWxlLmV4cG9ydHMubm9ybWFsaXplU3R5bGVVUkw9ZnVuY3Rpb24oZSxyKXtpZighZS5tYXRjaCgvXm1hcGJveDpcXC9cXC9zdHlsZXNcXC8vKSlyZXR1cm4gZTt2YXIgbz1lLnNwbGl0KFwiL1wiKSx0PW9bM10sbj1vWzRdLHM9b1s1XT9cIi9kcmFmdFwiOlwiXCI7cmV0dXJuIG5vcm1hbGl6ZVVSTChcIm1hcGJveDovL1wiK3QrXCIvXCIrbitzLFwiL3N0eWxlcy92MS9cIixyKX0sbW9kdWxlLmV4cG9ydHMubm9ybWFsaXplU291cmNlVVJMPWZ1bmN0aW9uKGUscil7cmV0dXJuIGUubWF0Y2goL15tYXBib3g6XFwvXFwvLyk/bm9ybWFsaXplVVJMKGUrXCIuanNvblwiLFwiL3Y0L1wiLHIpK1wiJnNlY3VyZVwiOmV9LG1vZHVsZS5leHBvcnRzLm5vcm1hbGl6ZUdseXBoc1VSTD1mdW5jdGlvbihlLHIpe2lmKCFlLm1hdGNoKC9ebWFwYm94OlxcL1xcLy8pKXJldHVybiBlO3ZhciBvPWUuc3BsaXQoXCIvXCIpWzNdO3JldHVybiBub3JtYWxpemVVUkwoXCJtYXBib3g6Ly9cIitvK1wiL3tmb250c3RhY2t9L3tyYW5nZX0ucGJmXCIsXCIvZm9udHMvdjEvXCIscil9LG1vZHVsZS5leHBvcnRzLm5vcm1hbGl6ZVNwcml0ZVVSTD1mdW5jdGlvbihlLHIsbyx0KXtpZighZS5tYXRjaCgvXm1hcGJveDpcXC9cXC9zcHJpdGVzXFwvLykpcmV0dXJuIGUrcitvO3ZhciBuPWUuc3BsaXQoXCIvXCIpLHM9blszXSxhPW5bNF0saT1uWzVdP1wiL2RyYWZ0XCI6XCJcIjtyZXR1cm4gbm9ybWFsaXplVVJMKFwibWFwYm94Oi8vXCIrcytcIi9cIithK2krXCIvc3ByaXRlXCIrcitvLFwiL3N0eWxlcy92MS9cIix0KX0sbW9kdWxlLmV4cG9ydHMubm9ybWFsaXplVGlsZVVSTD1mdW5jdGlvbihlLHIpe3JldHVybiByJiZyLm1hdGNoKC9ebWFwYm94OlxcL1xcLy8pP2UucmVwbGFjZSgvXFwuKCg/OnBuZ3xqcGcpXFxkKikoPz0kfFxcPykvLGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbz49Mj9cIkAyeC4kMVwiOlwiLiQxXCIpOmV9O1xufSx7XCIuL2Jyb3dzZXJcIjo5NSxcIi4vY29uZmlnXCI6OTl9XSwxMDQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gTVJVQ2FjaGUodCxlKXt0aGlzLm1heD10LHRoaXMub25SZW1vdmU9ZSx0aGlzLnJlc2V0KCl9bW9kdWxlLmV4cG9ydHM9TVJVQ2FjaGUsTVJVQ2FjaGUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMubGlzdCl0aGlzLm9uUmVtb3ZlKHRoaXMubGlzdFt0XSk7cmV0dXJuIHRoaXMubGlzdD17fSx0aGlzLm9yZGVyPVtdLHRoaXN9LE1SVUNhY2hlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXtpZih0aGlzLmxpc3RbdF09ZSx0aGlzLm9yZGVyLnB1c2godCksdGhpcy5vcmRlci5sZW5ndGg+dGhpcy5tYXgpe3ZhciBpPXRoaXMuZ2V0KHRoaXMub3JkZXJbMF0pO2kmJnRoaXMub25SZW1vdmUoaSl9cmV0dXJuIHRoaXN9LE1SVUNhY2hlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW4gdGhpcy5saXN0fSxNUlVDYWNoZS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9yZGVyfSxNUlVDYWNoZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe2lmKCF0aGlzLmhhcyh0KSlyZXR1cm4gbnVsbDt2YXIgZT10aGlzLmxpc3RbdF07cmV0dXJuIGRlbGV0ZSB0aGlzLmxpc3RbdF0sdGhpcy5vcmRlci5zcGxpY2UodGhpcy5vcmRlci5pbmRleE9mKHQpLDEpLGV9O1xufSx7fV0sMTA1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHJlc29sdmVUb2tlbnMoZSxuKXtyZXR1cm4gbi5yZXBsYWNlKC97KFtee30oKVxcW1xcXTw+JD06Oy4sXl0rKX0vZyxmdW5jdGlvbihuLHIpe3JldHVybiByIGluIGU/ZVtyXTpcIlwifSl9bW9kdWxlLmV4cG9ydHM9cmVzb2x2ZVRva2Vucztcbn0se31dLDEwNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgVW5pdEJlemllcj1yZXF1aXJlKFwidW5pdGJlemllclwiKSxDb29yZGluYXRlPXJlcXVpcmUoXCIuLi9nZW8vY29vcmRpbmF0ZVwiKTtleHBvcnRzLmVhc2VDdWJpY0luT3V0PWZ1bmN0aW9uKG4pe2lmKDA+PW4pcmV0dXJuIDA7aWYobj49MSlyZXR1cm4gMTt2YXIgdD1uKm4scj10Km47cmV0dXJuIDQqKC41Pm4/cjozKihuLXQpK3ItLjc1KX0sZXhwb3J0cy5iZXppZXI9ZnVuY3Rpb24obix0LHIsZSl7dmFyIG89bmV3IFVuaXRCZXppZXIobix0LHIsZSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBvLnNvbHZlKG4pfX0sZXhwb3J0cy5lYXNlPWV4cG9ydHMuYmV6aWVyKC4yNSwuMSwuMjUsMSksZXhwb3J0cy5wcmVtdWx0aXBseT1mdW5jdGlvbihuKXtyZXR1cm4gblswXSo9blszXSxuWzFdKj1uWzNdLG5bMl0qPW5bM10sbn0sZXhwb3J0cy5jbGFtcD1mdW5jdGlvbihuLHQscil7cmV0dXJuIE1hdGgubWluKHIsTWF0aC5tYXgodCxuKSl9LGV4cG9ydHMud3JhcD1mdW5jdGlvbihuLHQscil7dmFyIGU9ci10LG89KChuLXQpJWUrZSklZSt0O3JldHVybiBvPT09dD9yOm99LGV4cG9ydHMuY29hbGVzY2U9ZnVuY3Rpb24oKXtmb3IodmFyIG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXt2YXIgdD1hcmd1bWVudHNbbl07aWYobnVsbCE9PXQmJnZvaWQgMCE9PXQpcmV0dXJuIHR9fSxleHBvcnRzLmFzeW5jRWFjaD1mdW5jdGlvbihuLHQscil7ZnVuY3Rpb24gZSgpezA9PT0tLW8mJnIoKX12YXIgbz1uLmxlbmd0aDtpZigwPT09bylyZXR1cm4gcigpO2Zvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXQobltpXSxlKX0sZXhwb3J0cy5hc3luY0FsbD1mdW5jdGlvbihuLHQscil7dmFyIGU9bi5sZW5ndGgsbz1uZXcgQXJyYXkobi5sZW5ndGgpLGk9bnVsbDtuLmZvckVhY2goZnVuY3Rpb24obix1KXt0KG4sZnVuY3Rpb24obix0KXtuJiYoaT1uKSxvW3VdPXQsMD09PS0tZSYmcihpLG8pfSl9KX0sZXhwb3J0cy5rZXlzRGlmZmVyZW5jZT1mdW5jdGlvbihuLHQpe3ZhciByPVtdO2Zvcih2YXIgZSBpbiBuKWUgaW4gdHx8ci5wdXNoKGUpO3JldHVybiByfSxleHBvcnRzLmV4dGVuZD1mdW5jdGlvbihuKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgcj1hcmd1bWVudHNbdF07Zm9yKHZhciBlIGluIHIpbltlXT1yW2VdfXJldHVybiBufSxleHBvcnRzLmV4dGVuZEFsbD1mdW5jdGlvbihuLHQpe2Zvcih2YXIgciBpbiB0KU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LHIpKTtyZXR1cm4gbn0sZXhwb3J0cy5pbmhlcml0PWZ1bmN0aW9uKG4sdCl7dmFyIHI9XCJmdW5jdGlvblwiPT10eXBlb2Ygbj9uLnByb3RvdHlwZTpuLGU9T2JqZWN0LmNyZWF0ZShyKTtyZXR1cm4gZXhwb3J0cy5leHRlbmRBbGwoZSx0KSxlfSxleHBvcnRzLnBpY2s9ZnVuY3Rpb24obix0KXtmb3IodmFyIHI9e30sZT0wO2U8dC5sZW5ndGg7ZSsrKXt2YXIgbz10W2VdO28gaW4gbiYmKHJbb109bltvXSl9cmV0dXJuIHJ9O3ZhciBpZD0xO2V4cG9ydHMudW5pcXVlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gaWQrK30sZXhwb3J0cy50aHJvdHRsZT1mdW5jdGlvbihuLHQscil7dmFyIGUsbyxpLHU7cmV0dXJuIHU9ZnVuY3Rpb24oKXtlPSExLG8mJihpLmFwcGx5KHIsbyksbz0hMSl9LGk9ZnVuY3Rpb24oKXtlP289YXJndW1lbnRzOihuLmFwcGx5KHIsYXJndW1lbnRzKSxzZXRUaW1lb3V0KHUsdCksZT0hMCl9fSxleHBvcnRzLmRlYm91bmNlPWZ1bmN0aW9uKG4sdCl7dmFyIHIsZTtyZXR1cm4gZnVuY3Rpb24oKXtlPWFyZ3VtZW50cyxjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5hcHBseShudWxsLGUpfSx0KX19LGV4cG9ydHMuYmluZEFsbD1mdW5jdGlvbihuLHQpe24uZm9yRWFjaChmdW5jdGlvbihuKXt0W25dPXRbbl0uYmluZCh0KX0pfSxleHBvcnRzLmJpbmRIYW5kbGVycz1mdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gbilcImZ1bmN0aW9uXCI9PXR5cGVvZiBuW3RdJiYwPT09dC5pbmRleE9mKFwiX29uXCIpJiYoblt0XT1uW3RdLmJpbmQobikpfSxleHBvcnRzLnNldE9wdGlvbnM9ZnVuY3Rpb24obix0KXtuLmhhc093blByb3BlcnR5KFwib3B0aW9uc1wiKXx8KG4ub3B0aW9ucz1uLm9wdGlvbnM/T2JqZWN0LmNyZWF0ZShuLm9wdGlvbnMpOnt9KTtmb3IodmFyIHIgaW4gdCluLm9wdGlvbnNbcl09dFtyXTtyZXR1cm4gbi5vcHRpb25zfSxleHBvcnRzLmdldENvb3JkaW5hdGVzQ2VudGVyPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdD0xLzAscj0xLzAsZT0tKDEvMCksbz0tKDEvMCksaT0wO2k8bi5sZW5ndGg7aSsrKXQ9TWF0aC5taW4odCxuW2ldLmNvbHVtbikscj1NYXRoLm1pbihyLG5baV0ucm93KSxlPU1hdGgubWF4KGUsbltpXS5jb2x1bW4pLG89TWF0aC5tYXgobyxuW2ldLnJvdyk7dmFyIHU9ZS10LGE9by1yLGM9TWF0aC5tYXgodSxhKTtyZXR1cm4gbmV3IENvb3JkaW5hdGUoKHQrZSkvMiwocitvKS8yLDApLnpvb21UbyhNYXRoLmZsb29yKC1NYXRoLmxvZyhjKS9NYXRoLkxOMikpfTtcbn0se1wiLi4vZ2VvL2Nvb3JkaW5hdGVcIjoxOSxcInVuaXRiZXppZXJcIjoxNDF9XSwxMDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoZSl7cmV0dXJuIGU9TWF0aC5yb3VuZChlKSwwPmU/MDplPjI1NT8yNTU6ZX1mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZSl7cmV0dXJuIDA+ZT8wOmU+MT8xOmV9ZnVuY3Rpb24gcGFyc2VfY3NzX2ludChlKXtyZXR1cm4gY2xhbXBfY3NzX2J5dGUoXCIlXCI9PT1lW2UubGVuZ3RoLTFdP3BhcnNlRmxvYXQoZSkvMTAwKjI1NTpwYXJzZUludChlKSl9ZnVuY3Rpb24gcGFyc2VfY3NzX2Zsb2F0KGUpe3JldHVybiBjbGFtcF9jc3NfZmxvYXQoXCIlXCI9PT1lW2UubGVuZ3RoLTFdP3BhcnNlRmxvYXQoZSkvMTAwOnBhcnNlRmxvYXQoZSkpfWZ1bmN0aW9uIGNzc19odWVfdG9fcmdiKGUscixsKXtyZXR1cm4gMD5sP2wrPTE6bD4xJiYobC09MSksMT42Kmw/ZSsoci1lKSpsKjY6MT4yKmw/cjoyPjMqbD9lKyhyLWUpKigyLzMtbCkqNjplfWZ1bmN0aW9uIHBhcnNlQ1NTQ29sb3IoZSl7dmFyIHI9ZS5yZXBsYWNlKC8gL2csXCJcIikudG9Mb3dlckNhc2UoKTtpZihyIGluIGtDU1NDb2xvclRhYmxlKXJldHVybiBrQ1NTQ29sb3JUYWJsZVtyXS5zbGljZSgpO2lmKFwiI1wiPT09clswXSl7aWYoND09PXIubGVuZ3RoKXt2YXIgbD1wYXJzZUludChyLnN1YnN0cigxKSwxNik7cmV0dXJuIGw+PTAmJjQwOTU+PWw/WygzODQwJmwpPj40fCgzODQwJmwpPj44LDI0MCZsfCgyNDAmbCk+PjQsMTUmbHwoMTUmbCk8PDQsMV06bnVsbH1pZig3PT09ci5sZW5ndGgpe3ZhciBsPXBhcnNlSW50KHIuc3Vic3RyKDEpLDE2KTtyZXR1cm4gbD49MCYmMTY3NzcyMTU+PWw/WygxNjcxMTY4MCZsKT4+MTYsKDY1MjgwJmwpPj44LDI1NSZsLDFdOm51bGx9cmV0dXJuIG51bGx9dmFyIGE9ci5pbmRleE9mKFwiKFwiKSx0PXIuaW5kZXhPZihcIilcIik7aWYoLTEhPT1hJiZ0KzE9PT1yLmxlbmd0aCl7dmFyIG49ci5zdWJzdHIoMCxhKSxzPXIuc3Vic3RyKGErMSx0LShhKzEpKS5zcGxpdChcIixcIiksbz0xO3N3aXRjaChuKXtjYXNlXCJyZ2JhXCI6aWYoNCE9PXMubGVuZ3RoKXJldHVybiBudWxsO289cGFyc2VfY3NzX2Zsb2F0KHMucG9wKCkpO2Nhc2VcInJnYlwiOnJldHVybiAzIT09cy5sZW5ndGg/bnVsbDpbcGFyc2VfY3NzX2ludChzWzBdKSxwYXJzZV9jc3NfaW50KHNbMV0pLHBhcnNlX2Nzc19pbnQoc1syXSksb107Y2FzZVwiaHNsYVwiOmlmKDQhPT1zLmxlbmd0aClyZXR1cm4gbnVsbDtvPXBhcnNlX2Nzc19mbG9hdChzLnBvcCgpKTtjYXNlXCJoc2xcIjppZigzIT09cy5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIGk9KHBhcnNlRmxvYXQoc1swXSklMzYwKzM2MCklMzYwLzM2MCx1PXBhcnNlX2Nzc19mbG9hdChzWzFdKSxnPXBhcnNlX2Nzc19mbG9hdChzWzJdKSxkPS41Pj1nP2cqKHUrMSk6Zyt1LWcqdSxjPTIqZy1kO3JldHVybltjbGFtcF9jc3NfYnl0ZSgyNTUqY3NzX2h1ZV90b19yZ2IoYyxkLGkrMS8zKSksY2xhbXBfY3NzX2J5dGUoMjU1KmNzc19odWVfdG9fcmdiKGMsZCxpKSksY2xhbXBfY3NzX2J5dGUoMjU1KmNzc19odWVfdG9fcmdiKGMsZCxpLTEvMykpLG9dO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXJldHVybiBudWxsfXZhciBrQ1NTQ29sb3JUYWJsZT17dHJhbnNwYXJlbnQ6WzAsMCwwLDBdLGFsaWNlYmx1ZTpbMjQwLDI0OCwyNTUsMV0sYW50aXF1ZXdoaXRlOlsyNTAsMjM1LDIxNSwxXSxhcXVhOlswLDI1NSwyNTUsMV0sYXF1YW1hcmluZTpbMTI3LDI1NSwyMTIsMV0sYXp1cmU6WzI0MCwyNTUsMjU1LDFdLGJlaWdlOlsyNDUsMjQ1LDIyMCwxXSxiaXNxdWU6WzI1NSwyMjgsMTk2LDFdLGJsYWNrOlswLDAsMCwxXSxibGFuY2hlZGFsbW9uZDpbMjU1LDIzNSwyMDUsMV0sYmx1ZTpbMCwwLDI1NSwxXSxibHVldmlvbGV0OlsxMzgsNDMsMjI2LDFdLGJyb3duOlsxNjUsNDIsNDIsMV0sYnVybHl3b29kOlsyMjIsMTg0LDEzNSwxXSxjYWRldGJsdWU6Wzk1LDE1OCwxNjAsMV0sY2hhcnRyZXVzZTpbMTI3LDI1NSwwLDFdLGNob2NvbGF0ZTpbMjEwLDEwNSwzMCwxXSxjb3JhbDpbMjU1LDEyNyw4MCwxXSxjb3JuZmxvd2VyYmx1ZTpbMTAwLDE0OSwyMzcsMV0sY29ybnNpbGs6WzI1NSwyNDgsMjIwLDFdLGNyaW1zb246WzIyMCwyMCw2MCwxXSxjeWFuOlswLDI1NSwyNTUsMV0sZGFya2JsdWU6WzAsMCwxMzksMV0sZGFya2N5YW46WzAsMTM5LDEzOSwxXSxkYXJrZ29sZGVucm9kOlsxODQsMTM0LDExLDFdLGRhcmtncmF5OlsxNjksMTY5LDE2OSwxXSxkYXJrZ3JlZW46WzAsMTAwLDAsMV0sZGFya2dyZXk6WzE2OSwxNjksMTY5LDFdLGRhcmtraGFraTpbMTg5LDE4MywxMDcsMV0sZGFya21hZ2VudGE6WzEzOSwwLDEzOSwxXSxkYXJrb2xpdmVncmVlbjpbODUsMTA3LDQ3LDFdLGRhcmtvcmFuZ2U6WzI1NSwxNDAsMCwxXSxkYXJrb3JjaGlkOlsxNTMsNTAsMjA0LDFdLGRhcmtyZWQ6WzEzOSwwLDAsMV0sZGFya3NhbG1vbjpbMjMzLDE1MCwxMjIsMV0sZGFya3NlYWdyZWVuOlsxNDMsMTg4LDE0MywxXSxkYXJrc2xhdGVibHVlOls3Miw2MSwxMzksMV0sZGFya3NsYXRlZ3JheTpbNDcsNzksNzksMV0sZGFya3NsYXRlZ3JleTpbNDcsNzksNzksMV0sZGFya3R1cnF1b2lzZTpbMCwyMDYsMjA5LDFdLGRhcmt2aW9sZXQ6WzE0OCwwLDIxMSwxXSxkZWVwcGluazpbMjU1LDIwLDE0NywxXSxkZWVwc2t5Ymx1ZTpbMCwxOTEsMjU1LDFdLGRpbWdyYXk6WzEwNSwxMDUsMTA1LDFdLGRpbWdyZXk6WzEwNSwxMDUsMTA1LDFdLGRvZGdlcmJsdWU6WzMwLDE0NCwyNTUsMV0sZmlyZWJyaWNrOlsxNzgsMzQsMzQsMV0sZmxvcmFsd2hpdGU6WzI1NSwyNTAsMjQwLDFdLGZvcmVzdGdyZWVuOlszNCwxMzksMzQsMV0sZnVjaHNpYTpbMjU1LDAsMjU1LDFdLGdhaW5zYm9ybzpbMjIwLDIyMCwyMjAsMV0sZ2hvc3R3aGl0ZTpbMjQ4LDI0OCwyNTUsMV0sZ29sZDpbMjU1LDIxNSwwLDFdLGdvbGRlbnJvZDpbMjE4LDE2NSwzMiwxXSxncmF5OlsxMjgsMTI4LDEyOCwxXSxncmVlbjpbMCwxMjgsMCwxXSxncmVlbnllbGxvdzpbMTczLDI1NSw0NywxXSxncmV5OlsxMjgsMTI4LDEyOCwxXSxob25leWRldzpbMjQwLDI1NSwyNDAsMV0saG90cGluazpbMjU1LDEwNSwxODAsMV0saW5kaWFucmVkOlsyMDUsOTIsOTIsMV0saW5kaWdvOls3NSwwLDEzMCwxXSxpdm9yeTpbMjU1LDI1NSwyNDAsMV0sa2hha2k6WzI0MCwyMzAsMTQwLDFdLGxhdmVuZGVyOlsyMzAsMjMwLDI1MCwxXSxsYXZlbmRlcmJsdXNoOlsyNTUsMjQwLDI0NSwxXSxsYXduZ3JlZW46WzEyNCwyNTIsMCwxXSxsZW1vbmNoaWZmb246WzI1NSwyNTAsMjA1LDFdLGxpZ2h0Ymx1ZTpbMTczLDIxNiwyMzAsMV0sbGlnaHRjb3JhbDpbMjQwLDEyOCwxMjgsMV0sbGlnaHRjeWFuOlsyMjQsMjU1LDI1NSwxXSxsaWdodGdvbGRlbnJvZHllbGxvdzpbMjUwLDI1MCwyMTAsMV0sbGlnaHRncmF5OlsyMTEsMjExLDIxMSwxXSxsaWdodGdyZWVuOlsxNDQsMjM4LDE0NCwxXSxsaWdodGdyZXk6WzIxMSwyMTEsMjExLDFdLGxpZ2h0cGluazpbMjU1LDE4MiwxOTMsMV0sbGlnaHRzYWxtb246WzI1NSwxNjAsMTIyLDFdLGxpZ2h0c2VhZ3JlZW46WzMyLDE3OCwxNzAsMV0sbGlnaHRza3libHVlOlsxMzUsMjA2LDI1MCwxXSxsaWdodHNsYXRlZ3JheTpbMTE5LDEzNiwxNTMsMV0sbGlnaHRzbGF0ZWdyZXk6WzExOSwxMzYsMTUzLDFdLGxpZ2h0c3RlZWxibHVlOlsxNzYsMTk2LDIyMiwxXSxsaWdodHllbGxvdzpbMjU1LDI1NSwyMjQsMV0sbGltZTpbMCwyNTUsMCwxXSxsaW1lZ3JlZW46WzUwLDIwNSw1MCwxXSxsaW5lbjpbMjUwLDI0MCwyMzAsMV0sbWFnZW50YTpbMjU1LDAsMjU1LDFdLG1hcm9vbjpbMTI4LDAsMCwxXSxtZWRpdW1hcXVhbWFyaW5lOlsxMDIsMjA1LDE3MCwxXSxtZWRpdW1ibHVlOlswLDAsMjA1LDFdLG1lZGl1bW9yY2hpZDpbMTg2LDg1LDIxMSwxXSxtZWRpdW1wdXJwbGU6WzE0NywxMTIsMjE5LDFdLG1lZGl1bXNlYWdyZWVuOls2MCwxNzksMTEzLDFdLG1lZGl1bXNsYXRlYmx1ZTpbMTIzLDEwNCwyMzgsMV0sbWVkaXVtc3ByaW5nZ3JlZW46WzAsMjUwLDE1NCwxXSxtZWRpdW10dXJxdW9pc2U6WzcyLDIwOSwyMDQsMV0sbWVkaXVtdmlvbGV0cmVkOlsxOTksMjEsMTMzLDFdLG1pZG5pZ2h0Ymx1ZTpbMjUsMjUsMTEyLDFdLG1pbnRjcmVhbTpbMjQ1LDI1NSwyNTAsMV0sbWlzdHlyb3NlOlsyNTUsMjI4LDIyNSwxXSxtb2NjYXNpbjpbMjU1LDIyOCwxODEsMV0sbmF2YWpvd2hpdGU6WzI1NSwyMjIsMTczLDFdLG5hdnk6WzAsMCwxMjgsMV0sb2xkbGFjZTpbMjUzLDI0NSwyMzAsMV0sb2xpdmU6WzEyOCwxMjgsMCwxXSxvbGl2ZWRyYWI6WzEwNywxNDIsMzUsMV0sb3JhbmdlOlsyNTUsMTY1LDAsMV0sb3JhbmdlcmVkOlsyNTUsNjksMCwxXSxvcmNoaWQ6WzIxOCwxMTIsMjE0LDFdLHBhbGVnb2xkZW5yb2Q6WzIzOCwyMzIsMTcwLDFdLHBhbGVncmVlbjpbMTUyLDI1MSwxNTIsMV0scGFsZXR1cnF1b2lzZTpbMTc1LDIzOCwyMzgsMV0scGFsZXZpb2xldHJlZDpbMjE5LDExMiwxNDcsMV0scGFwYXlhd2hpcDpbMjU1LDIzOSwyMTMsMV0scGVhY2hwdWZmOlsyNTUsMjE4LDE4NSwxXSxwZXJ1OlsyMDUsMTMzLDYzLDFdLHBpbms6WzI1NSwxOTIsMjAzLDFdLHBsdW06WzIyMSwxNjAsMjIxLDFdLHBvd2RlcmJsdWU6WzE3NiwyMjQsMjMwLDFdLHB1cnBsZTpbMTI4LDAsMTI4LDFdLHJlZDpbMjU1LDAsMCwxXSxyb3N5YnJvd246WzE4OCwxNDMsMTQzLDFdLHJveWFsYmx1ZTpbNjUsMTA1LDIyNSwxXSxzYWRkbGVicm93bjpbMTM5LDY5LDE5LDFdLHNhbG1vbjpbMjUwLDEyOCwxMTQsMV0sc2FuZHlicm93bjpbMjQ0LDE2NCw5NiwxXSxzZWFncmVlbjpbNDYsMTM5LDg3LDFdLHNlYXNoZWxsOlsyNTUsMjQ1LDIzOCwxXSxzaWVubmE6WzE2MCw4Miw0NSwxXSxzaWx2ZXI6WzE5MiwxOTIsMTkyLDFdLHNreWJsdWU6WzEzNSwyMDYsMjM1LDFdLHNsYXRlYmx1ZTpbMTA2LDkwLDIwNSwxXSxzbGF0ZWdyYXk6WzExMiwxMjgsMTQ0LDFdLHNsYXRlZ3JleTpbMTEyLDEyOCwxNDQsMV0sc25vdzpbMjU1LDI1MCwyNTAsMV0sc3ByaW5nZ3JlZW46WzAsMjU1LDEyNywxXSxzdGVlbGJsdWU6WzcwLDEzMCwxODAsMV0sdGFuOlsyMTAsMTgwLDE0MCwxXSx0ZWFsOlswLDEyOCwxMjgsMV0sdGhpc3RsZTpbMjE2LDE5MSwyMTYsMV0sdG9tYXRvOlsyNTUsOTksNzEsMV0sdHVycXVvaXNlOls2NCwyMjQsMjA4LDFdLHZpb2xldDpbMjM4LDEzMCwyMzgsMV0sd2hlYXQ6WzI0NSwyMjIsMTc5LDFdLHdoaXRlOlsyNTUsMjU1LDI1NSwxXSx3aGl0ZXNtb2tlOlsyNDUsMjQ1LDI0NSwxXSx5ZWxsb3c6WzI1NSwyNTUsMCwxXSx5ZWxsb3dncmVlbjpbMTU0LDIwNSw1MCwxXX07dHJ5e2V4cG9ydHMucGFyc2VDU1NDb2xvcj1wYXJzZUNTU0NvbG9yfWNhdGNoKGUpe31cbn0se31dLDEwODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpbmZpeCh0KXtyZXR1cm4gZnVuY3Rpb24obixyLGkpe3JldHVyblwiJHR5cGVcIj09PXI/XCJ0XCIrdCtWZWN0b3JUaWxlRmVhdHVyZVR5cGVzLmluZGV4T2YoaSk6XCJwW1wiK0pTT04uc3RyaW5naWZ5KHIpK1wiXVwiK3QrSlNPTi5zdHJpbmdpZnkoaSl9fWZ1bmN0aW9uIHN0cmljdEluZml4KHQpe3ZhciBuPWluZml4KHQpO3JldHVybiBmdW5jdGlvbih0LHIsaSl7cmV0dXJuXCIkdHlwZVwiPT09cj9uKHQscixpKTpcInR5cGVvZihwW1wiK0pTT04uc3RyaW5naWZ5KHIpK1wiXSkgPT09IHR5cGVvZihcIitKU09OLnN0cmluZ2lmeShpKStcIikgJiYgXCIrbih0LHIsaSl9fWZ1bmN0aW9uIGNvbXBpbGUodCl7cmV0dXJuIG9wZXJhdG9yc1t0WzBdXS5hcHBseSh0LHQpfWZ1bmN0aW9uIHRydXRoKCl7cmV0dXJuITB9dmFyIFZlY3RvclRpbGVGZWF0dXJlVHlwZXM9W1wiVW5rbm93blwiLFwiUG9pbnRcIixcIkxpbmVTdHJpbmdcIixcIlBvbHlnb25cIl0sb3BlcmF0b3JzPXtcIj09XCI6aW5maXgoXCI9PT1cIiksXCIhPVwiOmluZml4KFwiIT09XCIpLFwiPlwiOnN0cmljdEluZml4KFwiPlwiKSxcIjxcIjpzdHJpY3RJbmZpeChcIjxcIiksXCI8PVwiOnN0cmljdEluZml4KFwiPD1cIiksXCI+PVwiOnN0cmljdEluZml4KFwiPj1cIiksXCJpblwiOmZ1bmN0aW9uKHQsbil7cmV0dXJuXCIoZnVuY3Rpb24oKXtcIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikubWFwKGZ1bmN0aW9uKHIpe3JldHVyblwiaWYgKFwiK29wZXJhdG9yc1tcIj09XCJdKHQsbixyKStcIikgcmV0dXJuIHRydWU7XCJ9KS5qb2luKFwiXCIpK1wicmV0dXJuIGZhbHNlO30pKClcIn0sXCIhaW5cIjpmdW5jdGlvbigpe3JldHVyblwiIShcIitvcGVyYXRvcnNbXCJpblwiXS5hcHBseSh0aGlzLGFyZ3VtZW50cykrXCIpXCJ9LGFueTpmdW5jdGlvbigpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkubWFwKGZ1bmN0aW9uKHQpe3JldHVyblwiKFwiK2NvbXBpbGUodCkrXCIpXCJ9KS5qb2luKFwifHxcIil8fFwiZmFsc2VcIn0sYWxsOmZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuXCIoXCIrY29tcGlsZSh0KStcIilcIn0pLmpvaW4oXCImJlwiKXx8XCJ0cnVlXCJ9LG5vbmU6ZnVuY3Rpb24oKXtyZXR1cm5cIiEoXCIrb3BlcmF0b3JzLmFueS5hcHBseSh0aGlzLGFyZ3VtZW50cykrXCIpXCJ9fTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighdClyZXR1cm4gdHJ1dGg7dmFyIG49XCJ2YXIgcCA9IGYucHJvcGVydGllcyB8fCBmLnRhZ3MgfHwge30sIHQgPSBmLnR5cGU7IHJldHVybiBcIitjb21waWxlKHQpK1wiO1wiO3JldHVybiBuZXcgRnVuY3Rpb24oXCJmXCIsbil9O1xufSx7fV0sMTA5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNsaXAoZSxuLHQscixsLHUsaSxzKXtpZih0Lz1uLHIvPW4saT49dCYmcj49cylyZXR1cm4gZTtpZihpPnJ8fHQ+cylyZXR1cm4gbnVsbDtmb3IodmFyIHA9W10saD0wO2g8ZS5sZW5ndGg7aCsrKXt2YXIgYyxhLG89ZVtoXSxmPW8uZ2VvbWV0cnksZz1vLnR5cGU7aWYoYz1vLm1pbltsXSxhPW8ubWF4W2xdLGM+PXQmJnI+PWEpcC5wdXNoKG8pO2Vsc2UgaWYoIShjPnJ8fHQ+YSkpe3ZhciBtPTE9PT1nP2NsaXBQb2ludHMoZix0LHIsbCk6Y2xpcEdlb21ldHJ5KGYsdCxyLGwsdSwzPT09Zyk7bS5sZW5ndGgmJnAucHVzaCh7Z2VvbWV0cnk6bSx0eXBlOmcsdGFnczplW2hdLnRhZ3N8fG51bGwsbWluOm8ubWluLG1heDpvLm1heH0pfX1yZXR1cm4gcC5sZW5ndGg/cDpudWxsfWZ1bmN0aW9uIGNsaXBQb2ludHMoZSxuLHQscil7Zm9yKHZhciBsPVtdLHU9MDt1PGUubGVuZ3RoO3UrKyl7dmFyIGk9ZVt1XSxzPWlbcl07cz49biYmdD49cyYmbC5wdXNoKGkpfXJldHVybiBsfWZ1bmN0aW9uIGNsaXBHZW9tZXRyeShlLG4sdCxyLGwsdSl7Zm9yKHZhciBpPVtdLHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHAsaCxjLGE9MCxvPTAsZj1udWxsLGc9ZVtzXSxtPWcuYXJlYSx2PWcuZGlzdCx3PWcubGVuZ3RoLHk9W107Zm9yKGg9MDt3LTE+aDtoKyspcD1mfHxnW2hdLGY9Z1toKzFdLGE9b3x8cFtyXSxvPWZbcl0sbj5hP28+dD8oeS5wdXNoKGwocCxmLG4pLGwocCxmLHQpKSx1fHwoeT1uZXdTbGljZShpLHksbSx2KSkpOm8+PW4mJnkucHVzaChsKHAsZixuKSk6YT50P24+bz8oeS5wdXNoKGwocCxmLHQpLGwocCxmLG4pKSx1fHwoeT1uZXdTbGljZShpLHksbSx2KSkpOnQ+PW8mJnkucHVzaChsKHAsZix0KSk6KHkucHVzaChwKSxuPm8/KHkucHVzaChsKHAsZixuKSksdXx8KHk9bmV3U2xpY2UoaSx5LG0sdikpKTpvPnQmJih5LnB1c2gobChwLGYsdCkpLHV8fCh5PW5ld1NsaWNlKGkseSxtLHYpKSkpO3A9Z1t3LTFdLGE9cFtyXSxhPj1uJiZ0Pj1hJiZ5LnB1c2gocCksYz15W3kubGVuZ3RoLTFdLHUmJmMmJih5WzBdWzBdIT09Y1swXXx8eVswXVsxXSE9PWNbMV0pJiZ5LnB1c2goeVswXSksbmV3U2xpY2UoaSx5LG0sdil9cmV0dXJuIGl9ZnVuY3Rpb24gbmV3U2xpY2UoZSxuLHQscil7cmV0dXJuIG4ubGVuZ3RoJiYobi5hcmVhPXQsbi5kaXN0PXIsZS5wdXNoKG4pKSxbXX1tb2R1bGUuZXhwb3J0cz1jbGlwO1xufSx7fV0sMTEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNvbnZlcnQoZSx0KXt2YXIgcj1bXTtpZihcIkZlYXR1cmVDb2xsZWN0aW9uXCI9PT1lLnR5cGUpZm9yKHZhciBvPTA7bzxlLmZlYXR1cmVzLmxlbmd0aDtvKyspY29udmVydEZlYXR1cmUocixlLmZlYXR1cmVzW29dLHQpO2Vsc2VcIkZlYXR1cmVcIj09PWUudHlwZT9jb252ZXJ0RmVhdHVyZShyLGUsdCk6Y29udmVydEZlYXR1cmUocix7Z2VvbWV0cnk6ZX0sdCk7cmV0dXJuIHJ9ZnVuY3Rpb24gY29udmVydEZlYXR1cmUoZSx0LHIpe3ZhciBvLG4sYSxpPXQuZ2VvbWV0cnksYz1pLnR5cGUsbD1pLmNvb3JkaW5hdGVzLHU9dC5wcm9wZXJ0aWVzO2lmKFwiUG9pbnRcIj09PWMpZS5wdXNoKGNyZWF0ZSh1LDEsW3Byb2plY3RQb2ludChsKV0pKTtlbHNlIGlmKFwiTXVsdGlQb2ludFwiPT09YyllLnB1c2goY3JlYXRlKHUsMSxwcm9qZWN0KGwpKSk7ZWxzZSBpZihcIkxpbmVTdHJpbmdcIj09PWMpZS5wdXNoKGNyZWF0ZSh1LDIsW3Byb2plY3QobCxyKV0pKTtlbHNlIGlmKFwiTXVsdGlMaW5lU3RyaW5nXCI9PT1jfHxcIlBvbHlnb25cIj09PWMpe2ZvcihhPVtdLG89MDtvPGwubGVuZ3RoO28rKylhLnB1c2gocHJvamVjdChsW29dLHIpKTtlLnB1c2goY3JlYXRlKHUsXCJQb2x5Z29uXCI9PT1jPzM6MixhKSl9ZWxzZSBpZihcIk11bHRpUG9seWdvblwiPT09Yyl7Zm9yKGE9W10sbz0wO288bC5sZW5ndGg7bysrKWZvcihuPTA7bjxsW29dLmxlbmd0aDtuKyspYS5wdXNoKHByb2plY3QobFtvXVtuXSxyKSk7ZS5wdXNoKGNyZWF0ZSh1LDMsYSkpfWVsc2V7aWYoXCJHZW9tZXRyeUNvbGxlY3Rpb25cIiE9PWMpdGhyb3cgbmV3IEVycm9yKFwiSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5cIik7Zm9yKG89MDtvPGkuZ2VvbWV0cmllcy5sZW5ndGg7bysrKWNvbnZlcnRGZWF0dXJlKGUse2dlb21ldHJ5OmkuZ2VvbWV0cmllc1tvXSxwcm9wZXJ0aWVzOnV9LHIpfX1mdW5jdGlvbiBjcmVhdGUoZSx0LHIpe3ZhciBvPXtnZW9tZXRyeTpyLHR5cGU6dCx0YWdzOmV8fG51bGwsbWluOlsyLDFdLG1heDpbLTEsMF19O3JldHVybiBjYWxjQkJveChvKSxvfWZ1bmN0aW9uIHByb2plY3QoZSx0KXtmb3IodmFyIHI9W10sbz0wO288ZS5sZW5ndGg7bysrKXIucHVzaChwcm9qZWN0UG9pbnQoZVtvXSkpO3JldHVybiB0JiYoc2ltcGxpZnkocix0KSxjYWxjU2l6ZShyKSkscn1mdW5jdGlvbiBwcm9qZWN0UG9pbnQoZSl7dmFyIHQ9TWF0aC5zaW4oZVsxXSpNYXRoLlBJLzE4MCkscj1lWzBdLzM2MCsuNSxvPS41LS4yNSpNYXRoLmxvZygoMSt0KS8oMS10KSkvTWF0aC5QSTtyZXR1cm4gbz0tMT5vPy0xOm8+MT8xOm8sW3IsbywwXX1mdW5jdGlvbiBjYWxjU2l6ZShlKXtmb3IodmFyIHQscixvPTAsbj0wLGE9MDthPGUubGVuZ3RoLTE7YSsrKXQ9cnx8ZVthXSxyPWVbYSsxXSxvKz10WzBdKnJbMV0tclswXSp0WzFdLG4rPU1hdGguYWJzKHJbMF0tdFswXSkrTWF0aC5hYnMoclsxXS10WzFdKTtlLmFyZWE9TWF0aC5hYnMoby8yKSxlLmRpc3Q9bn1mdW5jdGlvbiBjYWxjQkJveChlKXt2YXIgdD1lLmdlb21ldHJ5LHI9ZS5taW4sbz1lLm1heDtpZigxPT09ZS50eXBlKWNhbGNSaW5nQkJveChyLG8sdCk7ZWxzZSBmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyljYWxjUmluZ0JCb3gocixvLHRbbl0pO3JldHVybiBlfWZ1bmN0aW9uIGNhbGNSaW5nQkJveChlLHQscil7Zm9yKHZhciBvLG49MDtuPHIubGVuZ3RoO24rKylvPXJbbl0sZVswXT1NYXRoLm1pbihvWzBdLGVbMF0pLHRbMF09TWF0aC5tYXgob1swXSx0WzBdKSxlWzFdPU1hdGgubWluKG9bMV0sZVsxXSksdFsxXT1NYXRoLm1heChvWzFdLHRbMV0pfW1vZHVsZS5leHBvcnRzPWNvbnZlcnQ7dmFyIHNpbXBsaWZ5PXJlcXVpcmUoXCIuL3NpbXBsaWZ5XCIpO1xufSx7XCIuL3NpbXBsaWZ5XCI6MTEyfV0sMTExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGdlb2pzb252dChlLHQpe3JldHVybiBuZXcgR2VvSlNPTlZUKGUsdCl9ZnVuY3Rpb24gR2VvSlNPTlZUKGUsdCl7dD10aGlzLm9wdGlvbnM9ZXh0ZW5kKE9iamVjdC5jcmVhdGUodGhpcy5vcHRpb25zKSx0KTt2YXIgaT10LmRlYnVnO2kmJmNvbnNvbGUudGltZShcInByZXByb2Nlc3MgZGF0YVwiKTt2YXIgbz0xPDx0Lm1heFpvb20sbj1jb252ZXJ0KGUsdC50b2xlcmFuY2UvKG8qdC5leHRlbnQpKTt0aGlzLnRpbGVzPXt9LHRoaXMudGlsZUNvb3Jkcz1bXSxpJiYoY29uc29sZS50aW1lRW5kKFwicHJlcHJvY2VzcyBkYXRhXCIpLGNvbnNvbGUubG9nKFwiaW5kZXg6IG1heFpvb206ICVkLCBtYXhQb2ludHM6ICVkXCIsdC5pbmRleE1heFpvb20sdC5pbmRleE1heFBvaW50cyksY29uc29sZS50aW1lKFwiZ2VuZXJhdGUgdGlsZXNcIiksdGhpcy5zdGF0cz17fSx0aGlzLnRvdGFsPTApLG49d3JhcChuLHQuYnVmZmVyL3QuZXh0ZW50LGludGVyc2VjdFgpLG4ubGVuZ3RoJiZ0aGlzLnNwbGl0VGlsZShuLDAsMCwwKSxpJiYobi5sZW5ndGgmJmNvbnNvbGUubG9nKFwiZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkXCIsdGhpcy50aWxlc1swXS5udW1GZWF0dXJlcyx0aGlzLnRpbGVzWzBdLm51bVBvaW50cyksY29uc29sZS50aW1lRW5kKFwiZ2VuZXJhdGUgdGlsZXNcIiksY29uc29sZS5sb2coXCJ0aWxlcyBnZW5lcmF0ZWQ6XCIsdGhpcy50b3RhbCxKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRzKSkpfWZ1bmN0aW9uIHRvSUQoZSx0LGkpe3JldHVybiAzMiooKDE8PGUpKmkrdCkrZX1mdW5jdGlvbiBpbnRlcnNlY3RYKGUsdCxpKXtyZXR1cm5baSwoaS1lWzBdKSoodFsxXS1lWzFdKS8odFswXS1lWzBdKStlWzFdLDFdfWZ1bmN0aW9uIGludGVyc2VjdFkoZSx0LGkpe3JldHVyblsoaS1lWzFdKSoodFswXS1lWzBdKS8odFsxXS1lWzFdKStlWzBdLGksMV19ZnVuY3Rpb24gZXh0ZW5kKGUsdCl7Zm9yKHZhciBpIGluIHQpZVtpXT10W2ldO3JldHVybiBlfWZ1bmN0aW9uIGlzQ2xpcHBlZFNxdWFyZShlLHQsaSl7dmFyIG89ZS5zb3VyY2U7aWYoMSE9PW8ubGVuZ3RoKXJldHVybiExO3ZhciBuPW9bMF07aWYoMyE9PW4udHlwZXx8bi5nZW9tZXRyeS5sZW5ndGg+MSlyZXR1cm4hMTt2YXIgcj1uLmdlb21ldHJ5WzBdLmxlbmd0aDtpZig1IT09cilyZXR1cm4hMTtmb3IodmFyIHM9MDtyPnM7cysrKXt2YXIgbD10cmFuc2Zvcm0ucG9pbnQobi5nZW9tZXRyeVswXVtzXSx0LGUuejIsZS54LGUueSk7aWYobFswXSE9PS1pJiZsWzBdIT09dCtpfHxsWzFdIT09LWkmJmxbMV0hPT10K2kpcmV0dXJuITF9cmV0dXJuITB9bW9kdWxlLmV4cG9ydHM9Z2VvanNvbnZ0O3ZhciBjb252ZXJ0PXJlcXVpcmUoXCIuL2NvbnZlcnRcIiksdHJhbnNmb3JtPXJlcXVpcmUoXCIuL3RyYW5zZm9ybVwiKSxjbGlwPXJlcXVpcmUoXCIuL2NsaXBcIiksd3JhcD1yZXF1aXJlKFwiLi93cmFwXCIpLGNyZWF0ZVRpbGU9cmVxdWlyZShcIi4vdGlsZVwiKTtHZW9KU09OVlQucHJvdG90eXBlLm9wdGlvbnM9e21heFpvb206MTQsaW5kZXhNYXhab29tOjUsaW5kZXhNYXhQb2ludHM6MWU1LHNvbGlkQ2hpbGRyZW46ITEsdG9sZXJhbmNlOjMsZXh0ZW50OjQwOTYsYnVmZmVyOjY0LGRlYnVnOjB9LEdlb0pTT05WVC5wcm90b3R5cGUuc3BsaXRUaWxlPWZ1bmN0aW9uKGUsdCxpLG8sbixyLHMpe2Zvcih2YXIgbD1bZSx0LGksb10sYT10aGlzLm9wdGlvbnMsdT1hLmRlYnVnLGM9bnVsbDtsLmxlbmd0aDspe289bC5wb3AoKSxpPWwucG9wKCksdD1sLnBvcCgpLGU9bC5wb3AoKTt2YXIgcD0xPDx0LGQ9dG9JRCh0LGksbyksbT10aGlzLnRpbGVzW2RdLGY9dD09PWEubWF4Wm9vbT8wOmEudG9sZXJhbmNlLyhwKmEuZXh0ZW50KTtpZighbSYmKHU+MSYmY29uc29sZS50aW1lKFwiY3JlYXRpb25cIiksbT10aGlzLnRpbGVzW2RdPWNyZWF0ZVRpbGUoZSxwLGksbyxmLHQ9PT1hLm1heFpvb20pLHRoaXMudGlsZUNvb3Jkcy5wdXNoKHt6OnQseDppLHk6b30pLHUpKXt1PjEmJihjb25zb2xlLmxvZyhcInRpbGUgeiVkLSVkLSVkIChmZWF0dXJlczogJWQsIHBvaW50czogJWQsIHNpbXBsaWZpZWQ6ICVkKVwiLHQsaSxvLG0ubnVtRmVhdHVyZXMsbS5udW1Qb2ludHMsbS5udW1TaW1wbGlmaWVkKSxjb25zb2xlLnRpbWVFbmQoXCJjcmVhdGlvblwiKSk7dmFyIGg9XCJ6XCIrdDt0aGlzLnN0YXRzW2hdPSh0aGlzLnN0YXRzW2hdfHwwKSsxLHRoaXMudG90YWwrK31pZihtLnNvdXJjZT1lLG4pe2lmKHQ9PT1hLm1heFpvb218fHQ9PT1uKWNvbnRpbnVlO3ZhciB4PTE8PG4tdDtpZihpIT09TWF0aC5mbG9vcihyL3gpfHxvIT09TWF0aC5mbG9vcihzL3gpKWNvbnRpbnVlfWVsc2UgaWYodD09PWEuaW5kZXhNYXhab29tfHxtLm51bVBvaW50czw9YS5pbmRleE1heFBvaW50cyljb250aW51ZTtpZihhLnNvbGlkQ2hpbGRyZW58fCFpc0NsaXBwZWRTcXVhcmUobSxhLmV4dGVudCxhLmJ1ZmZlcikpe20uc291cmNlPW51bGwsdT4xJiZjb25zb2xlLnRpbWUoXCJjbGlwcGluZ1wiKTt2YXIgZyx2LE0sVCxiLHksUz0uNSphLmJ1ZmZlci9hLmV4dGVudCxaPS41LVMscT0uNStTLHc9MStTO2c9dj1NPVQ9bnVsbCxiPWNsaXAoZSxwLGktUyxpK3EsMCxpbnRlcnNlY3RYLG0ubWluWzBdLG0ubWF4WzBdKSx5PWNsaXAoZSxwLGkrWixpK3csMCxpbnRlcnNlY3RYLG0ubWluWzBdLG0ubWF4WzBdKSxiJiYoZz1jbGlwKGIscCxvLVMsbytxLDEsaW50ZXJzZWN0WSxtLm1pblsxXSxtLm1heFsxXSksdj1jbGlwKGIscCxvK1osbyt3LDEsaW50ZXJzZWN0WSxtLm1pblsxXSxtLm1heFsxXSkpLHkmJihNPWNsaXAoeSxwLG8tUyxvK3EsMSxpbnRlcnNlY3RZLG0ubWluWzFdLG0ubWF4WzFdKSxUPWNsaXAoeSxwLG8rWixvK3csMSxpbnRlcnNlY3RZLG0ubWluWzFdLG0ubWF4WzFdKSksdT4xJiZjb25zb2xlLnRpbWVFbmQoXCJjbGlwcGluZ1wiKSxnJiZsLnB1c2goZyx0KzEsMippLDIqbyksdiYmbC5wdXNoKHYsdCsxLDIqaSwyKm8rMSksTSYmbC5wdXNoKE0sdCsxLDIqaSsxLDIqbyksVCYmbC5wdXNoKFQsdCsxLDIqaSsxLDIqbysxKX1lbHNlIG4mJihjPXQpfXJldHVybiBjfSxHZW9KU09OVlQucHJvdG90eXBlLmdldFRpbGU9ZnVuY3Rpb24oZSx0LGkpe3ZhciBvPXRoaXMub3B0aW9ucyxuPW8uZXh0ZW50LHI9by5kZWJ1ZyxzPTE8PGU7dD0odCVzK3MpJXM7dmFyIGw9dG9JRChlLHQsaSk7aWYodGhpcy50aWxlc1tsXSlyZXR1cm4gdHJhbnNmb3JtLnRpbGUodGhpcy50aWxlc1tsXSxuKTtyPjEmJmNvbnNvbGUubG9nKFwiZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWRcIixlLHQsaSk7Zm9yKHZhciBhLHU9ZSxjPXQscD1pOyFhJiZ1PjA7KXUtLSxjPU1hdGguZmxvb3IoYy8yKSxwPU1hdGguZmxvb3IocC8yKSxhPXRoaXMudGlsZXNbdG9JRCh1LGMscCldO2lmKCFhfHwhYS5zb3VyY2UpcmV0dXJuIG51bGw7aWYocj4xJiZjb25zb2xlLmxvZyhcImZvdW5kIHBhcmVudCB0aWxlIHolZC0lZC0lZFwiLHUsYyxwKSxpc0NsaXBwZWRTcXVhcmUoYSxuLG8uYnVmZmVyKSlyZXR1cm4gdHJhbnNmb3JtLnRpbGUoYSxuKTtyPjEmJmNvbnNvbGUudGltZShcImRyaWxsaW5nIGRvd25cIik7dmFyIGQ9dGhpcy5zcGxpdFRpbGUoYS5zb3VyY2UsdSxjLHAsZSx0LGkpO2lmKHI+MSYmY29uc29sZS50aW1lRW5kKFwiZHJpbGxpbmcgZG93blwiKSxudWxsIT09ZCl7dmFyIG09MTw8ZS1kO2w9dG9JRChkLE1hdGguZmxvb3IodC9tKSxNYXRoLmZsb29yKGkvbSkpfXJldHVybiB0aGlzLnRpbGVzW2xdP3RyYW5zZm9ybS50aWxlKHRoaXMudGlsZXNbbF0sbik6bnVsbH07XG59LHtcIi4vY2xpcFwiOjEwOSxcIi4vY29udmVydFwiOjExMCxcIi4vdGlsZVwiOjExMyxcIi4vdHJhbnNmb3JtXCI6MTE0LFwiLi93cmFwXCI6MTE1fV0sMTEyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHNpbXBsaWZ5KHQsaSl7dmFyIGUscCxyLHMsbz1pKmksZj10Lmxlbmd0aCx1PTAsbj1mLTEsZz1bXTtmb3IodFt1XVsyXT0xLHRbbl1bMl09MTtuOyl7Zm9yKHA9MCxlPXUrMTtuPmU7ZSsrKXI9Z2V0U3FTZWdEaXN0KHRbZV0sdFt1XSx0W25dKSxyPnAmJihzPWUscD1yKTtwPm8/KHRbc11bMl09cCxnLnB1c2godSksZy5wdXNoKHMpLHU9cyk6KG49Zy5wb3AoKSx1PWcucG9wKCkpfX1mdW5jdGlvbiBnZXRTcVNlZ0Rpc3QodCxpLGUpe3ZhciBwPWlbMF0scj1pWzFdLHM9ZVswXSxvPWVbMV0sZj10WzBdLHU9dFsxXSxuPXMtcCxnPW8tcjtpZigwIT09bnx8MCE9PWcpe3ZhciBsPSgoZi1wKSpuKyh1LXIpKmcpLyhuKm4rZypnKTtsPjE/KHA9cyxyPW8pOmw+MCYmKHArPW4qbCxyKz1nKmwpfXJldHVybiBuPWYtcCxnPXUtcixuKm4rZypnfW1vZHVsZS5leHBvcnRzPXNpbXBsaWZ5O1xufSx7fV0sMTEzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNyZWF0ZVRpbGUoZSxuLHQsbSxpLHUpe2Zvcih2YXIgcj17ZmVhdHVyZXM6W10sbnVtUG9pbnRzOjAsbnVtU2ltcGxpZmllZDowLG51bUZlYXR1cmVzOjAsc291cmNlOm51bGwseDp0LHk6bSx6MjpuLHRyYW5zZm9ybWVkOiExLG1pbjpbMiwxXSxtYXg6Wy0xLDBdfSxhPTA7YTxlLmxlbmd0aDthKyspe3IubnVtRmVhdHVyZXMrKyxhZGRGZWF0dXJlKHIsZVthXSxpLHUpO3ZhciBzPWVbYV0ubWluLGw9ZVthXS5tYXg7c1swXTxyLm1pblswXSYmKHIubWluWzBdPXNbMF0pLHNbMV08ci5taW5bMV0mJihyLm1pblsxXT1zWzFdKSxsWzBdPnIubWF4WzBdJiYoci5tYXhbMF09bFswXSksbFsxXT5yLm1heFsxXSYmKHIubWF4WzFdPWxbMV0pfXJldHVybiByfWZ1bmN0aW9uIGFkZEZlYXR1cmUoZSxuLHQsbSl7dmFyIGksdSxyLGEscz1uLmdlb21ldHJ5LGw9bi50eXBlLG89W10sZj10KnQ7aWYoMT09PWwpZm9yKGk9MDtpPHMubGVuZ3RoO2krKylvLnB1c2goc1tpXSksZS5udW1Qb2ludHMrKyxlLm51bVNpbXBsaWZpZWQrKztlbHNlIGZvcihpPTA7aTxzLmxlbmd0aDtpKyspaWYocj1zW2ldLG18fCEoMj09PWwmJnIuZGlzdDx0fHwzPT09bCYmci5hcmVhPGYpKXt2YXIgZD1bXTtmb3IodT0wO3U8ci5sZW5ndGg7dSsrKWE9clt1XSwobXx8YVsyXT5mKSYmKGQucHVzaChhKSxlLm51bVNpbXBsaWZpZWQrKyksZS5udW1Qb2ludHMrKztvLnB1c2goZCl9ZWxzZSBlLm51bVBvaW50cys9ci5sZW5ndGg7by5sZW5ndGgmJmUuZmVhdHVyZXMucHVzaCh7Z2VvbWV0cnk6byx0eXBlOmwsdGFnczpuLnRhZ3N8fG51bGx9KX1tb2R1bGUuZXhwb3J0cz1jcmVhdGVUaWxlO1xufSx7fV0sMTE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHRyYW5zZm9ybVRpbGUocix0KXtpZihyLnRyYW5zZm9ybWVkKXJldHVybiByO3ZhciBuLGUsbyxmPXIuejIsYT1yLngscz1yLnk7Zm9yKG49MDtuPHIuZmVhdHVyZXMubGVuZ3RoO24rKyl7dmFyIGk9ci5mZWF0dXJlc1tuXSx1PWkuZ2VvbWV0cnksbT1pLnR5cGU7aWYoMT09PW0pZm9yKGU9MDtlPHUubGVuZ3RoO2UrKyl1W2VdPXRyYW5zZm9ybVBvaW50KHVbZV0sdCxmLGEscyk7ZWxzZSBmb3IoZT0wO2U8dS5sZW5ndGg7ZSsrKXt2YXIgbD11W2VdO2ZvcihvPTA7bzxsLmxlbmd0aDtvKyspbFtvXT10cmFuc2Zvcm1Qb2ludChsW29dLHQsZixhLHMpfX1yZXR1cm4gci50cmFuc2Zvcm1lZD0hMCxyfWZ1bmN0aW9uIHRyYW5zZm9ybVBvaW50KHIsdCxuLGUsbyl7dmFyIGY9TWF0aC5yb3VuZCh0KihyWzBdKm4tZSkpLGE9TWF0aC5yb3VuZCh0KihyWzFdKm4tbykpO3JldHVybltmLGFdfWV4cG9ydHMudGlsZT10cmFuc2Zvcm1UaWxlLGV4cG9ydHMucG9pbnQ9dHJhbnNmb3JtUG9pbnQ7XG59LHt9XSwxMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gd3JhcChyLHQsZSl7dmFyIG89cixhPWNsaXAociwxLC0xLXQsdCwwLGUsLTEsMikscz1jbGlwKHIsMSwxLXQsMit0LDAsZSwtMSwyKTtyZXR1cm4oYXx8cykmJihvPWNsaXAociwxLC10LDErdCwwLGUsLTEsMiksYSYmKG89c2hpZnRGZWF0dXJlQ29vcmRzKGEsMSkuY29uY2F0KG8pKSxzJiYobz1vLmNvbmNhdChzaGlmdEZlYXR1cmVDb29yZHMocywtMSkpKSksb31mdW5jdGlvbiBzaGlmdEZlYXR1cmVDb29yZHMocix0KXtmb3IodmFyIGU9W10sbz0wO288ci5sZW5ndGg7bysrKXt2YXIgYSxzPXJbb10saT1zLnR5cGU7aWYoMT09PWkpYT1zaGlmdENvb3JkcyhzLmdlb21ldHJ5LHQpO2Vsc2V7YT1bXTtmb3IodmFyIG49MDtuPHMuZ2VvbWV0cnkubGVuZ3RoO24rKylhLnB1c2goc2hpZnRDb29yZHMocy5nZW9tZXRyeVtuXSx0KSl9ZS5wdXNoKHtnZW9tZXRyeTphLHR5cGU6aSx0YWdzOnMudGFncyxtaW46W3MubWluWzBdK3Qscy5taW5bMV1dLG1heDpbcy5tYXhbMF0rdCxzLm1heFsxXV19KX1yZXR1cm4gZX1mdW5jdGlvbiBzaGlmdENvb3JkcyhyLHQpe3ZhciBlPVtdO2UuYXJlYT1yLmFyZWEsZS5kaXN0PXIuZGlzdDtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKyllLnB1c2goW3Jbb11bMF0rdCxyW29dWzFdLHJbb11bMl1dKTtyZXR1cm4gZX12YXIgY2xpcD1yZXF1aXJlKFwiLi9jbGlwXCIpO21vZHVsZS5leHBvcnRzPXdyYXA7XG59LHtcIi4vY2xpcFwiOjEwOX1dLDExNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5leHBvcnRzLmdsTWF0cml4PXJlcXVpcmUoXCIuL2dsLW1hdHJpeC9jb21tb24uanNcIiksZXhwb3J0cy5tYXQyPXJlcXVpcmUoXCIuL2dsLW1hdHJpeC9tYXQyLmpzXCIpLGV4cG9ydHMubWF0MmQ9cmVxdWlyZShcIi4vZ2wtbWF0cml4L21hdDJkLmpzXCIpLGV4cG9ydHMubWF0Mz1yZXF1aXJlKFwiLi9nbC1tYXRyaXgvbWF0My5qc1wiKSxleHBvcnRzLm1hdDQ9cmVxdWlyZShcIi4vZ2wtbWF0cml4L21hdDQuanNcIiksZXhwb3J0cy5xdWF0PXJlcXVpcmUoXCIuL2dsLW1hdHJpeC9xdWF0LmpzXCIpLGV4cG9ydHMudmVjMj1yZXF1aXJlKFwiLi9nbC1tYXRyaXgvdmVjMi5qc1wiKSxleHBvcnRzLnZlYzM9cmVxdWlyZShcIi4vZ2wtbWF0cml4L3ZlYzMuanNcIiksZXhwb3J0cy52ZWM0PXJlcXVpcmUoXCIuL2dsLW1hdHJpeC92ZWM0LmpzXCIpO1xufSx7XCIuL2dsLW1hdHJpeC9jb21tb24uanNcIjoxMTcsXCIuL2dsLW1hdHJpeC9tYXQyLmpzXCI6MTE4LFwiLi9nbC1tYXRyaXgvbWF0MmQuanNcIjoxMTksXCIuL2dsLW1hdHJpeC9tYXQzLmpzXCI6MTIwLFwiLi9nbC1tYXRyaXgvbWF0NC5qc1wiOjEyMSxcIi4vZ2wtbWF0cml4L3F1YXQuanNcIjoxMjIsXCIuL2dsLW1hdHJpeC92ZWMyLmpzXCI6MTIzLFwiLi9nbC1tYXRyaXgvdmVjMy5qc1wiOjEyNCxcIi4vZ2wtbWF0cml4L3ZlYzQuanNcIjoxMjV9XSwxMTc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsTWF0cml4PXt9O2dsTWF0cml4LkVQU0lMT049MWUtNixnbE1hdHJpeC5BUlJBWV9UWVBFPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBGbG9hdDMyQXJyYXk/RmxvYXQzMkFycmF5OkFycmF5LGdsTWF0cml4LlJBTkRPTT1NYXRoLnJhbmRvbSxnbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGU9ZnVuY3Rpb24ocil7R0xNQVRfQVJSQVlfVFlQRT1yfTt2YXIgZGVncmVlPU1hdGguUEkvMTgwO2dsTWF0cml4LnRvUmFkaWFuPWZ1bmN0aW9uKHIpe3JldHVybiByKmRlZ3JlZX0sbW9kdWxlLmV4cG9ydHM9Z2xNYXRyaXg7XG59LHt9XSwxMTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsTWF0cml4PXJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKSxtYXQyPXt9O21hdDIuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MSx0fSxtYXQyLmNsb25lPWZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO3JldHVybiBuWzBdPXRbMF0sblsxXT10WzFdLG5bMl09dFsyXSxuWzNdPXRbM10sbn0sbWF0Mi5jb3B5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHRbM109blszXSx0fSxtYXQyLmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTEsdH0sbWF0Mi50cmFuc3Bvc2U9ZnVuY3Rpb24odCxuKXtpZih0PT09bil7dmFyIHI9blsxXTt0WzFdPW5bMl0sdFsyXT1yfWVsc2UgdFswXT1uWzBdLHRbMV09blsyXSx0WzJdPW5bMV0sdFszXT1uWzNdO3JldHVybiB0fSxtYXQyLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF0sYT1uWzFdLHU9blsyXSxvPW5bM10sZT1yKm8tdSphO3JldHVybiBlPyhlPTEvZSx0WzBdPW8qZSx0WzFdPS1hKmUsdFsyXT0tdSplLHRbM109ciplLHQpOm51bGx9LG1hdDIuYWRqb2ludD1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF07cmV0dXJuIHRbMF09blszXSx0WzFdPS1uWzFdLHRbMl09LW5bMl0sdFszXT1yLHR9LG1hdDIuZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF0qdFszXS10WzJdKnRbMV19LG1hdDIubXVsdGlwbHk9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sdT1uWzFdLG89blsyXSxlPW5bM10saT1yWzBdLG09clsxXSxjPXJbMl0sZj1yWzNdO3JldHVybiB0WzBdPWEqaStvKm0sdFsxXT11KmkrZSptLHRbMl09YSpjK28qZix0WzNdPXUqYytlKmYsdH0sbWF0Mi5tdWw9bWF0Mi5tdWx0aXBseSxtYXQyLnJvdGF0ZT1mdW5jdGlvbih0LG4scil7dmFyIGE9blswXSx1PW5bMV0sbz1uWzJdLGU9blszXSxpPU1hdGguc2luKHIpLG09TWF0aC5jb3Mocik7cmV0dXJuIHRbMF09YSptK28qaSx0WzFdPXUqbStlKmksdFsyXT1hKi1pK28qbSx0WzNdPXUqLWkrZSptLHR9LG1hdDIuc2NhbGU9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sdT1uWzFdLG89blsyXSxlPW5bM10saT1yWzBdLG09clsxXTtyZXR1cm4gdFswXT1hKmksdFsxXT11KmksdFsyXT1vKm0sdFszXT1lKm0sdH0sbWF0Mi5mcm9tUm90YXRpb249ZnVuY3Rpb24odCxuKXt2YXIgcj1NYXRoLnNpbihuKSxhPU1hdGguY29zKG4pO3JldHVybiB0WzBdPWEsdFsxXT1yLHRbMl09LXIsdFszXT1hLHR9LG1hdDIuZnJvbVNjYWxpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT1uWzBdLHRbMV09MCx0WzJdPTAsdFszXT1uWzFdLHR9LG1hdDIuc3RyPWZ1bmN0aW9uKHQpe3JldHVyblwibWF0MihcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiKVwifSxtYXQyLmZyb2I9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0WzBdLDIpK01hdGgucG93KHRbMV0sMikrTWF0aC5wb3codFsyXSwyKStNYXRoLnBvdyh0WzNdLDIpKX0sbWF0Mi5MRFU9ZnVuY3Rpb24odCxuLHIsYSl7cmV0dXJuIHRbMl09YVsyXS9hWzBdLHJbMF09YVswXSxyWzFdPWFbMV0sclszXT1hWzNdLXRbMl0qclsxXSxbdCxuLHJdfSxtb2R1bGUuZXhwb3J0cz1tYXQyO1xufSx7XCIuL2NvbW1vbi5qc1wiOjExN31dLDExOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG52YXIgZ2xNYXRyaXg9cmVxdWlyZShcIi4vY29tbW9uLmpzXCIpLG1hdDJkPXt9O21hdDJkLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDYpO3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTEsdFs0XT0wLHRbNV09MCx0fSxtYXQyZC5jbG9uZT1mdW5jdGlvbih0KXt2YXIgbj1uZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtyZXR1cm4gblswXT10WzBdLG5bMV09dFsxXSxuWzJdPXRbMl0sblszXT10WzNdLG5bNF09dFs0XSxuWzVdPXRbNV0sbn0sbWF0MmQuY29weT1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPW5bMF0sdFsxXT1uWzFdLHRbMl09blsyXSx0WzNdPW5bM10sdFs0XT1uWzRdLHRbNV09bls1XSx0fSxtYXQyZC5pZGVudGl0eT1mdW5jdGlvbih0KXtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0xLHRbNF09MCx0WzVdPTAsdH0sbWF0MmQuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIHI9blswXSxhPW5bMV0sbz1uWzJdLHU9blszXSxlPW5bNF0saT1uWzVdLG09cip1LWEqbztyZXR1cm4gbT8obT0xL20sdFswXT11Km0sdFsxXT0tYSptLHRbMl09LW8qbSx0WzNdPXIqbSx0WzRdPShvKmktdSplKSptLHRbNV09KGEqZS1yKmkpKm0sdCk6bnVsbH0sbWF0MmQuZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF0qdFszXS10WzFdKnRbMl19LG1hdDJkLm11bHRpcGx5PWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLG89blsxXSx1PW5bMl0sZT1uWzNdLGk9bls0XSxtPW5bNV0sYz1yWzBdLGQ9clsxXSxmPXJbMl0sbD1yWzNdLE09cls0XSxoPXJbNV07cmV0dXJuIHRbMF09YSpjK3UqZCx0WzFdPW8qYytlKmQsdFsyXT1hKmYrdSpsLHRbM109bypmK2UqbCx0WzRdPWEqTSt1KmgraSx0WzVdPW8qTStlKmgrbSx0fSxtYXQyZC5tdWw9bWF0MmQubXVsdGlwbHksbWF0MmQucm90YXRlPWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLG89blsxXSx1PW5bMl0sZT1uWzNdLGk9bls0XSxtPW5bNV0sYz1NYXRoLnNpbihyKSxkPU1hdGguY29zKHIpO3JldHVybiB0WzBdPWEqZCt1KmMsdFsxXT1vKmQrZSpjLHRbMl09YSotYyt1KmQsdFszXT1vKi1jK2UqZCx0WzRdPWksdFs1XT1tLHR9LG1hdDJkLnNjYWxlPWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLG89blsxXSx1PW5bMl0sZT1uWzNdLGk9bls0XSxtPW5bNV0sYz1yWzBdLGQ9clsxXTtyZXR1cm4gdFswXT1hKmMsdFsxXT1vKmMsdFsyXT11KmQsdFszXT1lKmQsdFs0XT1pLHRbNV09bSx0fSxtYXQyZC50cmFuc2xhdGU9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sbz1uWzFdLHU9blsyXSxlPW5bM10saT1uWzRdLG09bls1XSxjPXJbMF0sZD1yWzFdO3JldHVybiB0WzBdPWEsdFsxXT1vLHRbMl09dSx0WzNdPWUsdFs0XT1hKmMrdSpkK2ksdFs1XT1vKmMrZSpkK20sdH0sbWF0MmQuZnJvbVJvdGF0aW9uPWZ1bmN0aW9uKHQsbil7dmFyIHI9TWF0aC5zaW4obiksYT1NYXRoLmNvcyhuKTtyZXR1cm4gdFswXT1hLHRbMV09cix0WzJdPS1yLHRbM109YSx0WzRdPTAsdFs1XT0wLHR9LG1hdDJkLmZyb21TY2FsaW5nPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPTAsdFsyXT0wLHRbM109blsxXSx0WzRdPTAsdFs1XT0wLHR9LG1hdDJkLmZyb21UcmFuc2xhdGlvbj1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTEsdFs0XT1uWzBdLHRbNV09blsxXSx0fSxtYXQyZC5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuXCJtYXQyZChcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiLCBcIit0WzRdK1wiLCBcIit0WzVdK1wiKVwifSxtYXQyZC5mcm9iPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codFswXSwyKStNYXRoLnBvdyh0WzFdLDIpK01hdGgucG93KHRbMl0sMikrTWF0aC5wb3codFszXSwyKStNYXRoLnBvdyh0WzRdLDIpK01hdGgucG93KHRbNV0sMikrMSl9LG1vZHVsZS5leHBvcnRzPW1hdDJkO1xufSx7XCIuL2NvbW1vbi5qc1wiOjExN31dLDEyMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG52YXIgZ2xNYXRyaXg9cmVxdWlyZShcIi4vY29tbW9uLmpzXCIpLG1hdDM9e307bWF0My5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MSx0WzVdPTAsdFs2XT0wLHRbN109MCx0WzhdPTEsdH0sbWF0My5mcm9tTWF0ND1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPW5bMF0sdFsxXT1uWzFdLHRbMl09blsyXSx0WzNdPW5bNF0sdFs0XT1uWzVdLHRbNV09bls2XSx0WzZdPW5bOF0sdFs3XT1uWzldLHRbOF09blsxMF0sdH0sbWF0My5jbG9uZT1mdW5jdGlvbih0KXt2YXIgbj1uZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtyZXR1cm4gblswXT10WzBdLG5bMV09dFsxXSxuWzJdPXRbMl0sblszXT10WzNdLG5bNF09dFs0XSxuWzVdPXRbNV0sbls2XT10WzZdLG5bN109dFs3XSxuWzhdPXRbOF0sbn0sbWF0My5jb3B5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHRbM109blszXSx0WzRdPW5bNF0sdFs1XT1uWzVdLHRbNl09bls2XSx0WzddPW5bN10sdFs4XT1uWzhdLHR9LG1hdDMuaWRlbnRpdHk9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTEsdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT0xLHR9LG1hdDMudHJhbnNwb3NlPWZ1bmN0aW9uKHQsbil7aWYodD09PW4pe3ZhciByPW5bMV0sYT1uWzJdLG89bls1XTt0WzFdPW5bM10sdFsyXT1uWzZdLHRbM109cix0WzVdPW5bN10sdFs2XT1hLHRbN109b31lbHNlIHRbMF09blswXSx0WzFdPW5bM10sdFsyXT1uWzZdLHRbM109blsxXSx0WzRdPW5bNF0sdFs1XT1uWzddLHRbNl09blsyXSx0WzddPW5bNV0sdFs4XT1uWzhdO3JldHVybiB0fSxtYXQzLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF0sYT1uWzFdLG89blsyXSx1PW5bM10sbT1uWzRdLGU9bls1XSxpPW5bNl0sYz1uWzddLGY9bls4XSxsPWYqbS1lKmMsTT0tZip1K2UqaSx2PWMqdS1tKmksaD1yKmwrYSpNK28qdjtyZXR1cm4gaD8oaD0xL2gsdFswXT1sKmgsdFsxXT0oLWYqYStvKmMpKmgsdFsyXT0oZSphLW8qbSkqaCx0WzNdPU0qaCx0WzRdPShmKnItbyppKSpoLHRbNV09KC1lKnIrbyp1KSpoLHRbNl09dipoLHRbN109KC1jKnIrYSppKSpoLHRbOF09KG0qci1hKnUpKmgsdCk6bnVsbH0sbWF0My5hZGpvaW50PWZ1bmN0aW9uKHQsbil7dmFyIHI9blswXSxhPW5bMV0sbz1uWzJdLHU9blszXSxtPW5bNF0sZT1uWzVdLGk9bls2XSxjPW5bN10sZj1uWzhdO3JldHVybiB0WzBdPW0qZi1lKmMsdFsxXT1vKmMtYSpmLHRbMl09YSplLW8qbSx0WzNdPWUqaS11KmYsdFs0XT1yKmYtbyppLHRbNV09byp1LXIqZSx0WzZdPXUqYy1tKmksdFs3XT1hKmktcipjLHRbOF09ciptLWEqdSx0fSxtYXQzLmRldGVybWluYW50PWZ1bmN0aW9uKHQpe3ZhciBuPXRbMF0scj10WzFdLGE9dFsyXSxvPXRbM10sdT10WzRdLG09dFs1XSxlPXRbNl0saT10WzddLGM9dFs4XTtyZXR1cm4gbiooYyp1LW0qaSkrciooLWMqbyttKmUpK2EqKGkqby11KmUpfSxtYXQzLm11bHRpcGx5PWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLG89blsxXSx1PW5bMl0sbT1uWzNdLGU9bls0XSxpPW5bNV0sYz1uWzZdLGY9bls3XSxsPW5bOF0sTT1yWzBdLHY9clsxXSxoPXJbMl0scD1yWzNdLHM9cls0XSx3PXJbNV0sZD1yWzZdLFI9cls3XSxnPXJbOF07cmV0dXJuIHRbMF09TSphK3YqbStoKmMsdFsxXT1NKm8rdiplK2gqZix0WzJdPU0qdSt2KmkraCpsLHRbM109cCphK3MqbSt3KmMsdFs0XT1wKm8rcyplK3cqZix0WzVdPXAqdStzKmkrdypsLHRbNl09ZCphK1IqbStnKmMsdFs3XT1kKm8rUiplK2cqZix0WzhdPWQqdStSKmkrZypsLHR9LG1hdDMubXVsPW1hdDMubXVsdGlwbHksbWF0My50cmFuc2xhdGU9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sbz1uWzFdLHU9blsyXSxtPW5bM10sZT1uWzRdLGk9bls1XSxjPW5bNl0sZj1uWzddLGw9bls4XSxNPXJbMF0sdj1yWzFdO3JldHVybiB0WzBdPWEsdFsxXT1vLHRbMl09dSx0WzNdPW0sdFs0XT1lLHRbNV09aSx0WzZdPU0qYSt2Km0rYyx0WzddPU0qbyt2KmUrZix0WzhdPU0qdSt2KmkrbCx0fSxtYXQzLnJvdGF0ZT1mdW5jdGlvbih0LG4scil7dmFyIGE9blswXSxvPW5bMV0sdT1uWzJdLG09blszXSxlPW5bNF0saT1uWzVdLGM9bls2XSxmPW5bN10sbD1uWzhdLE09TWF0aC5zaW4ociksdj1NYXRoLmNvcyhyKTtyZXR1cm4gdFswXT12KmErTSptLHRbMV09dipvK00qZSx0WzJdPXYqdStNKmksdFszXT12Km0tTSphLHRbNF09diplLU0qbyx0WzVdPXYqaS1NKnUsdFs2XT1jLHRbN109Zix0WzhdPWwsdH0sbWF0My5zY2FsZT1mdW5jdGlvbih0LG4scil7dmFyIGE9clswXSxvPXJbMV07cmV0dXJuIHRbMF09YSpuWzBdLHRbMV09YSpuWzFdLHRbMl09YSpuWzJdLHRbM109bypuWzNdLHRbNF09bypuWzRdLHRbNV09bypuWzVdLHRbNl09bls2XSx0WzddPW5bN10sdFs4XT1uWzhdLHR9LG1hdDMuZnJvbVRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTEsdFs1XT0wLHRbNl09blswXSx0WzddPW5bMV0sdFs4XT0xLHR9LG1hdDMuZnJvbVJvdGF0aW9uPWZ1bmN0aW9uKHQsbil7dmFyIHI9TWF0aC5zaW4obiksYT1NYXRoLmNvcyhuKTtyZXR1cm4gdFswXT1hLHRbMV09cix0WzJdPTAsdFszXT0tcix0WzRdPWEsdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT0xLHR9LG1hdDMuZnJvbVNjYWxpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT1uWzBdLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09blsxXSx0WzVdPTAsdFs2XT0wLHRbN109MCx0WzhdPTEsdH0sbWF0My5mcm9tTWF0MmQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT1uWzBdLHRbMV09blsxXSx0WzJdPTAsdFszXT1uWzJdLHRbNF09blszXSx0WzVdPTAsdFs2XT1uWzRdLHRbN109bls1XSx0WzhdPTEsdH0sbWF0My5mcm9tUXVhdD1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF0sYT1uWzFdLG89blsyXSx1PW5bM10sbT1yK3IsZT1hK2EsaT1vK28sYz1yKm0sZj1hKm0sbD1hKmUsTT1vKm0sdj1vKmUsaD1vKmkscD11Km0scz11KmUsdz11Kmk7cmV0dXJuIHRbMF09MS1sLWgsdFszXT1mLXcsdFs2XT1NK3MsdFsxXT1mK3csdFs0XT0xLWMtaCx0WzddPXYtcCx0WzJdPU0tcyx0WzVdPXYrcCx0WzhdPTEtYy1sLHR9LG1hdDMubm9ybWFsRnJvbU1hdDQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1uWzBdLGE9blsxXSxvPW5bMl0sdT1uWzNdLG09bls0XSxlPW5bNV0saT1uWzZdLGM9bls3XSxmPW5bOF0sbD1uWzldLE09blsxMF0sdj1uWzExXSxoPW5bMTJdLHA9blsxM10scz1uWzE0XSx3PW5bMTVdLGQ9ciplLWEqbSxSPXIqaS1vKm0sZz1yKmMtdSptLHg9YSppLW8qZSx5PWEqYy11KmUsQT1vKmMtdSppLFk9ZipwLWwqaCxUPWYqcy1NKmgsaj1mKnctdipoLHE9bCpzLU0qcCxFPWwqdy12KnAsUD1NKnctdipzLF89ZCpQLVIqRStnKnEreCpqLXkqVCtBKlk7cmV0dXJuIF8/KF89MS9fLHRbMF09KGUqUC1pKkUrYypxKSpfLHRbMV09KGkqai1tKlAtYypUKSpfLHRbMl09KG0qRS1lKmorYypZKSpfLHRbM109KG8qRS1hKlAtdSpxKSpfLHRbNF09KHIqUC1vKmordSpUKSpfLHRbNV09KGEqai1yKkUtdSpZKSpfLHRbNl09KHAqQS1zKnkrdyp4KSpfLHRbN109KHMqZy1oKkEtdypSKSpfLHRbOF09KGgqeS1wKmcrdypkKSpfLHQpOm51bGx9LG1hdDMuc3RyPWZ1bmN0aW9uKHQpe3JldHVyblwibWF0MyhcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiLCBcIit0WzRdK1wiLCBcIit0WzVdK1wiLCBcIit0WzZdK1wiLCBcIit0WzddK1wiLCBcIit0WzhdK1wiKVwifSxtYXQzLmZyb2I9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0WzBdLDIpK01hdGgucG93KHRbMV0sMikrTWF0aC5wb3codFsyXSwyKStNYXRoLnBvdyh0WzNdLDIpK01hdGgucG93KHRbNF0sMikrTWF0aC5wb3codFs1XSwyKStNYXRoLnBvdyh0WzZdLDIpK01hdGgucG93KHRbN10sMikrTWF0aC5wb3codFs4XSwyKSl9LG1vZHVsZS5leHBvcnRzPW1hdDM7XG59LHtcIi4vY29tbW9uLmpzXCI6MTE3fV0sMTIxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbnZhciBnbE1hdHJpeD1yZXF1aXJlKFwiLi9jb21tb24uanNcIiksbWF0ND17fTttYXQ0LmNyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPTEsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTEsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LG1hdDQuY2xvbmU9ZnVuY3Rpb24odCl7dmFyIGE9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO3JldHVybiBhWzBdPXRbMF0sYVsxXT10WzFdLGFbMl09dFsyXSxhWzNdPXRbM10sYVs0XT10WzRdLGFbNV09dFs1XSxhWzZdPXRbNl0sYVs3XT10WzddLGFbOF09dFs4XSxhWzldPXRbOV0sYVsxMF09dFsxMF0sYVsxMV09dFsxMV0sYVsxMl09dFsxMl0sYVsxM109dFsxM10sYVsxNF09dFsxNF0sYVsxNV09dFsxNV0sYX0sbWF0NC5jb3B5PWZ1bmN0aW9uKHQsYSl7cmV0dXJuIHRbMF09YVswXSx0WzFdPWFbMV0sdFsyXT1hWzJdLHRbM109YVszXSx0WzRdPWFbNF0sdFs1XT1hWzVdLHRbNl09YVs2XSx0WzddPWFbN10sdFs4XT1hWzhdLHRbOV09YVs5XSx0WzEwXT1hWzEwXSx0WzExXT1hWzExXSx0WzEyXT1hWzEyXSx0WzEzXT1hWzEzXSx0WzE0XT1hWzE0XSx0WzE1XT1hWzE1XSx0fSxtYXQ0LmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09MSx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMF09MSx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0sbWF0NC50cmFuc3Bvc2U9ZnVuY3Rpb24odCxhKXtpZih0PT09YSl7dmFyIHI9YVsxXSxuPWFbMl0sbz1hWzNdLGU9YVs2XSxpPWFbN10sdT1hWzExXTt0WzFdPWFbNF0sdFsyXT1hWzhdLHRbM109YVsxMl0sdFs0XT1yLHRbNl09YVs5XSx0WzddPWFbMTNdLHRbOF09bix0WzldPWUsdFsxMV09YVsxNF0sdFsxMl09byx0WzEzXT1pLHRbMTRdPXV9ZWxzZSB0WzBdPWFbMF0sdFsxXT1hWzRdLHRbMl09YVs4XSx0WzNdPWFbMTJdLHRbNF09YVsxXSx0WzVdPWFbNV0sdFs2XT1hWzldLHRbN109YVsxM10sdFs4XT1hWzJdLHRbOV09YVs2XSx0WzEwXT1hWzEwXSx0WzExXT1hWzE0XSx0WzEyXT1hWzNdLHRbMTNdPWFbN10sdFsxNF09YVsxMV0sdFsxNV09YVsxNV07cmV0dXJuIHR9LG1hdDQuaW52ZXJ0PWZ1bmN0aW9uKHQsYSl7dmFyIHI9YVswXSxuPWFbMV0sbz1hWzJdLGU9YVszXSxpPWFbNF0sdT1hWzVdLE09YVs2XSxtPWFbN10saD1hWzhdLGM9YVs5XSxmPWFbMTBdLHM9YVsxMV0sbD1hWzEyXSx2PWFbMTNdLHA9YVsxNF0sdz1hWzE1XSxnPXIqdS1uKmksUD1yKk0tbyppLFI9ciptLWUqaSx4PW4qTS1vKnUsST1uKm0tZSp1LFM9byptLWUqTSxkPWgqdi1jKmwscT1oKnAtZipsLEU9aCp3LXMqbCxPPWMqcC1mKnYsYj1jKnctcyp2LFQ9Zip3LXMqcCxZPWcqVC1QKmIrUipPK3gqRS1JKnErUypkO3JldHVybiBZPyhZPTEvWSx0WzBdPSh1KlQtTSpiK20qTykqWSx0WzFdPShvKmItbipULWUqTykqWSx0WzJdPSh2KlMtcCpJK3cqeCkqWSx0WzNdPShmKkktYypTLXMqeCkqWSx0WzRdPShNKkUtaSpULW0qcSkqWSx0WzVdPShyKlQtbypFK2UqcSkqWSx0WzZdPShwKlItbCpTLXcqUCkqWSx0WzddPShoKlMtZipSK3MqUCkqWSx0WzhdPShpKmItdSpFK20qZCkqWSx0WzldPShuKkUtcipiLWUqZCkqWSx0WzEwXT0obCpJLXYqUit3KmcpKlksdFsxMV09KGMqUi1oKkktcypnKSpZLHRbMTJdPSh1KnEtaSpPLU0qZCkqWSx0WzEzXT0ocipPLW4qcStvKmQpKlksdFsxNF09KHYqUC1sKngtcCpnKSpZLHRbMTVdPShoKngtYypQK2YqZykqWSx0KTpudWxsfSxtYXQ0LmFkam9pbnQ9ZnVuY3Rpb24odCxhKXt2YXIgcj1hWzBdLG49YVsxXSxvPWFbMl0sZT1hWzNdLGk9YVs0XSx1PWFbNV0sTT1hWzZdLG09YVs3XSxoPWFbOF0sYz1hWzldLGY9YVsxMF0scz1hWzExXSxsPWFbMTJdLHY9YVsxM10scD1hWzE0XSx3PWFbMTVdO3JldHVybiB0WzBdPXUqKGYqdy1zKnApLWMqKE0qdy1tKnApK3YqKE0qcy1tKmYpLHRbMV09LShuKihmKnctcypwKS1jKihvKnctZSpwKSt2KihvKnMtZSpmKSksdFsyXT1uKihNKnctbSpwKS11KihvKnctZSpwKSt2KihvKm0tZSpNKSx0WzNdPS0obiooTSpzLW0qZiktdSoobypzLWUqZikrYyoobyptLWUqTSkpLHRbNF09LShpKihmKnctcypwKS1oKihNKnctbSpwKStsKihNKnMtbSpmKSksdFs1XT1yKihmKnctcypwKS1oKihvKnctZSpwKStsKihvKnMtZSpmKSx0WzZdPS0ociooTSp3LW0qcCktaSoobyp3LWUqcCkrbCoobyptLWUqTSkpLHRbN109ciooTSpzLW0qZiktaSoobypzLWUqZikraCoobyptLWUqTSksdFs4XT1pKihjKnctcyp2KS1oKih1KnctbSp2KStsKih1KnMtbSpjKSx0WzldPS0ociooYyp3LXMqdiktaCoobip3LWUqdikrbCoobipzLWUqYykpLHRbMTBdPXIqKHUqdy1tKnYpLWkqKG4qdy1lKnYpK2wqKG4qbS1lKnUpLHRbMTFdPS0ocioodSpzLW0qYyktaSoobipzLWUqYykraCoobiptLWUqdSkpLHRbMTJdPS0oaSooYypwLWYqdiktaCoodSpwLU0qdikrbCoodSpmLU0qYykpLHRbMTNdPXIqKGMqcC1mKnYpLWgqKG4qcC1vKnYpK2wqKG4qZi1vKmMpLHRbMTRdPS0ocioodSpwLU0qdiktaSoobipwLW8qdikrbCoobipNLW8qdSkpLHRbMTVdPXIqKHUqZi1NKmMpLWkqKG4qZi1vKmMpK2gqKG4qTS1vKnUpLHR9LG1hdDQuZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24odCl7dmFyIGE9dFswXSxyPXRbMV0sbj10WzJdLG89dFszXSxlPXRbNF0saT10WzVdLHU9dFs2XSxNPXRbN10sbT10WzhdLGg9dFs5XSxjPXRbMTBdLGY9dFsxMV0scz10WzEyXSxsPXRbMTNdLHY9dFsxNF0scD10WzE1XSx3PWEqaS1yKmUsZz1hKnUtbiplLFA9YSpNLW8qZSxSPXIqdS1uKmkseD1yKk0tbyppLEk9bipNLW8qdSxTPW0qbC1oKnMsZD1tKnYtYypzLHE9bSpwLWYqcyxFPWgqdi1jKmwsTz1oKnAtZipsLGI9YypwLWYqdjtyZXR1cm4gdypiLWcqTytQKkUrUipxLXgqZCtJKlN9LG1hdDQubXVsdGlwbHk9ZnVuY3Rpb24odCxhLHIpe3ZhciBuPWFbMF0sbz1hWzFdLGU9YVsyXSxpPWFbM10sdT1hWzRdLE09YVs1XSxtPWFbNl0saD1hWzddLGM9YVs4XSxmPWFbOV0scz1hWzEwXSxsPWFbMTFdLHY9YVsxMl0scD1hWzEzXSx3PWFbMTRdLGc9YVsxNV0sUD1yWzBdLFI9clsxXSx4PXJbMl0sST1yWzNdO3JldHVybiB0WzBdPVAqbitSKnUreCpjK0kqdix0WzFdPVAqbytSKk0reCpmK0kqcCx0WzJdPVAqZStSKm0reCpzK0kqdyx0WzNdPVAqaStSKmgreCpsK0kqZyxQPXJbNF0sUj1yWzVdLHg9cls2XSxJPXJbN10sdFs0XT1QKm4rUip1K3gqYytJKnYsdFs1XT1QKm8rUipNK3gqZitJKnAsdFs2XT1QKmUrUiptK3gqcytJKncsdFs3XT1QKmkrUipoK3gqbCtJKmcsUD1yWzhdLFI9cls5XSx4PXJbMTBdLEk9clsxMV0sdFs4XT1QKm4rUip1K3gqYytJKnYsdFs5XT1QKm8rUipNK3gqZitJKnAsdFsxMF09UCplK1IqbSt4KnMrSSp3LHRbMTFdPVAqaStSKmgreCpsK0kqZyxQPXJbMTJdLFI9clsxM10seD1yWzE0XSxJPXJbMTVdLHRbMTJdPVAqbitSKnUreCpjK0kqdix0WzEzXT1QKm8rUipNK3gqZitJKnAsdFsxNF09UCplK1IqbSt4KnMrSSp3LHRbMTVdPVAqaStSKmgreCpsK0kqZyx0fSxtYXQ0Lm11bD1tYXQ0Lm11bHRpcGx5LG1hdDQudHJhbnNsYXRlPWZ1bmN0aW9uKHQsYSxyKXt2YXIgbixvLGUsaSx1LE0sbSxoLGMsZixzLGwsdj1yWzBdLHA9clsxXSx3PXJbMl07cmV0dXJuIGE9PT10Pyh0WzEyXT1hWzBdKnYrYVs0XSpwK2FbOF0qdythWzEyXSx0WzEzXT1hWzFdKnYrYVs1XSpwK2FbOV0qdythWzEzXSx0WzE0XT1hWzJdKnYrYVs2XSpwK2FbMTBdKncrYVsxNF0sdFsxNV09YVszXSp2K2FbN10qcCthWzExXSp3K2FbMTVdKToobj1hWzBdLG89YVsxXSxlPWFbMl0saT1hWzNdLHU9YVs0XSxNPWFbNV0sbT1hWzZdLGg9YVs3XSxjPWFbOF0sZj1hWzldLHM9YVsxMF0sbD1hWzExXSx0WzBdPW4sdFsxXT1vLHRbMl09ZSx0WzNdPWksdFs0XT11LHRbNV09TSx0WzZdPW0sdFs3XT1oLHRbOF09Yyx0WzldPWYsdFsxMF09cyx0WzExXT1sLHRbMTJdPW4qdit1KnArYyp3K2FbMTJdLHRbMTNdPW8qditNKnArZip3K2FbMTNdLHRbMTRdPWUqdittKnArcyp3K2FbMTRdLHRbMTVdPWkqditoKnArbCp3K2FbMTVdKSx0fSxtYXQ0LnNjYWxlPWZ1bmN0aW9uKHQsYSxyKXt2YXIgbj1yWzBdLG89clsxXSxlPXJbMl07cmV0dXJuIHRbMF09YVswXSpuLHRbMV09YVsxXSpuLHRbMl09YVsyXSpuLHRbM109YVszXSpuLHRbNF09YVs0XSpvLHRbNV09YVs1XSpvLHRbNl09YVs2XSpvLHRbN109YVs3XSpvLHRbOF09YVs4XSplLHRbOV09YVs5XSplLHRbMTBdPWFbMTBdKmUsdFsxMV09YVsxMV0qZSx0WzEyXT1hWzEyXSx0WzEzXT1hWzEzXSx0WzE0XT1hWzE0XSx0WzE1XT1hWzE1XSx0fSxtYXQ0LnJvdGF0ZT1mdW5jdGlvbih0LGEscixuKXt2YXIgbyxlLGksdSxNLG0saCxjLGYscyxsLHYscCx3LGcsUCxSLHgsSSxTLGQscSxFLE8sYj1uWzBdLFQ9blsxXSxZPW5bMl0seT1NYXRoLnNxcnQoYipiK1QqVCtZKlkpO3JldHVybiBNYXRoLmFicyh5KTxnbE1hdHJpeC5FUFNJTE9OP251bGw6KHk9MS95LGIqPXksVCo9eSxZKj15LG89TWF0aC5zaW4ociksZT1NYXRoLmNvcyhyKSxpPTEtZSx1PWFbMF0sTT1hWzFdLG09YVsyXSxoPWFbM10sYz1hWzRdLGY9YVs1XSxzPWFbNl0sbD1hWzddLHY9YVs4XSxwPWFbOV0sdz1hWzEwXSxnPWFbMTFdLFA9YipiKmkrZSxSPVQqYippK1kqbyx4PVkqYippLVQqbyxJPWIqVCppLVkqbyxTPVQqVCppK2UsZD1ZKlQqaStiKm8scT1iKlkqaStUKm8sRT1UKlkqaS1iKm8sTz1ZKlkqaStlLHRbMF09dSpQK2MqUit2KngsdFsxXT1NKlArZipSK3AqeCx0WzJdPW0qUCtzKlIrdyp4LHRbM109aCpQK2wqUitnKngsdFs0XT11KkkrYypTK3YqZCx0WzVdPU0qSStmKlMrcCpkLHRbNl09bSpJK3MqUyt3KmQsdFs3XT1oKkkrbCpTK2cqZCx0WzhdPXUqcStjKkUrdipPLHRbOV09TSpxK2YqRStwKk8sdFsxMF09bSpxK3MqRSt3Kk8sdFsxMV09aCpxK2wqRStnKk8sYSE9PXQmJih0WzEyXT1hWzEyXSx0WzEzXT1hWzEzXSx0WzE0XT1hWzE0XSx0WzE1XT1hWzE1XSksdCl9LG1hdDQucm90YXRlWD1mdW5jdGlvbih0LGEscil7dmFyIG49TWF0aC5zaW4ociksbz1NYXRoLmNvcyhyKSxlPWFbNF0saT1hWzVdLHU9YVs2XSxNPWFbN10sbT1hWzhdLGg9YVs5XSxjPWFbMTBdLGY9YVsxMV07cmV0dXJuIGEhPT10JiYodFswXT1hWzBdLHRbMV09YVsxXSx0WzJdPWFbMl0sdFszXT1hWzNdLHRbMTJdPWFbMTJdLHRbMTNdPWFbMTNdLHRbMTRdPWFbMTRdLHRbMTVdPWFbMTVdKSx0WzRdPWUqbyttKm4sdFs1XT1pKm8raCpuLHRbNl09dSpvK2Mqbix0WzddPU0qbytmKm4sdFs4XT1tKm8tZSpuLHRbOV09aCpvLWkqbix0WzEwXT1jKm8tdSpuLHRbMTFdPWYqby1NKm4sdH0sbWF0NC5yb3RhdGVZPWZ1bmN0aW9uKHQsYSxyKXt2YXIgbj1NYXRoLnNpbihyKSxvPU1hdGguY29zKHIpLGU9YVswXSxpPWFbMV0sdT1hWzJdLE09YVszXSxtPWFbOF0saD1hWzldLGM9YVsxMF0sZj1hWzExXTtyZXR1cm4gYSE9PXQmJih0WzRdPWFbNF0sdFs1XT1hWzVdLHRbNl09YVs2XSx0WzddPWFbN10sdFsxMl09YVsxMl0sdFsxM109YVsxM10sdFsxNF09YVsxNF0sdFsxNV09YVsxNV0pLHRbMF09ZSpvLW0qbix0WzFdPWkqby1oKm4sdFsyXT11Km8tYypuLHRbM109TSpvLWYqbix0WzhdPWUqbittKm8sdFs5XT1pKm4raCpvLHRbMTBdPXUqbitjKm8sdFsxMV09TSpuK2Yqbyx0fSxtYXQ0LnJvdGF0ZVo9ZnVuY3Rpb24odCxhLHIpe3ZhciBuPU1hdGguc2luKHIpLG89TWF0aC5jb3MociksZT1hWzBdLGk9YVsxXSx1PWFbMl0sTT1hWzNdLG09YVs0XSxoPWFbNV0sYz1hWzZdLGY9YVs3XTtyZXR1cm4gYSE9PXQmJih0WzhdPWFbOF0sdFs5XT1hWzldLHRbMTBdPWFbMTBdLHRbMTFdPWFbMTFdLHRbMTJdPWFbMTJdLHRbMTNdPWFbMTNdLHRbMTRdPWFbMTRdLHRbMTVdPWFbMTVdKSx0WzBdPWUqbyttKm4sdFsxXT1pKm8raCpuLHRbMl09dSpvK2Mqbix0WzNdPU0qbytmKm4sdFs0XT1tKm8tZSpuLHRbNV09aCpvLWkqbix0WzZdPWMqby11Km4sdFs3XT1mKm8tTSpuLHR9LG1hdDQuZnJvbVRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsYSl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0xLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0xLHRbMTFdPTAsdFsxMl09YVswXSx0WzEzXT1hWzFdLHRbMTRdPWFbMl0sdFsxNV09MSx0fSxtYXQ0LmZyb21TY2FsaW5nPWZ1bmN0aW9uKHQsYSl7cmV0dXJuIHRbMF09YVswXSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1hWzFdLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT1hWzJdLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fSxtYXQ0LmZyb21Sb3RhdGlvbj1mdW5jdGlvbih0LGEscil7dmFyIG4sbyxlLGk9clswXSx1PXJbMV0sTT1yWzJdLG09TWF0aC5zcXJ0KGkqaSt1KnUrTSpNKTtyZXR1cm4gTWF0aC5hYnMobSk8Z2xNYXRyaXguRVBTSUxPTj9udWxsOihtPTEvbSxpKj1tLHUqPW0sTSo9bSxuPU1hdGguc2luKGEpLG89TWF0aC5jb3MoYSksZT0xLW8sdFswXT1pKmkqZStvLHRbMV09dSppKmUrTSpuLHRbMl09TSppKmUtdSpuLHRbM109MCx0WzRdPWkqdSplLU0qbix0WzVdPXUqdSplK28sdFs2XT1NKnUqZStpKm4sdFs3XT0wLHRbOF09aSpNKmUrdSpuLHRbOV09dSpNKmUtaSpuLHRbMTBdPU0qTSplK28sdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHQpfSxtYXQ0LmZyb21YUm90YXRpb249ZnVuY3Rpb24odCxhKXt2YXIgcj1NYXRoLnNpbihhKSxuPU1hdGguY29zKGEpO3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09bix0WzZdPXIsdFs3XT0wLHRbOF09MCx0WzldPS1yLHRbMTBdPW4sdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LG1hdDQuZnJvbVlSb3RhdGlvbj1mdW5jdGlvbih0LGEpe3ZhciByPU1hdGguc2luKGEpLG49TWF0aC5jb3MoYSk7cmV0dXJuIHRbMF09bix0WzFdPTAsdFsyXT0tcix0WzNdPTAsdFs0XT0wLHRbNV09MSx0WzZdPTAsdFs3XT0wLHRbOF09cix0WzldPTAsdFsxMF09bix0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0sbWF0NC5mcm9tWlJvdGF0aW9uPWZ1bmN0aW9uKHQsYSl7dmFyIHI9TWF0aC5zaW4oYSksbj1NYXRoLmNvcyhhKTtyZXR1cm4gdFswXT1uLHRbMV09cix0WzJdPTAsdFszXT0wLHRbNF09LXIsdFs1XT1uLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0xLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fSxtYXQ0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsYSxyKXt2YXIgbj1hWzBdLG89YVsxXSxlPWFbMl0saT1hWzNdLHU9bituLE09bytvLG09ZStlLGg9bip1LGM9bipNLGY9biptLHM9bypNLGw9byptLHY9ZSptLHA9aSp1LHc9aSpNLGc9aSptO3JldHVybiB0WzBdPTEtKHMrdiksdFsxXT1jK2csdFsyXT1mLXcsdFszXT0wLHRbNF09Yy1nLHRbNV09MS0oaCt2KSx0WzZdPWwrcCx0WzddPTAsdFs4XT1mK3csdFs5XT1sLXAsdFsxMF09MS0oaCtzKSx0WzExXT0wLHRbMTJdPXJbMF0sdFsxM109clsxXSx0WzE0XT1yWzJdLHRbMTVdPTEsdH0sbWF0NC5mcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlPWZ1bmN0aW9uKHQsYSxyLG4pe3ZhciBvPWFbMF0sZT1hWzFdLGk9YVsyXSx1PWFbM10sTT1vK28sbT1lK2UsaD1pK2ksYz1vKk0sZj1vKm0scz1vKmgsbD1lKm0sdj1lKmgscD1pKmgsdz11Kk0sZz11Km0sUD11KmgsUj1uWzBdLHg9blsxXSxJPW5bMl07cmV0dXJuIHRbMF09KDEtKGwrcCkpKlIsdFsxXT0oZitQKSpSLHRbMl09KHMtZykqUix0WzNdPTAsdFs0XT0oZi1QKSp4LHRbNV09KDEtKGMrcCkpKngsdFs2XT0odit3KSp4LHRbN109MCx0WzhdPShzK2cpKkksdFs5XT0odi13KSpJLHRbMTBdPSgxLShjK2wpKSpJLHRbMTFdPTAsdFsxMl09clswXSx0WzEzXT1yWzFdLHRbMTRdPXJbMl0sdFsxNV09MSx0fSxtYXQ0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVPcmlnaW49ZnVuY3Rpb24odCxhLHIsbixvKXt2YXIgZT1hWzBdLGk9YVsxXSx1PWFbMl0sTT1hWzNdLG09ZStlLGg9aStpLGM9dSt1LGY9ZSptLHM9ZSpoLGw9ZSpjLHY9aSpoLHA9aSpjLHc9dSpjLGc9TSptLFA9TSpoLFI9TSpjLHg9blswXSxJPW5bMV0sUz1uWzJdLGQ9b1swXSxxPW9bMV0sRT1vWzJdO3JldHVybiB0WzBdPSgxLSh2K3cpKSp4LHRbMV09KHMrUikqeCx0WzJdPShsLVApKngsdFszXT0wLHRbNF09KHMtUikqSSx0WzVdPSgxLShmK3cpKSpJLHRbNl09KHArZykqSSx0WzddPTAsdFs4XT0obCtQKSpTLHRbOV09KHAtZykqUyx0WzEwXT0oMS0oZit2KSkqUyx0WzExXT0wLHRbMTJdPXJbMF0rZC0odFswXSpkK3RbNF0qcSt0WzhdKkUpLHRbMTNdPXJbMV0rcS0odFsxXSpkK3RbNV0qcSt0WzldKkUpLHRbMTRdPXJbMl0rRS0odFsyXSpkK3RbNl0qcSt0WzEwXSpFKSx0WzE1XT0xLHR9LG1hdDQuZnJvbVF1YXQ9ZnVuY3Rpb24odCxhKXt2YXIgcj1hWzBdLG49YVsxXSxvPWFbMl0sZT1hWzNdLGk9cityLHU9bituLE09bytvLG09cippLGg9bippLGM9bip1LGY9byppLHM9byp1LGw9bypNLHY9ZSppLHA9ZSp1LHc9ZSpNO3JldHVybiB0WzBdPTEtYy1sLHRbMV09aCt3LHRbMl09Zi1wLHRbM109MCx0WzRdPWgtdyx0WzVdPTEtbS1sLHRbNl09cyt2LHRbN109MCx0WzhdPWYrcCx0WzldPXMtdix0WzEwXT0xLW0tYyx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0sbWF0NC5mcnVzdHVtPWZ1bmN0aW9uKHQsYSxyLG4sbyxlLGkpe3ZhciB1PTEvKHItYSksTT0xLyhvLW4pLG09MS8oZS1pKTtyZXR1cm4gdFswXT0yKmUqdSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0yKmUqTSx0WzZdPTAsdFs3XT0wLHRbOF09KHIrYSkqdSx0WzldPShvK24pKk0sdFsxMF09KGkrZSkqbSx0WzExXT0tMSx0WzEyXT0wLHRbMTNdPTAsdFsxNF09aSplKjIqbSx0WzE1XT0wLHR9LG1hdDQucGVyc3BlY3RpdmU9ZnVuY3Rpb24odCxhLHIsbixvKXt2YXIgZT0xL01hdGgudGFuKGEvMiksaT0xLyhuLW8pO3JldHVybiB0WzBdPWUvcix0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1lLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0obytuKSppLHRbMTFdPS0xLHRbMTJdPTAsdFsxM109MCx0WzE0XT0yKm8qbippLHRbMTVdPTAsdH0sbWF0NC5wZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldz1mdW5jdGlvbih0LGEscixuKXt2YXIgbz1NYXRoLnRhbihhLnVwRGVncmVlcypNYXRoLlBJLzE4MCksZT1NYXRoLnRhbihhLmRvd25EZWdyZWVzKk1hdGguUEkvMTgwKSxpPU1hdGgudGFuKGEubGVmdERlZ3JlZXMqTWF0aC5QSS8xODApLHU9TWF0aC50YW4oYS5yaWdodERlZ3JlZXMqTWF0aC5QSS8xODApLE09Mi8oaSt1KSxtPTIvKG8rZSk7cmV0dXJuIHRbMF09TSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1tLHRbNl09MCx0WzddPTAsdFs4XT0tKChpLXUpKk0qLjUpLHRbOV09KG8tZSkqbSouNSx0WzEwXT1uLyhyLW4pLHRbMTFdPS0xLHRbMTJdPTAsdFsxM109MCx0WzE0XT1uKnIvKHItbiksdFsxNV09MCx0fSxtYXQ0Lm9ydGhvPWZ1bmN0aW9uKHQsYSxyLG4sbyxlLGkpe3ZhciB1PTEvKGEtciksTT0xLyhuLW8pLG09MS8oZS1pKTtyZXR1cm4gdFswXT0tMip1LHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPS0yKk0sdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTIqbSx0WzExXT0wLHRbMTJdPShhK3IpKnUsdFsxM109KG8rbikqTSx0WzE0XT0oaStlKSptLHRbMTVdPTEsdH0sbWF0NC5sb29rQXQ9ZnVuY3Rpb24odCxhLHIsbil7dmFyIG8sZSxpLHUsTSxtLGgsYyxmLHMsbD1hWzBdLHY9YVsxXSxwPWFbMl0sdz1uWzBdLGc9blsxXSxQPW5bMl0sUj1yWzBdLHg9clsxXSxJPXJbMl07cmV0dXJuIE1hdGguYWJzKGwtUik8Z2xNYXRyaXguRVBTSUxPTiYmTWF0aC5hYnModi14KTxnbE1hdHJpeC5FUFNJTE9OJiZNYXRoLmFicyhwLUkpPGdsTWF0cml4LkVQU0lMT04/bWF0NC5pZGVudGl0eSh0KTooaD1sLVIsYz12LXgsZj1wLUkscz0xL01hdGguc3FydChoKmgrYypjK2YqZiksaCo9cyxjKj1zLGYqPXMsbz1nKmYtUCpjLGU9UCpoLXcqZixpPXcqYy1nKmgscz1NYXRoLnNxcnQobypvK2UqZStpKmkpLHM/KHM9MS9zLG8qPXMsZSo9cyxpKj1zKToobz0wLGU9MCxpPTApLHU9YyppLWYqZSxNPWYqby1oKmksbT1oKmUtYypvLHM9TWF0aC5zcXJ0KHUqdStNKk0rbSptKSxzPyhzPTEvcyx1Kj1zLE0qPXMsbSo9cyk6KHU9MCxNPTAsbT0wKSx0WzBdPW8sdFsxXT11LHRbMl09aCx0WzNdPTAsdFs0XT1lLHRbNV09TSx0WzZdPWMsdFs3XT0wLHRbOF09aSx0WzldPW0sdFsxMF09Zix0WzExXT0wLHRbMTJdPS0obypsK2UqditpKnApLHRbMTNdPS0odSpsK00qdittKnApLHRbMTRdPS0oaCpsK2MqditmKnApLHRbMTVdPTEsdCl9LG1hdDQuc3RyPWZ1bmN0aW9uKHQpe3JldHVyblwibWF0NChcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiLCBcIit0WzRdK1wiLCBcIit0WzVdK1wiLCBcIit0WzZdK1wiLCBcIit0WzddK1wiLCBcIit0WzhdK1wiLCBcIit0WzldK1wiLCBcIit0WzEwXStcIiwgXCIrdFsxMV0rXCIsIFwiK3RbMTJdK1wiLCBcIit0WzEzXStcIiwgXCIrdFsxNF0rXCIsIFwiK3RbMTVdK1wiKVwifSxtYXQ0LmZyb2I9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0WzBdLDIpK01hdGgucG93KHRbMV0sMikrTWF0aC5wb3codFsyXSwyKStNYXRoLnBvdyh0WzNdLDIpK01hdGgucG93KHRbNF0sMikrTWF0aC5wb3codFs1XSwyKStNYXRoLnBvdyh0WzZdLDIpK01hdGgucG93KHRbN10sMikrTWF0aC5wb3codFs4XSwyKStNYXRoLnBvdyh0WzldLDIpK01hdGgucG93KHRbMTBdLDIpK01hdGgucG93KHRbMTFdLDIpK01hdGgucG93KHRbMTJdLDIpK01hdGgucG93KHRbMTNdLDIpK01hdGgucG93KHRbMTRdLDIpK01hdGgucG93KHRbMTVdLDIpKX0sbW9kdWxlLmV4cG9ydHM9bWF0NDtcbn0se1wiLi9jb21tb24uanNcIjoxMTd9XSwxMjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsTWF0cml4PXJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKSxtYXQzPXJlcXVpcmUoXCIuL21hdDMuanNcIiksdmVjMz1yZXF1aXJlKFwiLi92ZWMzLmpzXCIpLHZlYzQ9cmVxdWlyZShcIi4vdmVjNC5qc1wiKSxxdWF0PXt9O3F1YXQuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7cmV0dXJuIHRbMF09MCx0WzFdPTAsdFsyXT0wLHRbM109MSx0fSxxdWF0LnJvdGF0aW9uVG89ZnVuY3Rpb24oKXt2YXIgdD12ZWMzLmNyZWF0ZSgpLGE9dmVjMy5mcm9tVmFsdWVzKDEsMCwwKSxlPXZlYzMuZnJvbVZhbHVlcygwLDEsMCk7cmV0dXJuIGZ1bmN0aW9uKHIsdSxuKXt2YXIgYz12ZWMzLmRvdCh1LG4pO3JldHVybi0uOTk5OTk5PmM/KHZlYzMuY3Jvc3ModCxhLHUpLHZlYzMubGVuZ3RoKHQpPDFlLTYmJnZlYzMuY3Jvc3ModCxlLHUpLHZlYzMubm9ybWFsaXplKHQsdCkscXVhdC5zZXRBeGlzQW5nbGUocix0LE1hdGguUEkpLHIpOmM+Ljk5OTk5OT8oclswXT0wLHJbMV09MCxyWzJdPTAsclszXT0xLHIpOih2ZWMzLmNyb3NzKHQsdSxuKSxyWzBdPXRbMF0sclsxXT10WzFdLHJbMl09dFsyXSxyWzNdPTErYyxxdWF0Lm5vcm1hbGl6ZShyLHIpKX19KCkscXVhdC5zZXRBeGVzPWZ1bmN0aW9uKCl7dmFyIHQ9bWF0My5jcmVhdGUoKTtyZXR1cm4gZnVuY3Rpb24oYSxlLHIsdSl7cmV0dXJuIHRbMF09clswXSx0WzNdPXJbMV0sdFs2XT1yWzJdLHRbMV09dVswXSx0WzRdPXVbMV0sdFs3XT11WzJdLHRbMl09LWVbMF0sdFs1XT0tZVsxXSx0WzhdPS1lWzJdLHF1YXQubm9ybWFsaXplKGEscXVhdC5mcm9tTWF0MyhhLHQpKX19KCkscXVhdC5jbG9uZT12ZWM0LmNsb25lLHF1YXQuZnJvbVZhbHVlcz12ZWM0LmZyb21WYWx1ZXMscXVhdC5jb3B5PXZlYzQuY29weSxxdWF0LnNldD12ZWM0LnNldCxxdWF0LmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTAsdFsxXT0wLHRbMl09MCx0WzNdPTEsdH0scXVhdC5zZXRBeGlzQW5nbGU9ZnVuY3Rpb24odCxhLGUpe2U9LjUqZTt2YXIgcj1NYXRoLnNpbihlKTtyZXR1cm4gdFswXT1yKmFbMF0sdFsxXT1yKmFbMV0sdFsyXT1yKmFbMl0sdFszXT1NYXRoLmNvcyhlKSx0fSxxdWF0LmFkZD12ZWM0LmFkZCxxdWF0Lm11bHRpcGx5PWZ1bmN0aW9uKHQsYSxlKXt2YXIgcj1hWzBdLHU9YVsxXSxuPWFbMl0sYz1hWzNdLHE9ZVswXSxvPWVbMV0scz1lWzJdLGk9ZVszXTtyZXR1cm4gdFswXT1yKmkrYypxK3Uqcy1uKm8sdFsxXT11KmkrYypvK24qcS1yKnMsdFsyXT1uKmkrYypzK3Iqby11KnEsdFszXT1jKmktcipxLXUqby1uKnMsdH0scXVhdC5tdWw9cXVhdC5tdWx0aXBseSxxdWF0LnNjYWxlPXZlYzQuc2NhbGUscXVhdC5yb3RhdGVYPWZ1bmN0aW9uKHQsYSxlKXtlKj0uNTt2YXIgcj1hWzBdLHU9YVsxXSxuPWFbMl0sYz1hWzNdLHE9TWF0aC5zaW4oZSksbz1NYXRoLmNvcyhlKTtyZXR1cm4gdFswXT1yKm8rYypxLHRbMV09dSpvK24qcSx0WzJdPW4qby11KnEsdFszXT1jKm8tcipxLHR9LHF1YXQucm90YXRlWT1mdW5jdGlvbih0LGEsZSl7ZSo9LjU7dmFyIHI9YVswXSx1PWFbMV0sbj1hWzJdLGM9YVszXSxxPU1hdGguc2luKGUpLG89TWF0aC5jb3MoZSk7cmV0dXJuIHRbMF09cipvLW4qcSx0WzFdPXUqbytjKnEsdFsyXT1uKm8rcipxLHRbM109YypvLXUqcSx0fSxxdWF0LnJvdGF0ZVo9ZnVuY3Rpb24odCxhLGUpe2UqPS41O3ZhciByPWFbMF0sdT1hWzFdLG49YVsyXSxjPWFbM10scT1NYXRoLnNpbihlKSxvPU1hdGguY29zKGUpO3JldHVybiB0WzBdPXIqbyt1KnEsdFsxXT11Km8tcipxLHRbMl09bipvK2MqcSx0WzNdPWMqby1uKnEsdH0scXVhdC5jYWxjdWxhdGVXPWZ1bmN0aW9uKHQsYSl7dmFyIGU9YVswXSxyPWFbMV0sdT1hWzJdO3JldHVybiB0WzBdPWUsdFsxXT1yLHRbMl09dSx0WzNdPU1hdGguc3FydChNYXRoLmFicygxLWUqZS1yKnItdSp1KSksdH0scXVhdC5kb3Q9dmVjNC5kb3QscXVhdC5sZXJwPXZlYzQubGVycCxxdWF0LnNsZXJwPWZ1bmN0aW9uKHQsYSxlLHIpe3ZhciB1LG4sYyxxLG8scz1hWzBdLGk9YVsxXSx2PWFbMl0sbD1hWzNdLGY9ZVswXSxoPWVbMV0sTT1lWzJdLG09ZVszXTtyZXR1cm4gbj1zKmYraSpoK3YqTStsKm0sMD5uJiYobj0tbixmPS1mLGg9LWgsTT0tTSxtPS1tKSwxLW4+MWUtNj8odT1NYXRoLmFjb3MobiksYz1NYXRoLnNpbih1KSxxPU1hdGguc2luKCgxLXIpKnUpL2Msbz1NYXRoLnNpbihyKnUpL2MpOihxPTEtcixvPXIpLHRbMF09cSpzK28qZix0WzFdPXEqaStvKmgsdFsyXT1xKnYrbypNLHRbM109cSpsK28qbSx0fSxxdWF0LnNxbGVycD1mdW5jdGlvbigpe3ZhciB0PXF1YXQuY3JlYXRlKCksYT1xdWF0LmNyZWF0ZSgpO3JldHVybiBmdW5jdGlvbihlLHIsdSxuLGMscSl7cmV0dXJuIHF1YXQuc2xlcnAodCxyLGMscSkscXVhdC5zbGVycChhLHUsbixxKSxxdWF0LnNsZXJwKGUsdCxhLDIqcSooMS1xKSksZX19KCkscXVhdC5pbnZlcnQ9ZnVuY3Rpb24odCxhKXt2YXIgZT1hWzBdLHI9YVsxXSx1PWFbMl0sbj1hWzNdLGM9ZSplK3Iqcit1KnUrbipuLHE9Yz8xL2M6MDtyZXR1cm4gdFswXT0tZSpxLHRbMV09LXIqcSx0WzJdPS11KnEsdFszXT1uKnEsdH0scXVhdC5jb25qdWdhdGU9ZnVuY3Rpb24odCxhKXtyZXR1cm4gdFswXT0tYVswXSx0WzFdPS1hWzFdLHRbMl09LWFbMl0sdFszXT1hWzNdLHR9LHF1YXQubGVuZ3RoPXZlYzQubGVuZ3RoLHF1YXQubGVuPXF1YXQubGVuZ3RoLHF1YXQuc3F1YXJlZExlbmd0aD12ZWM0LnNxdWFyZWRMZW5ndGgscXVhdC5zcXJMZW49cXVhdC5zcXVhcmVkTGVuZ3RoLHF1YXQubm9ybWFsaXplPXZlYzQubm9ybWFsaXplLHF1YXQuZnJvbU1hdDM9ZnVuY3Rpb24odCxhKXt2YXIgZSxyPWFbMF0rYVs0XSthWzhdO2lmKHI+MCllPU1hdGguc3FydChyKzEpLHRbM109LjUqZSxlPS41L2UsdFswXT0oYVs1XS1hWzddKSplLHRbMV09KGFbNl0tYVsyXSkqZSx0WzJdPShhWzFdLWFbM10pKmU7ZWxzZXt2YXIgdT0wO2FbNF0+YVswXSYmKHU9MSksYVs4XT5hWzMqdSt1XSYmKHU9Mik7dmFyIG49KHUrMSklMyxjPSh1KzIpJTM7ZT1NYXRoLnNxcnQoYVszKnUrdV0tYVszKm4rbl0tYVszKmMrY10rMSksdFt1XT0uNSplLGU9LjUvZSx0WzNdPShhWzMqbitjXS1hWzMqYytuXSkqZSx0W25dPShhWzMqbit1XSthWzMqdStuXSkqZSx0W2NdPShhWzMqYyt1XSthWzMqdStjXSkqZX1yZXR1cm4gdH0scXVhdC5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuXCJxdWF0KFwiK3RbMF0rXCIsIFwiK3RbMV0rXCIsIFwiK3RbMl0rXCIsIFwiK3RbM10rXCIpXCJ9LG1vZHVsZS5leHBvcnRzPXF1YXQ7XG59LHtcIi4vY29tbW9uLmpzXCI6MTE3LFwiLi9tYXQzLmpzXCI6MTIwLFwiLi92ZWMzLmpzXCI6MTI0LFwiLi92ZWM0LmpzXCI6MTI1fV0sMTIzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbnZhciBnbE1hdHJpeD1yZXF1aXJlKFwiLi9jb21tb24uanNcIiksdmVjMj17fTt2ZWMyLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciBuPW5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO3JldHVybiBuWzBdPTAsblsxXT0wLG59LHZlYzIuY2xvbmU9ZnVuY3Rpb24obil7dmFyIGU9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7cmV0dXJuIGVbMF09blswXSxlWzFdPW5bMV0sZX0sdmVjMi5mcm9tVmFsdWVzPWZ1bmN0aW9uKG4sZSl7dmFyIHI9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7cmV0dXJuIHJbMF09bixyWzFdPWUscn0sdmVjMi5jb3B5PWZ1bmN0aW9uKG4sZSl7cmV0dXJuIG5bMF09ZVswXSxuWzFdPWVbMV0sbn0sdmVjMi5zZXQ9ZnVuY3Rpb24obixlLHIpe3JldHVybiBuWzBdPWUsblsxXT1yLG59LHZlYzIuYWRkPWZ1bmN0aW9uKG4sZSxyKXtyZXR1cm4gblswXT1lWzBdK3JbMF0sblsxXT1lWzFdK3JbMV0sbn0sdmVjMi5zdWJ0cmFjdD1mdW5jdGlvbihuLGUscil7cmV0dXJuIG5bMF09ZVswXS1yWzBdLG5bMV09ZVsxXS1yWzFdLG59LHZlYzIuc3ViPXZlYzIuc3VidHJhY3QsdmVjMi5tdWx0aXBseT1mdW5jdGlvbihuLGUscil7cmV0dXJuIG5bMF09ZVswXSpyWzBdLG5bMV09ZVsxXSpyWzFdLG59LHZlYzIubXVsPXZlYzIubXVsdGlwbHksdmVjMi5kaXZpZGU9ZnVuY3Rpb24obixlLHIpe3JldHVybiBuWzBdPWVbMF0vclswXSxuWzFdPWVbMV0vclsxXSxufSx2ZWMyLmRpdj12ZWMyLmRpdmlkZSx2ZWMyLm1pbj1mdW5jdGlvbihuLGUscil7cmV0dXJuIG5bMF09TWF0aC5taW4oZVswXSxyWzBdKSxuWzFdPU1hdGgubWluKGVbMV0sclsxXSksbn0sdmVjMi5tYXg9ZnVuY3Rpb24obixlLHIpe3JldHVybiBuWzBdPU1hdGgubWF4KGVbMF0sclswXSksblsxXT1NYXRoLm1heChlWzFdLHJbMV0pLG59LHZlYzIuc2NhbGU9ZnVuY3Rpb24obixlLHIpe3JldHVybiBuWzBdPWVbMF0qcixuWzFdPWVbMV0qcixufSx2ZWMyLnNjYWxlQW5kQWRkPWZ1bmN0aW9uKG4sZSxyLHQpe3JldHVybiBuWzBdPWVbMF0rclswXSp0LG5bMV09ZVsxXStyWzFdKnQsbn0sdmVjMi5kaXN0YW5jZT1mdW5jdGlvbihuLGUpe3ZhciByPWVbMF0tblswXSx0PWVbMV0tblsxXTtyZXR1cm4gTWF0aC5zcXJ0KHIqcit0KnQpfSx2ZWMyLmRpc3Q9dmVjMi5kaXN0YW5jZSx2ZWMyLnNxdWFyZWREaXN0YW5jZT1mdW5jdGlvbihuLGUpe3ZhciByPWVbMF0tblswXSx0PWVbMV0tblsxXTtyZXR1cm4gcipyK3QqdH0sdmVjMi5zcXJEaXN0PXZlYzIuc3F1YXJlZERpc3RhbmNlLHZlYzIubGVuZ3RoPWZ1bmN0aW9uKG4pe3ZhciBlPW5bMF0scj1uWzFdO3JldHVybiBNYXRoLnNxcnQoZSplK3Iqcil9LHZlYzIubGVuPXZlYzIubGVuZ3RoLHZlYzIuc3F1YXJlZExlbmd0aD1mdW5jdGlvbihuKXt2YXIgZT1uWzBdLHI9blsxXTtyZXR1cm4gZSplK3Iqcn0sdmVjMi5zcXJMZW49dmVjMi5zcXVhcmVkTGVuZ3RoLHZlYzIubmVnYXRlPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIG5bMF09LWVbMF0sblsxXT0tZVsxXSxufSx2ZWMyLmludmVyc2U9ZnVuY3Rpb24obixlKXtyZXR1cm4gblswXT0xL2VbMF0sblsxXT0xL2VbMV0sbn0sdmVjMi5ub3JtYWxpemU9ZnVuY3Rpb24obixlKXt2YXIgcj1lWzBdLHQ9ZVsxXSxjPXIqcit0KnQ7cmV0dXJuIGM+MCYmKGM9MS9NYXRoLnNxcnQoYyksblswXT1lWzBdKmMsblsxXT1lWzFdKmMpLG59LHZlYzIuZG90PWZ1bmN0aW9uKG4sZSl7cmV0dXJuIG5bMF0qZVswXStuWzFdKmVbMV19LHZlYzIuY3Jvc3M9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0qclsxXS1lWzFdKnJbMF07cmV0dXJuIG5bMF09blsxXT0wLG5bMl09dCxufSx2ZWMyLmxlcnA9ZnVuY3Rpb24obixlLHIsdCl7dmFyIGM9ZVswXSx1PWVbMV07cmV0dXJuIG5bMF09Yyt0KihyWzBdLWMpLG5bMV09dSt0KihyWzFdLXUpLG59LHZlYzIucmFuZG9tPWZ1bmN0aW9uKG4sZSl7ZT1lfHwxO3ZhciByPTIqZ2xNYXRyaXguUkFORE9NKCkqTWF0aC5QSTtyZXR1cm4gblswXT1NYXRoLmNvcyhyKSplLG5bMV09TWF0aC5zaW4ocikqZSxufSx2ZWMyLnRyYW5zZm9ybU1hdDI9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0sYz1lWzFdO3JldHVybiBuWzBdPXJbMF0qdCtyWzJdKmMsblsxXT1yWzFdKnQrclszXSpjLG59LHZlYzIudHJhbnNmb3JtTWF0MmQ9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0sYz1lWzFdO3JldHVybiBuWzBdPXJbMF0qdCtyWzJdKmMrcls0XSxuWzFdPXJbMV0qdCtyWzNdKmMrcls1XSxufSx2ZWMyLnRyYW5zZm9ybU1hdDM9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0sYz1lWzFdO3JldHVybiBuWzBdPXJbMF0qdCtyWzNdKmMrcls2XSxuWzFdPXJbMV0qdCtyWzRdKmMrcls3XSxufSx2ZWMyLnRyYW5zZm9ybU1hdDQ9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0sYz1lWzFdO3JldHVybiBuWzBdPXJbMF0qdCtyWzRdKmMrclsxMl0sblsxXT1yWzFdKnQrcls1XSpjK3JbMTNdLG59LHZlYzIuZm9yRWFjaD1mdW5jdGlvbigpe3ZhciBuPXZlYzIuY3JlYXRlKCk7cmV0dXJuIGZ1bmN0aW9uKGUscix0LGMsdSx2KXt2YXIgYSxpO2ZvcihyfHwocj0yKSx0fHwodD0wKSxpPWM/TWF0aC5taW4oYypyK3QsZS5sZW5ndGgpOmUubGVuZ3RoLGE9dDtpPmE7YSs9ciluWzBdPWVbYV0sblsxXT1lW2ErMV0sdShuLG4sdiksZVthXT1uWzBdLGVbYSsxXT1uWzFdO3JldHVybiBlfX0oKSx2ZWMyLnN0cj1mdW5jdGlvbihuKXtyZXR1cm5cInZlYzIoXCIrblswXStcIiwgXCIrblsxXStcIilcIn0sbW9kdWxlLmV4cG9ydHM9dmVjMjtcbn0se1wiLi9jb21tb24uanNcIjoxMTd9XSwxMjQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsTWF0cml4PXJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKSx2ZWMzPXt9O3ZlYzMuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIG49bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7cmV0dXJuIG5bMF09MCxuWzFdPTAsblsyXT0wLG59LHZlYzMuY2xvbmU9ZnVuY3Rpb24obil7dmFyIHQ9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHR9LHZlYzMuZnJvbVZhbHVlcz1mdW5jdGlvbihuLHQsZSl7dmFyIHI9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7cmV0dXJuIHJbMF09bixyWzFdPXQsclsyXT1lLHJ9LHZlYzMuY29weT1mdW5jdGlvbihuLHQpe3JldHVybiBuWzBdPXRbMF0sblsxXT10WzFdLG5bMl09dFsyXSxufSx2ZWMzLnNldD1mdW5jdGlvbihuLHQsZSxyKXtyZXR1cm4gblswXT10LG5bMV09ZSxuWzJdPXIsbn0sdmVjMy5hZGQ9ZnVuY3Rpb24obix0LGUpe3JldHVybiBuWzBdPXRbMF0rZVswXSxuWzFdPXRbMV0rZVsxXSxuWzJdPXRbMl0rZVsyXSxufSx2ZWMzLnN1YnRyYWN0PWZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gblswXT10WzBdLWVbMF0sblsxXT10WzFdLWVbMV0sblsyXT10WzJdLWVbMl0sbn0sdmVjMy5zdWI9dmVjMy5zdWJ0cmFjdCx2ZWMzLm11bHRpcGx5PWZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gblswXT10WzBdKmVbMF0sblsxXT10WzFdKmVbMV0sblsyXT10WzJdKmVbMl0sbn0sdmVjMy5tdWw9dmVjMy5tdWx0aXBseSx2ZWMzLmRpdmlkZT1mdW5jdGlvbihuLHQsZSl7cmV0dXJuIG5bMF09dFswXS9lWzBdLG5bMV09dFsxXS9lWzFdLG5bMl09dFsyXS9lWzJdLG59LHZlYzMuZGl2PXZlYzMuZGl2aWRlLHZlYzMubWluPWZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gblswXT1NYXRoLm1pbih0WzBdLGVbMF0pLG5bMV09TWF0aC5taW4odFsxXSxlWzFdKSxuWzJdPU1hdGgubWluKHRbMl0sZVsyXSksbn0sdmVjMy5tYXg9ZnVuY3Rpb24obix0LGUpe3JldHVybiBuWzBdPU1hdGgubWF4KHRbMF0sZVswXSksblsxXT1NYXRoLm1heCh0WzFdLGVbMV0pLG5bMl09TWF0aC5tYXgodFsyXSxlWzJdKSxufSx2ZWMzLnNjYWxlPWZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gblswXT10WzBdKmUsblsxXT10WzFdKmUsblsyXT10WzJdKmUsbn0sdmVjMy5zY2FsZUFuZEFkZD1mdW5jdGlvbihuLHQsZSxyKXtyZXR1cm4gblswXT10WzBdK2VbMF0qcixuWzFdPXRbMV0rZVsxXSpyLG5bMl09dFsyXStlWzJdKnIsbn0sdmVjMy5kaXN0YW5jZT1mdW5jdGlvbihuLHQpe3ZhciBlPXRbMF0tblswXSxyPXRbMV0tblsxXSxjPXRbMl0tblsyXTtyZXR1cm4gTWF0aC5zcXJ0KGUqZStyKnIrYypjKX0sdmVjMy5kaXN0PXZlYzMuZGlzdGFuY2UsdmVjMy5zcXVhcmVkRGlzdGFuY2U9ZnVuY3Rpb24obix0KXt2YXIgZT10WzBdLW5bMF0scj10WzFdLW5bMV0sYz10WzJdLW5bMl07cmV0dXJuIGUqZStyKnIrYypjfSx2ZWMzLnNxckRpc3Q9dmVjMy5zcXVhcmVkRGlzdGFuY2UsdmVjMy5sZW5ndGg9ZnVuY3Rpb24obil7dmFyIHQ9blswXSxlPW5bMV0scj1uWzJdO3JldHVybiBNYXRoLnNxcnQodCp0K2UqZStyKnIpfSx2ZWMzLmxlbj12ZWMzLmxlbmd0aCx2ZWMzLnNxdWFyZWRMZW5ndGg9ZnVuY3Rpb24obil7dmFyIHQ9blswXSxlPW5bMV0scj1uWzJdO3JldHVybiB0KnQrZSplK3Iqcn0sdmVjMy5zcXJMZW49dmVjMy5zcXVhcmVkTGVuZ3RoLHZlYzMubmVnYXRlPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG5bMF09LXRbMF0sblsxXT0tdFsxXSxuWzJdPS10WzJdLG59LHZlYzMuaW52ZXJzZT1mdW5jdGlvbihuLHQpe3JldHVybiBuWzBdPTEvdFswXSxuWzFdPTEvdFsxXSxuWzJdPTEvdFsyXSxufSx2ZWMzLm5vcm1hbGl6ZT1mdW5jdGlvbihuLHQpe3ZhciBlPXRbMF0scj10WzFdLGM9dFsyXSxhPWUqZStyKnIrYypjO3JldHVybiBhPjAmJihhPTEvTWF0aC5zcXJ0KGEpLG5bMF09dFswXSphLG5bMV09dFsxXSphLG5bMl09dFsyXSphKSxufSx2ZWMzLmRvdD1mdW5jdGlvbihuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdK25bMl0qdFsyXX0sdmVjMy5jcm9zcz1mdW5jdGlvbihuLHQsZSl7dmFyIHI9dFswXSxjPXRbMV0sYT10WzJdLHU9ZVswXSx2PWVbMV0saT1lWzJdO3JldHVybiBuWzBdPWMqaS1hKnYsblsxXT1hKnUtcippLG5bMl09cip2LWMqdSxufSx2ZWMzLmxlcnA9ZnVuY3Rpb24obix0LGUscil7dmFyIGM9dFswXSxhPXRbMV0sdT10WzJdO3JldHVybiBuWzBdPWMrciooZVswXS1jKSxuWzFdPWErciooZVsxXS1hKSxuWzJdPXUrciooZVsyXS11KSxufSx2ZWMzLmhlcm1pdGU9ZnVuY3Rpb24obix0LGUscixjLGEpe3ZhciB1PWEqYSx2PXUqKDIqYS0zKSsxLGk9dSooYS0yKSthLG89dSooYS0xKSxzPXUqKDMtMiphKTtyZXR1cm4gblswXT10WzBdKnYrZVswXSppK3JbMF0qbytjWzBdKnMsblsxXT10WzFdKnYrZVsxXSppK3JbMV0qbytjWzFdKnMsblsyXT10WzJdKnYrZVsyXSppK3JbMl0qbytjWzJdKnMsbn0sdmVjMy5iZXppZXI9ZnVuY3Rpb24obix0LGUscixjLGEpe3ZhciB1PTEtYSx2PXUqdSxpPWEqYSxvPXYqdSxzPTMqYSp2LGY9MyppKnUsTT1pKmE7cmV0dXJuIG5bMF09dFswXSpvK2VbMF0qcytyWzBdKmYrY1swXSpNLG5bMV09dFsxXSpvK2VbMV0qcytyWzFdKmYrY1sxXSpNLG5bMl09dFsyXSpvK2VbMl0qcytyWzJdKmYrY1syXSpNLG59LHZlYzMucmFuZG9tPWZ1bmN0aW9uKG4sdCl7dD10fHwxO3ZhciBlPTIqZ2xNYXRyaXguUkFORE9NKCkqTWF0aC5QSSxyPTIqZ2xNYXRyaXguUkFORE9NKCktMSxjPU1hdGguc3FydCgxLXIqcikqdDtyZXR1cm4gblswXT1NYXRoLmNvcyhlKSpjLG5bMV09TWF0aC5zaW4oZSkqYyxuWzJdPXIqdCxufSx2ZWMzLnRyYW5zZm9ybU1hdDQ9ZnVuY3Rpb24obix0LGUpe3ZhciByPXRbMF0sYz10WzFdLGE9dFsyXSx1PWVbM10qcitlWzddKmMrZVsxMV0qYStlWzE1XTtyZXR1cm4gdT11fHwxLG5bMF09KGVbMF0qcitlWzRdKmMrZVs4XSphK2VbMTJdKS91LG5bMV09KGVbMV0qcitlWzVdKmMrZVs5XSphK2VbMTNdKS91LG5bMl09KGVbMl0qcitlWzZdKmMrZVsxMF0qYStlWzE0XSkvdSxufSx2ZWMzLnRyYW5zZm9ybU1hdDM9ZnVuY3Rpb24obix0LGUpe3ZhciByPXRbMF0sYz10WzFdLGE9dFsyXTtyZXR1cm4gblswXT1yKmVbMF0rYyplWzNdK2EqZVs2XSxuWzFdPXIqZVsxXStjKmVbNF0rYSplWzddLG5bMl09ciplWzJdK2MqZVs1XSthKmVbOF0sbn0sdmVjMy50cmFuc2Zvcm1RdWF0PWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj10WzBdLGM9dFsxXSxhPXRbMl0sdT1lWzBdLHY9ZVsxXSxpPWVbMl0sbz1lWzNdLHM9bypyK3YqYS1pKmMsZj1vKmMraSpyLXUqYSxNPW8qYSt1KmMtdipyLGg9LXUqci12KmMtaSphO3JldHVybiBuWzBdPXMqbytoKi11K2YqLWktTSotdixuWzFdPWYqbytoKi12K00qLXUtcyotaSxuWzJdPU0qbytoKi1pK3MqLXYtZiotdSxufSx2ZWMzLnJvdGF0ZVg9ZnVuY3Rpb24obix0LGUscil7dmFyIGM9W10sYT1bXTtyZXR1cm4gY1swXT10WzBdLWVbMF0sY1sxXT10WzFdLWVbMV0sY1syXT10WzJdLWVbMl0sYVswXT1jWzBdLGFbMV09Y1sxXSpNYXRoLmNvcyhyKS1jWzJdKk1hdGguc2luKHIpLGFbMl09Y1sxXSpNYXRoLnNpbihyKStjWzJdKk1hdGguY29zKHIpLG5bMF09YVswXStlWzBdLG5bMV09YVsxXStlWzFdLG5bMl09YVsyXStlWzJdLG59LHZlYzMucm90YXRlWT1mdW5jdGlvbihuLHQsZSxyKXt2YXIgYz1bXSxhPVtdO3JldHVybiBjWzBdPXRbMF0tZVswXSxjWzFdPXRbMV0tZVsxXSxjWzJdPXRbMl0tZVsyXSxhWzBdPWNbMl0qTWF0aC5zaW4ocikrY1swXSpNYXRoLmNvcyhyKSxhWzFdPWNbMV0sYVsyXT1jWzJdKk1hdGguY29zKHIpLWNbMF0qTWF0aC5zaW4ociksblswXT1hWzBdK2VbMF0sblsxXT1hWzFdK2VbMV0sblsyXT1hWzJdK2VbMl0sbn0sdmVjMy5yb3RhdGVaPWZ1bmN0aW9uKG4sdCxlLHIpe3ZhciBjPVtdLGE9W107cmV0dXJuIGNbMF09dFswXS1lWzBdLGNbMV09dFsxXS1lWzFdLGNbMl09dFsyXS1lWzJdLGFbMF09Y1swXSpNYXRoLmNvcyhyKS1jWzFdKk1hdGguc2luKHIpLGFbMV09Y1swXSpNYXRoLnNpbihyKStjWzFdKk1hdGguY29zKHIpLGFbMl09Y1syXSxuWzBdPWFbMF0rZVswXSxuWzFdPWFbMV0rZVsxXSxuWzJdPWFbMl0rZVsyXSxufSx2ZWMzLmZvckVhY2g9ZnVuY3Rpb24oKXt2YXIgbj12ZWMzLmNyZWF0ZSgpO3JldHVybiBmdW5jdGlvbih0LGUscixjLGEsdSl7dmFyIHYsaTtmb3IoZXx8KGU9Mykscnx8KHI9MCksaT1jP01hdGgubWluKGMqZStyLHQubGVuZ3RoKTp0Lmxlbmd0aCx2PXI7aT52O3YrPWUpblswXT10W3ZdLG5bMV09dFt2KzFdLG5bMl09dFt2KzJdLGEobixuLHUpLHRbdl09blswXSx0W3YrMV09blsxXSx0W3YrMl09blsyXTtyZXR1cm4gdH19KCksdmVjMy5hbmdsZT1mdW5jdGlvbihuLHQpe3ZhciBlPXZlYzMuZnJvbVZhbHVlcyhuWzBdLG5bMV0sblsyXSkscj12ZWMzLmZyb21WYWx1ZXModFswXSx0WzFdLHRbMl0pO3ZlYzMubm9ybWFsaXplKGUsZSksdmVjMy5ub3JtYWxpemUocixyKTt2YXIgYz12ZWMzLmRvdChlLHIpO3JldHVybiBjPjE/MDpNYXRoLmFjb3MoYyl9LHZlYzMuc3RyPWZ1bmN0aW9uKG4pe3JldHVyblwidmVjMyhcIituWzBdK1wiLCBcIituWzFdK1wiLCBcIituWzJdK1wiKVwifSxtb2R1bGUuZXhwb3J0cz12ZWMzO1xufSx7XCIuL2NvbW1vbi5qc1wiOjExN31dLDEyNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG52YXIgZ2xNYXRyaXg9cmVxdWlyZShcIi4vY29tbW9uLmpzXCIpLHZlYzQ9e307dmVjNC5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtyZXR1cm4gZVswXT0wLGVbMV09MCxlWzJdPTAsZVszXT0wLGV9LHZlYzQuY2xvbmU9ZnVuY3Rpb24oZSl7dmFyIG49bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7cmV0dXJuIG5bMF09ZVswXSxuWzFdPWVbMV0sblsyXT1lWzJdLG5bM109ZVszXSxufSx2ZWM0LmZyb21WYWx1ZXM9ZnVuY3Rpb24oZSxuLHQscil7dmFyIGM9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7cmV0dXJuIGNbMF09ZSxjWzFdPW4sY1syXT10LGNbM109cixjfSx2ZWM0LmNvcHk9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGV9LHZlYzQuc2V0PWZ1bmN0aW9uKGUsbix0LHIsYyl7cmV0dXJuIGVbMF09bixlWzFdPXQsZVsyXT1yLGVbM109YyxlfSx2ZWM0LmFkZD1mdW5jdGlvbihlLG4sdCl7cmV0dXJuIGVbMF09blswXSt0WzBdLGVbMV09blsxXSt0WzFdLGVbMl09blsyXSt0WzJdLGVbM109blszXSt0WzNdLGV9LHZlYzQuc3VidHJhY3Q9ZnVuY3Rpb24oZSxuLHQpe3JldHVybiBlWzBdPW5bMF0tdFswXSxlWzFdPW5bMV0tdFsxXSxlWzJdPW5bMl0tdFsyXSxlWzNdPW5bM10tdFszXSxlfSx2ZWM0LnN1Yj12ZWM0LnN1YnRyYWN0LHZlYzQubXVsdGlwbHk9ZnVuY3Rpb24oZSxuLHQpe3JldHVybiBlWzBdPW5bMF0qdFswXSxlWzFdPW5bMV0qdFsxXSxlWzJdPW5bMl0qdFsyXSxlWzNdPW5bM10qdFszXSxlfSx2ZWM0Lm11bD12ZWM0Lm11bHRpcGx5LHZlYzQuZGl2aWRlPWZ1bmN0aW9uKGUsbix0KXtyZXR1cm4gZVswXT1uWzBdL3RbMF0sZVsxXT1uWzFdL3RbMV0sZVsyXT1uWzJdL3RbMl0sZVszXT1uWzNdL3RbM10sZX0sdmVjNC5kaXY9dmVjNC5kaXZpZGUsdmVjNC5taW49ZnVuY3Rpb24oZSxuLHQpe3JldHVybiBlWzBdPU1hdGgubWluKG5bMF0sdFswXSksZVsxXT1NYXRoLm1pbihuWzFdLHRbMV0pLGVbMl09TWF0aC5taW4oblsyXSx0WzJdKSxlWzNdPU1hdGgubWluKG5bM10sdFszXSksZX0sdmVjNC5tYXg9ZnVuY3Rpb24oZSxuLHQpe3JldHVybiBlWzBdPU1hdGgubWF4KG5bMF0sdFswXSksZVsxXT1NYXRoLm1heChuWzFdLHRbMV0pLGVbMl09TWF0aC5tYXgoblsyXSx0WzJdKSxlWzNdPU1hdGgubWF4KG5bM10sdFszXSksZX0sdmVjNC5zY2FsZT1mdW5jdGlvbihlLG4sdCl7cmV0dXJuIGVbMF09blswXSp0LGVbMV09blsxXSp0LGVbMl09blsyXSp0LGVbM109blszXSp0LGV9LHZlYzQuc2NhbGVBbmRBZGQ9ZnVuY3Rpb24oZSxuLHQscil7cmV0dXJuIGVbMF09blswXSt0WzBdKnIsZVsxXT1uWzFdK3RbMV0qcixlWzJdPW5bMl0rdFsyXSpyLGVbM109blszXSt0WzNdKnIsZX0sdmVjNC5kaXN0YW5jZT1mdW5jdGlvbihlLG4pe3ZhciB0PW5bMF0tZVswXSxyPW5bMV0tZVsxXSxjPW5bMl0tZVsyXSx1PW5bM10tZVszXTtyZXR1cm4gTWF0aC5zcXJ0KHQqdCtyKnIrYypjK3UqdSl9LHZlYzQuZGlzdD12ZWM0LmRpc3RhbmNlLHZlYzQuc3F1YXJlZERpc3RhbmNlPWZ1bmN0aW9uKGUsbil7dmFyIHQ9blswXS1lWzBdLHI9blsxXS1lWzFdLGM9blsyXS1lWzJdLHU9blszXS1lWzNdO3JldHVybiB0KnQrcipyK2MqYyt1KnV9LHZlYzQuc3FyRGlzdD12ZWM0LnNxdWFyZWREaXN0YW5jZSx2ZWM0Lmxlbmd0aD1mdW5jdGlvbihlKXt2YXIgbj1lWzBdLHQ9ZVsxXSxyPWVbMl0sYz1lWzNdO3JldHVybiBNYXRoLnNxcnQobipuK3QqdCtyKnIrYypjKX0sdmVjNC5sZW49dmVjNC5sZW5ndGgsdmVjNC5zcXVhcmVkTGVuZ3RoPWZ1bmN0aW9uKGUpe3ZhciBuPWVbMF0sdD1lWzFdLHI9ZVsyXSxjPWVbM107cmV0dXJuIG4qbit0KnQrcipyK2MqY30sdmVjNC5zcXJMZW49dmVjNC5zcXVhcmVkTGVuZ3RoLHZlYzQubmVnYXRlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGVbMF09LW5bMF0sZVsxXT0tblsxXSxlWzJdPS1uWzJdLGVbM109LW5bM10sZX0sdmVjNC5pbnZlcnNlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGVbMF09MS9uWzBdLGVbMV09MS9uWzFdLGVbMl09MS9uWzJdLGVbM109MS9uWzNdLGV9LHZlYzQubm9ybWFsaXplPWZ1bmN0aW9uKGUsbil7dmFyIHQ9blswXSxyPW5bMV0sYz1uWzJdLHU9blszXSxhPXQqdCtyKnIrYypjK3UqdTtyZXR1cm4gYT4wJiYoYT0xL01hdGguc3FydChhKSxlWzBdPXQqYSxlWzFdPXIqYSxlWzJdPWMqYSxlWzNdPXUqYSksZX0sdmVjNC5kb3Q9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZVswXSpuWzBdK2VbMV0qblsxXStlWzJdKm5bMl0rZVszXSpuWzNdfSx2ZWM0LmxlcnA9ZnVuY3Rpb24oZSxuLHQscil7dmFyIGM9blswXSx1PW5bMV0sYT1uWzJdLHY9blszXTtyZXR1cm4gZVswXT1jK3IqKHRbMF0tYyksZVsxXT11K3IqKHRbMV0tdSksZVsyXT1hK3IqKHRbMl0tYSksZVszXT12K3IqKHRbM10tdiksZX0sdmVjNC5yYW5kb209ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbj1ufHwxLGVbMF09Z2xNYXRyaXguUkFORE9NKCksZVsxXT1nbE1hdHJpeC5SQU5ET00oKSxlWzJdPWdsTWF0cml4LlJBTkRPTSgpLGVbM109Z2xNYXRyaXguUkFORE9NKCksdmVjNC5ub3JtYWxpemUoZSxlKSx2ZWM0LnNjYWxlKGUsZSxuKSxlfSx2ZWM0LnRyYW5zZm9ybU1hdDQ9ZnVuY3Rpb24oZSxuLHQpe3ZhciByPW5bMF0sYz1uWzFdLHU9blsyXSxhPW5bM107cmV0dXJuIGVbMF09dFswXSpyK3RbNF0qYyt0WzhdKnUrdFsxMl0qYSxlWzFdPXRbMV0qcit0WzVdKmMrdFs5XSp1K3RbMTNdKmEsZVsyXT10WzJdKnIrdFs2XSpjK3RbMTBdKnUrdFsxNF0qYSxlWzNdPXRbM10qcit0WzddKmMrdFsxMV0qdSt0WzE1XSphLGV9LHZlYzQudHJhbnNmb3JtUXVhdD1mdW5jdGlvbihlLG4sdCl7dmFyIHI9blswXSxjPW5bMV0sdT1uWzJdLGE9dFswXSx2PXRbMV0saT10WzJdLG89dFszXSxmPW8qcit2KnUtaSpjLHM9bypjK2kqci1hKnUsbD1vKnUrYSpjLXYqcixNPS1hKnItdipjLWkqdTtyZXR1cm4gZVswXT1mKm8rTSotYStzKi1pLWwqLXYsZVsxXT1zKm8rTSotditsKi1hLWYqLWksZVsyXT1sKm8rTSotaStmKi12LXMqLWEsZVszXT1uWzNdLGV9LHZlYzQuZm9yRWFjaD1mdW5jdGlvbigpe3ZhciBlPXZlYzQuY3JlYXRlKCk7cmV0dXJuIGZ1bmN0aW9uKG4sdCxyLGMsdSxhKXt2YXIgdixpO2Zvcih0fHwodD00KSxyfHwocj0wKSxpPWM/TWF0aC5taW4oYyp0K3Isbi5sZW5ndGgpOm4ubGVuZ3RoLHY9cjtpPnY7dis9dCllWzBdPW5bdl0sZVsxXT1uW3YrMV0sZVsyXT1uW3YrMl0sZVszXT1uW3YrM10sdShlLGUsYSksblt2XT1lWzBdLG5bdisxXT1lWzFdLG5bdisyXT1lWzJdLG5bdiszXT1lWzNdO3JldHVybiBufX0oKSx2ZWM0LnN0cj1mdW5jdGlvbihlKXtyZXR1cm5cInZlYzQoXCIrZVswXStcIiwgXCIrZVsxXStcIiwgXCIrZVsyXStcIiwgXCIrZVszXStcIilcIn0sbW9kdWxlLmV4cG9ydHM9dmVjNDtcbn0se1wiLi9jb21tb24uanNcIjoxMTd9XSwxMjY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuZXhwb3J0cy5yZWFkPWZ1bmN0aW9uKGEsbyx0LHIsaCl7dmFyIE0scCx3PTgqaC1yLTEsZj0oMTw8dyktMSxlPWY+PjEsaT0tNyxOPXQ/aC0xOjAsbj10Py0xOjEscz1hW28rTl07Zm9yKE4rPW4sTT1zJigxPDwtaSktMSxzPj49LWksaSs9dztpPjA7TT0yNTYqTSthW28rTl0sTis9bixpLT04KTtmb3IocD1NJigxPDwtaSktMSxNPj49LWksaSs9cjtpPjA7cD0yNTYqcCthW28rTl0sTis9bixpLT04KTtpZigwPT09TSlNPTEtZTtlbHNle2lmKE09PT1mKXJldHVybiBwP05hTjoocz8tMToxKSooMS8wKTtwKz1NYXRoLnBvdygyLHIpLE0tPWV9cmV0dXJuKHM/LTE6MSkqcCpNYXRoLnBvdygyLE0tcil9LGV4cG9ydHMud3JpdGU9ZnVuY3Rpb24oYSxvLHQscixoLE0pe3ZhciBwLHcsZixlPTgqTS1oLTEsaT0oMTw8ZSktMSxOPWk+PjEsbj0yMz09PWg/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLHM9cj8wOk0tMSx1PXI/MTotMSxsPTA+b3x8MD09PW8mJjA+MS9vPzE6MDtmb3Iobz1NYXRoLmFicyhvKSxpc05hTihvKXx8bz09PTEvMD8odz1pc05hTihvKT8xOjAscD1pKToocD1NYXRoLmZsb29yKE1hdGgubG9nKG8pL01hdGguTE4yKSxvKihmPU1hdGgucG93KDIsLXApKTwxJiYocC0tLGYqPTIpLG8rPXArTj49MT9uL2Y6bipNYXRoLnBvdygyLDEtTiksbypmPj0yJiYocCsrLGYvPTIpLHArTj49aT8odz0wLHA9aSk6cCtOPj0xPyh3PShvKmYtMSkqTWF0aC5wb3coMixoKSxwKz1OKToodz1vKk1hdGgucG93KDIsTi0xKSpNYXRoLnBvdygyLGgpLHA9MCkpO2g+PTg7YVt0K3NdPTI1NSZ3LHMrPXUsdy89MjU2LGgtPTgpO2ZvcihwPXA8PGh8dyxlKz1oO2U+MDthW3Qrc109MjU1JnAscys9dSxwLz0yNTYsZS09OCk7YVt0K3MtdV18PTEyOCpsfTtcbn0se31dLDEyNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX06bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lO3ZhciBvPWZ1bmN0aW9uKCl7fTtvLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgbyx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fTtcbn0se31dLDEyODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjb25zdGFudChyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcn19ZnVuY3Rpb24gaW50ZXJwb2xhdGVOdW1iZXIocix0LG4pe3JldHVybiByKigxLW4pK3Qqbn1mdW5jdGlvbiBpbnRlcnBvbGF0ZUFycmF5KHIsdCxuKXtmb3IodmFyIGU9W10sbz0wO288ci5sZW5ndGg7bysrKWVbb109aW50ZXJwb2xhdGVOdW1iZXIocltvXSx0W29dLG4pO3JldHVybiBlfWV4cG9ydHMuaW50ZXJwb2xhdGVkPWZ1bmN0aW9uKHIpe2lmKCFyLnN0b3BzKXJldHVybiBjb25zdGFudChyKTt2YXIgdD1yLnN0b3BzLG49ci5iYXNlfHwxLGU9QXJyYXkuaXNBcnJheSh0WzBdWzFdKT9pbnRlcnBvbGF0ZUFycmF5OmludGVycG9sYXRlTnVtYmVyO3JldHVybiBmdW5jdGlvbihyKXtmb3IodmFyIG8sYSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciB1PXRbaV07aWYodVswXTw9ciYmKG89dSksdVswXT5yKXthPXU7YnJlYWt9fWlmKG8mJmEpe3ZhciBzPWFbMF0tb1swXSxmPXItb1swXSxwPTE9PT1uP2YvczooTWF0aC5wb3cobixmKS0xKS8oTWF0aC5wb3cobixzKS0xKTtyZXR1cm4gZShvWzFdLGFbMV0scCl9cmV0dXJuIG8/b1sxXTphP2FbMV06dm9pZCAwfX0sZXhwb3J0c1tcInBpZWNld2lzZS1jb25zdGFudFwiXT1mdW5jdGlvbihyKXtpZighci5zdG9wcylyZXR1cm4gY29uc3RhbnQocik7dmFyIHQ9ci5zdG9wcztyZXR1cm4gZnVuY3Rpb24ocil7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspaWYodFtuXVswXT5yKXJldHVybiB0WzA9PT1uPzA6bi0xXVsxXTtyZXR1cm4gdFt0Lmxlbmd0aC0xXVsxXX19O1xufSx7fV0sMTI5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciByZWZlcmVuY2U9cmVxdWlyZShcIi4uLy4uL3JlZmVyZW5jZS9sYXRlc3QubWluLmpzXCIpLHZhbGlkYXRlPXJlcXVpcmUoXCIuL3BhcnNlZFwiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gdmFsaWRhdGUoZSxyZWZlcmVuY2UpfTtcbn0se1wiLi4vLi4vcmVmZXJlbmNlL2xhdGVzdC5taW4uanNcIjoxMzIsXCIuL3BhcnNlZFwiOjEzMH1dLDEzMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0eXBlb2ZfKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTnVtYmVyP1wibnVtYmVyXCI6ZSBpbnN0YW5jZW9mIFN0cmluZz9cInN0cmluZ1wiOmUgaW5zdGFuY2VvZiBCb29sZWFuP1wiYm9vbGVhblwiOkFycmF5LmlzQXJyYXkoZSk/XCJhcnJheVwiOm51bGw9PT1lP1wibnVsbFwiOnR5cGVvZiBlfWZ1bmN0aW9uIHVuYnVuZGxlKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTnVtYmVyfHxlIGluc3RhbmNlb2YgU3RyaW5nfHxlIGluc3RhbmNlb2YgQm9vbGVhbj9lLnZhbHVlT2YoKTplfXZhciBwYXJzZUNTU0NvbG9yPXJlcXVpcmUoXCJjc3Njb2xvcnBhcnNlclwiKS5wYXJzZUNTU0NvbG9yLGZvcm1hdD1yZXF1aXJlKFwidXRpbFwiKS5mb3JtYXQ7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKGUsdCl7dmFyIHI9e21lc3NhZ2U6KGU/ZStcIjogXCI6XCJcIikrZm9ybWF0LmFwcGx5KGZvcm1hdCxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfTtudWxsIT09dCYmdm9pZCAwIT09dCYmdC5fX2xpbmVfXyYmKHIubGluZT10Ll9fbGluZV9fKSxzLnB1c2gocil9ZnVuY3Rpb24gbihlLG8saSl7dmFyIHM9dHlwZW9mXyhvKTtpZihcInN0cmluZ1wiPT09cyYmXCJAXCI9PT1vWzBdKXtpZih0LiR2ZXJzaW9uPjcpcmV0dXJuIHIoZSxvLFwiY29uc3RhbnRzIGhhdmUgYmVlbiBkZXByZWNhdGVkIGFzIG9mIHY4XCIpO2lmKCEobyBpbiBhKSlyZXR1cm4gcihlLG8sJ2NvbnN0YW50IFwiJXNcIiBub3QgZm91bmQnLG8pO289YVtvXSxzPXR5cGVvZl8obyl9aWYoaVtcImZ1bmN0aW9uXCJdJiZcIm9iamVjdFwiPT09cylyZXR1cm4gbltcImZ1bmN0aW9uXCJdKGUsbyxpKTtpZihpLnR5cGUpe3ZhciB1PW5baS50eXBlXTtpZih1KXJldHVybiB1KGUsbyxpKTtpPXRbaS50eXBlXX1uLm9iamVjdChlLG8saSl9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZnVuY3Rpb24odCxuLG8pe3ZhciBhPXR5cGVvZl8obik7YSE9PWUmJnIodCxuLFwiJXMgZXhwZWN0ZWQsICVzIGZvdW5kXCIsZSxhKSxcIm1pbmltdW1cImluIG8mJm48by5taW5pbXVtJiZyKHQsbixcIiVzIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSB2YWx1ZSAlc1wiLG4sby5taW5pbXVtKSxcIm1heGltdW1cImluIG8mJm4+by5tYXhpbXVtJiZyKHQsbixcIiVzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSAlc1wiLG4sby5tYXhpbXVtKX19dmFyIGE9ZS5jb25zdGFudHN8fHt9LGk9e30scz1bXTtyZXR1cm4gbi5jb25zdGFudHM9ZnVuY3Rpb24oZSxuKXtpZih0LiR2ZXJzaW9uPjcpe2lmKG4pcmV0dXJuIHIoZSxuLFwiY29uc3RhbnRzIGhhdmUgYmVlbiBkZXByZWNhdGVkIGFzIG9mIHY4XCIpfWVsc2V7dmFyIG89dHlwZW9mXyhuKTtpZihcIm9iamVjdFwiIT09bylyZXR1cm4gcihlLG4sXCJvYmplY3QgZXhwZWN0ZWQsICVzIGZvdW5kXCIsbyk7Zm9yKHZhciBhIGluIG4pXCJAXCIhPT1hWzBdJiZyKGUrXCIuXCIrYSxuW2FdLCdjb25zdGFudHMgbXVzdCBzdGFydCB3aXRoIFwiQFwiJyl9fSxuLnNvdXJjZT1mdW5jdGlvbihlLG8pe2lmKCFvLnR5cGUpcmV0dXJuIHZvaWQgcihlLG8sJ1widHlwZVwiIGlzIHJlcXVpcmVkJyk7dmFyIGE9dW5idW5kbGUoby50eXBlKTtzd2l0Y2goYSl7Y2FzZVwidmVjdG9yXCI6Y2FzZVwicmFzdGVyXCI6aWYobi5vYmplY3QoZSxvLHQuc291cmNlX3RpbGUpLFwidXJsXCJpbiBvKWZvcih2YXIgaSBpbiBvKVtcInR5cGVcIixcInVybFwiLFwidGlsZVNpemVcIl0uaW5kZXhPZihpKTwwJiZyKGUrXCIuXCIraSxvW2ldLCdhIHNvdXJjZSB3aXRoIGEgXCJ1cmxcIiBwcm9wZXJ0eSBtYXkgbm90IGluY2x1ZGUgYSBcIiVzXCIgcHJvcGVydHknLGkpO2JyZWFrO2Nhc2VcImdlb2pzb25cIjpuLm9iamVjdChlLG8sdC5zb3VyY2VfZ2VvanNvbik7YnJlYWs7Y2FzZVwidmlkZW9cIjpuLm9iamVjdChlLG8sdC5zb3VyY2VfdmlkZW8pO2JyZWFrO2Nhc2VcImltYWdlXCI6bi5vYmplY3QoZSxvLHQuc291cmNlX2ltYWdlKTticmVhaztkZWZhdWx0Om5bXCJlbnVtXCJdKGUrXCIudHlwZVwiLG8udHlwZSx7dmFsdWVzOltcInZlY3RvclwiLFwicmFzdGVyXCIsXCJnZW9qc29uXCIsXCJ2aWRlb1wiLFwiaW1hZ2VcIl19KX19LG4ubGF5ZXI9ZnVuY3Rpb24obyxhKXthLnR5cGV8fGEucmVmfHxyKG8sYSwnZWl0aGVyIFwidHlwZVwiIG9yIFwicmVmXCIgaXMgcmVxdWlyZWQnKTt2YXIgcz11bmJ1bmRsZShhLnR5cGUpLHU9dW5idW5kbGUoYS5yZWYpO2lmKGEuaWQmJihpW2EuaWRdP3IobyxhLmlkLCdkdXBsaWNhdGUgbGF5ZXIgaWQgXCIlc1wiLCBwcmV2aW91c2x5IHVzZWQgYXQgbGluZSAlZCcsYS5pZCxpW2EuaWRdKTppW2EuaWRdPWEuaWQuX19saW5lX18pLFwicmVmXCJpbiBhKXtbXCJ0eXBlXCIsXCJzb3VyY2VcIixcInNvdXJjZS1sYXllclwiLFwiZmlsdGVyXCIsXCJsYXlvdXRcIl0uZm9yRWFjaChmdW5jdGlvbihlKXtlIGluIGEmJnIobyxhW2VdLCdcIiVzXCIgaXMgcHJvaGliaXRlZCBmb3IgcmVmIGxheWVycycsZSl9KTt2YXIgYztlLmxheWVycy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuaWQ9PXUmJihjPWUpfSksYz9jLnJlZj9yKG8sYS5yZWYsXCJyZWYgY2Fubm90IHJlZmVyZW5jZSBhbm90aGVyIHJlZiBsYXllclwiKTpzPWMudHlwZTpyKG8sYS5yZWYsJ3JlZiBsYXllciBcIiVzXCIgbm90IGZvdW5kJyx1KX1lbHNlIGlmKFwiYmFja2dyb3VuZFwiIT09cylpZihhLnNvdXJjZSl7dmFyIGY9ZS5zb3VyY2VzW2Euc291cmNlXTtmP1widmVjdG9yXCI9PWYudHlwZSYmXCJyYXN0ZXJcIj09cz9yKG8sYS5zb3VyY2UsJ2xheWVyIFwiJXNcIiByZXF1aXJlcyBhIHJhc3RlciBzb3VyY2UnLGEuaWQpOlwicmFzdGVyXCI9PWYudHlwZSYmXCJyYXN0ZXJcIiE9cz9yKG8sYS5zb3VyY2UsJ2xheWVyIFwiJXNcIiByZXF1aXJlcyBhIHZlY3RvciBzb3VyY2UnLGEuaWQpOlwidmVjdG9yXCIhPWYudHlwZXx8YVtcInNvdXJjZS1sYXllclwiXXx8cihvLGEsJ2xheWVyIFwiJXNcIiBtdXN0IHNwZWNpZnkgYSBcInNvdXJjZS1sYXllclwiJyxhLmlkKTpyKG8sYS5zb3VyY2UsJ3NvdXJjZSBcIiVzXCIgbm90IGZvdW5kJyxhLnNvdXJjZSl9ZWxzZSByKG8sYSwnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInNvdXJjZVwiJyk7bi5vYmplY3QobyxhLHQubGF5ZXIse2ZpbHRlcjpuLmZpbHRlcixsYXlvdXQ6ZnVuY3Rpb24oZSxyKXt2YXIgbz10W1wibGF5b3V0X1wiK3NdO3JldHVybiBzJiZvJiZuKGUscixvKX0scGFpbnQ6ZnVuY3Rpb24oZSxyKXt2YXIgbz10W1wicGFpbnRfXCIrc107cmV0dXJuIHMmJm8mJm4oZSxyLG8pfX0pfSxuLm9iamVjdD1mdW5jdGlvbihlLG8sYSxpKXtpPWl8fHt9O3ZhciBzPXR5cGVvZl8obyk7aWYoXCJvYmplY3RcIiE9PXMpcmV0dXJuIHIoZSxvLFwib2JqZWN0IGV4cGVjdGVkLCAlcyBmb3VuZFwiLHMpO2Zvcih2YXIgdSBpbiBvKXt2YXIgYz11LnNwbGl0KFwiLlwiKVswXSxmPWFbY118fGFbXCIqXCJdLGw9Yy5tYXRjaCgvXiguKiktdHJhbnNpdGlvbiQvKTtmPyhpW2NdfHxuKSgoZT9lK1wiLlwiOmUpK3Usb1t1XSxmKTpsJiZhW2xbMV1dJiZhW2xbMV1dLnRyYW5zaXRpb24/bigoZT9lK1wiLlwiOmUpK3Usb1t1XSx0LnRyYW5zaXRpb24pOlwiXCIhPT1lJiYxIT09ZS5zcGxpdChcIi5cIikubGVuZ3RoJiZyKGUsb1t1XSwndW5rbm93biBwcm9wZXJ0eSBcIiVzXCInLHUpfWZvcih2YXIgcCBpbiBhKWFbcF0ucmVxdWlyZWQmJnZvaWQgMD09PWFbcF1bXCJkZWZhdWx0XCJdJiZ2b2lkIDA9PT1vW3BdJiZyKGUsbywnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcIiVzXCInLHApfSxuLmFycmF5PWZ1bmN0aW9uKHQsbyxhLGkpe2lmKFwiYXJyYXlcIiE9PXR5cGVvZl8obykpcmV0dXJuIHIodCxvLFwiYXJyYXkgZXhwZWN0ZWQsICVzIGZvdW5kXCIsdHlwZW9mXyhvKSk7aWYoYS5sZW5ndGgmJm8ubGVuZ3RoIT09YS5sZW5ndGgpcmV0dXJuIHIodCxvLFwiYXJyYXkgbGVuZ3RoICVkIGV4cGVjdGVkLCBsZW5ndGggJWQgZm91bmRcIixhLmxlbmd0aCxvLmxlbmd0aCk7aWYoYVtcIm1pbi1sZW5ndGhcIl0mJm8ubGVuZ3RoPGFbXCJtaW4tbGVuZ3RoXCJdKXJldHVybiByKHQsbyxcImFycmF5IGxlbmd0aCBhdCBsZWFzdCAlZCBleHBlY3RlZCwgbGVuZ3RoICVkIGZvdW5kXCIsYVtcIm1pbi1sZW5ndGhcIl0sby5sZW5ndGgpO3ZhciBzPXt0eXBlOmEudmFsdWV9O2UudmVyc2lvbjw3JiYoc1tcImZ1bmN0aW9uXCJdPWFbXCJmdW5jdGlvblwiXSksXCJvYmplY3RcIj09PXR5cGVvZl8oYS52YWx1ZSkmJihzPWEudmFsdWUpO2Zvcih2YXIgdT0wO3U8by5sZW5ndGg7dSsrKShpfHxuKSh0K1wiW1wiK3UrXCJdXCIsb1t1XSxzKX0sbi5maWx0ZXI9ZnVuY3Rpb24oZSxvKXt2YXIgYTtpZihcImFycmF5XCIhPT10eXBlb2ZfKG8pKXJldHVybiByKGUsbyxcImFycmF5IGV4cGVjdGVkLCAlcyBmb3VuZFwiLHR5cGVvZl8obykpO2lmKG8ubGVuZ3RoPDEpcmV0dXJuIHIoZSxvLFwiZmlsdGVyIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCAxIGVsZW1lbnRcIik7c3dpdGNoKG5bXCJlbnVtXCJdKGUrXCJbMF1cIixvWzBdLHQuZmlsdGVyX29wZXJhdG9yKSx1bmJ1bmRsZShvWzBdKSl7Y2FzZVwiPFwiOmNhc2VcIjw9XCI6Y2FzZVwiPlwiOmNhc2VcIj49XCI6by5sZW5ndGg+PTImJlwiJHR5cGVcIj09b1sxXSYmcihlLG8sJ1wiJHR5cGVcIiBjYW5ub3QgYmUgdXNlIHdpdGggb3BlcmF0b3IgXCIlc1wiJyxvWzBdKTtjYXNlXCI9PVwiOmNhc2VcIiE9XCI6MyE9by5sZW5ndGgmJnIoZSxvLCdmaWx0ZXIgYXJyYXkgZm9yIG9wZXJhdG9yIFwiJXNcIiBtdXN0IGhhdmUgMyBlbGVtZW50cycsb1swXSk7Y2FzZVwiaW5cIjpjYXNlXCIhaW5cIjpvLmxlbmd0aD49MiYmKGE9dHlwZW9mXyhvWzFdKSxcInN0cmluZ1wiIT09YT9yKGUrXCJbMV1cIixvWzFdLFwic3RyaW5nIGV4cGVjdGVkLCAlcyBmb3VuZFwiLGEpOlwiQFwiPT09b1sxXVswXSYmcihlK1wiWzFdXCIsb1sxXSxcImZpbHRlciBrZXkgY2Fubm90IGJlIGEgY29uc3RhbnRcIikpO2Zvcih2YXIgaT0yO2k8by5sZW5ndGg7aSsrKWE9dHlwZW9mXyhvW2ldKSxcIiR0eXBlXCI9PW9bMV0/bltcImVudW1cIl0oZStcIltcIitpK1wiXVwiLG9baV0sdC5nZW9tZXRyeV90eXBlKTpcInN0cmluZ1wiPT09YSYmXCJAXCI9PT1vW2ldWzBdP3IoZStcIltcIitpK1wiXVwiLG9baV0sXCJmaWx0ZXIgdmFsdWUgY2Fubm90IGJlIGEgY29uc3RhbnRcIik6XCJzdHJpbmdcIiE9PWEmJlwibnVtYmVyXCIhPT1hJiZcImJvb2xlYW5cIiE9PWEmJnIoZStcIltcIitpK1wiXVwiLG9baV0sXCJzdHJpbmcsIG51bWJlciwgb3IgYm9vbGVhbiBleHBlY3RlZCwgJXMgZm91bmRcIixhKTticmVhaztjYXNlXCJhbnlcIjpjYXNlXCJhbGxcIjpjYXNlXCJub25lXCI6Zm9yKGk9MTtpPG8ubGVuZ3RoO2krKyluLmZpbHRlcihlK1wiW1wiK2krXCJdXCIsb1tpXSl9fSxuW1wiZnVuY3Rpb25cIl09ZnVuY3Rpb24oZSxvLGEpe24ub2JqZWN0KGUsbyx0W1wiZnVuY3Rpb25cIl0se3N0b3BzOmZ1bmN0aW9uKGUsdCxvKXt2YXIgaT0tKDEvMCk7bi5hcnJheShlLHQsbyxmdW5jdGlvbihlLHQpe3JldHVyblwiYXJyYXlcIiE9PXR5cGVvZl8odCk/cihlLHQsXCJhcnJheSBleHBlY3RlZCwgJXMgZm91bmRcIix0eXBlb2ZfKHQpKToyIT09dC5sZW5ndGg/cihlLHQsXCJhcnJheSBsZW5ndGggJWQgZXhwZWN0ZWQsIGxlbmd0aCAlZCBmb3VuZFwiLDIsdC5sZW5ndGgpOihuKGUrXCJbMF1cIix0WzBdLHt0eXBlOlwibnVtYmVyXCJ9KSxuKGUrXCJbMV1cIix0WzFdLGEpLHZvaWQoXCJudW1iZXJcIj09PXR5cGVvZl8odFswXSkmJihcInBpZWNld2lzZS1jb25zdGFudFwiPT09YVtcImZ1bmN0aW9uXCJdJiZ0WzBdJTEhPT0wJiZyKGUrXCJbMF1cIix0WzBdLFwiem9vbSBsZXZlbCBmb3IgcGllY2V3aXNlLWNvbnN0YW50IGZ1bmN0aW9ucyBtdXN0IGJlIGFuIGludGVnZXJcIiksdFswXTw9aSYmcihlK1wiWzBdXCIsdFswXSxcImFycmF5IHN0b3BzIG11c3QgYXBwZWFyIGluIGFzY2VuZGluZyBvcmRlciBhbmQgaGF2ZSBubyBkdXBsaWNhdGVzXCIpLGk9dFswXSkpKX0pLFwiYXJyYXlcIj09PXR5cGVvZl8odCkmJjA9PT10Lmxlbmd0aCYmcihlLHQsXCJhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHN0b3BcIil9fSl9LG5bXCJlbnVtXCJdPWZ1bmN0aW9uKGUsdCxuKXstMT09PW4udmFsdWVzLmluZGV4T2YodW5idW5kbGUodCkpJiZyKGUsdCxcImV4cGVjdGVkIG9uZSBvZiBbJXNdLCAlcyBmb3VuZFwiLG4udmFsdWVzLmpvaW4oXCIsIFwiKSx0KX0sbi5jb2xvcj1mdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZl8odCk7cmV0dXJuXCJzdHJpbmdcIiE9PW4/cihlLHQsXCJjb2xvciBleHBlY3RlZCwgJXMgZm91bmRcIixuKTpudWxsPT09cGFyc2VDU1NDb2xvcih0KT9yKGUsdCwnY29sb3IgZXhwZWN0ZWQsIFwiJXNcIiBmb3VuZCcsdCk6dm9pZCAwfSxuLm51bWJlcj1vKFwibnVtYmVyXCIpLG4uc3RyaW5nPW8oXCJzdHJpbmdcIiksbltcImJvb2xlYW5cIl09byhcImJvb2xlYW5cIiksbltcIipcIl09ZnVuY3Rpb24oKXt9LG4oXCJcIixlLHQuJHJvb3QpLHQuJHZlcnNpb24+NyYmZS5jb25zdGFudHMmJm4uY29uc3RhbnRzKFwiY29uc3RhbnRzXCIsZS5jb25zdGFudHMpLHMuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLmxpbmUtdC5saW5lfSksc307XG59LHtcImNzc2NvbG9ycGFyc2VyXCI6MTA3LFwidXRpbFwiOjE0M31dLDEzMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cz1yZXF1aXJlKFwiLi92OC5qc29uXCIpO1xufSx7XCIuL3Y4Lmpzb25cIjoxMzN9XSwxMzI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHM9cmVxdWlyZShcIi4vdjgubWluLmpzb25cIik7XG59LHtcIi4vdjgubWluLmpzb25cIjoxMzR9XSwxMzM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHM9e1wiJHZlcnNpb25cIjo4LFwiJHJvb3RcIjp7XCJ2ZXJzaW9uXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6WzhdLFwiZG9jXCI6XCJTdHlsZXNoZWV0IHZlcnNpb24gbnVtYmVyLiBNdXN0IGJlIDguXCIsXCJleGFtcGxlXCI6OH0sXCJuYW1lXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJkb2NcIjpcIkEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhlIHN0eWxlLlwiLFwiZXhhbXBsZVwiOlwiQnJpZ2h0XCJ9LFwibWV0YWRhdGFcIjp7XCJ0eXBlXCI6XCIqXCIsXCJkb2NcIjpcIkFyYml0cmFyeSBwcm9wZXJ0aWVzIHVzZWZ1bCB0byB0cmFjayB3aXRoIHRoZSBzdHlsZXNoZWV0LCBidXQgZG8gbm90IGluZmx1ZW5jZSByZW5kZXJpbmcuIFByb3BlcnRpZXMgc2hvdWxkIGJlIHByZWZpeGVkIHRvIGF2b2lkIGNvbGxpc2lvbnMsIGxpa2UgJ21hcGJveDonLlwifSxcImNlbnRlclwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJkb2NcIjpcIkRlZmF1bHQgbWFwIGNlbnRlciBpbiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLiAgVGhlIHN0eWxlIGNlbnRlciB3aWxsIGJlIHVzZWQgb25seSBpZiB0aGUgbWFwIGhhcyBub3QgYmVlbiBwb3NpdGlvbmVkIGJ5IG90aGVyIG1lYW5zIChlLmcuIG1hcCBvcHRpb25zIG9yIHVzZXIgaW50ZXJhY3Rpb24pLlwiLFwiZXhhbXBsZVwiOlstNzMuOTc0OSw0MC43NzM2XX0sXCJ6b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkb2NcIjpcIkRlZmF1bHQgem9vbSBsZXZlbC4gIFRoZSBzdHlsZSB6b29tIHdpbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBtYXAgaGFzIG5vdCBiZWVuIHBvc2l0aW9uZWQgYnkgb3RoZXIgbWVhbnMgKGUuZy4gbWFwIG9wdGlvbnMgb3IgdXNlciBpbnRlcmFjdGlvbikuXCIsXCJleGFtcGxlXCI6MTIuNX0sXCJiZWFyaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJkb2NcIjpcIkRlZmF1bHQgYmVhcmluZywgaW4gZGVncmVlcy4gIFRoZSBzdHlsZSBiZWFyaW5nIHdpbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBtYXAgaGFzIG5vdCBiZWVuIHBvc2l0aW9uZWQgYnkgb3RoZXIgbWVhbnMgKGUuZy4gbWFwIG9wdGlvbnMgb3IgdXNlciBpbnRlcmFjdGlvbikuXCIsXCJleGFtcGxlXCI6Mjl9LFwicGl0Y2hcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwidW5pdHNcIjpcImRlZ3JlZXNcIixcImRvY1wiOlwiRGVmYXVsdCBwaXRjaCwgaW4gZGVncmVlcy4gWmVybyBpcyBwZXJwZW5kaWN1bGFyIHRvIHRoZSBzdXJmYWNlLiAgVGhlIHN0eWxlIHBpdGNoIHdpbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBtYXAgaGFzIG5vdCBiZWVuIHBvc2l0aW9uZWQgYnkgb3RoZXIgbWVhbnMgKGUuZy4gbWFwIG9wdGlvbnMgb3IgdXNlciBpbnRlcmFjdGlvbikuXCIsXCJleGFtcGxlXCI6NTB9LFwic291cmNlc1wiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcInNvdXJjZXNcIixcImRvY1wiOlwiRGF0YSBzb3VyY2Ugc3BlY2lmaWNhdGlvbnMuXCIsXCJleGFtcGxlXCI6e1wibWFwYm94LXN0cmVldHNcIjp7XCJ0eXBlXCI6XCJ2ZWN0b3JcIixcInVybFwiOlwibWFwYm94Oi8vbWFwYm94Lm1hcGJveC1zdHJlZXRzLXY2XCJ9fX0sXCJzcHJpdGVcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiQSBiYXNlIFVSTCBmb3IgcmV0cmlldmluZyB0aGUgc3ByaXRlIGltYWdlIGFuZCBtZXRhZGF0YS4gVGhlIGV4dGVuc2lvbnMgYC5wbmdgLCBgLmpzb25gIGFuZCBzY2FsZSBmYWN0b3IgYEAyeC5wbmdgIHdpbGwgYmUgYXV0b21hdGljYWxseSBhcHBlbmRlZC5cIixcImV4YW1wbGVcIjpcIm1hcGJveDovL3Nwcml0ZXMvbWFwYm94L2JyaWdodC12OFwifSxcImdseXBoc1wiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZG9jXCI6XCJBIFVSTCB0ZW1wbGF0ZSBmb3IgbG9hZGluZyBzaWduZWQtZGlzdGFuY2UtZmllbGQgZ2x5cGggc2V0cyBpbiBQQkYgZm9ybWF0LiBWYWxpZCB0b2tlbnMgYXJlIHtmb250c3RhY2t9IGFuZCB7cmFuZ2V9LlwiLFwiZXhhbXBsZVwiOlwibWFwYm94Oi8vZm9udHMvbWFwYm94L3tmb250c3RhY2t9L3tyYW5nZX0ucGJmXCJ9LFwidHJhbnNpdGlvblwiOntcInR5cGVcIjpcInRyYW5zaXRpb25cIixcImRvY1wiOlwiQSBnbG9iYWwgdHJhbnNpdGlvbiBkZWZpbml0aW9uIHRvIHVzZSBhcyBhIGRlZmF1bHQgYWNyb3NzIHByb3BlcnRpZXMuXCIsXCJleGFtcGxlXCI6e1wiZHVyYXRpb25cIjozMDAsXCJkZWxheVwiOjB9fSxcImxheWVyc1wiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibGF5ZXJcIixcImRvY1wiOlwiTGF5ZXJzIHdpbGwgYmUgZHJhd24gaW4gdGhlIG9yZGVyIG9mIHRoaXMgYXJyYXkuXCIsXCJleGFtcGxlXCI6W3tcImlkXCI6XCJ3YXRlclwiLFwic291cmNlXCI6XCJtYXBib3gtc3RyZWV0c1wiLFwic291cmNlLWxheWVyXCI6XCJ3YXRlclwiLFwidHlwZVwiOlwiZmlsbFwiLFwicGFpbnRcIjp7XCJmaWxsLWNvbG9yXCI6XCIjMDBmZmZmXCJ9fV19fSxcInNvdXJjZXNcIjp7XCIqXCI6e1widHlwZVwiOlwic291cmNlXCIsXCJkb2NcIjpcIlNwZWNpZmljYXRpb24gb2YgYSBkYXRhIHNvdXJjZS4gRm9yIHZlY3RvciBhbmQgcmFzdGVyIHNvdXJjZXMsIGVpdGhlciBUaWxlSlNPTiBvciBhIFVSTCB0byBhIFRpbGVKU09OIG11c3QgYmUgcHJvdmlkZWQuIEZvciBHZW9KU09OIGFuZCB2aWRlbyBzb3VyY2VzLCBhIFVSTCBtdXN0IGJlIHByb3ZpZGVkLlwifX0sXCJzb3VyY2VcIjpbXCJzb3VyY2VfdGlsZVwiLFwic291cmNlX2dlb2pzb25cIixcInNvdXJjZV92aWRlb1wiLFwic291cmNlX2ltYWdlXCJdLFwic291cmNlX3RpbGVcIjp7XCJ0eXBlXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1widmVjdG9yXCIsXCJyYXN0ZXJcIl0sXCJkb2NcIjpcIlRoZSBkYXRhIHR5cGUgb2YgdGhlIHRpbGUgc291cmNlLlwifSxcInVybFwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZG9jXCI6XCJBIFVSTCB0byBhIFRpbGVKU09OIHJlc291cmNlLiBTdXBwb3J0ZWQgcHJvdG9jb2xzIGFyZSBgaHR0cDpgLCBgaHR0cHM6YCwgYW5kIGBtYXBib3g6Ly88bWFwaWQ+YC5cIn0sXCJ0aWxlc1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCIsXCJkb2NcIjpcIkFuIGFycmF5IG9mIG9uZSBvciBtb3JlIHRpbGUgc291cmNlIFVSTHMsIGFzIGluIHRoZSBUaWxlSlNPTiBzcGVjLlwifSxcIm1pbnpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwiZG9jXCI6XCJNaW5pbXVtIHpvb20gbGV2ZWwgZm9yIHdoaWNoIHRpbGVzIGFyZSBhdmFpbGFibGUsIGFzIGluIHRoZSBUaWxlSlNPTiBzcGVjLlwifSxcIm1heHpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoyMixcImRvY1wiOlwiTWF4aW11bSB6b29tIGxldmVsIGZvciB3aGljaCB0aWxlcyBhcmUgYXZhaWxhYmxlLCBhcyBpbiB0aGUgVGlsZUpTT04gc3BlYy4gRGF0YSBmcm9tIHRpbGVzIGF0IHRoZSBtYXh6b29tIGFyZSB1c2VkIHdoZW4gZGlzcGxheWluZyB0aGUgbWFwIGF0IGhpZ2hlciB6b29tIGxldmVscy5cIn0sXCJ0aWxlU2l6ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjUxMixcInVuaXRzXCI6XCJwaXhlbHNcIixcImRvY1wiOlwiVGhlIG1pbmltdW0gdmlzdWFsIHNpemUgdG8gZGlzcGxheSB0aWxlcyBmb3IgdGhpcyBsYXllci4gT25seSBjb25maWd1cmFibGUgZm9yIHJhc3RlciBsYXllcnMuXCJ9LFwiKlwiOntcInR5cGVcIjpcIipcIixcImRvY1wiOlwiT3RoZXIga2V5cyB0byBjb25maWd1cmUgdGhlIGRhdGEgc291cmNlLlwifX0sXCJzb3VyY2VfZ2VvanNvblwiOntcInR5cGVcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbXCJnZW9qc29uXCJdLFwiZG9jXCI6XCJUaGUgZGF0YSB0eXBlIG9mIHRoZSBHZW9KU09OIHNvdXJjZS5cIn0sXCJkYXRhXCI6e1widHlwZVwiOlwiKlwiLFwiZG9jXCI6XCJBIFVSTCB0byBhIEdlb0pTT04gZmlsZSwgb3IgaW5saW5lIEdlb0pTT04uXCJ9LFwibWF4em9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjE0LFwiZG9jXCI6XCJNYXhpbXVtIHpvb20gbGV2ZWwgYXQgd2hpY2ggdG8gY3JlYXRlIHZlY3RvciB0aWxlcyAoaGlnaGVyIG1lYW5zIGdyZWF0ZXIgZGV0YWlsIGF0IGhpZ2ggem9vbSBsZXZlbHMpLlwifSxcImJ1ZmZlclwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjY0LFwiZG9jXCI6XCJUaWxlIGJ1ZmZlciBzaXplIG9uIGVhY2ggc2lkZSAoaGlnaGVyIG1lYW5zIGZld2VyIHJlbmRlcmluZyBhcnRpZmFjdHMgbmVhciB0aWxlIGVkZ2VzIGJ1dCBzbG93ZXIgcGVyZm9ybWFuY2UpLlwifSxcInRvbGVyYW5jZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMsXCJkb2NcIjpcIkRvdWdsYXMtUGV1Y2tlciBzaW1wbGlmaWNhdGlvbiB0b2xlcmFuY2UgKGhpZ2hlciBtZWFucyBzaW1wbGVyIGdlb21ldHJpZXMgYW5kIGZhc3RlciBwZXJmb3JtYW5jZSkuXCJ9LFwiY2x1c3RlclwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdGhlIGRhdGEgaXMgYSBjb2xsZWN0aW9uIG9mIHBvaW50IGZlYXR1cmVzLCBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBjbHVzdGVycyB0aGUgcG9pbnRzIGJ5IHJhZGl1cyBpbnRvIGdyb3Vwcy5cIn0sXCJjbHVzdGVyUmFkaXVzXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NDAwLFwiZG9jXCI6XCJSYWRpdXMgb2YgZWFjaCBjbHVzdGVyIHdoZW4gY2x1c3RlcmluZyBwb2ludHMsIHJlbGF0aXZlIHRvIDQwOTYgdGlsZS5cIn0sXCJjbHVzdGVyTWF4Wm9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJNYXggem9vbSB0byBjbHVzdGVyIHBvaW50cyBvbi4gRGVmYXVsdHMgdG8gb25lIHpvb20gbGVzcyB0aGFuIG1heHpvb20gKHNvIHRoYXQgbGFzdCB6b29tIGZlYXR1cmVzIGFyZSBub3QgY2x1c3RlcmVkKS5cIn19LFwic291cmNlX3ZpZGVvXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcInZpZGVvXCJdLFwiZG9jXCI6XCJUaGUgZGF0YSB0eXBlIG9mIHRoZSB2aWRlbyBzb3VyY2UuXCJ9LFwidXJsc1wiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCIsXCJkb2NcIjpcIlVSTHMgdG8gdmlkZW8gY29udGVudCBpbiBvcmRlciBvZiBwcmVmZXJyZWQgZm9ybWF0LlwifSxcImNvb3JkaW5hdGVzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwiZG9jXCI6XCJDb3JuZXJzIG9mIHZpZGVvIHNwZWNpZmllZCBpbiBsb25naXR1ZGUsIGxhdGl0dWRlIHBhaXJzLlwiLFwidHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjQsXCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJsZW5ndGhcIjoyLFwidmFsdWVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJBIHNpbmdsZSBsb25naXR1ZGUsIGxhdGl0dWRlIHBhaXIuXCJ9fX0sXCJzb3VyY2VfaW1hZ2VcIjp7XCJ0eXBlXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1wiaW1hZ2VcIl0sXCJkb2NcIjpcIlRoZSBkYXRhIHR5cGUgb2YgdGhlIGltYWdlIHNvdXJjZS5cIn0sXCJ1cmxcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiVVJMIHRoYXQgcG9pbnRzIHRvIGFuIGltYWdlXCJ9LFwiY29vcmRpbmF0ZXNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJkb2NcIjpcIkNvcm5lcnMgb2YgaW1hZ2Ugc3BlY2lmaWVkIGluIGxvbmdpdHVkZSwgbGF0aXR1ZGUgcGFpcnMuXCIsXCJ0eXBlXCI6XCJhcnJheVwiLFwibGVuZ3RoXCI6NCxcInZhbHVlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJkb2NcIjpcIkEgc2luZ2xlIGxvbmdpdHVkZSwgbGF0aXR1ZGUgcGFpci5cIn19fSxcImxheWVyXCI6e1wiaWRcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiVW5pcXVlIGxheWVyIG5hbWUuXCIsXCJyZXF1aXJlZFwiOnRydWV9LFwidHlwZVwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcImZpbGxcIixcImxpbmVcIixcInN5bWJvbFwiLFwiY2lyY2xlXCIsXCJyYXN0ZXJcIixcImJhY2tncm91bmRcIl0sXCJkb2NcIjpcIlJlbmRlcmluZyB0eXBlIG9mIHRoaXMgbGF5ZXIuXCJ9LFwibWV0YWRhdGFcIjp7XCJ0eXBlXCI6XCIqXCIsXCJkb2NcIjpcIkFyYml0cmFyeSBwcm9wZXJ0aWVzIHVzZWZ1bCB0byB0cmFjayB3aXRoIHRoZSBsYXllciwgYnV0IGRvIG5vdCBpbmZsdWVuY2UgcmVuZGVyaW5nLiBQcm9wZXJ0aWVzIHNob3VsZCBiZSBwcmVmaXhlZCB0byBhdm9pZCBjb2xsaXNpb25zLCBsaWtlICdtYXBib3g6Jy5cIn0sXCJyZWZcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiUmVmZXJlbmNlcyBhbm90aGVyIGxheWVyIHRvIGNvcHkgYHR5cGVgLCBgc291cmNlYCwgYHNvdXJjZS1sYXllcmAsIGBtaW56b29tYCwgYG1heHpvb21gLCBgZmlsdGVyYCwgYW5kIGBsYXlvdXRgIHByb3BlcnRpZXMgZnJvbS4gVGhpcyBhbGxvd3MgdGhlIGxheWVycyB0byBzaGFyZSBwcm9jZXNzaW5nIGFuZCBiZSBtb3JlIGVmZmljaWVudC5cIn0sXCJzb3VyY2VcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiTmFtZSBvZiBhIHNvdXJjZSBkZXNjcmlwdGlvbiB0byBiZSB1c2VkIGZvciB0aGlzIGxheWVyLlwifSxcInNvdXJjZS1sYXllclwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZG9jXCI6XCJMYXllciB0byB1c2UgZnJvbSBhIHZlY3RvciB0aWxlIHNvdXJjZS4gUmVxdWlyZWQgaWYgdGhlIHNvdXJjZSBzdXBwb3J0cyBtdWx0aXBsZSBsYXllcnMuXCJ9LFwibWluem9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MjIsXCJkb2NcIjpcIlRoZSBtaW5pbXVtIHpvb20gbGV2ZWwgb24gd2hpY2ggdGhlIGxheWVyIGdldHMgcGFyc2VkIGFuZCBhcHBlYXJzIG9uLlwifSxcIm1heHpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjIyLFwiZG9jXCI6XCJUaGUgbWF4aW11bSB6b29tIGxldmVsIG9uIHdoaWNoIHRoZSBsYXllciBnZXRzIHBhcnNlZCBhbmQgYXBwZWFycyBvbi5cIn0sXCJpbnRlcmFjdGl2ZVwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImRvY1wiOlwiRW5hYmxlIHF1ZXJ5aW5nIG9mIGZlYXR1cmUgZGF0YSBmcm9tIHRoaXMgbGF5ZXIgZm9yIGludGVyYWN0aXZpdHkuXCIsXCJkZWZhdWx0XCI6ZmFsc2V9LFwiZmlsdGVyXCI6e1widHlwZVwiOlwiZmlsdGVyXCIsXCJkb2NcIjpcIkEgZXhwcmVzc2lvbiBzcGVjaWZ5aW5nIGNvbmRpdGlvbnMgb24gc291cmNlIGZlYXR1cmVzLiBPbmx5IGZlYXR1cmVzIHRoYXQgbWF0Y2ggdGhlIGZpbHRlciBhcmUgZGlzcGxheWVkLlwifSxcImxheW91dFwiOntcInR5cGVcIjpcImxheW91dFwiLFwiZG9jXCI6XCJMYXlvdXQgcHJvcGVydGllcyBmb3IgdGhlIGxheWVyLlwifSxcInBhaW50XCI6e1widHlwZVwiOlwicGFpbnRcIixcImRvY1wiOlwiRGVmYXVsdCBwYWludCBwcm9wZXJ0aWVzIGZvciB0aGlzIGxheWVyLlwifSxcInBhaW50LipcIjp7XCJ0eXBlXCI6XCJwYWludFwiLFwiZG9jXCI6XCJDbGFzcy1zcGVjaWZpYyBwYWludCBwcm9wZXJ0aWVzIGZvciB0aGlzIGxheWVyLiBUaGUgY2xhc3MgbmFtZSBpcyB0aGUgcGFydCBhZnRlciB0aGUgZmlyc3QgZG90LlwifX0sXCJsYXlvdXRcIjpbXCJsYXlvdXRfZmlsbFwiLFwibGF5b3V0X2xpbmVcIixcImxheW91dF9jaXJjbGVcIixcImxheW91dF9zeW1ib2xcIixcImxheW91dF9yYXN0ZXJcIixcImxheW91dF9iYWNrZ3JvdW5kXCJdLFwibGF5b3V0X2JhY2tncm91bmRcIjp7XCJ2aXNpYmlsaXR5XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1widmlzaWJsZVwiLFwibm9uZVwiXSxcImRlZmF1bHRcIjpcInZpc2libGVcIixcImRvY1wiOlwiVGhlIGRpc3BsYXkgb2YgdGhpcyBsYXllci4gYG5vbmVgIGhpZGVzIHRoaXMgbGF5ZXIuXCJ9fSxcImxheW91dF9maWxsXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJsYXlvdXRfY2lyY2xlXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJsYXlvdXRfbGluZVwiOntcImxpbmUtY2FwXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wiYnV0dFwiLFwicm91bmRcIixcInNxdWFyZVwiXSxcImRlZmF1bHRcIjpcImJ1dHRcIixcImRvY1wiOlwiVGhlIGRpc3BsYXkgb2YgbGluZSBlbmRpbmdzLlwifSxcImxpbmUtam9pblwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImJldmVsXCIsXCJyb3VuZFwiLFwibWl0ZXJcIl0sXCJkZWZhdWx0XCI6XCJtaXRlclwiLFwiZG9jXCI6XCJUaGUgZGlzcGxheSBvZiBsaW5lcyB3aGVuIGpvaW5pbmcuXCJ9LFwibGluZS1taXRlci1saW1pdFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIlVzZWQgdG8gYXV0b21hdGljYWxseSBjb252ZXJ0IG1pdGVyIGpvaW5zIHRvIGJldmVsIGpvaW5zIGZvciBzaGFycCBhbmdsZXMuXCIsXCJyZXF1aXJlc1wiOlt7XCJsaW5lLWpvaW5cIjpcIm1pdGVyXCJ9XX0sXCJsaW5lLXJvdW5kLWxpbWl0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MS4wNSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiVXNlZCB0byBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgcm91bmQgam9pbnMgdG8gbWl0ZXIgam9pbnMgZm9yIHNoYWxsb3cgYW5nbGVzLlwiLFwicmVxdWlyZXNcIjpbe1wibGluZS1qb2luXCI6XCJyb3VuZFwifV19LFwidmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJsYXlvdXRfc3ltYm9sXCI6e1wic3ltYm9sLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInBvaW50XCIsXCJsaW5lXCJdLFwiZGVmYXVsdFwiOlwicG9pbnRcIixcImRvY1wiOlwiTGFiZWwgcGxhY2VtZW50IHJlbGF0aXZlIHRvIGl0cyBnZW9tZXRyeS4gYGxpbmVgIGNhbiBvbmx5IGJlIHVzZWQgb24gTGluZVN0cmluZ3MgYW5kIFBvbHlnb25zLlwifSxcInN5bWJvbC1zcGFjaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MjUwLFwibWluaW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIkRpc3RhbmNlIGJldHdlZW4gdHdvIHN5bWJvbCBhbmNob3JzLlwiLFwicmVxdWlyZXNcIjpbe1wic3ltYm9sLXBsYWNlbWVudFwiOlwibGluZVwifV19LFwic3ltYm9sLWF2b2lkLWVkZ2VzXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwiZG9jXCI6XCJJZiB0cnVlLCB0aGUgc3ltYm9scyB3aWxsIG5vdCBjcm9zcyB0aWxlIGVkZ2VzIHRvIGF2b2lkIG11dHVhbCBjb2xsaXNpb25zLiBSZWNvbW1lbmRlZCBpbiBsYXllcnMgdGhhdCBkb24ndCBoYXZlIGVub3VnaCBwYWRkaW5nIGluIHRoZSB2ZWN0b3IgdGlsZSB0byBwcmV2ZW50IGNvbGxpc2lvbnMsIG9yIGlmIGl0IGlzIGEgcG9pbnQgc3ltYm9sIGxheWVyIHBsYWNlZCBhZnRlciBhIGxpbmUgc3ltYm9sIGxheWVyLlwifSxcImljb24tYWxsb3ctb3ZlcmxhcFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdHJ1ZSwgdGhlIGljb24gd2lsbCBiZSB2aXNpYmxlIGV2ZW4gaWYgaXQgY29sbGlkZXMgd2l0aCBvdGhlciBwcmV2aW91c2x5IGRyYXduIHN5bWJvbHMuXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1pZ25vcmUtcGxhY2VtZW50XCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwiZG9jXCI6XCJJZiB0cnVlLCBvdGhlciBzeW1ib2xzIGNhbiBiZSB2aXNpYmxlIGV2ZW4gaWYgdGhleSBjb2xsaWRlIHdpdGggdGhlIGljb24uXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1vcHRpb25hbFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdHJ1ZSwgdGV4dCB3aWxsIGRpc3BsYXkgd2l0aG91dCB0aGVpciBjb3JyZXNwb25kaW5nIGljb25zIHdoZW4gdGhlIGljb24gY29sbGlkZXMgd2l0aCBvdGhlciBzeW1ib2xzIGFuZCB0aGUgdGV4dCBkb2VzIG5vdC5cIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiLFwidGV4dC1maWVsZFwiXX0sXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJ2aWV3cG9ydFwiLFwiZG9jXCI6XCJPcmllbnRhdGlvbiBvZiBpY29uIHdoZW4gbWFwIGlzIHJvdGF0ZWQuXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1zaXplXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZG9jXCI6XCJTY2FsZSBmYWN0b3IgZm9yIGljb24uIDEgaXMgb3JpZ2luYWwgc2l6ZSwgMyB0cmlwbGVzIHRoZSBzaXplLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24taW1hZ2VcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRvY1wiOlwiQSBzdHJpbmcgd2l0aCB7dG9rZW5zfSByZXBsYWNlZCwgcmVmZXJlbmNpbmcgdGhlIGRhdGEgcHJvcGVydHkgdG8gcHVsbCBmcm9tLlwiLFwidG9rZW5zXCI6dHJ1ZX0sXCJpY29uLXJvdGF0ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJwZXJpb2RcIjozNjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ1bml0c1wiOlwiZGVncmVlc1wiLFwiZG9jXCI6XCJSb3RhdGVzIHRoZSBpY29uIGNsb2Nrd2lzZS5cIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXBhZGRpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoyLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIlNpemUgb2YgdGhlIGFkZGl0aW9uYWwgYXJlYSBhcm91bmQgdGhlIGljb24gYm91bmRpbmcgYm94IHVzZWQgZm9yIGRldGVjdGluZyBzeW1ib2wgY29sbGlzaW9ucy5cIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWtlZXAtdXByaWdodFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdHJ1ZSwgdGhlIGljb24gbWF5IGJlIGZsaXBwZWQgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlbmRlcmVkIHVwc2lkZS1kb3duLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCIse1wiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJpY29uLW9mZnNldFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZG9jXCI6XCJPZmZzZXQgZGlzdGFuY2Ugb2YgaWNvbiBmcm9tIGl0cyBhbmNob3IuIFBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSByaWdodCBhbmQgZG93biwgd2hpbGUgbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxlZnQgYW5kIHVwLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wibWFwXCIsXCJ2aWV3cG9ydFwiXSxcImRlZmF1bHRcIjpcInZpZXdwb3J0XCIsXCJkb2NcIjpcIk9yaWVudGF0aW9uIG9mIHRleHQgd2hlbiBtYXAgaXMgcm90YXRlZC5cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWZpZWxkXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6XCJcIixcInRva2Vuc1wiOnRydWUsXCJkb2NcIjpcIlZhbHVlIHRvIHVzZSBmb3IgYSB0ZXh0IGxhYmVsLiBGZWF0dXJlIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCB1c2luZyB0b2tlbnMgbGlrZSB7ZmllbGRfbmFtZX0uXCJ9LFwidGV4dC1mb250XCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpbXCJPcGVuIFNhbnMgUmVndWxhclwiLFwiQXJpYWwgVW5pY29kZSBNUyBSZWd1bGFyXCJdLFwiZG9jXCI6XCJGb250IHN0YWNrIHRvIHVzZSBmb3IgZGlzcGxheWluZyB0ZXh0LlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtc2l6ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjE2LFwibWluaW11bVwiOjAsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIkZvbnQgc2l6ZS5cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LW1heC13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEwLFwibWluaW11bVwiOjAsXCJ1bml0c1wiOlwiZW1cIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiVGhlIG1heGltdW0gbGluZSB3aWR0aCBmb3IgdGV4dCB3cmFwcGluZy5cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWxpbmUtaGVpZ2h0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MS4yLFwidW5pdHNcIjpcImVtXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIlRleHQgbGVhZGluZyB2YWx1ZSBmb3IgbXVsdGktbGluZSB0ZXh0LlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtbGV0dGVyLXNwYWNpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwidW5pdHNcIjpcImVtXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIlRleHQgdHJhY2tpbmcgYW1vdW50LlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtanVzdGlmeVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImxlZnRcIixcImNlbnRlclwiLFwicmlnaHRcIl0sXCJkZWZhdWx0XCI6XCJjZW50ZXJcIixcImRvY1wiOlwiVGV4dCBqdXN0aWZpY2F0aW9uIG9wdGlvbnMuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJjZW50ZXJcIixcImxlZnRcIixcInJpZ2h0XCIsXCJ0b3BcIixcImJvdHRvbVwiLFwidG9wLWxlZnRcIixcInRvcC1yaWdodFwiLFwiYm90dG9tLWxlZnRcIixcImJvdHRvbS1yaWdodFwiXSxcImRlZmF1bHRcIjpcImNlbnRlclwiLFwiZG9jXCI6XCJQYXJ0IG9mIHRoZSB0ZXh0IHBsYWNlZCBjbG9zZXN0IHRvIHRoZSBhbmNob3IuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1tYXgtYW5nbGVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjo0NSxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIk1heGltdW0gYW5nbGUgY2hhbmdlIGJldHdlZW4gYWRqYWNlbnQgY2hhcmFjdGVycy5cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiLHtcInN5bWJvbC1wbGFjZW1lbnRcIjpcImxpbmVcIn1dfSxcInRleHQtcm90YXRlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIlJvdGF0ZXMgdGhlIHRleHQgY2xvY2t3aXNlLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtcGFkZGluZ1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJwaXhlbHNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiU2l6ZSBvZiB0aGUgYWRkaXRpb25hbCBhcmVhIGFyb3VuZCB0aGUgdGV4dCBib3VuZGluZyBib3ggdXNlZCBmb3IgZGV0ZWN0aW5nIHN5bWJvbCBjb2xsaXNpb25zLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQta2VlcC11cHJpZ2h0XCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOnRydWUsXCJkb2NcIjpcIklmIHRydWUsIHRoZSB0ZXh0IG1heSBiZSBmbGlwcGVkIHZlcnRpY2FsbHkgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlbmRlcmVkIHVwc2lkZS1kb3duLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIse1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJ0ZXh0LXRyYW5zZm9ybVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm5vbmVcIixcInVwcGVyY2FzZVwiLFwibG93ZXJjYXNlXCJdLFwiZGVmYXVsdFwiOlwibm9uZVwiLFwiZG9jXCI6XCJTcGVjaWZpZXMgaG93IHRvIGNhcGl0YWxpemUgdGV4dCwgc2ltaWxhciB0byB0aGUgQ1NTIGB0ZXh0LXRyYW5zZm9ybWAgcHJvcGVydHkuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1vZmZzZXRcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwiZG9jXCI6XCJPZmZzZXQgZGlzdGFuY2Ugb2YgdGV4dCBmcm9tIGl0cyBhbmNob3IuIFBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSByaWdodCBhbmQgZG93biwgd2hpbGUgbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxlZnQgYW5kIHVwLlwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwidW5pdHNcIjpcImVtc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6ZmFsc2UsXCJkb2NcIjpcIklmIHRydWUsIHRoZSB0ZXh0IHdpbGwgYmUgdmlzaWJsZSBldmVuIGlmIGl0IGNvbGxpZGVzIHdpdGggb3RoZXIgcHJldmlvdXNseSBkcmF3biBzeW1ib2xzLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtaWdub3JlLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdHJ1ZSwgb3RoZXIgc3ltYm9scyBjYW4gYmUgdmlzaWJsZSBldmVuIGlmIHRoZXkgY29sbGlkZSB3aXRoIHRoZSB0ZXh0LlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtb3B0aW9uYWxcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6ZmFsc2UsXCJkb2NcIjpcIklmIHRydWUsIGljb25zIHdpbGwgZGlzcGxheSB3aXRob3V0IHRoZWlyIGNvcnJlc3BvbmRpbmcgdGV4dCB3aGVuIHRoZSB0ZXh0IGNvbGxpZGVzIHdpdGggb3RoZXIgc3ltYm9scyBhbmQgdGhlIGljb24gZG9lcyBub3QuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIixcImljb24taW1hZ2VcIl19LFwidmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJsYXlvdXRfcmFzdGVyXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJmaWx0ZXJcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIipcIixcImRvY1wiOlwiQSBmaWx0ZXIgc2VsZWN0cyBzcGVjaWZpYyBmZWF0dXJlcyBmcm9tIGEgbGF5ZXIuXCJ9LFwiZmlsdGVyX29wZXJhdG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1wiPT1cIixcIiE9XCIsXCI+XCIsXCI+PVwiLFwiPFwiLFwiPD1cIixcImluXCIsXCIhaW5cIixcImFsbFwiLFwiYW55XCIsXCJub25lXCJdLFwiZG9jXCI6XCJUaGUgZmlsdGVyIG9wZXJhdG9yLlwifSxcImdlb21ldHJ5X3R5cGVcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbXCJQb2ludFwiLFwiTGluZVN0cmluZ1wiLFwiUG9seWdvblwiXSxcImRvY1wiOlwiVGhlIGdlb21ldHJ5IHR5cGUgZm9yIHRoZSBmaWx0ZXIgdG8gc2VsZWN0LlwifSxcImNvbG9yX29wZXJhdGlvblwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcImxpZ2h0ZW5cIixcInNhdHVyYXRlXCIsXCJzcGluXCIsXCJmYWRlXCIsXCJtaXhcIl0sXCJkb2NcIjpcIkEgY29sb3Igb3BlcmF0aW9uIHRvIGFwcGx5LlwifSxcImZ1bmN0aW9uXCI6e1wic3RvcHNcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwicmVxdWlyZWRcIjp0cnVlLFwiZG9jXCI6XCJBbiBhcnJheSBvZiBzdG9wcy5cIixcInZhbHVlXCI6XCJmdW5jdGlvbl9zdG9wXCJ9LFwiYmFzZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcImRvY1wiOlwiVGhlIGV4cG9uZW50aWFsIGJhc2Ugb2YgdGhlIGludGVycG9sYXRpb24gY3VydmUuIEl0IGNvbnRyb2xzIHRoZSByYXRlIGF0IHdoaWNoIHRoZSByZXN1bHQgaW5jcmVhc2VzLiBIaWdoZXIgdmFsdWVzIG1ha2UgdGhlIHJlc3VsdCBpbmNyZWFzZSBtb3JlIHRvd2FyZHMgdGhlIGhpZ2ggZW5kIG9mIHRoZSByYW5nZS4gV2l0aCBgMWAgdGhlIHN0b3BzIGFyZSBpbnRlcnBvbGF0ZWQgbGluZWFybHkuXCJ9fSxcImZ1bmN0aW9uX3N0b3BcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MjIsXCJ2YWx1ZVwiOltcIm51bWJlclwiLFwiY29sb3JcIl0sXCJsZW5ndGhcIjoyLFwiZG9jXCI6XCJab29tIGxldmVsIGFuZCB2YWx1ZSBwYWlyLlwifSxcInBhaW50XCI6W1wicGFpbnRfZmlsbFwiLFwicGFpbnRfbGluZVwiLFwicGFpbnRfY2lyY2xlXCIsXCJwYWludF9zeW1ib2xcIixcInBhaW50X3Jhc3RlclwiLFwicGFpbnRfYmFja2dyb3VuZFwiXSxcInBhaW50X2ZpbGxcIjp7XCJmaWxsLWFudGlhbGlhc1wiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjp0cnVlLFwiZG9jXCI6XCJXaGV0aGVyIG9yIG5vdCB0aGUgZmlsbCBzaG91bGQgYmUgYW50aWFsaWFzZWQuXCJ9LFwiZmlsbC1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJkb2NcIjpcIlRoZSBvcGFjaXR5IGdpdmVuIHRvIHRoZSBmaWxsIGNvbG9yLlwiLFwidHJhbnNpdGlvblwiOnRydWV9LFwiZmlsbC1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJkb2NcIjpcIlRoZSBjb2xvciBvZiB0aGUgZmlsbC5cIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwiZmlsbC1wYXR0ZXJuXCJ9XX0sXCJmaWxsLW91dGxpbmUtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZG9jXCI6XCJUaGUgb3V0bGluZSBjb2xvciBvZiB0aGUgZmlsbC4gTWF0Y2hlcyB0aGUgdmFsdWUgb2YgYGZpbGwtY29sb3JgIGlmIHVuc3BlY2lmaWVkLlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJmaWxsLXBhdHRlcm5cIn0se1wiZmlsbC1hbnRpYWxpYXNcIjp0cnVlfV19LFwiZmlsbC10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJUaGUgZ2VvbWV0cnkncyBvZmZzZXQuIFZhbHVlcyBhcmUgW3gsIHldIHdoZXJlIG5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cCwgcmVzcGVjdGl2ZWx5LlwifSxcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkb2NcIjpcIkNvbnRyb2wgd2hldGhlciB0aGUgdHJhbnNsYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIG1hcCAobm9ydGgpIG9yIHZpZXdwb3J0IChzY3JlZW4pXCIsXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wiZmlsbC10cmFuc2xhdGVcIl19LFwiZmlsbC1wYXR0ZXJuXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcImRvY1wiOlwiTmFtZSBvZiBpbWFnZSBpbiBzcHJpdGUgdG8gdXNlIGZvciBkcmF3aW5nIGltYWdlIGZpbGxzLiBGb3Igc2VhbWxlc3MgcGF0dGVybnMsIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBhIGZhY3RvciBvZiB0d28gKDIsIDQsIDgsIC4uLiwgNTEyKS5cIn19LFwicGFpbnRfbGluZVwiOntcImxpbmUtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJUaGUgb3BhY2l0eSBhdCB3aGljaCB0aGUgbGluZSB3aWxsIGJlIGRyYXduLlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwidHJhbnNpdGlvblwiOnRydWV9LFwibGluZS1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkb2NcIjpcIlRoZSBjb2xvciB3aXRoIHdoaWNoIHRoZSBsaW5lIHdpbGwgYmUgZHJhd24uXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcIiFcIjpcImxpbmUtcGF0dGVyblwifV19LFwibGluZS10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJUaGUgZ2VvbWV0cnkncyBvZmZzZXQuIFZhbHVlcyBhcmUgW3gsIHldIHdoZXJlIG5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cCwgcmVzcGVjdGl2ZWx5LlwifSxcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkb2NcIjpcIkNvbnRyb2wgd2hldGhlciB0aGUgdHJhbnNsYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIG1hcCAobm9ydGgpIG9yIHZpZXdwb3J0IChzY3JlZW4pXCIsXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wibGluZS10cmFuc2xhdGVcIl19LFwibGluZS13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJTdHJva2UgdGhpY2tuZXNzLlwifSxcImxpbmUtZ2FwLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZG9jXCI6XCJEcmF3cyBhIGxpbmUgY2FzaW5nIG91dHNpZGUgb2YgYSBsaW5lJ3MgYWN0dWFsIHBhdGguIFZhbHVlIGluZGljYXRlcyB0aGUgd2lkdGggb2YgdGhlIGlubmVyIGdhcC5cIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtb2Zmc2V0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcImRvY1wiOlwiVGhlIGxpbmUncyBvZmZzZXQgcGVycGVuZGljdWxhciB0byBpdHMgZGlyZWN0aW9uLiBWYWx1ZXMgbWF5IGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLCB3aGVyZSBwb3NpdGl2ZSBpbmRpY2F0ZXMgXFxcInJpZ2h0d2FyZHNcXFwiIChpZiB5b3Ugd2VyZSBtb3ZpbmcgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbGluZSkgYW5kIG5lZ2F0aXZlIGluZGljYXRlcyBcXFwibGVmdHdhcmRzLlxcXCJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtYmx1clwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJCbHVyIGFwcGxpZWQgdG8gdGhlIGxpbmUsIGluIHBpeGVscy5cIn0sXCJsaW5lLWRhc2hhcnJheVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkb2NcIjpcIlNwZWNpZmllcyB0aGUgbGVuZ3RocyBvZiB0aGUgYWx0ZXJuYXRpbmcgZGFzaGVzIGFuZCBnYXBzIHRoYXQgZm9ybSB0aGUgZGFzaCBwYXR0ZXJuLiBUaGUgbGVuZ3RocyBhcmUgbGF0ZXIgc2NhbGVkIGJ5IHRoZSBsaW5lIHdpZHRoLiBUbyBjb252ZXJ0IGEgZGFzaCBsZW5ndGggdG8gcGl4ZWxzLCBtdWx0aXBseSB0aGUgbGVuZ3RoIGJ5IHRoZSBjdXJyZW50IGxpbmUgd2lkdGguXCIsXCJtaW5pbXVtXCI6MCxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcImxpbmUgd2lkdGhzXCIsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJsaW5lLXBhdHRlcm5cIn1dfSxcImxpbmUtcGF0dGVyblwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJkb2NcIjpcIk5hbWUgb2YgaW1hZ2UgaW4gc3ByaXRlIHRvIHVzZSBmb3IgZHJhd2luZyBpbWFnZSBsaW5lcy4gRm9yIHNlYW1sZXNzIHBhdHRlcm5zLCBpbWFnZSB3aWR0aCBtdXN0IGJlIGEgZmFjdG9yIG9mIHR3byAoMiwgNCwgOCwgLi4uLCA1MTIpLlwifX0sXCJwYWludF9jaXJjbGVcIjp7XCJjaXJjbGUtcmFkaXVzXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NSxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIkNpcmNsZSByYWRpdXMuXCJ9LFwiY2lyY2xlLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImRvY1wiOlwiVGhlIGNvbG9yIG9mIHRoZSBjaXJjbGUuXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJjaXJjbGUtYmx1clwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJkb2NcIjpcIkFtb3VudCB0byBibHVyIHRoZSBjaXJjbGUuIDEgYmx1cnMgdGhlIGNpcmNsZSBzdWNoIHRoYXQgb25seSB0aGUgY2VudGVycG9pbnQgaXMgZnVsbCBvcGFjaXR5LlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9LFwiY2lyY2xlLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRvY1wiOlwiVGhlIG9wYWNpdHkgYXQgd2hpY2ggdGhlIGNpcmNsZSB3aWxsIGJlIGRyYXduLlwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9LFwiY2lyY2xlLXRyYW5zbGF0ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIlRoZSBnZW9tZXRyeSdzIG9mZnNldC4gVmFsdWVzIGFyZSBbeCwgeV0gd2hlcmUgbmVnYXRpdmVzIGluZGljYXRlIGxlZnQgYW5kIHVwLCByZXNwZWN0aXZlbHkuXCJ9LFwiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJtYXBcIixcInZpZXdwb3J0XCJdLFwiZG9jXCI6XCJDb250cm9sIHdoZXRoZXIgdGhlIHRyYW5zbGF0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBtYXAgKG5vcnRoKSBvciB2aWV3cG9ydCAoc2NyZWVuKVwiLFwiZGVmYXVsdFwiOlwibWFwXCIsXCJyZXF1aXJlc1wiOltcImNpcmNsZS10cmFuc2xhdGVcIl19fSxcInBhaW50X3N5bWJvbFwiOntcImljb24tb3BhY2l0eVwiOntcImRvY1wiOlwiVGhlIG9wYWNpdHkgYXQgd2hpY2ggdGhlIGljb24gd2lsbCBiZSBkcmF3bi5cIixcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcImRvY1wiOlwiVGhlIGNvbG9yIG9mIHRoZSBpY29uLiBUaGlzIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBzZGYgaWNvbnMuXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1oYWxvLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcInJnYmEoMCwgMCwgMCwgMClcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwiZG9jXCI6XCJUaGUgY29sb3Igb2YgdGhlIGljb24ncyBoYWxvLiBJY29uIGhhbG9zIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBzZGYgaWNvbnMuXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1oYWxvLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIkRpc3RhbmNlIG9mIGhhbG8gdG8gdGhlIGljb24gb3V0bGluZS5cIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWhhbG8tYmx1clwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJGYWRlIG91dCB0aGUgaGFsbyB0b3dhcmRzIHRoZSBvdXRzaWRlLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcImRvY1wiOlwiRGlzdGFuY2UgdGhhdCB0aGUgaWNvbidzIGFuY2hvciBpcyBtb3ZlZCBmcm9tIGl0cyBvcmlnaW5hbCBwbGFjZW1lbnQuIFBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSByaWdodCBhbmQgZG93biwgd2hpbGUgbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxlZnQgYW5kIHVwLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkb2NcIjpcIkNvbnRyb2wgd2hldGhlciB0aGUgdHJhbnNsYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIG1hcCAobm9ydGgpIG9yIHZpZXdwb3J0IChzY3JlZW4pLlwiLFwiZGVmYXVsdFwiOlwibWFwXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIixcImljb24tdHJhbnNsYXRlXCJdfSxcInRleHQtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJUaGUgb3BhY2l0eSBhdCB3aGljaCB0aGUgdGV4dCB3aWxsIGJlIGRyYXduLlwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkb2NcIjpcIlRoZSBjb2xvciB3aXRoIHdoaWNoIHRoZSB0ZXh0IHdpbGwgYmUgZHJhd24uXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWhhbG8tY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwicmdiYSgwLCAwLCAwLCAwKVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJkb2NcIjpcIlRoZSBjb2xvciBvZiB0aGUgdGV4dCdzIGhhbG8sIHdoaWNoIGhlbHBzIGl0IHN0YW5kIG91dCBmcm9tIGJhY2tncm91bmRzLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtaGFsby13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJEaXN0YW5jZSBvZiBoYWxvIHRvIHRoZSBmb250IG91dGxpbmUuIE1heCB0ZXh0IGhhbG8gd2lkdGggaXMgMS80IG9mIHRoZSBmb250LXNpemUuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1oYWxvLWJsdXJcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcImRvY1wiOlwiVGhlIGhhbG8ncyBmYWRlb3V0IGRpc3RhbmNlIHRvd2FyZHMgdGhlIG91dHNpZGUuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJEaXN0YW5jZSB0aGF0IHRoZSB0ZXh0J3MgYW5jaG9yIGlzIG1vdmVkIGZyb20gaXRzIG9yaWdpbmFsIHBsYWNlbWVudC4gUG9zaXRpdmUgdmFsdWVzIGluZGljYXRlIHJpZ2h0IGFuZCBkb3duLCB3aGlsZSBuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgbGVmdCBhbmQgdXAuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wibWFwXCIsXCJ2aWV3cG9ydFwiXSxcImRvY1wiOlwiQ29udHJvbCB3aGV0aGVyIHRoZSB0cmFuc2xhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgbWFwIChub3J0aCkgb3Igdmlld3BvcnQgKHNjcmVlbikuXCIsXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiLFwidGV4dC10cmFuc2xhdGVcIl19fSxcInBhaW50X3Jhc3RlclwiOntcInJhc3Rlci1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkb2NcIjpcIlRoZSBvcGFjaXR5IGF0IHdoaWNoIHRoZSBpbWFnZSB3aWxsIGJlIGRyYXduLlwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9LFwicmFzdGVyLWh1ZS1yb3RhdGVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwicGVyaW9kXCI6MzYwLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwiZGVncmVlc1wiLFwiZG9jXCI6XCJSb3RhdGVzIGh1ZXMgYXJvdW5kIHRoZSBjb2xvciB3aGVlbC5cIn0sXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiSW5jcmVhc2Ugb3IgcmVkdWNlIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBpbWFnZS4gVGhlIHZhbHVlIGlzIHRoZSBtaW5pbXVtIGJyaWdodG5lc3MuXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiSW5jcmVhc2Ugb3IgcmVkdWNlIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBpbWFnZS4gVGhlIHZhbHVlIGlzIHRoZSBtYXhpbXVtIGJyaWdodG5lc3MuXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItc2F0dXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJJbmNyZWFzZSBvciByZWR1Y2UgdGhlIHNhdHVyYXRpb24gb2YgdGhlIGltYWdlLlwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6LTEsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcInJhc3Rlci1jb250cmFzdFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJJbmNyZWFzZSBvciByZWR1Y2UgdGhlIGNvbnRyYXN0IG9mIHRoZSBpbWFnZS5cIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOi0xLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwibWlsbGlzZWNvbmRzXCIsXCJkb2NcIjpcIkZhZGUgZHVyYXRpb24gd2hlbiBhIG5ldyB0aWxlIGlzIGFkZGVkLlwifX0sXCJwYWludF9iYWNrZ3JvdW5kXCI6e1wiYmFja2dyb3VuZC1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJkb2NcIjpcIlRoZSBjb2xvciB3aXRoIHdoaWNoIHRoZSBiYWNrZ3JvdW5kIHdpbGwgYmUgZHJhd24uXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcIiFcIjpcImJhY2tncm91bmQtcGF0dGVyblwifV19LFwiYmFja2dyb3VuZC1wYXR0ZXJuXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcImRvY1wiOlwiTmFtZSBvZiBpbWFnZSBpbiBzcHJpdGUgdG8gdXNlIGZvciBkcmF3aW5nIGFuIGltYWdlIGJhY2tncm91bmQuIEZvciBzZWFtbGVzcyBwYXR0ZXJucywgaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIGEgZmFjdG9yIG9mIHR3byAoMiwgNCwgOCwgLi4uLCA1MTIpLlwifSxcImJhY2tncm91bmQtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZG9jXCI6XCJUaGUgb3BhY2l0eSBhdCB3aGljaCB0aGUgYmFja2dyb3VuZCB3aWxsIGJlIGRyYXduLlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9fSxcInRyYW5zaXRpb25cIjp7XCJkdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1pbGxpc2Vjb25kc1wiLFwiZG9jXCI6XCJUaW1lIGFsbG90dGVkIGZvciB0cmFuc2l0aW9ucyB0byBjb21wbGV0ZS5cIn0sXCJkZWxheVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJtaWxsaXNlY29uZHNcIixcImRvY1wiOlwiTGVuZ3RoIG9mIHRpbWUgYmVmb3JlIGEgdHJhbnNpdGlvbiBiZWdpbnMuXCJ9fX1cbn0se31dLDEzNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cz17XCIkdmVyc2lvblwiOjgsXCIkcm9vdFwiOntcInZlcnNpb25cIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbOF19LFwibmFtZVwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcIm1ldGFkYXRhXCI6e1widHlwZVwiOlwiKlwifSxcImNlbnRlclwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCJ9LFwiem9vbVwiOntcInR5cGVcIjpcIm51bWJlclwifSxcImJlYXJpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwicGVyaW9kXCI6MzYwLFwidW5pdHNcIjpcImRlZ3JlZXNcIn0sXCJwaXRjaFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJ1bml0c1wiOlwiZGVncmVlc1wifSxcInNvdXJjZXNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJzb3VyY2VzXCJ9LFwic3ByaXRlXCI6e1widHlwZVwiOlwic3RyaW5nXCJ9LFwiZ2x5cGhzXCI6e1widHlwZVwiOlwic3RyaW5nXCJ9LFwidHJhbnNpdGlvblwiOntcInR5cGVcIjpcInRyYW5zaXRpb25cIn0sXCJsYXllcnNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcImxheWVyXCJ9fSxcInNvdXJjZXNcIjp7XCIqXCI6e1widHlwZVwiOlwic291cmNlXCJ9fSxcInNvdXJjZVwiOltcInNvdXJjZV90aWxlXCIsXCJzb3VyY2VfZ2VvanNvblwiLFwic291cmNlX3ZpZGVvXCIsXCJzb3VyY2VfaW1hZ2VcIl0sXCJzb3VyY2VfdGlsZVwiOntcInR5cGVcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbXCJ2ZWN0b3JcIixcInJhc3RlclwiXX0sXCJ1cmxcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCJ0aWxlc1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCJ9LFwibWluem9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjB9LFwibWF4em9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIyfSxcInRpbGVTaXplXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NTEyLFwidW5pdHNcIjpcInBpeGVsc1wifSxcIipcIjp7XCJ0eXBlXCI6XCIqXCJ9fSxcInNvdXJjZV9nZW9qc29uXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcImdlb2pzb25cIl19LFwiZGF0YVwiOntcInR5cGVcIjpcIipcIn0sXCJtYXh6b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MTR9LFwiYnVmZmVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NjR9LFwidG9sZXJhbmNlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6M30sXCJjbHVzdGVyXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZGVmYXVsdFwiOmZhbHNlfSxcImNsdXN0ZXJSYWRpdXNcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjo0MDB9LFwiY2x1c3Rlck1heFpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIn19LFwic291cmNlX3ZpZGVvXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcInZpZGVvXCJdfSxcInVybHNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcInN0cmluZ1wifSxcImNvb3JkaW5hdGVzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjQsXCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJsZW5ndGhcIjoyLFwidmFsdWVcIjpcIm51bWJlclwifX19LFwic291cmNlX2ltYWdlXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcImltYWdlXCJdfSxcInVybFwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcInN0cmluZ1wifSxcImNvb3JkaW5hdGVzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjQsXCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJsZW5ndGhcIjoyLFwidmFsdWVcIjpcIm51bWJlclwifX19LFwibGF5ZXJcIjp7XCJpZFwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwicmVxdWlyZWRcIjp0cnVlfSxcInR5cGVcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbXCJmaWxsXCIsXCJsaW5lXCIsXCJzeW1ib2xcIixcImNpcmNsZVwiLFwicmFzdGVyXCIsXCJiYWNrZ3JvdW5kXCJdfSxcIm1ldGFkYXRhXCI6e1widHlwZVwiOlwiKlwifSxcInJlZlwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcInNvdXJjZVwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcInNvdXJjZS1sYXllclwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcIm1pbnpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjIyfSxcIm1heHpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjIyfSxcImludGVyYWN0aXZlXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZGVmYXVsdFwiOmZhbHNlfSxcImZpbHRlclwiOntcInR5cGVcIjpcImZpbHRlclwifSxcImxheW91dFwiOntcInR5cGVcIjpcImxheW91dFwifSxcInBhaW50XCI6e1widHlwZVwiOlwicGFpbnRcIn0sXCJwYWludC4qXCI6e1widHlwZVwiOlwicGFpbnRcIn19LFwibGF5b3V0XCI6W1wibGF5b3V0X2ZpbGxcIixcImxheW91dF9saW5lXCIsXCJsYXlvdXRfY2lyY2xlXCIsXCJsYXlvdXRfc3ltYm9sXCIsXCJsYXlvdXRfcmFzdGVyXCIsXCJsYXlvdXRfYmFja2dyb3VuZFwiXSxcImxheW91dF9iYWNrZ3JvdW5kXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImxheW91dF9maWxsXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImxheW91dF9jaXJjbGVcIjp7XCJ2aXNpYmlsaXR5XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1widmlzaWJsZVwiLFwibm9uZVwiXSxcImRlZmF1bHRcIjpcInZpc2libGVcIn19LFwibGF5b3V0X2xpbmVcIjp7XCJsaW5lLWNhcFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImJ1dHRcIixcInJvdW5kXCIsXCJzcXVhcmVcIl0sXCJkZWZhdWx0XCI6XCJidXR0XCJ9LFwibGluZS1qb2luXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wiYmV2ZWxcIixcInJvdW5kXCIsXCJtaXRlclwiXSxcImRlZmF1bHRcIjpcIm1pdGVyXCJ9LFwibGluZS1taXRlci1saW1pdFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJyZXF1aXJlc1wiOlt7XCJsaW5lLWpvaW5cIjpcIm1pdGVyXCJ9XX0sXCJsaW5lLXJvdW5kLWxpbWl0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MS4wNSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInJlcXVpcmVzXCI6W3tcImxpbmUtam9pblwiOlwicm91bmRcIn1dfSxcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJ2aXNpYmxlXCIsXCJub25lXCJdLFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfc3ltYm9sXCI6e1wic3ltYm9sLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInBvaW50XCIsXCJsaW5lXCJdLFwiZGVmYXVsdFwiOlwicG9pbnRcIn0sXCJzeW1ib2wtc3BhY2luZ1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjI1MCxcIm1pbmltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbe1wic3ltYm9sLXBsYWNlbWVudFwiOlwibGluZVwifV19LFwic3ltYm9sLWF2b2lkLWVkZ2VzXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlfSxcImljb24tYWxsb3ctb3ZlcmxhcFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6ZmFsc2UsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1vcHRpb25hbFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiLFwidGV4dC1maWVsZFwiXX0sXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJ2aWV3cG9ydFwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tc2l6ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWltYWdlXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ0b2tlbnNcIjp0cnVlfSxcImljb24tcm90YXRlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1wYWRkaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MixcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24ta2VlcC11cHJpZ2h0XCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCIse1wiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJpY29uLW9mZnNldFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wibWFwXCIsXCJ2aWV3cG9ydFwiXSxcImRlZmF1bHRcIjpcInZpZXdwb3J0XCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1maWVsZFwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOlwiXCIsXCJ0b2tlbnNcIjp0cnVlfSxcInRleHQtZm9udFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6W1wiT3BlbiBTYW5zIFJlZ3VsYXJcIixcIkFyaWFsIFVuaWNvZGUgTVMgUmVndWxhclwiXSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXNpemVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxNixcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtbWF4LXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MTAsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJlbVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtbGluZS1oZWlnaHRcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLjIsXCJ1bml0c1wiOlwiZW1cIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInVuaXRzXCI6XCJlbVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtanVzdGlmeVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImxlZnRcIixcImNlbnRlclwiLFwicmlnaHRcIl0sXCJkZWZhdWx0XCI6XCJjZW50ZXJcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImNlbnRlclwiLFwibGVmdFwiLFwicmlnaHRcIixcInRvcFwiLFwiYm90dG9tXCIsXCJ0b3AtbGVmdFwiLFwidG9wLXJpZ2h0XCIsXCJib3R0b20tbGVmdFwiLFwiYm90dG9tLXJpZ2h0XCJdLFwiZGVmYXVsdFwiOlwiY2VudGVyXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1tYXgtYW5nbGVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjo0NSxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIix7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJ0ZXh0LXJvdGF0ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJwZXJpb2RcIjozNjAsXCJ1bml0c1wiOlwiZGVncmVlc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtcGFkZGluZ1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJwaXhlbHNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWtlZXAtdXByaWdodFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIse1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJ0ZXh0LXRyYW5zZm9ybVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm5vbmVcIixcInVwcGVyY2FzZVwiLFwibG93ZXJjYXNlXCJdLFwiZGVmYXVsdFwiOlwibm9uZVwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtb2Zmc2V0XCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcInVuaXRzXCI6XCJlbXNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1hbGxvdy1vdmVybGFwXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtaWdub3JlLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LW9wdGlvbmFsXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIsXCJpY29uLWltYWdlXCJdfSxcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJ2aXNpYmxlXCIsXCJub25lXCJdLFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfcmFzdGVyXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImZpbHRlclwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwiKlwifSxcImZpbHRlcl9vcGVyYXRvclwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcIj09XCIsXCIhPVwiLFwiPlwiLFwiPj1cIixcIjxcIixcIjw9XCIsXCJpblwiLFwiIWluXCIsXCJhbGxcIixcImFueVwiLFwibm9uZVwiXX0sXCJnZW9tZXRyeV90eXBlXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1wiUG9pbnRcIixcIkxpbmVTdHJpbmdcIixcIlBvbHlnb25cIl19LFwiY29sb3Jfb3BlcmF0aW9uXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1wibGlnaHRlblwiLFwic2F0dXJhdGVcIixcInNwaW5cIixcImZhZGVcIixcIm1peFwiXX0sXCJmdW5jdGlvblwiOntcInN0b3BzXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInJlcXVpcmVkXCI6dHJ1ZSxcInZhbHVlXCI6XCJmdW5jdGlvbl9zdG9wXCJ9LFwiYmFzZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MH19LFwiZnVuY3Rpb25fc3RvcFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoyMixcInZhbHVlXCI6W1wibnVtYmVyXCIsXCJjb2xvclwiXSxcImxlbmd0aFwiOjJ9LFwicGFpbnRcIjpbXCJwYWludF9maWxsXCIsXCJwYWludF9saW5lXCIsXCJwYWludF9jaXJjbGVcIixcInBhaW50X3N5bWJvbFwiLFwicGFpbnRfcmFzdGVyXCIsXCJwYWludF9iYWNrZ3JvdW5kXCJdLFwicGFpbnRfZmlsbFwiOntcImZpbGwtYW50aWFsaWFzXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOnRydWV9LFwiZmlsbC1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJmaWxsLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwiZmlsbC1wYXR0ZXJuXCJ9XX0sXCJmaWxsLW91dGxpbmUtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJmaWxsLXBhdHRlcm5cIn0se1wiZmlsbC1hbnRpYWxpYXNcIjp0cnVlfV19LFwiZmlsbC10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wiZmlsbC10cmFuc2xhdGVcIl19LFwiZmlsbC1wYXR0ZXJuXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX19LFwicGFpbnRfbGluZVwiOntcImxpbmUtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwidHJhbnNpdGlvblwiOnRydWV9LFwibGluZS1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcIiFcIjpcImxpbmUtcGF0dGVyblwifV19LFwibGluZS10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wibGluZS10cmFuc2xhdGVcIl19LFwibGluZS13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtZ2FwLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwibGluZS1vZmZzZXRcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwibGluZS1ibHVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwibGluZS1kYXNoYXJyYXlcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwibWluaW11bVwiOjAsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJsaW5lIHdpZHRoc1wiLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwibGluZS1wYXR0ZXJuXCJ9XX0sXCJsaW5lLXBhdHRlcm5cIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInRyYW5zaXRpb25cIjp0cnVlfX0sXCJwYWludF9jaXJjbGVcIjp7XCJjaXJjbGUtcmFkaXVzXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NSxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwiY2lyY2xlLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcImNpcmNsZS1ibHVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcImNpcmNsZS1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJjaXJjbGUtdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wiY2lyY2xlLXRyYW5zbGF0ZVwiXX19LFwicGFpbnRfc3ltYm9sXCI6e1wiaWNvbi1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24taGFsby1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCJyZ2JhKDAsIDAsIDAsIDApXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWhhbG8td2lkdGhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWhhbG8tYmx1clwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJtYXBcIixcInZpZXdwb3J0XCJdLFwiZGVmYXVsdFwiOlwibWFwXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIixcImljb24tdHJhbnNsYXRlXCJdfSxcInRleHQtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWhhbG8tY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwicmdiYSgwLCAwLCAwLCAwKVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1oYWxvLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1oYWxvLWJsdXJcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXRyYW5zbGF0ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wibWFwXCIsXCJ2aWV3cG9ydFwiXSxcImRlZmF1bHRcIjpcIm1hcFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIsXCJ0ZXh0LXRyYW5zbGF0ZVwiXX19LFwicGFpbnRfcmFzdGVyXCI6e1wicmFzdGVyLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcInJhc3Rlci1odWUtcm90YXRlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcImRlZ3JlZXNcIn0sXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcInRyYW5zaXRpb25cIjp0cnVlfSxcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwidHJhbnNpdGlvblwiOnRydWV9LFwicmFzdGVyLXNhdHVyYXRpb25cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOi0xLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItY29udHJhc3RcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOi0xLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwibWlsbGlzZWNvbmRzXCJ9fSxcInBhaW50X2JhY2tncm91bmRcIjp7XCJiYWNrZ3JvdW5kLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwiYmFja2dyb3VuZC1wYXR0ZXJuXCJ9XX0sXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcImJhY2tncm91bmQtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9fSxcInRyYW5zaXRpb25cIjp7XCJkdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1pbGxpc2Vjb25kc1wifSxcImRlbGF5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1pbGxpc2Vjb25kc1wifX19XG59LHt9XSwxMzU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQnVmZmVyKHQpe3ZhciBlO3QmJnQubGVuZ3RoJiYoZT10LHQ9ZS5sZW5ndGgpO3ZhciByPW5ldyBVaW50OEFycmF5KHR8fDApO3JldHVybiBlJiZyLnNldChlKSxyLnJlYWRVSW50MzJMRT1CdWZmZXJNZXRob2RzLnJlYWRVSW50MzJMRSxyLndyaXRlVUludDMyTEU9QnVmZmVyTWV0aG9kcy53cml0ZVVJbnQzMkxFLHIucmVhZEludDMyTEU9QnVmZmVyTWV0aG9kcy5yZWFkSW50MzJMRSxyLndyaXRlSW50MzJMRT1CdWZmZXJNZXRob2RzLndyaXRlSW50MzJMRSxyLnJlYWRGbG9hdExFPUJ1ZmZlck1ldGhvZHMucmVhZEZsb2F0TEUsci53cml0ZUZsb2F0TEU9QnVmZmVyTWV0aG9kcy53cml0ZUZsb2F0TEUsci5yZWFkRG91YmxlTEU9QnVmZmVyTWV0aG9kcy5yZWFkRG91YmxlTEUsci53cml0ZURvdWJsZUxFPUJ1ZmZlck1ldGhvZHMud3JpdGVEb3VibGVMRSxyLnRvU3RyaW5nPUJ1ZmZlck1ldGhvZHMudG9TdHJpbmcsci53cml0ZT1CdWZmZXJNZXRob2RzLndyaXRlLHIuc2xpY2U9QnVmZmVyTWV0aG9kcy5zbGljZSxyLmNvcHk9QnVmZmVyTWV0aG9kcy5jb3B5LHIuX2lzQnVmZmVyPSEwLHJ9ZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHQpe2Zvcih2YXIgZSxyLG49dC5sZW5ndGgsaT1bXSxvPTA7bj5vO28rKyl7aWYoZT10LmNoYXJDb2RlQXQobyksZT41NTI5NSYmNTczNDQ+ZSl7aWYoIXIpe2U+NTYzMTl8fG8rMT09PW4/aS5wdXNoKDIzOSwxOTEsMTg5KTpyPWU7Y29udGludWV9aWYoNTYzMjA+ZSl7aS5wdXNoKDIzOSwxOTEsMTg5KSxyPWU7Y29udGludWV9ZT1yLTU1Mjk2PDwxMHxlLTU2MzIwfDY1NTM2LHI9bnVsbH1lbHNlIHImJihpLnB1c2goMjM5LDE5MSwxODkpLHI9bnVsbCk7MTI4PmU/aS5wdXNoKGUpOjIwNDg+ZT9pLnB1c2goZT4+NnwxOTIsNjMmZXwxMjgpOjY1NTM2PmU/aS5wdXNoKGU+PjEyfDIyNCxlPj42JjYzfDEyOCw2MyZlfDEyOCk6aS5wdXNoKGU+PjE4fDI0MCxlPj4xMiY2M3wxMjgsZT4+NiY2M3wxMjgsNjMmZXwxMjgpfXJldHVybiBpfW1vZHVsZS5leHBvcnRzPUJ1ZmZlcjt2YXIgaWVlZTc1ND1yZXF1aXJlKFwiaWVlZTc1NFwiKSxCdWZmZXJNZXRob2RzLGxhc3RTdHIsbGFzdFN0ckVuY29kZWQ7QnVmZmVyTWV0aG9kcz17cmVhZFVJbnQzMkxFOmZ1bmN0aW9uKHQpe3JldHVybih0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LHdyaXRlVUludDMyTEU6ZnVuY3Rpb24odCxlKXt0aGlzW2VdPXQsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzNdPXQ+Pj4yNH0scmVhZEludDMyTEU6ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTYpKyh0aGlzW3QrM108PDI0KX0scmVhZEZsb2F0TEU6ZnVuY3Rpb24odCl7cmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLHQsITAsMjMsNCl9LHJlYWREb3VibGVMRTpmdW5jdGlvbih0KXtyZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsdCwhMCw1Miw4KX0sd3JpdGVGbG9hdExFOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGllZWU3NTQud3JpdGUodGhpcyx0LGUsITAsMjMsNCl9LHdyaXRlRG91YmxlTEU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaWVlZTc1NC53cml0ZSh0aGlzLHQsZSwhMCw1Miw4KX0sdG9TdHJpbmc6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVwiXCIsaT1cIlwiO2U9ZXx8MCxyPU1hdGgubWluKHRoaXMubGVuZ3RoLHJ8fHRoaXMubGVuZ3RoKTtmb3IodmFyIG89ZTtyPm87bysrKXt2YXIgdT10aGlzW29dOzEyNz49dT8obis9ZGVjb2RlVVJJQ29tcG9uZW50KGkpK1N0cmluZy5mcm9tQ2hhckNvZGUodSksaT1cIlwiKTppKz1cIiVcIit1LnRvU3RyaW5nKDE2KX1yZXR1cm4gbis9ZGVjb2RlVVJJQ29tcG9uZW50KGkpfSx3cml0ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10PT09bGFzdFN0cj9sYXN0U3RyRW5jb2RlZDplbmNvZGVTdHJpbmcodCksbj0wO248ci5sZW5ndGg7bisrKXRoaXNbZStuXT1yW25dfSxzbGljZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnN1YmFycmF5KHQsZSl9LGNvcHk6ZnVuY3Rpb24odCxlKXtlPWV8fDA7Zm9yKHZhciByPTA7cjx0aGlzLmxlbmd0aDtyKyspdFtlK3JdPXRoaXNbcl19fSxCdWZmZXJNZXRob2RzLndyaXRlSW50MzJMRT1CdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEUsQnVmZmVyLmJ5dGVMZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGxhc3RTdHI9dCxsYXN0U3RyRW5jb2RlZD1lbmNvZGVTdHJpbmcodCksbGFzdFN0ckVuY29kZWQubGVuZ3RofSxCdWZmZXIuaXNCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuISghdHx8IXQuX2lzQnVmZmVyKX07XG59LHtcImllZWU3NTRcIjoxMjZ9XSwxMzY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuKGZ1bmN0aW9uIChnbG9iYWwpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gUGJmKHQpe3RoaXMuYnVmPUJ1ZmZlci5pc0J1ZmZlcih0KT90Om5ldyBCdWZmZXIodHx8MCksdGhpcy5wb3M9MCx0aGlzLmxlbmd0aD10aGlzLmJ1Zi5sZW5ndGh9ZnVuY3Rpb24gd3JpdGVQYWNrZWRWYXJpbnQodCxpKXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpLndyaXRlVmFyaW50KHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkU1ZhcmludCh0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVTVmFyaW50KHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkRmxvYXQodCxpKXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpLndyaXRlRmxvYXQodFtlXSl9ZnVuY3Rpb24gd3JpdGVQYWNrZWREb3VibGUodCxpKXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpLndyaXRlRG91YmxlKHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkQm9vbGVhbih0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVCb29sZWFuKHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkRml4ZWQzMih0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVGaXhlZDMyKHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkU0ZpeGVkMzIodCxpKXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpLndyaXRlU0ZpeGVkMzIodFtlXSl9ZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDY0KHQsaSl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspaS53cml0ZUZpeGVkNjQodFtlXSl9ZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQ2NCh0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVTRml4ZWQ2NCh0W2VdKX1tb2R1bGUuZXhwb3J0cz1QYmY7dmFyIEJ1ZmZlcj1nbG9iYWwuQnVmZmVyfHxyZXF1aXJlKFwiLi9idWZmZXJcIik7UGJmLlZhcmludD0wLFBiZi5GaXhlZDY0PTEsUGJmLkJ5dGVzPTIsUGJmLkZpeGVkMzI9NTt2YXIgU0hJRlRfTEVGVF8zMj00Mjk0OTY3Mjk2LFNISUZUX1JJR0hUXzMyPTEvU0hJRlRfTEVGVF8zMixQT1dfMl82Mz1NYXRoLnBvdygyLDYzKTtQYmYucHJvdG90eXBlPXtkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5idWY9bnVsbH0scmVhZEZpZWxkczpmdW5jdGlvbih0LGksZSl7Zm9yKGU9ZXx8dGhpcy5sZW5ndGg7dGhpcy5wb3M8ZTspe3ZhciByPXRoaXMucmVhZFZhcmludCgpLHM9cj4+MyxuPXRoaXMucG9zO3QocyxpLHRoaXMpLHRoaXMucG9zPT09biYmdGhpcy5za2lwKHIpfXJldHVybiBpfSxyZWFkTWVzc2FnZTpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLnJlYWRGaWVsZHModCxpLHRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zKX0scmVhZEZpeGVkMzI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkU0ZpeGVkMzI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1Zi5yZWFkSW50MzJMRSh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWRGaXhlZDY0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKSt0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MrNCkqU0hJRlRfTEVGVF8zMjtyZXR1cm4gdGhpcy5wb3MrPTgsdH0scmVhZFNGaXhlZDY0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKSt0aGlzLmJ1Zi5yZWFkSW50MzJMRSh0aGlzLnBvcys0KSpTSElGVF9MRUZUXzMyO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkRmxvYXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1Zi5yZWFkRmxvYXRMRSh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWREb3VibGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1Zi5yZWFkRG91YmxlTEUodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkVmFyaW50OmZ1bmN0aW9uKCl7dmFyIHQsaSxlLHIscyxuLG89dGhpcy5idWY7aWYoZT1vW3RoaXMucG9zKytdLDEyOD5lKXJldHVybiBlO2lmKGU9MTI3JmUscj1vW3RoaXMucG9zKytdLDEyOD5yKXJldHVybiBlfHI8PDc7aWYocj0oMTI3JnIpPDw3LHM9b1t0aGlzLnBvcysrXSwxMjg+cylyZXR1cm4gZXxyfHM8PDE0O2lmKHM9KDEyNyZzKTw8MTQsbj1vW3RoaXMucG9zKytdLDEyOD5uKXJldHVybiBlfHJ8c3xuPDwyMTtpZih0PWV8cnxzfCgxMjcmbik8PDIxLGk9b1t0aGlzLnBvcysrXSx0Kz0yNjg0MzU0NTYqKDEyNyZpKSwxMjg+aSlyZXR1cm4gdDtpZihpPW9bdGhpcy5wb3MrK10sdCs9MzQzNTk3MzgzNjgqKDEyNyZpKSwxMjg+aSlyZXR1cm4gdDtpZihpPW9bdGhpcy5wb3MrK10sdCs9NDM5ODA0NjUxMTEwNCooMTI3JmkpLDEyOD5pKXJldHVybiB0O2lmKGk9b1t0aGlzLnBvcysrXSx0Kz01NjI5NDk5NTM0MjEzMTIqKDEyNyZpKSwxMjg+aSlyZXR1cm4gdDtpZihpPW9bdGhpcy5wb3MrK10sdCs9NzIwNTc1OTQwMzc5Mjc5NDAqKDEyNyZpKSwxMjg+aSlyZXR1cm4gdDtpZihpPW9bdGhpcy5wb3MrK10sdCs9MHg4MDAwMDAwMDAwMDAwMDAwKigxMjcmaSksMTI4PmkpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXNcIil9LHJlYWRWYXJpbnQ2NDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucG9zLGk9dGhpcy5yZWFkVmFyaW50KCk7aWYoUE9XXzJfNjM+aSlyZXR1cm4gaTtmb3IodmFyIGU9dGhpcy5wb3MtMjsyNTU9PT10aGlzLmJ1ZltlXTspZS0tO3Q+ZSYmKGU9dCksaT0wO2Zvcih2YXIgcj0wO2UtdCsxPnI7cisrKXt2YXIgcz0xMjcmfnRoaXMuYnVmW3Qrcl07aSs9ND5yP3M8PDcqcjpzKk1hdGgucG93KDIsNypyKX1yZXR1cm4taS0xfSxyZWFkU1ZhcmludDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpO3JldHVybiB0JTI9PT0xPyh0KzEpLy0yOnQvMn0scmVhZEJvb2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbih0aGlzLnJlYWRWYXJpbnQoKSl9LHJlYWRTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPXRoaXMuYnVmLnRvU3RyaW5nKFwidXRmOFwiLHRoaXMucG9zLHQpO3JldHVybiB0aGlzLnBvcz10LGl9LHJlYWRCeXRlczpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9dGhpcy5idWYuc2xpY2UodGhpcy5wb3MsdCk7cmV0dXJuIHRoaXMucG9zPXQsaX0scmVhZFBhY2tlZFZhcmludDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWRWYXJpbnQoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRTVmFyaW50OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRGbG9hdDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtyZXR1cm4gaX0scmVhZFBhY2tlZERvdWJsZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRTRml4ZWQzMjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtyZXR1cm4gaX0scmVhZFBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5yZWFkVmFyaW50KCkrdGhpcy5wb3MsaT1bXTt0aGlzLnBvczx0OylpLnB1c2godGhpcy5yZWFkRml4ZWQ2NCgpKTtyZXR1cm4gaX0scmVhZFBhY2tlZFNGaXhlZDY0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3JldHVybiBpfSxza2lwOmZ1bmN0aW9uKHQpe3ZhciBpPTcmdDtpZihpPT09UGJmLlZhcmludClmb3IoO3RoaXMuYnVmW3RoaXMucG9zKytdPjEyNzspO2Vsc2UgaWYoaT09PVBiZi5CeXRlcyl0aGlzLnBvcz10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcztlbHNlIGlmKGk9PT1QYmYuRml4ZWQzMil0aGlzLnBvcys9NDtlbHNle2lmKGkhPT1QYmYuRml4ZWQ2NCl0aHJvdyBuZXcgRXJyb3IoXCJVbmltcGxlbWVudGVkIHR5cGU6IFwiK2kpO3RoaXMucG9zKz04fX0sd3JpdGVUYWc6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVmFyaW50KHQ8PDN8aSl9LHJlYWxsb2M6ZnVuY3Rpb24odCl7Zm9yKHZhciBpPXRoaXMubGVuZ3RofHwxNjtpPHRoaXMucG9zK3Q7KWkqPTI7aWYoaSE9PXRoaXMubGVuZ3RoKXt2YXIgZT1uZXcgQnVmZmVyKGkpO3RoaXMuYnVmLmNvcHkoZSksdGhpcy5idWY9ZSx0aGlzLmxlbmd0aD1pfX0sZmluaXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RoPXRoaXMucG9zLHRoaXMucG9zPTAsdGhpcy5idWYuc2xpY2UoMCx0aGlzLmxlbmd0aCl9LHdyaXRlRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksdGhpcy5idWYud3JpdGVVSW50MzJMRSh0LHRoaXMucG9zKSx0aGlzLnBvcys9NH0sd3JpdGVTRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksdGhpcy5idWYud3JpdGVJbnQzMkxFKHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZUZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHRoaXMuYnVmLndyaXRlSW50MzJMRSgtMSZ0LHRoaXMucG9zKSx0aGlzLmJ1Zi53cml0ZVVJbnQzMkxFKE1hdGguZmxvb3IodCpTSElGVF9SSUdIVF8zMiksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlU0ZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHRoaXMuYnVmLndyaXRlSW50MzJMRSgtMSZ0LHRoaXMucG9zKSx0aGlzLmJ1Zi53cml0ZUludDMyTEUoTWF0aC5mbG9vcih0KlNISUZUX1JJR0hUXzMyKSx0aGlzLnBvcys0KSx0aGlzLnBvcys9OH0sd3JpdGVWYXJpbnQ6ZnVuY3Rpb24odCl7aWYodD0rdCwxMjc+PXQpdGhpcy5yZWFsbG9jKDEpLHRoaXMuYnVmW3RoaXMucG9zKytdPXQ7ZWxzZSBpZigxNjM4Mz49dCl0aGlzLnJlYWxsb2MoMiksdGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjAmMTI3fDEyOCx0aGlzLmJ1Zlt0aGlzLnBvcysrXT10Pj4+NyYxMjc7ZWxzZSBpZigyMDk3MTUxPj10KXRoaXMucmVhbGxvYygzKSx0aGlzLmJ1Zlt0aGlzLnBvcysrXT10Pj4+MCYxMjd8MTI4LHRoaXMuYnVmW3RoaXMucG9zKytdPXQ+Pj43JjEyN3wxMjgsdGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjE0JjEyNztlbHNlIGlmKDI2ODQzNTQ1NT49dCl0aGlzLnJlYWxsb2MoNCksdGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjAmMTI3fDEyOCx0aGlzLmJ1Zlt0aGlzLnBvcysrXT10Pj4+NyYxMjd8MTI4LHRoaXMuYnVmW3RoaXMucG9zKytdPXQ+Pj4xNCYxMjd8MTI4LHRoaXMuYnVmW3RoaXMucG9zKytdPXQ+Pj4yMSYxMjc7ZWxzZXtmb3IodmFyIGk9dGhpcy5wb3M7dD49MTI4Oyl0aGlzLnJlYWxsb2MoMSksdGhpcy5idWZbdGhpcy5wb3MrK109MjU1JnR8MTI4LHQvPTEyODtpZih0aGlzLnJlYWxsb2MoMSksdGhpcy5idWZbdGhpcy5wb3MrK109MHx0LHRoaXMucG9zLWk+MTApdGhyb3cgbmV3IEVycm9yKFwiR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXNcIil9fSx3cml0ZVNWYXJpbnQ6ZnVuY3Rpb24odCl7dGhpcy53cml0ZVZhcmludCgwPnQ/MiotdC0xOjIqdCl9LHdyaXRlQm9vbGVhbjpmdW5jdGlvbih0KXt0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odCkpfSx3cml0ZVN0cmluZzpmdW5jdGlvbih0KXt0PVN0cmluZyh0KTt2YXIgaT1CdWZmZXIuYnl0ZUxlbmd0aCh0KTt0aGlzLndyaXRlVmFyaW50KGkpLHRoaXMucmVhbGxvYyhpKSx0aGlzLmJ1Zi53cml0ZSh0LHRoaXMucG9zKSx0aGlzLnBvcys9aX0sd3JpdGVGbG9hdDpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksdGhpcy5idWYud3JpdGVGbG9hdExFKHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZURvdWJsZTpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoOCksdGhpcy5idWYud3JpdGVEb3VibGVMRSh0LHRoaXMucG9zKSx0aGlzLnBvcys9OH0sd3JpdGVCeXRlczpmdW5jdGlvbih0KXt2YXIgaT10Lmxlbmd0aDt0aGlzLndyaXRlVmFyaW50KGkpLHRoaXMucmVhbGxvYyhpKTtmb3IodmFyIGU9MDtpPmU7ZSsrKXRoaXMuYnVmW3RoaXMucG9zKytdPXRbZV19LHdyaXRlUmF3TWVzc2FnZTpmdW5jdGlvbih0LGkpe3RoaXMucG9zKys7dmFyIGU9dGhpcy5wb3M7dChpLHRoaXMpO3ZhciByPXRoaXMucG9zLWUscz0xMjc+PXI/MToxNjM4Mz49cj8yOjIwOTcxNTE+PXI/MzoyNjg0MzU0NTU+PXI/NDpNYXRoLmNlaWwoTWF0aC5sb2cocikvKDcqTWF0aC5MTjIpKTtpZihzPjEpe3RoaXMucmVhbGxvYyhzLTEpO2Zvcih2YXIgbj10aGlzLnBvcy0xO24+PWU7bi0tKXRoaXMuYnVmW24rcy0xXT10aGlzLmJ1ZltuXX10aGlzLnBvcz1lLTEsdGhpcy53cml0ZVZhcmludChyKSx0aGlzLnBvcys9cn0sd3JpdGVNZXNzYWdlOmZ1bmN0aW9uKHQsaSxlKXt0aGlzLndyaXRlVGFnKHQsUGJmLkJ5dGVzKSx0aGlzLndyaXRlUmF3TWVzc2FnZShpLGUpfSx3cml0ZVBhY2tlZFZhcmludDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVNZXNzYWdlKHQsd3JpdGVQYWNrZWRWYXJpbnQsaSl9LHdyaXRlUGFja2VkU1ZhcmludDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVNZXNzYWdlKHQsd3JpdGVQYWNrZWRTVmFyaW50LGkpfSx3cml0ZVBhY2tlZEJvb2xlYW46ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkQm9vbGVhbixpKX0sd3JpdGVQYWNrZWRGbG9hdDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVNZXNzYWdlKHQsd3JpdGVQYWNrZWRGbG9hdCxpKX0sd3JpdGVQYWNrZWREb3VibGU6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkRG91YmxlLGkpfSx3cml0ZVBhY2tlZEZpeGVkMzI6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkRml4ZWQzMixpKX0sd3JpdGVQYWNrZWRTRml4ZWQzMjpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVNZXNzYWdlKHQsd3JpdGVQYWNrZWRTRml4ZWQzMixpKX0sd3JpdGVQYWNrZWRGaXhlZDY0OmZ1bmN0aW9uKHQsaSl7dGhpcy53cml0ZU1lc3NhZ2UodCx3cml0ZVBhY2tlZEZpeGVkNjQsaSl9LHdyaXRlUGFja2VkU0ZpeGVkNjQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkU0ZpeGVkNjQsaSl9LHdyaXRlQnl0ZXNGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuQnl0ZXMpLHRoaXMud3JpdGVCeXRlcyhpKX0sd3JpdGVGaXhlZDMyRmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkZpeGVkMzIpLHRoaXMud3JpdGVGaXhlZDMyKGkpfSx3cml0ZVNGaXhlZDMyRmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkZpeGVkMzIpLHRoaXMud3JpdGVTRml4ZWQzMihpKX0sd3JpdGVGaXhlZDY0RmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkZpeGVkNjQpLHRoaXMud3JpdGVGaXhlZDY0KGkpfSx3cml0ZVNGaXhlZDY0RmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkZpeGVkNjQpLHRoaXMud3JpdGVTRml4ZWQ2NChpKX0sd3JpdGVWYXJpbnRGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuVmFyaW50KSx0aGlzLndyaXRlVmFyaW50KGkpfSx3cml0ZVNWYXJpbnRGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuVmFyaW50KSx0aGlzLndyaXRlU1ZhcmludChpKX0sd3JpdGVTdHJpbmdGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuQnl0ZXMpLHRoaXMud3JpdGVTdHJpbmcoaSl9LHdyaXRlRmxvYXRGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuRml4ZWQzMiksdGhpcy53cml0ZUZsb2F0KGkpfSx3cml0ZURvdWJsZUZpZWxkOmZ1bmN0aW9uKHQsaSl7dGhpcy53cml0ZVRhZyh0LFBiZi5GaXhlZDY0KSx0aGlzLndyaXRlRG91YmxlKGkpfSx3cml0ZUJvb2xlYW5GaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVWYXJpbnRGaWVsZCh0LEJvb2xlYW4oaSkpfX07XG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcblxufSx7XCIuL2J1ZmZlclwiOjEzNX1dLDEzNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBQb2ludCh0LG4pe3RoaXMueD10LHRoaXMueT1ufW1vZHVsZS5leHBvcnRzPVBvaW50LFBvaW50LnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFBvaW50KHRoaXMueCx0aGlzLnkpfSxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHQpfSxzdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHQpfSxtdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX211bHQodCl9LGRpdjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYodCl9LHJvdGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUodCl9LG1hdE11bHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fbWF0TXVsdCh0KX0sdW5pdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX3VuaXQoKX0scGVycDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX3BlcnAoKX0scm91bmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3VuZCgpfSxtYWc6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9LGVxdWFsczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54PT09dC54JiZ0aGlzLnk9PT10Lnl9LGRpc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RTcXIodCkpfSxkaXN0U3FyOmZ1bmN0aW9uKHQpe3ZhciBuPXQueC10aGlzLngsaT10LnktdGhpcy55O3JldHVybiBuKm4raSppfSxhbmdsZTpmdW5jdGlvbigpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueSx0aGlzLngpfSxhbmdsZVRvOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueS10LnksdGhpcy54LXQueCl9LGFuZ2xlV2l0aDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hbmdsZVdpdGhTZXAodC54LHQueSl9LGFuZ2xlV2l0aFNlcDpmdW5jdGlvbih0LG4pe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueCpuLXRoaXMueSp0LHRoaXMueCp0K3RoaXMueSpuKX0sX21hdE11bHQ6ZnVuY3Rpb24odCl7dmFyIG49dFswXSp0aGlzLngrdFsxXSp0aGlzLnksaT10WzJdKnRoaXMueCt0WzNdKnRoaXMueTtyZXR1cm4gdGhpcy54PW4sdGhpcy55PWksdGhpc30sX2FkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc30sX3N1YjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc30sX211bHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc30sX2RpdjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Lz10LHRoaXMueS89dCx0aGlzfSxfdW5pdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXYodGhpcy5tYWcoKSksdGhpc30sX3BlcnA6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnk7cmV0dXJuIHRoaXMueT10aGlzLngsdGhpcy54PS10LHRoaXN9LF9yb3RhdGU6ZnVuY3Rpb24odCl7dmFyIG49TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KSxzPW4qdGhpcy54LWkqdGhpcy55LHI9aSp0aGlzLngrbip0aGlzLnk7cmV0dXJuIHRoaXMueD1zLHRoaXMueT1yLHRoaXN9LF9yb3VuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc319LFBvaW50LmNvbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBQb2ludD90OkFycmF5LmlzQXJyYXkodCk/bmV3IFBvaW50KHRbMF0sdFsxXSk6dH07XG59LHt9XSwxMzg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7ZHJhaW5pbmc9ITEsY3VycmVudFF1ZXVlLmxlbmd0aD9xdWV1ZT1jdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTpxdWV1ZUluZGV4PS0xLHF1ZXVlLmxlbmd0aCYmZHJhaW5RdWV1ZSgpfWZ1bmN0aW9uIGRyYWluUXVldWUoKXtpZighZHJhaW5pbmcpe3ZhciBlPXNldFRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtkcmFpbmluZz0hMDtmb3IodmFyIG49cXVldWUubGVuZ3RoO247KXtmb3IoY3VycmVudFF1ZXVlPXF1ZXVlLHF1ZXVlPVtdOysrcXVldWVJbmRleDxuOyljdXJyZW50UXVldWUmJmN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtxdWV1ZUluZGV4PS0xLG49cXVldWUubGVuZ3RofWN1cnJlbnRRdWV1ZT1udWxsLGRyYWluaW5nPSExLGNsZWFyVGltZW91dChlKX19ZnVuY3Rpb24gSXRlbShlLG4pe3RoaXMuZnVuPWUsdGhpcy5hcnJheT1ufWZ1bmN0aW9uIG5vb3AoKXt9dmFyIHByb2Nlc3M9bW9kdWxlLmV4cG9ydHM9e30scXVldWU9W10sZHJhaW5pbmc9ITEsY3VycmVudFF1ZXVlLHF1ZXVlSW5kZXg9LTE7cHJvY2Vzcy5uZXh0VGljaz1mdW5jdGlvbihlKXt2YXIgbj1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO3F1ZXVlLnB1c2gobmV3IEl0ZW0oZSxuKSksMSE9PXF1ZXVlLmxlbmd0aHx8ZHJhaW5pbmd8fHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwwKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0scHJvY2Vzcy50aXRsZT1cImJyb3dzZXJcIixwcm9jZXNzLmJyb3dzZXI9ITAscHJvY2Vzcy5lbnY9e30scHJvY2Vzcy5hcmd2PVtdLHByb2Nlc3MudmVyc2lvbj1cIlwiLHByb2Nlc3MudmVyc2lvbnM9e30scHJvY2Vzcy5vbj1ub29wLHByb2Nlc3MuYWRkTGlzdGVuZXI9bm9vcCxwcm9jZXNzLm9uY2U9bm9vcCxwcm9jZXNzLm9mZj1ub29wLHByb2Nlc3MucmVtb3ZlTGlzdGVuZXI9bm9vcCxwcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycz1ub29wLHByb2Nlc3MuZW1pdD1ub29wLHByb2Nlc3MuYmluZGluZz1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZFwiKX0scHJvY2Vzcy5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm5cIi9cIn0scHJvY2Vzcy5jaGRpcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcIil9LHByb2Nlc3MudW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH07XG59LHt9XSwxMzk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuIWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChpLG4pe3JldHVybiB0aGlzIGluc3RhbmNlb2YgdD8odGhpcy5fbWF4RW50cmllcz1NYXRoLm1heCg0LGl8fDkpLHRoaXMuX21pbkVudHJpZXM9TWF0aC5tYXgoMixNYXRoLmNlaWwoLjQqdGhpcy5fbWF4RW50cmllcykpLG4mJnRoaXMuX2luaXRGb3JtYXQobiksdm9pZCB0aGlzLmNsZWFyKCkpOm5ldyB0KGksbil9ZnVuY3Rpb24gaSh0LGkpe3QuYmJveD1uKHQsMCx0LmNoaWxkcmVuLmxlbmd0aCxpKX1mdW5jdGlvbiBuKHQsaSxuLHIpe2Zvcih2YXIgbyxhPWUoKSxzPWk7bj5zO3MrKylvPXQuY2hpbGRyZW5bc10saChhLHQubGVhZj9yKG8pOm8uYmJveCk7cmV0dXJuIGF9ZnVuY3Rpb24gZSgpe3JldHVyblsxLzAsMS8wLC0oMS8wKSwtKDEvMCldfWZ1bmN0aW9uIGgodCxpKXtyZXR1cm4gdFswXT1NYXRoLm1pbih0WzBdLGlbMF0pLHRbMV09TWF0aC5taW4odFsxXSxpWzFdKSx0WzJdPU1hdGgubWF4KHRbMl0saVsyXSksdFszXT1NYXRoLm1heCh0WzNdLGlbM10pLHR9ZnVuY3Rpb24gcih0LGkpe3JldHVybiB0LmJib3hbMF0taS5iYm94WzBdfWZ1bmN0aW9uIG8odCxpKXtyZXR1cm4gdC5iYm94WzFdLWkuYmJveFsxXX1mdW5jdGlvbiBhKHQpe3JldHVybih0WzJdLXRbMF0pKih0WzNdLXRbMV0pfWZ1bmN0aW9uIHModCl7cmV0dXJuIHRbMl0tdFswXSsodFszXS10WzFdKX1mdW5jdGlvbiBsKHQsaSl7cmV0dXJuKE1hdGgubWF4KGlbMl0sdFsyXSktTWF0aC5taW4oaVswXSx0WzBdKSkqKE1hdGgubWF4KGlbM10sdFszXSktTWF0aC5taW4oaVsxXSx0WzFdKSl9ZnVuY3Rpb24gdSh0LGkpe3ZhciBuPU1hdGgubWF4KHRbMF0saVswXSksZT1NYXRoLm1heCh0WzFdLGlbMV0pLGg9TWF0aC5taW4odFsyXSxpWzJdKSxyPU1hdGgubWluKHRbM10saVszXSk7cmV0dXJuIE1hdGgubWF4KDAsaC1uKSpNYXRoLm1heCgwLHItZSl9ZnVuY3Rpb24gZih0LGkpe3JldHVybiB0WzBdPD1pWzBdJiZ0WzFdPD1pWzFdJiZpWzJdPD10WzJdJiZpWzNdPD10WzNdfWZ1bmN0aW9uIGModCxpKXtyZXR1cm4gaVswXTw9dFsyXSYmaVsxXTw9dFszXSYmaVsyXT49dFswXSYmaVszXT49dFsxXX1mdW5jdGlvbiBkKHQsaSxuLGUsaCl7Zm9yKHZhciByLG89W2ksbl07by5sZW5ndGg7KW49by5wb3AoKSxpPW8ucG9wKCksZT49bi1pfHwocj1pK01hdGguY2VpbCgobi1pKS9lLzIpKmUseCh0LGksbixyLGgpLG8ucHVzaChpLHIscixuKSl9ZnVuY3Rpb24geCh0LGksbixlLGgpe2Zvcih2YXIgcixvLGEscyxsLHUsZixjLGQ7bj5pOyl7Zm9yKG4taT42MDAmJihyPW4taSsxLG89ZS1pKzEsYT1NYXRoLmxvZyhyKSxzPS41Kk1hdGguZXhwKDIqYS8zKSxsPS41Kk1hdGguc3FydChhKnMqKHItcykvcikqKDA+by1yLzI/LTE6MSksdT1NYXRoLm1heChpLE1hdGguZmxvb3IoZS1vKnMvcitsKSksZj1NYXRoLm1pbihuLE1hdGguZmxvb3IoZSsoci1vKSpzL3IrbCkpLHgodCx1LGYsZSxoKSksYz10W2VdLG89aSxkPW4scCh0LGksZSksaCh0W25dLGMpPjAmJnAodCxpLG4pO2Q+bzspe2ZvcihwKHQsbyxkKSxvKyssZC0tO2godFtvXSxjKTwwOylvKys7Zm9yKDtoKHRbZF0sYyk+MDspZC0tfTA9PT1oKHRbaV0sYyk/cCh0LGksZCk6KGQrKyxwKHQsZCxuKSksZT49ZCYmKGk9ZCsxKSxkPj1lJiYobj1kLTEpfX1mdW5jdGlvbiBwKHQsaSxuKXt2YXIgZT10W2ldO3RbaV09dFtuXSx0W25dPWV9dC5wcm90b3R5cGU9e2FsbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbGwodGhpcy5kYXRhLFtdKX0sc2VhcmNoOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZGF0YSxuPVtdLGU9dGhpcy50b0JCb3g7aWYoIWModCxpLmJib3gpKXJldHVybiBuO2Zvcih2YXIgaCxyLG8sYSxzPVtdO2k7KXtmb3IoaD0wLHI9aS5jaGlsZHJlbi5sZW5ndGg7cj5oO2grKylvPWkuY2hpbGRyZW5baF0sYT1pLmxlYWY/ZShvKTpvLmJib3gsYyh0LGEpJiYoaS5sZWFmP24ucHVzaChvKTpmKHQsYSk/dGhpcy5fYWxsKG8sbik6cy5wdXNoKG8pKTtpPXMucG9wKCl9cmV0dXJuIG59LGNvbGxpZGVzOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZGF0YSxuPXRoaXMudG9CQm94O2lmKCFjKHQsaS5iYm94KSlyZXR1cm4hMTtmb3IodmFyIGUsaCxyLG8sYT1bXTtpOyl7Zm9yKGU9MCxoPWkuY2hpbGRyZW4ubGVuZ3RoO2g+ZTtlKyspaWYocj1pLmNoaWxkcmVuW2VdLG89aS5sZWFmP24ocik6ci5iYm94LGModCxvKSl7aWYoaS5sZWFmfHxmKHQsbykpcmV0dXJuITA7YS5wdXNoKHIpfWk9YS5wb3AoKX1yZXR1cm4hMX0sbG9hZDpmdW5jdGlvbih0KXtpZighdHx8IXQubGVuZ3RoKXJldHVybiB0aGlzO2lmKHQubGVuZ3RoPHRoaXMuX21pbkVudHJpZXMpe2Zvcih2YXIgaT0wLG49dC5sZW5ndGg7bj5pO2krKyl0aGlzLmluc2VydCh0W2ldKTtyZXR1cm4gdGhpc312YXIgZT10aGlzLl9idWlsZCh0LnNsaWNlKCksMCx0Lmxlbmd0aC0xLDApO2lmKHRoaXMuZGF0YS5jaGlsZHJlbi5sZW5ndGgpaWYodGhpcy5kYXRhLmhlaWdodD09PWUuaGVpZ2h0KXRoaXMuX3NwbGl0Um9vdCh0aGlzLmRhdGEsZSk7ZWxzZXtpZih0aGlzLmRhdGEuaGVpZ2h0PGUuaGVpZ2h0KXt2YXIgaD10aGlzLmRhdGE7dGhpcy5kYXRhPWUsZT1ofXRoaXMuX2luc2VydChlLHRoaXMuZGF0YS5oZWlnaHQtZS5oZWlnaHQtMSwhMCl9ZWxzZSB0aGlzLmRhdGE9ZTtyZXR1cm4gdGhpc30saW5zZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0aGlzLl9pbnNlcnQodCx0aGlzLmRhdGEuaGVpZ2h0LTEpLHRoaXN9LGNsZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YT17Y2hpbGRyZW46W10saGVpZ2h0OjEsYmJveDplKCksbGVhZjohMH0sdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiB0aGlzO2Zvcih2YXIgaSxuLGUsaCxyPXRoaXMuZGF0YSxvPXRoaXMudG9CQm94KHQpLGE9W10scz1bXTtyfHxhLmxlbmd0aDspe2lmKHJ8fChyPWEucG9wKCksbj1hW2EubGVuZ3RoLTFdLGk9cy5wb3AoKSxoPSEwKSxyLmxlYWYmJihlPXIuY2hpbGRyZW4uaW5kZXhPZih0KSwtMSE9PWUpKXJldHVybiByLmNoaWxkcmVuLnNwbGljZShlLDEpLGEucHVzaChyKSx0aGlzLl9jb25kZW5zZShhKSx0aGlzO2h8fHIubGVhZnx8IWYoci5iYm94LG8pP24/KGkrKyxyPW4uY2hpbGRyZW5baV0saD0hMSk6cj1udWxsOihhLnB1c2gocikscy5wdXNoKGkpLGk9MCxuPXIscj1yLmNoaWxkcmVuWzBdKX1yZXR1cm4gdGhpc30sdG9CQm94OmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjb21wYXJlTWluWDpmdW5jdGlvbih0LGkpe3JldHVybiB0WzBdLWlbMF19LGNvbXBhcmVNaW5ZOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRbMV0taVsxXX0sdG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX0sZnJvbUpTT046ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YT10LHRoaXN9LF9hbGw6ZnVuY3Rpb24odCxpKXtmb3IodmFyIG49W107dDspdC5sZWFmP2kucHVzaC5hcHBseShpLHQuY2hpbGRyZW4pOm4ucHVzaC5hcHBseShuLHQuY2hpbGRyZW4pLHQ9bi5wb3AoKTtyZXR1cm4gaX0sX2J1aWxkOmZ1bmN0aW9uKHQsbixlLGgpe3ZhciByLG89ZS1uKzEsYT10aGlzLl9tYXhFbnRyaWVzO2lmKGE+PW8pcmV0dXJuIHI9e2NoaWxkcmVuOnQuc2xpY2UobixlKzEpLGhlaWdodDoxLGJib3g6bnVsbCxsZWFmOiEwfSxpKHIsdGhpcy50b0JCb3gpLHI7aHx8KGg9TWF0aC5jZWlsKE1hdGgubG9nKG8pL01hdGgubG9nKGEpKSxhPU1hdGguY2VpbChvL01hdGgucG93KGEsaC0xKSkpLHI9e2NoaWxkcmVuOltdLGhlaWdodDpoLGJib3g6bnVsbCxsZWFmOiExfTt2YXIgcyxsLHUsZixjPU1hdGguY2VpbChvL2EpLHg9YypNYXRoLmNlaWwoTWF0aC5zcXJ0KGEpKTtmb3IoZCh0LG4sZSx4LHRoaXMuY29tcGFyZU1pblgpLHM9bjtlPj1zO3MrPXgpZm9yKHU9TWF0aC5taW4ocyt4LTEsZSksZCh0LHMsdSxjLHRoaXMuY29tcGFyZU1pblkpLGw9czt1Pj1sO2wrPWMpZj1NYXRoLm1pbihsK2MtMSx1KSxyLmNoaWxkcmVuLnB1c2godGhpcy5fYnVpbGQodCxsLGYsaC0xKSk7cmV0dXJuIGkocix0aGlzLnRvQkJveCkscn0sX2Nob29zZVN1YnRyZWU6ZnVuY3Rpb24odCxpLG4sZSl7Zm9yKHZhciBoLHIsbyxzLHUsZixjLGQ7Oyl7aWYoZS5wdXNoKGkpLGkubGVhZnx8ZS5sZW5ndGgtMT09PW4pYnJlYWs7Zm9yKGM9ZD0xLzAsaD0wLHI9aS5jaGlsZHJlbi5sZW5ndGg7cj5oO2grKylvPWkuY2hpbGRyZW5baF0sdT1hKG8uYmJveCksZj1sKHQsby5iYm94KS11LGQ+Zj8oZD1mLGM9Yz51P3U6YyxzPW8pOmY9PT1kJiZjPnUmJihjPXUscz1vKTtpPXN9cmV0dXJuIGl9LF9pbnNlcnQ6ZnVuY3Rpb24odCxpLG4pe3ZhciBlPXRoaXMudG9CQm94LHI9bj90LmJib3g6ZSh0KSxvPVtdLGE9dGhpcy5fY2hvb3NlU3VidHJlZShyLHRoaXMuZGF0YSxpLG8pO2ZvcihhLmNoaWxkcmVuLnB1c2godCksaChhLmJib3gscik7aT49MCYmb1tpXS5jaGlsZHJlbi5sZW5ndGg+dGhpcy5fbWF4RW50cmllczspdGhpcy5fc3BsaXQobyxpKSxpLS07dGhpcy5fYWRqdXN0UGFyZW50QkJveGVzKHIsbyxpKX0sX3NwbGl0OmZ1bmN0aW9uKHQsbil7dmFyIGU9dFtuXSxoPWUuY2hpbGRyZW4ubGVuZ3RoLHI9dGhpcy5fbWluRW50cmllczt0aGlzLl9jaG9vc2VTcGxpdEF4aXMoZSxyLGgpO3ZhciBvPXRoaXMuX2Nob29zZVNwbGl0SW5kZXgoZSxyLGgpLGE9e2NoaWxkcmVuOmUuY2hpbGRyZW4uc3BsaWNlKG8sZS5jaGlsZHJlbi5sZW5ndGgtbyksaGVpZ2h0OmUuaGVpZ2h0LGJib3g6bnVsbCxsZWFmOiExfTtlLmxlYWYmJihhLmxlYWY9ITApLGkoZSx0aGlzLnRvQkJveCksaShhLHRoaXMudG9CQm94KSxuP3Rbbi0xXS5jaGlsZHJlbi5wdXNoKGEpOnRoaXMuX3NwbGl0Um9vdChlLGEpfSxfc3BsaXRSb290OmZ1bmN0aW9uKHQsbil7dGhpcy5kYXRhPXtjaGlsZHJlbjpbdCxuXSxoZWlnaHQ6dC5oZWlnaHQrMSxiYm94Om51bGwsbGVhZjohMX0saSh0aGlzLmRhdGEsdGhpcy50b0JCb3gpfSxfY2hvb3NlU3BsaXRJbmRleDpmdW5jdGlvbih0LGksZSl7dmFyIGgscixvLHMsbCxmLGMsZDtmb3IoZj1jPTEvMCxoPWk7ZS1pPj1oO2grKylyPW4odCwwLGgsdGhpcy50b0JCb3gpLG89bih0LGgsZSx0aGlzLnRvQkJveCkscz11KHIsbyksbD1hKHIpK2EobyksZj5zPyhmPXMsZD1oLGM9Yz5sP2w6Yyk6cz09PWYmJmM+bCYmKGM9bCxkPWgpO3JldHVybiBkfSxfY2hvb3NlU3BsaXRBeGlzOmZ1bmN0aW9uKHQsaSxuKXt2YXIgZT10LmxlYWY/dGhpcy5jb21wYXJlTWluWDpyLGg9dC5sZWFmP3RoaXMuY29tcGFyZU1pblk6byxhPXRoaXMuX2FsbERpc3RNYXJnaW4odCxpLG4sZSkscz10aGlzLl9hbGxEaXN0TWFyZ2luKHQsaSxuLGgpO3M+YSYmdC5jaGlsZHJlbi5zb3J0KGUpfSxfYWxsRGlzdE1hcmdpbjpmdW5jdGlvbih0LGksZSxyKXt0LmNoaWxkcmVuLnNvcnQocik7dmFyIG8sYSxsPXRoaXMudG9CQm94LHU9bih0LDAsaSxsKSxmPW4odCxlLWksZSxsKSxjPXModSkrcyhmKTtmb3Iobz1pO2UtaT5vO28rKylhPXQuY2hpbGRyZW5bb10saCh1LHQubGVhZj9sKGEpOmEuYmJveCksYys9cyh1KTtmb3Iobz1lLWktMTtvPj1pO28tLSlhPXQuY2hpbGRyZW5bb10saChmLHQubGVhZj9sKGEpOmEuYmJveCksYys9cyhmKTtyZXR1cm4gY30sX2FkanVzdFBhcmVudEJCb3hlczpmdW5jdGlvbih0LGksbil7Zm9yKHZhciBlPW47ZT49MDtlLS0paChpW2VdLmJib3gsdCl9LF9jb25kZW5zZTpmdW5jdGlvbih0KXtmb3IodmFyIG4sZT10Lmxlbmd0aC0xO2U+PTA7ZS0tKTA9PT10W2VdLmNoaWxkcmVuLmxlbmd0aD9lPjA/KG49dFtlLTFdLmNoaWxkcmVuLG4uc3BsaWNlKG4uaW5kZXhPZih0W2VdKSwxKSk6dGhpcy5jbGVhcigpOmkodFtlXSx0aGlzLnRvQkJveCl9LF9pbml0Rm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBpPVtcInJldHVybiBhXCIsXCIgLSBiXCIsXCI7XCJdO3RoaXMuY29tcGFyZU1pblg9bmV3IEZ1bmN0aW9uKFwiYVwiLFwiYlwiLGkuam9pbih0WzBdKSksdGhpcy5jb21wYXJlTWluWT1uZXcgRnVuY3Rpb24oXCJhXCIsXCJiXCIsaS5qb2luKHRbMV0pKSx0aGlzLnRvQkJveD1uZXcgRnVuY3Rpb24oXCJhXCIsXCJyZXR1cm4gW2FcIit0LmpvaW4oXCIsIGFcIikrXCJdO1wiKX19LFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoXCJyYnVzaFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHR9KTpcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQ6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZi5yYnVzaD10OndpbmRvdy5yYnVzaD10fSgpO1xufSx7fV0sMTQwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbnZvaWQgZnVuY3Rpb24oZSxyKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHIpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPXIoKTplLnJlc29sdmVVcmw9cigpfSh0aGlzLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7aWYoMD09PWUpdGhyb3cgbmV3IEVycm9yKFwicmVzb2x2ZVVybCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYXJndW1lbnQ7IGdvdCBub25lLlwiKTt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYmFzZVwiKTtpZihyLmhyZWY9YXJndW1lbnRzWzBdLDE9PT1lKXJldHVybiByLmhyZWY7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdO3QuaW5zZXJ0QmVmb3JlKHIsdC5maXJzdENoaWxkKTtmb3IodmFyIG4sbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKSxmPTE7ZT5mO2YrKylvLmhyZWY9YXJndW1lbnRzW2ZdLG49by5ocmVmLHIuaHJlZj1uO3JldHVybiB0LnJlbW92ZUNoaWxkKHIpLG59cmV0dXJuIGV9KTtcbn0se31dLDE0MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5mdW5jdGlvbiBVbml0QmV6aWVyKHQsaSxlLHIpe3RoaXMuY3g9Myp0LHRoaXMuYng9MyooZS10KS10aGlzLmN4LHRoaXMuYXg9MS10aGlzLmN4LXRoaXMuYngsdGhpcy5jeT0zKmksdGhpcy5ieT0zKihyLWkpLXRoaXMuY3ksdGhpcy5heT0xLXRoaXMuY3ktdGhpcy5ieSx0aGlzLnAxeD10LHRoaXMucDF5PXIsdGhpcy5wMng9ZSx0aGlzLnAyeT1yfW1vZHVsZS5leHBvcnRzPVVuaXRCZXppZXIsVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVYPWZ1bmN0aW9uKHQpe3JldHVybigodGhpcy5heCp0K3RoaXMuYngpKnQrdGhpcy5jeCkqdH0sVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVZPWZ1bmN0aW9uKHQpe3JldHVybigodGhpcy5heSp0K3RoaXMuYnkpKnQrdGhpcy5jeSkqdH0sVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVEZXJpdmF0aXZlWD1mdW5jdGlvbih0KXtyZXR1cm4oMyp0aGlzLmF4KnQrMip0aGlzLmJ4KSp0K3RoaXMuY3h9LFVuaXRCZXppZXIucHJvdG90eXBlLnNvbHZlQ3VydmVYPWZ1bmN0aW9uKHQsaSl7XCJ1bmRlZmluZWRcIj09dHlwZW9mIGkmJihpPTFlLTYpO3ZhciBlLHIscyxoLG47Zm9yKHM9dCxuPTA7OD5uO24rKyl7aWYoaD10aGlzLnNhbXBsZUN1cnZlWChzKS10LE1hdGguYWJzKGgpPGkpcmV0dXJuIHM7dmFyIHU9dGhpcy5zYW1wbGVDdXJ2ZURlcml2YXRpdmVYKHMpO2lmKE1hdGguYWJzKHUpPDFlLTYpYnJlYWs7cy09aC91fWlmKGU9MCxyPTEscz10LGU+cylyZXR1cm4gZTtpZihzPnIpcmV0dXJuIHI7Zm9yKDtyPmU7KXtpZihoPXRoaXMuc2FtcGxlQ3VydmVYKHMpLE1hdGguYWJzKGgtdCk8aSlyZXR1cm4gczt0Pmg/ZT1zOnI9cyxzPS41KihyLWUpK2V9cmV0dXJuIHN9LFVuaXRCZXppZXIucHJvdG90eXBlLnNvbHZlPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRoaXMuc2FtcGxlQ3VydmVZKHRoaXMuc29sdmVDdXJ2ZVgodCxpKSl9O1xufSx7fV0sMTQyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKG8pe3JldHVybiBvJiZcIm9iamVjdFwiPT10eXBlb2YgbyYmXCJmdW5jdGlvblwiPT10eXBlb2Ygby5jb3B5JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBvLmZpbGwmJlwiZnVuY3Rpb25cIj09dHlwZW9mIG8ucmVhZFVJbnQ4fTtcbn0se31dLDE0MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4oZnVuY3Rpb24gKHByb2Nlc3MsZ2xvYmFsKXtcbmZ1bmN0aW9uIGluc3BlY3QoZSxyKXt2YXIgdD17c2VlbjpbXSxzdHlsaXplOnN0eWxpemVOb0NvbG9yfTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKHQuZGVwdGg9YXJndW1lbnRzWzJdKSxhcmd1bWVudHMubGVuZ3RoPj00JiYodC5jb2xvcnM9YXJndW1lbnRzWzNdKSxpc0Jvb2xlYW4ocik/dC5zaG93SGlkZGVuPXI6ciYmZXhwb3J0cy5fZXh0ZW5kKHQsciksaXNVbmRlZmluZWQodC5zaG93SGlkZGVuKSYmKHQuc2hvd0hpZGRlbj0hMSksaXNVbmRlZmluZWQodC5kZXB0aCkmJih0LmRlcHRoPTIpLGlzVW5kZWZpbmVkKHQuY29sb3JzKSYmKHQuY29sb3JzPSExKSxpc1VuZGVmaW5lZCh0LmN1c3RvbUluc3BlY3QpJiYodC5jdXN0b21JbnNwZWN0PSEwKSx0LmNvbG9ycyYmKHQuc3R5bGl6ZT1zdHlsaXplV2l0aENvbG9yKSxmb3JtYXRWYWx1ZSh0LGUsdC5kZXB0aCl9ZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihlLHIpe3ZhciB0PWluc3BlY3Quc3R5bGVzW3JdO3JldHVybiB0P1wiXHUwMDFiW1wiK2luc3BlY3QuY29sb3JzW3RdWzBdK1wibVwiK2UrXCJcdTAwMWJbXCIraW5zcGVjdC5jb2xvcnNbdF1bMV0rXCJtXCI6ZX1mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihlLHIpe3JldHVybiBlfWZ1bmN0aW9uIGFycmF5VG9IYXNoKGUpe3ZhciByPXt9O3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oZSx0KXtyW2VdPSEwfSkscn1mdW5jdGlvbiBmb3JtYXRWYWx1ZShlLHIsdCl7aWYoZS5jdXN0b21JbnNwZWN0JiZyJiZpc0Z1bmN0aW9uKHIuaW5zcGVjdCkmJnIuaW5zcGVjdCE9PWV4cG9ydHMuaW5zcGVjdCYmKCFyLmNvbnN0cnVjdG9yfHxyLmNvbnN0cnVjdG9yLnByb3RvdHlwZSE9PXIpKXt2YXIgbj1yLmluc3BlY3QodCxlKTtyZXR1cm4gaXNTdHJpbmcobil8fChuPWZvcm1hdFZhbHVlKGUsbix0KSksbn12YXIgaT1mb3JtYXRQcmltaXRpdmUoZSxyKTtpZihpKXJldHVybiBpO3ZhciBvPU9iamVjdC5rZXlzKHIpLHM9YXJyYXlUb0hhc2gobyk7aWYoZS5zaG93SGlkZGVuJiYobz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKSksaXNFcnJvcihyKSYmKG8uaW5kZXhPZihcIm1lc3NhZ2VcIik+PTB8fG8uaW5kZXhPZihcImRlc2NyaXB0aW9uXCIpPj0wKSlyZXR1cm4gZm9ybWF0RXJyb3Iocik7aWYoMD09PW8ubGVuZ3RoKXtpZihpc0Z1bmN0aW9uKHIpKXt2YXIgdT1yLm5hbWU/XCI6IFwiK3IubmFtZTpcIlwiO3JldHVybiBlLnN0eWxpemUoXCJbRnVuY3Rpb25cIit1K1wiXVwiLFwic3BlY2lhbFwiKX1pZihpc1JlZ0V4cChyKSlyZXR1cm4gZS5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyKSxcInJlZ2V4cFwiKTtpZihpc0RhdGUocikpcmV0dXJuIGUuc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpLFwiZGF0ZVwiKTtpZihpc0Vycm9yKHIpKXJldHVybiBmb3JtYXRFcnJvcihyKX12YXIgYT1cIlwiLGM9ITEsbD1bXCJ7XCIsXCJ9XCJdO2lmKGlzQXJyYXkocikmJihjPSEwLGw9W1wiW1wiLFwiXVwiXSksaXNGdW5jdGlvbihyKSl7dmFyIHA9ci5uYW1lP1wiOiBcIityLm5hbWU6XCJcIjthPVwiIFtGdW5jdGlvblwiK3ArXCJdXCJ9aWYoaXNSZWdFeHAocikmJihhPVwiIFwiK1JlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyKSksaXNEYXRlKHIpJiYoYT1cIiBcIitEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHIpKSxpc0Vycm9yKHIpJiYoYT1cIiBcIitmb3JtYXRFcnJvcihyKSksMD09PW8ubGVuZ3RoJiYoIWN8fDA9PXIubGVuZ3RoKSlyZXR1cm4gbFswXSthK2xbMV07aWYoMD50KXJldHVybiBpc1JlZ0V4cChyKT9lLnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpLFwicmVnZXhwXCIpOmUuc3R5bGl6ZShcIltPYmplY3RdXCIsXCJzcGVjaWFsXCIpO2Uuc2Vlbi5wdXNoKHIpO3ZhciBmO3JldHVybiBmPWM/Zm9ybWF0QXJyYXkoZSxyLHQscyxvKTpvLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZm9ybWF0UHJvcGVydHkoZSxyLHQscyxuLGMpfSksZS5zZWVuLnBvcCgpLHJlZHVjZVRvU2luZ2xlU3RyaW5nKGYsYSxsKX1mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoZSxyKXtpZihpc1VuZGVmaW5lZChyKSlyZXR1cm4gZS5zdHlsaXplKFwidW5kZWZpbmVkXCIsXCJ1bmRlZmluZWRcIik7aWYoaXNTdHJpbmcocikpe3ZhciB0PVwiJ1wiK0pTT04uc3RyaW5naWZ5KHIpLnJlcGxhY2UoL15cInxcIiQvZyxcIlwiKS5yZXBsYWNlKC8nL2csXCJcXFxcJ1wiKS5yZXBsYWNlKC9cXFxcXCIvZywnXCInKStcIidcIjtyZXR1cm4gZS5zdHlsaXplKHQsXCJzdHJpbmdcIil9cmV0dXJuIGlzTnVtYmVyKHIpP2Uuc3R5bGl6ZShcIlwiK3IsXCJudW1iZXJcIik6aXNCb29sZWFuKHIpP2Uuc3R5bGl6ZShcIlwiK3IsXCJib29sZWFuXCIpOmlzTnVsbChyKT9lLnN0eWxpemUoXCJudWxsXCIsXCJudWxsXCIpOnZvaWQgMH1mdW5jdGlvbiBmb3JtYXRFcnJvcihlKXtyZXR1cm5cIltcIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKStcIl1cIn1mdW5jdGlvbiBmb3JtYXRBcnJheShlLHIsdCxuLGkpe2Zvcih2YXIgbz1bXSxzPTAsdT1yLmxlbmd0aDt1PnM7KytzKWhhc093blByb3BlcnR5KHIsU3RyaW5nKHMpKT9vLnB1c2goZm9ybWF0UHJvcGVydHkoZSxyLHQsbixTdHJpbmcocyksITApKTpvLnB1c2goXCJcIik7cmV0dXJuIGkuZm9yRWFjaChmdW5jdGlvbihpKXtpLm1hdGNoKC9eXFxkKyQvKXx8by5wdXNoKGZvcm1hdFByb3BlcnR5KGUscix0LG4saSwhMCkpfSksb31mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShlLHIsdCxuLGksbyl7dmFyIHMsdSxhO2lmKGE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGkpfHx7dmFsdWU6cltpXX0sYS5nZXQ/dT1hLnNldD9lLnN0eWxpemUoXCJbR2V0dGVyL1NldHRlcl1cIixcInNwZWNpYWxcIik6ZS5zdHlsaXplKFwiW0dldHRlcl1cIixcInNwZWNpYWxcIik6YS5zZXQmJih1PWUuc3R5bGl6ZShcIltTZXR0ZXJdXCIsXCJzcGVjaWFsXCIpKSxoYXNPd25Qcm9wZXJ0eShuLGkpfHwocz1cIltcIitpK1wiXVwiKSx1fHwoZS5zZWVuLmluZGV4T2YoYS52YWx1ZSk8MD8odT1pc051bGwodCk/Zm9ybWF0VmFsdWUoZSxhLnZhbHVlLG51bGwpOmZvcm1hdFZhbHVlKGUsYS52YWx1ZSx0LTEpLHUuaW5kZXhPZihcIlxcblwiKT4tMSYmKHU9bz91LnNwbGl0KFwiXFxuXCIpLm1hcChmdW5jdGlvbihlKXtyZXR1cm5cIiAgXCIrZX0pLmpvaW4oXCJcXG5cIikuc3Vic3RyKDIpOlwiXFxuXCIrdS5zcGxpdChcIlxcblwiKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuXCIgICBcIitlfSkuam9pbihcIlxcblwiKSkpOnU9ZS5zdHlsaXplKFwiW0NpcmN1bGFyXVwiLFwic3BlY2lhbFwiKSksaXNVbmRlZmluZWQocykpe2lmKG8mJmkubWF0Y2goL15cXGQrJC8pKXJldHVybiB1O3M9SlNPTi5zdHJpbmdpZnkoXCJcIitpKSxzLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKT8ocz1zLnN1YnN0cigxLHMubGVuZ3RoLTIpLHM9ZS5zdHlsaXplKHMsXCJuYW1lXCIpKToocz1zLnJlcGxhY2UoLycvZyxcIlxcXFwnXCIpLnJlcGxhY2UoL1xcXFxcIi9nLCdcIicpLnJlcGxhY2UoLyheXCJ8XCIkKS9nLFwiJ1wiKSxzPWUuc3R5bGl6ZShzLFwic3RyaW5nXCIpKX1yZXR1cm4gcytcIjogXCIrdX1mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhlLHIsdCl7dmFyIG49MCxpPWUucmVkdWNlKGZ1bmN0aW9uKGUscil7cmV0dXJuIG4rKyxyLmluZGV4T2YoXCJcXG5cIik+PTAmJm4rKyxlK3IucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csXCJcIikubGVuZ3RoKzF9LDApO3JldHVybiBpPjYwP3RbMF0rKFwiXCI9PT1yP1wiXCI6citcIlxcbiBcIikrXCIgXCIrZS5qb2luKFwiLFxcbiAgXCIpK1wiIFwiK3RbMV06dFswXStyK1wiIFwiK2Uuam9pbihcIiwgXCIpK1wiIFwiK3RbMV19ZnVuY3Rpb24gaXNBcnJheShlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKX1mdW5jdGlvbiBpc0Jvb2xlYW4oZSl7cmV0dXJuXCJib29sZWFuXCI9PXR5cGVvZiBlfWZ1bmN0aW9uIGlzTnVsbChlKXtyZXR1cm4gbnVsbD09PWV9ZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoZSl7cmV0dXJuIG51bGw9PWV9ZnVuY3Rpb24gaXNOdW1iZXIoZSl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIGV9ZnVuY3Rpb24gaXNTdHJpbmcoZSl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGV9ZnVuY3Rpb24gaXNTeW1ib2woZSl7cmV0dXJuXCJzeW1ib2xcIj09dHlwZW9mIGV9ZnVuY3Rpb24gaXNVbmRlZmluZWQoZSl7cmV0dXJuIHZvaWQgMD09PWV9ZnVuY3Rpb24gaXNSZWdFeHAoZSl7cmV0dXJuIGlzT2JqZWN0KGUpJiZcIltvYmplY3QgUmVnRXhwXVwiPT09b2JqZWN0VG9TdHJpbmcoZSl9ZnVuY3Rpb24gaXNPYmplY3QoZSl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIGUmJm51bGwhPT1lfWZ1bmN0aW9uIGlzRGF0ZShlKXtyZXR1cm4gaXNPYmplY3QoZSkmJlwiW29iamVjdCBEYXRlXVwiPT09b2JqZWN0VG9TdHJpbmcoZSl9ZnVuY3Rpb24gaXNFcnJvcihlKXtyZXR1cm4gaXNPYmplY3QoZSkmJihcIltvYmplY3QgRXJyb3JdXCI9PT1vYmplY3RUb1N0cmluZyhlKXx8ZSBpbnN0YW5jZW9mIEVycm9yKX1mdW5jdGlvbiBpc0Z1bmN0aW9uKGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGV9ZnVuY3Rpb24gaXNQcmltaXRpdmUoZSl7cmV0dXJuIG51bGw9PT1lfHxcImJvb2xlYW5cIj09dHlwZW9mIGV8fFwibnVtYmVyXCI9PXR5cGVvZiBlfHxcInN0cmluZ1wiPT10eXBlb2YgZXx8XCJzeW1ib2xcIj09dHlwZW9mIGV8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiBlfWZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gcGFkKGUpe3JldHVybiAxMD5lP1wiMFwiK2UudG9TdHJpbmcoMTApOmUudG9TdHJpbmcoMTApfWZ1bmN0aW9uIHRpbWVzdGFtcCgpe3ZhciBlPW5ldyBEYXRlLHI9W3BhZChlLmdldEhvdXJzKCkpLHBhZChlLmdldE1pbnV0ZXMoKSkscGFkKGUuZ2V0U2Vjb25kcygpKV0uam9pbihcIjpcIik7cmV0dXJuW2UuZ2V0RGF0ZSgpLG1vbnRoc1tlLmdldE1vbnRoKCldLHJdLmpvaW4oXCIgXCIpfWZ1bmN0aW9uIGhhc093blByb3BlcnR5KGUscil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpfXZhciBmb3JtYXRSZWdFeHA9LyVbc2RqJV0vZztleHBvcnRzLmZvcm1hdD1mdW5jdGlvbihlKXtpZighaXNTdHJpbmcoZSkpe2Zvcih2YXIgcj1bXSx0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylyLnB1c2goaW5zcGVjdChhcmd1bWVudHNbdF0pKTtyZXR1cm4gci5qb2luKFwiIFwiKX1mb3IodmFyIHQ9MSxuPWFyZ3VtZW50cyxpPW4ubGVuZ3RoLG89U3RyaW5nKGUpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLGZ1bmN0aW9uKGUpe2lmKFwiJSVcIj09PWUpcmV0dXJuXCIlXCI7aWYodD49aSlyZXR1cm4gZTtzd2l0Y2goZSl7Y2FzZVwiJXNcIjpyZXR1cm4gU3RyaW5nKG5bdCsrXSk7Y2FzZVwiJWRcIjpyZXR1cm4gTnVtYmVyKG5bdCsrXSk7Y2FzZVwiJWpcIjp0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG5bdCsrXSl9Y2F0Y2gocil7cmV0dXJuXCJbQ2lyY3VsYXJdXCJ9ZGVmYXVsdDpyZXR1cm4gZX19KSxzPW5bdF07aT50O3M9blsrK3RdKW8rPWlzTnVsbChzKXx8IWlzT2JqZWN0KHMpP1wiIFwiK3M6XCIgXCIraW5zcGVjdChzKTtyZXR1cm4gb30sZXhwb3J0cy5kZXByZWNhdGU9ZnVuY3Rpb24oZSxyKXtmdW5jdGlvbiB0KCl7aWYoIW4pe2lmKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbil0aHJvdyBuZXcgRXJyb3Iocik7cHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uP2NvbnNvbGUudHJhY2Uocik6Y29uc29sZS5lcnJvcihyKSxuPSEwfXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1pZihpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGUscikuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtpZihwcm9jZXNzLm5vRGVwcmVjYXRpb249PT0hMClyZXR1cm4gZTt2YXIgbj0hMTtyZXR1cm4gdH07dmFyIGRlYnVncz17fSxkZWJ1Z0Vudmlyb247ZXhwb3J0cy5kZWJ1Z2xvZz1mdW5jdGlvbihlKXtpZihpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pJiYoZGVidWdFbnZpcm9uPXByb2Nlc3MuZW52Lk5PREVfREVCVUd8fFwiXCIpLGU9ZS50b1VwcGVyQ2FzZSgpLCFkZWJ1Z3NbZV0paWYobmV3IFJlZ0V4cChcIlxcXFxiXCIrZStcIlxcXFxiXCIsXCJpXCIpLnRlc3QoZGVidWdFbnZpcm9uKSl7dmFyIHI9cHJvY2Vzcy5waWQ7ZGVidWdzW2VdPWZ1bmN0aW9uKCl7dmFyIHQ9ZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoXCIlcyAlZDogJXNcIixlLHIsdCl9fWVsc2UgZGVidWdzW2VdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gZGVidWdzW2VdfSxleHBvcnRzLmluc3BlY3Q9aW5zcGVjdCxpbnNwZWN0LmNvbG9ycz17Ym9sZDpbMSwyMl0saXRhbGljOlszLDIzXSx1bmRlcmxpbmU6WzQsMjRdLGludmVyc2U6WzcsMjddLHdoaXRlOlszNywzOV0sZ3JleTpbOTAsMzldLGJsYWNrOlszMCwzOV0sYmx1ZTpbMzQsMzldLGN5YW46WzM2LDM5XSxncmVlbjpbMzIsMzldLG1hZ2VudGE6WzM1LDM5XSxyZWQ6WzMxLDM5XSx5ZWxsb3c6WzMzLDM5XX0saW5zcGVjdC5zdHlsZXM9e3NwZWNpYWw6XCJjeWFuXCIsbnVtYmVyOlwieWVsbG93XCIsXCJib29sZWFuXCI6XCJ5ZWxsb3dcIix1bmRlZmluZWQ6XCJncmV5XCIsXCJudWxsXCI6XCJib2xkXCIsc3RyaW5nOlwiZ3JlZW5cIixkYXRlOlwibWFnZW50YVwiLHJlZ2V4cDpcInJlZFwifSxleHBvcnRzLmlzQXJyYXk9aXNBcnJheSxleHBvcnRzLmlzQm9vbGVhbj1pc0Jvb2xlYW4sZXhwb3J0cy5pc051bGw9aXNOdWxsLGV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQ9aXNOdWxsT3JVbmRlZmluZWQsZXhwb3J0cy5pc051bWJlcj1pc051bWJlcixleHBvcnRzLmlzU3RyaW5nPWlzU3RyaW5nLGV4cG9ydHMuaXNTeW1ib2w9aXNTeW1ib2wsZXhwb3J0cy5pc1VuZGVmaW5lZD1pc1VuZGVmaW5lZCxleHBvcnRzLmlzUmVnRXhwPWlzUmVnRXhwLGV4cG9ydHMuaXNPYmplY3Q9aXNPYmplY3QsZXhwb3J0cy5pc0RhdGU9aXNEYXRlLGV4cG9ydHMuaXNFcnJvcj1pc0Vycm9yLGV4cG9ydHMuaXNGdW5jdGlvbj1pc0Z1bmN0aW9uLGV4cG9ydHMuaXNQcmltaXRpdmU9aXNQcmltaXRpdmUsZXhwb3J0cy5pc0J1ZmZlcj1yZXF1aXJlKFwiLi9zdXBwb3J0L2lzQnVmZmVyXCIpO3ZhciBtb250aHM9W1wiSmFuXCIsXCJGZWJcIixcIk1hclwiLFwiQXByXCIsXCJNYXlcIixcIkp1blwiLFwiSnVsXCIsXCJBdWdcIixcIlNlcFwiLFwiT2N0XCIsXCJOb3ZcIixcIkRlY1wiXTtleHBvcnRzLmxvZz1mdW5jdGlvbigpe2NvbnNvbGUubG9nKFwiJXMgLSAlc1wiLHRpbWVzdGFtcCgpLGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKSl9LGV4cG9ydHMuaW5oZXJpdHM9cmVxdWlyZShcImluaGVyaXRzXCIpLGV4cG9ydHMuX2V4dGVuZD1mdW5jdGlvbihlLHIpe2lmKCFyfHwhaXNPYmplY3QocikpcmV0dXJuIGU7Zm9yKHZhciB0PU9iamVjdC5rZXlzKHIpLG49dC5sZW5ndGg7bi0tOyllW3Rbbl1dPXJbdFtuXV07cmV0dXJuIGV9O1xufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJyksdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcblxufSx7XCIuL3N1cHBvcnQvaXNCdWZmZXJcIjoxNDIsXCJfcHJvY2Vzc1wiOjEzOCxcImluaGVyaXRzXCI6MTI3fV0sMTQ0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGU9cmVxdWlyZShcIi4vbGliL3ZlY3RvcnRpbGUuanNcIiksbW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUZlYXR1cmU9cmVxdWlyZShcIi4vbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzXCIpLG1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVMYXllcj1yZXF1aXJlKFwiLi9saWIvdmVjdG9ydGlsZWxheWVyLmpzXCIpO1xufSx7XCIuL2xpYi92ZWN0b3J0aWxlLmpzXCI6MTQ1LFwiLi9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanNcIjoxNDcsXCIuL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanNcIjoxNDh9XSwxNDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gVmVjdG9yVGlsZShlLHIpe3RoaXMubGF5ZXJzPWUucmVhZEZpZWxkcyhyZWFkVGlsZSx7fSxyKX1mdW5jdGlvbiByZWFkVGlsZShlLHIsaSl7aWYoMz09PWUpe3ZhciB0PW5ldyBWZWN0b3JUaWxlTGF5ZXIoaSxpLnJlYWRWYXJpbnQoKStpLnBvcyk7dC5sZW5ndGgmJihyW3QubmFtZV09dCl9fXZhciBWZWN0b3JUaWxlTGF5ZXI9cmVxdWlyZShcIi4vdmVjdG9ydGlsZWxheWVyXCIpO21vZHVsZS5leHBvcnRzPVZlY3RvclRpbGU7XG59LHtcIi4vdmVjdG9ydGlsZWxheWVyXCI6MTQ4fV0sMTQ2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFZlY3RvclRpbGVDbGlwcGVyKGkpe3RoaXMuZmVhdHVyZT1pLHRoaXMuZmluYWxSYXRpbz00MDk2L2kuZXh0ZW50Kk1hdGgucG93KDIsaS5keik7dmFyIHQ9NjQ7dC89dGhpcy5maW5hbFJhdGlvO3ZhciBzPWkuZXh0ZW50Pj5pLmR6O3Q+cyYmKHQ9cyksdGhpcy5kej1pLmR6LHRoaXMubWFyZ2luPXQsdGhpcy54bWluPXMqaS54UG9zLXQsdGhpcy55bWluPXMqaS55UG9zLXQsdGhpcy54bWF4PXRoaXMueG1pbitzKzIqdCx0aGlzLnltYXg9dGhpcy55bWluK3MrMip0LHRoaXMubGluZXM9W10sdGhpcy5fcHJldklzSW49ITEsdGhpcy50eXBlPWkudHlwZX12YXIgUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpO21vZHVsZS5leHBvcnRzPVZlY3RvclRpbGVDbGlwcGVyLFZlY3RvclRpbGVDbGlwcGVyLnByb3RvdHlwZS5sb2FkR2VvbWV0cnk9ZnVuY3Rpb24oKXt2YXIgaT10aGlzLmZlYXR1cmUuX3BiZjtpLnBvcz10aGlzLmZlYXR1cmUuX2dlb21ldHJ5O2Zvcih2YXIgdD1pLnJlYWRWYXJpbnQoKStpLnBvcyxzPTEsaD0wLG49MCxlPTA7aS5wb3M8dDspe2lmKCFoKXt2YXIgeD1pLnJlYWRWYXJpbnQoKTtzPTcmeCxoPXg+PjN9aWYoaC0tLDE9PT1zfHwyPT09cyluKz1pLnJlYWRTVmFyaW50KCksZSs9aS5yZWFkU1ZhcmludCgpLDE9PT1zP3RoaXMubW92ZVRvKG4sZSk6dGhpcy5saW5lVG8obixlKTtlbHNle2lmKDchPT1zKXRocm93IG5ldyBFcnJvcihcInVua25vd24gY29tbWFuZCBcIitzKTt0aGlzLmNsb3NlUG9seWdvbigpfX1yZXR1cm4gdGhpcy5yZXN1bHQoKX0sVmVjdG9yVGlsZUNsaXBwZXIucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbihpLHQpe3RoaXMuX3B1c2hfbGluZSgpLHRoaXMuX3ByZXZJc0luPXRoaXMuX2lzSW4oaSx0KSx0aGlzLl9tb3ZlVG8oaSx0LHRoaXMuX3ByZXZJc0luKSx0aGlzLl9wcmV2UHQ9bmV3IFBvaW50KGksdCksdGhpcy5fZmlyc3RQdD1uZXcgUG9pbnQoaSx0KX0sVmVjdG9yVGlsZUNsaXBwZXIucHJvdG90eXBlLmxpbmVUbz1mdW5jdGlvbihpLHQpe3ZhciBzLGgsbixlLHgseSxsLG8sbSxyLGEscCxfPXRoaXMuX2lzSW4oaSx0KTtpZihfKXRoaXMuX3ByZXZJc0luP3RoaXMuX2xpbmVUbyhpLHQsITApOihzPXRoaXMuX3ByZXZQdCxoPW5ldyBQb2ludChpLHQpLG49dGhpcy5faW50ZXJzZWN0KGgscyksdGhpcy5fbGluZVRvKG4ueCxuLnksITApLHRoaXMuX2xpbmVUbyhoLngsaC55LCEwKSk7ZWxzZSBpZih0aGlzLl9wcmV2SXNJbiloPXRoaXMuX3ByZXZQdCxzPW5ldyBQb2ludChpLHQpLG49dGhpcy5faW50ZXJzZWN0KGgscyksdGhpcy5fbGluZVRvKG4ueCxuLnksITApLHRoaXMuX2xpbmVUbyhzLngscy55LCExKTtlbHNlIGlmKGU9dGhpcy5fcHJldlB0LHg9bmV3IFBvaW50KGksdCksZS54PD10aGlzLnhtaW4mJngueDw9dGhpcy54bWlufHxlLng+PXRoaXMueG1heCYmeC54Pj10aGlzLnhtYXh8fGUueTw9dGhpcy55bWluJiZ4Lnk8PXRoaXMueW1pbnx8ZS55Pj10aGlzLnltYXgmJngueT49dGhpcy55bWF4KXRoaXMuX2xpbmVUbyh4LngseC55LCExKTtlbHNle2lmKG89W10sKGUueDx0aGlzLnhtaW4mJngueD50aGlzLnhtaW58fGUueD50aGlzLnhtaW4mJngueDx0aGlzLnhtaW4pJiYoeT0odGhpcy54bWluLWUueCkvKHgueC1lLngpLHA9ZS55K3kqKHgueS1lLnkpLHA8PXRoaXMueW1pbj9yPSExOnA+PXRoaXMueW1heD9yPSEwOihsPXt9LGwucmF0aW89eSxsLng9dGhpcy54bWluLGwueT1wLG8ucHVzaChsKSkpLChlLng8dGhpcy54bWF4JiZ4Lng+dGhpcy54bWF4fHxlLng+dGhpcy54bWF4JiZ4Lng8dGhpcy54bWF4KSYmKHk9KHRoaXMueG1heC1lLngpLyh4LngtZS54KSxwPWUueSt5Kih4LnktZS55KSxwPD10aGlzLnltaW4/cj0hMTpwPj10aGlzLnltYXg/cj0hMDoobD17fSxsLnJhdGlvPXksbC54PXRoaXMueG1heCxsLnk9cCxvLnB1c2gobCkpKSwoZS55PHRoaXMueW1pbiYmeC55PnRoaXMueW1pbnx8ZS55PnRoaXMueW1pbiYmeC55PHRoaXMueW1pbikmJih5PSh0aGlzLnltaW4tZS55KS8oeC55LWUueSksYT1lLngreSooeC54LWUueCksYTw9dGhpcy54bWluP209ITE6YT49dGhpcy54bWF4P209ITA6KGw9e30sbC5yYXRpbz15LGwueD1hLGwueT10aGlzLnltaW4sby5wdXNoKGwpKSksKGUueTx0aGlzLnltYXgmJngueT50aGlzLnltYXh8fGUueT50aGlzLnltYXgmJngueTx0aGlzLnltYXgpJiYoeT0odGhpcy55bWF4LWUueSkvKHgueS1lLnkpLGE9ZS54K3kqKHgueC1lLngpLGE8PXRoaXMueG1pbj9tPSExOmE+PXRoaXMueG1heD9tPSEwOihsPXt9LGwucmF0aW89eSxsLng9YSxsLnk9dGhpcy55bWF4LG8ucHVzaChsKSkpLDA9PT1vLmxlbmd0aCltP3I/dGhpcy5fbGluZVRvKHRoaXMueG1heCx0aGlzLnltYXgsITApOnRoaXMuX2xpbmVUbyh0aGlzLnhtYXgsdGhpcy55bWluLCEwKTpyP3RoaXMuX2xpbmVUbyh0aGlzLnhtaW4sdGhpcy55bWF4LCEwKTp0aGlzLl9saW5lVG8odGhpcy54bWluLHRoaXMueW1pbiwhMCk7ZWxzZSBpZihvLmxlbmd0aD4xJiZvWzBdLnJhdGlvPm9bMV0ucmF0aW8pdGhpcy5fbGluZVRvKG9bMV0ueCxvWzFdLnksITApLHRoaXMuX2xpbmVUbyhvWzBdLngsb1swXS55LCEwKTtlbHNlIGZvcih2YXIgdT0wO3U8by5sZW5ndGg7dSsrKXRoaXMuX2xpbmVUbyhvW3VdLngsb1t1XS55LCEwKTt0aGlzLl9saW5lVG8oeC54LHgueSwhMSl9dGhpcy5fcHJldklzSW49Xyx0aGlzLl9wcmV2UHQ9bmV3IFBvaW50KGksdCl9LFZlY3RvclRpbGVDbGlwcGVyLnByb3RvdHlwZS5jbG9zZVBvbHlnb249ZnVuY3Rpb24oKXt2YXIgaSx0O3RoaXMubGluZS5sZW5ndGg+MCYmKGk9dGhpcy5fZmlyc3RQdCx0PXRoaXMuX3ByZXZQdCwoaS54IT09dC54fHxpLnkhPT10LnkpJiZ0aGlzLmxpbmVUbyhpLngsaS55KSl9LFZlY3RvclRpbGVDbGlwcGVyLnByb3RvdHlwZS5yZXN1bHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHVzaF9saW5lKCksMD09PXRoaXMubGluZXMubGVuZ3RoP251bGw6dGhpcy5saW5lc30sVmVjdG9yVGlsZUNsaXBwZXIucHJvdG90eXBlLl9pc0luPWZ1bmN0aW9uKGksdCl7cmV0dXJuIGk+PXRoaXMueG1pbiYmaTw9dGhpcy54bWF4JiZ0Pj10aGlzLnltaW4mJnQ8PXRoaXMueW1heH0sVmVjdG9yVGlsZUNsaXBwZXIucHJvdG90eXBlLl9pbnRlcnNlY3Q9ZnVuY3Rpb24oaSx0KXt2YXIgcyxoLG4sZTtyZXR1cm4gdC54Pj10aGlzLnhtaW4mJnQueDw9dGhpcy54bWF4PyhoPXQueTw9dGhpcy55bWluP3RoaXMueW1pbjp0aGlzLnltYXgscz1pLngrKGgtaS55KS8odC55LWkueSkqKHQueC1pLngpKTp0Lnk+PXRoaXMueW1pbiYmdC55PD10aGlzLnltYXg/KHM9dC54PD10aGlzLnhtaW4/dGhpcy54bWluOnRoaXMueG1heCxoPWkueSsocy1pLngpLyh0LngtaS54KSoodC55LWkueSkpOihoPXQueTw9dGhpcy55bWluP3RoaXMueW1pbjp0aGlzLnltYXgscz10Lng8PXRoaXMueG1pbj90aGlzLnhtaW46dGhpcy54bWF4LG49KHMtaS54KS8odC54LWkueCksZT0oaC1pLnkpLyh0LnktaS55KSxlPm4/aD1pLnkrbioodC55LWkueSk6cz1pLngrZSoodC54LWkueCkpLG5ldyBQb2ludChzLGgpfSxWZWN0b3JUaWxlQ2xpcHBlci5wcm90b3R5cGUuX3B1c2hfbGluZT1mdW5jdGlvbigpe3RoaXMubGluZSYmKDE9PT10aGlzLnR5cGU/dGhpcy5saW5lLmxlbmd0aD4wJiZ0aGlzLmxpbmVzLnB1c2godGhpcy5saW5lKToyPT09dGhpcy50eXBlP3RoaXMubGluZS5sZW5ndGg+MSYmdGhpcy5saW5lcy5wdXNoKHRoaXMubGluZSk6Mz09PXRoaXMudHlwZSYmdGhpcy5saW5lLmxlbmd0aD4zJiZ0aGlzLmxpbmVzLnB1c2godGhpcy5saW5lKSksdGhpcy5saW5lPVtdfSxWZWN0b3JUaWxlQ2xpcHBlci5wcm90b3R5cGUuX21vdmVUbz1mdW5jdGlvbihpLHQscyl7MyE9PXRoaXMudHlwZT9zJiYoaT0oaS0odGhpcy54bWluK3RoaXMubWFyZ2luKSkqdGhpcy5maW5hbFJhdGlvLHQ9KHQtKHRoaXMueW1pbit0aGlzLm1hcmdpbikpKnRoaXMuZmluYWxSYXRpbyx0aGlzLmxpbmUucHVzaChuZXcgUG9pbnQoaSx0KSkpOihzfHwoaTx0aGlzLnhtaW4mJihpPXRoaXMueG1pbiksaT50aGlzLnhtYXgmJihpPXRoaXMueG1heCksdDx0aGlzLnltaW4mJih0PXRoaXMueW1pbiksdD50aGlzLnltYXgmJih0PXRoaXMueW1heCkpLGk9KGktKHRoaXMueG1pbit0aGlzLm1hcmdpbikpKnRoaXMuZmluYWxSYXRpbyx0PSh0LSh0aGlzLnltaW4rdGhpcy5tYXJnaW4pKSp0aGlzLmZpbmFsUmF0aW8sdGhpcy5saW5lLnB1c2gobmV3IFBvaW50KGksdCkpLHRoaXMuX2lzX2g9ITEsdGhpcy5faXNfdj0hMSl9LFZlY3RvclRpbGVDbGlwcGVyLnByb3RvdHlwZS5fbGluZVRvPWZ1bmN0aW9uKGksdCxzKXt2YXIgaCxuO2lmKDMhPT10aGlzLnR5cGUpaWYocyl7aWYoaT0oaS0odGhpcy54bWluK3RoaXMubWFyZ2luKSkqdGhpcy5maW5hbFJhdGlvLHQ9KHQtKHRoaXMueW1pbit0aGlzLm1hcmdpbikpKnRoaXMuZmluYWxSYXRpbyx0aGlzLmxpbmUubGVuZ3RoPjAmJihoPXRoaXMubGluZVt0aGlzLmxpbmUubGVuZ3RoLTFdLGgueD09PWkmJmgueT09PXQpKXJldHVybjt0aGlzLmxpbmUucHVzaChuZXcgUG9pbnQoaSx0KSl9ZWxzZSB0aGlzLmxpbmUmJnRoaXMubGluZS5sZW5ndGg+MCYmdGhpcy5fcHVzaF9saW5lKCk7ZWxzZSBpZihzfHwoaTx0aGlzLnhtaW4mJihpPXRoaXMueG1pbiksaT50aGlzLnhtYXgmJihpPXRoaXMueG1heCksdDx0aGlzLnltaW4mJih0PXRoaXMueW1pbiksdD50aGlzLnltYXgmJih0PXRoaXMueW1heCkpLGk9KGktKHRoaXMueG1pbit0aGlzLm1hcmdpbikpKnRoaXMuZmluYWxSYXRpbyx0PSh0LSh0aGlzLnltaW4rdGhpcy5tYXJnaW4pKSp0aGlzLmZpbmFsUmF0aW8sdGhpcy5saW5lJiZ0aGlzLmxpbmUubGVuZ3RoPjApe2g9dGhpcy5saW5lW3RoaXMubGluZS5sZW5ndGgtMV07dmFyIGU9aC54PT09aSx4PWgueT09PXQ7aWYoZSYmeClyZXR1cm47dGhpcy5faXNfaCYmZT8oaC54PWksaC55PXQsbj10aGlzLmxpbmVbdGhpcy5saW5lLmxlbmd0aC0yXSx0aGlzLl9pc19oPW4ueD09PWksdGhpcy5faXNfdj1uLnk9PT10KTp0aGlzLl9pc192JiZ4PyhoLng9aSxoLnk9dCxuPXRoaXMubGluZVt0aGlzLmxpbmUubGVuZ3RoLTJdLHRoaXMuX2lzX2g9bi54PT09aSx0aGlzLl9pc192PW4ueT09PXQpOih0aGlzLmxpbmUucHVzaChuZXcgUG9pbnQoaSx0KSksdGhpcy5faXNfaD1lLHRoaXMuX2lzX3Y9eCl9ZWxzZSB0aGlzLmxpbmUucHVzaChuZXcgUG9pbnQoaSx0KSl9O1xufSx7XCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDE0NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBWZWN0b3JUaWxlRmVhdHVyZShlLHQscixpLG8pe3RoaXMucHJvcGVydGllcz17fSx0aGlzLmV4dGVudD1yLHRoaXMudHlwZT0wLHRoaXMuX3BiZj1lLHRoaXMuX2dlb21ldHJ5PS0xLHRoaXMuX2tleXM9aSx0aGlzLl92YWx1ZXM9byxlLnJlYWRGaWVsZHMocmVhZEZlYXR1cmUsdGhpcyx0KX1mdW5jdGlvbiByZWFkRmVhdHVyZShlLHQscil7MT09ZT90Ll9pZD1yLnJlYWRWYXJpbnQoKToyPT1lP3JlYWRUYWcocix0KTozPT1lP3QudHlwZT1yLnJlYWRWYXJpbnQoKTo0PT1lJiYodC5fZ2VvbWV0cnk9ci5wb3MpfWZ1bmN0aW9uIHJlYWRUYWcoZSx0KXtmb3IodmFyIHI9ZS5yZWFkVmFyaW50KCkrZS5wb3M7ZS5wb3M8cjspe3ZhciBpPXQuX2tleXNbZS5yZWFkVmFyaW50KCldLG89dC5fdmFsdWVzW2UucmVhZFZhcmludCgpXTt0LnByb3BlcnRpZXNbaV09b319dmFyIFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKSxWZWN0b3JUaWxlQ2xpcHBlcj1yZXF1aXJlKFwiLi92ZWN0b3J0aWxlY2xpcHBlclwiKTttb2R1bGUuZXhwb3J0cz1WZWN0b3JUaWxlRmVhdHVyZSxWZWN0b3JUaWxlRmVhdHVyZS50eXBlcz1bXCJVbmtub3duXCIsXCJQb2ludFwiLFwiTGluZVN0cmluZ1wiLFwiUG9seWdvblwiXSxWZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUubG9hZEdlb21ldHJ5PWZ1bmN0aW9uKCl7dmFyIGU7aWYodGhpcy5keil7dmFyIHQ9bmV3IFZlY3RvclRpbGVDbGlwcGVyKHRoaXMpO2U9dC5sb2FkR2VvbWV0cnkoKX1lbHNle2Zvcih2YXIgcj0wLGk9dGhpcy5leHRlbnQ7aT40MDk2OylyKz0xLGk+Pj0xO3ZhciBvPXRoaXMuX3BiZjtvLnBvcz10aGlzLl9nZW9tZXRyeTt2YXIgYSxuPW8ucmVhZFZhcmludCgpK28ucG9zLHM9MSxwPTAsaD0wLHU9MDtmb3IoZT1bXTtvLnBvczxuOyl7aWYoIXApe3ZhciBsPW8ucmVhZFZhcmludCgpO3M9NyZsLHA9bD4+M31pZihwLS0sMT09PXN8fDI9PT1zKWgrPW8ucmVhZFNWYXJpbnQoKSx1Kz1vLnJlYWRTVmFyaW50KCksMT09PXMmJihhJiZlLnB1c2goYSksYT1bXSksYS5wdXNoKG5ldyBQb2ludChoPj5yLHU+PnIpKTtlbHNle2lmKDchPT1zKXRocm93IG5ldyBFcnJvcihcInVua25vd24gY29tbWFuZCBcIitzKTthJiZhLnB1c2goYVswXS5jbG9uZSgpKX19YSYmZS5wdXNoKGEpfXJldHVybiBlfSxWZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUuYmJveD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX3BiZjtlLnBvcz10aGlzLl9nZW9tZXRyeTtmb3IodmFyIHQ9ZS5yZWFkVmFyaW50KCkrZS5wb3Mscj0xLGk9MCxvPTAsYT0wLG49MS8wLHM9LSgxLzApLHA9MS8wLGg9LSgxLzApO2UucG9zPHQ7KXtpZighaSl7dmFyIHU9ZS5yZWFkVmFyaW50KCk7cj03JnUsaT11Pj4zfWlmKGktLSwxPT09cnx8Mj09PXIpbys9ZS5yZWFkU1ZhcmludCgpLGErPWUucmVhZFNWYXJpbnQoKSxuPm8mJihuPW8pLG8+cyYmKHM9bykscD5hJiYocD1hKSxhPmgmJihoPWEpO2Vsc2UgaWYoNyE9PXIpdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBjb21tYW5kIFwiK3IpfXJldHVybltuLHAscyxoXX0sVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTj1mdW5jdGlvbihlLHQscil7Zm9yKHZhciBpPXRoaXMuZXh0ZW50Kk1hdGgucG93KDIsciksbz10aGlzLmV4dGVudCplLGE9dGhpcy5leHRlbnQqdCxuPXRoaXMubG9hZEdlb21ldHJ5KCkscz1WZWN0b3JUaWxlRmVhdHVyZS50eXBlc1t0aGlzLnR5cGVdLHA9MDtwPG4ubGVuZ3RoO3ArKylmb3IodmFyIGg9bltwXSx1PTA7dTxoLmxlbmd0aDt1Kyspe3ZhciBsPWhbdV0sZD0xODAtMzYwKihsLnkrYSkvaTtoW3VdPVszNjAqKGwueCtvKS9pLTE4MCwzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAoZCpNYXRoLlBJLzE4MCkpLTkwXX1yZXR1cm5cIlBvaW50XCI9PT1zJiYxPT09bi5sZW5ndGg/bj1uWzBdWzBdOlwiUG9pbnRcIj09PXM/KG49blswXSxzPVwiTXVsdGlQb2ludFwiKTpcIkxpbmVTdHJpbmdcIj09PXMmJjE9PT1uLmxlbmd0aD9uPW5bMF06XCJMaW5lU3RyaW5nXCI9PT1zJiYocz1cIk11bHRpTGluZVN0cmluZ1wiKSx7dHlwZTpcIkZlYXR1cmVcIixnZW9tZXRyeTp7dHlwZTpzLGNvb3JkaW5hdGVzOm59LHByb3BlcnRpZXM6dGhpcy5wcm9wZXJ0aWVzfX07XG59LHtcIi4vdmVjdG9ydGlsZWNsaXBwZXJcIjoxNDYsXCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDE0ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBWZWN0b3JUaWxlTGF5ZXIoZSx0KXt0aGlzLnZlcnNpb249MSx0aGlzLm5hbWU9bnVsbCx0aGlzLmV4dGVudD00MDk2LHRoaXMubGVuZ3RoPTAsdGhpcy5fcGJmPWUsdGhpcy5fa2V5cz1bXSx0aGlzLl92YWx1ZXM9W10sdGhpcy5fZmVhdHVyZXM9W10sZS5yZWFkRmllbGRzKHJlYWRMYXllcix0aGlzLHQpLHRoaXMubGVuZ3RoPXRoaXMuX2ZlYXR1cmVzLmxlbmd0aH1mdW5jdGlvbiByZWFkTGF5ZXIoZSx0LHIpezE1PT09ZT90LnZlcnNpb249ci5yZWFkVmFyaW50KCk6MT09PWU/dC5uYW1lPXIucmVhZFN0cmluZygpOjU9PT1lP3QuZXh0ZW50PXIucmVhZFZhcmludCgpOjI9PT1lP3QuX2ZlYXR1cmVzLnB1c2goci5wb3MpOjM9PT1lP3QuX2tleXMucHVzaChyLnJlYWRTdHJpbmcoKSk6ND09PWUmJnQuX3ZhbHVlcy5wdXNoKHJlYWRWYWx1ZU1lc3NhZ2UocikpfWZ1bmN0aW9uIHJlYWRWYWx1ZU1lc3NhZ2UoZSl7Zm9yKHZhciB0PW51bGwscj1lLnJlYWRWYXJpbnQoKStlLnBvcztlLnBvczxyOyl7dmFyIGE9ZS5yZWFkVmFyaW50KCk+PjM7dD0xPT09YT9lLnJlYWRTdHJpbmcoKToyPT09YT9lLnJlYWRGbG9hdCgpOjM9PT1hP2UucmVhZERvdWJsZSgpOjQ9PT1hP2UucmVhZFZhcmludDY0KCk6NT09PWE/ZS5yZWFkVmFyaW50KCk6Nj09PWE/ZS5yZWFkU1ZhcmludCgpOjc9PT1hP2UucmVhZEJvb2xlYW4oKTpudWxsfXJldHVybiB0fXZhciBWZWN0b3JUaWxlRmVhdHVyZT1yZXF1aXJlKFwiLi92ZWN0b3J0aWxlZmVhdHVyZS5qc1wiKTttb2R1bGUuZXhwb3J0cz1WZWN0b3JUaWxlTGF5ZXIsVmVjdG9yVGlsZUxheWVyLnByb3RvdHlwZS5mZWF0dXJlPWZ1bmN0aW9uKGUpe2lmKDA+ZXx8ZT49dGhpcy5fZmVhdHVyZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcImZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kc1wiKTt0aGlzLl9wYmYucG9zPXRoaXMuX2ZlYXR1cmVzW2VdO3ZhciB0PXRoaXMuX3BiZi5yZWFkVmFyaW50KCkrdGhpcy5fcGJmLnBvcztyZXR1cm4gbmV3IFZlY3RvclRpbGVGZWF0dXJlKHRoaXMuX3BiZix0LHRoaXMuZXh0ZW50LHRoaXMuX2tleXMsdGhpcy5fdmFsdWVzKX07XG59LHtcIi4vdmVjdG9ydGlsZWZlYXR1cmUuanNcIjoxNDd9XSwxNDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGJ1bmRsZUZuPWFyZ3VtZW50c1szXSxzb3VyY2VzPWFyZ3VtZW50c1s0XSxjYWNoZT1hcmd1bWVudHNbNV0sc3RyaW5naWZ5PUpTT04uc3RyaW5naWZ5O21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHIpe2Zvcih2YXIgZSx0PU9iamVjdC5rZXlzKGNhY2hlKSxuPTAsbz10Lmxlbmd0aDtvPm47bisrKXt2YXIgYT10W25dLGk9Y2FjaGVbYV0uZXhwb3J0cztpZihpPT09cnx8aVtcImRlZmF1bHRcIl09PT1yKXtlPWE7YnJlYWt9fWlmKCFlKXtlPU1hdGguZmxvb3IoTWF0aC5wb3coMTYsOCkqTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoMTYpO2Zvcih2YXIgcz17fSxuPTAsbz10Lmxlbmd0aDtvPm47bisrKXt2YXIgYT10W25dO3NbYV09YX1zb3VyY2VzW2VdPVtGdW5jdGlvbihbXCJyZXF1aXJlXCIsXCJtb2R1bGVcIixcImV4cG9ydHNcIl0sXCIoXCIrcitcIikoc2VsZilcIiksc119dmFyIHU9TWF0aC5mbG9vcihNYXRoLnBvdygxNiw4KSpNYXRoLnJhbmRvbSgpKS50b1N0cmluZygxNiksZj17fTtmW2VdPWUsc291cmNlc1t1XT1bRnVuY3Rpb24oW1wicmVxdWlyZVwiXSxcInZhciBmID0gcmVxdWlyZShcIitzdHJpbmdpZnkoZSkrXCIpOyhmLmRlZmF1bHQgPyBmLmRlZmF1bHQgOiBmKShzZWxmKTtcIiksZl07dmFyIGM9XCIoXCIrYnVuZGxlRm4rXCIpKHtcIitPYmplY3Qua2V5cyhzb3VyY2VzKS5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHN0cmluZ2lmeShyKStcIjpbXCIrc291cmNlc1tyXVswXStcIixcIitzdHJpbmdpZnkoc291cmNlc1tyXVsxXSkrXCJdXCJ9KS5qb2luKFwiLFwiKStcIn0se30sW1wiK3N0cmluZ2lmeSh1KStcIl0pXCIsbD13aW5kb3cuVVJMfHx3aW5kb3cud2Via2l0VVJMfHx3aW5kb3cubW96VVJMfHx3aW5kb3cubXNVUkw7cmV0dXJuIG5ldyBXb3JrZXIobC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2NdLHt0eXBlOlwidGV4dC9qYXZhc2NyaXB0XCJ9KSkpfTtcbn0se31dfSx7fSxbMjRdKSgyNClcbn0pO1xuXG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcGJveC1nbC5qcy5tYXAiLCJMLk1hcGJveEdMID0gTC5MYXllci5leHRlbmQoe1xuICAgIG9wdGlvbnM6IHtcbiAgICAgIHVwZGF0ZUludGVydmFsOiAzMlxuICAgIH0sXG5cbiAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIG1hcGJveGdsLmFjY2Vzc1Rva2VuID0gb3B0aW9ucy5hY2Nlc3NUb2tlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IHNob3VsZCBwcm92aWRlIGEgTWFwYm94IEdMIGFjY2VzcyB0b2tlbiBhcyBhIHRva2VuIG9wdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgdmVyc2lvbiBvZiBgZm5gIHRoYXQgb25seSBmaXJlcyBvbmNlIGV2ZXJ5IGB0aW1lYCBtaWxsc2Vjb25kcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gdGhlIGZ1bmN0aW9uIHRvIGJlIHRocm90dGxlZFxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSBtaWxsc2Vjb25kcyByZXF1aXJlZCBiZXR3ZWVuIGZ1bmN0aW9uIGNhbGxzXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gY29udGV4dCB0aGUgdmFsdWUgb2YgYHRoaXNgIHdpdGggd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZFxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IGRlYm91bmNlZCBmdW5jdGlvblxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIHRocm90dGxlID0gZnVuY3Rpb24gKGZuLCB0aW1lLCBjb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgbG9jaywgYXJncywgd3JhcHBlckZuLCBsYXRlcjtcblxuICAgICAgICAgICAgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVzZXQgbG9jayBhbmQgY2FsbCBpZiBxdWV1ZWRcbiAgICAgICAgICAgICAgICBsb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgd3JhcHBlckZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICBhcmdzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgd3JhcHBlckZuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCB0b28gc29vbiwgcXVldWUgdG8gY2FsbCBsYXRlclxuICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCBhbmQgbG9jayB1bnRpbCBsYXRlclxuICAgICAgICAgICAgICAgICAgICBmbi5hcHBseShjb250ZXh0LCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGxhdGVyLCB0aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbG9jayA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXJGbjtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBzZXR1cCB0aHJvdHRsaW5nIHRoZSB1cGRhdGUgZXZlbnQgd2hlbiBwYW5uaW5nXG4gICAgICAgIHRoaXMuX3Rocm90dGxlZFVwZGF0ZSA9IHRocm90dGxlKEwuVXRpbC5iaW5kKHRoaXMuX3VwZGF0ZSwgdGhpcyksIHRoaXMub3B0aW9ucy51cGRhdGVJbnRlcnZhbCk7XG4gICAgfSxcblxuICAgIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgIGlmICghdGhpcy5fZ2xDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRDb250YWluZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcC5fcGFuZXMudGlsZVBhbmUuYXBwZW5kQ2hpbGQodGhpcy5fZ2xDb250YWluZXIpO1xuXG4gICAgICAgIHRoaXMuX2luaXRHTCgpO1xuXG4gICAgICAgIHRoaXMuX29mZnNldCA9IHRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChbMCwgMF0pO1xuXG4gICAgICAgIC8vIHdvcmsgYXJvdW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWxlYWZsZXQvaXNzdWVzLzQ3XG4gICAgICAgIGlmIChtYXAub3B0aW9ucy56b29tQW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBMLkRvbUV2ZW50Lm9uKG1hcC5fcHJveHksIEwuRG9tVXRpbC5UUkFOU0lUSU9OX0VORCwgdGhpcy5fdHJhbnNpdGlvbkVuZCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgb25SZW1vdmU6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcC5vcHRpb25zLnpvb21BbmltYXRpb24pIHtcbiAgICAgICAgICAgIEwuRG9tRXZlbnQub2ZmKHRoaXMuX21hcC5fcHJveHksIEwuRG9tVXRpbC5UUkFOU0lUSU9OX0VORCwgdGhpcy5fdHJhbnNpdGlvbkVuZCwgdGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXAuZ2V0UGFuZXMoKS50aWxlUGFuZS5yZW1vdmVDaGlsZCh0aGlzLl9nbENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuX2dsTWFwLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLl9nbE1hcCA9IG51bGw7XG4gICAgfSxcblxuICAgIGdldEV2ZW50czogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbW92ZTogdGhpcy5fdGhyb3R0bGVkVXBkYXRlLCAvLyBzZW5zaWJseSB0aHJvdHRsZSB1cGRhdGluZyB3aGlsZSBwYW5uaW5nXG4gICAgICAgICAgICB6b29tYW5pbTogdGhpcy5fYW5pbWF0ZVpvb20sIC8vIGFwcGx5cyB0aGUgem9vbSBhbmltYXRpb24gdG8gdGhlIDxjYW52YXM+XG4gICAgICAgICAgICB6b29tOiB0aGlzLl9waW5jaFpvb20sIC8vIGFuaW1hdGUgZXZlcnkgem9vbSBldmVudCBmb3Igc21vb3RoZXIgcGluY2gtem9vbWluZ1xuICAgICAgICAgICAgem9vbXN0YXJ0OiB0aGlzLl96b29tU3RhcnQsIC8vIGZsYWcgc3RhcnRpbmcgYSB6b29tIHRvIGRpc2FibGUgcGFubmluZ1xuICAgICAgICAgICAgem9vbWVuZDogdGhpcy5fem9vbUVuZFxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICBfaW5pdENvbnRhaW5lcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZ2xDb250YWluZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnLCAnbGVhZmxldC1nbC1sYXllcicpO1xuXG4gICAgICAgIHZhciBzaXplID0gdGhpcy5fbWFwLmdldFNpemUoKTtcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoICA9IHNpemUueCArICdweCc7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBzaXplLnkgKyAncHgnO1xuICAgIH0sXG5cbiAgICBfaW5pdEdMOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCk7XG5cbiAgICAgICAgdmFyIG9wdGlvbnMgPSBMLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLCB7XG4gICAgICAgICAgICBjb250YWluZXI6IHRoaXMuX2dsQ29udGFpbmVyLFxuICAgICAgICAgICAgaW50ZXJhY3RpdmU6IGZhbHNlLFxuICAgICAgICAgICAgY2VudGVyOiBbY2VudGVyLmxuZywgY2VudGVyLmxhdF0sXG4gICAgICAgICAgICB6b29tOiB0aGlzLl9tYXAuZ2V0Wm9vbSgpIC0gMSxcbiAgICAgICAgICAgIGF0dHJpYnV0aW9uQ29udHJvbDogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZ2xNYXAgPSBuZXcgbWFwYm94Z2wuTWFwKG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIGFsbG93IEdMIGJhc2UgbWFwIHRvIHBhbiBiZXlvbmQgbWluL21heCBsYXRpdHVkZXNcbiAgICAgICAgdGhpcy5fZ2xNYXAudHJhbnNmb3JtLmxhdFJhbmdlID0gbnVsbDtcblxuICAgICAgICAvLyB0cmVhdCBjaGlsZCA8Y2FudmFzPiBlbGVtZW50IGxpa2UgTC5JbWFnZU92ZXJsYXlcbiAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2dsTWFwLl9jYW52YXMuY2FudmFzLCAnbGVhZmxldC1pbWFnZS1sYXllcicpO1xuICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fZ2xNYXAuX2NhbnZhcy5jYW52YXMsICdsZWFmbGV0LXpvb20tYW5pbWF0ZWQnKTtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgLy8gdXBkYXRlIHRoZSBvZmZzZXQgc28gd2UgY2FuIGNvcnJlY3QgZm9yIGl0IGxhdGVyIHdoZW4gd2Ugem9vbVxuICAgICAgICB0aGlzLl9vZmZzZXQgPSB0aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQoWzAsIDBdKTtcblxuICAgICAgICBpZiAodGhpcy5fem9vbWluZykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaXplID0gdGhpcy5fbWFwLmdldFNpemUoKSxcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuX2dsQ29udGFpbmVyLFxuICAgICAgICAgICAgZ2wgPSB0aGlzLl9nbE1hcCxcbiAgICAgICAgICAgIHRvcExlZnQgPSB0aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQoWzAsIDBdKTtcblxuICAgICAgICBMLkRvbVV0aWwuc2V0UG9zaXRpb24oY29udGFpbmVyLCB0b3BMZWZ0KTtcblxuICAgICAgICB2YXIgY2VudGVyID0gdGhpcy5fbWFwLmdldENlbnRlcigpO1xuXG4gICAgICAgIC8vIGdsLnNldFZpZXcoW2NlbnRlci5sYXQsIGNlbnRlci5sbmddLCB0aGlzLl9tYXAuZ2V0Wm9vbSgpIC0gMSwgMCk7XG4gICAgICAgIC8vIGNhbGxpbmcgc2V0VmlldyBkaXJlY3RseSBjYXVzZXMgc3luYyBpc3N1ZXMgYmVjYXVzZSBpdCB1c2VzIHJlcXVlc3RBbmltRnJhbWVcblxuICAgICAgICB2YXIgdHIgPSBnbC50cmFuc2Zvcm07XG4gICAgICAgIHRyLmNlbnRlciA9IG1hcGJveGdsLkxuZ0xhdC5jb252ZXJ0KFtjZW50ZXIubG5nLCBjZW50ZXIubGF0XSk7XG4gICAgICAgIHRyLnpvb20gPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpIC0gMTtcblxuICAgICAgICBpZiAoZ2wudHJhbnNmb3JtLndpZHRoICE9PSBzaXplLnggfHwgZ2wudHJhbnNmb3JtLmhlaWdodCAhPT0gc2l6ZS55KSB7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUud2lkdGggID0gc2l6ZS54ICsgJ3B4JztcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBzaXplLnkgKyAncHgnO1xuICAgICAgICAgICAgZ2wuX3Jlc2l6ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdsLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIHVwZGF0ZSB0aGUgbWFwIGNvbnN0YW50bHkgZHVyaW5nIGEgcGluY2ggem9vbVxuICAgIF9waW5jaFpvb206IGZ1bmN0aW9uIChlKSB7XG4gICAgICB0aGlzLl9nbE1hcC5qdW1wVG8oe1xuICAgICAgICB6b29tOiB0aGlzLl9tYXAuZ2V0Wm9vbSgpIC0gMSxcbiAgICAgICAgY2VudGVyOiB0aGlzLl9tYXAuZ2V0Q2VudGVyKClcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBib3Jyb3dlZCBmcm9tIEwuSW1hZ2VPdmVybGF5IGh0dHBzOi8vZ2l0aHViLmNvbS9MZWFmbGV0L0xlYWZsZXQvYmxvYi9tYXN0ZXIvc3JjL2xheWVyL0ltYWdlT3ZlcmxheS5qcyNMMTM5LUwxNDRcbiAgICBfYW5pbWF0ZVpvb206IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgc2NhbGUgPSB0aGlzLl9tYXAuZ2V0Wm9vbVNjYWxlKGUuem9vbSksXG4gICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbWFwLl9sYXRMbmdUb05ld0xheWVyUG9pbnQodGhpcy5fbWFwLmdldEJvdW5kcygpLmdldE5vcnRoV2VzdCgpLCBlLnpvb20sIGUuY2VudGVyKTtcblxuICAgICAgTC5Eb21VdGlsLnNldFRyYW5zZm9ybSh0aGlzLl9nbE1hcC5fY2FudmFzLmNhbnZhcywgb2Zmc2V0LnN1YnRyYWN0KHRoaXMuX29mZnNldCksIHNjYWxlKTtcbiAgICB9LFxuXG4gICAgX3pvb21TdGFydDogZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuX3pvb21pbmcgPSB0cnVlO1xuICAgIH0sXG5cbiAgICBfem9vbUVuZDogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHNjYWxlID0gdGhpcy5fbWFwLmdldFpvb21TY2FsZSh0aGlzLl9tYXAuZ2V0Wm9vbSgpKSxcbiAgICAgICAgICBvZmZzZXQgPSB0aGlzLl9tYXAuX2xhdExuZ1RvTmV3TGF5ZXJQb2ludCh0aGlzLl9tYXAuZ2V0Qm91bmRzKCkuZ2V0Tm9ydGhXZXN0KCksIHRoaXMuX21hcC5nZXRab29tKCksIHRoaXMuX21hcC5nZXRDZW50ZXIoKSk7XG5cbiAgICAgIEwuRG9tVXRpbC5zZXRUcmFuc2Zvcm0odGhpcy5fZ2xNYXAuX2NhbnZhcy5jYW52YXMsIG9mZnNldC5zdWJ0cmFjdCh0aGlzLl9vZmZzZXQpLCBzY2FsZSk7XG4gICAgfSxcblxuICAgIF90cmFuc2l0aW9uRW5kOiBmdW5jdGlvbiAoZSkge1xuICAgICAgTC5VdGlsLnJlcXVlc3RBbmltRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKSxcbiAgICAgICAgICBjZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCksXG4gICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbWFwLmxhdExuZ1RvQ29udGFpbmVyUG9pbnQodGhpcy5fbWFwLmdldEJvdW5kcygpLmdldE5vcnRoV2VzdCgpKTtcblxuICAgICAgICAgIC8vIHJlc2V0IHRoZSBzY2FsZSBhbmQgb2Zmc2V0XG4gICAgICAgICAgTC5Eb21VdGlsLnNldFRyYW5zZm9ybSh0aGlzLl9nbE1hcC5fY2FudmFzLmNhbnZhcywgb2Zmc2V0LCAxKTtcblxuICAgICAgICAgIC8vIGVuYWJsZSBwYW5uaW5nIG9uY2UgdGhlIGdsIG1hcCBpcyByZWFkeSBhZ2FpblxuICAgICAgICAgIHRoaXMuX2dsTWFwLm9uY2UoJ21vdmVlbmQnLCBMLlV0aWwuYmluZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3pvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy5fem9vbUVuZCgpO1xuICAgICAgICAgIH0sIHRoaXMpKTtcblxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbWFwIHBvc2l0aW9uXG4gICAgICAgICAgdGhpcy5fZ2xNYXAuanVtcFRvKHtcbiAgICAgICAgICAgICAgY2VudGVyOiBjZW50ZXIsXG4gICAgICAgICAgICAgIHpvb206IHpvb20gLSAxXG4gICAgICAgICAgfSk7XG4gICAgICB9LCB0aGlzKVxuICAgIH1cbn0pO1xuXG5MLm1hcGJveEdMID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEwuTWFwYm94R0wob3B0aW9ucyk7XG59O1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgJ21hcGJveC1nbCc7XG5pbXBvcnQgJ21hcGJveC1nbC1sZWFmbGV0JztcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hNZXRhZGF0YSAodXJsLCBjb250ZXh0KSB7XG4gIHJlcXVlc3QodXJsLCB7fSwgZnVuY3Rpb24gKGVycm9yLCBzdHlsZSkge1xuICAgIGlmICghZXJyb3IpIHtcbiAgICAgIHJlcXVlc3Qoc3R5bGUuc291cmNlcy5lc3JpLnVybCwge30sIGZ1bmN0aW9uIChlcnJvciwgdGlsZU1ldGFkYXRhKSB7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICBmb3JtYXRTdHlsZShzdHlsZSwgdGlsZU1ldGFkYXRhLCB1cmwpO1xuICAgICAgICAgIGNvbnRleHQuX21hcGJveEdMID0gTC5tYXBib3hHTCh7XG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogJ2V6cmVlJyxcbiAgICAgICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29udGV4dC5fcmVhZHkgPSB0cnVlO1xuICAgICAgICAgIGNvbnRleHQuZmlyZSgncmVhZHknLCB7fSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmZXRjaCB2ZWN0b3IgdGlsZSBzdHlsZSBtZXRhZGF0YScpO1xuICAgIH1cbiAgfSwgY29udGV4dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTdHlsZSAoc3R5bGUsIG1ldGFkYXRhLCBzdHlsZVVybCkge1xuICAvLyBpZiBhIHJlbGF0aXZlIHBhdGggaXMgcmVmZXJlbmNlZCwgdGhlIGRlZmF1bHQgc3R5bGUgY2FuIGJlIGZvdW5kIGluIGEgc3RhbmRhcmQgbG9jYXRpb25cbiAgaWYgKHN0eWxlLnNvdXJjZXMuZXNyaS51cmwgJiYgc3R5bGUuc291cmNlcy5lc3JpLnVybC5pbmRleE9mKCdodHRwJykgPT09IC0xKSB7XG4gICAgc3R5bGUuc291cmNlcy5lc3JpLnVybCA9IHN0eWxlVXJsLnJlcGxhY2UoJy9yZXNvdXJjZXMvc3R5bGVzL3Jvb3QuanNvbicsICcnKTtcbiAgfVxuXG4gIC8vIHJpZ2h0IG5vdyBBcmNHSVMgUHJvIHB1Ymxpc2hlZCB2ZWN0b3Igc2VydmljZXMgaGF2ZSBhIHNsaWdodGx5IGRpZmZlcmVudCBzaWduYXR1cmVcbiAgaWYgKG1ldGFkYXRhLnRpbGVzICYmIG1ldGFkYXRhLnRpbGVzWzBdLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG4gICAgbWV0YWRhdGEudGlsZXNbMF0gPSAnLycgKyBtZXRhZGF0YS50aWxlc1swXTtcbiAgfVxuXG4gIGlmIChtZXRhZGF0YS50aWxlTWFwICYmIG1ldGFkYXRhLnRpbGVNYXAuY2hhckF0KDApICE9PSAnLycpIHtcbiAgICBtZXRhZGF0YS50aWxlTWFwID0gJy8nICsgbWV0YWRhdGEudGlsZU1hcDtcbiAgfVxuXG4gIHN0eWxlLnNvdXJjZXMuZXNyaSA9IHtcbiAgICB0eXBlOiAndmVjdG9yJyxcbiAgICBzY2hlbWU6ICd4eXonLFxuICAgIHRpbGVqc29uOiBtZXRhZGF0YS50aWxlanNvbiB8fCAnMi4wLjAnLFxuICAgIGZvcm1hdDogKG1ldGFkYXRhLnRpbGVJbmZvICYmIG1ldGFkYXRhLnRpbGVJbmZvLmZvcm1hdCkgfHwgJ3BiZicsXG4gICAgaW5kZXg6IG1ldGFkYXRhLnRpbGVNYXAgPyBzdHlsZS5zb3VyY2VzLmVzcmkudXJsICsgbWV0YWRhdGEudGlsZU1hcCA6IG51bGwsXG4gICAgdGlsZXM6IFtcbiAgICAgIHN0eWxlLnNvdXJjZXMuZXNyaS51cmwgKyBtZXRhZGF0YS50aWxlc1swXVxuICAgIF0sXG4gICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgIG5hbWU6IG1ldGFkYXRhLm5hbWVcbiAgfTtcblxuICBpZiAoc3R5bGUuZ2x5cGhzLmluZGV4T2YoJ2h0dHAnKSA9PT0gLTEpIHtcbiAgICAvLyBzZXQgcGF0aHMgdG8gc3ByaXRlIGFuZCBnbHlwaHNcbiAgICBzdHlsZS5nbHlwaHMgPSBzdHlsZVVybC5yZXBsYWNlKCdzdHlsZXMvcm9vdC5qc29uJywgc3R5bGUuZ2x5cGhzLnJlcGxhY2UoJy4uLycsICcnKSk7XG4gICAgc3R5bGUuc3ByaXRlID0gc3R5bGVVcmwucmVwbGFjZSgnc3R5bGVzL3Jvb3QuanNvbicsIHN0eWxlLnNwcml0ZS5yZXBsYWNlKCcuLi8nLCAnJykpO1xuICB9XG59XG5cbmV4cG9ydCB2YXIgVXRpbCA9IHtcbiAgZmV0Y2hNZXRhZGF0YTogZmV0Y2hNZXRhZGF0YSxcbiAgZm9ybWF0U3R5bGU6IGZvcm1hdFN0eWxlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBVdGlsO1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnZXNyaS1sZWFmbGV0JztcbmltcG9ydCB7IGZldGNoTWV0YWRhdGEgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdmFyIEJhc2VtYXAgPSBMLkxheWVyLmV4dGVuZCh7XG4gIHN0YXRpY3M6IHtcbiAgICBVUkxQUkVGSVg6ICdodHRwczovL3d3dy5hcmNnaXMuY29tL3NoYXJpbmcvcmVzdC9jb250ZW50L2l0ZW1zLycsXG4gICAgVVJMU1VGRklYOiAnL3Jlc291cmNlcy9zdHlsZXMvcm9vdC5qc29uJyxcbiAgICBTVFlMRVM6IHtcbiAgICAgICdEYXJrR3JheSc6ICc1NzQzNmMwMWJjNzU0ZGJiODdkZmI2MzZiNjQ4NDAyMicsXG4gICAgICAnR3JheSc6ICcxZTQ3MTY4ZDE4MTI0OGU0OTE1NDFmZmQ1YTkxYzBkZScsXG4gICAgICAnSHlicmlkJzogJ2FmNjA2M2Q2OTA2YzRlYjU4OWRmZTAzODE5NjEwNjYwJyxcbiAgICAgICdOYXZpZ2F0aW9uJzogJ2UxOWU5MzMwYmYwODQ5MGNhODM1M2Q3NmI1ZTJlNjU4JyxcbiAgICAgICdTdHJlZXRzJzogJ2E2MGEzN2EyN2NjMTQwZGRhZDE1ZjkxOWNkNWE2OWYyJyxcbiAgICAgICdTdHJlZXRzTmlnaHQnOiAnOTJjNTUxYzlmMDdiNDE0Nzg0NmFhZTI3M2U4MjI3MTQnLFxuICAgICAgJ1N0cmVldHNSZWxpZWYnOiAnNzhjMGE5YWI0ZmJmNDE5OGE4Yjk1MTg0OGFhYjE5ZDgnLFxuICAgICAgJ1RvcG9ncmFwaGljJzogJzg2ZDVlZDRiNmRjNzQxZGU5ZGFkNWYwZmJlMDlhZTk1JyxcbiAgICAgICdTcHJpbmcnOiAnNzYzODg0OTgzZDM1NDRjMGE0MThhOTc5OTI4ODFmY2UnLFxuICAgICAgJ05ld3NwYXBlcic6ICc0ZjQ4NDNkOTljMzQ0MzZmODI5MjA5MzIzMTc4OTNhZScsXG4gICAgICAnTWlkQ2VudHVyeSc6ICcyNjdmNDRmMDhhODQ0YzdhYmVlMmI2MmIwMDYwMDU0MCcsXG4gICAgICAnTW9kZXJuQW50aXF1ZSc6ICc5OTZkOWU3YTNhYWM0NTE0YmI2OTJjZTdhOTkwZjFjMScsXG4gICAgICAnQmxhY2tBbmRXaGl0ZSc6ICczMTYxNDQzMTc5MjQ0NzAyYTVlMDQ0OTAxMDAxM2I1NCdcbiAgICB9XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAvLyBMLkxheWVyIGV4cGVjdHMgYSBKU09OIG9iamVjdCBsaXRlcmFsIHRvIGJlIHBhc3NlZCBpbiBjb25zdHJ1Y3RvclxuICAgIG9wdGlvbnMgPSB7XG4gICAgICBrZXk6IG9wdGlvbnNcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmtleSA9PT0gJ3N0cmluZycgJiYgQmFzZW1hcC5TVFlMRVNbb3B0aW9ucy5rZXldKSB7XG4gICAgICB2YXIgdXJsID0gQmFzZW1hcC5VUkxQUkVGSVggKyBCYXNlbWFwLlNUWUxFU1tvcHRpb25zLmtleV0gKyBCYXNlbWFwLlVSTFNVRkZJWDtcbiAgICAgIGZldGNoTWV0YWRhdGEodXJsLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMLmVzcmkuVmVjdG9yLkJhc2VtYXA6IEludmFsaWQgcGFyYW1ldGVyLiBVc2Ugb25lIG9mIFwiRGFya0dyYXlcIiwgXCJHcmF5XCIsIFwiSHlicmlkXCIsIFwiTmF2aWdhdGlvblwiLCBcIlN0cmVldHNcIiwgXCJTdHJlZXRzTmlnaHRcIiwgXCJTdHJlZXRzUmVsaWVmXCIsIFwiVG9wb2dyYXBoaWNcIicpO1xuICAgIH1cbiAgfSxcblxuICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgIHRoaXMuX21hcCA9IG1hcDtcblxuICAgIFV0aWwuc2V0RXNyaUF0dHJpYnV0aW9uKG1hcCk7XG5cbiAgICBpZiAobWFwLmF0dHJpYnV0aW9uQ29udHJvbCkge1xuICAgICAgLy8gOTUlIHN1cmUgdGhpcyBpcyB0aGUgcmlnaHQgc3RhdGljIGF0dHJpYnV0aW9uIHVybFxuICAgICAgVXRpbC5fZ2V0QXR0cmlidXRpb25EYXRhKCdodHRwczovL3N0YXRpYy5hcmNnaXMuY29tL2F0dHJpYnV0aW9uL1dvcmxkX1N0cmVldF9NYXAnLCBtYXApO1xuICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5hZGRBdHRyaWJ1dGlvbignPHNwYW4gY2xhc3M9XCJlc3JpLWR5bmFtaWMtYXR0cmlidXRpb25cIj5VU0dTLCBOT0FBPC9zcGFuPicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZWFkeSkge1xuICAgICAgdGhpcy5fYXN5bmNBZGQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbmNlKCdyZWFkeScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fYXN5bmNBZGQoKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cbiAgfSxcblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIG1hcC5vZmYoJ21vdmVlbmQnLCBVdGlsLl91cGRhdGVNYXBBdHRyaWJ1dGlvbik7XG4gICAgbWFwLnJlbW92ZUxheWVyKHRoaXMuX21hcGJveEdMKTtcblxuICAgIGlmIChtYXAuYXR0cmlidXRpb25Db250cm9sKSB7XG4gICAgICB2YXIgdmVjdG9yQXR0cmlidXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdlc3JpLWR5bmFtaWMtYXR0cmlidXRpb24nKVswXS5vdXRlckhUTUw7XG4gICAgICAvLyB0aGlzIGRvZXNuJ3Qgd29yaywgbm90IHN1cmUgd2h5LlxuICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5yZW1vdmVBdHRyaWJ1dGlvbih2ZWN0b3JBdHRyaWJ1dGlvbik7XG4gICAgfVxuICB9LFxuXG4gIF9hc3luY0FkZDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAvLyBzZXQgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIG1hcCB0byB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgdGlsZXNcbiAgICBtYXAuZ2V0Q29udGFpbmVyKCkuc3R5bGUuYmFja2dyb3VuZCA9IHRoaXMuX21hcGJveEdMLm9wdGlvbnMuc3R5bGUubGF5ZXJzWzBdLnBhaW50WydiYWNrZ3JvdW5kLWNvbG9yJ107XG5cbiAgICBtYXAub24oJ21vdmVlbmQnLCBVdGlsLl91cGRhdGVNYXBBdHRyaWJ1dGlvbik7XG4gICAgdGhpcy5fbWFwYm94R0wuYWRkVG8obWFwLCB0aGlzKTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlbWFwIChrZXkpIHtcbiAgcmV0dXJuIG5ldyBCYXNlbWFwKGtleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VtYXA7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IHJlcXVlc3QsIFV0aWwgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuaW1wb3J0IHsgZmV0Y2hNZXRhZGF0YSwgZm9ybWF0U3R5bGUgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdmFyIExheWVyID0gTC5MYXllci5leHRlbmQoe1xuICBzdGF0aWNzOiB7XG4gICAgVVJMUFJFRklYOiAnaHR0cHM6Ly93d3cuYXJjZ2lzLmNvbS9zaGFyaW5nL3Jlc3QvY29udGVudC9pdGVtcy8nXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAvLyBMLkxheWVyIGV4cGVjdHMgYSBKU09OIG9iamVjdCBsaXRlcmFsIHRvIGJlIHBhc3NlZCBpbiBjb25zdHJ1Y3RvclxuICAgIG9wdGlvbnMgPSB7XG4gICAgICBpZDogb3B0aW9uc1xuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgaXRlbU1ldGFkYXRhVXJsID0gTGF5ZXIuVVJMUFJFRklYICsgb3B0aW9ucy5pZDtcbiAgICAgIHZhciB0aWxlVXJsO1xuICAgICAgdmFyIHN0eWxlVXJsO1xuXG4gICAgICByZXF1ZXN0KGl0ZW1NZXRhZGF0YVVybCwge30sIGZ1bmN0aW9uIChlcnJvciwgbWV0YWRhdGEpIHtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHRpbGVVcmwgPSBtZXRhZGF0YS51cmw7XG5cbiAgICAgICAgICAvLyBjdXN0b20gdGlsZXNldCBwdWJsaXNoZWQgdXNpbmcgQXJjR0lTIFByb1xuICAgICAgICAgIGlmICh0aWxlVXJsLmluZGV4T2YoJ2Jhc2VtYXBzLmFyY2dpcy5jb20nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbVRpbGVzZXQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gaWYgY29weXJpZ2h0IGluZm8gd2FzIHB1Ymxpc2hlZCwgZGlzcGxheSBpdC5cbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5hY2Nlc3NJbmZvcm1hdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLl9jb3B5cmlnaHRUZXh0ID0gbWV0YWRhdGEuYWNjZXNzSW5mb3JtYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXF1ZXN0KHRpbGVVcmwsIHt9LCBmdW5jdGlvbiAoZXJyb3IsIHRpbGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gcmlnaHQgbm93IEFyY0dJUyBQcm8gcHVibGlzaGVkIHZlY3RvciBzZXJ2aWNlcyBoYXZlIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHNpZ25hdHVyZVxuICAgICAgICAgICAgICAgIGlmICh0aWxlTWV0YWRhdGEuZGVmYXVsdFN0eWxlcy5jaGFyQXQoMCkgIT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgdGlsZU1ldGFkYXRhLmRlZmF1bHRTdHlsZXMgPSAnLycgKyB0aWxlTWV0YWRhdGEuZGVmYXVsdFN0eWxlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdHlsZVVybCA9IHRpbGVVcmwgKyB0aWxlTWV0YWRhdGEuZGVmYXVsdFN0eWxlcyArICcvcm9vdC5qc29uJztcbiAgICAgICAgICAgICAgICByZXF1ZXN0KHN0eWxlVXJsLCB7fSwgZnVuY3Rpb24gKGVycm9yLCBzdHlsZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXRTdHlsZShzdHlsZSwgdGlsZU1ldGFkYXRhLCBzdHlsZVVybCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwYm94R0wgPSBMLm1hcGJveEdMKHtcbiAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogJ2V6cmVlJyxcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ3JlYWR5Jywge30sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY3VzdG9tIHN5bWJvbG9neSBhcHBsaWVkIHRvIGhvc3RlZCBiYXNlbWFwIHRpbGVzXG4gICAgICAgICAgICBmZXRjaE1ldGFkYXRhKGl0ZW1NZXRhZGF0YVVybCArICcvcmVzb3VyY2VzL3N0eWxlcy9yb290Lmpzb24nLCB0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0wuZXNyaS5WZWN0b3IuTGF5ZXI6IEludmFsaWQgcGFyYW1ldGVyLiBVc2UgdGhlIGlkIG9mIGFuIEFyY0dJUyBPbmxpbmUgdmVjdG9yIHRpbGUgaXRlbScpO1xuICAgIH1cbiAgfSxcblxuICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICBVdGlsLnNldEVzcmlBdHRyaWJ1dGlvbihtYXApO1xuXG4gICAgaWYgKHRoaXMuX3JlYWR5KSB7XG4gICAgICB0aGlzLl9hc3luY0FkZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uY2UoJ3JlYWR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9hc3luY0FkZCgpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgbWFwLm9mZignbW92ZWVuZCcsIFV0aWwuX3VwZGF0ZU1hcEF0dHJpYnV0aW9uKTtcbiAgICBtYXAucmVtb3ZlTGF5ZXIodGhpcy5fbWFwYm94R0wpO1xuXG4gICAgaWYgKG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wpIHtcbiAgICAgIHZhciB2ZWN0b3JBdHRyaWJ1dGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VzcmktZHluYW1pYy1hdHRyaWJ1dGlvbicpWzBdLm91dGVySFRNTDtcbiAgICAgIC8vIHRoaXMgZG9lc24ndCB3b3JrLCBub3Qgc3VyZSB3aHkuXG4gICAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLnJlbW92ZUF0dHJpYnV0aW9uKHZlY3RvckF0dHJpYnV0aW9uKTtcbiAgICB9XG4gIH0sXG5cbiAgX2FzeW5jQWRkOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1hcCA9IHRoaXMuX21hcDtcbiAgICBpZiAobWFwLmF0dHJpYnV0aW9uQ29udHJvbCkge1xuICAgICAgaWYgKHRoaXMuX2N1c3RvbVRpbGVzZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvcHlyaWdodFRleHQpIHtcbiAgICAgICAgICAvLyBwdWxsIHN0YXRpYyBjb3B5cmlnaHQgdGV4dCBmb3Igc2VydmljZXMgcHVibGlzaGVkIHdpdGggUHJvXG4gICAgICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5hZGRBdHRyaWJ1dGlvbignPHNwYW4gY2xhc3M9XCJlc3JpLWR5bmFtaWMtYXR0cmlidXRpb25cIj4nICsgdGhpcy5fY29weXJpZ2h0VGV4dCArICc8L3NwYW4+Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHByb3ZpZGUgZHluYW1pYyBhdHRyaWJ1dGlvbiBmb3IgRXNyaSBiYXNlbWFwc1xuICAgICAgICBVdGlsLl9nZXRBdHRyaWJ1dGlvbkRhdGEoJ2h0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vV29ybGRfU3RyZWV0X01hcCcsIG1hcCk7XG4gICAgICAgIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuYWRkQXR0cmlidXRpb24oJzxzcGFuIGNsYXNzPVwiZXNyaS1keW5hbWljLWF0dHJpYnV0aW9uXCI+VVNHUywgTk9BQTwvc3Bhbj4nKTtcbiAgICAgICAgbWFwLm9uKCdtb3ZlZW5kJywgVXRpbC5fdXBkYXRlTWFwQXR0cmlidXRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgbWFwIHRvIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSB0aWxlc1xuICAgIG1hcC5nZXRDb250YWluZXIoKS5zdHlsZS5iYWNrZ3JvdW5kID0gdGhpcy5fbWFwYm94R0wub3B0aW9ucy5zdHlsZS5sYXllcnNbMF0ucGFpbnRbJ2JhY2tncm91bmQtY29sb3InXTtcbiAgICB0aGlzLl9tYXBib3hHTC5hZGRUbyhtYXAsIHRoaXMpO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGxheWVyIChpZCkge1xuICByZXR1cm4gbmV3IExheWVyKGlkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTGF5ZXI7XG4iXSwibmFtZXMiOlsicmVxdWVzdCIsIkwiLCJVdGlsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0NDQUEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxPQUFPLEdBQUcsUUFBUSxFQUFFLE9BQU8sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLE9BQU8sTUFBTSxHQUFHLFVBQVUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxPQUFPLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxPQUFPLElBQUksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMvMEIsQ0FBQSxZQUFZLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFN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QUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdmYsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvaEIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMVUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3NUIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoNUIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdFksQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3bEIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RSxDQUFBLFlBQVksQ0FBQyxTQUFTLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pYLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUUsQ0FBQSxZQUFZLENBQUMsU0FBUyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xaLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUUsQ0FBQSxZQUFZLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2oyQixDQUFBLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMvRCxDQUFBLFlBQVksQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQ2hwQyxDQUFBLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2xOLENBQUEsWUFBWSxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9tQixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsU0FBUyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8saUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM3RHLENBQUEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQy9HLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzU0QixDQUFBLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMvRCxDQUFBLFlBQVksQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxdkcsQ0FBQSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDL0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMscUVBQXFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5a1AsQ0FBQSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbFYsQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3RlLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdmUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzVELENBQUEsWUFBWSxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFlBQVksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbnJDLENBQUEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN4RCxDQUFBLFlBQVksQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pwSyxDQUFBLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1SixDQUFBLFlBQVksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzdvTyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUMsUUFB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QUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUN4bEQsQ0FBQSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pELENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUM1MUIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDakUsQ0FBQSxZQUFZLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztBQUM5ckIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUMvZ0MsQ0FBQSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3BGLENBQUEsWUFBWSxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0FBQ2pzRixDQUFBLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzlFLENBQUEsWUFBWSxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4bUcsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM5RSxDQUFBLFlBQVksQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUNwNUQsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzVELENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BrRyxDQUFBLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxRyxDQUFBLFlBQVksQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0FBQ3Q3QixDQUFBLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzlFLENBQUEsWUFBWSxDQUFDLFNBQVMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyw2REFBNkQsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdmdDLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFBRSxPQUFPLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbjhELENBQUEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNFLENBQUEsWUFBWSxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbnJFLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbjlOLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzUSxDQUFBLFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLDBJQUEwSSxDQUFDLFFBQVEsQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnS0FBZ0ssQ0FBQyxRQUFRLENBQUMsMEtBQTBLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsdUhBQXVILENBQUMsUUFBUSxDQUFDLGlGQUFpRixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLDhRQUE4USxDQUFDLFFBQVEsQ0FBQyw4S0FBOEssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxpZ0JBQWlnQixDQUFDLFFBQVEsQ0FBQyw2UUFBNlEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyw4aUJBQThpQixDQUFDLFFBQVEsQ0FBQyw4c0JBQThzQixDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLGd0QkFBZ3RCLENBQUMsUUFBUSxDQUFDLGdiQUFnYixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLGdOQUFnTixDQUFDLFFBQVEsQ0FBQyw4SkFBOEosQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyx1UUFBdVEsQ0FBQyxRQUFRLENBQUMseVlBQXlZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsd1NBQXdTLENBQUMsUUFBUSxDQUFDLDhrQkFBOGtCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsc3pCQUFzekIsQ0FBQyxRQUFRLENBQUMsd0lBQXdJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsbTFCQUFtMUIsQ0FBQyxRQUFRLENBQUMsMFFBQTBRLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsd05BQXdOLENBQUMsUUFBUSxDQUFDLHVRQUF1USxDQUFDLENBQUMsQ0FBQztBQUN2alMsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNStFLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN0SSxDQUFBLFlBQVksQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztBQUM1L0IsQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNoRixDQUFBLFlBQVksQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsakUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN6SixDQUFBLFlBQVksQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsL0QsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZJLENBQUEsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzkzRSxDQUFBLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDaFIsQ0FBQSxZQUFZLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbDFELENBQUEsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxRyxDQUFBLFlBQVksQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9xRSxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2dkksQ0FBQSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZJLENBQUEsWUFBWSxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcnFGLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2xILENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3YzRSxDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pKLENBQUEsWUFBWSxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcDNFLENBQUEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxTSxDQUFBLFlBQVksQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcmlHLENBQUEsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFKLENBQUEsWUFBWSxDQUFDLFNBQVMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4YyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsRUFBRSxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQztBQUMxNEMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNILENBQUEsWUFBWSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3UixDQUFBLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUQsQ0FBQSxZQUFZLENBQUMsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqWCxDQUFBLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQy9FLENBQUEsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7QUFDN0UsQ0FBQSxDQUFDLENBQUMsQ0FBQyx1Q0FBdUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDckYsQ0FBQSxZQUFZLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLDBDQUEwQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDanBNLENBQUEsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2xaLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDeGlILENBQUEsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbEYsQ0FBQSxZQUFZLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDO0FBQ2p1QyxDQUFBLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxRyxDQUFBLFlBQVksQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0c0MsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3RHLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsdkcsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNsSyxDQUFBLFlBQVksQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2hrQyxDQUFBLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3RGLENBQUEsWUFBWSxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN4UyxDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM5RCxDQUFBLFlBQVksQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzk4QixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDemUsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFDOXdCLENBQUEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzlELENBQUEsWUFBWSxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUMvTSxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUM3MkIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ25GLENBQUEsWUFBWSxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pwQyxDQUFBLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDckQsQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0FBQ2owQixDQUFBLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2hILENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5d0YsQ0FBQSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pELENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM2hELENBQUEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDL0csQ0FBQSxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3h0QixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQztBQUN4K0QsQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDOUQsQ0FBQSxZQUFZLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUMvTyxDQUFBLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDN0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0FBQy9tQixDQUFBLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDN0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4aEQsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BwSSxDQUFBLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDekQsQ0FBQSxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZvTixDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMvSyxDQUFBLFlBQVksQ0FBQyxTQUFTLFdBQVcsRUFBRSxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxD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SUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNXJFLENBQUEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2xHLENBQUEsWUFBWSxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxD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QyxHQUFHLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzkrRCxDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbkYsQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMTJDLENBQUEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDeEcsQ0FBQSxZQUFZLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqMkIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3Z0QyxDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbkYsQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2h0RCxDQUFBLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNHLENBQUEsWUFBWSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sTUFBTSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxH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Q0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMs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QUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFdBQVcsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxNQUFNLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMs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LElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3B1RixDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZILENBQUEsWUFBWSxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcDBCLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDLy9DLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQywyQkFBMkIsRUFBRSxNQUFNLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMsMEJBQTBCLEVBQUUsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLFdBQVcsRUFBRSxPQUFPLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLFdBQVcsRUFBRSxPQUFPLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxPQUFPLEdBQUcsSUFBSSxFQUFFLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN3lELENBQUEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN2RCxDQUFBLFlBQVksQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLHlCQUF5QixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzM0MsQ0FBQSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZELENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFwQixDQUFBLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDakcsQ0FBQSxZQUFZLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUNwbkMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDOUQsQ0FBQSxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZGLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsQ0FBQSxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUMveEIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZELENBQUEsWUFBWSxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNybEIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzliLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsQ0FBQSxZQUFZLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0R0FBNEcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0pBQWdKLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsT0FBTyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaC9DLENBQUEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZFLENBQUEsWUFBWSxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNucEIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUMxSixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsWUFBWSxDQUFDLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4K0UsQ0FBQSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNsRixDQUFBLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sY0FBYyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLGVBQWUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxjQUFjLENBQUMsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUMxcUssQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksc0JBQXNCLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsMkRBQTJELENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2gwQyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsWUFBWSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUMxckMsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2oxRCxDQUFBLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyREFBMkQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcHFILENBQUEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ25ILENBQUEsWUFBWSxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUMvYyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUM1MEIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztBQUMxZ0IsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQy9zQixDQUFBLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdkQsQ0FBQSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUNwWixDQUFBLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZSLENBQUEsSUFBSSxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLE9BQU8sWUFBWSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUNwUyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUN6cUQsQ0FBQSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzVELENBQUEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ2g4RCxDQUFBLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUQsQ0FBQSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDcCtILENBQUEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RCxDQUFBLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDaDJWLENBQUEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RCxDQUFBLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUNsdEcsQ0FBQSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzVHLENBQUEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQzFzRixDQUFBLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUQsQ0FBQSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDamlKLENBQUEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RCxDQUFBLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDdjNHLENBQUEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RCxDQUFBLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqM0IsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFVBQVUsRUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25ULENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsQ0FBQSxZQUFZLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3J5QixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsWUFBWSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQzFKLENBQUEsQ0FBQyxDQUFDLENBQUMsK0JBQStCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDN0YsQ0FBQSxZQUFZLENBQUMsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxNQUFNLEVBQUUsQ0FBQyxZQUFZLE1BQU0sRUFBRSxDQUFDLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUNBQXlDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHlDQUF5QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHlDQUF5QyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0VBQWdFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMscURBQXFELENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBDQUEwQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9EQUFvRCxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMENBQTBDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscURBQXFELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLCtDQUErQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0VBQWdFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1dE0sQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxRSxDQUFBLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3BDLENB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Q0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGdMQUFnTCxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsa0dBQWtHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsbUtBQW1LLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsK0ZBQStGLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLHVHQUF1RyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxnSEFBZ0gsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsb0dBQW9HLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGdIQUFnSCxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyx1RUFBdUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsdUhBQXVILENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxD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LENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDBFQUEwRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsb0ZBQW9GLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZ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TSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUMsbUJBQW1CLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUMvcWMsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUMvd0UsQ0FBQSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3hELENBQUEsQ0FBQyxVQUFVLE1BQU0sQ0FBQztBQUNsQixDQUFBLFlBQVksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeHhRLENBQUEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxXQUFXLEdBQUcsTUFBTSxHQUFHLE9BQU8sSUFBSSxLQUFLLFdBQVcsR0FBRyxJQUFJLEdBQUcsT0FBTyxNQUFNLEtBQUssV0FBVyxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7O0FBRXZJLENBQUEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN6RCxDQUFBLFlBQVksQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzdkQsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFNBQVMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsU0FBUyxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDaHpDLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsQ0FBQSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNybU0sQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25pQixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaDhCLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDL0ksQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLENBQUMsVUFBVSxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQzFCLENBQUEsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxZQUFZLENBQUMsUUFBUSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sVUFBVSxDQUFDLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDMXJPLENBQUEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxNQUFNLEtBQUssV0FBVyxHQUFHLE1BQU0sR0FBRyxPQUFPLElBQUksS0FBSyxXQUFXLEdBQUcsSUFBSSxHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVcsR0FBRyxNQUFNLEdBQUcsRUFBRSxDQUFDOztBQUUzSixDQUFBLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDakcsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBQ25NLENBQUEsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDcEksQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUN2USxDQUFBLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNsRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1bkssQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDL0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUN4a0UsQ0FBQSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pGLENBQUEsWUFBWSxDQUFDLFNBQVMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUMvakMsQ0FBQSxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdkUsQ0FBQSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFT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
--- a/src/pyams_gis/resources/js/leaflet-esri-vector-1.0.6.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-(function(b,a){typeof exports==="object"&&typeof module!=="undefined"?a(exports,require("leaflet"),require("esri-leaflet")):typeof define==="function"&&define.amd?define(["exports","leaflet","esri-leaflet"],a):(a((b.L=b.L||{},b.L.esri=b.L.esri||{},b.L.esri.Vector=b.L.esri.Vector||{}),b.L,b.L.esri))}(this,function(c,j,i){j="default" in j?j["default"]:j;var g="1.0.6";(function(l){if(typeof c==="object"&&typeof module!=="undefined"){module.exports=l()}else{if(typeof define==="function"&&define.amd){define([],l)}else{var k;if(typeof window!=="undefined"){k=window}else{if(typeof global!=="undefined"){k=global}else{if(typeof self!=="undefined"){k=self}else{k=this}}}k.mapboxgl=l()}}})(function(){var n,l,k;return(function m(q,z,v){function u(B,t){if(!z[B]){if(!q[B]){var s=typeof require=="function"&&require;if(!t&&s){return s(B,!0)}if(p){return p(B,!0)}var A=new Error("Cannot find module '"+B+"'");throw A.code="MODULE_NOT_FOUND",A}var r=z[B]={exports:{}};q[B][0].call(r.exports,function(o){var C=q[B][1][o];return u(C?C:o)},r,r.exports,m,q,z,v)}return z[B].exports}var p=typeof require=="function"&&require;for(var w=0;w<v.length;w++){u(v[w])}return u})({1:[function(p,q,o){function r(s){s?(this.array=s.array,this.pos=s.pos):(this.array=new ArrayBuffer(this.defaultLength),this.length=this.defaultLength,this.setupViews())}q.exports=r,r.prototype={pos:0,itemSize:4,defaultLength:8192,arrayType:"ARRAY_BUFFER",get indexfunction(){return this.pos/this.itemSize},setupViews:function(){this.ubytes=new Uint8Array(this.array),this.bytes=new Int8Array(this.array),this.ushorts=new Uint16Array(this.array),this.shorts=new Int16Array(this.array)},bind:function(s){var u=s[this.arrayType];this.buffer?s.bindBuffer(u,this.buffer):(this.buffer=s.createBuffer(),s.bindBuffer(u,this.buffer),s.bufferData(u,this.array.slice(0,this.pos),s.STATIC_DRAW),this.array=null)},destroy:function(s){this.buffer&&s.deleteBuffer(this.buffer)},resize:function(){if(this.length<this.pos+this.itemSize){for(;this.length<this.pos+this.itemSize;){this.length=2*Math.round(1.5*this.length/2)}this.array=new ArrayBuffer(this.length);var s=new Uint8Array(this.array);s.set(this.ubytes),this.setupViews()}}}},{}],2:[function(t,s,v){var o=t("./line_vertex_buffer"),z=t("./line_element_buffer"),p=t("./fill_vertex_buffer"),q=t("./triangle_element_buffer"),E=t("./outline_element_buffer"),r=t("./glyph_vertex_buffer"),w=t("./triangle_element_buffer"),u=t("./icon_vertex_buffer"),A=t("./triangle_element_buffer"),D=t("./collision_box_vertex_buffer"),C=t("./circle_vertex_buffer"),B=t("./triangle_element_buffer");s.exports=function(F){return F=F||{},{glyphVertex:new r(F.glyphVertex),glyphElement:new w(F.glyphElement),iconVertex:new u(F.iconVertex),iconElement:new A(F.iconElement),circleVertex:new C(F.circleVertex),circleElement:new B(F.circleElement),fillVertex:new p(F.fillVertex),fillElement:new q(F.fillElement),outlineElement:new E(F.outlineElement),lineVertex:new o(F.lineVertex),lineElement:new z(F.lineElement),collisionBoxVertex:new D(F.collisionBoxVertex)}}},{"./circle_vertex_buffer":3,"./collision_box_vertex_buffer":4,"./fill_vertex_buffer":5,"./glyph_vertex_buffer":6,"./icon_vertex_buffer":7,"./line_element_buffer":8,"./line_vertex_buffer":9,"./outline_element_buffer":10,"./triangle_element_buffer":11}],3:[function(q,r,p){function s(u){t.call(this,u)}var o=q("../../util/util"),t=q("./buffer");r.exports=s,s.prototype=o.inherit(t,{defaultLength:32768,itemSize:4,add:function(B,v,u,z){var A=this.pos,w=A/2;this.resize(),this.shorts[w+0]=2*B+(u+1)/2,this.shorts[w+1]=2*v+(z+1)/2,this.pos+=this.itemSize},bind:function(w,v,u){t.prototype.bind.call(this,w),w.vertexAttribPointer(v.a_pos,2,w.SHORT,!1,this.itemSize,u+0)}})},{"../../util/util":106,"./buffer":1}],4:[function(q,r,p){function t(u){s.call(this,u)}var o=q("../../util/util"),s=q("./buffer");r.exports=t,t.prototype=o.inherit(s,{itemSize:12,defaultLength:32768,add:function(z,w,C,B){var A=this.pos,D=A/2,v=this.index;return this.resize(),this.shorts[D+0]=z.x,this.shorts[D+1]=z.y,this.shorts[D+2]=Math.round(w.x),this.shorts[D+3]=Math.round(w.y),this.ubytes[A+8]=Math.floor(10*C),this.ubytes[A+9]=Math.floor(10*B),this.pos+=this.itemSize,v}})},{"../../util/util":106,"./buffer":1}],5:[function(q,r,p){function t(u){s.call(this,u)}var o=q("../../util/util"),s=q("./buffer");r.exports=t,t.prototype=o.inherit(s,{itemSize:4,add:function(w,v){var u=this.pos/2;this.resize(),this.shorts[u+0]=w,this.shorts[u+1]=v,this.pos+=this.itemSize}})},{"../../util/util":106,"./buffer":1}],6:[function(q,r,p){function t(u){s.call(this,u)}var o=q("../../util/util"),s=q("./buffer");r.exports=t,t.prototype=o.inherit(s,{defaultLength:32768,itemSize:16,add:function(G,D,v,A,H,B,w,C,F){var E=this.pos,z=E/2;this.resize(),this.shorts[z+0]=G,this.shorts[z+1]=D,this.shorts[z+2]=Math.round(64*v),this.shorts[z+3]=Math.round(64*A),this.ubytes[E+8]=Math.floor(H/4),this.ubytes[E+9]=Math.floor(B/4),this.ubytes[E+10]=Math.floor(10*F),this.ubytes[E+12]=Math.floor(10*w),this.ubytes[E+13]=Math.floor(10*Math.min(C,25)),this.pos+=this.itemSize},bind:function(v,z,w){s.prototype.bind.call(this,v);var u=this.itemSize;v.vertexAttribPointer(z.a_pos,2,v.SHORT,!1,u,w+0),v.vertexAttribPointer(z.a_offset,2,v.SHORT,!1,u,w+4),v.vertexAttribPointer(z.a_data1,4,v.UNSIGNED_BYTE,!1,u,w+8),v.vertexAttribPointer(z.a_data2,2,v.UNSIGNED_BYTE,!1,u,w+12)}})},{"../../util/util":106,"./buffer":1}],7:[function(q,r,p){function s(u){t.call(this,u)}var o=q("../../util/util"),t=q("./buffer");r.exports=s,s.prototype=o.inherit(t,{defaultLength:32768,itemSize:16,add:function(G,D,A,v,H,w,B,F,C){var E=this.pos,z=E/2;this.resize(),this.shorts[z+0]=G,this.shorts[z+1]=D,this.shorts[z+2]=Math.round(64*A),this.shorts[z+3]=Math.round(64*v),this.ubytes[E+8]=H/4,this.ubytes[E+9]=w/4,this.ubytes[E+10]=Math.floor(10*(C||0)),this.ubytes[E+12]=Math.floor(10*(B||0)),this.ubytes[E+13]=Math.floor(10*Math.min(F||25,25)),this.pos+=this.itemSize},bind:function(v,z,u){t.prototype.bind.call(this,v);var w=this.itemSize;v.vertexAttribPointer(z.a_pos,2,v.SHORT,!1,w,u+0),v.vertexAttribPointer(z.a_offset,2,v.SHORT,!1,w,u+4),v.vertexAttribPointer(z.a_data1,4,v.UNSIGNED_BYTE,!1,w,u+8),v.vertexAttribPointer(z.a_data2,2,v.UNSIGNED_BYTE,!1,w,u+12)}})},{"../../util/util":106,"./buffer":1}],8:[function(q,r,p){function s(u){t.call(this,u)}var o=q("../../util/util"),t=q("./buffer");r.exports=s,s.prototype=o.inherit(t,{itemSize:6,arrayType:"ELEMENT_ARRAY_BUFFER",add:function(z,v,u){var w=this.pos/2;this.resize(),this.ushorts[w+0]=z,this.ushorts[w+1]=v,this.ushorts[w+2]=u,this.pos+=this.itemSize}})},{"../../util/util":106,"./buffer":1}],9:[function(q,r,p){function t(u){s.call(this,u)}var o=q("../../util/util"),s=q("./buffer");r.exports=t,t.extrudeScale=63,t.prototype=o.inherit(s,{itemSize:8,defaultLength:32768,add:function(C,E,v,z,F){var D=this.pos,B=D/2,A=this.index,w=t.extrudeScale;return this.resize(),this.shorts[B+0]=2*Math.floor(C.x)|v,this.shorts[B+1]=2*Math.floor(C.y)|z,this.bytes[D+4]=Math.round(w*E.x),this.bytes[D+5]=Math.round(w*E.y),this.bytes[D+6]=(F||0)/128,this.bytes[D+7]=(F||0)%128,this.pos+=this.itemSize,A}})},{"../../util/util":106,"./buffer":1}],10:[function(q,r,p){function s(u){t.call(this,u)}var o=q("../../util/util"),t=q("./buffer");r.exports=s,s.prototype=o.inherit(t,{itemSize:4,arrayType:"ELEMENT_ARRAY_BUFFER",add:function(w,v){var u=this.pos/2;this.resize(),this.ushorts[u+0]=w,this.ushorts[u+1]=v,this.pos+=this.itemSize}})},{"../../util/util":106,"./buffer":1}],11:[function(r,s,q){function p(u){t.call(this,u)}var o=r("../../util/util"),t=r("./buffer");s.exports=p,p.prototype=o.inherit(t,{itemSize:6,arrayType:"ELEMENT_ARRAY_BUFFER",add:function(z,v,u){var w=this.pos/2;this.resize(),this.ushorts[w+0]=z,this.ushorts[w+1]=v,this.ushorts[w+2]=u,this.pos+=this.itemSize}})},{"../../util/util":106,"./buffer":1}],12:[function(q,r,p){function o(t){this.buffers=t,this.elementGroups=new s(t.circleVertex,t.circleElement)}var s=q("./element_groups");r.exports=o,o.prototype.addFeatures=function(){for(var D=4096,C=0;C<this.features.length;C++){for(var A=this.features[C].loadGeometry()[0],B=0;B<A.length;B++){this.elementGroups.makeRoomFor(6);var w=A[B].x,z=A[B].y;if(!(0>w||w>=D||0>z||z>=D)){var v=this.buffers.circleVertex.index-this.elementGroups.current.vertexStartIndex;this.buffers.circleVertex.add(w,z,-1,-1),this.buffers.circleVertex.add(w,z,1,-1),this.buffers.circleVertex.add(w,z,1,1),this.buffers.circleVertex.add(w,z,-1,1),this.elementGroups.elementBuffer.add(v,v+1,v+2),this.elementGroups.elementBuffer.add(v,v+3,v+2),this.elementGroups.current.vertexLength+=4,this.elementGroups.current.elementLength+=2}}}}},{"./element_groups":14}],13:[function(r,q,t){function u(G,K,F,B,E){var H=new s("layout",G.type,G.layout,{}).values(),I={lastIntegerZoom:1/0,lastIntegerZoomTime:0,lastZoom:0},J={};for(var C in H){J[C]=H[C].calculate(F,I)}"symbol"===G.type&&(H["text-size"]&&(J["text-max-size"]=H["text-size"].calculate(18,I),J["text-size"]=H["text-size"].calculate(F+1,I)),H["icon-size"]&&(J["icon-max-size"]=H["icon-size"].calculate(18,I),J["icon-size"]=H["icon-size"].calculate(F+1,I)));var M="line"===G.type?A:"fill"===G.type?v:"symbol"===G.type?w:"circle"===G.type?p:null,D=new M(K,new z[G.type](J),B,F,E);return D.id=G.id,D.type=G.type,D["source-layer"]=G["source-layer"],D.interactive=G.interactive,D.minZoom=G.minzoom,D.maxZoom=G.maxzoom,D.filter=o(G.filter),D.features=[],D}q.exports=u;var A=r("./line_bucket"),v=r("./fill_bucket"),w=r("./symbol_bucket"),p=r("./circle_bucket"),z=r("../style/layout_properties"),o=r("feature-filter"),s=r("../style/style_declaration_set")},{"../style/layout_properties":53,"../style/style_declaration_set":59,"./circle_bucket":12,"./fill_bucket":16,"./line_bucket":17,"./symbol_bucket":18,"feature-filter":108}],14:[function(p,q,o){function r(v,u,w){this.vertexBuffer=v,this.elementBuffer=u,this.secondElementBuffer=w,this.groups=[]}function s(v,u,w){this.vertexStartIndex=v,this.elementStartIndex=u,this.secondElementStartIndex=w,this.elementLength=0,this.vertexLength=0,this.secondElementLength=0}q.exports=r,r.prototype.makeRoomFor=function(t){(!this.current||this.current.vertexLength+t>65535)&&(this.current=new s(this.vertexBuffer.index,this.elementBuffer&&this.elementBuffer.index,this.secondElementBuffer&&this.secondElementBuffer.index),this.groups.push(this.current))}},{}],15:[function(u,q,G){function s(I,J){this.x=I.x,this.y=I.y,this.z=I.z-Math.log(J)/Math.LN2,this.rtree=w(9),this.toBeInserted=[]}function C(I,J,K){return"Point"===J?p(I,K):"LineString"===J?F(I,K):"Polygon"===J?A(I,K)||F(I,K):!1}function A(I,J){return r(I,new E(J[0],J[1]))||r(I,new E(J[0],J[3]))||r(I,new E(J[2],J[1]))||r(I,new E(J[2],J[3]))?!0:F(I,J)}function F(R,O){for(var K=0;K<R.length;K++){for(var I=R[K],J=0,N=I.length-1;J<I.length;N=J++){var S=I[J],P=I[N],Q=new E(S.y,S.x),M=new E(P.y,P.x);if(v(S,P,O[0],O[2],O[1])||v(S,P,O[0],O[2],O[3])||v(Q,M,O[1],O[3],O[0])||v(Q,M,O[1],O[3],O[2])){return !0}}}return p(R,O)}function v(J,N,P,M,O){if(N.y===J.y){return N.y===O&&Math.min(J.x,N.x)<=M&&Math.max(J.x,N.x)>=P}var I=(O-J.y)/(N.y-J.y),K=J.x+I*(N.x-J.x);return K>=P&&M>=K&&1>=I&&I>=0}function p(I,K){for(var N=0;N<I.length;N++){for(var J=I[N],M=0;M<J.length;M++){if(J[M].x>=K[0]&&J[M].y>=K[1]&&J[M].x<=K[2]&&J[M].y<=K[3]){return !0}}}return !1}function t(I,K,M,J){return"Point"===K?D(I,M,J):"LineString"===K?B(I,M,J):"Polygon"===K?r(I,M)||B(I,M,J):!1}function H(I,K,N){var J=K.distSqr(N);if(0===J){return I.distSqr(K)}var M=((I.x-K.x)*(N.x-K.x)+(I.y-K.y)*(N.y-K.y))/J;return 0>M?I.distSqr(K):M>1?I.distSqr(N):I.distSqr(N.sub(K)._mult(M)._add(K))}function B(Q,N,K){for(var I=K*K,J=0;J<Q.length;J++){for(var M=Q[J],R=1;R<M.length;R++){var O=M[R-1],P=M[R];if(H(N,O,P)<I){return !0}}}return !1}function r(Q,N){for(var K,I,J,M=!1,R=0;R<Q.length;R++){K=Q[R];for(var O=0,P=K.length-1;O<K.length;P=O++){I=K[O],J=K[P],I.y>N.y!=J.y>N.y&&N.x<(J.x-I.x)*(N.y-I.y)/(J.y-I.y)+I.x&&(M=!M)}}return M}function D(J,N,P){for(var M=P*P,O=0;O<J.length;O++){for(var I=J[O],K=0;K<I.length;K++){if(I[K].distSqr(N)<=M){return !0}}}return !1}var w=u("rbush"),E=u("point-geometry"),z=u("vector-tile"),o=u("../util/util");q.exports=s,s.prototype.insert=function(I,J,K){I.layers=J,I.feature=K,this.toBeInserted.push(I)},s.prototype._load=function(){this.rtree.load(this.toBeInserted),this.toBeInserted=[]},s.prototype.query=function(X,R){this.toBeInserted.length&&this._load();var K,I,J=X.params||{},N=X.x,Y=X.y,V=[];"undefined"!=typeof N&&"undefined"!=typeof Y?(K=(J.radius||0)*(X.tileExtent||4096)/X.scale,I=[N-K,Y-K,N+K,Y+K]):I=[X.minX,X.minY,X.maxX,X.maxY];for(var W=this.rtree.search(I),M=0;M<W.length;M++){var T=W[M].feature,U=W[M].layers,Q=z.VectorTileFeature.types[T.type];if((!J.$type||Q===J.$type)&&(!K||t(T.loadGeometry(),Q,new E(N,Y),K))&&C(T.loadGeometry(),Q,I)){var O=T.toGeoJSON(this.x,this.y,this.z);J.includeGeometry||(O.geometry=null);for(var S=0;S<U.length;S++){var P=U[S];J.layerIds&&J.layerIds.indexOf(P)<0||V.push(o.extend({layer:P},O))}}}R(null,V)}},{"../util/util":106,"point-geometry":137,rbush:139,"vector-tile":144}],16:[function(p,q,o){function r(t){this.buffers=t,this.elementGroups=new s(t.fillVertex,t.fillElement,t.outlineElement)}var s=p("./element_groups");q.exports=r,r.prototype.addFeatures=function(){for(var z=this.features,v=0;v<z.length;v++){var u=z[v],w=u.loadGeometry();w&&this.addFeature(w)}},r.prototype.addFeature=function(v){for(var u=0;u<v.length;u++){this.addFill(v[u])}},r.prototype.addFill=function(C){if(!(C.length<3)){var G=C.length;this.elementGroups.makeRoomFor(G+1);for(var A,v,z,B=this.elementGroups.current,w=this.buffers.fillVertex,F=this.buffers.fillElement,H=this.buffers.outlineElement,D=w.index-B.vertexStartIndex,E=0;E<C.length;E++){v=w.index-B.vertexStartIndex,z=C[E],w.add(z.x,z.y),B.vertexLength++,E>=2&&(z.x!==C[0].x||z.y!==C[0].y)&&(F.add(D,A,v),B.elementLength++),E>=1&&(H.add(A,v),B.secondElementLength++),A=v}}}},{"./element_groups":14}],17:[function(q,r,p){function o(v,u){this.buffers=v,this.elementGroups=new s(v.lineVertex,v.lineElement),this.layoutProperties=u}var s=q("./element_groups");r.exports=o,o.prototype.addFeatures=function(){for(var z=this.features,v=0;v<z.length;v++){var w=z[v],u=w.loadGeometry();u&&this.addFeature(u)}},o.prototype.addFeature=function(w){for(var u=this.layoutProperties,v=0;v<w.length;v++){this.addLine(w[v],u["line-join"],u["line-cap"],u["line-miter-limit"],u["line-round-limit"])}},o.prototype.addLine=function(am,W,Z,ai,X){for(var ae=am.length;ae>2&&am[ae-1].equals(am[ae-2]);){ae--}if(!(am.length<2)){"bevel"===W&&(ai=1.05);var T=am[0],aj=am[ae-1],an=T.equals(aj);if(this.elementGroups.makeRoomFor(10*ae),2!==ae||!an){var aq,ag,ad,al,af,ac,N,Q=Z,ao=an?"butt":Z,w=1,ap=0,ar=!0;this.e1=this.e2=this.e3=-1,an&&(aq=am[ae-2],af=T.sub(aq)._unit()._perp());for(var J=0;ae>J;J++){if(ad=an&&J===ae-1?am[1]:am[J+1],!ad||!am[J].equals(ad)){af&&(al=af),aq&&(ag=aq),aq=am[J],ag&&(ap+=aq.dist(ag)),af=ad?ad.sub(aq)._unit()._perp():al,al=al||af;var H=al.add(af)._unit(),Y=H.x*af.x+H.y*af.y,ak=1/Y,ah=ag&&ad,O=ah?W:ad?Q:ao;if(ah&&"round"===O&&(X>ak?O="miter":2>=ak&&(O="fakeround")),"miter"===O&&ak>ai&&(O="bevel"),"bevel"===O&&(ak>2&&(O="flipbevel"),ai>ak&&(O="miter")),"miter"===O){H._mult(ak),this.addCurrentVertex(aq,w,ap,H,0,0,!1)}else{if("flipbevel"===O){if(ak>100){H=af.clone()}else{var ab=al.x*af.y-al.y*af.x>0?-1:1,aa=ak*al.add(af).mag()/al.sub(af).mag();H._perp()._mult(aa*ab)}this.addCurrentVertex(aq,w,ap,H,0,0,!1),w=-w}else{if("bevel"===O||"fakeround"===O){var A=w*(al.x*af.y-al.y*af.x)>0,z=-Math.sqrt(ak*ak-1);if(A?(N=0,ac=z):(ac=0,N=z),ar||this.addCurrentVertex(aq,w,ap,al,ac,N,!1),"fakeround"===O){for(var U,R=Math.floor(8*(0.5-(Y-0.5))),K=0;R>K;K++){U=af.mult((K+1)/(R+1))._add(al)._unit(),this.addPieSliceVertex(aq,w,ap,U,A)}this.addPieSliceVertex(aq,w,ap,H,A);for(var D=R-1;D>=0;D--){U=al.mult((D+1)/(R+1))._add(af)._unit(),this.addPieSliceVertex(aq,w,ap,U,A)}}ad&&this.addCurrentVertex(aq,w,ap,af,-ac,-N,!1)}else{"butt"===O?(ar||this.addCurrentVertex(aq,w,ap,al,0,0,!1),ad&&this.addCurrentVertex(aq,w,ap,af,0,0,!1)):"square"===O?(ar||(this.addCurrentVertex(aq,w,ap,al,1,1,!1),this.e1=this.e2=-1,w=1),ad&&this.addCurrentVertex(aq,w,ap,af,-1,-1,!1)):"round"===O&&(ar||(this.addCurrentVertex(aq,w,ap,al,0,0,!1),this.addCurrentVertex(aq,w,ap,al,1,1,!0),this.e1=this.e2=-1,w=1),ad&&(this.addCurrentVertex(aq,w,ap,af,-1,-1,!0),this.addCurrentVertex(aq,w,ap,af,0,0,!1)))}}}ar=!1}}}}},o.prototype.addCurrentVertex=function(E,I,v,B,J,z,H){var C,F=H?1:0,G=this.buffers.lineVertex,A=this.buffers.lineElement,w=this.elementGroups.current,D=this.elementGroups.current.vertexStartIndex;C=B.mult(I),J&&C._sub(B.perp()._mult(J)),this.e3=G.add(E,C,F,0,v)-D,this.e1>=0&&this.e2>=0&&(A.add(this.e1,this.e2,this.e3),w.elementLength++),this.e1=this.e2,this.e2=this.e3,C=B.mult(-I),z&&C._sub(B.perp()._mult(z)),this.e3=G.add(E,C,F,1,v)-D,this.e1>=0&&this.e2>=0&&(A.add(this.e1,this.e2,this.e3),w.elementLength++),this.e1=this.e2,this.e2=this.e3,w.vertexLength+=2},o.prototype.addPieSliceVertex=function(B,F,v,z,G){var w=this.buffers.lineVertex,E=this.buffers.lineElement,A=this.elementGroups.current,C=this.elementGroups.current.vertexStartIndex,D=G;z=z.mult(F*(G?-1:1)),this.e3=w.add(B,z,0,D,v)-C,A.vertexLength+=1,this.e1>=0&&this.e2>=0&&(E.add(this.e1,this.e2,this.e3),A.elementLength++),G?this.e2=this.e3:this.e1=this.e3}},{"./element_groups":14}],18:[function(A,q,K){function E(Q,O,R,N,P){this.buffers=Q,this.layoutProperties=O,this.overscaling=R,this.zoom=N,this.collisionDebug=P;var S=512*R,M=4096;this.tilePixelRatio=M/S,this.compareText={},this.symbolInstances=[]}function o(S,W,N,Q,X,O,U,P,M,T,R,V){this.x=S.x,this.y=S.y,this.hasText=!!N,this.hasIcon=!!Q,this.hasText&&(this.glyphQuads=O?B(S,N,U,W,X,M):[],this.textCollisionFeature=new H(W,S,N,U,P,M)),this.hasIcon&&(this.iconQuads=O?s(S,Q,T,W,X,V):[],this.iconCollisionFeature=new H(W,S,Q,T,R,V))}var t=A("./element_groups"),G=A("../symbol/anchor"),v=A("../symbol/get_anchors"),I=A("../util/token"),F=A("../symbol/quads"),u=A("../symbol/shaping"),p=A("../symbol/resolve_text"),w=A("../symbol/resolve_icons"),C=A("../symbol/mergelines"),z=u.shapeText,D=u.shapeIcon,B=F.getGlyphQuads,s=F.getIconQuads,r=A("../symbol/clip_line"),J=A("point-geometry"),H=A("../symbol/collision_feature");q.exports=E,E.prototype.needsPlacement=!0,E.prototype.addFeatures=function(ac){var Q=this.layoutProperties,U=this.features,Y=this.textFeatures,R=0.5,V=0.5;switch(Q["text-anchor"]){case"right":case"top-right":case"bottom-right":R=1;break;case"left":case"top-left":case"bottom-left":R=0}switch(Q["text-anchor"]){case"bottom":case"bottom-right":case"bottom-left":V=1;break;case"top":case"top-right":case"top-left":V=0}for(var ag="right"===Q["text-justify"]?1:"left"===Q["text-justify"]?0:0.5,X=24,S=Q["text-line-height"]*X,ae="line"!==Q["symbol-placement"]?Q["text-max-width"]*X:0,Z=Q["text-letter-spacing"]*X,P=[Q["text-offset"][0]*X,Q["text-offset"][1]*X],W=Q["text-font"].join(","),T=[],N=0;N<U.length;N++){T.push(U[N].loadGeometry())}if("line"===Q["symbol-placement"]){var M=C(U,Y,T);T=M.geometries,U=M.features,Y=M.textFeatures}for(var ad,aa,ab=0;ab<U.length;ab++){if(T[ab]){if(ad=Y[ab]?z(Y[ab],this.stacks[W],ae,S,R,V,ag,Z,P):null,Q["icon-image"]){var af=I(U[ab].properties,Q["icon-image"]),O=this.icons[af];aa=D(O,Q),O&&(void 0===this.sdfIcons?this.sdfIcons=O.sdf:this.sdfIcons!==O.sdf&&console.warn("Style sheet warning: Cannot mix SDF and non-SDF icons in one bucket"))}else{aa=null}(ad||aa)&&this.addFeature(T[ab],ad,aa)}}this.placeFeatures(ac,this.buffers,this.collisionDebug)},E.prototype.addFeature=function(al,Y,ac){var ah=this.layoutProperties,Z=24,ad=ah["text-size"]/Z,ap=this.tilePixelRatio*ad,af=this.tilePixelRatio*ah["text-max-size"]/Z,aa=this.tilePixelRatio*ah["icon-size"],an=this.tilePixelRatio*ah["symbol-spacing"],ai=ah["symbol-avoid-edges"],X=ah["text-padding"]*this.tilePixelRatio,ae=ah["icon-padding"]*this.tilePixelRatio,ab=ah["text-max-angle"]/180*Math.PI,U="map"===ah["text-rotation-alignment"]&&"line"===ah["symbol-placement"],R="map"===ah["icon-rotation-alignment"]&&"line"===ah["symbol-placement"],am=ah["text-allow-overlap"]||ah["icon-allow-overlap"]||ah["text-ignore-placement"]||ah["icon-ignore-placement"],aj="line"===ah["symbol-placement"],ak=an/2;aj&&(al=r(al,0,0,4096,4096));for(var ao=0;ao<al.length;ao++){for(var V=al[ao],T=aj?v(V,an,ab,Y,ac,Z,af,this.overscaling):[new G(V[0].x,V[0].y,0)],N=0,W=T.length;W>N;N++){var O=T[N];if(!(Y&&aj&&this.anchorIsTooClose(Y.text,ak,O))){var Q=!(O.x<0||O.x>4096||O.y<0||O.y>4096);if(!ai||Q){var ag=Q||am;this.symbolInstances.push(new o(O,V,Y,ac,ah,ag,ap,X,U,aa,ae,R))}}}}},E.prototype.anchorIsTooClose=function(P,N,Q){var M=this.compareText;if(P in M){for(var O=M[P],R=O.length-1;R>=0;R--){if(Q.dist(O[R])<N){return !0}}}else{M[P]=[]}return M[P].push(Q),!1},E.prototype.placeFeatures=function(ab,P,T){this.buffers=P;var X=this.elementGroups={text:new t(P.glyphVertex,P.glyphElement),icon:new t(P.iconVertex,P.iconElement),sdfIcons:this.sdfIcons},Q=this.layoutProperties,U=ab.maxScale;X.text["text-size"]=Q["text-size"],X.icon["icon-size"]=Q["icon-size"];var af="map"===Q["text-rotation-alignment"]&&"line"===Q["symbol-placement"],W="map"===Q["icon-rotation-alignment"]&&"line"===Q["symbol-placement"],R=Q["text-allow-overlap"]||Q["icon-allow-overlap"]||Q["text-ignore-placement"]||Q["icon-ignore-placement"];if(R){var ad=ab.angle,Y=Math.sin(ad),O=Math.cos(ad);this.symbolInstances.sort(function(ai,ah){var aj=Y*ai.x+O*ai.y,ag=Y*ah.x+O*ah.y;return ag-aj})}for(var V=0;V<this.symbolInstances.length;V++){var S=this.symbolInstances[V],N=S.hasText,M=S.hasIcon,ac=Q["text-optional"]||!N,Z=Q["icon-optional"]||!M,aa=N&&!Q["text-allow-overlap"]?ab.placeCollisionFeature(S.textCollisionFeature):ab.minScale,ae=M&&!Q["icon-allow-overlap"]?ab.placeCollisionFeature(S.iconCollisionFeature):ab.minScale;ac||Z?!Z&&aa?aa=Math.max(ae,aa):!ac&&ae&&(ae=Math.max(ae,aa)):ae=aa=Math.max(ae,aa),N&&(Q["text-ignore-placement"]||ab.insertCollisionFeature(S.textCollisionFeature,aa),U>=aa&&this.addSymbols(P.glyphVertex,P.glyphElement,X.text,S.glyphQuads,aa,Q["text-keep-upright"],af,ab.angle)),M&&(Q["icon-ignore-placement"]||ab.insertCollisionFeature(S.iconCollisionFeature,ae),U>=ae&&this.addSymbols(P.iconVertex,P.iconElement,X.icon,S.iconQuads,ae,Q["icon-keep-upright"],W,ab.angle))}T&&this.addToDebugBuffers(ab)},E.prototype.addSymbols=function(ag,U,Y,ac,V,Z,ak,ab){Y.makeRoomFor(4*ac.length);for(var W=Y.current,ai=this.zoom,ad=Math.max(Math.log(V)/Math.LN2+ai,0),T=0;T<ac.length;T++){var aa=ac[T],X=aa.angle,P=(X+ab+Math.PI)%(2*Math.PI);if(!(Z&&ak&&(P<=Math.PI/2||P>3*Math.PI/2))){var N=aa.tl,ah=aa.tr,ae=aa.bl,af=aa.br,aj=aa.tex,Q=aa.anchorPoint,O=Math.max(ai+Math.log(aa.minScale)/Math.LN2,ad),M=Math.min(ai+Math.log(aa.maxScale)/Math.LN2,25);if(!(O>=M)){O===ad&&(O=0);var R=ag.index-W.vertexStartIndex;ag.add(Q.x,Q.y,N.x,N.y,aj.x,aj.y,O,M,ad),ag.add(Q.x,Q.y,ah.x,ah.y,aj.x+aj.w,aj.y,O,M,ad),ag.add(Q.x,Q.y,ae.x,ae.y,aj.x,aj.y+aj.h,O,M,ad),ag.add(Q.x,Q.y,af.x,af.y,aj.x+aj.w,aj.y+aj.h,O,M,ad),W.vertexLength+=4,U.add(R,R+1,R+2),U.add(R+1,R+2,R+3),W.elementLength+=2}}}},E.prototype.getDependencies=function(P,N,Q){function M(R){return R||O?Q(R):void (O=!0)}var O=!1;this.getTextDependencies(P,N,M),this.getIconDependencies(P,N,M)},E.prototype.getIconDependencies=function(P,N,Q){function M(T,S){return T?Q(T):(this.icons=S,void Q())}if(this.layoutProperties["icon-image"]){var O=this.features,R=w(O,this.layoutProperties);R.length?N.send("get icons",{icons:R},M.bind(this)):Q()}else{Q()}},E.prototype.getTextDependencies=function(R,P,S){var O=this.features,Q=this.layoutProperties["text-font"],T=this.stacks=R.stacks;void 0===T[Q]&&(T[Q]={});var N=T[Q],M=p(O,this.layoutProperties,N);this.textFeatures=M.textFeatures,P.send("get glyphs",{uid:R.uid,fontstack:Q,codepoints:M.codepoints},function(W,V){if(W){return S(W)}for(var U in V){N[U]=V[U]}S()})},E.prototype.addToDebugBuffers=function(U){this.elementGroups.collisionBox=new t(this.buffers.collisionBoxVertex),this.elementGroups.collisionBox.makeRoomFor(0);for(var ab=this.buffers.collisionBoxVertex,O=-U.angle,S=U.yStretch,ac=0;ac<this.symbolInstances.length;ac++){for(var P=0;2>P;P++){var Z=this.symbolInstances[ac][0===P?"textCollisionFeature":"iconCollisionFeature"];if(Z){for(var R=Z.boxes,M=0;M<R.length;M++){var W=R[M],T=W.anchorPoint,aa=new J(W.x1,W.y1*S)._rotate(O),Q=new J(W.x2,W.y1*S)._rotate(O),N=new J(W.x1,W.y2*S)._rotate(O),Y=new J(W.x2,W.y2*S)._rotate(O),X=Math.max(0,Math.min(25,this.zoom+Math.log(W.maxScale)/Math.LN2)),V=Math.max(0,Math.min(25,this.zoom+Math.log(W.placementScale)/Math.LN2));ab.add(T,aa,X,V),ab.add(T,Q,X,V),ab.add(T,Q,X,V),ab.add(T,Y,X,V),ab.add(T,Y,X,V),ab.add(T,N,X,V),ab.add(T,N,X,V),ab.add(T,aa,X,V),this.elementGroups.collisionBox.current.vertexLength+=8}}}}}},{"../symbol/anchor":62,"../symbol/clip_line":65,"../symbol/collision_feature":67,"../symbol/get_anchors":69,"../symbol/mergelines":72,"../symbol/quads":73,"../symbol/resolve_icons":74,"../symbol/resolve_text":75,"../symbol/shaping":76,"../util/token":105,"./element_groups":14,"point-geometry":137}],19:[function(p,q,o){function r(u,s,v){this.column=u,this.row=s,this.zoom=v}q.exports=r,r.prototype={clone:function(){return new r(this.column,this.row,this.zoom)},zoomTo:function(s){return this.clone()._zoomTo(s)},sub:function(s){return this.clone()._sub(s)},_zoomTo:function(u){var s=Math.pow(2,u-this.zoom);return this.column*=s,this.row*=s,this.zoom=u,this},_sub:function(s){return s=s.zoomTo(this.zoom),this.column-=s.column,this.row-=s.row,this}}},{}],20:[function(p,q,o){function s(u,v){if(isNaN(u)||isNaN(v)){throw new Error("Invalid LngLat object: ("+u+", "+v+")")}if(this.lng=+u,this.lat=+v,this.lat>90||this.lat<-90){throw new Error("Invalid LngLat latitude value: must be between -90 and 90")}}q.exports=s;var r=p("../util/util").wrap;s.prototype.wrap=function(){return new s(r(this.lng,-180,180),this.lat)},s.convert=function(u){return u instanceof s?u:Array.isArray(u)?new s(u[0],u[1]):u}},{"../util/util":106}],21:[function(p,q,o){function r(v,A){if(v){for(var z=A?[v,A]:v,w=0,u=z.length;u>w;w++){this.extend(z[w])}}}q.exports=r;var s=p("./lng_lat");r.prototype={extend:function(v){var A,z,w=this._sw,u=this._ne;if(v instanceof s){A=v,z=v}else{if(!(v instanceof r)){return v?this.extend(s.convert(v)||r.convert(v)):this}if(A=v._sw,z=v._ne,!A||!z){return this}}return w||u?(w.lng=Math.min(A.lng,w.lng),w.lat=Math.min(A.lat,w.lat),u.lng=Math.max(z.lng,u.lng),u.lat=Math.max(z.lat,u.lat)):(this._sw=new s(A.lng,A.lat),this._ne=new s(z.lng,z.lat)),this},getCenter:function(){return new s((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)},getSouthWest:function(){return this._sw},getNorthEast:function(){return this._ne},getNorthWest:function(){return new s(this.getWest(),this.getNorth())},getSouthEast:function(){return new s(this.getEast(),this.getSouth())},getWest:function(){return this._sw.lng},getSouth:function(){return this._sw.lat},getEast:function(){return this._ne.lng},getNorth:function(){return this._ne.lat}},r.convert=function(u){return !u||u instanceof r?u:new r(u)}},{"./lng_lat":20}],22:[function(r,q,t){function s(C,B){this.tileSize=512,this._minZoom=C||0,this._maxZoom=B||22,this.latRange=[-85.05113,85.05113],this.width=0,this.height=0,this.zoom=0,this.center=new w(0,0),this.angle=0,this._altitude=1.5,this._pitch=0}var w=r("./lng_lat"),v=r("point-geometry"),z=r("./coordinate"),p=r("../util/util").wrap,A=r("../util/interpolate"),u=r("gl-matrix").vec4,o=r("gl-matrix").mat4;q.exports=s,s.prototype={get minZoomfunction(){return this._minZoom},set minZoomfunction(B){this._minZoom=B,this.zoom=Math.max(this.zoom,B)},get maxZoomfunction(){return this._maxZoom},set maxZoomfunction(B){this._maxZoom=B,this.zoom=Math.min(this.zoom,B)},get worldSizefunction(){return this.tileSize*this.scale},get centerPointfunction(){return this.size._div(2)},get sizefunction(){return new v(this.width,this.height)},get bearingfunction(){return -this.angle/Math.PI*180},set bearingfunction(B){this.angle=-p(B,-180,180)*Math.PI/180},get pitchfunction(){return this._pitch/Math.PI*180},set pitchfunction(B){this._pitch=Math.min(60,B)/180*Math.PI},get altitudefunction(){return this._altitude},set altitudefunction(B){this._altitude=Math.max(0.75,B)},get zoomfunction(){return this._zoom},set zoomfunction(B){B=Math.min(Math.max(B,this.minZoom),this.maxZoom),this._zoom=B,this.scale=this.zoomScale(B),this.tileZoom=Math.floor(B),this.zoomFraction=B-this.tileZoom,this._constrain()},get centerfunction(){return this._center},set centerfunction(B){this._center=B,this._constrain()},zoomScale:function(B){return Math.pow(2,B)},scaleZoom:function(B){return Math.log(B)/Math.LN2},project:function(C,B){return new v(this.lngX(C.lng,B),this.latY(C.lat,B))},unproject:function(C,B){return new w(this.xLng(C.x,B),this.yLat(C.y,B))},get xfunction(){return this.lngX(this.center.lng)},get yfunction(){return this.latY(this.center.lat)},get pointfunction(){return new v(this.x,this.y)},lngX:function(C,B){return(180+C)*(B||this.worldSize)/360},latY:function(C,B){var D=180/Math.PI*Math.log(Math.tan(Math.PI/4+C*Math.PI/360));return(180-D)*(B||this.worldSize)/360},xLng:function(C,B){return 360*C/(B||this.worldSize)-180},yLat:function(C,B){var D=180-360*C/(B||this.worldSize);return 360/Math.PI*Math.atan(Math.exp(D*Math.PI/180))-90},panBy:function(C){var B=this.centerPoint._add(C);this.center=this.pointLocation(B)},setLocationAtPoint:function(D,C){var G=this.locationCoordinate(D),F=this.pointCoordinate(C),E=this.pointCoordinate(this.centerPoint),B=F._sub(G);this.center=this.coordinateLocation(E._sub(B))},setZoomAround:function(C,B){var D;B&&(D=this.locationPoint(B)),this.zoom=C,B&&this.setLocationAtPoint(B,D)},setBearingAround:function(C,B){var D;B&&(D=this.locationPoint(B)),this.bearing=C,B&&this.setLocationAtPoint(B,D)},locationPoint:function(B){return this.coordinatePoint(this.locationCoordinate(B))},pointLocation:function(B){return this.coordinateLocation(this.pointCoordinate(B))},locationCoordinate:function(C){var B=this.zoomScale(this.tileZoom)/this.worldSize,D=w.convert(C);return new z(this.lngX(D.lng)*B,this.latY(D.lat)*B,this.tileZoom)},coordinateLocation:function(C){var B=this.zoomScale(C.zoom);return new w(this.xLng(C.column,B),this.yLat(C.row,B))},pointCoordinate:function(P,G){void 0===G&&(G=0);var D=this.coordinatePointMatrix(this.tileZoom),C=o.invert(new Float64Array(16),D);if(!C){throw new Error("failed to invert matrix")}var K=u.transformMat4([],[P.x,P.y,0,1],C),N=u.transformMat4([],[P.x,P.y,1,1],C),B=K[3],H=N[3],Q=K[0]/B,M=N[0]/H,O=K[1]/B,F=N[1]/H,E=K[2]/B,I=N[2]/H,J=E===I?0:(G-E)/(I-E);return new z(A(Q,M,J),A(O,F,J),this.tileZoom)},coordinatePoint:function(C){var B=this.coordinatePointMatrix(C.zoom),D=u.transformMat4([],[C.column,C.row,0,1],B);return new v(D[0]/D[3],D[1]/D[3])},coordinatePointMatrix:function(C){var B=this.getProjMatrix(),D=this.worldSize/this.zoomScale(C);return o.scale(B,B,[D,D,1]),o.multiply(B,this.getPixelMatrix(),B),B},getPixelMatrix:function(){var B=o.create();return o.scale(B,B,[this.width/2,-this.height/2,1]),o.translate(B,B,[1,-1,0]),B},_constrain:function(){if(this.center&&this.width&&this.height&&!this._constraining){this._constraining=!0;var O,G,D,C,J,M,B,H,P=this.size;this.latRange&&(O=this.latY(this.latRange[1]),G=this.latY(this.latRange[0]),J=G-O<P.y?P.y/(G-O):0),this.lngRange&&(D=this.lngX(this.lngRange[0]),C=this.lngX(this.lngRange[1]),M=C-D<P.x?P.x/(C-D):0);var K=Math.max(M||0,J||0);if(K){return this.center=this.unproject(new v(M?(C+D)/2:this.x,J?(G+O)/2:this.y)),this.zoom+=this.scaleZoom(K),void (this._constraining=!1)}if(this.latRange){var N=this.y,F=P.y/2;O>N-F&&(H=O+F),N+F>G&&(H=G-F)}if(this.lngRange){var E=this.x,I=P.x/2;D>E-I&&(B=D+I),E+I>C&&(B=C-I)}(void 0!==B||void 0!==H)&&(this.center=this.unproject(new v(void 0!==B?B:this.x,void 0!==H?H:this.y))),this._constraining=!1}},getProjMatrix:function(){var C=new Float64Array(16),B=Math.atan(0.5/this.altitude),E=Math.sin(B)*this.altitude/Math.sin(Math.PI/2-this._pitch-B),D=Math.cos(Math.PI/2-this._pitch)*E+this.altitude;return o.perspective(C,2*Math.atan(this.height/2/this.altitude),this.width/this.height,0.1,D),o.translate(C,C,[0,0,-this.altitude]),o.scale(C,C,[1,-1,1/this.height]),o.rotateX(C,C,this._pitch),o.rotateZ(C,C,this.angle),o.translate(C,C,[-this.x,-this.y,0]),C}}},{"../util/interpolate":102,"../util/util":106,"./coordinate":19,"./lng_lat":20,"gl-matrix":116,"point-geometry":137}],23:[function(q,r,p){var o={" ":[16,[]],"!":[10,[5,21,5,7,-1,-1,5,2,4,1,5,0,6,1,5,2]],'"':[16,[4,21,4,14,-1,-1,12,21,12,14]],"#":[21,[11,25,4,-7,-1,-1,17,25,10,-7,-1,-1,4,12,18,12,-1,-1,3,6,17,6]],$:[20,[8,25,8,-4,-1,-1,12,25,12,-4,-1,-1,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],"%":[24,[21,21,3,0,-1,-1,8,21,10,19,10,17,9,15,7,14,5,14,3,16,3,18,4,20,6,21,8,21,10,20,13,19,16,19,19,20,21,21,-1,-1,17,7,15,6,14,4,14,2,16,0,18,0,20,1,21,3,21,5,19,7,17,7]],"&":[26,[23,12,23,13,22,14,21,14,20,13,19,11,17,6,15,3,13,1,11,0,7,0,5,1,4,2,3,4,3,6,4,8,5,9,12,13,13,14,14,16,14,18,13,20,11,21,9,20,8,18,8,16,9,13,11,10,16,3,18,1,20,0,22,0,23,1,23,2]],"'":[10,[5,19,4,20,5,21,6,20,6,18,5,16,4,15]],"(":[14,[11,25,9,23,7,20,5,16,4,11,4,7,5,2,7,-2,9,-5,11,-7]],")":[14,[3,25,5,23,7,20,9,16,10,11,10,7,9,2,7,-2,5,-5,3,-7]],"*":[16,[8,21,8,9,-1,-1,3,18,13,12,-1,-1,13,18,3,12]],"+":[26,[13,18,13,0,-1,-1,4,9,22,9]],",":[10,[6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"-":[26,[4,9,22,9]],".":[10,[5,2,4,1,5,0,6,1,5,2]],"/":[22,[20,25,2,-7]],0:[20,[9,21,6,20,4,17,3,12,3,9,4,4,6,1,9,0,11,0,14,1,16,4,17,9,17,12,16,17,14,20,11,21,9,21]],1:[20,[6,17,8,18,11,21,11,0]],2:[20,[4,16,4,17,5,19,6,20,8,21,12,21,14,20,15,19,16,17,16,15,15,13,13,10,3,0,17,0]],3:[20,[5,21,16,21,10,13,13,13,15,12,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],4:[20,[13,21,3,7,18,7,-1,-1,13,21,13,0]],5:[20,[15,21,5,21,4,12,5,13,8,14,11,14,14,13,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],6:[20,[16,18,15,20,12,21,10,21,7,20,5,17,4,12,4,7,5,3,7,1,10,0,11,0,14,1,16,3,17,6,17,7,16,10,14,12,11,13,10,13,7,12,5,10,4,7]],7:[20,[17,21,7,0,-1,-1,3,21,17,21]],8:[20,[8,21,5,20,4,18,4,16,5,14,7,13,11,12,14,11,16,9,17,7,17,4,16,2,15,1,12,0,8,0,5,1,4,2,3,4,3,7,4,9,6,11,9,12,13,13,15,14,16,16,16,18,15,20,12,21,8,21]],9:[20,[16,14,15,11,13,9,10,8,9,8,6,9,4,11,3,14,3,15,4,18,6,20,9,21,10,21,13,20,15,18,16,14,16,9,15,4,13,1,10,0,8,0,5,1,4,3]],":":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,5,2,4,1,5,0,6,1,5,2]],";":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"<":[24,[20,18,4,9,20,0]],"=":[26,[4,12,22,12,-1,-1,4,6,22,6]],">":[24,[4,18,20,9,4,0]],"?":[18,[3,16,3,17,4,19,5,20,7,21,11,21,13,20,14,19,15,17,15,15,14,13,13,12,9,10,9,7,-1,-1,9,2,8,1,9,0,10,1,9,2]],"@":[27,[18,13,17,15,15,16,12,16,10,15,9,14,8,11,8,8,9,6,11,5,14,5,16,6,17,8,-1,-1,12,16,10,14,9,11,9,8,10,6,11,5,-1,-1,18,16,17,8,17,6,19,5,21,5,23,7,24,10,24,12,23,15,22,17,20,19,18,20,15,21,12,21,9,20,7,19,5,17,4,15,3,12,3,9,4,6,5,4,7,2,9,1,12,0,15,0,18,1,20,2,21,3,-1,-1,19,16,18,8,18,6,19,5]],A:[18,[9,21,1,0,-1,-1,9,21,17,0,-1,-1,4,7,14,7]],B:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,-1,-1,4,11,13,11,16,10,17,9,18,7,18,4,17,2,16,1,13,0,4,0]],C:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5]],D:[21,[4,21,4,0,-1,-1,4,21,11,21,14,20,16,18,17,16,18,13,18,8,17,5,16,3,14,1,11,0,4,0]],E:[19,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11,-1,-1,4,0,17,0]],F:[18,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11]],G:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,18,8,-1,-1,13,8,18,8]],H:[22,[4,21,4,0,-1,-1,18,21,18,0,-1,-1,4,11,18,11]],I:[8,[4,21,4,0]],J:[16,[12,21,12,5,11,2,10,1,8,0,6,0,4,1,3,2,2,5,2,7]],K:[21,[4,21,4,0,-1,-1,18,21,4,7,-1,-1,9,12,18,0]],L:[17,[4,21,4,0,-1,-1,4,0,16,0]],M:[24,[4,21,4,0,-1,-1,4,21,12,0,-1,-1,20,21,12,0,-1,-1,20,21,20,0]],N:[22,[4,21,4,0,-1,-1,4,21,18,0,-1,-1,18,21,18,0]],O:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21]],P:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,14,17,12,16,11,13,10,4,10]],Q:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21,-1,-1,12,4,18,-2]],R:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,4,11,-1,-1,11,11,18,0]],S:[20,[17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],T:[16,[8,21,8,0,-1,-1,1,21,15,21]],U:[22,[4,21,4,6,5,3,7,1,10,0,12,0,15,1,17,3,18,6,18,21]],V:[18,[1,21,9,0,-1,-1,17,21,9,0]],W:[24,[2,21,7,0,-1,-1,12,21,7,0,-1,-1,12,21,17,0,-1,-1,22,21,17,0]],X:[20,[3,21,17,0,-1,-1,17,21,3,0]],Y:[18,[1,21,9,11,9,0,-1,-1,17,21,9,11]],Z:[20,[17,21,3,0,-1,-1,3,21,17,21,-1,-1,3,0,17,0]],"[":[14,[4,25,4,-7,-1,-1,5,25,5,-7,-1,-1,4,25,11,25,-1,-1,4,-7,11,-7]],"\\":[14,[0,21,14,-3]],"]":[14,[9,25,9,-7,-1,-1,10,25,10,-7,-1,-1,3,25,10,25,-1,-1,3,-7,10,-7]],"^":[16,[6,15,8,18,10,15,-1,-1,3,12,8,17,13,12,-1,-1,8,17,8,0]],_:[16,[0,-2,16,-2]],"`":[10,[6,21,5,20,4,18,4,16,5,15,6,16,5,17]],a:[19,[15,14,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],b:[19,[4,21,4,0,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],c:[18,[15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],d:[19,[15,21,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],e:[18,[3,8,15,8,15,10,14,12,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],f:[12,[10,21,8,21,6,20,5,17,5,0,-1,-1,2,14,9,14]],g:[19,[15,14,15,-2,14,-5,13,-6,11,-7,8,-7,6,-6,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],h:[19,[4,21,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],i:[8,[3,21,4,20,5,21,4,22,3,21,-1,-1,4,14,4,0]],j:[10,[5,21,6,20,7,21,6,22,5,21,-1,-1,6,14,6,-3,5,-6,3,-7,1,-7]],k:[17,[4,21,4,0,-1,-1,14,14,4,4,-1,-1,8,8,15,0]],l:[8,[4,21,4,0]],m:[30,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0,-1,-1,15,10,18,13,20,14,23,14,25,13,26,10,26,0]],n:[19,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],o:[19,[8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3,16,6,16,8,15,11,13,13,11,14,8,14]],p:[19,[4,14,4,-7,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],q:[19,[15,14,15,-7,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],r:[13,[4,14,4,0,-1,-1,4,8,5,11,7,13,9,14,12,14]],s:[17,[14,11,13,13,10,14,7,14,4,13,3,11,4,9,6,8,11,7,13,6,14,4,14,3,13,1,10,0,7,0,4,1,3,3]],t:[12,[5,21,5,4,6,1,8,0,10,0,-1,-1,2,14,9,14]],u:[19,[4,14,4,4,5,1,7,0,10,0,12,1,15,4,-1,-1,15,14,15,0]],v:[16,[2,14,8,0,-1,-1,14,14,8,0]],w:[22,[3,14,7,0,-1,-1,11,14,7,0,-1,-1,11,14,15,0,-1,-1,19,14,15,0]],x:[17,[3,14,14,0,-1,-1,14,14,3,0]],y:[16,[2,14,8,0,-1,-1,14,14,8,0,6,-4,4,-6,2,-7,1,-7]],z:[17,[14,14,3,0,-1,-1,3,14,14,14,-1,-1,3,0,14,0]],"{":[14,[9,25,7,24,6,23,5,21,5,19,6,17,7,16,8,14,8,12,6,10,-1,-1,7,24,6,22,6,20,7,18,8,17,9,15,9,13,8,11,4,9,8,7,9,5,9,3,8,1,7,0,6,-2,6,-4,7,-6,-1,-1,6,8,8,6,8,4,7,2,6,1,5,-1,5,-3,6,-5,7,-6,9,-7]],"|":[8,[4,25,4,-7]],"}":[14,[5,25,7,24,8,23,9,21,9,19,8,17,7,16,6,14,6,12,8,10,-1,-1,7,24,8,22,8,20,7,18,6,17,5,15,5,13,6,11,10,9,6,7,5,5,5,3,6,1,7,0,8,-2,8,-4,7,-6,-1,-1,8,8,6,6,6,4,7,2,8,1,9,-1,9,-3,8,-5,7,-6,5,-7]],"~":[24,[3,6,3,8,4,11,6,12,8,12,10,11,14,8,16,7,18,7,20,8,21,10,-1,-1,3,8,4,10,6,11,8,11,10,10,14,7,16,6,18,6,20,7,21,10,21,12]]};r.exports=function(B,A,I,F){F=F||1;var v,z,H,J,C,G,E,w,D=[];for(v=0,z=B.length;z>v;v++){if(C=o[B[v]]){for(w=null,H=0,J=C[1].length;J>H;H+=2){-1===C[1][H]&&-1===C[1][H+1]?w=null:(G=A+C[1][H]*F,E=I-C[1][H+1]*F,w&&D.push(w.x,w.y,G,E),w={x:G,y:E})}A+=C[0]*F}}return D}},{}],24:[function(q,r,o){var t=r.exports={};t.Map=q("./ui/map"),t.Control=q("./ui/control/control"),t.Navigation=q("./ui/control/navigation"),t.Attribution=q("./ui/control/attribution"),t.Popup=q("./ui/popup"),t.GeoJSONSource=q("./source/geojson_source"),t.VideoSource=q("./source/video_source"),t.ImageSource=q("./source/image_source"),t.Style=q("./style/style"),t.LngLat=q("./geo/lng_lat"),t.LngLatBounds=q("./geo/lng_lat_bounds"),t.Point=q("point-geometry"),t.Evented=q("./util/evented"),t.util=q("./util/util"),t.supported=q("./util/browser").supported;var s=q("./util/ajax");t.util.getJSON=s.getJSON,t.util.getArrayBuffer=s.getArrayBuffer;var p=q("./util/config");t.config=p,Object.defineProperty(t,"accessToken",{get:function(){return p.ACCESS_TOKEN},set:function(u){p.ACCESS_TOKEN=u}})},{"./geo/lng_lat":20,"./geo/lng_lat_bounds":21,"./source/geojson_source":39,"./source/image_source":41,"./source/video_source":48,"./style/style":56,"./ui/control/attribution":79,"./ui/control/control":80,"./ui/control/navigation":81,"./ui/map":91,"./ui/popup":92,"./util/ajax":94,"./util/browser":95,"./util/config":99,"./util/evented":100,"./util/util":106,"point-geometry":137}],25:[function(p,r,o){function s(N,J,v){var G,E=N.gl,z=J.paint["background-color"],A=J.paint["background-pattern"],C=J.paint["background-opacity"],M=A?N.spriteAtlas.getPosition(A.from,!0):null,B=A?N.spriteAtlas.getPosition(A.to,!0):null;if(M&&B){G=N.patternShader,E.switchShader(G,v),E.uniform1i(G.u_image,0),E.uniform2fv(G.u_pattern_tl_a,M.tl),E.uniform2fv(G.u_pattern_br_a,M.br),E.uniform2fv(G.u_pattern_tl_b,B.tl),E.uniform2fv(G.u_pattern_br_b,B.br),E.uniform1f(G.u_opacity,C);var I=N.transform,F=M.size,O=B.size,K=I.locationCoordinate(I.center),D=1/Math.pow(2,I.zoomFraction);E.uniform1f(G.u_mix,A.t);var H=q.create();q.scale(H,H,[1/(F[0]*A.fromScale),1/(F[1]*A.fromScale)]),q.translate(H,H,[K.column*I.tileSize%(F[0]*A.fromScale),K.row*I.tileSize%(F[1]*A.fromScale)]),q.rotate(H,H,-I.angle),q.scale(H,H,[D*I.width/2,-D*I.height/2]);var w=q.create();q.scale(w,w,[1/(O[0]*A.toScale),1/(O[1]*A.toScale)]),q.translate(w,w,[K.column*I.tileSize%(O[0]*A.toScale),K.row*I.tileSize%(O[1]*A.toScale)]),q.rotate(w,w,-I.angle),q.scale(w,w,[D*I.width/2,-D*I.height/2]),E.uniformMatrix3fv(G.u_patternmatrix_a,!1,H),E.uniformMatrix3fv(G.u_patternmatrix_b,!1,w),N.spriteAtlas.bind(E,!0)}else{G=N.fillShader,E.switchShader(G,v),E.uniform4fv(G.u_color,z)}E.disable(E.STENCIL_TEST),E.bindBuffer(E.ARRAY_BUFFER,N.backgroundBuffer),E.vertexAttribPointer(G.a_pos,N.backgroundBuffer.itemSize,E.SHORT,!1,0,0),E.drawArrays(E.TRIANGLE_STRIP,0,N.backgroundBuffer.itemCount),E.enable(E.STENCIL_TEST),E.stencilMask(0),E.stencilFunc(E.EQUAL,128,128)}var q=p("gl-matrix").mat3;r.exports=s},{"gl-matrix":116}],26:[function(r,s,p){function o(E,v,C,I){if(I.buffers){C=E.translateMatrix(C,I,v.paint["circle-translate"],v.paint["circle-translate-anchor"]);var K=I.elementGroups[v.ref||v.id];if(K){var A=E.gl;A.disable(A.STENCIL_TEST),A.switchShader(E.circleShader,C,I.exMatrix);var G=I.buffers.circleVertex,z=E.circleShader,M=I.buffers.circleElement,J=1/q.devicePixelRatio/v.paint["circle-radius"];A.uniform4fv(z.u_color,v.paint["circle-color"]),A.uniform1f(z.u_blur,Math.max(v.paint["circle-blur"],J)),A.uniform1f(z.u_size,v.paint["circle-radius"]);for(var w=0;w<K.groups.length;w++){var D=K.groups[w],F=D.vertexStartIndex*G.itemSize;G.bind(A,z,F),M.bind(A,z,F);var B=3*D.elementLength,H=D.elementStartIndex*M.itemSize;A.drawElements(A.TRIANGLES,B,A.UNSIGNED_SHORT,H)}A.enable(A.STENCIL_TEST)}}}var q=r("../util/browser.js");s.exports=o},{"../util/browser.js":95}],27:[function(p,q,o){function r(v,C,w,G){var E=G.elementGroups[C.ref||C.id].collisionBox;if(E){var B=v.gl,z=G.buffers.collisionBoxVertex,H=v.collisionBoxShader;B.enable(B.STENCIL_TEST),B.switchShader(H,w),z.bind(B,H),B.lineWidth(1);var F=12;B.vertexAttribPointer(H.a_pos,2,B.SHORT,!1,F,0),B.vertexAttribPointer(H.a_extrude,2,B.SHORT,!1,F,4),B.vertexAttribPointer(H.a_data,2,B.UNSIGNED_BYTE,!1,F,8),B.uniform1f(H.u_scale,Math.pow(2,v.transform.zoom-G.coord.z)),B.uniform1f(H.u_zoom,10*v.transform.zoom),B.uniform1f(H.u_maxzoom,10*(G.coord.z+1));var D=E.groups[0].vertexStartIndex,A=E.groups[0].vertexLength;B.drawArrays(B.LINES,D,A),B.disable(B.STENCIL_TEST)}}q.exports=r},{}],28:[function(r,s,p){function o(z,w){var v=z.gl;v.blendFunc(v.ONE,v.ONE_MINUS_SRC_ALPHA),v.switchShader(z.debugShader,w.posMatrix),v.bindBuffer(v.ARRAY_BUFFER,z.debugBuffer),v.vertexAttribPointer(z.debugShader.a_pos,z.debugBuffer.itemSize,v.SHORT,!1,0,0),v.uniform4f(z.debugShader.u_color,1,0,0,1),v.lineWidth(4),v.drawArrays(v.LINE_STRIP,0,z.debugBuffer.itemCount);var u=t(w.coord.toString(),50,200,5);v.bindBuffer(v.ARRAY_BUFFER,z.debugTextBuffer),v.bufferData(v.ARRAY_BUFFER,new Int16Array(u),v.STREAM_DRAW),v.vertexAttribPointer(z.debugShader.a_pos,z.debugTextBuffer.itemSize,v.SHORT,!1,0,0),v.lineWidth(8*q.devicePixelRatio),v.uniform4f(z.debugShader.u_color,1,1,1,1),v.drawArrays(v.LINES,0,u.length/z.debugTextBuffer.itemSize),v.lineWidth(2*q.devicePixelRatio),v.uniform4f(z.debugShader.u_color,0,0,0,1),v.drawArrays(v.LINES,0,u.length/z.debugTextBuffer.itemSize),v.blendFunc(v.ONE_MINUS_DST_ALPHA,v.ONE)}var t=r("../lib/debugtext"),q=r("../util/browser");s.exports=o},{"../lib/debugtext":23,"../util/browser":95}],29:[function(q,s,o){function t(W,G,I,Q){if(Q.buffers){var aa=Q.elementGroups[G.ref||G.id];if(aa){var P,N,M,V,H=W.gl,D=W.translateMatrix(I,Q,G.paint["fill-translate"],G.paint["fill-translate-anchor"]),Y=G.paint["fill-color"];H.stencilMask(63),H.clear(H.STENCIL_BUFFER_BIT),H.stencilFunc(H.NOTEQUAL,128,128),H.stencilOpSeparate(H.FRONT,H.INCR_WRAP,H.KEEP,H.KEEP),H.stencilOpSeparate(H.BACK,H.DECR_WRAP,H.KEEP,H.KEEP),H.colorMask(!1,!1,!1,!1),H.switchShader(W.fillShader,D),P=Q.buffers.fillVertex,P.bind(H),N=Q.buffers.fillElement,N.bind(H);for(var O,w,F=0;F<aa.groups.length;F++){M=aa.groups[F],O=M.vertexStartIndex*P.itemSize,H.vertexAttribPointer(W.fillShader.a_pos,2,H.SHORT,!1,4,O+0),V=3*M.elementLength,w=M.elementStartIndex*N.itemSize,H.drawElements(H.TRIANGLES,V,H.UNSIGNED_SHORT,w)}H.colorMask(!0,!0,!0,!0),H.stencilOp(H.KEEP,H.KEEP,H.KEEP),H.stencilMask(0);var X=G.paint["fill-outline-color"];if(G.paint["fill-antialias"]===!0&&(!G.paint["fill-pattern"]||X)){H.switchShader(W.outlineShader,D),H.lineWidth(2*p.devicePixelRatio),X?H.stencilFunc(H.EQUAL,128,128):H.stencilFunc(H.EQUAL,128,191),H.uniform2f(W.outlineShader.u_world,H.drawingBufferWidth,H.drawingBufferHeight),H.uniform4fv(W.outlineShader.u_color,X?X:Y),P=Q.buffers.fillVertex,N=Q.buffers.outlineElement,N.bind(H);for(var K=0;K<aa.groups.length;K++){M=aa.groups[K],O=M.vertexStartIndex*P.itemSize,H.vertexAttribPointer(W.outlineShader.a_pos,2,H.SHORT,!1,4,O+0),V=2*M.secondElementLength,w=M.secondElementStartIndex*N.itemSize,H.drawElements(H.LINES,V,H.UNSIGNED_SHORT,w)}}var ab,T=G.paint["fill-pattern"],C=G.paint["fill-opacity"]||1;if(T){var B=W.spriteAtlas.getPosition(T.from,!0),Z=W.spriteAtlas.getPosition(T.to,!0);if(!B||!Z){return}ab=W.patternShader,H.switchShader(ab,I),H.uniform1i(ab.u_image,0),H.uniform2fv(ab.u_pattern_tl_a,B.tl),H.uniform2fv(ab.u_pattern_br_a,B.br),H.uniform2fv(ab.u_pattern_tl_b,Z.tl),H.uniform2fv(ab.u_pattern_br_b,Z.br),H.uniform1f(ab.u_opacity,C),H.uniform1f(ab.u_mix,T.t);var J=Q.tileExtent/Q.tileSize/Math.pow(2,W.transform.tileZoom-Q.coord.z),z=r.create();r.scale(z,z,[1/(B.size[0]*J*T.fromScale),1/(B.size[1]*J*T.fromScale)]);var U=r.create();r.scale(U,U,[1/(Z.size[0]*J*T.toScale),1/(Z.size[1]*J*T.toScale)]),H.uniformMatrix3fv(ab.u_patternmatrix_a,!1,z),H.uniformMatrix3fv(ab.u_patternmatrix_b,!1,U),W.spriteAtlas.bind(H,!0)}else{ab=W.fillShader,H.switchShader(ab,I),H.uniform4fv(ab.u_color,Y)}H.stencilFunc(H.NOTEQUAL,0,63),H.bindBuffer(H.ARRAY_BUFFER,W.tileExtentBuffer),H.vertexAttribPointer(ab.a_pos,W.tileExtentBuffer.itemSize,H.SHORT,!1,0,0),H.drawArrays(H.TRIANGLE_STRIP,0,W.tileExtentBuffer.itemCount),H.stencilMask(0),H.stencilFunc(H.EQUAL,128,128)}}}var p=q("../util/browser"),r=q("gl-matrix").mat3;s.exports=t},{"../util/browser":95,"gl-matrix":116}],30:[function(q,r,o){var p=q("../util/browser"),s=q("gl-matrix").mat2;r.exports=function(ao,ay,aC,aq){if(aq.buffers){var aG=aq.elementGroups[ay.ref||ay.id];if(aG){var av=ao.gl;if(!(ay.paint["line-width"]<=0)){var au=1/p.devicePixelRatio,aB=ay.paint["line-blur"]+au,ax=ay.paint["line-width"]/2,an=-1,aw=0,ap=0;ay.paint["line-gap-width"]>0&&(an=ay.paint["line-gap-width"]/2+0.5*au,ax=ay.paint["line-width"],aw=an-au/2);var aH=aw+ax+au/2+ap,az=ay.paint["line-color"],aD=ao.transform.scale/(1<<aq.coord.z)/(aq.tileExtent/aq.tileSize),at=ao.translateMatrix(aC,aq,ay.paint["line-translate"],ay.paint["line-translate-anchor"]),am=ao.transform,aE=s.create();s.scale(aE,aE,[1,Math.cos(am._pitch)]),s.rotate(aE,aE,ao.transform.angle);var ak,aF=Math.sqrt(am.height*am.height/4*(1+am.altitude*am.altitude)),al=am.height/2*Math.tan(am._pitch),aA=(aF+al)/aF-1,K=aq.tileSize/ao.transform.tileSize,Z=ay.paint["line-dasharray"],ai=ay.paint["line-pattern"];if(Z){ak=ao.linesdfpatternShader,av.switchShader(ak,at,aq.exMatrix),av.uniform2fv(ak.u_linewidth,[aH,an]),av.uniform1f(ak.u_ratio,aD),av.uniform1f(ak.u_blur,aB),av.uniform4fv(ak.u_color,az);var ah=ao.lineAtlas.getDash(Z.from,"round"===ay.layout["line-cap"]),aj=ao.lineAtlas.getDash(Z.to,"round"===ay.layout["line-cap"]);ao.lineAtlas.bind(av);var ae=Math.pow(2,Math.floor(Math.log(ao.transform.scale)/Math.LN2)-aq.coord.z)/8*K,W=[ae/ah.width/Z.fromScale,-ah.height/2],Q=ao.lineAtlas.width/(Z.fromScale*ah.width*256*p.devicePixelRatio)/2,ab=[ae/aj.width/Z.toScale,-aj.height/2],Y=ao.lineAtlas.width/(Z.toScale*aj.width*256*p.devicePixelRatio)/2;av.uniform2fv(ak.u_patternscale_a,W),av.uniform1f(ak.u_tex_y_a,ah.y),av.uniform2fv(ak.u_patternscale_b,ab),av.uniform1f(ak.u_tex_y_b,aj.y),av.uniform1i(ak.u_image,0),av.uniform1f(ak.u_sdfgamma,Math.max(Q,Y)),av.uniform1f(ak.u_mix,Z.t),av.uniform1f(ak.u_extra,aA),av.uniformMatrix2fv(ak.u_antialiasingmatrix,!1,aE)}else{if(ai){var J=ao.spriteAtlas.getPosition(ai.from,!0),ar=ao.spriteAtlas.getPosition(ai.to,!0);if(!J||!ar){return}var af=aq.tileExtent/aq.tileSize/Math.pow(2,ao.transform.tileZoom-aq.coord.z)*K;ao.spriteAtlas.bind(av,!0),ak=ao.linepatternShader,av.switchShader(ak,at,aq.exMatrix),av.uniform2fv(ak.u_linewidth,[aH,an]),av.uniform1f(ak.u_ratio,aD),av.uniform1f(ak.u_blur,aB),av.uniform2fv(ak.u_pattern_size_a,[J.size[0]*af*ai.fromScale,ar.size[1]]),av.uniform2fv(ak.u_pattern_size_b,[ar.size[0]*af*ai.toScale,ar.size[1]]),av.uniform2fv(ak.u_pattern_tl_a,J.tl),av.uniform2fv(ak.u_pattern_br_a,J.br),av.uniform2fv(ak.u_pattern_tl_b,ar.tl),av.uniform2fv(ak.u_pattern_br_b,ar.br),av.uniform1f(ak.u_fade,ai.t),av.uniform1f(ak.u_opacity,ay.paint["line-opacity"]),av.uniform1f(ak.u_extra,aA),av.uniformMatrix2fv(ak.u_antialiasingmatrix,!1,aE)}else{ak=ao.lineShader,av.switchShader(ak,at,aq.exMatrix),av.uniform2fv(ak.u_linewidth,[aH,an]),av.uniform1f(ak.u_ratio,aD),av.uniform1f(ak.u_blur,aB),av.uniform1f(ak.u_extra,aA),av.uniformMatrix2fv(ak.u_antialiasingmatrix,!1,aE),av.uniform4fv(ak.u_color,az)}}var ad=aq.buffers.lineVertex;ad.bind(av);var aa=aq.buffers.lineElement;aa.bind(av);for(var ac=0;ac<aG.groups.length;ac++){var X=aG.groups[ac],ag=X.vertexStartIndex*ad.itemSize;av.vertexAttribPointer(ak.a_pos,2,av.SHORT,!1,8,ag+0),av.vertexAttribPointer(ak.a_data,4,av.BYTE,!1,8,ag+4);var F=3*X.elementLength,C=X.elementStartIndex*aa.itemSize;av.drawElements(av.TRIANGLES,F,av.UNSIGNED_SHORT,C)}}}}}},{"../util/browser":95,"gl-matrix":116}],31:[function(r,p,s){function q(H,z,D,F){var C=H.gl;C.disable(C.STENCIL_TEST);var A=H.rasterShader;C.switchShader(A,D),C.uniform1f(A.u_brightness_low,z.paint["raster-brightness-min"]),C.uniform1f(A.u_brightness_high,z.paint["raster-brightness-max"]),C.uniform1f(A.u_saturation_factor,o(z.paint["raster-saturation"])),C.uniform1f(A.u_contrast_factor,u(z.paint["raster-contrast"])),C.uniform3fv(A.u_spin_weights,w(z.paint["raster-hue-rotate"]));var B,G,I=F.source&&F.source._pyramid.findLoadedParent(F.coord,0,{}),E=v(F,I,z,H.transform);C.activeTexture(C.TEXTURE0),C.bindTexture(C.TEXTURE_2D,F.texture),I?(C.activeTexture(C.TEXTURE1),C.bindTexture(C.TEXTURE_2D,I.texture),B=Math.pow(2,I.coord.z-F.coord.z),G=[F.coord.x*B%1,F.coord.y*B%1]):E[1]=0,C.uniform2fv(A.u_tl_parent,G||[0,0]),C.uniform1f(A.u_scale_parent,B||1),C.uniform1f(A.u_buffer_scale,1),C.uniform1f(A.u_opacity0,E[0]),C.uniform1f(A.u_opacity1,E[1]),C.uniform1i(A.u_image0,0),C.uniform1i(A.u_image1,1),C.bindBuffer(C.ARRAY_BUFFER,F.boundsBuffer||H.tileExtentBuffer),C.vertexAttribPointer(A.a_pos,2,C.SHORT,!1,8,0),C.vertexAttribPointer(A.a_texture_pos,2,C.SHORT,!1,8,4),C.drawArrays(C.TRIANGLE_STRIP,0,4),C.enable(C.STENCIL_TEST)}function w(z){z*=Math.PI/180;var A=Math.sin(z),B=Math.cos(z);return[(2*B+1)/3,(-Math.sqrt(3)*A-B+1)/3,(Math.sqrt(3)*A-B+1)/3]}function u(z){return z>0?1/(1-z):1+z}function o(z){return z>0?1-1/(1.001-z):-z}function v(J,z,E,H){if(!J.source){return[1,0]}var C=(new Date).getTime(),A=E.paint["raster-fade-duration"],B=(C-J.timeAdded)/A,I=z?(C-z.timeAdded)/A:-1,K=J.source._pyramid.coveringZoomLevel(H),G=z?Math.abs(z.coord.z-K)>Math.abs(J.coord.z-K):!1,D=[];!z||G?(D[0]=t.clamp(B,0,1),D[1]=1-D[0]):(D[0]=t.clamp(1-I,0,1),D[1]=1-D[0]);var F=E.paint["raster-opacity"];return D[0]*=F,D[1]*=F,D}var t=r("../util/util");p.exports=q},{"../util/util":106}],32:[function(q,p,r){function v(D,B,C,z){if(z.buffers){var E=z.elementGroups[B.ref||B.id];if(E){var A=!(B.layout["text-allow-overlap"]||B.layout["icon-allow-overlap"]||B.layout["text-ignore-placement"]||B.layout["icon-ignore-placement"]),F=D.gl;A&&F.disable(F.STENCIL_TEST),E.text.groups.length&&w(D,B,C,z,E.text,"text",!0),E.icon.groups.length&&w(D,B,C,z,E.icon,"icon",E.sdfIcons),s(D,B,C,z),A&&F.enable(F.STENCIL_TEST)}}}function w(ar,ae,ag,aw,aj,an,ak){var am=ar.gl;ag=ar.translateMatrix(ag,aw,ae.paint[an+"-translate"],ae.paint[an+"-translate-anchor"]);var al,aq,ad,af=ar.transform,at="map"===ae.layout[an+"-rotation-alignment"],ao=at;ao?(al=o.create(),aq=aw.tileExtent/aw.tileSize/Math.pow(2,ar.transform.zoom-aw.coord.z),ad=1/Math.cos(af._pitch)):(al=o.clone(aw.exMatrix),aq=ar.transform.altitude,ad=1),o.scale(al,al,[aq,aq,1]);var ai=ae.paint[an+"-size"],ap=ai/u[an];o.scale(al,al,[ap,ap,1]);var F,au,aa,av,ac=Math.sqrt(af.height*af.height/4*(1+af.altitude*af.altitude)),ax=af.height/2*Math.tan(af._pitch),Y=(ac+ax)/ac-1,ab="text"===an;if(ab||ar.style.sprite.loaded()){am.activeTexture(am.TEXTURE0),F=ak?ar.sdfShader:ar.iconShader,ab?(ar.glyphAtlas.updateTexture(am),au=aw.buffers.glyphVertex,aa=aw.buffers.glyphElement,av=[ar.glyphAtlas.width/4,ar.glyphAtlas.height/4]):(ar.spriteAtlas.bind(am,at||ar.options.rotating||ar.options.zooming||1!==ap||ak||ar.transform.pitch),au=aw.buffers.iconVertex,aa=aw.buffers.iconElement,av=[ar.spriteAtlas.width/4,ar.spriteAtlas.height/4]),am.switchShader(F,ag,al),am.uniform1i(F.u_texture,0),am.uniform2fv(F.u_texsize,av),am.uniform1i(F.u_skewed,ao),am.uniform1f(F.u_extra,Y);var Z=Math.log(ai/aj[an+"-size"])/Math.LN2||0;am.uniform1f(F.u_zoom,10*(ar.transform.zoom-Z));var U=ar.frameHistory.getFadeProperties(300);am.uniform1f(F.u_fadedist,10*U.fadedist),am.uniform1f(F.u_minfadezoom,Math.floor(10*U.minfadezoom)),am.uniform1f(F.u_maxfadezoom,Math.floor(10*U.maxfadezoom)),am.uniform1f(F.u_fadezoom,10*(ar.transform.zoom+U.bump));var B,P,J,K;if(aa.bind(am),ak){var X=8,O=1.19,H=6,Q=0.105*u[an]/ai/t.devicePixelRatio;am.uniform1f(F.u_gamma,Q*ad),am.uniform4fv(F.u_color,ae.paint[an+"-color"]),am.uniform1f(F.u_buffer,0.75);for(var V=0;V<aj.groups.length;V++){B=aj.groups[V],P=B.vertexStartIndex*au.itemSize,au.bind(am,F,P),J=3*B.elementLength,K=B.elementStartIndex*aa.itemSize,am.drawElements(am.TRIANGLES,J,am.UNSIGNED_SHORT,K)}if(ae.paint[an+"-halo-width"]){am.uniform1f(F.u_gamma,(ae.paint[an+"-halo-blur"]*O/ap/X+Q)*ad),am.uniform4fv(F.u_color,ae.paint[an+"-halo-color"]),am.uniform1f(F.u_buffer,(H-ae.paint[an+"-halo-width"]/ap)/X);for(var ah=0;ah<aj.groups.length;ah++){B=aj.groups[ah],P=B.vertexStartIndex*au.itemSize,au.bind(am,F,P),J=3*B.elementLength,K=B.elementStartIndex*aa.itemSize,am.drawElements(am.TRIANGLES,J,am.UNSIGNED_SHORT,K)}}}else{am.uniform1f(F.u_opacity,ae.paint["icon-opacity"]);for(var W=0;W<aj.groups.length;W++){B=aj.groups[W],P=B.vertexStartIndex*au.itemSize,au.bind(am,F,P),J=3*B.elementLength,K=B.elementStartIndex*aa.itemSize,am.drawElements(am.TRIANGLES,J,am.UNSIGNED_SHORT,K)}}}}var t=q("../util/browser"),o=q("gl-matrix").mat4,s=q("./draw_collision_debug");p.exports=v;var u={icon:1,text:24}},{"../util/browser":95,"./draw_collision_debug":27,"gl-matrix":116}],33:[function(s,t,p){function o(C,A,w,v){function D(J,H,G,M){B.switchShader(C.dotShader,G),B.uniform1f(C.dotShader.u_size,4*r.devicePixelRatio),B.uniform1f(C.dotShader.u_blur,0.25),B.uniform4fv(C.dotShader.u_color,[0.1,0,0,0.1]),J.bind(B,C.dotShader,0);for(var E=0;E<H.length;E++){var I=H[E],F=I.vertexStartIndex,K=I.vertexLength;B.vertexAttribPointer(C.dotShader.a_pos,2,B.SHORT,!1,M,0),B.drawArrays(B.POINTS,F,K)}}var B=C.gl;if(v&&v.buffers){var u=v.elementGroups[A.ref||A.id];if(u){if(B.blendFunc(B.ONE,B.ONE_MINUS_SRC_ALPHA),"fill"===A.type){D(v.buffers.fillVertex,u.groups,w,4)}else{if("symbol"===A.type){D(v.buffers.iconVertex,u.icon.groups,w,16),D(v.buffers.glyphVertex,u.text.groups,w,16)}else{if("line"===A.type){var z=q.clone(w);q.scale(z,z,[0.5,0.5,1]),D(v.buffers.lineVertex,u.groups,z,8)}}}B.blendFunc(B.ONE_MINUS_DST_ALPHA,B.ONE)}}}var r=s("../util/browser"),q=s("gl-matrix").mat4;t.exports=o},{"../util/browser":95,"gl-matrix":116}],34:[function(q,r,p){function o(){this.frameHistory=[]}r.exports=o,o.prototype.getFadeProperties=function(G){void 0===G&&(G=300);for(var D=(new Date).getTime();this.frameHistory.length>3&&this.frameHistory[1].time+G<D;){this.frameHistory.shift()}this.frameHistory[1].time+G<D&&(this.frameHistory[0].z=this.frameHistory[1].z);var u=this.frameHistory.length;3>u&&console.warn("there should never be less than three frames in the history");var A=this.frameHistory[0].z,H=this.frameHistory[u-1],v=H.z,F=Math.min(A,v),z=Math.max(A,v),B=H.z-this.frameHistory[1].z,C=H.time-this.frameHistory[1].time,E=B/(C/G);isNaN(E)&&console.warn("fadedist should never be NaN");var w=(D-H.time)/G*E;return{fadedist:E,minfadezoom:F,maxfadezoom:z,bump:w}},o.prototype.record=function(s){var u=(new Date).getTime();this.frameHistory.length||this.frameHistory.push({time:0,z:s},{time:0,z:s}),(2===this.frameHistory.length||this.frameHistory[this.frameHistory.length-1].z!==s)&&this.frameHistory.push({time:u,z:s})}},{}],35:[function(r,s,p){var q=r("./shaders"),o=r("../util/util");p.extend=function(v){var u=v.lineWidth,w=v.getParameter(v.ALIASED_LINE_WIDTH_RANGE);return v.lineWidth=function(t){u.call(v,o.clamp(t,w[0],w[1]))},v.getShader=function(C,B){var D=B===this.FRAGMENT_SHADER?"fragment":"vertex";if(!q[C]||!q[C][D]){throw new Error("Could not find shader "+C)}var A=this.createShader(B),z=q[C][D];if("undefined"==typeof orientation&&(z=z.replace(/ highp /g," ")),this.shaderSource(A,z),this.compileShader(A),!this.getShaderParameter(A,this.COMPILE_STATUS)){throw new Error(this.getShaderInfoLog(A))}return A},v.initializeShader=function(D,B,E){var A={program:this.createProgram(),fragment:this.getShader(D,this.FRAGMENT_SHADER),vertex:this.getShader(D,this.VERTEX_SHADER),attributes:[]};if(this.attachShader(A.program,A.vertex),this.attachShader(A.program,A.fragment),this.linkProgram(A.program),this.getProgramParameter(A.program,this.LINK_STATUS)){for(var z=0;z<B.length;z++){A[B[z]]=this.getAttribLocation(A.program,B[z]),A.attributes.push(A[B[z]])}for(var C=0;C<E.length;C++){A[E[C]]=this.getUniformLocation(A.program,E[C])}}else{console.error(this.getProgramInfoLog(A.program))}return A},v.switchShader=function(D,B,E){if(B||console.trace("posMatrix does not have required argument"),this.currentShader!==D){this.useProgram(D.program);for(var A=this.currentShader?this.currentShader.attributes:[],z=D.attributes,C=0;C<A.length;C++){z.indexOf(A[C])<0&&this.disableVertexAttribArray(A[C])}for(var F=0;F<z.length;F++){A.indexOf(z[F])<0&&this.enableVertexAttribArray(z[F])}this.currentShader=D}D.posMatrix!==B&&(this.uniformMatrix4fv(D.u_matrix,!1,B),D.posMatrix=B),E&&D.exMatrix!==E&&D.u_exmatrix&&(this.uniformMatrix4fv(D.u_exmatrix,!1,E),D.exMatrix=E)},v.vertexAttrib2fv=function(z,A){v.vertexAttrib2f(z,A[0],A[1])},v.vertexAttrib3fv=function(z,A){v.vertexAttrib3f(z,A[0],A[1],A[2])},v.vertexAttrib4fv=function(z,A){v.vertexAttrib4f(z,A[0],A[1],A[2],A[3])},v}},{"../util/util":106,"./shaders":38}],36:[function(p,q,o){function r(u,s){this.width=u,this.height=s,this.nextRow=0,this.bytes=4,this.data=new Uint8Array(this.width*this.height*this.bytes),this.positions={}}q.exports=r,r.prototype.setSprite=function(s){this.sprite=s},r.prototype.getDash=function(u,s){var v=u.join(",")+s;return this.positions[v]||(this.positions[v]=this.addDash(u,s)),this.positions[v]},r.prototype.addDash=function(I,U){var Y=U?7:0,V=2*Y+1,K=128;if(this.nextRow+V>this.height){return console.warn("LineAtlas out of space"),null}for(var ab=0,M=0;M<I.length;M++){ab+=I[M]}for(var Q=this.width/ab,P=Q/2,Z=I.length%2===1,H=-Y;Y>=H;H++){for(var v=this.nextRow+Y+H,S=this.width*v,z=Z?-I[I.length-1]:0,G=I[0],W=1,O=0;O<this.width;O++){for(;O/Q>G;){z=G,G+=I[W],Z&&W===I.length-1&&(G+=I[0]),W++}var C,X=Math.abs(O-z*Q),N=Math.abs(O-G*Q),F=Math.min(X,N),ac=W%2===1;if(U){var B=Y?H/Y*(P+1):0;if(ac){var J=P-Math.abs(B);C=Math.sqrt(F*F+J*J)}else{C=P-Math.sqrt(F*F+B*B)}}else{C=(ac?1:-1)*F}this.data[3+4*(S+O)]=Math.max(0,Math.min(255,C+K))}}var aa={y:(this.nextRow+Y+0.5)/this.height,height:2*Y/this.height,width:ab};return this.nextRow+=V,this.dirty=!0,aa},r.prototype.bind=function(s){this.texture?(s.bindTexture(s.TEXTURE_2D,this.texture),this.dirty&&(this.dirty=!1,s.texSubImage2D(s.TEXTURE_2D,0,0,0,this.width,this.height,s.RGBA,s.UNSIGNED_BYTE,this.data))):(this.texture=s.createTexture(),s.bindTexture(s.TEXTURE_2D,this.texture),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_S,s.REPEAT),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_T,s.REPEAT),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MIN_FILTER,s.LINEAR),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MAG_FILTER,s.LINEAR),s.texImage2D(s.TEXTURE_2D,0,s.RGBA,this.width,this.height,0,s.RGBA,s.UNSIGNED_BYTE,this.data))},r.prototype.debug=function(){var v=document.createElement("canvas");document.body.appendChild(v),v.style.position="absolute",v.style.top=0,v.style.left=0,v.style.background="#ff0",v.width=this.width,v.height=this.height;for(var u=v.getContext("2d"),A=u.getImageData(0,0,this.width,this.height),z=0;z<this.data.length;z++){if(this.sdf){var w=4*z;A.data[w]=A.data[w+1]=A.data[w+2]=0,A.data[w+3]=this.data[z]}else{A.data[z]=this.data[z]}}u.putImageData(A,0,0)}},{}],37:[function(q,p,s){function t(z,A){this.gl=v.extend(z),this.transform=A,this.reusableTextures={},this.preFbos={},this.frameHistory=new r,this.setup()}var v=q("./gl_util"),u=q("../util/browser"),o=q("gl-matrix").mat4,r=q("./frame_history");p.exports=t,t.prototype.resize=function(A,B){var z=this.gl;this.width=A*u.devicePixelRatio,this.height=B*u.devicePixelRatio,z.viewport(0,0,this.width,this.height)},t.prototype.setup=function(){var z=this.gl;z.verbose=!0,z.enable(z.BLEND),z.blendFunc(z.ONE_MINUS_DST_ALPHA,z.ONE),z.enable(z.STENCIL_TEST),this.debugShader=z.initializeShader("debug",["a_pos"],["u_matrix","u_color"]),this.rasterShader=z.initializeShader("raster",["a_pos","a_texture_pos"],["u_matrix","u_brightness_low","u_brightness_high","u_saturation_factor","u_spin_weights","u_contrast_factor","u_opacity0","u_opacity1","u_image0","u_image1","u_tl_parent","u_scale_parent","u_buffer_scale"]),this.circleShader=z.initializeShader("circle",["a_pos"],["u_matrix","u_exmatrix","u_blur","u_size","u_color"]),this.lineShader=z.initializeShader("line",["a_pos","a_data"],["u_matrix","u_linewidth","u_color","u_ratio","u_blur","u_extra","u_antialiasingmatrix"]),this.linepatternShader=z.initializeShader("linepattern",["a_pos","a_data"],["u_matrix","u_linewidth","u_ratio","u_pattern_size_a","u_pattern_size_b","u_pattern_tl_a","u_pattern_br_a","u_pattern_tl_b","u_pattern_br_b","u_blur","u_fade","u_opacity","u_extra","u_antialiasingmatrix"]),this.linesdfpatternShader=z.initializeShader("linesdfpattern",["a_pos","a_data"],["u_matrix","u_linewidth","u_color","u_ratio","u_blur","u_patternscale_a","u_tex_y_a","u_patternscale_b","u_tex_y_b","u_image","u_sdfgamma","u_mix","u_extra","u_antialiasingmatrix"]),this.dotShader=z.initializeShader("dot",["a_pos"],["u_matrix","u_size","u_color","u_blur"]),this.sdfShader=z.initializeShader("sdf",["a_pos","a_offset","a_data1","a_data2"],["u_matrix","u_exmatrix","u_texture","u_texsize","u_color","u_gamma","u_buffer","u_zoom","u_fadedist","u_minfadezoom","u_maxfadezoom","u_fadezoom","u_skewed","u_extra"]),this.iconShader=z.initializeShader("icon",["a_pos","a_offset","a_data1","a_data2"],["u_matrix","u_exmatrix","u_texture","u_texsize","u_zoom","u_fadedist","u_minfadezoom","u_maxfadezoom","u_fadezoom","u_opacity","u_skewed","u_extra"]),this.outlineShader=z.initializeShader("outline",["a_pos"],["u_matrix","u_color","u_world"]),this.patternShader=z.initializeShader("pattern",["a_pos"],["u_matrix","u_pattern_tl_a","u_pattern_br_a","u_pattern_tl_b","u_pattern_br_b","u_mix","u_patternmatrix_a","u_patternmatrix_b","u_opacity","u_image"]),this.fillShader=z.initializeShader("fill",["a_pos"],["u_matrix","u_color"]),this.collisionBoxShader=z.initializeShader("collisionbox",["a_pos","a_extrude","a_data"],["u_matrix","u_scale","u_zoom","u_maxzoom"]),this.identityMatrix=o.create(),this.backgroundBuffer=z.createBuffer(),this.backgroundBuffer.itemSize=2,this.backgroundBuffer.itemCount=4,z.bindBuffer(z.ARRAY_BUFFER,this.backgroundBuffer),z.bufferData(z.ARRAY_BUFFER,new Int16Array([-1,-1,1,-1,-1,1,1,1]),z.STATIC_DRAW),this.setExtent(4096),this.debugTextBuffer=z.createBuffer(),this.debugTextBuffer.itemSize=2},t.prototype.setExtent=function(z){if(z&&z!==this.tileExtent){this.tileExtent=z;var A=this.gl;this.tileExtentBuffer=A.createBuffer(),this.tileExtentBuffer.itemSize=4,this.tileExtentBuffer.itemCount=4,A.bindBuffer(A.ARRAY_BUFFER,this.tileExtentBuffer),A.bufferData(A.ARRAY_BUFFER,new Int16Array([0,0,0,0,this.tileExtent,0,32767,0,0,this.tileExtent,0,32767,this.tileExtent,this.tileExtent,32767,32767]),A.STATIC_DRAW),this.debugBuffer=A.createBuffer(),this.debugBuffer.itemSize=2,this.debugBuffer.itemCount=5,A.bindBuffer(A.ARRAY_BUFFER,this.debugBuffer),A.bufferData(A.ARRAY_BUFFER,new Int16Array([0,0,this.tileExtent-1,0,this.tileExtent-1,this.tileExtent-1,0,this.tileExtent-1,0,0]),A.STATIC_DRAW)}},t.prototype.clearColor=function(){var z=this.gl;z.clearColor(0,0,0,0),z.clear(z.COLOR_BUFFER_BIT)},t.prototype.clearStencil=function(){var z=this.gl;z.clearStencil(0),z.stencilMask(255),z.clear(z.STENCIL_BUFFER_BIT)},t.prototype.drawClippingMask=function(z){var A=this.gl;A.switchShader(this.fillShader,z.posMatrix),A.colorMask(!1,!1,!1,!1),A.clearStencil(0),A.stencilMask(191),A.clear(A.STENCIL_BUFFER_BIT),A.stencilFunc(A.EQUAL,192,64),A.stencilMask(192),A.stencilOp(A.REPLACE,A.KEEP,A.KEEP),A.bindBuffer(A.ARRAY_BUFFER,this.tileExtentBuffer),A.vertexAttribPointer(this.fillShader.a_pos,this.tileExtentBuffer.itemSize,A.SHORT,!1,8,0),A.drawArrays(A.TRIANGLE_STRIP,0,this.tileExtentBuffer.itemCount),A.stencilFunc(A.EQUAL,128,128),A.stencilOp(A.KEEP,A.KEEP,A.REPLACE),A.stencilMask(0),A.colorMask(!0,!0,!0,!0)},t.prototype.prepareBuffers=function(){},t.prototype.bindDefaultFramebuffer=function(){var z=this.gl;z.bindFramebuffer(z.FRAMEBUFFER,null)};var w={symbol:q("./draw_symbol"),circle:q("./draw_circle"),line:q("./draw_line"),fill:q("./draw_fill"),raster:q("./draw_raster"),background:q("./draw_background"),debug:q("./draw_debug"),vertices:q("./draw_vertices")};t.prototype.render=function(B,D){this.style=B,this.options=D,this.lineAtlas=B.lineAtlas,this.spriteAtlas=B.spriteAtlas,this.spriteAtlas.setSprite(B.sprite),this.glyphAtlas=B.glyphAtlas,this.glyphAtlas.bind(this.gl),this.frameHistory.record(this.transform.zoom),this.prepareBuffers(),this.clearColor();for(var A=B._groups.length-1;A>=0;A--){var C=B._groups[A],z=B.sources[C.source];z?(this.clearStencil(),z.render(C,this)):void 0===C.source&&this.drawLayers(C,this.identityMatrix)}},t.prototype.drawTile=function(z,A){this.setExtent(z.tileExtent),this.drawClippingMask(z),this.drawLayers(A,z.posMatrix,z),this.options.debug&&w.debug(this,z)},t.prototype.drawLayers=function(B,D,A){for(var C=B.length-1;C>=0;C--){var z=B[C];z.hidden||(w[z.type](this,z,D,A),this.options.vertices&&w.vertices(this,z,D,A))}},t.prototype.drawStencilBuffer=function(){var z=this.gl;z.switchShader(this.fillShader,this.identityMatrix),z.blendFunc(z.ONE,z.ONE_MINUS_SRC_ALPHA),z.stencilMask(0),z.stencilFunc(z.EQUAL,128,128),z.bindBuffer(z.ARRAY_BUFFER,this.backgroundBuffer),z.vertexAttribPointer(this.fillShader.a_pos,this.backgroundBuffer.itemSize,z.SHORT,!1,0,0),z.uniform4fv(this.fillShader.u_color,[0,0,0,0.5]),z.drawArrays(z.TRIANGLE_STRIP,0,this.tileExtentBuffer.itemCount),z.blendFunc(z.ONE_MINUS_DST_ALPHA,z.ONE)},t.prototype.translateMatrix=function(G,C,B,z){if(!B[0]&&!B[1]){return G}if("viewport"===z){var D=Math.sin(-this.transform.angle),H=Math.cos(-this.transform.angle);B=[B[0]*H-B[1]*D,B[0]*D+B[1]*H]}var F=this.transform.scale/(1<<C.coord.z)/(C.tileExtent/C.tileSize),A=[B[0]/F,B[1]/F,0],E=new Float32Array(16);return o.translate(E,G,A),E},t.prototype.saveTexture=function(z){var A=this.reusableTextures[z.size];A?A.push(z):this.reusableTextures[z.size]=[z]},t.prototype.getTexture=function(z){var A=this.reusableTextures[z];return A&&A.length>0?A.pop():null}},{"../util/browser":95,"./draw_background":25,"./draw_circle":26,"./draw_debug":28,"./draw_fill":29,"./draw_line":30,"./draw_raster":31,"./draw_symbol":32,"./draw_vertices":33,"./frame_history":34,"./gl_util":35,"gl-matrix":116}],38:[function(q,r,p){var o=void 0;r.exports={debug:{vertex:"precision mediump float;attribute vec2 a_pos;uniform mat4 u_matrix;void main(){gl_Position=u_matrix*vec4(a_pos,step(32767.,a_pos.x),1);}",fragment:"precision mediump float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}"},dot:{vertex:"precision mediump float;uniform mat4 u_matrix;uniform float u_size;attribute vec2 a_pos;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);gl_PointSize=u_size;}",fragment:"precision mediump float;uniform vec4 u_color;uniform float u_blur;void main(){float a,b;a=length(gl_PointCoord-.5);b=smoothstep(.5,.5-u_blur,a);gl_FragColor=u_color*b;}"},fill:{vertex:"precision mediump float;attribute vec2 a_pos;uniform mat4 u_matrix;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);}",fragment:"precision mediump float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}"},circle:{vertex:"precision mediump float;uniform float u_size;attribute vec2 a_pos;uniform mat4 u_matrix,u_exmatrix;varying vec2 a;void main(){a=vec2(mod(a_pos,2.)*2.-1.);vec4 b=u_exmatrix*vec4(a*u_size,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5),0,1);gl_Position+=b*gl_Position.w;}",fragment:"precision mediump float;uniform vec4 u_color;uniform float u_blur,u_size;varying vec2 a;void main(){float b=smoothstep(1.-u_blur,1.,length(a));gl_FragColor=u_color*(1.-b);}"},line:{vertex:"precision mediump float;attribute vec2 a_pos;attribute vec4 a_data;uniform highp mat4 u_matrix;uniform float u_ratio,u_extra;uniform vec2 u_linewidth;uniform mat2 u_antialiasingmatrix;varying vec2 a;varying float b,c;void main(){vec2 d,e;d=a_data.xy;e=mod(a_pos,2.);e.y=sign(e.y-.5);a=e;vec4 f=vec4(u_linewidth.s*d*.015873016,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5)+f.xy/u_ratio,0,1);float g,h,i;g=gl_Position.y/gl_Position.w;h=length(d)/length(u_antialiasingmatrix*d);i=1./(1.-min(g*u_extra,.9));c=i*h;}",fragment:"precision mediump float;uniform vec2 u_linewidth;uniform vec4 u_color;uniform float u_blur;varying vec2 a;varying float b,c;void main(){float d,e,f;d=length(a)*u_linewidth.s;e=u_blur*c;f=clamp(min(d-(u_linewidth.t-e),u_linewidth.s-d)/e,0.,1.);gl_FragColor=u_color*f;}"},linepattern:{vertex:"precision mediump float;attribute vec2 a_pos;attribute vec4 a_data;uniform highp mat4 u_matrix;uniform float u_ratio,u_extra;uniform vec2 u_linewidth;uniform vec4 u_color;uniform mat2 u_antialiasingmatrix;varying vec2 a;varying float b,c;void main(){vec2 d,f,g,h;d=a_data.xy;float e,i,j,k;e=a_data.z*128.+a_data.w;f=mod(a_pos,2.);f.y=sign(f.y-.5);a=f;g=d*.015873016;h=u_linewidth.s*g;gl_Position=u_matrix*vec4(floor(a_pos*.5)+h.xy/u_ratio,0,1);b=e;i=gl_Position.y/gl_Position.w;j=length(d)/length(u_antialiasingmatrix*d);k=1./(1.-min(i*u_extra,.9));c=k*j;}",fragment:"precision mediump float;uniform vec2 u_linewidth,u_pattern_size_a,u_pattern_size_b,u_pattern_tl_a,u_pattern_br_a,u_pattern_tl_b,u_pattern_br_b;uniform float u_point,u_blur,u_fade,u_opacity;uniform sampler2D u_image;varying vec2 a;varying float b,c;void main(){float d,e,f,g,h,i,j;d=length(a)*u_linewidth.s;e=u_blur*c;f=clamp(min(d-(u_linewidth.t-e),u_linewidth.s-d)/e,0.,1.);g=mod(b/u_pattern_size_a.x,1.);h=mod(b/u_pattern_size_b.x,1.);i=.5+a.y*u_linewidth.s/u_pattern_size_a.y;j=.5+a.y*u_linewidth.s/u_pattern_size_b.y;vec2 k,l;k=mix(u_pattern_tl_a,u_pattern_br_a,vec2(g,i));l=mix(u_pattern_tl_b,u_pattern_br_b,vec2(h,j));vec4 m=mix(texture2D(u_image,k),texture2D(u_image,l),u_fade);f*=u_opacity;gl_FragColor=m*f;}"},linesdfpattern:{vertex:"precision mediump float;attribute vec2 a_pos;attribute vec4 a_data;uniform highp mat4 u_matrix;uniform vec2 u_linewidth,u_patternscale_a,u_patternscale_b;uniform float u_ratio,u_tex_y_a,u_tex_y_b,u_extra;uniform mat2 u_antialiasingmatrix;varying vec2 a,b,c;varying float d;void main(){vec2 e,g;e=a_data.xy;float f,i,j,k;f=a_data.z*128.+a_data.w;g=mod(a_pos,2.);g.y=sign(g.y-.5);a=g;vec4 h=vec4(u_linewidth.s*e*.015873016,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5)+h.xy/u_ratio,0,1);b=vec2(f*u_patternscale_a.x,g.y*u_patternscale_a.y+u_tex_y_a);c=vec2(f*u_patternscale_b.x,g.y*u_patternscale_b.y+u_tex_y_b);i=gl_Position.y/gl_Position.w;j=length(e)/length(u_antialiasingmatrix*e);k=1./(1.-min(i*u_extra,.9));d=k*j;}",fragment:"precision mediump float;uniform vec2 u_linewidth;uniform vec4 u_color;uniform float u_blur,u_sdfgamma,u_mix;uniform sampler2D u_image;varying vec2 a,b,c;varying float d;void main(){float e,f,g,h,i,j;e=length(a)*u_linewidth.s;f=u_blur*d;g=clamp(min(e-(u_linewidth.t-f),u_linewidth.s-e)/f,0.,1.);h=texture2D(u_image,b).a;i=texture2D(u_image,c).a;j=mix(h,i,u_mix);g*=smoothstep(.5-u_sdfgamma,.5+u_sdfgamma,j);gl_FragColor=u_color*g;}"},outline:{vertex:"precision mediump float;attribute vec2 a_pos;uniform highp mat4 u_matrix;uniform vec2 u_world;varying vec2 a;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(gl_Position.xy/gl_Position.w+1.)/2.*u_world;}",fragment:"precision mediump float;uniform vec4 u_color;varying vec2 a;void main(){float b,c;b=length(a-gl_FragCoord.xy);c=smoothstep(1.,0.,b);gl_FragColor=u_color*c;}"},pattern:{vertex:"precision mediump float;uniform mat4 u_matrix;uniform mat3 u_patternmatrix_a,u_patternmatrix_b;attribute vec2 a_pos;varying vec2 a,b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(u_patternmatrix_a*vec3(a_pos,1)).xy;b=(u_patternmatrix_b*vec3(a_pos,1)).xy;}",fragment:"precision mediump float;uniform float u_opacity,u_mix;uniform vec2 u_pattern_tl_a,u_pattern_br_a,u_pattern_tl_b,u_pattern_br_b;uniform sampler2D u_image;varying vec2 a,b;void main(){vec2 c,d,f,g;c=mod(a,1.);d=mix(u_pattern_tl_a,u_pattern_br_a,c);vec4 e,h;e=texture2D(u_image,d);f=mod(b,1.);g=mix(u_pattern_tl_b,u_pattern_br_b,f);h=texture2D(u_image,g);gl_FragColor=mix(e,h,u_mix)*u_opacity;}"},raster:{vertex:"precision mediump float;uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent,u_buffer_scale;attribute vec2 a_pos,a_texture_pos;varying vec2 a,b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(a_texture_pos/32767.-.5)/u_buffer_scale+.5;b=a*u_scale_parent+u_tl_parent;}",fragment:"precision mediump float;uniform float u_opacity0,u_opacity1,u_brightness_low,u_brightness_high,u_saturation_factor,u_contrast_factor;uniform sampler2D u_image0,u_image1;varying vec2 a,b;uniform vec3 u_spin_weights;void main(){vec4 c,d,e;c=texture2D(u_image0,a);d=texture2D(u_image1,b);e=c*u_opacity0+d*u_opacity1;vec3 f,h,i;f=e.rgb;f=vec3(dot(f,u_spin_weights.xyz),dot(f,u_spin_weights.zxy),dot(f,u_spin_weights.yzx));float g=(e.r+e.g+e.b)/3.;f+=(g-f)*u_saturation_factor;f=(f-.5)*u_contrast_factor+.5;h=vec3(u_brightness_low);i=vec3(u_brightness_high);gl_FragColor=vec4(mix(h,i,f),e.a);}"},icon:{vertex:"precision mediump float;attribute vec2 a_pos,a_offset;attribute vec4 a_data1,a_data2;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_zoom,u_fadedist,u_minfadezoom,u_maxfadezoom,u_fadezoom,u_opacity,u_extra;uniform bool u_skewed;uniform vec2 u_texsize;varying vec2 a;varying float b;void main(){vec2 c,e;c=a_data1.xy;float d,f,g,h,i,j;d=a_data1[2];e=a_data2.st;f=e[0];g=e[1];h=10.;i=2.-step(f,u_zoom)-(1.-step(g,u_zoom));j=clamp((u_fadezoom-d)/u_fadedist,0.,1.);if(u_fadedist>=0.)b=j;else b=1.-j;if(u_maxfadezoom<d)b=0.;if(u_minfadezoom>=d)b=1.;i+=step(b,0.);if(u_skewed){vec4 k=u_exmatrix*vec4(a_offset/64.,0,0);gl_Position=u_matrix*vec4(a_pos+k.xy,0,1);gl_Position.z+=i*gl_Position.w;}else{vec4 k=u_exmatrix*vec4(a_offset/64.,i,0);gl_Position=u_matrix*vec4(a_pos,0,1)+k;}a=c/u_texsize;b*=u_opacity;}",fragment:"precision mediump float;uniform sampler2D u_texture;varying vec2 a;varying float b;void main(){gl_FragColor=texture2D(u_texture,a)*b;}"},sdf:{vertex:"precision mediump float;attribute vec2 a_pos,a_offset;attribute vec4 a_data1,a_data2;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_zoom,u_fadedist,u_minfadezoom,u_maxfadezoom,u_fadezoom,u_extra;uniform bool u_skewed;uniform vec2 u_texsize;varying vec2 a;varying float b,c;void main(){vec2 d,f;d=a_data1.xy;float e,g,h,i,j,k,l;e=a_data1[2];f=a_data2.st;g=f[0];h=f[1];i=2.-step(g,u_zoom)-(1.-step(h,u_zoom));j=clamp((u_fadezoom-e)/u_fadedist,0.,1.);if(u_fadedist>=0.)b=j;else b=1.-j;if(u_maxfadezoom<e)b=0.;if(u_minfadezoom>=e)b=1.;i+=step(b,0.);if(u_skewed){vec4 k=u_exmatrix*vec4(a_offset/64.,0,0);gl_Position=u_matrix*vec4(a_pos+k.xy,0,1);gl_Position.z+=i*gl_Position.w;}else{vec4 k=u_exmatrix*vec4(a_offset/64.,i,0);gl_Position=u_matrix*vec4(a_pos,0,1)+k;}k=gl_Position.y/gl_Position.w;l=1./(1.-k*u_extra);c=l;a=d/u_texsize;}",fragment:"precision mediump float;uniform sampler2D u_texture;uniform vec4 u_color;uniform float u_buffer,u_gamma;varying vec2 a;varying float b,c;void main(){float d,e,f;d=u_gamma*c;e=texture2D(u_texture,a).a;f=smoothstep(u_buffer-d,u_buffer+d,e)*b;gl_FragColor=u_color*f;}"},collisionbox:{vertex:"precision mediump float;attribute vec2 a_pos,a_extrude,a_data;uniform mat4 u_matrix;uniform float u_scale;varying float a,b;void main(){gl_Position=u_matrix*vec4(a_pos+a_extrude/u_scale,0,1);a=a_data.x;b=a_data.y;}",fragment:"precision mediump float;uniform float u_zoom,u_maxzoom;varying float a,b;void main(){float c=.5;gl_FragColor=vec4(0,1,0,1)*c;if(b>u_zoom)gl_FragColor=vec4(1,0,0,1)*c;if(u_zoom>=a)gl_FragColor=vec4(0,0,0,1)*c*.25;if(b>=u_maxzoom)gl_FragColor=vec4(0,0,1,1)*c*.2;}"}}},{}],39:[function(p,o,r){function t(z){z=z||{},this._data=z.data,void 0!==z.maxzoom&&(this.maxzoom=z.maxzoom),this.geojsonVtOptions={maxZoom:this.maxzoom},void 0!==z.buffer&&(this.geojsonVtOptions.buffer=z.buffer),void 0!==z.tolerance&&(this.geojsonVtOptions.tolerance=z.tolerance),this._pyramid=new v({tileSize:512,minzoom:this.minzoom,maxzoom:this.maxzoom,cacheSize:20,load:this._loadTile.bind(this),abort:this._abortTile.bind(this),unload:this._unloadTile.bind(this),add:this._addTile.bind(this),remove:this._removeTile.bind(this)})}var s=p("../util/util"),w=p("../util/evented"),v=p("./tile_pyramid"),q=p("./source"),u=p("resolve-url");o.exports=t,t.prototype=s.inherit(w,{minzoom:0,maxzoom:14,_dirty:!0,setData:function(z){return this._data=z,this._dirty=!0,this.fire("change"),this.map&&this.update(this.map.transform),this},onAdd:function(z){this.map=z},loaded:function(){return this._loaded&&this._pyramid.loaded()},update:function(z){this._dirty&&this._updateData(),this._loaded&&this._pyramid.update(this.used,z)},reload:function(){this._loaded&&this._pyramid.reload()},render:q._renderTiles,featuresAt:q._vectorFeaturesAt,featuresIn:q._vectorFeaturesIn,_updateData:function(){this._dirty=!1;var z=this._data;"string"==typeof z&&(z=u(window.location.href,z)),this.workerID=this.dispatcher.send("parse geojson",{data:z,tileSize:512,source:this.id,geojsonVtOptions:this.geojsonVtOptions},function(A){return A?void this.fire("error",{error:A}):(this._loaded=!0,this._pyramid.reload(),void this.fire("change"))}.bind(this))},_loadTile:function(A){var z=A.coord.z>this.maxzoom?Math.pow(2,A.coord.z-this.maxzoom):1,B={uid:A.uid,coord:A.coord,zoom:A.coord.z,maxZoom:this.maxzoom,tileSize:512,source:this.id,overscaling:z,angle:this.map.transform.angle,pitch:this.map.transform.pitch,collisionDebug:this.map.collisionDebug};A.workerID=this.dispatcher.send("load geojson tile",B,function(C,D){if(A.unloadVectorData(this.map.painter),!A.aborted){if(C){return void this.fire("tile.error",{tile:A})}A.loadVectorData(D),this.fire("tile.load",{tile:A})}}.bind(this),this.workerID)},_abortTile:function(z){z.aborted=!0},_addTile:function(z){this.fire("tile.add",{tile:z})},_removeTile:function(z){this.fire("tile.remove",{tile:z})},_unloadTile:function(z){z.unloadVectorData(this.map.painter),this.glyphAtlas.removeGlyphs(z.uid),this.dispatcher.send("remove tile",{uid:z.uid,source:this.id},null,z.workerID)}})},{"../util/evented":100,"../util/util":106,"./source":43,"./tile_pyramid":46,"resolve-url":140}],40:[function(r,s,p){function u(v){this.features=v,this.length=v.length}function o(v){this.type=v.type,this.rawGeometry=1===v.type?[v.geometry]:v.geometry,this.properties=v.tags,this.extent=4096}var t=r("point-geometry"),q=r("vector-tile").VectorTileFeature;s.exports=u,u.prototype.feature=function(v){return new o(this.features[v])},o.prototype.loadGeometry=function(){var A=this.rawGeometry;this.geometry=[];for(var w=0;w<A.length;w++){for(var z=A[w],B=[],v=0;v<z.length;v++){B.push(new t(z[v][0],z[v][1]))}this.geometry.push(B)}return this.geometry},o.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var D=this.geometry,F=1/0,v=-(1/0),z=1/0,E=-(1/0),w=0;w<D.length;w++){for(var B=D[w],A=0;A<B.length;A++){var C=B[A];F=Math.min(F,C.x),v=Math.max(v,C.x),z=Math.min(z,C.y),E=Math.max(E,C.y)}}return[F,z,v,E]},o.prototype.toGeoJSON=q.prototype.toGeoJSON},{"point-geometry":137,"vector-tile":144}],41:[function(q,p,r){function o(A){this.coordinates=A.coordinates,v.getImage(A.url,function(C,B){C||(this.image=B,this.image.addEventListener("load",function(){this.map._rerender()}.bind(this)),this._loaded=!0,this.map&&(this.createTile(),this.fire("change")))}.bind(this))}var s=q("../util/util"),w=q("./tile"),u=q("../geo/lng_lat"),t=q("point-geometry"),z=q("../util/evented"),v=q("../util/ajax");p.exports=o,o.prototype=s.inherit(z,{onAdd:function(A){this.map=A,this.image&&this.createTile()},createTile:function(){var F=this.map,D=this.coordinates.map(function(J){var I=u.convert(J);return F.transform.locationCoordinate(I).zoomTo(0)}),C=s.getCoordinatesCenter(D),E=4096,A=D.map(function(J){var I=J.zoomTo(C.zoom);return new t(Math.round((I.column-C.column)*E),Math.round((I.row-C.row)*E))}),H=F.painter.gl,G=32767,B=new Int16Array([A[0].x,A[0].y,0,0,A[1].x,A[1].y,G,0,A[3].x,A[3].y,0,G,A[2].x,A[2].y,G,G]);this.tile=new w,this.tile.buckets={},this.tile.boundsBuffer=H.createBuffer(),H.bindBuffer(H.ARRAY_BUFFER,this.tile.boundsBuffer),H.bufferData(H.ARRAY_BUFFER,B,H.STATIC_DRAW),this.center=C},loaded:function(){return this.image&&this.image.complete},update:function(){},reload:function(){},render:function(D,B){if(this._loaded&&this.loaded()){var A=this.center;this.tile.calculateMatrices(A.zoom,A.column,A.row,this.map.transform,B);var C=B.gl;this.tile.texture?(C.bindTexture(C.TEXTURE_2D,this.tile.texture),C.texSubImage2D(C.TEXTURE_2D,0,0,0,C.RGBA,C.UNSIGNED_BYTE,this.image)):(this.tile.texture=C.createTexture(),C.bindTexture(C.TEXTURE_2D,this.tile.texture),C.texParameteri(C.TEXTURE_2D,C.TEXTURE_WRAP_S,C.CLAMP_TO_EDGE),C.texParameteri(C.TEXTURE_2D,C.TEXTURE_WRAP_T,C.CLAMP_TO_EDGE),C.texParameteri(C.TEXTURE_2D,C.TEXTURE_MIN_FILTER,C.LINEAR),C.texParameteri(C.TEXTURE_2D,C.TEXTURE_MAG_FILTER,C.LINEAR),C.texImage2D(C.TEXTURE_2D,0,C.RGBA,C.RGBA,C.UNSIGNED_BYTE,this.image)),B.drawLayers(D,this.tile.posMatrix,this.tile)}},featuresAt:function(C,B,A){return A(null,[])}})},{"../geo/lng_lat":20,"../util/ajax":94,"../util/evented":100,"../util/util":106,"./tile":44,"point-geometry":137}],42:[function(p,o,r){function u(z){t.extend(this,t.pick(z,["url","tileSize"])),q._loadTileJSON.call(this,z)}var t=p("../util/util"),v=p("../util/ajax"),w=p("../util/evented"),q=p("./source"),s=p("../util/mapbox").normalizeTileURL;o.exports=u,u.prototype=t.inherit(w,{minzoom:0,maxzoom:22,roundZoom:!0,tileSize:512,_loaded:!1,onAdd:function(z){this.map=z},loaded:function(){return this._pyramid&&this._pyramid.loaded()},update:function(z){this._pyramid&&this._pyramid.update(this.used,z,this.map.style.rasterFadeDuration)},reload:function(){},render:q._renderTiles,_loadTile:function(B){function A(D,C){if(delete B.request,!B.aborted){if(D){return void this.fire("tile.error",{tile:B})}var E=this.map.painter.gl;B.texture=this.map.painter.getTexture(C.width),B.texture?(E.bindTexture(E.TEXTURE_2D,B.texture),E.texSubImage2D(E.TEXTURE_2D,0,0,0,E.RGBA,E.UNSIGNED_BYTE,C)):(B.texture=E.createTexture(),E.bindTexture(E.TEXTURE_2D,B.texture),E.texParameteri(E.TEXTURE_2D,E.TEXTURE_MIN_FILTER,E.LINEAR_MIPMAP_NEAREST),E.texParameteri(E.TEXTURE_2D,E.TEXTURE_MAG_FILTER,E.LINEAR),E.texParameteri(E.TEXTURE_2D,E.TEXTURE_WRAP_S,E.CLAMP_TO_EDGE),E.texParameteri(E.TEXTURE_2D,E.TEXTURE_WRAP_T,E.CLAMP_TO_EDGE),E.texImage2D(E.TEXTURE_2D,0,E.RGBA,E.RGBA,E.UNSIGNED_BYTE,C),B.texture.size=C.width),E.generateMipmap(E.TEXTURE_2D),B.timeAdded=(new Date).getTime(),this.map.animationLoop.set(this.style.rasterFadeDuration),B.source=this,B.loaded=!0,this.fire("tile.load",{tile:B})}}var z=s(B.coord.url(this.tiles),this.url);B.request=v.getImage(z,A.bind(this))},_abortTile:function(z){z.aborted=!0,z.request&&(z.request.abort(),delete z.request)},_addTile:function(z){this.fire("tile.add",{tile:z})},_removeTile:function(z){this.fire("tile.remove",{tile:z})},_unloadTile:function(z){z.texture&&this.map.painter.saveTexture(z.texture)},featuresAt:function(B,A,z){z(null,[])},featuresIn:function(B,A,z){z(null,[])}})},{"../util/ajax":94,"../util/evented":100,"../util/mapbox":103,"../util/util":106,"./source":43}],43:[function(p,o,r){var u=p("../util/util"),w=p("../util/ajax"),t=p("../util/browser"),v=p("./tile_pyramid"),q=p("./tile_coord"),s=p("../util/mapbox").normalizeSourceURL;r._loadTileJSON=function(z){var B=function(C){this._pyramid=new v({index:C,tileSize:this.tileSize,cacheSize:20,minzoom:this.minzoom,maxzoom:this.maxzoom,roundZoom:this.roundZoom,reparseOverscaled:this.reparseOverscaled,load:this._loadTile.bind(this),abort:this._abortTile.bind(this),unload:this._unloadTile.bind(this),add:this._addTile.bind(this),remove:this._removeTile.bind(this),redoPlacement:this._redoTilePlacement?this._redoTilePlacement.bind(this):void 0})}.bind(this),A=function(C,D){return C?void this.fire("error",{error:C}):(u.extend(this,u.pick(D,["tiles","minzoom","maxzoom","attribution"])),void (D.index?w.getJSON(s(D.index),function(E,F){return E?void this.fire("error",{error:E}):(B(F.index),void this.fire("load"))}.bind(this)):(B(),this.fire("load"))))}.bind(this);z.url?w.getJSON(s(z.url),A):t.frame(A.bind(this,null,z))},r._renderTiles=function(D,E){if(this._pyramid){for(var z=this._pyramid.renderedIDs(),H=0;H<z.length;H++){var A=this._pyramid.getTile(z[H]),B=q.fromID(z[H]),G=B.z,I=B.x,C=B.y,F=B.w;G=Math.min(G,this.maxzoom),(A.tileExtent>4096||A.parentId)&&(A.tileExtent=4096),I+=F*(1<<G),A.calculateMatrices(G,I,C,E.transform,E),E.drawTile(A,D)}}},r._vectorFeaturesAt=function(A,C,B){if(!this._pyramid){return B(null,[])}var z=this._pyramid.tileAt(A);return z?void this.dispatcher.send("query features",{uid:z.tile.uid,x:z.x,y:z.y,tileExtent:z.tile.tileExtent,scale:z.scale,source:this.id,params:C},B,z.tile.workerID):B(null,[])},r._vectorFeaturesIn=function(A,C,B){if(!this._pyramid){return B(null,[])}var z=this._pyramid.tilesIn(A);return z?void u.asyncAll(z,function(D,E){this.dispatcher.send("query features",{uid:D.tile.uid,source:this.id,minX:D.minX,maxX:D.maxX,minY:D.minY,maxY:D.maxY,params:C},E,D.tile.workerID)}.bind(this),function(D,E){B(D,Array.prototype.concat.apply([],E))}):B(null,[])},r.create=function(z){var B={vector:p("./vector_tile_source"),raster:p("./raster_tile_source"),geojson:p("./geojson_source"),video:p("./video_source"),image:p("./image_source")};for(var A in B){if(z instanceof B[A]){return z}}return new B[z.type](z)}},{"../util/ajax":94,"../util/browser":95,"../util/mapbox":103,"../util/util":106,"./geojson_source":39,"./image_source":41,"./raster_tile_source":42,"./tile_coord":45,"./tile_pyramid":46,"./vector_tile_source":47,"./video_source":48}],44:[function(r,q,t){function w(z,A){this.coord=z,this.uid=u.uniqueId(),this.loaded=!1,this.uses=0,this.tileSize=A}var v=r("gl-matrix"),p=v.mat2,o=v.mat4,u=r("../util/util"),s=r("../data/buffer/buffer_set");q.exports=w,w.prototype={tileExtent:4096,calculateMatrices:function(A,D,z,C){var B=Math.pow(2,A),E=C.worldSize/B;this.scale=E,this.posMatrix=new Float64Array(16),o.identity(this.posMatrix),o.translate(this.posMatrix,this.posMatrix,[D*E,z*E,0]),o.scale(this.posMatrix,this.posMatrix,[E/this.tileExtent,E/this.tileExtent,1]),o.multiply(this.posMatrix,C.getProjMatrix(),this.posMatrix),this.exMatrix=o.create(),o.ortho(this.exMatrix,0,C.width,C.height,0,0,-1),this.rotationMatrix=p.create(),p.rotate(this.rotationMatrix,this.rotationMatrix,C.angle),this.posMatrix=new Float32Array(this.posMatrix)},positionAt:function(z,A){return z=z.zoomTo(Math.min(this.coord.z,A)),{x:(z.column-this.coord.x)*this.tileExtent,y:(z.row-this.coord.y)*this.tileExtent,scale:this.scale}},loadVectorData:function(z){this.loaded=!0,z&&(this.buffers=new s(z.buffers),this.elementGroups=z.elementGroups,this.tileExtent=z.extent)},reloadSymbolData:function(A,C){if(this.buffers){this.buffers.glyphVertex.destroy(C.gl),this.buffers.glyphElement.destroy(C.gl),this.buffers.iconVertex.destroy(C.gl),this.buffers.iconElement.destroy(C.gl),this.buffers.collisionBoxVertex.destroy(C.gl);var z=new s(A.buffers);this.buffers.glyphVertex=z.glyphVertex,this.buffers.glyphElement=z.glyphElement,this.buffers.iconVertex=z.iconVertex,this.buffers.iconElement=z.iconElement,this.buffers.collisionBoxVertex=z.collisionBoxVertex;for(var B in A.elementGroups){this.elementGroups[B]=A.elementGroups[B]}}},unloadVectorData:function(z){for(var A in this.buffers){this.buffers[A].destroy(z.gl)}this.buffers=null}}},{"../data/buffer/buffer_set":2,"../util/util":106,"gl-matrix":116}],45:[function(q,s,o){function r(w,v,B,z){isNaN(z)&&(z=0),this.z=+w,this.x=+v,this.y=+B,this.w=+z,z*=2,0>z&&(z=-1*z-1);var A=1<<this.z;this.id=32*(A*A*z+A*this.y+this.x)+this.z}function u(w,v){if(w.row>v.row){var z=w;w=v,v=z}return{x0:w.column,y0:w.row,x1:v.column,y1:v.row,dx:v.column-w.column,dy:v.row-w.row}}function t(K,B,w,v,D){var z=Math.max(w,Math.floor(B.y0)),C=Math.min(v,Math.ceil(B.y1));if(K.x0===B.x0&&K.y0===B.y0?K.x0+B.dy/K.dy*K.dx<B.x1:K.x1-B.dy/K.dy*K.dx<B.x0){var M=K;K=B,B=M}for(var E=K.dx/K.dy,I=B.dx/B.dy,A=K.dx>0,G=B.dx<0,H=z;C>H;H++){var F=E*Math.max(0,Math.min(K.dy,H+A-K.y0))+K.x0,J=I*Math.max(0,Math.min(B.dy,H+G-B.y0))+B.x0;D(Math.floor(J),Math.ceil(F),H)}}function p(F,A,w,v,C,z){var B,G=u(F,A),D=u(A,w),E=u(w,F);G.dy>D.dy&&(B=G,G=D,D=B),G.dy>E.dy&&(B=G,G=E,E=B),D.dy>E.dy&&(B=D,D=E,E=B),G.dy&&t(E,G,v,C,z),D.dy&&t(E,D,v,C,z)}s.exports=r,r.prototype.toString=function(){return this.z+"/"+this.x+"/"+this.y},r.fromID=function(w){var v=w%32,C=1<<v,A=(w-v)/32,B=A%C,D=(A-B)/C%C,z=Math.floor(A/(C*C));return z%2!==0&&(z=-1*z-1),z/=2,new r(v,B,D,z)},r.prototype.url=function(w,v){return w[(this.x+this.y)%w.length].replace("{prefix}",(this.x%16).toString(16)+(this.y%16).toString(16)).replace("{z}",Math.min(this.z,v||this.z)).replace("{x}",this.x).replace("{y}",this.y)},r.prototype.parent=function(v){return 0===this.z?null:this.z>v?new r(this.z-1,this.x,this.y,this.w):new r(this.z-1,Math.floor(this.x/2),Math.floor(this.y/2),this.w)},r.prototype.wrapped=function(){return new r(this.z,this.x,this.y,0)},r.prototype.children=function(w){if(this.z>=w){return[new r(this.z+1,this.x,this.y,this.w)]}var v=this.z+1,A=2*this.x,z=2*this.y;return[new r(v,A,z,this.w),new r(v,A+1,z,this.w),new r(v,A,z+1,this.w),new r(v,A+1,z+1,this.w)]},r.cover=function(w,v,B){function z(E,D,H){var G,F,I;if(H>=0&&A>=H){for(G=E;D>G;G++){F=(G%A+A)%A,I=new r(B,F,H,Math.floor(G/A)),C[I.id]=I}}}var A=1<<w,C={};return p(v[0],v[1],v[2],0,A,z),p(v[2],v[3],v[0],0,A,z),Object.keys(C).map(function(D){return C[D]})}},{}],46:[function(p,o,r){function u(z){this.tileSize=z.tileSize,this.minzoom=z.minzoom,this.maxzoom=z.maxzoom,this.roundZoom=z.roundZoom,this.reparseOverscaled=z.reparseOverscaled,this.index=z.index,this._load=z.load,this._abort=z.abort,this._unload=z.unload,this._add=z.add,this._remove=z.remove,this._redoPlacement=z.redoPlacement,this._tiles={},this._cache=new v(z.cacheSize,function(A){return this._unload(A)}.bind(this))}var w=p("./tile"),q=p("./tile_coord"),t=p("point-geometry"),v=p("../util/mru_cache"),s=p("../util/util");o.exports=u,u.prototype={loaded:function(){for(var z in this._tiles){if(!this._tiles[z].loaded){return !1}}return !0},orderedIDs:function(){return Object.keys(this._tiles).sort(function(z,A){return A%32-z%32}).map(function(z){return +z})},renderedIDs:function(){return this.orderedIDs().filter(function(z){return this._tiles[z].loaded&&!this._coveredTiles[z]}.bind(this))},reload:function(){this._cache.reset();for(var z in this._tiles){this._load(this._tiles[z])}},getTile:function(z){return this._tiles[z]},getZoom:function(z){return z.zoom+Math.log(z.tileSize/this.tileSize)/Math.LN2},coveringZoomLevel:function(z){return(this.roundZoom?Math.round:Math.floor)(this.getZoom(z))},coveringTiles:function(A){var C=this.coveringZoomLevel(A),z=C;if(C<this.minzoom){return[]}C>this.maxzoom&&(C=this.maxzoom);var D=A,B=D.locationCoordinate(D.center)._zoomTo(C),E=new t(B.column-0.5,B.row-0.5);return q.cover(C,[D.pointCoordinate(new t(0,0))._zoomTo(C),D.pointCoordinate(new t(D.width,0))._zoomTo(C),D.pointCoordinate(new t(D.width,D.height))._zoomTo(C),D.pointCoordinate(new t(0,D.height))._zoomTo(C)],this.reparseOverscaled?z:C).sort(function(F,G){return E.dist(F)-E.dist(G)})},findLoadedChildren:function(A,D,z){for(var F=!0,C=A.z,G=A.children(this.maxzoom),B=0;B<G.length;B++){var E=G[B].id;this._tiles[E]&&this._tiles[E].loaded?z[E]=!0:(F=!1,D>C&&this.findLoadedChildren(G[B],D,z))}return F},findLoadedParent:function(A,C,z){for(var D=A.z-1;D>=C;D--){A=A.parent(this.maxzoom);var B=this._tiles[A.id];if(B&&B.loaded){return z[A.id]=!0,B}}},update:function(E,G,M){var A,z,B,N=(this.roundZoom?Math.round:Math.floor)(this.getZoom(G)),H=s.clamp(N-10,this.minzoom,this.maxzoom),F=s.clamp(N+1,this.minzoom,this.maxzoom),J={},D=(new Date).getTime();this._coveredTiles={};var C=E?this.coveringTiles(G):[];for(A=0;A<C.length;A++){z=C[A],B=this.addTile(z),J[z.id]=!0,B.loaded||this.findLoadedChildren(z,F,J)||this.findLoadedParent(z,H,J)}for(var K in J){z=q.fromID(K),B=this._tiles[K],B&&B.timeAdded>D-(M||0)&&(this.findLoadedChildren(z,F,J)?(this._coveredTiles[K]=!0,J[K]=!0):this.findLoadedParent(z,H,J))}var I=s.keysDifference(this._tiles,J);for(A=0;A<I.length;A++){this.removeTile(+I[A])}},addTile:function(A){var C=this._tiles[A.id];if(C){return C}var z=A.wrapped();if(C=this._tiles[z.id],C||(C=this._cache.get(z.id),C&&this._redoPlacement&&this._redoPlacement(C)),!C){var D=A.z,B=D>this.maxzoom?Math.pow(2,D-this.maxzoom):1;C=new w(z,this.tileSize*B),this.index&&(C.parentId=this.indexSearch(A.id)),this._load(C)}return C.uses++,this._tiles[A.id]=C,this._add(C,A),C},removeTile:function(z){var A=this._tiles[z];A&&(A.uses--,delete this._tiles[z],this._remove(A),A.uses>0||(A.loaded?this._cache.add(A.coord.wrapped().id,A):(this._abort(A),this._unload(A))))},clearTiles:function(){for(var z in this._tiles){this.removeTile(z)}this._cache.reset()},tileAt:function(A){for(var C=this.orderedIDs(),z=0;z<C.length;z++){var D=this._tiles[C[z]],B=D.positionAt(A,this.maxzoom);if(B&&B.x>=0&&B.x<D.tileExtent&&B.y>=0&&B.y<D.tileExtent){return{tile:D,x:B.x,y:B.y,scale:B.scale}}}},tilesIn:function(A){for(var C=[],z=this.orderedIDs(),D=0;D<z.length;D++){var B=this._tiles[z[D]],E=[B.positionAt(A[0],this.maxzoom),B.positionAt(A[1],this.maxzoom)];E[0].x<B.tileExtent&&E[0].y<B.tileExtent&&E[1].x>=0&&E[1].y>=0&&C.push({tile:B,minX:E[0].x,maxX:E[1].x,minY:E[0].y,maxY:E[1].y})}return C},indexSearch:function(A){for(var D=q.fromID(A),z=[A],F=D;0!==F.z;){F=F.parent(),z.push(F.id)}for(var C,G=this.index,B=z.pop(),E=function(H){return H.id};z.length;){if(A=z.pop(),D=q.fromID(B),C=D.children(this.maxzoom).map(E).indexOf(A),G){if(0===G[C]){B=A;break}if(1===G[C]){B=A;break}B=A,G=G[C]}}return 0===z.length?null:B}}},{"../util/mru_cache":104,"../util/util":106,"./tile":44,"./tile_coord":45,"point-geometry":137}],47:[function(q,t,p){function v(w){if(o.extend(this,o.pick(w,["url","tileSize"])),512!==this.tileSize){throw new Error("vector tile sources must have a tileSize of 512")}u._loadTileJSON.call(this,w)}var o=q("../util/util"),s=q("../util/evented"),u=q("./source"),r=q("./tile_coord");t.exports=v,v.prototype=o.inherit(s,{minzoom:0,maxzoom:22,tileSize:512,reparseOverscaled:!0,_loaded:!1,onAdd:function(w){this.map=w},loaded:function(){return this._pyramid&&this._pyramid.loaded()},update:function(w){this._pyramid&&this._pyramid.update(this.used,w)},reload:function(){this._pyramid&&this._pyramid.reload()},redoPlacement:function(){if(this._pyramid){for(var A=this._pyramid.orderedIDs(),z=0;z<A.length;z++){var w=this._pyramid.getTile(A[z]);this._redoTilePlacement(w)}}},render:u._renderTiles,featuresAt:u._vectorFeaturesAt,featuresIn:u._vectorFeaturesIn,_loadTile:function(A){var z=A.coord.z>this.maxzoom?Math.pow(2,A.coord.z-this.maxzoom):1,w={url:A.coord.url(this.tiles,this.maxzoom),uid:A.uid,coord:A.coord,zoom:A.coord.z,maxZoom:this.maxzoom,tileSize:this.tileSize*z,source:this.id,overscaling:z,angle:this.map.transform.angle,pitch:this.map.transform.pitch,collisionDebug:this.map.collisionDebug,parentId:A.parentId};A.parentId&&(w.url=r.fromID(A.parentId).url(this.tiles,this.maxzoom)),A.workerID?this.dispatcher.send("reload tile",w,this._tileLoaded.bind(this,A),A.workerID):A.workerID=this.dispatcher.send("load tile",w,this._tileLoaded.bind(this,A))},_tileLoaded:function(A,z,w){if(!A.aborted){if(z){return void this.fire("tile.error",{tile:A})}A.loadVectorData(w),A.redoWhenDone&&(A.redoWhenDone=!1,this._redoTilePlacement(A)),this.fire("tile.load",{tile:A}),this.fire("tile.stats",w.bucketStats)}},_abortTile:function(w){w.aborted=!0,this.dispatcher.send("abort tile",{uid:w.uid,source:this.id},null,w.workerID)},_addTile:function(w){this.fire("tile.add",{tile:w})},_removeTile:function(w){this.fire("tile.remove",{tile:w})},_unloadTile:function(w){w.unloadVectorData(this.map.painter),this.glyphAtlas.removeGlyphs(w.uid),this.dispatcher.send("remove tile",{uid:w.uid,source:this.id},null,w.workerID)},_redoTilePlacement:function(z){function w(B,A){z.reloadSymbolData(A,this.map.painter),this.fire("tile.load",{tile:z}),z.redoingPlacement=!1,z.redoWhenDone&&(this._redoTilePlacement(z),z.redoWhenDone=!1)}return !z.loaded||z.redoingPlacement?void (z.redoWhenDone=!0):(z.redoingPlacement=!0,void this.dispatcher.send("redo placement",{uid:z.uid,source:this.id,angle:this.map.transform.angle,pitch:this.map.transform.pitch,collisionDebug:this.map.collisionDebug},w.bind(this),z.workerID))}})},{"../util/evented":100,"../util/util":106,"./source":43,"./tile_coord":45}],48:[function(p,o,r){function q(A){this.coordinates=A.coordinates,v.getVideo(A.urls,function(D,C){if(!D){this.video=C,this.video.loop=!0;var B;this.video.addEventListener("playing",function(){B=this.map.style.animationLoop.set(1/0),this.map._rerender()}.bind(this)),this.video.addEventListener("pause",function(){this.map.style.animationLoop.cancel(B)}.bind(this)),this._loaded=!0,this.map&&(this.video.play(),this.createTile(),this.fire("change"))}}.bind(this))}var s=p("../util/util"),w=p("./tile"),u=p("../geo/lng_lat"),t=p("point-geometry"),z=p("../util/evented"),v=p("../util/ajax");o.exports=q,q.prototype=s.inherit(z,{roundZoom:!0,getVideo:function(){return this.video},onAdd:function(A){this.map=A,this.video&&(this.video.play(),this.createTile())},createTile:function(){var F=this.map,D=this.coordinates.map(function(J){var I=u.convert(J);return F.transform.locationCoordinate(I).zoomTo(0)}),C=s.getCoordinatesCenter(D),E=4096,G=D.map(function(J){var I=J.zoomTo(C.zoom);return new t(Math.round((I.column-C.column)*E),Math.round((I.row-C.row)*E))}),H=F.painter.gl,A=32767,B=new Int16Array([G[0].x,G[0].y,0,0,G[1].x,G[1].y,A,0,G[3].x,G[3].y,0,A,G[2].x,G[2].y,A,A]);this.tile=new w,this.tile.buckets={},this.tile.boundsBuffer=H.createBuffer(),H.bindBuffer(H.ARRAY_BUFFER,this.tile.boundsBuffer),H.bufferData(H.ARRAY_BUFFER,B,H.STATIC_DRAW),this.center=C},loaded:function(){return this.video&&this.video.readyState>=2},update:function(){},reload:function(){},render:function(D,B){if(this._loaded&&!(this.video.readyState<2)){var A=this.center;this.tile.calculateMatrices(A.zoom,A.column,A.row,this.map.transform,B);var C=B.gl;this.tile.texture?(C.bindTexture(C.TEXTURE_2D,this.tile.texture),C.texSubImage2D(C.TEXTURE_2D,0,0,0,C.RGBA,C.UNSIGNED_BYTE,this.video)):(this.tile.texture=C.createTexture(),C.bindTexture(C.TEXTURE_2D,this.tile.texture),C.texParameteri(C.TEXTURE_2D,C.TEXTURE_WRAP_S,C.CLAMP_TO_EDGE),C.texParameteri(C.TEXTURE_2D,C.TEXTURE_WRAP_T,C.CLAMP_TO_EDGE),C.texParameteri(C.TEXTURE_2D,C.TEXTURE_MIN_FILTER,C.LINEAR),C.texParameteri(C.TEXTURE_2D,C.TEXTURE_MAG_FILTER,C.LINEAR),C.texImage2D(C.TEXTURE_2D,0,C.RGBA,C.RGBA,C.UNSIGNED_BYTE,this.video)),B.drawLayers(D,this.tile.posMatrix,this.tile)}},featuresAt:function(C,B,A){return A(null,[])},featuresIn:function(C,B,A){return A(null,[])}})},{"../geo/lng_lat":20,"../util/ajax":94,"../util/evented":100,"../util/util":106,"./tile":44,"point-geometry":137}],49:[function(q,o,t){function v(D){this.self=D,this.actor=new p(D,this),this.loading={},this.loaded={},this.layers=[],this.geoJSONIndexes={}}var p=q("../util/actor"),r=q("./worker_tile"),u=q("../util/util"),A=q("../util/ajax"),B=q("vector-tile"),w=q("pbf"),s=q("./tile_coord"),C=q("geojson-vt"),z=q("./geojson_wrapper");o.exports=function(D){return new v(D)},u.extend(v.prototype,{"set layers":function(D){this.layers=D},"load tile":function(H,G){function F(K,M){if(delete this.loading[I][E],K){return G(K)}if(D.data=new B.VectorTile(new w(new Uint8Array(M))),H.parentId&&D.data.layers){var J=this.getChildPosition(H.coord.id,H.parentId);D.parse(D.data,this.layers,this.actor,G,J.dz,J.xPos,J.yPos)}else{D.parse(D.data,this.layers,this.actor,G)}this.loaded[I]=this.loaded[I]||{},this.loaded[I][E]=D}var I=H.source,E=H.uid;this.loading[I]||(this.loading[I]={});var D=this.loading[I][E]=new r(H);D.xhr=A.getArrayBuffer(H.url,F.bind(this))},"reload tile":function(G,F){var E=this.loaded[G.source],H=G.uid;if(E&&E[H]){var D=E[H];D.parse(D.data,this.layers,this.actor,F)}},"abort tile":function(F){var E=this.loading[F.source],D=F.uid;E&&E[D]&&(E[D].xhr.abort(),delete E[D])},"remove tile":function(F){var E=this.loaded[F.source],D=F.uid;E&&E[D]&&delete E[D]},"redo placement":function(I,H){var F=this.loaded[I.source],J=this.loading[I.source],E=I.uid;if(F&&F[E]){var D=F[E],G=D.redoPlacement(I.angle,I.pitch,I.collisionDebug);G.result&&H(null,G.result,G.transferables)}else{J&&J[E]&&(J[E].angle=I.angle)}},"parse geojson":function(F,E){var D=function(G,H){return G?E(G):(this.geoJSONIndexes[F.source]=C(H,F.geojsonVtOptions),void E(null))}.bind(this);"string"==typeof F.data?A.getJSON(F.data,D):D(null,F.data)},"load geojson tile":function(H,G){var F=H.source,I=H.coord,E=this.geoJSONIndexes[F].getTile(I.z,I.x,I.y);if(!E){return G(null,null)}var D=new r(H);D.parse(new z(E.features),this.layers,this.actor,G),this.loaded[F]=this.loaded[F]||{},this.loaded[F][H.uid]=D},"query features":function(F,E){var D=this.loaded[F.source]&&this.loaded[F.source][F.uid];D?D.featureTree.query(F,E):E(null,[])},getChildPosition:function(I,H){var F=s.fromID(I),J=s.fromID(H),E=F.z-J.z,D=F.x&(1<<E)-1,G=F.y&(1<<E)-1;return{dz:E,xPos:D,yPos:G}}})},{"../util/actor":93,"../util/ajax":94,"../util/util":106,"./geojson_wrapper":40,"./tile_coord":45,"./worker_tile":50,"geojson-vt":111,pbf:136,"vector-tile":144}],50:[function(q,s,p){function u(w){this.coord=w.coord,this.uid=w.uid,this.zoom=w.zoom,this.maxZoom=w.maxZoom,this.tileSize=w.tileSize,this.source=w.source,this.overscaling=w.overscaling,this.angle=w.angle,this.pitch=w.pitch,this.collisionDebug=w.collisionDebug,this.stacks={}}var r=q("../data/feature_tree"),o=q("../symbol/collision_tile"),t=q("../data/buffer/buffer_set"),v=q("../data/create_bucket");s.exports=u,u.prototype.parse=function(ac,K,O,Y,N,R,U){function ag(T,ai,w,S,aj){for(var z=0;z<T.length;z++){var D=T.feature(z);D.dz=w,D.xPos=S,D.yPos=aj;for(var ah in ai){var P=ai[ah];P.filter(D)&&P.features.push(D)}}}function W(w){return function(z){w.dependenciesLoaded=!0,J(I,w,z)}}function J(S,z,P){if((!z.getDependencies||z.dependenciesLoaded)&&(!z.needsPlacement||z.previousPlaced)){if(!P){var w=Date.now();z.features.length&&z.addFeatures(aa);var D=Date.now()-w;if(z.interactive){for(var T=0;T<z.features.length;T++){var ah=z.features[T];S.featureTree.insert(ah.bbox(),z.layers,ah)}}"undefined"!=typeof self&&(self.bucketStats=self.bucketStats||{_total:0},self.bucketStats._total+=D,self.bucketStats[z.id]=(self.bucketStats[z.id]||0)+D),z.features=null}return H--,H?void (z.next&&(z.next.previousPlaced=!0,J(S,z.next))):void ab()}}function ab(){if(I.status="done",I.redoPlacementAfterDone){var D=I.redoPlacement(I.angle,I.pitch).result;V.glyphVertex=D.buffers.glyphVertex,V.iconVertex=D.buffers.iconVertex,V.collisionBoxVertex=D.buffers.collisionBoxVertex}var w=[],z={};for(ad in V){w.push(V[ad].array)}for(ad in af){z[ad]=af[ad].elementGroups}Y(null,{elementGroups:z,buffers:V,extent:A,bucketStats:"undefined"!=typeof self?self.bucketStats:null},w)}this.status="parsing",this.featureTree=new r(this.coord,this.overscaling);var ae,ad,Z,Q,I=this,V=new t,aa=new o(this.angle,this.pitch),af={},G=this.bucketsInOrder=[],F={};for(ae=0;ae<K.length;ae++){if(Z=K[ae],Z.source===this.source&&!Z.ref){var X=Z.minzoom;if(!(X&&this.zoom<X&&X<this.maxZoom)){var C=Z.maxzoom;if(!(C&&this.zoom>=C)){var B=Z.layout.visibility;if("none"!==B){if(Q=v(Z,V,this.zoom,this.overscaling,this.collisionDebug),Q.layers=[Z.id],af[Q.id]=Q,G.push(Q),ac.layers){var M=Z["source-layer"];F[M]||(F[M]={}),F[M][Q.id]=Q}else{F[Q.id]=Q}}}}}}for(ae=0;ae<K.length;ae++){Z=K[ae],Z.source===this.source&&Z.ref&&(Q=af[Z.ref],Q&&Q.layers.push(Z.id))}var A=4096;if(ac.layers){for(ad in F){Z=ac.layers[ad],Z&&(Z.extent&&(A=Z.extent),ag(Z,F[ad],N,R,U))}}else{ag(ac,F)}var E,H=G.length;for(ae=G.length-1;ae>=0;ae--){Q=G[ae],Q.needsPlacement&&(E?E.next=Q:Q.previousPlaced=!0,E=Q),Q.getDependencies&&Q.getDependencies(this,O,W(Q)),Q.needsPlacement||Q.getDependencies||J(I,Q)}},u.prototype.redoPlacement=function(E,H,w){if("done"!==this.status){return this.redoPlacementAfterDone=!0,this.angle=E,{}}for(var C=new t,I=[],z={},A=new o(E,H),F=this.bucketsInOrder,B=F.length-1;B>=0;B--){var G=F[B];"symbol"===G.type&&(G.placeFeatures(A,C,w),z[G.id]=G.elementGroups)}for(var D in C){I.push(C[D].array)}return{result:{elementGroups:z,buffers:C},transferables:I}}},{"../data/buffer/buffer_set":2,"../data/create_bucket":13,"../data/feature_tree":15,"../symbol/collision_tile":68}],51:[function(p,q,o){function r(){this.n=0,this.times=[]}q.exports=r,r.prototype.stopped=function(){return this.times=this.times.filter(function(s){return s.time>=(new Date).getTime()}),!this.times.length},r.prototype.set=function(s){return this.times.push({id:this.n,time:s+(new Date).getTime()}),this.n++},r.prototype.cancel=function(s){this.times=this.times.filter(function(t){return t.id!==s})}},{}],52:[function(p,o,r){function v(A){this.base=A,this.retina=t.devicePixelRatio>1;var z=this.retina?"@2x":"";u.getJSON(s(A,z,".json"),function(C,B){return C?void this.fire("error",{error:C}):(this.data=B,void (this.img&&this.fire("load")))}.bind(this)),u.getImage(s(A,z,".png"),function(D,C){if(D){return void this.fire("error",{error:D})}for(var F=C.getData(),E=C.data=new Uint8Array(F.length),B=0;B<F.length;B+=4){var G=F[B+3]/255;E[B+0]=F[B+0]*G,E[B+1]=F[B+1]*G,E[B+2]=F[B+2]*G,E[B+3]=F[B+3]}this.img=C,this.data&&this.fire("load")}.bind(this))}function q(){}var w=p("../util/evented"),u=p("../util/ajax"),t=p("../util/browser"),s=p("../util/mapbox").normalizeSpriteURL;o.exports=v,v.prototype=Object.create(w),v.prototype.toJSON=function(){return this.base},v.prototype.loaded=function(){return !(!this.data||!this.img)},v.prototype.resize=function(){if(t.devicePixelRatio>1!==this.retina){var z=new v(this.base);z.on("load",function(){this.img=z.img,this.data=z.data,this.retina=z.retina}.bind(this))}},q.prototype={x:0,y:0,width:0,height:0,pixelRatio:1,sdf:!1},v.prototype.getSpritePosition=function(A){if(!this.loaded()){return new q}var z=this.data&&this.data[A];return z&&this.img?z:new q}},{"../util/ajax":94,"../util/browser":95,"../util/evented":100,"../util/mapbox":103}],53:[function(q,r,p){var o=q("./reference");r.exports={},o.layout.forEach(function(v){var u=function(z){for(var t in z){this[t]=z[t]}},w=o[v];for(var s in w){void 0!==w[s]["default"]&&(u.prototype[s]=w[s]["default"])}r.exports[v.replace("layout_","")]=u})},{"./reference":55}],54:[function(q,r,p){var o=q("./reference"),s=q("csscolorparser").parseCSSColor;r.exports={},o.paint.forEach(function(A){var w=function(){},B=o[A];for(var z in B){var v=B[z],u=v["default"];void 0!==u&&("color"===v.type&&(u=s(u)),w.prototype[z]=u)}w.prototype.hidden=!1,r.exports[A.replace("paint_","")]=w})},{"./reference":55,csscolorparser:107}],55:[function(p,q,o){q.exports=p("mapbox-gl-style-spec/reference/latest")},{"mapbox-gl-style-spec/reference/latest":131}],56:[function(u,q,I){function o(M,J){this.animationLoop=J||new r,this.dispatcher=new D(Math.max(H.hardwareConcurrency-1,1),this),this.glyphAtlas=new B(1024,1024),this.spriteAtlas=new t(512,512),this.spriteAtlas.resize(H.devicePixelRatio),this.lineAtlas=new G(256,512),this._layers={},this._order=[],this._groups=[],this.sources={},this.zoomHistory={},p.bindAll(["_forwardSourceEvent","_forwardTileEvent","_redoPlacement"],this);var K=function(R,O){if(R){return void this.fire("error",{error:R})}var Q=z(O);if(Q.length){for(var N=0;N<Q.length;N++){this.fire("error",{error:new Error(Q[N].message)})}}else{this._loaded=!0,this.stylesheet=O;var P=O.sources;for(var S in P){this.addSource(S,P[S])}O.sprite&&(this.sprite=new A(O.sprite),this.sprite.on("load",this.fire.bind(this,"change"))),this.glyphSource=new s(O.glyphs,this.glyphAtlas),this._resolve(),this.fire("load")}}.bind(this);"string"==typeof M?w.getJSON(E(M),K):H.frame(K.bind(this,null,M))}var C=u("../util/evented"),v=u("./style_batch"),F=u("./style_layer"),A=u("./image_sprite"),s=u("../symbol/glyph_source"),B=u("../symbol/glyph_atlas"),t=u("../symbol/sprite_atlas"),G=u("../render/line_atlas"),p=u("../util/util"),w=u("../util/ajax"),E=u("../util/mapbox").normalizeStyleURL,H=u("../util/browser"),D=u("../util/dispatcher"),r=u("./animation_loop"),z=u("mapbox-gl-style-spec/lib/validate/latest");q.exports=o,o.prototype=p.inherit(C,{_loaded:!1,loaded:function(){if(!this._loaded){return !1}for(var J in this.sources){if(!this.sources[J].loaded()){return !1}}return this.sprite&&!this.sprite.loaded()?!1:!0},_resolve:function(){var M,J;this._layers={},this._order=[];for(var K=0;K<this.stylesheet.layers.length;K++){J=new F(this.stylesheet.layers[K]),this._layers[J.id]=J,this._order.push(J.id)}for(M in this._layers){this._layers[M].resolveLayout()}for(M in this._layers){this._layers[M].resolveReference(this._layers),this._layers[M].resolvePaint()}this._groupLayers(),this._broadcastLayers()},_groupLayers:function(){var M;this._groups=[];for(var J=0;J<this._order.length;++J){var K=this._layers[this._order[J]];M&&K.source===M.source||(M=[],M.source=K.source,this._groups.push(M)),M.push(K)}},_broadcastLayers:function(){var K=[];for(var J in this._layers){K.push(this._layers[J].json())}this.dispatcher.broadcast("set layers",K)},_cascade:function(M,J){if(this._loaded){J=J||{transition:!0};for(var K in this._layers){this._layers[K].cascade(M,J,this.stylesheet.transition||{},this.animationLoop)}this.fire("change")}},_recalculate:function(N){for(var K in this.sources){this.sources[K].used=!1}this._updateZoomHistory(N),this.rasterFadeDuration=300;for(K in this._layers){var M=this._layers[K];M.recalculate(N,this.zoomHistory)&&M.source&&(this.sources[M.source].used=!0)}var J=300;Math.floor(this.z)!==Math.floor(N)&&this.animationLoop.set(J),this.z=N,this.fire("zoom")},_updateZoomHistory:function(K){var J=this.zoomHistory;void 0===J.lastIntegerZoom&&(J.lastIntegerZoom=Math.floor(K),J.lastIntegerZoomTime=0,J.lastZoom=K),Math.floor(J.lastZoom)<Math.floor(K)?(J.lastIntegerZoom=Math.floor(K),J.lastIntegerZoomTime=Date.now()):Math.floor(J.lastZoom)>Math.floor(K)&&(J.lastIntegerZoom=Math.floor(K+1),J.lastIntegerZoomTime=Date.now()),J.lastZoom=K},batch:function(J){v(this,J)},addSource:function(K,J){return this.batch(function(M){M.addSource(K,J)}),this},removeSource:function(J){return this.batch(function(K){K.removeSource(J)}),this},getSource:function(J){return this.sources[J]},addLayer:function(K,J){return this.batch(function(M){M.addLayer(K,J)}),this},removeLayer:function(J){return this.batch(function(K){K.removeLayer(J)}),this},getLayer:function(J){return this._layers[J]},getReferentLayer:function(K){var J=this.getLayer(K);return J.ref&&(J=this.getLayer(J.ref)),J},setFilter:function(K,J){return this.batch(function(M){M.setFilter(K,J)}),this},setLayerZoomRange:function(M,J,K){return this.batch(function(N){N.setLayerZoomRange(M,J,K)}),this},getFilter:function(J){return this.getReferentLayer(J).filter},getLayoutProperty:function(K,J){return this.getReferentLayer(K).getLayoutProperty(J)},getPaintProperty:function(M,J,K){return this.getLayer(M).getPaintProperty(J,K)},featuresAt:function(O,K,N){var J=[],M=null;K.layer&&(K.layerIds=Array.isArray(K.layer)?K.layer:[K.layer]),p.asyncEach(Object.keys(this.sources),function(Q,R){var P=this.sources[Q];P.featuresAt(O,K,function(T,S){S&&(J=J.concat(S)),T&&(M=T),R()})}.bind(this),function(){return M?N(M):void N(null,J.filter(function(P){return void 0!==this._layers[P.layer]}.bind(this)).map(function(P){return P.layer=this._layers[P.layer].json(),P}.bind(this)))}.bind(this))},featuresIn:function(O,K,N){var J=[],M=null;K.layer&&(K.layer={id:K.layer}),p.asyncEach(Object.keys(this.sources),function(Q,R){var P=this.sources[Q];P.featuresIn(O,K,function(T,S){S&&(J=J.concat(S)),T&&(M=T),R()})}.bind(this),function(){return M?N(M):void N(null,J.filter(function(P){return void 0!==this._layers[P.layer]}.bind(this)).map(function(P){return P.layer=this._layers[P.layer].json(),P}.bind(this)))}.bind(this))},_remove:function(){this.dispatcher.remove()},_reloadSource:function(J){this.sources[J].reload()},_updateSources:function(K){for(var J in this.sources){this.sources[J].update(K)}},_redoPlacement:function(){for(var J in this.sources){this.sources[J].redoPlacement&&this.sources[J].redoPlacement()}},_forwardSourceEvent:function(J){this.fire("source."+J.type,p.extend({source:J.target},J))},_forwardTileEvent:function(J){this.fire(J.type,p.extend({source:J.target},J))},"get sprite json":function(M,J){var K=this.sprite;K.loaded()?J(null,{sprite:K.data,retina:K.retina}):K.on("load",function(){J(null,{sprite:K.data,retina:K.retina})})},"get icons":function(N,K){var M=this.sprite,J=this.spriteAtlas;M.loaded()?(J.setSprite(M),J.addIcons(N.icons,K)):M.on("load",function(){J.setSprite(M),J.addIcons(N.icons,K)})},"get glyphs":function(K,J){this.glyphSource.getSimpleGlyphs(K.fontstack,K.codepoints,K.uid,J)}})},{"../render/line_atlas":36,"../symbol/glyph_atlas":70,"../symbol/glyph_source":71,"../symbol/sprite_atlas":77,"../util/ajax":94,"../util/browser":95,"../util/dispatcher":97,"../util/evented":100,"../util/mapbox":103,"../util/util":106,"./animation_loop":51,"./image_sprite":52,"./style_batch":57,"./style_layer":60,"mapbox-gl-style-spec/lib/validate/latest":129}],57:[function(p,r,o){function t(w,u){if(!w._loaded){throw new Error("Style is not done loading")}var v=Object.create(t.prototype);v._style=w,v._groupLayers=!1,v._broadcastLayers=!1,v._reloadSources={},v._events=[],v._change=!1,u(v),v._groupLayers&&v._style._groupLayers(),v._broadcastLayers&&v._style._broadcastLayers(),Object.keys(v._reloadSources).forEach(function(z){v._style._reloadSource(z)}),v._events.forEach(function(z){v._style.fire.apply(v._style,z)}),v._change&&v._style.fire("change")}var s=p("../source/source"),q=p("./style_layer");t.prototype={addLayer:function(v,u){if(void 0!==this._style._layers[v.id]){throw new Error("There is already a layer with this ID")}return v instanceof q||(v=new q(v)),this._style._layers[v.id]=v,this._style._order.splice(u?this._style._order.indexOf(u):1/0,0,v.id),v.resolveLayout(),v.resolveReference(this._style._layers),v.resolvePaint(),this._groupLayers=!0,this._broadcastLayers=!0,v.source&&(this._reloadSources[v.source]=!0),this._events.push(["layer.add",{layer:v}]),this._change=!0,this},removeLayer:function(w){var u=this._style._layers[w];if(void 0===u){throw new Error("There is no layer with this ID")}for(var v in this._style._layers){this._style._layers[v].ref===w&&this.removeLayer(v)}return delete this._style._layers[w],this._style._order.splice(this._style._order.indexOf(w),1),this._groupLayers=!0,this._broadcastLayers=!0,this._events.push(["layer.remove",{layer:u}]),this._change=!0,this},setPaintProperty:function(z,u,w,v){return this._style.getLayer(z).setPaintProperty(u,w,v),this._change=!0,this},setLayoutProperty:function(w,u,v){return w=this._style.getReferentLayer(w),w.setLayoutProperty(u,v),this._broadcastLayers=!0,w.source&&(this._reloadSources[w.source]=!0),this._change=!0,this},setFilter:function(v,u){return v=this._style.getReferentLayer(v),v.filter=u,this._broadcastLayers=!0,v.source&&(this._reloadSources[v.source]=!0),this._change=!0,this},setLayerZoomRange:function(z,u,w){var v=this._style.getReferentLayer(z);return null!=u&&(v.minzoom=u),null!=w&&(v.maxzoom=w),this._broadcastLayers=!0,v.source&&(this._reloadSources[v.source]=!0),this._change=!0,this},addSource:function(v,u){if(!this._style._loaded){throw new Error("Style is not done loading")}if(void 0!==this._style.sources[v]){throw new Error("There is already a source with this ID")}return u=s.create(u),this._style.sources[v]=u,u.id=v,u.style=this._style,u.dispatcher=this._style.dispatcher,u.glyphAtlas=this._style.glyphAtlas,u.on("load",this._style._forwardSourceEvent).on("error",this._style._forwardSourceEvent).on("change",this._style._forwardSourceEvent).on("tile.add",this._style._forwardTileEvent).on("tile.load",this._style._forwardTileEvent).on("tile.error",this._style._forwardTileEvent).on("tile.remove",this._style._forwardTileEvent).on("tile.stats",this._style._forwardTileEvent),this._events.push(["source.add",{source:u}]),this._change=!0,this},removeSource:function(v){if(void 0===this._style.sources[v]){throw new Error("There is no source with this ID")}var u=this._style.sources[v];return delete this._style.sources[v],u.off("load",this._style._forwardSourceEvent).off("error",this._style._forwardSourceEvent).off("change",this._style._forwardSourceEvent).off("tile.add",this._style._forwardTileEvent).off("tile.load",this._style._forwardTileEvent).off("tile.error",this._style._forwardTileEvent).off("tile.remove",this._style._forwardTileEvent).off("tile.stats",this._style._forwardTileEvent),this._events.push(["source.remove",{source:u}]),this._change=!0,this}},r.exports=t},{"../source/source":43,"./style_layer":60}],58:[function(s,r,u){function o(B,C){this.type=B.type,this.transitionable=B.transition,null==C&&(C=B["default"]),this.json=JSON.stringify(C),"color"===this.type?this.value=z(C):this.value=C,"interpolated"===B["function"]?this.calculate=q.interpolated(this.value):(this.calculate=q["piecewise-constant"](this.value),B.transition&&(this.calculate=w(this.calculate)))}function w(B){return function(C,D,H){var E,G,J,F=C%1,M=Math.min((Date.now()-D.lastIntegerZoomTime)/H,1),I=1,K=1;return C>D.lastIntegerZoom?(E=F+(1-F)*M,I*=2,G=B(C-1),J=B(C)):(E=1-(1-M)*F,J=B(C),G=B(C+1),I/=2),{from:G,fromScale:I,to:J,toScale:K,t:E}}}function z(B){if(t[B]){return t[B]}if(Array.isArray(B)){return B}if(B.stops){return v.extend({},B,{stops:B.stops.map(function(D){return[D[0],z(D[1])]})})}if("string"==typeof B){var C=A(p(B));return t[B]=C,C}throw new Error("Invalid color "+B)}function A(B){return[B[0]/255,B[1]/255,B[2]/255,B[3]/1]}var p=s("csscolorparser").parseCSSColor,q=s("mapbox-gl-function"),v=s("../util/util");r.exports=o;var t={}},{"../util/util":106,csscolorparser:107,"mapbox-gl-function":128}],59:[function(s,t,q){function r(w){function z(A){this._values={},this._transitions={};for(var B in A){this[B]=A[B]}}return Object.keys(w).forEach(function(B){var A=w[B];Object.defineProperty(z.prototype,B,{set:function(C){this._values[B]=new v(A,C)},get:function(){return this._values[B].value}}),A.transition&&Object.defineProperty(z.prototype,B+"-transition",{set:function(C){this._transitions[B]=C},get:function(){return this._transitions[B]}})}),z.prototype.values=function(){return this._values},z.prototype.transition=function(A,B){var C=this._transitions[A]||{};return{duration:p.coalesce(C.duration,B.duration,300),delay:p.coalesce(C.delay,B.delay,0)}},z.prototype.json=function(){var A={};for(var B in this._values){A[B]=this._values[B].value}for(var C in this._transitions){A[C+"-transition"]=this._transitions[B]}return A},z}var p=s("../util/util"),o=s("./reference"),v=s("./style_declaration"),u={paint:{},layout:{}};o.layer.type.values.forEach(function(w){u.paint[w]=r(o["paint_"+w]),u.layout[w]=r(o["layout_"+w])}),t.exports=function(w,z,A){return new u[w][z](A)}},{"../util/util":106,"./reference":55,"./style_declaration":58}],60:[function(p,o,s){function q(A){this._layer=A,this.id=A.id,this.ref=A.ref,this._resolved={},this._cascaded={},this.assign(A)}function w(K,E){var G=E+"-color",I=E+"-halo-color",B=E+"-outline-color",A=K[G],M=K[I],C=K[B],D=K[E+"-opacity"],H=A&&D*A[3],J=M&&D*M[3],F=C&&D*C[3];void 0!==H&&1>H&&(K[G]=u.premultiply([A[0],A[1],A[2],H])),void 0!==J&&1>J&&(K[I]=u.premultiply([M[0],M[1],M[2],J])),void 0!==F&&1>F&&(K[B]=u.premultiply([C[0],C[1],C[2],F]))}var u=p("../util/util"),t=p("./style_transition"),r=p("./style_declaration_set"),z=p("./layout_properties"),v=p("./paint_properties");o.exports=q,q.prototype={resolveLayout:function(){this.ref||(this.layout=new z[this.type](this._layer.layout),"line"===this.layout["symbol-placement"]&&(this.layout.hasOwnProperty("text-rotation-alignment")||(this.layout["text-rotation-alignment"]="map"),this.layout.hasOwnProperty("icon-rotation-alignment")||(this.layout["icon-rotation-alignment"]="map"),this.layout["symbol-avoid-edges"]=!0))},setLayoutProperty:function(B,A){null==A?delete this.layout[B]:this.layout[B]=A},getLayoutProperty:function(A){return this.layout[A]},resolveReference:function(A){this.ref&&this.assign(A[this.ref])},resolvePaint:function(){for(var B in this._layer){var A=B.match(/^paint(?:\.(.*))?$/);A&&(this._resolved[A[1]||""]=new r("paint",this.type,this._layer[B]))}},setPaintProperty:function(C,B,D){var A=this._resolved[D||""];A||(A=this._resolved[D||""]=new r("paint",this.type,{})),A[C]=B},getPaintProperty:function(B,A){var C=this._resolved[A||""];if(C){return C[B]}},cascade:function(M,E,G,J){for(var B in this._resolved){if(""===B||M[B]){var A=this._resolved[B],N=A.values();for(var C in N){var D=N[C],I=E.transition?this._cascaded[C]:void 0;if(!I||I.declaration.json!==D.json){var K=A.transition(C,G),F=this._cascaded[C]=new t(D,I,K);F.instant()||(F.loopID=J.set(F.endTime-(new Date).getTime())),I&&J.cancel(I.loopID)}}}}if("symbol"===this.type){var H=new r("layout",this.type,this.layout);this._cascaded["text-size"]=new t(H.values()["text-size"],void 0,G),this._cascaded["icon-size"]=new t(H.values()["icon-size"],void 0,G)}},recalculate:function(C,B){var F=this.type,A=this.paint=new v[F];for(var G in this._cascaded){A[G]=this._cascaded[G].at(C,B)}if(this.hidden=this.minzoom&&C<this.minzoom||this.maxzoom&&C>=this.maxzoom||"none"===this.layout.visibility,"symbol"===F?0!==A["text-opacity"]&&this.layout["text-field"]||0!==A["icon-opacity"]&&this.layout["icon-image"]?(w(A,"text"),w(A,"icon")):this.hidden=!0:0===A[F+"-opacity"]?this.hidden=!0:w(A,F),this._cascaded["line-dasharray"]){var E=A["line-dasharray"],D=this._cascaded["line-width"]?this._cascaded["line-width"].at(Math.floor(C),1/0):A["line-width"];E.fromScale*=D,E.toScale*=D}return !this.hidden},assign:function(A){u.extend(this,u.pick(A,["type","source","source-layer","minzoom","maxzoom","filter","layout"]))},json:function(){return u.extend({},this._layer,u.pick(this,["type","source","source-layer","minzoom","maxzoom","filter","layout","paint"]))}}},{"../util/util":106,"./layout_properties":53,"./paint_properties":54,"./style_declaration_set":59,"./style_transition":61}],61:[function(s,t,p){function r(w,v,z){this.declaration=w,this.startTime=this.endTime=(new Date).getTime();var A=w.type;"string"!==A&&"array"!==A||!w.transitionable?this.interp=q[A]:this.interp=u,this.oldTransition=v,this.duration=z.duration||0,this.delay=z.delay||0,this.instant()||(this.endTime=this.startTime+this.duration+this.delay,this.ease=o.easeCubicInOut),v&&v.endTime<=this.startTime&&delete v.oldTransition}function u(w,v,z){return{from:w.to,fromScale:w.toScale,to:v.to,toScale:v.toScale,t:z}}var o=s("../util/util"),q=s("../util/interpolate");t.exports=r,r.prototype.instant=function(){return !this.oldTransition||!this.interp||0===this.duration&&0===this.delay},r.prototype.at=function(z,w,B){var C=this.declaration.calculate(z,w,this.duration);if(this.instant()){return C}if(B=B||Date.now(),B<this.endTime){var A=this.oldTransition.at(z,w,this.startTime),v=this.ease((B-this.startTime-this.delay)/this.duration);C=this.interp(A,C,v)}return C}},{"../util/interpolate":102,"../util/util":106}],62:[function(q,r,p){function o(u,v,w,z){this.x=u,this.y=v,this.angle=w,void 0!==z&&(this.segment=z)}var s=q("point-geometry");r.exports=o,o.prototype=Object.create(s.prototype),o.prototype.clone=function(){return new o(this.x,this.y,this.angle,this.segment)}},{"point-geometry":137}],63:[function(p,q,o){function r(t,s){this.width=t,this.height=s,this.free=[{x:0,y:0,w:t,h:s}]}q.exports=r,r.prototype.release=function(u){for(var t=0;t<this.free.length;t++){var s=this.free[t];if(s.y===u.y&&s.h===u.h&&s.x+s.w===u.x){s.w+=u.w}else{if(s.x===u.x&&s.w===u.w&&s.y+s.h===u.y){s.h+=u.h}else{if(u.y===s.y&&u.h===s.h&&u.x+u.w===s.x){s.x=u.x,s.w+=u.w}else{if(u.x!==s.x||u.w!==s.w||u.y+u.h!==s.y){continue}s.y=u.y,s.h+=u.h}}}return this.free.splice(t,1),void this.release(s)}this.free.push(u)},r.prototype.allocate=function(B,z){for(var v={x:1/0,y:1/0,w:1/0,h:1/0},u=-1,w=0;w<this.free.length;w++){var A=this.free[w];B<=A.w&&z<=A.h&&A.y<=v.y&&A.x<=v.x&&(v=A,u=w)}return 0>u?{x:-1,y:-1}:(this.free.splice(u,1),v.w<v.h?(v.w>B&&this.free.push({x:v.x+B,y:v.y,w:v.w-B,h:z}),v.h>z&&this.free.push({x:v.x,y:v.y+z,w:v.w,h:v.h-z})):(v.w>B&&this.free.push({x:v.x+B,y:v.y,w:v.w-B,h:v.h}),v.h>z&&this.free.push({x:v.x,y:v.y+z,w:B,h:v.h-z})),{x:v.x,y:v.y,w:B,h:z})}},{}],64:[function(p,q,o){function r(F,J,H,v,z){if(void 0===J.segment){return !0}for(var B=J,K=J.segment+1,E=0;E>-H/2;){if(K--,0>K){return !1}E-=F[K].dist(B),B=F[K]}E+=F[K].dist(F[K+1]),K++;for(var A=[],w=0;H/2>E;){var I=F[K-1],G=F[K],D=F[K+1];if(!D){return !1}var C=I.angleTo(G)-G.angleTo(D);for(C=(C+3*Math.PI)%(2*Math.PI)-Math.PI,A.push({distance:E,angleDelta:C}),w+=C;E-A[0].distance>v;){w-=A.shift().angleDelta}if(Math.abs(w)>z){return !1}K++,E+=G.dist(D)}return !0}q.exports=r},{}],65:[function(p,q,o){function s(G,F,A,E,J){for(var C=[],z=0;z<G.length;z++){for(var v,D=G[z],I=0;I<D.length-1;I++){var H=D[I],B=D[I+1];H.x<F&&B.x<F||(H.x<F?H=new r(F,H.y+(B.y-H.y)*((F-H.x)/(B.x-H.x))):B.x<F&&(B=new r(F,H.y+(B.y-H.y)*((F-H.x)/(B.x-H.x)))),H.y<A&&B.y<A||(H.y<A?H=new r(H.x+(B.x-H.x)*((A-H.y)/(B.y-H.y)),A):B.y<A&&(B=new r(H.x+(B.x-H.x)*((A-H.y)/(B.y-H.y)),A)),H.x>=E&&B.x>=E||(H.x>=E?H=new r(E,H.y+(B.y-H.y)*((E-H.x)/(B.x-H.x))):B.x>=E&&(B=new r(E,H.y+(B.y-H.y)*((E-H.x)/(B.x-H.x)))),H.y>=J&&B.y>=J||(H.y>=J?H=new r(H.x+(B.x-H.x)*((J-H.y)/(B.y-H.y)),J):B.y>=J&&(B=new r(H.x+(B.x-H.x)*((J-H.y)/(B.y-H.y)),J)),v&&H.equals(v[v.length-1])||(v=[H],C.push(v)),v.push(B)))))}}return C}var r=p("point-geometry");q.exports=s},{"point-geometry":137}],66:[function(q,r,o){function p(w,v,A,z,B,u){this.anchorPoint=w,this.x1=v,this.y1=A,this.x2=z,this.y2=B,this.maxScale=u,this.placementScale=0,this[0]=this[1]=this[2]=this[3]=0}r.exports=p},{}],67:[function(q,r,o){function t(w,B,H,D,v,I){var z=H.top*D-v,A=H.bottom*D+v,F=H.left*D-v,G=H.right*D+v;if(this.boxes=[],I){var C=A-z,E=G-F;if(0>=C){return}C=Math.max(10*D,C),this._addLineCollisionBoxes(w,B,E,C)}else{this.boxes.push(new p(new s(B.x,B.y),F,z,G,A,1/0))}}var p=q("./collision_box"),s=q("point-geometry");r.exports=t,t.prototype._addLineCollisionBoxes=function(H,M,B,P){var F=P/2,D=Math.floor(B/F),I=-P/2,K=this.boxes,S=M,A=M.segment+1,N=I;do{if(A--,0>A){return K}N-=H[A].dist(S),S=H[A]}while(N>-B/2);for(var w=H[A].dist(H[A+1]),Q=0;D>Q;Q++){for(var O=-B/2+Q*F;O>N+w;){if(N+=w,A++,A+1>=H.length){return K}w=H[A].dist(H[A+1])}var E=O-N,R=H[A],J=H[A+1],G=J.sub(R)._unit()._mult(E)._add(R),z=Math.max(Math.abs(O-I)-F/2,0),T=B/2/z;K.push(new p(G,-P/2,-P/2,P/2,P/2,T))}return K}},{"./collision_box":66,"point-geometry":137}],68:[function(r,s,p){function o(w,u){this.tree=q(),this.angle=w;var z=Math.sin(w),v=Math.cos(w);this.rotationMatrix=[v,-z,z,v],this.yStretch=1/Math.cos(u/180*Math.PI),this.yStretch=Math.pow(this.yStretch,1.3)}var q=r("rbush");s.exports=o,o.prototype.minScale=0.25,o.prototype.maxScale=2,o.prototype.placeCollisionFeature=function(C){for(var Q=this.minScale,O=this.rotationMatrix,K=this.yStretch,G=0;G<C.boxes.length;G++){var J=C.boxes[G],E=J.anchorPoint.matMult(O),D=E.x,N=E.y;J[0]=D+J.x1,J[1]=N+J.y1*K,J[2]=D+J.x2,J[3]=N+J.y2*K;for(var H=this.tree.search(J),P=0;P<H.length;P++){var A=H[P],I=A.anchorPoint.matMult(O),z=(A.x1-J.x2)/(D-I.x),B=(A.x2-J.x1)/(D-I.x),v=(A.y1-J.y2)*K/(N-I.y),F=(A.y2-J.y1)*K/(N-I.y);(isNaN(z)||isNaN(B))&&(z=B=1),(isNaN(v)||isNaN(F))&&(v=F=1);var w=Math.min(Math.max(z,B),Math.max(v,F));if(w>A.maxScale&&(w=A.maxScale),w>J.maxScale&&(w=J.maxScale),w>Q&&w>=A.placementScale&&(Q=w),Q>=this.maxScale){return Q}}}return Q},o.prototype.insertCollisionFeature=function(w,u){for(var z=w.boxes,v=0;v<z.length;v++){z[v].placementScale=u}u<this.maxScale&&this.tree.load(z)}},{rbush:139}],69:[function(r,s,p){function v(F,w,J,H,A,z,B,D){var C=H?0.6*z*B:0,G=Math.max(H?H.right-H.left:0,A?A.right-A.left:0);if(0===F[0].x||4096===F[0].x||0===F[0].y||4096===F[0].y){var I=!0}w/4>w-G*B&&(w=G*B+w/4);var K=2*z,E=I?w/2*D%w:(G/2+K)*B*D%w;return t(F,E,w,C,J,G*B,I,!1)}function t(R,F,D,T,J,I,M,O){for(var N=0,S=F-D,C=[],E=0;E<R.length-1;E++){for(var P=R[E],H=R[E+1],z=P.dist(H),Q=H.angleTo(P);N+z>S+D;){S+=D;var B=(S-N)/z,K=q(P.x,H.x,B),G=q(P.y,H.y,B);if(K>=0&&4096>K&&G>=0&&4096>G){K=Math.round(K),G=Math.round(G);var w=new o(K,G,Q,E);(!T||u(R,w,I,T,J))&&C.push(w)}}N+=z}return O||C.length||M||(C=t(R,N/2,D,T,J,I,M,!0)),C}var q=r("../util/interpolate"),o=r("../symbol/anchor"),u=r("./check_max_angle");s.exports=v},{"../symbol/anchor":62,"../util/interpolate":102,"./check_max_angle":64}],70:[function(p,q,o){function r(v,u){this.width=v,this.height=u,this.bin=new s(v,u),this.index={},this.ids={},this.data=new Uint8Array(v*u)}var s=p("./bin_pack");q.exports=r,r.prototype={get debugfunction(){return"canvas" in this},set debugfunction(u){u&&!this.canvas?(this.canvas=document.createElement("canvas"),this.canvas.width=this.width,this.canvas.height=this.height,document.body.appendChild(this.canvas),this.ctx=this.canvas.getContext("2d")):!u&&this.canvas&&(this.canvas.parentNode.removeChild(this.canvas),delete this.ctx,delete this.canvas)}},r.prototype.getGlyphs=function(){var v,u,A,z={};for(var w in this.ids){v=w.split("#"),u=v[0],A=v[1],z[u]||(z[u]=[]),z[u].push(A)}return z},r.prototype.getRects=function(){var v,u,A,z={};for(var w in this.ids){v=w.split("#"),u=v[0],A=v[1],z[u]||(z[u]={}),z[u][A]=this.index[w]}return z},r.prototype.removeGlyphs=function(D){for(var w in this.ids){var A=this.ids[w],E=A.indexOf(D);if(E>=0&&A.splice(E,1),this.ids[w]=A,!A.length){for(var z=this.index[w],C=this.data,u=0;u<z.h;u++){for(var v=this.width*(z.y+u)+z.x,B=0;B<z.w;B++){C[v+B]=0}}this.dirty=!0,this.bin.release(z),delete this.index[w],delete this.ids[w]}}this.updateTexture(this.gl)},r.prototype.addGlyph=function(N,D,G,P){if(!G){return null}var F=D+"#"+G.id;if(this.index[F]){return this.ids[F].indexOf(N)<0&&this.ids[F].push(N),this.index[F]}if(!G.bitmap){return null}var K=G.width+2*P,v=G.height+2*P,A=1,H=K+2*A,B=v+2*A;H+=4-H%4,B+=4-B%4;var z=this.bin.allocate(H,B);if(z.x<0){return console.warn("glyph bitmap overflow"),{glyph:G,rect:null}}this.index[F]=z,this.ids[F]=[N];for(var I=this.data,w=G.bitmap,M=0;v>M;M++){for(var J=this.width*(z.y+M+A)+z.x+A,O=K*M,C=0;K>C;C++){I[J+C]=w[O+C]}}return this.dirty=!0,z},r.prototype.bind=function(u){this.gl=u,this.texture?u.bindTexture(u.TEXTURE_2D,this.texture):(this.texture=u.createTexture(),u.bindTexture(u.TEXTURE_2D,this.texture),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MAG_FILTER,u.LINEAR),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MIN_FILTER,u.LINEAR),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_WRAP_S,u.CLAMP_TO_EDGE),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_WRAP_T,u.CLAMP_TO_EDGE),u.texImage2D(u.TEXTURE_2D,0,u.ALPHA,this.width,this.height,0,u.ALPHA,u.UNSIGNED_BYTE,null))},r.prototype.updateTexture=function(w){if(this.bind(w),this.dirty){if(w.texSubImage2D(w.TEXTURE_2D,0,0,0,this.width,this.height,w.ALPHA,w.UNSIGNED_BYTE,this.data),this.ctx){for(var v=this.ctx.getImageData(0,0,this.width,this.height),B=0,A=0;B<this.data.length;B++,A+=4){v.data[A]=this.data[B],v.data[A+1]=this.data[B],v.data[A+2]=this.data[B],v.data[A+3]=255}this.ctx.putImageData(v,0,0),this.ctx.strokeStyle="red";for(var z=0;z<this.bin.free.length;z++){var u=this.bin.free[z];this.ctx.strokeRect(u.x,u.y,u.w,u.h)}}this.dirty=!1}}},{"./bin_pack":63}],71:[function(p,o,q){function u(A,B){this.url=A&&s(A),this.glyphAtlas=B,this.stacks=[],this.loading={}}function v(B,D,C){var A=1;this.advance=B.advance,this.left=B.left-C-A,this.top=B.top+C+A,this.rect=D}function r(B,D,C,A){return A=A||"abc",C.replace("{s}",A[B.length%A.length]).replace("{fontstack}",B).replace("{range}",D)}var s=p("../util/mapbox").normalizeGlyphsURL,t=p("../util/ajax").getArrayBuffer,z=p("../util/glyphs"),w=p("pbf");o.exports=u,u.prototype.getSimpleGlyphs=function(Q,J,A,F){void 0===this.stacks[Q]&&(this.stacks[Q]={});for(var E,O={},R=this.stacks[Q],G=this.glyphAtlas,C=3,D={},B=0,P=0;P<J.length;P++){var I=J[P];if(E=Math.floor(I/256),R[E]){var N=R[E].glyphs[I],M=G.addGlyph(A,Q,N,C);N&&(O[I]=new v(N,M,C))}else{void 0===D[E]&&(D[E]=[],B++),D[E].push(I)}}B||F(void 0,O);var H=function(X,S,U){if(!X){for(var T=this.stacks[Q][S]=U.stacks[0],W=0;W<D[S].length;W++){var Z=D[S][W],Y=T.glyphs[Z],V=G.addGlyph(A,Q,Y,C);Y&&(O[Z]=new v(Y,V,C))}}B--,B||F(void 0,O)}.bind(this);for(var K in D){this.loadRange(Q,K,H)}},u.prototype.loadRange=function(D,F,E){if(256*F>65535){return E("gyphs > 65535 not supported")}void 0===this.loading[D]&&(this.loading[D]={});var C=this.loading[D];if(C[F]){C[F].push(E)}else{C[F]=[E];var B=256*F+"-"+(256*F+255),A=r(D,B,this.url);t(A,function(I,J){for(var H=!I&&new z(new w(new Uint8Array(J))),G=0;G<C[F].length;G++){C[F][G](I,F,H)}delete C[F]})}}},{"../util/ajax":94,"../util/glyphs":101,"../util/mapbox":103,pbf:136}],72:[function(p,q,o){q.exports=function(P,C,H){function E(s){J.push(P[s]),R.push(H[s]),A.push(C[s]),M++}function B(v,s,T){var u=O[v];return delete O[v],O[s]=u,R[u][0].pop(),R[u][0]=R[u][0].concat(T[0]),u}function K(v,s,T){var u=S[s];return delete S[s],S[v]=u,R[u][0].shift(),R[u][0]=T[0].concat(R[u][0]),u}function G(v,s,T){var u=T?s[0][s[0].length-1]:s[0][0];return v+":"+u.x+":"+u.y}var D,S={},O={},J=[],R=[],A=[],M=0;for(D=0;D<P.length;D++){var F=H[D],Q=C[D];if(F){if(Q){var N=G(Q,F),z=G(Q,F,!0);if(N in O&&z in S&&O[N]!==S[z]){var I=K(N,z,F),w=B(N,z,R[I]);delete S[N],delete O[z],O[G(Q,R[w],!0)]=w,R[I]=null}else{N in O?B(N,z,F):z in S?K(N,z,F):(E(D),S[N]=M-1,O[z]=M-1)}}else{E(D)}}}return{features:J,textFeatures:A,geometries:R}}},{}],73:[function(s,p,t){function o(H,G,F,B,D,A,z,E,C){this.anchorPoint=H,this.tl=G,this.tr=F,this.bl=B,this.br=D,this.tex=A,this.angle=z,this.minScale=E,this.maxScale=C}function w(G,X,V,K,Q,J){var I=X.image.rect,R=1,O=X.left-R,H=O+I.w,N=X.top-R,F=N+I.h,W=new v(O,N),T=new v(H,N),B=new v(H,F),A=new v(O,F),U=Q["icon-rotate"]*Math.PI/180;if(J){var C=K[G.segment];U+=Math.atan2(G.y-C.y,G.x-C.x)}if(U){var z=Math.sin(U),E=Math.cos(U),D=[E,-z,z,E];W=W.matMult(D),T=T.matMult(D),A=A.matMult(D),B=B.matMult(D)}return[new o(new v(G.x,G.y),W,T,A,B,X.image.rect,0,r,1/0)]}function q(ab,av,aq,ah,am,ag){for(var ad=am["text-rotate"]*Math.PI/180,an=am["text-keep-upright"],aj=av.positionedGlyphs,ac=[],ai=0;ai<aj.length;ai++){var aa=aj[ai],at=aa.glyph,ao=at.rect;if(ao){var J,H=(aa.x+at.advance/2)*aq,ap=r;ag?(J=[],ap=u(J,ab,H,ah,ab.segment,!0),an&&(ap=Math.min(ap,u(J,ab,H,ah,ab.segment,!1)))):J=[{anchorPoint:new v(ab.x,ab.y),offset:0,angle:0,maxScale:1/0,minScale:r}];for(var W=aa.x+at.left,E=aa.y-at.top,Z=W+ao.w,X=E+ao.h,af=new v(W,E),Y=new v(Z,E),ar=new v(W,X),K=new v(Z,X),au=0;au<J.length;au++){var F=J[au],N=af,ak=Y,ae=ar,aw=K,al=F.angle+ad;if(al){var V=Math.sin(al),U=Math.cos(al),T=[U,-V,V,U];N=N.matMult(T),ak=ak.matMult(T),ae=ae.matMult(T),aw=aw.matMult(T)}var R=Math.max(F.minScale,ap),O=(ab.angle+ad+F.offset+2*Math.PI)%(2*Math.PI);ac.push(new o(F.anchorPoint,N,ak,ae,aw,ao,O,R,F.maxScale))}}}return ac}function u(O,K,H,B,E,A){var z=!A;0>H&&(A=!A),A&&E++;var F=new v(K.x,K.y),D=B[E],P=1/0;H=Math.abs(H);for(var C=r;;){var N=F.dist(D),J=H/N,G=Math.atan2(D.y-F.y,D.x-F.x);if(A||(G+=Math.PI),z&&(G+=Math.PI),O.push({anchorPoint:F,offset:z?Math.PI:0,minScale:J,maxScale:P,angle:(G+2*Math.PI)%(2*Math.PI)}),C>=J){break}for(F=D;F.equals(D);){if(E+=A?1:-1,D=B[E],!D){return J}}var I=D.sub(F)._unit();F=F.sub(I._mult(N)),P=J}return C}var v=s("point-geometry");p.exports={getIconQuads:w,getGlyphQuads:q};var r=0.5},{"point-geometry":137}],74:[function(q,r,o){function s(z,w){for(var A=[],v=0,B=z.length;B>v;v++){var u=p(z[v].properties,w["icon-image"]);u&&A.indexOf(u)<0&&A.push(u)}return A}var p=q("../util/token");r.exports=s},{"../util/token":105}],75:[function(q,r,o){function u(D,w,H){for(var z=[],I=[],A=0,G=D.length;G>A;A++){var E=p(D[A].properties,w["text-field"]);if(E){E=E.toString();var B=w["text-transform"];"uppercase"===B?E=E.toLocaleUpperCase():"lowercase"===B&&(E=E.toLocaleLowerCase());for(var C=0,F=E.length;F>C;C++){I.push(E.charCodeAt(C))}z[A]=E}else{z[A]=null}}return I=t(I,H),{textFeatures:z,codepoints:I}}function t(A,z){var v,B=[];A.sort(s);for(var w=0;w<A.length;w++){A[w]!==v&&(v=A[w],z[v]||B.push(A[w]))}return B}function s(w,v){return w-v}var p=q("../util/token");r.exports=u},{"../util/token":105}],76:[function(q,o,v){function u(D,C,F,E){this.codePoint=D,this.x=C,this.y=F,this.glyph=E}function t(D,C,H,F,G,E){this.positionedGlyphs=D,this.text=C,this.top=H,this.bottom=F,this.left=G,this.right=E}function A(S,H,F,M,E,I,P,T,C){for(var G=[],K=new t(G,S,C[1],C[1],C[0],C[0]),O=-17,D=C[0],R=C[1]+O,N=0;N<S.length;N++){var J=S.charCodeAt(N),Q=H[J];Q&&(G.push(new u(J,D,R,Q)),D+=Q.advance+T)}return G.length?(B(K,H,M,F,E,I,P),K):!1}function B(H,Q,N,U,M,R,X){var I=null,J=0,O=0,T=0,W=0,K=H.positionedGlyphs;if(U){for(var G=0;G<K.length;G++){var V=K[G];if(V.x-=J,V.y+=N*T,V.x>U&&null!==I){var S=K[I+1].x;W=Math.max(S,W);for(var F=I+1;G>=F;F++){K[F].y+=N,K[F].x-=S}X&&r(K,Q,O,I-1,X),O=I+1,I=null,J+=S,T++}s[V.codePoint]&&(I=G)}}var E=K[K.length-1],D=E.x+Q[E.codePoint].advance;W=Math.max(W,D);var C=(T+1)*N;r(K,Q,O,K.length-1,X),z(K,X,M,R,W,N,T),H.top+=-R*C,H.bottom=H.top+C,H.left+=-M*W,H.right=H.left+W}function r(E,D,J,H,I){for(var G=D[E[H].codePoint].advance,C=(E[H].x+G)*I,F=J;H>=F;F++){E[F].x-=C}}function z(K,G,E,I,D,H,J){for(var M=(G-E)*D,C=(-I*(J+1)+0.5)*H,F=0;F<K.length;F++){K[F].x+=M,K[F].y+=C}}function w(E,D){if(!E||!E.rect){return null}var J=D["icon-offset"][0],H=D["icon-offset"][1],I=J-E.width/2,G=I+E.width,C=H-E.height/2,F=C+E.height;return new p(E,C,F,I,G)}function p(D,C,G,E,F){this.image=D,this.top=C,this.bottom=G,this.left=E,this.right=F}o.exports={shapeText:A,shapeIcon:w};var s={32:!0}},{}],77:[function(r,s,q){function o(w,v){this.width=w,this.height=v,this.bin=new t(w,v),this.images={},this.data=!1,this.texture=0,this.filter=0,this.pixelRatio=1,this.dirty=!0}function p(K,C,F,D,J,M,v,z,A,B,w){var G,H,I=D*C+F,E=z*M+v;if(w){for(E-=M,H=-1;B>=H;H++,I=((H+B)%B+D)*C+F,E+=M){for(G=-1;A>=G;G++){J[E+G]=K[I+(G+A)%A]}}}else{for(H=0;B>H;H++,I+=C,E+=M){for(G=0;A>G;G++){J[E+G]=K[I+G]}}}}function u(w,v,A,z){this.rect=w,this.width=v,this.height=A,this.sdf=z}var t=r("./bin_pack");s.exports=o,o.prototype={get debugfunction(){return"canvas" in this},set debugfunction(v){v&&!this.canvas?(this.canvas=document.createElement("canvas"),this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio,this.canvas.style.width=this.width+"px",this.canvas.style.width=this.width+"px",document.body.appendChild(this.canvas),this.ctx=this.canvas.getContext("2d")):!v&&this.canvas&&(this.canvas.parentNode.removeChild(this.canvas),delete this.ctx,delete this.canvas)}},o.prototype.resize=function(J){if(this.pixelRatio===J){return !1}var C=this.pixelRatio;if(this.pixelRatio=J,this.canvas&&(this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio),this.data){var E=this.data;this.data=!1,this.allocate(),this.texture=!1;for(var D=this.width*C,I=this.height*C,K=this.width*J,v=this.height*J,z=this.data,A=E,B=0;v>B;B++){for(var w=Math.floor(B*I/v)*D,F=B*K,G=0;K>G;G++){var H=Math.floor(G*D/K);z[F+G]=A[w+H]}}E=null,this.dirty=!0}return this.dirty},o.prototype.allocateImage=function(z,w){var C=2,B=z+C+(4-(z+C)%4),v=w+C+(4-(w+C)%4),A=this.bin.allocate(B,v);return 0===A.w?A:(A.originalWidth=z,A.originalHeight=w,A)},o.prototype.getImage=function(z,w){if(this.images[z]){return this.images[z]}if(!this.sprite){return null}var D=this.sprite.getSpritePosition(z);if(!D.width||!D.height){return null}var B=D.width/D.pixelRatio,v=D.height/D.pixelRatio,A=this.allocateImage(B,v);if(0===A.w){return A}var C=new u(A,B,v,D.sdf);return this.images[z]=C,this.copy(A,D,w),C},o.prototype.getPosition=function(z,w){var D=this.getImage(z,w),B=D&&D.rect;if(!B){return null}var v=w?D.width:B.w,A=w?D.height:B.h,C=1;return{size:[v,A],tl:[(B.x+C)/this.width,(B.y+C)/this.height],br:[(B.x+C+v)/this.width,(B.y+C+A)/this.height]}},o.prototype.allocate=function(){if(!this.data){var w=Math.floor(this.width*this.pixelRatio),v=Math.floor(this.height*this.pixelRatio);this.data=new Uint32Array(w*v);for(var z=0;z<this.data.length;z++){this.data[z]=0}}},o.prototype.copy=function(z,w,C){if(this.sprite.img.data){var B=new Uint32Array(this.sprite.img.data.buffer);this.allocate();var v=this.data,A=1;p(B,this.sprite.img.width,w.x,w.y,v,this.width*this.pixelRatio,(z.x+A)*this.pixelRatio,(z.y+A)*this.pixelRatio,w.width,w.height,C),this.dirty=!0}},o.prototype.setSprite=function(v){this.sprite=v},o.prototype.addIcons=function(w,v){for(var z=0;z<w.length;z++){this.getImage(w[z])}v(null,this.images)},o.prototype.bind=function(z,w){var D=!1;this.texture?z.bindTexture(z.TEXTURE_2D,this.texture):(this.texture=z.createTexture(),z.bindTexture(z.TEXTURE_2D,this.texture),z.texParameteri(z.TEXTURE_2D,z.TEXTURE_WRAP_S,z.CLAMP_TO_EDGE),z.texParameteri(z.TEXTURE_2D,z.TEXTURE_WRAP_T,z.CLAMP_TO_EDGE),D=!0);var B=w?z.LINEAR:z.NEAREST;if(B!==this.filter&&(z.texParameteri(z.TEXTURE_2D,z.TEXTURE_MIN_FILTER,B),z.texParameteri(z.TEXTURE_2D,z.TEXTURE_MAG_FILTER,B),this.filter=B),this.dirty&&(this.allocate(),D?z.texImage2D(z.TEXTURE_2D,0,z.RGBA,this.width*this.pixelRatio,this.height*this.pixelRatio,0,z.RGBA,z.UNSIGNED_BYTE,new Uint8Array(this.data.buffer)):z.texSubImage2D(z.TEXTURE_2D,0,0,0,this.width*this.pixelRatio,this.height*this.pixelRatio,z.RGBA,z.UNSIGNED_BYTE,new Uint8Array(this.data.buffer)),this.dirty=!1,this.ctx)){var v=this.ctx.getImageData(0,0,this.width*this.pixelRatio,this.height*this.pixelRatio);v.data.set(new Uint8ClampedArray(this.data.buffer)),this.ctx.putImageData(v,0,0),this.ctx.strokeStyle="red";for(var A=0;A<this.bin.free.length;A++){var C=this.bin.free[A];this.ctx.strokeRect(C.x*this.pixelRatio,C.y*this.pixelRatio,C.w*this.pixelRatio,C.h*this.pixelRatio)}}}},{"./bin_pack":63}],78:[function(p,o,r){var t=p("../util/util"),w=p("../util/interpolate"),s=p("../util/browser"),z=p("../geo/lng_lat"),q=p("../geo/lng_lat_bounds"),v=p("point-geometry"),u=o.exports=function(){};t.extend(u.prototype,{getCenter:function(){return this.transform.center},setCenter:function(A){return this.jumpTo({center:A}),this},panBy:function(B,A){return this.panTo(this.transform.center,t.extend({offset:v.convert(B).mult(-1)},A)),this},panTo:function(B,A){this.stop(),B=z.convert(B),A=t.extend({duration:500,easing:t.ease,offset:[0,0]},A);var D=this.transform,F=v.convert(A.offset).rotate(-D.angle),E=D.point,C=D.project(B).sub(F);return A.noMoveStart||this.fire("movestart"),this._ease(function(G){D.center=D.unproject(E.add(C.sub(E).mult(G))),this.fire("move")},function(){this.fire("moveend")},A),this},getZoom:function(){return this.transform.zoom},setZoom:function(A){return this.jumpTo({zoom:A}),this},zoomTo:function(B,A){this.stop(),A=t.extend({duration:500},A),A.easing=this._updateEasing(A.duration,B,A.easing);var C=this.transform,E=C.center,D=C.zoom;return A.around?E=z.convert(A.around):A.offset&&(E=C.pointLocation(C.centerPoint.add(v.convert(A.offset)))),A.animate===!1&&(A.duration=0),this.zooming||(this.zooming=!0,this.fire("movestart")),this._ease(function(F){C.setZoomAround(w(D,B,F),E),this.fire("move").fire("zoom")},function(){this.ease=null,A.duration>=200&&(this.zooming=!1,this.fire("moveend"))},A),A.duration<200&&(clearTimeout(this._onZoomEnd),this._onZoomEnd=setTimeout(function(){this.zooming=!1,this.fire("moveend")}.bind(this),200)),this},zoomIn:function(A){return this.zoomTo(this.getZoom()+1,A),this},zoomOut:function(A){return this.zoomTo(this.getZoom()-1,A),this},getBearing:function(){return this.transform.bearing},setBearing:function(A){return this.jumpTo({bearing:A}),this},rotateTo:function(B,A){this.stop(),A=t.extend({duration:500,easing:t.ease},A);var C=this.transform,E=this.getBearing(),D=C.center;return A.around?D=z.convert(A.around):A.offset&&(D=C.pointLocation(C.centerPoint.add(v.convert(A.offset)))),B=this._normalizeBearing(B,E),this.rotating=!0,this.fire("movestart"),this._ease(function(F){C.setBearingAround(w(E,B,F),D),this.fire("move").fire("rotate")},function(){this.rotating=!1,this.fire("moveend")},A),this},resetNorth:function(A){return this.rotateTo(0,t.extend({duration:1000},A)),this},snapToNorth:function(A){return Math.abs(this.getBearing())<this.options.bearingSnap?this.resetNorth(A):this},getPitch:function(){return this.transform.pitch},setPitch:function(A){return this.jumpTo({pitch:A}),this},fitBounds:function(H,D){D=t.extend({padding:0,offset:[0,0],maxZoom:1/0},D),H=q.convert(H);var F=v.convert(D.offset),C=this.transform,B=C.project(H.getNorthWest()),A=C.project(H.getSouthEast()),I=A.sub(B),G=(C.width-2*D.padding-2*Math.abs(F.x))/I.x,E=(C.height-2*D.padding-2*Math.abs(F.y))/I.y;return D.center=C.unproject(B.add(A).div(2)),D.zoom=Math.min(C.scaleZoom(C.scale*Math.min(G,E)),D.maxZoom),D.bearing=0,D.linear?this.easeTo(D):this.flyTo(D)},jumpTo:function(B){this.stop();var A=this.transform,C=!1,E=!1,D=!1;return"center" in B&&(A.center=z.convert(B.center)),"zoom" in B&&A.zoom!==+B.zoom&&(C=!0,A.zoom=+B.zoom),"bearing" in B&&A.bearing!==+B.bearing&&(E=!0,A.bearing=+B.bearing),"pitch" in B&&A.pitch!==+B.pitch&&(D=!0,A.pitch=+B.pitch),this.fire("movestart").fire("move"),C&&this.fire("zoom"),E&&this.fire("rotate"),D&&this.fire("pitch"),this.fire("moveend")},easeTo:function(M){this.stop(),M=t.extend({offset:[0,0],duration:500,easing:t.ease},M);var E=this.transform,H=v.convert(M.offset).rotate(-E.angle),C=E.point,B=this.getZoom(),A=this.getBearing(),N=this.getPitch(),J="zoom" in M?+M.zoom:B,F="bearing" in M?this._normalizeBearing(M.bearing,A):A,K="pitch" in M?+M.pitch:N,G=E.zoomScale(J-B),I="center" in M?E.project(z.convert(M.center)).sub(H.div(G)):C,D=z.convert(M.around);return J!==B&&(this.zooming=!0),A!==F&&(this.rotating=!0),this.zooming&&!D&&(D=E.pointLocation(E.centerPoint.add(I.sub(C).div(1-1/G)))),this.fire("movestart"),this._ease(function(O){this.zooming?E.setZoomAround(w(B,J,O),D):E.center=E.unproject(C.add(I.sub(C).mult(O))),this.rotating&&(E.bearing=w(A,F,O)),K!==N&&(E.pitch=w(N,K,O)),this.fire("move"),this.zooming&&this.fire("zoom"),this.rotating&&this.fire("rotate")},function(){this.zooming=!1,this.rotating=!1,this.fire("moveend")},M),this},flyTo:function(I){function V(M){var B=(E*E-ac*ac+(M?-1:1)*C*C*ae*ae)/(2*(M?E:ac)*C*ae);return Math.log(Math.sqrt(B*B+1)-B)}function Z(B){return(Math.exp(B)-Math.exp(-B))/2}function Q(B){return(Math.exp(B)+Math.exp(-B))/2}function P(B){return Z(B)/Q(B)}this.stop(),I=t.extend({offset:[0,0],speed:1.2,curve:1.42,easing:t.ease},I);var K=this.transform,J=v.convert(I.offset),ad=this.getZoom(),W=this.getBearing(),H="center" in I?z.convert(I.center):this.getCenter(),Y="zoom" in I?+I.zoom:ad,ab="bearing" in I?this._normalizeBearing(I.bearing,W):W,R=K.zoomScale(Y-ad),X=K.point,aa=K.project(H).sub(J.div(R)),O=K.worldSize,S=I.curve,G=I.speed,ac=Math.max(K.width,K.height),E=ac/R,ae=aa.sub(X).mag(),C=S*S,D=V(0),F=function(B){return Q(D)/Q(D+S*B)},A=function(B){return ac*((Q(D)*P(D+S*B)-Z(D))/C)/ae},N=(V(1)-D)/S;if(Math.abs(ae)<0.000001){if(Math.abs(ac-E)<0.000001){return this}var U=ac>E?-1:1;N=Math.abs(Math.log(E/ac))/S,A=function(){return 0},F=function(B){return Math.exp(U*S*B)}}return I.duration=1000*N/G,this.zooming=!0,W!==ab&&(this.rotating=!0),this.fire("movestart"),this._ease(function(M){var B=M*N,T=A(B);K.zoom=ad+K.scaleZoom(1/F(B)),K.center=K.unproject(X.add(aa.sub(X).mult(T)),O),ab!==W&&(K.bearing=w(W,ab,M)),this.fire("move").fire("zoom"),ab!==W&&this.fire("rotate")},function(){this.zooming=!1,this.rotating=!1,this.fire("moveend")},I),this},isEasing:function(){return !!this._abortFn},stop:function(){return this._abortFn&&(this._abortFn(),this._finishEase()),this},_ease:function(B,A,C){this._finishFn=A,this._abortFn=s.timed(function(D){B.call(this,C.easing(D)),1===D&&this._finishEase()},C.animate===!1?0:C.duration,this)},_finishEase:function(){delete this._abortFn;var A=this._finishFn;delete this._finishFn,A.call(this)},_normalizeBearing:function(B,A){B=t.wrap(B,-180,180);var C=Math.abs(B-A);return Math.abs(B-360-A)<C&&(B-=360),Math.abs(B+360-A)<C&&(B+=360),B},_updateEasing:function(H,D,F){var C;if(this.ease){var B=this.ease,A=(Date.now()-B.start)/B.duration,I=B.easing(A+0.01)-B.easing(A),G=0.27/Math.sqrt(I*I+0.0001)*0.01,E=Math.sqrt(0.0729-G*G);C=t.bezier(G,E,0.25,1)}else{C=F?t.bezier.apply(t,F):t.ease}return this.ease={start:(new Date).getTime(),to:Math.pow(2,D),duration:H,easing:C},C}})},{"../geo/lng_lat":20,"../geo/lng_lat_bounds":21,"../util/browser":95,"../util/interpolate":102,"../util/util":106,"point-geometry":137}],79:[function(q,r,p){function s(){}var u=q("./control"),t=q("../../util/dom"),o=q("../../util/util");r.exports=s,s.prototype=o.inherit(u,{options:{position:"bottom-right"},onAdd:function(w){var v="mapboxgl-ctrl-attrib",z=this._container=t.create("div",v,w.getContainer());return this._update(),w.on("source.load",this._update.bind(this)),w.on("source.change",this._update.bind(this)),w.on("source.remove",this._update.bind(this)),w.on("moveend",this._updateEditLink.bind(this)),z},_update:function(){var w=[];if(this._map.style){for(var v in this._map.style.sources){var z=this._map.style.sources[v];z.attribution&&w.indexOf(z.attribution)<0&&w.push(z.attribution)}}this._container.innerHTML=w.join(" | "),this._editLink=this._container.getElementsByClassName("mapbox-improve-map")[0],this._updateEditLink()},_updateEditLink:function(){if(this._editLink){var v=this._map.getCenter();this._editLink.href="https://www.mapbox.com/map-feedback/#/"+v.lng+"/"+v.lat+"/"+Math.round(this._map.getZoom()+1)}}})},{"../../util/dom":98,"../../util/util":106,"./control":80}],80:[function(p,q,o){function r(){}q.exports=r,r.prototype={addTo:function(v){this._map=v;var u=this._container=this.onAdd(v);if(this.options&&this.options.position){var s=this.options.position,w=v._controlCorners[s];u.className+=" mapboxgl-ctrl",-1!==s.indexOf("bottom")?w.insertBefore(u,w.firstChild):w.appendChild(u)}return this},remove:function(){return this._container.parentNode.removeChild(this._container),this.onRemove&&this.onRemove(this._map),this._map=null,this}}},{}],81:[function(q,r,p){function u(v){o.setOptions(this,v)}var t=q("./control"),s=q("../../util/dom"),o=q("../../util/util");r.exports=u,u.prototype=o.inherit(t,{options:{position:"top-right"},onAdd:function(v){var A="mapboxgl-ctrl",w=this._container=s.create("div",A+"-group",v.getContainer());this._zoomInButton=this._createButton(A+"-icon "+A+"-zoom-in",v.zoomIn.bind(v)),this._zoomOutButton=this._createButton(A+"-icon "+A+"-zoom-out",v.zoomOut.bind(v)),this._compass=this._createButton(A+"-compass",v.resetNorth.bind(v));var z=this._compassCanvas=s.create("canvas",A+"-compass-canvas",this._compass);return z.style.cssText="width:30px; height:30px;",z.width=52,z.height=52,this._compass.addEventListener("mousedown",this._onCompassDown.bind(this)),this._onCompassMove=this._onCompassMove.bind(this),this._onCompassUp=this._onCompassUp.bind(this),this._compassCtx=z.getContext("2d"),v.on("rotate",this._drawNorth.bind(this)),this._drawNorth(),w},_onCompassDown:function(v){s.disableDrag(),document.addEventListener("mousemove",this._onCompassMove),document.addEventListener("mouseup",this._onCompassUp),this._prevX=v.screenX,v.stopPropagation()},_onCompassMove:function(v){var z=v.screenX,w=2>z?-5:z>window.screen.width-2?5:(z-this._prevX)/4;this._map.setBearing(this._map.getBearing()-w),this._prevX=v.screenX,this._moved=!0,v.preventDefault()},_onCompassUp:function(){document.removeEventListener("mousemove",this._onCompassMove),document.removeEventListener("mouseup",this._onCompassUp),s.enableDrag(),this._moved&&(this._moved=!1,s.suppressClick()),this._map.snapToNorth()},_createButton:function(v,z){var w=s.create("button",v,this._container);return w.addEventListener("click",function(){z()}),w},_drawNorth:function(){var w=20,B=8,z=26,A=this._map.transform.angle+Math.PI/2,v=this._compassCtx;this._compassCanvas.width=this._compassCanvas.width,v.translate(z,z),v.rotate(A),v.beginPath(),v.fillStyle="#000",v.lineTo(0,-B),v.lineTo(-w,0),v.lineTo(0,B),v.fill(),v.beginPath(),v.fillStyle="#bbb",v.moveTo(0,0),v.lineTo(0,B),v.lineTo(w,0),v.lineTo(0,-B),v.fill(),v.beginPath(),v.strokeStyle="#fff",v.lineWidth=4,v.moveTo(0,-B),v.lineTo(0,B),v.stroke()}})},{"../../util/dom":98,"../../util/util":106,"./control":80}],82:[function(q,r,p){function u(v){this._map=v,this._el=v.getCanvasContainer(),this._container=v.getContainer(),o.bindHandlers(this)}var t=q("../../util/dom"),s=q("../../geo/lng_lat_bounds"),o=q("../../util/util");r.exports=u,u.prototype={enable:function(){this._el.addEventListener("mousedown",this._onMouseDown,!1)},disable:function(){this._el.removeEventListener("mousedown",this._onMouseDown)},_onMouseDown:function(v){(v.shiftKey||1===v.which&&1===v.button)&&(document.addEventListener("mousemove",this._onMouseMove,!1),document.addEventListener("keydown",this._onKeyDown,!1),document.addEventListener("mouseup",this._onMouseUp,!1),this._startPos=t.mousePos(this._el,v),this.active=!0)},_onMouseMove:function(C){var B=this._startPos,z=t.mousePos(this._el,C);this._box||(this._box=t.create("div","mapboxgl-boxzoom",this._container),this._container.classList.add("mapboxgl-crosshair"),t.disableDrag(),this._map.fire("boxzoomstart"));var A=Math.min(B.x,z.x),D=Math.max(B.x,z.x),w=Math.min(B.y,z.y),v=Math.max(B.y,z.y);t.setTransform(this._box,"translate("+A+"px,"+w+"px)"),this._box.style.width=D-A+"px",this._box.style.height=v-w+"px"},_onMouseUp:function(A){var z=this._startPos,v=t.mousePos(this._el,A),w=new s(this._map.unproject(z),this._map.unproject(v));this._finish(),this._map.fitBounds(w,{linear:!0}).fire("boxzoomend",{boxZoomBounds:w})},_onKeyDown:function(v){27===v.keyCode&&(this._finish(),this._map.fire("boxzoomcancel"))},_finish:function(){this._box&&(this.active=!1,document.removeEventListener("mousemove",this._onMouseMove,!1),document.removeEventListener("keydown",this._onKeyDown,!1),document.removeEventListener("mouseup",this._onMouseUp,!1),this._container.classList.remove("mapboxgl-crosshair"),this._box.parentNode.removeChild(this._box),this._box=null,t.enableDrag())}}},{"../../geo/lng_lat_bounds":21,"../../util/dom":98,"../../util/util":106}],83:[function(q,r,o){function p(s){this._map=s,this._onDblClick=this._onDblClick.bind(this)}r.exports=p,p.prototype={enable:function(){this._map.on("dblclick",this._onDblClick)},disable:function(){this._map.off("dblclick",this._onDblClick)},_onDblClick:function(s){this._map.zoomTo(Math.round(this._map.getZoom())+1,{around:s.lngLat})}}},{}],84:[function(p,o,r){function q(A){this._map=A,this._el=A.getCanvasContainer(),s.bindHandlers(this)}var z=p("../../util/dom"),s=p("../../util/util");o.exports=q;var t=0.25,v=s.bezier(0,0,t,1),u=3000,w=4000;q.prototype={enable:function(){this._el.addEventListener("mousedown",this._onDown,!1),this._el.addEventListener("touchstart",this._onDown,!1)},disable:function(){this._el.removeEventListener("mousedown",this._onDown),this._el.removeEventListener("touchstart",this._onDown)},_onDown:function(A){this._startPos=this._pos=z.mousePos(this._el,A),this._inertia=[[Date.now(),this._pos]],A.touches?1===A.touches.length&&(document.addEventListener("touchmove",this._onMove,!1),document.addEventListener("touchend",this._onTouchEnd,!1)):(document.addEventListener("mousemove",this._onMove,!1),document.addEventListener("mouseup",this._onMouseUp,!1))},_onMove:function(C){var B=this._map;if(!(B.boxZoom.active||B.dragRotate.active||C.touches&&C.touches.length>1)){this.active=!0;var E=z.mousePos(this._el,C),A=this._inertia,D=Date.now();for(A.push([D,E]);A.length>2&&D-A[0][0]>50;){A.shift()}B.stop(),B.transform.setLocationAtPoint(B.transform.pointLocation(this._pos),E),B.fire("move"),this._pos=E,C.preventDefault()}},_onUp:function(){var E=this._inertia;if(E.length<2){return void this._map.fire("moveend")}var H=E[E.length-1],C=E[0],D=H[1].sub(C[1]),B=(H[0]-C[0])/1000,I=D.mult(t/B),F=I.mag();F>u&&(F=u,I._unit()._mult(F));var A=F/(w*t),G=I.mult(-A/2);this._map.panBy(G,{duration:1000*A,easing:v,noMoveStart:!0}),this.active=!1},_onMouseUp:function(){this._onUp(),document.removeEventListener("mousemove",this._onMove,!1),document.removeEventListener("mouseup",this._onMouseUp,!1)},_onTouchEnd:function(){this._onUp(),document.removeEventListener("touchmove",this._onMove),document.removeEventListener("touchend",this._onTouchEnd)}}},{"../../util/dom":98,"../../util/util":106}],85:[function(r,s,p){function q(v){this._map=v,this._el=v.getCanvasContainer(),o.bindHandlers(this)}var u=r("../../util/dom"),t=r("point-geometry"),o=r("../../util/util");s.exports=q,q.prototype={enable:function(){this._el.addEventListener("contextmenu",this._onContextMenu,!1)},disable:function(){this._el.removeEventListener("contextmenu",this._onContextMenu)},_onContextMenu:function(v){this._map.stop(),this._startPos=this._pos=u.mousePos(this._el,v),document.addEventListener("mousemove",this._onMouseMove,!1),document.addEventListener("mouseup",this._onMouseUp,!1),v.preventDefault()},_onMouseMove:function(E){var B=this._startPos,w=this._pos,z=u.mousePos(this._el,E),A=this._map,F=A.transform.centerPoint,v=B.sub(F),D=v.mag();this.active=!0,A.rotating||(A.fire("movestart"),A.rotating=!0),200>D&&(F=B.add(new t(-200,0)._rotate(v.angle())));var C=w.sub(F).angleWith(z.sub(F))/Math.PI*180;A.transform.bearing=A.getBearing()-C,A.fire("move").fire("rotate"),clearTimeout(this._timeout),this._timeout=setTimeout(this._onTimeout,200),this._pos=z},_onTimeout:function(){var v=this._map;v.rotating=!1,v.snapToNorth(),v.rotating||(v._rerender(),v.fire("moveend"))},_onMouseUp:function(){this.active=!1,document.removeEventListener("mousemove",this._onMouseMove,!1),document.removeEventListener("mouseup",this._onMouseUp,!1)}}},{"../../util/dom":98,"../../util/util":106,"point-geometry":137}],86:[function(q,s,p){function o(u){this._map=u,this._el=u.getCanvasContainer(),this._onKeyDown=this._onKeyDown.bind(this)}s.exports=o;var t=80,r=2;o.prototype={enable:function(){this._el.addEventListener("keydown",this._onKeyDown,!1)},disable:function(){this._el.removeEventListener("keydown",this._onKeyDown)},_onKeyDown:function(v){if(!(v.altKey||v.ctrlKey||v.metaKey)){var u=this._map;switch(v.keyCode){case 61:case 107:case 171:case 187:u.zoomTo(Math.round(u.getZoom())+(v.shiftKey?2:1));break;case 189:case 109:case 173:u.zoomTo(Math.round(u.getZoom())-(v.shiftKey?2:1));break;case 37:v.shiftKey?u.setBearing(u.getBearing()-r):u.panBy([-t,0]);break;case 39:v.shiftKey?u.setBearing(u.getBearing()+r):u.panBy([t,0]);break;case 38:u.panBy([0,-t]);break;case 40:u.panBy([0,t])}}}}},{}],87:[function(q,r,p){function s(u){this._map=u,this._el=u.getCanvasContainer(),o.bindHandlers(this)}var t=q("../../util/dom"),o=q("../../util/util");r.exports=s,s.prototype={enable:function(){this._el.addEventListener("touchstart",this._onStart,!1)},disable:function(){this._el.removeEventListener("touchstart",this._onStart)},_onStart:function(u){if(2===u.touches.length){var w=t.mousePos(this._el,u.touches[0]),v=t.mousePos(this._el,u.touches[1]);this._startVec=w.sub(v),this._startScale=this._map.transform.scale,this._startBearing=this._map.transform.bearing,document.addEventListener("touchmove",this._onMove,!1),document.addEventListener("touchend",this._onEnd,!1)}},_onMove:function(w){if(2===w.touches.length){var B=t.mousePos(this._el,w.touches[0]),z=t.mousePos(this._el,w.touches[1]),D=B.add(z).div(2),C=B.sub(z),v=C.mag()/this._startVec.mag(),u=180*C.angleWith(this._startVec)/Math.PI,A=this._map;A.easeTo({zoom:A.transform.scaleZoom(this._startScale*v),bearing:this._startBearing+u,duration:0,around:A.unproject(D)}),w.preventDefault()}},_onEnd:function(){this._map.snapToNorth(),document.removeEventListener("touchmove",this._onMove),document.removeEventListener("touchend",this._onEnd)}}},{"../../util/dom":98,"../../util/util":106}],88:[function(r,q,s){function w(A){this._map=A,this._el=A.getCanvasContainer(),u.bindHandlers(this)}var z=r("../../util/dom"),t=r("../../util/browser"),u=r("../../util/util");q.exports=w;var p="undefined"!=typeof navigator?navigator.userAgent.toLowerCase():"",v=-1!==p.indexOf("firefox"),o=-1!==p.indexOf("safari")&&-1===p.indexOf("chrom");w.prototype={enable:function(){this._el.addEventListener("wheel",this._onWheel,!1),this._el.addEventListener("mousewheel",this._onWheel,!1)},disable:function(){this._el.removeEventListener("wheel",this._onWheel),this._el.removeEventListener("mousewheel",this._onWheel)},_onWheel:function(C){var B;"wheel"===C.type?(B=C.deltaY,v&&C.deltaMode===window.WheelEvent.DOM_DELTA_PIXEL&&(B/=t.devicePixelRatio),C.deltaMode===window.WheelEvent.DOM_DELTA_LINE&&(B*=40)):"mousewheel"===C.type&&(B=-C.wheelDeltaY,o&&(B/=3));var A=(window.performance||Date).now(),D=A-(this._time||0);this._pos=z.mousePos(this._el,C),this._time=A,0!==B&&B%4.000244140625===0?(this._type="wheel",B=Math.floor(B/4)):0!==B&&Math.abs(B)<4?this._type="trackpad":D>400?(this._type=null,this._lastValue=B,this._timeout=setTimeout(this._onTimeout,40)):this._type||(this._type=Math.abs(D*B)<200?"trackpad":"wheel",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,B+=this._lastValue)),C.shiftKey&&B&&(B/=4),this._type&&this._zoom(-B),C.preventDefault()},_onTimeout:function(){this._type="wheel",this._zoom(-this._lastValue)},_zoom:function(D){var B=this._map,A=2/(1+Math.exp(-Math.abs(D/100)));0>D&&0!==A&&(A=1/A);var E=B.ease?B.ease.to:B.transform.scale,C=B.transform.scaleZoom(E*A);B.zoomTo(C,{duration:0,around:B.unproject(this._pos)})}}},{"../../util/browser":95,"../../util/dom":98,"../../util/util":106}],89:[function(q,r,p){function s(){o.bindAll(["_onHashChange","_updateHash"],this)}r.exports=s;var o=q("../util/util");s.prototype={addTo:function(u){return this._map=u,window.addEventListener("hashchange",this._onHashChange,!1),this._map.on("moveend",this._updateHash),this},remove:function(){return window.removeEventListener("hashchange",this._onHashChange,!1),this._map.off("moveend",this._updateHash),delete this._map,this},_onHashChange:function(){var u=location.hash.replace("#","").split("/");return u.length>=3?(this._map.jumpTo({center:[+u[2],+u[1]],zoom:+u[0],bearing:+(u[3]||0)}),!0):!1},_updateHash:function(){var v=this._map.getCenter(),z=this._map.getZoom(),u=this._map.getBearing(),w=Math.max(0,Math.ceil(Math.log(z)/Math.LN2)),A="#"+Math.round(100*z)/100+"/"+v.lat.toFixed(w)+"/"+v.lng.toFixed(w)+(u?"/"+Math.round(10*u)/10:"");window.history.replaceState("","",A)}}},{"../util/util":106}],90:[function(r,s,q){function t(w){this._map=w,this._el=w.getCanvasContainer();for(var v in p){w[v]=new p[v](w)}o.bindHandlers(this)}var p={scrollZoom:r("./handler/scroll_zoom"),boxZoom:r("./handler/box_zoom"),dragRotate:r("./handler/drag_rotate"),dragPan:r("./handler/drag_pan"),keyboard:r("./handler/keyboard"),doubleClickZoom:r("./handler/dblclick_zoom"),pinch:r("./handler/pinch")},u=r("../util/dom"),o=r("../util/util");s.exports=t,t.prototype={enable:function(){var w=this._map.options,v=this._el;for(var z in p){w[z]&&this._map[z].enable()}v.addEventListener("mousedown",this._onMouseDown,!1),v.addEventListener("mouseup",this._onMouseUp,!1),v.addEventListener("touchstart",this._onTouchStart,!1),v.addEventListener("click",this._onClick,!1),v.addEventListener("mousemove",this._onMouseMove,!1),v.addEventListener("dblclick",this._onDblClick,!1),v.addEventListener("contextmenu",this._onContextMenu,!1)},disable:function(){var w=this._map.options,v=this._el;for(var z in p){w[z]&&this._map[z].disable()}v.removeEventListener("mousedown",this._onMouseDown),v.removeEventListener("mouseup",this._onMouseUp),v.removeEventListener("touchstart",this._onTouchStart),v.removeEventListener("click",this._onClick),v.removeEventListener("mousemove",this._onMouseMove),v.removeEventListener("dblclick",this._onDblClick),v.removeEventListener("contextmenu",this._onContextMenu)},_onMouseDown:function(v){this._startPos=u.mousePos(this._el,v)},_onMouseUp:function(v){!this._contextMenuFired||this._map.dragRotate.active||this._map.dragPan.active||this._fireEvent("contextmenu",v),this._contextMenuFired=null},_onTouchStart:function(v){!v.touches||v.touches.length>1||(this._tapped?(clearTimeout(this._tapped),this._tapped=null,this._fireEvent("dblclick",v)):this._tapped=setTimeout(this._onTimeout,300))},_onTimeout:function(){this._tapped=null},_onMouseMove:function(w){var v=this._map,A=this._el;if(!v.dragPan.active&&!v.dragRotate.active){for(var z=w.toElement||w.target;z&&z!==A;){z=z.parentNode}z===A&&this._fireEvent("mousemove",w)}},_onClick:function(w){var v=u.mousePos(this._el,w);v.equals(this._startPos)&&this._fireEvent("click",w)},_onDblClick:function(v){this._fireEvent("dblclick",v),v.preventDefault()},_onContextMenu:function(){this._contextMenuFired=!0},_fireEvent:function(w,v){var z=u.mousePos(this._el,v);this._map.fire(w,{lngLat:this._map.unproject(z),point:z,originalEvent:v})}}},{"../util/dom":98,"../util/util":106,"./handler/box_zoom":82,"./handler/dblclick_zoom":83,"./handler/drag_pan":84,"./handler/drag_rotate":85,"./handler/keyboard":86,"./handler/pinch":87,"./handler/scroll_zoom":88}],91:[function(w,q,J){var B=w("../util/canvas"),p=w("../util/util"),F=w("../util/browser"),C=w("../util/evented"),E=w("../util/dom"),o=w("../style/style"),r=w("../style/animation_loop"),z=w("../render/painter"),A=w("../geo/transform"),v=w("./hash"),I=w("./interaction"),u=w("./camera"),H=w("../geo/lng_lat"),D=w("../geo/lng_lat_bounds"),G=w("point-geometry"),t=w("./control/attribution"),s=q.exports=function(K){if(K=this.options=p.inherit(this.options,K),this.animationLoop=new r,this.transform=new A(K.minZoom,K.maxZoom),K.maxBounds){var M=D.convert(K.maxBounds);this.transform.lngRange=[M.getWest(),M.getEast()],this.transform.latRange=[M.getSouth(),M.getNorth()]}p.bindAll(["_forwardStyleEvent","_forwardSourceEvent","_forwardLayerEvent","_forwardTileEvent","_onStyleLoad","_onStyleChange","_onSourceAdd","_onSourceRemove","_onSourceUpdate","_onWindowResize","onError","update","render"],this),this._setupContainer(),this._setupPainter(),this.on("move",this.update),this.on("zoom",this.update.bind(this,!0)),this.on("moveend",function(){this.animationLoop.set(300),this._rerender()}.bind(this)),"undefined"!=typeof window&&window.addEventListener("resize",this._onWindowResize,!1),this.interaction=new I(this),K.interactive&&this.interaction.enable(),this._hash=K.hash&&(new v).addTo(this),this._hash&&this._hash._onHashChange()||this.jumpTo(K),this.sources={},this.stacks={},this._classes={},this.resize(),K.classes&&this.setClasses(K.classes),K.style&&this.setStyle(K.style),K.attributionControl&&this.addControl(new t),this.on("style.error",this.onError),this.on("source.error",this.onError),this.on("tile.error",this.onError)};p.extend(s.prototype,C),p.extend(s.prototype,u.prototype),p.extend(s.prototype,{options:{center:[0,0],zoom:0,bearing:0,pitch:0,minZoom:0,maxZoom:20,interactive:!0,scrollZoom:!0,boxZoom:!0,dragRotate:!0,dragPan:!0,keyboard:!0,doubleClickZoom:!0,pinch:!0,bearingSnap:7,hash:!1,attributionControl:!0,failIfMajorPerformanceCaveat:!1,preserveDrawingBuffer:!1},addControl:function(K){return K.addTo(this),this},addClass:function(K,M){this._classes[K]||(this._classes[K]=!0,this.style&&this.style._cascade(this._classes,M))},removeClass:function(K,M){this._classes[K]&&(delete this._classes[K],this.style&&this.style._cascade(this._classes,M))},setClasses:function(M,N){this._classes={};for(var K=0;K<M.length;K++){this._classes[M[K]]=!0}this.style&&this.style._cascade(this._classes,N)},hasClass:function(K){return !!this._classes[K]},getClasses:function(){return Object.keys(this._classes)},resize:function(){var K=0,M=0;return this._container&&(K=this._container.offsetWidth||400,M=this._container.offsetHeight||300),this._canvas.resize(K,M),this.transform.width=K,this.transform.height=M,this.transform._constrain(),this.painter.resize(K,M),this.fire("movestart").fire("move").fire("resize").fire("moveend")},getBounds:function(){return new D(this.transform.pointLocation(new G(0,0)),this.transform.pointLocation(this.transform.size))},project:function(K){return this.transform.locationPoint(H.convert(K))},unproject:function(K){return this.transform.pointLocation(G.convert(K))},featuresAt:function(M,P,K){var O=this.unproject(M).wrap(),N=this.transform.locationCoordinate(O);return this.style.featuresAt(N,P,K),this},featuresIn:function(M,N,K){return"undefined"==typeof K&&(K=N,N=M,M=[G.convert([0,0]),G.convert([this.transform.width,this.transform.height])]),M=M.map(G.convert.bind(G)),M=[new G(Math.min(M[0].x,M[1].x),Math.min(M[0].y,M[1].y)),new G(Math.max(M[0].x,M[1].x),Math.max(M[0].y,M[1].y))].map(this.transform.pointCoordinate.bind(this.transform)),this.style.featuresIn(M,N,K),this},batch:function(K){this.style.batch(K),this.style._cascade(this._classes),this.update(!0)},setStyle:function(K){return this.style&&(this.style.off("load",this._onStyleLoad).off("error",this._forwardStyleEvent).off("change",this._onStyleChange).off("source.add",this._onSourceAdd).off("source.remove",this._onSourceRemove).off("source.load",this._onSourceUpdate).off("source.error",this._forwardSourceEvent).off("source.change",this._onSourceUpdate).off("layer.add",this._forwardLayerEvent).off("layer.remove",this._forwardLayerEvent).off("tile.add",this._forwardTileEvent).off("tile.remove",this._forwardTileEvent).off("tile.load",this.update).off("tile.error",this._forwardTileEvent).off("tile.stats",this._forwardTileEvent)._remove(),this.off("rotate",this.style._redoPlacement),this.off("pitch",this.style._redoPlacement)),K?(K instanceof o?this.style=K:this.style=new o(K,this.animationLoop),this.style.on("load",this._onStyleLoad).on("error",this._forwardStyleEvent).on("change",this._onStyleChange).on("source.add",this._onSourceAdd).on("source.remove",this._onSourceRemove).on("source.load",this._onSourceUpdate).on("source.error",this._forwardSourceEvent).on("source.change",this._onSourceUpdate).on("layer.add",this._forwardLayerEvent).on("layer.remove",this._forwardLayerEvent).on("tile.add",this._forwardTileEvent).on("tile.remove",this._forwardTileEvent).on("tile.load",this.update).on("tile.error",this._forwardTileEvent).on("tile.stats",this._forwardTileEvent),this.on("rotate",this.style._redoPlacement),this.on("pitch",this.style._redoPlacement),this):(this.style=null,this)},addSource:function(K,M){return this.style.addSource(K,M),this},removeSource:function(K){return this.style.removeSource(K),this},getSource:function(K){return this.style.getSource(K)},addLayer:function(K,M){return this.style.addLayer(K,M),this.style._cascade(this._classes),this},removeLayer:function(K){return this.style.removeLayer(K),this.style._cascade(this._classes),this},setFilter:function(K,M){return this.style.setFilter(K,M),this},setLayerZoomRange:function(M,N,K){return this.style.setLayerZoomRange(M,N,K),this},getFilter:function(K){return this.style.getFilter(K)},setPaintProperty:function(M,O,K,N){return this.batch(function(P){P.setPaintProperty(M,O,K,N)}),this},getPaintProperty:function(M,N,K){return this.style.getPaintProperty(M,N,K)},setLayoutProperty:function(M,N,K){return this.batch(function(O){O.setLayoutProperty(M,N,K)}),this},getLayoutProperty:function(K,M){return this.style.getLayoutProperty(K,M)},getContainer:function(){return this._container},getCanvasContainer:function(){return this._canvasContainer},getCanvas:function(){return this._canvas.getElement()},_setupContainer:function(){var M=this.options.container,P=this._container="string"==typeof M?document.getElementById(M):M;P.classList.add("mapboxgl-map");var K=this._canvasContainer=E.create("div","mapboxgl-canvas-container",P);this.options.interactive&&K.classList.add("mapboxgl-interactive"),this._canvas=new B(this,K);var O=E.create("div","mapboxgl-control-container",P),N=this._controlCorners={};["top-left","top-right","bottom-left","bottom-right"].forEach(function(Q){N[Q]=E.create("div","mapboxgl-ctrl-"+Q,O)})},_setupPainter:function(){var K=this._canvas.getWebGLContext({failIfMajorPerformanceCaveat:this.options.failIfMajorPerformanceCaveat,preserveDrawingBuffer:this.options.preserveDrawingBuffer});return K?void (this.painter=new z(K,this.transform)):void console.error("Failed to initialize WebGL")},_contextLost:function(K){K.preventDefault(),this._frameId&&F.cancelFrame(this._frameId)},_contextRestored:function(){this._setupPainter(),this.resize(),this.update()},loaded:function(){return this._styleDirty||this._sourcesDirty?!1:this.style&&!this.style.loaded()?!1:!0},update:function(K){return this.style?(this._styleDirty=this._styleDirty||K,this._sourcesDirty=!0,this._rerender(),this):this},render:function(){return this.style&&this._styleDirty&&(this._styleDirty=!1,this.style._recalculate(this.transform.zoom)),this.style&&this._sourcesDirty&&!this._sourcesDirtyTimeout&&(this._sourcesDirty=!1,this._sourcesDirtyTimeout=setTimeout(function(){this._sourcesDirtyTimeout=null}.bind(this),50),this.style._updateSources(this.transform)),this.painter.render(this.style,{debug:this.debug,vertices:this.vertices,rotating:this.rotating,zooming:this.zooming}),this.fire("render"),this.loaded()&&!this._loaded&&(this._loaded=!0,this.fire("load")),this._frameId=null,this.animationLoop.stopped()||(this._styleDirty=!0),(this._sourcesDirty||this._repaint||!this.animationLoop.stopped())&&this._rerender(),this},remove:function(){return this._hash&&this._hash.remove(),F.cancelFrame(this._frameId),clearTimeout(this._sourcesDirtyTimeout),this.setStyle(null),"undefined"!=typeof window&&window.removeEventListener("resize",this._onWindowResize,!1),this},onError:function(K){console.error(K.error)},_rerender:function(){this.style&&!this._frameId&&(this._frameId=F.frame(this.render))},_forwardStyleEvent:function(K){this.fire("style."+K.type,p.extend({style:K.target},K))},_forwardSourceEvent:function(K){this.fire(K.type,p.extend({style:K.target},K))},_forwardLayerEvent:function(K){this.fire(K.type,p.extend({style:K.target},K))},_forwardTileEvent:function(K){this.fire(K.type,p.extend({style:K.target},K))},_onStyleLoad:function(M){var N=new A,K=this.transform;K.center.lng===N.center.lng&&K.center.lat===N.center.lat&&K.zoom===N.zoom&&K.bearing===N.bearing&&K.pitch===N.pitch&&this.jumpTo(this.style.stylesheet),this.style._cascade(this._classes,{transition:!1}),this._forwardStyleEvent(M)},_onStyleChange:function(K){this.update(!0),this._forwardStyleEvent(K)},_onSourceAdd:function(K){var M=K.source;M.onAdd&&M.onAdd(this),this._forwardSourceEvent(K)},_onSourceRemove:function(K){var M=K.source;M.onRemove&&M.onRemove(this),this._forwardSourceEvent(K)},_onSourceUpdate:function(K){this.update(),this._forwardSourceEvent(K)},_onWindowResize:function(){this.stop().resize().update()}}),p.extendAll(s.prototype,{_debug:!1,get debugfunction(){return this._debug},set debugfunction(K){this._debug=K,this.update()},_collisionDebug:!1,get collisionDebugfunction(){return this._collisionDebug},set collisionDebugfunction(K){this._collisionDebug=K,this.style._redoPlacement()},_repaint:!1,get repaintfunction(){return this._repaint},set repaintfunction(K){this._repaint=K,this.update()},_vertices:!1,get verticesfunction(){return this._vertices},set verticesfunction(K){this._vertices=K,this.update()}})},{"../geo/lng_lat":20,"../geo/lng_lat_bounds":21,"../geo/transform":22,"../render/painter":37,"../style/animation_loop":51,"../style/style":56,"../util/browser":95,"../util/canvas":96,"../util/dom":98,"../util/evented":100,"../util/util":106,"./camera":78,"./control/attribution":79,"./hash":89,"./interaction":90,"point-geometry":137}],92:[function(q,s,p){function v(w){o.setOptions(this,w),o.bindAll(["_updatePosition","_onClickClose"],this)}s.exports=v;var o=q("../util/util"),r=q("../util/evented"),u=q("../util/dom"),t=q("../geo/lng_lat");v.prototype=o.inherit(r,{options:{closeButton:!0,closeOnClick:!0},addTo:function(w){return this._map=w,this._map.on("move",this._updatePosition),this.options.closeOnClick&&this._map.on("click",this._onClickClose),this._update(),this},remove:function(){return this._container&&this._container.parentNode.removeChild(this._container),this._map&&(this._map.off("move",this._updatePosition),this._map.off("click",this._onClickClose),delete this._map),this},getLngLat:function(){return this._lngLat},setLngLat:function(w){return this._lngLat=t.convert(w),this._update(),this},setText:function(w){return this._content=document.createTextNode(w),this._updateContent(),this},setHTML:function(z){this._content=document.createDocumentFragment();var w,A=document.createElement("body");for(A.innerHTML=z;;){if(w=A.firstChild,!w){break}this._content.appendChild(w)}return this._updateContent(),this},_update:function(){this._map&&(this._container||(this._container=u.create("div","mapboxgl-popup",this._map.getContainer()),this._tip=u.create("div","mapboxgl-popup-tip",this._container),this._wrapper=u.create("div","mapboxgl-popup-content",this._container),this.options.closeButton&&(this._closeButton=u.create("button","mapboxgl-popup-close-button",this._wrapper),this._closeButton.innerHTML="&#215;",this._closeButton.addEventListener("click",this._onClickClose))),this._updateContent(),this._updatePosition())},_updateContent:function(){if(this._content&&this._container){for(var w=this._wrapper;w.hasChildNodes();){w.removeChild(w.firstChild)}this.options.closeButton&&w.appendChild(this._closeButton),w.appendChild(this._content)}},_updatePosition:function(){if(this._lngLat&&this._container){var A=this._map.project(this._lngLat).round(),z=this.options.anchor;if(!z){var C=this._container.offsetWidth,D=this._container.offsetHeight;z=A.y<D?["top"]:A.y>this._map.transform.height-D?["bottom"]:[],A.x<C/2?z.push("left"):A.x>this._map.transform.width-C/2&&z.push("right"),z=0===z.length?"bottom":z.join("-"),this.options.anchor=z}var E={top:"translate(-50%,0)","top-left":"translate(0,0)","top-right":"translate(-100%,0)",bottom:"translate(-50%,-100%)","bottom-left":"translate(0,-100%)","bottom-right":"translate(-100%,-100%)",left:"translate(0,-50%)",right:"translate(-100%,-50%)"},B=this._container.classList;for(var w in E){B.remove("mapboxgl-popup-anchor-"+w)}B.add("mapboxgl-popup-anchor-"+z),u.setTransform(this._container,E[z]+" translate("+A.x+"px,"+A.y+"px)")}},_onClickClose:function(){this.remove()}})},{"../geo/lng_lat":20,"../util/dom":98,"../util/evented":100,"../util/util":106}],93:[function(q,r,p){function o(s,u){this.target=s,this.parent=u,this.callbacks={},this.callbackID=0,this.receive=this.receive.bind(this),this.target.addEventListener("message",this.receive,!1)}r.exports=o,o.prototype.receive=function(v){var z,w=v.data;if("<response>"===w.type){z=this.callbacks[w.id],delete this.callbacks[w.id],z(w.error||null,w.data)}else{if("undefined"!=typeof w.id){var u=w.id;this.parent[w.type](w.data,function(A,C,B){this.postMessage({type:"<response>",id:String(u),error:A?String(A):null,data:C},B)}.bind(this))}else{this.parent[w.type](w.data)}}},o.prototype.send=function(w,A,z,v){var u=null;z&&(this.callbacks[u=this.callbackID++]=z),this.postMessage({type:w,id:String(u),data:A},v)},o.prototype.postMessage=function(u,w){try{this.target.postMessage(u,w)}catch(v){this.target.postMessage(u)}}},{}],94:[function(p,q,o){function r(u){var s=document.createElement("a");return s.href=u,s.protocol===document.location.protocol&&s.host===document.location.host}o.getJSON=function(u,s){var v=new XMLHttpRequest;return v.open("GET",u,!0),v.setRequestHeader("Accept","application/json"),v.onerror=function(t){s(t)},v.onload=function(){if(v.status>=200&&v.status<300&&v.response){var w;try{w=JSON.parse(v.response)}catch(t){return s(t)}s(null,w)}else{s(new Error(v.statusText))}},v.send(),v},o.getArrayBuffer=function(u,s){var v=new XMLHttpRequest;return v.open("GET",u,!0),v.responseType="arraybuffer",v.onerror=function(t){s(t)},v.onload=function(){v.status>=200&&v.status<300&&v.response?s(null,v.response):s(new Error(v.statusText))},v.send(),v},o.getImage=function(u,s){return o.getArrayBuffer(u,function(v,z){v&&s(v);var t=new Image;t.onload=function(){s(null,t),(window.URL||window.webkitURL).revokeObjectURL(t.src)};var w=new Blob([new Uint8Array(z)],{type:"image/png"});return t.src=(window.URL||window.webkitURL).createObjectURL(w),t.getData=function(){var B=document.createElement("canvas"),A=B.getContext("2d");return B.width=t.width,B.height=t.height,A.drawImage(t,0,0),A.getImageData(0,0,t.width,t.height).data},t})},o.getVideo=function(v,s){var z=document.createElement("video");z.onloadstart=function(){s(null,z)};for(var u=0;u<v.length;u++){var w=document.createElement("source");r(v[u])||(z.crossOrigin="Anonymous"),w.src=v[u],z.appendChild(w)}return z.getData=function(){return z},z}},{}],95:[function(q,r,p){var o=q("./canvas"),t=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame;p.frame=function(u){return t(u)};var s=window.cancelAnimationFrame||window.mozCancelAnimationFrame||window.webkitCancelAnimationFrame||window.msCancelAnimationFrame;p.cancelFrame=function(u){s(u)},p.timed=function(z,w,v){function B(C){A||(window.performance||(C=Date.now()),C>=u+w?z.call(v,1):(z.call(v,(C-u)/w),p.frame(B)))}if(!w){return z.call(v,1),null}var A=!1,u=window.performance?window.performance.now():Date.now();return p.frame(B),function(){A=!0}},p.supported=function(w){for(var v=([function(){return"undefined"!=typeof window},function(){return"undefined"!=typeof document},function(){return !!(Array.prototype&&Array.prototype.every&&Array.prototype.filter&&Array.prototype.forEach&&Array.prototype.indexOf&&Array.prototype.lastIndexOf&&Array.prototype.map&&Array.prototype.some&&Array.prototype.reduce&&Array.prototype.reduceRight&&Array.isArray)},function(){return !(!Function.prototype||!Function.prototype.bind||!(Object.keys&&Object.create&&Object.getPrototypeOf&&Object.getOwnPropertyNames&&Object.isSealed&&Object.isFrozen&&Object.isExtensible&&Object.getOwnPropertyDescriptor&&Object.defineProperty&&Object.defineProperties&&Object.seal&&Object.freeze&&Object.preventExtensions))},function(){return"JSON" in window&&"parse" in JSON&&"stringify" in JSON},function(){return(new o).supportsWebGLContext(w&&w.failIfMajorPerformanceCaveat||!1)},function(){return"Worker" in window}]),u=0;u<v.length;u++){if(!v[u]()){return !1}}return !0},p.hardwareConcurrency=navigator.hardwareConcurrency||8,Object.defineProperty(p,"devicePixelRatio",{get:function(){return window.devicePixelRatio}})},{"./canvas":96}],96:[function(s,t,q){function o(u,v){this.canvas=document.createElement("canvas"),u&&v&&(this.canvas.style.position="absolute",this.canvas.classList.add("mapboxgl-canvas"),this.canvas.addEventListener("webglcontextlost",u._contextLost.bind(u),!1),this.canvas.addEventListener("webglcontextrestored",u._contextRestored.bind(u),!1),this.canvas.setAttribute("tabindex",0),v.appendChild(this.canvas))}var p=s("../util");t.exports=o,o.prototype.resize=function(v,w){var u=window.devicePixelRatio||1;this.canvas.width=u*v,this.canvas.height=u*w,this.canvas.style.width=v+"px",this.canvas.style.height=w+"px"};var r={antialias:!1,alpha:!0,stencil:!0,depth:!1};o.prototype.getWebGLContext=function(u){return u=p.extend({},u,r),this.canvas.getContext("webgl",u)||this.canvas.getContext("experimental-webgl",u)},o.prototype.supportsWebGLContext=function(u){var v=p.extend({failIfMajorPerformanceCaveat:u},r);return"probablySupportsContext" in this.canvas?this.canvas.probablySupportsContext("webgl",v)||this.canvas.probablySupportsContext("experimental-webgl",v):"supportsContext" in this.canvas?this.canvas.supportsContext("webgl",v)||this.canvas.supportsContext("experimental-webgl",v):!!window.WebGLRenderingContext&&!!this.getWebGLContext(u)},o.prototype.getElement=function(){return this.canvas}},{"../util":106}],97:[function(r,s,q){function p(w,u){this.actors=[],this.currentActor=0;for(var z=0;w>z;z++){var A=new t(r("../../source/worker")),v=new o(A,u);v.name="Worker "+z,this.actors.push(v)}}var o=r("../actor"),t=r("webworkify");s.exports=p,p.prototype={broadcast:function(v,u){for(var w=0;w<this.actors.length;w++){this.actors[w].send(v,u)}},send:function(w,u,z,A,v){return("number"!=typeof A||isNaN(A))&&(A=this.currentActor=(this.currentActor+1)%this.actors.length),this.actors[A].send(w,u,z,v),A},remove:function(){for(var u=0;u<this.actors.length;u++){this.actors[u].target.terminate()}this.actors=[]}}},{"../../source/worker":49,"../actor":93,webworkify:149}],98:[function(q,p,r){function u(B){for(var A=0;A<B.length;A++){if(B[A] in t){return B[A]}}}function z(A){A.preventDefault(),A.stopPropagation(),window.removeEventListener("click",z,!0)}var v=q("point-geometry");r.create=function(C,A,B){var D=document.createElement(C);return A&&(D.className=A),B&&B.appendChild(D),D};var t=document.documentElement.style,o=u(["userSelect","MozUserSelect","WebkitUserSelect","msUserSelect"]),s;r.disableDrag=function(){o&&(s=t[o],t[o]="none")},r.enableDrag=function(){o&&(t[o]=s)};var w=u(["transform","WebkitTransform"]);r.setTransform=function(B,A){B.style[w]=A},r.suppressClick=function(){window.addEventListener("click",z,!0),window.setTimeout(function(){window.removeEventListener("click",z,!0)},0)},r.mousePos=function(C,A){var B=C.getBoundingClientRect();return A=A.touches?A.touches[0]:A,new v(A.clientX-B.left-C.clientLeft,A.clientY-B.top-C.clientTop)}},{"point-geometry":137}],99:[function(p,q,o){q.exports={API_URL:"https://api.mapbox.com",REQUIRE_ACCESS_TOKEN:!0}},{}],100:[function(q,s,p){var o=q("./util"),r={on:function(u,v){return this._events=this._events||{},this._events[u]=this._events[u]||[],this._events[u].push(v),this},off:function(u,w){if(!u){return delete this._events,this}if(!this.listens(u)){return this}if(w){var v=this._events[u].indexOf(w);v>=0&&this._events[u].splice(v,1),this._events[u].length||delete this._events[u]}else{delete this._events[u]}return this},once:function(u,w){var v=function(t){this.off(u,v),w.call(this,t)}.bind(this);return this.on(u,v),this},fire:function(v,z){if(!this.listens(v)){return this}z=o.extend({},z),o.extend(z,{type:v,target:this});for(var w=this._events[v].slice(),u=0;u<w.length;u++){w[u].call(this,z)}return this},listens:function(u){return !(!this._events||!this._events[u])}};s.exports=r},{"./util":106}],101:[function(s,t,q){function p(v,w){this.stacks=v.readFields(r,[],w)}function r(v,A,z){if(1===v){var w=z.readMessage(o,{glyphs:{}});A.push(w)}}function o(v,A,z){if(1===v){A.name=z.readString()}else{if(2===v){A.range=z.readString()}else{if(3===v){var w=z.readMessage(u,{});A.glyphs[w.id]=w}}}}function u(v,z,w){1===v?z.id=w.readVarint():2===v?z.bitmap=w.readBytes():3===v?z.width=w.readVarint():4===v?z.height=w.readVarint():5===v?z.left=w.readSVarint():6===v?z.top=w.readSVarint():7===v&&(z.advance=w.readVarint())}t.exports=p},{}],102:[function(q,r,o){function p(s,u,v){return s*(1-v)+u*v}r.exports=p,p.number=p,p.vec2=function(s,u,v){return[p(s[0],u[0],v),p(s[1],u[1],v)]},p.color=function(s,u,v){return[p(s[0],u[0],v),p(s[1],u[1],v),p(s[2],u[2],v),p(s[3],u[3],v)]},p.array=function(s,u,v){return s.map(function(w,z){return p(w,u[z],v)})}},{}],103:[function(r,s,o){function t(v,u,w){if(w=w||q.ACCESS_TOKEN,!w&&q.REQUIRE_ACCESS_TOKEN){throw new Error("An API access token is required to use Mapbox GL. See https://www.mapbox.com/developers/api/#access-tokens")}if(v=v.replace(/^mapbox:\/\//,q.API_URL+u),v+=-1!==v.indexOf("?")?"&access_token=":"?access_token=",q.REQUIRE_ACCESS_TOKEN){if("s"===w[0]){throw new Error("Use a public access token (pk.*) with Mapbox GL JS, not a secret access token (sk.*). See https://www.mapbox.com/developers/api/#access-tokens")}v+=w}return v}var q=r("./config"),p=r("./browser");s.exports.normalizeStyleURL=function(z,w){if(!z.match(/^mapbox:\/\/styles\//)){return z}var A=z.split("/"),u=A[3],B=A[4],v=A[5]?"/draft":"";return t("mapbox://"+u+"/"+B+v,"/styles/v1/",w)},s.exports.normalizeSourceURL=function(v,u){return v.match(/^mapbox:\/\//)?t(v+".json","/v4/",u)+"&secure":v},s.exports.normalizeGlyphsURL=function(v,u){if(!v.match(/^mapbox:\/\//)){return v}var w=v.split("/")[3];return t("mapbox://"+w+"/{fontstack}/{range}.pbf","/fonts/v1/",u)},s.exports.normalizeSpriteURL=function(B,A,C,w){if(!B.match(/^mapbox:\/\/sprites\//)){return B+A+C}var D=B.split("/"),z=D[3],u=D[4],v=D[5]?"/draft":"";return t("mapbox://"+z+"/"+u+v+"/sprite"+A+C,"/styles/v1/",w)},s.exports.normalizeTileURL=function(v,u){return u&&u.match(/^mapbox:\/\//)?v.replace(/\.((?:png|jpg)\d*)(?=$|\?)/,p.devicePixelRatio>=2?"@2x.$1":".$1"):v}},{"./browser":95,"./config":99}],104:[function(p,q,o){function r(s,u){this.max=s,this.onRemove=u,this.reset()}q.exports=r,r.prototype.reset=function(){for(var s in this.list){this.onRemove(this.list[s])}return this.list={},this.order=[],this},r.prototype.add=function(u,v){if(this.list[u]=v,this.order.push(u),this.order.length>this.max){var s=this.get(this.order[0]);s&&this.onRemove(s)}return this},r.prototype.has=function(s){return s in this.list},r.prototype.keys=function(){return this.order},r.prototype.get=function(s){if(!this.has(s)){return null}var u=this.list[s];return delete this.list[s],this.order.splice(this.order.indexOf(s),1),u}},{}],105:[function(q,r,o){function p(s,t){return t.replace(/{([^{}()\[\]<>$=:;.,^]+)}/g,function(v,u){return u in s?s[u]:""})}r.exports=p},{}],106:[function(q,r,o){var p=q("unitbezier"),s=q("../geo/coordinate");o.easeCubicInOut=function(w){if(0>=w){return 0}if(w>=1){return 1}var u=w*w,v=u*w;return 4*(0.5>w?v:3*(w-u)+v-0.75)},o.bezier=function(A,u,v,w){var z=new p(A,u,v,w);return function(B){return z.solve(B)}},o.ease=o.bezier(0.25,0.1,0.25,1),o.premultiply=function(u){return u[0]*=u[3],u[1]*=u[3],u[2]*=u[3],u},o.clamp=function(w,u,v){return Math.min(v,Math.max(u,w))},o.wrap=function(A,u,v){var w=v-u,z=((A-u)%w+w)%w+u;return z===u?v:z},o.coalesce=function(){for(var v=0;v<arguments.length;v++){var u=arguments[v];if(null!==u&&void 0!==u){return u}}},o.asyncEach=function(B,v,w){function z(){0===--A&&w()}var A=B.length;if(0===A){return w()}for(var u=0;u<B.length;u++){v(B[u],z)}},o.asyncAll=function(B,v,w){var z=B.length,A=new Array(B.length),u=null;B.forEach(function(D,C){v(D,function(F,E){F&&(u=F),A[C]=E,0===--z&&w(u,A)})})},o.keysDifference=function(z,u){var v=[];for(var w in z){w in u||v.push(w)}return v},o.extend=function(z){for(var u=1;u<arguments.length;u++){var v=arguments[u];for(var w in v){z[w]=v[w]}}return z},o.extendAll=function(w,u){for(var v in u){Object.defineProperty(w,v,Object.getOwnPropertyDescriptor(u,v))}return w},o.inherit=function(z,u){var v="function"==typeof z?z.prototype:z,w=Object.create(v);return o.extendAll(w,u),w},o.pick=function(A,u){for(var v={},w=0;w<u.length;w++){var z=u[w];z in A&&(v[z]=A[z])}return v};var t=1;o.uniqueId=function(){return t++},o.throttle=function(D,z,A){var B,C,w,v;return v=function(){B=!1,C&&(w.apply(A,C),C=!1)},w=function(){B?C=arguments:(D.apply(A,arguments),setTimeout(v,z),B=!0)}},o.debounce=function(z,u){var v,w;return function(){w=arguments,clearTimeout(v),v=setTimeout(function(){z.apply(null,w)},u)}},o.bindAll=function(v,u){v.forEach(function(w){u[w]=u[w].bind(u)})},o.bindHandlers=function(v){for(var u in v){"function"==typeof v[u]&&0===u.indexOf("_on")&&(v[u]=v[u].bind(v))}},o.setOptions=function(w,u){w.hasOwnProperty("options")||(w.options=w.options?Object.create(w.options):{});for(var v in u){w.options[v]=u[v]}return w.options},o.getCoordinatesCenter=function(z){for(var F=1/0,v=1/0,B=-(1/0),w=-(1/0),A=0;A<z.length;A++){F=Math.min(F,z[A].column),v=Math.min(v,z[A].row),B=Math.max(B,z[A].column),w=Math.max(w,z[A].row)}var E=B-F,D=w-v,C=Math.max(E,D);return new s((F+B)/2,(v+w)/2,0).zoomTo(Math.floor(-Math.log(C)/Math.LN2))}},{"../geo/coordinate":19,unitbezier:141}],107:[function(r,p,u){function q(B){return B=Math.round(B),0>B?0:B>255?255:B}function s(B){return 0>B?0:B>1?1:B}function t(B){return q("%"===B[B.length-1]?parseFloat(B)/100*255:parseInt(B))}function z(B){return s("%"===B[B.length-1]?parseFloat(B)/100:parseFloat(B))}function A(D,C,B){return 0>B?B+=1:B>1&&(B-=1),1>6*B?D+(C-D)*B*6:1>2*B?C:2>3*B?D+(C-D)*(2/3-B)*6:D}function o(H){var B=H.replace(/ /g,"").toLowerCase();if(B in w){return w[B].slice()}if("#"===B[0]){if(4===B.length){var E=parseInt(B.substr(1),16);return E>=0&&4095>=E?[(3840&E)>>4|(3840&E)>>8,240&E|(240&E)>>4,15&E|(15&E)<<4,1]:null}if(7===B.length){var E=parseInt(B.substr(1),16);return E>=0&&16777215>=E?[(16711680&E)>>16,(65280&E)>>8,255&E,1]:null}return null}var K=B.indexOf("("),N=B.indexOf(")");if(-1!==K&&N+1===B.length){var D=B.substr(0,K),O=B.substr(K+1,N-(K+1)).split(","),C=1;switch(D){case"rgba":if(4!==O.length){return null}C=z(O.pop());case"rgb":return 3!==O.length?null:[t(O[0]),t(O[1]),t(O[2]),C];case"hsla":if(4!==O.length){return null}C=z(O.pop());case"hsl":if(3!==O.length){return null}var F=(parseFloat(O[0])%360+360)%360/360,M=z(O[1]),G=z(O[2]),I=0.5>=G?G*(M+1):G+M-G*M,J=2*G-I;return[q(255*A(J,I,F+1/3)),q(255*A(J,I,F)),q(255*A(J,I,F-1/3)),C];default:return null}}return null}var w={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{u.parseCSSColor=o}catch(v){}},{}],108:[function(q,o,s){function u(z){return function(C,B,A){return"$type"===B?"t"+z+p.indexOf(A):"p["+JSON.stringify(B)+"]"+z+JSON.stringify(A)}}function t(z){var A=u(z);return function(C,D,B){return"$type"===D?A(C,D,B):"typeof(p["+JSON.stringify(D)+"]) === typeof("+JSON.stringify(B)+") && "+A(C,D,B)}}function w(z){return r[z[0]].apply(z,z)}function v(){return !0}var p=["Unknown","Point","LineString","Polygon"],r={"==":u("==="),"!=":u("!=="),">":t(">"),"<":t("<"),"<=":t("<="),">=":t(">="),"in":function(z,A){return"(function(){"+Array.prototype.slice.call(arguments,2).map(function(B){return"if ("+r["=="](z,A,B)+") return true;"}).join("")+"return false;})()"},"!in":function(){return"!("+r["in"].apply(this,arguments)+")"},any:function(){return Array.prototype.slice.call(arguments,1).map(function(z){return"("+w(z)+")"}).join("||")||"false"},all:function(){return Array.prototype.slice.call(arguments,1).map(function(z){return"("+w(z)+")"}).join("&&")||"true"},none:function(){return"!("+r.any.apply(this,arguments)+")"}};o.exports=function(z){if(!z){return v}var A="var p = f.properties || f.tags || {}, t = f.type; return "+w(z)+";";return new Function("f",A)}},{}],109:[function(q,r,p){function t(H,A,M,v,C,K,D,N){if(M/=A,v/=A,D>=M&&v>=N){return H}if(D>v||M>N){return null}for(var w=[],E=0;E<H.length;E++){var I,J,z=H[E],G=z.geometry,F=z.type;if(I=z.min[C],J=z.max[C],I>=M&&v>=J){w.push(z)}else{if(!(I>v||M>J)){var B=1===F?o(G,M,v,C):s(G,M,v,C,K,3===F);B.length&&w.push({geometry:B,type:F,tags:H[E].tags||null,min:z.min,max:z.max})}}}return w.length?w:null}function o(D,E,A,C){for(var v=[],w=0;w<D.length;w++){var z=D[w],B=z[C];B>=E&&A>=B&&v.push(z)}return v}function s(Q,I,D,F,K,C){for(var M=[],E=0;E<Q.length;E++){var G,N,R,S=0,H=0,P=null,O=Q[E],J=O.area,B=O.dist,A=O.length,z=[];for(N=0;A-1>N;N++){G=P||O[N],P=O[N+1],S=H||G[F],H=P[F],I>S?H>D?(z.push(K(G,P,I),K(G,P,D)),C||(z=u(M,z,J,B))):H>=I&&z.push(K(G,P,I)):S>D?I>H?(z.push(K(G,P,D),K(G,P,I)),C||(z=u(M,z,J,B))):D>=H&&z.push(K(G,P,D)):(z.push(G),I>H?(z.push(K(G,P,I)),C||(z=u(M,z,J,B))):H>D&&(z.push(K(G,P,D)),C||(z=u(M,z,J,B))))}G=O[A-1],S=G[F],S>=I&&D>=S&&z.push(G),R=z[z.length-1],C&&R&&(z[0][0]!==R[0]||z[0][1]!==R[1])&&z.push(z[0]),u(M,z,J,B)}return M}function u(z,A,v,w){return A.length&&(A.area=v,A.dist=w,z.push(A)),[]}r.exports=t},{}],110:[function(p,o,q){function w(E,C){var D=[];if("FeatureCollection"===E.type){for(var F=0;F<E.features.length;F++){v(D,E.features[F],C)}}else{"Feature"===E.type?v(D,E,C):v(D,{geometry:E},C)}return D}function v(H,M,C){var D,E,J,G=M.geometry,I=G.type,F=G.coordinates,K=M.properties;if("Point"===I){H.push(r(K,1,[t(F)]))}else{if("MultiPoint"===I){H.push(r(K,1,z(F)))}else{if("LineString"===I){H.push(r(K,2,[z(F,C)]))}else{if("MultiLineString"===I||"Polygon"===I){for(J=[],D=0;D<F.length;D++){J.push(z(F[D],C))}H.push(r(K,"Polygon"===I?3:2,J))}else{if("MultiPolygon"===I){for(J=[],D=0;D<F.length;D++){for(E=0;E<F[D].length;E++){J.push(z(F[D][E],C))}}H.push(r(K,3,J))}else{if("GeometryCollection"!==I){throw new Error("Input data is not a valid GeoJSON object.")}for(D=0;D<G.geometries.length;D++){v(H,{geometry:G.geometries[D],properties:K},C)}}}}}}}function r(E,C,D){var F={geometry:D,type:C,tags:E||null,min:[2,1],max:[-1,0]};return s(F),F}function z(E,C){for(var D=[],F=0;F<E.length;F++){D.push(t(E[F]))}return C&&(B(D,C),u(D)),D}function t(E){var C=Math.sin(E[1]*Math.PI/180),D=E[0]/360+0.5,F=0.5-0.25*Math.log((1+C)/(1-C))/Math.PI;return F=-1>F?-1:F>1?1:F,[D,F,0]}function u(F){for(var D,E,G=0,H=0,C=0;C<F.length-1;C++){D=E||F[C],E=F[C+1],G+=D[0]*E[1]-E[0]*D[1],H+=Math.abs(E[0]-D[0])+Math.abs(E[1]-D[1])}F.area=Math.abs(G/2),F.dist=H}function s(E){var C=E.geometry,D=E.min,F=E.max;if(1===E.type){A(D,F,C)}else{for(var G=0;G<C.length;G++){A(D,F,C[G])}}return E}function A(E,C,D){for(var F,G=0;G<D.length;G++){F=D[G],E[0]=Math.min(F[0],E[0]),C[0]=Math.max(F[0],C[0]),E[1]=Math.min(F[1],E[1]),C[1]=Math.max(F[1],C[1])}}o.exports=w;var B=p("./simplify")},{"./simplify":112}],111:[function(v,r,w){function E(G,F){return new q(G,F)}function q(H,G){G=this.options=A(Object.create(this.options),G);var F=G.debug;F&&console.time("preprocess data");var I=1<<G.maxZoom,J=B(H,G.tolerance/(I*G.extent));this.tiles={},this.tileCoords=[],F&&(console.timeEnd("preprocess data"),console.log("index: maxZoom: %d, maxPoints: %d",G.indexMaxZoom,G.indexMaxPoints),console.time("generate tiles"),this.stats={},this.total=0),J=p(J,G.buffer/G.extent,D),J.length&&this.splitTile(J,0,0,0),F&&(J.length&&console.log("features: %d, points: %d",this.tiles[0].numFeatures,this.tiles[0].numPoints),console.timeEnd("generate tiles"),console.log("tiles generated:",this.total,JSON.stringify(this.stats)))}function z(H,G,F){return 32*((1<<H)*F+G)+H}function D(H,G,F){return[F,(F-H[0])*(G[1]-H[1])/(G[0]-H[0])+H[1],1]}function C(H,G,F){return[(F-H[1])*(G[0]-H[0])/(G[1]-H[1])+H[0],F,1]}function A(H,G){for(var F in G){H[F]=G[F]}return H}function o(K,H,G){var M=K.source;if(1!==M.length){return !1}var N=M[0];if(3!==N.type||N.geometry.length>1){return !1}var J=N.geometry[0].length;if(5!==J){return !1}for(var I=0;J>I;I++){var F=t.point(N.geometry[0][I],H,K.z2,K.x,K.y);if(F[0]!==-G&&F[0]!==H+G||F[1]!==-G&&F[1]!==H+G){return !1}}return !0}r.exports=E;var B=v("./convert"),t=v("./transform"),u=v("./clip"),p=v("./wrap"),s=v("./tile");q.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:100000,solidChildren:!1,tolerance:3,extent:4096,buffer:64,debug:0},q.prototype.splitTile=function(ag,Q,ac,X,Y,U,R){for(var ab=[ag,Q,ac,X],ak=this.options,P=ak.debug,ai=null;ab.length;){X=ab.pop(),ac=ab.pop(),Q=ab.pop(),ag=ab.pop();var W=1<<Q,ah=z(Q,ac,X),aa=this.tiles[ah],af=Q===ak.maxZoom?0:ak.tolerance/(W*ak.extent);if(!aa&&(P>1&&console.time("creation"),aa=this.tiles[ah]=s(ag,W,ac,X,af,Q===ak.maxZoom),this.tileCoords.push({z:Q,x:ac,y:X}),P)){P>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",Q,ac,X,aa.numFeatures,aa.numPoints,aa.numSimplified),console.timeEnd("creation"));var ad="z"+Q;this.stats[ad]=(this.stats[ad]||0)+1,this.total++}if(aa.source=ag,Y){if(Q===ak.maxZoom||Q===Y){continue}var K=1<<Y-Q;if(ac!==Math.floor(U/K)||X!==Math.floor(R/K)){continue}}else{if(Q===ak.indexMaxZoom||aa.numPoints<=ak.indexMaxPoints){continue}}if(ak.solidChildren||!o(aa,ak.extent,ak.buffer)){aa.source=null,P>1&&console.time("clipping");var ae,O,I,G,aj,J,H=0.5*ak.buffer/ak.extent,F=0.5-H,V=0.5+H,N=1+H;ae=O=I=G=null,aj=u(ag,W,ac-H,ac+V,0,D,aa.min[0],aa.max[0]),J=u(ag,W,ac+F,ac+N,0,D,aa.min[0],aa.max[0]),aj&&(ae=u(aj,W,X-H,X+V,1,C,aa.min[1],aa.max[1]),O=u(aj,W,X+F,X+N,1,C,aa.min[1],aa.max[1])),J&&(I=u(J,W,X-H,X+V,1,C,aa.min[1],aa.max[1]),G=u(J,W,X+F,X+N,1,C,aa.min[1],aa.max[1])),P>1&&console.timeEnd("clipping"),ae&&ab.push(ae,Q+1,2*ac,2*X),O&&ab.push(O,Q+1,2*ac,2*X+1),I&&ab.push(I,Q+1,2*ac+1,2*X),G&&ab.push(G,Q+1,2*ac+1,2*X+1)}else{Y&&(ai=Q)}}return ai},q.prototype.getTile=function(N,S,M){var H=this.options,I=H.extent,F=H.debug,T=1<<N;S=(S%T+T)%T;var K=z(N,S,M);if(this.tiles[K]){return t.tile(this.tiles[K],I)}F>1&&console.log("drilling down to z%d-%d-%d",N,S,M);for(var Q,R=N,P=S,G=M;!Q&&R>0;){R--,P=Math.floor(P/2),G=Math.floor(G/2),Q=this.tiles[z(R,P,G)]}if(!Q||!Q.source){return null}if(F>1&&console.log("found parent tile z%d-%d-%d",R,P,G),o(Q,I,H.buffer)){return t.tile(Q,I)}F>1&&console.time("drilling down");var O=this.splitTile(Q.source,R,P,G,N,S,M);if(F>1&&console.timeEnd("drilling down"),null!==O){var J=1<<N-O;K=z(O,Math.floor(S/J),Math.floor(M/J))}return this.tiles[K]?t.tile(this.tiles[K],I):null}},{"./clip":109,"./convert":110,"./tile":113,"./transform":114,"./wrap":115}],112:[function(q,r,o){function p(G,B){var E,w,v,H,z=B*B,D=G.length,F=0,A=D-1,C=[];for(G[F][2]=1,G[A][2]=1;A;){for(w=0,E=F+1;A>E;E++){v=s(G[E],G[F],G[A]),v>w&&(H=E,w=v)}w>z?(G[H][2]=w,C.push(F),C.push(H),F=H):(A=C.pop(),F=C.pop())}}function s(H,C,F){var w=C[0],v=C[1],I=F[0],z=F[1],E=H[0],G=H[1],A=I-w,D=z-v;if(0!==A||0!==D){var B=((E-w)*A+(G-v)*D)/(A*A+D*D);B>1?(w=I,v=z):B>0&&(w+=A*B,v+=D*B)}return A=E-w,D=G-v,A*A+D*D}r.exports=p},{}],113:[function(p,q,o){function s(C,w,F,z,B,E){for(var v={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:F,y:z,z2:w,transformed:!1,min:[2,1],max:[-1,0]},D=0;D<C.length;D++){v.numFeatures++,r(v,C[D],B,E);var G=C[D].min,A=C[D].max;G[0]<v.min[0]&&(v.min[0]=G[0]),G[1]<v.min[1]&&(v.min[1]=G[1]),A[0]>v.max[0]&&(v.max[0]=A[0]),A[1]>v.max[1]&&(v.max[1]=A[1])}return v}function r(E,z,I,A){var C,H,v,G,J=z.geometry,B=z.type,w=[],D=I*I;if(1===B){for(C=0;C<J.length;C++){w.push(J[C]),E.numPoints++,E.numSimplified++}}else{for(C=0;C<J.length;C++){if(v=J[C],A||!(2===B&&v.dist<I||3===B&&v.area<D)){var F=[];for(H=0;H<v.length;H++){G=v[H],(A||G[2]>D)&&(F.push(G),E.numSimplified++),E.numPoints++}w.push(F)}else{E.numPoints+=v.length}}}w.length&&E.features.push({geometry:w,type:B,tags:z.tags||null})}q.exports=s},{}],114:[function(p,q,o){function r(v,H){if(v.transformed){return v}var z,E,w,D=v.z2,F=v.x,I=v.y;for(z=0;z<v.features.length;z++){var C=v.features[z],G=C.geometry,A=C.type;if(1===A){for(E=0;E<G.length;E++){G[E]=s(G[E],H,D,F,I)}}else{for(E=0;E<G.length;E++){var B=G[E];for(w=0;w<B.length;w++){B[w]=s(B[w],H,D,F,I)}}}}return v.transformed=!0,v}function s(w,v,C,A,B){var z=Math.round(v*(w[0]*C-A)),u=Math.round(v*(w[1]*C-B));return[z,u]}o.tile=r,o.point=s},{}],115:[function(q,r,p){function s(A,w,B){var C=A,v=t(A,1,-1-w,w,0,B,-1,2),z=t(A,1,1-w,2+w,0,B,-1,2);return(v||z)&&(C=t(A,1,-w,1+w,0,B,-1,2),v&&(C=o(v,1).concat(C)),z&&(C=C.concat(o(z,-1)))),C}function o(B,z){for(var C=[],D=0;D<B.length;D++){var v,A=B[D],w=A.type;if(1===w){v=u(A.geometry,z)}else{v=[];for(var E=0;E<A.geometry.length;E++){v.push(u(A.geometry[E],z))}}C.push({geometry:v,type:w,tags:A.tags,min:[A.min[0]+z,A.min[1]],max:[A.max[0]+z,A.max[1]]})}return C}function u(w,v){var z=[];z.area=w.area,z.dist=w.dist;for(var A=0;A<w.length;A++){z.push([w[A][0]+v,w[A][1],w[A][2]])}return z}var t=q("./clip");r.exports=s},{"./clip":109}],116:[function(p,q,o){o.glMatrix=p("./gl-matrix/common.js"),o.mat2=p("./gl-matrix/mat2.js"),o.mat2d=p("./gl-matrix/mat2d.js"),o.mat3=p("./gl-matrix/mat3.js"),o.mat4=p("./gl-matrix/mat4.js"),o.quat=p("./gl-matrix/quat.js"),o.vec2=p("./gl-matrix/vec2.js"),o.vec3=p("./gl-matrix/vec3.js"),o.vec4=p("./gl-matrix/vec4.js")},{"./gl-matrix/common.js":117,"./gl-matrix/mat2.js":118,"./gl-matrix/mat2d.js":119,"./gl-matrix/mat3.js":120,"./gl-matrix/mat4.js":121,"./gl-matrix/quat.js":122,"./gl-matrix/vec2.js":123,"./gl-matrix/vec3.js":124,"./gl-matrix/vec4.js":125}],117:[function(q,r,o){var p={};p.EPSILON=0.000001,p.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,p.RANDOM=Math.random,p.setMatrixArrayType=function(t){GLMAT_ARRAY_TYPE=t};var s=Math.PI/180;p.toRadian=function(t){return t*s},r.exports=p},{}],118:[function(q,r,o){var p=q("./common.js"),s={};s.create=function(){var u=new p.ARRAY_TYPE(4);return u[0]=1,u[1]=0,u[2]=0,u[3]=1,u},s.clone=function(u){var v=new p.ARRAY_TYPE(4);return v[0]=u[0],v[1]=u[1],v[2]=u[2],v[3]=u[3],v},s.copy=function(u,v){return u[0]=v[0],u[1]=v[1],u[2]=v[2],u[3]=v[3],u},s.identity=function(u){return u[0]=1,u[1]=0,u[2]=0,u[3]=1,u},s.transpose=function(u,w){if(u===w){var v=w[1];u[1]=w[2],u[2]=v}else{u[0]=w[0],u[1]=w[2],u[2]=w[1],u[3]=w[3]}return u},s.invert=function(z,D){var A=D[0],v=D[1],w=D[2],C=D[3],B=A*C-w*v;return B?(B=1/B,z[0]=C*B,z[1]=-v*B,z[2]=-w*B,z[3]=A*B,z):null},s.adjoint=function(u,w){var v=w[0];return u[0]=w[3],u[1]=-w[1],u[2]=-w[2],u[3]=v,u},s.determinant=function(u){return u[0]*u[3]-u[2]*u[1]},s.multiply=function(H,z,v){var F=z[0],G=z[1],w=z[2],D=z[3],B=v[0],A=v[1],E=v[2],C=v[3];return H[0]=F*B+w*A,H[1]=G*B+D*A,H[2]=F*E+w*C,H[3]=G*E+D*C,H},s.mul=s.multiply,s.rotate=function(F,z,v){var D=z[0],E=z[1],w=z[2],C=z[3],B=Math.sin(v),A=Math.cos(v);return F[0]=D*A+w*B,F[1]=E*A+C*B,F[2]=D*-B+w*A,F[3]=E*-B+C*A,F},s.scale=function(F,z,v){var D=z[0],E=z[1],w=z[2],C=z[3],B=v[0],A=v[1];return F[0]=D*B,F[1]=E*B,F[2]=w*A,F[3]=C*A,F},s.fromRotation=function(v,z){var w=Math.sin(z),u=Math.cos(z);return v[0]=u,v[1]=w,v[2]=-w,v[3]=u,v},s.fromScaling=function(u,v){return u[0]=v[0],u[1]=0,u[2]=0,u[3]=v[1],u},s.str=function(u){return"mat2("+u[0]+", "+u[1]+", "+u[2]+", "+u[3]+")"},s.frob=function(u){return Math.sqrt(Math.pow(u[0],2)+Math.pow(u[1],2)+Math.pow(u[2],2)+Math.pow(u[3],2))},s.LDU=function(v,z,w,u){return v[2]=u[2]/u[0],w[0]=u[0],w[1]=u[1],w[3]=u[3]-v[2]*w[1],[v,z,w]},r.exports=s},{"./common.js":117}],119:[function(q,r,o){var p=q("./common.js"),s={};s.create=function(){var u=new p.ARRAY_TYPE(6);return u[0]=1,u[1]=0,u[2]=0,u[3]=1,u[4]=0,u[5]=0,u},s.clone=function(u){var v=new p.ARRAY_TYPE(6);return v[0]=u[0],v[1]=u[1],v[2]=u[2],v[3]=u[3],v[4]=u[4],v[5]=u[5],v},s.copy=function(u,v){return u[0]=v[0],u[1]=v[1],u[2]=v[2],u[3]=v[3],u[4]=v[4],u[5]=v[5],u},s.identity=function(u){return u[0]=1,u[1]=0,u[2]=0,u[3]=1,u[4]=0,u[5]=0,u},s.invert=function(F,z){var v=z[0],D=z[1],w=z[2],E=z[3],C=z[4],B=z[5],A=v*E-D*w;return A?(A=1/A,F[0]=E*A,F[1]=-D*A,F[2]=-w*A,F[3]=v*A,F[4]=(w*B-E*C)*A,F[5]=(D*C-v*B)*A,F):null},s.determinant=function(u){return u[0]*u[3]-u[1]*u[2]},s.multiply=function(N,z,v){var J=z[0],w=z[1],K=z[2],F=z[3],C=z[4],A=z[5],I=v[0],H=v[1],E=v[2],B=v[3],G=v[4],D=v[5];return N[0]=J*I+K*H,N[1]=w*I+F*H,N[2]=J*E+K*B,N[3]=w*E+F*B,N[4]=J*G+K*D+C,N[5]=w*G+F*D+A,N},s.mul=s.multiply,s.rotate=function(H,z,v){var F=z[0],w=z[1],G=z[2],C=z[3],B=z[4],A=z[5],E=Math.sin(v),D=Math.cos(v);return H[0]=F*D+G*E,H[1]=w*D+C*E,H[2]=F*-E+G*D,H[3]=w*-E+C*D,H[4]=B,H[5]=A,H},s.scale=function(H,z,v){var F=z[0],w=z[1],G=z[2],C=z[3],B=z[4],A=z[5],E=v[0],D=v[1];return H[0]=F*E,H[1]=w*E,H[2]=G*D,H[3]=C*D,H[4]=B,H[5]=A,H},s.translate=function(H,z,v){var F=z[0],w=z[1],G=z[2],C=z[3],B=z[4],A=z[5],E=v[0],D=v[1];return H[0]=F,H[1]=w,H[2]=G,H[3]=C,H[4]=F*E+G*D+B,H[5]=w*E+C*D+A,H},s.fromRotation=function(v,z){var w=Math.sin(z),u=Math.cos(z);return v[0]=u,v[1]=w,v[2]=-w,v[3]=u,v[4]=0,v[5]=0,v},s.fromScaling=function(u,v){return u[0]=v[0],u[1]=0,u[2]=0,u[3]=v[1],u[4]=0,u[5]=0,u},s.fromTranslation=function(u,v){return u[0]=1,u[1]=0,u[2]=0,u[3]=1,u[4]=v[0],u[5]=v[1],u},s.str=function(u){return"mat2d("+u[0]+", "+u[1]+", "+u[2]+", "+u[3]+", "+u[4]+", "+u[5]+")"},s.frob=function(u){return Math.sqrt(Math.pow(u[0],2)+Math.pow(u[1],2)+Math.pow(u[2],2)+Math.pow(u[3],2)+Math.pow(u[4],2)+Math.pow(u[5],2)+1)},r.exports=s},{"./common.js":117}],120:[function(q,s,o){var p=q("./common.js"),r={};r.create=function(){var u=new p.ARRAY_TYPE(9);return u[0]=1,u[1]=0,u[2]=0,u[3]=0,u[4]=1,u[5]=0,u[6]=0,u[7]=0,u[8]=1,u},r.fromMat4=function(u,v){return u[0]=v[0],u[1]=v[1],u[2]=v[2],u[3]=v[4],u[4]=v[5],u[5]=v[6],u[6]=v[8],u[7]=v[9],u[8]=v[10],u},r.clone=function(u){var v=new p.ARRAY_TYPE(9);return v[0]=u[0],v[1]=u[1],v[2]=u[2],v[3]=u[3],v[4]=u[4],v[5]=u[5],v[6]=u[6],v[7]=u[7],v[8]=u[8],v},r.copy=function(u,v){return u[0]=v[0],u[1]=v[1],u[2]=v[2],u[3]=v[3],u[4]=v[4],u[5]=v[5],u[6]=v[6],u[7]=v[7],u[8]=v[8],u},r.identity=function(u){return u[0]=1,u[1]=0,u[2]=0,u[3]=0,u[4]=1,u[5]=0,u[6]=0,u[7]=0,u[8]=1,u},r.transpose=function(v,A){if(v===A){var w=A[1],u=A[2],z=A[5];v[1]=A[3],v[2]=A[6],v[3]=w,v[5]=A[7],v[6]=u,v[7]=z}else{v[0]=A[0],v[1]=A[3],v[2]=A[6],v[3]=A[1],v[4]=A[4],v[5]=A[7],v[6]=A[2],v[7]=A[5],v[8]=A[8]}return v},r.invert=function(O,A){var w=A[0],J=A[1],z=A[2],N=A[3],B=A[4],G=A[5],D=A[6],I=A[7],F=A[8],C=F*B-G*I,H=-F*N+G*D,K=I*N-B*D,E=w*C+J*H+z*K;return E?(E=1/E,O[0]=C*E,O[1]=(-F*J+z*I)*E,O[2]=(G*J-z*B)*E,O[3]=H*E,O[4]=(F*w-z*D)*E,O[5]=(-G*w+z*N)*E,O[6]=K*E,O[7]=(-I*w+J*D)*E,O[8]=(B*w-J*N)*E,O):null},r.adjoint=function(H,z){var v=z[0],F=z[1],w=z[2],G=z[3],A=z[4],D=z[5],B=z[6],E=z[7],C=z[8];return H[0]=A*C-D*E,H[1]=w*E-F*C,H[2]=F*D-w*A,H[3]=D*B-G*C,H[4]=v*C-w*B,H[5]=w*G-v*D,H[6]=G*E-A*B,H[7]=F*B-v*E,H[8]=v*A-F*G,H},r.determinant=function(G){var z=G[0],v=G[1],E=G[2],w=G[3],F=G[4],A=G[5],C=G[6],B=G[7],D=G[8];return z*(D*F-A*B)+v*(-D*w+A*C)+E*(B*w-F*C)},r.multiply=function(E,J,G){var W=J[0],I=J[1],D=J[2],K=J[3],T=J[4],O=J[5],V=J[6],S=J[7],N=J[8],A=G[0],C=G[1],P=G[2],H=G[3],F=G[4],B=G[5],U=G[6],z=G[7],Q=G[8];return E[0]=A*W+C*K+P*V,E[1]=A*I+C*T+P*S,E[2]=A*D+C*O+P*N,E[3]=H*W+F*K+B*V,E[4]=H*I+F*T+B*S,E[5]=H*D+F*O+B*N,E[6]=U*W+z*K+Q*V,E[7]=U*I+z*T+Q*S,E[8]=U*D+z*O+Q*N,E},r.mul=r.multiply,r.translate=function(N,A,w){var I=A[0],z=A[1],K=A[2],B=A[3],F=A[4],D=A[5],H=A[6],E=A[7],C=A[8],G=w[0],J=w[1];return N[0]=I,N[1]=z,N[2]=K,N[3]=B,N[4]=F,N[5]=D,N[6]=G*I+J*B+H,N[7]=G*z+J*F+E,N[8]=G*K+J*D+C,N},r.rotate=function(N,A,w){var I=A[0],z=A[1],K=A[2],B=A[3],F=A[4],D=A[5],H=A[6],E=A[7],C=A[8],G=Math.sin(w),J=Math.cos(w);return N[0]=J*I+G*B,N[1]=J*z+G*F,N[2]=J*K+G*D,N[3]=J*B-G*I,N[4]=J*F-G*z,N[5]=J*D-G*K,N[6]=H,N[7]=E,N[8]=C,N},r.scale=function(v,A,w){var u=w[0],z=w[1];return v[0]=u*A[0],v[1]=u*A[1],v[2]=u*A[2],v[3]=z*A[3],v[4]=z*A[4],v[5]=z*A[5],v[6]=A[6],v[7]=A[7],v[8]=A[8],v},r.fromTranslation=function(u,v){return u[0]=1,u[1]=0,u[2]=0,u[3]=0,u[4]=1,u[5]=0,u[6]=v[0],u[7]=v[1],u[8]=1,u},r.fromRotation=function(v,z){var w=Math.sin(z),u=Math.cos(z);return v[0]=u,v[1]=w,v[2]=0,v[3]=-w,v[4]=u,v[5]=0,v[6]=0,v[7]=0,v[8]=1,v},r.fromScaling=function(u,v){return u[0]=v[0],u[1]=0,u[2]=0,u[3]=0,u[4]=v[1],u[5]=0,u[6]=0,u[7]=0,u[8]=1,u},r.fromMat2d=function(u,v){return u[0]=v[0],u[1]=v[1],u[2]=0,u[3]=v[2],u[4]=v[3],u[5]=0,u[6]=v[4],u[7]=v[5],u[8]=1,u},r.fromQuat=function(D,I){var F=I[0],S=I[1],H=I[2],C=I[3],J=F+F,Q=S+S,N=H+H,R=F*J,P=S*J,K=S*Q,z=H*J,B=H*Q,O=H*N,G=C*J,E=C*Q,A=C*N;return D[0]=1-K-O,D[3]=P-A,D[6]=z+E,D[1]=P+A,D[4]=1-R-O,D[7]=B-G,D[2]=z-E,D[5]=B+G,D[8]=1-R-K,D},r.normalFromMat4=function(O,Z){var S=Z[0],ak=Z[1],X=Z[2],K=Z[3],aa=Z[4],ah=Z[5],ad=Z[6],aj=Z[7],ag=Z[8],ab=Z[9],F=Z[10],J=Z[11],ae=Z[12],W=Z[13],Q=Z[14],I=Z[15],ai=S*ah-ak*aa,C=S*ad-X*aa,af=S*aj-K*aa,H=ak*ad-X*ah,G=ak*aj-K*ah,V=X*aj-K*ad,z=ag*W-ab*ae,B=ag*Q-F*ae,ac=ag*I-J*ae,U=ab*Q-F*W,N=ab*I-J*W,D=F*I-J*Q,al=ai*D-C*N+af*U+H*ac-G*B+V*z;return al?(al=1/al,O[0]=(ah*D-ad*N+aj*U)*al,O[1]=(ad*ac-aa*D-aj*B)*al,O[2]=(aa*N-ah*ac+aj*z)*al,O[3]=(X*N-ak*D-K*U)*al,O[4]=(S*D-X*ac+K*B)*al,O[5]=(ak*ac-S*N-K*z)*al,O[6]=(W*V-Q*G+I*H)*al,O[7]=(Q*af-ae*V-I*C)*al,O[8]=(ae*G-W*af+I*ai)*al,O):null},r.str=function(u){return"mat3("+u[0]+", "+u[1]+", "+u[2]+", "+u[3]+", "+u[4]+", "+u[5]+", "+u[6]+", "+u[7]+", "+u[8]+")"},r.frob=function(u){return Math.sqrt(Math.pow(u[0],2)+Math.pow(u[1],2)+Math.pow(u[2],2)+Math.pow(u[3],2)+Math.pow(u[4],2)+Math.pow(u[5],2)+Math.pow(u[6],2)+Math.pow(u[7],2)+Math.pow(u[8],2))},s.exports=r},{"./common.js":117}],121:[function(r,s,o){var q=r("./common.js"),p={};p.create=function(){var u=new q.ARRAY_TYPE(16);return u[0]=1,u[1]=0,u[2]=0,u[3]=0,u[4]=0,u[5]=1,u[6]=0,u[7]=0,u[8]=0,u[9]=0,u[10]=1,u[11]=0,u[12]=0,u[13]=0,u[14]=0,u[15]=1,u},p.clone=function(v){var u=new q.ARRAY_TYPE(16);return u[0]=v[0],u[1]=v[1],u[2]=v[2],u[3]=v[3],u[4]=v[4],u[5]=v[5],u[6]=v[6],u[7]=v[7],u[8]=v[8],u[9]=v[9],u[10]=v[10],u[11]=v[11],u[12]=v[12],u[13]=v[13],u[14]=v[14],u[15]=v[15],u},p.copy=function(v,u){return v[0]=u[0],v[1]=u[1],v[2]=u[2],v[3]=u[3],v[4]=u[4],v[5]=u[5],v[6]=u[6],v[7]=u[7],v[8]=u[8],v[9]=u[9],v[10]=u[10],v[11]=u[11],v[12]=u[12],v[13]=u[13],v[14]=u[14],v[15]=u[15],v},p.identity=function(u){return u[0]=1,u[1]=0,u[2]=0,u[3]=0,u[4]=0,u[5]=1,u[6]=0,u[7]=0,u[8]=0,u[9]=0,u[10]=1,u[11]=0,u[12]=0,u[13]=0,u[14]=0,u[15]=1,u},p.transpose=function(A,v){if(A===v){var B=v[1],E=v[2],D=v[3],C=v[6],z=v[7],w=v[11];A[1]=v[4],A[2]=v[8],A[3]=v[12],A[4]=B,A[6]=v[9],A[7]=v[13],A[8]=E,A[9]=C,A[11]=v[14],A[12]=D,A[13]=z,A[14]=w}else{A[0]=v[0],A[1]=v[4],A[2]=v[8],A[3]=v[12],A[4]=v[1],A[5]=v[5],A[6]=v[9],A[7]=v[13],A[8]=v[2],A[9]=v[6],A[10]=v[10],A[11]=v[14],A[12]=v[3],A[13]=v[7],A[14]=v[11],A[15]=v[15]}return A},p.invert=function(V,an){var X=an[0],ac=an[1],ab=an[2],aj=an[3],af=an[4],Q=an[5],G=an[6],ad=an[7],ag=an[8],al=an[9],ai=an[10],W=an[11],ae=an[12],N=an[13],aa=an[14],K=an[15],ah=X*Q-ac*af,D=X*G-ab*af,C=X*ad-aj*af,J=ac*G-ab*Q,H=ac*ad-aj*Q,B=ab*ad-aj*G,ak=ag*N-al*ae,Z=ag*aa-ai*ae,U=ag*K-W*ae,F=al*aa-ai*N,am=al*K-W*N,A=ai*K-W*aa,z=ah*A-D*am+C*F+J*U-H*Z+B*ak;return z?(z=1/z,V[0]=(Q*A-G*am+ad*F)*z,V[1]=(ab*am-ac*A-aj*F)*z,V[2]=(N*B-aa*H+K*J)*z,V[3]=(ai*H-al*B-W*J)*z,V[4]=(G*U-af*A-ad*Z)*z,V[5]=(X*A-ab*U+aj*Z)*z,V[6]=(aa*C-ae*B-K*D)*z,V[7]=(ag*B-ai*C+W*D)*z,V[8]=(af*am-Q*U+ad*ak)*z,V[9]=(ac*U-X*am-aj*ak)*z,V[10]=(ae*H-N*C+K*ah)*z,V[11]=(al*C-ag*H-W*ah)*z,V[12]=(Q*Z-af*F-G*ak)*z,V[13]=(X*F-ac*Z+ab*ak)*z,V[14]=(N*D-ae*J-aa*ah)*z,V[15]=(ag*J-al*D+ai*ah)*z,V):null},p.adjoint=function(D,S){var F=S[0],I=S[1],H=S[2],Q=S[3],N=S[4],C=S[5],z=S[6],J=S[7],O=S[8],R=S[9],P=S[10],E=S[11],K=S[12],B=S[13],G=S[14],A=S[15];return D[0]=C*(P*A-E*G)-R*(z*A-J*G)+B*(z*E-J*P),D[1]=-(I*(P*A-E*G)-R*(H*A-Q*G)+B*(H*E-Q*P)),D[2]=I*(z*A-J*G)-C*(H*A-Q*G)+B*(H*J-Q*z),D[3]=-(I*(z*E-J*P)-C*(H*E-Q*P)+R*(H*J-Q*z)),D[4]=-(N*(P*A-E*G)-O*(z*A-J*G)+K*(z*E-J*P)),D[5]=F*(P*A-E*G)-O*(H*A-Q*G)+K*(H*E-Q*P),D[6]=-(F*(z*A-J*G)-N*(H*A-Q*G)+K*(H*J-Q*z)),D[7]=F*(z*E-J*P)-N*(H*E-Q*P)+O*(H*J-Q*z),D[8]=N*(R*A-E*B)-O*(C*A-J*B)+K*(C*E-J*R),D[9]=-(F*(R*A-E*B)-O*(I*A-Q*B)+K*(I*E-Q*R)),D[10]=F*(C*A-J*B)-N*(I*A-Q*B)+K*(I*J-Q*C),D[11]=-(F*(C*E-J*R)-N*(I*E-Q*R)+O*(I*J-Q*C)),D[12]=-(N*(R*G-P*B)-O*(C*G-z*B)+K*(C*P-z*R)),D[13]=F*(R*G-P*B)-O*(I*G-H*B)+K*(I*P-H*R),D[14]=-(F*(C*G-z*B)-N*(I*G-H*B)+K*(I*z-H*C)),D[15]=F*(C*P-z*R)-N*(I*P-H*R)+O*(I*z-H*C),D},p.determinant=function(Q){var aj=Q[0],U=Q[1],Y=Q[2],X=Q[3],af=Q[4],ab=Q[5],K=Q[6],D=Q[7],Z=Q[8],ac=Q[9],ah=Q[10],ae=Q[11],T=Q[12],aa=Q[13],J=Q[14],W=Q[15],H=aj*ab-U*af,ad=aj*K-Y*af,B=aj*D-X*af,A=U*K-Y*ab,G=U*D-X*ab,F=Y*D-X*K,z=Z*aa-ac*T,ag=Z*J-ah*T,V=Z*W-ae*T,N=ac*J-ah*aa,C=ac*W-ae*aa,ai=ah*W-ae*J;return H*ai-ad*C+B*N+A*V-G*ag+F*z},p.multiply=function(H,aa,K){var Q=aa[0],O=aa[1],Y=aa[2],U=aa[3],G=aa[4],B=aa[5],S=aa[6],V=aa[7],Z=aa[8],X=aa[9],J=aa[10],T=aa[11],F=aa[12],N=aa[13],E=aa[14],W=aa[15],A=K[0],z=K[1],D=K[2],C=K[3];return H[0]=A*Q+z*G+D*Z+C*F,H[1]=A*O+z*B+D*X+C*N,H[2]=A*Y+z*S+D*J+C*E,H[3]=A*U+z*V+D*T+C*W,A=K[4],z=K[5],D=K[6],C=K[7],H[4]=A*Q+z*G+D*Z+C*F,H[5]=A*O+z*B+D*X+C*N,H[6]=A*Y+z*S+D*J+C*E,H[7]=A*U+z*V+D*T+C*W,A=K[8],z=K[9],D=K[10],C=K[11],H[8]=A*Q+z*G+D*Z+C*F,H[9]=A*O+z*B+D*X+C*N,H[10]=A*Y+z*S+D*J+C*E,H[11]=A*U+z*V+D*T+C*W,A=K[12],z=K[13],D=K[14],C=K[15],H[12]=A*Q+z*G+D*Z+C*F,H[13]=A*O+z*B+D*X+C*N,H[14]=A*Y+z*S+D*J+C*E,H[15]=A*U+z*V+D*T+C*W,H},p.mul=p.multiply,p.translate=function(D,S,F){var I,H,Q,N,C,z,J,O,R,P,E,K,B=F[0],G=F[1],A=F[2];return S===D?(D[12]=S[0]*B+S[4]*G+S[8]*A+S[12],D[13]=S[1]*B+S[5]*G+S[9]*A+S[13],D[14]=S[2]*B+S[6]*G+S[10]*A+S[14],D[15]=S[3]*B+S[7]*G+S[11]*A+S[15]):(I=S[0],H=S[1],Q=S[2],N=S[3],C=S[4],z=S[5],J=S[6],O=S[7],R=S[8],P=S[9],E=S[10],K=S[11],D[0]=I,D[1]=H,D[2]=Q,D[3]=N,D[4]=C,D[5]=z,D[6]=J,D[7]=O,D[8]=R,D[9]=P,D[10]=E,D[11]=K,D[12]=I*B+C*G+R*A+S[12],D[13]=H*B+z*G+P*A+S[13],D[14]=Q*B+J*G+E*A+S[14],D[15]=N*B+O*G+K*A+S[15]),D},p.scale=function(v,u,w){var B=w[0],A=w[1],z=w[2];return v[0]=u[0]*B,v[1]=u[1]*B,v[2]=u[2]*B,v[3]=u[3]*B,v[4]=u[4]*A,v[5]=u[5]*A,v[6]=u[6]*A,v[7]=u[7]*A,v[8]=u[8]*z,v[9]=u[9]*z,v[10]=u[10]*z,v[11]=u[11]*z,v[12]=u[12],v[13]=u[13],v[14]=u[14],v[15]=u[15],v},p.rotate=function(W,ao,Z,ad){var ac,ak,ag,U,G,ae,ah,am,aj,X,af,Q,ab,N,ai,D,C,K,J,B,al,aa,V,F,an=ad[0],A=ad[1],z=ad[2],H=Math.sqrt(an*an+A*A+z*z);return Math.abs(H)<q.EPSILON?null:(H=1/H,an*=H,A*=H,z*=H,ac=Math.sin(Z),ak=Math.cos(Z),ag=1-ak,U=ao[0],G=ao[1],ae=ao[2],ah=ao[3],am=ao[4],aj=ao[5],X=ao[6],af=ao[7],Q=ao[8],ab=ao[9],N=ao[10],ai=ao[11],D=an*an*ag+ak,C=A*an*ag+z*ac,K=z*an*ag-A*ac,J=an*A*ag-z*ac,B=A*A*ag+ak,al=z*A*ag+an*ac,aa=an*z*ag+A*ac,V=A*z*ag-an*ac,F=z*z*ag+ak,W[0]=U*D+am*C+Q*K,W[1]=G*D+aj*C+ab*K,W[2]=ae*D+X*C+N*K,W[3]=ah*D+af*C+ai*K,W[4]=U*J+am*B+Q*al,W[5]=G*J+aj*B+ab*al,W[6]=ae*J+X*B+N*al,W[7]=ah*J+af*B+ai*al,W[8]=U*aa+am*V+Q*F,W[9]=G*aa+aj*V+ab*F,W[10]=ae*aa+X*V+N*F,W[11]=ah*aa+af*V+ai*F,ao!==W&&(W[12]=ao[12],W[13]=ao[13],W[14]=ao[14],W[15]=ao[15]),W)},p.rotateX=function(J,H,v){var z=Math.sin(v),w=Math.cos(v),E=H[4],B=H[5],I=H[6],F=H[7],A=H[8],C=H[9],G=H[10],D=H[11];return H!==J&&(J[0]=H[0],J[1]=H[1],J[2]=H[2],J[3]=H[3],J[12]=H[12],J[13]=H[13],J[14]=H[14],J[15]=H[15]),J[4]=E*w+A*z,J[5]=B*w+C*z,J[6]=I*w+G*z,J[7]=F*w+D*z,J[8]=A*w-E*z,J[9]=C*w-B*z,J[10]=G*w-I*z,J[11]=D*w-F*z,J},p.rotateY=function(J,H,v){var z=Math.sin(v),w=Math.cos(v),E=H[0],B=H[1],I=H[2],F=H[3],A=H[8],C=H[9],G=H[10],D=H[11];return H!==J&&(J[4]=H[4],J[5]=H[5],J[6]=H[6],J[7]=H[7],J[12]=H[12],J[13]=H[13],J[14]=H[14],J[15]=H[15]),J[0]=E*w-A*z,J[1]=B*w-C*z,J[2]=I*w-G*z,J[3]=F*w-D*z,J[8]=E*z+A*w,J[9]=B*z+C*w,J[10]=I*z+G*w,J[11]=F*z+D*w,J},p.rotateZ=function(J,H,v){var z=Math.sin(v),w=Math.cos(v),E=H[0],B=H[1],I=H[2],F=H[3],A=H[4],C=H[5],G=H[6],D=H[7];return H!==J&&(J[8]=H[8],J[9]=H[9],J[10]=H[10],J[11]=H[11],J[12]=H[12],J[13]=H[13],J[14]=H[14],J[15]=H[15]),J[0]=E*w+A*z,J[1]=B*w+C*z,J[2]=I*w+G*z,J[3]=F*w+D*z,J[4]=A*w-E*z,J[5]=C*w-B*z,J[6]=G*w-I*z,J[7]=D*w-F*z,J},p.fromTranslation=function(v,u){return v[0]=1,v[1]=0,v[2]=0,v[3]=0,v[4]=0,v[5]=1,v[6]=0,v[7]=0,v[8]=0,v[9]=0,v[10]=1,v[11]=0,v[12]=u[0],v[13]=u[1],v[14]=u[2],v[15]=1,v},p.fromScaling=function(v,u){return v[0]=u[0],v[1]=0,v[2]=0,v[3]=0,v[4]=0,v[5]=u[1],v[6]=0,v[7]=0,v[8]=0,v[9]=0,v[10]=u[2],v[11]=0,v[12]=0,v[13]=0,v[14]=0,v[15]=1,v},p.fromRotation=function(G,E,v){var z,w,C,B=v[0],F=v[1],D=v[2],A=Math.sqrt(B*B+F*F+D*D);return Math.abs(A)<q.EPSILON?null:(A=1/A,B*=A,F*=A,D*=A,z=Math.sin(E),w=Math.cos(E),C=1-w,G[0]=B*B*C+w,G[1]=F*B*C+D*z,G[2]=D*B*C-F*z,G[3]=0,G[4]=B*F*C-D*z,G[5]=F*F*C+w,G[6]=D*F*C+B*z,G[7]=0,G[8]=B*D*C+F*z,G[9]=F*D*C-B*z,G[10]=D*D*C+w,G[11]=0,G[12]=0,G[13]=0,G[14]=0,G[15]=1,G)},p.fromXRotation=function(v,u){var w=Math.sin(u),z=Math.cos(u);return v[0]=1,v[1]=0,v[2]=0,v[3]=0,v[4]=0,v[5]=z,v[6]=w,v[7]=0,v[8]=0,v[9]=-w,v[10]=z,v[11]=0,v[12]=0,v[13]=0,v[14]=0,v[15]=1,v},p.fromYRotation=function(v,u){var w=Math.sin(u),z=Math.cos(u);return v[0]=z,v[1]=0,v[2]=-w,v[3]=0,v[4]=0,v[5]=1,v[6]=0,v[7]=0,v[8]=w,v[9]=0,v[10]=z,v[11]=0,v[12]=0,v[13]=0,v[14]=0,v[15]=1,v},p.fromZRotation=function(v,u){var w=Math.sin(u),z=Math.cos(u);return v[0]=z,v[1]=w,v[2]=0,v[3]=0,v[4]=-w,v[5]=z,v[6]=0,v[7]=0,v[8]=0,v[9]=0,v[10]=1,v[11]=0,v[12]=0,v[13]=0,v[14]=0,v[15]=1,v},p.fromRotationTranslation=function(D,T,F){var I=T[0],H=T[1],R=T[2],N=T[3],C=I+I,z=H+H,J=R+R,O=I*C,S=I*z,Q=I*J,E=H*z,K=H*J,B=R*J,G=N*C,A=N*z,P=N*J;return D[0]=1-(E+B),D[1]=S+P,D[2]=Q-A,D[3]=0,D[4]=S-P,D[5]=1-(O+B),D[6]=K+G,D[7]=0,D[8]=Q+A,D[9]=K-G,D[10]=1-(O+E),D[11]=0,D[12]=F[0],D[13]=F[1],D[14]=F[2],D[15]=1,D},p.fromRotationTranslationScale=function(H,aa,K,Q){var O=aa[0],Y=aa[1],U=aa[2],G=aa[3],B=O+O,S=Y+Y,V=U+U,Z=O*B,X=O*S,J=O*V,T=Y*S,F=Y*V,N=U*V,E=G*B,W=G*S,A=G*V,z=Q[0],D=Q[1],C=Q[2];return H[0]=(1-(T+N))*z,H[1]=(X+A)*z,H[2]=(J-W)*z,H[3]=0,H[4]=(X-A)*D,H[5]=(1-(Z+N))*D,H[6]=(F+E)*D,H[7]=0,H[8]=(J+W)*C,H[9]=(F-E)*C,H[10]=(1-(Z+T))*C,H[11]=0,H[12]=K[0],H[13]=K[1],H[14]=K[2],H[15]=1,H},p.fromRotationTranslationScaleOrigin=function(N,ag,Q,W,V){var ad=ag[0],Z=ag[1],J=ag[2],C=ag[3],X=ad+ad,aa=Z+Z,af=J+J,ac=ad*X,O=ad*aa,Y=ad*af,H=Z*aa,U=Z*af,G=J*af,ab=C*X,B=C*aa,A=C*af,F=W[0],D=W[1],z=W[2],ae=V[0],T=V[1],K=V[2];return N[0]=(1-(H+G))*F,N[1]=(O+A)*F,N[2]=(Y-B)*F,N[3]=0,N[4]=(O-A)*D,N[5]=(1-(ac+G))*D,N[6]=(U+ab)*D,N[7]=0,N[8]=(Y+B)*z,N[9]=(U-ab)*z,N[10]=(1-(ac+H))*z,N[11]=0,N[12]=Q[0]+ae-(N[0]*ae+N[4]*T+N[8]*K),N[13]=Q[1]+T-(N[1]*ae+N[5]*T+N[9]*K),N[14]=Q[2]+K-(N[2]*ae+N[6]*T+N[10]*K),N[15]=1,N},p.fromQuat=function(D,S){var F=S[0],I=S[1],H=S[2],Q=S[3],N=F+F,C=I+I,z=H+H,J=F*N,O=I*N,R=I*C,P=H*N,E=H*C,K=H*z,B=Q*N,G=Q*C,A=Q*z;return D[0]=1-R-K,D[1]=O+A,D[2]=P-G,D[3]=0,D[4]=O-A,D[5]=1-J-K,D[6]=E+B,D[7]=0,D[8]=P+G,D[9]=E-B,D[10]=1-J-R,D[11]=0,D[12]=0,D[13]=0,D[14]=0,D[15]=1,D},p.frustum=function(G,E,v,z,w,C,B){var F=1/(v-E),D=1/(w-z),A=1/(C-B);return G[0]=2*C*F,G[1]=0,G[2]=0,G[3]=0,G[4]=0,G[5]=2*C*D,G[6]=0,G[7]=0,G[8]=(v+E)*F,G[9]=(w+z)*D,G[10]=(B+C)*A,G[11]=-1,G[12]=0,G[13]=0,G[14]=B*C*2*A,G[15]=0,G},p.perspective=function(w,u,z,C,B){var A=1/Math.tan(u/2),v=1/(C-B);return w[0]=A/z,w[1]=0,w[2]=0,w[3]=0,w[4]=0,w[5]=A,w[6]=0,w[7]=0,w[8]=0,w[9]=0,w[10]=(B+C)*v,w[11]=-1,w[12]=0,w[13]=0,w[14]=2*B*C*v,w[15]=0,w},p.perspectiveFromFieldOfView=function(G,E,v,z){var w=Math.tan(E.upDegrees*Math.PI/180),C=Math.tan(E.downDegrees*Math.PI/180),B=Math.tan(E.leftDegrees*Math.PI/180),F=Math.tan(E.rightDegrees*Math.PI/180),D=2/(B+F),A=2/(w+C);return G[0]=D,G[1]=0,G[2]=0,G[3]=0,G[4]=0,G[5]=A,G[6]=0,G[7]=0,G[8]=-((B-F)*D*0.5),G[9]=(w-C)*A*0.5,G[10]=z/(v-z),G[11]=-1,G[12]=0,G[13]=0,G[14]=z*v/(v-z),G[15]=0,G},p.ortho=function(G,E,v,z,w,C,B){var F=1/(E-v),D=1/(z-w),A=1/(C-B);return G[0]=-2*F,G[1]=0,G[2]=0,G[3]=0,G[4]=0,G[5]=-2*D,G[6]=0,G[7]=0,G[8]=0,G[9]=0,G[10]=2*A,G[11]=0,G[12]=(E+v)*F,G[13]=(w+z)*D,G[14]=(B+C)*A,G[15]=1,G},p.lookAt=function(H,aa,K,Q){var O,Y,U,G,B,S,V,Z,X,J,T=aa[0],F=aa[1],N=aa[2],E=Q[0],W=Q[1],A=Q[2],z=K[0],D=K[1],C=K[2];return Math.abs(T-z)<q.EPSILON&&Math.abs(F-D)<q.EPSILON&&Math.abs(N-C)<q.EPSILON?p.identity(H):(V=T-z,Z=F-D,X=N-C,J=1/Math.sqrt(V*V+Z*Z+X*X),V*=J,Z*=J,X*=J,O=W*X-A*Z,Y=A*V-E*X,U=E*Z-W*V,J=Math.sqrt(O*O+Y*Y+U*U),J?(J=1/J,O*=J,Y*=J,U*=J):(O=0,Y=0,U=0),G=Z*U-X*Y,B=X*O-V*U,S=V*Y-Z*O,J=Math.sqrt(G*G+B*B+S*S),J?(J=1/J,G*=J,B*=J,S*=J):(G=0,B=0,S=0),H[0]=O,H[1]=G,H[2]=V,H[3]=0,H[4]=Y,H[5]=B,H[6]=Z,H[7]=0,H[8]=U,H[9]=S,H[10]=X,H[11]=0,H[12]=-(O*T+Y*F+U*N),H[13]=-(G*T+B*F+S*N),H[14]=-(V*T+Z*F+X*N),H[15]=1,H)},p.str=function(u){return"mat4("+u[0]+", "+u[1]+", "+u[2]+", "+u[3]+", "+u[4]+", "+u[5]+", "+u[6]+", "+u[7]+", "+u[8]+", "+u[9]+", "+u[10]+", "+u[11]+", "+u[12]+", "+u[13]+", "+u[14]+", "+u[15]+")"},p.frob=function(u){return Math.sqrt(Math.pow(u[0],2)+Math.pow(u[1],2)+Math.pow(u[2],2)+Math.pow(u[3],2)+Math.pow(u[4],2)+Math.pow(u[5],2)+Math.pow(u[6],2)+Math.pow(u[7],2)+Math.pow(u[8],2)+Math.pow(u[9],2)+Math.pow(u[10],2)+Math.pow(u[11],2)+Math.pow(u[12],2)+Math.pow(u[13],2)+Math.pow(u[14],2)+Math.pow(u[15],2))},s.exports=p},{"./common.js":117}],122:[function(r,u,o){var q=r("./common.js"),t=r("./mat3.js"),s=r("./vec3.js"),p=r("./vec4.js"),v={};v.create=function(){var w=new q.ARRAY_TYPE(4);return w[0]=0,w[1]=0,w[2]=0,w[3]=1,w},v.rotationTo=function(){var z=s.create(),w=s.fromValues(1,0,0),A=s.fromValues(0,1,0);return function(C,B,E){var D=s.dot(B,E);return -0.999999>D?(s.cross(z,w,B),s.length(z)<0.000001&&s.cross(z,A,B),s.normalize(z,z),v.setAxisAngle(C,z,Math.PI),C):D>0.999999?(C[0]=0,C[1]=0,C[2]=0,C[3]=1,C):(s.cross(z,B,E),C[0]=z[0],C[1]=z[1],C[2]=z[2],C[3]=1+D,v.normalize(C,C))}}(),v.setAxes=function(){var w=t.create();return function(z,C,B,A){return w[0]=B[0],w[3]=B[1],w[6]=B[2],w[1]=A[0],w[4]=A[1],w[7]=A[2],w[2]=-C[0],w[5]=-C[1],w[8]=-C[2],v.normalize(z,v.fromMat3(z,w))}}(),v.clone=p.clone,v.fromValues=p.fromValues,v.copy=p.copy,v.set=p.set,v.identity=function(w){return w[0]=0,w[1]=0,w[2]=0,w[3]=1,w},v.setAxisAngle=function(z,w,B){B=0.5*B;var A=Math.sin(B);return z[0]=A*w[0],z[1]=A*w[1],z[2]=A*w[2],z[3]=Math.cos(B),z},v.add=p.add,v.multiply=function(H,F,D){var w=F[0],G=F[1],B=F[2],E=F[3],z=D[0],A=D[1],I=D[2],C=D[3];return H[0]=w*C+E*z+G*I-B*A,H[1]=G*C+E*A+B*z-w*I,H[2]=B*C+E*I+w*A-G*z,H[3]=E*C-w*z-G*A-B*I,H},v.mul=v.multiply,v.scale=p.scale,v.rotateX=function(G,E,C){C*=0.5;var w=E[0],F=E[1],B=E[2],D=E[3],z=Math.sin(C),A=Math.cos(C);return G[0]=w*A+D*z,G[1]=F*A+B*z,G[2]=B*A-F*z,G[3]=D*A-w*z,G},v.rotateY=function(G,E,C){C*=0.5;var w=E[0],F=E[1],B=E[2],D=E[3],z=Math.sin(C),A=Math.cos(C);return G[0]=w*A-B*z,G[1]=F*A+D*z,G[2]=B*A+w*z,G[3]=D*A-F*z,G},v.rotateZ=function(G,E,C){C*=0.5;var w=E[0],F=E[1],B=E[2],D=E[3],z=Math.sin(C),A=Math.cos(C);return G[0]=w*A+F*z,G[1]=F*A-w*z,G[2]=B*A+D*z,G[3]=D*A-B*z,G},v.calculateW=function(A,w){var C=w[0],B=w[1],z=w[2];return A[0]=C,A[1]=B,A[2]=z,A[3]=Math.sqrt(Math.abs(1-C*C-B*B-z*z)),A},v.dot=p.dot,v.lerp=p.lerp,v.slerp=function(P,K,H,w){var O,B,J,z,A,Q=K[0],E=K[1],N=K[2],D=K[3],G=H[0],F=H[1],I=H[2],C=H[3];return B=Q*G+E*F+N*I+D*C,0>B&&(B=-B,G=-G,F=-F,I=-I,C=-C),1-B>0.000001?(O=Math.acos(B),J=Math.sin(O),z=Math.sin((1-w)*O)/J,A=Math.sin(w*O)/J):(z=1-w,A=w),P[0]=z*Q+A*G,P[1]=z*E+A*F,P[2]=z*N+A*I,P[3]=z*D+A*C,P},v.sqlerp=function(){var z=v.create(),w=v.create();return function(D,B,A,F,E,C){return v.slerp(z,B,E,C),v.slerp(w,A,F,C),v.slerp(D,z,w,2*C*(1-C)),D}}(),v.invert=function(A,w){var D=w[0],B=w[1],z=w[2],F=w[3],E=D*D+B*B+z*z+F*F,C=E?1/E:0;return A[0]=-D*C,A[1]=-B*C,A[2]=-z*C,A[3]=F*C,A},v.conjugate=function(z,w){return z[0]=-w[0],z[1]=-w[1],z[2]=-w[2],z[3]=w[3],z},v.length=p.length,v.len=v.length,v.squaredLength=p.squaredLength,v.sqrLen=v.squaredLength,v.normalize=p.normalize,v.fromMat3=function(A,w){var C,B=w[0]+w[4]+w[8];if(B>0){C=Math.sqrt(B+1),A[3]=0.5*C,C=0.5/C,A[0]=(w[5]-w[7])*C,A[1]=(w[6]-w[2])*C,A[2]=(w[1]-w[3])*C}else{var z=0;w[4]>w[0]&&(z=1),w[8]>w[3*z+z]&&(z=2);var E=(z+1)%3,D=(z+2)%3;C=Math.sqrt(w[3*z+z]-w[3*E+E]-w[3*D+D]+1),A[z]=0.5*C,C=0.5/C,A[3]=(w[3*E+D]-w[3*D+E])*C,A[E]=(w[3*E+z]+w[3*z+E])*C,A[D]=(w[3*D+z]+w[3*z+D])*C}return A},v.str=function(w){return"quat("+w[0]+", "+w[1]+", "+w[2]+", "+w[3]+")"},u.exports=v},{"./common.js":117,"./mat3.js":120,"./vec3.js":124,"./vec4.js":125}],123:[function(q,r,o){var p=q("./common.js"),s={};s.create=function(){var t=new p.ARRAY_TYPE(2);return t[0]=0,t[1]=0,t},s.clone=function(u){var t=new p.ARRAY_TYPE(2);return t[0]=u[0],t[1]=u[1],t},s.fromValues=function(v,u){var t=new p.ARRAY_TYPE(2);return t[0]=v,t[1]=u,t},s.copy=function(u,t){return u[0]=t[0],u[1]=t[1],u},s.set=function(v,u,t){return v[0]=u,v[1]=t,v},s.add=function(v,u,t){return v[0]=u[0]+t[0],v[1]=u[1]+t[1],v},s.subtract=function(v,u,t){return v[0]=u[0]-t[0],v[1]=u[1]-t[1],v},s.sub=s.subtract,s.multiply=function(v,u,t){return v[0]=u[0]*t[0],v[1]=u[1]*t[1],v},s.mul=s.multiply,s.divide=function(v,u,t){return v[0]=u[0]/t[0],v[1]=u[1]/t[1],v},s.div=s.divide,s.min=function(v,u,t){return v[0]=Math.min(u[0],t[0]),v[1]=Math.min(u[1],t[1]),v},s.max=function(v,u,t){return v[0]=Math.max(u[0],t[0]),v[1]=Math.max(u[1],t[1]),v},s.scale=function(v,u,t){return v[0]=u[0]*t,v[1]=u[1]*t,v},s.scaleAndAdd=function(z,w,v,u){return z[0]=w[0]+v[0]*u,z[1]=w[1]+v[1]*u,z},s.distance=function(z,w){var v=w[0]-z[0],u=w[1]-z[1];return Math.sqrt(v*v+u*u)},s.dist=s.distance,s.squaredDistance=function(z,w){var v=w[0]-z[0],u=w[1]-z[1];return v*v+u*u},s.sqrDist=s.squaredDistance,s.length=function(v){var u=v[0],t=v[1];return Math.sqrt(u*u+t*t)},s.len=s.length,s.squaredLength=function(v){var u=v[0],t=v[1];return u*u+t*t},s.sqrLen=s.squaredLength,s.negate=function(u,t){return u[0]=-t[0],u[1]=-t[1],u},s.inverse=function(u,t){return u[0]=1/t[0],u[1]=1/t[1],u},s.normalize=function(A,w){var v=w[0],u=w[1],z=v*v+u*u;return z>0&&(z=1/Math.sqrt(z),A[0]=w[0]*z,A[1]=w[1]*z),A},s.dot=function(u,t){return u[0]*t[0]+u[1]*t[1]},s.cross=function(z,w,v){var u=w[0]*v[1]-w[1]*v[0];return z[0]=z[1]=0,z[2]=u,z},s.lerp=function(C,A,z,w){var B=A[0],v=A[1];return C[0]=B+w*(z[0]-B),C[1]=v+w*(z[1]-v),C},s.random=function(v,u){u=u||1;var t=2*p.RANDOM()*Math.PI;return v[0]=Math.cos(t)*u,v[1]=Math.sin(t)*u,v},s.transformMat2=function(A,w,v){var u=w[0],z=w[1];return A[0]=v[0]*u+v[2]*z,A[1]=v[1]*u+v[3]*z,A},s.transformMat2d=function(A,w,v){var u=w[0],z=w[1];return A[0]=v[0]*u+v[2]*z+v[4],A[1]=v[1]*u+v[3]*z+v[5],A},s.transformMat3=function(A,w,v){var u=w[0],z=w[1];return A[0]=v[0]*u+v[3]*z+v[6],A[1]=v[1]*u+v[4]*z+v[7],A},s.transformMat4=function(A,w,v){var u=w[0],z=w[1];return A[0]=v[0]*u+v[4]*z+v[12],A[1]=v[1]*u+v[5]*z+v[13],A},s.forEach=function(){var t=s.create();return function(E,D,C,F,A,z){var w,B;for(D||(D=2),C||(C=0),B=F?Math.min(F*D+C,E.length):E.length,w=C;B>w;w+=D){t[0]=E[w],t[1]=E[w+1],A(t,t,z),E[w]=t[0],E[w+1]=t[1]}return E}}(),s.str=function(t){return"vec2("+t[0]+", "+t[1]+")"},r.exports=s},{"./common.js":117}],124:[function(q,s,o){var p=q("./common.js"),r={};r.create=function(){var t=new p.ARRAY_TYPE(3);return t[0]=0,t[1]=0,t[2]=0,t},r.clone=function(v){var u=new p.ARRAY_TYPE(3);return u[0]=v[0],u[1]=v[1],u[2]=v[2],u},r.fromValues=function(z,u,w){var v=new p.ARRAY_TYPE(3);return v[0]=z,v[1]=u,v[2]=w,v},r.copy=function(v,u){return v[0]=u[0],v[1]=u[1],v[2]=u[2],v},r.set=function(z,u,w,v){return z[0]=u,z[1]=w,z[2]=v,z},r.add=function(w,u,v){return w[0]=u[0]+v[0],w[1]=u[1]+v[1],w[2]=u[2]+v[2],w},r.subtract=function(w,u,v){return w[0]=u[0]-v[0],w[1]=u[1]-v[1],w[2]=u[2]-v[2],w},r.sub=r.subtract,r.multiply=function(w,u,v){return w[0]=u[0]*v[0],w[1]=u[1]*v[1],w[2]=u[2]*v[2],w},r.mul=r.multiply,r.divide=function(w,u,v){return w[0]=u[0]/v[0],w[1]=u[1]/v[1],w[2]=u[2]/v[2],w},r.div=r.divide,r.min=function(w,u,v){return w[0]=Math.min(u[0],v[0]),w[1]=Math.min(u[1],v[1]),w[2]=Math.min(u[2],v[2]),w},r.max=function(w,u,v){return w[0]=Math.max(u[0],v[0]),w[1]=Math.max(u[1],v[1]),w[2]=Math.max(u[2],v[2]),w},r.scale=function(w,u,v){return w[0]=u[0]*v,w[1]=u[1]*v,w[2]=u[2]*v,w},r.scaleAndAdd=function(z,u,w,v){return z[0]=u[0]+w[0]*v,z[1]=u[1]+w[1]*v,z[2]=u[2]+w[2]*v,z},r.distance=function(A,u){var w=u[0]-A[0],v=u[1]-A[1],z=u[2]-A[2];return Math.sqrt(w*w+v*v+z*z)},r.dist=r.distance,r.squaredDistance=function(A,u){var w=u[0]-A[0],v=u[1]-A[1],z=u[2]-A[2];return w*w+v*v+z*z},r.sqrDist=r.squaredDistance,r.length=function(z){var u=z[0],w=z[1],v=z[2];return Math.sqrt(u*u+w*w+v*v)},r.len=r.length,r.squaredLength=function(z){var u=z[0],w=z[1],v=z[2];return u*u+w*w+v*v},r.sqrLen=r.squaredLength,r.negate=function(v,u){return v[0]=-u[0],v[1]=-u[1],v[2]=-u[2],v},r.inverse=function(v,u){return v[0]=1/u[0],v[1]=1/u[1],v[2]=1/u[2],v},r.normalize=function(B,v){var z=v[0],w=v[1],A=v[2],u=z*z+w*w+A*A;return u>0&&(u=1/Math.sqrt(u),B[0]=v[0]*u,B[1]=v[1]*u,B[2]=v[2]*u),B},r.dot=function(v,u){return v[0]*u[0]+v[1]*u[1]+v[2]*u[2]},r.cross=function(z,G,B){var w=G[0],C=G[1],D=G[2],F=B[0],E=B[1],A=B[2];return z[0]=C*A-D*E,z[1]=D*F-w*A,z[2]=w*E-C*F,z},r.lerp=function(D,z,B,A){var C=z[0],v=z[1],w=z[2];return D[0]=C+A*(B[0]-C),D[1]=v+A*(B[1]-v),D[2]=w+A*(B[2]-w),D},r.hermite=function(A,H,C,w,D,E){var G=E*E,F=G*(2*E-3)+1,B=G*(E-2)+E,z=G*(E-1),I=G*(3-2*E);return A[0]=H[0]*F+C[0]*B+w[0]*z+D[0]*I,A[1]=H[1]*F+C[1]*B+w[1]*z+D[1]*I,A[2]=H[2]*F+C[2]*B+w[2]*z+D[2]*I,A},r.bezier=function(A,J,D,w,F,G){var I=1-G,H=I*I,B=G*G,z=H*I,K=3*G*H,C=3*B*I,E=B*G;return A[0]=J[0]*z+D[0]*K+w[0]*C+F[0]*E,A[1]=J[1]*z+D[1]*K+w[1]*C+F[1]*E,A[2]=J[2]*z+D[2]*K+w[2]*C+F[2]*E,A},r.random=function(A,u){u=u||1;var w=2*p.RANDOM()*Math.PI,v=2*p.RANDOM()-1,z=Math.sqrt(1-v*v)*u;return A[0]=Math.cos(w)*z,A[1]=Math.sin(w)*z,A[2]=v*u,A},r.transformMat4=function(D,z,B){var A=z[0],C=z[1],v=z[2],w=B[3]*A+B[7]*C+B[11]*v+B[15];return w=w||1,D[0]=(B[0]*A+B[4]*C+B[8]*v+B[12])/w,D[1]=(B[1]*A+B[5]*C+B[9]*v+B[13])/w,D[2]=(B[2]*A+B[6]*C+B[10]*v+B[14])/w,D},r.transformMat3=function(B,v,z){var w=v[0],A=v[1],u=v[2];return B[0]=w*z[0]+A*z[3]+u*z[6],B[1]=w*z[1]+A*z[4]+u*z[7],B[2]=w*z[2]+A*z[5]+u*z[8],B},r.transformQuat=function(A,K,E){var w=K[0],G=K[1],H=K[2],J=E[0],I=E[1],B=E[2],z=E[3],N=z*w+I*H-B*G,D=z*G+B*w-J*H,F=z*H+J*G-I*w,C=-J*w-I*G-B*H;return A[0]=N*z+C*-J+D*-B-F*-I,A[1]=D*z+C*-I+F*-J-N*-B,A[2]=F*z+C*-B+N*-I-D*-J,A},r.rotateX=function(B,v,z,w){var A=[],u=[];return A[0]=v[0]-z[0],A[1]=v[1]-z[1],A[2]=v[2]-z[2],u[0]=A[0],u[1]=A[1]*Math.cos(w)-A[2]*Math.sin(w),u[2]=A[1]*Math.sin(w)+A[2]*Math.cos(w),B[0]=u[0]+z[0],B[1]=u[1]+z[1],B[2]=u[2]+z[2],B},r.rotateY=function(B,v,z,w){var A=[],u=[];return A[0]=v[0]-z[0],A[1]=v[1]-z[1],A[2]=v[2]-z[2],u[0]=A[2]*Math.sin(w)+A[0]*Math.cos(w),u[1]=A[1],u[2]=A[2]*Math.cos(w)-A[0]*Math.sin(w),B[0]=u[0]+z[0],B[1]=u[1]+z[1],B[2]=u[2]+z[2],B},r.rotateZ=function(B,v,z,w){var A=[],u=[];return A[0]=v[0]-z[0],A[1]=v[1]-z[1],A[2]=v[2]-z[2],u[0]=A[0]*Math.cos(w)-A[1]*Math.sin(w),u[1]=A[0]*Math.sin(w)+A[1]*Math.cos(w),u[2]=A[2],B[0]=u[0]+z[0],B[1]=u[1]+z[1],B[2]=u[2]+z[2],B},r.forEach=function(){var t=r.create();return function(C,E,D,F,w,A){var z,B;for(E||(E=3),D||(D=0),B=F?Math.min(F*E+D,C.length):C.length,z=D;B>z;z+=E){t[0]=C[z],t[1]=C[z+1],t[2]=C[z+2],w(t,t,A),C[z]=t[0],C[z+1]=t[1],C[z+2]=t[2]}return C}}(),r.angle=function(A,u){var w=r.fromValues(A[0],A[1],A[2]),v=r.fromValues(u[0],u[1],u[2]);r.normalize(w,w),r.normalize(v,v);var z=r.dot(w,v);return z>1?0:Math.acos(z)},r.str=function(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"},s.exports=r},{"./common.js":117}],125:[function(r,s,o){var q=r("./common.js"),p={};p.create=function(){var t=new q.ARRAY_TYPE(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t},p.clone=function(t){var u=new q.ARRAY_TYPE(4);return u[0]=t[0],u[1]=t[1],u[2]=t[2],u[3]=t[3],u},p.fromValues=function(w,A,u,v){var z=new q.ARRAY_TYPE(4);return z[0]=w,z[1]=A,z[2]=u,z[3]=v,z},p.copy=function(t,u){return t[0]=u[0],t[1]=u[1],t[2]=u[2],t[3]=u[3],t},p.set=function(w,A,u,v,z){return w[0]=A,w[1]=u,w[2]=v,w[3]=z,w},p.add=function(v,w,u){return v[0]=w[0]+u[0],v[1]=w[1]+u[1],v[2]=w[2]+u[2],v[3]=w[3]+u[3],v},p.subtract=function(v,w,u){return v[0]=w[0]-u[0],v[1]=w[1]-u[1],v[2]=w[2]-u[2],v[3]=w[3]-u[3],v},p.sub=p.subtract,p.multiply=function(v,w,u){return v[0]=w[0]*u[0],v[1]=w[1]*u[1],v[2]=w[2]*u[2],v[3]=w[3]*u[3],v},p.mul=p.multiply,p.divide=function(v,w,u){return v[0]=w[0]/u[0],v[1]=w[1]/u[1],v[2]=w[2]/u[2],v[3]=w[3]/u[3],v},p.div=p.divide,p.min=function(v,w,u){return v[0]=Math.min(w[0],u[0]),v[1]=Math.min(w[1],u[1]),v[2]=Math.min(w[2],u[2]),v[3]=Math.min(w[3],u[3]),v},p.max=function(v,w,u){return v[0]=Math.max(w[0],u[0]),v[1]=Math.max(w[1],u[1]),v[2]=Math.max(w[2],u[2]),v[3]=Math.max(w[3],u[3]),v},p.scale=function(v,w,u){return v[0]=w[0]*u,v[1]=w[1]*u,v[2]=w[2]*u,v[3]=w[3]*u,v},p.scaleAndAdd=function(w,z,u,v){return w[0]=z[0]+u[0]*v,w[1]=z[1]+u[1]*v,w[2]=z[2]+u[2]*v,w[3]=z[3]+u[3]*v,w},p.distance=function(A,C){var w=C[0]-A[0],z=C[1]-A[1],B=C[2]-A[2],v=C[3]-A[3];return Math.sqrt(w*w+z*z+B*B+v*v)},p.dist=p.distance,p.squaredDistance=function(A,C){var w=C[0]-A[0],z=C[1]-A[1],B=C[2]-A[2],v=C[3]-A[3];return w*w+z*z+B*B+v*v},p.sqrDist=p.squaredDistance,p.length=function(w){var A=w[0],u=w[1],v=w[2],z=w[3];return Math.sqrt(A*A+u*u+v*v+z*z)},p.len=p.length,p.squaredLength=function(w){var A=w[0],u=w[1],v=w[2],z=w[3];return A*A+u*u+v*v+z*z},p.sqrLen=p.squaredLength,p.negate=function(t,u){return t[0]=-u[0],t[1]=-u[1],t[2]=-u[2],t[3]=-u[3],t},p.inverse=function(t,u){return t[0]=1/u[0],t[1]=1/u[1],t[2]=1/u[2],t[3]=1/u[3],t},p.normalize=function(B,D){var z=D[0],A=D[1],C=D[2],w=D[3],v=z*z+A*A+C*C+w*w;return v>0&&(v=1/Math.sqrt(v),B[0]=z*v,B[1]=A*v,B[2]=C*v,B[3]=w*v),B},p.dot=function(t,u){return t[0]*u[0]+t[1]*u[1]+t[2]*u[2]+t[3]*u[3]},p.lerp=function(D,F,B,C){var E=F[0],A=F[1],w=F[2],z=F[3];return D[0]=E+C*(B[0]-E),D[1]=A+C*(B[1]-A),D[2]=w+C*(B[2]-w),D[3]=z+C*(B[3]-z),D},p.random=function(t,u){return u=u||1,t[0]=q.RANDOM(),t[1]=q.RANDOM(),t[2]=q.RANDOM(),t[3]=q.RANDOM(),p.normalize(t,t),p.scale(t,t,u),t},p.transformMat4=function(B,D,z){var A=D[0],C=D[1],w=D[2],v=D[3];return B[0]=z[0]*A+z[4]*C+z[8]*w+z[12]*v,B[1]=z[1]*A+z[5]*C+z[9]*w+z[13]*v,B[2]=z[2]*A+z[6]*C+z[10]*w+z[14]*v,B[3]=z[3]*A+z[7]*C+z[11]*w+z[15]*v,B},p.transformQuat=function(E,A,K){var w=A[0],G=A[1],J=A[2],H=K[0],I=K[1],C=K[2],z=K[3],D=z*w+I*J-C*G,N=z*G+C*w-H*J,B=z*J+H*G-I*w,F=-H*w-I*G-C*J;return E[0]=D*z+F*-H+N*-C-B*-I,E[1]=N*z+F*-I+B*-H-D*-C,E[2]=B*z+F*-C+D*-I-N*-H,E[3]=A[3],E},p.forEach=function(){var t=p.create();return function(F,C,D,E,A,w){var z,B;for(C||(C=4),D||(D=0),B=E?Math.min(E*C+D,F.length):F.length,z=D;B>z;z+=C){t[0]=F[z],t[1]=F[z+1],t[2]=F[z+2],t[3]=F[z+3],A(t,t,w),F[z]=t[0],F[z+1]=t[1],F[z+2]=t[2],F[z+3]=t[3]}return F}}(),p.str=function(t){return"vec4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},s.exports=p},{"./common.js":117}],126:[function(p,q,o){o.read=function(H,z,J,u,C){var G,v,I=8*C-u-1,D=(1<<I)-1,F=D>>1,B=-7,E=J?C-1:0,A=J?-1:1,K=H[z+E];for(E+=A,G=K&(1<<-B)-1,K>>=-B,B+=I;B>0;G=256*G+H[z+E],E+=A,B-=8){}for(v=G&(1<<-B)-1,G>>=-B,B+=u;B>0;v=256*v+H[z+E],E+=A,B-=8){}if(0===G){G=1-F}else{if(G===D){return v?NaN:(K?-1:1)*(1/0)}v+=Math.pow(2,u),G-=F}return(K?-1:1)*v*Math.pow(2,G-u)},o.write=function(J,A,P,v,E,I){var z,K,F,H=8*I-E-1,D=(1<<H)-1,G=D>>1,B=23===E?Math.pow(2,-24)-Math.pow(2,-77):0,Q=v?0:I-1,O=v?1:-1,C=0>A||0===A&&0>1/A?1:0;for(A=Math.abs(A),isNaN(A)||A===1/0?(K=isNaN(A)?1:0,z=D):(z=Math.floor(Math.log(A)/Math.LN2),A*(F=Math.pow(2,-z))<1&&(z--,F*=2),A+=z+G>=1?B/F:B*Math.pow(2,1-G),A*F>=2&&(z++,F/=2),z+G>=D?(K=0,z=D):z+G>=1?(K=(A*F-1)*Math.pow(2,E),z+=G):(K=A*Math.pow(2,G-1)*Math.pow(2,E),z=0));E>=8;J[P+Q]=255&K,Q+=O,K/=256,E-=8){}for(z=z<<E|K,H+=E;H>0;J[P+Q]=255&z,Q+=O,z/=256,H-=8){}J[P+Q-O]|=128*C}},{}],127:[function(p,q,o){"function"==typeof Object.create?q.exports=function(r,s){r.super_=s,r.prototype=Object.create(s.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}})}:q.exports=function(r,s){r.super_=s;var u=function(){};u.prototype=s.prototype,r.prototype=new u,r.prototype.constructor=r}},{}],128:[function(q,r,p){function s(u){return function(){return u}}function o(v,u,w){return v*(1-w)+u*w}function t(v,u,A){for(var w=[],z=0;z<v.length;z++){w[z]=o(v[z],u[z],A)}return w}p.interpolated=function(v){if(!v.stops){return s(v)}var u=v.stops,z=v.base||1,w=Array.isArray(u[0][1])?t:o;return function(E){for(var H,A,C=0;C<u.length;C++){var B=u[C];if(B[0]<=E&&(H=B),B[0]>E){A=B;break}}if(H&&A){var D=A[0]-H[0],F=E-H[0],G=1===z?F/D:(Math.pow(z,F)-1)/(Math.pow(z,D)-1);return w(H[1],A[1],G)}return H?H[1]:A?A[1]:void 0}},p["piecewise-constant"]=function(v){if(!v.stops){return s(v)}var u=v.stops;return function(w){for(var z=0;z<u.length;z++){if(u[z][0]>w){return u[0===z?0:z-1][1]}}return u[u.length-1][1]}}},{}],129:[function(q,r,p){var o=q("../../reference/latest.min.js"),s=q("./parsed");r.exports=function(t){return s(t,o)}},{"../../reference/latest.min.js":132,"./parsed":130}],130:[function(r,s,p){function o(v){return v instanceof Number?"number":v instanceof String?"string":v instanceof Boolean?"boolean":Array.isArray(v)?"array":null===v?"null":typeof v}function q(v){return v instanceof Number||v instanceof String||v instanceof Boolean?v.valueOf():v}var u=r("csscolorparser").parseCSSColor,t=r("util").format;s.exports=function(C,z){function B(H,F){var G={message:(H?H+": ":"")+t.apply(t,Array.prototype.slice.call(arguments,2))};null!==F&&void 0!==F&&F.__line__&&(G.line=F.__line__),A.push(G)}function E(I,J,G){var H=o(J);if("string"===H&&"@"===J[0]){if(z.$version>7){return B(I,J,"constants have been deprecated as of v8")}if(!(J in v)){return B(I,J,'constant "%s" not found',J)}J=v[J],H=o(J)}if(G["function"]&&"object"===H){return E["function"](I,J,G)}if(G.type){var F=E[G.type];if(F){return F(I,J,G)}G=z[G.type]}E.object(I,J,G)}function D(F){return function(H,J,I){var G=o(J);G!==F&&B(H,J,"%s expected, %s found",F,G),"minimum" in I&&J<I.minimum&&B(H,J,"%s is less than the minimum value %s",J,I.minimum),"maximum" in I&&J>I.maximum&&B(H,J,"%s is greater than the maximum value %s",J,I.maximum)}}var v=C.constants||{},w={},A=[];return E.constants=function(G,I){if(z.$version>7){if(I){return B(G,I,"constants have been deprecated as of v8")}}else{var H=o(I);if("object"!==H){return B(G,I,"object expected, %s found",H)}for(var F in I){"@"!==F[0]&&B(G+"."+F,I[F],'constants must start with "@"')}}},E.source=function(H,I){if(!I.type){return void B(H,I,'"type" is required')}var F=q(I.type);switch(F){case"vector":case"raster":if(E.object(H,I,z.source_tile),"url" in I){for(var G in I){["type","url","tileSize"].indexOf(G)<0&&B(H+"."+G,I[G],'a source with a "url" property may not include a "%s" property',G)}}break;case"geojson":E.object(H,I,z.source_geojson);break;case"video":E.object(H,I,z.source_video);break;case"image":E.object(H,I,z.source_image);break;default:E["enum"](H+".type",I.type,{values:["vector","raster","geojson","video","image"]})}},E.layer=function(J,F){F.type||F.ref||B(J,F,'either "type" or "ref" is required');var H=q(F.type),G=q(F.ref);if(F.id&&(w[F.id]?B(J,F.id,'duplicate layer id "%s", previously used at line %d',F.id,w[F.id]):w[F.id]=F.id.__line__),"ref" in F){["type","source","source-layer","filter","layout"].forEach(function(M){M in F&&B(J,F[M],'"%s" is prohibited for ref layers',M)});var K;C.layers.forEach(function(M){M.id==G&&(K=M)}),K?K.ref?B(J,F.ref,"ref cannot reference another ref layer"):H=K.type:B(J,F.ref,'ref layer "%s" not found',G)}else{if("background"!==H){if(F.source){var I=C.sources[F.source];I?"vector"==I.type&&"raster"==H?B(J,F.source,'layer "%s" requires a raster source',F.id):"raster"==I.type&&"raster"!=H?B(J,F.source,'layer "%s" requires a vector source',F.id):"vector"!=I.type||F["source-layer"]||B(J,F,'layer "%s" must specify a "source-layer"',F.id):B(J,F.source,'source "%s" not found',F.source)}else{B(J,F,'missing required property "source"')}}}E.object(J,F,z.layer,{filter:E.filter,layout:function(N,M){var O=z["layout_"+H];return H&&O&&E(N,M,O)},paint:function(N,M){var O=z["paint_"+H];return H&&O&&E(N,M,O)}})},E.object=function(K,G,N,I){I=I||{};var P=o(G);if("object"!==P){return B(K,G,"object expected, %s found",P)}for(var O in G){var M=O.split(".")[0],J=N[M]||N["*"],H=M.match(/^(.*)-transition$/);J?(I[M]||E)((K?K+".":K)+O,G[O],J):H&&N[H[1]]&&N[H[1]].transition?E((K?K+".":K)+O,G[O],z.transition):""!==K&&1!==K.split(".").length&&B(K,G[O],'unknown property "%s"',O)}for(var F in N){N[F].required&&void 0===N[F]["default"]&&void 0===G[F]&&B(K,G,'missing required property "%s"',F)}},E.array=function(I,K,F,H){if("array"!==o(K)){return B(I,K,"array expected, %s found",o(K))}if(F.length&&K.length!==F.length){return B(I,K,"array length %d expected, length %d found",F.length,K.length)}if(F["min-length"]&&K.length<F["min-length"]){return B(I,K,"array length at least %d expected, length %d found",F["min-length"],K.length)}var J={type:F.value};C.version<7&&(J["function"]=F["function"]),"object"===o(F.value)&&(J=F.value);for(var G=0;G<K.length;G++){(H||E)(I+"["+G+"]",K[G],J)}},E.filter=function(H,I){var F;if("array"!==o(I)){return B(H,I,"array expected, %s found",o(I))}if(I.length<1){return B(H,I,"filter array must have at least 1 element")}switch(E["enum"](H+"[0]",I[0],z.filter_operator),q(I[0])){case"<":case"<=":case">":case">=":I.length>=2&&"$type"==I[1]&&B(H,I,'"$type" cannot be use with operator "%s"',I[0]);case"==":case"!=":3!=I.length&&B(H,I,'filter array for operator "%s" must have 3 elements',I[0]);case"in":case"!in":I.length>=2&&(F=o(I[1]),"string"!==F?B(H+"[1]",I[1],"string expected, %s found",F):"@"===I[1][0]&&B(H+"[1]",I[1],"filter key cannot be a constant"));for(var G=2;G<I.length;G++){F=o(I[G]),"$type"==I[1]?E["enum"](H+"["+G+"]",I[G],z.geometry_type):"string"===F&&"@"===I[G][0]?B(H+"["+G+"]",I[G],"filter value cannot be a constant"):"string"!==F&&"number"!==F&&"boolean"!==F&&B(H+"["+G+"]",I[G],"string, number, or boolean expected, %s found",F)}break;case"any":case"all":case"none":for(G=1;G<I.length;G++){E.filter(H+"["+G+"]",I[G])}}},E["function"]=function(G,H,F){E.object(G,H,z["function"],{stops:function(K,J,M){var I=-(1/0);E.array(K,J,M,function(O,N){return"array"!==o(N)?B(O,N,"array expected, %s found",o(N)):2!==N.length?B(O,N,"array length %d expected, length %d found",2,N.length):(E(O+"[0]",N[0],{type:"number"}),E(O+"[1]",N[1],F),void ("number"===o(N[0])&&("piecewise-constant"===F["function"]&&N[0]%1!==0&&B(O+"[0]",N[0],"zoom level for piecewise-constant functions must be an integer"),N[0]<=I&&B(O+"[0]",N[0],"array stops must appear in ascending order and have no duplicates"),I=N[0])))}),"array"===o(J)&&0===J.length&&B(K,J,"array must have at least one stop")}})},E["enum"]=function(G,F,H){-1===H.values.indexOf(q(F))&&B(G,F,"expected one of [%s], %s found",H.values.join(", "),F)},E.color=function(G,F){var H=o(F);return"string"!==H?B(G,F,"color expected, %s found",H):null===u(F)?B(G,F,'color expected, "%s" found',F):void 0},E.number=D("number"),E.string=D("string"),E["boolean"]=D("boolean"),E["*"]=function(){},E("",C,z.$root),z.$version>7&&C.constants&&E.constants("constants",C.constants),A.sort(function(G,F){return G.line-F.line}),A}},{csscolorparser:107,util:143}],131:[function(p,q,o){q.exports=p("./v8.json")},{"./v8.json":133}],132:[function(p,q,o){q.exports=p("./v8.min.json")},{"./v8.min.json":134}],133:[function(p,q,o){q.exports={"$version":8,"$root":{version:{required:true,type:"enum",values:[8],doc:"Stylesheet version number. Must be 8.",example:8},name:{type:"string",doc:"A human-readable name for the style.",example:"Bright"},metadata:{type:"*",doc:"Arbitrary properties useful to track with the stylesheet, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'."},center:{type:"array",value:"number",doc:"Default map center in longitude and latitude.  The style center will be used only if the map has not been positioned by other means (e.g. map options or user interaction).",example:[-73.9749,40.7736]},zoom:{type:"number",doc:"Default zoom level.  The style zoom will be used only if the map has not been positioned by other means (e.g. map options or user interaction).",example:12.5},bearing:{type:"number","default":0,period:360,units:"degrees",doc:"Default bearing, in degrees.  The style bearing will be used only if the map has not been positioned by other means (e.g. map options or user interaction).",example:29},pitch:{type:"number","default":0,units:"degrees",doc:"Default pitch, in degrees. Zero is perpendicular to the surface.  The style pitch will be used only if the map has not been positioned by other means (e.g. map options or user interaction).",example:50},sources:{required:true,type:"sources",doc:"Data source specifications.",example:{"mapbox-streets":{type:"vector",url:"mapbox://mapbox.mapbox-streets-v6"}}},sprite:{type:"string",doc:"A base URL for retrieving the sprite image and metadata. The extensions `.png`, `.json` and scale factor `@2x.png` will be automatically appended.",example:"mapbox://sprites/mapbox/bright-v8"},glyphs:{type:"string",doc:"A URL template for loading signed-distance-field glyph sets in PBF format. Valid tokens are {fontstack} and {range}.",example:"mapbox://fonts/mapbox/{fontstack}/{range}.pbf"},transition:{type:"transition",doc:"A global transition definition to use as a default across properties.",example:{duration:300,delay:0}},layers:{required:true,type:"array",value:"layer",doc:"Layers will be drawn in the order of this array.",example:[{id:"water",source:"mapbox-streets","source-layer":"water",type:"fill",paint:{"fill-color":"#00ffff"}}]}},sources:{"*":{type:"source",doc:"Specification of a data source. For vector and raster sources, either TileJSON or a URL to a TileJSON must be provided. For GeoJSON and video sources, a URL must be provided."}},source:["source_tile","source_geojson","source_video","source_image"],source_tile:{type:{required:true,type:"enum",values:["vector","raster"],doc:"The data type of the tile source."},url:{type:"string",doc:"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<mapid>`."},tiles:{type:"array",value:"string",doc:"An array of one or more tile source URLs, as in the TileJSON spec."},minzoom:{type:"number","default":0,doc:"Minimum zoom level for which tiles are available, as in the TileJSON spec."},maxzoom:{type:"number","default":22,doc:"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels."},tileSize:{type:"number","default":512,units:"pixels",doc:"The minimum visual size to display tiles for this layer. Only configurable for raster layers."},"*":{type:"*",doc:"Other keys to configure the data source."}},source_geojson:{type:{required:true,type:"enum",values:["geojson"],doc:"The data type of the GeoJSON source."},data:{type:"*",doc:"A URL to a GeoJSON file, or inline GeoJSON."},maxzoom:{type:"number","default":14,doc:"Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom levels)."},buffer:{type:"number","default":64,doc:"Tile buffer size on each side (higher means fewer rendering artifacts near tile edges but slower performance)."},tolerance:{type:"number","default":3,doc:"Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance)."},cluster:{type:"boolean","default":false,doc:"If the data is a collection of point features, setting this to true clusters the points by radius into groups."},clusterRadius:{type:"number","default":400,doc:"Radius of each cluster when clustering points, relative to 4096 tile."},clusterMaxZoom:{type:"number",doc:"Max zoom to cluster points on. Defaults to one zoom less than maxzoom (so that last zoom features are not clustered)."}},source_video:{type:{required:true,type:"enum",values:["video"],doc:"The data type of the video source."},urls:{required:true,type:"array",value:"string",doc:"URLs to video content in order of preferred format."},coordinates:{required:true,doc:"Corners of video specified in longitude, latitude pairs.",type:"array",length:4,value:{type:"array",length:2,value:"number",doc:"A single longitude, latitude pair."}}},source_image:{type:{required:true,type:"enum",values:["image"],doc:"The data type of the image source."},url:{required:true,type:"string",doc:"URL that points to an image"},coordinates:{required:true,doc:"Corners of image specified in longitude, latitude pairs.",type:"array",length:4,value:{type:"array",length:2,value:"number",doc:"A single longitude, latitude pair."}}},layer:{id:{type:"string",doc:"Unique layer name.",required:true},type:{type:"enum",values:["fill","line","symbol","circle","raster","background"],doc:"Rendering type of this layer."},metadata:{type:"*",doc:"Arbitrary properties useful to track with the layer, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'."},ref:{type:"string",doc:"References another layer to copy `type`, `source`, `source-layer`, `minzoom`, `maxzoom`, `filter`, and `layout` properties from. This allows the layers to share processing and be more efficient."},source:{type:"string",doc:"Name of a source description to be used for this layer."},"source-layer":{type:"string",doc:"Layer to use from a vector tile source. Required if the source supports multiple layers."},minzoom:{type:"number",minimum:0,maximum:22,doc:"The minimum zoom level on which the layer gets parsed and appears on."},maxzoom:{type:"number",minimum:0,maximum:22,doc:"The maximum zoom level on which the layer gets parsed and appears on."},interactive:{type:"boolean",doc:"Enable querying of feature data from this layer for interactivity.","default":false},filter:{type:"filter",doc:"A expression specifying conditions on source features. Only features that match the filter are displayed."},layout:{type:"layout",doc:"Layout properties for the layer."},paint:{type:"paint",doc:"Default paint properties for this layer."},"paint.*":{type:"paint",doc:"Class-specific paint properties for this layer. The class name is the part after the first dot."}},layout:["layout_fill","layout_line","layout_circle","layout_symbol","layout_raster","layout_background"],layout_background:{visibility:{type:"enum","function":"piecewise-constant",values:["visible","none"],"default":"visible",doc:"The display of this layer. `none` hides this layer."}},layout_fill:{visibility:{type:"enum","function":"piecewise-constant",values:["visible","none"],"default":"visible",doc:"The display of this layer. `none` hides this layer."}},layout_circle:{visibility:{type:"enum","function":"piecewise-constant",values:["visible","none"],"default":"visible",doc:"The display of this layer. `none` hides this layer."}},layout_line:{"line-cap":{type:"enum","function":"piecewise-constant",values:["butt","round","square"],"default":"butt",doc:"The display of line endings."},"line-join":{type:"enum","function":"piecewise-constant",values:["bevel","round","miter"],"default":"miter",doc:"The display of lines when joining."},"line-miter-limit":{type:"number","default":2,"function":"interpolated",doc:"Used to automatically convert miter joins to bevel joins for sharp angles.",requires:[{"line-join":"miter"}]},"line-round-limit":{type:"number","default":1.05,"function":"interpolated",doc:"Used to automatically convert round joins to miter joins for shallow angles.",requires:[{"line-join":"round"}]},visibility:{type:"enum","function":"piecewise-constant",values:["visible","none"],"default":"visible",doc:"The display of this layer. `none` hides this layer."}},layout_symbol:{"symbol-placement":{type:"enum","function":"piecewise-constant",values:["point","line"],"default":"point",doc:"Label placement relative to its geometry. `line` can only be used on LineStrings and Polygons."},"symbol-spacing":{type:"number","default":250,minimum:1,"function":"interpolated",units:"pixels",doc:"Distance between two symbol anchors.",requires:[{"symbol-placement":"line"}]},"symbol-avoid-edges":{type:"boolean","function":"piecewise-constant","default":false,doc:"If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer."},"icon-allow-overlap":{type:"boolean","function":"piecewise-constant","default":false,doc:"If true, the icon will be visible even if it collides with other previously drawn symbols.",requires:["icon-image"]},"icon-ignore-placement":{type:"boolean","function":"piecewise-constant","default":false,doc:"If true, other symbols can be visible even if they collide with the icon.",requires:["icon-image"]},"icon-optional":{type:"boolean","function":"piecewise-constant","default":false,doc:"If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not.",requires:["icon-image","text-field"]},"icon-rotation-alignment":{type:"enum","function":"piecewise-constant",values:["map","viewport"],"default":"viewport",doc:"Orientation of icon when map is rotated.",requires:["icon-image"]},"icon-size":{type:"number","default":1,minimum:0,"function":"interpolated",doc:"Scale factor for icon. 1 is original size, 3 triples the size.",requires:["icon-image"]},"icon-image":{type:"string","function":"piecewise-constant",doc:"A string with {tokens} replaced, referencing the data property to pull from.",tokens:true},"icon-rotate":{type:"number","default":0,period:360,"function":"interpolated",units:"degrees",doc:"Rotates the icon clockwise.",requires:["icon-image"]},"icon-padding":{type:"number","default":2,minimum:0,"function":"interpolated",units:"pixels",doc:"Size of the additional area around the icon bounding box used for detecting symbol collisions.",requires:["icon-image"]},"icon-keep-upright":{type:"boolean","function":"piecewise-constant","default":false,doc:"If true, the icon may be flipped to prevent it from being rendered upside-down.",requires:["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":"line"}]},"icon-offset":{type:"array",value:"number",length:2,"default":[0,0],"function":"interpolated",doc:"Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up.",requires:["icon-image"]},"text-rotation-alignment":{type:"enum","function":"piecewise-constant",values:["map","viewport"],"default":"viewport",doc:"Orientation of text when map is rotated.",requires:["text-field"]},"text-field":{type:"string","function":"piecewise-constant","default":"",tokens:true,doc:"Value to use for a text label. Feature properties are specified using tokens like {field_name}."},"text-font":{type:"array",value:"string","function":"piecewise-constant","default":["Open Sans Regular","Arial Unicode MS Regular"],doc:"Font stack to use for displaying text.",requires:["text-field"]},"text-size":{type:"number","default":16,minimum:0,units:"pixels","function":"interpolated",doc:"Font size.",requires:["text-field"]},"text-max-width":{type:"number","default":10,minimum:0,units:"em","function":"interpolated",doc:"The maximum line width for text wrapping.",requires:["text-field"]},"text-line-height":{type:"number","default":1.2,units:"em","function":"interpolated",doc:"Text leading value for multi-line text.",requires:["text-field"]},"text-letter-spacing":{type:"number","default":0,units:"em","function":"interpolated",doc:"Text tracking amount.",requires:["text-field"]},"text-justify":{type:"enum","function":"piecewise-constant",values:["left","center","right"],"default":"center",doc:"Text justification options.",requires:["text-field"]},"text-anchor":{type:"enum","function":"piecewise-constant",values:["center","left","right","top","bottom","top-left","top-right","bottom-left","bottom-right"],"default":"center",doc:"Part of the text placed closest to the anchor.",requires:["text-field"]},"text-max-angle":{type:"number","default":45,units:"degrees","function":"interpolated",doc:"Maximum angle change between adjacent characters.",requires:["text-field",{"symbol-placement":"line"}]},"text-rotate":{type:"number","default":0,period:360,units:"degrees","function":"interpolated",doc:"Rotates the text clockwise.",requires:["text-field"]},"text-padding":{type:"number","default":2,minimum:0,units:"pixels","function":"interpolated",doc:"Size of the additional area around the text bounding box used for detecting symbol collisions.",requires:["text-field"]},"text-keep-upright":{type:"boolean","function":"piecewise-constant","default":true,doc:"If true, the text may be flipped vertically to prevent it from being rendered upside-down.",requires:["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":"line"}]},"text-transform":{type:"enum","function":"piecewise-constant",values:["none","uppercase","lowercase"],"default":"none",doc:"Specifies how to capitalize text, similar to the CSS `text-transform` property.",requires:["text-field"]},"text-offset":{type:"array",doc:"Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up.",value:"number",units:"ems","function":"interpolated",length:2,"default":[0,0],requires:["text-field"]},"text-allow-overlap":{type:"boolean","function":"piecewise-constant","default":false,doc:"If true, the text will be visible even if it collides with other previously drawn symbols.",requires:["text-field"]},"text-ignore-placement":{type:"boolean","function":"piecewise-constant","default":false,doc:"If true, other symbols can be visible even if they collide with the text.",requires:["text-field"]},"text-optional":{type:"boolean","function":"piecewise-constant","default":false,doc:"If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not.",requires:["text-field","icon-image"]},visibility:{type:"enum","function":"piecewise-constant",values:["visible","none"],"default":"visible",doc:"The display of this layer. `none` hides this layer."}},layout_raster:{visibility:{type:"enum","function":"piecewise-constant",values:["visible","none"],"default":"visible",doc:"The display of this layer. `none` hides this layer."}},filter:{type:"array",value:"*",doc:"A filter selects specific features from a layer."},filter_operator:{type:"enum",values:["==","!=",">",">=","<","<=","in","!in","all","any","none"],doc:"The filter operator."},geometry_type:{type:"enum",values:["Point","LineString","Polygon"],doc:"The geometry type for the filter to select."},color_operation:{type:"enum",values:["lighten","saturate","spin","fade","mix"],doc:"A color operation to apply."},"function":{stops:{type:"array",required:true,doc:"An array of stops.",value:"function_stop"},base:{type:"number","default":1,minimum:0,doc:"The exponential base of the interpolation curve. It controls the rate at which the result increases. Higher values make the result increase more towards the high end of the range. With `1` the stops are interpolated linearly."}},function_stop:{type:"array",minimum:0,maximum:22,value:["number","color"],length:2,doc:"Zoom level and value pair."},paint:["paint_fill","paint_line","paint_circle","paint_symbol","paint_raster","paint_background"],paint_fill:{"fill-antialias":{type:"boolean","function":"piecewise-constant","default":true,doc:"Whether or not the fill should be antialiased."},"fill-opacity":{type:"number","function":"interpolated","default":1,minimum:0,maximum:1,doc:"The opacity given to the fill color.",transition:true},"fill-color":{type:"color","default":"#000000",doc:"The color of the fill.","function":"interpolated",transition:true,requires:[{"!":"fill-pattern"}]},"fill-outline-color":{type:"color",doc:"The outline color of the fill. Matches the value of `fill-color` if unspecified.","function":"interpolated",transition:true,requires:[{"!":"fill-pattern"},{"fill-antialias":true}]},"fill-translate":{type:"array",value:"number",length:2,"default":[0,0],"function":"interpolated",transition:true,units:"pixels",doc:"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively."},"fill-translate-anchor":{type:"enum","function":"piecewise-constant",values:["map","viewport"],doc:"Control whether the translation is relative to the map (north) or viewport (screen)","default":"map",requires:["fill-translate"]},"fill-pattern":{type:"string","function":"piecewise-constant",transition:true,doc:"Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512)."}},paint_line:{"line-opacity":{type:"number",doc:"The opacity at which the line will be drawn.","function":"interpolated","default":1,minimum:0,maximum:1,transition:true},"line-color":{type:"color",doc:"The color with which the line will be drawn.","default":"#000000","function":"interpolated",transition:true,requires:[{"!":"line-pattern"}]},"line-translate":{type:"array",value:"number",length:2,"default":[0,0],"function":"interpolated",transition:true,units:"pixels",doc:"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively."},"line-translate-anchor":{type:"enum","function":"piecewise-constant",values:["map","viewport"],doc:"Control whether the translation is relative to the map (north) or viewport (screen)","default":"map",requires:["line-translate"]},"line-width":{type:"number","default":1,minimum:0,"function":"interpolated",transition:true,units:"pixels",doc:"Stroke thickness."},"line-gap-width":{type:"number","default":0,minimum:0,doc:"Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.","function":"interpolated",transition:true,units:"pixels"},"line-offset":{type:"number","default":0,doc:'The line\'s offset perpendicular to its direction. Values may be positive or negative, where positive indicates "rightwards" (if you were moving in the direction of the line) and negative indicates "leftwards."',"function":"interpolated",transition:true,units:"pixels"},"line-blur":{type:"number","default":0,minimum:0,"function":"interpolated",transition:true,units:"pixels",doc:"Blur applied to the line, in pixels."},"line-dasharray":{type:"array",value:"number","function":"piecewise-constant",doc:"Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width.",minimum:0,transition:true,units:"line widths",requires:[{"!":"line-pattern"}]},"line-pattern":{type:"string","function":"piecewise-constant",transition:true,doc:"Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512)."}},paint_circle:{"circle-radius":{type:"number","default":5,minimum:0,"function":"interpolated",transition:true,units:"pixels",doc:"Circle radius."},"circle-color":{type:"color","default":"#000000",doc:"The color of the circle.","function":"interpolated",transition:true},"circle-blur":{type:"number","default":0,doc:"Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity.","function":"interpolated",transition:true},"circle-opacity":{type:"number",doc:"The opacity at which the circle will be drawn.","default":1,minimum:0,maximum:1,"function":"interpolated",transition:true},"circle-translate":{type:"array",value:"number",length:2,"default":[0,0],"function":"interpolated",transition:true,units:"pixels",doc:"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively."},"circle-translate-anchor":{type:"enum","function":"piecewise-constant",values:["map","viewport"],doc:"Control whether the translation is relative to the map (north) or viewport (screen)","default":"map",requires:["circle-translate"]}},paint_symbol:{"icon-opacity":{doc:"The opacity at which the icon will be drawn.",type:"number","default":1,minimum:0,maximum:1,"function":"interpolated",transition:true,requires:["icon-image"]},"icon-color":{type:"color","default":"#000000","function":"interpolated",transition:true,doc:"The color of the icon. This can only be used with sdf icons.",requires:["icon-image"]},"icon-halo-color":{type:"color","default":"rgba(0, 0, 0, 0)","function":"interpolated",transition:true,doc:"The color of the icon's halo. Icon halos can only be used with sdf icons.",requires:["icon-image"]},"icon-halo-width":{type:"number","default":0,minimum:0,"function":"interpolated",transition:true,units:"pixels",doc:"Distance of halo to the icon outline.",requires:["icon-image"]},"icon-halo-blur":{type:"number","default":0,minimum:0,"function":"interpolated",transition:true,units:"pixels",doc:"Fade out the halo towards the outside.",requires:["icon-image"]},"icon-translate":{type:"array",value:"number",length:2,"default":[0,0],"function":"interpolated",transition:true,units:"pixels",doc:"Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.",requires:["icon-image"]},"icon-translate-anchor":{type:"enum","function":"piecewise-constant",values:["map","viewport"],doc:"Control whether the translation is relative to the map (north) or viewport (screen).","default":"map",requires:["icon-image","icon-translate"]},"text-opacity":{type:"number",doc:"The opacity at which the text will be drawn.","default":1,minimum:0,maximum:1,"function":"interpolated",transition:true,requires:["text-field"]},"text-color":{type:"color",doc:"The color with which the text will be drawn.","default":"#000000","function":"interpolated",transition:true,requires:["text-field"]},"text-halo-color":{type:"color","default":"rgba(0, 0, 0, 0)","function":"interpolated",transition:true,doc:"The color of the text's halo, which helps it stand out from backgrounds.",requires:["text-field"]},"text-halo-width":{type:"number","default":0,minimum:0,"function":"interpolated",transition:true,units:"pixels",doc:"Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.",requires:["text-field"]},"text-halo-blur":{type:"number","default":0,minimum:0,"function":"interpolated",transition:true,units:"pixels",doc:"The halo's fadeout distance towards the outside.",requires:["text-field"]},"text-translate":{type:"array",value:"number",length:2,"default":[0,0],"function":"interpolated",transition:true,units:"pixels",doc:"Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.",requires:["text-field"]},"text-translate-anchor":{type:"enum","function":"piecewise-constant",values:["map","viewport"],doc:"Control whether the translation is relative to the map (north) or viewport (screen).","default":"map",requires:["text-field","text-translate"]}},paint_raster:{"raster-opacity":{type:"number",doc:"The opacity at which the image will be drawn.","default":1,minimum:0,maximum:1,"function":"interpolated",transition:true},"raster-hue-rotate":{type:"number","default":0,period:360,"function":"interpolated",transition:true,units:"degrees",doc:"Rotates hues around the color wheel."},"raster-brightness-min":{type:"number","function":"interpolated",doc:"Increase or reduce the brightness of the image. The value is the minimum brightness.","default":0,minimum:0,maximum:1,transition:true},"raster-brightness-max":{type:"number","function":"interpolated",doc:"Increase or reduce the brightness of the image. The value is the maximum brightness.","default":1,minimum:0,maximum:1,transition:true},"raster-saturation":{type:"number",doc:"Increase or reduce the saturation of the image.","default":0,minimum:-1,maximum:1,"function":"interpolated",transition:true},"raster-contrast":{type:"number",doc:"Increase or reduce the contrast of the image.","default":0,minimum:-1,maximum:1,"function":"interpolated",transition:true},"raster-fade-duration":{type:"number","default":300,minimum:0,"function":"interpolated",transition:true,units:"milliseconds",doc:"Fade duration when a new tile is added."}},paint_background:{"background-color":{type:"color","default":"#000000",doc:"The color with which the background will be drawn.","function":"interpolated",transition:true,requires:[{"!":"background-pattern"}]},"background-pattern":{type:"string","function":"piecewise-constant",transition:true,doc:"Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512)."},"background-opacity":{type:"number","default":1,minimum:0,maximum:1,doc:"The opacity at which the background will be drawn.","function":"interpolated",transition:true}},transition:{duration:{type:"number","default":300,minimum:0,units:"milliseconds",doc:"Time allotted for transitions to complete."},delay:{type:"number","default":0,minimum:0,units:"milliseconds",doc:"Length of time before a transition begins."}}}},{}],134:[function(p,q,o){q.exports={"$version":8,"$root":{version:{required:true,type:"enum",values:[8]},name:{type:"string"},metadata:{type:"*"},center:{type:"array",value:"number"},zoom:{type:"number"},bearing:{type:"number","default":0,period:360,units:"degrees"},pitch:{type:"number","default":0,units:"degrees"},sources:{required:true,type:"sources"},sprite:{type:"string"},glyphs:{type:"string"},transition:{type:"transition"},layers:{required:true,type:"array",value:"layer"}},sources:{"*":{type:"source"}},source:["source_tile","source_geojson","source_video","source_image"],source_tile:{type:{required:true,type:"enum",values:["vector","raster"]},url:{type:"string"},tiles:{type:"array",value:"string"},minzoom:{type:"number","default":0},maxzoom:{type:"number","default":22},tileSize:{type:"number","default":512,units:"pixels"},"*":{type:"*"}},source_geojson:{type:{required:true,type:"enum",values:["geojson"]},data:{type:"*"},maxzoom:{type:"number","default":14},buffer:{type:"number","default":64},tolerance:{type:"number","default":3},cluster:{type:"boolean","default":false},clusterRadius:{type:"number","default":400},clusterMaxZoom:{type:"number"}},source_video:{type:{required:true,type:"enum",values:["video"]},urls:{required:true,type:"array",value:"string"},coordinates:{required:true,type:"array",length:4,value:{type:"array",length:2,value:"number"}}},source_image:{type:{required:true,type:"enum",values:["image"]},url:{required:true,type:"string"},coordinates:{required:true,type:"array",length:4,value:{type:"array",length:2,value:"number"}}},layer:{id:{type:"string",required:true},type:{type:"enum",values:["fill","line","symbol","circle","raster","background"]},metadata:{type:"*"},ref:{type:"string"},source:{type:"string"},"source-layer":{type:"string"},minzoom:{type:"number",minimum:0,maximum:22},maxzoom:{type:"number",minimum:0,maximum:22},interactive:{type:"boolean","default":false},filter:{type:"filter"},layout:{type:"layout"},paint:{type:"paint"},"paint.*":{type:"paint"}},layout:["layout_fill","layout_line","layout_circle","layout_symbol","layout_raster","layout_background"],layout_background:{visibility:{type:"enum","function":"piecewise-constant",values:["visible","none"],"default":"visible"}},layout_fill:{visibility:{type:"enum","function":"piecewise-constant",values:["visible","none"],"default":"visible"}},layout_circle:{visibility:{type:"enum","function":"piecewise-constant",values:["visible","none"],"default":"visible"}},layout_line:{"line-cap":{type:"enum","function":"piecewise-constant",values:["butt","round","square"],"default":"butt"},"line-join":{type:"enum","function":"piecewise-constant",values:["bevel","round","miter"],"default":"miter"},"line-miter-limit":{type:"number","default":2,"function":"interpolated",requires:[{"line-join":"miter"}]},"line-round-limit":{type:"number","default":1.05,"function":"interpolated",requires:[{"line-join":"round"}]},visibility:{type:"enum","function":"piecewise-constant",values:["visible","none"],"default":"visible"}},layout_symbol:{"symbol-placement":{type:"enum","function":"piecewise-constant",values:["point","line"],"default":"point"},"symbol-spacing":{type:"number","default":250,minimum:1,"function":"interpolated",units:"pixels",requires:[{"symbol-placement":"line"}]},"symbol-avoid-edges":{type:"boolean","function":"piecewise-constant","default":false},"icon-allow-overlap":{type:"boolean","function":"piecewise-constant","default":false,requires:["icon-image"]},"icon-ignore-placement":{type:"boolean","function":"piecewise-constant","default":false,requires:["icon-image"]},"icon-optional":{type:"boolean","function":"piecewise-constant","default":false,requires:["icon-image","text-field"]},"icon-rotation-alignment":{type:"enum","function":"piecewise-constant",values:["map","viewport"],"default":"viewport",requires:["icon-image"]},"icon-size":{type:"number","default":1,minimum:0,"function":"interpolated",requires:["icon-image"]},"icon-image":{type:"string","function":"piecewise-constant",tokens:true},"icon-rotate":{type:"number","default":0,period:360,"function":"interpolated",units:"degrees",requires:["icon-image"]},"icon-padding":{type:"number","default":2,minimum:0,"function":"interpolated",units:"pixels",requires:["icon-image"]},"icon-keep-upright":{type:"boolean","function":"piecewise-constant","default":false,requires:["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":"line"}]},"icon-offset":{type:"array",value:"number",length:2,"default":[0,0],"function":"interpolated",requires:["icon-image"]},"text-rotation-alignment":{type:"enum","function":"piecewise-constant",values:["map","viewport"],"default":"viewport",requires:["text-field"]},"text-field":{type:"string","function":"piecewise-constant","default":"",tokens:true},"text-font":{type:"array",value:"string","function":"piecewise-constant","default":["Open Sans Regular","Arial Unicode MS Regular"],requires:["text-field"]},"text-size":{type:"number","default":16,minimum:0,units:"pixels","function":"interpolated",requires:["text-field"]},"text-max-width":{type:"number","default":10,minimum:0,units:"em","function":"interpolated",requires:["text-field"]},"text-line-height":{type:"number","default":1.2,units:"em","function":"interpolated",requires:["text-field"]},"text-letter-spacing":{type:"number","default":0,units:"em","function":"interpolated",requires:["text-field"]},"text-justify":{type:"enum","function":"piecewise-constant",values:["left","center","right"],"default":"center",requires:["text-field"]},"text-anchor":{type:"enum","function":"piecewise-constant",values:["center","left","right","top","bottom","top-left","top-right","bottom-left","bottom-right"],"default":"center",requires:["text-field"]},"text-max-angle":{type:"number","default":45,units:"degrees","function":"interpolated",requires:["text-field",{"symbol-placement":"line"}]},"text-rotate":{type:"number","default":0,period:360,units:"degrees","function":"interpolated",requires:["text-field"]},"text-padding":{type:"number","default":2,minimum:0,units:"pixels","function":"interpolated",requires:["text-field"]},"text-keep-upright":{type:"boolean","function":"piecewise-constant","default":true,requires:["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":"line"}]},"text-transform":{type:"enum","function":"piecewise-constant",values:["none","uppercase","lowercase"],"default":"none",requires:["text-field"]},"text-offset":{type:"array",value:"number",units:"ems","function":"interpolated",length:2,"default":[0,0],requires:["text-field"]},"text-allow-overlap":{type:"boolean","function":"piecewise-constant","default":false,requires:["text-field"]},"text-ignore-placement":{type:"boolean","function":"piecewise-constant","default":false,requires:["text-field"]},"text-optional":{type:"boolean","function":"piecewise-constant","default":false,requires:["text-field","icon-image"]},visibility:{type:"enum","function":"piecewise-constant",values:["visible","none"],"default":"visible"}},layout_raster:{visibility:{type:"enum","function":"piecewise-constant",values:["visible","none"],"default":"visible"}},filter:{type:"array",value:"*"},filter_operator:{type:"enum",values:["==","!=",">",">=","<","<=","in","!in","all","any","none"]},geometry_type:{type:"enum",values:["Point","LineString","Polygon"]},color_operation:{type:"enum",values:["lighten","saturate","spin","fade","mix"]},"function":{stops:{type:"array",required:true,value:"function_stop"},base:{type:"number","default":1,minimum:0}},function_stop:{type:"array",minimum:0,maximum:22,value:["number","color"],length:2},paint:["paint_fill","paint_line","paint_circle","paint_symbol","paint_raster","paint_background"],paint_fill:{"fill-antialias":{type:"boolean","function":"piecewise-constant","default":true},"fill-opacity":{type:"number","function":"interpolated","default":1,minimum:0,maximum:1,transition:true},"fill-color":{type:"color","default":"#000000","function":"interpolated",transition:true,requires:[{"!":"fill-pattern"}]},"fill-outline-color":{type:"color","function":"interpolated",transition:true,requires:[{"!":"fill-pattern"},{"fill-antialias":true}]},"fill-translate":{type:"array",value:"number",length:2,"default":[0,0],"function":"interpolated",transition:true,units:"pixels"},"fill-translate-anchor":{type:"enum","function":"piecewise-constant",values:["map","viewport"],"default":"map",requires:["fill-translate"]},"fill-pattern":{type:"string","function":"piecewise-constant",transition:true}},paint_line:{"line-opacity":{type:"number","function":"interpolated","default":1,minimum:0,maximum:1,transition:true},"line-color":{type:"color","default":"#000000","function":"interpolated",transition:true,requires:[{"!":"line-pattern"}]},"line-translate":{type:"array",value:"number",length:2,"default":[0,0],"function":"interpolated",transition:true,units:"pixels"},"line-translate-anchor":{type:"enum","function":"piecewise-constant",values:["map","viewport"],"default":"map",requires:["line-translate"]},"line-width":{type:"number","default":1,minimum:0,"function":"interpolated",transition:true,units:"pixels"},"line-gap-width":{type:"number","default":0,minimum:0,"function":"interpolated",transition:true,units:"pixels"},"line-offset":{type:"number","default":0,"function":"interpolated",transition:true,units:"pixels"},"line-blur":{type:"number","default":0,minimum:0,"function":"interpolated",transition:true,units:"pixels"},"line-dasharray":{type:"array",value:"number","function":"piecewise-constant",minimum:0,transition:true,units:"line widths",requires:[{"!":"line-pattern"}]},"line-pattern":{type:"string","function":"piecewise-constant",transition:true}},paint_circle:{"circle-radius":{type:"number","default":5,minimum:0,"function":"interpolated",transition:true,units:"pixels"},"circle-color":{type:"color","default":"#000000","function":"interpolated",transition:true},"circle-blur":{type:"number","default":0,"function":"interpolated",transition:true},"circle-opacity":{type:"number","default":1,minimum:0,maximum:1,"function":"interpolated",transition:true},"circle-translate":{type:"array",value:"number",length:2,"default":[0,0],"function":"interpolated",transition:true,units:"pixels"},"circle-translate-anchor":{type:"enum","function":"piecewise-constant",values:["map","viewport"],"default":"map",requires:["circle-translate"]}},paint_symbol:{"icon-opacity":{type:"number","default":1,minimum:0,maximum:1,"function":"interpolated",transition:true,requires:["icon-image"]},"icon-color":{type:"color","default":"#000000","function":"interpolated",transition:true,requires:["icon-image"]},"icon-halo-color":{type:"color","default":"rgba(0, 0, 0, 0)","function":"interpolated",transition:true,requires:["icon-image"]},"icon-halo-width":{type:"number","default":0,minimum:0,"function":"interpolated",transition:true,units:"pixels",requires:["icon-image"]},"icon-halo-blur":{type:"number","default":0,minimum:0,"function":"interpolated",transition:true,units:"pixels",requires:["icon-image"]},"icon-translate":{type:"array",value:"number",length:2,"default":[0,0],"function":"interpolated",transition:true,units:"pixels",requires:["icon-image"]},"icon-translate-anchor":{type:"enum","function":"piecewise-constant",values:["map","viewport"],"default":"map",requires:["icon-image","icon-translate"]},"text-opacity":{type:"number","default":1,minimum:0,maximum:1,"function":"interpolated",transition:true,requires:["text-field"]},"text-color":{type:"color","default":"#000000","function":"interpolated",transition:true,requires:["text-field"]},"text-halo-color":{type:"color","default":"rgba(0, 0, 0, 0)","function":"interpolated",transition:true,requires:["text-field"]},"text-halo-width":{type:"number","default":0,minimum:0,"function":"interpolated",transition:true,units:"pixels",requires:["text-field"]},"text-halo-blur":{type:"number","default":0,minimum:0,"function":"interpolated",transition:true,units:"pixels",requires:["text-field"]},"text-translate":{type:"array",value:"number",length:2,"default":[0,0],"function":"interpolated",transition:true,units:"pixels",requires:["text-field"]},"text-translate-anchor":{type:"enum","function":"piecewise-constant",values:["map","viewport"],"default":"map",requires:["text-field","text-translate"]}},paint_raster:{"raster-opacity":{type:"number","default":1,minimum:0,maximum:1,"function":"interpolated",transition:true},"raster-hue-rotate":{type:"number","default":0,period:360,"function":"interpolated",transition:true,units:"degrees"},"raster-brightness-min":{type:"number","function":"interpolated","default":0,minimum:0,maximum:1,transition:true},"raster-brightness-max":{type:"number","function":"interpolated","default":1,minimum:0,maximum:1,transition:true},"raster-saturation":{type:"number","default":0,minimum:-1,maximum:1,"function":"interpolated",transition:true},"raster-contrast":{type:"number","default":0,minimum:-1,maximum:1,"function":"interpolated",transition:true},"raster-fade-duration":{type:"number","default":300,minimum:0,"function":"interpolated",transition:true,units:"milliseconds"}},paint_background:{"background-color":{type:"color","default":"#000000","function":"interpolated",transition:true,requires:[{"!":"background-pattern"}]},"background-pattern":{type:"string","function":"piecewise-constant",transition:true},"background-opacity":{type:"number","default":1,minimum:0,maximum:1,"function":"interpolated",transition:true}},transition:{duration:{type:"number","default":300,minimum:0,units:"milliseconds"},delay:{type:"number","default":0,minimum:0,units:"milliseconds"}}}},{}],135:[function(q,o,s){function r(z){var B;z&&z.length&&(B=z,z=B.length);var A=new Uint8Array(z||0);return B&&A.set(B),A.readUInt32LE=p.readUInt32LE,A.writeUInt32LE=p.writeUInt32LE,A.readInt32LE=p.readInt32LE,A.writeInt32LE=p.writeInt32LE,A.readFloatLE=p.readFloatLE,A.writeFloatLE=p.writeFloatLE,A.readDoubleLE=p.readDoubleLE,A.writeDoubleLE=p.writeDoubleLE,A.toString=p.toString,A.write=p.write,A.slice=p.slice,A.copy=p.copy,A._isBuffer=!0,A}function u(A){for(var C,B,E=A.length,z=[],D=0;E>D;D++){if(C=A.charCodeAt(D),C>55295&&57344>C){if(!B){C>56319||D+1===E?z.push(239,191,189):B=C;continue}if(56320>C){z.push(239,191,189),B=C;continue}C=B-55296<<10|C-56320|65536,B=null}else{B&&(z.push(239,191,189),B=null)}128>C?z.push(C):2048>C?z.push(C>>6|192,63&C|128):65536>C?z.push(C>>12|224,C>>6&63|128,63&C|128):z.push(C>>18|240,C>>12&63|128,C>>6&63|128,63&C|128)}return z}o.exports=r;var w=q("ieee754"),p,t,v;p={readUInt32LE:function(z){return(this[z]|this[z+1]<<8|this[z+2]<<16)+16777216*this[z+3]},writeUInt32LE:function(z,A){this[A]=z,this[A+1]=z>>>8,this[A+2]=z>>>16,this[A+3]=z>>>24},readInt32LE:function(z){return(this[z]|this[z+1]<<8|this[z+2]<<16)+(this[z+3]<<24)},readFloatLE:function(z){return w.read(this,z,!0,23,4)},readDoubleLE:function(z){return w.read(this,z,!0,52,8)},writeFloatLE:function(z,A){return w.write(this,z,A,!0,23,4)},writeDoubleLE:function(z,A){return w.write(this,z,A,!0,52,8)},toString:function(B,D,C){var F="",A="";D=D||0,C=Math.min(this.length,C||this.length);for(var E=D;C>E;E++){var z=this[E];127>=z?(F+=decodeURIComponent(A)+String.fromCharCode(z),A=""):A+="%"+z.toString(16)}return F+=decodeURIComponent(A)},write:function(z,B){for(var A=z===t?v:u(z),C=0;C<A.length;C++){this[B+C]=A[C]}},slice:function(z,A){return this.subarray(z,A)},copy:function(z,B){B=B||0;for(var A=0;A<this.length;A++){z[B+A]=this[A]}}},p.writeInt32LE=p.writeUInt32LE,r.byteLength=function(z){return t=z,v=u(z),v.length},r.isBuffer=function(z){return !(!z||!z._isBuffer)}},{ieee754:126}],136:[function(p,q,o){(function(r){function H(I){this.buf=v.isBuffer(I)?I:new v(I||0),this.pos=0,this.length=this.buf.length}function u(J,I){for(var K=0;K<J.length;K++){I.writeVarint(J[K])}}function s(J,I){for(var K=0;K<J.length;K++){I.writeSVarint(J[K])}}function A(J,I){for(var K=0;K<J.length;K++){I.writeFloat(J[K])}}function D(J,I){for(var K=0;K<J.length;K++){I.writeDouble(J[K])}}function G(J,I){for(var K=0;K<J.length;K++){I.writeBoolean(J[K])}}function E(J,I){for(var K=0;K<J.length;K++){I.writeFixed32(J[K])}}function w(J,I){for(var K=0;K<J.length;K++){I.writeSFixed32(J[K])}}function C(J,I){for(var K=0;K<J.length;K++){I.writeFixed64(J[K])}}function t(J,I){for(var K=0;K<J.length;K++){I.writeSFixed64(J[K])}}q.exports=H;var v=r.Buffer||p("./buffer");H.Varint=0,H.Fixed64=1,H.Bytes=2,H.Fixed32=5;var B=4294967296,F=1/B,z=Math.pow(2,63);H.prototype={destroy:function(){this.buf=null},readFields:function(J,I,N){for(N=N||this.length;this.pos<N;){var M=this.readVarint(),K=M>>3,O=this.pos;J(K,I,this),this.pos===O&&this.skip(M)}return I},readMessage:function(J,I){return this.readFields(J,I,this.readVarint()+this.pos)},readFixed32:function(){var I=this.buf.readUInt32LE(this.pos);return this.pos+=4,I},readSFixed32:function(){var I=this.buf.readInt32LE(this.pos);return this.pos+=4,I},readFixed64:function(){var I=this.buf.readUInt32LE(this.pos)+this.buf.readUInt32LE(this.pos+4)*B;return this.pos+=8,I},readSFixed64:function(){var I=this.buf.readUInt32LE(this.pos)+this.buf.readInt32LE(this.pos+4)*B;return this.pos+=8,I},readFloat:function(){var I=this.buf.readFloatLE(this.pos);return this.pos+=4,I},readDouble:function(){var I=this.buf.readDoubleLE(this.pos);return this.pos+=8,I},readVarint:function(){var J,I,N,M,K,P,O=this.buf;if(N=O[this.pos++],128>N){return N}if(N=127&N,M=O[this.pos++],128>M){return N|M<<7}if(M=(127&M)<<7,K=O[this.pos++],128>K){return N|M|K<<14}if(K=(127&K)<<14,P=O[this.pos++],128>P){return N|M|K|P<<21}if(J=N|M|K|(127&P)<<21,I=O[this.pos++],J+=268435456*(127&I),128>I){return J}if(I=O[this.pos++],J+=34359738368*(127&I),128>I){return J}if(I=O[this.pos++],J+=4398046511104*(127&I),128>I){return J}if(I=O[this.pos++],J+=562949953421312*(127&I),128>I){return J}if(I=O[this.pos++],J+=72057594037927940*(127&I),128>I){return J}if(I=O[this.pos++],J+=9223372036854776000*(127&I),128>I){return J}throw new Error("Expected varint not more than 10 bytes")},readVarint64:function(){var J=this.pos,I=this.readVarint();if(z>I){return I}for(var N=this.pos-2;255===this.buf[N];){N--}J>N&&(N=J),I=0;for(var M=0;N-J+1>M;M++){var K=127&~this.buf[J+M];I+=4>M?K<<7*M:K*Math.pow(2,7*M)}return -I-1},readSVarint:function(){var I=this.readVarint();return I%2===1?(I+1)/-2:I/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var J=this.readVarint()+this.pos,I=this.buf.toString("utf8",this.pos,J);return this.pos=J,I},readBytes:function(){var J=this.readVarint()+this.pos,I=this.buf.slice(this.pos,J);return this.pos=J,I},readPackedVarint:function(){for(var J=this.readVarint()+this.pos,I=[];this.pos<J;){I.push(this.readVarint())}return I},readPackedSVarint:function(){for(var J=this.readVarint()+this.pos,I=[];this.pos<J;){I.push(this.readSVarint())}return I},readPackedBoolean:function(){for(var J=this.readVarint()+this.pos,I=[];this.pos<J;){I.push(this.readBoolean())}return I},readPackedFloat:function(){for(var J=this.readVarint()+this.pos,I=[];this.pos<J;){I.push(this.readFloat())}return I},readPackedDouble:function(){for(var J=this.readVarint()+this.pos,I=[];this.pos<J;){I.push(this.readDouble())}return I},readPackedFixed32:function(){for(var J=this.readVarint()+this.pos,I=[];this.pos<J;){I.push(this.readFixed32())}return I},readPackedSFixed32:function(){for(var J=this.readVarint()+this.pos,I=[];this.pos<J;){I.push(this.readSFixed32())}return I},readPackedFixed64:function(){for(var J=this.readVarint()+this.pos,I=[];this.pos<J;){I.push(this.readFixed64())}return I},readPackedSFixed64:function(){for(var J=this.readVarint()+this.pos,I=[];this.pos<J;){I.push(this.readSFixed64())}return I},skip:function(J){var I=7&J;if(I===H.Varint){for(;this.buf[this.pos++]>127;){}}else{if(I===H.Bytes){this.pos=this.readVarint()+this.pos}else{if(I===H.Fixed32){this.pos+=4}else{if(I!==H.Fixed64){throw new Error("Unimplemented type: "+I)}this.pos+=8}}}},writeTag:function(J,I){this.writeVarint(J<<3|I)},realloc:function(J){for(var I=this.length||16;I<this.pos+J;){I*=2}if(I!==this.length){var K=new v(I);this.buf.copy(K),this.buf=K,this.length=I}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.slice(0,this.length)},writeFixed32:function(I){this.realloc(4),this.buf.writeUInt32LE(I,this.pos),this.pos+=4},writeSFixed32:function(I){this.realloc(4),this.buf.writeInt32LE(I,this.pos),this.pos+=4},writeFixed64:function(I){this.realloc(8),this.buf.writeInt32LE(-1&I,this.pos),this.buf.writeUInt32LE(Math.floor(I*F),this.pos+4),this.pos+=8},writeSFixed64:function(I){this.realloc(8),this.buf.writeInt32LE(-1&I,this.pos),this.buf.writeInt32LE(Math.floor(I*F),this.pos+4),this.pos+=8},writeVarint:function(J){if(J=+J,127>=J){this.realloc(1),this.buf[this.pos++]=J}else{if(16383>=J){this.realloc(2),this.buf[this.pos++]=J>>>0&127|128,this.buf[this.pos++]=J>>>7&127}else{if(2097151>=J){this.realloc(3),this.buf[this.pos++]=J>>>0&127|128,this.buf[this.pos++]=J>>>7&127|128,this.buf[this.pos++]=J>>>14&127}else{if(268435455>=J){this.realloc(4),this.buf[this.pos++]=J>>>0&127|128,this.buf[this.pos++]=J>>>7&127|128,this.buf[this.pos++]=J>>>14&127|128,this.buf[this.pos++]=J>>>21&127}else{for(var I=this.pos;J>=128;){this.realloc(1),this.buf[this.pos++]=255&J|128,J/=128}if(this.realloc(1),this.buf[this.pos++]=0|J,this.pos-I>10){throw new Error("Given varint doesn't fit into 10 bytes")}}}}}},writeSVarint:function(I){this.writeVarint(0>I?2*-I-1:2*I)},writeBoolean:function(I){this.writeVarint(Boolean(I))},writeString:function(J){J=String(J);var I=v.byteLength(J);this.writeVarint(I),this.realloc(I),this.buf.write(J,this.pos),this.pos+=I},writeFloat:function(I){this.realloc(4),this.buf.writeFloatLE(I,this.pos),this.pos+=4},writeDouble:function(I){this.realloc(8),this.buf.writeDoubleLE(I,this.pos),this.pos+=8},writeBytes:function(J){var I=J.length;this.writeVarint(I),this.realloc(I);for(var K=0;I>K;K++){this.buf[this.pos++]=J[K]}},writeRawMessage:function(J,I){this.pos++;var N=this.pos;J(I,this);var M=this.pos-N,K=127>=M?1:16383>=M?2:2097151>=M?3:268435455>=M?4:Math.ceil(Math.log(M)/(7*Math.LN2));if(K>1){this.realloc(K-1);for(var O=this.pos-1;O>=N;O--){this.buf[O+K-1]=this.buf[O]}}this.pos=N-1,this.writeVarint(M),this.pos+=M},writeMessage:function(J,I,K){this.writeTag(J,H.Bytes),this.writeRawMessage(I,K)},writePackedVarint:function(J,I){this.writeMessage(J,u,I)},writePackedSVarint:function(J,I){this.writeMessage(J,s,I)},writePackedBoolean:function(J,I){this.writeMessage(J,G,I)},writePackedFloat:function(J,I){this.writeMessage(J,A,I)},writePackedDouble:function(J,I){this.writeMessage(J,D,I)},writePackedFixed32:function(J,I){this.writeMessage(J,E,I)},writePackedSFixed32:function(J,I){this.writeMessage(J,w,I)},writePackedFixed64:function(J,I){this.writeMessage(J,C,I)},writePackedSFixed64:function(J,I){this.writeMessage(J,t,I)},writeBytesField:function(J,I){this.writeTag(J,H.Bytes),this.writeBytes(I)},writeFixed32Field:function(J,I){this.writeTag(J,H.Fixed32),this.writeFixed32(I)},writeSFixed32Field:function(J,I){this.writeTag(J,H.Fixed32),this.writeSFixed32(I)},writeFixed64Field:function(J,I){this.writeTag(J,H.Fixed64),this.writeFixed64(I)},writeSFixed64Field:function(J,I){this.writeTag(J,H.Fixed64),this.writeSFixed64(I)},writeVarintField:function(J,I){this.writeTag(J,H.Varint),this.writeVarint(I)},writeSVarintField:function(J,I){this.writeTag(J,H.Varint),this.writeSVarint(I)},writeStringField:function(J,I){this.writeTag(J,H.Bytes),this.writeString(I)},writeFloatField:function(J,I){this.writeTag(J,H.Fixed32),this.writeFloat(I)},writeDoubleField:function(J,I){this.writeTag(J,H.Fixed64),this.writeDouble(I)},writeBooleanField:function(J,I){this.writeVarintField(J,Boolean(I))}}}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./buffer":135}],137:[function(p,q,o){function r(s,u){this.x=s,this.y=u}q.exports=r,r.prototype={clone:function(){return new r(this.x,this.y)},add:function(s){return this.clone()._add(s)},sub:function(s){return this.clone()._sub(s)},mult:function(s){return this.clone()._mult(s)},div:function(s){return this.clone()._div(s)},rotate:function(s){return this.clone()._rotate(s)},matMult:function(s){return this.clone()._matMult(s)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(s){return this.x===s.x&&this.y===s.y},dist:function(s){return Math.sqrt(this.distSqr(s))},distSqr:function(u){var v=u.x-this.x,s=u.y-this.y;return v*v+s*s},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(s){return Math.atan2(this.y-s.y,this.x-s.x)},angleWith:function(s){return this.angleWithSep(s.x,s.y)},angleWithSep:function(s,u){return Math.atan2(this.x*u-this.y*s,this.x*s+this.y*u)},_matMult:function(u){var v=u[0]*this.x+u[1]*this.y,s=u[2]*this.x+u[3]*this.y;return this.x=v,this.y=s,this},_add:function(s){return this.x+=s.x,this.y+=s.y,this},_sub:function(s){return this.x-=s.x,this.y-=s.y,this},_mult:function(s){return this.x*=s,this.y*=s,this},_div:function(s){return this.x/=s,this.y/=s,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var s=this.y;return this.y=this.x,this.x=-s,this},_rotate:function(v){var A=Math.cos(v),u=Math.sin(v),w=A*this.x-u*this.y,z=u*this.x+A*this.y;return this.x=w,this.y=z,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},r.convert=function(s){return s instanceof r?s:Array.isArray(s)?new r(s[0],s[1]):s}},{}],138:[function(q,p,s){function w(){z=!1,u.length?t=u.concat(t):v=-1,t.length&&B()}function B(){if(!z){var C=setTimeout(w);z=!0;for(var D=t.length;D;){for(u=t,t=[];++v<D;){u&&u[v].run()}v=-1,D=t.length}u=null,z=!1,clearTimeout(C)}}function r(C,D){this.fun=C,this.array=D}function A(){}var o=p.exports={},t=[],z=!1,u,v=-1;o.nextTick=function(D){var E=new Array(arguments.length-1);if(arguments.length>1){for(var C=1;C<arguments.length;C++){E[C-1]=arguments[C]}}t.push(new r(D,E)),1!==t.length||z||setTimeout(B,0)},r.prototype.run=function(){this.fun.apply(null,this.array)},o.title="browser",o.browser=!0,o.env={},o.argv=[],o.version="",o.versions={},o.on=A,o.addListener=A,o.once=A,o.off=A,o.removeListener=A,o.removeAllListeners=A,o.emit=A,o.binding=function(C){throw new Error("process.binding is not supported")},o.cwd=function(){return"/"},o.chdir=function(C){throw new Error("process.chdir is not supported")},o.umask=function(){return 0}},{}],139:[function(p,q,o){!function(){function M(r,s){return this instanceof M?(this._maxEntries=Math.max(4,r||9),this._minEntries=Math.max(2,Math.ceil(0.4*this._maxEntries)),s&&this._initFormat(s),void this.clear()):new M(r,s)}function C(s,r){s.bbox=A(s,0,s.children.length,r)}function A(P,O,T,R){for(var S,u=F(),Q=O;T>Q;Q++){S=P.children[Q],D(u,P.leaf?R(S):S.bbox)}return u}function F(){return[1/0,1/0,-(1/0),-(1/0)]}function D(s,r){return s[0]=Math.min(s[0],r[0]),s[1]=Math.min(s[1],r[1]),s[2]=Math.max(s[2],r[2]),s[3]=Math.max(s[3],r[3]),s}function v(s,r){return s.bbox[0]-r.bbox[0]}function z(s,r){return s.bbox[1]-r.bbox[1]}function J(r){return(r[2]-r[0])*(r[3]-r[1])}function N(r){return r[2]-r[0]+(r[3]-r[1])}function B(s,r){return(Math.max(r[2],s[2])-Math.min(r[0],s[0]))*(Math.max(r[3],s[3])-Math.min(r[1],s[1]))}function K(u,s){var R=Math.max(u[0],s[0]),Q=Math.max(u[1],s[1]),O=Math.min(u[2],s[2]),P=Math.min(u[3],s[3]);return Math.max(0,O-R)*Math.max(0,P-Q)}function E(s,r){return s[0]<=r[0]&&s[1]<=r[1]&&r[2]<=s[2]&&r[3]<=s[3]}function H(s,r){return r[0]<=s[2]&&r[1]<=s[3]&&r[2]>=s[0]&&r[3]>=s[1]}function G(u,s,S,Q,O){for(var P,R=[s,S];R.length;){S=R.pop(),s=R.pop(),Q>=S-s||(P=s+Math.ceil((S-s)/Q/2)*Q,I(u,s,S,P,O),R.push(s,P,P,S))}}function I(aa,S,Q,V,T){for(var O,P,Y,ab,R,Z,U,X,W;Q>S;){for(Q-S>600&&(O=Q-S+1,P=V-S+1,Y=Math.log(O),ab=0.5*Math.exp(2*Y/3),R=0.5*Math.sqrt(Y*ab*(O-ab)/O)*(0>P-O/2?-1:1),Z=Math.max(S,Math.floor(V-P*ab/O+R)),U=Math.min(Q,Math.floor(V+(O-P)*ab/O+R)),I(aa,Z,U,V,T)),X=aa[V],P=S,W=Q,w(aa,S,V),T(aa[Q],X)>0&&w(aa,S,Q);W>P;){for(w(aa,P,W),P++,W--;T(aa[P],X)<0;){P++}for(;T(aa[W],X)>0;){W--}}0===T(aa[S],X)?w(aa,S,W):(W++,w(aa,W,Q)),V>=W&&(S=W+1),W>=V&&(Q=W-1)}}function w(s,r,O){var u=s[r];s[r]=s[O],s[O]=u}M.prototype={all:function(){return this._all(this.data,[])},search:function(U){var Q=this.data,P=[],S=this.toBBox;if(!H(U,Q.bbox)){return P}for(var R,u,O,T,V=[];Q;){for(R=0,u=Q.children.length;u>R;R++){O=Q.children[R],T=Q.leaf?S(O):O.bbox,H(U,T)&&(Q.leaf?P.push(O):E(U,T)?this._all(O,P):V.push(O))}Q=V.pop()}return P},collides:function(O){var u=this.data,T=this.toBBox;if(!H(O,u.bbox)){return !1}for(var R,P,Q,S,s=[];u;){for(R=0,P=u.children.length;P>R;R++){if(Q=u.children[R],S=u.leaf?T(Q):Q.bbox,H(O,S)){if(u.leaf||E(O,S)){return !0}s.push(Q)}}u=s.pop()}return !1},load:function(s){if(!s||!s.length){return this}if(s.length<this._minEntries){for(var r=0,P=s.length;P>r;r++){this.insert(s[r])}return this}var O=this._build(s.slice(),0,s.length-1,0);if(this.data.children.length){if(this.data.height===O.height){this._splitRoot(this.data,O)}else{if(this.data.height<O.height){var u=this.data;this.data=O,O=u}this._insert(O,this.data.height-O.height-1,!0)}}else{this.data=O}return this},insert:function(r){return r&&this._insert(r,this.data.height-1),this},clear:function(){return this.data={children:[],height:1,bbox:F(),leaf:!0},this},remove:function(U){if(!U){return this}for(var Q,P,S,R,u=this.data,O=this.toBBox(U),T=[],V=[];u||T.length;){if(u||(u=T.pop(),P=T[T.length-1],Q=V.pop(),R=!0),u.leaf&&(S=u.children.indexOf(U),-1!==S)){return u.children.splice(S,1),T.push(u),this._condense(T),this}R||u.leaf||!E(u.bbox,O)?P?(Q++,u=P.children[Q],R=!1):u=null:(T.push(u),V.push(Q),Q=0,P=u,u=u.children[0])}return this},toBBox:function(r){return r},compareMinX:function(s,r){return s[0]-r[0]},compareMinY:function(s,r){return s[1]-r[1]},toJSON:function(){return this.data},fromJSON:function(r){return this.data=r,this},_all:function(s,r){for(var u=[];s;){s.leaf?r.push.apply(r,s.children):u.push.apply(u,s.children),s=u.pop()}return r},_build:function(Z,Q,U,S){var O,P=U-Q+1,X=this._maxEntries;if(X>=P){return O={children:Z.slice(Q,U+1),height:1,bbox:null,leaf:!0},C(O,this.toBBox),O}S||(S=Math.ceil(Math.log(P)/Math.log(X)),X=Math.ceil(P/Math.pow(X,S-1))),O={children:[],height:S,bbox:null,leaf:!1};var aa,R,Y,T,V=Math.ceil(P/X),W=V*Math.ceil(Math.sqrt(X));for(G(Z,Q,U,W,this.compareMinX),aa=Q;U>=aa;aa+=W){for(Y=Math.min(aa+W-1,U),G(Z,aa,Y,V,this.compareMinY),R=aa;Y>=R;R+=V){T=Math.min(R+V-1,Y),O.children.push(this._build(Z,R,T,S-1))}}return C(O,this.toBBox),O},_chooseSubtree:function(Y,R,Q,U){for(var S,O,P,Z,X,T,W,V;;){if(U.push(R),R.leaf||U.length-1===Q){break}for(W=V=1/0,S=0,O=R.children.length;O>S;S++){P=R.children[S],X=J(P.bbox),T=B(Y,P.bbox)-X,V>T?(V=T,W=W>X?X:W,Z=P):T===V&&W>X&&(W=X,Z=P)}R=Z}return R},_insert:function(O,u,S){var Q=this.toBBox,P=S?O.bbox:Q(O),R=[],s=this._chooseSubtree(P,this.data,u,R);for(s.children.push(O),D(s.bbox,P);u>=0&&R[u].children.length>this._maxEntries;){this._split(R,u),u--}this._adjustParentBBoxes(P,R,u)},_split:function(u,S){var Q=u[S],O=Q.children.length,P=this._minEntries;this._chooseSplitAxis(Q,P,O);var R=this._chooseSplitIndex(Q,P,O),s={children:Q.children.splice(R,Q.children.length-R),height:Q.height,bbox:null,leaf:!1};Q.leaf&&(s.leaf=!0),C(Q,this.toBBox),C(s,this.toBBox),S?u[S-1].children.push(s):this._splitRoot(Q,s)},_splitRoot:function(r,s){this.data={children:[r,s],height:r.height+1,bbox:null,leaf:!1},C(this.data,this.toBBox)},_chooseSplitIndex:function(W,Q,T){var R,u,O,X,P,S,V,U;for(S=V=1/0,R=Q;T-Q>=R;R++){u=A(W,0,R,this.toBBox),O=A(W,R,T,this.toBBox),X=K(u,O),P=J(u)+J(O),S>X?(S=X,U=R,V=V>P?P:V):X===S&&V>P&&(V=P,U=R)}return U},_chooseSplitAxis:function(O,u,S){var R=O.leaf?this.compareMinX:v,Q=O.leaf?this.compareMinY:z,r=this._allDistMargin(O,u,S,R),P=this._allDistMargin(O,u,S,Q);P>r&&O.children.sort(R)},_allDistMargin:function(W,Q,S,s){W.children.sort(s);var O,U,P=this.toBBox,V=A(W,0,Q,P),R=A(W,S-Q,S,P),T=N(V)+N(R);for(O=Q;S-Q>O;O++){U=W.children[O],D(V,W.leaf?P(U):U.bbox),T+=N(V)}for(O=S-Q-1;O>=Q;O--){U=W.children[O],D(R,W.leaf?P(U):U.bbox),T+=N(R)}return T},_adjustParentBBoxes:function(s,r,O){for(var u=O;u>=0;u--){D(r[u].bbox,s)}},_condense:function(r){for(var u,s=r.length-1;s>=0;s--){0===r[s].children.length?s>0?(u=r[s-1].children,u.splice(u.indexOf(r[s]),1)):this.clear():C(r[s],this.toBBox)}},_initFormat:function(s){var r=["return a"," - b",";"];this.compareMinX=new Function("a","b",r.join(s[0])),this.compareMinY=new Function("a","b",r.join(s[1])),this.toBBox=new Function("a","return [a"+s.join(", a")+"];")}},"function"==typeof n&&n.amd?n("rbush",function(){return M}):"undefined"!=typeof q?q.exports=M:"undefined"!=typeof self?self.rbush=M:window.rbush=M}()},{}],140:[function(p,q,o){void function(t,s){"function"==typeof n&&n.amd?n(s):"object"==typeof o?q.exports=s():t.resolveUrl=s()}(this,function(){function r(){var w=arguments.length;if(0===w){throw new Error("resolveUrl requires at least one argument; got none.")}var u=document.createElement("base");if(u.href=arguments[0],1===w){return u.href}var s=document.getElementsByTagName("head")[0];s.insertBefore(u,s.firstChild);for(var A,z=document.createElement("a"),v=1;w>v;v++){z.href=arguments[v],A=z.href,u.href=A}return s.removeChild(u),A}return r})},{}],141:[function(q,r,o){function p(u,s,w,v){this.cx=3*u,this.bx=3*(w-u)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*s,this.by=3*(v-s)-this.cy,this.ay=1-this.cy-this.by,this.p1x=u,this.p1y=v,this.p2x=w,this.p2y=v}r.exports=p,p.prototype.sampleCurveX=function(s){return((this.ax*s+this.bx)*s+this.cx)*s},p.prototype.sampleCurveY=function(s){return((this.ay*s+this.by)*s+this.cy)*s},p.prototype.sampleCurveDerivativeX=function(s){return(3*this.ax*s+2*this.bx)*s+this.cx},p.prototype.solveCurveX=function(z,w){"undefined"==typeof w&&(w=0.000001);var D,C,B,A,E;for(B=z,E=0;8>E;E++){if(A=this.sampleCurveX(B)-z,Math.abs(A)<w){return B}var v=this.sampleCurveDerivativeX(B);if(Math.abs(v)<0.000001){break}B-=A/v}if(D=0,C=1,B=z,D>B){return D}if(B>C){return C}for(;C>D;){if(A=this.sampleCurveX(B),Math.abs(A-z)<w){return B}z>A?D=B:C=B,B=0.5*(C-D)+D}return B},p.prototype.solve=function(u,s){return this.sampleCurveY(this.solveCurveX(u,s))}},{}],142:[function(p,q,o){q.exports=function(r){return r&&"object"==typeof r&&"function"==typeof r.copy&&"function"==typeof r.fill&&"function"==typeof r.readUInt8}},{}],143:[function(p,q,o){(function(R,T){function ab(ae,ad){var ac={seen:[],stylize:E};return arguments.length>=3&&(ac.depth=arguments[2]),arguments.length>=4&&(ac.colors=arguments[3]),G(ad)?ac.showHidden=ad:ad&&o._extend(ac,ad),t(ac.showHidden)&&(ac.showHidden=!1),t(ac.depth)&&(ac.depth=2),t(ac.colors)&&(ac.colors=!1),t(ac.customInspect)&&(ac.customInspect=!0),ac.colors&&(ac.stylize=r),z(ac,ae,ac.depth)}function r(ae,ad){var ac=ab.styles[ad];return ac?"["+ab.colors[ac][0]+"m"+ae+"["+ab.colors[ac][1]+"m":ae}function E(ad,ac){return ad}function C(ad){var ac={};return ad.forEach(function(af,ae){ac[af]=!0}),ac}function z(aj,ac,an){if(aj.customInspect&&ac&&s(ac.inspect)&&ac.inspect!==o.inspect&&(!ac.constructor||ac.constructor.prototype!==ac)){var af=ac.inspect(an,aj);return O(af)||(af=z(aj,af,an)),af}var ah=N(aj,ac);if(ah){return ah}var ae=Object.keys(ac),ao=C(ae);if(aj.showHidden&&(ae=Object.getOwnPropertyNames(ac)),W(ac)&&(ae.indexOf("message")>=0||ae.indexOf("description")>=0)){return A(ac)}if(0===ae.length){if(s(ac)){var am=ac.name?": "+ac.name:"";return aj.stylize("[Function"+am+"]","special")}if(U(ac)){return aj.stylize(RegExp.prototype.toString.call(ac),"regexp")}if(aa(ac)){return aj.stylize(Date.prototype.toString.call(ac),"date")}if(W(ac)){return A(ac)}}var al="",ak=!1,ag=["{","}"];if(M(ac)&&(ak=!0,ag=["[","]"]),s(ac)){var ad=ac.name?": "+ac.name:"";al=" [Function"+ad+"]"}if(U(ac)&&(al=" "+RegExp.prototype.toString.call(ac)),aa(ac)&&(al=" "+Date.prototype.toUTCString.call(ac)),W(ac)&&(al=" "+A(ac)),0===ae.length&&(!ak||0==ac.length)){return ag[0]+al+ag[1]}if(0>an){return U(ac)?aj.stylize(RegExp.prototype.toString.call(ac),"regexp"):aj.stylize("[Object]","special")}aj.seen.push(ac);var ai;return ai=ak?Z(aj,ac,an,ao,ae):ae.map(function(ap){return v(aj,ac,an,ao,ap,ak)}),aj.seen.pop(),X(ai,al,ag)}function N(ae,ad){if(t(ad)){return ae.stylize("undefined","undefined")}if(O(ad)){var ac="'"+JSON.stringify(ad).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return ae.stylize(ac,"string")}return P(ad)?ae.stylize(""+ad,"number"):G(ad)?ae.stylize(""+ad,"boolean"):S(ad)?ae.stylize("null","null"):void 0}function A(ac){return"["+Error.prototype.toString.call(ac)+"]"}function Z(ah,ag,ae,aj,ad){for(var ai=[],af=0,ac=ag.length;ac>af;++af){K(ag,String(af))?ai.push(v(ah,ag,ae,aj,String(af),!0)):ai.push("")}return ad.forEach(function(ak){ak.match(/^\d+$/)||ai.push(v(ah,ag,ae,aj,ak,!0))}),ai}function v(ag,ac,aj,ae,af,ad){var ak,ai,ah;if(ah=Object.getOwnPropertyDescriptor(ac,af)||{value:ac[af]},ah.get?ai=ah.set?ag.stylize("[Getter/Setter]","special"):ag.stylize("[Getter]","special"):ah.set&&(ai=ag.stylize("[Setter]","special")),K(ae,af)||(ak="["+af+"]"),ai||(ag.seen.indexOf(ah.value)<0?(ai=S(aj)?z(ag,ah.value,null):z(ag,ah.value,aj-1),ai.indexOf("\n")>-1&&(ai=ad?ai.split("\n").map(function(al){return"  "+al}).join("\n").substr(2):"\n"+ai.split("\n").map(function(al){return"   "+al}).join("\n"))):ai=ag.stylize("[Circular]","special")),t(ak)){if(ad&&af.match(/^\d+$/)){return ai}ak=JSON.stringify(""+af),ak.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(ak=ak.substr(1,ak.length-2),ak=ag.stylize(ak,"name")):(ak=ak.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),ak=ag.stylize(ak,"string"))}return ak+": "+ai}function X(af,ae,ad){var ag=0,ac=af.reduce(function(ai,ah){return ag++,ah.indexOf("\n")>=0&&ag++,ai+ah.replace(/\u001b\[\d\d?m/g,"").length+1},0);return ac>60?ad[0]+(""===ae?"":ae+"\n ")+" "+af.join(",\n  ")+" "+ad[1]:ad[0]+ae+" "+af.join(", ")+" "+ad[1]}function M(ac){return Array.isArray(ac)}function G(ac){return"boolean"==typeof ac}function S(ac){return null===ac}function F(ac){return null==ac}function P(ac){return"number"==typeof ac}function O(ac){return"string"==typeof ac}function w(ac){return"symbol"==typeof ac}function t(ac){return void 0===ac}function U(ac){return H(ac)&&"[object RegExp]"===B(ac)}function H(ac){return"object"==typeof ac&&null!==ac}function aa(ac){return H(ac)&&"[object Date]"===B(ac)}function W(ac){return H(ac)&&("[object Error]"===B(ac)||ac instanceof Error)}function s(ac){return"function"==typeof ac}function Y(ac){return null===ac||"boolean"==typeof ac||"number"==typeof ac||"string"==typeof ac||"symbol"==typeof ac||"undefined"==typeof ac}function B(ac){return Object.prototype.toString.call(ac)}function V(ac){return 10>ac?"0"+ac.toString(10):ac.toString(10)}function u(){var ad=new Date,ac=[V(ad.getHours()),V(ad.getMinutes()),V(ad.getSeconds())].join(":");return[ad.getDate(),D[ad.getMonth()],ac].join(" ")}function K(ad,ac){return Object.prototype.hasOwnProperty.call(ad,ac)}var Q=/%[sdj%]/g;o.format=function(ag){if(!O(ag)){for(var af=[],ad=0;ad<arguments.length;ad++){af.push(ab(arguments[ad]))}return af.join(" ")}for(var ad=1,ai=arguments,ac=ai.length,ah=String(ag).replace(Q,function(ak){if("%%"===ak){return"%"}if(ad>=ac){return ak}switch(ak){case"%s":return String(ai[ad++]);case"%d":return Number(ai[ad++]);case"%j":try{return JSON.stringify(ai[ad++])}catch(aj){return"[Circular]"}default:return ak}}),ae=ai[ad];ac>ad;ae=ai[++ad]){ah+=S(ae)||!H(ae)?" "+ae:" "+ab(ae)}return ah},o.deprecate=function(ae,ad){function ac(){if(!af){if(R.throwDeprecation){throw new Error(ad)}R.traceDeprecation?console.trace(ad):console.error(ad),af=!0}return ae.apply(this,arguments)}if(t(T.process)){return function(){return o.deprecate(ae,ad).apply(this,arguments)}}if(R.noDeprecation===!0){return ae}var af=!1;return ac};var J={},I;o.debuglog=function(ad){if(t(I)&&(I=R.env.NODE_DEBUG||""),ad=ad.toUpperCase(),!J[ad]){if(new RegExp("\\b"+ad+"\\b","i").test(I)){var ac=R.pid;J[ad]=function(){var ae=o.format.apply(o,arguments);console.error("%s %d: %s",ad,ac,ae)}}else{J[ad]=function(){}}}return J[ad]},o.inspect=ab,ab.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},ab.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},o.isArray=M,o.isBoolean=G,o.isNull=S,o.isNullOrUndefined=F,o.isNumber=P,o.isString=O,o.isSymbol=w,o.isUndefined=t,o.isRegExp=U,o.isObject=H,o.isDate=aa,o.isError=W,o.isFunction=s,o.isPrimitive=Y,o.isBuffer=p("./support/isBuffer");var D=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];o.log=function(){console.log("%s - %s",u(),o.format.apply(o,arguments))},o.inherits=p("inherits"),o._extend=function(ae,ad){if(!ad||!H(ad)){return ae}for(var ac=Object.keys(ad),af=ac.length;af--;){ae[ac[af]]=ad[ac[af]]}return ae}}).call(this,p("_process"),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./support/isBuffer":142,_process:138,inherits:127}],144:[function(p,q,o){q.exports.VectorTile=p("./lib/vectortile.js"),q.exports.VectorTileFeature=p("./lib/vectortilefeature.js"),q.exports.VectorTileLayer=p("./lib/vectortilelayer.js")},{"./lib/vectortile.js":145,"./lib/vectortilefeature.js":147,"./lib/vectortilelayer.js":148}],145:[function(r,s,q){function o(v,u){this.layers=v.readFields(p,{},u)}function p(z,w,v){if(3===z){var u=new t(v,v.readVarint()+v.pos);u.length&&(w[u.name]=u)}}var t=r("./vectortilelayer");s.exports=o},{"./vectortilelayer":148}],146:[function(p,q,o){function s(v){this.feature=v,this.finalRatio=4096/v.extent*Math.pow(2,v.dz);var u=64;u/=this.finalRatio;var w=v.extent>>v.dz;u>w&&(u=w),this.dz=v.dz,this.margin=u,this.xmin=w*v.xPos-u,this.ymin=w*v.yPos-u,this.xmax=this.xmin+w+2*u,this.ymax=this.ymin+w+2*u,this.lines=[],this._prevIsIn=!1,this.type=v.type}var r=p("point-geometry");q.exports=s,s.prototype.loadGeometry=function(){var w=this.feature._pbf;w.pos=this.feature._geometry;for(var v=w.readVarint()+w.pos,A=1,z=0,C=0,B=0;w.pos<v;){if(!z){var u=w.readVarint();A=7&u,z=u>>3}if(z--,1===A||2===A){C+=w.readSVarint(),B+=w.readSVarint(),1===A?this.moveTo(C,B):this.lineTo(C,B)}else{if(7!==A){throw new Error("unknown command "+A)}this.closePolygon()}}return this.result()},s.prototype.moveTo=function(v,u){this._push_line(),this._prevIsIn=this._isIn(v,u),this._moveTo(v,u,this._prevIsIn),this._prevPt=new r(v,u),this._firstPt=new r(v,u)},s.prototype.lineTo=function(D,M){var N,E,A,F,I,G,C,z,B,v,H,w,J=this._isIn(D,M);if(J){this._prevIsIn?this._lineTo(D,M,!0):(N=this._prevPt,E=new r(D,M),A=this._intersect(E,N),this._lineTo(A.x,A.y,!0),this._lineTo(E.x,E.y,!0))}else{if(this._prevIsIn){E=this._prevPt,N=new r(D,M),A=this._intersect(E,N),this._lineTo(A.x,A.y,!0),this._lineTo(N.x,N.y,!1)}else{if(F=this._prevPt,I=new r(D,M),F.x<=this.xmin&&I.x<=this.xmin||F.x>=this.xmax&&I.x>=this.xmax||F.y<=this.ymin&&I.y<=this.ymin||F.y>=this.ymax&&I.y>=this.ymax){this._lineTo(I.x,I.y,!1)}else{if(z=[],(F.x<this.xmin&&I.x>this.xmin||F.x>this.xmin&&I.x<this.xmin)&&(G=(this.xmin-F.x)/(I.x-F.x),w=F.y+G*(I.y-F.y),w<=this.ymin?v=!1:w>=this.ymax?v=!0:(C={},C.ratio=G,C.x=this.xmin,C.y=w,z.push(C))),(F.x<this.xmax&&I.x>this.xmax||F.x>this.xmax&&I.x<this.xmax)&&(G=(this.xmax-F.x)/(I.x-F.x),w=F.y+G*(I.y-F.y),w<=this.ymin?v=!1:w>=this.ymax?v=!0:(C={},C.ratio=G,C.x=this.xmax,C.y=w,z.push(C))),(F.y<this.ymin&&I.y>this.ymin||F.y>this.ymin&&I.y<this.ymin)&&(G=(this.ymin-F.y)/(I.y-F.y),H=F.x+G*(I.x-F.x),H<=this.xmin?B=!1:H>=this.xmax?B=!0:(C={},C.ratio=G,C.x=H,C.y=this.ymin,z.push(C))),(F.y<this.ymax&&I.y>this.ymax||F.y>this.ymax&&I.y<this.ymax)&&(G=(this.ymax-F.y)/(I.y-F.y),H=F.x+G*(I.x-F.x),H<=this.xmin?B=!1:H>=this.xmax?B=!0:(C={},C.ratio=G,C.x=H,C.y=this.ymax,z.push(C))),0===z.length){B?v?this._lineTo(this.xmax,this.ymax,!0):this._lineTo(this.xmax,this.ymin,!0):v?this._lineTo(this.xmin,this.ymax,!0):this._lineTo(this.xmin,this.ymin,!0)}else{if(z.length>1&&z[0].ratio>z[1].ratio){this._lineTo(z[1].x,z[1].y,!0),this._lineTo(z[0].x,z[0].y,!0)}else{for(var K=0;K<z.length;K++){this._lineTo(z[K].x,z[K].y,!0)}}}this._lineTo(I.x,I.y,!1)}}}this._prevIsIn=J,this._prevPt=new r(D,M)},s.prototype.closePolygon=function(){var v,u;this.line.length>0&&(v=this._firstPt,u=this._prevPt,(v.x!==u.x||v.y!==u.y)&&this.lineTo(v.x,v.y))},s.prototype.result=function(){return this._push_line(),0===this.lines.length?null:this.lines},s.prototype._isIn=function(v,u){return v>=this.xmin&&v<=this.xmax&&u>=this.ymin&&u<=this.ymax},s.prototype._intersect=function(v,u){var z,w,B,A;return u.x>=this.xmin&&u.x<=this.xmax?(w=u.y<=this.ymin?this.ymin:this.ymax,z=v.x+(w-v.y)/(u.y-v.y)*(u.x-v.x)):u.y>=this.ymin&&u.y<=this.ymax?(z=u.x<=this.xmin?this.xmin:this.xmax,w=v.y+(z-v.x)/(u.x-v.x)*(u.y-v.y)):(w=u.y<=this.ymin?this.ymin:this.ymax,z=u.x<=this.xmin?this.xmin:this.xmax,B=(z-v.x)/(u.x-v.x),A=(w-v.y)/(u.y-v.y),A>B?w=v.y+B*(u.y-v.y):z=v.x+A*(u.x-v.x)),new r(z,w)},s.prototype._push_line=function(){this.line&&(1===this.type?this.line.length>0&&this.lines.push(this.line):2===this.type?this.line.length>1&&this.lines.push(this.line):3===this.type&&this.line.length>3&&this.lines.push(this.line)),this.line=[]},s.prototype._moveTo=function(v,u,w){3!==this.type?w&&(v=(v-(this.xmin+this.margin))*this.finalRatio,u=(u-(this.ymin+this.margin))*this.finalRatio,this.line.push(new r(v,u))):(w||(v<this.xmin&&(v=this.xmin),v>this.xmax&&(v=this.xmax),u<this.ymin&&(u=this.ymin),u>this.ymax&&(u=this.ymax)),v=(v-(this.xmin+this.margin))*this.finalRatio,u=(u-(this.ymin+this.margin))*this.finalRatio,this.line.push(new r(v,u)),this._is_h=!1,this._is_v=!1)},s.prototype._lineTo=function(w,v,A){var z,C;if(3!==this.type){if(A){if(w=(w-(this.xmin+this.margin))*this.finalRatio,v=(v-(this.ymin+this.margin))*this.finalRatio,this.line.length>0&&(z=this.line[this.line.length-1],z.x===w&&z.y===v)){return}this.line.push(new r(w,v))}else{this.line&&this.line.length>0&&this._push_line()}}else{if(A||(w<this.xmin&&(w=this.xmin),w>this.xmax&&(w=this.xmax),v<this.ymin&&(v=this.ymin),v>this.ymax&&(v=this.ymax)),w=(w-(this.xmin+this.margin))*this.finalRatio,v=(v-(this.ymin+this.margin))*this.finalRatio,this.line&&this.line.length>0){z=this.line[this.line.length-1];var B=z.x===w,u=z.y===v;if(B&&u){return}this._is_h&&B?(z.x=w,z.y=v,C=this.line[this.line.length-2],this._is_h=C.x===w,this._is_v=C.y===v):this._is_v&&u?(z.x=w,z.y=v,C=this.line[this.line.length-2],this._is_h=C.x===w,this._is_v=C.y===v):(this.line.push(new r(w,v)),this._is_h=B,this._is_v=u)}else{this.line.push(new r(w,v))}}}},{"point-geometry":137}],147:[function(q,r,o){function p(B,z,A,w,C){this.properties={},this.extent=A,this.type=0,this._pbf=B,this._geometry=-1,this._keys=w,this._values=C,B.readFields(v,this,z)}function v(A,w,z){1==A?w._id=z.readVarint():2==A?t(z,w):3==A?w.type=z.readVarint():4==A&&(w._geometry=z.pos)}function t(B,z){for(var A=B.readVarint()+B.pos;B.pos<A;){var w=z._keys[B.readVarint()],C=z._values[B.readVarint()];z.properties[w]=C}}var s=q("point-geometry"),u=q("./vectortileclipper");r.exports=p,p.types=["Unknown","Point","LineString","Polygon"],p.prototype.loadGeometry=function(){var F;if(this.dz){var I=new u(this);F=I.loadGeometry()}else{for(var w=0,D=this.extent;D>4096;){w+=1,D>>=1}var A=this._pbf;A.pos=this._geometry;var G,B=A.readVarint()+A.pos,J=1,z=0,E=0,H=0;for(F=[];A.pos<B;){if(!z){var C=A.readVarint();J=7&C,z=C>>3}if(z--,1===J||2===J){E+=A.readSVarint(),H+=A.readSVarint(),1===J&&(G&&F.push(G),G=[]),G.push(new s(E>>w,H>>w))}else{if(7!==J){throw new Error("unknown command "+J)}G&&G.push(G[0].clone())}}G&&F.push(G)}return F},p.prototype.bbox=function(){var E=this._pbf;E.pos=this._geometry;for(var H=E.readVarint()+E.pos,w=1,C=0,A=0,F=0,B=1/0,I=-(1/0),z=1/0,D=-(1/0);E.pos<H;){if(!C){var G=E.readVarint();w=7&G,C=G>>3}if(C--,1===w||2===w){A+=E.readSVarint(),F+=E.readSVarint(),B>A&&(B=A),A>I&&(I=A),z>F&&(z=F),F>D&&(D=F)}else{if(7!==w){throw new Error("unknown command "+w)}}}return[B,z,I,D]},p.prototype.toGeoJSON=function(F,J,w){for(var D=this.extent*Math.pow(2,w),A=this.extent*F,H=this.extent*J,B=this.loadGeometry(),K=p.types[this.type],z=0;z<B.length;z++){for(var E=B[z],I=0;I<E.length;I++){var C=E[I],G=180-360*(C.y+H)/D;E[I]=[360*(C.x+A)/D-180,360/Math.PI*Math.atan(Math.exp(G*Math.PI/180))-90]}}return"Point"===K&&1===B.length?B=B[0][0]:"Point"===K?(B=B[0],K="MultiPoint"):"LineString"===K&&1===B.length?B=B[0]:"LineString"===K&&(K="MultiLineString"),{type:"Feature",geometry:{type:K,coordinates:B},properties:this.properties}}},{"./vectortileclipper":146,"point-geometry":137}],148:[function(q,s,o){function t(w,v){this.version=1,this.name=null,this.extent=4096,this.length=0,this._pbf=w,this._keys=[],this._values=[],this._features=[],w.readFields(r,this,v),this.length=this._features.length}function r(z,v,w){15===z?v.version=w.readVarint():1===z?v.name=w.readString():5===z?v.extent=w.readVarint():2===z?v._features.push(w.pos):3===z?v._keys.push(w.readString()):4===z&&v._values.push(u(w))}function u(A){for(var w=null,z=A.readVarint()+A.pos;A.pos<z;){var v=A.readVarint()>>3;w=1===v?A.readString():2===v?A.readFloat():3===v?A.readDouble():4===v?A.readVarint64():5===v?A.readVarint():6===v?A.readSVarint():7===v?A.readBoolean():null}return w}var p=q("./vectortilefeature.js");s.exports=t,t.prototype.feature=function(w){if(0>w||w>=this._features.length){throw new Error("feature index out of bounds")}this._pbf.pos=this._features[w];var v=this._pbf.readVarint()+this._pbf.pos;return new p(this._pbf,v,this.extent,this._keys,this._values)}},{"./vectortilefeature.js":147}],149:[function(r,s,p){var u=arguments[3],q=arguments[4],o=arguments[5],t=JSON.stringify;s.exports=function(v){for(var D,H=Object.keys(o),z=0,w=H.length;w>z;z++){var F=H[z],B=o[F].exports;if(B===v||B["default"]===v){D=F;break}}if(!D){D=Math.floor(Math.pow(16,8)*Math.random()).toString(16);for(var I={},z=0,w=H.length;w>z;z++){var F=H[z];I[F]=F}q[D]=[Function(["require","module","exports"],"("+v+")(self)"),I]}var G=Math.floor(Math.pow(16,8)*Math.random()).toString(16),C={};C[D]=D,q[G]=[Function(["require"],"var f = require("+t(D)+");(f.default ? f.default : f)(self);"),C];var E="("+u+")({"+Object.keys(q).map(function(J){return t(J)+":["+q[J][0]+","+t(q[J][1])+"]"}).join(",")+"},{},["+t(G)+"])",A=window.URL||window.webkitURL||window.mozURL||window.msURL;return new Worker(A.createObjectURL(new Blob([E],{type:"text/javascript"})))}},{}]},{},[24])(24)});L.MapboxGL=L.Layer.extend({options:{updateInterval:32},initialize:function(k){L.setOptions(this,k);if(k.accessToken){mapboxgl.accessToken=k.accessToken}else{throw new Error("You should provide a Mapbox GL access token as a token option.")}var l=function(r,s,q){var p,o,n,m;m=function(){p=false;if(o){n.apply(q,o);o=false}};n=function(){if(p){o=arguments}else{r.apply(q,arguments);setTimeout(m,s);p=true}};return n};this._throttledUpdate=l(L.Util.bind(this._update,this),this.options.updateInterval)},onAdd:function(k){if(!this._glContainer){this._initContainer()}k._panes.tilePane.appendChild(this._glContainer);this._initGL();this._offset=this._map.containerPointToLayerPoint([0,0]);if(k.options.zoomAnimation){L.DomEvent.on(k._proxy,L.DomUtil.TRANSITION_END,this._transitionEnd,this)}},onRemove:function(k){if(this._map.options.zoomAnimation){L.DomEvent.off(this._map._proxy,L.DomUtil.TRANSITION_END,this._transitionEnd,this)}k.getPanes().tilePane.removeChild(this._glContainer);this._glMap.remove();this._glMap=null},getEvents:function(){return{move:this._throttledUpdate,zoomanim:this._animateZoom,zoom:this._pinchZoom,zoomstart:this._zoomStart,zoomend:this._zoomEnd}},_initContainer:function(){var k=this._glContainer=L.DomUtil.create("div","leaflet-gl-layer");var l=this._map.getSize();k.style.width=l.x+"px";k.style.height=l.y+"px"},_initGL:function(){var k=this._map.getCenter();var l=L.extend({},this.options,{container:this._glContainer,interactive:false,center:[k.lng,k.lat],zoom:this._map.getZoom()-1,attributionControl:false});this._glMap=new mapboxgl.Map(l);this._glMap.transform.latRange=null;L.DomUtil.addClass(this._glMap._canvas.canvas,"leaflet-image-layer");L.DomUtil.addClass(this._glMap._canvas.canvas,"leaflet-zoom-animated")},_update:function(p){this._offset=this._map.containerPointToLayerPoint([0,0]);if(this._zooming){return}var m=this._map.getSize(),l=this._glContainer,q=this._glMap,n=this._map.containerPointToLayerPoint([0,0]);L.DomUtil.setPosition(l,n);var k=this._map.getCenter();var o=q.transform;o.center=mapboxgl.LngLat.convert([k.lng,k.lat]);o.zoom=this._map.getZoom()-1;if(q.transform.width!==m.x||q.transform.height!==m.y){l.style.width=m.x+"px";l.style.height=m.y+"px";q._resize()}else{q.update()}},_pinchZoom:function(k){this._glMap.jumpTo({zoom:this._map.getZoom()-1,center:this._map.getCenter()})},_animateZoom:function(k){var m=this._map.getZoomScale(k.zoom),l=this._map._latLngToNewLayerPoint(this._map.getBounds().getNorthWest(),k.zoom,k.center);L.DomUtil.setTransform(this._glMap._canvas.canvas,l.subtract(this._offset),m)},_zoomStart:function(k){this._zooming=true},_zoomEnd:function(){var l=this._map.getZoomScale(this._map.getZoom()),k=this._map._latLngToNewLayerPoint(this._map.getBounds().getNorthWest(),this._map.getZoom(),this._map.getCenter());L.DomUtil.setTransform(this._glMap._canvas.canvas,k.subtract(this._offset),l)},_transitionEnd:function(k){L.Util.requestAnimFrame(function(){var m=this._map.getZoom(),l=this._map.getCenter(),n=this._map.latLngToContainerPoint(this._map.getBounds().getNorthWest());L.DomUtil.setTransform(this._glMap._canvas.canvas,n,1);this._glMap.once("moveend",L.Util.bind(function(){this._zooming=false;this._zoomEnd()},this));this._glMap.jumpTo({center:l,zoom:m-1})},this)}});L.mapboxGL=function(k){return new L.MapboxGL(k)};function d(k,l){i.request(k,{},function(m,n){if(!m){i.request(n.sources.esri.url,{},function(o,p){if(!o){h(n,p,k);l._mapboxGL=j.mapboxGL({accessToken:"ezree",style:n});l._ready=true;l.fire("ready",{},true)}},l)}else{throw new Error("Unable to fetch vector tile style metadata")}},l)}function h(m,l,k){if(m.sources.esri.url&&m.sources.esri.url.indexOf("http")===-1){m.sources.esri.url=k.replace("/resources/styles/root.json","")}if(l.tiles&&l.tiles[0].charAt(0)!=="/"){l.tiles[0]="/"+l.tiles[0]}if(l.tileMap&&l.tileMap.charAt(0)!=="/"){l.tileMap="/"+l.tileMap}m.sources.esri={type:"vector",scheme:"xyz",tilejson:l.tilejson||"2.0.0",format:(l.tileInfo&&l.tileInfo.format)||"pbf",index:l.tileMap?m.sources.esri.url+l.tileMap:null,tiles:[m.sources.esri.url+l.tiles[0]],description:l.description,name:l.name};if(m.glyphs.indexOf("http")===-1){m.glyphs=k.replace("styles/root.json",m.glyphs.replace("../",""));m.sprite=k.replace("styles/root.json",m.sprite.replace("../",""))}}var a=j.Layer.extend({statics:{URLPREFIX:"https://www.arcgis.com/sharing/rest/content/items/",URLSUFFIX:"/resources/styles/root.json",STYLES:{DarkGray:"57436c01bc754dbb87dfb636b6484022",Gray:"1e47168d181248e491541ffd5a91c0de",Hybrid:"af6063d6906c4eb589dfe03819610660",Navigation:"e19e9330bf08490ca8353d76b5e2e658",Streets:"a60a37a27cc140ddad15f919cd5a69f2",StreetsNight:"92c551c9f07b4147846aae273e822714",StreetsRelief:"78c0a9ab4fbf4198a8b951848aab19d8",Topographic:"86d5ed4b6dc741de9dad5f0fbe09ae95",Spring:"763884983d3544c0a418a97992881fce",Newspaper:"4f4843d99c34436f82920932317893ae",MidCentury:"267f44f08a844c7abee2b62b00600540",ModernAntique:"996d9e7a3aac4514bb692ce7a990f1c1",BlackAndWhite:"3161443179244702a5e0449010013b54"}},initialize:function(l){l={key:l};if(typeof l.key==="string"&&a.STYLES[l.key]){var k=a.URLPREFIX+a.STYLES[l.key]+a.URLSUFFIX;d(k,this)}else{throw new Error('L.esri.Vector.Basemap: Invalid parameter. Use one of "DarkGray", "Gray", "Hybrid", "Navigation", "Streets", "StreetsNight", "StreetsRelief", "Topographic"')}},onAdd:function(k){this._map=k;i.Util.setEsriAttribution(k);if(k.attributionControl){i.Util._getAttributionData("https://static.arcgis.com/attribution/World_Street_Map",k);k.attributionControl.addAttribution('<span class="esri-dynamic-attribution">USGS, NOAA</span>')}if(this._ready){this._asyncAdd()}else{this.once("ready",function(){this._asyncAdd()},this)}},onRemove:function(l){l.off("moveend",i.Util._updateMapAttribution);l.removeLayer(this._mapboxGL);if(l.attributionControl){var k=document.getElementsByClassName("esri-dynamic-attribution")[0].outerHTML;l.attributionControl.removeAttribution(k)}},_asyncAdd:function(){var k=this._map;k.getContainer().style.background=this._mapboxGL.options.style.layers[0].paint["background-color"];k.on("moveend",i.Util._updateMapAttribution);this._mapboxGL.addTo(k,this)}});function f(k){return new a(k)}var b=j.Layer.extend({statics:{URLPREFIX:"https://www.arcgis.com/sharing/rest/content/items/"},initialize:function(l){l={id:l};if(typeof l.id==="string"){var m=b.URLPREFIX+l.id;var n;var k;i.request(m,{},function(o,p){if(!o){n=p.url;if(n.indexOf("basemaps.arcgis.com")===-1){this._customTileset=true;if(p.accessInformation){this._copyrightText=p.accessInformation}i.request(n,{},function(q,r){if(!q){if(r.defaultStyles.charAt(0)!=="/"){r.defaultStyles="/"+r.defaultStyles}k=n+r.defaultStyles+"/root.json";i.request(k,{},function(s,t){if(!s){h(t,r,k);this._mapboxGL=j.mapboxGL({accessToken:"ezree",style:t});this._ready=true;this.fire("ready",{},true)}},this)}},this)}else{d(m+"/resources/styles/root.json",this)}}},this)}else{throw new Error("L.esri.Vector.Layer: Invalid parameter. Use the id of an ArcGIS Online vector tile item")}},onAdd:function(k){this._map=k;i.Util.setEsriAttribution(k);if(this._ready){this._asyncAdd()}else{this.once("ready",function(){this._asyncAdd()},this)}},onRemove:function(l){l.off("moveend",i.Util._updateMapAttribution);l.removeLayer(this._mapboxGL);if(l.attributionControl){var k=document.getElementsByClassName("esri-dynamic-attribution")[0].outerHTML;l.attributionControl.removeAttribution(k)}},_asyncAdd:function(){var k=this._map;if(k.attributionControl){if(this._customTileset){if(this._copyrightText){k.attributionControl.addAttribution('<span class="esri-dynamic-attribution">'+this._copyrightText+"</span>")}}else{i.Util._getAttributionData("https://static.arcgis.com/attribution/World_Street_Map",k);k.attributionControl.addAttribution('<span class="esri-dynamic-attribution">USGS, NOAA</span>');k.on("moveend",i.Util._updateMapAttribution)}}k.getContainer().style.background=this._mapboxGL.options.style.layers[0].paint["background-color"];this._mapboxGL.addTo(k,this)}});function e(k){return new b(k)}c.VERSION=g;c.Basemap=a;c.basemap=f;c.Layer=b;c.layer=e}));
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-vector-2.0.2.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,5 @@
+/* esri-leaflet-vector - v2.0.2 - Thu Feb 07 2019 13:37:37 GMT-0800 (Pacific Standard Time)
+ * Copyright (c) 2019 Environmental Systems Research Institute, Inc.
+ * Apache-2.0 */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("leaflet"),require("mapbox-gl"),require("esri-leaflet")):"function"==typeof define&&define.amd?define(["exports","leaflet","mapbox-gl","esri-leaflet"],e):e((t.L=t.L||{},t.L.esri=t.L.esri||{},t.L.esri.Vector={}),t.L,t.mapboxgl,t.L.esri)}(this,function(t,e,i,a){"use strict";e=e&&e.hasOwnProperty("default")?e.default:e;function o(t,i){a.request(t,{},function(o,s){if(o)throw new Error("Unable to fetch vector tile style metadata");a.request(s.sources.esri.url,{},function(a,o){a||(n(s,o,t),i._mapboxGL=e.mapboxGL({accessToken:"ezree",style:s}),i._ready=!0,i.fire("ready",{},!0))},i)},i)}function n(t,e,i){t.sources.esri.url&&-1===t.sources.esri.url.indexOf("http")&&(t.sources.esri.url=i.replace("/resources/styles/root.json","")),e.tiles&&"/"!==e.tiles[0].charAt(0)&&(e.tiles[0]="/"+e.tiles[0]),e.tileMap&&"/"!==e.tileMap.charAt(0)&&(e.tileMap="/"+e.tileMap),t.sources.esri={type:"vector",scheme:"xyz",tilejson:e.tilejson||"2.0.0",format:e.tileInfo&&e.tileInfo.format||"pbf",index:e.tileMap?t.sources.esri.url+e.tileMap:null,tiles:[t.sources.esri.url+e.tiles[0]],description:e.description,name:e.name,maxzoom:15},-1===t.glyphs.indexOf("http")&&(t.glyphs=i.replace("styles/root.json",t.glyphs.replace("../","")),t.sprite=i.replace("styles/root.json",t.sprite.replace("../","")))}L.MapboxGL=L.Layer.extend({options:{updateInterval:32},initialize:function(t){if(L.setOptions(this,t),!t.accessToken)throw new Error("You should provide a Mapbox GL access token as a token option.");mapboxgl.accessToken=t.accessToken;var e,i,a,o,n,s,r;this._throttledUpdate=(e=L.Util.bind(this._update,this),i=this.options.updateInterval,r=function(){o=!1,n&&(s.apply(a,n),n=!1)},s=function(){o?n=arguments:(e.apply(a,arguments),setTimeout(r,i),o=!0)})},onAdd:function(t){this._glContainer||this._initContainer(),t._panes.tilePane.appendChild(this._glContainer),this._initGL(),this._offset=this._map.containerPointToLayerPoint([0,0]),t.options.zoomAnimation&&L.DomEvent.on(t._proxy,L.DomUtil.TRANSITION_END,this._transitionEnd,this)},onRemove:function(t){this._map.options.zoomAnimation&&L.DomEvent.off(this._map._proxy,L.DomUtil.TRANSITION_END,this._transitionEnd,this),t.getPanes().tilePane.removeChild(this._glContainer),this._glMap.remove(),this._glMap=null},getEvents:function(){return{move:this._throttledUpdate,zoomanim:this._animateZoom,zoom:this._pinchZoom,zoomstart:this._zoomStart,zoomend:this._zoomEnd}},_initContainer:function(){var t=this._glContainer=L.DomUtil.create("div","leaflet-gl-layer"),e=this._map.getSize();t.style.width=e.x+"px",t.style.height=e.y+"px"},_initGL:function(){var t=this._map.getCenter(),e=L.extend({},this.options,{container:this._glContainer,interactive:!1,center:[t.lng,t.lat],zoom:this._map.getZoom()-1,attributionControl:!1});this._glMap=new mapboxgl.Map(e),this._glMap.transform.latRange=null,this._glMap._canvas.canvas?this._glMap._actualCanvas=this._glMap._canvas.canvas:this._glMap._actualCanvas=this._glMap._canvas,L.DomUtil.addClass(this._glMap._actualCanvas,"leaflet-image-layer"),L.DomUtil.addClass(this._glMap._actualCanvas,"leaflet-zoom-animated")},_update:function(t){if(this._offset=this._map.containerPointToLayerPoint([0,0]),!this._zooming){var e=this._map.getSize(),i=this._glContainer,a=this._glMap,o=this._map.containerPointToLayerPoint([0,0]);L.DomUtil.setPosition(i,o);var n=this._map.getCenter(),s=a.transform;s.center=mapboxgl.LngLat.convert([n.lng,n.lat]),s.zoom=this._map.getZoom()-1,a.transform.width!==e.x||a.transform.height!==e.y?(i.style.width=e.x+"px",i.style.height=e.y+"px",null!==a._resize&&void 0!==a._resize?a._resize():a.resize()):null!==a._update&&void 0!==a._update?a._update():a.update()}},_pinchZoom:function(t){this._glMap.jumpTo({zoom:this._map.getZoom()-1,center:this._map.getCenter()})},_animateZoom:function(t){var e=this._map.getZoomScale(t.zoom),i=this._map._latLngToNewLayerPoint(this._map.getBounds().getNorthWest(),t.zoom,t.center);L.DomUtil.setTransform(this._glMap._actualCanvas,i.subtract(this._offset),e)},_zoomStart:function(t){this._zooming=!0},_zoomEnd:function(){var t=this._map.getZoomScale(this._map.getZoom()),e=this._map._latLngToNewLayerPoint(this._map.getBounds().getNorthWest(),this._map.getZoom(),this._map.getCenter());L.DomUtil.setTransform(this._glMap._actualCanvas,e.subtract(this._offset),t),this._zooming=!1},_transitionEnd:function(t){L.Util.requestAnimFrame(function(){var t=this._map.getZoom(),e=this._map.getCenter(),i=this._map.latLngToContainerPoint(this._map.getBounds().getNorthWest());L.DomUtil.setTransform(this._glMap._actualCanvas,i,1),this._glMap.once("moveend",L.Util.bind(function(){this._zoomEnd()},this)),this._glMap.jumpTo({center:e,zoom:t-1})},this)}}),L.mapboxGL=function(t){return new L.MapboxGL(t)};var s=e.Layer.extend({statics:{URLPREFIX:"https://www.arcgis.com/sharing/rest/content/items/",URLSUFFIX:"/resources/styles/root.json",STYLES:{OpenStreetMap:"3e1a00aeae81496587988075fe529f71",Streets:"de26a3cf4cc9451298ea173c4b324736",StreetsRelief:"b266e6d17fc345b498345613930fbd76",Topographic:"7a6bf0e8cb5a418085e66c0485e74d19",StreetsNight:"93554006894c45a88136127535878fca",Newspaper:"dfb04de5f3144a80bc3f9f336228d24a",Navigation:"63c47b7177f946b49902c24129b87252",Nova:"75f4dfdff19e445395653121a95a85db",ColoredPencil:"4cf7e1fb9f254dcda9c8fbadb15cf0f8",Hybrid:"30d6b8271e1849cd9c3042060001f425",Gray:"291da5eab3a0412593b66d384379f89f",DarkGray:"5e9b3685f4c24d8781073dd928ebda50",HumanGeography:"2afe5b807fa74006be6363fd243ffb30",HumanGeographyDetail:"97fa1365da1e43eabb90d0364326bc2d",DarkHumanGeography:"d7397603e9274052808839b70812be50",DarkHumanGeographyDetail:"1ddbb25aa29c4811aaadd94de469856a",ChartedTerritory:"1c365daf37a744fbad748b67aa69dac8",MidCentury:"7675d44bb1e4428aa2c30a9b68f97822"}},initialize:function(t){if(t={key:t},this._basemap=t.key,"string"!=typeof t.key||!s.STYLES[t.key])throw new Error('L.esri.Vector.Basemap: Invalid parameter. Use one of "DarkGray", "Gray", "Hybrid", "Navigation", "Streets", "StreetsNight", "StreetsRelief", "Topographic"');o(s.URLPREFIX+s.STYLES[t.key]+s.URLSUFFIX,this)},onAdd:function(t){this._map=t,a.Util.setEsriAttribution(t),t.attributionControl&&("OpenStreetMap"===this._basemap?(t.attributionControl.setPrefix('<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'),t.attributionControl.addAttribution('<span class="esri-dynamic-attribution">&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, map layer by Esri</span>')):(a.Util._getAttributionData("https://static.arcgis.com/attribution/World_Street_Map",t),t.attributionControl.addAttribution('<span class="esri-dynamic-attribution">USGS, NOAA</span>'))),this._ready?this._asyncAdd():this.once("ready",function(){this._asyncAdd()},this)},onRemove:function(t){if(t.off("moveend",a.Util._updateMapAttribution),t.removeLayer(this._mapboxGL),t.attributionControl){var e=document.getElementsByClassName("esri-dynamic-attribution")[0].outerHTML;t.attributionControl.removeAttribution(e)}},_asyncAdd:function(){var t=this._map;t.getContainer().style.background=this._mapboxGL.options.style.layers[0].paint["background-color"]||"#e1e3d0",t.on("moveend",a.Util._updateMapAttribution),this._mapboxGL.addTo(t,this)}});var r=e.Layer.extend({statics:{URLPREFIX:"https://www.arcgis.com/sharing/rest/content/items/"},initialize:function(t){if("string"!=typeof(t={id:t}).id)throw new Error("L.esri.Vector.Layer: Invalid parameter. Use the id of an ArcGIS Online vector tile item");var i,s,l=r.URLPREFIX+t.id;a.request(l,{},function(t,r){t||(-1===(i=r.url).indexOf("basemaps.arcgis.com")?(this._customTileset=!0,r.accessInformation&&(this._copyrightText=r.accessInformation),a.request(i,{},function(t,o){t||("/"!==o.defaultStyles.charAt(0)&&(o.defaultStyles="/"+o.defaultStyles),s=i+o.defaultStyles+"/root.json",a.request(s,{},function(t,i){t||(n(i,o,s),this._mapboxGL=e.mapboxGL({accessToken:"ezree",style:i}),this._ready=!0,this.fire("ready",{},!0))},this))},this)):o(l+"/resources/styles/root.json",this))},this)},onAdd:function(t){this._map=t,a.Util.setEsriAttribution(t),this._ready?this._asyncAdd():this.once("ready",function(){this._asyncAdd()},this)},onRemove:function(t){if(t.off("moveend",a.Util._updateMapAttribution),t.removeLayer(this._mapboxGL),t.attributionControl){var e=document.getElementsByClassName("esri-dynamic-attribution")[0].outerHTML;t.attributionControl.removeAttribution(e)}},_asyncAdd:function(){var t=this._map;t.attributionControl&&(this._customTileset?this._copyrightText&&t.attributionControl.addAttribution('<span class="esri-dynamic-attribution">'+this._copyrightText+"</span>"):(a.Util._getAttributionData("https://static.arcgis.com/attribution/World_Street_Map",t),t.attributionControl.addAttribution('<span class="esri-dynamic-attribution">USGS, NOAA</span>'),t.on("moveend",a.Util._updateMapAttribution))),t.getContainer().style.background=this._mapboxGL.options.style.layers[0].paint["background-color"],this._mapboxGL.addTo(t,this)}});t.VERSION="2.0.2",t.Basemap=s,t.basemap=function(t){return new s(t)},t.Layer=r,t.layer=function(t){return new r(t)},Object.defineProperty(t,"__esModule",{value:!0})});
+//# sourceMappingURL=esri-leaflet-vector.js.map
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-esri-vector-2.0.2.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("leaflet"),require("mapbox-gl"),require("esri-leaflet")):"function"==typeof define&&define.amd?define(["exports","leaflet","mapbox-gl","esri-leaflet"],e):e((t.L=t.L||{},t.L.esri=t.L.esri||{},t.L.esri.Vector={}),t.L,t.mapboxgl,t.L.esri)}(this,(function(t,e,i,a){"use strict";function o(t,i){a.request(t,{},(function(o,s){if(o)throw new Error("Unable to fetch vector tile style metadata");a.request(s.sources.esri.url,{},(function(a,o){a||(n(s,o,t),i._mapboxGL=e.mapboxGL({accessToken:"ezree",style:s}),i._ready=!0,i.fire("ready",{},!0))}),i)}),i)}function n(t,e,i){t.sources.esri.url&&-1===t.sources.esri.url.indexOf("http")&&(t.sources.esri.url=i.replace("/resources/styles/root.json","")),e.tiles&&"/"!==e.tiles[0].charAt(0)&&(e.tiles[0]="/"+e.tiles[0]),e.tileMap&&"/"!==e.tileMap.charAt(0)&&(e.tileMap="/"+e.tileMap),t.sources.esri={type:"vector",scheme:"xyz",tilejson:e.tilejson||"2.0.0",format:e.tileInfo&&e.tileInfo.format||"pbf",index:e.tileMap?t.sources.esri.url+e.tileMap:null,tiles:[t.sources.esri.url+e.tiles[0]],description:e.description,name:e.name,maxzoom:15},-1===t.glyphs.indexOf("http")&&(t.glyphs=i.replace("styles/root.json",t.glyphs.replace("../","")),t.sprite=i.replace("styles/root.json",t.sprite.replace("../","")))}e=e&&e.hasOwnProperty("default")?e.default:e,L.MapboxGL=L.Layer.extend({options:{updateInterval:32},initialize:function(t){if(L.setOptions(this,t),!t.accessToken)throw new Error("You should provide a Mapbox GL access token as a token option.");var e,i,a,o,n,s,r;mapboxgl.accessToken=t.accessToken,this._throttledUpdate=(e=L.Util.bind(this._update,this),i=this.options.updateInterval,r=function(){o=!1,n&&(s.apply(a,n),n=!1)},s=function(){o?n=arguments:(e.apply(a,arguments),setTimeout(r,i),o=!0)})},onAdd:function(t){this._glContainer||this._initContainer(),t._panes.tilePane.appendChild(this._glContainer),this._initGL(),this._offset=this._map.containerPointToLayerPoint([0,0]),t.options.zoomAnimation&&L.DomEvent.on(t._proxy,L.DomUtil.TRANSITION_END,this._transitionEnd,this)},onRemove:function(t){this._map.options.zoomAnimation&&L.DomEvent.off(this._map._proxy,L.DomUtil.TRANSITION_END,this._transitionEnd,this),t.getPanes().tilePane.removeChild(this._glContainer),this._glMap.remove(),this._glMap=null},getEvents:function(){return{move:this._throttledUpdate,zoomanim:this._animateZoom,zoom:this._pinchZoom,zoomstart:this._zoomStart,zoomend:this._zoomEnd}},_initContainer:function(){var t=this._glContainer=L.DomUtil.create("div","leaflet-gl-layer"),e=this._map.getSize();t.style.width=e.x+"px",t.style.height=e.y+"px"},_initGL:function(){var t=this._map.getCenter(),e=L.extend({},this.options,{container:this._glContainer,interactive:!1,center:[t.lng,t.lat],zoom:this._map.getZoom()-1,attributionControl:!1});this._glMap=new mapboxgl.Map(e),this._glMap.transform.latRange=null,this._glMap._canvas.canvas?this._glMap._actualCanvas=this._glMap._canvas.canvas:this._glMap._actualCanvas=this._glMap._canvas,L.DomUtil.addClass(this._glMap._actualCanvas,"leaflet-image-layer"),L.DomUtil.addClass(this._glMap._actualCanvas,"leaflet-zoom-animated")},_update:function(t){if(this._offset=this._map.containerPointToLayerPoint([0,0]),!this._zooming){var e=this._map.getSize(),i=this._glContainer,a=this._glMap,o=this._map.containerPointToLayerPoint([0,0]);L.DomUtil.setPosition(i,o);var n=this._map.getCenter(),s=a.transform;s.center=mapboxgl.LngLat.convert([n.lng,n.lat]),s.zoom=this._map.getZoom()-1,a.transform.width!==e.x||a.transform.height!==e.y?(i.style.width=e.x+"px",i.style.height=e.y+"px",null!==a._resize&&void 0!==a._resize?a._resize():a.resize()):null!==a._update&&void 0!==a._update?a._update():a.update()}},_pinchZoom:function(t){this._glMap.jumpTo({zoom:this._map.getZoom()-1,center:this._map.getCenter()})},_animateZoom:function(t){var e=this._map.getZoomScale(t.zoom),i=this._map._latLngToNewLayerPoint(this._map.getBounds().getNorthWest(),t.zoom,t.center);L.DomUtil.setTransform(this._glMap._actualCanvas,i.subtract(this._offset),e)},_zoomStart:function(t){this._zooming=!0},_zoomEnd:function(){var t=this._map.getZoomScale(this._map.getZoom()),e=this._map._latLngToNewLayerPoint(this._map.getBounds().getNorthWest(),this._map.getZoom(),this._map.getCenter());L.DomUtil.setTransform(this._glMap._actualCanvas,e.subtract(this._offset),t),this._zooming=!1},_transitionEnd:function(t){L.Util.requestAnimFrame((function(){var t=this._map.getZoom(),e=this._map.getCenter(),i=this._map.latLngToContainerPoint(this._map.getBounds().getNorthWest());L.DomUtil.setTransform(this._glMap._actualCanvas,i,1),this._glMap.once("moveend",L.Util.bind((function(){this._zoomEnd()}),this)),this._glMap.jumpTo({center:e,zoom:t-1})}),this)}}),L.mapboxGL=function(t){return new L.MapboxGL(t)};var s=e.Layer.extend({statics:{URLPREFIX:"https://www.arcgis.com/sharing/rest/content/items/",URLSUFFIX:"/resources/styles/root.json",STYLES:{OpenStreetMap:"3e1a00aeae81496587988075fe529f71",Streets:"de26a3cf4cc9451298ea173c4b324736",StreetsRelief:"b266e6d17fc345b498345613930fbd76",Topographic:"7a6bf0e8cb5a418085e66c0485e74d19",StreetsNight:"93554006894c45a88136127535878fca",Newspaper:"dfb04de5f3144a80bc3f9f336228d24a",Navigation:"63c47b7177f946b49902c24129b87252",Nova:"75f4dfdff19e445395653121a95a85db",ColoredPencil:"4cf7e1fb9f254dcda9c8fbadb15cf0f8",Hybrid:"30d6b8271e1849cd9c3042060001f425",Gray:"291da5eab3a0412593b66d384379f89f",DarkGray:"5e9b3685f4c24d8781073dd928ebda50",HumanGeography:"2afe5b807fa74006be6363fd243ffb30",HumanGeographyDetail:"97fa1365da1e43eabb90d0364326bc2d",DarkHumanGeography:"d7397603e9274052808839b70812be50",DarkHumanGeographyDetail:"1ddbb25aa29c4811aaadd94de469856a",ChartedTerritory:"1c365daf37a744fbad748b67aa69dac8",MidCentury:"7675d44bb1e4428aa2c30a9b68f97822"}},initialize:function(t){if(t={key:t},this._basemap=t.key,"string"!=typeof t.key||!s.STYLES[t.key])throw new Error('L.esri.Vector.Basemap: Invalid parameter. Use one of "DarkGray", "Gray", "Hybrid", "Navigation", "Streets", "StreetsNight", "StreetsRelief", "Topographic"');o(s.URLPREFIX+s.STYLES[t.key]+s.URLSUFFIX,this)},onAdd:function(t){this._map=t,a.Util.setEsriAttribution(t),t.attributionControl&&("OpenStreetMap"===this._basemap?(t.attributionControl.setPrefix('<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'),t.attributionControl.addAttribution('<span class="esri-dynamic-attribution">&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, map layer by Esri</span>')):(a.Util._getAttributionData("https://static.arcgis.com/attribution/World_Street_Map",t),t.attributionControl.addAttribution('<span class="esri-dynamic-attribution">USGS, NOAA</span>'))),this._ready?this._asyncAdd():this.once("ready",(function(){this._asyncAdd()}),this)},onRemove:function(t){if(t.off("moveend",a.Util._updateMapAttribution),t.removeLayer(this._mapboxGL),t.attributionControl){var e=document.getElementsByClassName("esri-dynamic-attribution")[0].outerHTML;t.attributionControl.removeAttribution(e)}},_asyncAdd:function(){var t=this._map;t.getContainer().style.background=this._mapboxGL.options.style.layers[0].paint["background-color"]||"#e1e3d0",t.on("moveend",a.Util._updateMapAttribution),this._mapboxGL.addTo(t,this)}}),r=e.Layer.extend({statics:{URLPREFIX:"https://www.arcgis.com/sharing/rest/content/items/"},initialize:function(t){if("string"!=typeof(t={id:t}).id)throw new Error("L.esri.Vector.Layer: Invalid parameter. Use the id of an ArcGIS Online vector tile item");var i,s,l=r.URLPREFIX+t.id;a.request(l,{},(function(t,r){t||(-1===(i=r.url).indexOf("basemaps.arcgis.com")?(this._customTileset=!0,r.accessInformation&&(this._copyrightText=r.accessInformation),a.request(i,{},(function(t,o){t||("/"!==o.defaultStyles.charAt(0)&&(o.defaultStyles="/"+o.defaultStyles),s=i+o.defaultStyles+"/root.json",a.request(s,{},(function(t,i){t||(n(i,o,s),this._mapboxGL=e.mapboxGL({accessToken:"ezree",style:i}),this._ready=!0,this.fire("ready",{},!0))}),this))}),this)):o(l+"/resources/styles/root.json",this))}),this)},onAdd:function(t){this._map=t,a.Util.setEsriAttribution(t),this._ready?this._asyncAdd():this.once("ready",(function(){this._asyncAdd()}),this)},onRemove:function(t){if(t.off("moveend",a.Util._updateMapAttribution),t.removeLayer(this._mapboxGL),t.attributionControl){var e=document.getElementsByClassName("esri-dynamic-attribution")[0].outerHTML;t.attributionControl.removeAttribution(e)}},_asyncAdd:function(){var t=this._map;t.attributionControl&&(this._customTileset?this._copyrightText&&t.attributionControl.addAttribution('<span class="esri-dynamic-attribution">'+this._copyrightText+"</span>"):(a.Util._getAttributionData("https://static.arcgis.com/attribution/World_Street_Map",t),t.attributionControl.addAttribution('<span class="esri-dynamic-attribution">USGS, NOAA</span>'),t.on("moveend",a.Util._updateMapAttribution))),t.getContainer().style.background=this._mapboxGL.options.style.layers[0].paint["background-color"],this._mapboxGL.addTo(t,this)}});t.VERSION="2.0.2",t.Basemap=s,t.basemap=function(t){return new s(t)},t.Layer=r,t.layer=function(t){return new r(t)},Object.defineProperty(t,"__esModule",{value:!0})}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-gesture-handling-1.2.1.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,552 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+    typeof define === 'function' && define.amd ? define('leafletGestureHandling', ['exports'], factory) :
+    (factory((global.leafletGestureHandling = {})));
+}(this, (function (exports) { 'use strict';
+
+    var LanguageContent = {
+        //Arabic
+        ar: {
+            touch: "\u0627\u0633\u062a\u062e\u062f\u0645 \u0625\u0635\u0628\u0639\u064a\u0646 \u0644\u062a\u062d\u0631\u064a\u0643 \u0627\u0644\u062e\u0631\u064a\u0637\u0629",
+            scroll: "\u200f\u0627\u0633\u062a\u062e\u062f\u0645 ctrl + scroll \u0644\u062a\u0635\u063a\u064a\u0631/\u062a\u0643\u0628\u064a\u0631 \u0627\u0644\u062e\u0631\u064a\u0637\u0629",
+            scrollMac: "\u064a\u0645\u0643\u0646\u0643 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u2318 + \u0627\u0644\u062a\u0645\u0631\u064a\u0631 \u0644\u062a\u0643\u0628\u064a\u0631/\u062a\u0635\u063a\u064a\u0631 \u0627\u0644\u062e\u0631\u064a\u0637\u0629"
+        },
+        //Bulgarian
+        bg: {
+            touch: "\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439\u0442\u0435 \u0434\u0432\u0430 \u043f\u0440\u044a\u0441\u0442\u0430, \u0437\u0430 \u0434\u0430 \u043f\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u043a\u0430\u0440\u0442\u0430\u0442\u0430",
+            scroll: "\u0417\u0430\u0434\u0440\u044a\u0436\u0442\u0435 \u0431\u0443\u0442\u043e\u043d\u0430 Ctrl \u043d\u0430\u0442\u0438\u0441\u043d\u0430\u0442, \u0434\u043e\u043a\u0430\u0442\u043e \u043f\u0440\u0435\u0432\u044a\u0440\u0442\u0430\u0442\u0435, \u0437\u0430 \u0434\u0430 \u043f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0435 \u043c\u0430\u0449\u0430\u0431\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0430\u0442\u0430",
+            scrollMac: "\u0417\u0430\u0434\u0440\u044a\u0436\u0442\u0435 \u0431\u0443\u0442\u043e\u043d\u0430 \u2318 \u043d\u0430\u0442\u0438\u0441\u043d\u0430\u0442, \u0434\u043e\u043a\u0430\u0442\u043e \u043f\u0440\u0435\u0432\u044a\u0440\u0442\u0430\u0442\u0435, \u0437\u0430 \u0434\u0430 \u043f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0435 \u043c\u0430\u0449\u0430\u0431\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0430\u0442\u0430"
+        },
+        //Bengali
+        bn: {
+            touch: "\u09ae\u09be\u09a8\u099a\u09bf\u09a4\u09cd\u09b0\u099f\u09bf\u0995\u09c7 \u09b8\u09b0\u09be\u09a4\u09c7 \u09a6\u09c1\u099f\u09bf \u0986\u0999\u09cd\u0997\u09c1\u09b2 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09c1\u09a8",
+            scroll: "\u09ae\u09cd\u09af\u09be\u09aa \u099c\u09c1\u09ae \u0995\u09b0\u09a4\u09c7 ctrl + scroll \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09c1\u09a8",
+            scrollMac: "\u09ae\u09cd\u09af\u09be\u09aa\u09c7 \u099c\u09c1\u09ae \u0995\u09b0\u09a4\u09c7 \u2318 \u09ac\u09cb\u09a4\u09be\u09ae \u099f\u09bf\u09aa\u09c7 \u09b8\u09cd\u0995\u09cd\u09b0\u09b2 \u0995\u09b0\u09c1\u09a8"
+        },
+        //Catalan
+        ca: {
+            touch: "Fes servir dos dits per moure el mapa",
+            scroll: "Prem la tecla Control mentre et desplaces per apropar i allunyar el mapa",
+            scrollMac: "Prem la tecla \u2318 mentre et desplaces per apropar i allunyar el mapa"
+        },
+        //Czech
+        cs: {
+            touch: "K\u00a0posunut\u00ed mapy pou\u017eijte dva prsty",
+            scroll: "Velikost zobrazen\u00ed mapy zm\u011b\u0148te podr\u017een\u00edm kl\u00e1vesy Ctrl a\u00a0posouv\u00e1n\u00edm kole\u010dka my\u0161i",
+            scrollMac: "Velikost zobrazen\u00ed mapy zm\u011bn\u00edte podr\u017een\u00edm kl\u00e1vesy \u2318 a\u00a0posunut\u00edm kole\u010dka my\u0161i / touchpadu"
+        },
+        //Danish
+        da: {
+            touch: "Brug to fingre til at flytte kortet",
+            scroll: "Brug ctrl + rullefunktionen til at zoome ind og ud p\u00e5 kortet",
+            scrollMac: "Brug \u2318 + rullefunktionen til at zoome ind og ud p\u00e5 kortet"
+        },
+        //German
+        de: {
+            touch: "Verschieben der Karte mit zwei Fingern",
+            scroll: "Verwende Strg+Scrollen zum Zoomen der Karte",
+            scrollMac: "\u2318"
+        },
+        //Greek
+        el: {
+            touch: "\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03b4\u03cd\u03bf \u03b4\u03ac\u03c7\u03c4\u03c5\u03bb\u03b1 \u03b3\u03b9\u03b1 \u03bc\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u03c3\u03c4\u03bf\u03bd \u03c7\u03ac\u03c1\u03c4\u03b7",
+            scroll: "\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf \u03c0\u03bb\u03ae\u03ba\u03c4\u03c1\u03bf Ctrl \u03ba\u03b1\u03b9 \u03ba\u03cd\u03bb\u03b9\u03c3\u03b7, \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03bc\u03b5\u03b3\u03b5\u03b8\u03cd\u03bd\u03b5\u03c4\u03b5 \u03c4\u03bf\u03bd \u03c7\u03ac\u03c1\u03c4\u03b7",
+            scrollMac: "\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf \u03c0\u03bb\u03ae\u03ba\u03c4\u03c1\u03bf \u2318 + \u03ba\u03cd\u03bb\u03b9\u03c3\u03b7 \u03b3\u03b9\u03b1 \u03b5\u03c3\u03c4\u03af\u03b1\u03c3\u03b7 \u03c3\u03c4\u03bf\u03bd \u03c7\u03ac\u03c1\u03c4\u03b7"
+        },
+        //English
+        en: {
+            touch: "Use two fingers to move the map",
+            scroll: "Use ctrl + scroll to zoom the map",
+            scrollMac: "Use \u2318 + scroll to zoom the map"
+        },
+        //English (Australian)
+        "en-AU": {
+            touch: "Use two fingers to move the map",
+            scroll: "Use ctrl + scroll to zoom the map",
+            scrollMac: "Use \u2318 + scroll to zoom the map"
+        },
+        //English (Great Britain)
+        "en-GB": {
+            touch: "Use two fingers to move the map",
+            scroll: "Use ctrl + scroll to zoom the map",
+            scrollMac: "Use \u2318 + scroll to zoom the map"
+        },
+        //Spanish
+        es: {
+            touch: "Para mover el mapa, utiliza dos dedos",
+            scroll: "Mant\u00e9n pulsada la tecla Ctrl mientras te desplazas para acercar o alejar el mapa",
+            scrollMac: "Mant\u00e9n pulsada la tecla \u2318 mientras te desplazas para acercar o alejar el mapa"
+        },
+        //Basque
+        eu: {
+            touch: "Erabili bi hatz mapa mugitzeko",
+            scroll: "Mapan zooma aplikatzeko, sakatu Ktrl eta egin gora edo behera",
+            scrollMac: "Eduki sakatuta \u2318 eta egin gora eta behera mapa handitu eta txikitzeko"
+        },
+        //Farsi
+        fa: {
+            touch: "\u0628\u0631\u0627\u06cc \u062d\u0631\u06a9\u062a \u062f\u0627\u062f\u0646 \u0646\u0642\u0634\u0647 \u0627\u0632 \u062f\u0648 \u0627\u0646\u06af\u0634\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.",
+            scroll: "\u200f\u0628\u0631\u0627\u06cc \u0628\u0632\u0631\u06af\u200c\u0646\u0645\u0627\u06cc\u06cc \u0646\u0642\u0634\u0647 \u0627\u0632 ctrl + scroll \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f",
+            scrollMac: "\u0628\u0631\u0627\u06cc \u0628\u0632\u0631\u06af\u200c\u0646\u0645\u0627\u06cc\u06cc \u0646\u0642\u0634\u0647\u060c \u0627\u0632 \u2318 + \u067e\u06cc\u0645\u0627\u06cc\u0634 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f."
+        },
+        //Finnish
+        fi: {
+            touch: "Siirr\u00e4 karttaa kahdella sormella.",
+            scroll: "Zoomaa karttaa painamalla Ctrl-painiketta ja vieritt\u00e4m\u00e4ll\u00e4.",
+            scrollMac: "Zoomaa karttaa pit\u00e4m\u00e4ll\u00e4 painike \u2318 painettuna ja vieritt\u00e4m\u00e4ll\u00e4."
+        },
+        //Filipino
+        fil: {
+            touch: "Gumamit ng dalawang daliri upang iusog ang mapa",
+            scroll: "Gamitin ang ctrl + scroll upang i-zoom ang mapa",
+            scrollMac: "Gamitin ang \u2318 + scroll upang i-zoom ang mapa"
+        },
+        //French
+        fr: {
+            touch: "Utilisez deux\u00a0doigts pour d\u00e9placer la carte",
+            scroll: "Vous pouvez zoomer sur la carte \u00e0 l'aide de CTRL+Molette de d\u00e9filement",
+            scrollMac: "Vous pouvez zoomer sur la carte \u00e0 l'aide de \u2318+Molette de d\u00e9filement"
+        },
+        //Galician
+        gl: {
+            touch: "Utiliza dous dedos para mover o mapa",
+            scroll: "Preme Ctrl mentres te desprazas para ampliar o mapa",
+            scrollMac: "Preme \u2318 e despr\u00e1zate para ampliar o mapa"
+        },
+        //Gujarati
+        gu: {
+            touch: "\u0aa8\u0a95\u0ab6\u0acb \u0a96\u0ab8\u0ac7\u0aa1\u0ab5\u0abe \u0aac\u0ac7 \u0a86\u0a82\u0a97\u0ab3\u0ac0\u0a93\u0aa8\u0acb \u0a89\u0aaa\u0aaf\u0acb\u0a97 \u0a95\u0ab0\u0acb",
+            scroll: "\u0aa8\u0a95\u0ab6\u0abe\u0aa8\u0ac7 \u0a9d\u0ac2\u0aae \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 ctrl + \u0ab8\u0acd\u0a95\u0acd\u0ab0\u0acb\u0ab2\u0aa8\u0acb \u0a89\u0aaa\u0aaf\u0acb\u0a97 \u0a95\u0ab0\u0acb",
+            scrollMac: "\u0aa8\u0a95\u0ab6\u0abe\u0aa8\u0ac7 \u0a9d\u0ac2\u0aae \u0a95\u0ab0\u0ab5\u0abe \u2318 + \u0ab8\u0acd\u0a95\u0acd\u0ab0\u0acb\u0ab2\u0aa8\u0acb \u0a89\u0aaa\u0aaf\u0acb\u0a97 \u0a95\u0ab0\u0acb"
+        },
+        //Hindi
+        hi: {
+            touch: "\u092e\u0948\u092a \u090f\u0915 \u091c\u0917\u0939 \u0938\u0947 \u0926\u0942\u0938\u0930\u0940 \u091c\u0917\u0939 \u0932\u0947 \u091c\u093e\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0926\u094b \u0909\u0902\u0917\u0932\u093f\u092f\u094b\u0902 \u0915\u093e \u0907\u0938\u094d\u0924\u0947\u092e\u093e\u0932 \u0915\u0930\u0947\u0902",
+            scroll: "\u092e\u0948\u092a \u0915\u094b \u091c\u093c\u0942\u092e \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f ctrl + \u0938\u094d\u0915\u094d\u0930\u094b\u0932 \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0947\u0902",
+            scrollMac: "\u092e\u0948\u092a \u0915\u094b \u091c\u093c\u0942\u092e \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u2318 + \u0938\u094d\u0915\u094d\u0930\u094b\u0932 \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0947\u0902"
+        },
+        //Croatian
+        hr: {
+            touch: "Pomi\u010dite kartu pomo\u0107u dva prsta",
+            scroll: "Upotrijebite Ctrl i kliza\u010d mi\u0161a da biste zumirali kartu",
+            scrollMac: "Upotrijebite gumb \u2318 dok se pomi\u010dete za zumiranje karte"
+        },
+        //Hungarian
+        hu: {
+            touch: "K\u00e9t ujjal mozgassa a t\u00e9rk\u00e9pet",
+            scroll: "A t\u00e9rk\u00e9p a ctrl + g\u00f6rget\u00e9s haszn\u00e1lat\u00e1val nagy\u00edthat\u00f3",
+            scrollMac: "A t\u00e9rk\u00e9p a \u2318 + g\u00f6rget\u00e9s haszn\u00e1lat\u00e1val nagy\u00edthat\u00f3"
+        },
+        //Indonesian
+        id: {
+            touch: "Gunakan dua jari untuk menggerakkan peta",
+            scroll: "Gunakan ctrl + scroll untuk memperbesar atau memperkecil peta",
+            scrollMac: "Gunakan \u2318 + scroll untuk memperbesar atau memperkecil peta"
+        },
+        //Italian
+        it: {
+            touch: "Utilizza due dita per spostare la mappa",
+            scroll: "Utilizza CTRL + scorrimento per eseguire lo zoom della mappa",
+            scrollMac: "Utilizza \u2318 + scorrimento per eseguire lo zoom della mappa"
+        },
+        //Hebrew
+        iw: {
+            touch: "\u05d4\u05d6\u05d6 \u05d0\u05ea \u05d4\u05de\u05e4\u05d4 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05e9\u05ea\u05d9 \u05d0\u05e6\u05d1\u05e2\u05d5\u05ea",
+            scroll: "\u200f\u05d0\u05e4\u05e9\u05e8 \u05dc\u05e9\u05e0\u05d5\u05ea \u05d0\u05ea \u05de\u05e8\u05d7\u05e7 \u05d4\u05ea\u05e6\u05d5\u05d2\u05d4 \u05d1\u05de\u05e4\u05d4 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05de\u05e7\u05e9 ctrl \u05d5\u05d2\u05dc\u05d9\u05dc\u05d4",
+            scrollMac: "\u05d0\u05e4\u05e9\u05e8 \u05dc\u05e9\u05e0\u05d5\u05ea \u05d0\u05ea \u05de\u05e8\u05d7\u05e7 \u05d4\u05ea\u05e6\u05d5\u05d2\u05d4 \u05d1\u05de\u05e4\u05d4 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05de\u05e7\u05e9 \u2318 \u05d5\u05d2\u05dc\u05d9\u05dc\u05d4"
+        },
+        //Japanese
+        ja: {
+            touch: "\u5730\u56f3\u3092\u79fb\u52d5\u3055\u305b\u308b\u306b\u306f\u6307 2 \u672c\u3067\u64cd\u4f5c\u3057\u307e\u3059",
+            scroll: "\u5730\u56f3\u3092\u30ba\u30fc\u30e0\u3059\u308b\u306b\u306f\u3001Ctrl \u30ad\u30fc\u3092\u62bc\u3057\u306a\u304c\u3089\u30b9\u30af\u30ed\u30fc\u30eb\u3057\u3066\u304f\u3060\u3055\u3044",
+            scrollMac: "\u5730\u56f3\u3092\u30ba\u30fc\u30e0\u3059\u308b\u306b\u306f\u3001\u2318 \u30ad\u30fc\u3092\u62bc\u3057\u306a\u304c\u3089\u30b9\u30af\u30ed\u30fc\u30eb\u3057\u3066\u304f\u3060\u3055\u3044"
+        },
+        //Kannada
+        kn: {
+            touch: "Use two fingers to move the map",
+            scroll: "Use Ctrl + scroll to zoom the map",
+            scrollMac: "Use ⌘ + scroll to zoom the map"
+        },
+        //Korean
+        ko: {
+            touch: "\uc9c0\ub3c4\ub97c \uc6c0\uc9c1\uc774\ub824\uba74 \ub450 \uc190\uac00\ub77d\uc744 \uc0ac\uc6a9\ud558\uc138\uc694.",
+            scroll: "\uc9c0\ub3c4\ub97c \ud655\ub300/\ucd95\uc18c\ud558\ub824\uba74 Ctrl\uc744 \ub204\ub978 \ucc44 \uc2a4\ud06c\ub864\ud558\uc138\uc694.",
+            scrollMac: "\uc9c0\ub3c4\ub97c \ud655\ub300\ud558\ub824\uba74 \u2318 + \uc2a4\ud06c\ub864 \uc0ac\uc6a9"
+        },
+        //Lithuanian
+        lt: {
+            touch: "Perkelkite \u017eem\u0117lap\u012f dviem pir\u0161tais",
+            scroll: "Slinkite nuspaud\u0119 klavi\u0161\u0105 \u201eCtrl\u201c, kad pakeistum\u0117te \u017eem\u0117lapio mastel\u012f",
+            scrollMac: "Paspauskite klavi\u0161\u0105 \u2318 ir slinkite, kad priartintum\u0117te \u017eem\u0117lap\u012f"
+        },
+        //Latvian
+        lv: {
+            touch: "Lai p\u0101rvietotu karti, b\u012bdiet to ar diviem pirkstiem",
+            scroll: "Kartes t\u0101lummai\u0146ai izmantojiet ctrl + ritin\u0101\u0161anu",
+            scrollMac: "Lai veiktu kartes t\u0101lummai\u0146u, izmantojiet \u2318 + ritin\u0101\u0161anu"
+        },
+        //Malayalam
+        ml: {
+            touch: "\u0d2e\u0d3e\u0d2a\u0d4d\u0d2a\u0d4d \u0d28\u0d40\u0d15\u0d4d\u0d15\u0d3e\u0d7b \u0d30\u0d23\u0d4d\u0d1f\u0d4d \u0d35\u0d3f\u0d30\u0d32\u0d41\u0d15\u0d7e \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
+            scroll: "\u0d15\u0d7a\u0d1f\u0d4d\u0d30\u0d4b\u0d7e + \u0d38\u0d4d\u200c\u0d15\u0d4d\u0d30\u0d4b\u0d7e \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u200c\u0d2e\u0d3e\u0d2a\u0d4d\u0d2a\u0d4d \u200c\u0d38\u0d42\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15",
+            scrollMac: "\u2318 + \u0d38\u0d4d\u200c\u0d15\u0d4d\u0d30\u0d4b\u0d7e \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u200c\u0d2e\u0d3e\u0d2a\u0d4d\u0d2a\u0d4d \u200c\u0d38\u0d42\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15"
+        },
+        //Marathi
+        mr: {
+            touch: "\u0928\u0915\u093e\u0936\u093e \u0939\u0932\u0935\u093f\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0926\u094b\u0928 \u092c\u094b\u091f\u0947 \u0935\u093e\u092a\u0930\u093e",
+            scroll: "\u0928\u0915\u093e\u0936\u093e \u091d\u0942\u092e \u0915\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 ctrl + scroll \u0935\u093e\u092a\u0930\u093e",
+            scrollMac: "\u0928\u0915\u093e\u0936\u093e\u0935\u0930 \u091d\u0942\u092e \u0915\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u2318 + \u0938\u094d\u0915\u094d\u0930\u094b\u0932 \u0935\u093e\u092a\u0930\u093e"
+        },
+        //Dutch
+        nl: {
+            touch: "Gebruik twee vingers om de kaart te verplaatsen",
+            scroll: "Gebruik Ctrl + scrollen om in- en uit te zoomen op de kaart",
+            scrollMac: "Gebruik \u2318 + scrollen om in en uit te zoomen op de kaart"
+        },
+        //Norwegian
+        no: {
+            touch: "Bruk to fingre for \u00e5 flytte kartet",
+            scroll: "Hold ctrl-tasten inne og rull for \u00e5 zoome p\u00e5 kartet",
+            scrollMac: "Hold inne \u2318-tasten og rull for \u00e5 zoome p\u00e5 kartet"
+        },
+        //Polish
+        pl: {
+            touch: "Przesu\u0144 map\u0119 dwoma palcami",
+            scroll: "Naci\u015bnij CTRL i przewi\u0144, by przybli\u017cy\u0107 map\u0119",
+            scrollMac: "Naci\u015bnij\u00a0\u2318 i przewi\u0144, by przybli\u017cy\u0107 map\u0119"
+        },
+        //Portuguese
+        pt: {
+            touch: "Use dois dedos para mover o mapa",
+            scroll: "Pressione Ctrl e role a tela simultaneamente para aplicar zoom no mapa",
+            scrollMac: "Use \u2318 e role a tela simultaneamente para aplicar zoom no mapa"
+        },
+        //Portuguese (Brazil)
+        "pt-BR": {
+            touch: "Use dois dedos para mover o mapa",
+            scroll: "Pressione Ctrl e role a tela simultaneamente para aplicar zoom no mapa",
+            scrollMac: "Use \u2318 e role a tela simultaneamente para aplicar zoom no mapa"
+        },
+        //Portuguese (Portugal
+        "pt-PT": {
+            touch: "Utilize dois dedos para mover o mapa",
+            scroll: "Utilizar ctrl + deslocar para aumentar/diminuir zoom do mapa",
+            scrollMac: "Utilize \u2318 + deslocar para aumentar/diminuir o zoom do mapa"
+        },
+        //Romanian
+        ro: {
+            touch: "Folosi\u021bi dou\u0103 degete pentru a deplasa harta",
+            scroll: "Ap\u0103sa\u021bi tasta ctrl \u0219i derula\u021bi simultan pentru a m\u0103ri harta",
+            scrollMac: "Folosi\u021bi \u2318 \u0219i derula\u021bi pentru a m\u0103ri/mic\u0219ora harta"
+        },
+        //Russian
+        ru: {
+            touch: "\u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0443, \u043f\u0440\u043e\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u043e \u043d\u0435\u0439 \u0434\u0432\u0443\u043c\u044f \u043f\u0430\u043b\u044c\u0446\u0430\u043c\u0438",
+            scroll: "\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431, \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0439\u0442\u0435 \u043a\u0430\u0440\u0442\u0443, \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0443 Ctrl.",
+            scrollMac: "\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u2318\u00a0+ \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430"
+        },
+        //Slovak
+        sk: {
+            touch: "Mapu m\u00f4\u017eete posun\u00fa\u0165 dvoma prstami",
+            scroll: "Ak chcete pribl\u00ed\u017ei\u0165 mapu, stla\u010dte kl\u00e1ves ctrl a\u00a0pos\u00favajte",
+            scrollMac: "Ak chcete pribl\u00ed\u017ei\u0165 mapu, stla\u010dte kl\u00e1ves \u2318 a\u00a0pos\u00favajte kolieskom my\u0161i"
+        },
+        //Slovenian
+        sl: {
+            touch: "Premaknite zemljevid z dvema prstoma",
+            scroll: "Zemljevid pove\u010date tako, da dr\u017eite tipko Ctrl in vrtite kolesce na mi\u0161ki",
+            scrollMac: "Uporabite \u2318 + funkcijo pomika, da pove\u010date ali pomanj\u0161ate zemljevid"
+        },
+        //Serbian
+        sr: {
+            touch: "\u041c\u0430\u043f\u0443 \u043f\u043e\u043c\u0435\u0440\u0430\u0458\u0442\u0435 \u043f\u043e\u043c\u043e\u045b\u0443 \u0434\u0432\u0430 \u043f\u0440\u0441\u0442\u0430",
+            scroll: "\u041f\u0440\u0438\u0442\u0438\u0441\u043d\u0438\u0442\u0435 ctrl \u0442\u0430\u0441\u0442\u0435\u0440 \u0434\u043e\u043a \u043f\u043e\u043c\u0435\u0440\u0430\u0442\u0435 \u0434\u0430 \u0431\u0438\u0441\u0442\u0435 \u0437\u0443\u043c\u0438\u0440\u0430\u043b\u0438 \u043c\u0430\u043f\u0443",
+            scrollMac: "\u041f\u0440\u0438\u0442\u0438\u0441\u043d\u0438\u0442\u0435 \u0442\u0430\u0441\u0442\u0435\u0440 \u2318 \u0434\u043e\u043a \u043f\u043e\u043c\u0435\u0440\u0430\u0442\u0435 \u0434\u0430 \u0431\u0438\u0441\u0442\u0435 \u0437\u0443\u043c\u0438\u0440\u0430\u043b\u0438 \u043c\u0430\u043f\u0443"
+        },
+        //Swedish
+        sv: {
+            touch: "Anv\u00e4nd tv\u00e5 fingrar f\u00f6r att flytta kartan",
+            scroll: "Anv\u00e4nd ctrl + rulla f\u00f6r att zooma kartan",
+            scrollMac: "Anv\u00e4nd \u2318 + rulla f\u00f6r att zooma p\u00e5 kartan"
+        },
+        //Tamil
+        ta: {
+            touch: "\u0bae\u0bc7\u0baa\u0bcd\u0baa\u0bc8 \u0ba8\u0b95\u0bb0\u0bcd\u0ba4\u0bcd\u0ba4 \u0b87\u0bb0\u0ba3\u0bcd\u0b9f\u0bc1 \u0bb5\u0bbf\u0bb0\u0bb2\u0bcd\u0b95\u0bb3\u0bc8\u0baa\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bb5\u0bc1\u0bae\u0bcd",
+            scroll: "\u0bae\u0bc7\u0baa\u0bcd\u0baa\u0bc8 \u0baa\u0bc6\u0bb0\u0bbf\u0ba4\u0bbe\u0b95\u0bcd\u0b95\u0bbf/\u0b9a\u0bbf\u0bb1\u0bbf\u0ba4\u0bbe\u0b95\u0bcd\u0b95\u0bbf\u0baa\u0bcd \u0baa\u0bbe\u0bb0\u0bcd\u0b95\u0bcd\u0b95, ctrl \u0baa\u0b9f\u0bcd\u0b9f\u0ba9\u0bc8\u0baa\u0bcd \u0baa\u0bbf\u0b9f\u0bbf\u0ba4\u0bcd\u0ba4\u0baa\u0b9f\u0bbf, \u0bae\u0bc7\u0bb2\u0bc7/\u0b95\u0bc0\u0bb4\u0bc7 \u0bb8\u0bcd\u0b95\u0bcd\u0bb0\u0bbe\u0bb2\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0baf\u0bb5\u0bc1\u0bae\u0bcd",
+            scrollMac: "\u0bae\u0bc7\u0baa\u0bcd\u0baa\u0bc8 \u0baa\u0bc6\u0bb0\u0bbf\u0ba4\u0bbe\u0b95\u0bcd\u0b95\u0bbf/\u0b9a\u0bbf\u0bb1\u0bbf\u0ba4\u0bbe\u0b95\u0bcd\u0b95\u0bbf\u0baa\u0bcd \u0baa\u0bbe\u0bb0\u0bcd\u0b95\u0bcd\u0b95, \u2318 \u0baa\u0b9f\u0bcd\u0b9f\u0ba9\u0bc8\u0baa\u0bcd \u0baa\u0bbf\u0b9f\u0bbf\u0ba4\u0bcd\u0ba4\u0baa\u0b9f\u0bbf, \u0bae\u0bc7\u0bb2\u0bc7/\u0b95\u0bc0\u0bb4\u0bc7 \u0bb8\u0bcd\u0b95\u0bcd\u0bb0\u0bbe\u0bb2\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0baf\u0bb5\u0bc1\u0bae\u0bcd"
+        },
+        //Telugu
+        te: {
+            touch: "\u0c2e\u0c4d\u0c2f\u0c3e\u0c2a\u0c4d\u200c\u0c28\u0c3f \u0c24\u0c30\u0c32\u0c3f\u0c02\u0c1a\u0c21\u0c02 \u0c15\u0c4b\u0c38\u0c02 \u0c30\u0c46\u0c02\u0c21\u0c41 \u0c35\u0c47\u0c33\u0c4d\u0c32\u0c28\u0c41 \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
+            scroll: "\u0c2e\u0c4d\u0c2f\u0c3e\u0c2a\u0c4d\u200c\u0c28\u0c3f \u0c1c\u0c42\u0c2e\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f ctrl \u0c2c\u0c1f\u0c28\u0c4d\u200c\u0c28\u0c41 \u0c28\u0c4a\u0c15\u0c4d\u0c15\u0c3f \u0c09\u0c02\u0c1a\u0c3f, \u0c38\u0c4d\u0c15\u0c4d\u0c30\u0c4b\u0c32\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
+            scrollMac: "\u0c2e\u0c4d\u0c2f\u0c3e\u0c2a\u0c4d \u0c1c\u0c42\u0c2e\u0c4d \u0c1a\u0c47\u0c2f\u0c3e\u0c32\u0c02\u0c1f\u0c47 \u2318 + \u0c38\u0c4d\u0c15\u0c4d\u0c30\u0c4b\u0c32\u0c4d \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
+        },
+        //Thai
+        th: {
+            touch: "\u0e43\u0e0a\u0e49 2 \u0e19\u0e34\u0e49\u0e27\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e25\u0e37\u0e48\u0e2d\u0e19\u0e41\u0e1c\u0e19\u0e17\u0e35\u0e48",
+            scroll: "\u0e01\u0e14 Ctrl \u0e04\u0e49\u0e32\u0e07\u0e44\u0e27\u0e49 \u0e41\u0e25\u0e49\u0e27\u0e40\u0e25\u0e37\u0e48\u0e2d\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e08\u0e2d\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e0b\u0e39\u0e21\u0e41\u0e1c\u0e19\u0e17\u0e35\u0e48",
+            scrollMac: "\u0e01\u0e14 \u2318 \u0e41\u0e25\u0e49\u0e27\u0e40\u0e25\u0e37\u0e48\u0e2d\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e08\u0e2d\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e0b\u0e39\u0e21\u0e41\u0e1c\u0e19\u0e17\u0e35\u0e48"
+        },
+        //Tagalog
+        tl: {
+            touch: "Gumamit ng dalawang daliri upang iusog ang mapa",
+            scroll: "Gamitin ang ctrl + scroll upang i-zoom ang mapa",
+            scrollMac: "Gamitin ang \u2318 + scroll upang i-zoom ang mapa"
+        },
+        //Turkish
+        tr: {
+            touch: "Haritada gezinmek i\u00e7in iki parma\u011f\u0131n\u0131z\u0131 kullan\u0131n",
+            scroll: "Haritay\u0131 yak\u0131nla\u015ft\u0131rmak i\u00e7in ctrl + kayd\u0131rma kombinasyonunu kullan\u0131n",
+            scrollMac: "Haritay\u0131 yak\u0131nla\u015ft\u0131rmak i\u00e7in \u2318 tu\u015funa bas\u0131p ekran\u0131 kayd\u0131r\u0131n"
+        },
+        //Ukrainian
+        uk: {
+            touch: "\u041f\u0435\u0440\u0435\u043c\u0456\u0449\u0443\u0439\u0442\u0435 \u043a\u0430\u0440\u0442\u0443 \u0434\u0432\u043e\u043c\u0430 \u043f\u0430\u043b\u044c\u0446\u044f\u043c\u0438",
+            scroll: "\u0429\u043e\u0431 \u0437\u043c\u0456\u043d\u044e\u0432\u0430\u0442\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043a\u0430\u0440\u0442\u0438, \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0443\u0439\u0442\u0435 \u043a\u043e\u043b\u0456\u0449\u0430\u0442\u043a\u043e \u043c\u0438\u0448\u0456, \u0443\u0442\u0440\u0438\u043c\u0443\u044e\u0447\u0438 \u043a\u043b\u0430\u0432\u0456\u0448\u0443 Ctrl",
+            scrollMac: "\u0429\u043e\u0431 \u0437\u043c\u0456\u043d\u0438\u0442\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043a\u0430\u0440\u0442\u0438, \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0439\u0442\u0435 \u2318 + \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0443\u0432\u0430\u043d\u043d\u044f"
+        },
+        //Vietnamese
+        vi: {
+            touch: "S\u1eed d\u1ee5ng hai ng\u00f3n tay \u0111\u1ec3 di chuy\u1ec3n b\u1ea3n \u0111\u1ed3",
+            scroll: "S\u1eed d\u1ee5ng ctrl + cu\u1ed9n \u0111\u1ec3 thu ph\u00f3ng b\u1ea3n \u0111\u1ed3",
+            scrollMac: "S\u1eed d\u1ee5ng \u2318 + cu\u1ed9n \u0111\u1ec3 thu ph\u00f3ng b\u1ea3n \u0111\u1ed3"
+        },
+        //Chinese (Simplified)
+        "zh-CN": {
+            touch: "\u4f7f\u7528\u53cc\u6307\u79fb\u52a8\u5730\u56fe",
+            scroll: "\u6309\u4f4f Ctrl \u5e76\u6eda\u52a8\u9f20\u6807\u6eda\u8f6e\u624d\u53ef\u7f29\u653e\u5730\u56fe",
+            scrollMac: "\u6309\u4f4f \u2318 \u5e76\u6eda\u52a8\u9f20\u6807\u6eda\u8f6e\u624d\u53ef\u7f29\u653e\u5730\u56fe"
+        },
+        //Chinese (Traditional)
+        "zh-TW": {
+            touch: "\u540c\u6642\u4ee5\u5169\u6307\u79fb\u52d5\u5730\u5716",
+            scroll: "\u6309\u4f4f ctrl \u9375\u52a0\u4e0a\u6372\u52d5\u6ed1\u9f20\u53ef\u4ee5\u7e2e\u653e\u5730\u5716",
+            scrollMac: "\u6309 \u2318 \u52a0\u4e0a\u6efe\u52d5\u6372\u8ef8\u53ef\u4ee5\u7e2e\u653e\u5730\u5716"
+        }
+    };
+
+    /*
+    * * Leaflet Gesture Handling **
+    * * Version 1.1.8
+    */
+
+    L.Map.mergeOptions({
+        gestureHandlingOptions: {
+            text: {},
+            duration: 1000
+        }
+    });
+
+    var draggingMap = false;
+
+    var GestureHandling = L.Handler.extend({
+        addHooks: function () {
+            this._handleTouch = this._handleTouch.bind(this);
+
+            this._setupPluginOptions();
+            this._setLanguageContent();
+            this._disableInteractions();
+
+            //Uses native event listeners instead of L.DomEvent due to issues with Android touch events
+            //turning into pointer events
+            this._map._container.addEventListener("touchstart", this._handleTouch);
+            this._map._container.addEventListener("touchmove", this._handleTouch);
+            this._map._container.addEventListener("touchend", this._handleTouch);
+            this._map._container.addEventListener("touchcancel", this._handleTouch);
+            this._map._container.addEventListener("click", this._handleTouch);
+
+            L.DomEvent.on(this._map._container, "wheel", this._handleScroll, this);
+            L.DomEvent.on(this._map, "mouseover", this._handleMouseOver, this);
+            L.DomEvent.on(this._map, "mouseout", this._handleMouseOut, this);
+
+            // Listen to these events so will not disable dragging if the user moves the mouse out the boundary of the map container whilst actively dragging the map.
+            L.DomEvent.on(this._map, "movestart", this._handleDragging, this);
+            L.DomEvent.on(this._map, "move", this._handleDragging, this);
+            L.DomEvent.on(this._map, "moveend", this._handleDragging, this);
+        },
+
+        removeHooks: function () {
+            this._enableInteractions();
+
+            this._map._container.removeEventListener("touchstart", this._handleTouch);
+            this._map._container.removeEventListener("touchmove", this._handleTouch);
+            this._map._container.removeEventListener("touchend", this._handleTouch);
+            this._map._container.removeEventListener("touchcancel", this._handleTouch);
+            this._map._container.removeEventListener("click", this._handleTouch);
+
+            L.DomEvent.off(this._map._container, "wheel", this._handleScroll, this);
+            L.DomEvent.off(this._map, "mouseover", this._handleMouseOver, this);
+            L.DomEvent.off(this._map, "mouseout", this._handleMouseOut, this);
+
+            L.DomEvent.off(this._map, "movestart", this._handleDragging, this);
+            L.DomEvent.off(this._map, "move", this._handleDragging, this);
+            L.DomEvent.off(this._map, "moveend", this._handleDragging, this);
+        },
+
+        _handleDragging: function (e) {
+            if (e.type == "movestart" || e.type == "move") {
+                draggingMap = true;
+            } else if (e.type == "moveend") {
+                draggingMap = false;
+            }
+        },
+
+        _disableInteractions: function () {
+            this._map.dragging.disable();
+            this._map.scrollWheelZoom.disable();
+            if (this._map.tap) {
+                this._map.tap.disable();
+            }
+        },
+
+        _enableInteractions: function () {
+            this._map.dragging.enable();
+            this._map.scrollWheelZoom.enable();
+            if (this._map.tap) {
+                this._map.tap.enable();
+            }
+        },
+
+        _setupPluginOptions: function () {
+            //For backwards compatibility, merge gestureHandlingText into the new options object
+            if (this._map.options.gestureHandlingText) {
+                this._map.options.gestureHandlingOptions.text = this._map.options.gestureHandlingText;
+            }
+        },
+
+        _setLanguageContent: function () {
+            var languageContent;
+            //If user has supplied custom language, use that
+            if (this._map.options.gestureHandlingOptions && this._map.options.gestureHandlingOptions.text && this._map.options.gestureHandlingOptions.text.touch && this._map.options.gestureHandlingOptions.text.scroll && this._map.options.gestureHandlingOptions.text.scrollMac) {
+                languageContent = this._map.options.gestureHandlingOptions.text;
+            } else {
+                //Otherwise auto set it from the language files
+
+                //Determine their language e.g fr or en-US
+                var lang = this._getUserLanguage();
+
+                //If we couldn't find it default to en
+                if (!lang) {
+                    lang = "en";
+                }
+
+                //Lookup the appropriate language content
+                if (LanguageContent[lang]) {
+                    languageContent = LanguageContent[lang];
+                }
+
+                //If no result, try searching by the first part only. e.g en-US just use en.
+                if (!languageContent && lang.indexOf("-") !== -1) {
+                    lang = lang.split("-")[0];
+                    languageContent = LanguageContent[lang];
+                }
+
+                if (!languageContent) {
+                    // If still nothing, default to English
+                    // console.log("No lang found for", lang);
+                    lang = "en";
+                    languageContent = LanguageContent[lang];
+                }
+            }
+
+            //TEST
+            // languageContent = LanguageContent["bg"];
+
+            //Check if they're on a mac for display of command instead of ctrl
+            var mac = false;
+            if (navigator.platform.toUpperCase().indexOf("MAC") >= 0) {
+                mac = true;
+            }
+
+            var scrollContent = languageContent.scroll;
+            if (mac) {
+                scrollContent = languageContent.scrollMac;
+            }
+
+            this._map._container.setAttribute("data-gesture-handling-touch-content", languageContent.touch);
+            this._map._container.setAttribute("data-gesture-handling-scroll-content", scrollContent);
+        },
+
+        _getUserLanguage: function () {
+            var lang = navigator.languages ? navigator.languages[0] : navigator.language || navigator.userLanguage;
+            return lang;
+        },
+
+        _handleTouch: function (e) {
+            //Disregard touch events on the minimap if present
+            var ignoreList = ["leaflet-control-minimap", "leaflet-interactive", "leaflet-popup-content", "leaflet-popup-content-wrapper", "leaflet-popup-close-button", "leaflet-control-zoom-in", "leaflet-control-zoom-out"];
+
+            var ignoreElement = false;
+            for (var i = 0; i < ignoreList.length; i++) {
+                if (L.DomUtil.hasClass(e.target, ignoreList[i])) {
+                    ignoreElement = true;
+                }
+            }
+
+            if (ignoreElement) {
+                if (L.DomUtil.hasClass(e.target, "leaflet-interactive") && e.type === "touchmove" && e.touches.length === 1) {
+                    L.DomUtil.addClass(this._map._container, "leaflet-gesture-handling-touch-warning");
+                    this._disableInteractions();
+                } else {
+                    L.DomUtil.removeClass(this._map._container, "leaflet-gesture-handling-touch-warning");
+                }
+                return;
+            }
+            // screenLog(e.type+' '+e.touches.length);
+            if (e.type !== "touchmove" && e.type !== "touchstart") {
+                L.DomUtil.removeClass(this._map._container, "leaflet-gesture-handling-touch-warning");
+                return;
+            }
+            if (e.touches.length === 1) {
+                L.DomUtil.addClass(this._map._container, "leaflet-gesture-handling-touch-warning");
+                this._disableInteractions();
+            } else {
+                this._enableInteractions();
+                L.DomUtil.removeClass(this._map._container, "leaflet-gesture-handling-touch-warning");
+            }
+        },
+
+        _isScrolling: false,
+
+        _handleScroll: function (e) {
+            if (e.metaKey || e.ctrlKey) {
+                e.preventDefault();
+                L.DomUtil.removeClass(this._map._container, "leaflet-gesture-handling-scroll-warning");
+                this._map.scrollWheelZoom.enable();
+            } else {
+                L.DomUtil.addClass(this._map._container, "leaflet-gesture-handling-scroll-warning");
+                this._map.scrollWheelZoom.disable();
+
+                clearTimeout(this._isScrolling);
+
+                // Set a timeout to run after scrolling ends
+                this._isScrolling = setTimeout(function () {
+                    // Run the callback
+                    var warnings = document.getElementsByClassName("leaflet-gesture-handling-scroll-warning");
+                    for (var i = 0; i < warnings.length; i++) {
+                        L.DomUtil.removeClass(warnings[i], "leaflet-gesture-handling-scroll-warning");
+                    }
+                }, this._map.options.gestureHandlingOptions.duration);
+            }
+        },
+
+        _handleMouseOver: function (e) {
+            this._enableInteractions();
+        },
+
+        _handleMouseOut: function (e) {
+            if (!draggingMap) {
+                this._disableInteractions();
+            }
+        }
+
+    });
+
+    L.Map.addInitHook("addHandler", "gestureHandling", GestureHandling);
+
+    exports.GestureHandling = GestureHandling;
+    exports.default = GestureHandling;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-gesture-handling-1.2.1.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+!function(a,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define("leafletGestureHandling",["exports"],t):t(a.leafletGestureHandling={})}(this,(function(a){"use strict";var t={ar:{touch:"استخدم إصبعين لتحريك الخريطة",scroll:"‏استخدم ctrl + scroll لتصغير/تكبير الخريطة",scrollMac:"يمكنك استخدام ⌘ + التمرير لتكبير/تصغير الخريطة"},bg:{touch:"Използвайте два пръста, за да преместите картата",scroll:"Задръжте бутона Ctrl натиснат, докато превъртате, за да промените мащаба на картата",scrollMac:"Задръжте бутона ⌘ натиснат, докато превъртате, за да промените мащаба на картата"},bn:{touch:"মানচিত্রটিকে সরাতে দুটি আঙ্গুল ব্যবহার করুন",scroll:"ম্যাপ জুম করতে ctrl + scroll ব্যবহার করুন",scrollMac:"ম্যাপে জুম করতে ⌘ বোতাম টিপে স্ক্রল করুন"},ca:{touch:"Fes servir dos dits per moure el mapa",scroll:"Prem la tecla Control mentre et desplaces per apropar i allunyar el mapa",scrollMac:"Prem la tecla ⌘ mentre et desplaces per apropar i allunyar el mapa"},cs:{touch:"K posunutí mapy použijte dva prsty",scroll:"Velikost zobrazení mapy změňte podržením klávesy Ctrl a posouváním kolečka myši",scrollMac:"Velikost zobrazení mapy změníte podržením klávesy ⌘ a posunutím kolečka myši / touchpadu"},da:{touch:"Brug to fingre til at flytte kortet",scroll:"Brug ctrl + rullefunktionen til at zoome ind og ud på kortet",scrollMac:"Brug ⌘ + rullefunktionen til at zoome ind og ud på kortet"},de:{touch:"Verschieben der Karte mit zwei Fingern",scroll:"Verwende Strg+Scrollen zum Zoomen der Karte",scrollMac:"⌘"},el:{touch:"Χρησιμοποιήστε δύο δάχτυλα για μετακίνηση στον χάρτη",scroll:"Χρησιμοποιήστε το πλήκτρο Ctrl και κύλιση, για να μεγεθύνετε τον χάρτη",scrollMac:"Χρησιμοποιήστε το πλήκτρο ⌘ + κύλιση για εστίαση στον χάρτη"},en:{touch:"Use two fingers to move the map",scroll:"Use ctrl + scroll to zoom the map",scrollMac:"Use ⌘ + scroll to zoom the map"},"en-AU":{touch:"Use two fingers to move the map",scroll:"Use ctrl + scroll to zoom the map",scrollMac:"Use ⌘ + scroll to zoom the map"},"en-GB":{touch:"Use two fingers to move the map",scroll:"Use ctrl + scroll to zoom the map",scrollMac:"Use ⌘ + scroll to zoom the map"},es:{touch:"Para mover el mapa, utiliza dos dedos",scroll:"Mantén pulsada la tecla Ctrl mientras te desplazas para acercar o alejar el mapa",scrollMac:"Mantén pulsada la tecla ⌘ mientras te desplazas para acercar o alejar el mapa"},eu:{touch:"Erabili bi hatz mapa mugitzeko",scroll:"Mapan zooma aplikatzeko, sakatu Ktrl eta egin gora edo behera",scrollMac:"Eduki sakatuta ⌘ eta egin gora eta behera mapa handitu eta txikitzeko"},fa:{touch:"برای حرکت دادن نقشه از دو انگشت استفاده کنید.",scroll:"‏برای بزرگ‌نمایی نقشه از ctrl + scroll استفاده کنید",scrollMac:"برای بزرگ‌نمایی نقشه، از ⌘ + پیمایش استفاده کنید."},fi:{touch:"Siirrä karttaa kahdella sormella.",scroll:"Zoomaa karttaa painamalla Ctrl-painiketta ja vierittämällä.",scrollMac:"Zoomaa karttaa pitämällä painike ⌘ painettuna ja vierittämällä."},fil:{touch:"Gumamit ng dalawang daliri upang iusog ang mapa",scroll:"Gamitin ang ctrl + scroll upang i-zoom ang mapa",scrollMac:"Gamitin ang ⌘ + scroll upang i-zoom ang mapa"},fr:{touch:"Utilisez deux doigts pour déplacer la carte",scroll:"Vous pouvez zoomer sur la carte à l'aide de CTRL+Molette de défilement",scrollMac:"Vous pouvez zoomer sur la carte à l'aide de ⌘+Molette de défilement"},gl:{touch:"Utiliza dous dedos para mover o mapa",scroll:"Preme Ctrl mentres te desprazas para ampliar o mapa",scrollMac:"Preme ⌘ e desprázate para ampliar o mapa"},gu:{touch:"નકશો ખસેડવા બે આંગળીઓનો ઉપયોગ કરો",scroll:"નકશાને ઝૂમ કરવા માટે ctrl + સ્ક્રોલનો ઉપયોગ કરો",scrollMac:"નકશાને ઝૂમ કરવા ⌘ + સ્ક્રોલનો ઉપયોગ કરો"},hi:{touch:"मैप एक जगह से दूसरी जगह ले जाने के लिए दो उंगलियों का इस्तेमाल करें",scroll:"मैप को ज़ूम करने के लिए ctrl + स्क्रोल का उपयोग करें",scrollMac:"मैप को ज़ूम करने के लिए ⌘ + स्क्रोल का उपयोग करें"},hr:{touch:"Pomičite kartu pomoću dva prsta",scroll:"Upotrijebite Ctrl i klizač miša da biste zumirali kartu",scrollMac:"Upotrijebite gumb ⌘ dok se pomičete za zumiranje karte"},hu:{touch:"Két ujjal mozgassa a térképet",scroll:"A térkép a ctrl + görgetés használatával nagyítható",scrollMac:"A térkép a ⌘ + görgetés használatával nagyítható"},id:{touch:"Gunakan dua jari untuk menggerakkan peta",scroll:"Gunakan ctrl + scroll untuk memperbesar atau memperkecil peta",scrollMac:"Gunakan ⌘ + scroll untuk memperbesar atau memperkecil peta"},it:{touch:"Utilizza due dita per spostare la mappa",scroll:"Utilizza CTRL + scorrimento per eseguire lo zoom della mappa",scrollMac:"Utilizza ⌘ + scorrimento per eseguire lo zoom della mappa"},iw:{touch:"הזז את המפה באמצעות שתי אצבעות",scroll:"‏אפשר לשנות את מרחק התצוגה במפה באמצעות מקש ctrl וגלילה",scrollMac:"אפשר לשנות את מרחק התצוגה במפה באמצעות מקש ⌘ וגלילה"},ja:{touch:"地図を移動させるには指 2 本で操作します",scroll:"地図をズームするには、Ctrl キーを押しながらスクロールしてください",scrollMac:"地図をズームするには、⌘ キーを押しながらスクロールしてください"},kn:{touch:"Use two fingers to move the map",scroll:"Use Ctrl + scroll to zoom the map",scrollMac:"Use ⌘ + scroll to zoom the map"},ko:{touch:"지도를 움직이려면 두 손가락을 사용하세요.",scroll:"지도를 확대/축소하려면 Ctrl을 누른 채 스크롤하세요.",scrollMac:"지도를 확대하려면 ⌘ + 스크롤 사용"},lt:{touch:"Perkelkite žemėlapį dviem pirštais",scroll:"Slinkite nuspaudę klavišą „Ctrl“, kad pakeistumėte žemėlapio mastelį",scrollMac:"Paspauskite klavišą ⌘ ir slinkite, kad priartintumėte žemėlapį"},lv:{touch:"Lai pārvietotu karti, bīdiet to ar diviem pirkstiem",scroll:"Kartes tālummaiņai izmantojiet ctrl + ritināšanu",scrollMac:"Lai veiktu kartes tālummaiņu, izmantojiet ⌘ + ritināšanu"},ml:{touch:"മാപ്പ് നീക്കാൻ രണ്ട് വിരലുകൾ ഉപയോഗിക്കുക",scroll:"കൺട്രോൾ + സ്‌ക്രോൾ ഉപയോഗിച്ച് ‌മാപ്പ് ‌സൂം ചെയ്യുക",scrollMac:"⌘ + സ്‌ക്രോൾ ഉപയോഗിച്ച് ‌മാപ്പ് ‌സൂം ചെയ്യുക"},mr:{touch:"नकाशा हलविण्यासाठी दोन बोटे वापरा",scroll:"नकाशा झूम करण्यासाठी ctrl + scroll वापरा",scrollMac:"नकाशावर झूम करण्यासाठी ⌘ + स्क्रोल वापरा"},nl:{touch:"Gebruik twee vingers om de kaart te verplaatsen",scroll:"Gebruik Ctrl + scrollen om in- en uit te zoomen op de kaart",scrollMac:"Gebruik ⌘ + scrollen om in en uit te zoomen op de kaart"},no:{touch:"Bruk to fingre for å flytte kartet",scroll:"Hold ctrl-tasten inne og rull for å zoome på kartet",scrollMac:"Hold inne ⌘-tasten og rull for å zoome på kartet"},pl:{touch:"Przesuń mapę dwoma palcami",scroll:"Naciśnij CTRL i przewiń, by przybliżyć mapę",scrollMac:"Naciśnij ⌘ i przewiń, by przybliżyć mapę"},pt:{touch:"Use dois dedos para mover o mapa",scroll:"Pressione Ctrl e role a tela simultaneamente para aplicar zoom no mapa",scrollMac:"Use ⌘ e role a tela simultaneamente para aplicar zoom no mapa"},"pt-BR":{touch:"Use dois dedos para mover o mapa",scroll:"Pressione Ctrl e role a tela simultaneamente para aplicar zoom no mapa",scrollMac:"Use ⌘ e role a tela simultaneamente para aplicar zoom no mapa"},"pt-PT":{touch:"Utilize dois dedos para mover o mapa",scroll:"Utilizar ctrl + deslocar para aumentar/diminuir zoom do mapa",scrollMac:"Utilize ⌘ + deslocar para aumentar/diminuir o zoom do mapa"},ro:{touch:"Folosiți două degete pentru a deplasa harta",scroll:"Apăsați tasta ctrl și derulați simultan pentru a mări harta",scrollMac:"Folosiți ⌘ și derulați pentru a mări/micșora harta"},ru:{touch:"Чтобы переместить карту, проведите по ней двумя пальцами",scroll:"Чтобы изменить масштаб, прокручивайте карту, удерживая клавишу Ctrl.",scrollMac:"Чтобы изменить масштаб, нажмите ⌘ + прокрутка"},sk:{touch:"Mapu môžete posunúť dvoma prstami",scroll:"Ak chcete priblížiť mapu, stlačte kláves ctrl a posúvajte",scrollMac:"Ak chcete priblížiť mapu, stlačte kláves ⌘ a posúvajte kolieskom myši"},sl:{touch:"Premaknite zemljevid z dvema prstoma",scroll:"Zemljevid povečate tako, da držite tipko Ctrl in vrtite kolesce na miški",scrollMac:"Uporabite ⌘ + funkcijo pomika, da povečate ali pomanjšate zemljevid"},sr:{touch:"Мапу померајте помоћу два прста",scroll:"Притисните ctrl тастер док померате да бисте зумирали мапу",scrollMac:"Притисните тастер ⌘ док померате да бисте зумирали мапу"},sv:{touch:"Använd två fingrar för att flytta kartan",scroll:"Använd ctrl + rulla för att zooma kartan",scrollMac:"Använd ⌘ + rulla för att zooma på kartan"},ta:{touch:"மேப்பை நகர்த்த இரண்டு விரல்களைப் பயன்படுத்தவும்",scroll:"மேப்பை பெரிதாக்கி/சிறிதாக்கிப் பார்க்க, ctrl பட்டனைப் பிடித்தபடி, மேலே/கீழே ஸ்க்ரால் செய்யவும்",scrollMac:"மேப்பை பெரிதாக்கி/சிறிதாக்கிப் பார்க்க, ⌘ பட்டனைப் பிடித்தபடி, மேலே/கீழே ஸ்க்ரால் செய்யவும்"},te:{touch:"మ్యాప్‌ని తరలించడం కోసం రెండు వేళ్లను ఉపయోగించండి",scroll:"మ్యాప్‌ని జూమ్ చేయడానికి ctrl బటన్‌ను నొక్కి ఉంచి, స్క్రోల్ చేయండి",scrollMac:"మ్యాప్ జూమ్ చేయాలంటే ⌘ + స్క్రోల్ ఉపయోగించండి"},th:{touch:"ใช้ 2 นิ้วเพื่อเลื่อนแผนที่",scroll:"กด Ctrl ค้างไว้ แล้วเลื่อนหน้าจอเพื่อซูมแผนที่",scrollMac:"กด ⌘ แล้วเลื่อนหน้าจอเพื่อซูมแผนที่"},tl:{touch:"Gumamit ng dalawang daliri upang iusog ang mapa",scroll:"Gamitin ang ctrl + scroll upang i-zoom ang mapa",scrollMac:"Gamitin ang ⌘ + scroll upang i-zoom ang mapa"},tr:{touch:"Haritada gezinmek için iki parmağınızı kullanın",scroll:"Haritayı yakınlaştırmak için ctrl + kaydırma kombinasyonunu kullanın",scrollMac:"Haritayı yakınlaştırmak için ⌘ tuşuna basıp ekranı kaydırın"},uk:{touch:"Переміщуйте карту двома пальцями",scroll:"Щоб змінювати масштаб карти, прокручуйте коліщатко миші, утримуючи клавішу Ctrl",scrollMac:"Щоб змінити масштаб карти, використовуйте ⌘ + прокручування"},vi:{touch:"Sử dụng hai ngón tay để di chuyển bản đồ",scroll:"Sử dụng ctrl + cuộn để thu phóng bản đồ",scrollMac:"Sử dụng ⌘ + cuộn để thu phóng bản đồ"},"zh-CN":{touch:"使用双指移动地图",scroll:"按住 Ctrl 并滚动鼠标滚轮才可缩放地图",scrollMac:"按住 ⌘ 并滚动鼠标滚轮才可缩放地图"},"zh-TW":{touch:"同時以兩指移動地圖",scroll:"按住 ctrl 鍵加上捲動滑鼠可以縮放地圖",scrollMac:"按 ⌘ 加上滾動捲軸可以縮放地圖"}};L.Map.mergeOptions({gestureHandlingOptions:{text:{},duration:1e3}});var e=!1,l=L.Handler.extend({addHooks:function(){this._handleTouch=this._handleTouch.bind(this),this._setupPluginOptions(),this._setLanguageContent(),this._disableInteractions(),this._map._container.addEventListener("touchstart",this._handleTouch),this._map._container.addEventListener("touchmove",this._handleTouch),this._map._container.addEventListener("touchend",this._handleTouch),this._map._container.addEventListener("touchcancel",this._handleTouch),this._map._container.addEventListener("click",this._handleTouch),L.DomEvent.on(this._map._container,"wheel",this._handleScroll,this),L.DomEvent.on(this._map,"mouseover",this._handleMouseOver,this),L.DomEvent.on(this._map,"mouseout",this._handleMouseOut,this),L.DomEvent.on(this._map,"movestart",this._handleDragging,this),L.DomEvent.on(this._map,"move",this._handleDragging,this),L.DomEvent.on(this._map,"moveend",this._handleDragging,this)},removeHooks:function(){this._enableInteractions(),this._map._container.removeEventListener("touchstart",this._handleTouch),this._map._container.removeEventListener("touchmove",this._handleTouch),this._map._container.removeEventListener("touchend",this._handleTouch),this._map._container.removeEventListener("touchcancel",this._handleTouch),this._map._container.removeEventListener("click",this._handleTouch),L.DomEvent.off(this._map._container,"wheel",this._handleScroll,this),L.DomEvent.off(this._map,"mouseover",this._handleMouseOver,this),L.DomEvent.off(this._map,"mouseout",this._handleMouseOut,this),L.DomEvent.off(this._map,"movestart",this._handleDragging,this),L.DomEvent.off(this._map,"move",this._handleDragging,this),L.DomEvent.off(this._map,"moveend",this._handleDragging,this)},_handleDragging:function(a){"movestart"==a.type||"move"==a.type?e=!0:"moveend"==a.type&&(e=!1)},_disableInteractions:function(){this._map.dragging.disable(),this._map.scrollWheelZoom.disable(),this._map.tap&&this._map.tap.disable()},_enableInteractions:function(){this._map.dragging.enable(),this._map.scrollWheelZoom.enable(),this._map.tap&&this._map.tap.enable()},_setupPluginOptions:function(){this._map.options.gestureHandlingText&&(this._map.options.gestureHandlingOptions.text=this._map.options.gestureHandlingText)},_setLanguageContent:function(){var a;if(this._map.options.gestureHandlingOptions&&this._map.options.gestureHandlingOptions.text&&this._map.options.gestureHandlingOptions.text.touch&&this._map.options.gestureHandlingOptions.text.scroll&&this._map.options.gestureHandlingOptions.text.scrollMac)a=this._map.options.gestureHandlingOptions.text;else{var e=this._getUserLanguage();e||(e="en"),t[e]&&(a=t[e]),a||-1===e.indexOf("-")||(e=e.split("-")[0],a=t[e]),a||(a=t[e="en"])}var l=!1;navigator.platform.toUpperCase().indexOf("MAC")>=0&&(l=!0);var o=a.scroll;l&&(o=a.scrollMac),this._map._container.setAttribute("data-gesture-handling-touch-content",a.touch),this._map._container.setAttribute("data-gesture-handling-scroll-content",o)},_getUserLanguage:function(){return navigator.languages?navigator.languages[0]:navigator.language||navigator.userLanguage},_handleTouch:function(a){for(var t=["leaflet-control-minimap","leaflet-interactive","leaflet-popup-content","leaflet-popup-content-wrapper","leaflet-popup-close-button","leaflet-control-zoom-in","leaflet-control-zoom-out"],e=!1,l=0;l<t.length;l++)L.DomUtil.hasClass(a.target,t[l])&&(e=!0);e?L.DomUtil.hasClass(a.target,"leaflet-interactive")&&"touchmove"===a.type&&1===a.touches.length?(L.DomUtil.addClass(this._map._container,"leaflet-gesture-handling-touch-warning"),this._disableInteractions()):L.DomUtil.removeClass(this._map._container,"leaflet-gesture-handling-touch-warning"):"touchmove"===a.type||"touchstart"===a.type?1===a.touches.length?(L.DomUtil.addClass(this._map._container,"leaflet-gesture-handling-touch-warning"),this._disableInteractions()):(this._enableInteractions(),L.DomUtil.removeClass(this._map._container,"leaflet-gesture-handling-touch-warning")):L.DomUtil.removeClass(this._map._container,"leaflet-gesture-handling-touch-warning")},_isScrolling:!1,_handleScroll:function(a){a.metaKey||a.ctrlKey?(a.preventDefault(),L.DomUtil.removeClass(this._map._container,"leaflet-gesture-handling-scroll-warning"),this._map.scrollWheelZoom.enable()):(L.DomUtil.addClass(this._map._container,"leaflet-gesture-handling-scroll-warning"),this._map.scrollWheelZoom.disable(),clearTimeout(this._isScrolling),this._isScrolling=setTimeout((function(){for(var a=document.getElementsByClassName("leaflet-gesture-handling-scroll-warning"),t=0;t<a.length;t++)L.DomUtil.removeClass(a[t],"leaflet-gesture-handling-scroll-warning")}),this._map.options.gestureHandlingOptions.duration))},_handleMouseOver:function(a){this._enableInteractions()},_handleMouseOut:function(a){e||this._disableInteractions()}});L.Map.addInitHook("addHandler","gestureHandling",l),a.GestureHandling=l,a.default=l,Object.defineProperty(a,"__esModule",{value:!0})}));
--- a/src/pyams_gis/resources/js/leaflet-google-mutant.js	Wed Jan 27 15:38:26 2021 +0100
+++ b/src/pyams_gis/resources/js/leaflet-google-mutant.js	Wed Jan 27 15:39:14 2021 +0100
@@ -1,166 +1,208 @@
+// GoogleMutant by Iván Sánchez Ortega <ivan@sanchezortega.es>
+
 // Based on https://github.com/shramov/leaflet-plugins
 // GridLayer like https://avinmathew.com/leaflet-and-google-maps/ , but using MutationObserver instead of jQuery
 
+/*
+"THE BEER-WARE LICENSE":
+<ivan@sanchezortega.es> wrote this file. As long as you retain this notice you
+can do whatever you want with this stuff. If we meet some day, and you think
+this stuff is worth it, you can buy me a beer in return.
+*/
+
+import { LRUMap } from "./lru_map.js";
+
+const GAPIPromise = new Promise(function (resolve, reject) {
+	let checkCounter = 0,
+		intervalId = null;
+
+	intervalId = setInterval(function () {
+		if (checkCounter >= 20) {
+			clearInterval(intervalId);
+			return reject(new Error("window.google not found after 10 seconds"));
+		}
+		if (!!window.google && !!window.google.maps && !!window.google.maps.Map) {
+			clearInterval(intervalId);
+			return resolve(window.google);
+		}
+		++checkCounter;
+	}, 500);
+});
 
 // 🍂class GridLayer.GoogleMutant
 // 🍂extends GridLayer
 L.GridLayer.GoogleMutant = L.GridLayer.extend({
-	includes: L.Mixin.Events,
-
 	options: {
 		minZoom: 0,
-		maxZoom: 18,
+		maxZoom: 21, // can be 23, but ugly if more than maxNativeZoom
 		tileSize: 256,
-		subdomains: 'abc',
-		errorTileUrl: '',
-		attribution: '',	// The mutant container will add its own attribution anyways.
+		subdomains: "abc",
+		errorTileUrl: "",
+		attribution: "", // The mutant container will add its own attribution anyways.
 		opacity: 1,
 		continuousWorld: false,
 		noWrap: false,
 		// 🍂option type: String = 'roadmap'
 		// Google's map type. Valid values are 'roadmap', 'satellite' or 'terrain'. 'hybrid' is not really supported.
-		type: 'roadmap',
-		maxNativeZoom: 21
+		type: "roadmap",
+		maxNativeZoom: 21,
 	},
 
 	initialize: function (options) {
 		L.GridLayer.prototype.initialize.call(this, options);
 
-		this._ready = !!window.google && !!window.google.maps && !!window.google.maps.Map;
+		this._isMounted = true;
 
-		this._GAPIPromise = this._ready ? Promise.resolve(window.google) : new Promise(function (resolve, reject) {
-			var checkCounter = 0;
-			var intervalId = null;
-			intervalId = setInterval(function () {
-				if (checkCounter >= 10) {
-					clearInterval(intervalId);
-					return reject(new Error('window.google not found after 10 attempts'));
+		this.once("spawned", function () {
+			if (this._subLayers) {
+				//restore previously added google layers
+				for (var layerName in this._subLayers) {
+					this._subLayers[layerName].setMap(this._mutant);
 				}
-				if (!!window.google && !!window.google.maps && !!window.google.maps.Map) {
-					clearInterval(intervalId);
-					return resolve(window.google);
-				}
-				checkCounter++;
-			}, 500);
+			}
 		});
 
 		// Couple data structures indexed by tile key
-		this._tileCallbacks = {};	// Callbacks for promises for tiles that are expected
-		this._freshTiles = {};	// Tiles from the mutant which haven't been requested yet
+		this._tileCallbacks = {}; // Callbacks for promises for tiles that are expected
+		this._lru = new LRUMap(100); // Tile LRU cache
 
-		this._imagesPerTile = (this.options.type === 'hybrid') ? 2 : 1;
+		this._imagesPerTile = this.options.type === "hybrid" ? 2 : 1;
+
+		this._boundOnMutatedImage = this._onMutatedImage.bind(this);
 	},
 
 	onAdd: function (map) {
 		L.GridLayer.prototype.onAdd.call(this, map);
 		this._initMutantContainer();
 
-		this._GAPIPromise.then(function () {
+		// Attribution and logo nodes are not mutated a second time if the
+		// mutant is removed and re-added to the map, hence they are
+		// not cleaned up on layer removal, so they can be added here.
+		if (this._logoContainer) {
+			map._controlCorners.bottomleft.appendChild(this._logoContainer);
+		}
+		if (this._attributionContainer) {
+			map._controlCorners.bottomright.appendChild(this._attributionContainer);
+		}
+
+		GAPIPromise.then(() => {
+			if (!this._isMounted) {
+				return;
+			}
 			this._ready = true;
-			this._map = map;
 
 			this._initMutant();
 
-			map.on('viewreset', this._reset, this);
-			map.on('move', this._update, this);
-			map.on('zoomend', this._handleZoomAnim, this);
-			map.on('resize', this._resize, this);
-
+			map = this._map;
+			if (!map) {
+				return;
+			}
+			var moveevent = this.options.updateWhenIdle ? "moveend" : "move";
+			map.on(moveevent, this._update, this);
+			this.once("remove", function () {
+				this._map.off(moveevent, this._update, this);
+			});
 			//handle layer being added to a map for which there are no Google tiles at the given zoom
-			google.maps.event.addListenerOnce(this._mutant, 'idle', function () {
+			google.maps.event.addListenerOnce(this._mutant, "idle", () => {
+				if (!this._map) {
+					return;
+				}
 				this._checkZoomLevels();
 				this._mutantIsReady = true;
-			}.bind(this));
+			});
 
-			//20px instead of 1em to avoid a slight overlap with google's attribution
-			map._controlCorners.bottomright.style.marginBottom = '20px';
-			map._controlCorners.bottomleft.style.marginBottom = '20px';
-
-			this._reset();
 			this._update();
-
-			if (this._subLayers) {
-				//restore previously added google layers
-				for (var layerName in this._subLayers) {
-					this._subLayers[layerName].setMap(this._mutant);
-				}
-			}
-		}.bind(this));
+		});
 	},
 
 	onRemove: function (map) {
 		L.GridLayer.prototype.onRemove.call(this, map);
+		this._observer.disconnect();
 		map._container.removeChild(this._mutantContainer);
-		this._mutantContainer = undefined;
-
-		map.off('viewreset', this._reset, this);
-		map.off('move', this._update, this);
-		map.off('zoomend', this._handleZoomAnim, this);
-		map.off('resize', this._resize, this);
+		if (this._logoContainer) {
+			L.DomUtil.remove(this._logoContainer);
+		}
+		if (this._attributionContainer) {
+			L.DomUtil.remove(this._attributionContainer);
+		}
 
-		map._controlCorners.bottomright.style.marginBottom = '0em';
-		map._controlCorners.bottomleft.style.marginBottom = '0em';
-	},
+		google.maps.event.clearListeners(map, "idle");
+		if (this._mutant) {
+			google.maps.event.clearListeners(this._mutant, "idle");
+		}
+		map.off("move moveend", this._update, this);
 
-	getAttribution: function () {
-		return this.options.attribution;
-	},
-
-	setOpacity: function (opacity) {
-		this.options.opacity = opacity;
-		if (opacity < 1) {
-			L.DomUtil.setOpacity(this._mutantContainer, opacity);
-		}
+		this._isMounted = false;
 	},
 
-	setElementSize: function (e, size) {
-		e.style.width = size.x + 'px';
-		e.style.height = size.y + 'px';
-	},
-
-
+	// 🍂method addGoogleLayer(name: String, options?: Object): this
+	// Adds layer with the given name and options to the google Map instance.
+	// `name`: one of the google maps API layers, with it's constructor available in `google.maps` object.
+	// currently following values supported: 'TrafficLayer', 'TransitLayer', 'BicyclingLayer'.
+	// `options`: see https://developers.google.com/maps/documentation/javascript/reference/map
 	addGoogleLayer: function (googleLayerName, options) {
 		if (!this._subLayers) this._subLayers = {};
-		return this._GAPIPromise.then(function () {
+		GAPIPromise.then(() => {
 			var Constructor = google.maps[googleLayerName];
 			var googleLayer = new Constructor(options);
-			googleLayer.setMap(this._mutant);
+			if (this._mutant) {
+				googleLayer.setMap(this._mutant);
+			} // otherwise it will be added on 'spawned'
 			this._subLayers[googleLayerName] = googleLayer;
-			return googleLayer;
-		}.bind(this));
+		});
+		return this;
 	},
 
+	// 🍂method removeGoogleLayer(name: String): this
+	// Removes layer with the given name from the google Map instance.
 	removeGoogleLayer: function (googleLayerName) {
-		var googleLayer = this._subLayers && this._subLayers[googleLayerName];
-		if (!googleLayer) return;
-
-		googleLayer.setMap(null);
-		delete this._subLayers[googleLayerName];
+		GAPIPromise.then(() => {
+			var googleLayer = this._subLayers && this._subLayers[googleLayerName];
+			if (googleLayer) {
+				googleLayer.setMap(null);
+				delete this._subLayers[googleLayerName];
+			}
+		});
+		return this;
 	},
 
-
 	_initMutantContainer: function () {
 		if (!this._mutantContainer) {
-			this._mutantContainer = L.DomUtil.create('div', 'leaflet-google-mutant leaflet-top leaflet-left');
-			this._mutantContainer.id = '_MutantContainer_' + L.Util.stamp(this._mutantContainer);
-			this._mutantContainer.style.zIndex = '800'; //leaflet map pane at 400, controls at 1000
-			this._mutantContainer.style.pointerEvents = 'none';
+			this._mutantContainer = L.DomUtil.create(
+				"div",
+				"leaflet-google-mutant leaflet-top leaflet-left"
+			);
+			this._mutantContainer.id = "_MutantContainer_" + L.Util.stamp(this._mutantContainer);
+			this._mutantContainer.style.zIndex = 800; //leaflet map pane at 400, controls at 1000
+			this._mutantContainer.style.pointerEvents = "none";
 
-			this._map.getContainer().appendChild(this._mutantContainer);
+			L.DomEvent.off(this._mutantContainer);
 		}
+		this._map.getContainer().appendChild(this._mutantContainer);
 
 		this.setOpacity(this.options.opacity);
-		this.setElementSize(this._mutantContainer, this._map.getSize());
+		const style = this._mutantContainer.style;
+		if (this.options.zoomSnap < 1) {
+			// Fractional zoom needs a bigger mutant container in order to load more (smaller) tiles
+			style.width = "150%";
+			style.height = "150%";
+		} else {
+			style.width = "100%";
+			style.height = "100%";
+		}
+		style.zIndex = -1;
 
 		this._attachObserver(this._mutantContainer);
 	},
 
 	_initMutant: function () {
-		if (!this._ready || !this._mutantContainer) return;
-		this._mutantCenter = new google.maps.LatLng(0, 0);
+		if (this._mutant) {
+			// reuse old _mutant, just make sure it has the correct size
+			return;
+		}
 
 		var map = new google.maps.Map(this._mutantContainer, {
-			center: this._mutantCenter,
+			center: { lat: 0, lng: 0 },
 			zoom: 0,
 			tilt: 0,
 			mapTypeId: this.options.type,
@@ -171,33 +213,35 @@
 			scrollwheel: false,
 			streetViewControl: false,
 			styles: this.options.styles || {},
-			backgroundColor: 'transparent'
+			backgroundColor: "transparent",
 		});
 
 		this._mutant = map;
 
-		google.maps.event.addListenerOnce(map, 'idle', function () {
-			var nodes = this._mutantContainer.querySelectorAll('a');
-			for (var i = 0; i < nodes.length; i++) {
-				nodes[i].style.pointerEvents = 'auto';
+		google.maps.event.addListenerOnce(map, "idle", () => {
+			var nodes = this._mutantContainer.querySelectorAll("a");
+			for (var i = 0; i < nodes.length; ++i) {
+				nodes[i].style.pointerEvents = "auto";
 			}
-		}.bind(this));
+		});
 
 		// 🍂event spawned
 		// Fired when the mutant has been created.
-		this.fire('spawned', {mapObject: map});
+		this.fire("spawned", { mapObject: map });
 	},
 
-	_attachObserver: function _attachObserver (node) {
-// 		console.log('Gonna observe', node);
-
-		var observer = new MutationObserver(this._onMutations.bind(this));
+	_attachObserver: function _attachObserver(node) {
+		if (!this._observer) this._observer = new MutationObserver(this._onMutations.bind(this));
 
 		// pass in the target node, as well as the observer options
-		observer.observe(node, { childList: true, subtree: true });
+		this._observer.observe(node, { childList: true, subtree: true });
+
+		// if we are reusing an old _mutantContainer, we must manually detect
+		// all existing tiles in it
+		Array.prototype.forEach.call(node.querySelectorAll("img"), this._boundOnMutatedImage);
 	},
 
-	_onMutations: function _onMutations (mutations) {
+	_onMutations: function _onMutations(mutations) {
 		for (var i = 0; i < mutations.length; ++i) {
 			var mutation = mutations[i];
 			for (var j = 0; j < mutation.addedNodes.length; ++j) {
@@ -206,7 +250,55 @@
 				if (node instanceof HTMLImageElement) {
 					this._onMutatedImage(node);
 				} else if (node instanceof HTMLElement) {
-					Array.prototype.forEach.call(node.querySelectorAll('img'), this._onMutatedImage.bind(this));
+					Array.prototype.forEach.call(
+						node.querySelectorAll("img"),
+						this._boundOnMutatedImage
+					);
+
+					// Check for, and remove, the "Google Maps can't load correctly" div.
+					// You *are* loading correctly, you dumbwit.
+					if (node.style.backgroundColor === "white") {
+						L.DomUtil.remove(node);
+					}
+
+					// Check for, and remove, the "For development purposes only" divs on the aerial/hybrid tiles.
+					if (node.textContent.indexOf("For development purposes only") === 0) {
+						L.DomUtil.remove(node);
+					}
+
+					// Check for, and remove, the "Sorry, we have no imagery here"
+					// empty <div>s. The [style*="text-align: center"] selector
+					// avoids matching the attribution notice.
+					// This empty div doesn't have a reference to the tile
+					// coordinates, so it's not possible to mark the tile as
+					// failed.
+					Array.prototype.forEach.call(
+						node.querySelectorAll('div[draggable=false][style*="text-align: center"]'),
+						L.DomUtil.remove
+					);
+
+					// Move Google attributions to leaflet's bottom-right control container
+					if (
+						node.querySelectorAll(".gmnoprint").length > 0 ||
+						node.querySelectorAll('a[title="Click to see this area on Google Maps"]')
+							.length > 0
+					) {
+						const ctr = (this._attributionContainer = L.DomUtil.create(
+							"div",
+							"leaflet-control leaflet-control-attribution"
+						));
+						L.DomEvent.disableClickPropagation(ctr);
+						ctr.style.height = "14px";
+						ctr.style.background = "none";
+						this._map._controlCorners.bottomright.appendChild(ctr);
+						ctr.appendChild(node);
+					}
+
+					// Move Google logo to leaflet's bottom-left control container
+					if (node.style.zIndex == 1000000) {
+						this._map._controlCorners.bottomleft.appendChild(node);
+						this._logoContainer = node;
+					}
 				}
 			}
 		}
@@ -224,22 +316,18 @@
 	// This will not be moved around, just removed from the DOM.
 	_staticRegExp: /StaticMapService\.GetMapImage/,
 
-	_onMutatedImage: function _onMutatedImage (imgNode) {
-// 		if (imgNode.src) {
-// 			console.log('caught mutated image: ', imgNode.src);
-// 		}
-
-		var coords;
-		var match = imgNode.src.match(this._roadRegexp);
-		var sublayer = 0;
+	_onMutatedImage: function _onMutatedImage(imgNode) {
+		let coords;
+		let match = imgNode.src.match(this._roadRegexp);
+		let sublayer = 0;
 
 		if (match) {
 			coords = {
 				z: match[1],
 				x: match[2],
-				y: match[3]
+				y: match[3],
 			};
-			if (this._imagesPerTile > 1) { 
+			if (this._imagesPerTile > 1) {
 				imgNode.style.zIndex = 1;
 				sublayer = 1;
 			}
@@ -249,70 +337,59 @@
 				coords = {
 					x: match[1],
 					y: match[2],
-					z: match[3]
+					z: match[3],
 				};
 			}
-// 			imgNode.style.zIndex = 0;
+			// imgNode.style.zIndex = 0;
 			sublayer = 0;
 		}
 
 		if (coords) {
 			var tileKey = this._tileCoordsToKey(coords);
-			imgNode.style.position = 'absolute';
-			var cloneImgNode = imgNode.cloneNode(true);
-			cloneImgNode.style.visibility = 'visible';
-			imgNode.style.visibility = 'hidden';
+			imgNode.style.position = "absolute";
+			imgNode.style.visibility = "hidden";
 
-			var key = tileKey + '/' + sublayer;
+			var key = tileKey + "/" + sublayer;
+			// Cache img so it can also be used in subsequent tile requests
+			this._lru.set(key, imgNode);
+
 			if (key in this._tileCallbacks && this._tileCallbacks[key]) {
-// console.log('Fullfilling callback ', key);
-				this._tileCallbacks[key].shift()(cloneImgNode);
-				if (!this._tileCallbacks[key].length) { delete this._tileCallbacks[key]; }
-			} else {
-// console.log('Caching for later', key);
-
-				if (this._tiles[tileKey]) {
-					//we already have a tile in this position (mutation is probably a google layer being added)
-					//replace it
-					var c = this._tiles[tileKey].el;
-					var oldImg = (sublayer === 0) ? c.firstChild : c.firstChild.nextSibling;
-					c.replaceChild(cloneImgNode, oldImg);
-				} else if (key in this._freshTiles) {
-					this._freshTiles[key].push(cloneImgNode);
-				} else {
-					this._freshTiles[key] = [cloneImgNode];
-				}
+				// Use the tile for *all* pending callbacks. They'll be cloned anyway.
+				this._tileCallbacks[key].forEach((callback) => callback(imgNode));
+				delete this._tileCallbacks[key];
 			}
 		} else if (imgNode.src.match(this._staticRegExp)) {
-			imgNode.style.visibility = 'hidden';
+			imgNode.style.visibility = "hidden";
 		}
 	},
 
+	createTile: function (coords, done) {
+		const key = this._tileCoordsToKey(coords),
+			tileContainer = L.DomUtil.create("div");
 
-	createTile: function (coords, done) {
-		var key = this._tileCoordsToKey(coords);
-
-		var tileContainer = L.DomUtil.create('div');
+		tileContainer.style.textAlign = "left";
 		tileContainer.dataset.pending = this._imagesPerTile;
 		done = done.bind(this, null, tileContainer);
 
-		for (var i = 0; i < this._imagesPerTile; i++) {
-			var key2 = key + '/' + i;
-			if (key2 in this._freshTiles) {
-				tileContainer.appendChild(this._freshTiles[key2].pop());
-				if (!this._freshTiles[key2].length) { delete this._freshTiles[key2]; }
-				tileContainer.dataset.pending--;
-// 				console.log('Got ', key2, ' from _freshTiles');
+		for (var i = 0; i < this._imagesPerTile; ++i) {
+			const key2 = key + "/" + i,
+				imgNode = this._lru.get(key2);
+			if (imgNode) {
+				tileContainer.appendChild(this._clone(imgNode));
+				--tileContainer.dataset.pending;
 			} else {
 				this._tileCallbacks[key2] = this._tileCallbacks[key2] || [];
-				this._tileCallbacks[key2].push( (function (c/*, k2*/) {
-					return function (cloneImgNode) {
-						c.appendChild(cloneImgNode);
-						c.dataset.pending--;
-						if (!parseInt(c.dataset.pending)) { done(); }
-// 						console.log('Sent ', k2, ' to _tileCallbacks, still ', c.dataset.pending, ' images to go');
-					}.bind(this);
-				}.bind(this))(tileContainer/*, key2*/) );
+				this._tileCallbacks[key2].push(
+					function (c /*, k2*/) {
+						return function (imgNode) {
+							c.appendChild(this._clone(imgNode));
+							--c.dataset.pending;
+							if (!parseInt(c.dataset.pending)) {
+								done();
+							}
+						}.bind(this);
+					}.bind(this)(tileContainer /*, key2*/)
+				);
 			}
 		}
 
@@ -322,48 +399,52 @@
 		return tileContainer;
 	},
 
+	_clone: function (imgNode) {
+		const clonedImgNode = imgNode.cloneNode(true);
+		clonedImgNode.style.visibility = "visible";
+		return clonedImgNode;
+	},
+
 	_checkZoomLevels: function () {
 		//setting the zoom level on the Google map may result in a different zoom level than the one requested
 		//(it won't go beyond the level for which they have data).
-		var zoomLevel = this._map.getZoom();
-		var gMapZoomLevel = this._mutant.getZoom();
+		const zoomLevel = this._map.getZoom(),
+			gMapZoomLevel = this._mutant.getZoom();
+
 		if (!zoomLevel || !gMapZoomLevel) return;
 
-
-		if ((gMapZoomLevel !== zoomLevel) || //zoom levels are out of sync, Google doesn't have data
-			(gMapZoomLevel > this.options.maxNativeZoom)) { //at current location, Google does have data (contrary to maxNativeZoom)
+		if (
+			gMapZoomLevel !== zoomLevel || //zoom levels are out of sync, Google doesn't have data
+			gMapZoomLevel > this.options.maxNativeZoom
+		) {
+			//at current location, Google does have data (contrary to maxNativeZoom)
 			//Update maxNativeZoom
 			this._setMaxNativeZoom(gMapZoomLevel);
 		}
 	},
 
 	_setMaxNativeZoom: function (zoomLevel) {
-		if (zoomLevel != this.options.maxNativeZoom) {
+		if (zoomLevel !== this.options.maxNativeZoom) {
 			this.options.maxNativeZoom = zoomLevel;
 			this._resetView();
 		}
 	},
 
-	_reset: function () {
-		this._initContainer();
-	},
-
 	_update: function () {
 		// zoom level check needs to happen before super's implementation (tile addition/creation)
 		// otherwise tiles may be missed if maxNativeZoom is not yet correctly determined
 		if (this._mutant) {
-			var center = this._map.getCenter();
-			var _center = new google.maps.LatLng(center.lat, center.lng);
+			const center = this._map.getCenter(),
+				_center = new google.maps.LatLng(center.lat, center.lng),
+				zoom = Math.round(this._map.getZoom()),
+				mutantZoom = this._mutant.getZoom();
 
 			this._mutant.setCenter(_center);
-			var zoom = this._map.getZoom();
-			var fractionalLevel = zoom !== Math.round(zoom);
-			var mutantZoom = this._mutant.getZoom();
 
 			//ignore fractional zoom levels
-			if (!fractionalLevel && (zoom != mutantZoom)) {
+			if (zoom !== mutantZoom) {
 				this._mutant.setZoom(zoom);
-							
+
 				if (this._mutantIsReady) this._checkZoomLevels();
 				//else zoom level check will be done later by 'idle' handler
 			}
@@ -373,65 +454,30 @@
 	},
 
 	_resize: function () {
-		var size = this._map.getSize();
-		if (this._mutantContainer.style.width === size.x &&
-			this._mutantContainer.style.height === size.y)
+		const factor = this.options.zoomSnap < 1 ? 1.5 : 1;
+		const size = this._map.getSize().multiplyBy(factor);
+		if (
+			this._mutantContainer.style.width === size.x &&
+			this._mutantContainer.style.height === size.y
+		) {
 			return;
+		}
 		this.setElementSize(this._mutantContainer, size);
 		if (!this._mutant) return;
-		google.maps.event.trigger(this._mutant, 'resize');
+		google.maps.event.trigger(this._mutant, "resize");
 	},
 
 	_handleZoomAnim: function () {
 		if (!this._mutant) return;
-		var center = this._map.getCenter();
-		var _center = new google.maps.LatLng(center.lat, center.lng);
+
+		const center = this._map.getCenter(),
+			_center = new google.maps.LatLng(center.lat, center.lng);
 
 		this._mutant.setCenter(_center);
 		this._mutant.setZoom(Math.round(this._map.getZoom()));
 	},
-
-	// Agressively prune _freshtiles when a tile with the same key is removed,
-	// this prevents a problem where Leaflet keeps a loaded tile longer than
-	// GMaps, so that GMaps makes two requests but Leaflet only consumes one,
-	// polluting _freshTiles with stale data.
-	_removeTile: function (key) {
-		if (!this._mutant) return;
-
-		for (var i=0; i<this._imagesPerTile; i++) {
-			var key2 = key + '/' + i;
-			if (key2 in this._freshTiles) { delete this._freshTiles[key2]; }
-// 				console.log('Pruned spurious hybrid _freshTiles');
-		}
-
-		//if the tile is still visible in the google map, keep it.
-		//In this situation, if the tile is later required, there won't be a mutation event (since tile is already in gMap) 
-		//and there will be no other way to refetch the tile.
-		//this situation where GMaps keeps a tile longer than Leaflet can happen when the map goes past 
-		//self's maxNativeZoom
-		var gZoom = this._mutant.getZoom();
-		var zoom = key.split(':')[2];
-		if (zoom == gZoom && gZoom == this.options.maxNativeZoom) {
-			var imgs = this._tiles[key].el.querySelectorAll('img');
-			if (imgs.length) {
-				for (var j=0; j<this._imagesPerTile;j++) {
-					var keyJ = key + '/' + j;
-					var imgNode = imgs[j];
-					if (keyJ in this._freshTiles) {
-						this._freshTiles[keyJ].push(imgNode);
-					} else {
-						this._freshTiles[keyJ] = [imgNode];
-					}				
-				}
-			}
-		}
-
-
-		return L.GridLayer.prototype._removeTile.call(this, key);
-	}
 });
 
-
 // 🍂factory gridLayer.googleMutant(options)
 // Returns a new `GridLayer.GoogleMutant` given its options
 L.gridLayer.googleMutant = function (options) {
--- a/src/pyams_gis/resources/js/leaflet-google-mutant.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ b/src/pyams_gis/resources/js/leaflet-google-mutant.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -1,1 +1,1 @@
-L.GridLayer.GoogleMutant=L.GridLayer.extend({includes:L.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",opacity:1,continuousWorld:false,noWrap:false,type:"roadmap",maxNativeZoom:21},initialize:function(a){L.GridLayer.prototype.initialize.call(this,a);this._ready=!!window.google&&!!window.google.maps&&!!window.google.maps.Map;this._GAPIPromise=this._ready?Promise.resolve(window.google):new Promise(function(e,d){var b=0;var c=null;c=setInterval(function(){if(b>=10){clearInterval(c);return d(new Error("window.google not found after 10 attempts"))}if(!!window.google&&!!window.google.maps&&!!window.google.maps.Map){clearInterval(c);return e(window.google)}b++},500)});this._tileCallbacks={};this._freshTiles={};this._imagesPerTile=(this.options.type==="hybrid")?2:1},onAdd:function(a){L.GridLayer.prototype.onAdd.call(this,a);this._initMutantContainer();this._GAPIPromise.then(function(){this._ready=true;this._map=a;this._initMutant();a.on("viewreset",this._reset,this);a.on("move",this._update,this);a.on("zoomend",this._handleZoomAnim,this);a.on("resize",this._resize,this);google.maps.event.addListenerOnce(this._mutant,"idle",function(){this._checkZoomLevels();this._mutantIsReady=true}.bind(this));a._controlCorners.bottomright.style.marginBottom="20px";a._controlCorners.bottomleft.style.marginBottom="20px";this._reset();this._update();if(this._subLayers){for(var b in this._subLayers){this._subLayers[b].setMap(this._mutant)}}}.bind(this))},onRemove:function(a){L.GridLayer.prototype.onRemove.call(this,a);a._container.removeChild(this._mutantContainer);this._mutantContainer=undefined;a.off("viewreset",this._reset,this);a.off("move",this._update,this);a.off("zoomend",this._handleZoomAnim,this);a.off("resize",this._resize,this);a._controlCorners.bottomright.style.marginBottom="0em";a._controlCorners.bottomleft.style.marginBottom="0em"},getAttribution:function(){return this.options.attribution},setOpacity:function(a){this.options.opacity=a;if(a<1){L.DomUtil.setOpacity(this._mutantContainer,a)}},setElementSize:function(b,a){b.style.width=a.x+"px";b.style.height=a.y+"px"},addGoogleLayer:function(b,a){if(!this._subLayers){this._subLayers={}}return this._GAPIPromise.then(function(){var d=google.maps[b];var c=new d(a);c.setMap(this._mutant);this._subLayers[b]=c;return c}.bind(this))},removeGoogleLayer:function(a){var b=this._subLayers&&this._subLayers[a];if(!b){return}b.setMap(null);delete this._subLayers[a]},_initMutantContainer:function(){if(!this._mutantContainer){this._mutantContainer=L.DomUtil.create("div","leaflet-google-mutant leaflet-top leaflet-left");this._mutantContainer.id="_MutantContainer_"+L.Util.stamp(this._mutantContainer);this._mutantContainer.style.zIndex="800";this._mutantContainer.style.pointerEvents="none";this._map.getContainer().appendChild(this._mutantContainer)}this.setOpacity(this.options.opacity);this.setElementSize(this._mutantContainer,this._map.getSize());this._attachObserver(this._mutantContainer)},_initMutant:function(){if(!this._ready||!this._mutantContainer){return}this._mutantCenter=new google.maps.LatLng(0,0);var a=new google.maps.Map(this._mutantContainer,{center:this._mutantCenter,zoom:0,tilt:0,mapTypeId:this.options.type,disableDefaultUI:true,keyboardShortcuts:false,draggable:false,disableDoubleClickZoom:true,scrollwheel:false,streetViewControl:false,styles:this.options.styles||{},backgroundColor:"transparent"});this._mutant=a;google.maps.event.addListenerOnce(a,"idle",function(){var b=this._mutantContainer.querySelectorAll("a");for(var c=0;c<b.length;c++){b[c].style.pointerEvents="auto"}}.bind(this));this.fire("spawned",{mapObject:a})},_attachObserver:function _attachObserver(b){var a=new MutationObserver(this._onMutations.bind(this));a.observe(b,{childList:true,subtree:true})},_onMutations:function _onMutations(a){for(var d=0;d<a.length;++d){var b=a[d];for(var c=0;c<b.addedNodes.length;++c){var e=b.addedNodes[c];if(e instanceof HTMLImageElement){this._onMutatedImage(e)}else{if(e instanceof HTMLElement){Array.prototype.forEach.call(e.querySelectorAll("img"),this._onMutatedImage.bind(this))}}}}},_roadRegexp:/!1i(\d+)!2i(\d+)!3i(\d+)!/,_satRegexp:/x=(\d+)&y=(\d+)&z=(\d+)/,_staticRegExp:/StaticMapService\.GetMapImage/,_onMutatedImage:function _onMutatedImage(j){var h;var e=j.src.match(this._roadRegexp);var f=0;if(e){h={z:e[1],x:e[2],y:e[3]};if(this._imagesPerTile>1){j.style.zIndex=1;f=1}}else{e=j.src.match(this._satRegexp);if(e){h={x:e[1],y:e[2],z:e[3]}}f=0}if(h){var d=this._tileCoordsToKey(h);j.style.position="absolute";var b=j.cloneNode(true);b.style.visibility="visible";j.style.visibility="hidden";var i=d+"/"+f;if(i in this._tileCallbacks&&this._tileCallbacks[i]){this._tileCallbacks[i].shift()(b);if(!this._tileCallbacks[i].length){delete this._tileCallbacks[i]}}else{if(this._tiles[d]){var g=this._tiles[d].el;var a=(f===0)?g.firstChild:g.firstChild.nextSibling;g.replaceChild(b,a)}else{if(i in this._freshTiles){this._freshTiles[i].push(b)}else{this._freshTiles[i]=[b]}}}}else{if(j.src.match(this._staticRegExp)){j.style.visibility="hidden"}}},createTile:function(f,a){var c=this._tileCoordsToKey(f);var e=L.DomUtil.create("div");e.dataset.pending=this._imagesPerTile;a=a.bind(this,null,e);for(var b=0;b<this._imagesPerTile;b++){var d=c+"/"+b;if(d in this._freshTiles){e.appendChild(this._freshTiles[d].pop());if(!this._freshTiles[d].length){delete this._freshTiles[d]}e.dataset.pending--}else{this._tileCallbacks[d]=this._tileCallbacks[d]||[];this._tileCallbacks[d].push((function(g){return function(h){g.appendChild(h);g.dataset.pending--;if(!parseInt(g.dataset.pending)){a()}}.bind(this)}.bind(this))(e))}}if(!parseInt(e.dataset.pending)){L.Util.requestAnimFrame(a)}return e},_checkZoomLevels:function(){var b=this._map.getZoom();var a=this._mutant.getZoom();if(!b||!a){return}if((a!==b)||(a>this.options.maxNativeZoom)){this._setMaxNativeZoom(a)}},_setMaxNativeZoom:function(a){if(a!=this.options.maxNativeZoom){this.options.maxNativeZoom=a;this._resetView()}},_reset:function(){this._initContainer()},_update:function(){if(this._mutant){var a=this._map.getCenter();var c=new google.maps.LatLng(a.lat,a.lng);this._mutant.setCenter(c);var e=this._map.getZoom();var b=e!==Math.round(e);var d=this._mutant.getZoom();if(!b&&(e!=d)){this._mutant.setZoom(e);if(this._mutantIsReady){this._checkZoomLevels()}}}L.GridLayer.prototype._update.call(this)},_resize:function(){var a=this._map.getSize();if(this._mutantContainer.style.width===a.x&&this._mutantContainer.style.height===a.y){return}this.setElementSize(this._mutantContainer,a);if(!this._mutant){return}google.maps.event.trigger(this._mutant,"resize")},_handleZoomAnim:function(){if(!this._mutant){return}var a=this._map.getCenter();var b=new google.maps.LatLng(a.lat,a.lng);this._mutant.setCenter(b);this._mutant.setZoom(Math.round(this._map.getZoom()))},_removeTile:function(g){if(!this._mutant){return}for(var c=0;c<this._imagesPerTile;c++){var f=g+"/"+c;if(f in this._freshTiles){delete this._freshTiles[f]}}var a=this._mutant.getZoom();var k=g.split(":")[2];if(k==a&&a==this.options.maxNativeZoom){var d=this._tiles[g].el.querySelectorAll("img");if(d.length){for(var b=0;b<this._imagesPerTile;b++){var e=g+"/"+b;var h=d[b];if(e in this._freshTiles){this._freshTiles[e].push(h)}else{this._freshTiles[e]=[h]}}}}return L.GridLayer.prototype._removeTile.call(this,g)}});L.gridLayer.googleMutant=function(a){return new L.GridLayer.GoogleMutant(a)};
\ No newline at end of file
+import{LRUMap}from"./lru_map.js";const GAPIPromise=new Promise((function(t,e){let i=0,n=null;n=setInterval((function(){return i>=20?(clearInterval(n),e(new Error("window.google not found after 10 seconds"))):window.google&&window.google.maps&&window.google.maps.Map?(clearInterval(n),t(window.google)):void++i}),500)}));L.GridLayer.GoogleMutant=L.GridLayer.extend({options:{minZoom:0,maxZoom:21,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",opacity:1,continuousWorld:!1,noWrap:!1,type:"roadmap",maxNativeZoom:21},initialize:function(t){L.GridLayer.prototype.initialize.call(this,t),this._isMounted=!0,this.once("spawned",(function(){if(this._subLayers)for(var t in this._subLayers)this._subLayers[t].setMap(this._mutant)})),this._tileCallbacks={},this._lru=new LRUMap(100),this._imagesPerTile="hybrid"===this.options.type?2:1,this._boundOnMutatedImage=this._onMutatedImage.bind(this)},onAdd:function(t){L.GridLayer.prototype.onAdd.call(this,t),this._initMutantContainer(),this._logoContainer&&t._controlCorners.bottomleft.appendChild(this._logoContainer),this._attributionContainer&&t._controlCorners.bottomright.appendChild(this._attributionContainer),GAPIPromise.then(()=>{if(this._isMounted&&(this._ready=!0,this._initMutant(),t=this._map)){var e=this.options.updateWhenIdle?"moveend":"move";t.on(e,this._update,this),this.once("remove",(function(){this._map.off(e,this._update,this)})),google.maps.event.addListenerOnce(this._mutant,"idle",()=>{this._map&&(this._checkZoomLevels(),this._mutantIsReady=!0)}),this._update()}})},onRemove:function(t){L.GridLayer.prototype.onRemove.call(this,t),this._observer.disconnect(),t._container.removeChild(this._mutantContainer),this._logoContainer&&L.DomUtil.remove(this._logoContainer),this._attributionContainer&&L.DomUtil.remove(this._attributionContainer),google.maps.event.clearListeners(t,"idle"),this._mutant&&google.maps.event.clearListeners(this._mutant,"idle"),t.off("move moveend",this._update,this),this._isMounted=!1},addGoogleLayer:function(t,e){return this._subLayers||(this._subLayers={}),GAPIPromise.then(()=>{var i=new(0,google.maps[t])(e);this._mutant&&i.setMap(this._mutant),this._subLayers[t]=i}),this},removeGoogleLayer:function(t){return GAPIPromise.then(()=>{var e=this._subLayers&&this._subLayers[t];e&&(e.setMap(null),delete this._subLayers[t])}),this},_initMutantContainer:function(){this._mutantContainer||(this._mutantContainer=L.DomUtil.create("div","leaflet-google-mutant leaflet-top leaflet-left"),this._mutantContainer.id="_MutantContainer_"+L.Util.stamp(this._mutantContainer),this._mutantContainer.style.zIndex=800,this._mutantContainer.style.pointerEvents="none",L.DomEvent.off(this._mutantContainer)),this._map.getContainer().appendChild(this._mutantContainer),this.setOpacity(this.options.opacity);const t=this._mutantContainer.style;this.options.zoomSnap<1?(t.width="150%",t.height="150%"):(t.width="100%",t.height="100%"),t.zIndex=-1,this._attachObserver(this._mutantContainer)},_initMutant:function(){if(!this._mutant){var t=new google.maps.Map(this._mutantContainer,{center:{lat:0,lng:0},zoom:0,tilt:0,mapTypeId:this.options.type,disableDefaultUI:!0,keyboardShortcuts:!1,draggable:!1,disableDoubleClickZoom:!0,scrollwheel:!1,streetViewControl:!1,styles:this.options.styles||{},backgroundColor:"transparent"});this._mutant=t,google.maps.event.addListenerOnce(t,"idle",()=>{for(var t=this._mutantContainer.querySelectorAll("a"),e=0;e<t.length;++e)t[e].style.pointerEvents="auto"}),this.fire("spawned",{mapObject:t})}},_attachObserver:function(t){this._observer||(this._observer=new MutationObserver(this._onMutations.bind(this))),this._observer.observe(t,{childList:!0,subtree:!0}),Array.prototype.forEach.call(t.querySelectorAll("img"),this._boundOnMutatedImage)},_onMutations:function(t){for(var e=0;e<t.length;++e)for(var i=t[e],n=0;n<i.addedNodes.length;++n){var o=i.addedNodes[n];if(o instanceof HTMLImageElement)this._onMutatedImage(o);else if(o instanceof HTMLElement){if(Array.prototype.forEach.call(o.querySelectorAll("img"),this._boundOnMutatedImage),"white"===o.style.backgroundColor&&L.DomUtil.remove(o),0===o.textContent.indexOf("For development purposes only")&&L.DomUtil.remove(o),Array.prototype.forEach.call(o.querySelectorAll('div[draggable=false][style*="text-align: center"]'),L.DomUtil.remove),o.querySelectorAll(".gmnoprint").length>0||o.querySelectorAll('a[title="Click to see this area on Google Maps"]').length>0){const t=this._attributionContainer=L.DomUtil.create("div","leaflet-control leaflet-control-attribution");L.DomEvent.disableClickPropagation(t),t.style.height="14px",t.style.background="none",this._map._controlCorners.bottomright.appendChild(t),t.appendChild(o)}1e6==o.style.zIndex&&(this._map._controlCorners.bottomleft.appendChild(o),this._logoContainer=o)}}},_roadRegexp:/!1i(\d+)!2i(\d+)!3i(\d+)!/,_satRegexp:/x=(\d+)&y=(\d+)&z=(\d+)/,_staticRegExp:/StaticMapService\.GetMapImage/,_onMutatedImage:function(t){let e,i=t.src.match(this._roadRegexp),n=0;if(i?(e={z:i[1],x:i[2],y:i[3]},this._imagesPerTile>1&&(t.style.zIndex=1,n=1)):((i=t.src.match(this._satRegexp))&&(e={x:i[1],y:i[2],z:i[3]}),n=0),e){var o=this._tileCoordsToKey(e);t.style.position="absolute",t.style.visibility="hidden";var s=o+"/"+n;this._lru.set(s,t),s in this._tileCallbacks&&this._tileCallbacks[s]&&(this._tileCallbacks[s].forEach(e=>e(t)),delete this._tileCallbacks[s])}else t.src.match(this._staticRegExp)&&(t.style.visibility="hidden")},createTile:function(t,e){const i=this._tileCoordsToKey(t),n=L.DomUtil.create("div");n.style.textAlign="left",n.dataset.pending=this._imagesPerTile,e=e.bind(this,null,n);for(var o=0;o<this._imagesPerTile;++o){const t=i+"/"+o,s=this._lru.get(t);s?(n.appendChild(this._clone(s)),--n.dataset.pending):(this._tileCallbacks[t]=this._tileCallbacks[t]||[],this._tileCallbacks[t].push(function(t){return function(i){t.appendChild(this._clone(i)),--t.dataset.pending,parseInt(t.dataset.pending)||e()}.bind(this)}.bind(this)(n)))}return parseInt(n.dataset.pending)||L.Util.requestAnimFrame(e),n},_clone:function(t){const e=t.cloneNode(!0);return e.style.visibility="visible",e},_checkZoomLevels:function(){const t=this._map.getZoom(),e=this._mutant.getZoom();t&&e&&(e!==t||e>this.options.maxNativeZoom)&&this._setMaxNativeZoom(e)},_setMaxNativeZoom:function(t){t!==this.options.maxNativeZoom&&(this.options.maxNativeZoom=t,this._resetView())},_update:function(){if(this._mutant){const t=this._map.getCenter(),e=new google.maps.LatLng(t.lat,t.lng),i=Math.round(this._map.getZoom()),n=this._mutant.getZoom();this._mutant.setCenter(e),i!==n&&(this._mutant.setZoom(i),this._mutantIsReady&&this._checkZoomLevels())}L.GridLayer.prototype._update.call(this)},_resize:function(){const t=this.options.zoomSnap<1?1.5:1,e=this._map.getSize().multiplyBy(t);this._mutantContainer.style.width===e.x&&this._mutantContainer.style.height===e.y||(this.setElementSize(this._mutantContainer,e),this._mutant&&google.maps.event.trigger(this._mutant,"resize"))},_handleZoomAnim:function(){if(!this._mutant)return;const t=this._map.getCenter(),e=new google.maps.LatLng(t.lat,t.lng);this._mutant.setCenter(e),this._mutant.setZoom(Math.round(this._map.getZoom()))}}),L.gridLayer.googleMutant=function(t){return new L.GridLayer.GoogleMutant(t)};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-gp-2.1.7.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,53617 @@
+/*!
+ * @brief French Geoportal Extension for Leaflet
+ *
+ * This software is released under the licence CeCILL-B (Free BSD compatible)
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ * @see http://www.cecill.info/
+ *
+ * @copyright copyright (c) IGN 
+ * @license CeCILL-B
+ * @author IGN
+ * @version 2.1.7
+ * @date 09/12/2020
+ *
+ */
+
+/*!
+ * @overview  Proj4Leaflet - Smooth Proj4js integration with Leaflet
+ * @copyright Copyright (c) 2012, Kartena AB
+ * @license   BSD 2-Clause "Simplified" License
+ *            See https://raw.githubusercontent.com/kartena/Proj4Leaflet/master/LICENSE
+ * @version 1.0.2
+ */
+
+/*!
+ * @overview  leaflet-draw - Vector drawing and editing plugin for Leaflet 
+ * @copyright Copyright (c) 2012-2017 Jon West, Jacob Toye, and Leaflet
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/Leaflet/Leaflet.draw/master/MIT-LICENSE.md
+ * @version   1.0.4
+ */
+
+/*!
+ * Sortable -- JavaScript library for reorderable drag-and-drop lists on modern
+ * browsers and touch devices. No jQuery required. Supports Meteor, AngularJS,
+ * React, Polymer, Vue, Knockout and any CSS library, e.g. Bootstrap.
+ *
+ * Released under MIT LICENSE
+ *
+ * Copyright Lebedev Konstantin <ibnRubaXa@gmail.com>
+ * https://github.com/SortableJS/Sortable
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * @version 1.8.4
+ */
+
+/*!
+ * @overview  es6-promise - a tiny implementation of Promises/A+.
+ * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
+ * @version   v4.2.4
+ */
+
+/*!
+ * @overview   Proj4js - Javascript reprojection library.
+ *
+ * @authors
+ * - Mike Adair madairATdmsolutions.ca
+ * - Richard Greenwood richATgreenwoodmap.com
+ * - Didier Richard didier.richardATign.fr
+ * - Stephen Irons stephen.ironsATclear.net.nz
+ * - Olivier Terral oterralATgmail.com
+ * - Calvin Metcalf cmetcalfATappgeo.com
+ *
+ * @copyright Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons, Olivier Terral and Calvin Metcalf
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/proj4js/proj4js/master/LICENSE.md
+ * @version   ^2.6.2
+ */
+
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory(require("leaflet"), require("request"), require("xmldom"));
+	else if(typeof define === 'function' && define.amd)
+		define("Gp", ["leaflet", "require", "require"], factory);
+	else if(typeof exports === 'object')
+		exports["Gp"] = factory(require("leaflet"), require("request"), require("xmldom"));
+	else
+		root["Gp"] = factory(root["L"], root[undefined], root[undefined]);
+})(window, function(__WEBPACK_EXTERNAL_MODULE__2__, __WEBPACK_EXTERNAL_MODULE__53__, __WEBPACK_EXTERNAL_MODULE__54__) {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// define __esModule on exports
+/******/ 	__webpack_require__.r = function(exports) {
+/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 		}
+/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 	};
+/******/
+/******/ 	// create a fake namespace object
+/******/ 	// mode & 1: value is a module id, require it
+/******/ 	// mode & 2: merge all properties of value into the ns
+/******/ 	// mode & 4: return value when already ns object
+/******/ 	// mode & 8|1: behave like require
+/******/ 	__webpack_require__.t = function(value, mode) {
+/******/ 		if(mode & 1) value = __webpack_require__(value);
+/******/ 		if(mode & 8) return value;
+/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ 		var ns = Object.create(null);
+/******/ 		__webpack_require__.r(ns);
+/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ 		return ns;
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Services", function() { return Services; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Error", function() { return Error; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Helper", function() { return Helper; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Protocols", function() { return Protocols; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "servicesDate", function() { return servicesDate; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "servicesVersion", function() { return servicesVersion; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "leafletExtVersion", function() { return leafletExtVersion; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "leafletExtDate", function() { return leafletExtDate; });
+/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+var _package_json__WEBPACK_IMPORTED_MODULE_0___namespace = /*#__PURE__*/__webpack_require__.t(1, 1);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony reexport (default from non-harmony) */ __webpack_require__.d(__webpack_exports__, "LExtended", function() { return leaflet__WEBPACK_IMPORTED_MODULE_1___default.a; });
+/* harmony import */ var _Common_Styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
+/* harmony import */ var _Styles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(21);
+/* harmony import */ var _Controls_Controls__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(32);
+/* harmony import */ var _Controls_ElevationPath__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(166);
+/* harmony import */ var _Layers_Layers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(170);
+/* harmony import */ var _CRS_CRS__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(150);
+/* harmony import */ var _Common_Utils_AutoLoadConfig__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(176);
+/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(40);
+/* harmony import */ var _Common_Utils_LayerUtils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(172);
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LayerUtils", function() { return _Common_Utils_LayerUtils__WEBPACK_IMPORTED_MODULE_10__["default"]; });
+
+/* harmony import */ var _Common_Utils_ProxyUtils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(177);
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ProxyUtils", function() { return _Common_Utils_ProxyUtils__WEBPACK_IMPORTED_MODULE_11__["default"]; });
+
+/* harmony import */ var _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(178);
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ColorUtils", function() { return _Common_Utils_ColorUtils__WEBPACK_IMPORTED_MODULE_12__["default"]; });
+
+/* harmony import */ var _Common_Utils_MathUtils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(148);
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MathUtils", function() { return _Common_Utils_MathUtils__WEBPACK_IMPORTED_MODULE_13__["default"]; });
+
+/**
+* Global variable Gp.
+*
+* @module Gp
+* @alias Gp
+* @desc
+*
+* This is the global variable that is exposed in the browser environment.
+* Content is composed of constructor, functions and properties...
+*
+* > Config:  (...)
+*
+* > ColorUtils: (...)
+* > LayerUtils: (...)
+* > MathUtils: (...)
+* > ProxyUtils: (...)
+*
+* > LExtended: (...)
+*
+* > leafletExtDate: "YYYY-MM-DD"
+* > leafletExtVersion: "X.X.X"
+*
+* > Error: (...)
+* > Helper: (...)
+* > Protocols: (...)
+* > Services: (...)
+* > servicesDate: "YYYY-MM-DD"
+* > servicesVersion: "X.X.X"
+*
+* The following variables are aslo global :
+*   - proj4,
+*   - L
+*/
+
+ // CSS communes aux extensions !
+
+
+
+
+
+ // import WMTS from "./Layers/WMTS";
+// import WMS from "./Layers/WMS";
+
+ // Autoload...
+
+ // export des services
+
+ // reconstruction des ns
+
+var Services = geoportal_access_lib__WEBPACK_IMPORTED_MODULE_9__["default"].Services;
+var Error = geoportal_access_lib__WEBPACK_IMPORTED_MODULE_9__["default"].Error;
+var Helper = geoportal_access_lib__WEBPACK_IMPORTED_MODULE_9__["default"].Helper;
+var Protocols = geoportal_access_lib__WEBPACK_IMPORTED_MODULE_9__["default"].Protocols;
+var servicesDate = geoportal_access_lib__WEBPACK_IMPORTED_MODULE_9__["default"].servicesDate;
+var servicesVersion = geoportal_access_lib__WEBPACK_IMPORTED_MODULE_9__["default"].servicesVersion;
+ // Rajout des propriétés de l'extension dans le namespace
+
+/** Version */
+
+var leafletExtVersion = _package_json__WEBPACK_IMPORTED_MODULE_0__.leafletExtVersion;
+/** Publication date */
+
+var leafletExtDate = _package_json__WEBPACK_IMPORTED_MODULE_0__.date; // Classes utilitaires
+
+
+
+
+ // creation du namespace pour les extensions leaflet
+
+leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.geoportalLayer = _Layers_Layers__WEBPACK_IMPORTED_MODULE_6__["default"]; // WMS et WMTS
+// L.geoportalLayers = {};
+// L.geoportalLayers.WMTS = WMTS;
+// L.geoportalLayers.WMS = WMS;
+
+leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.geoportalControl = _Controls_Controls__WEBPACK_IMPORTED_MODULE_4__["default"]; // IsoChrone, SearchEngine, ...
+
+leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_D3 = _Controls_ElevationPath__WEBPACK_IMPORTED_MODULE_5__["default"].DISPLAY_PROFILE_LIB_D3;
+leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS = _Controls_ElevationPath__WEBPACK_IMPORTED_MODULE_5__["default"].DISPLAY_PROFILE_LIB_AMCHARTS;
+leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.geoportalControl.ElevationPath.DISPLAY_PROFILE_RAW = _Controls_ElevationPath__WEBPACK_IMPORTED_MODULE_5__["default"].DISPLAY_PROFILE_RAW;
+leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.geoportalControl.ElevationPath.DISPLAY_PROFILE_BY_DEFAULT = _Controls_ElevationPath__WEBPACK_IMPORTED_MODULE_5__["default"].DISPLAY_PROFILE_BY_DEFAULT;
+leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.geoportalCRS = _CRS_CRS__WEBPACK_IMPORTED_MODULE_7__["default"]; // lambert 93 et lambert 2 étendu
+
+leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.geoportalCRS.EPSG2154 = _CRS_CRS__WEBPACK_IMPORTED_MODULE_7__["default"].EPSG2154(); // lambert 93
+
+leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.geoportalCRS.EPSG27572 = _CRS_CRS__WEBPACK_IMPORTED_MODULE_7__["default"].EPSG27572(); // lambert 2 étendu
+
+leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.geoportalCRS.EPSG4326 = _CRS_CRS__WEBPACK_IMPORTED_MODULE_7__["default"].EPSG4326();
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module) {
+
+module.exports = JSON.parse("{\"name\":\"geoportal-extensions\",\"description\":\"French Geoportal Extensions for OpenLayers, Leaflet and iTowns libraries\",\"version\":\"2.3.1\",\"date\":\"09/12/2020\",\"leafletExtName\":\"French Geoportal Extension for Leaflet\",\"leafletExtVersion\":\"2.1.7\",\"olExtName\":\"French Geoportal Extension for OpenLayers\",\"olExtVersion\":\"3.0.13\",\"itownsExtName\":\"French Geoportal Extension for Itowns\",\"itownsExtVersion\":\"2.3.0\",\"main\":\"dist/leaflet/GpPluginLeaflet.js, dist/openlayers/GpPluginOpenLayers.js, dist/itowns/GpPluginItowns.js\",\"module\":\"src/Leaflet/index.js, src/OpenLayers/index.js, src/Itowns/index.js\",\"directories\":{},\"scripts\":{\"setup\":\"npm install\",\"clean\":\"echo \\\"Warning: target not yet implemented!\\\" && exit 0\",\"eslint\":\"eslint src/\",\"test\":\"npm run test:serve\",\"test:serve\":\"cd test && webpack-dev-server --hot --config webpack.test.serve.js\",\"sample\":\"npm run sample:serve\",\"sample:serve\":\"npm run sample:ol:serve\",\"sample:itowns:serve\":\"webpack-dev-server --config build/webpack/webpack.config.itowns --https --open-page samples/index-itowns-map.html --content-base . --output-public-path '/dist/itowns/' --port 9001 --open 'google-chrome'\",\"sample:leaflet:serve\":\"webpack-dev-server --config build/webpack/webpack.config.leaflet --https --open-page samples/index-leaflet-map.html --content-base . --output-public-path '/dist/leaflet/' --port 9001 --open 'google-chrome'\",\"sample:ol:serve\":\"webpack-dev-server --config build/webpack/webpack.config.openlayers --https --open-page samples/index-openlayers-map.html --content-base . --output-public-path '/dist/openlayers/' --port 9001 --open 'google-chrome'\",\"doc\":\"npm run doc:serve\",\"doc:serve\":\"npm run doc:ol:serve\",\"doc:itowns:serve\":\"webpack-dev-server --config build/webpack/webpack.config.itowns --content-base jsdoc/itowns --port 9001 --open\",\"doc:leaflet:serve\":\"webpack-dev-server --config build/webpack/webpack.config.leaflet --content-base jsdoc/leaflet --port 9001 --open\",\"doc:ol:serve\":\"webpack-dev-server --config build/webpack/webpack.config.openlayers --content-base jsdoc/openlayers --port 9001 --open\",\"build:dev\":\"npm-run-all --print-label --print-name build:*:dev\",\"build:prod\":\"npm-run-all --print-label --print-name build:*:prod\",\"build:src\":\"npm-run-all --print-label --print-name build:*:src\",\"build\":\"npm-run-all --print-label --print-name build:*:*\",\"build:itowns\":\"npm-run-all --print-label --print-name build:itowns:*\",\"build:itowns:dev\":\"webpack --config build/webpack/webpack.config.itowns --mode=development\",\"build:itowns:prod\":\"webpack --config build/webpack/webpack.config.itowns --mode=production\",\"build:itowns:src\":\"webpack --config build/webpack/webpack.config.itowns --mode=none\",\"build:ol\":\"npm-run-all --print-label --print-name build:ol:*\",\"build:ol:dev\":\"webpack --config build/webpack/webpack.config.openlayers --mode=development\",\"build:ol:prod\":\"webpack --config build/webpack/webpack.config.openlayers --mode=production\",\"build:ol:src\":\"webpack --config build/webpack/webpack.config.openlayers --mode=none\",\"build:leaflet\":\"npm-run-all --print-label --print-name build:leaflet:*\",\"build:leaflet:dev\":\"webpack --config build/webpack/webpack.config.leaflet --mode=development\",\"build:leaflet:prod\":\"webpack --config build/webpack/webpack.config.leaflet --mode=production\",\"build:leaflet:src\":\"webpack --config build/webpack/webpack.config.leaflet --mode=none\"},\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/IGNF/geoportal-extensions.git\"},\"author\":\"IGNF\",\"keywords\":[\"geoportail\",\"javascript\",\"OpenLayers\",\"Leaflet\",\"Itowns\",\"3D\"],\"license\":\"CECILL-B\",\"bugs\":{\"url\":\"https://github.com/IGNF/geoportal-extensions/issues\"},\"homepage\":\"https://github.com/IGNF/geoportal-extensions#readme\",\"dependencies\":{\"@mapbox/mapbox-gl-style-spec\":\"13.11.0\",\"eventbusjs\":\"0.2.0\",\"geoportal-access-lib\":\"2.1.6\",\"itowns\":\"2.27.0\",\"leaflet\":\"1.7.1\",\"leaflet-draw\":\"1.0.4\",\"loglevel\":\"^1.6.7\",\"ol\":\"5.3.0\",\"ol-mapbox-style\":\"4.2.1\",\"proj4\":\"^2.6.2\",\"proj4leaflet\":\"1.0.2\",\"sortablejs\":\"1.8.4\",\"three\":\"^0.121.1\",\"whatwg-fetch\":\"3.0.0\"},\"devDependencies\":{\"@babel/core\":\"^7.4.4\",\"@babel/plugin-transform-template-literals\":\"^7.7.4\",\"@babel/preset-env\":\"^7.4.4\",\"babel-loader\":\"^8.0.5\",\"chai\":\"^4.2.0\",\"chalk\":\"^4.0.0\",\"clean-webpack-plugin\":\"^3.0.0\",\"copy-webpack-plugin\":\"^5.0.3\",\"core-js\":\"^3.6.4\",\"css-loader\":\"^3.4.2\",\"eslint\":\"^6.8.0\",\"eslint-config-standard\":\"^14.1.1\",\"eslint-loader\":\"^4.0.0\",\"eslint-plugin-import\":\"^2.17.2\",\"eslint-plugin-node\":\"^11.1.0\",\"eslint-plugin-promise\":\"^4.1.1\",\"eslint-plugin-standard\":\"^4.0.0\",\"exports-loader\":\"^0.7.0\",\"expose-loader\":\"^0.7.5\",\"fs-extra\":\"^9.0.0\",\"handlebars\":\"^4.7.5\",\"handlebars-layouts\":\"^3.1.4\",\"html-webpack-plugin\":\"^4.0.4\",\"jsdoc-webpack-plugin\":\"^0.3.0\",\"mini-css-extract-plugin\":\"^0.9.0\",\"mocha\":\"^7.1.1\",\"mocha-loader\":\"^5.0.0\",\"npm-run-all\":\"^4.1.5\",\"optimize-css-assets-webpack-plugin\":\"^5.0.1\",\"path\":\"^0.12.7\",\"replace-bundle-webpack-plugin\":\"^1.0.0\",\"requirejs\":\"^2.3.6\",\"responsive-loader\":\"^1.2.0\",\"speed-measure-webpack-plugin\":\"^1.3.0\",\"string-template\":\"^1.0.0\",\"style-loader\":\"^1.1.3\",\"terser-webpack-plugin\":\"^2.0.0\",\"url-loader\":\"^4.0.0\",\"webpack\":\"^4.30.0\",\"webpack-cli\":\"^3.3.1\",\"webpack-dev-server\":\"^3.3.1\",\"webpack-node-externals\":\"^1.7.2\"}}");
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports) {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE__2__;
+
+/***/ }),
+/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _CSS_GPboostRelief_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);
+/* harmony import */ var _CSS_GPboostRelief_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPboostRelief_css__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _CSS_GPdrawing_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
+/* harmony import */ var _CSS_GPdrawing_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPdrawing_css__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _CSS_GPelevationPath_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6);
+/* harmony import */ var _CSS_GPelevationPath_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPelevationPath_css__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _CSS_GPgeneralWidget_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7);
+/* harmony import */ var _CSS_GPgeneralWidget_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPgeneralWidget_css__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _CSS_GPgetFeatureInfo_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8);
+/* harmony import */ var _CSS_GPgetFeatureInfo_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPgetFeatureInfo_css__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _CSS_GPisochron_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(9);
+/* harmony import */ var _CSS_GPisochron_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPisochron_css__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _CSS_GPlayerSwitcher_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(10);
+/* harmony import */ var _CSS_GPlayerSwitcher_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPlayerSwitcher_css__WEBPACK_IMPORTED_MODULE_6__);
+/* harmony import */ var _CSS_GPlocation_css__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(11);
+/* harmony import */ var _CSS_GPlocation_css__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPlocation_css__WEBPACK_IMPORTED_MODULE_7__);
+/* harmony import */ var _CSS_GPmeasureArea_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(12);
+/* harmony import */ var _CSS_GPmeasureArea_css__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPmeasureArea_css__WEBPACK_IMPORTED_MODULE_8__);
+/* harmony import */ var _CSS_GPmeasureAzimuth_css__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(13);
+/* harmony import */ var _CSS_GPmeasureAzimuth_css__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPmeasureAzimuth_css__WEBPACK_IMPORTED_MODULE_9__);
+/* harmony import */ var _CSS_GPmeasureLength_css__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(14);
+/* harmony import */ var _CSS_GPmeasureLength_css__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPmeasureLength_css__WEBPACK_IMPORTED_MODULE_10__);
+/* harmony import */ var _CSS_GPmeasureToolTip_css__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(15);
+/* harmony import */ var _CSS_GPmeasureToolTip_css__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPmeasureToolTip_css__WEBPACK_IMPORTED_MODULE_11__);
+/* harmony import */ var _CSS_GPmousePosition_css__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(16);
+/* harmony import */ var _CSS_GPmousePosition_css__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPmousePosition_css__WEBPACK_IMPORTED_MODULE_12__);
+/* harmony import */ var _CSS_GPreverseGeocoding_css__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(17);
+/* harmony import */ var _CSS_GPreverseGeocoding_css__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPreverseGeocoding_css__WEBPACK_IMPORTED_MODULE_13__);
+/* harmony import */ var _CSS_GProute_css__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(18);
+/* harmony import */ var _CSS_GProute_css__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_CSS_GProute_css__WEBPACK_IMPORTED_MODULE_14__);
+/* harmony import */ var _CSS_GPsearchEngine_css__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(19);
+/* harmony import */ var _CSS_GPsearchEngine_css__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPsearchEngine_css__WEBPACK_IMPORTED_MODULE_15__);
+/* harmony import */ var _CSS_GPwaiting_css__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(20);
+/* harmony import */ var _CSS_GPwaiting_css__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPwaiting_css__WEBPACK_IMPORTED_MODULE_16__);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 21 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _CSS_GPgeneralWidgetLeaflet_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(22);
+/* harmony import */ var _CSS_GPgeneralWidgetLeaflet_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_CSS_GPgeneralWidgetLeaflet_css__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _CSS_Controls_ElevationPath_GPelevationPathLeaflet_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(23);
+/* harmony import */ var _CSS_Controls_ElevationPath_GPelevationPathLeaflet_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_CSS_Controls_ElevationPath_GPelevationPathLeaflet_css__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _CSS_Controls_Isochrone_GPisochronLeaflet_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(24);
+/* harmony import */ var _CSS_Controls_Isochrone_GPisochronLeaflet_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_CSS_Controls_Isochrone_GPisochronLeaflet_css__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _CSS_Controls_LayerSwitcher_GPlayerSwitcherLeaflet_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(25);
+/* harmony import */ var _CSS_Controls_LayerSwitcher_GPlayerSwitcherLeaflet_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_CSS_Controls_LayerSwitcher_GPlayerSwitcherLeaflet_css__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _CSS_Controls_LocationSelector_GPlocationLeaflet_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(26);
+/* harmony import */ var _CSS_Controls_LocationSelector_GPlocationLeaflet_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_CSS_Controls_LocationSelector_GPlocationLeaflet_css__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _CSS_Controls_MousePosition_GPmousePositionLeaflet_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(27);
+/* harmony import */ var _CSS_Controls_MousePosition_GPmousePositionLeaflet_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_CSS_Controls_MousePosition_GPmousePositionLeaflet_css__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _CSS_Controls_ReverseGeocoding_GPreverseGeocodingLeaflet_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(28);
+/* harmony import */ var _CSS_Controls_ReverseGeocoding_GPreverseGeocodingLeaflet_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_CSS_Controls_ReverseGeocoding_GPreverseGeocodingLeaflet_css__WEBPACK_IMPORTED_MODULE_6__);
+/* harmony import */ var _CSS_Controls_Route_GProuteLeaflet_css__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(29);
+/* harmony import */ var _CSS_Controls_Route_GProuteLeaflet_css__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_CSS_Controls_Route_GProuteLeaflet_css__WEBPACK_IMPORTED_MODULE_7__);
+/* harmony import */ var _CSS_Controls_SearchEngine_GPsearchEngineLeaflet_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(30);
+/* harmony import */ var _CSS_Controls_SearchEngine_GPsearchEngineLeaflet_css__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_CSS_Controls_SearchEngine_GPsearchEngineLeaflet_css__WEBPACK_IMPORTED_MODULE_8__);
+/* global true */
+// En module ES6, on n'a pas besoin de ces CSS, car on utile le CSS géneré avec WebPack.
+// L'utilisation de ces imports est utile lors de la creation du bundle...
+
+
+
+
+
+
+
+
+ // ce flag est substitué via le script de publication des sources du package...
+
+if (true) {
+  // plugin leaflet-draw !
+  __webpack_require__(31);
+}
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 32 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _LayerSwitcher__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(33);
+/* harmony import */ var _Isocurve__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(39);
+/* harmony import */ var _MousePosition__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(147);
+/* harmony import */ var _ReverseGeocoding__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(158);
+/* harmony import */ var _Route__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(161);
+/* harmony import */ var _SearchEngine__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(163);
+/* harmony import */ var _ElevationPath__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(166);
+/* harmony import */ var _Logo__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(169);
+
+
+
+
+
+
+
+
+/**
+ * Geoportal Controls Factory to be used together with Leaflet Maps.
+ *
+ * @module Controls
+ * @alias L.geoportalControl
+ * @example
+ * var layerSwitcher = L.geoportalControl.LayerSwitcher(options);
+ */
+
+var Controls = {
+  /**
+   * Factory function for LayerSwitcher Control creation.
+   *
+   * @method LayerSwitcher
+   * @static
+   * @alias L.geoportalControl.LayerSwitcher
+   * @param {Object} options - options for function call.
+   * @param {String}  [options.position] - position of component into the map, 'topleft' by default. See {@link http://leafletjs.com/reference-1.0.2.html#control-option L.Control options} for available values.
+   * @param {Boolean} [options.collapsed] - collapse mode, false by default
+   * @param {Array}   [options.layers] - list of layers to be configured. Each array element is an object, with following properties :
+   * @param {Object}  [options.layers.layer] - layer object
+   * @param {Boolean} [options.layers.display] - display layer in widget layer list
+   * @param {Object}  [options.layers.config] - layer display config
+   * @param {String}  [options.layers.config.visibility] - layer visibility on map
+   * @param {String}  [options.layers.config.title] - layer alias, to be displayed in widget layer list. E.g. : "Cartes IGN"
+   * @param {String}  [options.layers.config.description] - layer description, to be displayed on title hover, or in layer information panel.
+   * @param {String}  [options.layers.config.quicklookUrl] - link to a quick look image for this layer.
+   * @param {Array}   [options.layers.config.legends] - array of layer legends. Each array element is an object, with following properties :
+   *      - url (String, mandatory) : link to a legend
+   *      - minScaleDenominator (Number, optional) : min scale denominator for legend validity.
+   * @param {Array} [options.layers.config.metadata] - array of layer metadata. Each array element is an object, with property url (String, mandatory) : link to a metadata
+   * @returns {L.geoportalControl.LayerSwitcher} - LayerSwitcher Object
+   * @example
+   *  layers = [
+   *      {
+   *          layer : wms1,
+   *          display : false,
+   *          config : {
+   *              title : "test layer name 1",
+   *              description : "test layer desc 1",
+   *          }
+   *      }
+   *  ];
+   *
+   *  options = {
+   *      position : "topright",
+   *      collapsed : true,
+   *      layers : layers
+   *  };
+   *
+   *  var layerSwitcher = L.geoportalControl.LayerSwitcher(options);
+   */
+  LayerSwitcher: function LayerSwitcher(options) {
+    return new _LayerSwitcher__WEBPACK_IMPORTED_MODULE_0__["default"](options);
+  },
+
+  /**
+   * Factory function for Isocurve Control creation.
+   *
+   * @method Isocurve
+   * @static
+   * @alias L.geoportalControl.Isocurve
+   * @param {Object} options - Isocurve control options
+   * @param {Sting}   [options.apiKey] - API key for services call (isocurve and autocomplete services), mandatory if autoconf service has not been charged in advance
+   * @param {String}  [options.position] - position of component into the map, 'topleft' by default. See {@link http://leafletjs.com/reference-1.0.2.html#control-option L.Control options} for available values.
+   * @param {Boolean} [options.collapsed] - Specify if widget has to be collapsed (true) or not (false) on map loading. Default is true.
+   * @param {Boolean} [options.ssl = true] - use of ssl or not (default true, service requested using https protocol)
+   * @param {Object}  [options.exclusions] - list of exclusions with status (true = checked), by default : ["toll":false, "tunnel":false, "bridge":false].
+   * @param {Array}   [options.graphs] - list of graph resources to be used for isocurve calculation, by default : ["Voiture", "Pieton"]. The first element is selected.
+   * @param {Array}   [options.methods] - list of methods, by default : ["time", "distance"]. The first element is selected by default.
+   * @param {Array}   [options.directions] - list of directions to be displayed, by default : ["departure", "arrival"]. The first element is selected by default.
+   *      Directions enable to specify if input location point will be used as a departure point ("departure") or as an arrival point ("arrival")
+   * @param {Boolean} [options.disableReverse = false] - whether to enable/disable the reverse geocoding
+   * @param {Object} [options.isocurveOptions] - isocurve service options. see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~isoCurve Gp.Services.isoCurve}
+   * @param {Object} [options.autocompleteOptions] - autocomplete service options. see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~autoComplete Gp.Services.autoComplete}
+   * @returns {L.geoportalControl.Isocurve} - Isocurve Object
+   * @example
+   *  var iso = L.geoportalControl.Isocurve({
+   *      collapsed : false
+   *      methods : ["time", "distance"],
+   *      exclusions : {
+   *         toll : true,
+   *         bridge : false,
+   *         tunnel : true
+   *      },
+   *      graphs : ["Pieton", "Voiture"],
+   *      isocurveOptions : {},
+   *      autocompleteOptions : {}
+   *  });
+   */
+  Isocurve: function Isocurve(options) {
+    return new _Isocurve__WEBPACK_IMPORTED_MODULE_1__["default"](options);
+  },
+
+  /**
+   * Factory function for Geoportal MousePosition Control creation.
+   *
+   * @method MousePosition
+   * @static
+   * @alias L.geoportalControl.MousePosition
+   * @param {Object} options - options for function call.
+   * @param {Sting}   [options.apiKey] - API key, mandatory if autoconf service has not been charged in advance
+   * @param {String}  [options.position] - position of component into the map, 'bottomleft' by default. See {@link http://leafletjs.com/reference-1.0.2.html#control-option L.Control options} for available values.
+   * @param {Boolean} [options.collapsed] - collapse mode, false by default
+   * @param {Boolean} [options.ssl = true] - use of ssl or not (default true, service requested using https protocol)
+   * @param {Array}   [options.systems] - list of projection systems, GEOGRAPHIC, MERCATOR, LAMB93 and LAMB2E by default
+   *      Each array element (=system) is an object with following properties :
+   * @param {String}  options.systems.crs - Proj4 crs alias (from proj4 defs). e.g. : "EPSG:4326". Required
+   * @param {String}  [options.systems.label] - CRS label to be displayed in control. Default is crs code (e.g. "EPSG:4326")
+   * @param {String}  [options.systems.type] - CRS units type for coordinates conversion : "Geographical" or "Metric". Default: "Metric"
+   * @param {Object}  [options.systems.geoBBox] - Aera covered by the system (WGS84 coordinates).
+   * @param {Number}  options.systems.geoBBox.right - Right bound.
+   * @param {Number}  options.systems.geoBBox.left - Left bound.
+   * @param {Number}  options.systems.geoBBox.top - Top bound.
+   * @param {Number}  options.systems.geoBBox.bottom - Bottom bound.
+   * @param {Array}   [options.units] - list of units by system, Geographical and Metric by default
+   *      Values may be "DEC" (decimal degrees), "DMS" (sexagecimal), "RAD" (radians) and "GON" (grades) for geographical coordinates,
+   *      and "M" or "KM" for metric coordinates
+   * @param {Boolean} [options.displayAltitude] - active/desactivate the altitude panel, if desactivate, have just the coordinate panel, true by default
+   * @param {Boolean} [options.displayCoordinates] - active/desactivate the coordinate panel, if desactivate, have just the altitude panel, true by default
+   * @param {Boolean} [options.editCoordinates = false] - If true, coordinates from the MousePosition control can be edited by users to re-center the view. False by default.
+   * @param {Object}  [options.altitude] - elevation configuration
+   * @param {Object}  [options.altitude.serviceOptions] - options of elevation service. see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~getAltitude Gp.Services.getAltitude}
+   * @param {Number}  [options.altitude.responseDelay] - latency for altitude request, 500 ms by default
+   * @param {Number}  [options.altitude.triggerDelay] - immobilisation time of movement on the map to trigger the elevation calculation, 200 ms by default
+   * @param {Number}  [options.altitude.noDataValue] - value used for altitude service no data (default is -99999). In this case, "---m" will be displayed instead of "-99999m"
+   * @param {Number}  [options.altitude.noDataValueTolerance] - tolerance for no data value :
+   *                  values in [noDataValue - noDataValueTolerance ; noDataValue + noDataValueTolerance] interval will not be displayed, but "---m" will be displayed instead.
+   *                  Default is 90000
+   * @returns {L.geoportalControl.MousePosition} - MousePosition Object
+   * @example
+   *  var MousePosition = L.geoportalControl.MousePosition({
+   *      position : 'bottomleft',
+   *      collapsed : false,
+   *      displayAltitude : true,
+   *      editCoordinates : false,
+   *      altitude : {
+   *           triggerDelay : 100,
+   *           responseDelay : 500,
+   *           noDataValue : -99999,
+   *           noDataValueTolerance : 90000,
+   *           serviceOptions : {}
+   *      },
+   *      systems : [
+   *       {
+   *          crs : L.CRS.EPSG4326,
+   *          label : "Lon,Lat",
+   *          type : "Geographical"
+   *        },
+   *       {
+   *          crs : L.geoportalCRS.EPSG2154,
+   *          label : "Lambert 93",
+   *          type : "Metric"
+   *        }
+   *      ],
+   *      units : ["DEC", "DMS"]
+   *  });
+   */
+  MousePosition: function MousePosition(options) {
+    return new _MousePosition__WEBPACK_IMPORTED_MODULE_2__["default"](options);
+  },
+
+  /**
+   * Factory function for Geoportal ReverseGeocode Control creation.
+   *
+   * @method ReverseGeocode
+   * @static
+   * @alias L.geoportalControl.ReverseGeocode
+   * @extends {L.Control}
+   * @param {Object} options - ReverseGeocoding control options
+   * @param {String}  [options.apiKey] - API key for services call (reverse geocode service), mandatory if autoconf service has not been charged in advance
+   * @param {String}  [options.position] - position of component into the map, 'topleft' by default. See {@link http://leafletjs.com/reference-1.0.2.html#control-option L.Control options} for available values.
+   * @param {Boolean} [options.collapsed] - Specify if widget has to be collapsed (true) or not (false) on map loading. Default is true.
+   * @param {Boolean} [options.ssl = true] - use of ssl or not (default true, service requested using https protocol)
+   * @param {Array}  [options.resources] - resources for geocoding, by default : ["StreetAddress", "PositionOfInterest"]
+   * @param {Array}  [options.delimitations] - delimitations for reverse geocoding, by default : ["Point", "Circle", "Extent"]
+   * @param {Object}  [options.ReverseGeocodeOptions] - reverse geocode service options. see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~reverseGeocode Gp.Services.reverseGeocode} to know all reverse geocode options.
+   * @returns {L.geoportalControl.ReverseGeocode} - ReverseGeocode Object
+   * @example
+   *  var iso = L.geoportalControl.ReverseGeocode({
+   *      collapsed : false,
+   *      position : "topright",
+   *      resources : ["StreetAddress", "PositionOfInterest"],
+   *      delimitations : ["Point", "Circle"],
+   *      reverseGeocodeOptions : {}
+   *  });
+   */
+  ReverseGeocode: function ReverseGeocode(options) {
+    return new _ReverseGeocoding__WEBPACK_IMPORTED_MODULE_3__["default"](options);
+  },
+
+  /**
+   * Factory function for Geoportal Route Control creation.
+   *
+   * @method Route
+   * @static
+   * @alias L.geoportalControl.Route
+   * @extends {L.Control}
+   * @param {Object} options - options for function call.
+   * @param {Sting}   [options.apiKey] - API key, mandatory if autoconf service has not been charged in advance
+   * @param {String}  [options.position = "topleft"] - position of component into the map, 'topleft' by default. See {@link http://leafletjs.com/reference-1.0.2.html#control-option L.Control options} for available values.
+   * @param {Boolean} [options.collapsed = false] - collapse mode, false by default
+   * @param {Boolean} [options.ssl = true] - use of ssl or not (default true, service requested using https protocol)
+   * @param {Boolean} [options.disableReverse = false] - whether to enable/disable the reverse geocoding when entering points.
+   *   Active by default. But, you can disable it when entering with the "ctrl" key on the keyboard
+   * @param {Object}  [options.exclusions] - list of exclusions with status
+   * @param {Array}   [options.graphs] - list of resources, by default : ["Voiture", "Pieton"], and the first element is selected.
+   * @param {Object}  [options.autocompleteOptions] - options of autocomplete service. see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~autoComplete Gp.Services.autoComplete}
+   * @param {Object}  [options.routeOptions] - options of route service. see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~route Gp.Services.route}
+   * @returns {L.geoportalControl.Route} - Route Object
+   * @example
+   *  var route = L.geoportalControl.Route({
+   *      position : "topright",
+   *      collapsed : true,
+   *      exclusions : {
+   *         "toll" : true,
+   *         "bridge" : false,
+   *         "tunnel" : true
+   *      },
+   *      graphs : ['Pieton', 'Voiture'],
+   *      autocompleteOptions : {},
+   *      routeOptions : {}
+   *  });
+   */
+  Route: function Route(options) {
+    return new _Route__WEBPACK_IMPORTED_MODULE_4__["default"](options);
+  },
+
+  /**
+   * Factory function for Geoportal SearchEngine Control creation.
+   *
+   * @method SearchEngine
+   * @static
+   * @alias L.geoportalControl.SearchEngine
+   * @extends {L.Control}
+   * @param {Object}  options - control options
+   * @param {String}  [options.apiKey] - API key, mandatory if autoconf service has not been charged in advance
+   * @param {Boolean} [options.collapsed = false] - collapse mode
+   * @param {Boolean} [options.ssl = true] - use of ssl or not (default true, service requested using https protocol)
+   * @param {String}  [options.position = "topleft"] - position of component into the map. See {@link http://leafletjs.com/reference-1.0.2.html#control-option L.Control options} for available values.
+   * @param {String}  [options.placeholder = "Rechercher un lieu, une adresse"] - set placeholder in search bar
+   * @param {Boolean} [options.displayMarker = true] - set a marker on search result
+   * @param {String|Object}  [options.markerStyle = "blue"] - set a marker style. Currently possible values are "blue" (default value), "orange", "red" and "green". But you can use an L.Icon object (see {@link http://leafletjs.com/reference-1.2.0.html#icon L.Icon })
+   * @param {Boolean} [options.displayInfo = true] - get informations on popup marker
+   * @param {Sting|Numeric|Function} [options.zoomTo] - zoom to results, by default, current zoom.
+   *       possible values : "auto", any fixed zoom level or a function retruning a zoom :
+   *
+   *       ```
+   *       zoomTo : function (info) {
+   *           // do some stuff...
+   *           return zoom; // required : return the zoom level !
+   *       }
+   *
+   *       With parameter 'info' : {
+   *           type : "PositionOfInterest" | "StreetAddress" | ...
+   *           service : "SuggestedLocation" | "DirectGeocodedLocation"
+   *           fields : { // fields of service response }
+   *       }
+   *       ```
+   * @param {Sting}   [options.apiKey] - API key, mandatory if autoconf service has not been charged in advance
+   * @param {Object}  [options.resources] - resources to be used by geocode and autocompletion services, by default : ["StreetAddress", "PositionOfInterest"]
+   * @param {Boolean} [options.displayAdvancedSearch] - False to disable advanced search tools (it will not be displayed). Default is true (displayed)
+   * @param {Object}  [options.advancedSearch] - advanced search for geocoding (filters)
+   * @param {Object}  [options.geocodeOptions] - options of geocode service. see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~geocode Gp.Services.geocode}
+   * @param {Object}  [options.autocompleteOptions] - options of autocomplete service. see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~autoComplete Gp.Services.autoComplete}
+   * @param {Object}  [options.autocompleteOptions.serviceOptions] - options of autocomplete service
+   * @param {Boolean} [options.autocompleteOptions.triggerGeocode = false] - trigger a geocoding request if the autocompletion does not return any suggestions, false by default
+   * @param {Number}  [options.autocompleteOptions.triggerDelay = 1000] - waiting time before sending the geocoding request, 1000ms by default
+   * @returns {L.geoportalControl.SearchEngine} - SearchEngine Object
+   * @example
+   *  var SearchEngine = L.geoportalControl.SearchEngine({
+   *      position : "topright",
+   *      collapsed : true,
+   *      zoomTo : "auto",
+   *      displayInfo : true,
+   *      displayAdvancedSearch : true,
+   *      resources : ["PositionOfInterest", "StreetAddress"],
+   *      advancedSearch : {
+   *          PositionOfInterest : [{name : "municipality", title : "Ville"}],
+   *          StreetAddress : [{...}],
+   *          CadastralParcel : null,
+   *      },
+   *      apiKey : "zfgzrgffg57rfg8ar7gr4g5r4",
+   *      geocodeOptions : {},
+   *      autocompleteOptions : {}
+   *  });
+   */
+  SearchEngine: function SearchEngine(options) {
+    return new _SearchEngine__WEBPACK_IMPORTED_MODULE_5__["default"](options);
+  },
+
+  /**
+   * Factory function for ElevationPath Control creation.
+   *
+   * @method ElevationPath
+   * @static
+   * @alias L.geoportalControl.ElevationPath
+   * @param {Object} options - options for function call.
+   * @param {Sting}   [options.apiKey] - API key for elevation service call, mandatory if configuration service has not been loaded in advance. See {@link https://github.com/IGNF/geoportal-extensions/blob/master/README-leaflet.md#user-content-config "Configuration de l'accès à la plateforme Géoportail" documentation chapter} for more information.
+   * @param {String}  [options.position] - position of component into the map, 'topleft' by default. See {@link http://leafletjs.com/reference-1.0.2.html#control-option L.Control options} for available values.
+   * @param {Boolean} [options.ssl = true] - use of ssl or not (default true, service requested using https protocol)
+   * @param {Boolean} [options.active = false] - specify if control should be actived at startup. Default is false.
+   * @param {Object} [options.stylesOptions = DEFAULT_STYLES] - Styles to use when drawing. see [leaflet options](http://leafletjs.com/reference.html#path-options) for available properties.
+   * @param {Object} [options.elevationPathOptions = {}] - elevation path service options. See {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~getAltitude options} for available options
+   * @param {Object} [options.displayProfileOptions = {}] - profile options.
+   * @param {Function} [options.displayProfileOptions.apply] - function to display profile if you want to cutomise it. By default, [DISPLAY_PROFILE_BY_DEFAULT()](./L.geoportalControl.ElevationPath.html#.DISPLAY_PROFILE_BY_DEFAULT) is used. Helper functions to use with D3 [DISPLAY_PROFILE_LIB_D3()](./L.geoportalControl.ElevationPath.html#.DISPLAY_PROFILE_LIB_D3) or AmCharts [DISPLAY_PROFILE_LIB_AMCHARTS()](./L.geoportalControl.ElevationPath.html#.DISPLAY_PROFILE_LIB_AMCHARTS) frameworks are also provided. You may also provide your own function.
+   * @param {Object} [options.displayProfileOptions.target] - DOM container to use to display the profile.
+   * @param {Boolean} [options.displayProfileOptions.greaterSlope = true] - display the greater slope into the graph
+   * @param {Boolean} [options.displayProfileOptions.meanSlope = true] -  display the mean slope into the graph
+   * @param {Boolean} [options.displayProfileOptions.ascendingElevation = true] -  display the ascending elevation into the graph
+   * @param {Boolean} [options.displayProfileOptions.descendingElevation = true] -  display the descending elevation into the graph
+   * @param {Boolean} [options.displayProfileOptions.currentSlope = true] -  display current slope value on profile mouseover
+   *
+   * @returns {L.geoportalControl.ElevationPath} - ElevationPath Object
+   * @example
+   *  var e = L.geoportalControl.ElevationPath({
+   *      active : false
+   *      position : "topleft"
+   *      stylesOptions : {},
+   *      elevationPathOptions : {},
+   *      displayProfileOptions  : {
+   *          apply : L.geoportalControl.DISPLAY_PROFILE_LIB_AMCHARTS
+   *          target : null, // by default
+   *          meanSlope : true, // by default
+   *          greaterSlope : true, // by default
+   *          ascendingElevation : false,
+   *          descendingElevation : false,
+   *          currentSlope : false
+   *      }
+   *  });
+   */
+  ElevationPath: function ElevationPath(options) {
+    return new _ElevationPath__WEBPACK_IMPORTED_MODULE_6__["default"](options);
+  },
+
+  /**
+   * Control Logo
+   *
+   * @private
+   * @method Logo
+   * @extends {L.Control}
+   * @alias L.geoportalControl.Logo
+   * @param {Object} options - options for function call.
+   * @param {String} options.position - 'topright' by default. See {@link http://leafletjs.com/reference-1.0.2.html#control-option L.Control options} for available values.
+   * @param {String} options.url - URL
+   * @param {String} options.text - text
+   * @param {String} options.picto - picto
+   * @param {String|Object} options.size - picto size
+   * @returns {Logo} - Logo Object
+   * @example
+   * var map  = L.map('map').setView([48, 2], 4);
+   * var logo = L.geoportalControl.Logo({
+   *   position : "topright",
+   *   picto : "http://www.ign.fr/logo-ign.jpg",
+   *   url : "http://www.ign.fr",
+   *   text : "© IGN"
+   *   size : {width : '50px', height : '30px'}
+   * });
+   * logo.addTo(map);
+   */
+  Logo: function Logo(options) {
+    return new _Logo__WEBPACK_IMPORTED_MODULE_7__["default"](options);
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (Controls);
+
+/***/ }),
+/* 33 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34);
+/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(36);
+/* harmony import */ var _Common_Controls_LayerSwitcherDOM__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(37);
+
+
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_1__["default"].getLogger("layerswitcher");
+/**
+ * @classdesc
+ *
+ * Leaflet Control Class to manage map layers : their order, visibility and opacity, and display their informations (title, description, legends, metadata...)
+ *
+ * Use {@link module:Controls.LayerSwitcher L.geoportalControl.LayerSwitcher()} factory to create instances of that class.
+ *
+ * **Extends** Leaflet <a href="http://leafletjs.com/reference.html#control-layers" target="_blank">L.Control.Layers</a> native class.
+ *
+ * @namespace
+ * @alias L.geoportalControl.LayerSwitcher
+ */
+
+var LayerSwitcher = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Control.Layers.extend(
+/** @lends L.geoportalControl.LayerSwitcher.prototype */
+{
+  includes: _Common_Controls_LayerSwitcherDOM__WEBPACK_IMPORTED_MODULE_3__["default"],
+
+  /**
+   * options by default
+   * (extend to L.Control.Layers)
+   *
+   * @private
+   */
+  options: {
+    collapsed: true,
+    position: "topright",
+    autoZIndex: true,
+    layers: []
+  },
+  // ################################################################### //
+  // ##################### Methodes surchargées ######################## //
+  // ################################################################### //
+
+  /**
+   * @constructor LayerSwitcher
+   *
+   * @private
+   * @alias LayerSwitcher
+   * @extends {L.Control}
+   * @param {Object} options - options of component
+   * @param {String}  [options.position] - position of component into the map, 'topleft' by default
+   * @param {Boolean} [options.collapsed] - collapse mode, false by default
+   * @param {Array} [options.layers] - list of layers to be configured. Each array element is an object, with following properties :
+   * @param {Object} [options.layers.layer] - layer object
+   * @param {Boolean} [options.layers.display] - display layer in widget layer list
+   * @param {String} [options.layers.config.visibility] - layer visibility on map
+   * @param {String} [options.layers.config.title] - layer alias, to be displayed in widget layer list. E.g. : "Cartes IGN"
+   * @param {String} [options.layers.config.description] - layer description, to be displayed on title hover, or in layer information panel.
+   * @param {String} [options.layers.config.quicklookUrl] - link to a quick look image for this layer.
+   * @param {Array} [options.layers.config.legends] - array of layer legends. Each array element is an object, with following properties :
+   *      - url (String, mandatory) : link to a legend
+   *      - minScaleDenominator (Number, optional) : min scale denominator for legend validity.
+   * @param {Array} [options.layers.config.metadata] - array of layer metadata. Each array element is an object, with property url (String, mandatory) : link to a metadata
+   *
+   * @example
+   *  layers = [
+   *      {
+   *          layer : wms1,
+   *          display : false,
+   *          config : {
+   *              title : "test layer name 1",
+   *              description : "test layer desc 1",
+   *          }
+   *      }
+   *  ]
+   *  options = {
+   *      position : "topright",
+   *      collapsed : true,
+   *      layers : layers
+   *  }
+   *
+   *  var layerSwitcher = L.geoportalControl.LayerSwitcher(options);
+   */
+  initialize: function initialize(options) {
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.setOptions(this, options); // uuid
+
+    this._uid = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_2__["default"].generate(); // il faut recuperer tous les layers de la carte (cf. onAdd).
+    // si une configuration de layers est renseignée, on exploite cette
+    // information pour les layers renseignés.
+    // Par contre, pour ceux qui n'ont pas de configuration, on exploite
+    // les informations issues de l'autoconf pour les layers IGN,
+    // et, pour les layers non IGN, on gére avec l'ID pours les valeurs
+    // de titre ou description  ...
+    // a ton une configuration des layers ?
+
+    this._hasLayersConfig = !(!this.options.layers || Object.keys(this.options.layers).length === 0); // configuration des layers
+
+    this._layersConfig = this._hasLayersConfig ? this.options.layers : []; // liste des layers (c'est l'interface avec le dom !)
+
+    this._layers = {}; // indice : ordre des layers sur la carte
+    // plus c'est haut, plus c'est au dessus de la pile
+
+    this._lastZIndex = 0; // si on a une configuration de layers, on l'exploite tout de suite...
+
+    if (this._hasLayersConfig) {
+      for (var i = 0; i < this._layersConfig.length; i++) {
+        var obj = this._layersConfig[i]; // signature de la fonction pour une compatibilité avec leaflet...
+
+        this._addLayer(obj.layer, null, true);
+      }
+    }
+  },
+
+  /**
+   * Method 'onAdd'
+   * (extend to L.Control.Layers)
+   * Method to add the control on the map.
+   *
+   * @param {Object} map - L.Map
+   * @returns {HTMLElement} container
+   *
+   * @private
+   */
+  onAdd: function onAdd(map) {
+    // on charge tous les layers dans le controle avec une
+    // configuration automatique des layers pour ceux qui ne sont pas
+    // renseignés.
+    var layersMap = map._layers; // on est dans le cas où nous avons des layers ajoutés à la carte
+
+    if (Object.keys(layersMap).length !== 0) {
+      // pour gerer l'ordre d'affichage des layers sur la map
+      // ainsi que dans le controle, on veut le fonctionnement suivant :
+      // layers ID   : [21  , 23  , 25  , 27]
+      // layers Map  : [21:1, 23:2, 25:3, 27:4]
+      // mais l'ordre dans le controle doit être inversé
+      // layers Ctrl : [27, 25, 23, 21], et ceci sera realisé lors de
+      // la creation du DOM pour chaque layer (cf. _update())
+      var layersKeys = Object.keys(layersMap); // trie
+
+      this._lastZIndex = 0;
+
+      for (var i = 0; i < layersKeys.length; i++) {
+        var layerId = layersKeys[i]; // gestion des ordres d'affichage des layers
+
+        if (this.options.autoZIndex && layersMap[layerId].setZIndex) {
+          this._lastZIndex++;
+          layersMap[layerId].setZIndex(this._lastZIndex);
+        } // y'a t il une configuration des layers ?
+        // si oui, le layer renseigné a déjà été pris en compte dans
+        // le constructeur..., on passe à la suite...
+
+
+        if (this._hasLayersConfig) {
+          if (this._layers[layerId]) {
+            continue;
+          }
+        } // sans configuration, on gére en mode auto le layer.
+        // on utilise cette methode
+        // this.addOverlay() -> this._addLayer()...
+
+
+        this.addOverlay(layersMap[layerId]);
+      }
+    } // FIXME au cas où les layers n'ont pas été renseignés sur la carte
+    // (via addTo ou options.layers), on decide de prendre ceux qui
+    // sont renseignés dans la configuration ?
+
+
+    if (Object.keys(layersMap).length === 0) {
+      var config = this._layersConfig;
+      this._lastZIndex = 0;
+
+      for (var j = 0; j < config.length; j++) {
+        var layer = config[j].layer;
+
+        if (!map.hasLayer(layer)) {
+          // on ajoute le layer à la carte
+          map.addLayer(layer); // on met en place la structure
+
+          this.addOverlay(layer, null); // on gère l'ordres d'affichage des layers
+
+          if (this.options.autoZIndex && layer.setZIndex) {
+            this._lastZIndex++;
+            layer.setZIndex(this._lastZIndex);
+          }
+        }
+      }
+    } // mise à jour des visibilités (au niveau du DOM, oeil coché ou non...)
+
+
+    for (var k in this._layers) {
+      if (this._layers.hasOwnProperty(k)) {
+        var obj = this._layers[k];
+        var _layer = obj.layer;
+        var _visibility = obj.visibility; // par defaut, la visibilité de la couche est active, donc avec un oeil non coché !
+
+        if (!_visibility) {
+          // on met à jour la liste des layers à afficher !
+          this._updateVisibilityLayer(_layer);
+        }
+      }
+    } // le constructeur retourne this._container !
+    // on appelle la methode hérité car elle va realisée le boulot :
+    // - _initLayout
+    // - _update
+    // - evenements sur la carte : layeradd + layerremove
+    // this._container = L.Control.Layers.prototype.onAdd.call(this, map);
+
+
+    this._initLayout();
+
+    this._update();
+
+    map.on("layeradd", this._onLayerChange, this);
+    map.on("layerremove", this._onLayerChange, this); // expiremental !
+
+    map.eachLayer(function (layer) {
+      // ecouteur sur la visibilité des attributions d'un layer IGN
+      layer.on("visibilitychange", function () {
+        logger.trace("visibilitychange", layer);
+      }, this); // ecouteur sur la liste des attributions d'un layer IGN
+
+      layer.on("attributionchange", function () {
+        logger.trace("attributionchange", layer);
+      }, this);
+    });
+    return this._container;
+  },
+
+  /**
+   * Method '_addLayer'
+   * (overwritten : L.Control.Layers)
+   * Methode creation of a useful structure for the interface with the DOM
+   * Method private call by this.initialize() or this.addOverlay()
+   *
+   * @example
+   * {
+   *    layer : objectlayer,
+   *    id : id,
+   *    title : title,
+   *    description : description
+   *    (...)
+   * };
+   * @param {Object} layer - object type 'L.TileLayer'
+   * @param {String} name - layer name or title
+   * @param {Boolean} overlay - overlay or not
+   *
+   * @private
+   */
+  _addLayer: function _addLayer(layer, name, overlay) {
+    // id du layer (IGN ou non)
+    var id = layer._geoportal_id ? layer._geoportal_id : layer._leaflet_id; // pas d'ID !?
+    // le layer n'est pas chargé dans la carte...
+
+    if (typeof id === "undefined") {
+      return;
+    } // recherche de la config pour un layer donné
+
+
+    var layerConfig = {};
+
+    for (var i in this._layersConfig) {
+      if (this._layersConfig.hasOwnProperty(i)) {
+        if (id === leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.stamp(this._layersConfig[i].layer)) {
+          layerConfig = this._layersConfig[i].config; // display
+          // ce layer n'est pas pris en compte dans le controle
+          // mais il peut être affiché dans la map
+          // si au préalable, le client l'a ajouté...
+
+          var display = typeof this._layersConfig[i].display !== "undefined" ? this._layersConfig[i].display : true;
+
+          if (!display) {
+            return;
+          }
+
+          break;
+        }
+      }
+    } // construit un objet simplifié pour le dom,
+    // par defaut, on prend en compte les layers de type IGN
+    // (info de l'autoconf).
+
+
+    this._layers[id] = {
+      layer: layer,
+      id: id,
+      overlay: overlay,
+      // not use !
+      title: layer._geoportal_id && layer._title ? layer._title : name || id,
+      description: layer._geoportal_id && layer._description ? layer._description : name || id,
+      visibility: true,
+      // par defaut, sauf si surcharge via la config...
+      legends: layer._geoportal_id ? layer._legends : null,
+      metadata: layer._geoportal_id ? layer._metadata : null,
+      quicklookUrl: layer._geoportal_id ? layer._quicklookUrl : null
+    }; // surcharge la config ci dessus avec les options de configuration saisies
+
+    if (layerConfig && Object.keys(layerConfig)) {
+      leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.extend(this._layers[id], layerConfig);
+    } // mise à jour de la visibilité
+
+
+    var _visibility = this._layers[id].visibility;
+
+    if (layer._geoportal_id) {
+      // mise à jour de la visibilité des attributions pour un layer IGN
+      layer.setVisible(_visibility);
+    }
+
+    if (!_visibility) {
+      // on met à jour la liste des layers à afficher !
+      this._updateVisibilityLayer(layer);
+    }
+  },
+
+  /**
+   * Method 'addTo'
+   * (overwritten : L.Control.Layers because of exception with _expandIfNotCollapsed())
+   *
+   * @param {Object} map - the map
+   *
+   * @returns {Object} this
+   */
+  addTo: function addTo(map) {
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Control.prototype.addTo.call(this, map);
+    return this;
+  },
+
+  /**
+   * Creation of layers of container
+   * (extend to L.Control.Layers)
+   *
+   * Method private call by this.onAdd()
+   *
+   * @private
+   */
+  _initLayout: function _initLayout() {
+    // fonctionnement lors de l'initialisation :
+    // onAdd -> this._update     -> this._addItem (on boucle sur layers)
+    // onAdd -> this._initLayout
+    // creation du container principal
+    var container = this._container = this._createMainContainerElement(); // ajout dans le container principal d'affichage des layers
+
+
+    var input = this._createMainLayersShowElement();
+
+    container.appendChild(input); // gestion du mode "collapsed"
+
+    if (!this.options.collapsed) {
+      input.checked = true;
+    } // ajout dans le container principal de la liste des layers
+
+
+    var divL = this._overlaysList = this._createMainLayersElement();
+
+    container.appendChild(divL); // ajout dans le container principal du picto du controle
+
+    var picto = this._createMainPictoElement();
+
+    container.appendChild(picto); // ajout dans le container principal du panneau d'information
+
+    var divI = this._createMainInfoElement();
+
+    container.appendChild(divI); // creation du mode draggable
+
+    this._createDraggableElement(this._overlaysList, this); // desactivation des evenements qui peuvent interférer avec la carte
+
+
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomEvent.disableClickPropagation(container).disableScrollPropagation(container); // gestion des evenements en interaction avec la carte
+
+    this._map.on("moveend", this._onOutOfRangeLayerZoom, this); // gestion des CSS en fonction du placement du controle
+
+
+    switch (this.getPosition()) {
+      case "topright":
+        container.style.position = "relative";
+        container.style.top = "0";
+        container.style.right = "0";
+        break;
+
+      case "topleft":
+        container.style.position = "relative";
+        container.style.top = "0";
+        container.style.right = "initial";
+        picto.style["float"] = "left";
+        divL.style.borderBottomRightRadius = "5px";
+        divL.style.borderBottomLeftRadius = "0";
+        divI.style.right = "initial";
+        divI.style.left = "190px";
+        break;
+
+      case "bottomleft":
+        container.style.position = "relative";
+        container.style.top = "0";
+        container.style.right = "initial";
+        picto.style["float"] = "left";
+        divL.style.borderBottomRightRadius = "5px";
+        divL.style.borderBottomLeftRadius = "0";
+        divI.style.right = "initial";
+        divI.style.left = "190px"; // divI.style.top = "initial";
+        // divI.style.bottom = "190px";
+
+        break;
+
+      case "bottomright":
+        container.style.position = "relative";
+        container.style.top = "0";
+        container.style.right = "0"; // divI.style.top = "initial";
+        // divI.style.bottom = "190px";
+
+        break;
+
+      default:
+        container.style.position = "relative";
+        container.style.top = "0";
+        container.style.right = "0";
+    }
+  },
+
+  /**
+   * Update the construction of DOM for each layer
+   * (extend to L.Control.Layers)
+   *
+   * Method private call by this.onAdd()
+   *
+   * @private
+   */
+  _update: function _update() {
+    if (!this._container) {
+      return;
+    }
+
+    this._overlaysList.innerHTML = "";
+    var layersId = [];
+
+    for (var i in this._layers) {
+      if (this._layers.hasOwnProperty(i)) {
+        layersId.push(i);
+      }
+    } // inversion du sens des layers dans le controle
+    // car on veut le même ordre que sur la map, et comme je suis un peu
+    // parano, je re-trie la liste...
+
+
+    var layers = layersId.sort(function (a, b) {
+      var ia = parseInt(a, 10);
+      var ib = parseInt(b, 10);
+      return ia - ib;
+    }).reverse();
+
+    for (var j = 0; j < layers.length; j++) {
+      var id = layers[j];
+      var obj = this._layers[id];
+
+      this._addItem(obj);
+    }
+  },
+
+  /**
+   * Construction of the DOM for each layer
+   * (extend to L.Control.Layers)
+   *
+   * Method private call by this._update()
+   *
+   * @private
+   * @param {Object} obj - layer
+   * @returns {HTMLElement} container
+   */
+  _addItem: function _addItem(obj) {
+    logger.log("_addItem", obj);
+    obj.opacity = obj.layer.options.opacity; // ajout de cette option !
+
+    var container = this._createContainerLayerElement(obj); // gestion outOfRange
+
+
+    obj.layer.options.minZoom > this._map.getZoom() || obj.layer.options.maxZoom < this._map.getZoom() ? leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.addClass(container, "outOfRange") : leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.removeClass(container, "outOfRange"); // ajout du container dans la liste des layers (de type overlay uniquement !)
+
+    this._overlaysList.appendChild(container);
+
+    return container;
+  },
+
+  /**
+   * Event onLayer change
+   * (extend to L.Control.Layers because of version 1.0.0)
+   *
+   * @private
+   * @param {Event} e - event
+   */
+  _onLayerChange: function _onLayerChange(e) {
+    var obj = this._layers[leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.stamp(e.layer)];
+
+    if (!obj) {
+      return;
+    }
+
+    if (!this._handlingClick) {
+      this._update();
+    }
+
+    var type = e.type === "layeradd" ? "overlayadd" : "overlayremove";
+
+    if (type) {
+      this._map.fire(type, obj);
+    }
+  },
+
+  /**
+   * Event onLayer remove
+   * (extend to L.Control.Layers because of version 1.0.0)
+   *
+   * @private
+   * @param {Object} layer - event
+   * @returns {Object} layer
+   */
+  removeLayer: function removeLayer(layer) {
+    // clean DOM !
+    var id = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.stamp(layer);
+    delete this._layers[id];
+
+    this._update(); // clean Layers
+
+
+    var map = this._map;
+
+    if (map) {
+      if (map.hasLayer(layer)) {
+        map.removeLayer(layer);
+      }
+    }
+
+    return this;
+  },
+  // ################################################################### //
+  // ################ Methodes de l'instance (privées) ################# //
+  // ################################################################### //
+
+  /**
+   * Set visibility of attribution layer
+   * (call by this._onVisibilityLayerClick())
+   *
+   * @private
+   * @param {Object} layer - layer
+   */
+  _updateVisibilityLayer: function _updateVisibilityLayer(layer) {
+    if (!this._map) {
+      return;
+    }
+
+    this._handlingClick = true;
+
+    var visibility = this._layers[leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.stamp(layer)].visibility;
+
+    if (visibility && !this._map.hasLayer(layer)) {
+      // input non checked dans le DOM, on ouvre l'oeil
+      // et on ajoute la couche !
+      this._map.addLayer(layer);
+    } else if (!visibility && this._map.hasLayer(layer)) {
+      // input checked dans le DOM, on ferme l'oeil
+      // et on supprime la couche !
+      this._map.removeLayer(layer);
+    } else {
+      logger.log("Status unknown layer !?");
+    }
+
+    this._handlingClick = false;
+
+    this._refocusOnMap();
+  },
+
+  /**
+   * Set visibility of layer (DOM)
+   * (call by this.setVisibility())
+   *
+   * @private
+   * @param {Object} layer - layer
+   */
+  _updateVisibilityDOMLayer: function _updateVisibilityDOMLayer(layer) {
+    var layerIdx = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.stamp(layer);
+    var visibilityElement = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get(this._addUID("GPvisibility_ID_" + layerIdx)); // FIXME ID !
+
+    var visibilityValue = this._layers[layerIdx].visibility;
+    visibilityElement.checked = visibilityValue;
+  },
+
+  /**
+   * Set opacity of layer (DOM)
+   * (call by this.setOpacity())
+   *
+   * @private
+   * @param {Object} layer - layer
+   */
+  _updateOpacityDOMLayer: function _updateOpacityDOMLayer(layer) {
+    var layerIdx = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.stamp(layer);
+    var opacityValue = layer.options.opacity;
+    var opacityElement = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get(this._addUID("GPopacityValue_ID_" + layerIdx)); // FIXME ID !
+
+    opacityElement.innerHTML = parseInt(opacityValue * 100, 10) + "%";
+    opacityElement.value = parseInt(opacityValue * 100, 10);
+  },
+  // ################################################################### //
+  // ################## GESTIONNAIRES d'evenements ##################### //
+  // ################################################################### //
+
+  /**
+   * Event 'zoom' on layers visibility
+   *
+   * FIXME contrainte sur l'emprise du layer ?
+   *
+   * @private
+   */
+  _onOutOfRangeLayerZoom: function _onOutOfRangeLayerZoom() {
+    var map = this._map;
+    var layers = this._layers;
+
+    for (var i in layers) {
+      if (layers.hasOwnProperty(i)) {
+        var layer = layers[i].layer;
+        var id = layers[i].id;
+        var div = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get(this._addUID("GPlayerSwitcher_ID_" + id)); // FIXME ID !
+
+        if (layer.options.minZoom > map.getZoom() || layer.options.maxZoom < map.getZoom()) {
+          leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.addClass(div, "outOfRange");
+        } else {
+          leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.removeClass(div, "outOfRange");
+        }
+      }
+    }
+  },
+
+  /**
+   * Event 'click' on layer visibility
+   *
+   * @private
+   * @param {Event} e - MouseEvent
+   */
+  _onVisibilityLayerClick: function _onVisibilityLayerClick(e) {
+    var visibilityElement = e.target.id; // ex GPvisibilityPicto_ID_26
+
+    var visibilityOrder = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_2__["default"].index(visibilityElement); // ex. 26
+    // on met à jour cette interface...
+
+    this._layers[visibilityOrder].visibility = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get(visibilityElement).checked;
+    var layer = this._layers[visibilityOrder].layer;
+
+    this._updateVisibilityLayer(layer);
+  },
+
+  /**
+   * Event 'click' on layer deleted
+   *
+   * @private
+   * @param {Event} e - MouseEvent
+   */
+  _onDropLayerClick: function _onDropLayerClick(e) {
+    var layerElement = e.target.id; // ex GPvisibilityPicto_ID_26
+
+    var layerOrder = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_2__["default"].index(layerElement); // ex. 26
+
+    var layer = this._layers[layerOrder].layer;
+    this.removeLayer(layer);
+  },
+
+  /**
+   * Event 'onchange' on layer opacity
+   *
+   * FIXME appel en dur d'un identifiant CSS !
+   *
+   * @private
+   * @param {Event} e - ChangeEvent
+   */
+  _onChangeLayerOpacity: function _onChangeLayerOpacity(e) {
+    var layerElement = e.target.id; // ex GPvisibilityPicto_ID_26
+
+    var layerOrder = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_2__["default"].index(layerElement); // ex. 26
+
+    var layer = this._layers[layerOrder].layer;
+    var opacityValue = e.target.value;
+    var opacityId = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get(this._addUID("GPopacityValue_ID_" + layerOrder)); // FIXME ID !
+
+    opacityId.innerHTML = opacityValue + "%";
+
+    if (this._map.hasLayer(layer)) {
+      if (typeof layer.setOpacity !== "undefined") {
+        layer.setOpacity(opacityValue / 100);
+      } else {
+        // Particularité du format GeoJSON
+        layer.setStyle({
+          fillOpacity: opacityValue / 100,
+          opacity: opacityValue / 100
+        });
+      }
+    }
+  },
+
+  /**
+   * Event 'click' on opening the information window
+   *
+   * FIXME appel en dur d'un identifiant CSS !
+   *
+   * @private
+   * @param {Event} e - MouseEvent
+   */
+  _onOpenLayerInfoClick: function _onOpenLayerInfoClick(e) {
+    var layerElement = e.target.id; // ex GPvisibilityPicto_ID_26
+
+    var layerOrder = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_2__["default"].index(layerElement); // ex. 26
+
+    var layer = this._layers[layerOrder]; // Close layer info panel
+
+    var divId = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get(e.target.id);
+    var panel = null;
+    var info = null;
+
+    if (divId.className === "GPlayerInfoOpened") {
+      leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.removeClass(divId, "GPlayerInfoOpened");
+      leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.addClass(divId, "GPlayerInfo");
+      panel = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get(this._addUID("GPlayerInfoPanel"));
+      leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.removeClass(panel, "GPpanel");
+      leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.removeClass(panel, "GPlayerInfoPanelOpened");
+      leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.addClass(panel, "GPlayerInfoPanelClosed");
+      info = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get(this._addUID("GPlayerInfoContent"));
+      panel.removeChild(info);
+      return;
+    }
+
+    var layers = document.getElementsByClassName("GPlayerInfoOpened");
+
+    for (var i = 0; i < layers.length; i++) {
+      layers[i].className = "GPlayerInfo";
+    } // Open layer info panel
+
+
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.removeClass(divId, "GPlayerInfo");
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.addClass(divId, "GPlayerInfoOpened");
+    panel = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get(this._addUID("GPlayerInfoPanel"));
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.addClass(panel, "GPpanel");
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.removeClass(panel, "GPlayerInfoPanelClosed");
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.addClass(panel, "GPlayerInfoPanelOpened");
+    info = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get(this._addUID("GPlayerInfoContent"));
+
+    if (info) {
+      panel.removeChild(info);
+    } // on récupére les infos associées au layer pour mettre à jour
+    // dynamiquement le contenu du panel d"infos
+
+
+    var infoLayer = this._createContainerLayerInfoElement(layer);
+
+    panel.appendChild(infoLayer);
+  },
+
+  /**
+   * Event "drag & drop" on move layer
+   *
+   * FIXME appel en dur d'un identifiant CSS !
+   *
+   * @private
+   * @param {Event} e - MouseEvent
+   */
+  _onDragAndDropLayerClick: function _onDragAndDropLayerClick(e) {
+    var layerElement = e.target.id; // ex GPvisibilityPicto_ID_26
+
+    var layerOrder = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_2__["default"].index(layerElement); // ex. 26
+
+    var layer = this._layers[layerOrder];
+    logger.log(layer);
+    var matchesLayers = document.querySelectorAll("div.GPlayerSwitcher_layer");
+    this._lastZIndex = matchesLayers.length;
+
+    for (var i = 0; i < matchesLayers.length; i++) {
+      var tag = matchesLayers[i].id;
+      var order = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_2__["default"].index(tag);
+      var _layer = this._layers[order].layer;
+
+      if (this.options.autoZIndex && _layer.setZIndex) {
+        this._lastZIndex--;
+
+        _layer.setZIndex(this._lastZIndex);
+      }
+    }
+  },
+  // ################################################################### //
+  // ###### METHODES PUBLIQUES (INTERFACE AVEC LE CONTROLE) ############ //
+  // ################################################################### //
+
+  /**
+   * Adding layer configuration to be displayed by the control
+   *
+   * @param {Object} layer - layer to add to layer switcher
+   * @param {Object} config - See {@link module:Controls.LayerSwitcher L.geoportalControl.LayerSwitcher()} for layer display config object definition.
+   */
+  addLayer: function addLayer(layer, config) {
+    var map = this._map;
+    var cfg = this._layersConfig;
+
+    if (!layer) {
+      logger.log("[ERROR] LayerSwitcher:addLayer - missing layer parameter !");
+      return;
+    }
+
+    if (!map.hasLayer(layer)) {
+      logger.log("[WARN] LayerSwitcher:addLayer - layer has not been added on map !");
+      map.addLayer(layer);
+    }
+
+    var id = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.stamp(layer);
+
+    for (var i in cfg) {
+      if (cfg.hasOwnProperty(i)) {
+        // layer already added !
+        if (id === leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.stamp(cfg[i].layer)) {
+          delete cfg[i];
+          break;
+        }
+      }
+    }
+
+    var _config = config || {};
+
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.extend(_config, {
+      layer: layer
+    });
+    cfg.push(_config); // layer déjà configuré, il reprend sa place !
+
+    if (!this._layers[id]) {
+      layer.setZIndex(this._lastZIndex++);
+    }
+
+    this.addOverlay(layer);
+
+    this._update();
+  },
+
+  /**
+   * Set the opacity of a layer, and opacity must be a number from 0 to 1.
+   *
+   * @param {Object} layer - layer into layerswitcher
+   * @param {Number} opacity - 0-1.
+   */
+  setOpacity: function setOpacity(layer, opacity) {
+    logger.trace(layer, opacity);
+
+    if (opacity > 1 || opacity < 0) {
+      return;
+    }
+
+    if (this._map.hasLayer(layer)) {
+      if (typeof layer.setOpacity !== "undefined") {
+        layer.setOpacity(opacity);
+      } else {
+        // Particularité du format GeoJSON pour l'opacité
+        layer.options.opacity = opacity;
+        layer.setStyle({
+          fillOpacity: opacity,
+          opacity: opacity
+        });
+      }
+
+      this._updateOpacityDOMLayer(layer);
+    }
+  },
+
+  /**
+   * Set the visibility of a layer.
+   *
+   * @param {Object} layer - layer into layerswitcher
+   * @param {Object} visibility - true/false.
+   */
+  setVisibility: function setVisibility(layer, visibility) {
+    logger.trace(layer, visibility);
+    this._layers[leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.stamp(layer)].visibility = visibility;
+
+    this._updateVisibilityDOMLayer(layer);
+
+    this._updateVisibilityLayer(layer);
+  }
+});
+/* harmony default export */ __webpack_exports__["default"] = (LayerSwitcher);
+
+/***/ }),
+/* 34 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(35);
+/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(loglevel__WEBPACK_IMPORTED_MODULE_0__);
+
+var LoggerByDefault = {
+  /**
+   *logger statique
+   * @param {String} [name="default"] - the logger name
+   *
+   * @returns {Object} logger
+   */
+  getLogger: function getLogger(name) {
+    // Substitute global constants configured at compile time
+    // cf. webpack.config.js
+    // on masque cette constante afin d'eviter "referenceerror not defined"
+    "false".match(/true/) ? loglevel__WEBPACK_IMPORTED_MODULE_0__["disableAll"]() : loglevel__WEBPACK_IMPORTED_MODULE_0__["enableAll"]();
+    var logname = name || "default";
+    return loglevel__WEBPACK_IMPORTED_MODULE_0__["getLogger"](logname);
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (LoggerByDefault);
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*
+* loglevel - https://github.com/pimterry/loglevel
+*
+* Copyright (c) 2013 Tim Perry
+* Licensed under the MIT license.
+*/
+(function (root, definition) {
+    "use strict";
+    if (true) {
+        !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition),
+				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+				(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
+				__WEBPACK_AMD_DEFINE_FACTORY__),
+				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+    } else {}
+}(this, function () {
+    "use strict";
+
+    // Slightly dubious tricks to cut down minimized file size
+    var noop = function() {};
+    var undefinedType = "undefined";
+    var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (
+        /Trident\/|MSIE /.test(window.navigator.userAgent)
+    );
+
+    var logMethods = [
+        "trace",
+        "debug",
+        "info",
+        "warn",
+        "error"
+    ];
+
+    // Cross-browser bind equivalent that works at least back to IE6
+    function bindMethod(obj, methodName) {
+        var method = obj[methodName];
+        if (typeof method.bind === 'function') {
+            return method.bind(obj);
+        } else {
+            try {
+                return Function.prototype.bind.call(method, obj);
+            } catch (e) {
+                // Missing bind shim or IE8 + Modernizr, fallback to wrapping
+                return function() {
+                    return Function.prototype.apply.apply(method, [obj, arguments]);
+                };
+            }
+        }
+    }
+
+    // Trace() doesn't print the message in IE, so for that case we need to wrap it
+    function traceForIE() {
+        if (console.log) {
+            if (console.log.apply) {
+                console.log.apply(console, arguments);
+            } else {
+                // In old IE, native console methods themselves don't have apply().
+                Function.prototype.apply.apply(console.log, [console, arguments]);
+            }
+        }
+        if (console.trace) console.trace();
+    }
+
+    // Build the best logging method possible for this env
+    // Wherever possible we want to bind, not wrap, to preserve stack traces
+    function realMethod(methodName) {
+        if (methodName === 'debug') {
+            methodName = 'log';
+        }
+
+        if (typeof console === undefinedType) {
+            return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives
+        } else if (methodName === 'trace' && isIE) {
+            return traceForIE;
+        } else if (console[methodName] !== undefined) {
+            return bindMethod(console, methodName);
+        } else if (console.log !== undefined) {
+            return bindMethod(console, 'log');
+        } else {
+            return noop;
+        }
+    }
+
+    // These private functions always need `this` to be set properly
+
+    function replaceLoggingMethods(level, loggerName) {
+        /*jshint validthis:true */
+        for (var i = 0; i < logMethods.length; i++) {
+            var methodName = logMethods[i];
+            this[methodName] = (i < level) ?
+                noop :
+                this.methodFactory(methodName, level, loggerName);
+        }
+
+        // Define log.log as an alias for log.debug
+        this.log = this.debug;
+    }
+
+    // In old IE versions, the console isn't present until you first open it.
+    // We build realMethod() replacements here that regenerate logging methods
+    function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {
+        return function () {
+            if (typeof console !== undefinedType) {
+                replaceLoggingMethods.call(this, level, loggerName);
+                this[methodName].apply(this, arguments);
+            }
+        };
+    }
+
+    // By default, we use closely bound real methods wherever possible, and
+    // otherwise we wait for a console to appear, and then try again.
+    function defaultMethodFactory(methodName, level, loggerName) {
+        /*jshint validthis:true */
+        return realMethod(methodName) ||
+               enableLoggingWhenConsoleArrives.apply(this, arguments);
+    }
+
+    function Logger(name, defaultLevel, factory) {
+      var self = this;
+      var currentLevel;
+
+      var storageKey = "loglevel";
+      if (typeof name === "string") {
+        storageKey += ":" + name;
+      } else if (typeof name === "symbol") {
+        storageKey = undefined;
+      }
+
+      function persistLevelIfPossible(levelNum) {
+          var levelName = (logMethods[levelNum] || 'silent').toUpperCase();
+
+          if (typeof window === undefinedType || !storageKey) return;
+
+          // Use localStorage if available
+          try {
+              window.localStorage[storageKey] = levelName;
+              return;
+          } catch (ignore) {}
+
+          // Use session cookie as fallback
+          try {
+              window.document.cookie =
+                encodeURIComponent(storageKey) + "=" + levelName + ";";
+          } catch (ignore) {}
+      }
+
+      function getPersistedLevel() {
+          var storedLevel;
+
+          if (typeof window === undefinedType || !storageKey) return;
+
+          try {
+              storedLevel = window.localStorage[storageKey];
+          } catch (ignore) {}
+
+          // Fallback to cookies if local storage gives us nothing
+          if (typeof storedLevel === undefinedType) {
+              try {
+                  var cookie = window.document.cookie;
+                  var location = cookie.indexOf(
+                      encodeURIComponent(storageKey) + "=");
+                  if (location !== -1) {
+                      storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];
+                  }
+              } catch (ignore) {}
+          }
+
+          // If the stored level is not valid, treat it as if nothing was stored.
+          if (self.levels[storedLevel] === undefined) {
+              storedLevel = undefined;
+          }
+
+          return storedLevel;
+      }
+
+      /*
+       *
+       * Public logger API - see https://github.com/pimterry/loglevel for details
+       *
+       */
+
+      self.name = name;
+
+      self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3,
+          "ERROR": 4, "SILENT": 5};
+
+      self.methodFactory = factory || defaultMethodFactory;
+
+      self.getLevel = function () {
+          return currentLevel;
+      };
+
+      self.setLevel = function (level, persist) {
+          if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) {
+              level = self.levels[level.toUpperCase()];
+          }
+          if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) {
+              currentLevel = level;
+              if (persist !== false) {  // defaults to true
+                  persistLevelIfPossible(level);
+              }
+              replaceLoggingMethods.call(self, level, name);
+              if (typeof console === undefinedType && level < self.levels.SILENT) {
+                  return "No console available for logging";
+              }
+          } else {
+              throw "log.setLevel() called with invalid level: " + level;
+          }
+      };
+
+      self.setDefaultLevel = function (level) {
+          if (!getPersistedLevel()) {
+              self.setLevel(level, false);
+          }
+      };
+
+      self.enableAll = function(persist) {
+          self.setLevel(self.levels.TRACE, persist);
+      };
+
+      self.disableAll = function(persist) {
+          self.setLevel(self.levels.SILENT, persist);
+      };
+
+      // Initialize with the right level
+      var initialLevel = getPersistedLevel();
+      if (initialLevel == null) {
+          initialLevel = defaultLevel == null ? "WARN" : defaultLevel;
+      }
+      self.setLevel(initialLevel, false);
+    }
+
+    /*
+     *
+     * Top-level API
+     *
+     */
+
+    var defaultLogger = new Logger();
+
+    var _loggersByName = {};
+    defaultLogger.getLogger = function getLogger(name) {
+        if ((typeof name !== "symbol" && typeof name !== "string") || name === "") {
+          throw new TypeError("You must supply a name when creating a logger.");
+        }
+
+        var logger = _loggersByName[name];
+        if (!logger) {
+          logger = _loggersByName[name] = new Logger(
+            name, defaultLogger.getLevel(), defaultLogger.methodFactory);
+        }
+        return logger;
+    };
+
+    // Grab the current global log variable in case of overwrite
+    var _log = (typeof window !== undefinedType) ? window.log : undefined;
+    defaultLogger.noConflict = function() {
+        if (typeof window !== undefinedType &&
+               window.log === defaultLogger) {
+            window.log = _log;
+        }
+
+        return defaultLogger;
+    };
+
+    defaultLogger.getLoggers = function getLoggers() {
+        return _loggersByName;
+    };
+
+    // ES6 default export, for compatibility
+    defaultLogger['default'] = defaultLogger;
+
+    return defaultLogger;
+}));
+
+
+/***/ }),
+/* 36 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/**
+ * formalisme d'un tag ID :
+ * -> NAME(_ORDER)-1460636385836
+ *
+ * Ex.
+ *   GProutePoints-1460636385836
+ *   GProutePoint_10-1460636385836
+ */
+var SelectorID = {
+  /**
+   * Construction d'un identifiant statique basé sur le timestamp,
+   * et qui s'incremente de +1 à chaque appel
+   */
+  generate: function () {
+    var timestamp = Math.floor(Date.now());
+    return function () {
+      return timestamp++;
+    };
+  }(),
+
+  /**
+   * nom du tag
+   * @param {String} id - the id
+   *
+   * @returns {String} index
+   */
+  name: function name(id) {
+    var name = null;
+    var i = id.lastIndexOf("-");
+
+    if (i === -1) {
+      name = id;
+    } else {
+      name = id.substring(0, i);
+    }
+
+    return name;
+  },
+
+  /**
+   * numero d'identifiant du tag
+   * @param {String} id - the id
+   *
+   * @returns {String} index
+   */
+  index: function index(id) {
+    var index = null;
+    var name = this.name(id); // if (name !== id) {
+
+    var i = name.lastIndexOf("_");
+
+    if (i !== -1) {
+      index = name.substring(i + 1);
+    } // }
+
+
+    return index;
+  },
+
+  /**
+   * uuid du tag
+   * @param {String} id - the id
+   *
+   * @returns {String} uuid
+   */
+  uuid: function uuid(id) {
+    var uuid = null;
+    var i = id.lastIndexOf("-");
+
+    if (i !== -1) {
+      uuid = parseInt(id.substring(i + 1), 10);
+    }
+
+    return uuid;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (SelectorID);
+
+/***/ }),
+/* 37 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(38);
+/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(sortablejs__WEBPACK_IMPORTED_MODULE_0__);
+
+var LayerSwitcherDOM = {
+  /**
+   * Creation du drag and drop
+   *
+   * @param {Object} elementDraggable - Element HTML (DOM) Container
+   * @param {Object} context - this
+   */
+  _createDraggableElement: function _createDraggableElement(elementDraggable, context) {
+    sortablejs__WEBPACK_IMPORTED_MODULE_0___default.a.create(elementDraggable, {
+      handle: ".GPlayerName",
+      draggable: ".draggable-layer",
+      ghostClass: "GPghostLayer",
+      animation: 200,
+      // Call event function on drag and drop
+      onEnd: function onEnd(e) {
+        // FIXME pas terrrible, mais il faut bien passer ce contexte...
+        context._onDragAndDropLayerClick(e);
+      }
+    });
+  },
+  // ################################################################### //
+  // ######################### Main container ########################## //
+  // ################################################################### //
+
+  /**
+  * Add uuid to the tag ID
+  * @param {String} id - id selector
+  * @returns {String} uid - id selector with an unique id
+  */
+  _addUID: function _addUID(id) {
+    var uid = this._uid ? id + "-" + this._uid : id;
+    return uid;
+  },
+
+  /**
+   * Creation du container principal (DOM)
+   *
+   * @returns {DOMElement} container - layer switcher DOM element
+   */
+  _createMainContainerElement: function _createMainContainerElement() {
+    var container = document.createElement("div");
+    container.id = this._addUID("GPlayerSwitcher");
+    container.className = "GPwidget";
+    return container;
+  },
+
+  /**
+   * Creation du container principal d"affichage des layers (DOM)
+   *
+   * @returns {DOMElement} input - element for minimizing/maximizing the layer switcher
+   */
+  _createMainLayersShowElement: function _createMainLayersShowElement() {
+    // <!-- Hidden checkbox for minimizing/maximizing -->
+    var input = document.createElement("input");
+    input.id = this._addUID("GPshowLayersList");
+    input.type = "checkbox";
+    return input;
+  },
+
+  /**
+   * Creation du container principal des layers (DOM)
+   *
+   * @returns {DOMElement} container - layers list container
+   */
+  _createMainLayersElement: function _createMainLayersElement() {
+    // ajout de la liste des layers dans le container principal
+    // <div id="GPlayersList" class="GPpanel">
+    //   (...)
+    // </div>
+    var div = document.createElement("div");
+    div.id = this._addUID("GPlayersList");
+    div.className = "GPpanel";
+    return div;
+  },
+
+  /**
+   * Creation du container du picto du controle (DOM)
+   *
+   * @returns {DOMElement} label
+   */
+  _createMainPictoElement: function _createMainPictoElement() {
+    var self = this; // exemple :
+    // <!-- Label for minimizing/maximizing -->
+    // <label id="GPshowLayersListPicto" class="GPshowAdvancedToolPicto" for="GPshowLayersList" title="Afficher/masquer le gestionnaire de couches">
+    //    <span id="GPshowLayersListOpen" class="GPshowAdvancedToolOpen"></span><span id="GPshowLayersListClose"></span>
+    // </label>
+
+    var label = document.createElement("label");
+    label.id = this._addUID("GPshowLayersListPicto");
+    label.className = "GPshowAdvancedToolPicto";
+    label.htmlFor = this._addUID("GPshowLayersList");
+    label.title = "Afficher/masquer le gestionnaire de couches";
+    var spanOpen = document.createElement("span");
+    spanOpen.id = this._addUID("GPshowLayersListOpen");
+    spanOpen.className = "GPshowAdvancedToolOpen";
+    spanOpen.addEventListener("click", function () {
+      if (document.getElementById(self._addUID("GPshowLayersList")).checked) {
+        var layers = document.getElementsByClassName("GPlayerInfoOpened");
+
+        for (var i = 0; i < layers.length; i++) {
+          layers[i].className = "GPlayerInfo";
+        }
+
+        document.getElementById(self._addUID("GPlayerInfoPanel")).className = "GPlayerInfoPanelClosed";
+      }
+    });
+    label.appendChild(spanOpen);
+    var spanClose = document.createElement("span");
+    spanClose.addEventListener("click", function () {
+      if (document.getElementById(self._addUID("GPshowLayersList")).checked) {
+        var layers = document.getElementsByClassName("GPlayerInfoOpened");
+
+        for (var i = 0; i < layers.length; i++) {
+          layers[i].className = "GPlayerInfo";
+        }
+
+        document.getElementById(self._addUID("GPlayerInfoPanel")).className = "GPlayerInfoPanelClosed";
+      }
+    });
+    spanClose.id = self._addUID("GPshowLayersListClose");
+    label.appendChild(spanClose);
+    return label;
+  },
+
+  /**
+   * Creation du container du panneau d"information (DOM)
+   *
+   * @returns {DOMElement} container
+   */
+  _createMainInfoElement: function _createMainInfoElement() {
+    // gestion du panneau d"information dans le container principal
+    // <div id="GPlayerInfoPanel" class="GPlayerInfoPanelClosed">...</div>
+    var div = document.createElement("div");
+    div.id = this._addUID("GPlayerInfoPanel");
+    div.className = "GPpanel GPlayerInfoPanelClosed";
+    return div;
+  },
+  // ################################################################### //
+  // ######################### Layer container ######################### //
+  // ################################################################### //
+
+  /**
+   * Creation du container du layer (DOM)
+   *
+   * @param {Object} obj - options de la couche à ajouter dans le layer switcher
+   * @param {Object} obj.layer - couche (ol ou leaflet)
+   * @param {String} obj.id - identifiant de la couche (pour ol ou leaflet)
+   * @param {String} obj.title - nom de la couche à afficher dans le controle
+   * @param {String} obj.description - description de la couche à afficher
+   * @param {Boolean} obj.visibility - visibilité de la couche dans la carte (true or false)
+   * @param {Float} obj.opacity - opacité de la couche
+   *
+   * @returns {DOMElement} container
+   */
+  _createContainerLayerElement: function _createContainerLayerElement(obj) {
+    // exemple :
+    // <div id="GPlayerSwitcher_ID_Layer1" class="GPlayerSwitcher_layer outOfRange">
+    //     <!-- Basic toolbar : visibility / layer name
+    //     _createBasicToolElement
+    //           _createBasicToolVisibilityElement
+    //           _createBasicToolNameElement
+    //     -->
+    //     <!-- Hidden checkbox + label for showing advanced toolbar
+    //     _createAdvancedToolShowElement
+    //     -->
+    //     <!-- Advanced toolbar : layer info / opacity slider / opacity value / removal
+    //     _createAdvancedToolElement
+    //           _createAdvancedToolDeleteElement
+    //           _createAdvancedToolInformationElement
+    //           _createAdvancedToolOpacityElement
+    //     -->
+    // </div>
+    // <!-- Layer entry in layer list -->
+    // <!-- Every item is marked with layerID, which is defined at layer import -->
+    var container = document.createElement("div");
+    container.id = this._addUID("GPlayerSwitcher_ID_" + obj.id);
+    container.className = "GPlayerSwitcher_layer draggable-layer"; // ajout des outils basiques (visibility / layer name)
+
+    container.appendChild(this._createBasicToolElement(obj)); // liste des outils avancés (layer info / opacity slider / opacity value / removal)
+
+    var array = this._createAdvancedToolShowElement(obj);
+
+    for (var i = 0; i < array.length; i++) {
+      container.appendChild(array[i]);
+    } // ajout des outils avancés
+
+
+    container.appendChild(this._createAdvancedToolElement(obj));
+    return container;
+  },
+  // ################################################################### //
+  // ############################ Layer tool ########################### //
+  // ################################################################### //
+
+  /**
+   * Creation du container des outils basiques du layer (DOM)
+   *
+   * @param {Object} obj - options de la couche à ajouter dans le layer switcher
+   *
+   * @returns {DOMElement} container
+   */
+  _createBasicToolElement: function _createBasicToolElement(obj) {
+    // exemple :
+    // <div id="GPbasicTools_ID_1" class="GPlayerBasicTools">
+    //      <!-- _createBasicToolVisibilityElement -->
+    //      <!-- _createBasicToolNameElement -->
+    // </div>
+    var div = document.createElement("div");
+    div.id = this._addUID("GPbasicTools_ID_" + obj.id);
+    div.className = "GPlayerBasicTools";
+    div.appendChild(this._createBasicToolNameElement(obj));
+
+    var array = this._createBasicToolVisibilityElement(obj);
+
+    for (var i = 0; i < array.length; i++) {
+      div.appendChild(array[i]);
+    }
+
+    return div;
+  },
+
+  /**
+   * Creation du nom du layer (DOM)
+   *
+   * @param {Object} obj - options de la couche à ajouter dans le layer switcher
+   *
+   * @returns {DOMElement} container
+   */
+  _createBasicToolNameElement: function _createBasicToolNameElement(obj) {
+    // exemple :
+    // <span id="GPname_ID_Layer1" class="GPlayerName" title="Quartiers prioritaires de la ville">Quartiers prioritaires de la ville</span>
+    var span = document.createElement("span");
+    span.id = this._addUID("GPname_ID_" + obj.id);
+    span.className = "GPlayerName";
+    span.title = obj.description || obj.title;
+    span.innerHTML = obj.title;
+    return span;
+  },
+
+  /**
+   * Creation de l'icone de visibilité du layer (DOM)
+   *
+   * @param {Object} obj - options de la couche à ajouter dans le layer switcher
+    * @returns {DOMElement[]} array containing input and label elements
+   */
+  _createBasicToolVisibilityElement: function _createBasicToolVisibilityElement(obj) {
+    // exemple :
+    // <input type="checkbox" id="GPvisibility_ID_Layer1" checked="">
+    // <label for="GPvisibility_ID_Layer1" id="GPvisibilityPicto_ID_Layer1" class="GPlayerVisibility" title="Afficher/masquer la couche"></label>
+    var list = [];
+    var checked = typeof obj.visibility !== "undefined" ? obj.visibility : true;
+
+    var id = this._addUID("GPvisibility_ID_" + obj.id);
+
+    var input = document.createElement("input");
+    input.id = id;
+    input.type = "checkbox";
+    input.checked = checked;
+    var label = document.createElement("label");
+    label.htmlFor = id;
+    label.id = this._addUID("GPvisibilityPicto_ID_" + obj.id);
+    label.className = "GPlayerVisibility";
+    label.title = "Afficher/masquer la couche"; // add event for visibility change
+
+    var context = this;
+
+    if (input.addEventListener) {
+      input.addEventListener("click", function (e) {
+        context._onVisibilityLayerClick(e);
+      });
+    } else if (input.attachEvent) {
+      // internet explorer
+      input.attachEvent("onclick", function (e) {
+        context._onVisibilityLayerClick(e);
+      });
+    }
+
+    list.push(input);
+    list.push(label);
+    return list;
+  },
+
+  /**
+   * Creation de l'affichage du menu des outils avancés du layer (DOM)
+   *
+   * @param {Object} obj - options de la couche à ajouter dans le layer switcher
+   *
+   * @returns {DOMElement[]} array containing input and label elements
+   */
+  _createAdvancedToolShowElement: function _createAdvancedToolShowElement(obj) {
+    // <input type="checkbox" id="GPshowAdvancedTools_ID_Layer1">
+    // <label for="GPshowAdvancedTools_ID_Layer1" id="GPshowAdvancedToolsPicto_ID_Layer1" class="GPshowMoreOptions GPshowLayerAdvancedTools" title="Plus d'outils"></label>
+    var list = [];
+    var label = document.createElement("label");
+    label.id = this._addUID("GPshowAdvancedToolsPicto_ID_" + obj.id);
+    label.htmlFor = this._addUID("GPshowAdvancedTools_ID_" + obj.id);
+    label.title = "Plus d'outils";
+    label.className = "GPshowMoreOptions GPshowLayerAdvancedTools";
+    var input = document.createElement("input");
+    input.type = "checkbox";
+    input.id = this._addUID("GPshowAdvancedTools_ID_" + obj.id);
+    list.push(input);
+    list.push(label);
+    return list;
+  },
+
+  /**
+   * Creation du container des outils avancés du layer (DOM)
+   *
+   * @param {Object} obj - options de la couche à ajouter dans le layer switcher
+   *
+   * @returns {DOMElement} container
+   */
+  _createAdvancedToolElement: function _createAdvancedToolElement(obj) {
+    // exemple :
+    // <div id="GPadvancedTools_ID_Layer1" class="GPlayerAdvancedTools">
+    //     <!-- _createAdvancedToolDeleteElement -->
+    //     <!-- _createAdvancedToolInformationElement -->
+    //     <!-- _createAdvancedToolOpacityElement -->
+    // </div>
+    var container = document.createElement("div");
+    container.id = this._addUID("GPadvancedTools_ID_" + obj.id);
+    container.className = "GPlayerAdvancedTools";
+    container.appendChild(this._createAdvancedToolDeleteElement(obj)); // si on n'a de l'informations à afficher, on met en place ce composant
+
+    if (obj.title && obj.description) {
+      container.appendChild(this._createAdvancedToolInformationElement(obj));
+    }
+
+    if (obj.type !== "feature") {
+      var array = this._createAdvancedToolOpacityElement(obj);
+
+      for (var i = 0; i < array.length; i++) {
+        container.appendChild(array[i]);
+      }
+    }
+
+    return container;
+  },
+
+  /**
+   * Creation de l'icone de suppression du layer (DOM)
+   *
+   * @param {Object} obj - options de la couche à ajouter dans le layer switcher
+   *
+   * @returns {DOMElement} container
+   */
+  _createAdvancedToolDeleteElement: function _createAdvancedToolDeleteElement(obj) {
+    // exemple :
+    // <div id="GPremove_ID_Layer1" class="GPlayerRemove" title="Supprimer la couche" onclick="GPdropLayer(this);"></div>
+    var div = document.createElement("div");
+    div.id = this._addUID("GPremove_ID_" + obj.id);
+    div.className = "GPlayerRemove";
+    div.title = "Supprimer la couche";
+    div.layerId = obj.id;
+    var context = this;
+
+    if (div.addEventListener) {
+      div.addEventListener("click", function (e) {
+        context._onDropLayerClick(e);
+      });
+    } else if (div.attachEvent) {
+      // internet explorer
+      div.attachEvent("onclick", function (e) {
+        context._onDropLayerClick(e);
+      });
+    }
+
+    return div;
+  },
+
+  /**
+   * Creation de l'icone d'information du layer (DOM)
+   *
+   * @param {Object} obj - options de la couche à ajouter dans le layer switcher
+   *
+   * @returns {DOMElement} container
+   */
+  _createAdvancedToolInformationElement: function _createAdvancedToolInformationElement(obj) {
+    // exemple :
+    // <div id="GPinfo_ID_Layer1" class="GPlayerInfo" title="Informations/légende" onclick="GPopenLayerInfo(this);"></div>
+    var div = document.createElement("div");
+    div.id = this._addUID("GPinfo_ID_" + obj.id);
+    div.className = "GPlayerInfo";
+    div.title = "Informations/légende";
+    div.layerId = obj.id; // add event on click
+
+    var context = this;
+
+    if (div.addEventListener) {
+      div.addEventListener("click", function (e) {
+        context._onOpenLayerInfoClick(e);
+      });
+    } else if (div.attachEvent) {
+      // internet explorer
+      div.attachEvent("onclick", function (e) {
+        context._onOpenLayerInfoClick(e);
+      });
+    }
+
+    return div;
+  },
+
+  /**
+   * Creation de l'icone de gestion de l'opacité du layer (DOM)
+   *
+   * @param {Object} obj - options de la couche à ajouter dans le layer switcher
+   *
+   * @returns {DOMElement[]} array of two containers
+   */
+  _createAdvancedToolOpacityElement: function _createAdvancedToolOpacityElement(obj) {
+    // exemple :
+    // <div id="GPopacity_ID_Layer1" class="GPlayerOpacity" title="Opacité">
+    //   <input id="GPopacityRange_ID_Layer1" type="range" value="100" oninput="GPchangeLayerOpacity(this);" onchange="GPchangeLayerOpacity(this);">
+    // </div>
+    // <div class="GPlayerOpacityValue" id="GPopacityValueDiv_ID_Layer1">
+    //   <span id="GPopacityValue_ID_Layer1">100</span>
+    //   %
+    // </div>
+    var list = []; // curseur pour changer l'opacité
+
+    var divO = document.createElement("div");
+    divO.id = this._addUID("GPopacity_ID_" + obj.id);
+    divO.className = "GPlayerOpacity";
+    divO.title = "Opacité";
+    var opacity = typeof obj.opacity !== "undefined" ? obj.opacity : 1;
+    opacity = Math.round(opacity * 100);
+    var input = document.createElement("input");
+    input.id = this._addUID("GPopacityValueDiv_ID_" + obj.id);
+    input.type = "range";
+    input.value = opacity; // add event for opacity change
+
+    var context = this;
+
+    if (input.addEventListener) {
+      input.addEventListener("change", function (e) {
+        context._onChangeLayerOpacity(e);
+      });
+    } else if (input.attachEvent) {
+      // internet explorer
+      input.attachEvent("onchange", function (e) {
+        context._onChangeLayerOpacity(e);
+      });
+    }
+
+    if (input.addEventListener) {
+      input.addEventListener("input", function (e) {
+        context._onChangeLayerOpacity(e);
+      });
+    } else if (input.attachEvent) {
+      // internet explorer
+      input.attachEvent("oninput", function (e) {
+        context._onChangeLayerOpacity(e);
+      });
+    }
+
+    divO.appendChild(input); // Valeur d'opacité
+
+    var divC = document.createElement("div");
+    divC.id = this._addUID("GPopacityValueDiv_ID_" + obj.id);
+    divC.className = "GPlayerOpacityValue";
+    var span = document.createElement("span");
+    span.id = this._addUID("GPopacityValue_ID_" + obj.id);
+    span.innerHTML = opacity + "%";
+    divC.appendChild(span);
+    list.push(divO);
+    list.push(divC);
+    return list;
+  },
+  // ################################################################### //
+  // ############################ Layer info ########################### //
+  // ################################################################### //
+
+  /**
+   * Creation du container du layer info (DOM)
+   *
+   * TODO GPlayerInfoPopup : ???
+   * TODO GPlayerInfoLink  : mettre en forme les échelles !
+   *
+   * @param {Object} obj - options de la couche à ajouter dans le layer switcher
+   *
+   * @returns {DOMElement} container
+   */
+  _createContainerLayerInfoElement: function _createContainerLayerInfoElement(obj) {
+    var container = document.createElement("div");
+    container.id = this._addUID("GPlayerInfoContent");
+    var title = document.createElement("div");
+    title.id = this._addUID("GPlayerInfoTitle");
+    title.innerHTML = obj.title;
+    container.appendChild(title);
+
+    if (obj.quicklookUrl) {
+      var quick = document.createElement("div");
+      quick.id = this._addUID("GPlayerInfoQuicklook");
+      quick.title = "Afficher un aperçu de la couche";
+      var refquick = document.createElement("a");
+      refquick.href = obj.quicklookUrl;
+      refquick.appendChild(quick);
+      container.appendChild(refquick);
+    }
+
+    var close = document.createElement("div");
+    close.id = this._addUID("GPlayerInfoClose");
+    close.title = "Fermer la fenêtre";
+    var self = this;
+    /** Call event function on close click */
+
+    var onCloseClick = function onCloseClick() {
+      document.getElementById(self._addUID("GPlayerInfoPanel")).className = "GPlayerInfoPanelClosed";
+      var layers = document.getElementsByClassName("GPlayerInfoOpened");
+
+      for (var i = 0; i < layers.length; i++) {
+        layers[i].className = "GPlayerInfo";
+      }
+    };
+
+    if (close.addEventListener) {
+      close.addEventListener("click", onCloseClick);
+    } else if (close.attachEvent) {
+      // internet explorer
+      close.attachEvent("onclick", onCloseClick);
+    }
+
+    container.appendChild(close);
+    var desc = document.createElement("div");
+    desc.id = this._addUID("GPlayerInfoDescription");
+    desc.innerHTML = obj.description;
+    container.appendChild(desc);
+
+    if (obj.metadata) {
+      var mtd = document.createElement("div");
+      mtd.id = this._addUID("GPlayerInfoMetadata");
+      var mtdtitle = document.createElement("div");
+      mtdtitle.className = "GPlayerInfoSubtitle";
+      mtdtitle.innerHTML = "Métadonnées";
+      mtd.appendChild(mtdtitle);
+
+      for (var i = 0; i < obj.metadata.length; i++) {
+        var urlmtd = obj.metadata[i].url;
+        var mtdlink = document.createElement("div");
+        mtdlink.className = "GPlayerInfoLink";
+        var refmtd = document.createElement("a");
+        refmtd.href = urlmtd;
+        refmtd.innerHTML = urlmtd;
+        mtdlink.appendChild(refmtd);
+        mtd.appendChild(mtdlink);
+      }
+
+      if (obj.metadata.length !== 0) {
+        container.appendChild(mtd);
+      }
+    }
+
+    if (obj.legends) {
+      var lgd = document.createElement("div");
+      lgd.id = this._addUID("GPlayerInfoLegend");
+      var lgdtitle = document.createElement("div");
+      lgdtitle.className = "GPlayerInfoSubtitle";
+      lgdtitle.innerHTML = "Légende";
+      lgd.appendChild(lgdtitle);
+      var legends = {};
+      var maxScale = obj.maxScaleDenominator || 560000000; // on crée un tableau temporaire pour ordonner les légendes selon le dénominateur d'échelle
+
+      for (var k = 0; k < obj.legends.length; k++) {
+        var minScale = obj.legends[k].minScaleDenominator;
+
+        if (minScale) {
+          var s = minScale.toString();
+          minScale = Math.round(parseInt(s.substring(0, 3), 10) / 10) * Math.pow(10, s.length - 2);
+        } else {
+          minScale = 270;
+        }
+
+        legends[minScale] = obj.legends[k];
+      }
+
+      for (var scale in legends) {
+        if (legends.hasOwnProperty(scale)) {
+          var urllgd = legends[scale].url; // on n'affiche pas les légendes pointant vers "nolegend.jpg"
+
+          if (typeof urllgd === "string" && urllgd.toLowerCase().indexOf("nolegend.jpg") === -1) {
+            // TODO GPlayerInfoPopup
+            var lgdlink = document.createElement("div");
+            lgdlink.className = "GPlayerInfoLink";
+            maxScale = legends[scale].maxScaleDenominator || maxScale;
+            var reflgd = document.createElement("a");
+            reflgd.href = urllgd;
+            reflgd.innerHTML = "Du 1/" + scale + " au 1/" + maxScale;
+            lgdlink.appendChild(reflgd);
+            lgd.appendChild(lgdlink);
+          } else {
+            delete legends[scale];
+          }
+        }
+      }
+
+      if (Object.keys(legends).length !== 0) {
+        container.appendChild(lgd);
+      }
+    }
+
+    return container;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (LayerSwitcherDOM);
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**!
+ * Sortable
+ * @author	RubaXa   <trash@rubaxa.org>
+ * @author	owenm    <owen23355@gmail.com>
+ * @license MIT
+ */
+
+(function sortableModule(factory) {
+	"use strict";
+
+	if (true) {
+		!(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+				(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
+				__WEBPACK_AMD_DEFINE_FACTORY__),
+				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+	}
+	else {}
+})(function sortableFactory() {
+	"use strict";
+
+	if (typeof window === "undefined" || !window.document) {
+		return function sortableError() {
+			throw new Error("Sortable.js requires a window with a document");
+		};
+	}
+
+	var dragEl,
+		parentEl,
+		ghostEl,
+		cloneEl,
+		rootEl,
+		nextEl,
+		lastDownEl,
+
+		scrollEl,
+		scrollParentEl,
+		scrollCustomFn,
+
+		oldIndex,
+		newIndex,
+
+		activeGroup,
+		putSortable,
+
+		autoScrolls = [],
+		scrolling = false,
+
+		awaitingDragStarted = false,
+		ignoreNextClick = false,
+		sortables = [],
+
+		pointerElemChangedInterval,
+		lastPointerElemX,
+		lastPointerElemY,
+
+		tapEvt,
+		touchEvt,
+
+		moved,
+
+
+		lastTarget,
+		lastDirection,
+		pastFirstInvertThresh = false,
+		isCircumstantialInvert = false,
+		lastMode, // 'swap' or 'insert'
+
+		targetMoveDistance,
+
+		// For positioning ghost absolutely
+		ghostRelativeParent,
+		ghostRelativeParentInitialScroll = [], // (left, top)
+
+
+		forRepaintDummy,
+		realDragElRect, // dragEl rect after current animation
+
+		/** @const */
+		R_SPACE = /\s+/g,
+
+		expando = 'Sortable' + (new Date).getTime(),
+
+		win = window,
+		document = win.document,
+		parseInt = win.parseInt,
+		setTimeout = win.setTimeout,
+
+		$ = win.jQuery || win.Zepto,
+		Polymer = win.Polymer,
+
+		captureMode = {
+			capture: false,
+			passive: false
+		},
+
+		IE11OrLess = !!navigator.userAgent.match(/(?:Trident.*rv[ :]?11\.|msie|iemobile)/i),
+		Edge = !!navigator.userAgent.match(/Edge/i),
+		FireFox = !!navigator.userAgent.match(/firefox/i),
+		Safari = !!(navigator.userAgent.match(/safari/i) && !navigator.userAgent.match(/chrome/i) && !navigator.userAgent.match(/android/i)),
+		IOS = !!(navigator.userAgent.match(/iP(ad|od|hone)/i)),
+
+		PositionGhostAbsolutely = IOS,
+
+		CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',
+
+		// This will not pass for IE9, because IE9 DnD only works on anchors
+		supportDraggable = ('draggable' in document.createElement('div')),
+
+		supportCssPointerEvents = (function() {
+			// false when <= IE11
+			if (IE11OrLess) {
+				return false;
+			}
+			var el = document.createElement('x');
+			el.style.cssText = 'pointer-events:auto';
+			return el.style.pointerEvents === 'auto';
+		})(),
+
+		_silent = false,
+		_alignedSilent = false,
+
+		abs = Math.abs,
+		min = Math.min,
+		max = Math.max,
+
+		savedInputChecked = [],
+
+		_detectDirection = function(el, options) {
+			var elCSS = _css(el),
+				elWidth = parseInt(elCSS.width)
+					- parseInt(elCSS.paddingLeft)
+					- parseInt(elCSS.paddingRight)
+					- parseInt(elCSS.borderLeftWidth)
+					- parseInt(elCSS.borderRightWidth),
+				child1 = _getChild(el, 0, options),
+				child2 = _getChild(el, 1, options),
+				firstChildCSS = child1 && _css(child1),
+				secondChildCSS = child2 && _css(child2),
+				firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + _getRect(child1).width,
+				secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + _getRect(child2).width;
+
+			if (elCSS.display === 'flex') {
+				return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse'
+				? 'vertical' : 'horizontal';
+			}
+
+			if (elCSS.display === 'grid') {
+				return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';
+			}
+
+			if (child1 && firstChildCSS.float !== 'none') {
+				var touchingSideChild2 = firstChildCSS.float === 'left' ? 'left' : 'right';
+
+				return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ?
+					'vertical' : 'horizontal';
+			}
+
+			return (child1 &&
+				(
+					firstChildCSS.display === 'block' ||
+					firstChildCSS.display === 'flex' ||
+					firstChildCSS.display === 'table' ||
+					firstChildCSS.display === 'grid' ||
+					firstChildWidth >= elWidth &&
+					elCSS[CSSFloatProperty] === 'none' ||
+					child2 &&
+					elCSS[CSSFloatProperty] === 'none' &&
+					firstChildWidth + secondChildWidth > elWidth
+				) ?
+				'vertical' : 'horizontal'
+			);
+		},
+
+		/**
+		 * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.
+		 * @param  {Number} x      X position
+		 * @param  {Number} y      Y position
+		 * @return {HTMLElement}   Element of the first found nearest Sortable
+		 */
+		_detectNearestEmptySortable = function(x, y) {
+			for (var i = 0; i < sortables.length; i++) {
+				if (_lastChild(sortables[i])) continue;
+
+				var rect = _getRect(sortables[i]),
+					threshold = sortables[i][expando].options.emptyInsertThreshold,
+					insideHorizontally = x >= (rect.left - threshold) && x <= (rect.right + threshold),
+					insideVertically = y >= (rect.top - threshold) && y <= (rect.bottom + threshold);
+
+				if (insideHorizontally && insideVertically) {
+					return sortables[i];
+				}
+			}
+		},
+
+		_isClientInRowColumn = function(x, y, el, axis, options) {
+			var targetRect = _getRect(el),
+				targetS1Opp = axis === 'vertical' ? targetRect.left : targetRect.top,
+				targetS2Opp = axis === 'vertical' ? targetRect.right : targetRect.bottom,
+				mouseOnOppAxis = axis === 'vertical' ? x : y;
+
+			return targetS1Opp < mouseOnOppAxis && mouseOnOppAxis < targetS2Opp;
+		},
+
+		_isElInRowColumn = function(el1, el2, axis) {
+			var el1Rect = el1 === dragEl && realDragElRect || _getRect(el1),
+				el2Rect = el2 === dragEl && realDragElRect || _getRect(el2),
+				el1S1Opp = axis === 'vertical' ? el1Rect.left : el1Rect.top,
+				el1S2Opp = axis === 'vertical' ? el1Rect.right : el1Rect.bottom,
+				el1OppLength = axis === 'vertical' ? el1Rect.width : el1Rect.height,
+				el2S1Opp = axis === 'vertical' ? el2Rect.left : el2Rect.top,
+				el2S2Opp = axis === 'vertical' ? el2Rect.right : el2Rect.bottom,
+				el2OppLength = axis === 'vertical' ? el2Rect.width : el2Rect.height;
+
+			return (
+				el1S1Opp === el2S1Opp ||
+				el1S2Opp === el2S2Opp ||
+				(el1S1Opp + el1OppLength / 2) === (el2S1Opp + el2OppLength / 2)
+			);
+		},
+
+		_getParentAutoScrollElement = function(el, includeSelf) {
+			// skip to window
+			if (!el || !el.getBoundingClientRect) return _getWindowScrollingElement();
+
+			var elem = el;
+			var gotSelf = false;
+			do {
+				// we don't need to get elem css if it isn't even overflowing in the first place (performance)
+				if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {
+					var elemCSS = _css(elem);
+					if (
+						elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') ||
+						elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')
+					) {
+						if (!elem || !elem.getBoundingClientRect || elem === document.body) return _getWindowScrollingElement();
+
+						if (gotSelf || includeSelf) return elem;
+						gotSelf = true;
+					}
+				}
+			/* jshint boss:true */
+			} while (elem = elem.parentNode);
+
+			return _getWindowScrollingElement();
+		},
+
+		_getWindowScrollingElement = function() {
+			if (IE11OrLess) {
+				return document.documentElement;
+			} else {
+				return document.scrollingElement;
+			}
+		},
+
+		_scrollBy = function(el, x, y) {
+			el.scrollLeft += x;
+			el.scrollTop += y;
+		},
+
+		_autoScroll = _throttle(function (/**Event*/evt, /**Object*/options, /**HTMLElement*/rootEl, /**Boolean*/isFallback) {
+			// Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
+			if (options.scroll) {
+				var _this = rootEl ? rootEl[expando] : window,
+					sens = options.scrollSensitivity,
+					speed = options.scrollSpeed,
+
+					x = evt.clientX,
+					y = evt.clientY,
+
+					winScroller = _getWindowScrollingElement(),
+
+					scrollThisInstance = false;
+
+				// Detect scrollEl
+				if (scrollParentEl !== rootEl) {
+					_clearAutoScrolls();
+
+					scrollEl = options.scroll;
+					scrollCustomFn = options.scrollFn;
+
+					if (scrollEl === true) {
+						scrollEl = _getParentAutoScrollElement(rootEl, true);
+						scrollParentEl = scrollEl;
+					}
+				}
+
+
+				var layersOut = 0;
+				var currentParent = scrollEl;
+				do {
+					var	el = currentParent,
+						rect = _getRect(el),
+
+						top = rect.top,
+						bottom = rect.bottom,
+						left = rect.left,
+						right = rect.right,
+
+						width = rect.width,
+						height = rect.height,
+
+						scrollWidth,
+						scrollHeight,
+
+						css,
+
+						vx,
+						vy,
+
+						canScrollX,
+						canScrollY,
+
+						scrollPosX,
+						scrollPosY;
+
+
+					scrollWidth = el.scrollWidth;
+					scrollHeight = el.scrollHeight;
+
+					css = _css(el);
+
+					scrollPosX = el.scrollLeft;
+					scrollPosY = el.scrollTop;
+
+					if (el === winScroller) {
+						canScrollX = width < scrollWidth && (css.overflowX === 'auto' || css.overflowX === 'scroll' || css.overflowX === 'visible');
+						canScrollY = height < scrollHeight && (css.overflowY === 'auto' || css.overflowY === 'scroll' || css.overflowY === 'visible');
+					} else {
+						canScrollX = width < scrollWidth && (css.overflowX === 'auto' || css.overflowX === 'scroll');
+						canScrollY = height < scrollHeight && (css.overflowY === 'auto' || css.overflowY === 'scroll');
+					}
+
+					vx = canScrollX && (abs(right - x) <= sens && (scrollPosX + width) < scrollWidth) - (abs(left - x) <= sens && !!scrollPosX);
+
+					vy = canScrollY && (abs(bottom - y) <= sens && (scrollPosY + height) < scrollHeight) - (abs(top - y) <= sens && !!scrollPosY);
+
+
+					if (!autoScrolls[layersOut]) {
+						for (var i = 0; i <= layersOut; i++) {
+							if (!autoScrolls[i]) {
+								autoScrolls[i] = {};
+							}
+						}
+					}
+
+					if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {
+						autoScrolls[layersOut].el = el;
+						autoScrolls[layersOut].vx = vx;
+						autoScrolls[layersOut].vy = vy;
+
+						clearInterval(autoScrolls[layersOut].pid);
+
+						if (el && (vx != 0 || vy != 0)) {
+							scrollThisInstance = true;
+							/* jshint loopfunc:true */
+							autoScrolls[layersOut].pid = setInterval((function () {
+								// emulate drag over during autoscroll (fallback), emulating native DnD behaviour
+								if (isFallback && this.layer === 0) {
+									Sortable.active._emulateDragOver(true);
+									Sortable.active._onTouchMove(touchEvt, true);
+								}
+								var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;
+								var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;
+
+								if ('function' === typeof(scrollCustomFn)) {
+									if (scrollCustomFn.call(_this, scrollOffsetX, scrollOffsetY, evt, touchEvt, autoScrolls[this.layer].el) !== 'continue') {
+										return;
+									}
+								}
+
+								_scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);
+							}).bind({layer: layersOut}), 24);
+						}
+					}
+					layersOut++;
+				} while (options.bubbleScroll && currentParent !== winScroller && (currentParent = _getParentAutoScrollElement(currentParent, false)));
+				scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not
+			}
+		}, 30),
+
+		_clearAutoScrolls = function () {
+			autoScrolls.forEach(function(autoScroll) {
+				clearInterval(autoScroll.pid);
+			});
+			autoScrolls = [];
+		},
+
+		_prepareGroup = function (options) {
+			function toFn(value, pull) {
+				return function(to, from, dragEl, evt) {
+					var sameGroup = to.options.group.name &&
+									from.options.group.name &&
+									to.options.group.name === from.options.group.name;
+
+					if (value == null && (pull || sameGroup)) {
+						// Default pull value
+						// Default pull and put value if same group
+						return true;
+					} else if (value == null || value === false) {
+						return false;
+					} else if (pull && value === 'clone') {
+						return value;
+					} else if (typeof value === 'function') {
+						return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);
+					} else {
+						var otherGroup = (pull ? to : from).options.group.name;
+
+						return (value === true ||
+						(typeof value === 'string' && value === otherGroup) ||
+						(value.join && value.indexOf(otherGroup) > -1));
+					}
+				};
+			}
+
+			var group = {};
+			var originalGroup = options.group;
+
+			if (!originalGroup || typeof originalGroup != 'object') {
+				originalGroup = {name: originalGroup};
+			}
+
+			group.name = originalGroup.name;
+			group.checkPull = toFn(originalGroup.pull, true);
+			group.checkPut = toFn(originalGroup.put);
+			group.revertClone = originalGroup.revertClone;
+
+			options.group = group;
+		},
+
+		_checkAlignment = function(evt) {
+			if (!dragEl || !dragEl.parentNode) return;
+			dragEl.parentNode[expando] && dragEl.parentNode[expando]._computeIsAligned(evt);
+		},
+
+		_isTrueParentSortable = function(el, target) {
+			var trueParent = target;
+			while (!trueParent[expando]) {
+				trueParent = trueParent.parentNode;
+			}
+
+			return el === trueParent;
+		},
+
+		_artificalBubble = function(sortable, originalEvt, method) {
+			// Artificial IE bubbling
+			var nextParent = sortable.parentNode;
+			while (nextParent && !nextParent[expando]) {
+				nextParent = nextParent.parentNode;
+			}
+
+			if (nextParent) {
+				nextParent[expando][method](_extend(originalEvt, {
+					artificialBubble: true
+				}));
+			}
+		},
+
+		_hideGhostForTarget = function() {
+			if (!supportCssPointerEvents && ghostEl) {
+				_css(ghostEl, 'display', 'none');
+			}
+		},
+
+		_unhideGhostForTarget = function() {
+			if (!supportCssPointerEvents && ghostEl) {
+				_css(ghostEl, 'display', '');
+			}
+		};
+
+
+	// #1184 fix - Prevent click event on fallback if dragged but item not changed position
+	document.addEventListener('click', function(evt) {
+		if (ignoreNextClick) {
+			evt.preventDefault();
+			evt.stopPropagation && evt.stopPropagation();
+			evt.stopImmediatePropagation && evt.stopImmediatePropagation();
+			ignoreNextClick = false;
+			return false;
+		}
+	}, true);
+
+	var nearestEmptyInsertDetectEvent = function(evt) {
+		evt = evt.touches ? evt.touches[0] : evt;
+		if (dragEl) {
+			var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);
+
+			if (nearest) {
+				nearest[expando]._onDragOver({
+					clientX: evt.clientX,
+					clientY: evt.clientY,
+					target: nearest,
+					rootEl: nearest
+				});
+			}
+		}
+	};
+	// We do not want this to be triggered if completed (bubbling canceled), so only define it here
+	_on(document, 'dragover', nearestEmptyInsertDetectEvent);
+	_on(document, 'mousemove', nearestEmptyInsertDetectEvent);
+	_on(document, 'touchmove', nearestEmptyInsertDetectEvent);
+
+	/**
+	 * @class  Sortable
+	 * @param  {HTMLElement}  el
+	 * @param  {Object}       [options]
+	 */
+	function Sortable(el, options) {
+		if (!(el && el.nodeType && el.nodeType === 1)) {
+			throw 'Sortable: `el` must be HTMLElement, not ' + {}.toString.call(el);
+		}
+
+		this.el = el; // root element
+		this.options = options = _extend({}, options);
+
+
+		// Export instance
+		el[expando] = this;
+
+		// Default options
+		var defaults = {
+			group: null,
+			sort: true,
+			disabled: false,
+			store: null,
+			handle: null,
+			scroll: true,
+			scrollSensitivity: 30,
+			scrollSpeed: 10,
+			bubbleScroll: true,
+			draggable: /[uo]l/i.test(el.nodeName) ? '>li' : '>*',
+			swapThreshold: 1, // percentage; 0 <= x <= 1
+			invertSwap: false, // invert always
+			invertedSwapThreshold: null, // will be set to same as swapThreshold if default
+			removeCloneOnHide: true,
+			direction: function() {
+				return _detectDirection(el, this.options);
+			},
+			ghostClass: 'sortable-ghost',
+			chosenClass: 'sortable-chosen',
+			dragClass: 'sortable-drag',
+			ignore: 'a, img',
+			filter: null,
+			preventOnFilter: true,
+			animation: 0,
+			easing: null,
+			setData: function (dataTransfer, dragEl) {
+				dataTransfer.setData('Text', dragEl.textContent);
+			},
+			dropBubble: false,
+			dragoverBubble: false,
+			dataIdAttr: 'data-id',
+			delay: 0,
+			touchStartThreshold: parseInt(window.devicePixelRatio, 10) || 1,
+			forceFallback: false,
+			fallbackClass: 'sortable-fallback',
+			fallbackOnBody: false,
+			fallbackTolerance: 0,
+			fallbackOffset: {x: 0, y: 0},
+			supportPointer: Sortable.supportPointer !== false && (
+				('PointerEvent' in window) ||
+				window.navigator && ('msPointerEnabled' in window.navigator) // microsoft
+			),
+			emptyInsertThreshold: 5
+		};
+
+
+		// Set default options
+		for (var name in defaults) {
+			!(name in options) && (options[name] = defaults[name]);
+		}
+
+		_prepareGroup(options);
+
+		// Bind all private methods
+		for (var fn in this) {
+			if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
+				this[fn] = this[fn].bind(this);
+			}
+		}
+
+		// Setup drag mode
+		this.nativeDraggable = options.forceFallback ? false : supportDraggable;
+
+		if (this.nativeDraggable) {
+			// Touch start threshold cannot be greater than the native dragstart threshold
+			this.options.touchStartThreshold = 1;
+		}
+
+		// Bind events
+		if (options.supportPointer) {
+			_on(el, 'pointerdown', this._onTapStart);
+		} else {
+			_on(el, 'mousedown', this._onTapStart);
+			_on(el, 'touchstart', this._onTapStart);
+		}
+
+		if (this.nativeDraggable) {
+			_on(el, 'dragover', this);
+			_on(el, 'dragenter', this);
+		}
+
+		sortables.push(this.el);
+
+		// Restore sorting
+		options.store && options.store.get && this.sort(options.store.get(this) || []);
+	}
+
+	Sortable.prototype = /** @lends Sortable.prototype */ {
+		constructor: Sortable,
+
+		_computeIsAligned: function(evt) {
+			var target;
+
+			if (ghostEl && !supportCssPointerEvents) {
+				_hideGhostForTarget();
+				target = document.elementFromPoint(evt.clientX, evt.clientY);
+				_unhideGhostForTarget();
+			} else {
+				target = evt.target;
+			}
+
+			target = _closest(target, this.options.draggable, this.el, false);
+			if (_alignedSilent) return;
+			if (!dragEl || dragEl.parentNode !== this.el) return;
+
+			var children = this.el.children;
+			for (var i = 0; i < children.length; i++) {
+				// Don't change for target in case it is changed to aligned before onDragOver is fired
+				if (_closest(children[i], this.options.draggable, this.el, false) && children[i] !== target) {
+					children[i].sortableMouseAligned = _isClientInRowColumn(evt.clientX, evt.clientY, children[i], this._getDirection(evt, null), this.options);
+				}
+			}
+			// Used for nulling last target when not in element, nothing to do with checking if aligned
+			if (!_closest(target, this.options.draggable, this.el, true)) {
+				lastTarget = null;
+			}
+
+			_alignedSilent = true;
+			setTimeout(function() {
+				_alignedSilent = false;
+			}, 30);
+
+		},
+
+		_getDirection: function(evt, target) {
+			return (typeof this.options.direction === 'function') ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;
+		},
+
+		_onTapStart: function (/** Event|TouchEvent */evt) {
+			if (!evt.cancelable) return;
+			var _this = this,
+				el = this.el,
+				options = this.options,
+				preventOnFilter = options.preventOnFilter,
+				type = evt.type,
+				touch = evt.touches && evt.touches[0],
+				target = (touch || evt).target,
+				originalTarget = evt.target.shadowRoot && ((evt.path && evt.path[0]) || (evt.composedPath && evt.composedPath()[0])) || target,
+				filter = options.filter,
+				startIndex;
+
+			_saveInputCheckedState(el);
+
+
+			// IE: Calls events in capture mode if event element is nested. This ensures only correct element's _onTapStart goes through.
+			// This process is also done in _onDragOver
+			if (IE11OrLess && !evt.artificialBubble && !_isTrueParentSortable(el, target)) {
+				return;
+			}
+
+			// Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.
+			if (dragEl) {
+				return;
+			}
+
+			if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {
+				return; // only left button and enabled
+			}
+
+			// cancel dnd if original target is content editable
+			if (originalTarget.isContentEditable) {
+				return;
+			}
+
+			target = _closest(target, options.draggable, el, false);
+
+			if (!target) {
+				if (IE11OrLess) {
+					_artificalBubble(el, evt, '_onTapStart');
+				}
+				return;
+			}
+
+			if (lastDownEl === target) {
+				// Ignoring duplicate `down`
+				return;
+			}
+
+			// Get the index of the dragged element within its parent
+			startIndex = _index(target, options.draggable);
+
+			// Check filter
+			if (typeof filter === 'function') {
+				if (filter.call(this, evt, target, this)) {
+					_dispatchEvent(_this, originalTarget, 'filter', target, el, el, startIndex);
+					preventOnFilter && evt.cancelable && evt.preventDefault();
+					return; // cancel dnd
+				}
+			}
+			else if (filter) {
+				filter = filter.split(',').some(function (criteria) {
+					criteria = _closest(originalTarget, criteria.trim(), el, false);
+
+					if (criteria) {
+						_dispatchEvent(_this, criteria, 'filter', target, el, el, startIndex);
+						return true;
+					}
+				});
+
+				if (filter) {
+					preventOnFilter && evt.cancelable && evt.preventDefault();
+					return; // cancel dnd
+				}
+			}
+
+			if (options.handle && !_closest(originalTarget, options.handle, el, false)) {
+				return;
+			}
+
+			// Prepare `dragstart`
+			this._prepareDragStart(evt, touch, target, startIndex);
+		},
+
+
+		_handleAutoScroll: function(evt, fallback) {
+			if (!dragEl || !this.options.scroll) return;
+			var x = evt.clientX,
+				y = evt.clientY,
+
+				elem = document.elementFromPoint(x, y),
+				_this = this;
+
+			// IE does not seem to have native autoscroll,
+			// Edge's autoscroll seems too conditional,
+			// MACOS Safari does not have autoscroll,
+			// Firefox and Chrome are good
+			if (fallback || Edge || IE11OrLess || Safari) {
+				_autoScroll(evt, _this.options, elem, fallback);
+
+				// Listener for pointer element change
+				var ogElemScroller = _getParentAutoScrollElement(elem, true);
+				if (
+					scrolling &&
+					(
+						!pointerElemChangedInterval ||
+						x !== lastPointerElemX ||
+						y !== lastPointerElemY
+					)
+				) {
+
+					pointerElemChangedInterval && clearInterval(pointerElemChangedInterval);
+					// Detect for pointer elem change, emulating native DnD behaviour
+					pointerElemChangedInterval = setInterval(function() {
+						if (!dragEl) return;
+						// could also check if scroll direction on newElem changes due to parent autoscrolling
+						var newElem = _getParentAutoScrollElement(document.elementFromPoint(x, y), true);
+						if (newElem !== ogElemScroller) {
+							ogElemScroller = newElem;
+							_clearAutoScrolls();
+							_autoScroll(evt, _this.options, ogElemScroller, fallback);
+						}
+					}, 10);
+					lastPointerElemX = x;
+					lastPointerElemY = y;
+				}
+
+			} else {
+				// if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll
+				if (!_this.options.bubbleScroll || _getParentAutoScrollElement(elem, true) === _getWindowScrollingElement()) {
+					_clearAutoScrolls();
+					return;
+				}
+				_autoScroll(evt, _this.options, _getParentAutoScrollElement(elem, false), false);
+			}
+		},
+
+		_prepareDragStart: function (/** Event */evt, /** Touch */touch, /** HTMLElement */target, /** Number */startIndex) {
+			var _this = this,
+				el = _this.el,
+				options = _this.options,
+				ownerDocument = el.ownerDocument,
+				dragStartFn;
+
+			if (target && !dragEl && (target.parentNode === el)) {
+				rootEl = el;
+				dragEl = target;
+				parentEl = dragEl.parentNode;
+				nextEl = dragEl.nextSibling;
+				lastDownEl = target;
+				activeGroup = options.group;
+				oldIndex = startIndex;
+
+				tapEvt = {
+					target: dragEl,
+					clientX: (touch || evt).clientX,
+					clientY: (touch || evt).clientY
+				};
+
+				this._lastX = (touch || evt).clientX;
+				this._lastY = (touch || evt).clientY;
+
+				dragEl.style['will-change'] = 'all';
+				// undo animation if needed
+				dragEl.style.transition = '';
+				dragEl.style.transform = '';
+
+				dragStartFn = function () {
+					// Delayed drag has been triggered
+					// we can re-enable the events: touchmove/mousemove
+					_this._disableDelayedDragEvents();
+
+					if (!FireFox && _this.nativeDraggable) {
+						dragEl.draggable = true;
+					}
+
+					// Bind the events: dragstart/dragend
+					_this._triggerDragStart(evt, touch);
+
+					// Drag start event
+					_dispatchEvent(_this, rootEl, 'choose', dragEl, rootEl, rootEl, oldIndex);
+
+					// Chosen item
+					_toggleClass(dragEl, options.chosenClass, true);
+				};
+
+				// Disable "draggable"
+				options.ignore.split(',').forEach(function (criteria) {
+					_find(dragEl, criteria.trim(), _disableDraggable);
+				});
+
+				if (options.supportPointer) {
+					_on(ownerDocument, 'pointerup', _this._onDrop);
+				} else {
+					_on(ownerDocument, 'mouseup', _this._onDrop);
+					_on(ownerDocument, 'touchend', _this._onDrop);
+					_on(ownerDocument, 'touchcancel', _this._onDrop);
+				}
+
+				// Make dragEl draggable (must be before delay for FireFox)
+				if (FireFox && this.nativeDraggable) {
+					this.options.touchStartThreshold = 4;
+					dragEl.draggable = true;
+				}
+
+				// Delay is impossible for native DnD in Edge or IE
+				if (options.delay && (!this.nativeDraggable || !(Edge || IE11OrLess))) {
+					// If the user moves the pointer or let go the click or touch
+					// before the delay has been reached:
+					// disable the delayed drag
+					_on(ownerDocument, 'mouseup', _this._disableDelayedDrag);
+					_on(ownerDocument, 'touchend', _this._disableDelayedDrag);
+					_on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);
+					_on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);
+					_on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);
+					options.supportPointer && _on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);
+
+					_this._dragStartTimer = setTimeout(dragStartFn, options.delay);
+				} else {
+					dragStartFn();
+				}
+			}
+		},
+
+		_delayedDragTouchMoveHandler: function (/** TouchEvent|PointerEvent **/e) {
+			var touch = e.touches ? e.touches[0] : e;
+			if (max(abs(touch.clientX - this._lastX), abs(touch.clientY - this._lastY))
+					>= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))
+			) {
+				this._disableDelayedDrag();
+			}
+		},
+
+		_disableDelayedDrag: function () {
+			dragEl && _disableDraggable(dragEl);
+			clearTimeout(this._dragStartTimer);
+
+			this._disableDelayedDragEvents();
+		},
+
+		_disableDelayedDragEvents: function () {
+			var ownerDocument = this.el.ownerDocument;
+			_off(ownerDocument, 'mouseup', this._disableDelayedDrag);
+			_off(ownerDocument, 'touchend', this._disableDelayedDrag);
+			_off(ownerDocument, 'touchcancel', this._disableDelayedDrag);
+			_off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);
+			_off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);
+			_off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);
+		},
+
+		_triggerDragStart: function (/** Event */evt, /** Touch */touch) {
+			touch = touch || (evt.pointerType == 'touch' ? evt : null);
+
+			if (!this.nativeDraggable || touch) {
+				if (this.options.supportPointer) {
+					_on(document, 'pointermove', this._onTouchMove);
+				} else if (touch) {
+					_on(document, 'touchmove', this._onTouchMove);
+				} else {
+					_on(document, 'mousemove', this._onTouchMove);
+				}
+			} else {
+				_on(dragEl, 'dragend', this);
+				_on(rootEl, 'dragstart', this._onDragStart);
+			}
+
+			try {
+				if (document.selection) {
+					// Timeout neccessary for IE9
+					_nextTick(function () {
+						document.selection.empty();
+					});
+				} else {
+					window.getSelection().removeAllRanges();
+				}
+			} catch (err) {
+			}
+		},
+
+		_dragStarted: function (fallback, evt) {
+			awaitingDragStarted = false;
+			if (rootEl && dragEl) {
+				if (this.nativeDraggable) {
+					_on(document, 'dragover', this._handleAutoScroll);
+					_on(document, 'dragover', _checkAlignment);
+				}
+				var options = this.options;
+
+				// Apply effect
+				!fallback && _toggleClass(dragEl, options.dragClass, false);
+				_toggleClass(dragEl, options.ghostClass, true);
+
+				// In case dragging an animated element
+				_css(dragEl, 'transform', '');
+
+				Sortable.active = this;
+
+				fallback && this._appendGhost();
+
+				// Drag start event
+				_dispatchEvent(this, rootEl, 'start', dragEl, rootEl, rootEl, oldIndex, undefined, evt);
+			} else {
+				this._nulling();
+			}
+		},
+
+		_emulateDragOver: function (forAutoScroll) {
+			if (touchEvt) {
+				if (this._lastX === touchEvt.clientX && this._lastY === touchEvt.clientY && !forAutoScroll) {
+					return;
+				}
+				this._lastX = touchEvt.clientX;
+				this._lastY = touchEvt.clientY;
+
+				_hideGhostForTarget();
+
+				var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);
+				var parent = target;
+
+				while (target && target.shadowRoot) {
+					target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);
+					parent = target;
+				}
+
+				if (parent) {
+					do {
+						if (parent[expando]) {
+							var inserted;
+
+							inserted = parent[expando]._onDragOver({
+								clientX: touchEvt.clientX,
+								clientY: touchEvt.clientY,
+								target: target,
+								rootEl: parent
+							});
+
+							if (inserted && !this.options.dragoverBubble) {
+								break;
+							}
+						}
+
+						target = parent; // store last element
+					}
+					/* jshint boss:true */
+					while (parent = parent.parentNode);
+				}
+				dragEl.parentNode[expando]._computeIsAligned(touchEvt);
+
+				_unhideGhostForTarget();
+			}
+		},
+
+
+		_onTouchMove: function (/**TouchEvent*/evt, forAutoScroll) {
+			if (tapEvt) {
+				var	options = this.options,
+					fallbackTolerance = options.fallbackTolerance,
+					fallbackOffset = options.fallbackOffset,
+					touch = evt.touches ? evt.touches[0] : evt,
+					matrix = ghostEl && _matrix(ghostEl),
+					scaleX = ghostEl && matrix && matrix.a,
+					scaleY = ghostEl && matrix && matrix.d,
+					relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && _getRelativeScrollOffset(ghostRelativeParent),
+					dx = ((touch.clientX - tapEvt.clientX)
+							+ fallbackOffset.x) / (scaleX || 1)
+							+ (relativeScrollOffset ? (relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0]) : 0) / (scaleX || 1),
+					dy = ((touch.clientY - tapEvt.clientY)
+							+ fallbackOffset.y) / (scaleY || 1)
+							+ (relativeScrollOffset ? (relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1]) : 0) / (scaleY || 1),
+					translate3d = evt.touches ? 'translate3d(' + dx + 'px,' + dy + 'px,0)' : 'translate(' + dx + 'px,' + dy + 'px)';
+
+				// only set the status to dragging, when we are actually dragging
+				if (!Sortable.active && !awaitingDragStarted) {
+					if (fallbackTolerance &&
+						min(abs(touch.clientX - this._lastX), abs(touch.clientY - this._lastY)) < fallbackTolerance
+					) {
+						return;
+					}
+					this._onDragStart(evt, true);
+				}
+
+				!forAutoScroll && this._handleAutoScroll(touch, true);
+
+				moved = true;
+				touchEvt = touch;
+
+				_css(ghostEl, 'webkitTransform', translate3d);
+				_css(ghostEl, 'mozTransform', translate3d);
+				_css(ghostEl, 'msTransform', translate3d);
+				_css(ghostEl, 'transform', translate3d);
+
+				evt.cancelable && evt.preventDefault();
+			}
+		},
+
+		_appendGhost: function () {
+			// Bug if using scale(): https://stackoverflow.com/questions/2637058
+			// Not being adjusted for
+			if (!ghostEl) {
+				var container = this.options.fallbackOnBody ? document.body : rootEl,
+					rect = _getRect(dragEl, true, container, !PositionGhostAbsolutely),
+					css = _css(dragEl),
+					options = this.options;
+
+				// Position absolutely
+				if (PositionGhostAbsolutely) {
+					// Get relatively positioned parent
+					ghostRelativeParent = container;
+
+					while (
+						_css(ghostRelativeParent, 'position') === 'static' &&
+						_css(ghostRelativeParent, 'transform') === 'none' &&
+						ghostRelativeParent !== document
+					) {
+						ghostRelativeParent = ghostRelativeParent.parentNode;
+					}
+
+					if (ghostRelativeParent !== document) {
+						var ghostRelativeParentRect = _getRect(ghostRelativeParent, true);
+
+						rect.top -= ghostRelativeParentRect.top;
+						rect.left -= ghostRelativeParentRect.left;
+					}
+
+					if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {
+						if (ghostRelativeParent === document) ghostRelativeParent = _getWindowScrollingElement();
+
+						rect.top += ghostRelativeParent.scrollTop;
+						rect.left += ghostRelativeParent.scrollLeft;
+					} else {
+						ghostRelativeParent = _getWindowScrollingElement();
+					}
+					ghostRelativeParentInitialScroll = _getRelativeScrollOffset(ghostRelativeParent);
+				}
+
+
+				ghostEl = dragEl.cloneNode(true);
+
+				_toggleClass(ghostEl, options.ghostClass, false);
+				_toggleClass(ghostEl, options.fallbackClass, true);
+				_toggleClass(ghostEl, options.dragClass, true);
+
+				_css(ghostEl, 'box-sizing', 'border-box');
+				_css(ghostEl, 'margin', 0);
+				_css(ghostEl, 'top', rect.top);
+				_css(ghostEl, 'left', rect.left);
+				_css(ghostEl, 'width', rect.width);
+				_css(ghostEl, 'height', rect.height);
+				_css(ghostEl, 'opacity', '0.8');
+				_css(ghostEl, 'position', (PositionGhostAbsolutely ? 'absolute' : 'fixed'));
+				_css(ghostEl, 'zIndex', '100000');
+				_css(ghostEl, 'pointerEvents', 'none');
+
+				container.appendChild(ghostEl);
+			}
+		},
+
+		_onDragStart: function (/**Event*/evt, /**boolean*/fallback) {
+			var _this = this;
+			var dataTransfer = evt.dataTransfer;
+			var options = _this.options;
+
+			// Setup clone
+			cloneEl = _clone(dragEl);
+
+			cloneEl.draggable = false;
+			cloneEl.style['will-change'] = '';
+
+			this._hideClone();
+
+			_toggleClass(cloneEl, _this.options.chosenClass, false);
+
+
+			// #1143: IFrame support workaround
+			_this._cloneId = _nextTick(function () {
+				if (!_this.options.removeCloneOnHide) {
+					rootEl.insertBefore(cloneEl, dragEl);
+				}
+				_dispatchEvent(_this, rootEl, 'clone', dragEl);
+			});
+
+
+			!fallback && _toggleClass(dragEl, options.dragClass, true);
+
+			// Set proper drop events
+			if (fallback) {
+				ignoreNextClick = true;
+				_this._loopId = setInterval(_this._emulateDragOver, 50);
+			} else {
+				// Undo what was set in _prepareDragStart before drag started
+				_off(document, 'mouseup', _this._onDrop);
+				_off(document, 'touchend', _this._onDrop);
+				_off(document, 'touchcancel', _this._onDrop);
+
+				if (dataTransfer) {
+					dataTransfer.effectAllowed = 'move';
+					options.setData && options.setData.call(_this, dataTransfer, dragEl);
+				}
+
+				_on(document, 'drop', _this);
+
+				// #1276 fix:
+				_css(dragEl, 'transform', 'translateZ(0)');
+			}
+
+			awaitingDragStarted = true;
+
+			_this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));
+			_on(document, 'selectstart', _this);
+			if (Safari) {
+				_css(document.body, 'user-select', 'none');
+			}
+		},
+
+
+		// Returns true - if no further action is needed (either inserted or another condition)
+		_onDragOver: function (/**Event*/evt) {
+			var el = this.el,
+				target = evt.target,
+				dragRect,
+				targetRect,
+				revert,
+				options = this.options,
+				group = options.group,
+				activeSortable = Sortable.active,
+				isOwner = (activeGroup === group),
+				canSort = options.sort,
+				_this = this;
+
+			if (_silent) return;
+
+			// IE event order fix
+			if (IE11OrLess && !evt.rootEl && !evt.artificialBubble && !_isTrueParentSortable(el, target)) {
+				return;
+			}
+
+			// Return invocation when dragEl is inserted (or completed)
+			function completed(insertion) {
+				if (insertion) {
+					if (isOwner) {
+						activeSortable._hideClone();
+					} else {
+						activeSortable._showClone(_this);
+					}
+
+					if (activeSortable) {
+						// Set ghost class to new sortable's ghost class
+						_toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);
+						_toggleClass(dragEl, options.ghostClass, true);
+					}
+
+					if (putSortable !== _this && _this !== Sortable.active) {
+						putSortable = _this;
+					} else if (_this === Sortable.active) {
+						putSortable = null;
+					}
+
+					// Animation
+					dragRect && _this._animate(dragRect, dragEl);
+					target && targetRect && _this._animate(targetRect, target);
+				}
+
+
+				// Null lastTarget if it is not inside a previously swapped element
+				if ((target === dragEl && !dragEl.animated) || (target === el && !target.animated)) {
+					lastTarget = null;
+				}
+				// no bubbling and not fallback
+				if (!options.dragoverBubble && !evt.rootEl && target !== document) {
+					_this._handleAutoScroll(evt);
+					dragEl.parentNode[expando]._computeIsAligned(evt);
+				}
+
+				!options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();
+
+				return true;
+			}
+
+			// Call when dragEl has been inserted
+			function changed() {
+				_dispatchEvent(_this, rootEl, 'change', target, el, rootEl, oldIndex, _index(dragEl, options.draggable), evt);
+			}
+
+
+			if (evt.preventDefault !== void 0) {
+				evt.cancelable && evt.preventDefault();
+			}
+
+
+			moved = true;
+
+			target = _closest(target, options.draggable, el, true);
+
+			// target is dragEl or target is animated
+			if (!!_closest(evt.target, null, dragEl, true) || target.animated) {
+				return completed(false);
+			}
+
+			if (target !== dragEl) {
+				ignoreNextClick = false;
+			}
+
+			if (activeSortable && !options.disabled &&
+				(isOwner
+					? canSort || (revert = !rootEl.contains(dragEl)) // Reverting item into the original list
+					: (
+						putSortable === this ||
+						(
+							(this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) &&
+							group.checkPut(this, activeSortable, dragEl, evt)
+						)
+					)
+				)
+			) {
+				var axis = this._getDirection(evt, target);
+
+				dragRect = _getRect(dragEl);
+
+				if (revert) {
+					this._hideClone();
+					parentEl = rootEl; // actualization
+
+					if (nextEl) {
+						rootEl.insertBefore(dragEl, nextEl);
+					} else {
+						rootEl.appendChild(dragEl);
+					}
+
+					return completed(true);
+				}
+
+				var elLastChild = _lastChild(el);
+
+				if (!elLastChild || _ghostIsLast(evt, axis, el) && !elLastChild.animated) {
+					// assign target only if condition is true
+					if (elLastChild && el === evt.target) {
+						target = elLastChild;
+					}
+
+					if (target) {
+						targetRect = _getRect(target);
+					}
+
+					if (isOwner) {
+						activeSortable._hideClone();
+					} else {
+						activeSortable._showClone(this);
+					}
+
+					if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {
+						el.appendChild(dragEl);
+						parentEl = el; // actualization
+						realDragElRect = null;
+
+						changed();
+						return completed(true);
+					}
+				}
+				else if (target && target !== dragEl && target.parentNode === el) {
+					var direction = 0,
+						targetBeforeFirstSwap,
+						aligned = target.sortableMouseAligned,
+						differentLevel = dragEl.parentNode !== el,
+						side1 = axis === 'vertical' ? 'top' : 'left',
+						scrolledPastTop = _isScrolledPast(target, 'top') || _isScrolledPast(dragEl, 'top'),
+						scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;
+
+
+					if (lastTarget !== target) {
+						lastMode = null;
+						targetBeforeFirstSwap = _getRect(target)[side1];
+						pastFirstInvertThresh = false;
+					}
+
+					// Reference: https://www.lucidchart.com/documents/view/10fa0e93-e362-4126-aca2-b709ee56bd8b/0
+					if (
+						_isElInRowColumn(dragEl, target, axis) && aligned ||
+						differentLevel ||
+						scrolledPastTop ||
+						options.invertSwap ||
+						lastMode === 'insert' ||
+						// Needed, in the case that we are inside target and inserted because not aligned... aligned will stay false while inside
+						// and lastMode will change to 'insert', but we must swap
+						lastMode === 'swap'
+					) {
+						// New target that we will be inside
+						if (lastMode !== 'swap') {
+							isCircumstantialInvert = options.invertSwap || differentLevel;
+						}
+
+						direction = _getSwapDirection(evt, target, axis,
+							options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold,
+							isCircumstantialInvert,
+							lastTarget === target);
+						lastMode = 'swap';
+					} else {
+						// Insert at position
+						direction = _getInsertDirection(target);
+						lastMode = 'insert';
+					}
+					if (direction === 0) return completed(false);
+
+					realDragElRect = null;
+					lastTarget = target;
+
+					lastDirection = direction;
+
+					targetRect = _getRect(target);
+
+					var nextSibling = target.nextElementSibling,
+						after = false;
+
+					after = direction === 1;
+
+					var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);
+
+					if (moveVector !== false) {
+						if (moveVector === 1 || moveVector === -1) {
+							after = (moveVector === 1);
+						}
+
+						_silent = true;
+						setTimeout(_unsilent, 30);
+
+						if (isOwner) {
+							activeSortable._hideClone();
+						} else {
+							activeSortable._showClone(this);
+						}
+
+						if (after && !nextSibling) {
+							el.appendChild(dragEl);
+						} else {
+							target.parentNode.insertBefore(dragEl, after ? nextSibling : target);
+						}
+
+						// Undo chrome's scroll adjustment
+						if (scrolledPastTop) {
+							_scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);
+						}
+
+						parentEl = dragEl.parentNode; // actualization
+
+						// must be done before animation
+						if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {
+							targetMoveDistance = abs(targetBeforeFirstSwap - _getRect(target)[side1]);
+						}
+						changed();
+
+						return completed(true);
+					}
+				}
+
+				if (el.contains(dragEl)) {
+					return completed(false);
+				}
+			}
+
+			if (IE11OrLess && !evt.rootEl) {
+				_artificalBubble(el, evt, '_onDragOver');
+			}
+
+			return false;
+		},
+
+		_animate: function (prevRect, target) {
+			var ms = this.options.animation;
+
+			if (ms) {
+				var currentRect = _getRect(target);
+
+				if (target === dragEl) {
+					realDragElRect = currentRect;
+				}
+
+				if (prevRect.nodeType === 1) {
+					prevRect = _getRect(prevRect);
+				}
+
+				// Check if actually moving position
+				if ((prevRect.left + prevRect.width / 2) !== (currentRect.left + currentRect.width / 2)
+					|| (prevRect.top + prevRect.height / 2) !== (currentRect.top + currentRect.height / 2)
+				) {
+					var matrix = _matrix(this.el),
+						scaleX = matrix && matrix.a,
+						scaleY = matrix && matrix.d;
+
+					_css(target, 'transition', 'none');
+					_css(target, 'transform', 'translate3d('
+						+ (prevRect.left - currentRect.left) / (scaleX ? scaleX : 1) + 'px,'
+						+ (prevRect.top - currentRect.top) / (scaleY ? scaleY : 1) + 'px,0)'
+					);
+
+					forRepaintDummy = target.offsetWidth; // repaint
+					_css(target, 'transition', 'transform ' + ms + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));
+					_css(target, 'transform', 'translate3d(0,0,0)');
+				}
+
+				(typeof target.animated === 'number') && clearTimeout(target.animated);
+				target.animated = setTimeout(function () {
+					_css(target, 'transition', '');
+					_css(target, 'transform', '');
+					target.animated = false;
+				}, ms);
+			}
+		},
+
+		_offUpEvents: function () {
+			var ownerDocument = this.el.ownerDocument;
+
+			_off(document, 'touchmove', this._onTouchMove);
+			_off(document, 'pointermove', this._onTouchMove);
+			_off(ownerDocument, 'mouseup', this._onDrop);
+			_off(ownerDocument, 'touchend', this._onDrop);
+			_off(ownerDocument, 'pointerup', this._onDrop);
+			_off(ownerDocument, 'touchcancel', this._onDrop);
+			_off(document, 'selectstart', this);
+		},
+
+		_onDrop: function (/**Event*/evt) {
+			var el = this.el,
+				options = this.options;
+			awaitingDragStarted = false;
+			scrolling = false;
+			isCircumstantialInvert = false;
+			pastFirstInvertThresh = false;
+
+			clearInterval(this._loopId);
+
+			clearInterval(pointerElemChangedInterval);
+			_clearAutoScrolls();
+			_cancelThrottle();
+
+			clearTimeout(this._dragStartTimer);
+
+			_cancelNextTick(this._cloneId);
+			_cancelNextTick(this._dragStartId);
+
+			// Unbind events
+			_off(document, 'mousemove', this._onTouchMove);
+
+
+			if (this.nativeDraggable) {
+				_off(document, 'drop', this);
+				_off(el, 'dragstart', this._onDragStart);
+				_off(document, 'dragover', this._handleAutoScroll);
+				_off(document, 'dragover', _checkAlignment);
+			}
+
+			if (Safari) {
+				_css(document.body, 'user-select', '');
+			}
+
+			this._offUpEvents();
+
+			if (evt) {
+				if (moved) {
+					evt.cancelable && evt.preventDefault();
+					!options.dropBubble && evt.stopPropagation();
+				}
+
+				ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);
+
+				if (rootEl === parentEl || (putSortable && putSortable.lastPutMode !== 'clone')) {
+					// Remove clone
+					cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);
+				}
+
+				if (dragEl) {
+					if (this.nativeDraggable) {
+						_off(dragEl, 'dragend', this);
+					}
+
+					_disableDraggable(dragEl);
+					dragEl.style['will-change'] = '';
+
+					// Remove class's
+					_toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);
+					_toggleClass(dragEl, this.options.chosenClass, false);
+
+					// Drag stop event
+					_dispatchEvent(this, rootEl, 'unchoose', dragEl, parentEl, rootEl, oldIndex, null, evt);
+
+					if (rootEl !== parentEl) {
+						newIndex = _index(dragEl, options.draggable);
+
+						if (newIndex >= 0) {
+							// Add event
+							_dispatchEvent(null, parentEl, 'add', dragEl, parentEl, rootEl, oldIndex, newIndex, evt);
+
+							// Remove event
+							_dispatchEvent(this, rootEl, 'remove', dragEl, parentEl, rootEl, oldIndex, newIndex, evt);
+
+							// drag from one list and drop into another
+							_dispatchEvent(null, parentEl, 'sort', dragEl, parentEl, rootEl, oldIndex, newIndex, evt);
+							_dispatchEvent(this, rootEl, 'sort', dragEl, parentEl, rootEl, oldIndex, newIndex, evt);
+						}
+
+						putSortable && putSortable.save();
+					}
+					else {
+						if (dragEl.nextSibling !== nextEl) {
+							// Get the index of the dragged element within its parent
+							newIndex = _index(dragEl, options.draggable);
+
+							if (newIndex >= 0) {
+								// drag & drop within the same list
+								_dispatchEvent(this, rootEl, 'update', dragEl, parentEl, rootEl, oldIndex, newIndex, evt);
+								_dispatchEvent(this, rootEl, 'sort', dragEl, parentEl, rootEl, oldIndex, newIndex, evt);
+							}
+						}
+					}
+
+					if (Sortable.active) {
+						/* jshint eqnull:true */
+						if (newIndex == null || newIndex === -1) {
+							newIndex = oldIndex;
+						}
+						_dispatchEvent(this, rootEl, 'end', dragEl, parentEl, rootEl, oldIndex, newIndex, evt);
+
+						// Save sorting
+						this.save();
+					}
+				}
+
+			}
+			this._nulling();
+		},
+
+		_nulling: function() {
+			rootEl =
+			dragEl =
+			parentEl =
+			ghostEl =
+			nextEl =
+			cloneEl =
+			lastDownEl =
+
+			scrollEl =
+			scrollParentEl =
+			autoScrolls.length =
+
+			pointerElemChangedInterval =
+			lastPointerElemX =
+			lastPointerElemY =
+
+			tapEvt =
+			touchEvt =
+
+			moved =
+			newIndex =
+			oldIndex =
+
+			lastTarget =
+			lastDirection =
+
+			forRepaintDummy =
+			realDragElRect =
+
+			putSortable =
+			activeGroup =
+			Sortable.active = null;
+
+			savedInputChecked.forEach(function (el) {
+				el.checked = true;
+			});
+
+			savedInputChecked.length = 0;
+		},
+
+		handleEvent: function (/**Event*/evt) {
+			switch (evt.type) {
+				case 'drop':
+				case 'dragend':
+					this._onDrop(evt);
+					break;
+
+				case 'dragenter':
+				case 'dragover':
+					if (dragEl) {
+						this._onDragOver(evt);
+						_globalDragOver(evt);
+					}
+					break;
+
+				case 'selectstart':
+					evt.preventDefault();
+					break;
+			}
+		},
+
+
+		/**
+		 * Serializes the item into an array of string.
+		 * @returns {String[]}
+		 */
+		toArray: function () {
+			var order = [],
+				el,
+				children = this.el.children,
+				i = 0,
+				n = children.length,
+				options = this.options;
+
+			for (; i < n; i++) {
+				el = children[i];
+				if (_closest(el, options.draggable, this.el, false)) {
+					order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));
+				}
+			}
+
+			return order;
+		},
+
+
+		/**
+		 * Sorts the elements according to the array.
+		 * @param  {String[]}  order  order of the items
+		 */
+		sort: function (order) {
+			var items = {}, rootEl = this.el;
+
+			this.toArray().forEach(function (id, i) {
+				var el = rootEl.children[i];
+
+				if (_closest(el, this.options.draggable, rootEl, false)) {
+					items[id] = el;
+				}
+			}, this);
+
+			order.forEach(function (id) {
+				if (items[id]) {
+					rootEl.removeChild(items[id]);
+					rootEl.appendChild(items[id]);
+				}
+			});
+		},
+
+
+		/**
+		 * Save the current sorting
+		 */
+		save: function () {
+			var store = this.options.store;
+			store && store.set && store.set(this);
+		},
+
+
+		/**
+		 * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
+		 * @param   {HTMLElement}  el
+		 * @param   {String}       [selector]  default: `options.draggable`
+		 * @returns {HTMLElement|null}
+		 */
+		closest: function (el, selector) {
+			return _closest(el, selector || this.options.draggable, this.el, false);
+		},
+
+
+		/**
+		 * Set/get option
+		 * @param   {string} name
+		 * @param   {*}      [value]
+		 * @returns {*}
+		 */
+		option: function (name, value) {
+			var options = this.options;
+
+			if (value === void 0) {
+				return options[name];
+			} else {
+				options[name] = value;
+
+				if (name === 'group') {
+					_prepareGroup(options);
+				}
+			}
+		},
+
+
+		/**
+		 * Destroy
+		 */
+		destroy: function () {
+			var el = this.el;
+
+			el[expando] = null;
+
+			_off(el, 'mousedown', this._onTapStart);
+			_off(el, 'touchstart', this._onTapStart);
+			_off(el, 'pointerdown', this._onTapStart);
+
+			if (this.nativeDraggable) {
+				_off(el, 'dragover', this);
+				_off(el, 'dragenter', this);
+			}
+			// Remove draggable attributes
+			Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {
+				el.removeAttribute('draggable');
+			});
+
+			this._onDrop();
+
+			sortables.splice(sortables.indexOf(this.el), 1);
+
+			this.el = el = null;
+		},
+
+		_hideClone: function() {
+			if (!cloneEl.cloneHidden) {
+				_css(cloneEl, 'display', 'none');
+				cloneEl.cloneHidden = true;
+				if (cloneEl.parentNode && this.options.removeCloneOnHide) {
+					cloneEl.parentNode.removeChild(cloneEl);
+				}
+			}
+		},
+
+		_showClone: function(putSortable) {
+			if (putSortable.lastPutMode !== 'clone') {
+				this._hideClone();
+				return;
+			}
+
+			if (cloneEl.cloneHidden) {
+				// show clone at dragEl or original position
+				if (rootEl.contains(dragEl) && !this.options.group.revertClone) {
+					rootEl.insertBefore(cloneEl, dragEl);
+				} else if (nextEl) {
+					rootEl.insertBefore(cloneEl, nextEl);
+				} else {
+					rootEl.appendChild(cloneEl);
+				}
+
+				if (this.options.group.revertClone) {
+					this._animate(dragEl, cloneEl);
+				}
+				_css(cloneEl, 'display', '');
+				cloneEl.cloneHidden = false;
+			}
+		}
+	};
+
+	function _closest(/**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {
+		if (el) {
+			ctx = ctx || document;
+
+			do {
+				if (
+					selector != null &&
+					(
+						selector[0] === '>' && el.parentNode === ctx && _matches(el, selector.substring(1)) ||
+						_matches(el, selector)
+					) ||
+					includeCTX && el === ctx
+				) {
+					return el;
+				}
+
+				if (el === ctx) break;
+				/* jshint boss:true */
+			} while (el = _getParentOrHost(el));
+		}
+
+		return null;
+	}
+
+
+	function _getParentOrHost(el) {
+		return (el.host && el !== document && el.host.nodeType)
+			? el.host
+			: el.parentNode;
+	}
+
+
+	function _globalDragOver(/**Event*/evt) {
+		if (evt.dataTransfer) {
+			evt.dataTransfer.dropEffect = 'move';
+		}
+		evt.cancelable && evt.preventDefault();
+	}
+
+
+	function _on(el, event, fn) {
+		el.addEventListener(event, fn, captureMode);
+	}
+
+
+	function _off(el, event, fn) {
+		el.removeEventListener(event, fn, captureMode);
+	}
+
+
+	function _toggleClass(el, name, state) {
+		if (el && name) {
+			if (el.classList) {
+				el.classList[state ? 'add' : 'remove'](name);
+			}
+			else {
+				var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');
+				el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');
+			}
+		}
+	}
+
+
+	function _css(el, prop, val) {
+		var style = el && el.style;
+
+		if (style) {
+			if (val === void 0) {
+				if (document.defaultView && document.defaultView.getComputedStyle) {
+					val = document.defaultView.getComputedStyle(el, '');
+				}
+				else if (el.currentStyle) {
+					val = el.currentStyle;
+				}
+
+				return prop === void 0 ? val : val[prop];
+			}
+			else {
+				if (!(prop in style) && prop.indexOf('webkit') === -1) {
+					prop = '-webkit-' + prop;
+				}
+
+				style[prop] = val + (typeof val === 'string' ? '' : 'px');
+			}
+		}
+	}
+
+	function _matrix(el) {
+		var appliedTransforms = '';
+		do {
+			var transform = _css(el, 'transform');
+
+			if (transform && transform !== 'none') {
+				appliedTransforms = transform + ' ' + appliedTransforms;
+			}
+			/* jshint boss:true */
+		} while (el = el.parentNode);
+
+		if (window.DOMMatrix) {
+			return new DOMMatrix(appliedTransforms);
+		} else if (window.WebKitCSSMatrix) {
+			return new WebKitCSSMatrix(appliedTransforms);
+		} else if (window.CSSMatrix) {
+			return new CSSMatrix(appliedTransforms);
+		}
+	}
+
+
+	function _find(ctx, tagName, iterator) {
+		if (ctx) {
+			var list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;
+
+			if (iterator) {
+				for (; i < n; i++) {
+					iterator(list[i], i);
+				}
+			}
+
+			return list;
+		}
+
+		return [];
+	}
+
+
+
+	function _dispatchEvent(sortable, rootEl, name, targetEl, toEl, fromEl, startIndex, newIndex, originalEvt) {
+		sortable = (sortable || rootEl[expando]);
+		var evt,
+			options = sortable.options,
+			onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);
+		// Support for new CustomEvent feature
+		if (window.CustomEvent && !IE11OrLess && !Edge) {
+			evt = new CustomEvent(name, {
+				bubbles: true,
+				cancelable: true
+			});
+		} else {
+			evt = document.createEvent('Event');
+			evt.initEvent(name, true, true);
+		}
+
+		evt.to = toEl || rootEl;
+		evt.from = fromEl || rootEl;
+		evt.item = targetEl || rootEl;
+		evt.clone = cloneEl;
+
+		evt.oldIndex = startIndex;
+		evt.newIndex = newIndex;
+
+		evt.originalEvent = originalEvt;
+		evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
+
+		if (rootEl) {
+			rootEl.dispatchEvent(evt);
+		}
+
+		if (options[onName]) {
+			options[onName].call(sortable, evt);
+		}
+	}
+
+
+	function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvt, willInsertAfter) {
+		var evt,
+			sortable = fromEl[expando],
+			onMoveFn = sortable.options.onMove,
+			retVal;
+		// Support for new CustomEvent feature
+		if (window.CustomEvent && !IE11OrLess && !Edge) {
+			evt = new CustomEvent('move', {
+				bubbles: true,
+				cancelable: true
+			});
+		} else {
+			evt = document.createEvent('Event');
+			evt.initEvent('move', true, true);
+		}
+
+		evt.to = toEl;
+		evt.from = fromEl;
+		evt.dragged = dragEl;
+		evt.draggedRect = dragRect;
+		evt.related = targetEl || toEl;
+		evt.relatedRect = targetRect || _getRect(toEl);
+		evt.willInsertAfter = willInsertAfter;
+
+		evt.originalEvent = originalEvt;
+
+		fromEl.dispatchEvent(evt);
+
+		if (onMoveFn) {
+			retVal = onMoveFn.call(sortable, evt, originalEvt);
+		}
+
+		return retVal;
+	}
+
+	function _disableDraggable(el) {
+		el.draggable = false;
+	}
+
+	function _unsilent() {
+		_silent = false;
+	}
+
+	/**
+	 * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)
+	 * and non-draggable elements
+	 * @param  {HTMLElement} el       The parent element
+	 * @param  {Number} childNum      The index of the child
+	 * @param  {Object} options       Parent Sortable's options
+	 * @return {HTMLElement}          The child at index childNum, or null if not found
+	 */
+	function _getChild(el, childNum, options) {
+		var currentChild = 0,
+			i = 0,
+			children = el.children;
+
+		while (i < children.length) {
+			if (
+				children[i].style.display !== 'none' &&
+				children[i] !== ghostEl &&
+				children[i] !== dragEl &&
+				_closest(children[i], options.draggable, el, false)
+			) {
+				if (currentChild === childNum) {
+					return children[i];
+				}
+				currentChild++;
+			}
+
+			i++;
+		}
+		return null;
+	}
+
+	/**
+	 * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)
+	 * @param  {HTMLElement} el       Parent element
+	 * @return {HTMLElement}          The last child, ignoring ghostEl
+	 */
+	function _lastChild(el) {
+		var last = el.lastElementChild;
+
+		while (last && (last === ghostEl || last.style.display === 'none')) {
+			last = last.previousElementSibling;
+		}
+
+		return last || null;
+	}
+
+	function _ghostIsLast(evt, axis, el) {
+		var elRect = _getRect(_lastChild(el)),
+			mouseOnAxis = axis === 'vertical' ? evt.clientY : evt.clientX,
+			mouseOnOppAxis = axis === 'vertical' ? evt.clientX : evt.clientY,
+			targetS2 = axis === 'vertical' ? elRect.bottom : elRect.right,
+			targetS1Opp = axis === 'vertical' ? elRect.left : elRect.top,
+			targetS2Opp = axis === 'vertical' ? elRect.right : elRect.bottom,
+			spacer = 10;
+
+		return (
+			axis === 'vertical' ?
+				(mouseOnOppAxis > targetS2Opp + spacer || mouseOnOppAxis <= targetS2Opp && mouseOnAxis > targetS2 && mouseOnOppAxis >= targetS1Opp) :
+				(mouseOnAxis > targetS2 && mouseOnOppAxis > targetS1Opp || mouseOnAxis <= targetS2 && mouseOnOppAxis > targetS2Opp + spacer)
+		);
+	}
+
+	function _getSwapDirection(evt, target, axis, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {
+		var targetRect = _getRect(target),
+			mouseOnAxis = axis === 'vertical' ? evt.clientY : evt.clientX,
+			targetLength = axis === 'vertical' ? targetRect.height : targetRect.width,
+			targetS1 = axis === 'vertical' ? targetRect.top : targetRect.left,
+			targetS2 = axis === 'vertical' ? targetRect.bottom : targetRect.right,
+			dragRect = _getRect(dragEl),
+			invert = false;
+
+
+		if (!invertSwap) {
+			// Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold
+			if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) { // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2
+				// check if past first invert threshold on side opposite of lastDirection
+				if (!pastFirstInvertThresh &&
+					(lastDirection === 1 ?
+						(
+							mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2
+						) :
+						(
+							mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2
+						)
+					)
+				)
+				{
+					// past first invert threshold, do not restrict inverted threshold to dragEl shadow
+					pastFirstInvertThresh = true;
+				}
+
+				if (!pastFirstInvertThresh) {
+					var dragS1 = axis === 'vertical' ? dragRect.top : dragRect.left,
+						dragS2 = axis === 'vertical' ? dragRect.bottom : dragRect.right;
+					// dragEl shadow (target move distance shadow)
+					if (
+						lastDirection === 1 ?
+						(
+							mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow
+						) :
+						(
+							mouseOnAxis > targetS2 - targetMoveDistance
+						)
+					)
+					{
+						return lastDirection * -1;
+					}
+				} else {
+					invert = true;
+				}
+			} else {
+				// Regular
+				if (
+					mouseOnAxis > targetS1 + (targetLength * (1 - swapThreshold) / 2) &&
+					mouseOnAxis < targetS2 - (targetLength * (1 - swapThreshold) / 2)
+				) {
+					return _getInsertDirection(target);
+				}
+			}
+		}
+
+		invert = invert || invertSwap;
+
+		if (invert) {
+			// Invert of regular
+			if (
+				mouseOnAxis < targetS1 + (targetLength * invertedSwapThreshold / 2) ||
+				mouseOnAxis > targetS2 - (targetLength * invertedSwapThreshold / 2)
+			)
+			{
+				return ((mouseOnAxis > targetS1 + targetLength / 2) ? 1 : -1);
+			}
+		}
+
+		return 0;
+	}
+
+	/**
+	 * Gets the direction dragEl must be swapped relative to target in order to make it
+	 * seem that dragEl has been "inserted" into that element's position
+	 * @param  {HTMLElement} target       The target whose position dragEl is being inserted at
+	 * @return {Number}                   Direction dragEl must be swapped
+	 */
+	function _getInsertDirection(target) {
+		var dragElIndex = _index(dragEl),
+			targetIndex = _index(target);
+
+		if (dragElIndex < targetIndex) {
+			return 1;
+		} else {
+			return -1;
+		}
+	}
+
+
+	/**
+	 * Generate id
+	 * @param   {HTMLElement} el
+	 * @returns {String}
+	 * @private
+	 */
+	function _generateId(el) {
+		var str = el.tagName + el.className + el.src + el.href + el.textContent,
+			i = str.length,
+			sum = 0;
+
+		while (i--) {
+			sum += str.charCodeAt(i);
+		}
+
+		return sum.toString(36);
+	}
+
+	/**
+	 * Returns the index of an element within its parent for a selected set of
+	 * elements
+	 * @param  {HTMLElement} el
+	 * @param  {selector} selector
+	 * @return {number}
+	 */
+	function _index(el, selector) {
+		var index = 0;
+
+		if (!el || !el.parentNode) {
+			return -1;
+		}
+
+		while (el && (el = el.previousElementSibling)) {
+			if ((el.nodeName.toUpperCase() !== 'TEMPLATE') && el !== cloneEl) {
+				index++;
+			}
+		}
+
+		return index;
+	}
+
+	function _matches(/**HTMLElement*/el, /**String*/selector) {
+		if (el) {
+			try {
+				if (el.matches) {
+					return el.matches(selector);
+				} else if (el.msMatchesSelector) {
+					return el.msMatchesSelector(selector);
+				} else if (el.webkitMatchesSelector) {
+					return el.webkitMatchesSelector(selector);
+				}
+			} catch(_) {
+				return false;
+			}
+		}
+
+		return false;
+	}
+
+	var _throttleTimeout;
+	function _throttle(callback, ms) {
+		return function () {
+			if (!_throttleTimeout) {
+				var args = arguments,
+					_this = this;
+
+				_throttleTimeout = setTimeout(function () {
+					if (args.length === 1) {
+						callback.call(_this, args[0]);
+					} else {
+						callback.apply(_this, args);
+					}
+
+					_throttleTimeout = void 0;
+				}, ms);
+			}
+		};
+	}
+
+	function _cancelThrottle() {
+		clearTimeout(_throttleTimeout);
+		_throttleTimeout = void 0;
+	}
+
+	function _extend(dst, src) {
+		if (dst && src) {
+			for (var key in src) {
+				if (src.hasOwnProperty(key)) {
+					dst[key] = src[key];
+				}
+			}
+		}
+
+		return dst;
+	}
+
+	function _clone(el) {
+		if (Polymer && Polymer.dom) {
+			return Polymer.dom(el).cloneNode(true);
+		}
+		else if ($) {
+			return $(el).clone(true)[0];
+		}
+		else {
+			return el.cloneNode(true);
+		}
+	}
+
+	function _saveInputCheckedState(root) {
+		savedInputChecked.length = 0;
+
+		var inputs = root.getElementsByTagName('input');
+		var idx = inputs.length;
+
+		while (idx--) {
+			var el = inputs[idx];
+			el.checked && savedInputChecked.push(el);
+		}
+	}
+
+	function _nextTick(fn) {
+		return setTimeout(fn, 0);
+	}
+
+	function _cancelNextTick(id) {
+		return clearTimeout(id);
+	}
+
+
+	/**
+	 * Returns the "bounding client rect" of given element
+	 * @param  {HTMLElement} el                The element whose boundingClientRect is wanted
+	 * @param  {[HTMLElement]} container       the parent the element will be placed in
+	 * @param  {[Boolean]} adjustForTransform  Whether the rect should compensate for parent's transform
+	 * @return {Object}                        The boundingClientRect of el
+	 */
+	function _getRect(el, adjustForTransform, container, adjustForFixed) {
+		if (!el.getBoundingClientRect && el !== win) return;
+
+		var elRect,
+			top,
+			left,
+			bottom,
+			right,
+			height,
+			width;
+
+		if (el !== win && el !== _getWindowScrollingElement()) {
+			elRect = el.getBoundingClientRect();
+			top = elRect.top;
+			left = elRect.left;
+			bottom = elRect.bottom;
+			right = elRect.right;
+			height = elRect.height;
+			width = elRect.width;
+		} else {
+			top = 0;
+			left = 0;
+			bottom = window.innerHeight;
+			right = window.innerWidth;
+			height = window.innerHeight;
+			width = window.innerWidth;
+		}
+
+		if (adjustForFixed && el !== win) {
+			// Adjust for translate()
+			container = container || el.parentNode;
+
+			// solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)
+			// Not needed on <= IE11
+			if (!IE11OrLess) {
+				do {
+					if (container && container.getBoundingClientRect && _css(container, 'transform') !== 'none') {
+						var containerRect = container.getBoundingClientRect();
+
+						// Set relative to edges of padding box of container
+						top -= containerRect.top + parseInt(_css(container, 'border-top-width'));
+						left -= containerRect.left + parseInt(_css(container, 'border-left-width'));
+						bottom = top + elRect.height;
+						right = left + elRect.width;
+
+						break;
+					}
+					/* jshint boss:true */
+				} while (container = container.parentNode);
+			}
+		}
+
+		if (adjustForTransform && el !== win) {
+			// Adjust for scale()
+			var matrix = _matrix(container || el),
+				scaleX = matrix && matrix.a,
+				scaleY = matrix && matrix.d;
+
+			if (matrix) {
+				top /= scaleY;
+				left /= scaleX;
+
+				width /= scaleX;
+				height /= scaleY;
+
+				bottom = top + height;
+				right = left + width;
+			}
+		}
+
+		return {
+			top: top,
+			left: left,
+			bottom: bottom,
+			right: right,
+			width: width,
+			height: height
+		};
+	}
+
+
+	/**
+	 * Checks if a side of an element is scrolled past a side of it's parents
+	 * @param  {HTMLElement}  el       The element who's side being scrolled out of view is in question
+	 * @param  {String}       side     Side of the element in question ('top', 'left', 'right', 'bottom')
+	 * @return {HTMLElement}           The parent scroll element that the el's side is scrolled past, or null if there is no such element
+	 */
+	function _isScrolledPast(el, side) {
+		var parent = _getParentAutoScrollElement(el, true),
+			elSide = _getRect(el)[side];
+
+		/* jshint boss:true */
+		while (parent) {
+			var parentSide = _getRect(parent)[side],
+				visible;
+
+			if (side === 'top' || side === 'left') {
+				visible = elSide >= parentSide;
+			} else {
+				visible = elSide <= parentSide;
+			}
+
+			if (!visible) return parent;
+
+			if (parent === _getWindowScrollingElement()) break;
+
+			parent = _getParentAutoScrollElement(parent, false);
+		}
+
+		return false;
+	}
+
+	/**
+	 * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.
+	 * The value is returned in real pixels.
+	 * @param  {HTMLElement} el
+	 * @return {Array}             Offsets in the format of [left, top]
+	 */
+	function _getRelativeScrollOffset(el) {
+		var offsetLeft = 0,
+			offsetTop = 0,
+			winScroller = _getWindowScrollingElement();
+
+		if (el) {
+			do {
+				var matrix = _matrix(el),
+					scaleX = matrix.a,
+					scaleY = matrix.d;
+
+				offsetLeft += el.scrollLeft * scaleX;
+				offsetTop += el.scrollTop * scaleY;
+			} while (el !== winScroller && (el = el.parentNode));
+		}
+
+		return [offsetLeft, offsetTop];
+	}
+
+	// Fixed #973:
+	_on(document, 'touchmove', function(evt) {
+		if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {
+			evt.preventDefault();
+		}
+	});
+
+
+	// Export utils
+	Sortable.utils = {
+		on: _on,
+		off: _off,
+		css: _css,
+		find: _find,
+		is: function (el, selector) {
+			return !!_closest(el, selector, el, false);
+		},
+		extend: _extend,
+		throttle: _throttle,
+		closest: _closest,
+		toggleClass: _toggleClass,
+		clone: _clone,
+		index: _index,
+		nextTick: _nextTick,
+		cancelNextTick: _cancelNextTick,
+		detectDirection: _detectDirection,
+		getChild: _getChild
+	};
+
+
+	/**
+	 * Create sortable instance
+	 * @param {HTMLElement}  el
+	 * @param {Object}      [options]
+	 */
+	Sortable.create = function (el, options) {
+		return new Sortable(el, options);
+	};
+
+
+	// Export
+	Sortable.version = '1.8.4';
+	return Sortable;
+});
+
+
+/***/ }),
+/* 39 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34);
+/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(40);
+/* harmony import */ var _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(140);
+/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(36);
+/* harmony import */ var _LocationSelector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(142);
+/* harmony import */ var _Common_Controls_IsoDOM__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(146);
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+
+
+
+
+
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_1__["default"].getLogger("Isocurve");
+/**
+ * @classdesc
+ *
+ * Leaflet Control Class to compute and display Isochrone or isodistances curves.
+ *
+ * Use {@link module:Controls.Isocurve L.geoportalControl.Isocurve()} factory to create instances of that class.
+ *
+ * **Extends** Leaflet <a href="http://leafletjs.com/reference.html#control" target="_blank">L.Control</a> native class.
+ *
+ * @namespace
+ * @alias L.geoportalControl.Isocurve
+ */
+
+var Isocurve = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Control.extend(
+/** @lends L.geoportalControl.Isocurve.prototype */
+{
+  includes: _Common_Controls_IsoDOM__WEBPACK_IMPORTED_MODULE_6__["default"],
+
+  /**
+   * Options du service
+   *
+   * @private
+   */
+  options: {
+    position: "topleft",
+    collapsed: true,
+    // plier !
+    methods: ["time", "distance"],
+    graphs: ["Voiture", "Pieton"],
+    exclusions: {
+      toll: false,
+      tunnel: false,
+      bridge: false
+    },
+    directions: ["departure", "arrival"],
+    disableReverse: false,
+    isocurveOptions: {},
+    autocompleteOptions: {}
+  },
+
+  /**
+   * constructor
+   *
+   * @private
+   * @param {Object} options - Isocurve control options
+   * @param {Sting}   [options.apiKey] - API key for services call (isocurve and autocomplete services), mandatory if autoconf service has not been charged in advance
+   * @param {Boolean} [options.ssl = true] - use of ssl or not (default true, service requested using https protocol)
+   * @param {Boolean} [options.collapsed] - Specify if widget has to be collapsed (true) or not (false) on map loading. Default is true.
+   * @param {Object}  [options.exclusions] - list of exclusions with status (true = checked), by default : ["toll":false, "tunnel":false, "bridge":false].
+   * @param {Array}   [options.graphs] - list of graph resources to be used for isocurve calculation, by default : ["Voiture", "Pieton"]. The first element is selected.
+   * @param {Array}   [options.methods] - list of methods, by default : ["time", "distance"]. The first element is selected by default.
+   * @param {Array}   [options.directions] - list of directions to be displayed, by default : ["departure", "arrival"]. The first element is selected by default.
+   *      Directions enable to specify if input location point will be used as a departure point ("departure") or as an arrival point ("arrival")
+   * @param {Boolean} [options.disableReverse = false] - whether to enable/disable the reverse geocoding
+   * @param {Object} [options.isocurveOptions] - isocurve service options.
+   * @param {Object} [options.autocompleteOptions] - autocomplete service options.
+   * @example
+   *  var iso = L.geoportalControl.Isocurve({
+   *      collapsed : false
+   *      methods : ["time", "distance"],
+   *      exclusions : {
+   *         toll : true,
+   *         bridge : false,
+   *         tunnel : true
+   *      },
+   *      graphs : ["Pieton", "Voiture"],
+   *      isocurveOptions : {},
+   *      autocompleteOptions : {}
+   *  });
+   */
+  initialize: function initialize(options) {
+    // on transmet les options au controle
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.setOptions(this, options);
+    /** uuid */
+
+    this._uid = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__["default"].generate();
+    /** detection du support : desktop ou tactile */
+
+    this._isDesktop = this._detectSupport();
+    /** detection si le panneau est reduit */
+    // on desactive l'impl. reduction de la fenetre
+    // this._reducePanel = false;
+
+    /** container principaux */
+
+    this._waitingContainer = null;
+    this._showContainer = null;
+    this._pictoContainer = null;
+    this._formContainer = null;
+    this._submitContainer = null;
+    /** Mode de transport selectionné : 'Voiture' ou 'Pieton' */
+
+    this._currentTransport = null;
+    /** Sens du parcours selectionné : 'Départ' ou 'Arrivée' */
+
+    this._currentDirection = null;
+    /** Type d'isochrone et valeur selectionné : 'isochrone' ou 'distance' */
+
+    this._currentComputation = null;
+    this._currentTimeHour = 0;
+    this._currentTimeMinute = 0;
+    this._currentDistance = 0;
+    /** Exclusions selectionnées : Tunnel, Toll et Bridge */
+
+    this._currentExclusions = []; // initialisation
+
+    this._initTransport();
+
+    this._initComputation();
+
+    this._initDirection();
+
+    this._initExclusions();
+    /** le point */
+
+
+    this._currentPoint = null;
+    /** la geometrie de l'isochrone */
+
+    this._geojsonIso = null;
+    /** si un calcul est en cours ou non */
+
+    this._waiting = false;
+    /** timer pour cacher la patience après un certain temps */
+
+    this._timer = null;
+    /**
+     * reponse du service
+     * Ex. {
+     *   totalTime, totalDistance, bbox, routeGeometry,
+     *   routeInstructions : [{duration, distance, code, instruction, bbox, geometry}]
+     * }
+     */
+
+    this._currentIsoResults = null;
+    /**
+     * liste des ressources avec droits par service
+     * Ex. {
+     *   "IsoChrone" : {
+     *       key : "ger4g456re45er456t4er5ge5",
+     *       resources : ["Pieton", "Voiture"]
+     *   }
+     * }
+     */
+
+    this._resources = {};
+    /** aucun droits sur les ressources */
+
+    this._noRightManagement = false; // gestion des droits sur les ressources/services
+
+    this._checkRightsManagement();
+  },
+
+  /**
+   * this method is called by this.addTo(map) when the control is added on the map
+   * and fills variable 'this._container = this.onAdd(map)',
+   * and create or disable events on map.
+   * @param {L.Map} map - object map
+   * @returns {DOMElement} container
+   * @private
+   */
+  onAdd: function onAdd(map) {
+    // initialisation du DOM du composant
+    var container = this._container = this._initLayout(map); // deactivate of events that may interfere with the map
+
+
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
+    return container;
+  },
+
+  /**
+   * TODO this method is called when the control is removed from the map
+   * and removes events on map.
+   *
+   * @private
+   */
+  onRemove: function onRemove()
+  /* map */
+  {},
+  // ################################################################### //
+  // ####################### init application ########################## //
+  // ################################################################### //
+
+  /**
+   * this method is called by the constructor and initialize the ...
+   *
+   * @private
+   */
+  _initTransport: function _initTransport() {
+    // Mode de transport selectionné
+    this._currentTransport = "Voiture"; // par defaut
+    // par defaut
+
+    var transport = this.options.graphs;
+
+    if (!transport || transport.length === 0) {
+      this.options.graphs = ["Voiture", "Pieton"];
+    } // option
+
+
+    if (leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.isArray(transport) && transport.length) {
+      // FIXME pb si le 1er graphe n'est pas une ressource connue !
+      if (transport[0] === "Voiture" || transport[0] === "Pieton") {
+        this._currentTransport = transport[0];
+      }
+    } // option sur le service
+
+
+    var serviceOptions = this.options.isocurveOptions;
+
+    if (serviceOptions.graph) {
+      this._currentTransport = serviceOptions.graph;
+    }
+  },
+
+  /**
+   * this method is called by the constructor and initialize the ...
+   *
+   * @private
+   */
+  _initDirection: function _initDirection() {
+    this._currentDirection = "departure"; // par defaut
+    // par defaut
+
+    var directions = this.options.directions;
+
+    if (!directions || directions.length === 0) {
+      this.options.directions = ["departure", "arrival"];
+    } // option
+
+
+    if (leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.isArray(directions) && directions.length) {
+      // FIXME pb si le 1er graphe n'est pas une ressource connue !
+      if (directions[0] === "departure" || directions[0] === "arrival") {
+        this._currentDirection = directions[0];
+      }
+    } // si l'utilisateur a spécifié une méthode dans le service, on surcharge les options du widget
+
+
+    var serviceOptions = this.options.isocurveOptions;
+
+    if (!serviceOptions.reverse) {
+      this._currentDirection = "departure";
+    }
+
+    if (serviceOptions.reverse === true) {
+      this._currentDirection = "arrival";
+      this.options.directions = ["arrival", "departure"];
+    }
+  },
+
+  /**
+   * this method is called by the constructor and initialize the ...
+   *
+   * @private
+   */
+  _initComputation: function _initComputation() {
+    // Mode de calcul selectionné
+    this._currentComputation = "time"; // par defaut
+    // par defaut
+
+    var methods = this.options.methods;
+
+    if (!methods || methods.length === 0) {
+      this.options.methods = ["time", "distance"];
+    } // option
+
+
+    if (leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.isArray(methods) && methods.length) {
+      // FIXME pb si le 1er graphe n'est pas une ressource connue !
+      if (methods[0] === "time" || methods[0] === "distance") {
+        this._currentComputation = methods[0];
+      }
+    } // si l'utilisateur a spécifié une méthode dans le service, on surcharge les options du widget
+
+
+    var serviceOptions = this.options.isocurveOptions;
+
+    if (serviceOptions.method) {
+      this._currentComputation = serviceOptions.method;
+    }
+
+    if (serviceOptions.time) {
+      this._currentComputation = "time";
+    }
+
+    if (serviceOptions.distance) {
+      this._currentComputation = "distance";
+    }
+  },
+
+  /**
+   * this method is called by the constructor and initialize the ...
+   *
+   * @private
+   */
+  _initExclusions: function _initExclusions() {
+    // Exclusions selectionnées : Tunnel, Toll et Bridge
+    this._currentExclusions = []; // par defaut
+    // par defaut
+
+    var exclusion = this.options.exclusions;
+
+    if (!exclusion || _typeof(exclusion) === "object" && Object.keys(exclusion).length === 0) {
+      this.options.exclusions = {
+        toll: false,
+        tunnel: false,
+        bridge: false
+      };
+    } // option
+
+
+    if (exclusion && _typeof(exclusion) === "object" && Object.keys(exclusion).length) {
+      for (var k in exclusion) {
+        if (exclusion.hasOwnProperty(k)) {
+          if (exclusion.k) {
+            this._currentExclusions.push(k);
+          }
+        }
+      }
+    } // si l'utilisateur a spécifié des exclusions dans le service, on surcharge les options du widget
+
+
+    var serviceOptions = this.options.isocurveOptions;
+
+    if (Array.isArray(serviceOptions.exclusions)) {
+      this._currentExclusions = serviceOptions.exclusions;
+    }
+  },
+  // ################################################################### //
+  // ############################## other init ######################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by constructor
+   * and check the rights to resources
+   *
+   * @private
+   */
+  _checkRightsManagement: function _checkRightsManagement() {
+    var _opts = null;
+    var _res = [];
+    var _key = null; // les ressources du service du calcul d'isochrone
+
+    _key = this.options.isocurveOptions.apiKey;
+    _opts = this.options.isocurveOptions.filterOptions;
+    _res = _opts ? _opts.type : [];
+
+    if (!_res || _res.length === 0) {
+      _res = ["Voiture", "Pieton"];
+    }
+
+    var rightManagementIsochrone = _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_3__["default"].check({
+      key: _key || this.options.apiKey,
+      resources: _res,
+      services: ["Isochrone"]
+    });
+    logger.log("rightManagementIsochrone", rightManagementIsochrone); // les ressources du service d'autocompletion
+
+    _key = this.options.autocompleteOptions.apiKey;
+    _opts = this.options.autocompleteOptions.filterOptions;
+    _res = _opts ? _opts.type : [];
+
+    if (!_res || _res.length === 0) {
+      _res = ["PositionOfInterest", "StreetAddress"];
+    }
+
+    var rightManagementAutoComplete = _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_3__["default"].check({
+      key: _key || this.options.apiKey,
+      resources: _res,
+      services: ["AutoCompletion"]
+    });
+    logger.log("rightManagementAutoComplete", rightManagementAutoComplete); // au cas où pas de droit !
+
+    if (!rightManagementIsochrone && !rightManagementAutoComplete) {
+      this._noRightManagement = true;
+    } // FIXME je reconstruis differement la structure pour la gestion des clefs differentes
+    // pour chaque service...
+
+
+    if (rightManagementAutoComplete) {
+      this._resources["AutoCompletion"] = {};
+      this._resources["AutoCompletion"]["resources"] = rightManagementAutoComplete["AutoCompletion"];
+      this._resources["AutoCompletion"]["key"] = rightManagementAutoComplete["key"];
+    }
+
+    if (rightManagementIsochrone) {
+      this._resources["Isochrone"] = {};
+      this._resources["Isochrone"]["resources"] = rightManagementIsochrone["Isochrone"];
+      this._resources["Isochrone"]["key"] = rightManagementIsochrone["key"];
+    }
+  },
+
+  /**
+   * this method is called by the constructor.
+   * this information is useful to switch to touch mode.
+   * Detection : test for desktop or tactile
+   * @returns {Boolean} desktop or tactile
+   * @private
+   */
+  _detectSupport: function _detectSupport() {
+    // TODO
+    // Choix de gérer la détection dans le code du composant au lieu du DOM car :
+    // Utilisation de l'implémentation Leaflet
+    // http://leafletjs.com/reference.html#browser
+    var isDesktop = true;
+    var userAgent = window.navigator.userAgent.toLowerCase();
+
+    if (userAgent.indexOf("iphone") !== -1 || userAgent.indexOf("ipod") !== -1 || userAgent.indexOf("ipad") !== -1 || userAgent.indexOf("android") !== -1 || userAgent.indexOf("mobile") !== -1 || userAgent.indexOf("blackberry") !== -1 || userAgent.indexOf("tablet") !== -1 || userAgent.indexOf("phone") !== -1 || userAgent.indexOf("touch") !== -1) {
+      isDesktop = false;
+    }
+
+    if (userAgent.indexOf("msie") !== -1 || userAgent.indexOf("trident") !== -1) {
+      isDesktop = true;
+    }
+
+    return isDesktop;
+  },
+  // ################################################################### //
+  // ########################### init dom ############################## //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onAdd(map)
+   * and initialize the container HTMLElement
+   * @param {L.Map} map - object map
+   * @returns {DOMElement} container
+   * @private
+   */
+  _initLayout: function _initLayout(map) {
+    // create main container
+    var container = this._createMainContainerElement();
+
+    var inputShow = this._showContainer = this._createShowIsoElement();
+
+    container.appendChild(inputShow); // mode "collapsed"
+
+    if (!this.options.collapsed) {
+      inputShow.checked = true;
+    }
+
+    var picto = this._pictoContainer = this._createShowIsoPictoElement();
+
+    container.appendChild(picto); // panneau
+
+    var panel = this._createIsoPanelElement(); // header
+
+
+    var header = this._createIsoPanelHeaderElement();
+
+    panel.appendChild(header); // form
+
+    var form = this._formContainer = this._createIsoPanelFormElement(); // form: menu des points
+
+
+    var point = this._createIsoPanelFormPointElement(map);
+
+    form.appendChild(point); // form: menu du choix de la méthode de calcul (time ou distance)
+
+    var isoChronChecked = false;
+    var isoDistChecked = false;
+
+    var typeChoice = this._createIsoPanelFormTypeChoiceElement();
+
+    for (var i = 0; i < this.options.methods.length; i++) {
+      if (this.options.methods[i] === "time") {
+        isoChronChecked = i === 0;
+        typeChoice.appendChild(this._createIsoPanelFormTypeChoiceChronElement(isoChronChecked));
+      }
+
+      if (this.options.methods[i] === "distance") {
+        isoDistChecked = i === 0;
+        typeChoice.appendChild(this._createIsoPanelFormTypeChoiceDistElement(isoDistChecked));
+      }
+    }
+
+    form.appendChild(typeChoice); // form: menu du choix des valeurs
+
+    form.appendChild(this._createIsoPanelFormValueIsochronElement(isoChronChecked));
+    form.appendChild(this._createIsoPanelFormValueIsodistanceElement(isoDistChecked)); // form: menu du choix du transport et du sens du parcours
+
+    var modeChoice = this._createIsoPanelFormModeChoiceElement();
+
+    modeChoice.appendChild(this._createIsoPanelFormModeChoiceTransportElement(this.options.graphs));
+    modeChoice.appendChild(this._createIsoPanelFormModeChoiceDirectionElement(this.options.directions));
+    form.appendChild(modeChoice); // form: menu des exclusions
+
+    if (this.options.exclusions && _typeof(this.options.exclusions) === "object" && Object.keys(this.options.exclusions).length !== 0) {
+      form.appendChild(this._createShowIsoExclusionsElement());
+      form.appendChild(this._createShowIsoExclusionsPictoElement());
+
+      var exclusion = this._createIsoPanelFormExclusionsElement();
+
+      exclusion.appendChild(this._createIsoPanelFormExclusionOptionsElement(this.options.exclusions));
+      form.appendChild(exclusion);
+    }
+
+    var divReset = this._createIsoFormResetElement();
+
+    form.appendChild(divReset); // form: bouton du calcul
+
+    var submit = this._submitContainer = this._createIsoSubmitFormElement();
+
+    form.appendChild(submit);
+    panel.appendChild(form); // waiting
+
+    var waiting = this._waitingContainer = this._createIsoWaitingElement();
+
+    panel.appendChild(waiting);
+    container.appendChild(panel);
+    return container;
+  },
+  // ################################################################### //
+  // ############################## DOM ################################ //
+  // ################################################################### //
+
+  /**
+   * Create a Point
+   * OVERWRITTEN
+   * @param {L.Map} map - object map
+   * @returns {Object} DOM element
+   * @private
+   */
+  _createIsoPanelFormPointElement: function _createIsoPanelFormPointElement(map) {
+    // point de depart
+    this._currentPoint = new _LocationSelector__WEBPACK_IMPORTED_MODULE_5__["default"]({
+      apiKey: this.options.apiKey || null,
+      tag: {
+        id: 0,
+        unique: this._uid,
+        label: "Départ",
+        color: "red",
+        display: true
+      },
+      displayInfo: true,
+      disableReverse: this.options.disableReverse,
+      autocompleteOptions: this.options.autocompleteOptions || null
+    });
+
+    this._currentPoint.setMap(map);
+
+    return this._currentPoint.getContainer();
+  },
+  // ################################################################### //
+  // ####################### handlers events to dom #################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by event 'click' on 'GPshowIsochronPicto' picto
+   * (cf. this._createShowIsoPictoElement),
+   * and clear inputs and previous isochrone drawings
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onShowIsoPanelClick: function onShowIsoPanelClick(e) {
+    logger.log("onShowIsoPanelClick", e); // on desactive l'impl. reduction de la fenetre
+    // if (this._geojsonIso && !this._reducePanel) {
+    //     this._clear();
+    // }
+    // this._reducePanel = false;
+  },
+
+  /**
+   * this method is called by event 'click' on '' arrow button
+   * (cf. this.),
+   * and clear inputs and previous isochrone drawings
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onIsoResetClick: function onIsoResetClick(e) {
+    logger.log("onIsoResetClick", e);
+
+    this._clear();
+  },
+  // // on desactive l'impl. reduction de la fenetre
+  // /**
+  // * this method is called by event 'click' on 'GPisochronPanelReduce' picto
+  // * (cf. this.),
+  // * and reduce the panel
+  // *
+  // * @private
+  // */
+  // onReduceIsoPanelClick : function () {
+  //     logger.log("onReduceIsoPanelClick");
+  //     this._reducePanel = true;
+  // },
+
+  /**
+   * this method is called by event 'change' on 'GPisochronChoiceAltDist' or 'GPisochronChoiceAltChron'
+   * input (cf. this._createIsoPanelFormTypeChoiceElement),
+   * and updates current computation mode
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onIsoTypeChoiceChange: function onIsoTypeChoiceChange(e) {
+    var value = e.target.value;
+
+    if (!value) {
+      return;
+    }
+
+    if (value === "isodistance") {
+      this._currentComputation = "distance";
+    }
+
+    if (value === "isochron") {
+      this._currentComputation = "time";
+    }
+  },
+
+  /**
+   * this method is called by event 'click' on 'GPisochronTransportPedestrian' or 'GPisochronTransportCar'
+   * input (cf. this._createIsoPanelFormModeChoiceTransportElement),
+   * and updates current transport mode
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onIsoModeTransportChange: function onIsoModeTransportChange(e) {
+    var value = e.target.value;
+
+    if (!value) {
+      return;
+    }
+
+    this._currentTransport = value;
+  },
+
+  /**
+   * this method is called by event 'change' on 'GPisochronDirectionSelect' select
+   * (cf. this._createIsoPanelFormModeChoiceDirectionElement),
+   * and updates current direction mode
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onIsoModeDirectionChange: function onIsoModeDirectionChange(e) {
+    var value = e.target.value;
+
+    if (!value) {
+      return;
+    }
+
+    this._currentDirection = value;
+  },
+
+  /**
+   * this method is called by event 'change' on ''
+   * input (cf. this.),
+   * and updates current time value
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onIsoValueChronTimeHourChange: function onIsoValueChronTimeHourChange(e) {
+    var value = e.target.value; // pointer to...
+
+    this._timeHourContainer = e.target;
+
+    if (!value) {
+      return;
+    }
+
+    this._currentTimeHour = value;
+  },
+
+  /**
+   * this method is called by event 'change' on ''
+   * input (cf. this.),
+   * and updates current time value
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onIsoValueChronTimeMinuteChange: function onIsoValueChronTimeMinuteChange(e) {
+    var value = e.target.value; // pointer to...
+
+    this._timeMinuteContainer = e.target;
+
+    if (!value) {
+      return;
+    }
+
+    this._currentTimeMinute = value;
+  },
+
+  /**
+   * this method is called by event 'change' on ''
+   * input (cf. this.),
+   * and updates current distance value
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onIsoValueDistChange: function onIsoValueDistChange(e) {
+    var value = e.target.value; // pointer to...
+
+    this._distanceContainer = e.target;
+
+    if (!value) {
+      return;
+    }
+
+    this._currentDistance = value;
+  },
+
+  /**
+   * this method is called by event 'change' on 'GPIsoExclusionsToll'
+   * or 'GPIsoeExclusionsTunnel' or 'GPIsoExclusionsBridge' tag input
+   * (cf. this._createIsoPanelFormExclusionOptionsElement).
+   * this value is saved as a parameter for the service isocurve.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onIsoExclusionsChange: function onIsoExclusionsChange(e) {
+    var value = e.target.value;
+    var checked = e.target.checked;
+
+    if (!value) {
+      return;
+    }
+
+    var bFound = false;
+    var iFound = null;
+
+    for (var i = 0; i < this._currentExclusions.length; i++) {
+      if (this._currentExclusions[i] === value) {
+        iFound = i;
+        bFound = true;
+      }
+    } // on l'ajoute si la valeur n'existe pas et est selectionnée
+
+
+    if (!bFound && !checked) {
+      this._currentExclusions.push(value);
+    } // on la retire si la valeur existe et est deselectionnée
+
+
+    if (bFound && checked) {
+      this._currentExclusions.splice(iFound, 1);
+    }
+  },
+
+  /**
+   * this method is called by event 'submit' on 'GPisochronForm' tag form
+   * (cf. this._createIsoPanelFormElement),
+   * and call isocurve service to display results
+   *
+   * @private
+   */
+  onIsoComputationSubmit: function onIsoComputationSubmit() {
+    if (!this._currentPoint || !this._currentPoint.getCoordinate || !this._currentPoint.getCoordinate()) {
+      return;
+    } // récupération du temps
+
+
+    var time;
+
+    if (this._currentComputation.toLowerCase() === "time") {
+      // durée exprimée en secondes
+      time = this._currentTimeHour * 3600 + this._currentTimeMinute * 60;
+      logger.log("time : ", time);
+    } // récupération de la distance
+
+
+    var distance;
+
+    if (this._currentComputation.toLowerCase() === "distance") {
+      // distance exprimée en mètres
+      distance = this._currentDistance * 1000;
+      logger.log("distance : ", distance);
+    } // si on n'a pas de valeur de calcul renseignée, on ne lance pas la requête.
+
+
+    if (!time && !distance) {
+      logger.log("Missing time or distance parameter");
+      return;
+    } // oups, aucun droits !
+    // on evite donc une requête inutile ...
+
+
+    if (this._noRightManagement) {
+      return;
+    } // mise en place de la patience
+
+
+    this._displayWaitingContainer();
+
+    var self = this;
+
+    this._requestIsoCurve({
+      position: self._currentPoint.getCoordinate(),
+      graph: self._currentTransport,
+      exclusions: self._currentExclusions,
+      method: self._currentComputation,
+      reverse: self._currentDirection.toLowerCase() === "arrival",
+      time: time,
+      distance: distance,
+      smoothing: true,
+      timeout: 7000,
+      protocol: "XHR",
+      // callback onSuccess
+      onSuccess: function onSuccess(results) {
+        logger.log(results);
+
+        if (results) {
+          self._drawIsoResults(results);
+        }
+      },
+      // callback onFailure
+      onFailure: function onFailure(error) {
+        // FIXME mise à jour du controle mais le service ne repond pas en 200 !?
+        self._hideWaitingContainer();
+
+        self._clearIsoResultsGeometry();
+
+        logger.log(error.message);
+      }
+    });
+  },
+  // ################################################################### //
+  // ######################## isocurve calculation ##################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onIsoComputationSubmit
+   * and executes a request to the service.
+   *
+   * @param {Object} settings - service settings
+   *
+   * @private
+   */
+  _requestIsoCurve: function _requestIsoCurve(settings) {
+    // on ne fait pas de requête si on n'a pas renseigné de parametres !
+    if (!settings || _typeof(settings) === "object" && Object.keys(settings).length === 0) {
+      return;
+    } // on ne fait pas de requête si on n'a pas de point d'origine
+
+
+    if (!settings.position) {
+      return;
+    } // ni si on n'a aucun droit
+
+
+    if (this._noRightManagement) {
+      return;
+    } // gestion des droits !
+
+
+    var services = this._resources["Isochrone"];
+
+    if (!services) {
+      return;
+    }
+
+    var resources = services.resources;
+
+    if (!resources || _typeof(resources) === "object" && Object.keys(resources).length === 0) {
+      return;
+    }
+
+    var options = {}; // on recupere les parametres de saisie et les callbacks
+
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.extend(options, settings); // ainsi que les options du service
+
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.extend(options, this.options.isocurveOptions); // la ressource donne elle des droits ?
+
+    var bFound = false;
+
+    for (var i = 0; i < resources.length; i++) {
+      if (resources[i] === options.graph) {
+        bFound = true;
+      }
+    } // on fait quoi ?
+
+
+    if (!bFound) {
+      logger.log("no rights for this service !?");
+      return;
+    } // cas où la clef API n'est pas renseignée dans les options du service,
+    // on utilise celle de l'autoconf ou celle renseignée au niveau du controle
+
+
+    var key = this._resources["Isochrone"]["key"];
+    options.apiKey = this.options.isocurveOptions.apiKey || this.options.apiKey || key; // si l'utilisateur a spécifié le paramètre ssl au niveau du control, on s'en sert
+    // true par défaut (https)
+
+    options.ssl = this.options.ssl;
+    logger.log(options);
+    geoportal_access_lib__WEBPACK_IMPORTED_MODULE_2__["default"].Services.isoCurve(options);
+  },
+
+  /**
+   * this method is called by this.onIsoComputationSubmit (in case of success)
+   * and draw isocurve results geometry on map
+   *
+   * @param {Object} results - isocurve response results
+   *
+   * @private
+   */
+  _drawIsoResults: function _drawIsoResults(results) {
+    this._clearIsoResultsGeometry(); // sauvegarde de l'etat des resultats
+
+
+    this._currentIsoResults = results;
+
+    if (!results.geometry) {
+      // cache la patience
+      this._hideWaitingContainer();
+
+      return;
+    }
+
+    var map = this._map;
+    var _geometry = results.geometry;
+    var _style = {
+      color: "#ff7800",
+      weight: 5,
+      opacity: 0.65
+    };
+    this._geojsonIso = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.geoJson(_geometry, {
+      style: _style
+    }).addTo(map); // cache la patience
+
+    this._hideWaitingContainer();
+
+    this._formContainer.className = "GPisochroComponentHidden";
+  },
+  // ################################################################### //
+  // ############################# Clean ############################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onShowIsoPanelClick()
+   * and it clears all elements (reinit).
+   *
+   * @private
+   */
+  _clear: function _clear() {
+    this._initTransport();
+
+    this._initExclusions();
+
+    this._initComputation();
+
+    this._initDirection(); // resultats du service
+
+
+    this._currentIsoResults = null; // la geometrie
+
+    this._clearIsoResultsGeometry(); // les points
+
+
+    this._currentPoint.clear(); // nettoyer les valeurs dans le DOM !
+
+
+    if (this._timeHourContainer) {
+      this._timeHourContainer.value = 0;
+    }
+
+    if (this._timeMinuteContainer) {
+      this._timeMinuteContainer.value = 0;
+    }
+
+    if (this._distanceContainer) {
+      this._distanceContainer.value = 0;
+    }
+  },
+
+  /**
+   * this method is called by this.onIsoComputationSubmit()
+   * and it clears all route geometries.
+   *
+   * @private
+   */
+  _clearIsoResultsGeometry: function _clearIsoResultsGeometry() {
+    var map = this._map;
+
+    if (this._geojsonIso != null) {
+      map.removeLayer(this._geojsonIso);
+      this._geojsonIso = null;
+    }
+  },
+  // ################################################################### //
+  // ############################ Patience ############################# //
+  // ################################################################### //
+
+  /**
+   * this method displays waiting container and sets a timeout
+   *
+   * @private
+   */
+  _displayWaitingContainer: function _displayWaitingContainer() {
+    this._waitingContainer.className = "GPisochronCalcWaitingContainerVisible";
+    this._waiting = true; // mise en place d'un timeout pour réinitialiser le panel (cacher la patience)
+    // si on est toujours en attente (si la requête est bloquée par exemple)
+
+    if (this._timer) {
+      clearTimeout(this._timer);
+      this._timer = null;
+    }
+
+    var context = this;
+    this._timer = setTimeout(function () {
+      if (context._waiting === true) {
+        context._hideWaitingContainer();
+      } else {
+        if (context._timer) {
+          clearTimeout(context._timer);
+        }
+      }
+    }, 16000);
+  },
+
+  /**
+   * this method hides waiting container and clears timeout
+   *
+   * @private
+   */
+  _hideWaitingContainer: function _hideWaitingContainer() {
+    if (this._waiting) {
+      this._waitingContainer.className = "GPisochronCalcWaitingContainerHidden";
+      this._waiting = false;
+      clearTimeout(this._timer);
+      this._timer = null;
+    }
+  },
+  // ################################################################### //
+  // ###### METHODES PUBLIQUES (INTERFACE AVEC LE CONTROLE) ############ //
+  // ################################################################### //
+
+  /**
+   * This method is public.
+   * It allows to control the execution of a traitment.
+   *
+   * @param {Object} position - position = {lon: , lat: }
+   * @param {Object} value - distance en km ou heures-minutes
+   * @param {Object} options - options = {...}
+   */
+  compute: function compute(position, value, options) {
+    if (!this._showContainer.checked) {
+      this._pictoContainer.click();
+    }
+
+    var map = this._map;
+
+    if (!map) {
+      return;
+    } // Les options par defauts
+
+
+    var settings = {
+      direction: "departure",
+      method: "time",
+      transport: "Voiture",
+      exclusions: []
+    }; // On recupere les options
+
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.extend(settings, options);
+
+    this._currentPoint.setCoordinate(position);
+
+    var input = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get("GPlocationOrigin_" + 0 + "-" + this._uid);
+    input.value = position.lng + " , " + position.lat;
+    this._currentTransport = settings.transport;
+
+    if (settings.transport === "Voiture") {
+      leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get("GPisochronTransportCar-" + this._uid).checked = true;
+    } else {
+      leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get("GPisochronTransportPedestrian-" + this._uid).checked = true;
+    }
+
+    this._currentExclusions = settings.exclusions;
+    this._currentComputation = settings.method;
+
+    if (settings.method === "time") {
+      var time = value.split(".");
+      this._currentTimeHour = time[0] || 0;
+      leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get("GPisochronValueChronInput1-" + this._uid).value = this._currentTimeHour;
+      this._currentTimeMinute = time[1] || 0;
+      leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get("GPisochronValueChronInput2-" + this._uid).value = this._currentTimeMinute;
+      leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get("GPisochronChoiceAltChron-" + this._uid).click();
+    } else {
+      this._currentDistance = value;
+      leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get("GPisochronValueDistInput-" + this._uid).value = this._currentDistance;
+      leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get("GPisochronChoiceAltDist-" + this._uid).click();
+    }
+
+    this._currentDirection = settings.direction;
+    settings.direction === "departure" ? leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get("GPisochronDirectionSelect-" + this._uid).selectedIndex = 0 : leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.get("GPisochronDirectionSelect-" + this._uid).selectedIndex = 1;
+    this.onIsoComputationSubmit();
+    map.flyTo(position);
+  }
+});
+/* harmony default export */ __webpack_exports__["default"] = (Isocurve);
+
+/***/ }),
+/* 40 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "servicesVersion", function() { return servicesVersion; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "servicesDate", function() { return servicesDate; });
+/* harmony import */ var _Services_Services__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(41);
+/* harmony import */ var _Services_DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56);
+/* harmony import */ var _Services_Alti_Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(68);
+/* harmony import */ var _Services_Alti_Response_model_Elevation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69);
+/* harmony import */ var _Services_AutoComplete_Response_model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(117);
+/* harmony import */ var _Services_AutoComplete_Response_model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(118);
+/* harmony import */ var _Services_AutoConf_Response_model_AutoConfResponse__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(73);
+/* harmony import */ var _Services_AutoConf_Response_model_Constraint__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(74);
+/* harmony import */ var _Services_AutoConf_Response_model_Format__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(75);
+/* harmony import */ var _Services_AutoConf_Response_model_Layer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(76);
+/* harmony import */ var _Services_AutoConf_Response_model_Legend__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(77);
+/* harmony import */ var _Services_AutoConf_Response_model_Metadata__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(78);
+/* harmony import */ var _Services_AutoConf_Response_model_Originator__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(79);
+/* harmony import */ var _Services_AutoConf_Response_model_Service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(80);
+/* harmony import */ var _Services_AutoConf_Response_model_Style__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(81);
+/* harmony import */ var _Services_AutoConf_Response_model_Territory__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(82);
+/* harmony import */ var _Services_AutoConf_Response_model_Thematic__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(83);
+/* harmony import */ var _Services_AutoConf_Response_model_TileMatrix__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(85);
+/* harmony import */ var _Services_AutoConf_Response_model_TileMatrixLimit__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(86);
+/* harmony import */ var _Services_AutoConf_Response_model_TileMatrixSet__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(84);
+/* harmony import */ var _Services_Geocode_Response_model_GeocodeResponse__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(107);
+/* harmony import */ var _Services_Geocode_Response_model_GeocodedLocation__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(109);
+/* harmony import */ var _Services_Geocode_Response_model_DirectGeocodedLocation__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(108);
+/* harmony import */ var _Services_Geocode_Response_model_ReverseGeocodedLocation__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(114);
+/* harmony import */ var _Services_ProcessIsoCurve_Response_model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(139);
+/* harmony import */ var _Services_Route_Response_model_RouteResponse__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(131);
+/* harmony import */ var _Services_Route_Response_model_RouteInstruction__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(132);
+/* harmony import */ var _Protocols_XHR__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(49);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(45);
+/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(47);
+/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(57);
+var _package_json__WEBPACK_IMPORTED_MODULE_30___namespace = /*#__PURE__*/__webpack_require__.t(57, 1);
+/**
+* Global variable Gp.
+*
+* @module Gp
+* @alias Gp
+* @description
+*
+* This is the global variable that is exposed in the browser environment.
+* Content is composed of constructor, functions and properties...
+*
+* > {@link Gp.Error Error()}
+*     - .TYPE_SRVERR : "SERVICE_ERROR"
+*     - .TYPE_UNKERR : "UNKNOWN_ERROR"
+*     - .TYPE_USEERR : "USAGE_ERROR"
+*
+* > {@link module:Helper Helper}
+*     - .indent()
+*     - .normalyzeParameters()
+*     - .normalyzeUrl()
+*
+* > {@link module:XHR Protocols.XHR}
+*     - .call()
+*
+* > {@link module:Services Services (objects)}
+*     - .Alti
+*         - {@link Gp.Services.Alti.Elevation .Elevation()}
+*     - {@link Gp.Services.AltiResponse .AltiResponse()}
+*     - .AutoComplete
+*         - {@link Gp.Services.AutoComplete.SuggestedLocation .SuggestedLocation()}
+*     - {@link Gp.Services.AutoCompleteResponse .AutoCompleteResponse()}
+*     - {@link Gp.Services.Config .Config()}
+*     - {@link Gp.Services.DefaultUrl .DefaultUrl()}
+*     - .Geocode
+*         - {@link Gp.Services.Geocode.GeocodedLocation .GeocodedLocation()}
+*         - {@link Gp.Services.Geocode.ReverseGeocodedLocation .ReverseGeocodedLocation()}
+*         - {@link Gp.Services.Geocode.DirectGeocodedLocation .DirectGeocodedLocation()}
+*     - {@link Gp.Services.GeocodeResponse .GeocodeResponse()}
+*     - {@link Gp.Services.GetConfigResponse .GetConfigResponse()}
+*     - {@link Gp.Services.IsoCurveResponse .IsoCurveResponse()}
+*     - .Route
+*         - {@link Gp.Services.Route.RouteInstruction .RouteInstruction()}
+*     - {@link Gp.Services.RouteResponse .RouteResponse()}
+*
+* > Services (factory)
+*     - {@link module:Services~autoComplete .autoComplete()}
+*     - {@link module:Services~geocode .geocode()}
+*     - {@link module:Services~getAltitude .getAltitude()}
+*     - {@link module:Services~getConfig .getConfig()}
+*     - {@link module:Services~isoCurve .isoCurve()}
+*     - {@link module:Services~reverseGeocode .reverseGeocode()}
+*     - {@link module:Services~route .route()}
+*
+* > servicesDate : "YYYY-MM-DD"
+*
+* > servicesVersion : "X.X.X"
+*
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/** Version */
+const servicesVersion = _package_json__WEBPACK_IMPORTED_MODULE_30__.version;
+/** Publication date */
+const servicesDate = _package_json__WEBPACK_IMPORTED_MODULE_30__.date;
+
+// on declare les ns dans root global
+var Gp = {};
+
+Gp.servicesVersion = servicesVersion;
+Gp.servicesDate = servicesDate;
+
+// Export Protocols
+Gp.Protocols = {};
+Gp.Protocols.XHR = _Protocols_XHR__WEBPACK_IMPORTED_MODULE_27__["default"];
+// Export services
+Gp.Services = _Services_Services__WEBPACK_IMPORTED_MODULE_0__["default"];
+// Export DefaultUrls
+Gp.Services.DefaultUrl = _Services_DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__["default"];
+// Export Alti
+Gp.Services.AltiResponse = _Services_Alti_Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_2__["default"];
+Gp.Services.Alti = {};
+Gp.Services.Alti.Elevation = _Services_Alti_Response_model_Elevation__WEBPACK_IMPORTED_MODULE_3__["default"];
+// Export Autocomplete
+Gp.Services.AutoCompleteResponse = _Services_AutoComplete_Response_model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_4__["default"];
+Gp.Services.AutoComplete = {};
+Gp.Services.AutoComplete.SuggestedLocation = _Services_AutoComplete_Response_model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_5__["default"];
+// Export Autoconf
+Gp.Services.GetConfigResponse = _Services_AutoConf_Response_model_AutoConfResponse__WEBPACK_IMPORTED_MODULE_6__["default"];
+Gp.Services.Config = {};
+Gp.Services.Config.Constraint = _Services_AutoConf_Response_model_Constraint__WEBPACK_IMPORTED_MODULE_7__["default"];
+Gp.Services.Config.Format = _Services_AutoConf_Response_model_Format__WEBPACK_IMPORTED_MODULE_8__["default"];
+Gp.Services.Config.Layer = _Services_AutoConf_Response_model_Layer__WEBPACK_IMPORTED_MODULE_9__["default"];
+Gp.Services.Config.Legend = _Services_AutoConf_Response_model_Legend__WEBPACK_IMPORTED_MODULE_10__["default"];
+Gp.Services.Config.Metadata = _Services_AutoConf_Response_model_Metadata__WEBPACK_IMPORTED_MODULE_11__["default"];
+Gp.Services.Config.Originator = _Services_AutoConf_Response_model_Originator__WEBPACK_IMPORTED_MODULE_12__["default"];
+Gp.Services.Config.Service = _Services_AutoConf_Response_model_Service__WEBPACK_IMPORTED_MODULE_13__["default"];
+Gp.Services.Config.Style = _Services_AutoConf_Response_model_Style__WEBPACK_IMPORTED_MODULE_14__["default"];
+Gp.Services.Config.Territory = _Services_AutoConf_Response_model_Territory__WEBPACK_IMPORTED_MODULE_15__["default"];
+Gp.Services.Config.Thematic = _Services_AutoConf_Response_model_Thematic__WEBPACK_IMPORTED_MODULE_16__["default"];
+Gp.Services.Config.TileMatrix = _Services_AutoConf_Response_model_TileMatrix__WEBPACK_IMPORTED_MODULE_17__["default"];
+Gp.Services.Config.TileMatrixLimit = _Services_AutoConf_Response_model_TileMatrixLimit__WEBPACK_IMPORTED_MODULE_18__["default"];
+Gp.Services.Config.TileMatrixSet = _Services_AutoConf_Response_model_TileMatrixSet__WEBPACK_IMPORTED_MODULE_19__["default"];
+// Export Geocode
+Gp.Services.GeocodeResponse = _Services_Geocode_Response_model_GeocodeResponse__WEBPACK_IMPORTED_MODULE_20__["default"];
+Gp.Services.Geocode = {};
+Gp.Services.Geocode.GeocodedLocation = _Services_Geocode_Response_model_GeocodedLocation__WEBPACK_IMPORTED_MODULE_21__["default"];
+Gp.Services.Geocode.DirectGeocodedLocation = _Services_Geocode_Response_model_DirectGeocodedLocation__WEBPACK_IMPORTED_MODULE_22__["default"];
+Gp.Services.Geocode.ReverseGeocodedLocation = _Services_Geocode_Response_model_ReverseGeocodedLocation__WEBPACK_IMPORTED_MODULE_23__["default"];
+// Export IsoCurve
+Gp.Services.IsoCurveResponse = _Services_ProcessIsoCurve_Response_model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_24__["default"];
+// Export Route
+Gp.Services.RouteResponse = _Services_Route_Response_model_RouteResponse__WEBPACK_IMPORTED_MODULE_25__["default"];
+Gp.Services.Route = {};
+Gp.Services.Route.RouteInstruction = _Services_Route_Response_model_RouteInstruction__WEBPACK_IMPORTED_MODULE_26__["default"];
+// Export Erreurs et Outils
+Gp.Error = _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_28__["default"];
+Gp.Helper = _Utils_Helper__WEBPACK_IMPORTED_MODULE_29__["default"];
+
+/* harmony default export */ __webpack_exports__["default"] = (Gp);
+
+
+/***/ }),
+/* 41 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Alti_Alti__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(42);
+/* harmony import */ var _AutoConf_AutoConf__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(70);
+/* harmony import */ var _Geocode_Geocode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(87);
+/* harmony import */ var _Geocode_ReverseGeocode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(110);
+/* harmony import */ var _AutoComplete_AutoComplete__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(115);
+/* harmony import */ var _Route_Route__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(119);
+/* harmony import */ var _ProcessIsoCurve_ProcessIsoCurve__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(134);
+/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "point|circle|bbox" }] */
+
+/**
+* Geoportal web services invocation namespace.
+*
+* @module Services
+* @alias Gp.Services
+*/
+
+
+
+
+
+
+
+
+var Services = {
+    /**
+     * Access to Geoportal resources metadata availables with one ore several keys, using [Auto-configuration service]{@link https://wxs.ign.fr/APIKEY/autoconf} of the Geoportal platform.
+     *
+     * @method getConfig
+     * @param {Object} options - Options for function call.
+     * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link http://professionnels.ign.fr/ign/contrats}.
+     * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GetConfigResponse} object as a parameter except if "rawResponse" parameter is set to true : a String will be returned.
+     * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.
+     * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.
+     * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/autoconf] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.
+     * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).
+     * @param {String} [options.protocol=JSONP] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.
+     * @param {String} [options.proxyURL] - Proxy URL to use when requesting an underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.
+     * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.
+     * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.
+     * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.
+     * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.
+     * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.
+     */
+    getConfig : function (options) {
+        var autoconfService = new _AutoConf_AutoConf__WEBPACK_IMPORTED_MODULE_1__["default"](options);
+        autoconfService.call();
+    },
+
+    /**
+     * Getting elevations in or along of one or several points on french territories using the [elevation services of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/alti.html}.<br/>
+     * Two use cases are availables :<br/>
+     * 1. getting elevations of the given points : don't use the options.sampling parameter ;<br/>
+     * 2. getting a regular set of elevations along the given points : use the options.sampling parameter.
+     *
+     * @method getAltitude
+     * @param {Object} options - Options for function call.
+     * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link http://professionnels.ign.fr/ign/contrats}.
+     * @param {Array.<Object>} options.positions - Array of positions ({lon:float, lat:float}) expressed in CRS:84 coordinates system, where to get elevations. 50 positions maximum may be given. 2 positions minimum are required if you use the options.sampling parameter.
+     * @param {Number} [options.sampling] - Number of points to use (between 2 and 5000) in order to compute an elevation path. The points given with the options.positions parameter are used to fix the planimetric path along which the elevations will be computed.<br/>
+     * If not used, only elevations of these positions will be returned.
+     * @param {Boolean} [options.zonly=false] - Set this parameter to true if you only want to have elevations returned without corresponding coordinates.
+     * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.AltiResponse} object as a parameter, except if "rawResponse" is set to true.
+     * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.
+     * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.
+     * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/alti/rest/elevation.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.
+     * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).
+     * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.
+     * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.
+     * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.
+     * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.
+     * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.
+     * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.
+     * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.
+     * @param {String} [options.api='REST'] - What API to use for interacting with underlying web service : 'REST' or 'WPS'. Only use if you know what you are doing.
+     * @param {String} [options.outputFormat='xml'] - Output format for underlying web service response : 'xml' or 'json'. Only use if you know what you are doing.
+     */
+    getAltitude : function (options) {
+        var altiService = new _Alti_Alti__WEBPACK_IMPORTED_MODULE_0__["default"](options);
+        altiService.call();
+    },
+    /**
+     * Getting positon of a geographic identifier (places names, address, cadastral parcel, other...) using the [geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage.html}.
+     *
+     * @example
+     * Gp.Services.geocode ({
+     *     apiKey : "jhyvi0fgmnuxvfv0zjzorvdn",
+     *     location : "73 avenue de Paris, Saint-Mandé",
+     *     // traitement des resultats
+     *     onSuccess  : function (result) {
+     *         console.log("found (x:"+result.position.x+", y:"+result.position.y+")") ;
+     *     }
+     * }) ;
+     *
+     *
+     * @method geocode
+     * @param {Object} options - Options for function call.
+     * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link http://professionnels.ign.fr/ign/contrats}.
+     * @param {String|Object} options.location - Geographic identifier to locate. May be provided as a single String or a structured Object for an address search. In this last case, the following properties are availaibles.
+     *      @param {Number} [options.location.number] - Street number.
+     *      @param {String} [options.location.street] - Street name.
+     *      @param {String} [options.location.city] - City name.
+     *      @param {Number} [options.location.postalCode] - Postal Code
+     * @param {Object} [options.filterOptions] - Additional filters to apply to search. The following properties may be given.
+     *      @param {Gp.BBox} [options.filterOptions.bbox] - Bounding box where to perform the search. Properties expressed in options.srs coordinates system.
+     *      @param {Array.<String>} [options.filterOptions.type] - Geographical identifier types to search. Values currently availables are : "PositionOfInterest" for place names, "StreetAddress" for address search, "CadastralParcel" for Cadastral parcels search. Default is "StreetAddress".
+     *
+     *      @param {String} [options.filterOptions.[prop]] - Additionnal properties to filter search. Properties depends on options.filterOptions.type, and values type should be "String".
+     *      <br/><br/>
+     *      Common Properties availables for all search types :<br/>
+     *      "municipality", "insee", "department".
+     *      <br/><br/>
+     *      Properties availables for address search :<br/>
+     *      "quality", "ID", "ID_TR" and "territory".
+     *      <br/><br/>
+     *      Properties availables for place names search :<br/>
+     *      "importance", "nature" and "territory".
+     *      <br/><br/>
+     *      Properties availables for cadastral parcels search :<br/>
+     *      "sheet", "section", and "absorbedcity".
+     * @param {Number} [options.maximumResponses = 25] - Maximum number of responses. Default underlying service value applies (25) if not provided.
+     * @param {Boolean} [options.returnFreeForm = false] - Set this parameter to true if you wish to have an address returned in a single String (unstructured). If unset, default underlying service value (false) applies.
+     * @param {String} [options.srs = EPSG:4326] - Coordinates System used to expres coordinates for parameters and responses. Default underlying service value (EPSG:4326) applies.
+     * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GeocodeResponse} object as a parameter except if "rawResponse" is set to true.
+     * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.
+     * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.
+     * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/geoportail/ols] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.
+     * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).
+     * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.
+     * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.
+     * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.
+     * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.
+     * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.
+     * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.
+     * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.
+     */
+    geocode : function (options) {
+        var geocodeService = new _Geocode_Geocode__WEBPACK_IMPORTED_MODULE_2__["default"](options);
+        geocodeService.call();
+    },
+    /**
+     * Retrieving geographical identifiers (place names, address, cadastral parcels, ...) near a given position, using the [reverse geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage-inverse.html}.
+     *
+     * @method reverseGeocode
+     * @param {Object} options - Options for function call.
+     * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link http://professionnels.ign.fr/ign/contrats}.
+     * @param {Gp.Point} options.position - Reference position where to search geographical identifiers. Its coordinates are expressed in the coordinates system given with options.srs parameter. (default is CRS:84, that means position.x is the longitude and position.y the latitude)
+     * @param {Object} [options.filterOptions] - Additional filters to apply to search. The following properties may be given.
+     *      @param {Array.<String>} [options.filterOptions.type] - Geographical identifier types to search. Values currently availables are : "PositionOfInterest" for place names, "StreetAddress" for address search, "CadastralParcel" for Cadastral parcels search. Default is "StreetAddress".
+     *      @param {Gp.BBox} [options.filterOptions.bbox] - Bounding box where to perform the search. Expressed in options.srs coordinates system.
+     *      @param {Gp.Circle} [options.filterOptions.circle] - Circle where to perform the search. Expressed in options.srs coordinates system.
+     * @param {Array.<Gp.Point>} [options.filterOptions.polygon] - Polygon where to perform the search. Expressed in options.srs coordinates system.
+     * @param {Number} [options.maximumResponses] - Maximum number of responses. Default underlying service value applies (25) if not provided.
+     * @param {Boolean} [options.returnFreeForm = false] - Set this parameter to true if you wish to have an address returned in a single String (unstructured). If unset, default underlying service value (false) applies.
+     * @param {String} [options.srs = CRS:84] - Coordinates System used to express coordinates for parameters and responses. Only WGS 84 geographical positioning is supported. Therefore, two values are allowed : "CRS:84" (position.x is the longitude and position.y the latitude) and "EPSG:4326" (position.x is the latitude and position.y the longitude) . Default is CRS:84.
+     * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GeocodeResponse} object as a parameter except if "rawResponse" is set to true.
+     * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.
+     * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.
+     * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/geoportail/ols] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.
+     * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).
+     * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.
+     * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.
+     * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.
+     * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.
+     * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.
+     * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.
+     * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.
+     */
+    reverseGeocode : function (options) {
+        var reverseGeocodeService = new _Geocode_ReverseGeocode__WEBPACK_IMPORTED_MODULE_3__["default"](options);
+        reverseGeocodeService.call();
+    },
+    /**
+     * Getting suggestions of probable places names or address based on uncomplete texts, using the [autocompletion service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/autocompletion.html}
+     *
+     * @method autoComplete
+     * @param {Object} options - Options for function call.
+     * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link http://professionnels.ign.fr/ign/contrats}.
+     * @param {String} options.text - Text input to complete.
+     * @param {Array.<String>} [options.filterOptions.type = "StreetAddress"] - Suggestion types to provide : address ("StreetAddress") and/or place name ("PositionOfInterest").
+     * @param {Array.<String>} [options.filterOptions.territory] - Places where to limit the search of suggestions : "METROPOLE" (Corsica and metropolitan France), "DOMTOM" (French overseas departments and territories), or an INSEE code of a department. No limitation by default. For instance : ['METROPOLE', '31']
+     * @param {Number} [options.maximumResponses = 10] - Maximum number of responses.
+     * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.AutoCompleteResponse} object as a parameter except if "rawResponse" is set to true.
+     * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.
+     * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.
+     * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/ols/apis/completion] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.
+     * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).
+     * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.
+     * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.
+     * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.
+     * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.
+     * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.
+     * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.
+     * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.
+     */
+    autoComplete : function (options) {
+        var autoCompleteService = new _AutoComplete_AutoComplete__WEBPACK_IMPORTED_MODULE_4__["default"](options);
+        autoCompleteService.call();
+    },
+    /**
+     * Getting a route from one point to another using the [route service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/itineraires.html}.
+     *
+     * @method route
+     * @param {Object} options - Options for function call.
+     * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link http://professionnels.ign.fr/ign/contrats}.
+     * @param {String} [options.routePreference = "fastest"] - Indicates the way to compute the route : "fastest" (time optimisation) or "shortest" (distance optimisation).
+     * @param {Gp.Point} options.startPoint - Start point of the route. Expressed in CRS:84 coordinates system (startPoint.x corresponds to longitude, startPoint.y corresponds to latitude).
+     * @param {Gp.Point} options.endPoint - End point of the route. Expressed in CRS:84 coordinates system (endPoint.x corresponds to longitude, endPoint.y corresponds to latitude).
+     * @param {Array.<Gp.Point>} [options.viaPoints] - Ordered via Points of the route. Expressed in CRS:84 coordinates system (viaPoints[i].x corresponds to longitude, viaPoints[i].y corresponds to latitude).
+     * @param {String} [options.graph = "Voiture"] - User profile to use to compute the route : "Voiture" (using a vehicule) or "Pieton" (pedestrian). Has an influence on the kind of roads the route may use and the average speed.
+     * @param {Array.<String>} [options.exclusions] - Indicates if route has to avoid some features ("toll", "bridge" or "tunnel").
+     * @param {Boolean} [options.geometryInInstructions = false] - Indicates if route geometry has to be also returned with route instructions.
+     * @param {Boolean} [options.provideBoundingBox = true] - Indicates if route instructions has to be localised with a BBOX in the response.
+     * @param {String} [options.distanceUnit = "km"] - The unit used to provide distances in the response ("m" or "km").
+     * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.RouteResponse} object as a parameter except if "rawResponse" is set to true.
+     * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.
+     * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.
+     * @param {String} [options.outputFormat='json'] - Output format ("json" or "xml") to use for underlying webService. Only use if you know what you are doing.
+     * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/itineraire/rest/route.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.
+     * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).
+     * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.
+     * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.
+     * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.
+     * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.
+     * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.
+     * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.
+     * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.
+     */
+    route : function (options) {
+        var routeService = new _Route_Route__WEBPACK_IMPORTED_MODULE_5__["default"](options);
+        routeService.call();
+    },
+    /**
+     * Computing a set of places (curve) reachable from a given point (or from where to start to reach a given point) within a time or distance constraint using the [isochrone service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/isochrones.html}.
+     *
+     * @method isoCurve
+     * @param {Object} options - Options for function call.
+     * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link http://professionnels.ign.fr/ign/contrats}.
+     * @param {Gp.Point} options.position - Start or Arrival (options.reverse===true) Point for the computing. Expressed in CRS:84 coordinates system (position.x corresponds to longitude, position.y corresponds to latitude).
+     * @param {String} [options.graph = "Voiture"] - User profile to use to compute the isoCurve : "Voiture" (using a vehicule) or "Pieton" (pedestrian). Has an influence on the kind of roads to use and the average speed.
+     * @param {Array.<String>} [options.exclusions] - Indicates if route has to avoid some features ("toll", "bridge" or "tunnel").
+     * @param {String} [options.method = "time"] - Computing method to use : "time" (using a duration as a constraint) or "distance" (using a distance as a constraint).
+     * @param {Float} options.time - Maximum duration (expressed in seconds) to use when options.method is set to "time".
+     * @param {Float} options.distance - Maximum distance (expressed in meters) to use when options.method is set to "distance".
+     * @param {Boolean} [options.reverse = false] - Set this parameter to true if you want options.position to be the destination (instead of departure) for the computing.
+     * @param {Boolean} [options.smoothing = false] - Set this parameter to true if you want the resulting geometry to be smoothed.
+     * @param {Boolean} [options.holes = false] - Set this parameter to true if you want the resulting geometry (polygon) to have holes if pertinent.
+     * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.IsoCurveResponse} object as a parameter except if "rawResponse" is set to true.
+     * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.
+     * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.
+     * @param {String} [options.outputFormat='json'] - Output format ("json" or "xml") to use for underlying webService. Only use if you know what you are doing.
+     * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/isochrone/isochrone.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.
+     * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).
+     * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.
+     * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.
+     * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.
+     * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.
+     * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.
+     * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.
+     * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.
+     */
+    isoCurve : function (options) {
+        var processIsoCurveService = new _ProcessIsoCurve_ProcessIsoCurve__WEBPACK_IMPORTED_MODULE_6__["default"](options);
+        processIsoCurveService.call();
+    }
+};
+
+/**
+ * Point object.
+ *
+ * @namespace
+ * @alias Gp.Point
+ *
+ * @property {Float} x - Point abscissa
+ * @property {Float} y - Point ordinate
+ */
+var point = {};
+
+/**
+ * Circle object.
+ *
+ * @namespace
+ * @alias Gp.Circle
+ *
+ * @property {Float} x - Circle center abscissa.
+ * @property {Float} y - Circle center ordinate.
+ * @property {Float} radius - Circle radius.
+ */
+var circle = {};
+
+/**
+ * Bounding box object, expressed with four coordinates.
+ *
+ * @namespace
+ * @alias Gp.BBox
+ *
+ * @property {Float} left - minimum abscissa
+ * @property {Float} right - maximum abscissa
+ * @property {Float} bottom - minimum ordinate
+ * @property {Float} top - maximum ordinate
+ */
+var bbox = {};
+
+/* harmony default export */ __webpack_exports__["default"] = (Services);
+
+
+/***/ }),
+/* 42 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45);
+/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(46);
+/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(56);
+/* harmony import */ var _Request_AltiRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(58);
+/* harmony import */ var _Response_AltiResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(65);
+
+
+
+
+
+
+
+
+
+/**
+ * @classdesc
+ *
+ * Appel du service d'altimétrie du Géoportail
+ *
+ * @todo gestion du parma. output et callback
+ * @todo outputFormat (REST) et format (WPS)
+ * @todo La reponse JSON peut encapsuler un XML !
+ *
+ * @constructor
+ * @extends {Gp.Services.CommonService}
+ * @alias Gp.Services.Alti
+ * @param {Object} options - options spécifiques au service (+ les options heritées)
+ *
+ * @param {Array.<Object>} options.positions - Tableau ({lon:float,lat:float}) contenant les coordonnées des points (CRS:84)
+ *      dont on veut connaître les altitudes (ou à partir desquelles on va calculer le profil).
+ *      Chaque élément du tableau est un objet JavaScript avec deux attributs : lon et lat, qui sont des flottants.
+ *      Minimum 2 éléments si on souhaite calculer un profil altimétrique (ElevationLine).
+ *      Maximum 50 éléments.
+ *
+ * @param {String} options.outputFormat - Le format de la réponse du service alti : 'xml' ou 'json'.
+ *      Ce paramètre déterminera l'extension '.xml' ou '.json' du service dans le cas de l'API REST,
+ *      ou la valeur du paramètre 'format' dans le cas de la norme WPS.
+ *      Nécessaire si serverUrl est renseigné, et qu'on souhaite passer par l'API REST,
+ *      pour connaître le format dans lequel sera fournie la réponse (pour son traitement).
+ *      Non nécessaire pour la norme WPS. Par défaut, ce paramètre vaut 'json'.
+ *
+ * @param {Number} [options.sampling] - Nombre de points à utiliser pour déterminer le tracé d'un profil altimétrique, compris entre 2 et 5000.
+ *      A spécifier lorsqu'on souhaite accéder à cette fonctionnalité.
+ *      Dans ce cas, les points fournis en entrée (au minimum de deux) servent à déterminer l'axe planimétrique
+ *      le long duquel le profil doit être calculé.
+ *      Si le paramètre sampling n'est pas spécifié ou moins de deux points sont fournis,
+ *      c'est le service Elevation qui sera interrogé (altitudes simples calculées pour les points fournis).
+ *      Une valeur de sampling strictement inférieure à 2 déclenchera un échantillonnage avec la valeur par défaut du service (3 points).
+ *
+ * @param {String} [options.api] - Manière d'accéder au service : 'REST' (via l'API REST) ou 'WPS' (via la norme WPS).
+ *      Par défaut, on utilise l'API REST.
+ *
+ * @param {Boolean} [options.zonly] - Permet de ne récupérer que les altitudes en sortie s'il vaut 'true'.
+ *      Vaut 'false' par défaut.
+ *
+ * @example
+ *   var options = {
+ *      apiKey : null,
+ *      serverUrl : 'http://localhost/service/',
+ *      protocol : 'JSONP', // JSONP|XHR
+ *      proxyURL : null,
+ *      httpMethod : 'GET', // GET|POST
+ *      timeOut : 10000, // ms
+ *      rawResponse : false, // true|false
+ *      scope : null, // this
+ *      onSuccess : function (response) {},
+ *      onFailure : function (error) {},
+ *      // spécifique au service
+ *      positions : [{lon:, lat:}, {lon:, lat:}],
+ *      outputFormat : 'json' // json|xml
+ *      sampling : 3,
+ *      api : 'REST', // REST|WPS
+ *      zonly : false // false|true
+ *   };
+ *
+ * @private
+ */
+function Alti (options) {
+    if (!(this instanceof Alti)) {
+        throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "Alti"));
+    }
+
+    /**
+     * Nom de la classe (heritage)
+     * FIXME instance ou classe ?
+     */
+    this.CLASSNAME = "Alti";
+
+    // appel du constructeur par heritage
+    _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, arguments);
+
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.Alti");
+    this.logger.trace("[Constructeur Alti (options)]");
+
+    // #####################
+    // analyse des options
+    // #####################
+
+    if (!options.positions) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "positions"));
+    }
+
+    if (options.positions.length === 0) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "positions"));
+    }
+
+    // ajout des options spécifiques au service
+    this.options.positions = options.positions;
+
+    // format de réponse du service : "json" ou "xml" (valeur par défaut), en minuscule !
+    this.options.outputFormat = (typeof options.outputFormat === "string") ? options.outputFormat.toLowerCase() : "xml";
+
+    // sampling
+    this.options.sampling = options.sampling || null;
+
+    // type d'api utilisé pour requeter le service, en majuscule !
+    this.options.api = (typeof options.api === "string") ? options.api.toUpperCase() : "REST";
+
+    // l'api ne peut être interrogée qu'en GET.
+    if (this.options.api === "REST") {
+        this.options.httpMethod = "GET";
+    }
+
+    // param. zonly
+    this.options.zonly = options.zonly || false;
+
+    // gestion de l'url du service par defaut
+    // si l'url n'est pas renseignée, il faut utiliser les urls par defaut
+    // en fonction du type d'api, REST ou WPS, du format de reponse demandé (outputFormat)
+    // ainsi que sur le type de service (profil ou elevation)
+    if (!this.options.serverUrl) {
+        var lstUrlByDefault = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].Alti.url(this.options.apiKey);
+        var urlFound = null;
+        switch (this.options.api) {
+            case "WPS":
+                urlFound = lstUrlByDefault.wps;
+                break;
+            case "REST":
+                var key = (options.sampling ? "profil" : "elevation") + "-" + this.options.outputFormat;
+                urlFound = lstUrlByDefault[key];
+                break;
+            default:
+                throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_UNKNOWN", "api"));
+        }
+
+        if (!urlFound) {
+            throw new Error("Url by default not found !");
+        }
+        this.options.serverUrl = urlFound;
+        this.logger.trace("Server URL by default : " + this.options.serverUrl);
+    }
+
+    // gestion du type de service
+    // si l'extension de l'url est .json ou .xml, on surcharge le format de sortie (outputFormat)
+    var idx = this.options.serverUrl.lastIndexOf(".");
+    if (idx !== -1) {
+        var extension = this.options.serverUrl.substring(idx + 1);
+        if (extension && extension.length < 5) { // FIXME extension de moins de 4 car. ...
+            this.logger.trace("Server Extension URL : " + extension);
+            switch (extension.toLowerCase()) {
+                case "json":
+                case "xml":
+                    this.options.outputFormat = extension.toLowerCase();
+                    break;
+                default:
+                    throw new Error("type of service : unknown or unsupported (json or xml) !");
+            }
+        }
+    }
+}
+
+/**
+ * @lends module:Alti#
+ */
+Alti.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, {
+    // todo
+    // getter/setter
+});
+
+/**
+ * Constructeur (alias)
+ */
+Alti.prototype.constructor = Alti;
+
+/**
+ * Création de la requête (overwrite)
+ *
+ * @param {Function} error   - callback des erreurs
+ * @param {Function} success - callback
+ */
+Alti.prototype.buildRequest = function (error, success) {
+    // utilisation en mode callback
+    var options = {
+        httpMethod : this.options.httpMethod,
+        // callback
+        onSuccess : function (result) {
+            // sauvegarde de la requete !
+            this.request = result;
+            success.call(this, this.request);
+        },
+        onError : error,
+        scope : this,
+        // spécifique au service :
+        positions : this.options.positions,
+        outputFormat : this.options.outputFormat,
+        sampling : this.options.sampling,
+        api : this.options.api,
+        zonly : this.options.zonly
+    };
+
+    _Request_AltiRequestFactory__WEBPACK_IMPORTED_MODULE_5__["default"].build(options);
+};
+
+/**
+ * Analyse de la reponse (overwrite)
+ *
+ * @param {Function} error   - callback des erreurs
+ * @param {Function} success - callback
+ */
+Alti.prototype.analyzeResponse = function (error, success) {
+    // INFO
+    // Factory pour masquer la complexité du retour du service qui renvoie soit
+    //  - une 'string' qui contient du XML ou JSON natif en mode XHR
+    //  - un objet JSON qui est natif ou encapsulé
+
+    if (this.response) {
+        var options = {
+            response : this.response,
+            outputFormat : this.options.outputFormat, // utile pour parser la string en mode XHR : JSON ou XML !
+            rawResponse : this.options.rawResponse,
+            onError : error,
+            onSuccess : success,
+            scope : this
+        };
+
+        _Response_AltiResponseFactory__WEBPACK_IMPORTED_MODULE_6__["default"].build(options);
+    } else {
+        error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY")));
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Alti);
+
+
+/***/ }),
+/* 43 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(35);
+/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(loglevel__WEBPACK_IMPORTED_MODULE_0__);
+
+
+var LoggerByDefault = {
+    /**
+     * logger statique
+     *
+     * @static
+     * @param {String} name - nom du logger
+     * @returns {Object} retourne un logger
+     */
+    getLogger : function (name) {
+        // Substitute global constants configured at compile time
+        // cf. webpack.config.js
+        // FIXME howtodo !? DefineWebpackPlugin ? EnvironmentWebpackPlugin ?
+        ("false".match(/true/))
+            ? loglevel__WEBPACK_IMPORTED_MODULE_0__["disableAll"]() : loglevel__WEBPACK_IMPORTED_MODULE_0__["enableAll"]();
+        var logname = name || "default";
+        return loglevel__WEBPACK_IMPORTED_MODULE_0__["getLogger"](logname);
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (LoggerByDefault);
+
+
+/***/ }),
+/* 44 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/**
+ * Classe de gestion des erreurs qui permer d'associer un message d'erreur à l'exception lancée.
+ *
+ * @example
+ * MessagesResources.getMessage("ERROR_PARAM_MISSING", "x", "y", "z")));
+ * // --> output : Parameter(s) 'x - y - z' missing
+ *
+ * @module MessagesResources
+ * @alias Gp.Utils.MessagesResources
+ * @private
+ */
+var MessagesResources = {
+
+    // Paramètres
+    PARAM_MISSING : "Parameter(s) '%var%' missing",
+    PARAM_EMPTY : "Parameter(s) '%var%' empty",
+    PARAM_TYPE : "Wrong type(s) for parameter(s) '%var%'",
+    PARAM_FORMAT : "Parameter(s) '%var%' not correctly formatted",
+    PARAM_NOT_SUPPORT : "Value(s) for parameter(s) '%var%' not supported",
+    PARAM_NOT_SUPPORT_NODEJS : "Value(s) for parameter(s) '%var%' not supported to NodeJS",
+    PARAM_UNKNOWN : "Value(s) for parameter(s) '%var%' unknown",
+
+    // Services
+    // Requête
+    SERVICE_REQUEST_BUILD : "An error occurred during the request building of the service",
+    SERVICE_REQUEST_EMPTY : "The request sent to the service is empty",
+
+    // Réponse
+    SERVICE_RESPONSE_EXCEPTION : "The service returned an exception : '%var%'",
+    SERVICE_RESPONSE_EXCEPTION_2 : "The service returned an exception",
+    SERVICE_RESPONSE_ANALYSE : "An error occurred while parsing the response '%var%' of the service",
+    SERVICE_RESPONSE_ANALYSE_2 : "An unknown error occurred while parsing the response",
+    SERVICE_RESPONSE_EMPTY : "The response of the service is empty",
+    SERVICE_RESPONSE_EMPTY_2 : "The response from the service could not be analyzed or is empty",
+    SERVICE_RESPONSE_FORMAT : "The format of the service response is not supported (handled format(s) : '%var%')",
+    SERVICE_RESPONSE_FORMAT_2 : "The format of the service response is not supported",
+    SERVICE_RESPONSE_FORMAT_3 : "No suggestion matching the search",
+
+    // Classes
+    CLASS_CONSTRUCTOR : "'%var%' constructor cannot be called as a function.",
+
+    /**
+     * Fonction qui va retourner le message d'erreur associé à la clé donnée
+     *
+     * @method getMessage
+     * @param {String} clef - Clef de l'erreur (ex : ERROR_PARAM)
+     * @param {String[]} parametres - Paramètres/variables concernés par le message d'erreur associé à la clef donnée
+     * @return {String} message - String contenant le message de l'exception
+     */
+    getMessage : function (clef, parametres) {
+        // param de la fonction uniquement pour la documentation...
+
+        if (Object.keys(arguments).length === 0) {
+            return "Message indefined !";
+        }
+
+        var params = Array.prototype.slice.call(arguments);
+        var key = params.shift();
+        var args = params;
+
+        var message = this[key];
+
+        try {
+            if (Array.isArray(args) && args.length > 0) {
+                message = message.replace("%var%", args.join(" - "));
+            } else {
+                message = message.replace("%var%", "%var% (not specified)");
+            }
+        } catch (e) {
+            // error de string.replace()
+
+        }
+
+        return message;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (MessagesResources);
+
+
+/***/ }),
+/* 45 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/**
+ * Errors raised by API for one among three reasons : wrong API usage, underlying service error or unknown reason.
+ *
+ * @property {String} message - Error message
+ * @property {Number} status - Error status : when {@link Gp.Error.TYPE_SRVERR}, gives the [HTTP status of the underlying web service response]{@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes} ; -1 otherwise.
+ * @property {String} type - Error type ({@link Gp.Error.TYPE_SRVERR}, {@link Gp.Error.TYPE_USEERR} or {@link Gp.Error.TYPE_UNKERR}).
+ *
+ * @namespace
+ * @alias Gp.Error
+ * @param {Object|String} error - Options for creating error object. Can be a String (message) or an Object.
+ * @param {String} error.message - Error message to return to user.
+ * @param {enum} [error.type=TYPE_UNKERR] - Error type
+ * @param {status} [error.status=-1] - Error status : when {@link Gp.Error.TYPE_SRVERR}, gives the [HTTP status of the underlying web service response]{@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes}.
+ *
+ */
+function ErrorService (error) {
+    if (!(this instanceof ErrorService)) {
+        throw new TypeError("ErrorService constructor cannot be called as a function.");
+    }
+
+    var e = error;
+    if (typeof error === "string" || error instanceof String) {
+        this.message = error;
+        this.status = -1;
+        this.type = ErrorService.TYPE_UNKERR;
+    } else {
+        this.message = e.message || "undefined!?";
+        this.type = e.type;
+        this.status = e.status || -1;
+    }
+
+    this.name = "ErrorService";
+    this.stack = (new Error()).stack;
+}
+
+/**
+ * Error raised when underlying geoportal service answers on error.
+ *
+ * @type {String}
+ * @constant
+ * @static
+ */
+ErrorService.TYPE_SRVERR = "SERVICE_ERROR";
+/**
+ * Error raised when funcion use is inappropriate
+ *
+ * @type {String}
+ * @constant
+ * @static
+ */
+ErrorService.TYPE_USEERR = "USAGE_ERROR";
+/**
+ * Error raised when API can't perform the job for a reason other than the two other ones.
+ *
+ * @type {String}
+ * @constant
+ * @static
+ */
+ErrorService.TYPE_UNKERR = "UNKNOWN_ERROR";
+
+/**
+ * @lends module:ErrorService
+ */
+ErrorService.prototype = Object.create(Error.prototype, {
+    constructor : {
+        value : ErrorService,
+        writable : true,
+        configurable : true
+    }
+});
+
+/* harmony default export */ __webpack_exports__["default"] = (ErrorService);
+
+
+/***/ }),
+/* 46 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(47);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(44);
+/* harmony import */ var _Protocols_Protocol__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(48);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(45);
+/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(56);
+/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(57);
+var _package_json__WEBPACK_IMPORTED_MODULE_6___namespace = /*#__PURE__*/__webpack_require__.t(57, 1);
+
+
+
+
+
+
+// package.json (extract version)
+
+
+/**
+ * @classdesc
+ * Composant Service
+ *
+ * @constructor
+ * @alias Gp.Services.CommonService
+ * @param {Object} options - options communes à tous les services
+ *
+ * @param {String} options.apiKey - Clef d'accès à la plateforme Géoportail,
+ *      nécessaire pour franchir la couche de contrôle des accès pour avoir une réponse du service invoqué.
+ *      Plusieurs clefs peuvent être passées dans le cas de l'invocation du service d'autoconfiguration.
+ *      Si ce paramètre n'est pas renseigné, alors le paramètre serverUrl doit être renseigné (comprenant alors, si nécessaire la clef API).
+ *
+ * @param {String} options.serverUrl - URL d'accès au service.
+ *      Permet de forcer l'utilisation d'un service équivalent déployé derrière une éventuelle autre URL d'accès.
+ *      Si ce paramètre est renseigné alors, le paramètre apiKey est ignoré.
+ *
+ * @param {String} [options.protocol] - Le protocole à utiliser pour récupérer les informations du service :
+ *      peut valoir 'JSONP' ou 'XHR'.
+ *      Par défaut, c'est le protocole XHR qui sera utilisé.
+ *      Attention, le protocole JSONP n'est pas valide dans un environnement NodeJS (Utilisation du mode XHR).
+ *
+ * @param {Boolean} [options.ssl] - Indique si l'on souhaite intérroger les services en https.
+ *      Ce paramètre ne fonctionne que pour une utilisation hors navigateur (ex. NodeJS).
+ *      Sur un navigateur, le protocole est automatiquement extrait de l'url du site...
+ *      Par défaut, on utilise le protocole http (ssl=false).
+ *
+ * @param {String} [options.proxyURL] - Le proxy à utiliser pour pallier au problème de cross-domain dans le cas d'une requête XHR.
+ *      Utile si le paramètre 'protocol' vaut 'XHR', il ne sera pas pris en compte si protocol vaut JSONP.
+ *
+ * @param {String} [options.callbackSuffix] - Suffixe de la fonction de callback à utiliser, dans le cas du protocole JSONP.
+ *      Par défaut, la fonction de callback portera un nom du type "callback"+ID, où ID est soit un identifiant unique généré à chaque requête,
+ *      soit le paramètre callbackSuffix s'il est spécifié. Par exemple, si callbackSuffix="_2", la fonction sera "callback_2 ()".
+ *      Utile pour utiliser une réponse déjà encapsulée dans une fonction de callback, dont le nom est connu (ex : chargement de l'autoconfiguration en local)
+ *      Utile seulement si le paramètre 'protocol' vaut 'JSONP', il ne sera pas pris en compte si protocol vaut 'XHR'.
+ *
+ * @param {String} [options.httpMethod] - La méthode HTTP
+ *      à utiliser dans le cas d'une requête XHR : peut valoir 'GET' ou 'POST'.
+ *      Non pris en compte si 'protocol' vaut JSONP qui fonctionne obligatoirement en GET.
+ *      Par défaut, c'est la méthode GET qui est utilisée.
+ *
+ * @param {String} [options.contentType] - Content-Type de la requete
+ *      à utiliser dans le cas d'une requête XHR en mode POST.
+ *      Non pris en compte si 'protocol' vaut JSONP et/ou la méthode HTTP vaut GET.
+ *      Par défaut, c'est la méthode GET qui est utilisée donc on n'utilise pas de Content-Type.
+ *
+ * @param {Number} [options.timeOut] - Délai d'attente maximal (en ms) de la réponse du service (à partir de l'envoi de la requête).
+ *      Par défaut, aucun timeOut n'est pris en compte (timeoutDelay= 0).
+ *
+ * @param {Boolean} [options.rawResponse] - Indique si l'on souhaite que la réponse du service ne soit pas parsée par l'API avant d'être restituée.
+ *      (Cf. paramètre « onSuccess » pour plus de détails).
+ *
+ * @param {Function} [options.onSuccess] - Fonction appelée lorsque le service répond correctement à la requête
+ *      (code HTTP 200, sans message d'erreur).
+ *      Cette fonction prend en paramètre la réponse du service,
+ *      soit sous la forme d'un Object Javascript formaté par le parseur dédié à la syntaxe du service (comportement par défaut) ;
+ *      soit brute au format String non prétraité si le paramètre « rawResponse » a été précisé avec la valeur « true ».
+ *
+ * @param {Function} [options.onFailure] - Fonction appelée lorsque le service ne répond pas correctement
+ *      (code HTTP de retour différent de 200 ou pas de réponse).
+ *
+ * @param {Function} [options.onBeforeParse] - Fonction appelée avant le parsing de la réponse
+ *      Permet de modifier la réponse avant parsing et la fonction doit retourner une String.
+ *      Cette fonction prend en paramètre la réponse telle que renvoyée par le service
+ *      (cad au format json ou xml).
+ *      Pour le JSONP, si le paramètre "rawResponse" a été précisé avec la valeur "true",
+ *      la fonction prend en paramètre un Object JavaScript contenant la réponse XML.
+ *
+ * @example
+ *   var options = {
+ *      apiKey : null,
+ *      serverUrl : 'http://localhost/service/',
+ *      protocol : 'JSONP', // JSONP|XHR
+ *      ssl : false,
+ *      proxyURL : null,
+ *      callbackName : null,
+ *      httpMethod : 'GET', // GET|POST
+ *      timeOut : 10000, // ms
+ *      rawResponse : false, // true|false
+ *      scope : null, // this
+ *      onSuccess : function (response) {},
+ *      onFailure : function (error) {},
+ *      onBeforeParse : function (rawResponse) {}
+ *   };
+ * @private
+ */
+function CommonService (options) {
+    if (!(this instanceof CommonService)) {
+        throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("CLASS_CONSTRUCTOR"));
+    }
+
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("CommonService");
+    this.logger.trace("[Constructeur CommonService (options)]");
+
+    // #####################
+    // récupération des options par défaut pour les paramètres optionnels
+    // #####################
+
+    /**
+     * Options du service
+     * @type {Object}
+     */
+    this.options = {
+        // protocol : "JSONP",
+        protocol : "XHR",
+        ssl : true,
+        proxyURL : "",
+        // callbackName : "",
+        callbackSuffix : null,
+        httpMethod : "GET",
+        timeOut : 0,
+        rawResponse : false,
+        scope : this,
+        /**
+        * callback par defaut pour la reponse
+        * @param {Object} response - response
+        * @private
+        */
+        onSuccess : function (response) {
+            console.log("onSuccess - la reponse est la suivante : ", response);
+        },
+        /**
+        * callback par defaut pour les erreurs
+        * @param {Object} error - error
+        * @private
+        */
+        onFailure : function (error) {
+            if (error.status === 200 || !error.status) {
+                console.log("onFailure : ", error.message);
+            } else {
+                console.log("onFailure - Erreur (", error.status, ") : ", error.message);
+            }
+        }
+    };
+
+    // et on ajoute les options en paramètre aux options par défaut
+    for (var opt in options) {
+        if (options.hasOwnProperty(opt)) {
+            this.options[opt] = options[opt];
+        }
+    }
+
+    // #####################
+    // analyse des options
+    // #####################
+
+    // gestion des clefs API
+    if (!this.options.apiKey && !this.options.serverUrl) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_MISSING", "apiKey", "serverUrl"));
+    }
+
+    // modification de la fonction de callback onSuccess dans le cas où la réponse brute est demandée
+    if (this.options.rawResponse && !this.options.onSuccess) {
+        /**
+        * callback par defaut pour la reponse
+        * @param {Object} response - response
+        * @private
+        */
+        this.options.onSuccess = function (response) {
+            console.log("onSuccess - la réponse brute du service est la suivante : ", response);
+        };
+    }
+
+    // gestion du callback onSuccess
+    var bOnSuccess = !!((this.options.onSuccess !== null && typeof this.options.onSuccess === "function"));
+    if (!bOnSuccess) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_MISSING", "onSuccess()"));
+    }
+
+    // gestion de l'url du service par defaut
+    if (!this.options.serverUrl) {
+        // INFO
+        // gestion de l'url du service par defaut pour les services qui ne possèdent qu'une seul url par defaut
+        // les cas particuliers des services avec plusieurs urls (ex. Alti) devront être traité dans la classe du composant
+        // donc si l'url n'est pas renseignée, il faut utiliser les urls par defaut
+        _DefaultUrlService__WEBPACK_IMPORTED_MODULE_5__["default"].ssl = this.options.ssl;
+        var urlByDefault = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_5__["default"][this.CLASSNAME].url(this.options.apiKey);
+        if (typeof urlByDefault === "string") {
+            this.options.serverUrl = urlByDefault;
+        } else {
+            this.logger.trace("URL par defaut à determiner au niveau du composant...");
+        }
+    }
+
+    // FIXME nettoyage des KVP dans l'url du service
+    // if (this.options.serverUrl) {
+    //     // INFO
+    //     // si l'url est renseignée, il faut la nettoyer de tous ses KVP
+    //     // ex. on ne veut pas de params. 'callback' ou 'output' car ceci declencherait
+    //     // des opérations d'encapsulations des reponses légèrement farfelues ...
+    //     var urlsource = this.options.serverUrl;
+    //     var urlparts = urlsource.split("?");
+    //     this.options.serverUrl = urlparts[0];
+    // }
+
+    // gestion de la methode HTTP
+    this.options.httpMethod = (typeof options.httpMethod === "string") ? options.httpMethod.toUpperCase() : "GET";
+
+    switch (this.options.httpMethod) {
+        case "POST":
+        case "GET":
+            break;
+        case "PUT":
+        case "DELETE":
+        case "HEAD":
+        case "OPTIONS":
+            throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_NOT_SUPPORT", "httpMethod"));
+        default:
+            throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_UNKNOWN", "httpMethod"));
+    }
+
+    // gestion du protocole
+    // this.options.protocol = (typeof options.protocol === "string" ) ? options.protocol.toUpperCase() : "JSONP";
+    this.options.protocol = (typeof options.protocol === "string") ? options.protocol.toUpperCase() : "XHR";
+
+    switch (this.options.protocol) {
+        case "JSONP":
+        case "XHR":
+            break;
+        default:
+            throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_UNKNOWN", "protocol"));
+    }
+
+    // on determine l'environnement d'execution : browser ou non ?
+    // et on lance une exception sur l'utilisation du protocole JSONP pour nodeJS...
+    if (typeof window === "undefined" && this.options.protocol === "JSONP") {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_NOT_SUPPORT_NODEJS", "protocol=JSONP (instead use XHR)"));
+    }
+
+    // le protocole JSONP ne fonctionne qu'en GET.
+    if (this.options.protocol === "JSONP") {
+        this.options.httpMethod = "GET";
+    }
+
+    // gestion du cache
+    this.options.nocache = options.nocache || false;
+
+    // #####################
+    // attributs d'instances
+    // #####################
+
+    /**
+     * Format de réponse du service
+     */
+    this.options.outputFormat = null;
+    /**
+     * Requête envoyée au service
+     */
+    this.request = null;
+    /**
+     * Reponse du service
+     */
+    this.response = null;
+}
+
+/**
+ * @lends module:CommonService
+ */
+CommonService.prototype = {
+
+    /*
+     * Constructeur (alias)
+     */
+    constructor : CommonService,
+
+    /**
+     * Appel du service Géoportail
+     */
+    call : function () {
+        /* jshint validthis : true */
+        this.logger.trace("CommonService::call ()");
+
+        var context = this;
+        /** fonction d'execution */
+        function run () {
+            this.logger.trace("CommonService::run ()");
+            this.buildRequest.call(context, onError, onBuildRequest);
+        }
+
+        run.call(context);
+
+        // callback de fin de construction de la requête
+        function onBuildRequest (result) {
+            this.logger.trace("CommonService::onBuildRequest : ", result);
+            this.callService.call(context, onError, onCallService);
+        }
+
+        // callback de fin d'appel au service
+        function onCallService (result) {
+            this.logger.trace("CommonService::onCallService : ", result);
+            this.analyzeResponse.call(context, onError, onAnalyzeResponse);
+        }
+
+        // callback de fin de lecture de la reponse
+        function onAnalyzeResponse (result) {
+            this.logger.trace("CommonService::onAnalyzeResponse : ", result);
+            if (result) {
+                this.options.onSuccess.call(this, result);
+            } else {
+                return onError.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"]("Analyse de la reponse en échec !?"));
+            }
+        }
+
+        // callback de gestion des erreurs : renvoit un objet de type ErrorService
+        function onError (error) {
+            this.logger.trace("CommonService::onError()");
+            // error : l'objet est du type ErrorService ou Error
+            var e = error;
+            if (!(e instanceof _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"])) {
+                e = new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"](error.message);
+            }
+            this.options.onFailure.call(this, e);
+        }
+    },
+
+    /**
+     * Création de la requête
+     * @param {Function} error - callback
+     * @param {Function} success - callback
+     */
+    buildRequest : function (error, success) {
+        // INFO
+        this.logger.error("overwritten method !");
+        // retourne l'objet 'this.request'
+        if (error) {
+            error.call(this, "This method must be overwritten !");
+        }
+        success.call(this, "This method must be overwritten !");
+    },
+
+    /**
+     * Appel du service
+     * @param {Function} error - callback
+     * @param {Function} success - callback
+     */
+    callService : function (error, success) {
+        // INFO
+        // retourne l'objet 'this.response'
+
+        // NOTES
+        //  Pour le mode XHR, on recupère une reponse sous forme d'un json ou xml (#document).
+        //  Pour le mode JSONP, on a toujours un objet JSON mais sous 2 formes :
+        //      - natif
+        //      - XML encapsulé :
+        //          {http : {status:200, error:null},xml :'réponse du service'}
+        //          {http : {status:400, error:'reponse du service'},xml :null}
+        //  En XHR, la reponse est directement sauvegardée dans 'this.response'.
+        //  Par contre, en JSONP, on doit analyser la reponse (status ou non vide),
+        //  et ne renvoyer que le contenu (xml ou l'objet)
+
+        // gestion de la proxification du service
+        var strUrlProxified = null;
+        var strData = this.request;
+
+        // a t on mis en place un proxy ?
+        // la proxyfication est valable uniquement en mode XHR !
+        var bUrlProxified = !!((this.options.proxyURL && this.options.protocol === "XHR"));
+
+        // rajout de l'option gpbibaccess
+        // INFO : acces au numero de version de package.conf aprés compilation !
+        this.options.serverUrl = _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__["default"].normalyzeUrl(this.options.serverUrl, {
+            "gp-access-lib" : _package_json__WEBPACK_IMPORTED_MODULE_6__.version
+        }, false);
+
+        // si le proxy est renseigné, on proxifie l'url du service
+        if (bUrlProxified) {
+            if (this.options.httpMethod === "GET") {
+                strUrlProxified = this.options.proxyURL + _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__["default"].normalyzeUrl(this.options.serverUrl, this.request, true);
+                strData = null;
+            }
+
+            if (this.options.httpMethod === "POST") {
+                strUrlProxified = this.options.proxyURL + _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__["default"].normalyzeUrl(this.options.serverUrl, null, true);
+                strData = this.request;
+            }
+        }
+
+        // contexte du composant spécifique !
+        var self = this;
+
+        var options = {
+            url : strUrlProxified || this.options.serverUrl,
+            method : this.options.httpMethod,
+            protocol : this.options.protocol,
+            timeOut : this.options.timeOut || 0,
+            format : this.options.outputFormat, // ceci declenche le parsing de la reponse du service, mais on souhaite toujours une reponse brute (string) !
+            nocache : this.options.nocache || false, // ceci permet d'ajouter un timestamp dans la requête
+            wrap : this.options.protocol !== "XHR", // ceci declenche l'encapsulation de la reponse XML du service dans du JSON, mais pas en mode XHR !
+            callbackSuffix : this.options.callbackSuffix,
+            // callbackName : this.options.callbackName || null,
+            data : strData,
+            headers : null, // TODO...
+            content : this.options.contentType || "application/xml",
+            scope : this.options.scope || this,
+            // callback de reponse
+            onResponse : function (response) {
+                self.logger.trace("callService::onResponse()");
+
+                // le contenu de la reponse à renvoyer !
+                var content = null;
+
+                // XHR : on renvoie toujours la reponse brute du service (json ou xml)
+                // au parser du composant...
+                if (self.options.protocol === "XHR") {
+                    self.logger.trace("Response XHR", response);
+                    content = response; // par defaut, la reponse du service  !
+                }
+
+                // JSONP : on pre-analyse la reponse brute du service (encapsuler ou pas)
+                // avant de l'envoyer au parser du composant...
+                if (self.options.protocol === "JSONP") {
+                    self.logger.trace("Response JSON", response);
+                    if (response) {
+                        if (response.http) {
+                            // reponse encapsulée :
+                            // ex. reponse du service en xml
+                            // > {http : {status:200, error:null},xml :'réponse du service'}
+                            if (response.http.status !== 200) {
+                                error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"]({
+                                    status : response.http.status,
+                                    message : response.http.error,
+                                    type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"].TYPE_SRVERR
+                                }));
+                                return;
+                            } else {
+                                content = response.xml; // par defaut !
+                                if (self.options.rawResponse) {
+                                    content = response;
+                                }
+                            }
+                        } else {
+                            // reponse non encapsulée :
+                            // ex. reponse du service en json ou xml
+                            content = response;
+                        }
+                    } else {
+                        error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"]("Le contenu de la reponse est vide !?"));
+                        return;
+                    }
+                }
+
+                // si on souhaite parser la reponse du service
+                if (typeof self.options.onBeforeParse === "function") {
+                    var newResponse = self.options.onBeforeParse(content);
+                    if (typeof newResponse === "string") {
+                        // la reponse parsée par l'utilisateur est retournée sous
+                        // forme de string !
+                        content = newResponse;
+                    }
+                }
+                // sauvegarde de la reponse dans l'objet parent (CommonService)
+                self.response = content;
+                // on renvoie la reponse...
+                success.call(self, content);
+            },
+            // callback des erreurs
+            onFailure : function (e) {
+                self.logger.trace("callService::onFailure()");
+                // on est forcement sur une erreur levée par un service !
+                e.type = _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"].TYPE_SRVERR;
+                error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"](e));
+            },
+            // callback de timeOut
+            onTimeOut : function () {
+                self.logger.trace("callService::onTimeOut()");
+                error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"]("TimeOut!"));
+            }
+        };
+
+        _Protocols_Protocol__WEBPACK_IMPORTED_MODULE_3__["default"].send(options);
+    },
+
+    /**
+     * Analyse de la réponse
+     * @param {Function} error - callback
+     * @param {Function} success - callback
+     */
+    analyzeResponse : function (error, success) {
+        // INFO
+        this.logger.error("overwritten method !");
+        // retourne l'objet spécifique au type de composant (json)
+        if (error) {
+            error.call(this, "This method must be overwritten !");
+        }
+        success.call(this, "This method must be overwritten !");
+    }
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (CommonService);
+
+
+/***/ }),
+/* 47 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/**
+ * Classe utilitaire
+ *
+ * @module Helper
+ * @alias Gp.Helper
+ */
+var Helper = {
+
+    /**
+     * concatenation des parametres key/value dans les urls
+     *
+     * @method normalyzeParameters
+     * @static
+     * @param {Object} params - tableau de clef/valeur
+     *
+     * @example
+     *  Gp.Utils.Helper.normalyzeParameters ({
+     *         key1:value1,
+     *         key2:value2,
+     *         key3:value3
+     *  });
+     *  // out : "key1=value1&key2=value2&key3=value3"
+     *
+     * @returns {String} retourne les paramètres concaténés
+     */
+    normalyzeParameters : function (params) {
+        var myParams = null;
+
+        if (params) {
+            var tabParams = [];
+            for (var key in params) {
+                if (params.hasOwnProperty(key)) {
+                    var value = params[key];
+                    if (!value) {
+                        value = "";
+                    }
+                    tabParams.push(key + "=" + value);
+                }
+            }
+
+            myParams = tabParams.join("&");
+        }
+
+        return myParams;
+    },
+
+    /**
+     * Concaténation et encodage des urls.
+     *
+     * @method normalyzeUrl
+     * @static
+     * @param {String} url - url
+     * @param {Object|String} params - tableau de clef/valeur ou string
+     * @param {Boolean} encode - true|false, false par defaut
+     *
+     * @example
+     *  Gp.Utils.Helper.normalyzeUrl (url, {
+     *         key1:value1,
+     *         key2=:value2,
+     *         key3:value3
+     *  });
+     *  // out : "url?key1=value1&key2=value2&key3=value3"
+     *
+     * @returns {String} retourne une url normalisée
+     */
+    normalyzeUrl : function (url, params, encode) {
+        var myUrl = url;
+
+        if (url) {
+            var k = url.indexOf("?");
+            if (k === -1) { // pas de ? et KVP
+                myUrl += "?";
+            }
+
+            if (k !== -1 && k !== url.length - 1) { // KVP
+                myUrl += "&";
+            }
+        }
+
+        if (params) {
+            if (typeof params === "string") {
+                myUrl += params;
+            } else {
+                myUrl += this.normalyzeParameters(params);
+            }
+        }
+
+        if (encode) {
+            // FIXME bonne idée ?
+            myUrl = encodeURIComponent(myUrl);
+        }
+
+        return myUrl;
+    },
+
+    /**
+     * Indentation d'une chaine
+     *
+     * @method indent
+     * @static
+     * @param {Number} n - nombre de tabulation
+     * @param {String} msg - chaine
+     *
+     * @example
+     * Gp.Utils.Helper.indent (2, "message à indenter")
+     * // out
+     * // ........message à indenter
+     *
+     * @returns {String} retourne une chaine indentée
+     */
+    indent : function (n, msg) {
+        var num = n || 0;
+        return new Array(num + 1).join("\t") + msg;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Helper);
+
+
+/***/ }),
+/* 48 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(47);
+/* harmony import */ var _XHR__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(49);
+/* harmony import */ var _JSONP__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(55);
+/**
+ * Interface de dialogue avec les webservices
+ *
+ * @module Protocols
+ * @private
+ * @alias Gp.Protocols
+ */
+
+
+
+
+var Protocol = {
+
+    /**
+     * Interface unique d"envoi d"une requête.
+     *
+     * @method send
+     * @static
+     * @param {Object} options - options generales
+     * @param {String} options.url      - url du service
+     * @param {String} options.method   - GET, POST, PUT, DELETE
+     * @param {String} options.protocol - XHR | JSONP
+     * @param {String} options.format   - format de la reponse du service : json, xml ou null (brute)...
+     * @param {String} options.wrap     - encapsuler la reponse du service dans du JSON : true|false (true par defaut sur le protocole JSONP)
+     * @param {String} options.callbackSuffix - suffixe de la fonction de callback (JSONP uniquement) (ex: si callbackSuffix="", la fonction s'appellera "callback")
+     * @param {String} options.timeOut  - 0 ms
+     * @param {Boolean} options.nocache  - true|false
+     * @param {Object|String} options.data        - content (post) ou param (get)
+     * @param {Object|String} options.headers     - (post) ex. referer
+     * @param {Object|String} options.content - (post) ex. "application/json"
+     * @param {String} options.scope       - this (TODO)
+     * @param {Function} options.onResponse - callback
+     * @param {Function} options.onFailure - callback
+     * @param {Function} options.onTimeOut - callback
+     * @param {String} options.proxyUrl -  (TODO)
+     */
+    send : function (options) {
+        // INFO
+        // "output" - param est interne à la classe "Protocol" (parametrable via "wrap"), et à ajouter à l"url
+        //      ce param est independant du service car il est géré par le filtre LUA :
+        //          ex. json|xml (json par defaut).
+        //          Ce param. permet d"encapsuler du XML dans du JSON :
+        //              {http : {status:200, error:null},xml :"réponse du service"}
+        //          Utile pour les services qui ne repondent que du XML (ex. Geocodage)
+        //
+        // |-------------------------------------------------|
+        // |      \service |      |     |                    |
+        // | output\ format| json | xml |     remarques      |
+        // |--------\------|------|-----|--------------------|
+        // |    json       | json | json| json/xml encapsulé |
+        // |    xml        | json | xml | param inactif      |
+        // |-------------------------------------------------|
+        // ex. le service demande une reponse native au "format" json et avec un "output" json.
+        // on a donc une reponse json encapsulé dans un json : ce qu'on ne souhaite pas !
+        // dans ce cas on ne renseigne pas output=json
+
+        // INFO
+        // "wrap" - choix d"encapsuler ou non les reponses dans du JSON.
+        //      Par defaut, on encapsule uniquement les reponses sur le protocole JSONP (et qui sont en xml) !
+
+        // INFO
+        // "callback" - param est interne à la classe "Protocol" (non parametrable), et à ajouter à l"url
+        //      ce param est independant du service car il est géré aussi par le filtre LUA :
+        //          ex. callback|null
+        //          Ce param. permet de renvoyer une reponse javascript :
+        //              callback ({http : {status:200, error:null},xml :"réponse du service"})
+        //          Ce param. est non renseigné par defaut car pour du JSONP, on utilise le
+        //          le protocol JSONP, et ce dernier implemente déjà le callback !
+
+        // settings par defaut
+        var settings = options || {
+            method : "GET",
+            // protocol : "JSONP",
+            protocol : "XHR",
+            timeOut : 0,
+            format : null,
+            wrap : true,
+            nocache : true,
+            output : "json",
+            callback : null,
+            callbackSuffix : null
+        };
+
+        // on determine l'environnement d'execution : browser ou non ?
+        // et on stoppe pour nodeJS... sur un protocole JSONP !
+        if (typeof window === "undefined" && options.protocol === "JSONP") {
+            console.log("Value (s) for parameter (s) 'protocol=JSONP (instead use XHR)' not supported to NodeJS");
+            return;
+        }
+
+        if (options.protocol === "XHR" || options.format === "json") {
+            settings.wrap = false;
+        } else if (options.protocol === "JSONP" && options.format === "xml") {
+            settings.wrap = true;
+        }
+
+        settings.callback = (options.protocol === "JSONP") ? null : null; // FIXME non géré !?
+        settings.output = settings.wrap ? "json" : null;
+
+        // on encapsule les reponses dans un objet JSON
+        if (settings.wrap) {
+            var params = {};
+            params.output = settings.output;
+            params.callback = settings.callback;
+            delete params.callback; // FIXME non géré !?
+            settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__["default"].normalyzeUrl(options.url, params);
+        }
+
+        // choix de l"implementation :
+        // XHR ou JSONP
+        switch (settings.protocol) {
+            case "XHR":
+                // on normalise l'url (gestion du cache)
+                if (options.method === "GET" && options.nocache) {
+                    settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__["default"].normalyzeUrl(settings.url, {
+                        t : new Date().getTime()
+                    });
+                }
+                // appel du service en XHR
+                _XHR__WEBPACK_IMPORTED_MODULE_1__["default"].call(settings);
+                break;
+            case "JSONP":
+
+                // on normalise l'url si les params. sont renseignés dans la string|object "data"
+                if (settings.data) {
+                    settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__["default"].normalyzeUrl(settings.url, settings.data);
+                }
+
+                // appel du service en JSONP
+                _JSONP__WEBPACK_IMPORTED_MODULE_2__["default"].call(settings);
+                break;
+            default:
+                throw new Error("protocol not supported (XHR|JSONP) !");
+        }
+    }
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Protocol);
+
+
+/***/ }),
+/* 49 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(47);
+/* harmony import */ var es6_promise__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(50);
+/* harmony import */ var es6_promise__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(es6_promise__WEBPACK_IMPORTED_MODULE_2__);
+/* global Promise, require */
+
+
+
+
+// import __request from "request";
+// import __xmldom from "xmldom";
+
+/**
+ * Ajax Request (use of Promises)
+ *
+ * @module XHR
+ * @alias Gp.Protocols.XHR
+ * @see dependance 'es6-promise'
+ */
+
+// cf. https://xhr.spec.whatwg.org/
+// cf. https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
+
+var XHR = {
+
+    /**
+     * Interface unique d'envoi d'une requête.
+     *
+     * @method call
+     * @static
+     * @param {Object} settings - options generales
+     * @param {String} settings.url    - url du service
+     * @param {String} settings.method - GET, POST, PUT, DELETE
+     * @param {String} settings.format - format de la reponse du service : json, xml ou null (brute)
+     * @param {String} settings.data   - content (post) ou param (get)
+     * @param {String} settings.proxy  - proxy url
+     * @param {Object|String} settings.headers - (post) ex. referer
+     * @param {Object|String} settings.content - (post) ex. 'application/json'
+     * @param {String} settings.timeOut - timeout = 0 par defaut
+     * @param {String} settings.scope - this
+     * @param {Function} settings.onResponse - callback
+     * @param {Function} settings.onFailure  - callback
+     */
+    call : function (settings) {
+        // logger
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("XHR");
+        logger.trace("[XHR::call()]");
+
+        // FIXME
+        // To polyfill the global environment
+        es6_promise__WEBPACK_IMPORTED_MODULE_2___default.a.polyfill();
+
+        // test sur les settings obligatoires
+        if (!settings.url) {
+            throw new Error("missing parameter : url is not defined !");
+        }
+
+        if (!settings.method) {
+            throw new Error("missing parameter : method is not defined !");
+        }
+
+        if (!settings.format) {
+            settings.format = "text"; // reponse brute !
+        }
+
+        var options = {};
+        options.url = settings.url;
+        options.data = settings.data ? settings.data : null;
+        options.method = settings.method;
+        options.timeOut = settings.timeOut || 0;
+        options.scope = settings.scope || this;
+        options.proxy = settings.proxy || null;
+        options.content = settings.content || null;
+        options.headers = settings.headers || {
+            referer : "http://localhost"
+        };
+
+        // test sur les valeurs de 'settings.method'
+        switch (settings.method) {
+            case "DELETE":
+            case "GET":
+                break;
+            case "PUT":
+            case "POST":
+                // on force sur ces params spécifiques au mode POST
+                options.content = settings.content ? settings.content : "application/x-www-form-urlencoded"; // FIXME en attente des services : bascule en "application/xml" ou "application/json"
+                options.headers = settings.headers ? settings.headers : {
+                    referer : "http://localhost" // todo ...
+                };
+                break;
+            case "HEAD":
+            case "OPTIONS":
+                throw new Error("HTTP method not yet supported !");
+            default:
+                throw new Error("HTTP method unknown !");
+        }
+
+        // test sur les valeurs de 'settings.format'
+        switch (settings.format) {
+            case "text":
+                this.__call(options)
+                    .then(function (response) {
+                        logger.trace(response);
+                        settings.onResponse.call(this, response);
+                    })
+                    .catch(function (error) {
+                        settings.onFailure.call(this, error);
+                    });
+                break;
+            case "json":
+                this.__callJSON(options)
+                    .then(function (response) {
+                        logger.trace(response);
+                        settings.onResponse.call(this, response);
+                    })
+                    .catch(function (error) {
+                        settings.onFailure.call(this, error);
+                    });
+                break;
+            case "xml":
+                this.__callXML(options)
+                    .then(function (response) {
+                        logger.trace(response);
+                        settings.onResponse.call(this, response);
+                    })
+                    .catch(function (error) {
+                        settings.onFailure.call(this, error);
+                    });
+                break;
+            default:
+                throw new Error("This output Format is not yet supported !");
+        }
+    },
+
+    /**
+     * Requete
+     *
+     * @method __call
+     * @private
+     * @param  {Object} options - options
+     * @return {Object} promise
+     */
+    __call : function (options) {
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("XHR");
+        logger.trace("[XHR::__call()]");
+
+        var promise = new Promise(
+            function (resolve, reject) {
+                // traitement du corps de la requête
+                var corps = (options.method === "POST" || options.method === "PUT") ? 1 : 0;
+
+                // seulement si options.data n'est pas vide (peut être un objet ou une chaine de caractères)
+                if (options.data && ((typeof options.data === "object" && Object.keys(options.data).length) || (typeof options.data === "string" && options.data.length)) && !corps) {
+                    options.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__["default"].normalyzeUrl(options.url, options.data);
+                }
+
+                logger.trace("URL = ", options.url);
+
+                var hXHR = null;
+
+                // test on env. nodejs or browser
+                if (typeof window === "undefined") {
+                    // Utilisation du module :
+                    // cf. http://blog.modulus.io/node.js-tutorial-how-to-use-request-module
+
+                    var req = __webpack_require__(53);// __request
+
+                    // mapping data avec body param. pour le mode POST ou PUT (?)
+                    if (options.data && typeof options.data === "string" && corps) {
+                        options.body = options.data;
+                    }
+
+                    // FIXME ERROR : self signed certificate in certificate chain
+                    options.rejectUnauthorized = false;
+
+                    req(options, function (error, response, body) {
+                        if (!error && response.statusCode === 200 && body) {
+                            resolve(body);
+                        } else {
+                            reject("Errors Occured on Http Request (nodejs) : " + error);
+                        }
+                    });
+                } else {
+                    if (window.XMLHttpRequest) {
+                        logger.trace("XMLHttpRequest");
+
+                        hXHR = new XMLHttpRequest();
+                        hXHR.open(options.method, options.url, true); // async
+                        hXHR.overrideMimeType = options.content;
+
+                        // gestion du timeout
+                        var onTimeOutTrigger = null;
+                        if (options.timeOut > 0) {
+                            // FIXME le timeout interne ne me permet pas de declencher le bon message...
+                            // hXHR.timeout = options.timeOut;
+                            logger.trace("XHR - TimeOut actif !");
+                            /**
+                             * Description
+                             *
+                             * @method onTimeOutTrigger
+                             * @private
+                             */
+                            onTimeOutTrigger = window.setTimeout(
+                                function () {
+                                    var message = "TimeOut Occured on Http Request with XMLHttpRequest !";
+                                    reject({
+                                        message : message,
+                                        status : -1
+                                    });
+                                }, options.timeOut);
+                        }
+
+                        if (corps) {
+                            // headers, data, content of data
+                            // cf. https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader
+                            logger.trace("data = ", options.data);
+                            hXHR.setRequestHeader("Content-type", options.content);
+                            // FIXME refused to set unsafe header content-length javascript
+                            // hXHR.setRequestHeader ("Content-length", options.data.length);
+                            // hXHR.setRequestHeader ("Referer", options.headers.referer);
+                        }
+
+                        /**
+                         * On Error
+                         * FIXME ne se declenche pas !?
+                         *
+                         * @param {Object} e - Event
+                         * @method onerror
+                         * @private
+                         */
+                        hXHR.onerror = function (e) {
+                            console.log(e);
+                            reject(new Error("Errors Occured on Http Request with XMLHttpRequest !"));
+                        };
+
+                        /**
+                         * On Timeout
+                         * FIXME ne se declenche pas !?
+                         *
+                         * @param {Object} e - Event
+                         * @method ontimeout
+                         * @private
+                         */
+                        hXHR.ontimeout = function (e) {
+                            console.log(e);
+                            reject(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"));
+                        };
+
+                        /**
+                         * Description
+                         *
+                         * @method onreadystatechange
+                         * @private
+                         */
+                        hXHR.onreadystatechange = function (e) {
+                            if (hXHR.readyState === 4) { // DONE
+                                if (hXHR.status === 200) {
+                                    window.clearTimeout(onTimeOutTrigger);
+                                    resolve(hXHR.response);
+                                } else {
+                                    var message = "Errors Occured on Http Request (status : '" + e.target.statusText + "' | url : '" + e.target.responseURL + "')";
+                                    var status = e.target.status;
+                                    reject({
+                                        message : message,
+                                        status : status
+                                    });
+                                }
+                            }
+                        };
+
+                        // gestion du content data
+                        var data4xhr = (options.data && corps) ? options.data : null;
+
+                        hXHR.send(data4xhr);
+                    } else if (window.XDomainRequest) {
+                        // worked in Internet Explorer 8–10 only !
+                        logger.trace("XDomainRequest");
+
+                        hXHR = new XDomainRequest();
+                        hXHR.open(options.method, options.url);
+
+                        hXHR.overrideMimeType = options.content;
+
+                        if (options.timeOut > 0) {
+                            hXHR.timeout = options.timeout;
+                            logger.trace("XHR - TimeOut actif !");
+                        }
+
+                        if (corps) {
+                            // headers, data, content of data
+                            // cf. https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader
+                            hXHR.setRequestHeader("Content-type", options.content);
+                            // FIXME refused to set unsafe header content-length javascript
+                            // hXHR.setRequestHeader ("Content-length", options.data.length);
+                            // hXHR.setRequestHeader ("Referer", options.headers.referer);
+                        }
+
+                        /**
+                         * Description
+                         *
+                         * @method onerror
+                         * @private
+                         */
+                        hXHR.onerror = function () {
+                            reject(new Error("Errors Occured on Http Request with XMLHttpRequest !"));
+                        };
+
+                        /**
+                         * Description
+                         *
+                         * @method ontimeout
+                         * @private
+                         */
+                        hXHR.ontimeout = function () {
+                            reject(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"));
+                        };
+
+                        /**
+                         * On Load
+                         *
+                         * @method onload
+                         * @private
+                         */
+                        hXHR.onload = function (e) {
+                            if (hXHR.status === 200) {
+                                resolve(hXHR.responseText);
+                            } else {
+                                var message = "Errors Occured on Http Request (status : '" + e.target.statusText + "' | url : '" + e.target.responseURL + "')";
+                                var status = e.target.status;
+                                reject({
+                                    message : message,
+                                    status : status
+                                });
+                            }
+                        };
+
+                        var data4xdr = (options.data && corps) ? options.data : null;
+
+                        hXHR.send(data4xdr);
+                    } else {
+                        throw new Error("CORS not supported");
+                    }
+                }
+            }
+        );
+
+        return promise;
+    },
+
+    /**
+     * Requete avec parser JSON
+     *
+     * @method __callJSON
+     * @private
+     * @param  {Object} options - options
+     * @return {Object} promise
+     */
+    __callJSON : function (options) {
+        return this.__call(options)
+            .then(JSON.parse)
+            .catch(function (error) {
+                console.log("_callJSON failed on : ", options.url, error);
+                // FIXME pas d'exception, laissons le fil se derouler...
+                // throw error;
+            });
+    },
+
+    /**
+     * Requete avec parser XML
+     *
+     * @method __callXML
+     * @private
+     * @param  {Object} options - options
+     * @return {Object} promise
+     */
+    __callXML : function (options) {
+        return this.__call(options)
+            .then(function (response) {
+                var xmlDoc;
+
+                // test on env. nodejs or browser
+                if (typeof window === "undefined") {
+                    var DOMParser = __webpack_require__(54).DOMParser; // __xmldom.DOMParser
+                    xmlDoc = new DOMParser().parseFromString(response, "text/xml");
+                } else {
+                    if (window.DOMParser) {
+                        var parser = new window.DOMParser();
+                        xmlDoc = parser.parseFromString(response, "text/xml");
+                    } else { // IE
+                        xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
+                        xmlDoc.async = false;
+                        xmlDoc.loadXML(response);
+                    }
+                }
+
+                return xmlDoc;
+            })
+            .catch(function (error) {
+                console.log("__callXML failed on : ", options.url, error);
+                // FIXME pas d'exception, laissons le fil se derouler...
+                // throw error;
+            });
+    }
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (XHR);
+
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process, global) {/*!
+ * @overview es6-promise - a tiny implementation of Promises/A+.
+ * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
+ * @version   v4.2.8+1e68dce6
+ */
+
+(function (global, factory) {
+	 true ? module.exports = factory() :
+	undefined;
+}(this, (function () { 'use strict';
+
+function objectOrFunction(x) {
+  var type = typeof x;
+  return x !== null && (type === 'object' || type === 'function');
+}
+
+function isFunction(x) {
+  return typeof x === 'function';
+}
+
+
+
+var _isArray = void 0;
+if (Array.isArray) {
+  _isArray = Array.isArray;
+} else {
+  _isArray = function (x) {
+    return Object.prototype.toString.call(x) === '[object Array]';
+  };
+}
+
+var isArray = _isArray;
+
+var len = 0;
+var vertxNext = void 0;
+var customSchedulerFn = void 0;
+
+var asap = function asap(callback, arg) {
+  queue[len] = callback;
+  queue[len + 1] = arg;
+  len += 2;
+  if (len === 2) {
+    // If len is 2, that means that we need to schedule an async flush.
+    // If additional callbacks are queued before the queue is flushed, they
+    // will be processed by this flush that we are scheduling.
+    if (customSchedulerFn) {
+      customSchedulerFn(flush);
+    } else {
+      scheduleFlush();
+    }
+  }
+};
+
+function setScheduler(scheduleFn) {
+  customSchedulerFn = scheduleFn;
+}
+
+function setAsap(asapFn) {
+  asap = asapFn;
+}
+
+var browserWindow = typeof window !== 'undefined' ? window : undefined;
+var browserGlobal = browserWindow || {};
+var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
+var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
+
+// test for web worker but not in IE10
+var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
+
+// node
+function useNextTick() {
+  // node version 0.10.x displays a deprecation warning when nextTick is used recursively
+  // see https://github.com/cujojs/when/issues/410 for details
+  return function () {
+    return process.nextTick(flush);
+  };
+}
+
+// vertx
+function useVertxTimer() {
+  if (typeof vertxNext !== 'undefined') {
+    return function () {
+      vertxNext(flush);
+    };
+  }
+
+  return useSetTimeout();
+}
+
+function useMutationObserver() {
+  var iterations = 0;
+  var observer = new BrowserMutationObserver(flush);
+  var node = document.createTextNode('');
+  observer.observe(node, { characterData: true });
+
+  return function () {
+    node.data = iterations = ++iterations % 2;
+  };
+}
+
+// web worker
+function useMessageChannel() {
+  var channel = new MessageChannel();
+  channel.port1.onmessage = flush;
+  return function () {
+    return channel.port2.postMessage(0);
+  };
+}
+
+function useSetTimeout() {
+  // Store setTimeout reference so es6-promise will be unaffected by
+  // other code modifying setTimeout (like sinon.useFakeTimers())
+  var globalSetTimeout = setTimeout;
+  return function () {
+    return globalSetTimeout(flush, 1);
+  };
+}
+
+var queue = new Array(1000);
+function flush() {
+  for (var i = 0; i < len; i += 2) {
+    var callback = queue[i];
+    var arg = queue[i + 1];
+
+    callback(arg);
+
+    queue[i] = undefined;
+    queue[i + 1] = undefined;
+  }
+
+  len = 0;
+}
+
+function attemptVertx() {
+  try {
+    var vertx = Function('return this')().require('vertx');
+    vertxNext = vertx.runOnLoop || vertx.runOnContext;
+    return useVertxTimer();
+  } catch (e) {
+    return useSetTimeout();
+  }
+}
+
+var scheduleFlush = void 0;
+// Decide what async method to use to triggering processing of queued callbacks:
+if (isNode) {
+  scheduleFlush = useNextTick();
+} else if (BrowserMutationObserver) {
+  scheduleFlush = useMutationObserver();
+} else if (isWorker) {
+  scheduleFlush = useMessageChannel();
+} else if (browserWindow === undefined && "function" === 'function') {
+  scheduleFlush = attemptVertx();
+} else {
+  scheduleFlush = useSetTimeout();
+}
+
+function then(onFulfillment, onRejection) {
+  var parent = this;
+
+  var child = new this.constructor(noop);
+
+  if (child[PROMISE_ID] === undefined) {
+    makePromise(child);
+  }
+
+  var _state = parent._state;
+
+
+  if (_state) {
+    var callback = arguments[_state - 1];
+    asap(function () {
+      return invokeCallback(_state, child, callback, parent._result);
+    });
+  } else {
+    subscribe(parent, child, onFulfillment, onRejection);
+  }
+
+  return child;
+}
+
+/**
+  `Promise.resolve` returns a promise that will become resolved with the
+  passed `value`. It is shorthand for the following:
+
+  ```javascript
+  let promise = new Promise(function(resolve, reject){
+    resolve(1);
+  });
+
+  promise.then(function(value){
+    // value === 1
+  });
+  ```
+
+  Instead of writing the above, your code now simply becomes the following:
+
+  ```javascript
+  let promise = Promise.resolve(1);
+
+  promise.then(function(value){
+    // value === 1
+  });
+  ```
+
+  @method resolve
+  @static
+  @param {Any} value value that the returned promise will be resolved with
+  Useful for tooling.
+  @return {Promise} a promise that will become fulfilled with the given
+  `value`
+*/
+function resolve$1(object) {
+  /*jshint validthis:true */
+  var Constructor = this;
+
+  if (object && typeof object === 'object' && object.constructor === Constructor) {
+    return object;
+  }
+
+  var promise = new Constructor(noop);
+  resolve(promise, object);
+  return promise;
+}
+
+var PROMISE_ID = Math.random().toString(36).substring(2);
+
+function noop() {}
+
+var PENDING = void 0;
+var FULFILLED = 1;
+var REJECTED = 2;
+
+function selfFulfillment() {
+  return new TypeError("You cannot resolve a promise with itself");
+}
+
+function cannotReturnOwn() {
+  return new TypeError('A promises callback cannot return that same promise.');
+}
+
+function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {
+  try {
+    then$$1.call(value, fulfillmentHandler, rejectionHandler);
+  } catch (e) {
+    return e;
+  }
+}
+
+function handleForeignThenable(promise, thenable, then$$1) {
+  asap(function (promise) {
+    var sealed = false;
+    var error = tryThen(then$$1, thenable, function (value) {
+      if (sealed) {
+        return;
+      }
+      sealed = true;
+      if (thenable !== value) {
+        resolve(promise, value);
+      } else {
+        fulfill(promise, value);
+      }
+    }, function (reason) {
+      if (sealed) {
+        return;
+      }
+      sealed = true;
+
+      reject(promise, reason);
+    }, 'Settle: ' + (promise._label || ' unknown promise'));
+
+    if (!sealed && error) {
+      sealed = true;
+      reject(promise, error);
+    }
+  }, promise);
+}
+
+function handleOwnThenable(promise, thenable) {
+  if (thenable._state === FULFILLED) {
+    fulfill(promise, thenable._result);
+  } else if (thenable._state === REJECTED) {
+    reject(promise, thenable._result);
+  } else {
+    subscribe(thenable, undefined, function (value) {
+      return resolve(promise, value);
+    }, function (reason) {
+      return reject(promise, reason);
+    });
+  }
+}
+
+function handleMaybeThenable(promise, maybeThenable, then$$1) {
+  if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {
+    handleOwnThenable(promise, maybeThenable);
+  } else {
+    if (then$$1 === undefined) {
+      fulfill(promise, maybeThenable);
+    } else if (isFunction(then$$1)) {
+      handleForeignThenable(promise, maybeThenable, then$$1);
+    } else {
+      fulfill(promise, maybeThenable);
+    }
+  }
+}
+
+function resolve(promise, value) {
+  if (promise === value) {
+    reject(promise, selfFulfillment());
+  } else if (objectOrFunction(value)) {
+    var then$$1 = void 0;
+    try {
+      then$$1 = value.then;
+    } catch (error) {
+      reject(promise, error);
+      return;
+    }
+    handleMaybeThenable(promise, value, then$$1);
+  } else {
+    fulfill(promise, value);
+  }
+}
+
+function publishRejection(promise) {
+  if (promise._onerror) {
+    promise._onerror(promise._result);
+  }
+
+  publish(promise);
+}
+
+function fulfill(promise, value) {
+  if (promise._state !== PENDING) {
+    return;
+  }
+
+  promise._result = value;
+  promise._state = FULFILLED;
+
+  if (promise._subscribers.length !== 0) {
+    asap(publish, promise);
+  }
+}
+
+function reject(promise, reason) {
+  if (promise._state !== PENDING) {
+    return;
+  }
+  promise._state = REJECTED;
+  promise._result = reason;
+
+  asap(publishRejection, promise);
+}
+
+function subscribe(parent, child, onFulfillment, onRejection) {
+  var _subscribers = parent._subscribers;
+  var length = _subscribers.length;
+
+
+  parent._onerror = null;
+
+  _subscribers[length] = child;
+  _subscribers[length + FULFILLED] = onFulfillment;
+  _subscribers[length + REJECTED] = onRejection;
+
+  if (length === 0 && parent._state) {
+    asap(publish, parent);
+  }
+}
+
+function publish(promise) {
+  var subscribers = promise._subscribers;
+  var settled = promise._state;
+
+  if (subscribers.length === 0) {
+    return;
+  }
+
+  var child = void 0,
+      callback = void 0,
+      detail = promise._result;
+
+  for (var i = 0; i < subscribers.length; i += 3) {
+    child = subscribers[i];
+    callback = subscribers[i + settled];
+
+    if (child) {
+      invokeCallback(settled, child, callback, detail);
+    } else {
+      callback(detail);
+    }
+  }
+
+  promise._subscribers.length = 0;
+}
+
+function invokeCallback(settled, promise, callback, detail) {
+  var hasCallback = isFunction(callback),
+      value = void 0,
+      error = void 0,
+      succeeded = true;
+
+  if (hasCallback) {
+    try {
+      value = callback(detail);
+    } catch (e) {
+      succeeded = false;
+      error = e;
+    }
+
+    if (promise === value) {
+      reject(promise, cannotReturnOwn());
+      return;
+    }
+  } else {
+    value = detail;
+  }
+
+  if (promise._state !== PENDING) {
+    // noop
+  } else if (hasCallback && succeeded) {
+    resolve(promise, value);
+  } else if (succeeded === false) {
+    reject(promise, error);
+  } else if (settled === FULFILLED) {
+    fulfill(promise, value);
+  } else if (settled === REJECTED) {
+    reject(promise, value);
+  }
+}
+
+function initializePromise(promise, resolver) {
+  try {
+    resolver(function resolvePromise(value) {
+      resolve(promise, value);
+    }, function rejectPromise(reason) {
+      reject(promise, reason);
+    });
+  } catch (e) {
+    reject(promise, e);
+  }
+}
+
+var id = 0;
+function nextId() {
+  return id++;
+}
+
+function makePromise(promise) {
+  promise[PROMISE_ID] = id++;
+  promise._state = undefined;
+  promise._result = undefined;
+  promise._subscribers = [];
+}
+
+function validationError() {
+  return new Error('Array Methods must be provided an Array');
+}
+
+var Enumerator = function () {
+  function Enumerator(Constructor, input) {
+    this._instanceConstructor = Constructor;
+    this.promise = new Constructor(noop);
+
+    if (!this.promise[PROMISE_ID]) {
+      makePromise(this.promise);
+    }
+
+    if (isArray(input)) {
+      this.length = input.length;
+      this._remaining = input.length;
+
+      this._result = new Array(this.length);
+
+      if (this.length === 0) {
+        fulfill(this.promise, this._result);
+      } else {
+        this.length = this.length || 0;
+        this._enumerate(input);
+        if (this._remaining === 0) {
+          fulfill(this.promise, this._result);
+        }
+      }
+    } else {
+      reject(this.promise, validationError());
+    }
+  }
+
+  Enumerator.prototype._enumerate = function _enumerate(input) {
+    for (var i = 0; this._state === PENDING && i < input.length; i++) {
+      this._eachEntry(input[i], i);
+    }
+  };
+
+  Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {
+    var c = this._instanceConstructor;
+    var resolve$$1 = c.resolve;
+
+
+    if (resolve$$1 === resolve$1) {
+      var _then = void 0;
+      var error = void 0;
+      var didError = false;
+      try {
+        _then = entry.then;
+      } catch (e) {
+        didError = true;
+        error = e;
+      }
+
+      if (_then === then && entry._state !== PENDING) {
+        this._settledAt(entry._state, i, entry._result);
+      } else if (typeof _then !== 'function') {
+        this._remaining--;
+        this._result[i] = entry;
+      } else if (c === Promise$1) {
+        var promise = new c(noop);
+        if (didError) {
+          reject(promise, error);
+        } else {
+          handleMaybeThenable(promise, entry, _then);
+        }
+        this._willSettleAt(promise, i);
+      } else {
+        this._willSettleAt(new c(function (resolve$$1) {
+          return resolve$$1(entry);
+        }), i);
+      }
+    } else {
+      this._willSettleAt(resolve$$1(entry), i);
+    }
+  };
+
+  Enumerator.prototype._settledAt = function _settledAt(state, i, value) {
+    var promise = this.promise;
+
+
+    if (promise._state === PENDING) {
+      this._remaining--;
+
+      if (state === REJECTED) {
+        reject(promise, value);
+      } else {
+        this._result[i] = value;
+      }
+    }
+
+    if (this._remaining === 0) {
+      fulfill(promise, this._result);
+    }
+  };
+
+  Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {
+    var enumerator = this;
+
+    subscribe(promise, undefined, function (value) {
+      return enumerator._settledAt(FULFILLED, i, value);
+    }, function (reason) {
+      return enumerator._settledAt(REJECTED, i, reason);
+    });
+  };
+
+  return Enumerator;
+}();
+
+/**
+  `Promise.all` accepts an array of promises, and returns a new promise which
+  is fulfilled with an array of fulfillment values for the passed promises, or
+  rejected with the reason of the first passed promise to be rejected. It casts all
+  elements of the passed iterable to promises as it runs this algorithm.
+
+  Example:
+
+  ```javascript
+  let promise1 = resolve(1);
+  let promise2 = resolve(2);
+  let promise3 = resolve(3);
+  let promises = [ promise1, promise2, promise3 ];
+
+  Promise.all(promises).then(function(array){
+    // The array here would be [ 1, 2, 3 ];
+  });
+  ```
+
+  If any of the `promises` given to `all` are rejected, the first promise
+  that is rejected will be given as an argument to the returned promises's
+  rejection handler. For example:
+
+  Example:
+
+  ```javascript
+  let promise1 = resolve(1);
+  let promise2 = reject(new Error("2"));
+  let promise3 = reject(new Error("3"));
+  let promises = [ promise1, promise2, promise3 ];
+
+  Promise.all(promises).then(function(array){
+    // Code here never runs because there are rejected promises!
+  }, function(error) {
+    // error.message === "2"
+  });
+  ```
+
+  @method all
+  @static
+  @param {Array} entries array of promises
+  @param {String} label optional string for labeling the promise.
+  Useful for tooling.
+  @return {Promise} promise that is fulfilled when all `promises` have been
+  fulfilled, or rejected if any of them become rejected.
+  @static
+*/
+function all(entries) {
+  return new Enumerator(this, entries).promise;
+}
+
+/**
+  `Promise.race` returns a new promise which is settled in the same way as the
+  first passed promise to settle.
+
+  Example:
+
+  ```javascript
+  let promise1 = new Promise(function(resolve, reject){
+    setTimeout(function(){
+      resolve('promise 1');
+    }, 200);
+  });
+
+  let promise2 = new Promise(function(resolve, reject){
+    setTimeout(function(){
+      resolve('promise 2');
+    }, 100);
+  });
+
+  Promise.race([promise1, promise2]).then(function(result){
+    // result === 'promise 2' because it was resolved before promise1
+    // was resolved.
+  });
+  ```
+
+  `Promise.race` is deterministic in that only the state of the first
+  settled promise matters. For example, even if other promises given to the
+  `promises` array argument are resolved, but the first settled promise has
+  become rejected before the other promises became fulfilled, the returned
+  promise will become rejected:
+
+  ```javascript
+  let promise1 = new Promise(function(resolve, reject){
+    setTimeout(function(){
+      resolve('promise 1');
+    }, 200);
+  });
+
+  let promise2 = new Promise(function(resolve, reject){
+    setTimeout(function(){
+      reject(new Error('promise 2'));
+    }, 100);
+  });
+
+  Promise.race([promise1, promise2]).then(function(result){
+    // Code here never runs
+  }, function(reason){
+    // reason.message === 'promise 2' because promise 2 became rejected before
+    // promise 1 became fulfilled
+  });
+  ```
+
+  An example real-world use case is implementing timeouts:
+
+  ```javascript
+  Promise.race([ajax('foo.json'), timeout(5000)])
+  ```
+
+  @method race
+  @static
+  @param {Array} promises array of promises to observe
+  Useful for tooling.
+  @return {Promise} a promise which settles in the same way as the first passed
+  promise to settle.
+*/
+function race(entries) {
+  /*jshint validthis:true */
+  var Constructor = this;
+
+  if (!isArray(entries)) {
+    return new Constructor(function (_, reject) {
+      return reject(new TypeError('You must pass an array to race.'));
+    });
+  } else {
+    return new Constructor(function (resolve, reject) {
+      var length = entries.length;
+      for (var i = 0; i < length; i++) {
+        Constructor.resolve(entries[i]).then(resolve, reject);
+      }
+    });
+  }
+}
+
+/**
+  `Promise.reject` returns a promise rejected with the passed `reason`.
+  It is shorthand for the following:
+
+  ```javascript
+  let promise = new Promise(function(resolve, reject){
+    reject(new Error('WHOOPS'));
+  });
+
+  promise.then(function(value){
+    // Code here doesn't run because the promise is rejected!
+  }, function(reason){
+    // reason.message === 'WHOOPS'
+  });
+  ```
+
+  Instead of writing the above, your code now simply becomes the following:
+
+  ```javascript
+  let promise = Promise.reject(new Error('WHOOPS'));
+
+  promise.then(function(value){
+    // Code here doesn't run because the promise is rejected!
+  }, function(reason){
+    // reason.message === 'WHOOPS'
+  });
+  ```
+
+  @method reject
+  @static
+  @param {Any} reason value that the returned promise will be rejected with.
+  Useful for tooling.
+  @return {Promise} a promise rejected with the given `reason`.
+*/
+function reject$1(reason) {
+  /*jshint validthis:true */
+  var Constructor = this;
+  var promise = new Constructor(noop);
+  reject(promise, reason);
+  return promise;
+}
+
+function needsResolver() {
+  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
+}
+
+function needsNew() {
+  throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
+}
+
+/**
+  Promise objects represent the eventual result of an asynchronous operation. The
+  primary way of interacting with a promise is through its `then` method, which
+  registers callbacks to receive either a promise's eventual value or the reason
+  why the promise cannot be fulfilled.
+
+  Terminology
+  -----------
+
+  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
+  - `thenable` is an object or function that defines a `then` method.
+  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
+  - `exception` is a value that is thrown using the throw statement.
+  - `reason` is a value that indicates why a promise was rejected.
+  - `settled` the final resting state of a promise, fulfilled or rejected.
+
+  A promise can be in one of three states: pending, fulfilled, or rejected.
+
+  Promises that are fulfilled have a fulfillment value and are in the fulfilled
+  state.  Promises that are rejected have a rejection reason and are in the
+  rejected state.  A fulfillment value is never a thenable.
+
+  Promises can also be said to *resolve* a value.  If this value is also a
+  promise, then the original promise's settled state will match the value's
+  settled state.  So a promise that *resolves* a promise that rejects will
+  itself reject, and a promise that *resolves* a promise that fulfills will
+  itself fulfill.
+
+
+  Basic Usage:
+  ------------
+
+  ```js
+  let promise = new Promise(function(resolve, reject) {
+    // on success
+    resolve(value);
+
+    // on failure
+    reject(reason);
+  });
+
+  promise.then(function(value) {
+    // on fulfillment
+  }, function(reason) {
+    // on rejection
+  });
+  ```
+
+  Advanced Usage:
+  ---------------
+
+  Promises shine when abstracting away asynchronous interactions such as
+  `XMLHttpRequest`s.
+
+  ```js
+  function getJSON(url) {
+    return new Promise(function(resolve, reject){
+      let xhr = new XMLHttpRequest();
+
+      xhr.open('GET', url);
+      xhr.onreadystatechange = handler;
+      xhr.responseType = 'json';
+      xhr.setRequestHeader('Accept', 'application/json');
+      xhr.send();
+
+      function handler() {
+        if (this.readyState === this.DONE) {
+          if (this.status === 200) {
+            resolve(this.response);
+          } else {
+            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
+          }
+        }
+      };
+    });
+  }
+
+  getJSON('/posts.json').then(function(json) {
+    // on fulfillment
+  }, function(reason) {
+    // on rejection
+  });
+  ```
+
+  Unlike callbacks, promises are great composable primitives.
+
+  ```js
+  Promise.all([
+    getJSON('/posts'),
+    getJSON('/comments')
+  ]).then(function(values){
+    values[0] // => postsJSON
+    values[1] // => commentsJSON
+
+    return values;
+  });
+  ```
+
+  @class Promise
+  @param {Function} resolver
+  Useful for tooling.
+  @constructor
+*/
+
+var Promise$1 = function () {
+  function Promise(resolver) {
+    this[PROMISE_ID] = nextId();
+    this._result = this._state = undefined;
+    this._subscribers = [];
+
+    if (noop !== resolver) {
+      typeof resolver !== 'function' && needsResolver();
+      this instanceof Promise ? initializePromise(this, resolver) : needsNew();
+    }
+  }
+
+  /**
+  The primary way of interacting with a promise is through its `then` method,
+  which registers callbacks to receive either a promise's eventual value or the
+  reason why the promise cannot be fulfilled.
+   ```js
+  findUser().then(function(user){
+    // user is available
+  }, function(reason){
+    // user is unavailable, and you are given the reason why
+  });
+  ```
+   Chaining
+  --------
+   The return value of `then` is itself a promise.  This second, 'downstream'
+  promise is resolved with the return value of the first promise's fulfillment
+  or rejection handler, or rejected if the handler throws an exception.
+   ```js
+  findUser().then(function (user) {
+    return user.name;
+  }, function (reason) {
+    return 'default name';
+  }).then(function (userName) {
+    // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
+    // will be `'default name'`
+  });
+   findUser().then(function (user) {
+    throw new Error('Found user, but still unhappy');
+  }, function (reason) {
+    throw new Error('`findUser` rejected and we're unhappy');
+  }).then(function (value) {
+    // never reached
+  }, function (reason) {
+    // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
+    // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
+  });
+  ```
+  If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
+   ```js
+  findUser().then(function (user) {
+    throw new PedagogicalException('Upstream error');
+  }).then(function (value) {
+    // never reached
+  }).then(function (value) {
+    // never reached
+  }, function (reason) {
+    // The `PedgagocialException` is propagated all the way down to here
+  });
+  ```
+   Assimilation
+  ------------
+   Sometimes the value you want to propagate to a downstream promise can only be
+  retrieved asynchronously. This can be achieved by returning a promise in the
+  fulfillment or rejection handler. The downstream promise will then be pending
+  until the returned promise is settled. This is called *assimilation*.
+   ```js
+  findUser().then(function (user) {
+    return findCommentsByAuthor(user);
+  }).then(function (comments) {
+    // The user's comments are now available
+  });
+  ```
+   If the assimliated promise rejects, then the downstream promise will also reject.
+   ```js
+  findUser().then(function (user) {
+    return findCommentsByAuthor(user);
+  }).then(function (comments) {
+    // If `findCommentsByAuthor` fulfills, we'll have the value here
+  }, function (reason) {
+    // If `findCommentsByAuthor` rejects, we'll have the reason here
+  });
+  ```
+   Simple Example
+  --------------
+   Synchronous Example
+   ```javascript
+  let result;
+   try {
+    result = findResult();
+    // success
+  } catch(reason) {
+    // failure
+  }
+  ```
+   Errback Example
+   ```js
+  findResult(function(result, err){
+    if (err) {
+      // failure
+    } else {
+      // success
+    }
+  });
+  ```
+   Promise Example;
+   ```javascript
+  findResult().then(function(result){
+    // success
+  }, function(reason){
+    // failure
+  });
+  ```
+   Advanced Example
+  --------------
+   Synchronous Example
+   ```javascript
+  let author, books;
+   try {
+    author = findAuthor();
+    books  = findBooksByAuthor(author);
+    // success
+  } catch(reason) {
+    // failure
+  }
+  ```
+   Errback Example
+   ```js
+   function foundBooks(books) {
+   }
+   function failure(reason) {
+   }
+   findAuthor(function(author, err){
+    if (err) {
+      failure(err);
+      // failure
+    } else {
+      try {
+        findBoooksByAuthor(author, function(books, err) {
+          if (err) {
+            failure(err);
+          } else {
+            try {
+              foundBooks(books);
+            } catch(reason) {
+              failure(reason);
+            }
+          }
+        });
+      } catch(error) {
+        failure(err);
+      }
+      // success
+    }
+  });
+  ```
+   Promise Example;
+   ```javascript
+  findAuthor().
+    then(findBooksByAuthor).
+    then(function(books){
+      // found books
+  }).catch(function(reason){
+    // something went wrong
+  });
+  ```
+   @method then
+  @param {Function} onFulfilled
+  @param {Function} onRejected
+  Useful for tooling.
+  @return {Promise}
+  */
+
+  /**
+  `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
+  as the catch block of a try/catch statement.
+  ```js
+  function findAuthor(){
+  throw new Error('couldn't find that author');
+  }
+  // synchronous
+  try {
+  findAuthor();
+  } catch(reason) {
+  // something went wrong
+  }
+  // async with promises
+  findAuthor().catch(function(reason){
+  // something went wrong
+  });
+  ```
+  @method catch
+  @param {Function} onRejection
+  Useful for tooling.
+  @return {Promise}
+  */
+
+
+  Promise.prototype.catch = function _catch(onRejection) {
+    return this.then(null, onRejection);
+  };
+
+  /**
+    `finally` will be invoked regardless of the promise's fate just as native
+    try/catch/finally behaves
+  
+    Synchronous example:
+  
+    ```js
+    findAuthor() {
+      if (Math.random() > 0.5) {
+        throw new Error();
+      }
+      return new Author();
+    }
+  
+    try {
+      return findAuthor(); // succeed or fail
+    } catch(error) {
+      return findOtherAuther();
+    } finally {
+      // always runs
+      // doesn't affect the return value
+    }
+    ```
+  
+    Asynchronous example:
+  
+    ```js
+    findAuthor().catch(function(reason){
+      return findOtherAuther();
+    }).finally(function(){
+      // author was either found, or not
+    });
+    ```
+  
+    @method finally
+    @param {Function} callback
+    @return {Promise}
+  */
+
+
+  Promise.prototype.finally = function _finally(callback) {
+    var promise = this;
+    var constructor = promise.constructor;
+
+    if (isFunction(callback)) {
+      return promise.then(function (value) {
+        return constructor.resolve(callback()).then(function () {
+          return value;
+        });
+      }, function (reason) {
+        return constructor.resolve(callback()).then(function () {
+          throw reason;
+        });
+      });
+    }
+
+    return promise.then(callback, callback);
+  };
+
+  return Promise;
+}();
+
+Promise$1.prototype.then = then;
+Promise$1.all = all;
+Promise$1.race = race;
+Promise$1.resolve = resolve$1;
+Promise$1.reject = reject$1;
+Promise$1._setScheduler = setScheduler;
+Promise$1._setAsap = setAsap;
+Promise$1._asap = asap;
+
+/*global self*/
+function polyfill() {
+  var local = void 0;
+
+  if (typeof global !== 'undefined') {
+    local = global;
+  } else if (typeof self !== 'undefined') {
+    local = self;
+  } else {
+    try {
+      local = Function('return this')();
+    } catch (e) {
+      throw new Error('polyfill failed because global object is unavailable in this environment');
+    }
+  }
+
+  var P = local.Promise;
+
+  if (P) {
+    var promiseToString = null;
+    try {
+      promiseToString = Object.prototype.toString.call(P.resolve());
+    } catch (e) {
+      // silently ignored
+    }
+
+    if (promiseToString === '[object Promise]' && !P.cast) {
+      return;
+    }
+  }
+
+  local.Promise = Promise$1;
+}
+
+// Strange compat..
+Promise$1.polyfill = polyfill;
+Promise$1.Promise = Promise$1;
+
+return Promise$1;
+
+})));
+
+
+
+//# sourceMappingURL=es6-promise.map
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(51), __webpack_require__(52)))
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports) {
+
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things.  But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals.  It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+    throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+    throw new Error('clearTimeout has not been defined');
+}
+(function () {
+    try {
+        if (typeof setTimeout === 'function') {
+            cachedSetTimeout = setTimeout;
+        } else {
+            cachedSetTimeout = defaultSetTimout;
+        }
+    } catch (e) {
+        cachedSetTimeout = defaultSetTimout;
+    }
+    try {
+        if (typeof clearTimeout === 'function') {
+            cachedClearTimeout = clearTimeout;
+        } else {
+            cachedClearTimeout = defaultClearTimeout;
+        }
+    } catch (e) {
+        cachedClearTimeout = defaultClearTimeout;
+    }
+} ())
+function runTimeout(fun) {
+    if (cachedSetTimeout === setTimeout) {
+        //normal enviroments in sane situations
+        return setTimeout(fun, 0);
+    }
+    // if setTimeout wasn't available but was latter defined
+    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+        cachedSetTimeout = setTimeout;
+        return setTimeout(fun, 0);
+    }
+    try {
+        // when when somebody has screwed with setTimeout but no I.E. maddness
+        return cachedSetTimeout(fun, 0);
+    } catch(e){
+        try {
+            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+            return cachedSetTimeout.call(null, fun, 0);
+        } catch(e){
+            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+            return cachedSetTimeout.call(this, fun, 0);
+        }
+    }
+
+
+}
+function runClearTimeout(marker) {
+    if (cachedClearTimeout === clearTimeout) {
+        //normal enviroments in sane situations
+        return clearTimeout(marker);
+    }
+    // if clearTimeout wasn't available but was latter defined
+    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+        cachedClearTimeout = clearTimeout;
+        return clearTimeout(marker);
+    }
+    try {
+        // when when somebody has screwed with setTimeout but no I.E. maddness
+        return cachedClearTimeout(marker);
+    } catch (e){
+        try {
+            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
+            return cachedClearTimeout.call(null, marker);
+        } catch (e){
+            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+            return cachedClearTimeout.call(this, marker);
+        }
+    }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+    if (!draining || !currentQueue) {
+        return;
+    }
+    draining = false;
+    if (currentQueue.length) {
+        queue = currentQueue.concat(queue);
+    } else {
+        queueIndex = -1;
+    }
+    if (queue.length) {
+        drainQueue();
+    }
+}
+
+function drainQueue() {
+    if (draining) {
+        return;
+    }
+    var timeout = runTimeout(cleanUpNextTick);
+    draining = true;
+
+    var len = queue.length;
+    while(len) {
+        currentQueue = queue;
+        queue = [];
+        while (++queueIndex < len) {
+            if (currentQueue) {
+                currentQueue[queueIndex].run();
+            }
+        }
+        queueIndex = -1;
+        len = queue.length;
+    }
+    currentQueue = null;
+    draining = false;
+    runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+    var args = new Array(arguments.length - 1);
+    if (arguments.length > 1) {
+        for (var i = 1; i < arguments.length; i++) {
+            args[i - 1] = arguments[i];
+        }
+    }
+    queue.push(new Item(fun, args));
+    if (queue.length === 1 && !draining) {
+        runTimeout(drainQueue);
+    }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+    this.fun = fun;
+    this.array = array;
+}
+Item.prototype.run = function () {
+    this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) { return [] }
+
+process.binding = function (name) {
+    throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+    throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports) {
+
+var g;
+
+// This works in non-strict mode
+g = (function() {
+	return this;
+})();
+
+try {
+	// This works if eval is allowed (see CSP)
+	g = g || new Function("return this")();
+} catch (e) {
+	// This works if the window reference is available
+	if (typeof window === "object") g = window;
+}
+
+// g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
+
+module.exports = g;
+
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports) {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE__53__;
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports) {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE__54__;
+
+/***/ }),
+/* 55 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/**
+ * JSONP : Implémentation du protocole JSONP de la plateforme Géoportail
+ *
+ * @module JSONP
+ * @private
+ * @alias Gp.Protocols.JSONP
+ */
+
+
+// cf. https://github.com/sobstel/jsonp.js
+var JSONP = {
+
+    /**
+     * Construction d'un identifiant statique basé sur le timestamp,
+     * et qui s'incremente de +1 à chaque appel
+     */
+    uuid : (function () {
+        var id = Math.floor(Date.now());
+        return function () {
+            return id++;
+        };
+    })(),
+
+    /**
+     * Cette fonction réalise l'appel du service fourni via le paramètre "options.url"
+     * en mettant en œuvre le protocole JSONP.
+     *
+     * @method call
+     * @static
+     * @param {Object} options - parametres d'invocation du service en JSONP
+     * @param {String} options.url - URL du service à invoquer (indépendamment du protocole JSONP).
+     *  Cette URL contient déjà les paramètres du service.
+     *  Si le paramètre dédié à la mise en oeuvre du protocole JSONP (callback=xxx) n'est pas présent, il est rajouté par la fonction ;
+     *  sa valeur est déterminée en fonction du paramètre callbackName.
+     * @param {Number} [options.timeOut = 0] - Nombre de ms au bout duquel on considère que le service n'a pas répondu.
+     *  Une valeur de 0 pour ce paramètre permet de désactiver la gestion du timeOut.
+     * @param {String} [options.callbackSuffix = null] - Suffixe de la fonction de callback à rajouter sur l'URL.
+     *  Si aucun suffixe n'est spécifié (cas par défaut), on utilisera l'identifiant this.uuid () comme suffixe. Ex: "callback1458574396582 ()"
+     * @param {String} [options.callbackName = gp.protocol.jsonp] - Valeur du paramètre callback à rajouter sur l'URL.
+     *  Si l'URL fournie contient déjà le paramètre callback, le paramètre callbackName ne sera pas pris en compte.
+     *  La fonction de callback est créée dynamiquement par la fonction JSONP ;
+     *  elle a deux fonctions :
+     *    elle annule la condition de timeOut
+     *    puis appelle la fonction fournie par l'utilisateur via le paramètre onResponse.
+     * @param {Function} options.onResponse - Nom de la fonction qui sera appelée lors de la réception des résultats du service.
+     *  Ce paramètre sera ignoré si l'URL contient déjà le paramètre callback.
+     *  La fonction de rappel appelée sera alors celle ayant pour nom la valeur de ce paramètre.
+     * @param {Function} [options.onTimeOut] - Nom de la fonction qui sera appelée en cas de non réponse du service.
+     *  Le temps au bout duquel on considère que le service n'a pas répondu est déterminé par le paramètre timeOut.
+     *  @example
+     *  var options = {
+     *      url : 'http://localhost/some/test.json&callback=myResults',
+     *      timeOut : 100,
+     *      callbackName : 'myResults',
+     *      callbackSuffix : "",
+     *      onResponse : function (response) {
+     *          console.log('results : ', response);
+     *      },
+     *
+     *   };
+     *   JSONP.call(options);
+     */
+    call : function (options) {
+        // logger
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("JSONP");
+        logger.trace("[JSONP::call ()]");
+
+        // analyse parametres
+
+        if (!options) {
+            logger.error("missing parameter : options !");
+            throw new Error("missing parameter : options !");
+        }
+
+        if (!options.url) {
+            logger.error("missing parameter : options.url !");
+            throw new Error("missing parameter : options.url !");
+        }
+
+        if (!options.timeOut) {
+            logger.info("setting 'options.timeOut' default value");
+            options.timeOut = 0;
+        }
+
+        // FIXME si un callback coté client a été mis en place,
+        // cette condition sur cette methode n'a pas de sens !?
+        if (!options.onResponse) {
+            logger.error("missing parameter : options.onResponse !");
+            throw new Error("missing parameter : options.onResponse !");
+            // FIXME doit on definir un callback interne par defaut !?
+            // options.onResponse = function (data) {
+            //    console.log("response callback (inner) : ", data);
+            // };
+        }
+
+        // ID du callback à utiliser : null ou string.
+        // si l'utilisateur a spécifié un suffixe pour le callback, on le récupère comme un ID (ex: options.callbackSuffix = "")
+        // sinon, on utilise un timestamp : this.uuid ()
+        var callbackId = (typeof options.callbackSuffix === "string") ? options.callbackSuffix : this.uuid();
+
+        // on recherche le parametre callback et son nom de fonction dans l'url
+        var urlHasCallbackKey = false;
+        var urlHasCallbackName = false;
+
+        var idx = options.url.indexOf("callback=");
+
+        if (idx !== -1) {
+            urlHasCallbackKey = true;
+            // extraction callbackName de l'url : entre "callback=" et "&" ou fin de ligne
+            var j = options.url.indexOf("&", idx);
+            if (j === -1) {
+                j = options.url.length;
+            }
+
+            // on ecrase le parametre options.callbackName s'il avait été défini
+            var callbackName = options.url.substring(idx + 9, j);
+
+            if (callbackName) {
+                urlHasCallbackName = true;
+                options.callbackName = callbackName;
+                logger.info("setting 'options.callbackName' value (" + options.callbackName + ") from 'options.url' parameter");
+            }
+        }
+
+        // on ajoute le parametre callback dans l'URL s'il n'existe pas
+        if (!urlHasCallbackKey) {
+            // gestion des autres param. et "?"
+            var k = options.url.indexOf("?");
+            if (k === -1) {
+                // aucun param., ni de '?'
+                options.url = options.url + "?" + "callback=";
+            } else if (k === options.url.length) {
+                // uniquement le '?'
+                options.url = options.url + "callback=";
+            } else {
+                // le '?' et les param. existent
+                options.url = options.url + "&" + "callback=";
+            }
+            logger.info("setting callback default key in 'options.url' : " + options.url);
+        }
+
+        // utilisation de la fonction callback coté client ?
+        var HasCallbackName = options.callbackName ? true : urlHasCallbackName;
+
+        // on ajoute le nom de la fonction callback dans l'URL si elle n'existe pas
+        if (!urlHasCallbackName) {
+            // fonction callback par defaut
+            if (!options.callbackName) {
+                logger.info("setting 'options.callbackName' default value");
+                options.callbackName = "callback"; // ou "gp.protocol.jsonp" ?
+                // info : si on ne veut pas gerer d'ID dans le callback,
+                // options.callbackSuffix = ""
+                if (callbackId || callbackId === "") {
+                    options.callbackName += callbackId;
+                }
+            }
+            options.url = options.url.replace("callback=", "callback=" + options.callbackName);
+            logger.info("setting callback function name in 'options.url' : " + options.url);
+        }
+
+        // timeOut par defaut
+        if (!options.onTimeOut) {
+            logger.info("setting 'options.onTimeOut' default value");
+            /** callback timeout par defaut */
+            options.onTimeOut = function (/* error */) {
+                console.log("TimeOut while invoking url : " + options.url);
+            };
+        }
+
+        if (!HasCallbackName) {
+            var self = this;
+
+            // event du timeout
+            var onTimeOutTrigger = null;
+
+            // declenche le timeout si > à 0 !
+            if (options.timeOut > 0) {
+                onTimeOutTrigger = window.setTimeout(
+                    function () {
+                        /** fonction de reponse du service */
+                        window[options.callbackName] = function () {};
+                        options.onTimeOut();
+                        self._deleteScript(callbackId);
+                    }, options.timeOut);
+            }
+
+            // FIXME le nom de la fonction n'accepte pas de namespace !
+            // ex. Gp.Function.callback
+            /**
+            * fonction de reponse du service
+            * @param {Object} data - data
+            * @private
+            */
+            window[options.callbackName] = function (data) {
+                window.clearTimeout(onTimeOutTrigger);
+                options.onResponse(data);
+                self._deleteScript(callbackId);
+            };
+        }
+
+        this._createScript(callbackId, options.url);
+    },
+
+    /**
+    * create Script
+    * @param {String} callbackId - callback Id
+    * @param {String} url - url
+    * @private
+    */
+    _createScript : function (callbackId, url) {
+        var scriptu;
+        var scripto = document.getElementById("results" + callbackId);
+
+        scriptu = document.createElement("script");
+        scriptu.setAttribute("type", "text/javascript");
+        scriptu.setAttribute("src", url);
+        scriptu.setAttribute("charset", "UTF-8");
+        scriptu.setAttribute("id", "results" + callbackId);
+        scriptu.setAttribute("async", "true"); // FIXME async ?
+        // head ou body ou autres ?
+        var node = document.documentElement || document.getElementsByTagName("head")[0];
+        if (scripto === null) {
+            node.appendChild(scriptu);
+        } else {
+            // s'il existe déjà, on le remplace !
+            node.replaceChild(scriptu, scripto);
+        }
+    },
+
+    /**
+    * delete Script
+    * @param {String} callbackId - callback Id
+    * @private
+    */
+    _deleteScript : function (callbackId) {
+        var script = document.getElementById("results" + callbackId);
+        if (script) {
+            var node = script.parentNode || document.documentElement;
+            if (!node) {
+                return;
+            }
+            node.removeChild(script);
+        }
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (JSONP);
+
+
+/***/ }),
+/* 56 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+// cette classe contient les URLs par defaut des services.
+//  DefaultUrlService.Alti.url(key)[elevation-json]
+//  DefaultUrlService.Alti.url(key)[elevation-xml]
+//  DefaultUrlService.Alti.url(key)[profil-json]
+//  DefaultUrlService.Alti.url(key)[profil-xml]
+//  DefaultUrlService.Alti.url(key)[wps]
+//  DefaultUrlService.ProcessIsoCurve.url(key)
+//  DefaultUrlService.AutoComplete.url(key)
+//  DefaultUrlService.ReverseGeocode.url(key)
+//  DefaultUrlService.AutoConf.url(key)[apiKey]
+//  DefaultUrlService.AutoConf.url(key)[apiKeys]
+//  DefaultUrlService.AutoConf.url(key)[aggregate]
+//  DefaultUrlService.Geocode.url(key)
+//  DefaultUrlService.Route.url(key)
+
+// Example :
+//
+// DefaultUrlService.Alti.url('efe4r54tj4uy5i78o7545eaz7e87a')[elevation-json]
+//  output {String} -> http://wxs.ign.fr/efe4r54tj4uy5i78o7545eaz7e87a/alti/rest/elevation.json
+//
+// DefaultUrlService.Alti.url('efe4r54tj4uy5i78o7545eaz7e87a')
+// output {Object|String}
+// -> http://wxs.ign.fr/efe4r54tj4uy5i78o7545eaz7e87a/alti/rest/elevation.json
+// -> http://wxs.ign.fr/efe4r54tj4uy5i78o7545eaz7e87a/alti/rest/elevation.xml
+// -> http://wxs.ign.fr/efe4r54tj4uy5i78o7545eaz7e87a/alti/rest/elevationLine.json
+// -> http://wxs.ign.fr/efe4r54tj4uy5i78o7545eaz7e87a/alti/rest/elevationLine.xml
+// -> http://wxs.ign.fr/efe4r54tj4uy5i78o7545eaz7e87a/alti/wps
+//
+// ssl by default.
+//
+// Force to not do ssl :
+// DefaultUrlService.ssl = false;
+//
+// DefaultUrlService.AutoComplete.url('efe4r54tj4uy5i78o7545eaz7e87a')
+// output {Object|String}
+// -> https://wxs.ign.fr/efe4r54tj4uy5i78o7545eaz7e87a/ols/apis/completion
+
+// constantes internes
+var HOSTNAME = "wxs.ign.fr";
+
+/**
+ * Default Geoportal web services URLs access.
+ *
+ * @namespace
+ * @alias Gp.Services.DefaultUrl
+ */
+var DefaultUrlService = {
+
+    /** if set true, require the use of https protocol */
+    ssl : true,
+
+    /**
+    * base url of services (ssl protocol management)
+    * @param {String} key - key
+    * @param {String} path - path
+    * @returns {String} url
+    */
+    url : function (key, path) {
+        // comportement par défaut => https
+        // sinon, il est fixé par l'option 'ssl' (false => http)
+        var _protocol;
+        if (DefaultUrlService.ssl === false) {
+            _protocol = "http://";
+        } else {
+            _protocol = "https://";
+        }
+
+        return _protocol + HOSTNAME.concat("/", key, path);
+    },
+
+    /**
+     * Elevation web service access
+     *
+     * @member {Object}
+     * @property {Function} url (key) - Returns elevation service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols ("elevation-json", "elevation-xml", "profil-json" or "profil-xml").
+     */
+    Alti : {
+        _key : {
+            // rest
+            "elevation-json" : "/alti/rest/elevation.json",
+            "elevation-xml" : "/alti/rest/elevation.xml",
+            "profil-json" : "/alti/rest/elevationLine.json",
+            "profil-xml" : "/alti/rest/elevationLine.xml",
+            // other
+            wps : "/alti/wps"
+        },
+        /**
+        * url
+        * @param {String} key - key
+        * @returns {String} url
+        */
+        url : function (key) {
+            return {
+                // rest
+                "elevation-json" : DefaultUrlService.url(key, this._key["elevation-json"]),
+                "elevation-xml" : DefaultUrlService.url(key, this._key["elevation-xml"]),
+                "profil-json" : DefaultUrlService.url(key, this._key["profil-json"]),
+                "profil-xml" : DefaultUrlService.url(key, this._key["profil-xml"]),
+                // other
+                wps : DefaultUrlService.url(key, this._key["wps"])
+            };
+        }
+    },
+    /**
+     * IsoCurve web service access
+     *
+     * @member {Object}
+     * @property {Function} url (key) - Returns isocurve service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols ("iso-json" or "iso-xml").
+     */
+    ProcessIsoCurve : {
+        _key : {
+            "iso-json" : "/isochrone/isochrone.json", // rest (geoconcept)
+            "iso-xml" : "/isochrone/isochrone.xml" // rest (geoconcept)
+        },
+        /**
+        * url
+        * @param {String} key - key
+        * @returns {String} url
+        */
+        url : function (key) {
+            return {
+                "iso-json" : DefaultUrlService.url(key, this._key["iso-json"]),
+                "iso-xml" : DefaultUrlService.url(key, this._key["iso-xml"])
+            };
+        }
+    },
+    /**
+     * Autocompletion web service access
+     *
+     * @member {Object}
+     * @property {Function} url (key) - Returns autocomplete service default urls with or without geoportal access key given as a parameter. The result is a String.
+     */
+    AutoComplete : {
+        _key : "/ols/apis/completion",
+        /**
+        * url
+        * @param {String} key - key
+        * @returns {String} url
+        */
+        url : function (key) {
+            return DefaultUrlService.url(key, this._key);
+        }
+    },
+    /**
+     * Reverse geocoding web service access
+     *
+     * @member {Object}
+     * @property {Function} url (key) - Returns reverse geocoding service default urls with or without geoportal access key given as a parameter. The result is a String.
+     */
+    ReverseGeocode : {
+        _key : "/geoportail/ols",
+        /**
+        * url
+        * @param {String} key - key
+        * @returns {String} url
+        */
+        url : function (key) {
+            return DefaultUrlService.url(key, this._key);
+        }
+    },
+    /**
+     * Autoconfiguration web service access
+     *
+     * @member {Object}
+     * @property {Function} url ([key1,...]) - Returns autoconfiguration service default urls with geoportal access key (s) given as a String array parameter. The result is a javascript object with different urls given the access mode ("apiKey", "apiKeys" or "aggregate").
+     */
+    AutoConf : {
+        _key : {
+            apiKey : "/autoconf",
+            apiKeys : "/autoconf?keys=%KEYS%",
+            aggregate : "/autoconf/id/"
+        },
+        /**
+        * url
+        * @param {String} key - key
+        * @returns {String} url
+        */
+        url : function (key) {
+            var keys = "";
+            if (Array.isArray(key) && key.length > 0) {
+                keys = key[0];
+                for (var i = 1; i < key.length; i++) {
+                    keys += "," + key[i];
+                }
+            }
+            return {
+                apiKey : DefaultUrlService.url(key, this._key["apiKey"]), // une seule clé
+                apiKeys : DefaultUrlService.url(key[0], this._key["apiKeys"]).replace("%KEYS%", keys), // autoconf de plusieurs clés
+                aggregate : DefaultUrlService.url(key, this._key["aggregate"])
+            };
+        }
+    },
+    /**
+     * Geocoding web service access
+     *
+     * @member {Object}
+     * @property {Function} url (key) - Returns geocoding service default urls with or without geoportal access key given as a parameter. The result is a String.
+     */
+    Geocode : {
+        _key : "/geoportail/ols",
+        /**
+        * url
+        * @param {String} key - key
+        * @returns {String} url
+        */
+        url : function (key) {
+            return DefaultUrlService.url(key, this._key);
+        }
+    },
+    /**
+     * Routing web service access
+     *
+     * @member {Object}
+     * @property {Function} url (key) - Returns routing service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols ("route-json" or "route-xml").
+     */
+    Route : {
+        _key : {
+            ols : "/itineraire/ols", // openLS
+            "route-json" : "/itineraire/rest/route.json", // rest (geoconcept)
+            "route-xml" : "/itineraire/rest/route.xml" // rest (geoconcept)
+        },
+        /**
+        * url
+        * @param {String} key - key
+        * @returns {String} url
+        */
+        url : function (key) {
+            return {
+                ols : DefaultUrlService.url(key, this._key["ols"]),
+                "route-json" : DefaultUrlService.url(key, this._key["route-json"]),
+                "route-xml" : DefaultUrlService.url(key, this._key["route-xml"])
+            };
+        }
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (DefaultUrlService);
+
+
+/***/ }),
+/* 57 */
+/***/ (function(module) {
+
+module.exports = JSON.parse("{\"_from\":\"geoportal-access-lib@2.1.6\",\"_id\":\"geoportal-access-lib@2.1.6\",\"_inBundle\":false,\"_integrity\":\"sha512-zQpSjZq8YkGW+ooB1WloQd2KZHCKyg4/pbIFLSPCk3et2Zan/O2hZlKOf2alEX2zbsg7Wd+e8KiLc7cHZKniag==\",\"_location\":\"/geoportal-access-lib\",\"_phantomChildren\":{},\"_requested\":{\"type\":\"version\",\"registry\":true,\"raw\":\"geoportal-access-lib@2.1.6\",\"name\":\"geoportal-access-lib\",\"escapedName\":\"geoportal-access-lib\",\"rawSpec\":\"2.1.6\",\"saveSpec\":null,\"fetchSpec\":\"2.1.6\"},\"_requiredBy\":[\"/\"],\"_resolved\":\"https://registry.npmjs.org/geoportal-access-lib/-/geoportal-access-lib-2.1.6.tgz\",\"_shasum\":\"8bb0d4cc7045c39c3392fe076ba699aace2b6066\",\"_spec\":\"geoportal-access-lib@2.1.6\",\"_where\":\"/home/runner/work/geoportal-extensions/geoportal-extensions\",\"author\":{\"name\":\"IGNF\"},\"bugs\":{\"url\":\"https://github.com/IGNF/geoportal-access-lib/issues\"},\"bundleDependencies\":false,\"date\":\"03/10/2019\",\"dependencies\":{\"es6-promise\":\"^4.2.4\",\"request\":\"^2.87.0\",\"xmldom\":\"^0.1.27\"},\"deprecated\":false,\"description\":\"French Geoportal resources access library\",\"devDependencies\":{\"babel-core\":\"^6.26.3\",\"babel-loader\":\"^7.1.2\",\"babel-preset-env\":\"^1.7.0\",\"chai\":\"^4.1.2\",\"clean-webpack-plugin\":\"^0.1.18\",\"copy-webpack-plugin\":\"^4.5.1\",\"eslint\":\"^4.18.2\",\"eslint-config-standard\":\"^11.0.0\",\"eslint-loader\":\"^2.0.0\",\"eslint-plugin-import\":\"^2.9.0\",\"eslint-plugin-node\":\"^6.0.1\",\"eslint-plugin-promise\":\"^3.7.0\",\"eslint-plugin-standard\":\"^3.0.1\",\"glob\":\"^7.1.2\",\"handlebars-layouts\":\"^3.1.4\",\"handlebars-webpack-plugin\":\"^1.4.1\",\"html-webpack-plugin\":\"^2.30.1\",\"istanbul-instrumenter-loader\":\"^3.0.1\",\"jsdoc-webpack-plugin\":\"0.0.1\",\"loglevel\":\"^1.6.1\",\"mocha\":\"^4.0.0\",\"mocha-loader\":\"^1.1.3\",\"mocha-webpack\":\"^1.0.1\",\"nyc\":\"^12.0.2\",\"path\":\"^0.12.7\",\"replace-bundle-webpack-plugin\":\"^1.0.0\",\"sinon\":\"^4.3.0\",\"sinon-es6\":\"0.0.3\",\"speed-measure-webpack-plugin\":\"^1.2.2\",\"string-template\":\"^1.0.0\",\"webpack\":\"^3.11.0\",\"webpack-dev-server\":\"^2.11.3\",\"webpack-node-externals\":\"^1.6.0\",\"webpack-shell-plugin\":\"^0.5.0\"},\"homepage\":\"https://github.com/IGNF/geoportal-access-lib#readme\",\"keywords\":[\"geoportail\",\"webservice\",\"javascript\",\"es6\"],\"license\":\"CECILL-B\",\"main\":\"dist/GpServices-src.js\",\"module\":\"src/Gp.js\",\"name\":\"geoportal-access-lib\",\"nyc\":{\"include\":[\"src/**/*.js\"],\"instrument\":false,\"sourceMap\":false},\"optionalDependencies\":{},\"peerDependencies\":{},\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/IGNF/geoportal-access-lib.git\"},\"scripts\":{\"build\":\"webpack\",\"build:dev\":\"webpack --env.development\",\"build:prod\":\"webpack --env.production\",\"clean\":\"echo \\\"Warning: no yet implemented!\\\" && exit 0\",\"cover\":\"nyc --reporter=lcov --reporter=text npm run test\",\"doc\":\"npm run doc:serve\",\"doc:serve\":\"webpack-dev-server --content-base jsdoc --port 9001 --open\",\"sample\":\"npm run sample:serve\",\"sample:serve\":\"webpack-dev-server --open-page samples/index-src.html --https --content-base .  --output-public-path '/dist/' --port 9001 --open 'google-chrome'\",\"sample:serve:dev\":\"webpack-dev-server --env.development --open-page samples/index-map.html --content-base . --output-public-path '/dist/' --port 9001 --open 'google-chrome\",\"sample:serve:prod\":\"webpack-dev-server --env.production --open-page samples/index.html --content-base . --output-public-path '/dist/' --port 9001 --open 'google-chrome\",\"setup\":\"npm install\",\"test\":\"mocha-webpack --webpack-config webpack.test.js --glob \\\"test_*.js\\\" test/spec/\",\"test:end-to-end:serve\":\"webpack-dev-server --hot --config webpack.end-to-end.serve.js\",\"test:serve\":\"webpack-dev-server --hot --config webpack.test.serve.js\"},\"version\":\"2.1.6\"}");
+
+/***/ }),
+/* 58 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(45);
+/* harmony import */ var _AltiRequestREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(59);
+/* harmony import */ var _AltiRequestWPS__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(63);
+/**
+ * Creation d'une requête en REST ou WPS
+ * (Factory)
+ *
+ * @module AltiRequestFactory
+ * @alias Gp.Services.Alti.Request.AltiRequestFactory
+ * @private
+ */
+
+
+
+
+
+var AltiRequestFactory = {
+
+    /**
+     * interface unique
+     *
+     * @method build
+     * @static
+     * @param {Object} options - options definies dans le composant Alti
+     *
+     * @example
+     *   var options = {
+     *      httpMethod : 'GET', // GET|POST
+     *      onSuccess : function (response) {},
+     *      onError : function (error) {},
+     *      scope : this,
+     *      positions : [{lon:, lat:}, {lon:, lat:}],
+     *      outputFormat : 'json' // json|xml
+     *      sampling : 3,
+     *      api : 'REST', // REST|WPS
+     *      zonly : false // false|true
+     *   };
+     *
+     */
+    build : function (options) {
+        // logger
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AltiRequestFactory");
+        logger.trace(["AltiRequestFactory::build()"]);
+
+        var request = null;
+
+        // on factorise les options par groupe;
+        // - global,
+        // - param, les params pour les data inputs
+        // - wps, les param du service
+        // - callback
+
+        var settings = {
+            // ajout des valeurs par defaut spécifiques au service
+            type : options.sampling ? "Profil" : "Elevation",
+            method : options.httpMethod,
+            param : {
+                positions : null,
+                delimiter : null, // FIXME par defaut, on ne le met pas en place car ça fait planter la requête !?
+                indent : null, // par defaut
+                crs : null, // par defaut
+                format : null, // (only to POST)
+                sampling : null, // (only use by Profil)
+                zonly : null // (only use by Elevation)
+            }
+        };
+
+        // surcharge des valeurs obligatoires
+        settings.param.positions = options.positions;
+        settings.param.format = options.outputFormat;
+        settings.param.sampling = options.sampling;
+        settings.param.zonly = options.zonly;
+
+        // gestion des callback
+        var bOnError = !!((options.onError !== null && typeof options.onError === "function"));
+        var bOnSuccess = !!((options.onSuccess !== null && typeof options.onSuccess === "function"));
+
+        var message = null;
+        switch (options.api) {
+            case "REST":
+                // FIXME les exceptions ne sont pas 'catchées' sur le constructeur !
+                var myReq = new _AltiRequestREST__WEBPACK_IMPORTED_MODULE_2__["default"](settings);
+                if (!myReq.processRequestString()) {
+                    message = "Error in process request (rest) !";
+                    if (bOnError) {
+                        options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"](message));
+                        return;
+                    }
+                    throw new Error(message);
+                }
+                request = myReq.requestString;
+                break;
+            case "WPS":
+                // ajout des valeurs par defaut spécifiques au service WPS
+                settings.wps = {
+                    service : null, // par defaut
+                    version : null, // par defaut
+                    identifier : null, // par defaut
+                    rawdataoutput : null, // par defaut
+                    request : null // par defaut
+                };
+
+                request = _AltiRequestWPS__WEBPACK_IMPORTED_MODULE_3__["default"].build(settings);
+                if (!request) {
+                    message = "Error in process request (wps) !";
+                    if (bOnError) {
+                        options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"](message));
+                        return;
+                    }
+                    throw new Error(message);
+                }
+                break;
+            default:
+                message = "Type of API is not supported by service (REST or WPS) !";
+                if (bOnError) {
+                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"](message));
+                    return;
+                }
+                throw new Error(message);
+        }
+
+        if (bOnSuccess) {
+            options.onSuccess.call(options.scope, request);
+        }
+
+        return request;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AltiRequestFactory);
+
+
+/***/ }),
+/* 59 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(60);
+/* harmony import */ var _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(62);
+/* jshint multistr : true */
+
+
+
+
+
+
+/**
+ * @classdesc
+ * Classe de gestion des requêtes de type REST sur le service altimetrique.
+ *
+ * @todo Le service Alti n'implemente pas le POST !?
+ * @constructor
+ * @alias Gp.Services.Alti.Request.AltiRequestREST
+ * @param {Object} options - options
+ * @param {Object}   options.param.positions - tableau de coordonnées lon/lat
+ * @param {String}   options.param.delimiter - '|'
+ * @param {Boolean}  options.param.indent - false|true
+ * @param {String}   options.param.crs - 'CRS:84'
+ * @param {String}   options.param.sampling - 3
+ * @param {Boolean}  options.param.zonly - false|true
+ * @param {String}   options.param.format - "JSON|XML"
+ * @param {String}   options.type - "Profil|Elevation"
+ * @param {String}   options.method - GET|POST
+ *
+ * @example
+ *      var options = {
+ *           type : 'Profil', // Elevation
+ *           method : 'GET',  // par defaut
+ *           param : {
+ *               positions : [
+ *                   {lon:'1.11', lat:'1.11'},
+ *                   {lon:'1.10', lat:'1.10'},
+ *                   {lon:'1.12', lat:'1.12'}
+ *               ],
+ *               delimiter : ";",         // par defaut
+ *               indent    : true,        // par defaut
+ *               crs       : 'EPSG:4326', // par defaut
+ *               format    : 'json',      // par defaut (only to POST)
+ *               sampling  : 3 ,          // par defaut (only use by Profil)
+ *               zonly     : false        // par defaut (only use by Elevation)
+ *           }
+ *      };
+ *
+ *      var result;
+ *      try {
+ *          var obj = new AltiRequestREST (options);
+ *          if (! obj.processRequestString ()) {
+ *              throw new Error("Request empty !?")
+ *          }
+ *          result = obj.requestString;
+ *      } catch (e) {
+ *          // exceptions...
+ *      }
+ * @private
+ */
+function AltiRequestREST (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AltiRequestREST");
+    this.logger.trace("[Constructeur AltiRequestREST ()]");
+
+    if (!(this instanceof AltiRequestREST)) {
+        throw new TypeError("AltiRequestREST constructor cannot be called as a function.");
+    }
+
+    this.options = options || {};
+
+    // existance des options
+    if (!this.options) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "options"));
+    }
+
+    // type de requete : Altitude ou Profil
+    // (param. à determiner en fonction des parametres d'entrée)
+    if (!this.options.type) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "type (Elevation or Profil)"));
+    }
+
+    // construction du modele de requête
+    // (test du type d'objet candidat)
+    this.DataObject = null;
+    switch (this.options.type) {
+        case "Elevation":
+            this.DataObject = new _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_2__["default"](this.options.param);
+            break;
+        case "Profil":
+            this.DataObject = new _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_3__["default"](this.options.param);
+            break;
+        default:
+            throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_TYPE", "type (Elevation or Profil)"));
+    }
+
+    /**
+     * methode.
+     * Par defaut, "GET".
+     */
+    this.method = this.options.method || "GET";
+}
+
+AltiRequestREST.prototype = {
+
+    /**
+     * request
+     * @type {String}
+     */
+    requestString : null,
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : AltiRequestREST,
+
+    /**
+     * Template de la requête.
+     */
+    template : {
+        get : {
+            // FIXME on retire le param 'delimiter' : &delimiter='__DELIMITER__'
+            value : "lon=__LON__&lat=__LAT__&indent=__INDENT__&crs='__CRS__'",
+            input : {
+                point : "&zonly=__ZONLY__",
+                profil : "&sampling=__SAMPLING__"
+            }
+        },
+        post : {
+            // FIXME on retire le param 'delimiter' : delimiter='__DELIMITER__'\n\
+            value : "lon=__LON__\n" +
+                "lat=__LAT__\n" +
+                "indent=__INDENT__\n" +
+                "crs='__CRS__'\n",
+            input : {
+                point : "zonly=__ZONLY__",
+                profil : "sampling=__SAMPLING__"
+            }
+        }
+    },
+
+    /**
+     * Construction de la requête.
+     *
+     * @example
+     * // GET  out : lon=0.2367,2.1570&lat=48.0551,46.6077&delimiter=,&indent=true&zonly=true&crs='CRS:84'
+     * // POST out : Not yet supported method POST !
+     * @returns {String}
+     */
+    processRequestString : function () {
+        this.logger.trace("AltiRequestREST::processRequestString ()");
+
+        var template = "";
+        if (this.method === "POST") {
+            template = this.template.post.value;
+        } else if (this.method === "GET") {
+            template = this.template.get.value;
+        }
+
+        template = template.replace(/__LON__/g, this.DataObject.getLon());
+        template = template.replace(/__LAT__/g, this.DataObject.getLat());
+        // FIXME on retire le param 'delimiter'
+        // template = template.replace(/__DELIMITER__/g, this.DataObject.delimiter);
+        template = template.replace(/__INDENT__/g, this.DataObject.indent);
+        template = template.replace(/__CRS__/g, this.DataObject.crs);
+
+        // ajout +
+        template = template + this.__addDataInputs();
+        this.logger.trace("traduction tmpl", template);
+
+        // sauvegarde
+        this.requestString = template;
+
+        return this.requestString;
+    },
+
+    /**
+     * Ajout de parametres spécifiques (ex. zonly)
+     *
+     * @returns {String}
+     */
+    __addDataInputs : function () {
+        this.logger.trace("AltiRequestREST::addDataInput ()");
+
+        var myTemplate;
+        if (this.method === "POST") {
+            myTemplate = this.template.post;
+        } else if (this.method === "GET") {
+            myTemplate = this.template.get;
+        } else {
+            throw new Error("No other HTTP method supported by the service !");
+        }
+
+        var tmpl = null;
+        if (this.DataObject.CLASSNAME === "AltiElevationRequest") {
+            tmpl = myTemplate.input.point;
+            return tmpl.replace(/__ZONLY__/g, this.DataObject.zonly);
+        } else if (this.DataObject.CLASSNAME === "AltiProfilRequest") {
+            tmpl = myTemplate.input.profil;
+            return tmpl.replace(/__SAMPLING__/g, this.DataObject.sampling);
+        } else {
+            throw new Error("No other object supported than elevation or profil !?");
+        }
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AltiRequestREST);
+
+
+/***/ }),
+/* 60 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _AltiRequest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(61);
+
+
+
+
+/**
+ * @classdesc
+ *
+ * Classe de gestion des param. des requêtes de type POINT du service altimetrique.
+ *
+ * @constructor
+ * @alias Gp.Services.Alti.Request.AltiElevationRequest
+ * @param {Object} options - options
+ * @param {Boolean}  options.zonly - false|true
+ *
+ * @private
+ */
+function AltiElevationRequest (options) {
+    if (!(this instanceof AltiElevationRequest)) {
+        throw new TypeError("AltiElevationRequest constructor cannot be called as a function.");
+    }
+
+    /**
+     * Nom de la classe (heritage)
+     */
+    this.CLASSNAME = "AltiElevationRequest";
+
+    // appel du constructeur par heritage
+    _AltiRequest__WEBPACK_IMPORTED_MODULE_1__["default"].apply(this, arguments);
+
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur AltiElevationRequest ()]");
+
+    /**
+     * Z uniquement.
+     * true|false
+     */
+    this.zonly = this.options.zonly || false; // test des options héritées !
+}
+
+/**
+ * @lends module:AltiElevationRequest#
+ */
+
+AltiElevationRequest.prototype = Object.create(_AltiRequest__WEBPACK_IMPORTED_MODULE_1__["default"].prototype, {
+
+    /**
+     * Setter/getter pour "zonly"
+     */
+    zonly : {
+        /** getter */
+        get : function () {
+            return this._zonly;
+        },
+        /** setter */
+        set : function (z) {
+            this._zonly = z;
+        }
+    }
+
+});
+
+/**
+ * Constructeur (alias)
+ */
+AltiElevationRequest.prototype.constructor = AltiElevationRequest;
+
+/**
+ * Tableau de clefs/valeurs pour param.
+ *
+ * @returns {Array}
+ */
+AltiElevationRequest.prototype.getData = function () {
+    // par glop..., appel de AltiRequest::getData () !
+    var map = [];
+    map.push({
+        k : "lon",
+        v : this.getLon()
+    });
+    map.push({
+        k : "lat",
+        v : this.getLat()
+    });
+    // map.push({k : "delimiter", v : this.delimiter}); // FIXME on retire le param "delimiter"
+    map.push({
+        k : "indent",
+        v : this.indent
+    });
+    map.push({
+        k : "crs",
+        v : this.crs
+    });
+    map.push({
+        k : "zonly",
+        v : this.zonly
+    });
+    map.push({
+        k : "format",
+        v : this.format
+    });
+
+    return map;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AltiElevationRequest);
+
+
+/***/ }),
+/* 61 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+
+
+
+/**
+ * @classdesc
+ * Classe de gestion des param. des requêtes du service altimetrique.
+ *
+ * @constructor
+ * @alias Gp.Services.Alti.Request.AltiRequest
+ * @param {Object} options - options
+ * @param {Object}   options.positions - tableau de coordonnées lon/lat
+ * @param {String}   options.delimiter - "|"
+ * @param {Boolean}  options.indent - false|true
+ * @param {String}   options.crs - "CRS:84"
+ * @param {String}   options.format - "JSON|XML"
+ *
+ * @private
+ */
+function AltiRequest (options) {
+    if (!(this instanceof AltiRequest)) {
+        throw new TypeError("AltiRequest constructor cannot be called as a function.");
+    }
+
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur AltiRequest ()]");
+
+    /**
+     * Options en paramêtres du constructeur.
+     */
+    this.options = options || {};
+
+    /**
+     * Liste des coordonnées.
+     * @example
+     * var c = [{lon : "", lat : ""}, {lon : "", lat : ""}];
+     */
+    this.positions = this.options.positions || [];
+
+    /**
+     * Caractère de séparation.
+     * Par defaut, "|".
+     */
+    this.delimiter = this.options.delimiter || "|";
+
+    /**
+     * Indentation.
+     * true|false
+     */
+    this.indent = this.options.indent || false;
+
+    /**
+     * Projection.
+     * Par defaut, CRS:84.
+     */
+    this.crs = this.options.crs || "CRS:84";
+
+    /**
+     * format de sortie.
+     * Par defaut, "json".
+     */
+    this.format = this.options.format || "json";
+}
+
+/**
+ * CLASSNAME
+ */
+AltiRequest.CLASSNAME = "AltiRequest";
+
+AltiRequest.prototype = {
+
+    /**
+     * @lends module:AltiRequest#
+     */
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : AltiRequest,
+
+    /**
+     * Ajout d"une liste de coordonnées.
+     *
+     * @param {Object[]} lstPosition - liste de positions
+     * @example
+     * obj.setPositions ([{lon : "0.15", lat : "0.15"}, {lon : "1.15", lat : "1.15"}]);
+     */
+    setPositions : function (lstPosition) {
+        var positions = [];
+        for (var i = 0; i < lstPosition.length; i++) {
+            var o = lstPosition[i];
+            if (o.lon && o.lat) {
+                positions.push(o);
+            }
+        }
+
+        this.positions = positions;
+    },
+
+    /**
+     * Liste des coordonnées.
+     *
+     * @param {Int} pos - position
+     * @returns {positions}
+     * @example
+     * obj.getPositions ();  // [{lon : "", lat : ""}, {lon : "", lat : ""}]
+     * obj.getPositions (0); // [{lon : "", lat : ""}]
+     */
+    getPositions : function (pos) {
+        // FIXME test if not a number !?
+        if (!pos) {
+            return this.positions;
+        }
+
+        var index = this.positions.length - 1;
+        if (pos > index || pos < index) {
+            this.logger.warn("index out of range !");
+            return this.positions;
+        }
+
+        return this.positions[pos];
+    },
+
+    /**
+     * Ajout d"une liste de coordonnées.
+     *
+     * @param {Object[]} lstPosition - liste de positions
+     * @example
+     * obj.addPositions ([{lon : "0.15", lat : "0.15"}, {lon : "1.15", lat : "1.15"}]);
+     */
+    addPositions : function (lstPosition) {
+        for (var i = 0; i < lstPosition.length; i++) {
+            var o = lstPosition[i];
+            if (o.lon && o.lat) {
+                this.positions.push(lstPosition[i]);
+            }
+        }
+    },
+
+    /**
+     * Retourne la liste des longitudes avec un caractère de séparation.
+     *
+     * @returns {String} - une liste de longitudes
+     * @example
+     * // out : 0.2367|2.1570|43.789|...
+     */
+    getLon : function () {
+        var lstLon = [];
+        for (var i = 0; i < this.positions.length; i++) {
+            lstLon.push(this.positions[i].lon);
+        }
+        this.logger.trace(lstLon);
+        return lstLon.join(this.delimiter);
+    },
+
+    /**
+     * Retourne la liste des lattitudes avec un caractère de séparation.
+     *
+     * @returns {String} - une liste de lattitudes
+     * @example
+     * // out : 0.2367|2.1570|43.789|...
+     */
+    getLat : function () {
+        var lstLat = [];
+        for (var i = 0; i < this.positions.length; i++) {
+            lstLat.push(this.positions[i].lat);
+        }
+        this.logger.trace(lstLat);
+        return lstLat.join(this.delimiter);
+    }
+
+};
+
+/**
+ * Tableau de clefs/valeurs pour param.
+ *
+ * @returns {Object[]}
+ */
+AltiRequest.prototype.getData = function () {
+    var map = [];
+
+    map.push({
+        k : "lon",
+        v : this.getLon()
+    });
+    map.push({
+        k : "lat",
+        v : this.getLat()
+    });
+    map.push({
+        k : "delimiter",
+        v : this.delimiter
+    });
+    map.push({
+        k : "indent",
+        v : this.indent
+    });
+    map.push({
+        k : "crs",
+        v : this.crs
+    });
+    map.push({
+        k : "format",
+        v : this.format
+    });
+
+    return map;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AltiRequest);
+
+
+/***/ }),
+/* 62 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _AltiRequest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(61);
+
+
+
+
+/**
+ * @classdesc
+ * Classe de gestion des param. des requêtes de type PROFIL du service altimetrique.
+ *
+ * @constructor
+ * @alias Gp.Services.Alti.Request.AltiProfilRequest
+ * @param {Object}   options - options
+ * @param {String}   options.sampling - 3
+ *
+ * @private
+ */
+function AltiProfilRequest (options) {
+    if (!(this instanceof AltiProfilRequest)) {
+        throw new TypeError("AltiProfilRequest constructor cannot be called as a function.");
+    }
+
+    /**
+     * Nom de la classe (heritage)
+     */
+    this.CLASSNAME = "AltiProfilRequest";
+
+    // appel du constructeur par heritage
+    _AltiRequest__WEBPACK_IMPORTED_MODULE_1__["default"].apply(this, arguments);
+
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur AltiProfilRequest ()]");
+
+    /**
+     * Sampling
+     * Par defaut, 3
+     */
+    this.sampling = this.options.sampling || 3; // test des options héritées !
+}
+
+/**
+ * @lends module:AltiProfilRequest#
+ */
+
+AltiProfilRequest.prototype = Object.create(_AltiRequest__WEBPACK_IMPORTED_MODULE_1__["default"].prototype, {
+
+    /**
+     * Setter/getter pour "sampling"
+     */
+    sampling : {
+        /** getter */
+        get : function () {
+            return this._sampling;
+        },
+        /** setter */
+        set : function (value) {
+            this._sampling = value;
+        }
+    }
+});
+
+/**
+ * Constructeur (alias)
+ */
+AltiProfilRequest.prototype.constructor = AltiProfilRequest;
+
+/**
+ * Tableau de clefs/valeurs pour param.
+ *
+ * @returns {Object[]}
+ */
+AltiProfilRequest.prototype.getData = function () {
+    // par glop..., appel de AltiRequest::getData () !
+    var map = [];
+    map.push({
+        k : "lon",
+        v : this.getLon()
+    });
+    map.push({
+        k : "lat",
+        v : this.getLat()
+    });
+    // map.push({k : "delimiter", v : this.delimiter}); // FIXME on retire le param "delimiter"
+    map.push({
+        k : "indent",
+        v : this.indent
+    });
+    map.push({
+        k : "crs",
+        v : this.crs
+    });
+    map.push({
+        k : "sampling",
+        v : this.sampling
+    });
+    map.push({
+        k : "format",
+        v : this.format
+    });
+
+    return map;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AltiProfilRequest);
+
+
+/***/ }),
+/* 63 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _Formats_WPS__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(64);
+/* harmony import */ var _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(60);
+/* harmony import */ var _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(62);
+/**
+ * Classe d'interface des requêtes de type WPS sur le service altimetrique.
+ * (Factory)
+ *
+ * @module Gp.Services.Alti.Request.AltiRequestWPS
+ * @alias Gp.Services.Alti.Request.AltiRequestWPS
+ * @private
+ */
+
+
+
+
+
+
+var AltiRequestWPS = {
+
+    /**
+     * Interface unique de construction de la requête.
+     *
+     * @method build
+     * @param {Object} options - options
+     * @param {Object}   options.param.positions - tableau de coordonnées lon/lat
+     * @param {String}   options.param.delimiter - '|'
+     * @param {Boolean}  options.param.indent - false|true
+     * @param {String}   options.param.crs - 'CRS:84'
+     * @param {String}   options.param.sampling - 3
+     * @param {Boolean}  options.param.zonly - false|true
+     * @param {String}   options.param.format - "JSON|XML" (only to POST)
+     * @param {String}   options.wps.service - "WPS"
+     * @param {String}   options.wps.version - "1.0.0"
+     * @param {String}   options.wps.identifier - "gs:WPSElevation|gs:WPSLineElevation"
+     * @param {String}   options.wps.rawdataoutput - "result"
+     * @param {String}   options.wps.request - "Execute"
+     * @param {String}   options.type - "Profil|Elevation"
+     * @param {String}   options.method - GET|POST
+     * @example
+     *      var options = {
+     *           type : 'Profil', // Elevation
+     *           method : 'GET',  // par defaut
+     *           param : {
+     *               positions : [
+     *                   {lon:'1.11', lat:'1.11'},
+     *                   {lon:'1.10', lat:'1.10'},
+     *                   {lon:'1.12', lat:'1.12'}
+     *               ],
+     *               delimiter : ";",         // par defaut
+     *               indent    : true,        // par defaut
+     *               crs       : 'EPSG:4326', // par defaut
+     *               format    : 'json',      // par defaut (only to POST)
+     *               sampling  : 3 ,          // par defaut (only use by Profil)
+     *               zonly     : false,       // par defaut (only use by Elevation)
+     *           },
+     *           wps : {
+     *                 service : 'WPS',         // par defaut
+     *                 version : '1.0.0',       // par defaut
+     *                 identifier : 'gs:WPS',   // par defaut, Elevation = gs:WPSElevation, Profil = gs:WPSLineElevation
+     *                 rawdataoutput : 'result',// par defaut
+     *                 request : 'Execute'      // par defaut
+     *           }
+     *       };
+     */
+    build : function (options) {
+        // logger
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AltiRequestWPS");
+        logger.trace(["AltiRequestWPS::build()"]);
+
+        // existance des options
+        if (!options) {
+            throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "options"));
+        }
+
+        // type de requete : Altitude ou Profil
+        // (param. à determiner en fonction des parametres d'entrée)
+        if (!options.type) {
+            throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "type (Elevation or Profil)"));
+        }
+
+        // construction du modele de requête
+        // (test du type d'objet candidat)
+        var DataObject = null;
+        switch (options.type) {
+            case "Elevation":
+                // surcharge
+                options.wps.identifier = "gs:WPSElevation";
+                DataObject = new _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_3__["default"](options.param);
+                break;
+            case "Profil":
+                // surcharge
+                options.wps.identifier = "gs:WPSLineElevation";
+                DataObject = new _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_4__["default"](options.param);
+                break;
+            default:
+                throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_TYPE", "type (Elevation or Profil)"));
+        }
+
+        // construction de la requête WPS
+        var settings = {
+            data : DataObject,
+            method : options.method,
+            param : options.wps
+        };
+
+        var rqstWPS = new _Formats_WPS__WEBPACK_IMPORTED_MODULE_2__["default"](settings);
+
+        if (!rqstWPS.processRequestString()) {
+            throw new Error("Enable to process request !");
+        }
+
+        return rqstWPS.requestString;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AltiRequestWPS);
+
+
+/***/ }),
+/* 64 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+
+
+/**
+ * @classdesc
+ * Standard WPS
+ *
+ * @constructor
+ * @alias Gp.Formats.WPS
+ * @param {Object} options - options
+ * @param {Object}   options.data - objet
+ * @param {String}   options.method - POST|GET
+ * @param {String}   options.param.service - "WPS"
+ * @param {String}   options.param.version - "1.0.0"
+ * @param {String}   options.param.identifier - "gs:WPSElevation|gs:WPSLineElevation"
+ * @param {String}   options.param.rawdataoutput - "result"
+ * @param {String}   options.param.request - "Execute"
+ * @param {Function} options.onsuccess - function callback success (TODO)
+ * @param {Function} options.onerror   - function callback error   (TODO)
+ * @private
+ */
+function WPS (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur WPS()]");
+
+    if (!(this instanceof WPS)) {
+        throw new TypeError("WPS constructor cannot be called as a function.");
+    }
+
+    this.options = options || {};
+
+    /**
+     * Objet DATA
+     */
+    this.DataObject = this.options.data;
+
+    if (!this.DataObject) {
+        throw new TypeError("This data object is not defined !");
+    }
+
+    /**
+     * param service.
+     * Par defaut, "WPS".
+     */
+    this.paramservice = this.options.param.service || "WPS";
+
+    /**
+     * param version.
+     * Par defaut, "1.0.0".
+     */
+    this.paramversion = this.options.param.version || "1.0.0";
+
+    /**
+     * param identifier
+     * Par defaut, "gs:WPS"
+     */
+    this.paramidentifier = this.options.param.identifier || "gs:WPS";
+
+    /**
+     * param rawdataoutput
+     * Par defaut, "result".
+     */
+    this.paramrawdataoutput = this.options.param.rawdataoutput || "result";
+
+    /**
+     * param request
+     * Par defaut, "Execute".
+     */
+    this.paramrequest = this.options.param.request || "Execute";
+
+    /**
+     * methode.
+     * Par defaut, "GET".
+     */
+    this.method = this.options.method || "GET";
+}
+
+WPS.prototype = {
+
+    /**
+     * @lends module:WPS#
+     */
+
+    /**
+     * request
+     * @type {String}
+     */
+    requestString : null,
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : WPS,
+
+    /**
+     * Template de la requête.
+     */
+    template : {
+        get : {
+            value : "service=__SERVICE__" +
+                "&version=__VERSION__" +
+                "&rawdataoutput=__RAWDATAOUTPUT__" +
+                "&identifier=__IDENTIFIER__" +
+                "&request=__REQUEST__" +
+                "&datainputs=<!-- __DATAINPUTS__ -->",
+
+            input : "__KEY__=__DATA__"
+
+        },
+        post : {
+
+            value : "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
+                "<wps:__REQUEST__ version=\"__VERSION__\" service=\"__SERVICE__\" " +
+                "__NAMESPACE__ __SCHEMALOCATION__>" +
+                "<ows:Identifier>__IDENTIFIER__</ows:Identifier>" +
+                "<wps:DataInputs>" +
+                "<!-- __DATAINPUTS__ -->" +
+                "</wps:DataInputs>" +
+                "<wps:ResponseForm>" +
+                "<wps:RawDataOutput>" +
+                "<ows:Identifier>__RAWDATAOUTPUT__</ows:Identifier>" +
+                "</wps:RawDataOutput>" +
+                "</wps:ResponseForm>" +
+                "</wps:__REQUEST__>",
+
+            input : "<wps:Input>" +
+                "<ows:Identifier>__KEY__</ows:Identifier>" +
+                "<wps:Data>" +
+                "<wps:LiteralData>__DATA__</wps:LiteralData>" +
+                "</wps:Data>" +
+                "</wps:Input>"
+        }
+    },
+
+    /**
+     * Namespace par defaut de la requete POST.
+     *
+     * @returns {String} namespace
+     */
+    namespaceByDefault : function () {
+        var ns = [
+            "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"",
+            "xmlns=\"http://www.opengis.net/wps/1.0.0\"",
+            "xmlns:wfs=\"http://www.opengis.net/wfs\"",
+            "xmlns:wps=\"http://www.opengis.net/wps/1.0.0\"",
+            "xmlns:ows=\"http://www.opengis.net/ows/1.1\"",
+            "xmlns:gml=\"http://www.opengis.net/gml\"",
+            "xmlns:ogc=\"http://www.opengis.net/ogc\"",
+            "xmlns:wcs=\"http://www.opengis.net/wcs/1.1.1\"",
+            "xmlns:xlink=\"http://www.w3.org/1999/xlink\""
+        ];
+
+        return ns.join(" ");
+    },
+
+    /**
+     * Schemalocation par defaut.
+     *
+     * @returns {String} schemaLocation
+     */
+    schemaLocationByDefault : function () {
+        return "xsi:schemaLocation=\"http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd\"";
+    },
+
+    /**
+     * Construction de la requête.
+     *
+     * @example
+     * // GET  out :
+     * //  service=__SERVICE__
+     * //  &version=__VERSION__
+     * //  &rawdataoutput=__RAWDATAOUTPUT__
+     * //  &identifier=__IDENTIFIER__
+     * //  &request=__REQUEST__
+     * //  &datainputs="__DATAINPUTS__"
+     * //  avec __DATAINPUTS__ = __KEY__=__DATA__;...
+     *
+     * // POST out :
+     * //      <?xml version=\"1.0\" encoding=\"UTF-8\"?>
+     * //      <wps:__REQUEST__ version=\"__VERSION__\" service=\"__SERVICE__\"
+     * //         __NAMESPACE__ __SCHEMALOCATION__>
+     * //          <ows:Identifier>__IDENTIFIER__</ows:Identifier>
+     * //          <wps:DataInputs>
+     * //              <!-- __DATAINPUTS__ -->
+     * //          </wps:DataInputs>
+     * //          <wps:ResponseForm>
+     * //              <wps:RawDataOutput>
+     * //              <ows:Identifier>__RAWDATAOUTPUT__</ows:Identifier>
+     * //              </wps:RawDataOutput>
+     * //          </wps:ResponseForm>
+     * //      </wps:__REQUEST__>",
+     * //      avec __DATAINPUTS__
+     * //             <wps:Input>
+     * //                  <ows:Identifier>__KEY__</ows:Identifier>
+     * //                  <wps:Data>
+     * //                    <wps:LiteralData>__DATA__</wps:LiteralData>
+     * //                  </wps:Data>
+     * //              </wps:Input>
+     *
+     * @returns {Boolean} validation de la construction de la requete
+     */
+    processRequestString : function () {
+        this.logger.trace("WPS::processRequestString ()");
+
+        var template = "";
+        if (this.method === "POST") {
+            template = this.template.post.value;
+        } else if (this.method === "GET") {
+            template = this.template.get.value;
+        } else {
+            this.logger.error("No other method supported by the service !");
+            return false;
+        }
+
+        template = template.replace(/__SERVICE__/g, this.paramservice);
+        template = template.replace(/__VERSION__/g, this.paramversion);
+        template = template.replace(/__RAWDATAOUTPUT__/g, this.paramrawdataoutput);
+        template = template.replace(/__IDENTIFIER__/g, this.paramidentifier);
+        template = template.replace(/__REQUEST__/g, this.paramrequest);
+
+        // ajout +
+        if (this.method === "POST") {
+            template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault);
+            template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault);
+        }
+
+        // ajout des datainputs
+        template = template.replace(/<!-- __DATAINPUTS__ -->/g, this.__addDataInputs());
+
+        if (!template) {
+            this.logger.warn("traduction tmpl : empty request !?");
+            return false;
+        }
+
+        this.requestString = template;
+        this.logger.trace("traduction tmpl", template);
+
+        return true;
+    },
+
+    /**
+     * Ajout des données
+     *
+     * @returns {String} Données concaténées dans une chaine
+     */
+    __addDataInputs : function () {
+        this.logger.trace("WPS::__addDataInputs ()");
+
+        // c'est un peu grossier...
+        var tmpl = this.method === "GET" ? this.template.get.input : this.template.post.input;
+        var sep = this.method === "GET" ? ";" : "";
+
+        var result = "";
+        var that = this;
+        var map = this.DataObject.getData();
+        for (var i = 0; i < map.length; i++) {
+            // FIXME closure ?
+            (function (j) {
+                if (sep) {
+                    sep = (j === map.length - 1) ? "" : ";";
+                }
+                result = result.concat(that.__addDataInput(tmpl, map[j].k, map[j].v), sep);
+            })(i);
+        }
+
+        return result;
+    },
+
+    /**
+     * Ajout d'une donnée.
+     *
+     * @param {String} tmpl - template
+     * @param {String} key - clef
+     * @param {String} data - valeur
+     * @returns {String} chaine avec les substitutions clef/valeur
+     */
+    __addDataInput : function (tmpl, key, data) {
+        var tmp = tmpl;
+        tmp = tmp.replace(/__KEY__/g, key);
+        tmp = tmp.replace(/__DATA__/g, data);
+        return tmp;
+    },
+
+    /**
+     * Definir le mode de requête
+     *
+     * @param {String} method - GET|POST
+     */
+    setMethod : function (method) {
+        if (method === "GET" || method === "POST") {
+            this.method = method;
+        } else {
+            this.logger.warn("support only GET and POST method !");
+        }
+    },
+
+    /**
+     * Retourne le mode de requete (GET|POST).
+     *
+     * @returns {AltiRequest.options.mode|String} methode (GET|POST)
+     */
+    getMethod : function () {
+        return this.method;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (WPS);
+
+
+/***/ }),
+/* 65 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45);
+/* harmony import */ var _Formats_XML__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(66);
+/* harmony import */ var _Formats_AltiResponseReader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(67);
+/* harmony import */ var _model_AltiResponse__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(68);
+/* harmony import */ var _model_Elevation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(69);
+/**
+ * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON
+ * (Factory)
+ *
+ * @module AltiResponseFactory
+ * @private
+ * @alias Gp.Services.Alti.Response.AltiResponseFactory
+ */
+
+
+
+
+
+
+
+
+var AltiResponseFactory = {
+
+    /**
+     * interface unique
+     *
+     * @method build
+     * @static
+     * @param {Object} options - options definies dans le composant Alti
+     *
+     * @example
+     *   var options = {
+     *      response :
+     *      outputFormat :
+     *      rawResponse :
+     *      scope :
+     *      onSuccess :
+     *      onError :
+     *   };
+     *
+     */
+    build : function (options) {
+        // logger
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AltiResponseFactory");
+        logger.trace(["AltiResponseFactory::build()"]);
+
+        var data = null;
+
+        if (options.response) {
+            if (options.rawResponse) {
+                logger.trace("analyze response : raw");
+                data = options.response;
+            } else {
+                switch (options.outputFormat) {
+                    case "xml":
+                        logger.trace("analyze response : xml");
+
+                        try {
+                            var p = new _Formats_XML__WEBPACK_IMPORTED_MODULE_3__["default"]({
+                                reader : _Formats_AltiResponseReader__WEBPACK_IMPORTED_MODULE_4__["default"]
+                            });
+
+                            if (typeof options.response === "string") {
+                                p.setXMLString(options.response);
+                            } else {
+                                p.setXMLDoc(options.response);
+                            }
+
+                            data = p.parse();
+
+                            if (!data) {
+                                throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION_2"));
+                            }
+                        } catch (e) {
+                            var message = e.message;
+                            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                                message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", message),
+                                status : 200,
+                                type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR
+                            }));
+                            return;
+                        }
+
+                        break;
+
+                    case "json":
+                        logger.trace("analyze response : json");
+                        logger.trace("analyze response : ", typeof options.response);
+
+                        var JSONResponse;
+                        if (typeof options.response === "string") {
+                            JSONResponse = JSON.parse(options.response);
+                        } else {
+                            JSONResponse = options.response;
+                        }
+
+                        // le service renvoie t il une erreur ?
+                        if (JSONResponse.error) {
+                            // ex. {"error": {"code": "BAD_PARAMETER","description": "The values () cannot be parsed as a valid longitude (double value such as -180 < lat < 180)."}}
+                            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                                message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", JSONResponse.error.description),
+                                status : 200,
+                                type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR
+                            }));
+                            return;
+                        }
+
+                        // analyse de la reponse
+                        if (JSONResponse) {
+                            var elevations = JSONResponse.elevations;
+                            var altiResponse = new _model_AltiResponse__WEBPACK_IMPORTED_MODULE_5__["default"]();
+                            var elevation;
+                            if (Array.isArray(elevations) && elevations.length) {
+                                for (var i = 0; i < elevations.length; i++) {
+                                    elevation = new _model_Elevation__WEBPACK_IMPORTED_MODULE_6__["default"]();
+
+                                    if (typeof elevations[i] === "object") {
+                                        // elevations[i] est un objet elevation
+                                        if (elevations[i].lon) {
+                                            elevation.lon = elevations[i].lon;
+                                        }
+                                        if (elevations[i].lat) {
+                                            elevation.lat = elevations[i].lat;
+                                        }
+                                        if (elevations[i].z) {
+                                            elevation.z = elevations[i].z;
+                                        }
+                                        if (elevations[i].acc) {
+                                            elevation.acc = elevations[i].acc;
+                                        }
+                                    } else if (typeof elevations[i] === "number") {
+                                        // elevations[i] est un nombre, dans le cas de zonly=true notamment
+                                        elevation.z = elevations[i];
+                                    }
+
+                                    if (Array.isArray(altiResponse.elevations)) {
+                                        altiResponse.elevations.push(elevation);
+                                    }
+                                }
+                            }
+                            data = altiResponse;
+                        }
+
+                        if (!data) {
+                            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                                message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE_2"),
+                                type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_UNKERR,
+                                status : -1
+                            }));
+                            return;
+                        }
+                        break;
+
+                    default:
+                        options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                            message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_FORMAT_2"),
+                            type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_UNKERR,
+                            status : -1
+                        }));
+                        return;
+                }
+
+                // Si la réponse contenait une exception renvoyée par le service
+                if (data.exceptionReport) {
+                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                        message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport),
+                        type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR,
+                        status : 200
+                    }));
+                    return;
+                } else if (data.error) {
+                    var errorMess = data.error.description;
+                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                        message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", errorMess),
+                        type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR,
+                        status : 200
+                    }));
+                    return;
+                }
+            }
+        } else {
+            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY")));
+            return;
+        }
+
+        options.onSuccess.call(options.scope, data);
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AltiResponseFactory);
+
+
+/***/ }),
+/* 66 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* global require */
+
+
+// import __xmldom from "xmldom";
+
+/**
+ * @classdesc
+ *
+ * Classe permettant d'écrire ou de lire du XML, sous forme de document DOM,
+ * éventuellement selon des clés de lecture (readers) ou d'écriture (writers) spécifiques.
+ *
+ * @constructor
+ * @alias Gp.Formats.XML
+ *
+ * @param {Object} [options] - options du format XML
+ *
+ * @param {Object} [options.reader] - Instance d'un Reader de service (AltiResponseReader, GeocodeRequestReader, etc.)
+ *      utile pour interpréter le XML lorsque sa structure est connue.
+ *      Ce reader doit comporter au moins une fonction statique read (root) permettant d'initialiser la lecture.
+ *
+ * @param {Object} [options.writers] - writers
+ *
+ * @param {String} [options.xmlString] - chaîne de caractère contenant du XML à interpréter.
+ *
+ * @private
+ */
+function XML (options) {
+    if (!(this instanceof XML)) {
+        throw new TypeError("XML constructor cannot be called as a function.");
+    }
+
+    // FIXME : notion de singleton
+
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur XML ()]");
+
+    /**
+     * Chaîne de caractères contenant le texte XML
+     * @type {String}
+     */
+    this.xmlString = null;
+
+    /**
+     * DOM Element correspondant à la structure du XML.
+     * @type {DOMElement}
+     */
+    this.xmlDoc = null;
+
+    /**
+     * Objet contenant des fonctions de lecture des différentes balises XML.
+     * @type {Object}
+     */
+    this.reader = null;
+
+    // traitement des paramètres d'options s'il y en a
+    if (options) {
+        if (options.xmlString && typeof options.xmlString === "string") {
+            this.xmlString = options.xmlString;
+            // Si une chaine de caractère a été passée en entrée : on la transforme aussi en XML document
+            this.xmlDoc = __getXMLDOC(options.xmlString);
+        }
+        if (options.reader) {
+            this.setReader(options.reader);
+        }
+    }
+}
+
+XML.prototype = {
+
+    /**
+     * @lends module:XML
+     */
+
+    /*
+     * Constructeur (alias)
+     */
+    constructor : XML,
+
+    /**
+     * Méthode permettant de récupérer la chaîne de caractères associée au format XML
+     *
+     * @returns {String} xmlString - la chaîne de caractères correspondant au format XML
+     */
+    getXMLString : function () {
+        return this.xmlString;
+    },
+
+    /**
+     * Méthode permettant d'attribuer une chaîne de caractères au format XML (attribut xmlString).
+     * La méthode va aussi transformer cette chaîne de caractères en document XML,
+     * afin de remplir l'attribut xmlDoc.
+     *
+     * @param {String} xmlString - la chaîne de caractères correspondant au format XML
+     */
+    setXMLString : function (xmlString) {
+        if (xmlString && typeof xmlString === "string") {
+            this.xmlString = xmlString;
+            this.xmlDoc = __getXMLDOC(xmlString);
+        }
+    },
+
+    /**
+     * Méthode permettant de récupérer les readers associés au format XML, s'ils ont été définis
+     *
+     * @return {Object} readers - les readers associés au format XML, s'ils existent,
+     *      sous forme d'une collection de fonctions
+     */
+    getReader : function () {
+        return this.reader;
+    },
+
+    /**
+     * Méthode permettant d'attribuer des readers, sous la forme d'un objet de fonctions (node, data),
+     *      lorsqu'ils n'ont pas été définis lors de l'instanciation par exemple (new XML (options)).
+     *
+     * @param {Object} reader - Instance d'un Reader de service (AltiResponseReader, GeocodeRequestReader, etc.)
+     *      utile pour interpréter le XML lorsque sa structure est connue.
+     *      Ce reader doit comporter au moins une fonction statique read (root) permettant d'initialiser la lecture.
+     */
+    setReader : function (reader) {
+        if (reader && reader.read && typeof reader.read === "function") {
+            this.reader = reader;
+        }
+    },
+
+    /**
+     * Méthode permettant de récupérer le document XML associé au format, s'il existe.
+     *
+     * @return {DOMElement} xmlDoc - le document XML (DOM document node) s'il existe
+     */
+    getXMLDoc : function () {
+        return this.xmlDoc;
+    },
+
+    /**
+     * Setter
+     */
+    setXMLDoc : function (doc) {
+        this.xmlDoc = doc;
+    },
+    /**
+     * Méthode initialisant la lecture du XML, à partir d'un XML Document :
+     *      création d'un objet JavaScript contenant les informations du XML,
+     *      sauf dans le cas où il n'existe pas de XML Document à interpréter (retourne un objet vide).
+     *
+     * @return {Object} [parserOutput] - un objet JavaScript contenant les informations du XML :
+     * - soit toutes les informations si aucun reader n'a été spécifié à la création du format
+     * - soit les informations spécifiées dans le reader.
+     */
+    parse : function () {
+        // build xml document from xmlString
+        if (!this.xmlDoc && this.xmlString) {
+            this.xmlDoc = __getXMLDOC(this.xmlString);
+        }
+        if (this.xmlDoc) {
+            var root = __getRootNode(this.xmlDoc);
+            if (root) {
+                var parserOutput;
+                // call reader if exists
+                if (this.reader && this.reader.read) {
+                    parserOutput = this.reader.read(root);
+                } else {
+                    parserOutput = {};
+                    parserOutput[root.nodeName] = __readDefault(root);
+                }
+                return parserOutput;
+            } else {
+                return {};
+            }
+        }
+    }
+
+};
+
+/**
+ * Méthode de la classe (privée) permettant de créer un XML Document à partir d'une chaîne de caractères XML,
+ *      en utilisant DOMParser () lorsque c'est possible.
+ *      For more information, see: https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#the-domparser-interface
+ *
+ * @private
+ * @memberof XML
+ * @method __getXMLDOC
+ * @param {String} xmlString - xml string to be converted into DOM element
+ * @return {DOMElement} - the corresponding XML Document
+ */
+function __getXMLDOC (xmlString) {
+    if (typeof window === "undefined") {
+        // env. nodejs
+        var DOMParser = __webpack_require__(54).DOMParser; // __xmldom.DOMParser;
+        return new DOMParser().parseFromString(xmlString, "text/xml");
+    } else {
+        // env. browser
+
+        var parser;
+        var xmlDoc;
+        var errorMsg = "Erreur lors du parsing de la réponse du service : XML non conforme";
+
+        if (window.ActiveXObject) {
+            // Internet Explorer < 9
+            xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
+            xmlDoc.async = false;
+            xmlDoc.loadXML(xmlString);
+            var parseError = xmlDoc.parseError;
+            if (parseError.errorCode) {
+                if (parseError.line && parseError.linepos) {
+                    errorMsg += "( ligne " + parseError.line + ", colonne " + parseError.linepos;
+                }
+                if (parseError.reason) {
+                    errorMsg += ":  " + parseError.reason + ")";
+                }
+                throw new Error(errorMsg);
+            }
+            return xmlDoc;
+        } else if (window.DOMParser) {
+            // les autres (Chrome, Mozilla, IE >= 9)
+            parser = new window.DOMParser();
+            try {
+                xmlDoc = parser.parseFromString(xmlString, "text/xml");
+            } catch (e) {
+                // Internet Explorer browser raises exception if xmlString is not valid XML
+                if (e.message === "SyntaxError") {
+                    throw new Error(errorMsg);
+                } else {
+                    throw new Error("Erreur lors du parsing de la réponse du service : " + e.message);
+                }
+            }
+            // look for parsing error in case no exception was raised
+            if (xmlDoc.getElementsByTagName("parsererror").length > 0) {
+                var parsererror = xmlDoc.getElementsByTagName("parsererror");
+                for (var i = 0; i < parsererror.length; i++) {
+                    var content = parsererror[i].innerHTML;
+                    // except in case parsererror is just because of huge xml, but parsing is done.
+                    if (content.indexOf("Huge input lookup") === -1) {
+                        errorMsg += "(" + content + ")";
+                        throw new Error(errorMsg);
+                    }
+                }
+            } else if (!xmlDoc.documentElement) { // may happen in chrome browser
+                throw new Error(errorMsg);
+            }
+            return xmlDoc;
+        } else {
+            // FIXME
+            throw new Error("Incompatible DOM Parser pour ce navigateur !");
+        }
+    }
+}
+
+/**
+ * Méthode de la classe (privée) permettant de récupérer le noeud racine du document,
+ *      à partir d'un document node (nodeType=9), puis lecture de ce noeud (readNode)
+ *
+ * @private
+ * @memberof XML
+ * @method __getRootNode
+ * @param {DOMElement} [xmlDoc] - a Document Node
+ * @return {DOMElement} root - the document root node
+ */
+function __getRootNode (xmlDoc) {
+    var root;
+    if (xmlDoc.nodeType === 9) {
+        // INFO : nodeType 9 represents the entire document (the root-node of the DOM tree)
+        root = xmlDoc.documentElement;
+    } else if (xmlDoc.nodeType === 1) {
+        root = xmlDoc;
+    }
+    return root;
+}
+
+/**
+ * Méthode de la classe (privée) permettant de lire automatiquement un noeud XML,
+ *      lorsqu'aucun reader spécifique n'a été spécifié (parser brut)
+ *
+ * @private
+ * @memberof XML
+ * @method readDefault
+ * @param {DOMElement} node - a DOM element node
+ * @example final data object looks like :
+ *          data = {
+ *              attributeName: attributeValue,
+ *              childName: {
+ *                  attributeName: attributeValue,
+ *                  attributeName: attributeValue,
+ *                  childName: {
+ *                      "textContent": textContent
+ *                  },
+ *                  childName: {
+ *                      childName: {
+ *                          attributeName:attributeValue
+ *                      }
+ *                  }
+ *              }
+ *          }
+ */
+function __readDefault (node) {
+    var data = {};
+
+    // if element node has attributes, set their values to data
+    if (node.attributes.length > 0) {
+        var dataAttributes = __getAttributes(node);
+        data["attributes"] = dataAttributes;
+    }
+
+    // if element node has childNodes, read them and set them to data
+    if (node.hasChildNodes()) {
+        var childData = {};
+        var child;
+        var children = node.childNodes;
+
+        for (var i = 0; i < children.length; i++) {
+            child = children[i];
+
+            if (child.nodeType === 3) { // TEXT_NODE
+                data["textContent"] = child.nodeValue;
+            } else if (child.nodeType === 1) {
+                childData = __readDefault(child);
+
+                if (!data[child.nodeName]) {
+                    // store childData in an object
+                    data[child.nodeName] = childData;
+                } else {
+                    // in case several childNodes has the same name : store them in an array.
+                    // if data[nodeName] already exists but is not an array
+                    if (!Array.isArray(data[child.nodeName])) {
+                        var old = data[child.nodeName];
+                        data[child.nodeName] = [];
+                        data[child.nodeName].push(old);
+                    }
+                    data[child.nodeName].push(childData);
+                }
+            }
+            // TODO : manage other node types (4=CDATA, etc)
+        }
+    }
+
+    return data;
+}
+
+/**
+ * Méthode de la classe (privée) permettant de récupérer les attributs d'un noeud élément
+ *
+ * @private
+ * @memberof XML
+ * @method __getAttributes
+ * @param {DOMElement} node - noeud contenant l'attribut recherché
+ * @return {Object} nodeAttributes - objet contenant les noms et valeurs des différents attributs
+ */
+function __getAttributes (node) {
+    if (node.attributes.length > 0) {
+        var nodeAttributes = {};
+        var attributes = node.attributes;
+        for (var i = 0; i < attributes.length; i++) {
+            var attribute = attributes[i];
+            nodeAttributes[attribute.nodeName] = attribute.nodeValue;
+        }
+        return nodeAttributes;
+    }
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (XML);
+
+
+/***/ }),
+/* 67 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);
+/* harmony import */ var _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69);
+
+/**
+ * Fonction retournant un objet contenant des clés de lecture (readers)
+ *      qui permettent de parser des réponses XML du service Altimétrique du Géoportail
+ *      (calcul altimétrique simple ou profil altimétrique d'une courbe),
+ *      lorsque le paramètre output = xml,
+ *      afin de récupérer les élévations retournées.
+ *
+ * @module AltiResponseReader
+ * @alias Gp.Services.Alti.Formats.AltiResponseReader
+ * @private
+ */
+
+// import Logger from "../../../Utils/LoggerByDefault";
+
+
+
+/**
+ *
+ * Objet AltiResponseReader
+ *
+ * @member {Object} AltiResponseReader
+ *
+ * @property {Object} AltiResponseReader.READERS - Objet contenant des fonctions de lecture, appelées "readers"
+ *      dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire
+ *      et la valeur associée est une fonction (node, data)
+ *      où node est un noeud du document DOM
+ *      et data est un objet où l'on stocke les informations lues dans le XML.
+ *
+ * @property {Method} AltiResponseReader.READERS.elevations -  Lecture d'un noeud "elevations" de la réponse XML
+ *      du service alti, correspondant logiquement à la racine du document
+ *      (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée)
+ *
+ * @property {Method} AltiResponseReader.READERS.elevation - ecture d'un noeud "elevation" de la réponse xml du service alti.
+ *      (contient un ou 4 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, et acc)
+ *
+ * @property {Method} AltiResponseReader.READERS.lat - Lecture d'un noeud "lat" de la réponse xml du service alti.
+ *      (contient une valeur de latitude, qui est un flottant)
+ *
+ * @property {Method} AltiResponseReader.READERS.lon - Lecture d'un noeud "lon" de la réponse xml du service alti.
+ *      (contient une valeur de longitude, qui est un flottant)
+ *
+ * @property {Method} AltiResponseReader.READERS.z - Lecture d'un noeud "z" de la réponse xml du service alti.
+ *      (contient une valeur d'altitude, qui est un flottant)
+ *
+ * @property {Method} AltiResponseReader.READERS.acc - Lecture d'un noeud "acc" de la réponse xml du service alti.
+ *      (contient une valeur de précision, qui est un flottant)
+ *
+ * @property {Method} AltiResponseReader.READERS.exceptionreport - Lecture d'un noeud "ExceptionReport" de la réponse xml du service alti.
+ *
+ * @property {Method} AltiResponseReader.READERS.exception - Lecture d'un noeud "Exception" de la réponse xml du service alti.
+ *
+ * @property {Method} AltiResponseReader.read - Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique,
+ *      à l'aide des readers de la classe.
+ *
+ */
+var AltiResponseReader = {};
+
+AltiResponseReader.READERS = {
+
+    /**
+     * Lecture d'un noeud "elevations" de la réponse XML du service alti, correspondant logiquement à la racine du document
+     *      (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée)
+     *
+     * @param {DOMElement} root - racine de la réponse XML
+     * @static
+     * @memberof AltiResponseReader
+     * @returns {Object} Retourne un objet de type AltiResponse
+     */
+    elevations : function (root) {
+        // INFO : on passe en paramètre l'objet en entrée elevations, vide, à remplir.
+        var altiResponse = new _Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_0__["default"]();
+
+        if (root.hasChildNodes()) {
+            var children = root.childNodes;
+            var child;
+            var elevation;
+
+            for (var i = 0; i < children.length; i++) {
+                child = children[i];
+
+                if (AltiResponseReader.READERS[child.nodeName]) {
+                    elevation = AltiResponseReader.READERS[child.nodeName](child);
+                    altiResponse.elevations.push(elevation);
+                }
+            }
+        }
+
+        return altiResponse;
+    },
+
+    /**
+     * Lecture d'un noeud "elevation" de la réponse xml du service alti.
+     *      (contient un ou 4 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, et acc)
+     *
+     * @param {DOMElement} node - noeud elevation à lire pour récupérer les informations de l'élévation retournée (z [, lon, lat, acc])
+     * @return {Array} elevationResponse - format de la réponse en sortie, instance de AltiResponse
+     * @static
+     * @memberof AltiResponseReader
+     */
+    elevation : function (node) {
+        var elevation = new _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__["default"]();
+
+        if (node.hasChildNodes()) {
+            var children = node.childNodes;
+            var child;
+            for (var i = 0; i < children.length; i++) {
+                child = children[i];
+                if (AltiResponseReader.READERS[child.nodeName]) {
+                    // INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir.
+                    AltiResponseReader.READERS[child.nodeName](child, elevation);
+                }
+            }
+        }
+        return elevation;
+    },
+
+    /**
+     * Lecture d'un noeud "lat" de la réponse xml du service alti.
+     *      (contient une valeur de latitude, qui est un flottant)
+     *
+     * @param {DOMElement} node - noeud à lire pour récupérer la latitude
+     * @param {Object} elevation - objet dans lequel stocker la latitude retournée
+     * @static
+     * @memberof AltiResponseReader
+     */
+    lat : function (node, elevation) {
+        var textNode = node.firstChild;
+        if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+            elevation.lat = parseFloat(textNode.nodeValue);
+        } else {
+            throw new Error("Erreur dans la lecture de la réponse du service : latitude attendue mais absente");
+        }
+    },
+
+    /**
+     * Lecture d'un noeud "lon" de la réponse xml du service alti.
+     *      (contient une valeur de longitude, qui est un flottant)
+     *
+     * @param {DOMElement} node - noeud à lire pour récupérer la longitude
+     * @param {Object} elevation - objet dans lequel stocker la longitude retournée
+     * @static
+     * @memberof AltiResponseReader
+     */
+    lon : function (node, elevation) {
+        var textNode = node.firstChild;
+        if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+            elevation.lon = parseFloat(textNode.nodeValue);
+        } else {
+            throw new Error("Erreur dans la lecture de la réponse du service : longitude attendue mais absente");
+        }
+    },
+
+    /**
+     * Lecture d'un noeud "z" de la réponse xml du service alti.
+     *      (contient une valeur d'altitude, qui est un flottant)
+     *
+     * @param {DOMElement} node - noeud à lire pour récupérer l'altitude
+     * @param {Object} elevation - objet dans lequel stocker l'altitude retournée
+     * @static
+     * @memberof AltiResponseReader
+     */
+    z : function (node, elevation) {
+        var textNode = node.firstChild;
+        if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+            if (elevation) {
+                elevation.z = parseFloat(textNode.nodeValue);
+            } else {
+                elevation = new _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__["default"]();
+                elevation.z = parseFloat(textNode.nodeValue);
+                return elevation;
+            }
+        } else {
+            throw new Error("Erreur dans la lecture de la réponse du service : altitude attendue mais absente");
+        }
+    },
+
+    /**
+     * Lecture d'un noeud "acc" de la réponse xml du service alti.
+     *      (contient une valeur de précision, qui est un flottant)
+     *
+     * @param {DOMElement} node - noeud à lire pour récupérer la précision
+     * @param {Object} elevation - objet dans lequel stocker la précision retournée
+     * @static
+     * @memberof AltiResponseReader
+     */
+    acc : function (node, elevation) {
+        var textNode = node.firstChild;
+        if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+            elevation.acc = parseFloat(textNode.nodeValue);
+        } else {
+            throw new Error("Erreur dans la lecture de la réponse du service : précision (acc) attendue mais absente");
+        }
+    },
+
+    /**
+     * Lecture d'un noeud "ExceptionReport" de la réponse xml du service alti.
+     *
+     * @param {DOMElement} node - noeud à lire pour récupérer l'exception
+     * @return {Object} exceptionReport - objet contenant l'exception
+     * @static
+     * @memberof AltiResponseReader
+     */
+    exceptionreport : function (node) {
+        var response = {};
+
+        if (node.hasChildNodes()) {
+            var children = node.childNodes;
+            var child;
+            for (var i = 0; i < children.length; i++) {
+                child = children[i];
+                if (child.nodeName === "Exception") {
+                    response.exceptionReport = AltiResponseReader.READERS.exception(child);
+                }
+            }
+        }
+
+        return response;
+    },
+
+    /**
+     * Lecture d'un noeud "Exception" de la réponse xml du service alti.
+     *
+     * @param {DOMElement} node - noeud à lire pour récupérer l'exception
+     * @return {Object} exceptionReport - objet contenant l'exception, avec deux attributs :
+     *      {String} exceptionReport.exceptionCode - qui contient l'identifiant du code de l'exception
+     *      {String} exceptionReport.exception - qui contient le message de l'exception
+     * @static
+     * @memberof AltiResponseReader
+     */
+    exception : function (node) {
+        var exceptionReport = {};
+
+        // get exception code
+        var exceptionCode = node.getAttribute("exceptionCode");
+        if (exceptionCode) {
+            exceptionReport.exceptionCode = exceptionCode;
+        }
+
+        // get exception message
+        var textNode = node.firstChild;
+        if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+            exceptionReport.exception = textNode.nodeValue;
+        }
+
+        return exceptionReport;
+    },
+
+    /**
+     * Lecture d'un noeud "Error" de la réponse xml du service alti.
+     *
+     * @param {DOMElement} node - noeud à lire pour récupérer l'exception
+     * @return {Object} error - objet contenant l'exception
+     * @static
+     */
+    error : function (node) {
+        var response = {
+            error : {}
+        };
+        // get error code and description
+        if (node.hasChildNodes()) {
+            var children = node.childNodes;
+            var child;
+            for (var i = 0; i < children.length; i++) {
+                child = children[i];
+                var textNode;
+                // get error code
+                if (child.nodeType === 1 && child.nodeName === "code") { // 1 === node.ELEMENT_NODE
+                    textNode = child.firstChild;
+                    if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+                        response.error.code = textNode.nodeValue;
+                    }
+                }
+                // get error description
+                if (child.nodeType === 1 && child.nodeName === "description") { // 1 === node.ELEMENT_NODE
+                    textNode = child.firstChild;
+                    if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+                        response.error.description = textNode.nodeValue;
+                    }
+                }
+            }
+        }
+        return response;
+    }
+
+};
+
+/**
+ * Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique,
+ *      à l'aide des readers de la classe.
+ *
+ * @method AltiResponseReader.read
+ * @param {DOMElement} root - racine de la réponse XML à lire
+ * @static
+ * @memberof AltiResponseReader
+ */
+AltiResponseReader.read = function (root) {
+    if (root.nodeName === "elevations") {
+        var altiResponse = AltiResponseReader.READERS.elevations(root);
+        return altiResponse;
+    } else if (root.nodeName === "ExceptionReport") {
+        var exceptionReport = AltiResponseReader.READERS.exceptionreport(root);
+        return exceptionReport;
+    } else if (root.nodeName === "error") {
+        var error = AltiResponseReader.READERS.error(root);
+        return error;
+    } else {
+        throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.");
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AltiResponseReader);
+
+
+/***/ }),
+/* 68 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/**
+ * Response object for {@link module:Services~getAltitude Gp.Services.getAltitude ()} invocation when successful. Received as the argument of onSuccess callback function.
+ *
+ * @property {Array.<Gp.Services.Alti.Elevation>} elevations - Elevations array.
+ *
+ * @namespace
+ * @alias Gp.Services.AltiResponse
+ */
+function AltiResponse () {
+    if (!(this instanceof AltiResponse)) {
+        throw new TypeError("AltiResponse constructor cannot be called as a function.");
+    }
+
+    this.elevations = [];
+}
+
+AltiResponse.prototype = {
+
+    constructor : AltiResponse
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AltiResponse);
+
+
+/***/ }),
+/* 69 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Single elevation object returned by underlying web service. Contains at least, one elevation (z). May also contain point coordinates and elevation accuracy if "zonly" parameter wasn't set to true.
+ *
+ * @property {Float} lat - Point latitude. (only if zonly=false)
+ * @property {Float} lon - Point longitude. (only if zonly=false)
+ * @property {Float} z - Point elevation.
+ * @property {Float} acc - Accuracy of elevation for this point. (only if zonly=false)
+ *
+ * @namespace
+ * @alias Gp.Services.Alti.Elevation
+ */
+function Elevation () {
+    if (!(this instanceof Elevation)) {
+        throw new TypeError("Elevation constructor cannot be called as a function.");
+    }
+
+    this.z = null;
+}
+
+Elevation.prototype = {
+
+    constructor : Elevation
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Elevation);
+
+
+/***/ }),
+/* 70 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(47);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(45);
+/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(56);
+/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(46);
+/* harmony import */ var _Response_AutoConfResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(71);
+
+
+
+
+
+
+
+
+
+/**
+ * @classdesc
+ * Appel du service d'autoconfiguration du Géoportail
+ *
+ * @private
+ * @constructor
+ * @extends {Gp.Services.CommonService}
+ * @alias Gp.Services.AutoConf
+ *
+ * @param {Object} options - options spécifiques au service (+ les options heritées)
+ *
+ * @param {String} [options.layerId] - Le nom de l'agrégat (couche) dont on veut connaître les informations détaillées.
+ *      La présence de cette propriété implique l'utilisation de la deuxième opération du service pour accéder aux informations d'une couche aggrégée.
+ *      Dans ce cas, la fonction effectuera quand même dans un premier temps la récupération des informations de l'auto-
+ *      configuration complète, sauf si un premier appel à l'autoconf a déjà été fait avec cette clé (i.e. si la variable globale est définie
+ *      pour la clé de contrat). Elle ira ensuite chercher les informations des couches agrégées, qui seront ajoutées à la variable globale Gp.Config.
+ *
+ * @example
+ *   var options = {
+ *      // options communes aux services
+ *      apiKey : "apikey",
+ *      protocol : 'JSONP', // JSONP|XHR
+ *      timeOut : 10000, // ms
+ *      rawResponse : false, // true|false
+ *      scope : null, // this
+ *      onSuccess : function (response) {},
+ *      onFailure : function (error) {},
+ *      layerId : "ORTHOIMAGERY.ORTHOPHOTOS.3D$GEOPORTAIL:OGC:WMTS@aggregate"
+ *   };
+ */
+function AutoConf (options) {
+    if (!(this instanceof AutoConf)) {
+        throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "AutoConf"));
+    }
+
+    /**
+     * Nom de la classe (heritage)
+     * FIXME instance ou classe ?
+     */
+    this.CLASSNAME = "AutoConf";
+
+    // Autoconf default protocol remains JSONP (#see http://ignf.github.io/geoportal-access-lib/latest/jsdoc/tutorial-optimize-getconfig.html)
+    if (!options) {
+        options = {};
+    }
+    options.protocol = options.protocol || "JSONP";
+
+    // appel du constructeur par heritage
+    _CommonService__WEBPACK_IMPORTED_MODULE_5__["default"].apply(this, arguments);
+
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.AutoConf");
+    this.logger.trace("[Constructeur AutoConf (options)]");
+
+    // #####################
+    // analyse des options
+    // #####################
+
+    // gestion de l'url du service par defaut
+    if (!this.options.serverUrl) {
+        // si l'url n'est pas renseignée, il faut utiliser les urls par defaut
+        // en fonction du nombre de clés en entrée et du paramètre layerId
+        if (!this.options.serverUrl) {
+            var lstUrlByDefault = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].AutoConf.url(this.options.apiKey);
+
+            if (!this.options.layerId) {
+                // cas d'une autoconf simple
+                if (Array.isArray(this.options.apiKey) && this.options.apiKey.length > 0) {
+                    // cas d'un tableau de clés en entrée
+                    this.options.serverUrl = lstUrlByDefault.apiKeys;
+                } else {
+                    this.options.serverUrl = lstUrlByDefault.apiKey;
+                }
+            } else {
+                // cas d'une autoconf pour des couches aggrégées
+                this.options.serverUrl = lstUrlByDefault.aggregate + this.options.layerId;
+            }
+        }
+    }
+
+    // INFO
+    // le service ne repond pas en mode POST (405 Method Not Allowed)
+    if (this.options.protocol === "XHR" && this.options.httpMethod === "POST") {
+        this.logger.warn("Le service ne gére pas le mode d'interrogation en POST, on bascule sur du GET !");
+        this.options.httpMethod = "GET"; // on surcharge !
+    }
+
+    // #####################
+    // attributs d'instances
+    // #####################
+
+    /**
+     * Format forcé de la réponse du service : "xml"
+     * sauf si l'on souhaite une reponse brute (options.rawResponse)
+     */
+    this.options.outputFormat = (this.options.rawResponse) ? "" : "xml";
+}
+
+/**
+ * @lends module:AutoConf#
+ */
+
+AutoConf.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_5__["default"].prototype, {
+    // todo
+    // getter/setter
+});
+
+/*
+ * Constructeur (alias)
+ */
+AutoConf.prototype.constructor = AutoConf;
+
+/**
+ * Création de la requête (overwrite)
+ *
+ * @param {Function} error   - callback des erreurs
+ * @param {Function} success - callback de succès de la création de la requête
+ */
+AutoConf.prototype.buildRequest = function (error, success) {
+    var scope = typeof window !== "undefined" ? window : {};
+
+    if (scope.Gp && scope.Gp.Config && scope.Gp.Config.generalOptions && scope.Gp.Config.layers) {
+        if (scope.Gp.Config.generalOptions.apiKeys[this.options.apiKey]) {
+            if (this.options.layerId) { // cas d'une autoconf + détaillée sur une couche agrégée
+                if (scope.Gp.Config.layers[this.options.layerId] && scope.Gp.Config.layers[this.options.layerId].aggregatedLayers) {
+                    this.logger.warn("Gp.Config existe déjà pour cette clé et cette couche");
+                    this.options.onSuccess.call(this, scope.Gp.Config);
+                    return;
+                }
+            } else {
+                this.logger.warn("Gp.Config existe déjà pour cette clé");
+                this.options.onSuccess.call(this, scope.Gp.Config);
+                return;
+            }
+        }
+    }
+
+    // requete par defaut
+    this.request = "";
+
+    // gestion de l'autoconf local
+    // Le fichier en local doit respecter le format de sortie du service.
+    //  - En XHR, le format est en xml
+    //  - En JSONP, le format est en xml encapsulé dans un json avec une fonction de callback
+    //    ex. callback ({"http":{"status":200,"error":null},"xml":"..."})
+    var bLocal;
+    if (this.options.serverUrl.indexOf("http://") === -1) {
+        bLocal = true;
+    } else {
+        bLocal = false;
+    }
+
+    // FIXME param. KVP optionnel sur un service uniquement (pas sur un autoconf local !)
+    if (!bLocal && this.layerId) {
+        this.request = _Utils_Helper__WEBPACK_IMPORTED_MODULE_2__["default"].normalyzeParameters({
+            layerId : this.layerId
+        });
+    }
+
+    // normalement pas d'erreur d'autoconf...
+    (this.request || this.request === "")
+        ? success.call(this, this.request)
+        : error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_3__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_REQUEST_BUILD")));
+};
+
+/**
+ * Analyse de la reponse (overwrite)
+ *
+ * @param {Function} error   - callback des erreurs
+ * @param {Function} success - callback de succès de l'analyse de la réponse
+ */
+AutoConf.prototype.analyzeResponse = function (error, success) {
+    if (this.response) {
+        var options = {
+            layerId : this.options.layerId,
+            response : this.response,
+            rawResponse : this.options.rawResponse,
+            onSuccess : success,
+            onError : error,
+            scope : this
+        };
+
+        _Response_AutoConfResponseFactory__WEBPACK_IMPORTED_MODULE_6__["default"].build(options);
+    } else {
+        error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_3__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY")));
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AutoConf);
+
+
+/***/ }),
+/* 71 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45);
+/* harmony import */ var _Formats_XML__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(66);
+/* harmony import */ var _Formats_AutoConfResponseReader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(72);
+/**
+ * Factory pour générer une reponse JSON à partir d'un XML
+ *
+ * @module AutoConfReponseFactory
+ * @private
+ * @alias Gp.Services.AutoConf.Response.AutoConfResponseFactory
+ * @todo gérer le cas du JSONP qui encapsule du XML ?
+ */
+
+
+
+
+
+
+var AutoConfReponseFactory = {
+
+    /**
+     * interface unique
+     * Fabrique d'analyse des réponses (xml) du service d'autoconfiguration.
+     * Création d'un format XML, auquel on associe un reader et une chaîne XML, et qui renverra un objet JavaScript correspondant.
+     * Si une erreur est levée lors de l'analyse, ou si l'objet est vide ou contient une exception : appel de la fonction de callback onError
+     * Sinon, appel de la fonction de callback onSuccess (définies dans Autoconf.analyzeResponse)
+     *
+     * @method build
+     * @static
+     * @param {Object} options - options definies dans le composant AutoConf
+     *
+     * @example
+     *   var options = {
+     *      layerId :
+     *      response :
+     *      rawResponse :
+     *      scope :
+     *      onSuccess :
+     *      onError :
+     *   };
+     */
+    build : function (options) {
+        // logger
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AutoConfResponseFactory");
+        logger.trace(["AutoConfResponseFactory::build()"]);
+
+        // data de type AutoConfResponse
+        var data = null;
+
+        if (options.response) {
+            if (options.rawResponse) {
+                data = options.response;
+            } else {
+                try {
+                    var p = new _Formats_XML__WEBPACK_IMPORTED_MODULE_3__["default"]({
+                        reader : _Formats_AutoConfResponseReader__WEBPACK_IMPORTED_MODULE_4__["default"]
+                    });
+
+                    if (typeof options.response === "string") {
+                        p.setXMLString(options.response);
+                    } else {
+                        p.setXMLDoc(options.response);
+                    }
+
+                    data = p.parse();
+                } catch (e) {
+                    // si une exception a été levée, on appelle le callback d'erreur avec le message renvoyé
+                    var message = e.message;
+                    if (typeof options.response === "string") {
+                        message += "\n (raw response service'" + options.response + "')";
+                    } else {
+                        message += "\n (raw response service'" + options.response.documentElement.innerHTML + "')";
+                    }
+
+                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                        message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", message),
+                        status : 200,
+                        type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR
+                    }));
+                    return;
+                }
+
+                // Si la réponse est vide, on appelle le callback d'erreur
+                var isEmpty = true;
+                for (var key in data) {
+                    if (data.hasOwnProperty(key)) {
+                        isEmpty = false;
+                    }
+                }
+                if (isEmpty) {
+                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY_2")));
+                    return;
+                }
+
+                // Si la réponse contenait une exception renvoyée par le service, on appelle le callback d'erreur
+                if (data.exceptionReport) {
+                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                        message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport),
+                        type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR,
+                        status : 200
+                    }));
+                    return;
+                }
+            }
+        } else {
+            // si la réponse (xmlString) est vide, on appelle le callback d'erreur
+            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY")));
+            return;
+        }
+
+        // définition de la variable globale Gp.Config à partir de la réponse
+        var scope = typeof window !== "undefined" ? window : {};
+
+        if (!scope.Gp) {
+            scope.Gp = {};
+        }
+        if (!scope.Gp.Config) {
+            scope.Gp.Config = data;
+        } else {
+            this.mergeConfig(scope.Gp.Config, data, options.layerId);
+        }
+
+        // si tout s'est bien passé, on appelle le callback de succès
+        options.onSuccess.call(options.scope, scope.Gp.Config);
+    },
+
+    /**
+     * Fonction utilisée dans le cas où l'autoconfiguration est appelée plusieurs fois
+     * (par exemple pour des clés différentes ou pour des infos sur une couche agrégée)
+     *
+     * @method mergeConfig
+     * @static
+     * @param {Object} GpConfig - Variable Gp.Config préexistante
+     * @param {Object} data - la nouvelle réponse de l'autoconf, à fusionner avec GpConfig
+     * @param {String} [layerId] - l'identifiant d'une couche agrégée dans le cas d'une 2è opération de l'autoconf
+     */
+    mergeConfig : function (GpConfig, data, layerId) {
+        if (data && GpConfig) {
+            // on boucle sur les propriétés (generalOptions, layers, projections, services, tileMatrixSets, territories)
+            for (var prop in data) {
+                if (data.hasOwnProperty(prop)) {
+                    // on récupère la nouvelle clé dans generalOptions
+                    if (prop === "generalOptions") {
+                        for (var key in data[prop].apiKeys) {
+                            if (data[prop].apiKeys.hasOwnProperty(key) && !GpConfig.generalOptions.apiKeys[key]) {
+                                GpConfig.generalOptions.apiKeys[key] = data[prop].apiKeys[key];
+                            }
+                        }
+                        // on récupère les nouveaux objets (TMS, layers, projections...)
+                    } else {
+                        if (GpConfig[prop]) {
+                            for (var obj in data[prop]) {
+                                if (data[prop].hasOwnProperty(obj) && !GpConfig[prop][obj]) {
+                                    GpConfig[prop][obj] = data[prop][obj];
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            // dans le cas d'une autoconf pour une couche agrégée, on récupère l'info
+            if (layerId) {
+                var aggregatedLayers = [];
+
+                for (var lyr in data.layers) {
+                    if (data.layers.hasOwnProperty(lyr)) {
+                        aggregatedLayers.push(lyr);
+                    }
+                }
+
+                if (GpConfig.layers[layerId]) {
+                    GpConfig.layers[layerId].aggregatedLayers = aggregatedLayers;
+                }
+            }
+        }
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AutoConfReponseFactory);
+
+
+/***/ }),
+/* 72 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Response_model_AutoConfResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(73);
+/* harmony import */ var _Response_model_Constraint__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(74);
+/* harmony import */ var _Response_model_Format__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(75);
+/* harmony import */ var _Response_model_Layer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(76);
+/* harmony import */ var _Response_model_Legend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(77);
+/* harmony import */ var _Response_model_Metadata__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(78);
+/* harmony import */ var _Response_model_Originator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(79);
+/* harmony import */ var _Response_model_Service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(80);
+/* harmony import */ var _Response_model_Style__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(81);
+/* harmony import */ var _Response_model_Territory__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(82);
+/* harmony import */ var _Response_model_Thematic__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(83);
+/* harmony import */ var _Response_model_TileMatrixSet__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(84);
+/* harmony import */ var _Response_model_TileMatrix__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(85);
+/* harmony import */ var _Response_model_TileMatrixLimit__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(86);
+
+/**
+ * Fonction retournant un objet contenant des clés de lecture (readers)
+ *      qui permettent de parser des réponses XML du service d'autoconfiguration du Géoportail
+ *      afin de récupérer les informations retournées.
+ * @module AutoConfResponseReader
+ * @private
+ * @alias Gp.Services.AutoConf.Formats.AutoConfResponseReader
+ */
+
+// import Logger from "../../../Utils/LoggerByDefault";
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var AutoConfResponseReader = {};
+
+/**
+ * version du service d'autoconf
+ */
+AutoConfResponseReader.VERSION = "1.1.0";
+
+/**
+ * Objet stockant les différents namespaces et les URI associées
+ */
+AutoConfResponseReader.NAMESPACES = {
+    xmlns : "http://www.opengis.net/context",
+    gpp : "http://api.ign.fr/geoportail",
+    ows : "http://www.opengis.net/ows/1.1",
+    sld : "http://www.opengis.net/sld",
+    wmts : "http://www.opengis.net/wmts/1.0",
+    xlink : "http://www.w3.org/1999/xlink",
+    xsi : "http://www.w3.org/2001/XMLSchema-instance"
+};
+
+/**
+ * Localisation (URL) du schema de définition du XML (XSD)
+ */
+AutoConfResponseReader.SCHEMALOCATION = [
+    "http://www.opengis.net/context http://wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://wxs.ign.fr/schemas/autoconf/autoconf.xsd",
+    "http://www.opengis.net/context http://wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://wxs.ign.fr/schemas/autoconf.xsd"
+];
+
+/**
+ * Namespace par défaut du format
+ */
+AutoConfResponseReader.DEFAULTPREFIX = "context";
+
+/**
+ * Objet contenant des fonctions de lecture, appelées "READERS"
+ *      dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire
+ *      et la valeur associée est une fonction (node, data)
+ *      où node est un noeud du document DOM
+ *      et data est un objet où l'on stocke les informations lues dans le XML.
+ */
+AutoConfResponseReader.READERS = {
+
+    context : {
+
+        /** ViewContext */
+        ViewContext : function (viewContextNode) {
+            // info : balise "racine" de la réponse de l'autoconf
+
+            // vérification de la version du service, et des namespaces de l'en-tête
+            __checkServiceAttributes(viewContextNode);
+
+            // create AutoConfResponse
+            var config = new _Response_model_AutoConfResponse__WEBPACK_IMPORTED_MODULE_0__["default"]();
+
+            __getChildNodes(viewContextNode, config);
+
+            return config;
+        },
+
+        // info : /General/Title
+        // ou : /LayerList/Layer/Title
+        /** Title */
+        Title : function (titleNode, data) {
+            if (data && data.generalOptions) { // cas de la variable config générale
+                data.generalOptions.title = __getChildValue(titleNode);
+            } else if (data && data.lyr) { // cas d'une layer
+                data.lyr.title = __getChildValue(titleNode);
+            }
+        },
+
+        // info : /LayerList/Layer/Abstract
+        /** Abstract */
+        Abstract : function (node, data) {
+            if (data && data.lyr) {
+                data.lyr.description = __getChildValue(node);
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:Services/Server
+        // ou : /LayerList/Server
+        /** Server */
+        Server : function (node, data) {
+            var serverId = node.getAttribute("service");
+            var title = node.getAttribute("title");
+            var version = node.getAttribute("version");
+            if (serverId) {
+                if (data && data.services && typeof data.services === "object" && !data.services[serverId]) {
+                    // on est dans la balise Services
+                    var s = new _Response_model_Service__WEBPACK_IMPORTED_MODULE_7__["default"]();
+                    s.title = title;
+                    s.version = version;
+                    // récupération de l'url du service, dans une balise enfant "OnlineResource"
+                    __getChildNodes(node, s);
+                    // ajout du service à la variable config
+                    data.services[serverId] = s;
+                } else if (data && data.lyr) {
+                    // on est dans la balise Layer
+                    if (!data.lyr.serviceParams) {
+                        // si l'objet serviceParams n'a pas encore été créé, on le crée.
+                        data.lyr.serviceParams = {};
+                    }
+                    data.lyr.serviceParams.id = serverId;
+                    data.lyr.serviceParams.version = version;
+                }
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:Services/Server/OnlineResource
+        // ou : /LayerList/Layer/Server/OnlineResource
+        // ou : /LayerList/Layer/Extention/gpp:Layer/gpp:QuickLook/OnlineResource
+        // ou : /LayerList/Layer/Extension/gpp:Layer/gpp:Legends/gpp:Legend/gpp:LegendURL/OnlineResource
+        // ou : /LayerList/Layer/Extension/gpp:Layer/gpp:MetadataURL/OnlineResource
+        /** OnlineResource */
+        OnlineResource : function (node, service) {
+            if (service && service.hasOwnProperty("serverUrl")) {
+                service.serverUrl = node.getAttribute("xlink:href");
+            }
+        },
+
+        // info : /LayerList
+        /** LayerList */
+        LayerList : function (layerListNode, config) {
+            // liste de balises "layer"
+            __getChildNodes(layerListNode, config);
+
+            if (config && config.layers && config.generalOptions && config.services) {
+                // récupération des clés et des couches associées
+                for (var lyr in config.layers) {
+                    if (config.layers.hasOwnProperty(lyr)) {
+                        var layerConfig = config.layers[lyr];
+
+                        // récupération de la clé associée
+                        var apiKeys = layerConfig.apiKeys;
+                        if (apiKeys && Array.isArray(apiKeys)) {
+                            for (var i = 0; i < apiKeys.length; i++) {
+                                // pour chaque clé API, on ajoute la couche
+                                var key = apiKeys[i];
+                                if (config.generalOptions.apiKeys) {
+                                    if (!config.generalOptions.apiKeys[key] || !Array.isArray(config.generalOptions.apiKeys[key])) {
+                                        config.generalOptions.apiKeys[key] = [];
+                                    }
+                                    config.generalOptions.apiKeys[key].push(lyr);
+                                }
+                            }
+                        }
+
+                        // récupération du service associé
+                        var serviceParams = layerConfig.serviceParams;
+                        if (serviceParams && serviceParams.id) {
+                            if (!config.services[serviceParams.id]) {
+                                var s = new _Response_model_Service__WEBPACK_IMPORTED_MODULE_7__["default"]();
+                                if (serviceParams.serverUrl) {
+                                    s.serverUrl = serviceParams.serverUrl;
+                                }
+                                if (serviceParams.version) {
+                                    s.version = serviceParams.version;
+                                }
+                                config.services[serviceParams.id] = s;
+                            }
+                        }
+
+                        // récupération de la projection associée (dans le cas d'une couche WMTS)
+                        if (layerConfig.wmtsOptions && layerConfig.wmtsOptions.tileMatrixSetLink && config.tileMatrixSets) {
+                            var tmsLink = layerConfig.wmtsOptions.tileMatrixSetLink;
+                            var tileMatrixSets = config.tileMatrixSets;
+                            for (var tms in tileMatrixSets) {
+                                if (tileMatrixSets.hasOwnProperty(tms) && tms === tmsLink) {
+                                    layerConfig.defaultProjection = tileMatrixSets[tms].projection;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        },
+
+        // info : /LayerList/Layer
+        /** Layer */
+        Layer : function (layerNode, config) {
+            if (config && config.layers) {
+                var lyrData = {
+                    lyr : new _Response_model_Layer__WEBPACK_IMPORTED_MODULE_3__["default"](),
+                    lyrId : null
+                };
+
+                var hidden = layerNode.getAttribute("hidden");
+                if (hidden === "1") {
+                    lyrData.lyr.hidden = true;
+                } else {
+                    lyrData.lyr.hidden = false;
+                }
+
+                var queryable = layerNode.getAttribute("queryable");
+                if (queryable === "1") {
+                    lyrData.lyr.queryable = true;
+                } else {
+                    lyrData.lyr.queryable = false;
+                }
+
+                // on peut avoir les balises : Server, Name, Title, Abstract, DataURL, MetadataURL,
+                // sld:MinScaleDenominator, sld:MaxScaleDenominator, SRS, FormatList, StyleList
+                // DimensionList, Extension
+                __getChildNodes(layerNode, lyrData);
+
+                // si on a bien récupéré l'identifiant de la couche, on s'en sert pour l'ajouter au tableau associatif des couches disponibles
+                if (lyrData.lyrId) {
+                    // Dans le cas des services, on modifie le contexte de l'identifiant.
+                    if (lyrData.lyr.serviceParams && lyrData.lyr.serviceParams.id) {
+                        var serviceid = lyrData.lyr.serviceParams.id;
+                        if (serviceid.toUpperCase().indexOf("OPENLS") !== -1 || serviceid.toUpperCase().indexOf("ELEVATION") !== -1) {
+                            // Il faut changer l'identifiant de la ressource.
+                            var resourceId = lyrData.lyrId.split("$")[0];
+                            lyrData.lyrId = resourceId + "$" + serviceid;
+                        }
+                    }
+
+                    // on ajoute l'information dans les attributs de la couche
+                    lyrData.lyr.layerId = lyrData.lyrId;
+                    // et dans le tableau Gp.Config.layers
+                    config.layers[lyrData.lyrId] = lyrData.lyr;
+                }
+            }
+        },
+
+        // info : /LayerList/Layer/Name
+        /** TODO : jsdoc block */
+        Name : function (node, lyrData) {
+            if (lyrData && lyrData.lyr) {
+                lyrData.lyr.name = __getChildValue(node);
+            }
+        },
+
+        // info : /LayerList/Layer/SRS (dans le cas des couches WMS ou WFS)
+        /** TODO : jsdoc block */
+        SRS : function (node, lyrData) {
+            // on récupère la projection de la couche (SRS)
+            if (lyrData && lyrData.lyr) {
+                lyrData.lyr.defaultProjection = __getChildValue(node);
+            }
+        },
+
+        // info : /LayerList/Layer/FormatList/Format
+        /** TODO : jsdoc block */
+        Format : function (node, lyrData) {
+            if (lyrData && lyrData.lyr) {
+                var f = new _Response_model_Format__WEBPACK_IMPORTED_MODULE_2__["default"]();
+                var current = node.getAttribute("current");
+                if (current === "1") {
+                    f.current = true;
+                } else {
+                    f.current = false;
+                }
+                f.name = __getChildValue(node);
+                // si on n'a pas encore ajouté de format, on crée le tableau vide
+                if (!lyrData.lyr.formats || !Array.isArray(lyrData.lyr.formats)) {
+                    lyrData.lyr.formats = [];
+                }
+                lyrData.lyr.formats.push(f);
+            }
+        },
+
+        // info : /LayerList/Layer/StyleList/Style
+        /** TODO : jsdoc block */
+        Style : function (node, lyrData) {
+            if (lyrData && lyrData.lyr) {
+                var s = new _Response_model_Style__WEBPACK_IMPORTED_MODULE_8__["default"]();
+                var current = node.getAttribute("current");
+                if (current === "1" || current === 1) {
+                    s.current = true;
+                } else {
+                    s.current = false;
+                }
+                if (node.hasChildNodes) {
+                    var children = node.childNodes;
+                    var child;
+                    var childName;
+                    for (var i = 0; i < children.length; i++) {
+                        child = children[i];
+                        if (child.nodeType === 1) { // 1 === node.ELEMENT_NODE
+                            childName = child.localName || child.baseName || child.nodeName;
+                            if (childName === "Name") {
+                                s.name = __getChildValue(child);
+                            } else if (childName === "Title") {
+                                s.title = __getChildValue(child);
+                            } else if (childName === "URL") {
+                                s.url = __getChildValue(child);
+                            }
+                        }
+                    }
+                }
+                // si on n'a pas encore ajouté de style, on crée le tableau vide
+                if (!lyrData.lyr.styles || !Array.isArray(lyrData.lyr.styles)) {
+                    lyrData.lyr.styles = [];
+                }
+                lyrData.lyr.styles.push(s);
+            }
+        },
+
+        // info : /LayerList/Layer/DimensionList/Dimension
+        /** TODO : jsdoc block */
+        Dimension : function (node, lyrData) {
+            // possède des attributs obligatoires : name, units, unitSymbol et userValue
+            // et d'autres attributs facultatifs : default, multipleValues, nearestValue, current
+            var name = node.getAttribute("name");
+            var dim = __getChildValue(node);
+            if (lyrData && lyrData.lyr) {
+                // si on n'a pas encore ajouté de dimension, on crée l'objet vide
+                if (!lyrData.lyr.dimensions) {
+                    lyrData.lyr.dimensions = {};
+                }
+                if (name === "Type") {
+                    lyrData.lyr.dimensions.type = dim;
+                } else if (name === "VisibilityRange") {
+                    lyrData.lyr.dimensions.visibilityRange = dim;
+                } else if (name === "VisibilityMode ") {
+                    lyrData.lyr.dimensions.visibilityMode = dim;
+                } else if (name === "GeometricType") {
+                    lyrData.lyr.dimensions.geometricType = dim;
+                } else if (name === "NoDataValue") {
+                    lyrData.lyr.dimensions.noDataValue = dim;
+                }
+            }
+        }
+
+    },
+
+    gpp : {
+
+        // info : /General/Extension/gpp:General/gpp:Theme
+        /** TODO : jsdoc block */
+        Theme : function (themeNode, config) {
+            if (config && config.generalOptions && config.generalOptions.hasOwnProperty("theme")) {
+                config.generalOptions.theme = __getChildValue(themeNode);
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:defaultGMLGFIStyleUrl
+        /** TODO : jsdoc block */
+        defaultGMLGFIStyleUrl : function (node, config) {
+            if (config && config.generalOptions && config.generalOptions.hasOwnProperty("defaultGMLGFIStyle")) {
+                config.generalOptions.defaultGMLGFIStyle = __getChildValue(node);
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:Territories/gpp:Territory
+        /** TODO : jsdoc block */
+        Territory : function (territoryNode, config) {
+            // info : Information to configure the API for this territory
+            var tid = territoryNode.getAttribute("id");
+            if (tid) {
+                // create a new Territory
+                var t = new _Response_model_Territory__WEBPACK_IMPORTED_MODULE_9__["default"]();
+
+                var isDefault = territoryNode.getAttribute("default");
+                if (isDefault === "1") {
+                    t.isDefault = true;
+                } else {
+                    t.isDefault = false;
+                }
+                // read territory informations
+                __getChildNodes(territoryNode, t);
+                // add territory to config
+                if (config && config.territories && typeof config.territories === "object") {
+                    config.territories[tid] = t;
+                }
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:Territories/gpp:Territory/gpp:defaultCRS
+        /** TODO : jsdoc block */
+        defaultCRS : function (node, territory) {
+            // info : Identifier for the default Coordinate Reference System (CRS).
+            if (territory && territory.hasOwnProperty("defaultCRS")) {
+                territory.defaultCRS = __getChildValue(node);
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:Territories/gpp:Territory/gpp:AdditionalCRS
+        // ou : /LayerList/Extension/gpp:Layer/gpp:AdditionalCRS
+        /** TODO : jsdoc block */
+        AdditionalCRS : function (node, data) {
+            // info : Identifier for additional Coordinate Reference System (CRS).
+            // info : data peut être une instance de Territory.js, ou une instance de Layer.js
+            var addCRS = __getChildValue(node);
+            if (addCRS && data) {
+                if (Array.isArray(data.additionalCRS)) { // cas d'un territoire
+                    data.additionalCRS.push(addCRS);
+                } else { // cas d'une couche
+                    // si le tableau n'est pas encore créé
+                    if (!data.additionalProjections || !Array.isArray(data.additionalProjections)) {
+                        data.additionalProjections = [];
+                    }
+                    data.additionalProjections.push(addCRS);
+                }
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:Territories/gpp:Territory/gpp:DefaultLayer
+        /** TODO : jsdoc block */
+        DefaultLayer : function (node, territory) {
+            var lyr = node.getAttribute("layerId");
+            if (lyr && territory && Array.isArray(territory.defaultLayers)) {
+                territory.defaultLayers.push(lyr);
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:Territories/gpp:Territory/gpp:BoundingBox
+        // ou : /LayerList/Extension/gpp:Layer/gpp:BoundingBox
+        // ou : /LayerList/Layer/Extension/gpp:Layer/gpp:Constraints/gpp:Constraint/gpp:BoundingBox
+        // ou : /LayerList/Extension/gpp:Layer/gpp:Originators/gpp:Originator/gpp:Constraints/gpp:Constraint/gpp:BoundingBox
+        /** TODO : jsdoc block */
+        BoundingBox : function (node, data) {
+            if (data) {
+                var values = __getChildValue(node).split(",");
+                if (values.length === 4) {
+                    // get bbox coordinates (wgs84)
+                    var bbox = {
+                        left : parseFloat(values[0]),
+                        right : parseFloat(values[2]),
+                        top : parseFloat(values[3]),
+                        bottom : parseFloat(values[1])
+                    };
+                    // get temporal extent params (constraint or layer)
+                    var minT = node.getAttribute("minT");
+                    var maxT = node.getAttribute("maxT");
+
+                    if (data.hasOwnProperty("geoBBOX")) { // cas d'un territoire
+                        data.geoBBOX = bbox;
+                    } else if (data.hasOwnProperty("bbox")) { // cas d'une constraint
+                        if (data.bbox.left || data.bbox.right || data.bbox.top || data.bbox.bottom) {
+                            // si on a déjà une bbox, il faut stocker d'autres contraintes
+                            if (!data.multiConstraints) {
+                                data.multiConstraints = [];
+                            }
+                            var newConstraint = new _Response_model_Constraint__WEBPACK_IMPORTED_MODULE_1__["default"]();
+                            newConstraint.bbox = bbox;
+                            newConstraint.temporalExtent = [minT, maxT];
+                            data.multiConstraints.push(newConstraint);
+                        } else {
+                            // contrainte classique
+                            data.bbox = bbox;
+                            data.temporalExtent = [minT, maxT];
+                        }
+                    } else { // cas d'une layer
+                        if (!data.globalConstraint) {
+                            data.globalConstraint = new _Response_model_Constraint__WEBPACK_IMPORTED_MODULE_1__["default"]();
+                        }
+                        data.globalConstraint.bbox = bbox;
+                        data.globalConstraint.temporalExtent = [minT, maxT];
+                    }
+                }
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:Territories/gpp:Territory/gpp:Resolution
+        /** TODO : jsdoc block */
+        Resolution : function (node, territory) {
+            // info : The default resolution to display on this territory, in CRS coordinate system
+            var res = __getChildValue(node);
+            if (res && territory && territory.defaultOptions && territory.defaultOptions.hasOwnProperty("resolution")) {
+                territory.defaultOptions.resolution = parseFloat(res);
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:Territories/gpp:Territory/gpp:Center/gpp:x
+        /** TODO : jsdoc block */
+        x : function (node, territory) {
+            var lon = __getChildValue(node);
+            if (lon && territory && territory.geoCenter && territory.geoCenter.hasOwnProperty("lon")) {
+                territory.geoCenter.lon = parseFloat(lon);
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:Territories/gpp:Territory/gpp:Center/gpp:y
+        /** TODO : jsdoc block */
+        y : function (node, territory) {
+            var lat = __getChildValue(node);
+            if (lat && territory && territory.geoCenter && territory.geoCenter.hasOwnProperty("lat")) {
+                territory.geoCenter.lat = parseFloat(lat);
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:Resolutions
+        /** TODO : jsdoc block */
+        Resolutions : function (resNode, config) {
+            // info : List of resolutions in CRS:84 (comma separated values)
+            if (config && config.generalOptions && config.generalOptions.hasOwnProperty("wgs84Resolutions")) {
+                config.generalOptions.wgs84Resolutions = __getChildValue(resNode).split(",");
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer
+        /** TODO : jsdoc block */
+        Layer : function (node, lyrData) {
+            // attributs : id, opacity, order, visibleInCatalog, aggregate, more
+            if (lyrData && lyrData.hasOwnProperty("lyrId") && lyrData.lyr) {
+                lyrData.lyrId = node.getAttribute("id");
+                var aggregate = node.getAttribute("aggregate");
+                var more = node.getAttribute("more");
+                if (aggregate || more) {
+                    lyrData.lyr.isAggregate = true;
+                }
+                __getChildNodes(node, lyrData.lyr);
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/gpp:Constraints/gpp:Constraint
+        // ou : /LayerList/Extension/gpp:Layer/gpp:Originators/gpp:Originator/gpp:Constraints/gpp:Constraint
+        /** TODO : jsdoc block */
+        Constraint : function (node, data) {
+            var c = new _Response_model_Constraint__WEBPACK_IMPORTED_MODULE_1__["default"]();
+            __getChildNodes(node, c);
+            if (data) {
+                // on peut être dans le cas d'un originator ou d'une layer, tous les deux ont l'attribut constraints
+                if (!data.constraints || !Array.isArray(data.constraints)) {
+                    data.constraints = [];
+                }
+
+                // cas de plusieurs contraintes (par ex différents territoires)
+                if (c.multiConstraints && Array.isArray(c.multiConstraints)) {
+                    // on récupère la première contrainte, stockée normalement
+                    var constraint = new _Response_model_Constraint__WEBPACK_IMPORTED_MODULE_1__["default"]();
+                    constraint.crs = c.crs;
+                    constraint.bbox = c.bbox;
+                    constraint.minScaleDenominator = c.minScaleDenominator;
+                    constraint.maxScaleDenominator = c.maxScaleDenominator;
+                    constraint.temporalExtent = c.temporalExtent;
+                    data.constraints.push(constraint);
+
+                    // puis on récupère les autres contraintes, à partir de multiConstraints
+                    for (var i = 0; i < c.multiConstraints.length; i++) {
+                        constraint = new _Response_model_Constraint__WEBPACK_IMPORTED_MODULE_1__["default"]();
+                        constraint.crs = c.crs;
+                        constraint.minScaleDenominator = c.minScaleDenominator;
+                        constraint.maxScaleDenominator = c.maxScaleDenominator;
+                        constraint.bbox = c.multiConstraints[i].bbox;
+                        constraint.temporalExtent = c.multiConstraints[i].temporalExtent;
+                        data.constraints.push(constraint);
+                    }
+                } else {
+                    // cas d'une contrainte classique
+                    data.constraints.push(c);
+                }
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/gpp:Originators/gpp:Originator/gpp:Constraints/gpp:Constraint/gpp:CRS
+        // ou : /LayerList/Layer/Extension/gpp:Layer/gpp:Constraints/gpp:Constraint/gpp:CRS
+        /** TODO : jsdoc block */
+        CRS : function (node, data) {
+            // nothing to do.
+            if (data && data.hasOwnProperty("crs")) {
+                data.crs = __getChildValue(node);
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/gpp:Thematics/gpp:Thematic
+        /** TODO : jsdoc block */
+        Thematic : function (node, lyr) {
+            if (lyr) {
+                var t = new _Response_model_Thematic__WEBPACK_IMPORTED_MODULE_10__["default"]();
+                t.inspire = false;
+                t.name = __getChildValue(node);
+                // si aucune thématique n'a été ajoutée, on crée le tableau vide
+                if (!lyr.thematics || !Array.isArray(lyr.thematics)) {
+                    lyr.thematics = [];
+                }
+                lyr.thematics.push(t);
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/gpp:Thematics/gpp:InspireThematic
+        /** TODO : jsdoc block */
+        InspireThematic : function (node, lyr) {
+            if (lyr) {
+                var t = new _Response_model_Thematic__WEBPACK_IMPORTED_MODULE_10__["default"]();
+                t.inspire = true;
+                t.name = __getChildValue(node);
+                // si aucune thématique n'a été ajoutée, on crée le tableau vide
+                if (!lyr.thematics || !Array.isArray(lyr.thematics)) {
+                    lyr.thematics = [];
+                }
+                lyr.thematics.push(t);
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/gpp:Originators/gpp:Originator
+        /** TODO : jsdoc block */
+        Originator : function (node, lyr) {
+            if (lyr) {
+                // info : contient des balises Attribution, Logo, URL, et Constraints
+                var o = new _Response_model_Originator__WEBPACK_IMPORTED_MODULE_6__["default"]();
+                o.name = node.getAttribute("name");
+                __getChildNodes(node, o);
+                // si aucun originator n'a été ajouté, on crée le tableau vide
+                if (!lyr.originators || !Array.isArray(lyr.originators)) {
+                    lyr.originators = [];
+                }
+                lyr.originators.push(o);
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/gpp:Originators/gpp:Originator/gpp:Attribution
+        /** TODO : jsdoc block */
+        Attribution : function (node, originator) {
+            if (originator && originator.hasOwnProperty("attribution")) {
+                originator.attribution = __getChildValue(node);
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/gpp:Originators/gpp:Originator/gpp:Logo
+        /** TODO : jsdoc block */
+        Logo : function (node, originator) {
+            if (originator && originator.hasOwnProperty("logo")) {
+                originator.logo = __getChildValue(node);
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/gpp:Originators/gpp:Originator/gpp:URL
+        /** TODO : jsdoc block */
+        URL : function (node, originator) {
+            if (originator && originator.hasOwnProperty("url")) {
+                originator.url = __getChildValue(node);
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/gpp:Legends/gpp:Legend
+        /** TODO : jsdoc block */
+        Legend : function (node, lyr) {
+            // 2 balises : sld:MinScaleDenominator et gpp:LegendURL
+            var l = new _Response_model_Legend__WEBPACK_IMPORTED_MODULE_4__["default"]();
+            __getChildNodes(node, l);
+            if (lyr) {
+                // si aucune légende n'a encore été ajoutée, on crée le tableau vide
+                if (!lyr.legends || !Array.isArray(lyr.legends)) {
+                    lyr.legends = [];
+                }
+                lyr.legends.push(l);
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/gpp:Legends/gpp:Legend/gpp:LegendURL
+        /** TODO : jsdoc block */
+        LegendURL : function (node, legend) {
+            if (legend && legend.hasOwnProperty("format")) {
+                legend.format = node.getAttribute("format");
+                if (node.hasChildNodes) {
+                    var child = node.childNodes[0];
+                    var childName = child.localName || child.baseName || child.nodeName;
+                    if (childName === "OnlineResource" && legend.hasOwnProperty("url")) {
+                        legend.url = child.getAttribute("xlink:href");
+                    }
+                }
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/gpp:QuickLook
+        /** TODO : jsdoc block */
+        QuickLook : function (node, lyr) {
+            // info : contient une balise OnlineResource avec l'url dans l'attribut "xlink:href"
+            if (node.hasChildNodes) {
+                var child = node.childNodes[0];
+                var childName = child.localName || child.baseName || child.nodeName;
+                if (childName === "OnlineResource" && lyr) {
+                    lyr.quicklookUrl = child.getAttribute("xlink:href");
+                }
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/gpp:MetadataURL
+        /** TODO : jsdoc block */
+        MetadataURL : function (node, lyr) {
+            if (lyr) {
+                // info : contient une balise OnlineResource avec l'url dans l'attribut "xlink:href"
+                var m = new _Response_model_Metadata__WEBPACK_IMPORTED_MODULE_5__["default"]();
+                m.format = node.getAttribute("format");
+                if (node.hasChildNodes) {
+                    var child = node.childNodes[0];
+                    var childName = child.localName || child.baseName || child.nodeName;
+                    if (childName === "OnlineResource") {
+                        m.url = child.getAttribute("xlink:href");
+                    }
+                }
+                // si aucune metadata n'a été ajoutée, on crée le tableau vide
+                if (!lyr.metadata && !Array.isArray(lyr.metadata)) {
+                    lyr.metadata = [];
+                }
+                lyr.metadata.push(m);
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/gpp:Keys/gpp:Key
+        /** TODO : jsdoc block */
+        Key : function (node, lyr) {
+            if (lyr) {
+                // récupération de la clé API
+                var key = node.getAttribute("id");
+                // si on n'a pas encore ajouté de clé, on crée le tableau vide
+                if (!lyr.apiKeys || !Array.isArray(lyr.apiKeys)) {
+                    lyr.apiKeys = [];
+                }
+                lyr.apiKeys.push(key);
+
+                // récupération de l'url du service avec la clé API
+                var serverUrl = __getChildValue(node);
+                if (!lyr.serviceParams) {
+                    lyr.serviceParams = {};
+                }
+                if (!lyr.serviceParams.serverUrl) {
+                    lyr.serviceParams.serverUrl = {};
+                }
+                if (!lyr.serviceParams.serverUrl[key]) {
+                    lyr.serviceParams.serverUrl[key] = serverUrl;
+                }
+            }
+        }
+
+    },
+
+    ows : {
+        /** TODO : jsdoc block */
+        Identifier : function (node, data) {
+            if (data && data.hasOwnProperty("TMS")) { // dans le cas d'un TileMatrixSet
+                data.identifier = __getChildValue(node);
+            } else if (data && data.hasOwnProperty("matrixId")) { // dans le cas d'une TileMatrix
+                data.matrixId = __getChildValue(node);
+            }
+        },
+
+        /** TODO : jsdoc block */
+        SupportedCRS : function (node, tmsData) {
+            if (tmsData && tmsData.TMS && tmsData.TMS.hasOwnProperty("projection")) {
+                tmsData.TMS.projection = __getChildValue(node);
+            }
+        }
+    },
+
+    sld : {
+        // info : /General/Extension/gpp:General/gpp:Territories/gpp:Territory/sld:MinScaleDenominator
+        // ou : /LayerList/Layer/sld:MinScaleDenominator
+        // ou : /LayerList/Layer/Extension/gpp:Layer/gpp:Originators/gpp:Originator/gpp:Constraints/sld:MinScaleDenominator
+        // ou : /LayerList/Layer/Extension/gpp:Layer/gpp:Legends/gpp:Legend/sld:MinScaleDenominator
+        /** TODO : jsdoc block */
+        MinScaleDenominator : function (node, data) {
+            var minScale = __getChildValue(node);
+            if (minScale && data) {
+                if (data.hasOwnProperty("defaultOptions")) { // cas d'un territoire
+                    data.defaultOptions.minScaleDenominator = parseFloat(minScale);
+                } else if (data.lyr) { // cas d'une layer
+                    if (!data.lyr.globalConstraint) {
+                        data.lyr.globalConstraint = new _Response_model_Constraint__WEBPACK_IMPORTED_MODULE_1__["default"]();
+                    }
+                    data.lyr.globalConstraint.minScaleDenominator = parseFloat(minScale);
+                } else if (data.hasOwnProperty("minScaleDenominator")) { // cas d'une contrainte ou d'une légende
+                    data.minScaleDenominator = parseFloat(minScale);
+                }
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:Territories/gpp:Territory/sld:MaxScaleDenominator
+        // ou : /LayerList/Layer/sld:MaxScaleDenominator
+        // ou : /LayerList/Layer/Extension/gpp:Layer/gpp:Originators/gpp:Originator/gpp:Constraints/sld:MaxScaleDenominator
+        /** TODO : jsdoc block */
+        MaxScaleDenominator : function (node, data) {
+            var maxScale = __getChildValue(node);
+            if (maxScale && data) {
+                if (data.hasOwnProperty("defaultOptions")) { // cas d'un territoire
+                    data.defaultOptions.maxScaleDenominator = parseFloat(maxScale);
+                } else if (data.lyr) { // cas d'une layer
+                    if (!data.lyr.globalConstraint) {
+                        data.lyr.globalConstraint = new _Response_model_Constraint__WEBPACK_IMPORTED_MODULE_1__["default"]();
+                    }
+                    data.lyr.globalConstraint.maxScaleDenominator = parseFloat(maxScale);
+                } else if (data.hasOwnProperty("maxScaleDenominator")) { // cas d'une contrainte
+                    data.maxScaleDenominator = parseFloat(maxScale);
+                }
+            }
+        }
+    },
+
+    wmts : {
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/wmts:TileMatrixSetLink/wmts:TileMatrixSetLimits
+        /** TODO : jsdoc block */
+        TileMatrixSetLimits : function (node, lyr) {
+            // info : contient des balises wmts:TileMatrixLimits
+            if (lyr) {
+                var limits = {};
+                // on récupère les limites dans les balises TileMatrixLimits
+                __getChildNodes(node, limits);
+
+                if (!lyr.wmtsOptions) {
+                    lyr.wmtsOptions = {};
+                }
+                lyr.wmtsOptions.tileMatrixSetLimits = limits;
+            }
+        },
+
+        // info : /LayerList/Layer/Extension/gpp:Layer/wmts:TileMatrixSetLink/wmts:TileMatrixSetLimits/wmts:TileMatrixLimits
+        /** TODO : jsdoc block */
+        TileMatrixLimits : function (node, limits) {
+            var limit = new _Response_model_TileMatrixLimit__WEBPACK_IMPORTED_MODULE_13__["default"]();
+            var limitId;
+            if (node.hasChildNodes) {
+                var children = node.childNodes;
+                for (var i = 0; i < children.length; i++) {
+                    var child = children[i];
+                    var childName = child.localName || child.baseName || child.nodeName;
+                    if (childName === "TileMatrix") {
+                        limitId = __getChildValue(child);
+                    } else if (childName === "MinTileRow") {
+                        limit.minTileRow = __getChildValue(child);
+                    } else if (childName === "MaxTileRow") {
+                        limit.maxTileRow = __getChildValue(child);
+                    } else if (childName === "MinTileCol") {
+                        limit.minTileCol = __getChildValue(child);
+                    } else if (childName === "MaxTileCol") {
+                        limit.maxTileCol = __getChildValue(child);
+                    }
+                }
+                if (limitId && limits && !limits[limitId]) {
+                    limits[limitId] = limit;
+                }
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:TileMatrixSets/wmts:TileMatrixSet
+        // ou : // info : /LayerList/Layer/Extension/gpp:Layer/wmts:TileMatrixSetLink/wmts:TileMatrixSet
+        /** TODO : jsdoc block */
+        TileMatrixSet : function (node, data) {
+            // info : Describes a particular set of tile matrices.
+
+            if (data && data.tileMatrixSets) { // les tileMatrixSets de General
+                // nouvel objet TileMatrixSet
+                var tmsData = {};
+                tmsData.TMS = new _Response_model_TileMatrixSet__WEBPACK_IMPORTED_MODULE_11__["default"]();
+                tmsData.resolutions = [];
+
+                // lecture des informations du TMS
+                __getChildNodes(node, tmsData);
+
+                // récupération des identifiants des niveaux de matrice (pour faciliter l'accès au WMTS via les API carto)
+                var tileMatrices = tmsData.TMS.tileMatrices;
+                for (var tm in tileMatrices) {
+                    if (tileMatrices.hasOwnProperty(tm)) {
+                        tmsData.TMS.matrixIds.push(tm);
+                    }
+                }
+
+                if (tmsData.TMS.getProjection() === "IGNF:WGS84G" || tmsData.TMS.getProjection() === "EPSG:4326") {
+                    if (data.generalOptions && Array.isArray(data.generalOptions.wgs84Resolutions)) {
+                        var wgs84Resolutions = data.generalOptions.wgs84Resolutions;
+                        for (var i = 0; i < wgs84Resolutions.length; i++) {
+                            // info : les résolutions stockées dans wgs84Resolutions, issues de l'autoconf, sont des string
+                            tmsData.resolutions[i] = parseFloat(wgs84Resolutions[i]);
+                        }
+                    }
+                }
+
+                // tri des résolutions (par ordre décroissant cette fois)
+                if (Array.isArray(tmsData.resolutions) && tmsData.resolutions.sort !== undefined) {
+                    tmsData.resolutions.sort(
+                        function (x, y) {
+                            return y - x;
+                        }
+                    );
+                }
+                tmsData.TMS.nativeResolutions = tmsData.resolutions;
+
+                // ajout du TileMatrixSet à la variable config
+                data.tileMatrixSets[tmsData.identifier] = tmsData.TMS;
+            } else { // le TileMatrixSetLink d'une couche (layer)
+                if (data && !data.wmtsOptions) {
+                    data.wmtsOptions = {};
+                }
+                // ajout du lien vers le TMS
+                data.wmtsOptions.tileMatrixSetLink = __getChildValue(node);
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:TileMatrixSets/wmts:TileMatrixSet/wmts:TileMatrix
+        /** TODO : jsdoc block */
+        TileMatrix : function (node, tmsData) {
+            // info : Describes a particular tile matrix.
+
+            if (tmsData) {
+                // nouveau niveau de matrice : TileMatrix
+                var tileMatrix = new _Response_model_TileMatrix__WEBPACK_IMPORTED_MODULE_12__["default"]();
+
+                // lecture des information du TileMatrix
+                __getChildNodes(node, tileMatrix);
+
+                // calcul de la résolution associée au dénominateur d'échelle du niveau de pyramide, selon la projection.
+                if (tmsData.TMS && tmsData.TMS.getProjection()) {
+                    var proj = tmsData.TMS.getProjection();
+                    if (proj === "EPSG:3857" || proj === "EPSG:2154") {
+                        // calcul de la résolution associée, en m/px
+                        // en se basant sur une "taille standard de pixel" de 0.28mm*0.28mm (standard WMTS 1.0)
+                        var r = tileMatrix.scaleDenominator * 0.00028;
+                        if (tmsData.resolutions && Array.isArray(tmsData.resolutions)) {
+                            tmsData.resolutions.push(r);
+                        }
+                    }
+                }
+
+                // ajout du TileMatrix au TileMatrixSet
+                if (tmsData.TMS && tmsData.TMS.tileMatrices) {
+                    tmsData.TMS.tileMatrices[tileMatrix.matrixId] = tileMatrix;
+                }
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:TileMatrixSets/wmts:TileMatrixSet/wmts:TileMatrix/wmts:ScaleDenominator
+        /** TODO : jsdoc block */
+        ScaleDenominator : function (node, tileMatrix) {
+            var scale = __getChildValue(node);
+            if (scale && tileMatrix && tileMatrix.hasOwnProperty("scaleDenominator")) {
+                tileMatrix.scaleDenominator = parseFloat(scale);
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:TileMatrixSets/wmts:TileMatrixSet/wmts:TileMatrix/wmts:TopLeftCorner
+        /** TODO : jsdoc block */
+        TopLeftCorner : function (node, tileMatrix) {
+            var values = __getChildValue(node).split(" ");
+            if (values && tileMatrix) {
+                tileMatrix.topLeftCorner = {};
+                tileMatrix.topLeftCorner.x = parseFloat(values[0]);
+                tileMatrix.topLeftCorner.y = parseFloat(values[1]);
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:TileMatrixSets/wmts:TileMatrixSet/wmts:TileMatrix/wmts:TileWidth
+        /** TODO : jsdoc block */
+        TileWidth : function (node, tileMatrix) {
+            var value = __getChildValue(node);
+            if (value && tileMatrix && tileMatrix.hasOwnProperty("tileWidth")) {
+                tileMatrix.tileWidth = parseInt(value, 10);
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:TileMatrixSets/wmts:TileMatrixSet/wmts:TileMatrix/wmts:TileHeight
+        /** TODO : jsdoc block */
+        TileHeight : function (node, tileMatrix) {
+            var value = __getChildValue(node);
+            if (value && tileMatrix && tileMatrix.hasOwnProperty("tileHeight")) {
+                tileMatrix.tileHeight = parseInt(value, 10);
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:TileMatrixSets/wmts:TileMatrixSet/wmts:TileMatrix/wmts:MatrixWidth
+        /** TODO : jsdoc block */
+        MatrixWidth : function (node, tileMatrix) {
+            var value = __getChildValue(node);
+            if (value && tileMatrix && tileMatrix.hasOwnProperty("matrixWidth")) {
+                tileMatrix.matrixWidth = parseInt(value, 10);
+            }
+        },
+
+        // info : /General/Extension/gpp:General/gpp:TileMatrixSets/wmts:TileMatrixSet/wmts:TileMatrix/wmts:MatrixHeight
+        /** TODO : jsdoc block */
+        MatrixHeight : function (node, tileMatrix) {
+            var value = __getChildValue(node);
+            if (value && tileMatrix && tileMatrix.hasOwnProperty("matrixHeight")) {
+                tileMatrix.matrixHeight = parseInt(value, 10);
+            }
+        }
+    },
+
+    /** TODO : jsdoc block */
+    serviceException : function (node) {
+        var response = {};
+        if (node.hasChildNodes()) {
+            var children = node.childNodes;
+            var child;
+            for (var i = 0; i < children.length; i++) {
+                child = children[i];
+                if (child.nodeName === "exception") {
+                    response.exceptionReport = AutoConfResponseReader.READERS["exception"](child);
+                }
+            }
+        }
+        return response;
+    },
+
+    /** TODO : jsdoc block */
+    exception : function (node) {
+        var exceptionReport = {};
+
+        // get exception code
+        var exceptionCode = node.getAttribute("code");
+        if (exceptionCode) {
+            exceptionReport.exceptionCode = exceptionCode;
+        }
+
+        // get exception message
+        var textNode = node.firstChild;
+        if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+            exceptionReport.exception = textNode.nodeValue;
+        }
+
+        return exceptionReport;
+    }
+
+};
+
+/**
+ * Méthode permettant de lancer la lecture d'une réponse XML du service d'autoconf,
+ *      à l'aide des READERS de la classe.
+ *
+ * @method AutoConfResponseReader.read
+ * @param {DOMElement} root - racine de la réponse XML à lire
+ * @return {Object} config|exceptionReport : l'objet contenant les informations de la réponse XML,
+ *      sous la forme d'un objet AutoConfResponse, ou un objet littéral exceptionReport si le service a renvoyé une exception.
+ * @static
+ * @memberof AutoConfResponseReader
+ */
+AutoConfResponseReader.read = function (root) {
+    if (root.nodeName === "ViewContext") {
+        var nsPrefix = root.prefix || AutoConfResponseReader.DEFAULTPREFIX;
+        var config = AutoConfResponseReader.READERS[nsPrefix][root.nodeName](root);
+        return config;
+    } else if (root.nodeName === "serviceException") {
+        var exceptionReport = AutoConfResponseReader.READERS[root.nodeName](root);
+        return exceptionReport;
+    } else {
+        throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.");
+    }
+};
+
+/**
+ * Récupération des attributs d'un noeud élément
+ *
+ * @private
+ * @memberof AutoConfResponseReader
+ * @method __getAttributes
+ * @param {DOMElement} node - noeud contenant l'attribut recherché
+ * @return {Object} nodeAttributes - objet contenant les noms et valeurs des différents attributs
+ */
+function __getAttributes (node) {
+    if (node.attributes.length > 0) {
+        var nodeAttributes = {};
+        var attributes = node.attributes;
+        for (var i = 0; i < attributes.length; i++) {
+            var attribute = attributes[i];
+            nodeAttributes[attribute.nodeName] = attribute.nodeValue;
+        }
+        return nodeAttributes;
+    }
+}
+
+/**
+ * Récupération des noeuds enfants (seulement de type ELEMENT), à partir d'un noeud donné, pour lecture (readNode).
+ *
+ * @private
+ * @memberof AutoConfResponseReader
+ * @method __getChildNodes
+ * @param {DOMElement} node - a DOM node
+ * @param {Array|Object} [data] - an object to be filled with node data
+ */
+function __getChildNodes (node, data) {
+    if (node.hasChildNodes()) {
+        var children = node.childNodes;
+        var child;
+        var childName;
+        var childPrefix;
+
+        for (var i = 0; i < children.length; i++) {
+            child = children[i];
+
+            if (child.nodeType === 1) { // 1 === node.ELEMENT_NODE
+                childName = child.localName || child.baseName || child.nodeName;
+                childPrefix = child.prefix || AutoConfResponseReader.DEFAULTPREFIX;
+
+                if (AutoConfResponseReader.READERS[childPrefix][childName]) {
+                    var reader = AutoConfResponseReader.READERS[childPrefix][childName];
+                    reader(child, data);
+                } else {
+                    __getChildNodes(child, data);
+                }
+            }
+        }
+    }
+}
+
+/**
+ * Lecture de la valeur du premier child d'un noeud, si elle existe.
+ *
+ * @private
+ * @memberof AutoConfResponseReader
+ * @method __getChildValue
+ * @param {DOMElement} node - a DOM node
+ * @return {String} value - valeur du firstChild du noeud en entrée, ou chaîne vide.
+ */
+function __getChildValue (node) {
+    var textNode;
+    var value = "";
+
+    if (node.hasChildNodes()) {
+        textNode = node.firstChild;
+        if (textNode.nodeType === 3 || textNode.nodeType === 4) { // 3 === node.TEXT_NODE
+            value = textNode.nodeValue;
+        }
+    }
+    return value;
+}
+
+/**
+ * Vérification des attributs du service, dans la balise XLS de la réponse :
+ *      version, namespaces, et namespace par défaut doivent correspondre à ceux attendus.
+ *
+ * @private
+ * @memberof AutoConfResponseReader
+ * @method __checkServiceAttributes
+ * @param {DOMElement} viewContextNode - a DOM node, corresponding to XLS first tag.
+ */
+function __checkServiceAttributes (viewContextNode) {
+    if (viewContextNode.attributes.length > 0) {
+        // on récupère et parcourt les attributs de la balise XLS de la réponse
+        var xlsAttributes = __getAttributes(viewContextNode);
+        for (var att in xlsAttributes) {
+            if (xlsAttributes.hasOwnProperty(att)) {
+                // vérification de la version
+                if (att === "version") {
+                    if (xlsAttributes["version"] !== AutoConfResponseReader.VERSION) {
+                        console.log("[AutoConfResponseReader] autoconf version is not the expected one : there may be errors in parsing");
+                        return;
+                    }
+                }
+
+                // on vérifie que l'uri du namespace par défaut est bien celle que l'on attend
+                if (att === "xmlns") {
+                    if (xlsAttributes[att] !== AutoConfResponseReader.NAMESPACES.xmlns) {
+                        console.log("[AutoConfResponseReader] autoconf response default namespace is not the expected one");
+                        return;
+                    }
+                    continue;
+                }
+
+                var prefix = att.split(":")[0];
+                var ns = att.split(":")[1];
+
+                // si on a un autre xmlns, on vérifie aussi les URI
+                if (prefix === "xmlns" && ns) {
+                    // si l'attribut correspond à un namespace défini dans le reader
+                    if (AutoConfResponseReader.NAMESPACES[ns]) {
+                        // il faut que les URI correspondent aussi.
+                        if (AutoConfResponseReader.NAMESPACES[ns] !== xlsAttributes[att]) {
+                            console.log("[AutoConfResponseReader] autoconf response " + att + " namespace is not the expected one");
+                            return;
+                        }
+                    }
+                }
+
+                // pour finir on vérifie la localisation du schema XSD du service
+                if (ns === "schemaLocation") {
+                    if (xlsAttributes[att] !== AutoConfResponseReader.SCHEMALOCATION[0] && xlsAttributes[att] !== AutoConfResponseReader.SCHEMALOCATION[1]) {
+                        console.log("[AutoConfResponseReader] autoconf response schema location is not the expected one");
+                        return;
+                    }
+                }
+            }
+        }
+    }
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (AutoConfResponseReader);
+
+
+/***/ }),
+/* 73 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Response object for {@link module:Services~getConfig Gp.Services.getConfig ()} invocation when successful. Received as the argument of onSuccess callback function.
+ *
+ * @property {Object} generalOptions - General properties for default map configuration resources.
+ * @property {Object} generalOptions.apiKeys - Object that associates apiKey (s) with an array of resources IDs availables with that key.
+ * @property {String} generalOptions.title - Underlying web service Title.
+ * @property {String} generalOptions.defaultGMLGFIStyle - XSL URL used by default to translate an XML GetFeatureInfo response into an HTML array.
+ * @property {String} generalOptions.theme - default theme (FIXME : for what ?)
+ * @property {Array.<Float>} generalOptions.wgs84Resolutions - geographical resolutions Array for each [zoom level of the Geoportal platform]{@link http://api.ign.fr/tech-docs-js/webmaster/layers.html#Geoportal_resolutions} from 0 to 21. Expressed in degrees/pixel.
+ * @property {Object} layers - Associative array mapping resources availables IDs (keys) with their properties (values given as {@link Gp.Services.Config.Layer}).
+ * @property {Object} territories - Associative array mapping french territories IDs (keys) with their properties (values given as {@link Gp.Services.Config.Territory}).
+ * @property {Object} tileMatrixSets - Associative Array mapping TileMatrixSets IDs (keys) availables with their properties (values given as {@link Gp.Services.Config.TileMatrixSet}).
+ * @property {Object} services - Associative Array mapping Geoportal web services IDs (keys) availables with their properties (values given as {@link Gp.Services.Config.Service}).
+ *
+ * @namespace
+ * @alias Gp.Services.GetConfigResponse
+ */
+function AutoConfResponse () {
+    if (!(this instanceof AutoConfResponse)) {
+        throw new TypeError("AutoConfResponse constructor cannot be called as a function.");
+    }
+
+    this.generalOptions = {
+        apiKeys : {},
+        title : null,
+        defaultGMLGFIStyle : null,
+        theme : null,
+        wgs84Resolutions : []
+    };
+
+    this.layers = {};
+
+    this.territories = {};
+
+    this.tileMatrixSets = {};
+
+    this.services = {};
+}
+
+AutoConfResponse.prototype = {
+
+    /*
+     * Constructor (alias)
+     */
+    constructor : AutoConfResponse,
+
+    /**
+     * Check if config is loaded for a given key
+     *
+     * @param {String} apiKey - Access key to Geoportal platform
+     * @returns {Boolean} isConfLoaded - true if config is already loaded, false otherwise
+     */
+    isConfLoaded : function (apiKey) {
+        if (!apiKey) {
+            return;
+        }
+        if (this.generalOptions.apiKeys[apiKey]) {
+            return true;
+        }
+        return false;
+    },
+
+    /**
+     * Returns an array of Geoportal layers identifiers, corresponding to an API contract key.
+     *
+     * @param {String} apiKey - Access key to Geoportal platform
+     * @returns {Array} apiKeys - Array of geoportal layers identifiers
+     */
+    getLayersId : function (apiKey) {
+        return this.generalOptions.apiKeys[apiKey];
+    },
+
+    /**
+     * Returns an associative array of Geoportal layers configurations, corresponding to an API contract key.
+     * If no key is specified, all layers from configuration are returned.
+     *
+     * @param {String} apiKey - Access key to Geoportal platform
+     * @returns {Object} layers - Object which properties are layers identifiers, and corresponding
+     *      values are instances of <Gp.Services.Config.Layer>.
+     */
+    getLayersConf : function (apiKey) {
+        var layers = {};
+        var layersIdArray = this.getLayersId(apiKey);
+        if (layersIdArray) {
+            for (var i = 0; i < layersIdArray.length; i++) {
+                var lyrId = layersIdArray[i];
+                layers[lyrId] = this.layers[lyrId];
+            }
+        }
+        return layers;
+    },
+
+    /**
+     * Returns a geoportal layer configuration, given its identifier
+     *
+     * @param {String} layerId - Geoportal layer identifier (e.g. "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS")
+     * @return {Object} layer - Layer configuration : instance of {@link Gp.Services.Config.Layer}
+     */
+    getLayerConf : function (layerId) {
+        if (!this.layers) {
+            return;
+        }
+        return this.layers[layerId];
+    },
+
+    /**
+     * Returns an associative array of Tile Matrix Sets configurations.
+     *
+     * @return {Object} tileMatrixSets - Object which properties are TMS identifiers,
+     *      and corresponding values are instances of {@link Gp.Services.Config.TileMatrixSet}.
+     */
+    getTileMatrixSets : function () {
+        return this.tileMatrixSets;
+    },
+
+    /**
+     * Returns a Tile Matrix Sets configuration, given its identifier.
+     *
+     * @param {String} tmsID - Tile Matrix Set identifier (e.g. : "PM")
+     * @return {Object} tileMatrixSet - Tile Matrix Set configuration, instance of {@link Gp.Services.Config.TileMatrixSet}
+     */
+    getTMSConf : function (tmsID) {
+        if (!this.tileMatrixSets) {
+            return;
+        }
+        return this.tileMatrixSets[tmsID];
+    },
+
+    /**
+     * Returns an associative array of territories configurations.
+     *
+     * @return {Object} territories - Object which properties are territory identifiers,
+     *      and corresponding values are instances of {@link Gp.Services.Config.Territory}.
+     */
+    getTerritories : function () {
+        return this.territories;
+    },
+
+    /**
+     * Returns a territory configuration, given its identifier.
+     *
+     * @param {String} territoryID - territory identifier (e.g. "FXX")
+     * @return {Object} territory - Territory configuration, instance of {@link Gp.Services.Config.Territory}
+     */
+    getTerritoryConf : function (territoryID) {
+        if (!this.territories) {
+            return;
+        }
+        return this.territories[territoryID];
+    },
+
+    /**
+     * Returns an associative array of services configurations.
+     *
+     * @return {Object} services - Object which properties are services identifiers,
+     *      and corresponding values are instances of {@link Gp.Services.Config.Service}.
+     */
+    getServices : function () {
+        return this.services;
+    },
+
+    /**
+     * Returns a service configuration, given its identifier.
+     *
+     * @param {String} serviceID - service identifier (e.g. "OGC:WMTS")
+     * @return {Object} service - service configuration, instance of {@link Gp.Services.Config.Service}
+     */
+    getServiceConf : function (serviceID) {
+        if (!this.services) {
+            return;
+        }
+        return this.services[serviceID];
+    }
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AutoConfResponse);
+
+
+/***/ }),
+/* 74 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ *
+ * Object used to express a geographical (BBOX, scale) and temporal constraint.
+ *
+ * @property {String} crs - Coordinates System ID used to express coordinates contraints.
+ * @property {Gp.BBox} bbox - Constraint Bounding Box.
+ * @property {Number} minScaleDenominator - Minimum scale denominator where constraint applies.
+ * @property {Number} maxScaleDenominator - Maximum scale denominator where constraint applies.
+ * @property {Array.<String>} temporalExtent - Array expressing the time interval of the constraint [minT, maxT]. Dates are expressed in the [ISO-8601]{@link https://en.wikipedia.org/wiki/ISO_8601} way.
+ *
+ * @namespace
+ * @alias Gp.Services.Config.Constraint
+ */
+
+function Constraint () {
+    if (!(this instanceof Constraint)) {
+        throw new TypeError("Constraint constructor cannot be called as a function.");
+    }
+
+    this.crs = null;
+
+    this.bbox = {
+        left : null,
+        right : null,
+        top : null,
+        bottom : null
+    };
+
+    this.minScaleDenominator = null;
+
+    this.maxScaleDenominator = null;
+
+    this.temporalExtent = [null, null];
+}
+
+Constraint.prototype = {
+
+    constructor : Constraint
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Constraint);
+
+
+/***/ }),
+/* 75 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Object used to describe a format to use with Geoportal resources.
+ *
+ * @property {Boolean} current - If true, then this format is used by default.
+ * @property {String} name - Format mime-type.
+ *
+ * @namespace
+ * @alias Gp.Services.Config.Format
+ */
+
+function Format () {
+    if (!(this instanceof Format)) {
+        throw new TypeError("Format constructor cannot be called as a function.");
+    }
+
+    this.current = null;
+
+    this.name = null;
+}
+
+Format.prototype = {
+
+    constructor : Format
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Format);
+
+
+/***/ }),
+/* 76 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Object used to describe geoportal resource (WMTS, WMS, WFS layers, geocoding resources or elevation service) parameters. Properties may be used or not depending on the resource type.
+ *
+ * @property {String} name - name of the resource to use with the webservice that serves it (eg : "GEOGRAPHICALGRIDSYSTEMS.MAPS").
+ * @property {String} title - Human readable name for the resource.
+ * @property {String} description - Resource description.
+ * @property {String} layerId - Unique resource Identifier (eg : "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS")
+ * @property {String} quicklookUrl - Image URL for the resource.
+ * @property {Object} serviceParams - Informations about the webservice that serves the resource (OpenLS, WFS, WMTS)
+ * @property {String} serviceParams.id - Web Service identifier ("OGC:WMTS", "OGC:OPENLS;ReverseGeocode", etc...)
+ * @property {Object} serviceParams.serverUrl - Associative array mapping geoportal access key (keys) with their properties (URLs of the web service, with the geoportal access key).
+ * @property {String} serviceParams.version - webservice version.
+ * @property {String} defaultProjection - coordinates system ID used by default for the resource (WMS or WFS layer) or of the TileMatrixSet used by the WMTS layer.
+ * @property {Array.<String>} additionalProjections - additional coordinates systems IDs availables for the resource, others than the default one (see defaultProjection) (WMS and WFS layers only).
+ * @property {Array.<Gp.Services.Config.Format>} formats - Formats availables for the resource.
+ * @property {Array.<Gp.Services.Config.Legend>} legends - Informations about legends associated to the resource.
+ * @property {Array.<Gp.Services.Config.Metadata>} metadata - Informations about metadata associated to the resource.
+ * @property {Array.<Gp.Services.Config.Style>} styles - Informations about styles availables for the resources (WMS, WFS and WMTS only).
+ * @property {Array.<Gp.Services.Config.Thematic>} thematics - Informations about thematics associated to the resource.
+ * @property {Gp.Services.Config.Constraint} globalConstraint - geographical constraint for the resource.
+ * @property {Array.<Gp.Services.Config.Constraint>} constraints - additionnal geographical constraints for the resource.
+ * @property {Array.<Gp.Services.Config.Originator>} originators - Informations about originator of the resource.
+ * @property {Object} wmtsOptions - Informations associated to WMTS resources.
+ * @property {String} wmtsOptions.tileMatrixSetLink - TileMatrixSet identifier used by the resource (see {@link Gp.Services.Config.TileMatrixSet})
+ * @property {Gp.Services.Config.TileMatrixLimit} wmtsOptions.tileMatrixSetLimits - limits of the resource for that TileMAtrixSet.
+ * @property {Boolean} queryable - true if a getFeatureInfo request may be done for the resource (WMS or WMTS only).
+ * @property {Boolean} hidden - true if the resource is not visible.
+ * @property {Boolean} isAggregate - true if the resource is an aggregate of other resources (@see aggregatedLayers).
+ * @property {Array.<String>} aggregatedLayers - Layers IDs composing the being described aggregated layer.
+ * @property {Array.<String>} apiKeys - Array of access keys that grant access to that resource.
+ * @property {Object} dimensions - Dimensions informations associated with the resource.
+ * @property {String} dimensions.type
+ * @property {String} dimensions.visibilityRange
+ * @property {String} dimensions.visibilityMode
+ * @property {String} dimensions.noDataValue
+ * @property {String} dimensions.geometricType
+ *
+ * @namespace
+ * @alias Gp.Services.Config.Layer
+ */
+function Layer () {
+    if (!(this instanceof Layer)) {
+        throw new TypeError("Layer constructor cannot be called as a function.");
+    }
+
+    // info : une instance de la classe Layer n'a aucune propriété au départ,.
+    // les attributs possibles sont documentés ci-dessus,
+    // et seront implémentés au fur et à mesure de la lecture de la réponse de l'autoconf, lorsque l'information est rencontrée.
+}
+
+Layer.prototype = {
+
+    constructor : Layer,
+
+    /**
+     * Returns the layer name
+     *
+     * @returns {String} name - name of the resource to use with the webservice that serves it (eg : "GEOGRAPHICALGRIDSYSTEMS.MAPS").
+     */
+    getName : function () {
+        return this.name;
+    },
+
+    /**
+     * Returns the layer title
+     *
+     * @returns {String} title - Human readable name for the resource.
+     */
+    getTitle : function () {
+        return this.title;
+    },
+
+    /**
+     * Returns the layer description
+     *
+     * @returns {String} description - Resource description.
+     */
+    getDescription : function () {
+        return this.description;
+    },
+
+    /**
+     * Returns the layer identifier
+     *
+     * @returns {String} layerId - Unique resource Identifier (eg : "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS")
+     */
+    getLayerId : function () {
+        return this.layerId;
+    },
+
+    /**
+     * Returns the layer quicklookUrl
+     *
+     * @returns {String} quicklookUrl - Image URL for the resource.
+     */
+    getQuicklookUrl : function () {
+        return this.quicklookUrl;
+    },
+
+    /**
+     * Returns the layer default projection
+     *
+     * @returns {String} defaultProjection - coordinates system ID used by default for the resource (WMS or WFS layer) or of the TileMatrixSet used by the WMTS layer.
+     */
+    getDefaultProjection : function () {
+        return this.defaultProjection;
+    },
+
+    /**
+     * Returns the layer projections
+     *
+     * @returns {Array.<String>} projections - coordinates systems IDs availables for the resource, including the default one.
+     */
+    getProjections : function () {
+        var projections = [];
+        projections.push(this.defaultProjection);
+        var proj = projections.concat(this.additionalProjections);
+        return proj;
+    },
+
+    /**
+     * Returns the global BBOX
+     *
+     * @returns {Gp.BBox} bbox - the layer global bounding box, expressed in CRS system.
+     */
+    getBBOX : function () {
+        if (!this.globalConstraint) {
+            return;
+        }
+        return this.globalConstraint.bbox;
+    },
+
+    /**
+     * Returns the layer minimum scale denominator
+     *
+     * @returns {Number} minScaleDenominator - minimum scale denominator for this layer
+     */
+    getMinScaleDenominator : function () {
+        if (!this.globalConstraint) {
+            return;
+        }
+        return this.globalConstraint.minScaleDenominator;
+    },
+
+    /**
+     * Returns the layer maximum scale denominator
+     *
+     * @returns {Number} maxScaleDenominator - maximum scale denominator for this layer
+     */
+    getMaxScaleDenominator : function () {
+        if (!this.globalConstraint) {
+            return;
+        }
+        return this.globalConstraint.maxScaleDenominator;
+    },
+
+    /**
+     * Returns layer Tile Matrix Set identifier if exists
+     *
+     * @returns {String} tileMatrixSetLink - Tile Matrix Set identifier (for instance : "PM")
+     */
+    getTMSID : function () {
+        if (this.wmtsOptions) {
+            return this.wmtsOptions.tileMatrixSetLink;
+        }
+    },
+
+    /**
+     * Returns information about the webservice that serves the resource
+     *
+     * @returns {Object} serviceParams - Information about the webservice that serves the resource (OpenLS, WFS, WMTS)
+     */
+    getServiceParams : function () {
+        return this.serviceParams;
+    },
+
+    /**
+     * Returns Geoportal server url for a given key
+     *
+     * @param {String} apiKey - Access key to Geoportal platform
+     * @returns {String} serverUrl - general URL of the web service (with the geoportal access key)
+     */
+    getServerUrl : function (apiKey) {
+        if (!apiKey || !this.serviceParams || !this.serviceParams.serverUrl) {
+            return;
+        }
+        return this.serviceParams.serverUrl[apiKey];
+    },
+
+    /**
+     * Returns information about legends associated to the resource.
+     *
+     * @returns {Array.<Gp.Services.Config.Legend>} legends - Informations about legends associated to the resource.
+     */
+    getLegends : function () {
+        return this.legends;
+    },
+
+    /**
+     * Returns information about metadata associated to the resource.
+     *
+     * @returns {Array.<Gp.Services.Config.Metadata>} metadata - Informations about metadata associated to the resource.
+     */
+    getMetadata : function () {
+        return this.metadata;
+    },
+
+    /**
+     * Returns information about styles availables for the resources (WMS, WFS and WMTS only).
+     *
+     * @returns {Array.<Gp.Services.Config.Style>} styles - Informations about styles availables for the resources (WMS, WFS and WMTS only).
+     */
+    getStyles : function () {
+        return this.styles;
+    },
+
+    /**
+     * Returns layer default style
+     *
+     * @returns {String} styleName - style identifier (eg : "normal", "bdparcellaire", ...)
+     */
+    getDefaultStyle : function () {
+        if (!this.styles) {
+            return;
+        }
+        var style;
+        var s = this.styles;
+        for (var i = 0; i < s.length; i++) {
+            if (s[i].current === true) {
+                style = s[i].name;
+                break;
+            }
+        }
+        return style;
+    },
+
+    /**
+     * Returns information about thematics associated to the resource.
+     *
+     * @returns {Array.<Gp.Services.Config.Thematic>} thematics - Informations about thematics associated to the resource.
+     */
+    getThematics : function () {
+        return this.thematics;
+    },
+
+    /**
+     * Returns layer default format
+     *
+     * @returns {String} formatName - Format mime-type. (eg. "image/jpeg")
+     */
+    getDefaultFormat : function () {
+        if (!this.formats) {
+            return;
+        }
+        var format;
+        var f = this.formats;
+        for (var i = 0; i < f.length; i++) {
+            if (f[i].current === true) {
+                format = f[i].name;
+                break;
+            }
+        }
+        return format;
+    },
+
+    /**
+     * Returns information about geographical or temporal constraints for the resource
+     *
+     * @returns {Array.<Gp.Services.Config.Constraint>} constraints - Informations about geographical or temporal constraints for the resource
+     */
+    getConstraints : function () {
+        return this.constraints;
+    },
+
+    /**
+     * Returns information about originators of this resource
+     *
+     * @returns {Array.<Gp.Services.Config.Originator>} originators - Informations about originators of this resource
+     */
+    getOriginators : function () {
+        return this.originators;
+    },
+
+    /**
+     * Returns information about dimensions associated with this resource
+     *
+     * @returns {Object} dimensions - Dimensions informations associated with the resource.
+     */
+    getDimensions : function () {
+        return this.dimensions;
+    },
+
+    /**
+     * Returns information about aggregated layers composing the being described layer, in case the resource is an aggregate of other resources.
+     *
+     * @returns {Object} aggregatedLayers - Layers IDs composing the being described aggregated layer.
+     */
+    getAggregatedLayers : function () {
+        if (this.isAggregate) {
+            return this.aggregatedLayers;
+        } else {
+
+        }
+    }
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Layer);
+
+
+/***/ }),
+/* 77 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Object used to describe a legend file associated with a geoportal resource (WMTS, WMS, WFS layers).
+ *
+ * @property {String} format - mime-type of the legend file.
+ * @property {String} url - legend file URL
+ * @property {Number} minScaleDenominator - minimum scale denominator where this legend applies.
+ *
+ * @namespace
+ * @alias Gp.Services.Config.Legend
+ */
+
+function Legend () {
+    if (!(this instanceof Legend)) {
+        throw new TypeError("Legend constructor cannot be called as a function.");
+    }
+
+    this.format = null;
+
+    this.url = null;
+
+    this.minScaleDenominator = null;
+}
+
+Legend.prototype = {
+
+    constructor : Legend
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Legend);
+
+
+/***/ }),
+/* 78 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Object used to describe a metadata file associated with a geoportal resource.
+ *
+ * @property {String} format - mime-type of the metadata file.
+ * @property {String} url - metadata file URL
+ *
+ * @namespace
+ * @alias Gp.Services.Config.Metadata
+ */
+
+function Metadata () {
+    if (!(this instanceof Metadata)) {
+        throw new TypeError("Metadata constructor cannot be called as a function.");
+    }
+
+    this.format = null;
+
+    this.url = null;
+}
+
+Metadata.prototype = {
+
+    constructor : Metadata
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Metadata);
+
+
+/***/ }),
+/* 79 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Object used to describe an Originator of geoportal resource.
+ *
+ * @property {String} name - originator name
+ * @property {String} attribution - originator full name
+ * @property {String} logo - originator logo file URL
+ * @property {String} url - originator web site URL
+ * @property {Array.<Gp.Services.Config.Constraint>} constraints - where and when the originator applies for the ressource.
+ *
+ * @namespace
+ * @alias Gp.Services.Config.Originator
+ */
+
+function Originator () {
+    if (!(this instanceof Originator)) {
+        throw new TypeError("Originator constructor cannot be called as a function.");
+    }
+
+    this.name = null;
+
+    this.attribution = null;
+
+    this.logo = null;
+
+    this.url = null;
+
+    this.constraints = [];
+}
+
+Originator.prototype = {
+
+    constructor : Originator
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Originator);
+
+
+/***/ }),
+/* 80 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Object used to describe a web service of the geoportal platform.
+ *
+ * @property {String} title - Web service name
+ * @property {Object} serverUrl - Associative array mapping geoportal access key (keys) with their properties (URLs of the web service, with the geoportal access key).
+ * @property {String} version - web service version.
+ *
+ * @namespace
+ * @alias Gp.Services.Config.Service
+ */
+function Service () {
+    if (!(this instanceof Service)) {
+        throw new TypeError("Service constructor cannot be called as a function.");
+    }
+
+    this.title = null;
+
+    this.serverUrl = null;
+
+    this.version = null;
+}
+
+Service.prototype = {
+
+    constructor : Service
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Service);
+
+
+/***/ }),
+/* 81 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Object used to describe a style that may be used for a geoportal resource.
+ *
+ * @property {String} name - Style identifier (eg : "normal", "bdparcellaire", ...)
+ * @property {String} title - human readable name of the style.
+ * @property {Boolean} current - true if this is the default style.
+ * @property {String} url - Url Style (eg: vectortile).
+ *
+ * @namespace
+ * @alias Gp.Services.Config.Style
+ */
+
+function Style () {
+    if (!(this instanceof Style)) {
+        throw new TypeError("Style constructor cannot be called as a function.");
+    }
+
+    this.name = null;
+
+    this.title = null;
+
+    this.current = null;
+
+    this.url = null;
+}
+
+Style.prototype = {
+
+    constructor : Style
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Style);
+
+
+/***/ }),
+/* 82 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Object used to describe properties of a french territory covered by geoportal resources.
+ *
+ * @property {Boolean} isDefault - if this territory is to use by default.
+ * @property {String} defaultCRS - Identifier of the coordinates system to use by default for that territory.
+ * @property {Array.<String>} additionalCRS - Identifiers of additional coordinates systems availables for that territory.
+ * @property {Array.<String>} defaultLayers - Identifiers of layers to load by default for that territory.
+ * @property {Object} defaultOptions - options to use by default for that territory.
+ * @property {Number} defaultOptions.resolution - resolution to use by default for that territory (in meter per pixel).
+ * @property {Number} defaultOptions.minScaleDenominator - minimum scaleDenominator accessible for that territory.
+ * @property {Number} defaultOptions.maxScaleDenominator - maximum scaleDenominator accessible for that territory.
+ * @property {Gp.BBox} geoBBox - Bounding Box of the territory (expressed in geographical coordinates)
+ * @property {Object} geoCenter - center of the territory (expressed in geographical coordinates)
+ * @property {Float} geoCenter.lon - center longitude
+ * @property {Float} geoCenter.lat - center latitude
+ *
+ * @namespace
+ * @alias Gp.Services.Config.Territory
+ */
+function Territory () {
+    if (!(this instanceof Territory)) {
+        throw new TypeError("Territory constructor cannot be called as a function.");
+    }
+
+    this.isDefault = null;
+
+    this.defaultCRS = null;
+
+    this.additionalCRS = [];
+
+    this.geoBBOX = {
+        left : null,
+        right : null,
+        top : null,
+        bottom : null
+    };
+
+    this.geoCenter = {
+        lon : null,
+        lat : null
+    };
+
+    this.defaultOptions = {
+        resolution : null,
+        minScaleDenominator : null,
+        maxScaleDenominator : null
+    };
+
+    this.defaultLayers = [];
+}
+
+Territory.prototype = {
+
+    constructor : Territory
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Territory);
+
+
+/***/ }),
+/* 83 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Object used to describe a thematic
+ *
+ * @property {String} name - Thematic name
+ * @property {Boolean} inspire - true if the thematic name is an [INSPIRE one]{@link http://inspire.ec.europa.eu/index.cfm/pageid/2/list/7}.
+ *
+ * @namespace
+ * @alias Gp.Services.Config.Thematic
+ */
+
+function Thematic () {
+    if (!(this instanceof Thematic)) {
+        throw new TypeError("Thematic constructor cannot be called as a function.");
+    }
+
+    this.inspire = null;
+
+    this.name = null;
+}
+
+Thematic.prototype = {
+
+    constructor : Thematic
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Thematic);
+
+
+/***/ }),
+/* 84 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ *
+ * Object used to describe a TileMatrix set (for WMTS use).
+ *
+ * @property {Array.<String>} matrixIds - Array of IDs for each TileMatrix of the set.
+ * @property {Array.<Gp.Services.Config.TileMatrix>} tileMatrices - Array of TileMatrix descriptions.
+ * @property {Array.<Float>} nativeResolutions - Array of resolutions (in meter per pixel) applying for each TileMatrix of the set.
+ * @property {String} projection - Identifier of the Cordinates System used for the tileMatrixSet.
+ *
+ * @namespace
+ * @alias Gp.Services.Config.TileMatrixSet
+ */
+function TileMatrixSet () {
+    if (!(this instanceof TileMatrixSet)) {
+        throw new TypeError("TileMatrixSet constructor cannot be called as a function.");
+    }
+
+    this.projection = null;
+
+    this.nativeResolutions = [];
+
+    this.matrixIds = [];
+
+    this.tileMatrices = {};
+}
+
+TileMatrixSet.prototype = {
+
+    constructor : TileMatrixSet,
+
+    /**
+     * Returns Tile Matrix Set resolutions
+     *
+     * @returns {Array} nativeResolutions - Array of resolutions (in meter per pixel) applying for each TileMatrix of the set.
+     */
+    getResolutions : function () {
+        return this.nativeResolutions;
+    },
+
+    /**
+     * Returns Tile Matrix Set identifiers
+     *
+     * @returns {Array} matrixIds - Array of IDs for each TileMatrix of the set.
+     */
+    getMatrixIds : function () {
+        return this.matrixIds;
+    },
+
+    /**
+     * Returns Tile Matrix Set projection
+     *
+     * @returns {String} projection - Identifier of the Cordinates System used for the tileMatrixSet.
+     */
+    getProjection : function () {
+        return this.projection;
+    },
+
+    /**
+     * Returns Tile Matrices descriptions.
+     *
+     * @returns {Array.<Gp.Services.Config.TileMatrix>} tileMatrices - Array of TileMatrix descriptions.
+     */
+    getTileMatrices : function () {
+        return this.tileMatrices;
+    },
+
+    /**
+     * Returns top left corner point of matrices
+     *
+     * @returns {Gp.Point} topLeftCorner - Top Left Corner Point of TMS matrices, expressed in the tileMatrixSet coordinates system.
+     */
+    getTopLeftCorner : function () {
+        var topLeftCorner;
+        var matrices = this.getTileMatrices();
+        if (matrices) {
+            for (var id in matrices) {
+                if (matrices.hasOwnProperty(id)) {
+                    topLeftCorner = matrices[id].topLeftCorner;
+                    break;
+                }
+            }
+        }
+        return topLeftCorner;
+    }
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (TileMatrixSet);
+
+
+/***/ }),
+/* 85 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Object used to describe a TileMatrix.
+ *
+ * @property {String} matrixId - matrix Identifier
+ * @property {Number} matrixHeight - Number of tiles from the top to the bottom of the matrix.
+ * @property {Number} matrixWidth - Number of tiles from the left to the right of the matrix.
+ * @property {Number} scaleDenominator - Scale denominator associated to that matrix.
+ * @property {Number} tileHeight - tile height in number of pixels
+ * @property {Number} tileWidth - tile width in number of pixels
+ * @property {Gp.Point} topLeftCorner - Top Left Corner Point of the matrix expressed in the tileMatrixSet coordinates system.
+ *
+ * @namespace
+ * @alias Gp.Services.Config.TileMatrix
+ */
+
+function TileMatrix () {
+    if (!(this instanceof TileMatrix)) {
+        throw new TypeError("TileMatrix constructor cannot be called as a function.");
+    }
+
+    this.matrixId = null;
+
+    this.matrixHeight = null;
+
+    this.matrixWidth = null;
+
+    this.scaleDenominator = null;
+
+    this.tileHeight = null;
+
+    this.tileWidth = null;
+
+    this.topLeftCorner = null;
+}
+
+TileMatrix.prototype = {
+
+    constructor : TileMatrix,
+
+    /**
+     * Returns top left corner point of the matrix
+     *
+     * @returns {Gp.Point} topLeftCorner - Top Left Corner Point of the matrix expressed in the tileMatrixSet coordinates system.
+     */
+    getTopLeftCorner : function () {
+        return this.topLeftCorner;
+    },
+
+    /**
+     * Returns Scale denominator associated to that matrix.
+     *
+     * @returns {Number} scaleDenominator - Scale denominator associated to that matrix.
+     */
+    getScaleDenominator : function () {
+        return this.scaleDenominator;
+    },
+
+    /**
+     * Returns tile height of matrix
+     *
+     * @returns {Number} tileHeight - tile height in number of pixels
+     */
+    getTileHeight : function () {
+        return this.tileHeight;
+    },
+
+    /**
+     * Returns tile width of matrix
+     *
+     * @returns {Number} tileWidth - tile width in number of pixels
+     */
+    getTileWidth : function () {
+        return this.tileWidth;
+    },
+
+    /**
+     * Returns matrix height (number of tiles)
+     *
+     * @returns {Number} matrixHeight - Number of tiles from the top to the bottom of the matrix.
+     */
+    getMatrixHeight : function () {
+        return this.matrixHeight;
+    },
+
+    /**
+     * Returns matrix width (number of tiles)
+     *
+     * @returns {Number} matrixWidth - Number of tiles from the left to the right of the matrix.
+     */
+    getMatrixWidth : function () {
+        return this.matrixWidth;
+    }
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (TileMatrix);
+
+
+/***/ }),
+/* 86 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Object used to describe a layer extent on a Tile Matrix.
+ *
+ * @property {Number} minTileCol - minimum column index where tile can be found on the Tile matrix.
+ * @property {Number} maxTileCol - maximum column index where tile can be found on the Tile matrix.
+ * @property {Number} minTileRow - minimum row index where tile can be found on the Tile matrix.
+ * @property {Number} maxTileCol - maximum row index where tile can be found on the Tile matrix.
+ *
+ * @namespace
+ * @alias Gp.Services.Config.TileMatrixLimit
+ */
+
+function TileMatrixLimit () {
+    if (!(this instanceof TileMatrixLimit)) {
+        throw new TypeError("TileMatrixLimit constructor cannot be called as a function.");
+    }
+
+    this.minTileRow = null;
+
+    this.maxTileRow = null;
+
+    this.minTileCol = null;
+
+    this.maxTileCol = null;
+}
+
+/**
+ * @lends module:Autoconf/Response/TileMatrixLimit
+ */
+TileMatrixLimit.prototype = {
+
+    constructor : TileMatrixLimit
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (TileMatrixLimit);
+
+
+/***/ }),
+/* 87 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45);
+/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(46);
+/* harmony import */ var _Request_DirectGeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(88);
+/* harmony import */ var _Response_DirectGeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(105);
+
+
+
+
+
+
+
+
+/**
+ * @classdesc
+ * Appel du service de géocodage direct du Géoportail :
+ *     envoi de la requête construite selon les paramètres en options,
+ *     éventuellement parsing et analyse  de la réponse,
+ *     retour d'une réponse en paramètre de la fonction onSuccess.
+ *
+ *
+ * @constructor
+ * @extends {Gp.Services.CommonService}
+ * @alias Gp.Services.Geocode
+ *
+ * @param {Object} options - options spécifiques au service (+ les options heritées)
+ *
+ * @param {String|Object} options.location - Nom de l'adresse, du toponyme, de l'unité administrative ou de la parcelle cadastrale recherchée.
+ *      Sous forme de String, la propriété permet de faire une recherche déstructurée.
+ *      Sous forme d'objet, la propriété permet de structurer la recherche.
+ *      Dans ce cas, les propriétés possibles de cet objet sont décrites ci-après.
+ *      @param {Number} [options.location.number] - Numéro du bâtiment de l'adresse recherchée, dans le cas d'une recherche structurée
+ *      (si options.location est un objet Javascript).
+ *      @param {String} [options.location.street] - Nom de la rue de l'adresse recherchée, dans le cas d'une recherche structurée
+ *      (si options.location est un objet Javascript).
+ *      @param {String} [options.location.city] - Nom de la ville de l'adresse recherchée, dans le cas d'une recherche structurée
+ *      (si options.location est un objet Javascript).
+ *      @param {Number} [options.location.postalCode] - Numéro du code postal de l'adresse recherchée, dans le cas d'une recherche structurée
+ *      (si options.location est un objet Javascript).
+ *
+ * @param {Object} [options.filterOptions] - Les propriétés possibles de cet objet sont décrites ci-après.
+ * @param {Object} [options.filterOptions.bbox] - Emprise dans laquelle on souhaite effectuer la recherche.
+ *      Les propriétés possibles de cet objet sont décrites ci-après.
+ *      @param {Float} options.filterOptions.bbox.left - Abscisse du côté gauche de la BBOX
+ *      @param {Float} options.filterOptions.bbox.right - Abscisse du côté droit de la BBOX
+ *      @param {Float} options.filterOptions.bbox.top - Ordonnée supérieure de la BBOX
+ *      @param {Float} options.filterOptions.bbox.bottom - Ordonnée inférieure de la BBOX
+ *
+ * @param {Array.<String>} [options.filterOptions.type = "StreetAddress"] - Type de l'objet recherché.
+ *      Le service de géocodage du Géoportail permet de rechercher des 'PostionOfInterest' pour des toponymes, des 'StreetAddress'
+ *      pour des adresses postales, et/ou des 'CadastralParcel' pour des parcelles cadastrales.
+ *      D'autres types pourront être rajoutés selon l'évolution du service.
+ *      Par défaut, type = ['StreetAddress'].
+ *
+ * @param {String} [options.filterOptions.[proprietes du filtre]] - Critère supplémentaire pour filtrer la recherche sous la forme
+ *      d'un couple clé/valeur à définir selon les possibilités du serveur ajouté à la requête.
+ *      Le service de géocodage du Géoportail permet de filtrer tous les résultats avec les propriétés :
+ *          "municipality", "insee", et "department".
+ *      Il permet aussi de filtrer les adresses postales avec les propriétés :
+ *          "quality", "ID", "ID_TR" et "territory".
+ *      Il permet de filtrer les toponymes avec les propriétés :
+ *          "importance", "nature" et "territory".
+ *      Enfin, il permet de filtrer les parcelles cadastrales avec les propriétés :
+ *          "sheet", "section", et "absorbedcity". Pas de valeur par défaut.
+ *
+ * @param {Number} [options.maximumResponses] - Nombre de réponses maximal que l'on souhaite recevoir.
+ *      Pas de valeur par défaut.
+ *      Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 25.
+ *
+ * @param {Boolean} [options.returnFreeForm] - Indique si l'on souhaite en réponse un localisant concaténée plutôt que structuré.
+ *      Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 'false'.
+ *
+ * @param {String} [options.srs] - Système de coordonnées dans lequel les paramètres géographiques en entrée et la réponse du service sont exprimés.
+ *      Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 'EPSG:4326'.
+ *
+ * @example
+ *   var options = {
+ *      apiKey : null,
+ *      serverUrl : 'http://localhost/service/',
+ *      protocol : 'JSONP', // JSONP|XHR
+ *      proxyURL : null,
+ *      httpMethod : 'GET', // GET|POST
+ *      timeOut : 10000, // ms
+ *      rawResponse : false, // true|false
+ *      scope : null, // this
+ *      onSuccess : function (response) {},
+ *      onFailure : function (error) {},
+ *      // spécifique au service
+ *      positions : [{lon:, lat:}, {lon:, lat:}],
+ *      (...)
+ *   };
+ * @private
+ */
+function Geocode (options) {
+    if (!(this instanceof Geocode)) {
+        throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "Geocode"));
+    }
+
+    /**
+     * Nom de la classe (heritage)
+     * FIXME instance ou classe ?
+     */
+    this.CLASSNAME = "Geocode";
+
+    // appel du constructeur par heritage
+    _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, arguments);
+
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.Geocode");
+    this.logger.trace("[Constructeur Geocode (options)]");
+
+    if (!options.location) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "location"));
+    }
+
+    // FIXME ECMAScript 5 support
+    if (typeof options.location === "object" && Object.keys(options.location).length === 0) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "location"));
+    } else if (typeof options.location === "string" && options.location.length === 0) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "location"));
+    }
+
+    // ajout des options spécifiques au service
+    this.options.location = options.location;
+
+    // on definit des filtres apr defaut
+    if (!options.filterOptions || typeof options.filterOptions !== "object") {
+        this.options.filterOptions = options.filterOptions = {
+            type : ["StreetAddress"]
+        };
+    }
+
+    // FIXME ECMAScript 5 support (valable pour un objet uniquement !)
+    // ceci permet de tester le cas où 'options.filterOptions' : {}
+    if (Object.keys(options.filterOptions).length === 0) {
+        this.options.filterOptions = {
+            type : ["StreetAddress"]
+        };
+    }
+
+    var filter = Object.keys(options.filterOptions);
+    for (var i = 0; i < filter.length; i++) {
+        var key = filter[i];
+        // on transforme certains filtres qui pourraient être numériques en string
+        var filtersCouldBeNumberList = ["department", "number", "postalCode", "insee", "importance", "ID", "IDTR", "absorbedCity", "sheet", "section", "inseeRegion", "inseeDepartment"];
+        if (filtersCouldBeNumberList.indexOf(key) !== -1 && typeof options.filterOptions[key] !== "string") {
+            options.filterOptions[key] = options.filterOptions[key].toString();
+        }
+        // on supprime les filtres vides
+        if (!options.filterOptions[key]) {
+            delete this.options.filterOptions[key];
+        }
+    }
+
+    this.options.filterOptions.type = options.filterOptions.type || ["StreetAddress"];
+    this.options.maximumResponses = options.maximumResponses || 25;
+    this.options.returnFreeForm = options.returnFreeForm || false;
+    this.options.srs = options.srs || "EPSG:4326";
+
+    // attributs d'instances
+
+    /**
+     * Format forcé de la réponse du service : "xml"
+     * sauf si l'on souhaite une reponse brute (options.rawResponse)
+     */
+    this.options.outputFormat = (this.options.rawResponse) ? "" : "xml";
+}
+
+/**
+ * @lends module:Geocode#
+ */
+Geocode.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, {
+    // todo
+    // getter/setter
+});
+
+/*
+ * Constructeur (alias)
+ */
+Geocode.prototype.constructor = Geocode;
+
+/**
+ * Création de la requête (overwrite)
+ *
+ * @param {Function} error   - callback des erreurs
+ * @param {Function} success - callback
+ */
+Geocode.prototype.buildRequest = function (error, success) {
+    var options = {
+        httpMethod : this.options.httpMethod,
+        // options specifiques du service
+        location : this.options.location,
+        returnFreeForm : this.options.returnFreeForm,
+        filterOptions : this.options.filterOptions,
+        srs : this.options.srs,
+        maximumResponses : this.options.maximumResponses
+    };
+
+    this.request = _Request_DirectGeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_4__["default"].build(options);
+
+    // on teste si la requete a bien été construite !
+    (!this.request)
+        ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_REQUEST_BUILD")))
+        : success.call(this, this.request);
+};
+
+/**
+ * Analyse de la reponse (overwrite)
+ *
+ * @param {Function} error   - callback des erreurs
+ * @param {Function} success - callback
+ */
+Geocode.prototype.analyzeResponse = function (error, success) {
+    /* INFO :
+         Etape 1 : Création de la requête
+            -> Appel du format OpenLS pour créer une requête à partir des paramètres (par exemple)
+              (soit directement une URL si GET, soit une requête XML si POST)
+            /!\ tester si apiKey && serverUrl => on ne garde que serverUrl
+            -> stockage de la requête dans this.request
+         Etape 2 : Envoi de la requête selon le bon protocole
+            -> appel du protocol JSONP ou XHR, et envoi (par ex send ()) (this.protocol)
+            -> récupération de la réponse xml dans la fonction onSuccess () (this.response)
+            -> si code HTTP 200 et pas de message d'erreur : etape 3
+            -> si code HTTP != 200 : lancement de la fonction de callback onFailure avec le message d'erreur
+         Etape 3 : Analyse de la réponse xml et construction du JSON (si rawResponse === false )
+            -> appel du parser pour récupérer le xmlDocument
+            -> appel du reader OpenLS pour lire les éléments et récupérer l'objet JSON
+               correspondant au type de géocodage (défini dans les specs)
+         Etape 4 : Lancement de la fonction de callback onSuccess avec la réponse :
+            -> xmlResponse (si rawResponse === true)
+            -> ou geocodedLocations
+    */
+
+    if (this.response) {
+        var options = {
+            response : this.response,
+            rawResponse : this.options.rawResponse,
+            onError : error,
+            onSuccess : success,
+            scope : this
+        };
+
+        _Response_DirectGeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_5__["default"].build(options);
+    } else {
+        error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY")));
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Geocode);
+
+
+/***/ }),
+/* 88 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Formats_XLS__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(89);
+/* harmony import */ var _Formats_XLS_LocationUtilityService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(93);
+/* harmony import */ var _Formats_XLS_LocationUtilityService_GeocodeFilterExtension__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(96);
+/* harmony import */ var _Request_model_StreetAddress__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(100);
+/* harmony import */ var _Request_model_PositionOfInterest__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(102);
+/* harmony import */ var _Request_model_CadastralParcel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(103);
+/* harmony import */ var _Request_model_Administratif__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(104);
+/**
+ * Creation d'une requête OpenLS en mode POST ou GET
+ * (Factory)
+ *
+ * @module DirectGeocodeRequestFactory
+ * @alias Gp.Services.Geocode.Request.DirectGeocodeRequestFactory
+ * @private
+ */
+
+
+
+
+
+
+
+
+
+var DirectGeocodeRequestFactory = {
+
+    /**
+     * interface unique
+     *
+     * @method build
+     * @static
+     * @param {Object} options - options definies dans le composant Geocode
+     *
+     * @example
+     *   var options = {
+     *      httpMethod:
+     *      // options specifiques du service
+     *      location:
+     *      returnFreeForm:
+     *      filterOptions:
+     *      srs:
+     *      maximumResponses:
+     *   };
+     *   var result = DirectGeocodeRequestFactory.build(options);
+     *   if (!result) {
+     *       // error...
+     *   }
+     * @returns {String} request
+     */
+    build : function (options) {
+        // logger
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("DirectGeocodeRequestFactory");
+        logger.trace(["DirectGeocodeRequestFactory::build()"]);
+
+        var request = null;
+
+        // gestion des filtres (table de geocodage) !
+        // par defaut, on les ajoute toute ...
+        var oFilter = new _Formats_XLS_LocationUtilityService_GeocodeFilterExtension__WEBPACK_IMPORTED_MODULE_3__["default"]();
+        oFilter.addFilterExtensions(new _Request_model_Administratif__WEBPACK_IMPORTED_MODULE_7__["default"]());
+        oFilter.addFilterExtensions(new _Request_model_StreetAddress__WEBPACK_IMPORTED_MODULE_4__["default"]());
+        oFilter.addFilterExtensions(new _Request_model_PositionOfInterest__WEBPACK_IMPORTED_MODULE_5__["default"]());
+        oFilter.addFilterExtensions(new _Request_model_CadastralParcel__WEBPACK_IMPORTED_MODULE_6__["default"]());
+
+        // objet LUS
+        // on peut aussi par un objet XLS::GeocodeRequest
+        var oLUS = new _Formats_XLS_LocationUtilityService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+            location : options.location,
+            returnFreeForm : options.returnFreeForm,
+            filterOptions : options.filterOptions
+        });
+        oLUS.addFilter(oFilter);
+
+        // Format XLS
+        var oXLS = new _Formats_XLS__WEBPACK_IMPORTED_MODULE_1__["default"]({
+            srsName : options.srs,
+            maximumResponses : options.maximumResponses
+        });
+        oXLS.namespace = true;
+        oXLS.setService(oLUS);
+
+        // request brute !
+        request = oXLS.build();
+
+        // en mode GET, la requête est encodée
+        // et le param. 'qxml' est ajouté
+        if (options.httpMethod === "GET") {
+            var myRequest = "qxml=" +
+                encodeURIComponent(request)
+                    .replace(/-/g, "%2D")
+                    .replace(/_/g, "%5F")
+                    .replace(/\./g, "%2E")
+                    .replace(/!/g, "%21")
+                    .replace(/~/g, "%7E")
+                    .replace(/\*/g, "%2A")
+                    .replace(/'/g, "%27")
+                    .replace(/\(/g, "%28")
+                    .replace(/\)/g, "%29");
+            request = myRequest;
+        }
+
+        logger.trace(request);
+
+        return request;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (DirectGeocodeRequestFactory);
+
+
+/***/ }),
+/* 89 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _XLS_RequestHeader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(90);
+/* harmony import */ var _XLS_Request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(91);
+/* harmony import */ var _XLS_AbstractService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(92);
+
+
+
+
+
+/**
+ * @classdesc
+ *
+ * standard OpenLS
+ * standard XLS
+ * (version 1.2)
+ *
+ * Réfs :
+ *     - {@link http://schemas.opengis.net/ols/1.2/}
+ *     - {@link http://www.opengeospatial.org/standards/ols}
+ *     - {@link http://wxs.ign.fr/schemas/}
+ *
+ *
+ * Création du template XLS (avec gestion des namespaces)
+ * ------------------------
+ * ```
+ *   balise xsd : element name="XLS" attribute name="version" [(attribute ref="lang")]
+ * ```
+ *
+ * Exemple :
+ * ```
+ * <XLS xmlns="http://www.opengis.net/xls" version="1.2">
+ *   < (ref. OLS) />
+ * </XLS>
+ * ```
+ * ```
+ * <xls:XLS xmlns:xls="http://www.opengis.net/xls" version="1.2">
+ *   <xls: (ref. OLS) />
+ * </xls:XLS>
+ * ```
+ *
+ * Création des templates OLS pour LocationUtilityService
+ * ------------------------------------------------------
+ *
+ * Exemple :
+ *
+ * ```
+ * <RequestHeader srsName="epsg:4326"/>
+ * <Request maximumResponses="26" methodName="GeocodeRequest" requestID="uid1349081498314_388" version="1.2">
+ *      <GeocodeRequest>
+ *          <Address countryCode="PositionOfInterest">
+ *              <freeFormAddress>saint mandé</freeFormAddress>
+ *          </Address>
+ *      </GeocodeRequest>
+ *  </Request>
+ * ```
+ * ```
+ * <RequestHeader sessionID="" />
+ * <Request methodName="ReverseGeocodeRequest" version="1.2" requestID="" maximumResponses="10">
+ *   <ReverseGeocodeRequest>
+ *     <Position>
+ *       <gml:Point xmlns:gml="http://www.opengis.net/gml">
+ *           <gml:pos>50.347775 3.205098</gml:pos>
+ *       </gml:Point>
+ *     </Position>
+ *     <ReverseGeocodePreference>StreetAddress</ReverseGeocodePreference>
+ *  </ReverseGeocodeRequest>
+ * </Request>
+ * ```
+ * ```
+ * Geocodage direct (balise xsd) :
+ *   element ref="RequestHeader" [ (attribute name="clientName" attribute name="clientPassword" attribute name="sessionID" attribute name="srsName" attribute name="MSID") ]
+ *     element name="Request" attribute name="methodName" attribute name="version" attribute name="requestID" [ attribute name="maximumResponses" ]
+ *       element name="GeocodeRequest" attribute name="returnFreeForm"
+ *         element ref="xls:Address"
+ * ```
+ * ```
+ * Geocodage inverse (balise xsd) :
+ *   element ref="RequestHeader" [ (attribute name="clientName" attribute name="clientPassword" attribute name="sessionID" attribute name="srsName" attribute name="MSID") ]
+ *     element name="Request" attribute name="methodName" attribute name="version" attribute name="requestID" [ attribute name="maximumResponses" ]
+ *       element name="ReverseGeocodeRequest"
+ *         element ref="xls:Position"
+ *         element name="ReverseGeocodePreference" (enumeration)
+ * ```
+ *
+ * Il existe 3 sous ensembles d'objets :
+ *     - RequestHeader
+ *     - Request
+ *     - ReverseGeocodeRequest, GeocodeRequest
+ *
+ * GeocodeRequest est composé d'un objet {@link Gp.Services.Geocode.Response.GeocodeLocation}.
+ * ReverseGeocodeRequest est composé d'un objet {@link Gp.Services.ReverseGeocode.Response.ReverseGeocodeLocation}.
+ *
+ * Les locations font appels aux objets suivants qui possèdent des attributs spécifiques
+ * en fonction du type de table de geocodage interrogé :
+ *     - StreetAddress
+ *     - CadastralParcel
+ *     - PositionOfInterest
+ *     - Administratif
+ *
+ *
+ * et des élements sous jacents tels que :
+ *     - ReverseGeocodePreference -> tables de geocodages :
+ *         - StreetAddress
+ *         - CadastralParcel
+ *         - PositionOfInterest
+ *         - Administratif (une balise par table)
+ *     - Position -> standard GML 3.2.1
+ *     - Address  -> cf. ci-dessous
+ *
+ * ```
+ * Position (balise xsd) :
+ *   ex. <Position><gml:Point xmlns:gml="http://www.opengis.net/gml"><gml:pos>50.347775 3.205098</gml:pos></gml:Point></Position>
+ *   ex. <Position><gml:CircleByCenterPoint xmlns:gml="http://www.opengis.net/gml"><gml:pos>48.85978570614691 2.2913572761128878</gml:pos><gml:radius>1000</gml:radius></gml:CircleByCenterPoint></Position>
+ *   (au choix)
+ *   element ref="gml:Point"
+ *   element ref="gml:CircleByCenterPoint"
+ *   element ref="gml:Polygon"
+ *   element ref="gml:MultiPolygon"
+ *   les autres elemennts ne sont pas implémentés (QoP, Speed, Direction, Time, ...)
+ *
+ * Address (balise xsd) :
+ *   ex. <Address countryCode="StreetAddress"><freeFormAddress>1 r de paris saint denis</freeFormAddress></Address>
+ *   attribute name="countryCode"
+ *     element name="freeFormAddress"
+ *     element ref="xls:Place"
+ *     element ref="gml:Envelope"
+ *  ou
+ *   ex. <Address countryCode="StreetAddress"><StreetAddress><Street>1 rue Marconi</Street></StreetAddress><Place type="Municipality">Metz</Place><PostalCode>57000</PostalCode></Address>
+ *   attribute name="countryCode"
+ *     element ref="xls:StreetAddress"
+ *     element ref="xls:PostalCode"
+ *     element ref="xls:Place"
+ *     element ref="gml:Envelope"
+ *
+ * Place  (balise xsd) :
+ *  ex. <Place type="Municipality">Metz</Place>
+ *  attribute name="type"
+ *   enumeration value="CountrySubdivision"
+ *   enumeration value="CountrySecondarySubdivision"
+ *   enumeration value="Municipality"
+ *   enumeration value="MunicipalitySubdivision"
+ *   enumeration value="choume-banchi-go"
+ *   enumeration value="Qualite"
+ *   enumeration value="Departement"
+ *   enumeration value="Bbox"
+ *   enumeration value="Commune"
+ *   enumeration value="Territoire"
+ *   enumeration value="Importance"
+ *   enumeration value="Nature"
+ *   (la liste n'est pas exhaustives...)
+ *
+ * StreetAddress (balise xsd) :
+ *   ex. <StreetAddress><Street>1 rue Marconi</Street></StreetAddress>
+ *   attribute name="locator"
+ *    element name="xls:Building"
+ *    element ref="xls:Street"
+ *
+ * Street (balise xsd) :
+ *   ex. <Street>1 rue Marconi</Street>
+ *   attribute name="officialName" (...)
+ *
+ * Building (balise xsd) :
+ *   ex. <Building number="800"/>
+ *   attribute name="number" attribute name="subdivision" attribute name="buildingName"
+ *
+ * PostalCode (balise xsd) :
+ *   ex. <PostalCode>77182</PostalCode>
+ *
+ * ```
+ *
+ * Requête
+ * -------
+ *
+ * 2 modes de requête sur les services : GET ou POST.
+ *
+ * Le mode GET n'est que l'encodage du XML en param (qxml) de la requête (donc pas d'implementation particulière ?)
+ *
+ * Modèle de classes
+ * -----------------
+ *
+ * ```
+ *                 ________  XLS ____________
+ *               /            |               \
+ *   RequestHeader      AbstractService    Request
+ *                            ^
+ *                      ______|________________________
+ *           (extends) /                               \ (extends)
+ *          LocationUtilityService                    RouteService
+ *                    |                                    |
+ *         ___________|___________                       (...)
+ *       /                        \
+ * GeocodeRequest          ReverseGeocodeRequest
+ *      |                          |
+ *      |                     _____|______
+ *      |                    /            \
+ *   Address              Preference  Position
+ *      |
+ *    /   \
+ * Place   StreetAddress
+ *               |
+ *             /   \
+ *       Street   Building
+ * ```
+ *
+ * @example
+ * // encapsule un objet 'LocationUtilityService'
+ * // dans une coquille XSL (avec/sans namespace)
+ * xsl = new XSL ();
+ * xsl.namespace = false;
+ * xsl.srsName = "epsg:4326";
+ * xsl.maximumResponses = 26;
+ * //   methodName fournit par l'objet 'lus'
+ * //   requestID est calculé
+ * xsl.setService (lus);
+ * xsl.build ();
+ * // out ->
+ * // <XLS xmlns="http://www.opengis.net/xls" version="1.2">
+ * // <RequestHeader srsName="epsg:4326"/>
+ * // <Request maximumResponses="26" methodName="GeocodeRequest" requestID="uid1349081498314_388" version="1.2">
+ * //   < (ref. LocationUtilityService ou vide) />
+ * //  </Request>
+ * // </XLS>
+ *
+ *
+ * @constructor
+ * @alias Gp.Formats.XLS
+ * @param {Object} options - options du constructeur
+ * @param {Object} options.srsName - identifiant du Systeme de Coordonnees
+ * @param {String}   options.maximumResponses - nombre de reponses max d'une requete
+ * @param {Function} options.onsuccess - function callback success (TODO)
+ * @param {Function} options.onerror   - function callback error   (TODO)
+ *
+ * @private
+ */
+function XLS (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur XLS()]");
+
+    if (!(this instanceof XLS)) {
+        throw new TypeError("XLS constructor cannot be called as a function.");
+    }
+
+    // options par defaut
+    this.options = {
+        srsName : "EPSG:4326",
+        maximumResponses : 25
+    };
+
+    // et on ajoute les options en paramètre aux options par défaut
+    for (var opt in options) {
+        if (options.hasOwnProperty(opt)) {
+            if (options[opt]) {
+                this.options[opt] = options[opt];
+            }
+        }
+    }
+}
+
+/**
+ * Version
+ */
+XLS.VERSION = "1.2";
+
+XLS.prototype = {
+
+    /**
+     * @lends module:XLS#
+     */
+
+    /**
+     * request (out)
+     * @type {String}
+     */
+    requestString : null,
+
+    /**
+     * namespace
+     * Surcharge les balises XLS d'un prefixe.
+     * Par defaut, false
+     * @type {Boolean}
+     */
+    namespace : false,
+
+    /**
+     * Objet Service
+     * LocationUtilityService ou RouteService
+     * @type {AbstractService}
+     */
+    oService : null,
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : XLS,
+
+    /**
+     * Template de la requête.
+     * substitution des valeurs suivantes :
+     * __VERSION__, __NAMESPACE__, __SCHEMALOCATION__
+     * __REQUESTHEADER__, __REQUEST__
+     */
+    template : "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+        "<XLS version=\"__VERSION__\"\n" +
+        "__NAMESPACE__ \n" +
+        "__SCHEMALOCATION__>\n" +
+        "__REQUESTHEADER__\n" +
+        "__REQUEST__\n" +
+        "</XLS>\n",
+
+    /**
+     * Namespace par defaut.
+     *
+     * @returns {String} namespace
+     */
+    namespaceByDefault : function () {
+        var ns = [
+            "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"",
+            "xmlns:xls=\"http://www.opengis.net/xls\"",
+            "xmlns:gml=\"http://www.opengis.net/gml\""
+        ];
+
+        return ns.join(" ");
+    },
+
+    /**
+     * Schemalocation par defaut
+     *
+     * @returns {String} schemaLocation
+     */
+    schemaLocationByDefault : function () {
+        return "xsi:schemaLocation=\"http://www.opengis.net/xls http://schemas.opengis.net/ols/1.2/olsAll.xsd\"";
+    },
+
+    /**
+     * Setter Service
+     * Ajout d'un objet de type LocationUtilityService (LUS) ou RouteService
+     *
+     * @param {Object} oService - GeoceodeRequest / ReverseGeocodeRequest ou RouteRequest
+     */
+    setService : function (oService) {
+        if (!oService) {
+            this.logger.trace("L'objet de type Service XSL n'est pas encore defini !?");
+            return;
+        }
+
+        if (oService instanceof _XLS_AbstractService__WEBPACK_IMPORTED_MODULE_3__["default"]) {
+            this.oService = oService;
+        } else {
+            this.logger.error("L'objet n'est pas du type 'LocationUtilityService' ou 'RouteService' !?");
+        }
+    },
+
+    /**
+     * Getter Service
+     * Retourne un objet de type LocationUtilityService (LUS) ou RouteService
+     * ex. GeoceodeRequest / ReverseGeocodeRequest ou RouteRequest
+     *
+     * @returns {Object} service (LocationUtilityService|RouteService)
+     */
+    getService : function () {
+        return this.oService;
+    }
+};
+
+/**
+ * Ajout d'un prefixe de namespace
+ *
+ * @todo impl. l'ajout de namespace
+ * @param {Object} ns - ex. {key:xls, url:http://www.opengis.net/xls}
+ * @param {String} request - requête
+ * @returns {String} requête
+ */
+XLS.prototype.addNamespace = function (ns, request) {
+    // INFO
+    // on recherche la clef dans les namespaces par defaut.
+    // si la clef n'existe pas dans les namespaceByDefault (), on l'ajoute.
+    // on surcharge toutes les balises, ex. XLS -> xls:XLS
+    // sauf celles qui sont déjà prefixées !
+
+    var keyNS = ns.key;
+    // var urlNS = ns.url; // TODO not yet implemented !
+
+    // recherche la clef dans les namespaces par defaut
+    var bFound = false;
+    var allNS = this.namespaceByDefault().split(" ");
+    for (var index = 0; index < allNS.length; index++) {
+        var element = allNS[index];
+        var map = element.split("=");
+        var key = map[0];
+        // var url = map[1]; // TODO not yet implemented !
+
+        if (key === "xmlns:" + keyNS) {
+            bFound = true;
+            break;
+        }
+    }
+
+    // TODO
+    // si on a une nouvelle clef, on l'ajoute...
+    if (!bFound) {
+        this.logger.warn("L'ajout d'un nouvel namespace n'est pas encore implémenté !");
+        return request;
+    }
+
+    // surcharge toutes les balises
+    var regex;
+    var subst;
+
+    // regex balise ouvrante
+    regex = /<(\w+[\s>])/g;
+    subst = "<" + keyNS + ":$1";
+    request = request.replace(regex, subst);
+
+    // regex balise fermante
+    regex = /<\/(\w+[\s>])/g;
+    subst = "</" + keyNS + ":$1";
+    request = request.replace(regex, subst);
+
+    this.logger.trace("namespace", request);
+
+    return request;
+};
+
+/**
+ * Construction de la requête
+ * @returns {String} requête
+ */
+XLS.prototype.build = function () {
+    // out ->
+    // <XLS xmlns="http://www.opengis.net/xls" version="1.2">
+    // <RequestHeader srsName="epsg:4326"/>
+    // <Request maximumResponses="26" methodName="GeocodeRequest" requestID="uid1349081498314_388" version="1.2">
+    //   < (ref. LocationUtilityService ou vide) />
+    //  </Request>
+    // </XLS>
+
+    // as t on un objet de type Service XLS à disposition ?
+    var bService = !!this.getService();
+
+    var template = "";
+    template = this.template;
+    template = template.replace(/__VERSION__/g, XLS.VERSION);
+    template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault);
+    template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault);
+
+    // header
+    var oHeader = new _XLS_RequestHeader__WEBPACK_IMPORTED_MODULE_1__["default"]({
+        srsName : this.options.srsName
+    });
+    template = template.replace(/__REQUESTHEADER__/g, oHeader.toString());
+
+    // request
+    var oRequest = new _XLS_Request__WEBPACK_IMPORTED_MODULE_2__["default"]({
+        maximumResponses : this.options.maximumResponses,
+        version : XLS.VERSION, // FIXME même version ?
+        methodName : bService ? this.getService().CLASSTYPE : null
+    });
+    template = template.replace(/__REQUEST__/g, oRequest.toString());
+
+    // objet lus ou route
+    if (bService) { // INFO : clef __REQUESTSERVICE__ dispo dans l'objet 'Request'
+        template = template.replace(/<!-- __REQUESTSERVICE__ -->/g, this.getService().toString());
+    }
+
+    if (!template) {
+        this.logger.warn("traduction tmpl : empty request !?");
+        return;
+    }
+
+    // ajout d'un namespace
+    if (this.namespace) {
+        // ajout de xls par defaut
+        template = this.addNamespace({
+            key : "xls",
+            url : "http://www.opengis.net/xls"
+        }, template);
+    }
+
+    this.requestString = template;
+    this.logger.trace("traduction tmpl", template);
+
+    // on retourne qqchose !
+    return this.requestString;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (XLS);
+
+
+/***/ }),
+/* 90 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+
+
+/**
+ * @classdesc
+ *
+ * Entête de la requête XSL
+ *
+ * @example
+ * // header XSL
+ * header = new RequestHeader ();
+ * header.srsName = "epsg:4326";
+ * header.toString();
+ * // out ->
+ * // <RequestHeader srsName="epsg:4326"/>
+ *
+ * @constructor
+ * @alias Gp.Formats.XLS.RequestHeader
+ * @param {Object} options - options
+ * @param {Object}   options.srsName - projection
+ * @param {Function} options.onsuccess - function callback success (TODO)
+ * @param {Function} options.onerror   - function callback error   (TODO)
+ *
+ * @private
+ */
+function RequestHeader (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur RequestHeader ()]");
+
+    if (!(this instanceof RequestHeader)) {
+        throw new TypeError("RequestHeader constructor cannot be called as a function.");
+    }
+
+    // options par defaut
+    this.options = options || {
+        srsName : "EPSG:4326"
+    };
+
+    // et on ajoute les options en paramètre aux options par défaut
+    for (var opt in options) {
+        if (options.hasOwnProperty(opt)) {
+            this.options[opt] = options[opt];
+        }
+    }
+}
+
+RequestHeader.prototype = {
+
+    /**
+     * @lends module:RequestHeader#
+     */
+
+    /**
+     * request (out)
+     * @type {String}
+     */
+    requestString : null,
+
+    /**
+     * Template de la requête.
+     * substitution des valeurs suivantes :
+     * __SRSNAME__
+     */
+    template : "<RequestHeader srsName=\"__SRSNAME__\"/>",
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : RequestHeader,
+
+    /**
+     * toString
+     * @returns {String} requête
+     */
+    toString : function () {
+        var template = null;
+        template = this.template;
+        template = template.replace(/__SRSNAME__/g, this.options.srsName);
+        this.requestString = template;
+        return this.requestString;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (RequestHeader);
+
+
+/***/ }),
+/* 91 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* jshint bitwise: false */
+
+
+/**
+ * @classdesc
+ *
+ * Requête XLS
+ *
+ * @example
+ * // request XSL
+ * request = new Request ();
+ * request.maximumResponses = 26;
+ * request.methodName = "GeocodeRequest";
+ * request.version = "1.2";
+ * request.toString();
+ * // out ->
+ * // <Request maximumResponses="26" methodName="GeocodeRequest" requestID="uid1349081498314_388" version="1.2">
+ * //   <!-- __LUS__ -->
+ * //  </Request>
+ *
+ * @constructor
+ * @alias Gp.Formats.XLS.Request
+ * @param {Object} options - options
+ * @param {Object}   options.maximumResponses - 25
+ * @param {String}   options.methodName - nom de l'objet LUS, "GeocodeRequest" | "ReverseGeocodeRequest"
+ * @param {String}   options.version - '1.2'
+ * @param {Function} options.onsuccess - function callback success (TODO)
+ * @param {Function} options.onerror   - function callback error   (TODO)
+ *
+ * @private
+ */
+function Request (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur Request ()]");
+
+    if (!(this instanceof Request)) {
+        throw new TypeError("Request constructor cannot be called as a function.");
+    }
+
+    // options par defaut
+    this.options = options || {
+        maximumResponses : 25,
+        methodName : null,
+        version : "1.2"
+    };
+
+    // et on ajoute les options en paramètre aux options par défaut
+    for (var opt in options) {
+        if (options.hasOwnProperty(opt)) {
+            this.options[opt] = options[opt];
+        }
+    }
+}
+
+Request.prototype = {
+
+    /**
+     * @lends module:Request#
+     */
+
+    /**
+     * request (out)
+     * @type {String}
+     */
+    requestString : null,
+
+    /**
+     * Template de la requête.
+     * substitution des valeurs suivantes :
+     * __MAXRESPONSES__, __METHODNAME__, __UUID__, __VERSION__
+     * __REQUESTSERVICE__
+     */
+    template : "<Request maximumResponses=\"__MAXRESPONSES__\" methodName=\"__METHODNAME__\" requestID=\"__UUID__\" version=\"__VERSION__\">" +
+        "<!-- __REQUESTSERVICE__ -->" +
+        "</Request>",
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : Request,
+
+    /**
+     * an rfc4122 version 4 compliant guid
+     * @returns {String} guid
+     */
+    guid : function () {
+        // INFO
+        // cf. http://byronsalau.com/blog/how-to-create-a-guid-uuid-in-javascript/
+        return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
+            var r = Math.random() * 16 | 0;
+            var v = c === "x" ? r : (r & 0x3 | 0x8);
+            return v.toString(16);
+        });
+    },
+
+    /**
+     * toString
+     * @returns {String} requête
+     */
+    toString : function () {
+        var template = null;
+        template = this.template;
+        template = template.replace(/__MAXRESPONSES__/g, this.options.maximumResponses);
+        template = template.replace(/__METHODNAME__/g, this.options.methodName);
+        template = template.replace(/__UUID__/g, this.guid());
+        template = template.replace(/__VERSION__/g, this.options.version);
+
+        this.requestString = template;
+        return this.requestString;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Request);
+
+
+/***/ }),
+/* 92 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+
+
+/**
+ * @classdesc
+ * @private
+ *
+ * @constructor
+ * @alias Gp.Formats.XLS.AbstractService
+ *
+ * @param {Object} [options] - options
+ */
+function AbstractService (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur AbstractService ()]");
+
+    if (!(this instanceof AbstractService)) {
+        throw new TypeError("AbstractService constructor cannot be called as a function.");
+    }
+
+    // options par defaut
+    this.options = options || {};
+
+    // et on ajoute les options en paramètre aux options par défaut
+    for (var opt in options) {
+        if (options.hasOwnProperty(opt)) {
+            this.options[opt] = options[opt];
+        }
+    }
+}
+
+/**
+ * @lends module:AbstractService#
+ */
+AbstractService.prototype = {
+
+    /**
+     * request (out)
+     * @type {String}
+     */
+    strRequest : null,
+
+    /**
+     * objet Request
+     * @type {Request}
+     */
+    oRequest : null,
+
+    /**
+     * Filter
+     * @type {FilterExtension}
+     */
+    oFilter : null,
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : AbstractService,
+
+    /**
+     * Ajout d'un objet de type Request : GeocodeRequest / ReverseGeocodeRequest / RouteRequest
+     *
+     * @param {Object} oRequest - GeocodeRequest / ReverseGeocodeRequest / RouteRequest
+     */
+    addRequest : function (oRequest) {
+        this.logger.error("overwritten method !");
+    },
+
+    /**
+     * Ajout d'un objet de type FilterExtension : GeocodeFilterExtension ou RouteRequestExtension
+     *
+     * @param {Object} oFilter - GeocodeFilterExtension ou RouteRequestExtension
+     */
+    addFilter : function (oFilter) {
+        this.logger.error("overwritten method !");
+    },
+
+    /**
+     * toString
+     */
+    toString : function () {
+        this.logger.error("overwritten method !");
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AbstractService);
+
+
+/***/ }),
+/* 93 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _AbstractService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(92);
+/* harmony import */ var _LocationUtilityService_GeocodeRequest__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(94);
+/* harmony import */ var _LocationUtilityService_ReverseGeocodeRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(97);
+/* harmony import */ var _LocationUtilityService_GeocodeFilterExtension__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(96);
+
+
+
+
+
+
+/**
+ * @classdesc
+ *
+ * Requête de type LocationUtilityService (LUS)
+ * (Factory)
+ *
+ * @example
+ * // encapsule un objet dans une coquille XSL, Factory sur les objets Geocode/ReverseGeocode
+ * lus = new LocationUtilityService ();
+ * lus.addRequest (req);
+ * lus.toString();
+ *  ou
+ * lus = new LocationUtilityService ({
+ *      location : "saint mandé",
+ *      returnFreeForm : true,
+ *      filterOptions : {
+ *          type :  ['PositionOfInterest']
+ *      }
+ * });
+ * lus.toString();
+ *
+ * // out ->
+ * // <GeocodeRequest>
+ * //   <Address countryCode="PositionOfInterest">
+ * //     <freeFormAddress>saint mandé</freeFormAddress>
+ * //   </Address>
+ * // </GeocodeRequest>
+ *
+ * // creation de l'objet Geocode
+ * req = new GeocodeRequest ();
+ * req.addAddress (new Address (/*todo/*));
+ * req.toString();
+ * // out ->
+ * // <GeocodeRequest>
+ * //   <Address countryCode="PositionOfInterest">
+ * //     <freeFormAddress>saint mandé</freeFormAddress>
+ * //   </Address>
+ * // </GeocodeRequest>
+ *
+ * // creation de l'objet ReverseGeocode
+ * req = new ReverseGeocodeRequest ();
+ * req.addPosition (new Position (position:{x: , y: }));
+ * req.addPreference (['StreetAddress']);
+ * req.toString();
+ * // out ->
+ * // <ReverseGeocodeRequest>
+ * //     <Position>
+ * //       <gml:Point xmlns:gml="http://www.opengis.net/gml">
+ * //           <gml:pos>50.347775 3.205098</gml:pos>
+ * //       </gml:Point>
+ * //     </Position>
+ * //     <ReverseGeocodePreference>StreetAddress</ReverseGeocodePreference>
+ * //  </ReverseGeocodeRequest>
+ *
+ * @constructor
+ * @alias Gp.Formats.XLS.LocationUtilityService
+ * @param {Object} options - options
+ * @param {Object}   options.location - location
+ * @param {String}   options.position - position : {x : "", y : ""}
+ * @param {String}   options.returnFreeForm - true|false
+ * @param {Object}   options.filterOptions - filtres
+ * @param {Function} options.onsuccess - function callback success (TODO)
+ * @param {Function} options.onerror   - function callback error   (TODO)
+ *
+ * @private
+ */
+function LocationUtilityService (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur LocationUtilityService ()]");
+
+    if (!(this instanceof LocationUtilityService)) {
+        throw new TypeError("LocationUtilityService constructor cannot be called as a function.");
+    }
+
+    /**
+     * Nom de la classe
+     */
+    this.CLASSNAME = "LocationUtilityService";
+
+    /**
+     * Type de classe de geocodage
+     * ex. GeocodeRequest ou ReverseGeocodeRequest
+     */
+    this.CLASSTYPE = null;
+
+    // appel du constructeur par heritage
+    _AbstractService__WEBPACK_IMPORTED_MODULE_1__["default"].apply(this, arguments);
+
+    // on determine le type de geocodage si les options sont renseignées
+    if (this.options) {
+        this.CLASSTYPE = (this.options.location) ? "GeocodeRequest" : (this.options.position) ? "ReverseGeocodeRequest" : null;
+    }
+}
+
+/**
+ * @lends module:LocationUtilityService#
+ */
+LocationUtilityService.prototype = Object.create(_AbstractService__WEBPACK_IMPORTED_MODULE_1__["default"].prototype, {
+    // todo
+    // getter/setter
+});
+
+/**
+ * Constructeur (alias)
+ */
+LocationUtilityService.prototype.constructor = LocationUtilityService;
+
+/**
+ * (overwrite) Ajout d'un objet de type LUS : GeocodeRequest ou ReverseGeocodeRequest
+ *
+ * @param {Object} oLUSRequest - objet de type LUS
+ */
+LocationUtilityService.prototype.addRequest = function (oLUSRequest) {
+    // on determine le type de geocodage
+    this.CLASSTYPE = oLUSRequest.CLASSNAME;
+
+    // on controle les types acceptés
+    switch (this.CLASSTYPE) {
+        case "GeocodeRequest":
+        case "ReverseGeocodeRequest":
+            this.oRequest = oLUSRequest;
+            break;
+        default:
+            throw new Error("Ce n'est pas un objet de type 'LUS Request' !?");
+    }
+};
+
+/**
+ * (overwrite) Ajout d'un objet de type GeocodeFilterExtension
+ *
+ * @param {Object} oFilter - objet de type Filtre
+ */
+LocationUtilityService.prototype.addFilter = function (oFilter) {
+    // FIXME gestion des filtres à partir des tables de geocodages
+    if (oFilter instanceof _LocationUtilityService_GeocodeFilterExtension__WEBPACK_IMPORTED_MODULE_4__["default"]) {
+        this.oFilter = oFilter;
+    }
+};
+
+/**
+ * (overwrite) toString
+ *
+ * @returns {String} requête
+ */
+LocationUtilityService.prototype.toString = function () {
+    // soit, on a un objet LUS Request déjà instancié
+    // sinon, il faut le construire à partir des options à disposition
+    if (!this.oRequest) {
+        // il nous faut des options
+        if (!this.options) {
+            throw new Error("Les options ne sont pas renseignées, impossible de construire la requête !");
+        }
+
+        // si les options 'location' et 'position' sont renseignées,
+        // on prendra par defaut le choix du geocodage direct
+        if (this.CLASSTYPE === "GeocodeRequest") {
+            var settingsDirect = {
+                location : this.options.location,
+                returnFreeForm : this.options.returnFreeForm,
+                filterOptions : this.options.filterOptions || {}
+            };
+            this.oRequest = new _LocationUtilityService_GeocodeRequest__WEBPACK_IMPORTED_MODULE_2__["default"](settingsDirect);
+            // ajout des filtres spécifiques au service du geocodage direct de l'IGN
+            if (this.oFilter) {
+                this.oRequest.addFilter(this.oFilter);
+            }
+        } else if (this.CLASSTYPE === "ReverseGeocodeRequest") {
+            var settingsInv = {
+                position : this.options.position,
+                returnFreeForm : this.options.returnFreeForm,
+                filterOptions : this.options.filterOptions || {}
+            };
+            this.oRequest = new _LocationUtilityService_ReverseGeocodeRequest__WEBPACK_IMPORTED_MODULE_3__["default"](settingsInv);
+        } else {
+            this.logger.error("impossible de determiner le type de geocodage : Direct ou Inverse !?");
+        }
+    }
+
+    // objet indefini !?
+    if (!this.oRequest) {
+        throw new Error("Type de Geocodage indefini !");
+    }
+
+    this.strRequest = this.oRequest.toString();
+    return this.strRequest;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (LocationUtilityService);
+
+
+/***/ }),
+/* 94 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _model_Address__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(95);
+/* harmony import */ var _GeocodeFilterExtension__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(96);
+
+
+
+
+/**
+ * @classdesc
+ * Requête de geocodage direct
+ *
+ * ```
+ * XSD
+ * Geocodage direct (balise xsd) :
+ *   element ref="RequestHeader" [ (attribute name="clientName" attribute name="clientPassword" attribute name="sessionID" attribute name="srsName" attribute name="MSID") ]
+ *     element name="Request" attribute name="methodName" attribute name="version" attribute name="requestID" [ attribute name="maximumResponses" ]
+ *       element name="GeocodeRequest" attribute name="returnFreeForm"
+ *         element ref="xls:Address"
+ * ```
+ *
+ * @example
+ * // creation de l'objet Geocode an ajoutant un objet Address
+ * req = new GeocodeRequest ();
+ * req.returnFreeForm = true; // TODO !
+ * req.addAddress (new Address ({
+ *      location : "saint mandé",
+ *      type : ['PositionOfInterest'],
+ *      filter : {
+ *          (...)
+ *      }
+ * }));
+ * req.toString();
+ * // out ->
+ * // <GeocodeRequest>
+ * //   <Address countryCode="PositionOfInterest">
+ * //     <freeFormAddress>saint mandé</freeFormAddress>
+ * //   </Address>
+ * // </GeocodeRequest>
+ *
+ * // creation de l'objet Geocode avec les options uniquement
+ * req = new GeocodeRequest ({
+ *      location : "saint mandé",
+ *      returnFreeForm : true,
+ *      filterOptions : {
+ *          type : ['PositionOfInterest'],
+ *          (...)
+ *      }
+ * });
+ * req.toString();
+ * // out ->
+ * // <GeocodeRequest>
+ * //   <Address countryCode="PositionOfInterest">
+ * //     <freeFormAddress>saint mandé</freeFormAddress>
+ * //   </Address>
+ * // </GeocodeRequest>
+ * @constructor
+ *
+ * @alias Gp.Formats.XLS.LocationUtilityService.GeocodeRequest
+ * @param {Object} options - options
+ * @param {Object}   options.location - location
+ * @param {String}   options.returnFreeForm - returnFreeForm
+ * @param {String}   options.filterOptions - filtres
+ * @param {Function} options.onsuccess - function callback success (TODO)
+ * @param {Function} options.onerror   - function callback error   (TODO)
+ *
+ * @private
+ */
+function GeocodeRequest (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur GeocodeRequest ()]");
+
+    if (!(this instanceof GeocodeRequest)) {
+        throw new TypeError("GeocodeRequest constructor cannot be called as a function.");
+    }
+
+    // options par defaut
+    this.options = options || {};
+
+    // et on ajoute les options en paramètre aux options par défaut
+    for (var opt in options) {
+        if (options.hasOwnProperty(opt)) {
+            this.options[opt] = options[opt];
+        }
+    }
+
+    // TODO
+    // gestion de l'option 'returnFreeForm' si elle n'est pas renseignée dans les options !
+
+    /**
+     * Nom de la classe (heritage)
+     */
+    this.CLASSNAME = "GeocodeRequest";
+}
+
+GeocodeRequest.prototype = {
+
+    /**
+     * @lends module:GeocodeRequest#
+     */
+
+    /**
+     * request (out)
+     * @type {String}
+     */
+    strRequest : null,
+
+    /**
+     * Addresse
+     * @type {Address}
+     */
+    oAddress : null,
+
+    /**
+     * Filter
+     * @type {GeocodeFilterExtension}
+     */
+    oFilter : null,
+
+    /**
+     * Template de la requête.
+     * substitution des valeurs suivantes :
+     * __ADDRESS__, __RETURNFREEFORM__
+     */
+    template : "<GeocodeRequest returnFreeForm=\"__RETURNFREEFORM__\">" +
+        "__ADDRESS__" +
+        "</GeocodeRequest>",
+
+    /**
+     * Ajout d'un objet de type Adresse
+     *
+     * @param {Object} oAddress - Adresse
+     */
+    addAddress : function (oAddress) {
+        if (oAddress instanceof _model_Address__WEBPACK_IMPORTED_MODULE_1__["default"]) {
+            this.oAddress = oAddress;
+        }
+    },
+
+    /**
+     * Ajout d'un objet de type GeocodeFilterExtension
+     *
+     * @param {Object} oFilter - GeocodeFilterExtension
+     */
+    addFilter : function (oFilter) {
+        // FIXME gestion des filtres à partir des tables de geocodages
+        if (oFilter instanceof _GeocodeFilterExtension__WEBPACK_IMPORTED_MODULE_2__["default"]) {
+            this.oFilter = oFilter;
+        }
+    },
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : GeocodeRequest,
+
+    /**
+     * toString
+     *
+     * @returns {String} requête
+     */
+    toString : function () {
+        var template = "";
+        template = this.template;
+
+        // soit on a déjà un objet Address instancié,
+        // sinon, on le fabrique via les options
+        if (!this.oAddress) {
+            var settings = {};
+            settings.location = this.options.location;
+            settings.type = this.options.filterOptions.type || ["StreetAddress"];
+            settings.filter = this.options.filterOptions;
+            delete settings.filter.type; // on ne met pas le 'type' dans les filtres...
+
+            // gestion des filtres
+            if (this.oFilter) {
+                // on reconstruit les filtres
+                settings.filter = {};
+
+                // on determine la liste des filtres possibles
+                // pour chaque table de geocodage en param
+                for (var idx in settings.type) {
+                    var filter = settings.type[idx];
+                    var oFilter = this.oFilter.getFilter(filter);
+
+                    if (!oFilter) {
+                        this.logger.warn("Le filtre '" + filter + "' n'existe pas !?");
+                        continue;
+                    }
+
+                    var mFilter = this.options.filterOptions;
+
+                    // correspondances des attributs de filtres possibles avec ceux qui sont en options
+                    var attributs = oFilter.attributesList;
+                    for (var idxe = 0; idxe < attributs.length; idxe++) {
+                        var key = attributs[idxe];
+                        if (mFilter[key]) {
+                            var matchingKey = oFilter.serviceAttributes[idxe];
+                            oFilter.placeAttributes[matchingKey] = mFilter[key];
+                            this.logger.trace("Selection du filtre '" + key + "' sur le type '" + filter + "'.");
+                        }
+                    }
+
+                    // ajout des valeurs des filtres
+                    var places = oFilter.placeAttributes;
+                    for (var kplace in places) {
+                        if (places.hasOwnProperty(kplace)) {
+                            settings.filter[kplace] = places[kplace];
+                        }
+                    }
+                }
+            }
+
+            this.oAddress = new _model_Address__WEBPACK_IMPORTED_MODULE_1__["default"](settings);
+            if (!this.oAddress) {
+                throw new Error("La construction de l'adresse n'est pas correctement definie !?");
+            }
+        }
+
+        // FIXME gestion des filtres pour un objet Address déjà instancié ?
+
+        template = template.replace(/__ADDRESS__/g, this.oAddress.toString());
+        template = template.replace(/__RETURNFREEFORM__/g, (this.options.returnFreeForm) ? "true" : "false");
+
+        this.strRequest = template;
+        return this.strRequest;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (GeocodeRequest);
+
+
+/***/ }),
+/* 95 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+
+
+
+/**
+ * @classdesc
+ *
+ * Location type "Address".
+ *
+ * Modèles de classes :
+ * ------------------
+ * ```
+ *
+ *                Address
+ *            (est composé de)
+ *           ______ | _________ _________________
+ *          /       |          \                 \
+ *      Place (StreetAddress ou FreeFormAddress) PostalCode
+ *       (*)       _|_
+ *                /   \
+ *           Street   Building
+ * ```
+ * ```
+ * XSD
+ * Address (balise xsd) :
+ *   ex. <Address countryCode="StreetAddress"><freeFormAddress>1 r de paris saint denis</freeFormAddress></Address>
+ *   attribute name="countryCode"
+ *     element name="freeFormAddress"
+ *     element ref="xls:Place"
+ *     element ref="gml:Envelope"
+ *  ou
+ *   ex. <Address countryCode="StreetAddress"><StreetAddress><Street>1 rue Marconi</Street></StreetAddress><Place type="Municipality">Metz</Place><PostalCode>57000</PostalCode></Address>
+ *   attribute name="countryCode"
+ *     element ref="xls:StreetAddress"
+ *     element ref="xls:PostalCode"
+ *     element ref="xls:Place"
+ *     element ref="gml:Envelope"
+ * ```
+ *
+ * @example
+ * // simple
+ * adr = new Address ({
+ *    location : "2 av pasteur, Saint-Mandée",
+ *    type : ["StreetAddress"],
+ *    filter : {}
+ * });
+ * adr.toString();
+ * // -> out
+ * // <Address countryCode="StreetAddress">
+ * //   <freeFormAddress>2 av pasteur, Saint-Mandée</freeFormAddress>
+ * // </Address>
+ *
+ * // avec filtre
+ * adr = new Address ({
+ *    location : {
+ *      number : 2,
+ *      street : "av pasteur",
+ *      city : "Saint-Mandée", // FIXME filter Place "commune" ou "municipality" ?
+ *      postalCode : "94166"   // FIXME filter Place ou balise PostalCode ?
+ *    },
+ *    type : ["StreetAddress"],
+ *    filter : {
+ *      territory : "FR",
+ *      department : "94"
+ *    }
+ * });
+ * adr.toString();
+ * // -> out
+ * // <Address countryCode="StreetAddress">
+ * //   <StreetAddress>
+ * //   <Building number="2"/>
+ * //   <Street>2 av pasteur</Street>
+ * // </StreetAddress>
+ * // <Place type="municipality">Saint-Mandée</Place>
+ * // <Place type="departement">94</Place>
+ * // <Place type="territoire">FR</Place>
+ * // <PostalCode>94166</PostalCode>
+ * // </Address>
+ *
+ * // avec bbox
+ * adr = new Address ({
+ *    location : "2 av pasteur, Saint-Mandée",
+ *    type : ["StreetAddress"],
+ *    filter : {
+ *      bbox : {left:1, right:2, top:2, bottom:0}
+ *    }
+ * });
+ * adr.toString();
+ * // -> out
+ * // <Address countryCode="StreetAddress">
+ * //   <freeFormAddress>2 av pasteur, Saint-Mandée</freeFormAddress>
+ * //   <gml:Envelope>
+ * //     <gml:lowerCorner>1 0</gml:lowerCorner>
+ * //     <gml:upperCorner>2 2</gml:upperCorner>
+ * //   </gl:Envelope>
+ * // </Address>
+ *
+ * @constructor
+ * @alias Gp.Formats.XLS.LocationUtilityService.Address
+ * @param {Object} options - options
+ * @param {Object} options.location - location
+ * @param {String} options.type - type
+ * @param {String} options.filter - filtres
+ * @param {String} options.filter.* - Filtré en fonction des tables de geocodage interrogées
+ *
+ * @private
+ */
+function Address (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Address");
+    this.logger.trace("[Constructeur Address ()]");
+
+    if (!(this instanceof Address)) {
+        throw new TypeError("Address constructor cannot be called as a function.");
+    }
+
+    // param par defaut
+    this.options = options || {
+        location : {},
+        type : ["StreetAddress"],
+        filter : {}
+    };
+
+    // param obligatoire
+    if (!options.location) {
+        throw new Error("l'option 'location' n'est pas renseignée !");
+    }
+
+    // et on ajoute les options en paramètre aux options par défaut
+    for (var opt in options) {
+        if (options.hasOwnProperty(opt)) {
+            this.options[opt] = options[opt];
+        }
+    }
+}
+
+/**
+ * @lends module:Address#
+ */
+Address.prototype = {
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : Address,
+
+    /**
+     * request (out)
+     * @type {String}
+     */
+    requestString : null,
+
+    /**
+     * Template de la requête.
+     *
+     * substitution des valeurs suivantes :
+     * - address :  __COUNTRYCODE__, __LOCATION__, __PLACE__, __POSTALCODE__, __ENVELOPE__
+     * - freeFormAddress : __FREEFORMADDRESSVALUE__
+     * - streetAddress : __STREET__, __BUILDING__
+     * - street : __STREETVALUE__
+     * - building : __BUILDINGVALUE__
+     * - place : __PLACEATYPE__, __PLACEVALUE__
+     * - postalCode : __POSTALCODEVALUE__
+     * - gml:envelope : __LEFT__ __BOTTOM__ __RIGHT__ __TOP__
+     *
+     * @todo gestion de l"indentation
+     */
+    template : {
+        address : "<Address countryCode=\"__COUNTRYCODE__\">" +
+            "__LOCATION__" +
+            "__PLACE__" +
+            "__POSTALCODE__" +
+            "__ENVELOPE__" +
+            "</Address>",
+        location : {
+            freeFormAddress : "<freeFormAddress>__FREEFORMADDRESSVALUE__</freeFormAddress>",
+            streetAddress : {
+                container : "<StreetAddress>" +
+                    "__STREET__" +
+                    "__BUILDING__" +
+                    "</StreetAddress>",
+                building : "<Building number=\"__BUILDINGVALUE__\"/>",
+                street : "<Street>__STREETVALUE__</Street>"
+            }
+        },
+        place : "<Place type=\"__PLACETYPE__\">__PLACEVALUE__</Place>",
+        postalCode : "<PostalCode>__POSTALCODEVALUE__</PostalCode>",
+        envelope : "<gml:Envelope>" +
+            "<gml:lowerCorner>__LEFT__ __BOTTOM__</gml:lowerCorner>" +
+            "<gml:upperCorner>__RIGHT__ __TOP__</gml:upperCorner>" +
+            "</gml:Envelope>"
+    }
+
+};
+
+/**
+ * toString
+ *
+ * @returns {String} requête
+ */
+Address.prototype.toString = function () {
+    var template = null;
+    template = this.template.address;
+    template = template.replace(/__COUNTRYCODE__/g, this.options.type);
+
+    // on a une adresse structurée ou libre ?
+    if (typeof this.options.location === "string") {
+        // balise freeFormeAddress
+        var tmplFreeFormAddress = this.template.location.freeFormAddress;
+        tmplFreeFormAddress = tmplFreeFormAddress.replace(/__FREEFORMADDRESSVALUE__/g, this.options.location);
+        template = template.replace(/__LOCATION__/g, tmplFreeFormAddress);
+    } else {
+        // balises Street et Building
+        var tmplBuilding = "";
+        var tmplStreet = "";
+
+        if (this.options.location.number) {
+            tmplBuilding = this.template.location.streetAddress.building;
+            tmplBuilding = tmplBuilding.replace(/__BUILDINGVALUE__/g, this.options.location.number);
+        }
+
+        if (this.options.location.street) {
+            tmplStreet = this.template.location.streetAddress.street;
+            tmplStreet = tmplStreet.replace(/__STREETVALUE__/g, this.options.location.street);
+        }
+
+        // balise streetAddress
+        var tmplStreetAddress = this.template.location.streetAddress.container;
+        tmplStreetAddress = tmplStreetAddress.replace(/__STREET__/g, tmplStreet);
+        tmplStreetAddress = tmplStreetAddress.replace(/__BUILDING__/g, tmplBuilding);
+        template = template.replace(/__LOCATION__/g, tmplStreetAddress);
+    }
+
+    // a t on un filtre de type PostalCode ?
+    var tmplPostalCode = "";
+    if (this.options.location.postalCode) {
+        tmplPostalCode = this.template.postalCode;
+        tmplPostalCode = tmplPostalCode.replace(/__POSTALCODEVALUE__/g, this.options.location.postalCode);
+    }
+
+    // a t on un filtre de type GML::Envelope ?
+    var tmplEnvelope = "";
+    if (this.options.filter) {
+        var bbox = this.options.filter.bbox;
+        if (bbox) {
+            tmplEnvelope = this.template.envelope;
+            tmplEnvelope = tmplEnvelope.replace(/__LEFT__/g, bbox.left);
+            tmplEnvelope = tmplEnvelope.replace(/__BOTTOM__/g, bbox.bottom);
+            tmplEnvelope = tmplEnvelope.replace(/__RIGHT__/g, bbox.right);
+            tmplEnvelope = tmplEnvelope.replace(/__TOP__/g, bbox.top);
+        }
+    }
+
+    // liste des filtres Place
+    var Places = [];
+
+    // a t on des filtres de type Place ?
+    var tmplPlace = "";
+    if (this.options.filter) {
+        var filters = this.options.filter;
+        for (var filter in filters) {
+            if (filter === "bbox") {
+                continue;
+            }
+            // FIXME gestion des filtres spécifiques IGN ?
+            tmplPlace = this.template.place;
+            tmplPlace = tmplPlace.replace(/__PLACETYPE__/g, filter);
+            tmplPlace = tmplPlace.replace(/__PLACEVALUE__/g, filters[filter]);
+            Places.push(tmplPlace);
+        }
+    }
+
+    // a t on un filtre de type Place dans location ?
+    var tmplPlaceCity = "";
+    if (this.options.location.city) {
+        tmplPlaceCity = this.template.place;
+        tmplPlaceCity = tmplPlaceCity.replace(/__PLACETYPE__/g, "Municipality");
+        tmplPlaceCity = tmplPlaceCity.replace(/__PLACEVALUE__/g, this.options.location.city);
+        Places.push(tmplPlaceCity);
+    }
+
+    template = template.replace(/__POSTALCODE__/g, tmplPostalCode);
+    template = template.replace(/__PLACE__/g, Places.join("\n"));
+    template = template.replace(/__ENVELOPE__/g, tmplEnvelope);
+
+    this.requestString = template;
+    return this.requestString;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Address);
+
+
+/***/ }),
+/* 96 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+
+
+
+/**
+ * @classdesc
+ *
+ * Ajouter des extensions de filtres spécifiques au service de geocodage de l'IGN.
+ * Ceci permet de contrôler les options spécifiques de la table de geocodage intérrogées.
+ *
+ * @example
+ * var ext =  new GeocodeFiltersExtension ();
+ *     ext.add (new Administratif ());
+ *     ext.add (new StreetAddress ());
+ *     ext.add (new PositionOfInterest ());
+ *     ext.add (new CadastralParcel ());
+ *
+ * ext.getNames ()
+ * // --> out
+ * // [Administratif, StreetAddress, PositionOfInterest, CadastralParcel]
+ *
+ * ext.getFilters ()
+ * // --> out
+ * // [Object, Object, Object, Object] = tableau d'objet GeocodeLocation
+ *
+ * ext.getFilter ('StreetAddress')
+ * // --> out
+ * // {Object} = objet GeocodeLocation
+ *
+ * ext.getAttributs ('StreetAddress')
+ * // --> out
+ * // ["bbox", "number", "ID", "IDTR", "postalCode", "quality", "street", "territoire", "commune", "department", "insee", "municipality"]
+ *
+ * ext.setPlaceAttributs ('StreetAddress', {number:'', territoire:'', quality:'', fake:''})
+ * // --> out
+ * // (fake est écarté car il n'appartient pas à la liste !)
+ *
+ * ext.getPlaceAttributs ('StreetAddress')
+ * // --> out
+ * // {number : '', territoire : '', quality : ''}
+ *
+ * // Comment ajouter des filtres spécifiques au service de geocodage ?
+ * var req = new GeocodeRequest ({
+ *      location : "saint mandé",
+ *      returnFreeForm : true,
+ *      filterOptions : {
+ *          type : ['PositionOfInterest'], <-- ajouter une extension afin de gerer les attributs de cette table de geocodage !
+ *          (...)
+ *      }
+ *  })
+ *  req.addFilter (new PositionOfInterest ());
+ * @constructor
+ * @alias Gp.Formats.XLS.LocationUtilityService.GeocodeFilterExtension
+ *
+ * @private
+ */
+function GeocodeFilterExtension () {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("GeocodeFilterExtension");
+    this.logger.trace("[Constructeur GeocodeFilterExtension ()]");
+
+    if (!(this instanceof GeocodeFilterExtension)) {
+        throw new TypeError("GeocodeFilterExtension constructor cannot be called as a function.");
+    }
+
+    /**
+     * Tableau de filtres (table de geocodage)
+     */
+    this.filters = [];
+}
+
+/**
+ * @lends module:GeocodeFilterExtension#
+ */
+GeocodeFilterExtension.prototype = {
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : GeocodeFilterExtension,
+
+    /**
+     * Ajout d'un filtre
+     *
+     * @param {Object} oGeocodeLocation - objet de type 'GeocodeLocation'
+     */
+    addFilterExtensions : function (oGeocodeLocation) {
+        // FIXME test sur le type d'objet !
+        if (oGeocodeLocation) {
+            // FIXME ou test sur ses propriétés !
+            this.filters.push(oGeocodeLocation);
+        }
+    },
+
+    // getter
+
+    /**
+     * Tableau de noms (tables de geocodage)
+     *
+     * @returns {Array.<String>} liste des noms de filtres
+     */
+    getNames : function () {
+        var names = [];
+        for (var idx in this.filters) {
+            names.push(this.filters[idx].CLASSNAME);
+        }
+        this.logger.trace(names);
+        return names;
+    },
+
+    /**
+     * Retourne une table de geocodage
+     *
+     * @param {String} name - nom de la table de geocodage
+     * @returns {Object} filtre
+     */
+    getFilter : function (name) {
+        var filter = null;
+        for (var idx in this.filters) {
+            if (this.filters[idx].CLASSNAME === name) {
+                filter = this.filters[idx];
+            }
+        }
+        this.logger.trace(filter);
+        return filter;
+    },
+
+    /**
+     * Tableau d'objects (tables de geocodage)
+     *
+     * @returns {Array.<Object>} liste des filtres
+     */
+    getFilters : function () {
+        this.logger.trace(this.filters);
+        return this.filters;
+    },
+
+    /**
+     * Récupère la liste des attributs (filtres) sur une table de geocodage
+     *
+     * @param {String} name - nom de la table de geocodage
+     * @returns {Array} liste des attributs d'un filtre
+     */
+    getAttributs : function (name) {
+        var attributs = [];
+        for (var idx in this.filters) {
+            if (this.filters[idx].CLASSNAME === name) {
+                attributs = this.filters[idx].attributesList;
+            }
+        }
+        this.logger.trace(attributs);
+        return attributs;
+    },
+
+    /**
+     * Ajout des attributs (filtres) sur une table de geocodage
+     *
+     * @param {String} name - nom de la table de geocodage
+     * @param {Object} options - options de la table de geocodage
+     */
+    setPlaceAttributs : function (name, options) {
+        var filter = this.getFilter(name);
+        var attributs = this.getAttributs(name);
+        for (var idx in attributs) {
+            var value = attributs[idx];
+            if (options[value]) {
+                filter.placeAttributes[value] = options[value];
+            }
+        }
+    },
+
+    /**
+     * Retourne les attributs (filtres) sur une table de geocodage
+     *
+     * @param {String} name - nom de la table de geocodage
+     * @returns {Array} liste des attributs d'un filtre
+     */
+    getPlaceAttributs : function (name) {
+        var places = {};
+        for (var idx in this.filters) {
+            if (this.filters[idx].CLASSNAME === name) {
+                places = this.filters[idx].placeAttributes;
+            }
+        }
+        this.logger.trace(places);
+        return places;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (GeocodeFilterExtension);
+
+
+/***/ }),
+/* 97 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _model_Position__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(98);
+/* harmony import */ var _model_Preference__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(99);
+
+
+
+
+
+/**
+ * @classdesc
+ *
+ * Requête de geocodage inverse
+ *
+ * XSD
+ * ```
+ * Geocodage inverse (balise xsd) :
+ *   element ref="RequestHeader" [ (attribute name="clientName" attribute name="clientPassword" attribute name="sessionID" attribute name="srsName" attribute name="MSID") ]
+ *     element name="Request" attribute name="methodName" attribute name="version" attribute name="requestID" [ attribute name="maximumResponses" ]
+ *       element name="ReverseGeocodeRequest"
+ *         element ref="xls:Position"
+ *         element name="ReverseGeocodePreference" (enumeration)
+ * ```
+ *
+ * @example
+ * // creation de l"objet ReverseGeocode
+ * req = new ReverseGeocodeRequest ();
+ * req.addPosition (new Position (position:{x: , y: }));
+ * req.addPreference (["StreetAddress"]);
+ * req.toString();
+ * // out ->
+ * // <ReverseGeocodeRequest>
+ * //     <Position>
+ * //       <gml:Point xmlns:gml="http://www.opengis.net/gml">
+ * //           <gml:pos>50.347775 3.205098</gml:pos>
+ * //       </gml:Point>
+ * //     </Position>
+ * //     <ReverseGeocodePreference>StreetAddress</ReverseGeocodePreference>
+ * //  </ReverseGeocodeRequest>
+ * @constructor
+ * @alias Gp.Formats.XLS.ReverseGeocodeRequest
+ * @param {Object} options - options
+ * @param {Object}   options.position - position
+ * @param {String}   options.returnFreeForm - returnFreeForm
+ * @param {String}   options.filterOptions - filtres
+ * @param {Function} options.onsuccess - function callback success (TODO)
+ * @param {Function} options.onerror   - function callback error   (TODO)
+ *
+ * @private
+ */
+function ReverseGeocodeRequest (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur ReverseGeocodeRequest ()]");
+
+    if (!(this instanceof ReverseGeocodeRequest)) {
+        throw new TypeError("ReverseGeocodeRequest constructor cannot be called as a function.");
+    }
+
+    // options par defaut
+    this.options = options || {};
+
+    // et on ajoute les options en paramètre aux options par défaut
+    for (var opt in options) {
+        if (options.hasOwnProperty(opt)) {
+            this.options[opt] = options[opt];
+        }
+    }
+
+    /**
+     * Nom de la classe (heritage)
+     */
+    this.CLASSNAME = "ReverseGeocodeRequest";
+}
+
+ReverseGeocodeRequest.prototype = {
+
+    /**
+     * @lends module:ReverseGeocodeRequest#
+     */
+
+    /**
+     * request (out)
+     * @type {String}
+     */
+    strRequest : null,
+
+    /**
+     * Position
+     * @type {Position}
+     */
+    oPosition : null,
+
+    /**
+     * Preference
+     * @type {Preference}
+     */
+    oPreference : null,
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : ReverseGeocodeRequest,
+
+    /**
+     * Template de la requête.
+     * substitution des valeurs suivantes :
+     * __POSITION__, __PREFERENCE__, __RETURNFREEFORM__
+     */
+    template : "<ReverseGeocodeRequest returnFreeForm=\"__RETURNFREEFORM__\">" +
+        "__POSITION__" +
+        "__PREFERENCE__" +
+        "</ReverseGeocodeRequest>",
+
+    /**
+     * Ajout d"un objet de type Position
+     *
+     * @param {Object} oPosition - Position
+     */
+    addPosition : function (oPosition) {
+        if (oPosition instanceof _model_Position__WEBPACK_IMPORTED_MODULE_1__["default"]) {
+            this.oPosition = oPosition;
+        }
+    },
+
+    /**
+     * Ajout d"une liste de table de référence LUS :
+     * [StreetAddress, PointOfInterest, CadastralParcel, Administrativ]
+     *
+     * @param {Object} oPreference - Preference
+     */
+    addPreferences : function (oPreference) {
+        if (oPreference instanceof _model_Preference__WEBPACK_IMPORTED_MODULE_2__["default"]) {
+            this.oPreference = oPreference;
+        }
+    },
+
+    /**
+     * toString
+     * @returns {String} requête
+     */
+    toString : function () {
+        var template = "";
+        template = this.template;
+
+        // si on a déjà un objet Preference instancié,
+        // sinon, on le fabrique via les options
+        if (!this.oPreference) {
+            this.oPreference = new _model_Preference__WEBPACK_IMPORTED_MODULE_2__["default"](this.options.filterOptions.type || ["StreetAddress"]);
+            if (!this.oPreference) {
+                throw new Error("Les preferences ne sont pas definies !?");
+            }
+        }
+        template = template.replace(/__PREFERENCE__/g, this.oPreference.toString());
+
+        // si on a déjà un objet Position instancié,
+        // sinon, on le fabrique via les options
+        if (!this.oPosition) {
+            var settings = {
+                position : this.options.position,
+                filter : {}
+            };
+
+            // FIXME gestion des filtres ?
+            if (this.options.filterOptions) {
+                settings.filter = this.options.filterOptions;
+                delete settings.filter.type; // pas besoin ?
+            }
+            this.oPosition = new _model_Position__WEBPACK_IMPORTED_MODULE_1__["default"](settings);
+            if (!this.oPosition) {
+                throw new Error("La position et ses filtres ne sont pas definis !?");
+            }
+        }
+        template = template.replace(/__POSITION__/g, this.oPosition.toString());
+        template = template.replace(/__RETURNFREEFORM__/g, (this.options.returnFreeForm) ? "true" : "false");
+
+        this.strRequest = template;
+        return this.strRequest;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (ReverseGeocodeRequest);
+
+
+/***/ }),
+/* 98 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+
+
+/**
+ * @classdesc
+ * Location de type Position
+ *
+ * ```
+ * XSD
+ * Position (balise xsd) :
+ *   ex. <Position><gml:Point xmlns:gml="http://www.opengis.net/gml"><gml:pos>50.347775 3.205098</gml:pos></gml:Point></Position>
+ *   ex. <Position><gml:CircleByCenterPoint xmlns:gml="http://www.opengis.net/gml"><gml:pos>48.85978570614691 2.2913572761128878</gml:pos><gml:radius>1000</gml:radius></gml:CircleByCenterPoint></Position>
+ *   (au choix)
+ *   element ref="gml:Point"
+ *   element ref="gml:CircleByCenterPoint"
+ *   element ref="gml:Polygon"
+ *   element ref="gml:MultiPolygon"
+ * ```
+ *
+ * FIXME les autres elements ne sont pas implémentés (QoP, Speed, Direction, Time, ...) ?
+ *
+ * ```
+ * template : "<Position>
+ *                  __GMLPOINT__
+ *                  __GMLFILTER__
+ *             </Position>"
+ * ```
+ * ```
+ * GML : {
+ *  pos     : "<gml:pos>__X__ __Y__</gml:pos>",
+ *  point   : "<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">__POS__</gml:Point>",
+ *  circle  : "<gml:CircleByCenterPoint xmlns:gml=\"http://www.opengis.net/gml\">__POS__<gml:radius>__RADIUS__</gml:radius></gml:CircleByCenterPoint>",
+ *  // not yet implemented !
+ *  polygon      : "",
+ *  multipolygon : ""
+ * }
+ * ```
+ *
+ * @constructor
+ * @alias Gp.Formats.XLS.LocationUtilityService.Position
+ * @param {Object} options - options données en entrée
+ * @param {Object} options.position - x/y
+ * @param {Object} options.filter - filtre
+ * @param {Object} options.filter.circle - un cercle
+ * @param {Object} options.filter.polygon - un polygone
+ *
+ * @private
+ */
+function Position (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Position");
+    this.logger.trace("[Constructeur Position ()]");
+
+    if (!(this instanceof Position)) {
+        throw new TypeError("Position constructor cannot be called as a function.");
+    }
+
+    // param par defaut
+    this.options = options || {};
+
+    // param obligatoire
+    if (!options.position) {
+        throw new Error("l'option 'position' n'est pas renseignée !");
+    }
+
+    // et on ajoute les options en paramètre aux options par défaut
+    for (var opt in options) {
+        if (options.hasOwnProperty(opt)) {
+            this.options[opt] = options[opt];
+        }
+    }
+}
+
+/**
+ * @lends module:Position#
+ */
+Position.prototype = {
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : Position,
+
+    /**
+     * request (out)
+     * @type {String}
+     */
+    requestString : null,
+
+    /**
+     * Template de la requête.
+     *
+     * substitution des valeurs suivantes :
+     * __GMLPOINT__ __GMLFILTER__
+     * __X__ __Y__ __RADIUS__
+     * __XY__
+     * @todo indentation XML
+     * @todo implementation classe GML
+     */
+    template : {
+        position : "<Position>" +
+            "__GMLPOINT__" +
+            "__GMLFILTER__" +
+            "</Position>",
+        gml : {
+            point : "<gml:Point xmlns:gml=\"http://www.opengis.net/gml\"><gml:pos>__X__ __Y__</gml:pos></gml:Point>",
+            pos : null,
+            filter : {
+                bbox : "<gml:Envelope xmlns:gml=\"http://www.opengis.net/gml\">" +
+                    "<gml:lowerCorner>__LEFT__ __BOTTOM__</gml:lowerCorner>" +
+                    "<gml:upperCorner>__RIGHT__ __TOP__</gml:upperCorner>" +
+                    "</gml:Envelope>",
+                circle : "<gml:CircleByCenterPoint xmlns:gml=\"http://www.opengis.net/gml\"><gml:pos>__X__ __Y__</gml:pos><gml:radius>__RADIUS__</gml:radius></gml:CircleByCenterPoint>",
+                polygon : "<gml:Polygon xmlns:gml=\"http://www.opengis.net/gml\"><gml:exterior><gml:LinearRing><gml:posList>__XY__</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>",
+                multipolygon : null
+            }
+        }
+    }
+};
+
+/**
+ * toString
+ *
+ * @returns {String} requête
+ */
+Position.prototype.toString = function () {
+    var template = this.template.position;
+
+    var tmplGmlPoint = this.template.gml.point;
+    tmplGmlPoint = tmplGmlPoint.replace(/__X__/g, this.options.position.x);
+    tmplGmlPoint = tmplGmlPoint.replace(/__Y__/g, this.options.position.y);
+
+    var tmplGmlFilter = "";
+    if (this.options.filter) {
+        var filter = this.options.filter;
+
+        for (var name in filter) {
+            switch (name) {
+                case "circle":
+                    tmplGmlFilter = this.template.gml.filter[name];
+                    tmplGmlFilter = tmplGmlFilter.replace(/__X__/g, filter[name].x);
+                    tmplGmlFilter = tmplGmlFilter.replace(/__Y__/g, filter[name].y);
+                    tmplGmlFilter = tmplGmlFilter.replace(/__RADIUS__/g, filter[name].radius);
+                    break;
+                case "bbox":
+                    tmplGmlFilter = this.template.gml.filter[name];
+                    tmplGmlFilter = tmplGmlFilter.replace(/__LEFT__/g, filter[name].left);
+                    tmplGmlFilter = tmplGmlFilter.replace(/__BOTTOM__/g, filter[name].bottom);
+                    tmplGmlFilter = tmplGmlFilter.replace(/__RIGHT__/g, filter[name].right);
+                    tmplGmlFilter = tmplGmlFilter.replace(/__TOP__/g, filter[name].top);
+                    break;
+                case "polygon":
+                    // FIXME implementation simple du polygone !
+                    // aucun test de fermeture du polygone, ni de gestion des trous !
+                    tmplGmlFilter = this.template.gml.filter[name];
+                    var strPoints = "";
+                    var lstPoints = filter[name];
+                    for (var i = 0; i < lstPoints.length; i++) {
+                        var coord = lstPoints[i];
+                        if (Array.isArray(coord)) {
+                            this.logger.error("Holes are not implemented !");
+                            break;
+                        }
+                        if ((coord.x && coord.y) || (coord.x === 0 || coord.y === 0)) {
+                            strPoints += coord.x + " " + coord.y;
+                        }
+                        if (lstPoints.length !== i + 1) {
+                            strPoints += " ";
+                        }
+                    }
+                    tmplGmlFilter = tmplGmlFilter.replace(/__XY__/g, strPoints);
+                    break;
+                case "multipolygon":
+                    this.logger.warn("Filter '" + name + "' is not yet implemented !");
+                    break;
+                default:
+                    this.logger.error("This filter '" + name + "' is not useful !");
+            }
+        }
+    }
+
+    template = template.replace(/__GMLPOINT__/g, tmplGmlPoint);
+    template = template.replace(/__GMLFILTER__/g, tmplGmlFilter);
+
+    this.requestString = template;
+    return this.requestString;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Position);
+
+
+/***/ }),
+/* 99 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+
+
+/**
+ * @classdesc
+ *
+ * Preference (Reverse)
+ *
+ * FIXME liste des types de tables de geocodage
+ *
+ * ```
+ * template : "<ReverseGeocodePreference>__TYPE__</ReverseGeocodePreference>"
+ * ```
+ *
+ * @constructor
+ * @alias Gp.Formats.XLS.LocationUtilityService.Preference
+ * @param {String} type - type de table de geocodage
+ *
+ * @private
+ *
+ */
+
+function Preference (type) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Preference");
+    this.logger.trace("[Constructeur Preference ()]");
+
+    if (!(this instanceof Preference)) {
+        throw new TypeError("Preference constructor cannot be called as a function.");
+    }
+
+    /**
+     * type de table de geocodage
+     * @type {Array.<String>}
+     */
+    this.type = type;
+}
+
+/**
+ * @lends module:Preference#
+ */
+Preference.prototype = {
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : Preference,
+
+    /**
+     * request (out)
+     * @type {String}
+     */
+    requestString : null,
+
+    /**
+     * Template de la requête.
+     *
+     * substitution des valeurs suivantes :
+     *  __TYPE__
+     *
+     */
+    template : "<ReverseGeocodePreference>__TYPE__</ReverseGeocodePreference>"
+};
+
+/**
+ * toString
+ *
+ * @returns {String} requête
+ */
+Preference.prototype.toString = function () {
+    var Preferences = [];
+    var tmplPreference = "";
+    for (var idx = 0; idx < this.type.length; idx++) {
+        tmplPreference = this.template;
+        tmplPreference = tmplPreference.replace(/__TYPE__/g, this.type[idx]);
+        Preferences.push(tmplPreference);
+    }
+
+    this.strRequest = Preferences.join("\n");
+    return this.strRequest;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Preference);
+
+
+/***/ }),
+/* 100 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _GeocodeLocation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(101);
+
+
+
+/**
+ * @classdesc
+ * Format des attributs d'un résultat de géocodage de type StreetAddress.
+ *
+ * @constructor
+ * @alias Gp.Services.Geocode.Request.StreetAddress
+ * @private
+ */
+function StreetAddress () {
+    if (!(this instanceof StreetAddress)) {
+        throw new TypeError("StreetAddress constructor cannot be called as a function.");
+    }
+
+    // INFO
+    // appel du constructeur de la classe mère
+    // avec passage de param.
+    _GeocodeLocation__WEBPACK_IMPORTED_MODULE_0__["default"].apply(this, arguments);
+
+    /**
+     * Nom de la classe (heritage)
+     * @type {String}
+     */
+    this.CLASSNAME = "StreetAddress";
+
+    /**
+     * Liste des attributs possibles pour une GeocodeLocation de type StreetAddress
+     * - **bbox** : Emprise de l'adresse dans le système de coordonnées demandé {left, right, top, bottom}. *{Object}*
+     * - **ID** : Identifiant BD ADRESSE dans le cas où le résultat est une adresse. *{String}*
+     * - **IDTR** : Identifiant "Route Adresse" de la voie portant l'adresse dans la base BD ADRESSE. *{String}*
+     * - **quality** : Indicateur de qualité du géocodage (pour plus d'infos : http://api.ign.fr/tech-docs-js/fr/developpeur/search.html *{String}*
+     * - **territory** : Code du territoire français où se situe l'adresse *{String}*
+     * - **commune** : Ville l'adresse. *{String}*
+     * - **department** : Département l'adresse. *{String}*
+     * - **insee** : Code INSEE de l'adresse. *{Number}*
+     * - **municipality** : Municipalité de l'adresse. *{String}*
+     */
+
+    this.attributesList = ["bbox", "ID", "IDTR", "quality", "territory", "commune", "department", "insee", "municipality"];
+
+    this.serviceAttributes = ["bbox", "ID", "IDTR", "Qualite", "Territoire", "Commune", "Departement", "INSEE", "Municipality"];
+}
+
+/**
+ * @lends module:StreetAdress#
+ */
+StreetAddress.prototype = Object.create(_GeocodeLocation__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
+
+/**
+ * Constructeur (alias)
+ */
+StreetAddress.prototype.constructor = StreetAddress;
+
+/* harmony default export */ __webpack_exports__["default"] = (StreetAddress);
+
+
+/***/ }),
+/* 101 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * @classdesc
+ *
+ * Liste des attributs des tables de geocodage
+ * @constructor
+ * @alias Gp.Services.Geocode.Request.GeocodeLocation
+ * @private
+ */
+function GeocodeLocation () {
+    if (!(this instanceof GeocodeLocation)) {
+        throw new TypeError("GeocodeLocation constructor cannot be called as a function.");
+    }
+
+    /**
+     * Objet qui peut prendre comme propriétés les valeurs du tableau serviceAttributes
+     * @type {Object}
+     */
+    this.placeAttributes = {};
+
+    /**
+     * Tableau qui liste les attributs spécifiques selon le type de la GeocodeLocation.
+     * Ces attributs correspondent à ceux saisis par l'utilisateur (légèrement différents de ceux du service)
+     * @type {String[]}
+     */
+    this.attributesList = [];
+
+    /**
+     * Tableau qui liste les attributs spécifiques selon le type de la GeocodeLocation
+     * Ces attributs correspondent à ceux interprétés par le service (balises Place).
+     * @type {String[]}
+     */
+    this.serviceAttributes = [];
+}
+
+/**
+ * @lends module:GeocodeLocation
+ */
+GeocodeLocation.prototype = {
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : GeocodeLocation
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (GeocodeLocation);
+
+
+/***/ }),
+/* 102 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _GeocodeLocation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(101);
+
+
+
+/**
+ * @classdesc
+ * Format des attributs d'un résultat de géocodage de type PositionOfInterest
+ *
+ * @constructor
+ * @alias Gp.Services.Geocode.Request.PositionOfInterest
+ * @private
+ */
+function PositionOfInterest () {
+    if (!(this instanceof PositionOfInterest)) {
+        throw new TypeError("PositionOfInterest constructor cannot be called as a function.");
+    }
+
+    // INFO
+    // appel du constructeur de la classe mère
+    // avec passage de param.
+    _GeocodeLocation__WEBPACK_IMPORTED_MODULE_0__["default"].apply(this, arguments);
+
+    /**
+     * Nom de la classe (heritage)
+     * @type {String}
+     */
+    this.CLASSNAME = "PositionOfInterest";
+
+    /**
+     * Liste des attributs possibles pour une GeocodeLocation de type PositionOfInterest
+     * - **bbox** : Emprise du toponyme dans le système de coordonnées demandé {left, right, top, bottom} *{Object}*
+     * - **importance** : Importance du toponyme *{number}*
+     * - **nature** : Nature du toponyme. *{String}*
+     * - **territory** : Code du territoire français où se situe le toponyme *{String}*
+     * - **commune** : Ville du toponyme. *{String}*
+     * - **department** : Département du toponyme. *{String}*
+     * - **insee** : Code INSEE de la commune où se situe le toponyme. *{Number}*
+     * - **municipality** : Municipalité du toponyme. *{String}*
+     */
+
+    this.attributesList = ["bbox", "importance", "nature", "territory", "commune", "department", "insee", "municipality"];
+
+    this.serviceAttributes = ["bbox", "Importance", "Nature", "Territoire", "Commune", "Departement", "INSEE", "Municipality"];
+}
+
+/**
+ * @lends module:PositionOfInterest#
+ */
+PositionOfInterest.prototype = Object.create(_GeocodeLocation__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
+
+/**
+ * Constructeur (alias)
+ */
+PositionOfInterest.prototype.constructor = PositionOfInterest;
+
+/* harmony default export */ __webpack_exports__["default"] = (PositionOfInterest);
+
+
+/***/ }),
+/* 103 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _GeocodeLocation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(101);
+
+
+
+/**
+ * @classdesc
+ * Format des attributs d'un filtre de géocodage de type CadastralParcel.
+ *
+ * @constructor
+ * @alias Gp.Services.Geocode.Request.CadastralParcel
+ * @private
+ */
+function CadastralParcel () {
+    if (!(this instanceof CadastralParcel)) {
+        throw new TypeError("CadastralParcel constructor cannot be called as a function.");
+    }
+
+    // INFO
+    // appel du constructeur de la classe mère
+    // avec passage de param.
+    _GeocodeLocation__WEBPACK_IMPORTED_MODULE_0__["default"].apply(this, arguments);
+
+    /**
+     * Nom de la classe (heritage)
+     */
+    this.CLASSNAME = "CadastralParcel";
+
+    /**
+     * Liste des attributs possibles pour une GeocodeLocation de type CadastralParcel
+     * - **absorbedCity** : Code commune absorbée de la parcelle :
+     *      lorsqu'une parcelle est issue p d'une ancienne commune qui a fusionné avec une autre.
+     *      Sinon, le code vaut '000'. *{String}*
+     * - **sheet** : Feuille de la parcelle (ex 1). *{String}*
+     * - **number** : Numéro de la parcelle (ex. 0041) *{String}*
+     * - **section** : Section de la parcelle (ex 0D). *{String}*
+     * - **commune** : Ville du filtre. *{String}*
+     * - **department** : Département du filtre. *{String}*
+     * - **insee** : Code INSEE du filtre. *{Number}*
+     * - **municipality** : Municipalité du filtre. *{String}*
+     * - **origin** : L'origine de l'objet parcellaire renvoyé
+     *      (correspond à l'attribut "type" dans la réponse XML)
+     *      Pour plus d'informations : http://api.ign.fr/tech-docs-js/fr/developpeur/search.html#Recherche_par_parcelles_cadastrales *{Number}*
+     *
+     */
+
+    this.attributesList = ["absorbedCity", "sheet", "number", "section", "commune", "department", "insee", "municipality", "origin"];
+
+    this.serviceAttributes = ["CommuneAbsorbee", "Feuille", "Numero", "Section", "Commune", "Departement", "INSEE", "Municipality", "Type"];
+}
+
+/**
+ * @lends module:CadastralParcel#
+ */
+CadastralParcel.prototype = Object.create(_GeocodeLocation__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
+
+/**
+ * Constructeur (alias)
+ */
+CadastralParcel.prototype.constructor = CadastralParcel;
+
+/* harmony default export */ __webpack_exports__["default"] = (CadastralParcel);
+
+
+/***/ }),
+/* 104 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _GeocodeLocation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(101);
+
+
+
+/**
+ * @classdesc
+ * Format des attributs d'un filtre de géocodage de type Administratif.
+ * @constructor
+ * @alias Gp.Services.Geocode.Request.Administratif
+ * @private
+ */
+function Administratif () {
+    if (!(this instanceof Administratif)) {
+        throw new TypeError("Administratif constructor cannot be called as a function.");
+    }
+
+    // INFO
+    // appel du constructeur de la classe mère
+    // avec passage de param.
+    _GeocodeLocation__WEBPACK_IMPORTED_MODULE_0__["default"].apply(this, arguments);
+
+    /**
+     * Nom de la classe (heritage)
+     * @type {String}
+     */
+    this.CLASSNAME = "Administratif";
+
+    /**
+     * Liste des attributs possibles pour une GeocodedLocation de type Administratif
+     * - **bbox** : Emprise de l'unité administrative dans le système de coordonnées demandé *{left, right, top, bottom}*
+     * - **prefecture** - Nom de la préfécture de la région ou du département *{String}*
+     * - **inseeRegion** - Numéro INSEE de la région *{String}*
+     * - **inseeDepartment** - Numéro INSEE du département *{String}*
+     * - **municipality** - Nom de l'unité administrative *{String}*
+     *
+     */
+
+    this.attributesList = ["bbox", "prefecture", "inseeRegion", "inseeDepartment", "municipality"];
+
+    this.serviceAttributes = ["bbox", "Prefecture", "InseeRegion", "InseeDepartement", "Municipality"];
+}
+
+/**
+ * @lends module:Administratif#
+ */
+Administratif.prototype = Object.create(_GeocodeLocation__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
+
+/**
+ * Constructeur (alias)
+ */
+Administratif.prototype.constructor = Administratif;
+
+/* harmony default export */ __webpack_exports__["default"] = (Administratif);
+
+
+/***/ }),
+/* 105 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(45);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _Formats_XML__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(66);
+/* harmony import */ var _Formats_DirectGeocodeResponseReader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(106);
+/**
+ * Factory pour générer une reponse JSON à partir d'un XML
+ * ou d'un JSON encapsulant du XML
+ * (Factory)
+ *
+ * @module GeocodeResponseFactory
+ * @alias Gp.Services.Geocode.Response.GeocodeResponseFactory
+ * @todo La reponse JSON peut encapsuler un XML !
+ * @private
+ */
+// import Logger from "../../../Utils/LoggerByDefault";
+
+
+
+
+
+var DirectGeocodeReponseFactory = {
+
+    /**
+     * interface unique
+     *
+     * @method build
+     * @static
+     * @param {Object} options - options definies dans le composant Geocode
+     *
+     * @example
+     *   var options = {
+     *      response :
+     *      rawResponse :
+     *      scope :
+     *      onSuccess :
+     *      onError :
+     *   };
+     *
+     */
+    build : function (options) {
+        // data de type GeocodeResponse
+        var data = null;
+
+        if (options.response) {
+            if (options.rawResponse) {
+                data = options.response;
+            } else {
+                try {
+                    var p = new _Formats_XML__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                        reader : _Formats_DirectGeocodeResponseReader__WEBPACK_IMPORTED_MODULE_3__["default"]
+                    });
+
+                    if (typeof options.response === "string") {
+                        p.setXMLString(options.response);
+                    } else {
+                        p.setXMLDoc(options.response);
+                    }
+
+                    data = p.parse();
+
+                    if (!data) {
+                        throw new Error("L'analyse de la réponse du service !?");
+                    }
+                } catch (e) {
+                    var message = e.message;
+                    if (typeof options.response === "string") {
+                        message += "('" + options.response + "')";
+                    } else {
+                        message += "('" + options.response.documentElement.innerHTML + "')";
+                    }
+                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"]({
+                        message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE", message),
+                        type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"].TYPE_UNKERR,
+                        status : -1
+                    }));
+                    return;
+                }
+
+                // Si la réponse contenait une exception renvoyée par le service
+                if (data.exceptionReport) {
+                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"]({
+                        message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport),
+                        type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"].TYPE_SRVERR,
+                        status : 200 // FIXME : 200 ?
+                    }));
+                    return;
+                }
+            }
+        } else {
+            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"]({
+                message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"),
+                type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"].TYPE_SRVERR,
+                status : -1 // FIXME : status response
+            }));
+            return;
+        }
+
+        options.onSuccess.call(options.scope, data);
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (DirectGeocodeReponseFactory);
+
+
+/***/ }),
+/* 106 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(44);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(45);
+/* harmony import */ var _Response_model_GeocodeResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(107);
+/* harmony import */ var _Response_model_DirectGeocodedLocation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(108);
+
+/**
+ * Fonction retournant un objet contenant des clés de lecture (readers)
+ *      qui permettent de parser des réponses XML du service de géocodage direct du Géoportail
+ *      afin de récupérer les résultats retournés.
+ * @module DirectGeocodeResponseReader
+ * @alias Gp.Services.Geocode.Formats.DirectGeocodeResponseReader
+ * @private
+ */
+
+// import Logger from "../../../Utils/LoggerByDefault";
+
+
+
+
+
+/**
+ * @member DirectGeocodeResponseReader
+ */
+var DirectGeocodeResponseReader = {};
+
+/**
+ * @property {String} DirectGeocodeResponseReader.VERSION - version du service de géocodage
+ */
+DirectGeocodeResponseReader.VERSION = "1.2";
+
+/**
+ * Objet stockant les différents namespaces et les URI associées
+ */
+DirectGeocodeResponseReader.NAMESPACES = {
+    xmlns : "http://www.opengis.net/xls",
+    gml : "http://www.opengis.net/gml",
+    xls : "http://www.opengis.net/xls",
+    xlsext : "http://www.opengis.net/xlsext",
+    xsi : "http://www.w3.org/2001/XMLSchema-instance"
+};
+
+/**
+ * Localisation (URL) du schema de définition du XML (XSD)
+ */
+DirectGeocodeResponseReader.SCHEMALOCATION = "http://wxs.ign.fr/schemas/olsAll.xsd";
+
+/**
+ * Namespace par défaut du format
+ */
+DirectGeocodeResponseReader.DEFAULTPREFIX = "xls";
+
+/**
+ * Objet contenant des fonctions de lecture, appelées "READERS"
+ *      dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire
+ *      et la valeur associée est une fonction (node, data)
+ *      où node est un noeud du document DOM
+ *      et data est un objet où l'on stocke les informations lues dans le XML.
+ */
+DirectGeocodeResponseReader.READERS = {
+
+    xls : {
+
+        /** TODO : jsdoc block */
+        XLS : function (root) {
+            var geocodeResponse = new _Response_model_GeocodeResponse__WEBPACK_IMPORTED_MODULE_2__["default"]();
+
+            // vérification de la version du service, et des namespaces de l'en-tête
+            __checkServiceAttributes(root);
+
+            // puis lancement de la lecture de l'ensemble des noeuds, en bouclant sur les childNodes
+            __getChildNodes(root, geocodeResponse);
+
+            return geocodeResponse;
+        },
+
+        /** TODO : jsdoc block */
+        GeocodedAddress : function (node, geocodeResponse) {
+            var geocodedLocation = new _Response_model_DirectGeocodedLocation__WEBPACK_IMPORTED_MODULE_3__["default"]();
+
+            __getChildNodes(node, geocodedLocation);
+
+            // Ajout du résultat au tableau geocodedLocations de geocodeReponse
+            if (geocodeResponse && Array.isArray(geocodeResponse.locations)) {
+                geocodeResponse.locations.push(geocodedLocation);
+            }
+        },
+
+        /** TODO : jsdoc block */
+        GeocodeMatchCode : function (node, geocodedLocation) {
+            var acc = node.getAttribute("accuracy");
+            if (acc && geocodedLocation) {
+                geocodedLocation.accuracy = parseFloat(acc);
+            }
+            var matchType = node.getAttribute("matchType");
+            if (matchType && geocodedLocation) {
+                geocodedLocation.matchType = matchType;
+            }
+        },
+
+        /** TODO : jsdoc block */
+        Address : function (node, geocodedLocation) {
+            var countrycode = node.getAttribute("countryCode");
+            if (geocodedLocation && countrycode) {
+                geocodedLocation.type = countrycode;
+            }
+            // on va récupérer les autres informations (StreetAddress, place, postalCode...)
+            __getChildNodes(node, geocodedLocation);
+        },
+
+        /** TODO : jsdoc block */
+        freeFormAddress : function (node, geocodedLocation) {
+            if (geocodedLocation && geocodedLocation.hasOwnProperty("placeAttributes")) {
+                geocodedLocation.placeAttributes.freeform = __getChildValue(node);
+            }
+        },
+
+        /** TODO : jsdoc block */
+        Building : function (node, geocodedLocation) {
+            var num = node.getAttribute("number");
+            if (geocodedLocation && geocodedLocation.hasOwnProperty("placeAttributes")) {
+                if (num) {
+                    geocodedLocation.placeAttributes.number = num;
+                } else if (node.getAttribute("buildingName")) {
+                    geocodedLocation.placeAttributes.number = node.getAttribute("buildingName");
+                } else if (node.getAttribute("subdivision")) {
+                    geocodedLocation.placeAttributes.number = node.getAttribute("subdivision");
+                }
+            }
+        },
+
+        /** TODO : jsdoc block */
+        Street : function (node, geocodedLocation) {
+            if (geocodedLocation && geocodedLocation.hasOwnProperty("placeAttributes")) {
+                // in case of a streetAddress result : street represents the street name
+                if (geocodedLocation.type === "StreetAddress") {
+                    geocodedLocation.placeAttributes.street = __getChildValue(node);
+
+                    // in case of a cadastral parcel result : street represents the cadastral parcel identifier
+                } else if (geocodedLocation.type === "CadastralParcel") {
+                    geocodedLocation.placeAttributes.cadastralParcel = __getChildValue(node);
+                }
+            }
+        },
+
+        /** TODO : jsdoc block */
+        Place : function (node, geocodedLocation) {
+            var placeType = node.getAttribute("type");
+            var placeName = __getChildValue(node);
+
+            if (geocodedLocation && geocodedLocation.hasOwnProperty("placeAttributes")) {
+                if (placeType === "Municipality") {
+                    geocodedLocation.placeAttributes.municipality = placeName;
+                } else if (placeType === "Bbox") {
+                    var values = placeName.split(";");
+                    if (values.length === 4) {
+                        geocodedLocation.placeAttributes.bbox = {
+                            left : parseFloat(values[0]),
+                            right : parseFloat(values[2]),
+                            top : parseFloat(values[1]),
+                            bottom : parseFloat(values[3])
+                        };
+                    }
+                } else if (placeType === "Commune") {
+                    geocodedLocation.placeAttributes.commune = placeName;
+                } else if (placeType === "Departement") {
+                    geocodedLocation.placeAttributes.department = placeName;
+                } else if (placeType === "INSEE") {
+                    geocodedLocation.placeAttributes.insee = placeName;
+                } else if (placeType === "Qualite") {
+                    geocodedLocation.placeAttributes.quality = placeName;
+                } else if (placeType === "Territoire") {
+                    geocodedLocation.placeAttributes.territory = placeName;
+                } else if (placeType === "ID") {
+                    geocodedLocation.placeAttributes.ID = placeName;
+                } else if (placeType === "ID_TR") {
+                    geocodedLocation.placeAttributes.IDTR = placeName;
+                } else if (placeType === "Importance") {
+                    geocodedLocation.placeAttributes.importance = parseInt(placeName, 10);
+                } else if (placeType === "Nature") {
+                    geocodedLocation.placeAttributes.nature = placeName;
+                } else if (placeType === "Numero") {
+                    geocodedLocation.placeAttributes.number = placeName;
+                } else if (placeType === "Feuille") {
+                    geocodedLocation.placeAttributes.sheet = placeName;
+                } else if (placeType === "Section") {
+                    geocodedLocation.placeAttributes.section = placeName;
+                } else if (placeType === "CommuneAbsorbee") {
+                    geocodedLocation.placeAttributes.absorbedCity = placeName;
+                } else if (placeType === "Arrondissement") {
+                    if (placeName) {
+                        geocodedLocation.placeAttributes.arrondissement = placeName;
+                    }
+                } else if (placeType === "Type") {
+                    geocodedLocation.placeAttributes.origin = placeName;
+                } else if (placeType === "Prefecture") {
+                    geocodedLocation.placeAttributes.prefecture = placeName;
+                } else if (placeType === "InseeRegion") {
+                    geocodedLocation.placeAttributes.inseeRegion = placeName;
+                } else if (placeType === "InseeDepartment") {
+                    geocodedLocation.placeAttributes.inseeDepartment = placeName;
+                }
+            }
+        },
+
+        /** TODO : jsdoc block */
+        PostalCode : function (node, geocodedLocation) {
+            if (geocodedLocation && geocodedLocation.hasOwnProperty("placeAttributes")) {
+                geocodedLocation.placeAttributes.postalCode = __getChildValue(node);
+            }
+        },
+
+        /** TODO : jsdoc block */
+        Error : function (node) {
+            // on imagine qu'on a une balise ainsi :
+            // <Error message="Message..." errorCode="InternalServerError"/>
+            var srvMess = node.getAttribute("message");
+            var errorCode = node.getAttribute("errorCode");
+            var message = _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION",
+                "(" + errorCode + ") : " + srvMess);
+            throw new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"]({
+                message : message,
+                type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"].TYPE_SRVERR
+            });
+        }
+    },
+
+    gml : {
+
+        /** TODO : jsdoc block */
+        pos : function (node, geocodedLocation) {
+            var pos = __getChildValue(node);
+            if (geocodedLocation && pos) {
+                geocodedLocation.position = {
+                    x : parseFloat(pos.split(" ")[0]),
+                    y : parseFloat(pos.split(" ")[1])
+                };
+            }
+        }
+    },
+
+    /** TODO : jsdoc block */
+    ExceptionReport : function (node) {
+        var response = {};
+        if (node.hasChildNodes()) {
+            var children = node.childNodes;
+            var child;
+            for (var i = 0; i < children.length; i++) {
+                child = children[i];
+                if (child.nodeName === "Exception") {
+                    response.exceptionReport = DirectGeocodeResponseReader.READERS["Exception"](child);
+                }
+            }
+        }
+        return response;
+    },
+
+    /** TODO : jsdoc block */
+    Exception : function (node) {
+        var exceptionReport = {};
+
+        // get exception code
+        var exceptionCode = node.getAttribute("exceptionCode");
+        if (exceptionCode) {
+            exceptionReport.exceptionCode = exceptionCode;
+        }
+
+        // get exception message
+        var textNode = node.firstChild;
+        if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+            exceptionReport.exception = textNode.nodeValue;
+        }
+
+        return exceptionReport;
+    }
+
+};
+
+/**
+ * Méthode permettant de lancer la lecture d'une réponse XML du service de géocodage,
+ *      à l'aide des READERS de la classe.
+ *
+ * @method DirectGeocodeResponseReader.read
+ * @param {DOMElement} root - racine de la réponse XML à lire
+ * @return {Object} geocodeResponse|exceptionReport : l'objet contenant les informations de la réponse XML,
+ *      sous la forme d'un objet GeocodeResponse, ou un objet littéral exceptionReport si le service a renvoyé une exception.
+ * @static
+ * @memberof DirectGeocodeResponseReader
+ */
+DirectGeocodeResponseReader.read = function (root) {
+    if (root.nodeName === "XLS") {
+        var nsPrefix = root.prefix;
+        if (!nsPrefix) {
+            nsPrefix = DirectGeocodeResponseReader.DEFAULTPREFIX;
+        }
+        var geocodeResponse = DirectGeocodeResponseReader.READERS[nsPrefix][root.nodeName](root);
+        return geocodeResponse;
+    } else if (root.nodeName === "ExceptionReport") {
+        var exceptionReport = DirectGeocodeResponseReader.READERS[root.nodeName](root);
+        return exceptionReport;
+    } else {
+        var mess = _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__["default"].getMessage("SERVICE_RESPONSE_ANALYSE", root.nodeName);
+        throw new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"]({
+            message : mess,
+            type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"].TYPE_UNKERR,
+            status : 200
+        });
+    }
+};
+
+/**
+ * Récupération des attributs d'un noeud élément
+ *
+ * @private
+ * @memberof DirectGeocodeResponseReader
+ * @method __getAttributes
+ * @param {DOMElement} node - noeud contenant l'attribut recherché
+ * @return {Object} nodeAttributes - objet contenant les noms et valeurs des différents attributs
+ */
+function __getAttributes (node) {
+    if (node.attributes.length > 0) {
+        var nodeAttributes = {};
+        var attributes = node.attributes;
+        for (var i = 0; i < attributes.length; i++) {
+            var attribute = attributes[i];
+            nodeAttributes[attribute.nodeName] = attribute.nodeValue;
+        }
+        return nodeAttributes;
+    }
+}
+
+/**
+ * Récupération des noeuds enfants à partir d'un noeud donné, pour lecture (readNode).
+ *
+ * @private
+ * @memberof DirectGeocodeResponseReader
+ * @method __getChildNodes
+ * @param {DOMElement} node - a DOM node
+ * @param {Array|Object} [data] - an object to be filled with node data
+ */
+function __getChildNodes (node, data) {
+    if (node.hasChildNodes()) {
+        var children = node.childNodes;
+        var child;
+        var childName;
+        var childPrefix;
+
+        for (var i = 0; i < children.length; i++) {
+            child = children[i];
+
+            if (child.nodeType === 1) { // 1 === node.ELEMENT_NODE
+                childName = child.localName || child.baseName || child.nodeName;
+                childPrefix = child.prefix || DirectGeocodeResponseReader.DEFAULTPREFIX;
+
+                if (DirectGeocodeResponseReader.READERS[childPrefix][childName]) {
+                    var reader = DirectGeocodeResponseReader.READERS[childPrefix][childName];
+                    reader(child, data);
+                } else {
+                    __getChildNodes(child, data);
+                }
+            }
+        }
+    }
+}
+
+/**
+ * Lecture de la valeur du premier child d'un noeud, si elle existe.
+ *
+ * @private
+ * @memberof DirectGeocodeResponseReader
+ * @method __getChildValue
+ * @param {DOMElement} node - a DOM node
+ * @return {String} value - valeur du firstChild du noeud en entrée, ou chaîne vide.
+ */
+function __getChildValue (node) {
+    var textNode;
+    var value = "";
+
+    if (node.hasChildNodes()) {
+        textNode = node.firstChild;
+        if (textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+            value = textNode.nodeValue;
+        }
+    }
+    return value;
+}
+
+/**
+ * Vérification des attributs du service, dans la balise XLS de la réponse :
+ *      version, namespaces, et namespace par défaut doivent correspondre à ceux attendus.
+ *
+ * @private
+ * @memberof DirectGeocodeResponseReader
+ * @method __checkServiceAttributes
+ * @param {DOMElement} XLSNode - a DOM node, corresponding to XLS first tag.
+ */
+function __checkServiceAttributes (XLSNode) {
+    if (XLSNode.attributes.length > 0) {
+        // on récupère et parcourt les attributs de la balise XLS de la réponse
+        var xlsAttributes = __getAttributes(XLSNode);
+        for (var att in xlsAttributes) {
+            if (xlsAttributes.hasOwnProperty(att)) {
+                // vérification de la version
+                if (att === "version") {
+                    if (xlsAttributes["version"] !== DirectGeocodeResponseReader.VERSION) {
+                        console.log("[DirectGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing");
+                        return;
+                    }
+                }
+
+                // on vérifie que l'uri du namespace par défaut est bien celle que l'on attend
+                if (att === "xmlns") {
+                    if (xlsAttributes[att] !== DirectGeocodeResponseReader.NAMESPACES[DirectGeocodeResponseReader.DEFAULTPREFIX]) {
+                        console.log("[DirectGeocodeResponseReader] geocode response default namespace is not the expected one");
+                        return;
+                    }
+                    continue;
+                }
+
+                var prefix = att.split(":")[0];
+                var ns = att.split(":")[1];
+
+                // si on a un autre xmlns, on vérifie aussi les URI
+                if (prefix === "xmlns" && ns) {
+                    // si l'attribut correspond à un namespace défini dans le reader
+                    if (DirectGeocodeResponseReader.NAMESPACES[ns]) {
+                        // il faut que les URI correspondent aussi.
+                        if (DirectGeocodeResponseReader.NAMESPACES[ns] !== xlsAttributes[att]) {
+                            console.log("[DirectGeocodeResponseReader] geocode response " + att + " namespace is not the expected one");
+                            return;
+                        }
+                    }
+                }
+
+                // pour finir on vérifie la localisation du schema XSD du service
+                if (ns === "schemaLocation") {
+                    if (DirectGeocodeResponseReader.SCHEMALOCATION !== xlsAttributes[att]) {
+                        console.log("[DirectGeocodeResponseReader] geocode response schema location is not the expected one");
+                        return;
+                    }
+                }
+            }
+        }
+    }
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (DirectGeocodeResponseReader);
+
+
+/***/ }),
+/* 107 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Response object for {@link module:Services~geocode Gp.Services.geocode ()} or {@link module:Services~reverseGeocode Gp.Services.reverseGeocode ()} invocation when successful. Received as the argument of onSuccess callback function.
+ *
+ * @property {Array.<Gp.Services.Geocode.DirectGeocodedLocation|Gp.Services.Geocode.ReverseGeocodedLocation>} locations - locations array.
+ *
+ * @namespace
+ * @alias Gp.Services.GeocodeResponse
+ */
+function GeocodeResponse () {
+    if (!(this instanceof GeocodeResponse)) {
+        throw new TypeError("GeocodeResponse constructor cannot be called as a function.");
+    }
+
+    this.locations = [];
+}
+
+GeocodeResponse.prototype = {
+
+    constructor : GeocodeResponse
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (GeocodeResponse);
+
+
+/***/ }),
+/* 108 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _GeocodedLocation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(109);
+
+
+
+/**
+ * Single location object returned by the underlying geocoding web service.
+ *
+ * @property {Float} accuracy - Accuracy of the response towards the requested location between 0 (unaccurate) and 1 (exact match).
+ *
+ * @namespace
+ * @extends {Gp.Services.Geocode.GeocodedLocation}
+ * @alias Gp.Services.Geocode.DirectGeocodedLocation
+ */
+function DirectGeocodedLocation () {
+    if (!(this instanceof DirectGeocodedLocation)) {
+        throw new TypeError("DirectGeocodedLocation constructor cannot be called as a function.");
+    }
+
+    // INFO
+    // appel du constructeur de la classe mère
+    // avec passage de param.
+    _GeocodedLocation__WEBPACK_IMPORTED_MODULE_0__["default"].apply(this, arguments);
+
+    /**
+     * Nom de la classe (heritage) : "DirectGeocodedLocation"
+     * @type {String}
+     */
+    this.CLASSNAME = "DirectGeocodedLocation";
+
+    this.accuracy = null;
+}
+
+DirectGeocodedLocation.prototype = Object.create(_GeocodedLocation__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
+
+DirectGeocodedLocation.prototype.constructor = DirectGeocodedLocation;
+
+/* harmony default export */ __webpack_exports__["default"] = (DirectGeocodedLocation);
+
+
+/***/ }),
+/* 109 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Location object holding common properties returned by the underlying geocoding and reverse geocoding web service.
+ *
+ * @property {Gp.Point} position - Position of the location given in the requested coordinates system.
+ * @property {String} type - location type "StreetAddress" (for an address), "PositionOfInterest" (for a place name) or "CadastralParcel" (for cadastral parcel).
+ * @property {String} matchType - how geocoding is performed : "street number" (exact address), "street enhanced" (street number calculated by interpolation), "street" (only the street), "city" (only the city).
+ * @property {Object} placeAttributes - Associative array matching the following attributes with their values given by the underlying web service :
+ *
+ * *Common attributes : *
+ *
+ * - **freeform** - freeform complete Address.
+ * - **bbox** - Bounding Box *{@link Gp.BBox}*.
+ * - **municipality** - Municipality
+ *
+ * *if type === "StreetAddress" : *
+ *
+ * - **number** - Street number.
+ * - **ID** - Identifier of the address in the [BD ADRESSE Database]{@link http://professionnels.ign.fr/bdadresse}.
+ * - **IDTR** - Identifier of the lineString in the [BD ADRESSE Database]{@link http://professionnels.ign.fr/bdadresse}.
+ * - **postalCode** - PostCode
+ * - **quality** - Geocoding quality ([see]{@link http://api.ign.fr/tech-docs-js/developpeur/search.html})
+ * - **street** - Street name
+ * - **territory** - French Territory code
+ * - **commune** - City
+ * - **department** - Department
+ * - **insee** - INSEE Code
+ *
+ *
+ * *if type === "PositionOfInterest" :*
+ *
+ * - **importance** - Place name importance
+ * - **nature** - Place name nature
+ * - **postalCode** - PostCode
+ * - **territory** - French Territory code
+ * - **commune** - City
+ * - **department** - Department
+ * - **insee** - INSEE Code
+ *
+ *
+ * *si type = "CadastralParcel" :*
+ *
+ * - **absorbedCity** - when a parcel comes from a city that was absorbed by another, code of that old city. "000" otherwise.
+ * - **arrondissement** - arrondissement
+ * - **cadastralParcel** - cadastral parcel code
+ * - **district** - district
+ * - **sheet** - Parcel Sheet (eg. "1").
+ * - **number** - Parcel Number (eg. "0041")
+ * - **section** - Parcel Section (eg. "0D").
+ * - **commune** - Parcel municipality.
+ * - **department** - Parcel Department.
+ * - **insee** - INSEE Code.
+ * - **origin** - Parcel origin (see "type" attribute in the [underlying web service response]{@link http://api.ign.fr/tech-docs-js/developpeur/search.html#Cadastral_parcels_search})
+ *
+ * @namespace
+ * @alias Gp.Services.Geocode.GeocodedLocation
+ */
+function GeocodedLocation () {
+    if (!(this instanceof GeocodedLocation)) {
+        throw new TypeError("GeocodedLocation constructor cannot be called as a function.");
+    }
+
+    this.position = {
+        x : null,
+        y : null
+    };
+
+    this.matchType = null;
+
+    this.placeAttributes = {};
+
+    this.type = null;
+}
+
+GeocodedLocation.prototype = {
+
+    constructor : GeocodedLocation
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (GeocodedLocation);
+
+
+/***/ }),
+/* 110 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45);
+/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(46);
+/* harmony import */ var _Request_ReverseGeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(111);
+/* harmony import */ var _Response_ReverseGeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(112);
+
+
+
+
+
+
+
+
+/**
+ * @classdesc
+ * Appel du service de géocodage inverse du Géoportail :
+ *     envoi de la requête construite selon les paramètres en options,
+ *     éventuellement parsing et analyse  de la réponse,
+ *     retour d'une réponse en paramètre de la fonction onSuccess.
+ * @constructor
+ * @extends {Gp.Services.CommonService}
+ * @alias Gp.Services.ReverseGeocode
+ *
+ * @param {Object} options - options spécifiques au service (+ les options heritées)
+ *
+ * @param {Object} options.position - Position du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs.
+ *      @param {Float} options.position.x - Abcisse du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs. (= longitude si srs = "CRS:84", latitude si srs = "EPSG:4326")
+ *      @param {Float} options.position.y - Ordonnée du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs. (= latitude si srs = "CRS:84", longitude si srs = "EPSG:4326")
+ *
+ * @param {Object} [options.filterOptions] - Les propriétés possibles de cet objet sont décrites ci-après.
+ * @param {Object} [options.filterOptions.bbox] - Emprise dans laquelle on souhaite effectuer la recherche.
+ *      Les propriétés possibles de cet objet sont décrites ci-après.
+ *      @param {Float} options.filterOptions.bbox.left   - Abscisse du côté gauche de la BBOX
+ *      @param {Float} options.filterOptions.bbox.right  - Abscisse du côté droit de la BBOX
+ *      @param {Float} options.filterOptions.bbox.top    - Ordonnée supérieure de la BBOX
+ *      @param {Float} options.filterOptions.bbox.bottom - Ordonnée inférieure de la BBOX
+ *
+ * @param {Object} [options.filterOptions.circle] - Cercle dans lequel on souhaite effectuer la recherche.
+ *      Les propriétés possibles de cet objet sont décrites ci-après.
+ *      @param {Float} options.filterOptions.circle.x      - Abscisse du centre du cercle de recherche.
+ *      @param {Float} options.filterOptions.circle.y      - Ordonnée du centre du cercle de recherche.
+ *      @param {Float} options.filterOptions.circle.radius - Rayon du cercle de recherche.
+ *
+ * @param {Array.<Object>} [options.filterOptions.polygon] - Polygone dans lequel on souhaite effectuer la recherche.
+ *      Liste des couples x et y pour chaque point constituant le polygone.
+ *
+ * @param {Array.<String>} [options.filterOptions.type = "StreetAddress"] - Type de l'objet recherché.
+ *      Le service de géocodage du Géoportail permet de rechercher des 'PostionOfInterest' pour des toponymes, des 'StreetAddress'
+ *      pour des adresses postales et/ou des 'CadastralParcel' pour des parcelles cadastrales.
+ *      D'autres types pourront être rajoutés selon l'évolution du service.
+ *      Par défaut, type = ['StreetAddress'].
+ *
+ * @param {Number} [options.maximumResponses] - Nombre de réponses maximal que l'on souhaite recevoir.
+ *      Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 25.
+ *
+ * @param {String} [options.srs = CRS:84] - Système de coordonnées dans lequel les paramètres géographiques en entrée et la réponse du service sont exprimés.
+ *      Pas de valeur par défaut.
+ *      Si le serveur consulté est celui du Géoportail, la valeur par défaut est : "CRS:84".
+ *
+ * @example
+ *   var options = {
+ *      apiKey : null,
+ *      serverUrl : 'http://localhost/service/',
+ *      protocol : 'JSONP', // JSONP|XHR
+ *      proxyURL : null,
+ *      httpMethod : 'GET', // GET|POST
+ *      timeOut : 10000, // ms
+ *      rawResponse : false, // true|false
+ *      scope : null, // this
+ *      onSuccess : function (response) {},
+ *      onFailure : function (error) {},
+ *      // spécifique au service
+ *      position : {x:0 , y:0},
+ *      filterOptions :{
+ *          bbox : {left : 0, right : 1, top : 1, bottom : 0},
+ *          [circle : {
+ *              x : 0,
+ *              y : 0,
+ *              radius : 100
+ *          }]
+ *          [polygon  : [{x:0,y:0}, {x:1,y:1}, {x:2,y:2}, {x:3,y:2}, {x:4,y:1}, {x:0,y:0}]]
+ *          type : ['StreetAddress']
+ *      },
+ *      maximumResponses : 25,
+ *      srs : 'EPSG:4326'
+ *   };
+ *
+ * @private
+ */
+function ReverseGeocode (options) {
+    if (!(this instanceof ReverseGeocode)) {
+        throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "ReverseGeocode"));
+    }
+
+    /**
+     * Nom de la classe (heritage)
+     * FIXME instance ou classe ?
+     */
+    this.CLASSNAME = "ReverseGeocode";
+
+    // appel du constructeur par heritage
+    _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, arguments);
+
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.ReverseGeocode");
+    this.logger.trace("[Constructeur ReverseGeocode (options)]");
+
+    if (!options.position) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "position"));
+    }
+
+    // on lance une exception afin d'eviter au service de le faire...
+    if (options.position.x === null) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "position.x"));
+    }
+
+    if (options.position.y === null) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "position.y"));
+    }
+
+    // ajout des options spécifiques au service
+    this.options.position = options.position;
+
+    // on definit des filtres par defaut
+    if (!options.filterOptions || typeof options.filterOptions !== "object") {
+        this.options.filterOptions = options.filterOptions = {
+            type : ["StreetAddress"]
+        };
+    }
+
+    // FIXME ECMAScript 5 support (valable pour un objet uniquement !)
+    // ceci permet de tester le cas où : object = {}
+    if (Object.keys(options.filterOptions).length === 0) {
+        this.options.filterOptions = {
+            type : ["StreetAddress"]
+        };
+    }
+
+    // on teste pour chaque filtre, les conditions suivantes : null ou vide !
+    var filter = Object.keys(options.filterOptions);
+    for (var i = 0; i < filter.length; i++) {
+        var key = filter[i];
+        if (!options.filterOptions[key] || Object.keys(options.filterOptions[key]).length === 0) {
+            delete this.options.filterOptions[key];
+        }
+    }
+
+    this.options.filterOptions.type = options.filterOptions.type || ["StreetAddress"];
+    // on vérifie que le type est bien dans un tableau
+    if (!Array.isArray(this.options.filterOptions.type)) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_TYPE", "filterOptions.type"));
+    }
+
+    this.options.maximumResponses = options.maximumResponses || 25;
+
+    // FIXME : cet attribut (returnFreeForm) n'est pas spécifié dans la doc du constructeur ?
+    // Il est inutile en effet, mais présent dans les specs...
+    this.options.returnFreeForm = options.returnFreeForm || false;
+    // info : en réalité le service ne reconnait que EPSG:4326. this.options.srs permet essentiellement de différencier EPSG:4326 (lat,lon) et CRS:84 (lon,lat)
+    this.options.srs = options.srs || "CRS:84";
+
+    // si on n'a pas un systeme de coordonnées EPSG géographique, il faut inverser les coordonnées
+    // (car elles sont en lon, lat alors que le service attend une position en lat, lon).
+    // dans le cas d'EPSG:4326 par exemple, les coordonnées sont bien en lat, lon donc on ne fait rien.
+    if (ReverseGeocode.geoEPSG.indexOf(this.options.srs) === -1) {
+        // pour la position
+        this.options.position = {
+            x : this.options.position.y,
+            y : this.options.position.x
+        };
+        // pour les filtres spatiaux s'ils sont spécifiés
+        if (this.options.filterOptions && this.options.filterOptions.circle) {
+            var circle = this.options.filterOptions.circle;
+            this.options.filterOptions.circle = {
+                x : circle.y,
+                y : circle.x,
+                radius : circle.radius
+            };
+        }
+        if (this.options.filterOptions && this.options.filterOptions.polygon) {
+            var polygon = this.options.filterOptions.polygon;
+            for (i = 0; i < polygon.length; i++) {
+                var coords = polygon[i];
+                this.options.filterOptions.polygon[i] = {
+                    x : coords.y,
+                    y : coords.x
+                };
+            }
+        }
+    }
+
+    // attributs d'instances
+
+    /**
+     * Format forcé de la réponse du service : "xml"
+     * sauf si l'on souhaite une reponse brute (options.rawResponse)
+     */
+    this.options.outputFormat = (this.options.rawResponse) ? "" : "xml";
+}
+
+/**
+ * @lends module:ReverseGeocode#
+ */
+ReverseGeocode.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, {
+    // todo
+    // getter/setter
+});
+
+/*
+ * Constructeur (alias)
+ */
+ReverseGeocode.prototype.constructor = ReverseGeocode;
+
+/**
+ * (overwrite)
+ * Création de la requête
+ *
+ * @param {Function} error   - callback des erreurs
+ * @param {Function} success - callback
+ */
+ReverseGeocode.prototype.buildRequest = function (error, success) {
+    var options = {
+        httpMethod : this.options.httpMethod,
+        // options specifiques du service
+        position : this.options.position,
+        returnFreeForm : this.options.returnFreeForm,
+        filterOptions : this.options.filterOptions,
+        srs : "EPSG:4326", // info : en réalité le service ne reconnait que EPSG:4326. this.options.srs permet essentiellement de différencier EPSG:4326 (lat,lon) et CRS:84 (lon,lat)
+        maximumResponses : this.options.maximumResponses
+    };
+
+    this.request = _Request_ReverseGeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_4__["default"].build(options);
+
+    // on teste si la requete a bien été construite !
+    (!this.request)
+        ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_REQUEST_BUILD")))
+        : success.call(this, this.request);
+};
+
+/**
+ * (overwrite)
+ * Analyse de la reponse
+ *
+ * @param {Function} error   - callback des erreurs
+ * @param {Function} success - callback
+ */
+ReverseGeocode.prototype.analyzeResponse = function (error, success) {
+    if (this.response) {
+        var options = {
+            response : this.response,
+            rawResponse : this.options.rawResponse,
+            onError : error,
+            onSuccess : success,
+            scope : this
+        };
+
+        _Response_ReverseGeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_5__["default"].build(options);
+    } else {
+        error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY")));
+    }
+};
+
+/**
+ * Codes EPSG géographiques (lat/lon). Utiles car les coordonnées doivent être inversées.
+ */
+ReverseGeocode.geoEPSG = ["EPSG:4326"];
+
+/* harmony default export */ __webpack_exports__["default"] = (ReverseGeocode);
+
+
+/***/ }),
+/* 111 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Formats_XLS__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(89);
+/* harmony import */ var _Formats_XLS_LocationUtilityService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(93);
+/**
+ * Creation d'une requête OpenLS en mode POST ou GET
+ * (Factory)
+ *
+ * @module ReverseGeocodeRequestFactory
+ * @alias Gp.Services.Geocode.Request.ReverseGeocodeRequestFactory
+ * @private
+ */
+
+
+
+
+var ReverseGeocodeRequestFactory = {
+
+    /**
+     * interface unique
+     *
+     * @method build
+     * @static
+     * @param {Object} options - options definies dans le composant Geocode
+     *
+     * @example
+     *   var options = {
+     *      httpMethod :
+     *      // options specifiques du service
+     *      position :
+     *      returnFreeForm :
+     *      filterOptions :
+     *      srs :
+     *      maximumResponses :
+     *   };
+     *   var result = ReverseGeocodeRequestFactory.build(options);
+     *   if (!result) {
+     *       // error...
+     *   }
+     * @returns {String} request
+     */
+    build : function (options) {
+        // logger
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("ReverseGeocodeRequestFactory");
+        logger.trace(["ReverseGeocodeRequestFactory::build()"]);
+
+        // options non definies
+        var settings = options || {};
+
+        var request = null;
+
+        // objet LUS
+        var oLUS = new _Formats_XLS_LocationUtilityService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+            position : settings.position,
+            returnFreeForm : settings.returnFreeForm,
+            filterOptions : settings.filterOptions
+        });
+
+        // Format XLS
+        var oXLS = new _Formats_XLS__WEBPACK_IMPORTED_MODULE_1__["default"]({
+            srsName : settings.srs,
+            maximumResponses : settings.maximumResponses
+        });
+        oXLS.namespace = true;
+        oXLS.setService(oLUS);
+
+        // request brute !
+        request = oXLS.build();
+
+        // en mode GET, la requête est encodée
+        // et le param. 'qxml' est ajouté
+        if (settings.httpMethod === "GET") {
+            var myRequest = "qxml=" +
+                encodeURIComponent(request)
+                    .replace(/-/g, "%2D")
+                    .replace(/_/g, "%5F")
+                    .replace(/\./g, "%2E")
+                    .replace(/!/g, "%21")
+                    .replace(/~/g, "%7E")
+                    .replace(/\*/g, "%2A")
+                    .replace(/'/g, "%27")
+                    .replace(/\(/g, "%28")
+                    .replace(/\)/g, "%29");
+            request = myRequest;
+        }
+
+        logger.trace(request);
+
+        return request;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (ReverseGeocodeRequestFactory);
+
+
+/***/ }),
+/* 112 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(44);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(45);
+/* harmony import */ var _Formats_XML__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(66);
+/* harmony import */ var _Formats_ReverseGeocodeResponseReader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(113);
+/**
+ * Factory pour générer une reponse JSON à partir d'un XML
+ * ou d'un JSON encapsulant du XML
+ * (Factory)
+ *
+ * @module ReverseGeocodeResponseFactory
+ * @alias Gp.Services.ReverseGeocode.Response.ReverseGeocodeResponseFactory
+ * @todo La reponse JSON peut encapsuler un XML !
+ * @private
+ */
+
+
+
+
+
+
+var ReverseGeocodeReponseFactory = {
+
+    /**
+     * interface unique
+     *
+     * @method build
+     * @static
+     * @param {Object} options - options definies dans le composant ReverseGeocode
+     *
+     * @example
+     *   var options = {
+     *      response :
+     *      rawResponse :
+     *      scope :
+     *      onSuccess :
+     *      onError :
+     *   };
+     *
+     */
+    build : function (options) {
+        // data de type ReverseGeocodeResponse
+        var data = null;
+
+        if (options.response) {
+            if (options.rawResponse) {
+                data = options.response;
+            } else {
+                try {
+                    var p = new _Formats_XML__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                        reader : _Formats_ReverseGeocodeResponseReader__WEBPACK_IMPORTED_MODULE_3__["default"]
+                    });
+
+                    if (typeof options.response === "string") {
+                        p.setXMLString(options.response);
+                    } else {
+                        p.setXMLDoc(options.response);
+                    }
+
+                    data = p.parse();
+
+                    if (!data) {
+                        throw new Error("L'analyse de la réponse du service !?");
+                    }
+                } catch (e) {
+                    // on relaye l'erreur reçue
+                    e.status = 200;
+                    options.onError.call(options.scope, e);
+                    return;
+                }
+
+                // Si la réponse contenait une exception renvoyée par le service
+                // TODO : quand cela arrive-t-il ?
+                if (data.exceptionReport) {
+                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"]({
+                        message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport),
+                        type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"].TYPE_SRVERR,
+                        status : 200
+                    }));
+                    return;
+                }
+
+                // dans le cas d'un srs non EPSG géographique, il faut réinverser les coordonnées (lat,lon => lon,lat)
+                if (options.scope && options.scope.options && options.scope.options.srs && options.scope.options.srs !== "EPSG:4326") {
+                    var location;
+                    var pos;
+                    if (data || data.locations || data.locations.length) {
+                        for (var i = 0; i < data.locations.length; i++) {
+                            location = data.locations[i];
+                            if (location) {
+                                pos = location.position;
+                                if (pos) {
+                                    // on inverse les 2 coordonnées
+                                    location.position = {
+                                        x : pos.y,
+                                        y : pos.x
+                                    };
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        } else {
+            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"]({
+                message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__["default"].getMessage("SERVICE_RESPONSE_EMPTY"),
+                type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"].TYPE_SRVERR,
+                status : -1 // FIXME : status response
+            }));
+            return;
+        }
+
+        options.onSuccess.call(options.scope, data);
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (ReverseGeocodeReponseFactory);
+
+
+/***/ }),
+/* 113 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(44);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(45);
+/* harmony import */ var _Response_model_GeocodeResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(107);
+/* harmony import */ var _Response_model_ReverseGeocodedLocation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(114);
+
+/**
+ * Fonction retournant un objet contenant des clés de lecture (readers)
+ *      qui permettent de parser des réponses XML du service de géocodage inverse du Géoportail
+ *      afin de récupérer les résultats retournés.
+ * @module ReverseGeocodeResponseReader
+ * @alias Gp.Services.Geocode.Formats.ReverseGeocodeResponseReader
+ * @private
+ */
+
+// import Logger from "../../../Utils/LoggerByDefault";
+
+
+
+
+
+/**
+ * Objet ReverseGeocodeResponseReader
+ * @member {Object} ReverseGeocodeResponseReader
+ *
+ * @property {String} ReverseGeocodeResponseReader.VERSION - Version du service de géocodage
+ *
+ * @property {Object} ReverseGeocodeResponseReader.NAMESPACES - Objet stockant les différents namespaces et les URI associées
+ *
+ * @property {String} ReverseGeocodeResponseReader.SCHEMALOCATION - Localisation (URL) du schema de définition du XML (XSD)
+ *
+ * @property {String} ReverseGeocodeResponseReader.DEFAULTPREFIX - Namespace par défaut du format
+ *
+ * @property {Object} ReverseGeocodeResponseReader.READERS - Objet contenant des fonctions de lecture, appelées "READERS"
+ *      dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire
+ *      et la valeur associée est une fonction (node, data)
+ *      où node est un noeud du document DOM
+ *      et data est un objet où l'on stocke les informations lues dans le XML.
+ *
+ * @property {Method} ReverseGeocodeResponseReader.read - Méthode permettant de lancer la lecture d'une réponse XML du service de géocodage,
+ *      à l'aide des READERS de la classe.
+ *
+ */
+
+var ReverseGeocodeResponseReader = {};
+
+/**
+ * version du service de géocodage
+ */
+ReverseGeocodeResponseReader.VERSION = "1.2";
+
+/**
+ * Objet stockant les différents namespaces et les URI associées
+ */
+ReverseGeocodeResponseReader.NAMESPACES = {
+    xmlns : "http://www.opengis.net/xls",
+    gml : "http://www.opengis.net/gml",
+    xls : "http://www.opengis.net/xls",
+    xlsext : "http://www.opengis.net/xlsext",
+    xsi : "http://www.w3.org/2001/XMLSchema-instance"
+};
+
+/**
+ * Localisation (URL) du schema de définition du XML (XSD)
+ */
+ReverseGeocodeResponseReader.SCHEMALOCATION = "http://wxs.ign.fr/schemas/olsAll.xsd";
+
+/**
+ * Namespace par défaut du format
+ */
+ReverseGeocodeResponseReader.DEFAULTPREFIX = "xls";
+
+/**
+ * Objet contenant des fonctions de lecture, appelées "READERS"
+ *      dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire
+ *      et la valeur associée est une fonction (node, data)
+ *      où node est un noeud du document DOM
+ *      et data est un objet où l'on stocke les informations lues dans le XML.
+ */
+ReverseGeocodeResponseReader.READERS = {
+
+    xls : {
+
+        /** TODO : jsdoc block */
+        XLS : function (root) {
+            var reverseGeocodeResponse = new _Response_model_GeocodeResponse__WEBPACK_IMPORTED_MODULE_2__["default"]();
+
+            // vérification de la version du service, et des namespaces de l'en-tête
+            __checkServiceAttributes(root);
+
+            // puis lancement de la lecture de l'ensemble des noeuds, en bouclant sur les childNodes
+            __getChildNodes(root, reverseGeocodeResponse);
+
+            return reverseGeocodeResponse;
+        },
+
+        /** TODO : jsdoc block */
+        ReverseGeocodedLocation : function (node, reverseGeocodeResponse) {
+            var reverseGeocodedLocation = new _Response_model_ReverseGeocodedLocation__WEBPACK_IMPORTED_MODULE_3__["default"]();
+
+            __getChildNodes(node, reverseGeocodedLocation);
+
+            // Ajout du résultat au tableau locations de reverseGeocodeResponse
+            if (reverseGeocodeResponse && Array.isArray(reverseGeocodeResponse.locations)) {
+                reverseGeocodeResponse.locations.push(reverseGeocodedLocation);
+            }
+        },
+
+        /** TODO : jsdoc block */
+        Address : function (node, reverseGeocodedLocation) {
+            var countrycode = node.getAttribute("countryCode");
+            if (reverseGeocodedLocation && countrycode) {
+                reverseGeocodedLocation.type = countrycode;
+            }
+            // on va récupérer les autres informations (StreetAddress, place, postalCode...)
+            __getChildNodes(node, reverseGeocodedLocation);
+        },
+
+        /** TODO : jsdoc block */
+        Building : function (node, reverseGeocodedLocation) {
+            var num = node.getAttribute("number");
+            if (reverseGeocodedLocation && reverseGeocodedLocation.hasOwnProperty("placeAttributes")) {
+                if (num) {
+                    reverseGeocodedLocation.placeAttributes.number = num;
+                } else if (node.getAttribute("buildingName")) {
+                    reverseGeocodedLocation.placeAttributes.number = node.getAttribute("buildingName");
+                } else if (node.getAttribute("subdivision")) {
+                    reverseGeocodedLocation.placeAttributes.number = node.getAttribute("subdivision");
+                }
+            }
+        },
+
+        /** TODO : jsdoc block */
+        Street : function (node, reverseGeocodedLocation) {
+            // in case of a streetAddress result : street represents the street name
+            if (reverseGeocodedLocation.type === "StreetAddress") {
+                reverseGeocodedLocation.placeAttributes.street = __getChildValue(node);
+
+                // in case of a cadastral parcel result : street represents the cadastral parcel identifier
+            } else if (reverseGeocodedLocation.type === "CadastralParcel") {
+                reverseGeocodedLocation.placeAttributes.cadastralParcel = __getChildValue(node);
+            }
+        },
+
+        /** TODO : jsdoc block */
+        Place : function (node, reverseGeocodedLocation) {
+            var placeType = node.getAttribute("type");
+            var placeName = __getChildValue(node);
+
+            if (reverseGeocodedLocation && reverseGeocodedLocation.hasOwnProperty("placeAttributes")) {
+                if (placeType === "Municipality") {
+                    reverseGeocodedLocation.placeAttributes.municipality = placeName;
+                } else if (placeType === "Bbox") {
+                    var values = placeName.split(";");
+                    if (values.length === 4) {
+                        reverseGeocodedLocation.placeAttributes.bbox = {
+                            left : parseFloat(values[0]),
+                            right : parseFloat(values[2]),
+                            top : parseFloat(values[1]),
+                            bottom : parseFloat(values[3])
+                        };
+                    }
+                } else if (placeType === "Commune") {
+                    reverseGeocodedLocation.placeAttributes.commune = placeName;
+                } else if (placeType === "Departement") {
+                    reverseGeocodedLocation.placeAttributes.department = placeName;
+                } else if (placeType === "INSEE") {
+                    reverseGeocodedLocation.placeAttributes.insee = placeName;
+                } else if (placeType === "Qualite") {
+                    reverseGeocodedLocation.placeAttributes.quality = placeName;
+                } else if (placeType === "Territoire") {
+                    reverseGeocodedLocation.placeAttributes.territory = placeName;
+                } else if (placeType === "ID") {
+                    reverseGeocodedLocation.placeAttributes.ID = placeName;
+                } else if (placeType === "ID_TR") {
+                    reverseGeocodedLocation.placeAttributes.IDTR = placeName;
+                } else if (placeType === "Importance") {
+                    reverseGeocodedLocation.placeAttributes.importance = parseInt(placeName, 10);
+                } else if (placeType === "Nature") {
+                    reverseGeocodedLocation.placeAttributes.nature = placeName;
+                } else if (placeType === "Numero") {
+                    reverseGeocodedLocation.placeAttributes.number = placeName;
+                } else if (placeType === "Feuille") {
+                    reverseGeocodedLocation.placeAttributes.sheet = placeName;
+                } else if (placeType === "Section") {
+                    reverseGeocodedLocation.placeAttributes.section = placeName;
+                } else if (placeType === "CommuneAbsorbee") {
+                    reverseGeocodedLocation.placeAttributes.absorbedCity = placeName;
+                } else if (placeType === "Arrondissement") {
+                    if (placeName) {
+                        reverseGeocodedLocation.placeAttributes.arrondissement = placeName;
+                    }
+                } else if (placeType === "Type") {
+                    reverseGeocodedLocation.placeAttributes.origin = placeName;
+                } else if (placeType === "Prefecture") {
+                    reverseGeocodedLocation.placeAttributes.prefecture = placeName;
+                } else if (placeType === "InseeRegion") {
+                    reverseGeocodedLocation.placeAttributes.inseeRegion = placeName;
+                } else if (placeType === "InseeDepartment") {
+                    reverseGeocodedLocation.placeAttributes.inseeDepartment = placeName;
+                }
+            }
+        },
+
+        /** TODO : jsdoc block */
+        PostalCode : function (node, reverseGeocodedLocation) {
+            if (reverseGeocodedLocation && reverseGeocodedLocation.hasOwnProperty("placeAttributes")) {
+                reverseGeocodedLocation.placeAttributes.postalCode = __getChildValue(node);
+            }
+        },
+
+        /** TODO : jsdoc block */
+        SearchCentreDistance : function (node, reverseGeocodedLocation) {
+            if (reverseGeocodedLocation) {
+                reverseGeocodedLocation.searchCenterDistance = parseFloat(node.getAttribute("value"));
+            }
+        },
+
+        /** TODO : jsdoc block */
+        Error : function (node) {
+            // <Error message="For input string : &quot;2,45&quot;" errorCode="InternalServerError"/>
+            var srvMess = node.getAttribute("message");
+            var errorCode = node.getAttribute("errorCode");
+            var message = _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION",
+                "(" + errorCode + ") : " + srvMess);
+            throw new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"]({
+                message : message,
+                type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"].TYPE_SRVERR
+            });
+        }
+    },
+
+    gml : {
+
+        /** TODO : jsdoc block */
+        pos : function (node, reverseGeocodedLocation) {
+            var pos = __getChildValue(node);
+            if (reverseGeocodedLocation && pos) {
+                reverseGeocodedLocation.position = {
+                    x : parseFloat(pos.split(" ")[0]),
+                    y : parseFloat(pos.split(" ")[1])
+                };
+            }
+        }
+    },
+
+    xlsext : {
+        /** TODO : jsdoc block */
+        ExtendedGeocodeMatchCode : function (node, reverseGeocodedLocation) {
+            if (reverseGeocodedLocation) {
+                reverseGeocodedLocation.matchType = __getChildValue(node);
+            }
+        }
+    },
+
+    /** TODO : jsdoc block */
+    ExceptionReport : function (node) {
+        var response = {};
+        if (node.hasChildNodes()) {
+            var children = node.childNodes;
+            var child;
+            for (var i = 0; i < children.length; i++) {
+                child = children[i];
+                if (child.nodeName === "Exception") {
+                    response.exceptionReport = ReverseGeocodeResponseReader.READERS["Exception"](child);
+                }
+            }
+        }
+        return response;
+    },
+
+    /** TODO : jsdoc block */
+    Exception : function (node) {
+        var exceptionReport = {};
+
+        // get exception code
+        var exceptionCode = node.getAttribute("exceptionCode");
+        if (exceptionCode) {
+            exceptionReport.exceptionCode = exceptionCode;
+        }
+
+        // get exception message
+        var textNode = node.firstChild;
+        if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+            exceptionReport.exception = textNode.nodeValue;
+        }
+
+        return exceptionReport;
+    }
+
+};
+
+/**
+ * Méthode permettant de lancer la lecture d'une réponse XML du service de géocodage,
+ *      à l'aide des READERS de la classe.
+ *
+ * @method ReverseGeocodeResponseReader.read
+ * @param {DOMElement} root - racine de la réponse XML à lire
+ * @return {Object} geocodeResponse|exceptionReport : l'objet contenant les informations de la réponse XML,
+ *      sous la forme d'un objet GeocodeResponse, ou un objet littéral exceptionReport si le service a renvoyé une exception.
+ * @static
+ * @memberof ReverseGeocodeResponseReader
+ */
+ReverseGeocodeResponseReader.read = function (root) {
+    if (root.nodeName === "XLS") {
+        var nsPrefix = root.prefix;
+        if (!nsPrefix) {
+            nsPrefix = ReverseGeocodeResponseReader.DEFAULTPREFIX;
+        }
+        var geocodeResponse = ReverseGeocodeResponseReader.READERS[nsPrefix][root.nodeName](root);
+        return geocodeResponse;
+    } else if (root.nodeName === "ExceptionReport") {
+        var exceptionReport = ReverseGeocodeResponseReader.READERS[root.nodeName](root);
+        return exceptionReport;
+    } else {
+        throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.");
+    }
+};
+
+/**
+ * Récupération des attributs d'un noeud élément
+ *
+ * @private
+ * @memberof ReverseGeocodeResponseReader
+ * @method __getAttributes
+ * @param {DOMElement} node - noeud contenant l'attribut recherché
+ * @return {Object} nodeAttributes - objet contenant les noms et valeurs des différents attributs
+ */
+function __getAttributes (node) {
+    if (node.attributes.length > 0) {
+        var nodeAttributes = {};
+        var attributes = node.attributes;
+        for (var i = 0; i < attributes.length; i++) {
+            var attribute = attributes[i];
+            nodeAttributes[attribute.nodeName] = attribute.nodeValue;
+        }
+        return nodeAttributes;
+    }
+}
+
+/**
+ * Récupération des noeuds enfants à partir d'un noeud donné, pour lecture (readNode).
+ *
+ * @private
+ * @memberof ReverseGeocodeResponseReader
+ * @method __getChildNodes
+ * @param {DOMElement} node - a DOM node
+ * @param {Array|Object} [data] - an object to be filled with node data
+ */
+function __getChildNodes (node, data) {
+    if (node.hasChildNodes()) {
+        var children = node.childNodes;
+        var child;
+        var childName;
+        var childPrefix;
+
+        for (var i = 0; i < children.length; i++) {
+            child = children[i];
+
+            if (child.nodeType === 1) { // 1 === node.ELEMENT_NODE
+                childName = child.localName || child.baseName || child.nodeName;
+                childPrefix = child.prefix || ReverseGeocodeResponseReader.DEFAULTPREFIX;
+
+                if (ReverseGeocodeResponseReader.READERS[childPrefix][childName]) {
+                    var reader = ReverseGeocodeResponseReader.READERS[childPrefix][childName];
+                    reader(child, data);
+                } else {
+                    __getChildNodes(child, data);
+                }
+            }
+        }
+    }
+}
+
+/**
+ * Lecture de la valeur du premier child d'un noeud, si elle existe.
+ *
+ * @private
+ * @memberof ReverseGeocodeResponseReader
+ * @method __getChildValue
+ * @param {DOMElement} node - a DOM node
+ * @return {String} value - valeur du firstChild du noeud en entrée, ou chaîne vide.
+ */
+function __getChildValue (node) {
+    var textNode;
+    var value = "";
+
+    if (node.hasChildNodes()) {
+        textNode = node.firstChild;
+        if (textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+            value = textNode.nodeValue;
+        }
+    }
+    return value;
+}
+
+/**
+ * Vérification des attributs du service, dans la balise XLS de la réponse :
+ *      version, namespaces, et namespace par défaut doivent correspondre à ceux attendus.
+ *
+ * @private
+ * @memberof ReverseGeocodeResponseReader
+ * @method __checkServiceAttributes
+ * @param {DOMElement} XLSNode - a DOM node, corresponding to XLS first tag.
+ */
+function __checkServiceAttributes (XLSNode) {
+    if (XLSNode.attributes.length > 0) {
+        // on récupère et parcourt les attributs de la balise XLS de la réponse
+        var xlsAttributes = __getAttributes(XLSNode);
+        for (var att in xlsAttributes) {
+            if (xlsAttributes.hasOwnProperty(att)) {
+                // vérification de la version
+                if (att === "version") {
+                    if (xlsAttributes["version"] !== ReverseGeocodeResponseReader.VERSION) {
+                        console.log("[ReverseGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing");
+                        return;
+                    }
+                }
+
+                // on vérifie que l'uri du namespace par défaut est bien celle que l'on attend
+                if (att === "xmlns") {
+                    if (xlsAttributes[att] !== ReverseGeocodeResponseReader.NAMESPACES[ReverseGeocodeResponseReader.DEFAULTPREFIX]) {
+                        console.log("[ReverseGeocodeResponseReader] geocode response default namespace is not the expected one");
+                        return;
+                    }
+                    continue;
+                }
+
+                var prefix = att.split(":")[0];
+                var ns = att.split(":")[1];
+
+                // si on a un autre xmlns, on vérifie aussi les URI
+                if (prefix === "xmlns" && ns) {
+                    // si l'attribut correspond à un namespace défini dans le reader
+                    if (ReverseGeocodeResponseReader.NAMESPACES[ns]) {
+                        // il faut que les URI correspondent aussi.
+                        if (ReverseGeocodeResponseReader.NAMESPACES[ns] !== xlsAttributes[att]) {
+                            console.log("[ReverseGeocodeResponseReader] geocode response " + att + " namespace is not the expected one");
+                            return;
+                        }
+                    }
+                }
+
+                // pour finir on vérifie la localisation du schema XSD du service
+                if (ns === "schemaLocation") {
+                    if (ReverseGeocodeResponseReader.SCHEMALOCATION !== xlsAttributes[att]) {
+                        console.log("[ReverseGeocodeResponseReader] geocode response schema location is not the expected one");
+                        return;
+                    }
+                }
+            }
+        }
+    }
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (ReverseGeocodeResponseReader);
+
+
+/***/ }),
+/* 114 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _GeocodedLocation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(109);
+
+
+
+/**
+ * Single location object returned by the underlying reverse geocoding web service.
+ *
+ * @property {Float} searchCenterDistance - Distance between the requested point and the location.
+ *
+ * @namespace
+ * @extends {Gp.Services.Geocode.GeocodedLocation}
+ * @alias Gp.Services.Geocode.ReverseGeocodedLocation
+ */
+function ReverseGeocodedLocation () {
+    if (!(this instanceof ReverseGeocodedLocation)) {
+        throw new TypeError("ReverseGeocodedLocation constructor cannot be called as a function.");
+    }
+
+    // INFO
+    // appel du constructeur de la classe mère
+    // avec passage de param.
+    _GeocodedLocation__WEBPACK_IMPORTED_MODULE_0__["default"].apply(this, arguments);
+
+    /**
+     * Nom de la classe (heritage) : "ReverseGeocodedLocation"
+     * @type {String}
+     */
+    this.CLASSNAME = "ReverseGeocodedLocation";
+
+    this.searchCenterDistance = null;
+}
+
+ReverseGeocodedLocation.prototype = Object.create(_GeocodedLocation__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
+
+ReverseGeocodedLocation.prototype.constructor = ReverseGeocodedLocation;
+
+/* harmony default export */ __webpack_exports__["default"] = (ReverseGeocodedLocation);
+
+
+/***/ }),
+/* 115 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(46);
+/* harmony import */ var _Response_AutoCompleteResponseFactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(116);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(44);
+/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(47);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(45);
+
+
+
+
+
+
+
+/**
+ * @classdesc
+ * Appel du service d'autocomplétion du Géoportail :
+ * envoi de la requête construite selon les paramètres en options,
+ * éventuellement parsing et analyse  de la réponse,
+ * retour d'une réponse en paramètre de la fonction onSuccess.
+ * @constructor
+ * @extends {Gp.Services.CommonService}
+ * @alias Gp.Services.AutoComplete
+ *
+ * @param {Object} options - options spécifiques au service (+ les options heritées)
+ *
+ * @param {String} options.text - La chaîne de caractère à compléter.
+ *      Cette chaîne n'est pas "URL encodée".
+ *      C'est l'API qui s'occupe de l'encoder pour l'inclure dans la requête.
+ *
+ * @param {Array.<String>} [options.filterOptions.type = "StreetAddress"] - Type de l'objet recherché.
+ *      Le service d'autocomplétion du Géoportail permet de rechercher des toponymes 'PostionOfInterest' et/ou des adresses postales 'StreetAddress'.
+ *      D'autres types pourront être rajoutés selon l'évolution du service.
+ *      Par défaut, type = ['StreetAddress'].
+ *
+ * @param {Array.<String>} [options.filterOptions.territory] - Limitation de la zone de recherche de localisants.
+ *      Le service d'autocomplétion du Géoportail permet de limiter la recherche à la métropole et la Corse : options.filterOptions.territory = ['METROPOLE'],
+ *      DOMS TOMS : options.filterOptions.territory = ['DOMTOM'], ou à une liste de départements : options.filterOptions.territory = ['31', '34']
+ *      Pas de valeur par défaut.
+ *      La valeur par défaut est donc celle du service.
+ *      Le service d'autocomplétion du Géoportail renvoie toutes les informations quand aucun territoire n'est spécifié.
+ *
+ * @param {Number} [options.maximumResponses = 10] - Nombre de réponses maximal que l'on souhaite recevoir.
+ *      Pas de valeur par défaut.
+ *      La valeur par défaut sera donc celle du service : 10.
+ *
+ * @example
+ *   var options = {
+ *      // options communes aux services
+ *      apiKey : null,
+ *      serverUrl : 'http://localhost/service/',
+ *      protocol : 'JSONP', // JSONP|XHR
+ *      proxyURL : null,
+ *      httpMethod : 'GET', // GET|POST
+ *      timeOut : 10000, // ms
+ *      rawResponse : false, // true|false
+ *      scope : null, // this
+ *      onSuccess : function (response) {},
+ *      onFailure : function (error) {},
+ *      // spécifique au service
+ *      text : "",
+ *      filterOptions : {
+ *          type : ["StreetAddress"],
+ *          territory : ['METROPOLE', 'DOMTOM', '31']
+ *      },
+ *      maximumResponses : 10
+ *   };
+ * @private
+ */
+function AutoComplete (options) {
+    if (!(this instanceof AutoComplete)) {
+        throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_3__["default"].getMessage("CLASS_CONSTRUCTOR", "AutoComplete"));
+    }
+
+    /**
+     * Nom de la classe (heritage)
+     * FIXME instance ou classe ?
+     */
+    this.CLASSNAME = "AutoComplete";
+
+    // appel du constructeur par heritage
+    _CommonService__WEBPACK_IMPORTED_MODULE_0__["default"].apply(this, arguments);
+
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__["default"].getLogger("Gp.Services.AutoComplete");
+    this.logger.trace("[Constructeur AutoComplete (options)]");
+
+    if (!options.text) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_3__["default"].getMessage("PARAM_MISSING", "text"));
+    }
+
+    // ajout des options spécifiques au service
+    this.options.text = options.text;
+
+    // on definit des filtres par defaut
+    if (!options.filterOptions || typeof options.filterOptions !== "object") {
+        this.options.filterOptions = options.filterOptions = {
+            territory : [],
+            type : ["StreetAddress"]
+        };
+    }
+
+    // FIXME ECMAScript 5 support (valable pour un objet uniquement !)
+    // ceci permet de tester le cas où : object = {}
+    if (Object.keys(options.filterOptions).length === 0) {
+        this.options.filterOptions = {
+            territory : [],
+            type : ["StreetAddress"]
+        };
+    }
+
+    this.options.filterOptions.type = options.filterOptions.type || ["StreetAddress"];
+    this.options.filterOptions.territory = options.filterOptions.territory || [];
+    this.options.maximumResponses = options.maximumResponses || 10;
+
+    // INFO
+    // le service ne repond pas en mode POST (405 Method Not Allowed)
+    if (this.options.protocol === "XHR" && this.options.httpMethod === "POST") {
+        this.logger.warn("Le service ne gére pas le mode d'interrogation en POST, on bascule sur du GET !");
+        this.options.httpMethod = "GET"; // on surcharge !
+    }
+
+    // attributs d'instances
+
+    /**
+     * Format forcé de la réponse du service : "json"
+     * sauf si l'on souhaite une reponse brute (options.rawResponse)
+     */
+    this.options.outputFormat = (this.options.rawResponse) ? "" : "json";
+}
+
+/**
+ * @lends module:AutoComplete#
+ */
+
+AutoComplete.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_0__["default"].prototype, {
+    // todo
+    // getter/setter
+});
+
+/*
+ * Constructeur (alias)
+ */
+AutoComplete.prototype.constructor = AutoComplete;
+
+/**
+ * (overwrite)
+ * Création de la requête
+ *
+ * @param {Function} error   - callback des erreurs
+ * @param {Function} success - callback
+ */
+AutoComplete.prototype.buildRequest = function (error, success) {
+    // ex.
+    // http://wxs.ign.fr/CLEF/ols/apis/completion?
+    // text=Brie-Comt&
+    // type=StreetAddress,PositionOfInterest&
+    // territory=METROPOLE&
+    // maximumResponses=10
+
+    // traitement des param KPV sous forme de tableau
+    var territories = "";
+    if (this.options.filterOptions.territory) {
+        territories = this.options.filterOptions.territory.join(";");
+    }
+
+    var types = "";
+    if (this.options.filterOptions.type) {
+        types = this.options.filterOptions.type.join(",");
+    }
+
+    // normalisation de la requete avec param KPV
+    this.request = _Utils_Helper__WEBPACK_IMPORTED_MODULE_4__["default"].normalyzeParameters({
+        text : encodeURIComponent(this.options.text),
+        type : types,
+        terr : territories,
+        maximumResponses : this.options.maximumResponses
+    });
+
+    (!this.request)
+        ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_5__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_3__["default"].getMessage("SERVICE_REQUEST_BUILD")))
+        : success.call(this, this.request);
+};
+
+/**
+ * (overwrite)
+ * Analyse de la reponse
+ *
+ * @param {Function} error   - callback des erreurs
+ * @param {Function} success - callback de succès de l'analyse de la réponse
+ */
+AutoComplete.prototype.analyzeResponse = function (error, success) {
+    if (this.response) {
+        var options = {
+            response : this.response,
+            rawResponse : this.options.rawResponse,
+            onSuccess : success,
+            onError : error,
+            scope : this
+        };
+
+        _Response_AutoCompleteResponseFactory__WEBPACK_IMPORTED_MODULE_1__["default"].build(options);
+    } else {
+        error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_5__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_3__["default"].getMessage("SERVICE_RESPONSE_EMPTY")));
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AutoComplete);
+
+
+/***/ }),
+/* 116 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45);
+/* harmony import */ var _model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(117);
+/* harmony import */ var _model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(118);
+/**
+ * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON
+ * (Factory)
+ *
+ * @module AutoCompleteResponseFactory
+ * @private
+ * @alias Gp.Services.AutoComplete.Response.AutoCompleteResponseFactory
+ */
+
+
+
+
+
+
+var AutoCompleteResponseFactory = {
+
+    /**
+     * interface unique
+     *
+     * @method build
+     * @static
+     * @param {Object} options - options definies dans le composant Alti
+     *
+     * @example
+     *   var options = {
+     *      response :
+     *      outputFormat :
+     *      rawResponse :
+     *      scope :
+     *      onSuccess :
+     *      onError :
+     *   };
+     *
+     */
+    build : function (options) {
+        // logger
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AutoCompleteResponseFactory");
+        logger.trace(["AutoCompleteResponseFactory::build()"]);
+
+        var data = null;
+
+        if (options.response) {
+            if (options.rawResponse) {
+                logger.trace("analyze response : raw");
+                data = options.response;
+            } else {
+                var JSONResponse;
+                if (typeof options.response === "string") {
+                    JSONResponse = JSON.parse(options.response);
+                } else {
+                    JSONResponse = options.response;
+                }
+
+                // analyse de la réponse
+                if (JSONResponse) {
+                    // le service renvoie t il une erreur ?
+                    if (JSONResponse.error) {
+                        // ex. ?
+                        options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                            message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", JSONResponse.error.description),
+                            status : JSONResponse.error.code,
+                            type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR
+                        }));
+                        return;
+                    }
+
+                    // création de l'objet réponse
+                    data = new _model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_3__["default"]();
+
+                    // boucle sur les résultats de l'autocomplétion
+                    if (JSONResponse.results && Array.isArray(JSONResponse.results)) {
+                        var suggestedLocation;
+
+                        for (var i = 0; i < JSONResponse.results.length; i++) {
+                            var result = JSONResponse.results[i];
+                            suggestedLocation = new _model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_4__["default"]();
+
+                            if (suggestedLocation) {
+                                if (result && result.country === "StreetAddress") {
+                                    suggestedLocation.street = result.street;
+                                    suggestedLocation.type = "StreetAddress";
+                                } else if (result && result.country === "PositionOfInterest") {
+                                    suggestedLocation.poi = result.street;
+                                    suggestedLocation.kind = result.kind;
+                                    suggestedLocation.type = "PositionOfInterest";
+                                }
+
+                                if (suggestedLocation.position) {
+                                    suggestedLocation.position.x = result.x;
+                                    suggestedLocation.position.y = result.y;
+                                }
+
+                                suggestedLocation.commune = result.city;
+                                suggestedLocation.fullText = result.fulltext;
+                                suggestedLocation.postalCode = result.zipcode;
+                                suggestedLocation.classification = result.classification;
+                            }
+                            // Ajout du résultat au tableau reverseGeocodedLocations de geocodedLocation
+                            data.suggestedLocations.push(suggestedLocation);
+                        }
+                    } else {
+                        options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_FORMAT_3")));
+                        return;
+                    }
+
+                    if (!data.suggestedLocations.length) {
+                        options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_FORMAT_3")));
+                        return;
+                    }
+                }
+
+                if (!data) {
+                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                        message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE_2"),
+                        type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_UNKERR,
+                        status : -1
+                    }));
+                    return;
+                }
+
+                // Si la réponse contenait une exception renvoyée par le service
+                if (data.exceptionReport) {
+                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                        message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport),
+                        type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR,
+                        status : 200
+                    }));
+                    return;
+                }
+            }
+        } else {
+            // si la réponse (xmlString) est vide, on appelle le callback d'erreur
+            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY")));
+            return;
+        }
+
+        // si tout s'est bien passé, on appelle le callback de succès
+        options.onSuccess.call(options.scope, data);
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AutoCompleteResponseFactory);
+
+
+/***/ }),
+/* 117 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/**
+ * Response object for {@link module:Services~autoComplete Gp.Services.autoComplete ()} invocation when successful. Received as the argument of onSuccess callback function.
+ *
+ * @property {Array.<Gp.Services.AutoComplete.SuggestedLocation>} suggestedLocations - SuggestedLocations array.
+ *
+ * @namespace
+ * @alias Gp.Services.AutoCompleteResponse
+ */
+function AutoCompleteResponse () {
+    if (!(this instanceof AutoCompleteResponse)) {
+        throw new TypeError("AutoCompleteResponse constructor cannot be called as a function.");
+    }
+
+    this.suggestedLocations = [];
+}
+
+AutoCompleteResponse.prototype = {
+
+    constructor : AutoCompleteResponse
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (AutoCompleteResponse);
+
+
+/***/ }),
+/* 118 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Single SuggestedLocation Object returned by underlying web service.
+ * Each suggested location represents a street address ("StreetAddress") or a place name ("PositionOfInterest").
+ *
+ * @property {String} type - Suggested location type : "StreetAddress" ou "PositionOfInterest"
+ * @property {Gp.Point} position - Position of the suggested location given in requested coordinates system.
+ * @property {String} commune - Suggested municipality
+ * @property {String} fullText - Full text representation of the suggested location.
+ * @property {String} postalCode - Suggested location postcode
+ * @property {Integer} classification - Number used to classify the importance of the place where is the suggested location from 1 (most important) to 7 (less important).
+ * @property {String} street - Street name of the suggested location ("StreetAddress" only).
+ * @property {String} kind - Nature of the suggested location : "prefecture", "monument", "commune", ... for instance ("PositionOfInterest" only).
+ *
+ * @namespace
+ * @alias Gp.Services.AutoComplete.SuggestedLocation
+ */
+function SuggestedLocation () {
+    if (!(this instanceof SuggestedLocation)) {
+        throw new TypeError("SuggestedLocation constructor cannot be called as a function.");
+    }
+
+    /* REPONSE :
+        {
+           "status" : "OK",
+           "results" : [
+              {
+                 "country":"PositionOfInterest",
+                 "x":-1.559185,
+                 "y":47.952603,
+                 "city":"Brie",
+                 "zipcode":"35150",
+                 "street":"corbe",
+                 "kind":"Lieu-dit habité",
+                 "fulltext":"corbe, 35150 Brie",
+                 "classification":6
+              },
+              {
+                 "country":"StreetAddress",
+                 "x":1.538295,
+                 "y":43.19646,
+                 "city":"Brie",
+                 "zipcode":"09700",
+                 "street":"courreste",
+                 "kind":"",
+                 "fulltext":"courreste, 09700 Brie",
+                 "classification":7
+              }
+           ]
+        }
+    */
+
+    /* REPONSE EN ERREUR
+        {
+            status : "ERROR",
+            results : [ ]
+        }
+    */
+
+    /**
+     * Suggested location type : "StreetAddress" ou "PositionOfInterest"
+     * @type {String}
+     */
+    this.type = null;
+
+    /**
+     * Position of the suggested location given in requested coordinates system.
+     * @type {Gp.Point}
+     */
+    this.position = {
+        x : null,
+        y : null
+    };
+
+    /**
+     * Suggested municipality
+     * @type {String}
+     */
+    this.commune = null;
+
+    /**
+     * Full text representation of the suggested location.
+     * @type {String}
+     */
+    this.fullText = null;
+
+    /**
+     * Suggested location postcode
+     * @type {Number}
+     */
+    this.postalCode = null;
+
+    /**
+     * Number used to classify the importance of the place where is the suggested location from 1 (most important) to 7 (less important).
+     * @type {Integer}
+     */
+    this.classification = null;
+
+    /**
+     * Street name of the suggested location ("StreetAddress" only).
+     * @type {String}
+     */
+    this.street = null;
+
+    /**
+     * Place name of the suggested location ("PositionOfInterest" only).
+     * @type {String}
+     */
+    this.poi = null;
+
+    /**
+     * Nature of the suggested location : "prefecture", "monument", "commune", ... for instance ("PositionOfInterest" only).
+     * @type {String}
+     */
+    this.kind = null;
+}
+
+SuggestedLocation.prototype = {
+
+    constructor : SuggestedLocation
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (SuggestedLocation);
+
+
+/***/ }),
+/* 119 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45);
+/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(46);
+/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(56);
+/* harmony import */ var _Request_RouteRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(120);
+/* harmony import */ var _Response_RouteResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(128);
+
+
+
+
+
+
+
+
+
+/**
+ * @classdesc
+ * Appel du service d'itinéraire du Géoportail :
+ *     envoi de la requête construite selon les paramètres en options,
+ *     éventuellement parsing et analyse  de la réponse,
+ *     retour d'une réponse en paramètre de la fonction onSuccess.
+ *
+ * @alias Gp.Services.Route
+ * @constructor
+ * @extends {Gp.Services.CommonService}
+ * @param {Object} options - options spécifiques au service (+ les options heritées)
+ *
+ * @param {String} [options.api] - Manière d'accéder au service : 'REST' (via l'API REST) ou 'OLS' (via la norme XLS).
+ * Par défaut, on utilise l'API REST.
+ *
+ * @param {String} options.outputFormat - Le format de la réponse du service itineraire : 'xml' ou 'json'.
+ *      Ce paramètre déterminera l'extension '.xml' ou '.json' du service dans le cas de l'API REST.
+ *      Nécessaire si serverUrl est renseigné, et qu'on souhaite passer par l'API REST,
+ *      pour connaître le format dans lequel sera fournie la réponse (pour son traitement).
+ *      Non nécessaire pour la norme OLS. Par défaut, ce paramètre vaut 'json'.
+ *
+ * @param {String} [options.routePreference = "fastest"] - Mode de calcul à utiliser :
+ * - le plus rapide « fastest »
+ * - le plus court « shortest »
+ * Par défaut : « fastest ».
+ *
+ * @param {Object} options.startPoint - Point de départ du calcul. Coordonnées exprimées en longitudes, latitudes (EPSG:4326)
+ * @param {Float} options.startPoint.x - Abcisse du point de départ du calcul d'itinéraire.
+ * @param {Float} options.startPoint.y - Ordonnée du point de départ du calcul d'itinéraire.
+ *
+ * @param {Object} options.endPoint - Point d'arrivée du calcul. Coordonnées exprimées en longitudes, latitudes (EPSG:4326)
+ * @param {Float} options.endPoint.x - Abcisse du point d'arrivée du calcul d'itinéraire.
+ * @param {Float} options.endPoint.y - Ordonnée du point d'arrivée du calcul d'itinéraire.
+ *
+ * @param {Object[]} [options.viaPoints] - Liste de point ({x:Float,y:Float}) intermédaires que l'itinéraire doit emprunter dans l'ordre du tableau.
+ *      Coordonnées exprimées en longitudes, latitudes (EPSG:4326) :{x:float, y:float}
+ *
+ * @param {String} [options.graph = "voiture"] - Type de graphe utilisé : "Voiture" ou "Pieton".
+ *      Détermine le profil de vitesses utilisé pour le calcul ainsi que les tronçons autorisés ou non.
+ *      Par défaut, c'est la valeur "Voiture" qui sera utilisée.
+ *
+ * @param {String[]} [options.exclusions] - Critères d'exclusions à appliquer pour le calcul. (correspond au paramètre "avoidFeature" d'OpenLS)
+ *      On précise ici le type de tronçons que l'on ne veut pas que l'itinéraire emprunte
+ *      (valeurs possibles : « toll » (éviter les péages), « bridge », « tunnel »).
+ *
+ * @param {Boolean} [options.geometryInInstructions = false] - Indique si la géométrie de l'itinéraire doit être reprise morceau par morceau dans les instructions.
+ *      (correspond au paramètre "provideGeometry" d'OpenLS) Par défaut : false.
+ *
+ * @param {Boolean} [options.provideBbox = true] - Indique si les instructions doivent être localisées par une bbox dans la réponse.
+ *      Par défaut : true.
+ *
+ * @param {String} [options.distanceUnit = "km"] - Indique si la distance doit être exprimée en km ou m dans la réponse.
+ *      Par défaut : km.
+ *
+ * @param {String} [options.srs] - Système de coordonnées dans lequel les paramètres géographiques en entrée et la réponse du service sont exprimés.
+ *      Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 'EPSG:4326'.
+ *
+ * @example
+ *  var options = {
+ *      // options communes aux services
+ *      apiKey : null,
+ *      serverUrl : 'http://localhost/service/',
+ *      protocol : 'JSONP', // JSONP|XHR
+ *      proxyURL : null,
+ *      httpMethod : 'GET', // GET|POST
+ *      timeOut : 10000, // ms
+ *      rawResponse : false, // true|false
+ *      scope : null, // this
+ *      onSuccess : function (response) {},
+ *      onFailure : function (error) {},
+ *      // spécifique au service
+ *      api : 'OLS',
+ *      outputFormat : 'xml',
+ *      startPoint : {
+ *          x : 42.1121,
+ *          y : 1.5557
+ *      },
+ *      endPoint : {
+ *          x : 42.1121,
+ *          y : 1.5557
+ *      },
+ *      provideBbox : false,
+ *      exclusions : ["Bridge", "Tunnel", "Toll"],
+ *      distanceUnit : "km",
+ *      graph : "Voiture",
+ *      geometryInInstructions : false,
+ *      routePreference : "fastest"
+ *  };
+ *
+ * @private
+ */
+function Route (options) {
+    if (!(this instanceof Route)) {
+        throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "Route"));
+    }
+
+    /**
+     * Nom de la classe (heritage)
+     */
+    this.CLASSNAME = "Route";
+
+    // appel du constructeur par heritage
+    _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, arguments);
+
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.Route");
+    this.logger.trace("[Constructeur Route (options)]");
+
+    if (!options.startPoint) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "startPoint"));
+    }
+
+    // on lance une exception afin d'eviter au service de le faire...
+    if (options.startPoint.x === null) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "startPoint.x"));
+    }
+
+    if (options.startPoint.y === null) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "startPoint.y"));
+    }
+
+    if (!options.endPoint) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "endPoint"));
+    }
+
+    // on lance une exception afin d'eviter au service de le faire...
+    if (options.endPoint.x === null) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "endPoint.x"));
+    }
+
+    if (options.endPoint.y === null) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "endPoint.y"));
+    }
+
+    // options par defaut
+    // on passe l'option api en majuscules afin d'éviter des exceptions.
+    this.options.api = (typeof options.api === "string") ? options.api.toUpperCase() : "REST";
+
+    // on passe l'option outputFormat en minuscules afin d'éviter des exceptions.
+    this.options.outputFormat = (typeof options.outputFormat === "string") ? options.outputFormat.toLowerCase() : "json";
+
+    this.options.startPoint = options.startPoint;
+    this.options.endPoint = options.endPoint;
+    this.options.viaPoints = options.viaPoints || null; // INFO mapping viaPoints <=> xls:viaPoint
+    this.options.exclusions = options.exclusions || null; // INFO mapping exclusions <=> xls:avoidFeature
+    this.options.routePreference = options.routePreference || "fastest";
+    this.options.graph = options.graph || "Voiture";
+    this.options.geometryInInstructions = options.geometryInInstructions || false; // INFO mapping geometryInInstructions <=> xls:provideGeometry
+    this.options.provideBbox = options.provideBbox || true; // INFO mapping provideBbox <=> xls:provideBoundingBox
+    this.options.distanceUnit = options.distanceUnit || "km";
+    this.options.expectedStartTime = null; // FIXME not yet implemented !
+    this.options.srs = options.srs || "EPSG:4326";
+
+    // FIXME : les readers OLS ne sont pas implémentés. on utilise donc l'API REST.
+    this.options.api = "REST";
+    this.logger.warn("Surcharge option 'api' : REST (readers OLS non implémentés)");
+    if (this.options.protocol === "XHR") {
+        this.options.httpMethod = "GET";
+        this.logger.trace("Surcharge option 'HttpMethod' : " + this.options.httpMethod);
+    }
+
+    // gestion de l'url du service par defaut
+    // si l'url n'est pas renseignée, il faut utiliser les urls par defaut
+    // en fonction du type d'api, REST ou OLS
+    if (!this.options.serverUrl) {
+        var lstUrlByDefault = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].Route.url(this.options.apiKey);
+        var urlFound = null;
+        switch (this.options.api) {
+            case "OLS":
+                urlFound = lstUrlByDefault.ols;
+                break;
+            case "REST":
+                var key = "route" + "-" + this.options.outputFormat;
+                urlFound = lstUrlByDefault[key];
+                break;
+            default:
+                throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_UNKNOWN", "api"));
+        }
+
+        if (!urlFound) {
+            throw new Error("Url by default not found !");
+        }
+        this.options.serverUrl = urlFound;
+        this.logger.trace("Serveur URL par defaut : " + this.options.serverUrl);
+    }
+
+    // gestion du type de service
+    // si l'extension de l'url est .json ou .xml, on surcharge le format de sortie (outputFormat)
+    var idx = this.options.serverUrl.lastIndexOf(".");
+    if (idx !== -1) {
+        var extension = this.options.serverUrl.substring(idx + 1);
+        if (extension && extension.length < 5) { // FIXME extension de moins de 4 car. ...
+            this.logger.trace("Serveur Extension URL : " + extension);
+            switch (extension.toLowerCase()) {
+                case "json":
+                case "xml":
+                    this.options.outputFormat = extension.toLowerCase();
+                    break;
+                default:
+                    throw new Error("type of service : unknown or unsupported (json or xml) !");
+            }
+        }
+    }
+}
+
+/**
+ * @lends module:Route#
+ */
+Route.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, {
+    // todo
+    // getter/setter
+});
+
+/*
+ * Constructeur (alias)
+ */
+Route.prototype.constructor = Route;
+
+/**
+ * (overwrite)
+ * Création de la requête
+ *
+ * @param {Function} error   - callback des erreurs
+ * @param {Function} success - callback
+ */
+Route.prototype.buildRequest = function (error, success) {
+    var options = {
+        // spécifique au service
+        api : this.options.api,
+        startPoint : this.options.startPoint,
+        endPoint : this.options.endPoint,
+        viaPoints : this.options.viaPoints,
+        provideBbox : this.options.provideBbox,
+        exclusions : this.options.exclusions,
+        distanceUnit : this.options.distanceUnit,
+        graph : this.options.graph,
+        geometryInInstructions : this.options.geometryInInstructions,
+        routePreference : this.options.routePreference,
+        srs : this.options.srs
+    };
+
+    this.request = _Request_RouteRequestFactory__WEBPACK_IMPORTED_MODULE_5__["default"].build(options);
+
+    // on teste si la requete a bien été construite !
+    if (!this.request) {
+        error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_REQUEST_BUILD")));
+    } else {
+        success.call(this, this.request);
+    }
+};
+
+/**
+ * (overwrite)
+ * Analyse de la reponse
+ *
+ * @param {Function} error   - callback des erreurs
+ * @param {Function} success - callback
+ */
+Route.prototype.analyzeResponse = function (error, success) {
+    // INFO
+    // Factory pour masquer la complexité du retour du service qui renvoie soit
+    //  - une 'string' qui contient du XML ou JSON natif en mode XHR
+    //  - un objet JSON qui est natif ou encapsulé
+
+    if (this.response) {
+        var options = {
+            distanceUnit : this.options.distanceUnit, // FIXME ce parametre nous permet de choisir le type d'unité dans la reponse !
+            response : this.response,
+            outputFormat : this.options.outputFormat, // utile pour parser la string en mode XHR : JSON ou XML !
+            api : this.options.api, // utile de connaitre le type d'API car la reponse est differente !
+            rawResponse : this.options.rawResponse,
+            onError : error,
+            onSuccess : success,
+            scope : this
+        };
+
+        _Response_RouteResponseFactory__WEBPACK_IMPORTED_MODULE_6__["default"].build(options);
+    } else {
+        error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY")));
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (Route);
+
+
+/***/ }),
+/* 120 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(45);
+/* harmony import */ var _RouteRequestOLS__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(121);
+/* harmony import */ var _RouteRequestREST__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(126);
+/**
+ * Creation d'une requête OpenLS ou REST en mode POST ou GET
+ * (Factory)
+ *
+ * @module RouteRequestFactory
+ * @alias Gp.Services.Route.Request.RouteRequestFactory
+ * @private
+ */
+
+
+
+
+
+var RouteRequestFactory = {
+
+    /**
+     * interface unique
+     *
+     * @method build
+     * @static
+     * @param {Object} options - options definies dans le composant Route
+     *
+     * @example
+     *   // utilisation avec les callback
+     *   var options = {
+     *      (...)
+     *      onSuccess : function (response) {},
+     *      onError : function (error) {},
+     *      // spécifique au service
+     *      api : 'OLS',
+     *      startPoint : {
+     *          x : 42.1121,
+     *          y : 1.5557
+     *      },
+     *      endPoint : {
+     *          x : 42.1121,
+     *          y : 1.5557
+     *      },
+     *      provideBbox : false,
+     *      exclusions : ["Bridge", "Tunnel", "Toll"],
+     *      distanceUnit : "km",
+     *      graph : "Voiture",
+     *      geometryInInstructions : false,
+     *      routePreference : "fastest"
+     *   };
+     *   RouteRequestFactory.build(options);
+     *
+     *   // utilisation sans callback
+     *   var options = {...};
+     *   try {
+     *      var result = RouteRequestFactory.build(options);
+     *      if (! result) { throw new Error("..."):}
+     *   } catch (e) {
+     *      // todo
+     *   }
+     * @returns {String} request
+     */
+    build : function (options) {
+        // logger
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("RouteRequestFactory");
+        logger.trace(["RouteRequestFactory::build()"]);
+
+        var request = null;
+
+        var settings = options || {};
+
+        // gestion des callback
+        var bOnError = !!((options.onError !== null && typeof options.onError === "function"));
+
+        var message = null;
+        // choix entre les 2 types d'API pour consulter le service
+        switch (options.api) {
+            case "REST":
+                // FIXME les exceptions ne sont pas 'catchées' sur le constructeur !
+                var myReq = new _RouteRequestREST__WEBPACK_IMPORTED_MODULE_3__["default"](settings);
+                if (!myReq.processRequestString()) {
+                    message = "Error process request (rest) !";
+                    if (bOnError) {
+                        options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"](message));
+                        return;
+                    }
+                    throw new Error(message);
+                }
+                request = myReq.requestString;
+                break;
+            case "OLS":
+                request = _RouteRequestOLS__WEBPACK_IMPORTED_MODULE_2__["default"].build(settings);
+                if (!request) {
+                    message = "Error process request (ols) !";
+                    if (bOnError) {
+                        options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"](message));
+                        return;
+                    }
+                    throw new Error(message);
+                }
+                break;
+            default:
+                message = "Type of API is not supported by service (REST or OLS) !";
+                if (bOnError) {
+                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"](message));
+                    return;
+                }
+                throw new Error(message);
+        }
+
+        return request;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (RouteRequestFactory);
+
+
+/***/ }),
+/* 121 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Formats_XLS__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(89);
+/* harmony import */ var _Formats_XLS_RouteService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(122);
+/**
+ * Creation d'une requête OpenLS en mode POST ou GET
+ * (Factory)
+ *
+ * @module RouteRequestOLS
+ * @alias Gp.Services.Route.Request.RouteRequestOLS
+ * @private
+ */
+
+
+
+
+var RouteRequestOLS = {
+
+    /**
+     * interface unique
+     *
+     * @method build
+     * @static
+     * @param {Object} options - options definies dans le composant Route
+     *
+     * @example
+     *   var options = {
+     *      (...)
+     *   };
+     *
+     * @returns {String} request
+     */
+    build : function (options) {
+        // logger
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("RouteRequestOLS");
+        logger.trace(["RouteRequestOLS::build()"]);
+
+        var request = null;
+
+        // spécifique au service
+        var settings = {
+            startPoint : options.startPoint,
+            endPoint : options.endPoint,
+            viaPoint : options.viaPoints, // mapping OLS et options
+            provideBoundingBox : options.provideBbox, // mapping OLS et options
+            avoidFeature : options.exclusions, // mapping OLS et options
+            expectedStartTime : options.expectedStartTime, // TODO format ?
+            distanceUnit : options.distanceUnit,
+            graph : options.graph,
+            provideGeometry : options.geometryInInstructions, // mapping OLS et options
+            routePreference : options.routePreference
+        };
+
+        // objet RouteService
+        var oRS = new _Formats_XLS_RouteService__WEBPACK_IMPORTED_MODULE_2__["default"](settings);
+
+        // Format XLS
+        var oXLS = new _Formats_XLS__WEBPACK_IMPORTED_MODULE_1__["default"]({
+            srsName : options.srs,
+            maximumResponses : options.maximumResponses
+        });
+        oXLS.namespace = true;
+        oXLS.setService(oRS);
+
+        // request brute !
+        request = oXLS.build();
+
+        // en mode GET, la requête est encodée
+        // et le param. 'qxml' est ajouté
+        if (options.httpMethod === "GET") {
+            var myRequest = "qxml=" +
+                encodeURIComponent(request)
+                    .replace(/-/g, "%2D")
+                    .replace(/_/g, "%5F")
+                    .replace(/\./g, "%2E")
+                    .replace(/!/g, "%21")
+                    .replace(/~/g, "%7E")
+                    .replace(/\*/g, "%2A")
+                    .replace(/'/g, "%27")
+                    .replace(/\(/g, "%28")
+                    .replace(/\)/g, "%29");
+            request = myRequest;
+        }
+
+        return request;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (RouteRequestOLS);
+
+
+/***/ }),
+/* 122 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _AbstractService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(92);
+/* harmony import */ var _RouteService_DetermineRouteRequest__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(123);
+/* harmony import */ var _RouteService_RouteRequestExtension__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(125);
+/* harmony import */ var _RouteService_RouteRequestExtension__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_RouteService_RouteRequestExtension__WEBPACK_IMPORTED_MODULE_3__);
+
+
+
+
+
+/**
+ * @classdesc
+ *
+ * Requête de type RouteService
+ * (Factory)
+ *
+ * XSD :
+ * ----
+ * [] => non implementé !
+ *
+ * ```
+ * element name="DetermineRouteRequest"
+ *  [attribute name="provideRouteHandle" default="false"]
+ *  attribute name="distanceUnit"       default="M"
+ *      [element ref="xls:RouteHandle" || element ref="xls:RoutePlan"]
+ *      element ref="xls:RoutePlan"
+ *      element ref="xls:RouteInstructionsRequest"
+ *      [element ref="xls:RouteGeometryRequest"]
+ *      [element ref="xls:RouteMapRequest"]
+ * ```
+ * ```
+ * element name="RoutePlan"
+ *  [attribute name="useRealTimeTraffic" default="false"]
+ *  [attribute name="expectedStartTime"  type="dateTime"]
+ *  [attribute name="expectedEndTime"    type="dateTime"]
+ *      element ref="xls:RoutePreference"
+ *      element ref="xls:WayPointList"
+ *      element ref="xls:AvoidList"
+ * ```
+ * ```
+ * element name="RoutePreference" => value = Fastest | Shortest | Pedestrian
+ * ```
+ * ```
+ * element name="WayPointList"
+ *      element ref="xls:StartPoint"
+ *      element ref="xls:ViaPoint" minOccurs="0"
+ *      element ref="xls:EndPoint"
+ * ```
+ * ```
+ * element name="StartPoint"
+ *    [element name="GeocodeMatchCode"]
+ *      [attribute name="accuracy"]
+ *      [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ...
+ *    element name="Position"
+ *      element ref="gml:Point"
+ * ```
+ * ```
+ * element name="ViaPoint"
+ *    [element name="GeocodeMatchCode"]
+ *      [attribute name="accuracy"]
+ *      [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ...
+ *    element name="Position"
+ *      element ref="gml:Point"
+ * ```
+ * ```
+ * element name="EndPoint"
+ *    [element name="GeocodeMatchCode"]
+ *      [attribute name="accuracy"]
+ *      [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ...
+ *    element name="Position"
+ *      element ref="gml:Point"
+ * ```
+ * ```
+ * element name="AvoidList"
+ *      [element ref="xls:AOI"]
+ *      [element ref="xls:_Location"] (cf. element name="Position")
+ *      element ref="xls:AvoidFeature"
+ * ```
+ * ```
+ * [element name="AOI"]
+ *      [element ref="gml:CircleByCenterPoint" || element ref="gml:Polygon" || element ref="gml:Envelope"]
+ * ```
+ * ```
+ * element name="AvoidFeature" => value = highway | tollway | tunnel | bridge
+ * ```
+ * ```
+ * [element name="RouteMapRequest"]
+ *      [element name="Output"]
+ *          attribute name="width"
+ *          attribute name="height"
+ *          attribute name="format"
+ *          attribute name="BGcolor"
+ *          attribute name="transparent"
+ *          attribute name="style" => value = Overview | Maneuver
+ *          element name="BBoxContext" type="gml:EnvelopeType"
+ * ```
+ * ```
+ * element name="RouteInstructionsRequest"
+ *  [attribute name="format"]           default="text/plain"
+ *  attribute name="provideGeometry"    default="false"
+ *  attribute name="provideBoundingBox" default="false"
+ * ```
+ * ```
+ * [element name="RouteGeometryRequest"]
+ *  [attribute name="scale"]                  default="1"
+ *  [attribute name="provideStartingPortion"] default="false"
+ *  [attribute name="maxPoints"]              default="100"
+ *      [element name="BoundingBox" type="gml:EnvelopeType" ]
+ * ```
+ *
+ * --------
+ * Requête :
+ * --------
+ * ```
+ * <?xml version="1.0" encoding="UTF-8"?>
+ * <XLS
+ * xmlns:xls="http://www.opengis.net/xls"
+ * xmlns:sch="http://www.ascc.net/xml/schematron"
+ * xmlns:gml="http://www.opengis.net/gml"
+ * xmlns:xlsext="http://www.opengis.net/xlsext"
+ * xmlns:xlink="http://www.w3.org/1999/xlink"
+ * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ * xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/RouteService.xsd"
+ * version="1.1" xls:lang="en">
+ * <RequestHeader/>
+ * <Request methodName="RouteRequest" requestID="123456789" version="1.1">
+ *   <DetermineRouteRequest distanceUnit="KM">
+ *     <RoutePlan>
+ *       <RoutePreference>Fastest</RoutePreference>
+ *       <xlsext:vehicle name="Car" />
+ *       <WayPointList>
+ *         <StartPoint>
+ *           <Position><gml:Point srsName="EPSG:4326"><gml:pos>2.29993 48.87228</gml:pos></gml:Point></Position>
+ *         </StartPoint>
+ *         <EndPoint>
+ *           <Position><gml:Point srsName="EPSG:4326"><gml:pos>-1.53604 47.21548</gml:pos></gml:Point></Position>
+ *         </EndPoint>
+ *       </WayPointList>
+ *     </RoutePlan>
+ *     <RouteInstructionsRequest provideGeometry="true"/>
+ *     <RouteGeometryRequest/>
+ *   </DetermineRouteRequest>
+ * </Request>
+ * </XLS
+ * ```
+ * -----------
+ * References :
+ * -----------
+ * - {@link https://geoportail.forge.ign.fr/jira/browse/GPP-CI}
+ * - {@link https://geoportail.forge.ign.fr/jira/browse/GPP-CI-1 Specif. ols}
+ * - {@link https://geoportail.forge.ign.fr/jira/browse/GPP-CI-9 Extension}
+ * - {@link https://github.com/Emergya/openlayers/blob/master/lib/OpenLayers/Format/XLS/v1_2_0.js}
+ *
+ * @example
+ * // encapsule un objet dans une coquille XSL, Factory sur les objets ''
+ * rs = new RouteService ();
+ * rs.addRequest (req);
+ * rs.toString();
+ *  ou
+ * rs = new RouteService ({
+ *      ...
+ * });
+ * rs.toString();
+ *
+ * @extends {Gp.Formats.XLS}
+ * @constructor
+ * @alias Gp.Formats.XLS.RouteService
+ * @param {Object} options - options
+ * @param {Object}   options.routePreference - « fastest », « shortest » ou « pedestrian »
+ * @param {String}   options.startPoint - Point de départ (coordonnées exprimées en WGS84G)
+ * @param {String}   options.viaPoint - Liste de points intermédiaires
+ * @param {String}   options.endPoint - Point d'arrivée (coordonnées)
+ * @param {Object}   options.avoidFeature - « highway », « tollway », « tunnel » ou « bridge »
+ * @param {Object}   options.graph - « car »
+ * @param {Object}   options.expectedStartTime - Date et heure de départ
+ * @param {Object}   options.provideGeometry - true | false
+ * @param {Object}   options.provideBoundingBox - true | false
+ * @param {Object}   options.distanceUnit - Unité dans lesquelles la distance est exprimée (« m » ou « km »)
+ * @param {Function} options.onsuccess - function callback success (TODO)
+ * @param {Function} options.onerror   - function callback error   (TODO)
+ *
+ * @example
+ * var options = {
+ *      // spécifique au service
+ *      startPoint: {
+ *          x: 42.1121,
+ *          y: 1.5557
+ *      },
+ *      endPoint: {
+ *          x: 42.1121,
+ *          y: 1.5557
+ *      },
+ *      viaPoint : [
+ *          {x: 42.1121,y: 1.5557},
+ *          {x: 42.1121,y: 1.5557},
+ *          {x: 42.1121,y: 1.5557}
+ *      ],
+ *      provideBoundingBox : false,
+ *      avoidFeature : ["bridge", "tunnel", "tollway"],
+ *      expectedStartTime : "2015-12-23", // YYYY-MM-DDThh:mm:ssZ
+ *      distanceUnit : "km",
+ *      vehicle: "car",
+ *      provideGeometry : false,
+ *      routePreference : "fastest"
+ * };
+ *
+ * @private
+ */
+function RouteService (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur RouteService ()]");
+
+    if (!(this instanceof RouteService)) {
+        throw new TypeError("RouteService constructor cannot be called as a function.");
+    }
+
+    /**
+     * Nom de la classe
+     */
+    this.CLASSNAME = "RouteService";
+
+    /**
+     * Type de classe
+     * RouteRequest par defaut
+     */
+    this.CLASSTYPE = "RouteRequest";
+
+    // appel du constructeur par heritage
+    _AbstractService__WEBPACK_IMPORTED_MODULE_1__["default"].apply(this, arguments);
+}
+
+/**
+ * @lends module:RouteService#
+ */
+RouteService.prototype = Object.create(_AbstractService__WEBPACK_IMPORTED_MODULE_1__["default"].prototype, {
+    // todo
+    // getter/setter
+});
+
+/**
+ * Constructeur (alias)
+ */
+RouteService.prototype.constructor = RouteService;
+
+/**
+ * (overwrite) Ajout d'un objet de type  : RouteRequest
+ *
+ * @param {Object} oRequest - RouteRequest
+ */
+RouteService.prototype.addRequest = function (oRequest) {
+    // on controle les types acceptés
+    if (oRequest.CLASSNAME === "DetermineRouteRequest") {
+        this.oRequest = oRequest;
+    } else {
+        throw new Error("Ce n'est pas un objet de type 'Route Request' !?");
+    }
+};
+
+/**
+ * (overwrite) Ajout d'un objet de type RouteFilterExtension
+ *
+ * @param {Object} oFilter - RouteFilterExtension
+ */
+RouteService.prototype.addFilter = function (oFilter) {
+    // gestion des extensions (vehicle)
+    if (oFilter instanceof _RouteService_RouteRequestExtension__WEBPACK_IMPORTED_MODULE_3___default.a) {
+        this.oFilter = oFilter;
+    }
+};
+
+/**
+ * (overwrite) toString
+ *
+ * @returns {String} requête
+ */
+RouteService.prototype.toString = function () {
+    // soit, on a un objet Request déjà instancié
+    // sinon, il faut le construire à partir des options à disposition
+    if (!this.oRequest) {
+        // il nous faut des options
+        if (!this.options) {
+            throw new Error("Les options ne sont pas renseignées, impossible de construire la requête !");
+        }
+
+        if (this.CLASSTYPE === "RouteRequest") {
+            var settings = {
+                distanceUnit : this.options.distanceUnit || null,
+                provideGeometry : this.options.provideGeometry || null,
+                provideBoundingBox : this.options.provideBoundingBox || null,
+                route : {
+                    routePreference : this.options.routePreference || null,
+                    startPoint : this.options.startPoint,
+                    viaPoint : this.options.viaPoint || null,
+                    endPoint : this.options.endPoint,
+                    avoidFeature : this.options.avoidFeature || null,
+                    graph : this.options.graph || null,
+                    expectedStartTime : this.options.expectedStartTime || null
+                }
+            };
+            this.oRequest = new _RouteService_DetermineRouteRequest__WEBPACK_IMPORTED_MODULE_2__["default"](settings);
+            // ajout des filtres spécifiques au service
+            if (this.oFilter) {
+                this.oRequest.addFilter(this.oFilter);
+            }
+        }
+    }
+
+    // objet indefini !?
+    if (!this.oRequest) {
+        throw new Error("Type de requête indefini !");
+    }
+
+    this.strRequest = this.oRequest.toString();
+    return this.strRequest;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (RouteService);
+
+
+/***/ }),
+/* 123 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _model_RoutePlan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(124);
+
+
+
+/**
+ * @classdesc
+ *
+ * Requête de calcul d'itinéraire
+ *
+ * ----
+ * XSD :
+ * ----
+ * [] => non implementé !
+ *
+ * ```
+ * element name="DetermineRouteRequest"
+ *  [attribute name="provideRouteHandle" default="false"]
+ *  attribute name="distanceUnit"       default="M"
+ *      [element ref="xls:RouteHandle" || element ref="xls:RoutePlan"]
+ *      element ref="xls:RoutePlan"
+ *      element ref="xls:RouteInstructionsRequest"
+ *      [element ref="xls:RouteGeometryRequest"]
+ *      [element ref="xls:RouteMapRequest"]
+ * ```
+ * ```
+ * element name="RouteInstructionsRequest"
+ *  [attribute name="format"]           default="text/plain"
+ *  attribute name="provideGeometry"    default="false"
+ *  attribute name="provideBoundingBox" default="false"
+ * ```
+ * ```
+ * element name="RouteGeometryRequest"
+ *  [attribute name="scale"]                  default="1"
+ *  [attribute name="provideStartingPortion"] default="false"
+ *  [attribute name="maxPoints"]              default="100"
+ *      [element name="BoundingBox" type="gml:EnvelopeType" ]
+ * ```
+ * ```
+ * [element name="RouteMapRequest"]
+ *      [element name="Output"]
+ *          [attribute name="width"]
+ *          [attribute name="height"]
+ *          [attribute name="format"]
+ *          [attribute name="BGcolor"]
+ *          [attribute name="transparent"]
+ *          [attribute name="style"] => value = Overview | Maneuver
+ *          [element name="BBoxContext" type="gml:EnvelopeType"]
+ * ```
+ *
+ * --------
+ * Requête :
+ * --------
+ * ```
+ *   <DetermineRouteRequest distanceUnit="KM">
+ *     <RoutePlan>
+ *              <RoutePreference>Fastest</RoutePreference>
+ *              <xlsext:vehicle name="Car" />
+ *              <WayPointList>
+ *                  <StartPoint>
+ *                      <Position><gml:Point srsName="EPSG:4326"><gml:pos>2.29993 48.87228</gml:pos></gml:Point></Position>
+ *                  </StartPoint>
+ *                  <EndPoint>
+ *                      <Position><gml:Point srsName="EPSG:4326"><gml:pos>-1.53604 47.21548</gml:pos></gml:Point></Position>
+ *                  </EndPoint>
+ *              </WayPointList>
+ *     </RoutePlan>
+ *     <RouteInstructionsRequest provideGeometry="true"/>
+ *     <RouteGeometryRequest/>
+ *   </DetermineRouteRequest>
+ * ```
+ *
+ * @constructor
+ * @alias Gp.Formats.XLS.RouteService.DetermineRouteRequest
+ * @param {Object} options - options
+ * @param {Object}   options.route.routePreference - « fastest », « shortest » ou « pedestrian »
+ * @param {String}   options.route.startPoint - Point de départ (coordonnées exprimées en WGS84G)
+ * @param {String}   options.route.viaPoint - Liste de points intermédiaires
+ * @param {String}   options.route.endPoint - Point d'arrivée (coordonnées)
+ * @param {Object}   options.route.avoidFeature - « highway », « tollway », « tunnel » ou « bridge »
+ * @param {Object}   options.route.vehicle - « car »
+ * @param {Object}   options.route.expectedStartTime - Date et heure de départ
+ * @param {Object}   options.provideGeometry - true | false
+ * @param {Object}   options.provideBoundingBox - true | false
+ * @param {Object}   options.distanceUnit - Unité dans lesquelles la distance est exprimée (« m » ou « km »)
+ * @param {Function} options.onsuccess - function callback success (TODO)
+ * @param {Function} options.onerror   - function callback error   (TODO)
+ *
+ * @private
+ */
+function DetermineRouteRequest (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur DetermineRouteRequest ()]");
+
+    if (!(this instanceof DetermineRouteRequest)) {
+        throw new TypeError("DetermineRouteRequest constructor cannot be called as a function.");
+    }
+
+    // options par defaut
+    this.options = options || {};
+
+    // et on ajoute les options en paramètre aux options par défaut
+    for (var opt in options) {
+        if (options.hasOwnProperty(opt)) {
+            this.options[opt] = options[opt];
+        }
+    }
+
+    /**
+     * Nom de la classe (heritage)
+     */
+    this.CLASSNAME = "DetermineRouteRequest";
+}
+
+DetermineRouteRequest.prototype = {
+
+    /**
+     * @lends module:DetermineRouteRequest#
+     */
+
+    /**
+     * request (out)
+     * @type {String}
+     */
+    strRequest : null,
+
+    /**
+     * RoutePlan
+     * @type {Address}
+     */
+    oRoutePlan : null,
+
+    /**
+     * Template de la requête.
+     * substitution des valeurs suivantes :
+     * __DISTANCEUNIT__,
+     * __ROUTEPLAN__, __ROUTEINSTRUCTIONREQUEST__, __ROUTEGEOMETRYREQUEST__, __ROUTEMAPREQUEST__
+     * __PROVIDEGEOMETRY__, __PROVIDEBBOX__
+     */
+    template : {
+        determineRouteRequest : "<DetermineRouteRequest distanceUnit=\"__DISTANCEUNIT__\">" +
+            "__ROUTEPLAN__" +
+            "__ROUTEINSTRUCTIONREQUEST__" +
+            "__ROUTEGEOMETRYREQUEST__" +
+            "__ROUTEMAPREQUEST__" +
+            "</DetermineRouteRequest>",
+        routeInstructionRequest : "<RouteInstructionsRequest " +
+            "provideGeometry=\"__PROVIDEGEOMETRY__\" " +
+            "provideBoundingBox=\"__PROVIDEBBOX__\" />",
+        routeGeometryRequest : "<RouteGeometryRequest />",
+        routeMapRequest : "" // FIXME <RouteMapRequest/> not yet implemented !
+    },
+
+    /**
+     * Ajout d'un objet de type RoutePlan
+     *
+     * @param {Object} oRoutePlan - RoutePlan
+     */
+    addRoute : function (oRoutePlan) {
+        if (oRoutePlan instanceof _model_RoutePlan__WEBPACK_IMPORTED_MODULE_1__["default"]) {
+            this.oRoutePlan = oRoutePlan;
+        }
+    },
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : DetermineRouteRequest,
+
+    /**
+     * toString
+     *
+     * @returns {String} requête
+     */
+    toString : function () {
+        var template = "";
+        template = this.template.determineRouteRequest;
+        template = template.replace(/__DISTANCEUNIT__/g, this.options.distanceUnit || "KM");
+
+        // soit on a déjà un objet RoutePlan instancié,
+        // sinon, on le fabrique via les options
+        if (!this.oRoutePlan) {
+            var settings = this.options.route;
+
+            this.oRoutePlan = new _model_RoutePlan__WEBPACK_IMPORTED_MODULE_1__["default"](settings);
+            if (!this.oRoutePlan) {
+                throw new Error("La construction du calcul d'initineraire n'est pas correctement definie !?");
+            }
+        }
+
+        // routeplan
+        template = template.replace(/__ROUTEPLAN__/g, this.oRoutePlan.toString());
+
+        // instruction
+        var tmplInstruction = this.template.routeInstructionRequest;
+        tmplInstruction = tmplInstruction.replace(/__PROVIDEGEOMETRY__/g, this.options.provideGeometry || false);
+        tmplInstruction = tmplInstruction.replace(/__PROVIDEBBOX__/g, this.options.provideBoundingBox || false);
+        template = template.replace(/__ROUTEINSTRUCTIONREQUEST__/g, tmplInstruction);
+
+        // geometry
+        var tmplGeometry = this.template.routeGeometryRequest;
+        template = template.replace(/__ROUTEGEOMETRYREQUEST__/g, tmplGeometry);
+
+        // map
+        var tmplMap = this.template.routeMapRequest;
+        template = template.replace(/__ROUTEMAPREQUEST__/g, tmplMap);
+
+        this.strRequest = template;
+        return this.strRequest;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (DetermineRouteRequest);
+
+
+/***/ }),
+/* 124 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+
+
+/**
+ * @classdesc
+ *  * Élément regroupant l'ensemble des données et paramètres pour le calcul d'itinéraire : points de navigation, configuration.
+ *
+ * ----
+ * XSD :
+ * ----
+ * [] => non implementé !
+ *
+ * ```
+ * element name="RoutePlan"
+ *  [attribute name="useRealTimeTraffic" default="false"]
+ *  [attribute name="expectedStartTime"  type="dateTime"]
+ *  [attribute name="expectedEndTime"    type="dateTime"]
+ *      element ref="xls:RoutePreference"
+ *      element ref="xls:WayPointList"
+ *      element ref="xls:AvoidList"
+ * ```
+ * ```
+ * element name="RoutePreference"
+ *  => value = fastest | shortest | pedestrian
+ * ```
+ * ```
+ * element name="WayPointList"
+ *      element ref="xls:StartPoint"
+ *      element ref="xls:ViaPoint" minOccurs="0"
+ *      element ref="xls:EndPoint"
+ * ```
+ * ```
+ * element name="StartPoint"
+ *    [element name="GeocodeMatchCode"]
+ *      [attribute name="accuracy"]
+ *      [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ...
+ *    element name="Position"
+ *      element ref="gml:Point"
+ * ```
+ * ```
+ * element name="ViaPoint"
+ *    [element name="GeocodeMatchCode"]
+ *      [attribute name="accuracy"]
+ *      [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ...
+ *    element name="Position"
+ *      element ref="gml:Point"
+ * ```
+ * ```
+ * element name="EndPoint"
+ *    [element name="GeocodeMatchCode"]
+ *      [attribute name="accuracy"]
+ *      [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ...
+ *    element name="Position"
+ *      element ref="gml:Point"
+ * ```
+ * ```
+ * element name="AvoidList"
+ *      [element ref="xls:AOI"]
+ *      [element ref="xls:_Location"] (cf. element name="Position")
+ *      element ref="xls:AvoidFeature"
+ * ```
+ * ```
+ * [element name="AOI"]
+ *      [element ref="gml:CircleByCenterPoint" || element ref="gml:Polygon" || element ref="gml:Envelope"]
+ * ```
+ * ```
+ * element name="AvoidFeature" => value = highway | tollway | tunnel | bridge
+ * ```
+ *
+ * --------
+ * Requête :
+ * --------
+ * ```
+ *     <RoutePlan>
+ *       <RoutePreference>Fastest</RoutePreference>
+ *       <xlsext:vehicle name="Car" />
+ *       <WayPointList>
+ *         <StartPoint>
+ *           <Position><gml:Point srsName="EPSG:4326"><gml:pos>2.29993 48.87228</gml:pos></gml:Point></Position>
+ *         </StartPoint>
+ *         <EndPoint>
+ *           <Position><gml:Point srsName="EPSG:4326"><gml:pos>-1.53604 47.21548</gml:pos></gml:Point></Position>
+ *         </EndPoint>
+ *       </WayPointList>
+ *       <AvoidList>
+ *          <AvoidFeature>highway</AvoidFeature>
+ *          <AvoidFeature>tollway</AvoidFeature>
+ *          <AvoidFeature>tunnel</AvoidFeature>
+ *       </AvoidList>
+ *     </RoutePlan>
+ * ```
+ * @constructor
+ * @alias Gp.Formats.XLS.RouteService.RoutePlan
+ * @param {Object} options - options
+ *
+ * @private
+ */
+function RoutePlan (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("RoutePlan");
+    this.logger.trace("[Constructeur RoutePlan ()]");
+
+    if (!(this instanceof RoutePlan)) {
+        throw new TypeError("RoutePlan constructor cannot be called as a function.");
+    }
+
+    // param par defaut
+    this.options = options || {};
+
+    // param obligatoire
+    if (!options.startPoint) {
+        throw new Error("l'option 'startPoint' n'est pas renseignée !");
+    }
+
+    if (!options.endPoint) {
+        throw new Error("l'option 'endPoint' n'est pas renseignée !");
+    }
+
+    // et on ajoute les options en paramètre aux options par défaut
+    for (var opt in options) {
+        if (options.hasOwnProperty(opt)) {
+            this.options[opt] = options[opt];
+        }
+    }
+}
+
+RoutePlan.prototype = {
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : RoutePlan,
+
+    /**
+     * request (out)
+     * @type {String}
+     */
+    requestString : null,
+
+    /**
+     * Template de la requête.
+     * substitution des valeurs suivantes :
+     * - __ROUTEPREFERENCE__, __VALUEROUTEPREFERENCE__
+     * - __GRAPH__, __VALUEGRAPH__
+     * - __WAYPOINTLIST__ (lst?), __STARTPOINT__, __VIAPOINT__, __ENDPOINT__, __POINT__, __X__, __Y__
+     * - __AVOIDLIST__ (lst!), __AVOIDFEATURE__, __VALUEAVOIDFEATURE__
+     */
+    template : {
+        routePlan : "<RoutePlan>" +
+            "__ROUTEPREFERENCE__" +
+            "__GRAPH__" +
+            "__WAYPOINTLIST__" +
+            "__AVOIDLIST__" +
+            "</RoutePlan>",
+        routePreference : "<RoutePreference>__VALUEROUTEPREFERENCE__</RoutePreference>",
+        graph : "<xlsext:graphName xmlns:xlsext=\"http://www.opengis.net/xlsext\" name=\"__VALUEGRAPH__\"/>",
+        wayPointList : {
+            container : "<WayPointList>" +
+                "__STARTPOINT__" +
+                "__VIAPOINT__" +
+                "__ENDPOINT__" +
+                "</WayPointList>",
+            point : "<Position><gml:Point xmlns:gml=\"http://www.opengis.net/gml\"><gml:pos>__X__ __Y__</gml:pos></gml:Point></Position>",
+            startPoint : "<StartPoint>" +
+                "__POINT__" +
+                "</StartPoint>",
+            endPoint : "<EndPoint>" +
+                "__POINT__" +
+                "</EndPoint>",
+            viaPoint : "<ViaPoint>" +
+                "__POINT__" +
+                "</ViaPoint>" // implémentation de plusieurs étapes...
+        },
+        avoidList : {
+            container : "<AvoidList>" +
+                "__AVOIDFEATURE__" +
+                "</AvoidList>",
+            avoidFeature : "<AvoidFeature>__VALUEAVOIDFEATURE__</AvoidFeature>"
+        }
+    },
+
+    /**
+     * toString
+     *
+     * @returns {String} requête
+     */
+    toString : function () {
+        var template = "";
+        template = this.template.routePlan;
+
+        // preference
+        if (this.options.routePreference) {
+            var tmplPreference = this.template.routePreference;
+            tmplPreference = tmplPreference.replace(/__VALUEROUTEPREFERENCE__/, this.options.routePreference);
+            template = template.replace(/__ROUTEPREFERENCE__/g, tmplPreference);
+        }
+        // clean preference
+        template = template.replace(/__ROUTEPREFERENCE__/g, "");
+
+        // exclusions
+        if (this.options.avoidFeature) {
+            var tmplAvoidList = this.template.avoidList.container;
+            var avoidFeatures = [];
+            for (var i = 0; i < this.options.avoidFeature.length; i++) {
+                var tmplAvoidFeature = this.template.avoidList.avoidFeature;
+                tmplAvoidFeature = tmplAvoidFeature.replace(/__VALUEAVOIDFEATURE__/, this.options.avoidFeature[i]);
+                avoidFeatures.push(tmplAvoidFeature);
+            }
+            tmplAvoidList = tmplAvoidList.replace(/__AVOIDFEATURE__/, avoidFeatures.join("\n"));
+            template = template.replace(/__AVOIDLIST__/g, tmplAvoidList);
+        }
+        // clean exclusions
+        template = template.replace(/__AVOIDLIST__/g, "");
+
+        // graph
+        if (this.options.graph) {
+            var tmplVehicle = this.template.graph;
+            tmplVehicle = tmplVehicle.replace(/__VALUEGRAPH__/, this.options.graph);
+            template = template.replace(/__GRAPH__/g, tmplVehicle);
+        }
+        // clean vehicle
+        template = template.replace(/__GRAPH__/g, "");
+
+        // points
+        var tmplWayPointList = this.template.wayPointList.container;
+        var tmplPoint = "";
+        // start
+        tmplPoint = this.template.wayPointList.point;
+        tmplPoint = tmplPoint.replace(/__X__/, this.options.startPoint.x);
+        tmplPoint = tmplPoint.replace(/__Y__/, this.options.startPoint.y);
+        tmplWayPointList = tmplWayPointList.replace(/__STARTPOINT__/,
+            this.template.wayPointList.startPoint.replace(/__POINT__/, tmplPoint));
+        // end
+        tmplPoint = this.template.wayPointList.point;
+        tmplPoint = tmplPoint.replace(/__X__/, this.options.endPoint.x);
+        tmplPoint = tmplPoint.replace(/__Y__/, this.options.endPoint.y);
+        tmplWayPointList = tmplWayPointList.replace(/__ENDPOINT__/,
+            this.template.wayPointList.endPoint.replace(/__POINT__/, tmplPoint));
+        // via
+        if (this.options.viaPoint) {
+            var points = [];
+            for (var j = 0; j < this.options.viaPoint.length; j++) {
+                var p = this.options.viaPoint[j];
+                tmplPoint = this.template.wayPointList.point;
+                tmplPoint = tmplPoint.replace(/__X__/, p.x);
+                tmplPoint = tmplPoint.replace(/__Y__/, p.y);
+                points.push(tmplPoint);
+            }
+
+            tmplWayPointList = tmplWayPointList.replace(/__VIAPOINT__/,
+                this.template.wayPointList.viaPoint.replace(/__POINT__/, points.join("\n")));
+        } else {
+            // clean viaPoint
+            tmplWayPointList = tmplWayPointList.replace(/__VIAPOINT__/, "");
+        }
+
+        template = template.replace(/__WAYPOINTLIST__/g, tmplWayPointList);
+
+        this.requestString = template;
+        return this.requestString;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (RoutePlan);
+
+
+/***/ }),
+/* 125 */
+/***/ (function(module, exports) {
+
+/**
+ * not implemented !
+ *
+ * Extension de type 'graphName' de l'objet RoutePlan'
+ *
+ * FIXME L'extension 'graphName' est intégré comme étant du standard OLS.
+ *       La balise <xlsext:GraphName> viendrait surcharger le comportement de RoutePreference...
+ *
+ * ex. <xlsext:graphName name="Voiture" />
+ */
+
+
+/***/ }),
+/* 126 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _model_RouteParamREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(127);
+
+
+
+
+
+/**
+ * @classdesc
+ * Classe de gestion des requêtes de type REST sur le service de calcul d'itineraire
+ * (uniquement en GET)
+ *
+ * @constructor
+ * @alias Gp.Services.Route.Request.RouteRequestREST
+ * @param {Object} options - options definies dans le composant Route
+ *
+ * @example
+ * var options = {
+ *      (...)
+ * };
+ *
+ * @private
+ */
+function RouteRequestREST (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("RouteRequestREST");
+    this.logger.trace("[Constructeur RouteRequestREST ()]");
+
+    if (!(this instanceof RouteRequestREST)) {
+        throw new TypeError("RouteRequestREST constructor cannot be called as a function.");
+    }
+
+    // existance des options
+    if (!options) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "options"));
+    }
+
+    /** liste des options */
+    this.settings = options;
+}
+
+RouteRequestREST.prototype = {
+
+    /**
+     * @lends module:RouteRequestREST#
+     */
+
+    /**
+     * request
+     * @type {String}
+     */
+    requestString : null,
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : RouteRequestREST,
+
+    /**
+     * Construction de la requête.
+     *
+     * @example
+     * // GET  out : origin=2.416907353809513,48.8465772142297&destination=2.4248037771493673,48.84591353161838
+     * // POST out : Not yet supported method POST !
+     * @returns {String} request
+     */
+    processRequestString : function () {
+        // INFO
+        // construction simple sans template...,
+        // mais en attendant que les services soient fixés, on taggue ce composant en mode PROTOTYPE !
+        this.logger.warn(" PROTOTYPE !");
+
+        // Mapping des options avec le service de l'API REST
+        var oParams = new _model_RouteParamREST__WEBPACK_IMPORTED_MODULE_2__["default"](this.settings);
+        var params = oParams.getParams();
+
+        var request = "";
+        for (var i = 0; i < params.length; i++) {
+            var o = params[i];
+            if (request) {
+                request += "&";
+            }
+            request += o.k + "=" + o.v;
+        }
+
+        // Exemple :
+        //  http://wxs.ign.fr/KEY/itineraire/rest/route.json?
+        //  origin=&
+        //  destination=&
+        //  waypoints=&
+        //  method=DISTANCE&
+        //  graph=Pieton&
+        //  graphName=Pieton&
+        //  exclusions=&
+        //  tolerance=10&
+        //  srs=
+
+        this.logger.trace(request);
+        this.requestString = request;
+
+        return this.requestString;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (RouteRequestREST);
+
+
+/***/ }),
+/* 127 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+
+
+
+/**
+ * @classdesc
+ * Classe de gestion des param. des requêtes du service de calcul d'itineraire (REST).
+ *      Permet le mapping avec les options du service.
+ * @constructor
+ * @alias Gp.Services.Route.Request.RouteParamREST
+ * @param {Object} options - options
+ *
+ * @private
+ */
+function RouteParamREST (options) {
+    if (!(this instanceof RouteParamREST)) {
+        throw new TypeError("RouteParamREST constructor cannot be called as a function.");
+    }
+
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur RouteParamREST ()]");
+
+    /**
+     * Options en paramêtres du constructeur.
+     */
+    this.options = options || {};
+
+    // mapping des options avec l'API REST
+
+    /** Coordonnées du point de départ. */
+    this.origin = this.options.startPoint.x + "," + this.options.startPoint.y;
+
+    /** Coordonnées du point d’arrivée. */
+    this.destination = this.options.endPoint.x + "," + this.options.endPoint.y;
+
+    /** Coordonnées des étapes point de départ. */
+    this.waypoints = this.options.viaPoints || null;
+
+    /** Date et heure de départ */
+    this.startDateTime = this.options.expectedStartTime || null; // TODO format !?
+
+    /** Nom du graphe à utiliser */
+    this.graphName = this.options.graph;
+
+    /** projection (code EPSG comme epsg:4326 ou wgs84) */
+    this.srs = this.options.srs;
+
+    /** Liste des règles de restrictions à utiliser, séparés pas le caractère , ou ; (Exemple : Toll, Tunnel, Bridge) */
+    this.exclusions = this.options.exclusions;
+
+    /**
+     * itinéraire le plus court (DISTANCE) ou le plus rapide (TIME)
+     * Par defaut, DISTANCE...
+     * cf. mapping ci dessous
+     */
+    this.method = "TIME";
+
+    // mapping particulier sur l'option 'routePreference'
+    if (this.options.routePreference) {
+        var value = this.options.routePreference;
+        switch (value) {
+            case "fastest":
+                this.method = "TIME";
+                break;
+            case "shortest":
+                this.method = "DISTANCE";
+                break;
+            default:
+                this.logger.warn("Par defaut, on prend l'itinéraire le plus rapide !");
+                this.method = "TIME";
+        }
+    }
+
+    /** Format de sortie (résumé de l’itinéraire) */
+    this.format = (this.options.geometryInInstructions) ? "STANDARDEXT" : "STANDARD";
+
+    // y'a t-il d'autres options à ajouter (par defaut) ?
+
+    /** Distance de tolérance (en mètre) de simplification de la géométrie. */
+    this.tolerance = 10;
+
+    /** identifiant du véhicule (enregistré dans les profils de véhicule) à utiliser */
+    this.profileId = null;
+
+    /** Profil du véhicule (enregistré dans les profils de véhicule) à utiliser */
+    this.profileName = null;
+
+    // options dont le mapping n'est pas possible :
+    // - distanceUnit
+    // - provideBoundingBox
+}
+
+/**
+ * CLASSNAME
+ */
+RouteParamREST.CLASSNAME = "RouteParamREST";
+
+RouteParamREST.prototype = {
+
+    /**
+     * @lends module:RouteParamREST#
+     */
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : RouteParamREST,
+
+    /**
+     * Retourne une liste de points
+     * @returns {Array} une liste de points (sep ';')
+     */
+    getWaypoints : function () {
+        if (!this.waypoints) {
+            return;
+        }
+        var array = [];
+        for (var i = 0; i < this.waypoints.length; i++) {
+            var obj = this.waypoints[i];
+            array.push(obj.x + "," + obj.y);
+        }
+
+        return array.join(";");
+    },
+
+    /**
+     * Retourne la liste des exclusions
+     * @returns {Array} une liste d'exclusions (sep ';')
+     */
+    getExclusions : function () {
+        return this.exclusions.join(";");
+    }
+};
+
+/**
+ * Tableau de clefs/valeurs pour param.
+ *
+ * @returns {Array} liste de paramêtres
+ */
+RouteParamREST.prototype.getParams = function () {
+    var map = [];
+
+    map.push({
+        k : "origin",
+        v : this.origin
+    });
+
+    map.push({
+        k : "destination",
+        v : this.destination
+    });
+
+    map.push({
+        k : "method",
+        v : this.method
+    });
+
+    if (this.waypoints) {
+        map.push({
+            k : "waypoints",
+            v : this.getWaypoints()
+        });
+    }
+
+    if (this.startDateTime) {
+        map.push({
+            k : "startDateTime",
+            v : this.startDateTime
+        });
+    }
+
+    if (this.graphName) {
+        map.push({
+            k : "graphName",
+            v : this.graphName
+        });
+    }
+
+    if (this.exclusions) {
+        map.push({
+            k : "exclusions",
+            v : this.getExclusions()
+        });
+    }
+
+    if (this.srs) {
+        map.push({
+            k : "srs",
+            v : this.srs
+        });
+    }
+
+    if (this.format) {
+        map.push({
+            k : "format",
+            v : this.format
+        });
+    }
+
+    return map;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (RouteParamREST);
+
+
+/***/ }),
+/* 128 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45);
+/* harmony import */ var _Formats_XML__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(66);
+/* harmony import */ var _Formats_WKT__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(129);
+/* harmony import */ var _Formats_RouteResponseRESTReader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(130);
+/* harmony import */ var _Formats_RouteResponseOLSReader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(133);
+/* harmony import */ var _model_RouteResponse__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(131);
+/* harmony import */ var _model_RouteInstruction__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(132);
+/**
+ * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON
+ * (Factory)
+ *
+ * @module RouteResponseFactory
+ * @alias Gp.Services.Route.Response.RouteResponseFactory
+ * @private
+ */
+
+
+
+
+
+
+
+
+
+
+var RouteResponseFactory = {
+
+    /**
+     * interface unique
+     *
+     * @method build
+     * @static
+     * @param {Object} options - options definies dans le composant Alti
+     *
+     * @example
+     *   var options = {
+     *      response :
+     *      outputFormat :
+     *      rawResponse :
+     *      scope :
+     *      onSuccess :
+     *      onError :
+     *   };
+     *
+     */
+    build : function (options) {
+        // logger
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("RouteResponseFactory");
+        logger.trace("RouteResponseFactory::build()");
+
+        var data = null;
+
+        if (options.response) {
+            if (options.rawResponse) {
+                logger.trace("analyze response : raw");
+                data = options.response;
+            } else {
+                switch (options.outputFormat) {
+                    case "xml":
+                        logger.trace("analyze response : xml");
+
+                        // type de reader en fonction de l'API
+                        var routeReader = options.api === "REST" ? _Formats_RouteResponseRESTReader__WEBPACK_IMPORTED_MODULE_5__["default"] : _Formats_RouteResponseOLSReader__WEBPACK_IMPORTED_MODULE_6__["default"];
+
+                        try {
+                            var p = new _Formats_XML__WEBPACK_IMPORTED_MODULE_3__["default"]({
+                                reader : routeReader
+                            });
+
+                            // FIXME : mode XHR ne retourne que des string ? JSONP aussi à ce niveau ?
+                            if (typeof options.response === "string") {
+                                p.setXMLString(options.response);
+                            } else {
+                                p.setXMLDoc(options.response);
+                            }
+
+                            data = p.parse();
+
+                            if (!data) {
+                                throw new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_FORMAT", "xml"));
+                            }
+                        } catch (e) {
+                            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE", options.response)));
+                            return;
+                        }
+
+                        break;
+
+                    case "json":
+                        logger.trace("analyze response : json");
+
+                        var JSONResponse;
+                        if (typeof options.response === "string") {
+                            JSONResponse = JSON.parse(options.response);
+                        } else {
+                            JSONResponse = options.response;
+                        }
+
+                        // le service renvoie t il une erreur ?
+                        if (JSONResponse.message) {
+                            // ex. {"message":"message not null", "status":"ERROR"}
+                            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", JSONResponse.message)));
+                            return;
+                        }
+
+                        // construction de l'objet réponse JSON
+                        if (JSONResponse) {
+                            var legs = [];
+                            var legSteps = [];
+                            var steps = [];
+
+                            data = new _model_RouteResponse__WEBPACK_IMPORTED_MODULE_7__["default"]();
+
+                            if (data.hasOwnProperty("totalTime")) {
+                                // info : il y a aussi JSONResponse.duration, qui donne la durée en hh:mm:ss.
+                                data.totalTime = parseFloat(JSONResponse.durationSeconds);
+                            }
+                            if (data.hasOwnProperty("totalDistance")) {
+                                data.totalDistance = (options.distanceUnit === "m") ? JSONResponse.distanceMeters : JSONResponse.distance;
+                            }
+
+                            if (data.hasOwnProperty("bbox")) {
+                                var coords = JSONResponse.bounds.split(/[,;]/);
+                                data.bbox.left = parseFloat(coords[0]);
+                                data.bbox.bottom = parseFloat(coords[1]);
+                                data.bbox.right = parseFloat(coords[2]);
+                                data.bbox.top = parseFloat(coords[3]);
+                            }
+                            /**
+                            * callback success
+                            * @param {Object} json - json
+                            * @private
+                            */
+                            var onWKTSuccess = function (json) {
+                                data.routeGeometry = json;
+                            };
+                            /**
+                            * callback failed
+                            * @param {Object} e - event
+                            * @private
+                            */
+                            var onWKTError = function (e) {
+                                console.log(e);
+                                options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_FORMAT", ["geometryWkt"])));
+                            };
+
+                            if (data.hasOwnProperty("routeGeometry")) {
+                                var geometry = JSONResponse.geometryWkt || JSONResponse.simplifiedWkt;
+                                if (geometry) {
+                                    _Formats_WKT__WEBPACK_IMPORTED_MODULE_4__["default"].toJson(geometry, onWKTSuccess, onWKTError);
+                                    if (!data.routeGeometry) {
+                                        return;
+                                    }
+                                }
+                            }
+
+                            if (data.hasOwnProperty("routeInstructions")) {
+                                var legList = JSONResponse.legs;
+                                var i;
+                                if (Array.isArray(legList) && legList.length) {
+                                    for (i = 0; i < legList.length; i++) {
+                                        legs.push(legList[i]);
+                                    }
+                                }
+                                if (Array.isArray(legs) && legs.length) {
+                                    for (i = 0; i < legs.length; i++) {
+                                        legSteps.push(legs[i].steps);
+                                    }
+                                }
+                                if (Array.isArray(legSteps) && legSteps.length) {
+                                    for (i = 0; i < legSteps.length; i++) {
+                                        steps = steps.concat(legSteps[i]);
+                                    }
+                                }
+
+                                steps.forEach(function (step) {
+                                    data.routeInstructions.push(new _model_RouteInstruction__WEBPACK_IMPORTED_MODULE_8__["default"]());
+                                    data.routeInstructions[data.routeInstructions.length - 1].duration = step.durationSeconds;
+                                    data.routeInstructions[data.routeInstructions.length - 1].distance = (options.distanceUnit === "m") ? step.distanceMeters : step.distance;
+                                    data.routeInstructions[data.routeInstructions.length - 1].code = step.navInstruction;
+                                    // geometrie en geojson
+                                    var points = [];
+                                    for (var i = 0; i < step.points.length; i++) {
+                                        var point = step.points[i].split(",");
+                                        if (point) {
+                                            points.push(point);
+                                        }
+                                    }
+                                    if (points && points.length !== 0) {
+                                        data.routeInstructions[data.routeInstructions.length - 1].geometry = {
+                                            coordinates : points,
+                                            type : "LineString"
+                                        };
+                                    } else {
+                                        data.routeInstructions[data.routeInstructions.length - 1].geometry = null;
+                                    }
+
+                                    /*
+                                    Traduction du code en instruction
+                                    * - F : tout droit
+                                    * - B : demi-tour
+                                    * - L : tourner à gauche
+                                    * - R : tourner à droite
+                                    * - BL : tourner très à gauche
+                                    * - BR : tourner très à droite
+                                    * - FL : tourner légèrement à gauche
+                                    * - FR : tourner légèrement à droite
+                                    * - round_about_entry : entrée rond-point
+                                    * - round_about_exit : sortie rond-point
+                                    */
+
+                                    // on ne souhaite pas de ce type de valeur...
+                                    if (step.name === "Valeur non renseignée") {
+                                        step.name = "";
+                                    }
+
+                                    switch (step.navInstruction) {
+                                        case "F":
+                                            if (step.name) {
+                                                data.routeInstructions[data.routeInstructions.length - 1].instruction = "Tout droit " + step.name;
+                                            } else {
+                                                data.routeInstructions[data.routeInstructions.length - 1].instruction = "Continuer tout droit ";
+                                            }
+                                            break;
+                                        case "B":
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = "Demi-tour " + step.name;
+                                            break;
+                                        case "L":
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = "Tourner à gauche " + step.name;
+                                            break;
+                                        case "R":
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = "Tourner à droite " + step.name;
+                                            break;
+                                        case "BL":
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = "Tourner très à gauche " + step.name;
+                                            break;
+                                        case "BR":
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = "Tourner très à droite " + step.name;
+                                            break;
+                                        case "FL":
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = "Tourner légèrement à gauche " + step.name;
+                                            break;
+                                        case "FR":
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = "Tourner légèrement à droite " + step.name;
+                                            break;
+                                        case "round_about_entry":
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = "Entrée rond-point " + step.name;
+                                            break;
+                                        case "round_about_exit":
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = "Sortie rond-point " + step.name;
+                                            break;
+                                        case null:
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = "Prendre tout droit " + step.name;
+                                            break;
+                                        default:
+                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = "?" + step.navInstruction + "? " + step.name;
+                                            break;
+                                    }
+                                });
+                            }
+                        }
+
+                        if (!data) {
+                            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE", "json")));
+                            return;
+                        }
+                        break;
+
+                    default:
+                        options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_FORMAT", "json", "xml")));
+                        return;
+                }
+
+                // Si la réponse contenait une exception renvoyée par le service
+                if (data && data.exceptionReport) {
+                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION_2")));
+                    return;
+                }
+            }
+        } else {
+            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY")));
+            return;
+        }
+
+        options.onSuccess.call(options.scope, data);
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (RouteResponseFactory);
+
+
+/***/ }),
+/* 129 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+
+
+/**
+ * Lecture / Ecriture du format WKT
+ *
+ * Les besoins sont assez simples :
+ * 1. lecture des types suivants :
+ *  - LINESTRING
+ *  - POLYGON
+ *  - (TODO)
+ * 2. convertir aux formats suivants :
+ *  - json
+ *  - (TODO)
+ *
+ *
+ * @example
+ *  var strWKT = "LINESTRING (2.416907 48.846577, 2.416916 48.846613)";
+ *  WKT.toJson (strWKT,
+ *      function onSuccess (json) {
+ *          // {
+ *          //      type : 'LINESTRING',
+ *          //      coordinates : [
+ *          //          [2.416907, 48.846577],
+ *          //          [2.416916, 48.846613]
+ *          //      ]
+ *          // }
+ *      },
+ *      function onError (error) {
+ *          console.log(error);
+ *      }
+ *  );
+ *
+ * @module WKT
+ * @alias Gp.Formats.WKT
+ * @private
+ */
+
+var WKT = {
+
+    /**
+     * Parsing d'une chaine WKT
+     *
+     * @method toJson
+     * @param {String} strWkt - chaine de type WKT
+     * @param {Function} success - fonction callback
+     * @param {Function} error   - fonction callback
+     */
+    toJson : function (strWkt, success, error) {
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+
+        var json = null;
+
+        try {
+            if (!strWkt) {
+                throw new Error("La chaine WKT n'est pas renseignée !");
+            }
+
+            if (!success) {
+                // callback success par defaut
+                success = function (json) {
+                    console.log(json);
+                };
+            }
+
+            if (!error) {
+                // callback error par defaut
+                error = function (e) {
+                    console.log(e);
+                };
+            }
+
+            var regex;
+            var subst;
+
+            // regex coordinates
+            regex = /(-?\d+\.?[0-9]*)\s(-?\d+\.?[0-9]+)/g;
+            subst = "[$1,$2]";
+            strWkt = strWkt.replace(regex, subst);
+
+            // regex type
+            regex = /^(\w+)/;
+            regex.exec(strWkt);
+            if (RegExp.$1 === "POLYGON") {
+                subst = "{\"type\" : \"Polygon\",";
+                strWkt = strWkt.replace(RegExp.$1, subst);
+                // clean
+                // (( --> coordinates : [[
+                regex = /(\({2}?)/;
+                subst = "\"coordinates\" : [[";
+                strWkt = strWkt.replace(regex, subst);
+                // )) --> ]]}
+                regex = /(\){2}?)/;
+                subst = "]]}";
+                strWkt = strWkt.replace(regex, subst);
+                // all ( --> [
+                regex = /(\()/g;
+                subst = "[";
+                strWkt = strWkt.replace(regex, subst);
+                // all ) --> ]
+                regex = /(\))/g;
+                subst = "]";
+                strWkt = strWkt.replace(regex, subst);
+            } else if (RegExp.$1 === "LINESTRING") {
+                subst = "{\"type\" : \"LineString\",";
+                strWkt = strWkt.replace(RegExp.$1, subst);
+                // clean
+                regex = /(\(\(?)/;
+                subst = "\"coordinates\" : [";
+                strWkt = strWkt.replace(regex, subst);
+                regex = /(\)\)?)/;
+                subst = "]}";
+                strWkt = strWkt.replace(regex, subst);
+            }
+
+            logger.trace(strWkt);
+
+            json = JSON.parse(strWkt);
+
+            if (!json) {
+                throw new Error("Le JSON est vide !");
+            }
+
+            if (!json.type) {
+                throw new Error("Le type de geometrie n'est pas connu !");
+            }
+
+            if (!json.coordinates) {
+                throw new Error("La liste des points est vide !");
+            }
+
+            success.call(this, json);
+        } catch (e) {
+            if (e.name === "SyntaxError") {
+                error.call(this, "Erreur de parsing JSON !");
+                return;
+            }
+            error.call(this, e);
+        }
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (WKT);
+
+
+/***/ }),
+/* 130 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(44);
+/* harmony import */ var _Formats_WKT__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(129);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45);
+/* harmony import */ var _Response_model_RouteResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(131);
+/* harmony import */ var _Response_model_RouteInstruction__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(132);
+/**
+ * Analyse de la reponse REST
+ *
+ * @module RouteResponseRESTReader
+ * @alias Gp.Services.Route.Formats.RouteResponseRESTReader
+ * @todo not yet implemented !
+ * @private
+ */
+
+// import Logger from "../../../Utils/LoggerByDefault";
+
+
+
+
+
+
+/**
+ * Objet RouteResponseRestReader
+ * @member {Object} RouteResponseRestReader
+ *
+ * @property {Object} RouteResponseRestReader.READERS - Objet contenant des fonctions de lecture, appelées "readers"
+ *      dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire
+ *      et la valeur associée est une fonction (node, data)
+ *      où node est un noeud du document DOM
+ *      et data est un objet où l'on stocke les informations lues dans le XML.
+ *
+ * @property {Method} RouteResponseRestReader.read - Méthode permettant de lancer la lecture d'une réponse XML du
+ *      service de calcul d'itineraire, à l'aide des readers de la classe.
+ *
+ */
+
+var RouteResponseRESTReader = {};
+
+RouteResponseRESTReader.READERS = {
+
+    /**
+     * Route response
+     * @param {Object} node - node
+     * @returns {Object} response
+     */
+    routeResult : function (node) {
+        var response = new _Response_model_RouteResponse__WEBPACK_IMPORTED_MODULE_3__["default"]();
+
+        // on boucle sur les balises "enfant" de la réponse :
+        // status, distance, duration, distanceMeters, durationSeconds, bounds, geometryWkt, simplifiedWkt, leg
+        __getChildNodes(node, response);
+
+        if (response.status === "error") {
+            var message = _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION",
+                response.message);
+            throw new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                message : message,
+                type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR
+            });
+        }
+
+        return response;
+    },
+
+    /**
+     * Route status
+     * @param {Object} node - node
+     * @param {Object} response - response
+     */
+    status : function (node, response) {
+        var status = __getChildValue(node);
+        if (status === "ERROR" || status === "error") {
+            if (response) {
+                response.status = "error";
+            }
+        }
+    },
+
+    /**
+     * Route message
+     * @param {Object} node - node
+     * @param {Object} response - response
+     */
+    message : function (node, response) {
+        if (response) {
+            response.message = __getChildValue(node);
+        }
+    },
+
+    /**
+     * Route distance
+     * @param {Object} node - node
+     * @param {Object} response - response
+     */
+    distance : function (node, response) {
+        if (response) {
+            response.totalDistance = __getChildValue(node);
+        }
+    },
+
+    /**
+     * Route duration
+     * @param {Object} node - node
+     * @param {Object} response - response
+     */
+    durationSeconds : function (node, response) {
+        if (response) {
+            response.totalTime = parseFloat(__getChildValue(node));
+        }
+    },
+
+    /**
+     * Route bounds
+     * @param {Object} node - node
+     * @param {Object} response - response
+     */
+    bounds : function (node, response) {
+        // get value et split et parseFloat
+        if (response && response.bbox) {
+            var coords = __getChildValue(node).split(/[,;]/);
+            response.bbox.left = parseFloat(coords[0]);
+            response.bbox.bottom = parseFloat(coords[1]);
+            response.bbox.right = parseFloat(coords[2]);
+            response.bbox.top = parseFloat(coords[3]);
+        }
+    },
+
+    /**
+     * Route geometry
+     * @param {Object} node - node
+     * @param {Object} response - response
+     */
+    geometryWkt : function (node, response) {
+        if (response) {
+            var geomWkt = node.innerHTML;
+
+            var onWKTSuccess = function (json) {
+                response.routeGeometry = json;
+            };
+
+            var onWKTError = function () {
+                var msg = _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__["default"].getMessage("PARAM_FORMAT", ["geometryWkt"]);
+                throw new Error(msg);
+            };
+            // get WKT Geometry from string
+            _Formats_WKT__WEBPACK_IMPORTED_MODULE_1__["default"].toJson(geomWkt, onWKTSuccess, onWKTError);
+        }
+    },
+
+    /**
+     * Route step
+     * @param {Object} node - node
+     * @param {Object} response - response
+     */
+    step : function (node, response) {
+        // création d'une nouvelle instruction
+        var routeInstruction = new _Response_model_RouteInstruction__WEBPACK_IMPORTED_MODULE_4__["default"]();
+        var name;
+
+        // lecture des informations de l'instruction (balises enfants)
+        if (node.hasChildNodes) {
+            var children = node.childNodes;
+            var child;
+            var childName;
+
+            for (var i = 0; i < children.length; i++) {
+                child = children[i];
+
+                if (child.nodeType === 1) { // 1 === node.ELEMENT_NODE
+                    childName = child.localName || child.baseName || child.nodeName;
+
+                    if (childName === "durationSeconds") {
+                        routeInstruction.duration = __getChildValue(child);
+                    } else if (childName === "distance") {
+                        routeInstruction.distance = __getChildValue(child);
+                    } else if (childName === "navInstruction") {
+                        routeInstruction.code = __getChildValue(child);
+                    } else if (childName === "name") {
+                        name = __getChildValue(child);
+                    }
+                }
+            }
+        }
+
+        // on teste le code de l'instruction pour y ajouter la bonne description
+        if (routeInstruction.code) {
+            switch (routeInstruction.code) {
+                case "F":
+                    if (name !== "Valeur non renseignée") {
+                        routeInstruction.instruction = "Tout droit " + name;
+                    } else {
+                        routeInstruction.instruction = "Continuer tout droit ";
+                    }
+                    break;
+                case "B":
+                    routeInstruction.instruction = "Demi-tour " + name;
+                    break;
+                case "L":
+                    routeInstruction.instruction = "Tourner à gauche " + name;
+                    break;
+                case "R":
+                    routeInstruction.instruction = "Tourner à droite " + name;
+                    break;
+                case "BL":
+                    routeInstruction.instruction = "Tourner très à gauche " + name;
+                    break;
+                case "BR":
+                    routeInstruction.instruction = "Tourner très à droite " + name;
+                    break;
+                case "FL":
+                    routeInstruction.instruction = "Tourner légèrement à gauche " + name;
+                    break;
+                case "FR":
+                    routeInstruction.instruction = "Tourner légèrement à droite " + name;
+                    break;
+                case "round_about_entry":
+                    routeInstruction.instruction = "Entrée rond-point " + name;
+                    break;
+                case "round_about_exit":
+                    routeInstruction.instruction = "Sortie rond-point " + name;
+                    break;
+                case null:
+                    routeInstruction.instruction = "Prendre " + name;
+                    break;
+                default:
+                    routeInstruction.instruction = "?" + routeInstruction.code + "? " + name;
+                    break;
+            }
+        }
+
+        if (Array.isArray(response.routeInstructions)) {
+            response.routeInstructions.push(routeInstruction);
+        }
+    }
+
+};
+
+/**
+ * Méthode permettant de lancer la lecture d'une réponse XML du service de calcul d'itineraire,
+ * à l'aide des readers de la classe.
+ *
+ * @method RouteResponseRESTReader.read
+ * @param {DOMElement} root - racine de la réponse XML à lire
+ * @static
+ * @memberof RouteResponseRESTReader
+ * @returns {DOMElement} response
+ */
+RouteResponseRESTReader.read = function (root) {
+    var response;
+
+    if (root.nodeName === "routeResult") {
+        response = RouteResponseRESTReader.READERS["routeResult"](root);
+        return response;
+    } else {
+        throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.");
+    }
+};
+
+/**
+ * Lecture de la valeur du premier child d'un noeud, si elle existe.
+ *
+ * @private
+ * @memberof RouteResponseRESTReader
+ * @method __getChildValue
+ * @param {DOMElement} node - a DOM node
+ * @return {String} value - valeur du firstChild du noeud en entrée, ou chaîne vide.
+ */
+function __getChildValue (node) {
+    var textNode;
+    var value = "";
+
+    if (node.hasChildNodes()) {
+        textNode = node.firstChild;
+        if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+            value = textNode.nodeValue;
+        }
+    }
+    return value;
+}
+
+/**
+ * Récupération des noeuds enfants à partir d'un noeud donné, pour lecture (readNode).
+ *
+ * @private
+ * @memberof RouteResponseRESTReader
+ * @method __getChildNodes
+ * @param {DOMElement} node - a DOM node
+ * @param {Array|Object} [data] - an object to be filled with node data
+ */
+function __getChildNodes (node, data) {
+    if (node.hasChildNodes()) {
+        var children = node.childNodes;
+        var child;
+        var childName;
+
+        for (var i = 0; i < children.length; i++) {
+            child = children[i];
+
+            if (child.nodeType === 1) { // 1 === node.ELEMENT_NODE
+                childName = child.localName || child.baseName || child.nodeName;
+
+                if (RouteResponseRESTReader.READERS[childName]) {
+                    var reader = RouteResponseRESTReader.READERS[childName];
+                    reader(child, data);
+                } else {
+                    __getChildNodes(child, data);
+                }
+            }
+        }
+    }
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (RouteResponseRESTReader);
+
+
+/***/ }),
+/* 131 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/**
+ * Response object for {@link module:Services~route Gp.Services.route ()} invocation when successful. Received as the argument of onSuccess callback function.
+ *
+ * @property {Gp.BBox} bbox - Bounding Box of the route. Given when provideBBox parameter is used in function call.
+ * @property {Object} routeGeometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the route.
+ * @property {Array.<Gp.Services.Route.RouteInstruction>} routeInstructions - Instructions of the route.
+ * @property {String} totalDistance - Length of the route. If distanceUnit parameter was set to "km" (default), totalDistance is a string containing the total distance expressed in kilometers, followed by " Km" (e.g. : "19.6 Km"). If distanceUnit parameter was set to "m", totalDistance is a string containing the total distance expressed in meters (e.g. : "19599.14").
+ * @property {Float} totalTime - Route duration in seconds.
+ *
+ * @namespace
+ * @alias Gp.Services.RouteResponse
+ */
+function RouteResponse () {
+    if (!(this instanceof RouteResponse)) {
+        throw new TypeError("RouteResponse constructor cannot be called as a function.");
+    }
+
+    this.totalTime = null;
+
+    this.totalDistance = null;
+
+    this.bbox = {
+        left : null,
+        right : null,
+        top : null,
+        bottom : null
+    };
+
+    this.routeGeometry = null; // FIXME can be null if option 'geometryInInstructions' is true !
+
+    this.routeInstructions = [];
+}
+
+RouteResponse.prototype = {
+
+    constructor : RouteResponse
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (RouteResponse);
+
+
+/***/ }),
+/* 132 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Single Route Instruction object.
+ *
+ * @property {String} code - Instruction code :
+ *
+ * - "F" : Straight forward
+ * - "B" : U-turn
+ * - "L" : turn left
+ * - "R" : turn right
+ * - "BL" : turn left strongly
+ * - "BR" : turn right strongly
+ * - "FL" : turn lightly to the left
+ * - "FR" : turn lightly to the right
+ * - "round_about_entry" : round about entry
+ * - "round_about_exit" : round about exit
+ *
+ * @property {String} instruction - Instruction text : translated code + street name
+ * @property {Object} geometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the street.
+ * @property {Float} distance - Length of the instruction. Expressed in km or m, depending on distanceUnit parameter.
+ * @property {Float} duration - Instruction duration in seconds.
+ *
+ * @namespace
+ * @alias Gp.Services.Route.RouteInstruction
+ */
+function RouteInstruction () {
+    if (!(this instanceof RouteInstruction)) {
+        throw new TypeError("RouteInstruction constructor cannot be called as a function.");
+    }
+
+    this.duration = null;
+
+    this.distance = null;
+
+    this.code = null;
+
+    this.instruction = null;
+
+    this.geometry = null; // FIXME can be null if option 'geometryInInstructions' is false !
+}
+
+RouteInstruction.prototype = {
+
+    constructor : RouteInstruction
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (RouteInstruction);
+
+
+/***/ }),
+/* 133 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/**
+ * Analyse de la reponse OLS
+ *
+ * @module RouteResponseOLSReader
+ * @alias Gp.Services.Route.Formats.RouteResponseOLSReader
+ * @todo not yet implemented !
+ * @private
+ */
+
+
+
+/**
+ * Objet RouteResponseOLSReader
+ * @member {Object} RouteResponseOLSReader
+ *
+ * @property {Object} RouteResponseOLSReader.READERS - Objet contenant des fonctions de lecture, appelées "readers"
+ *      dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire
+ *      et la valeur associée est une fonction (node, data)
+ *      où node est un noeud du document DOM
+ *      et data est un objet où l'on stocke les informations lues dans le XML.
+ *
+ * @property {Method} RouteResponseOLSReader.read -  Méthode permettant de lancer la lecture d'une réponse
+ *      XML du service de calcul d'itineraire, à l'aide des readers de la classe.
+ */
+var RouteResponseOLSReader = {};
+
+/**
+ * Objet contenant des fonctions de lecture, appelées "readers"
+ *      dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire
+ *      et la valeur associée est une fonction (node, data)
+ *      où node est un noeud du document DOM
+ *      et data est un objet où l'on stocke les informations lues dans le XML.
+ * @static
+ * @memberof RouteResponseOLSReader
+ */
+RouteResponseOLSReader.READERS = {
+    /*
+        // INFO
+        // pas de reponse en JSON pour l'API OLS, uniquement du XML !
+
+        // INFO
+        // Exemple d'erreur du service
+        // <?xml version= "1.0" encoding= "UTF-8" standalone= "yes" ?>
+        // <XLS version="1.2" xsi : schemaLocation = "http://www.opengis.net/xls http://schemas.opengis.net/ols/1.2/olsAll.xsd" xmlns : xls = "http://www.opengis.net/xls" xmlns= "http://www.opengis.net/xls" xmlns : xlsext = "http://www.opengis.net/xlsext" xmlns : gml = "http://www.opengis.net/gml" // xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance" >
+        // <ResponseHeader>
+        //     <ErrorList>
+        //         <Error message="Routing error : Error in smartrouting com.geoconcept.smartrouting.SmartRoutingNativeException : failed to connect waypoint { 48.846577, 2.416907, 0.000000 } failed to connect waypoint { 48.846577, 2.416907, 0.000000 } " errorCode="InternalServerError"/>
+        //     </ErrorList>
+        // </ResponseHeader>
+        // <Response version= "1.2" requestID= "f8358c74-8aee-4203-90b9-2c70db5996a1" />
+        // </XLS>
+
+        // INFO
+        // Exemple d'erreur NGinx
+        // <ExceptionReport><Exception exceptionCode="MissingParameter">Resource parameter not found</Exception></ExceptionReport>
+    */
+};
+
+/**
+ * Méthode permettant de lancer la lecture d'une réponse XML du service de calcul d'itineraire,
+ * à l'aide des readers de la classe.
+ *
+ * @method RouteResponseOLSReader.read
+ * @param {DOMElement} root - racine de la réponse XML à lire
+ * @static
+ * @memberof RouteResponseOLSReader
+ */
+RouteResponseOLSReader.read = function (root) {
+    // logger
+    var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("RouteResponseOLSReader");
+    logger.error("not yet implemented !");
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (RouteResponseOLSReader);
+
+
+/***/ }),
+/* 134 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45);
+/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(46);
+/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(56);
+/* harmony import */ var _Request_ProcessIsoCurveRequest__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(135);
+/* harmony import */ var _Response_ProcessIsoCurveResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(137);
+
+
+
+
+
+
+
+
+
+/**
+ * @classdesc
+ * Appel du service d'isochrone/distance du Géoportail :
+ *     envoi de la requête construite selon les paramètres en options,
+ *     éventuellement parsing et analyse  de la réponse,
+ *     retour d'une réponse en paramètre de la fonction onSuccess.
+ * @constructor
+ * @extends {Gp.Services.CommonService}
+ * @alias Gp.Services.ProcessIsoCurve
+ * @param {Object} options - options spécifiques au service (+ les options heritées)
+ *
+ * @param {String} options.outputFormat - Le format de la réponse du service iso : 'xml' ou 'json'.
+ *      Ce paramètre déterminera l'extension '.xml' ou '.json' du service.
+ *      Nécessaire si serverUrl est renseigné pour connaître le format dans lequel sera fournie la réponse (pour son traitement).
+ *      Par défaut, ce paramètre vaut 'json'.
+ *
+ * @param {Object} options.position - Point de départ du calcul.
+ *      Coordonnées exprimées en longitudes, latitudes (EPSG:4326)
+ *      @param {Float} options.position.x - Abcisse du point de départ du calcul d'isochrone/distance.
+ *      @param {Float} options.position.y - Ordonnée du point de départ du calcul d'isochrone/distance.
+ *
+ * @param {String} options.srs - Projection.
+ *      Système de coordonnées dans lequel les coordonnées du point « location » sont exprimées et
+ *      dans lequel la géométrie de la courbe résultante sera exprimée.
+ *      Par défaut, le système de coordonnées utilisé sera « EPSG:4326 ».
+ *
+ * @param {String} [options.graph = "voiture"] - Nom du graphe à utiliser pour le calcul (« Pieton » ou « Voiture »).
+ *      La valeur par défaut est : «voiture»
+ *
+ * @param {Array.<String>} [options.exclusions] - Critères d'exclusions à appliquer pour le calcul.
+ *      On précise ici le type de tronçons que l'on ne veut pas que l'isochrone/distance emprunte
+ *      (valeurs possibles : « toll » (éviter les péages), « bridge », « tunnel »).
+ *
+ * @param {String} [options.method = "time"] - Méthode utilisée pour le calcul de la courbe iso.
+ *      Les valeurs possible sont "time" pour un calcul d'isochrone, "distance" pour un calcul d'isodistance.
+ *      Pas de valeur spécifié équivaut à un calcul d'isochrone.
+ *
+ * @param {Float} options.time - Durée maximum (exprimée en secondes) à utiliser pour le calcul de la courbe à partir du ou jusqu'au point « location ».
+ *      Ce paramètre doit être renseigné si l'option "méthod" a la valeur "time".
+ *      Si l'option method n'est pas renseignée, ce paramètre doit être renseigné.
+ *
+ * @param {Float} options.distance - Distance maximum (exprimée en metres) à utiliser pour le calcul de la courbe à partir du ou j'usqu'au point « location ».
+ *      Ce paramètre doit être renseigné si l'option "méthod" a la valeur "DISTANCE".
+ *      Si l'option "method" n'est pas renseignée, ce paramètre sera ignoré.
+ *
+ * @param {Boolean} [options.reverse = false] - Indique si la géométrie résultante doit être lissée (« true ») pour ne pas avoir d'effet d'escalier.
+ *      Par défaut, la valeur « false » est appliquée.
+ *
+ * @param {Boolean} [options.smoothing = false] - Indique si la géométrie résultante doit être lissée (« true ») pour ne pas avoir d'effet d'escalier.
+ *      Par défaut, la valeur « false » est appliquée.
+ *
+ * @param {Boolean} [options.holes = false] - Indique si la géométrie résultante (surface) doit être retournée avec des trous (« true »).
+ *      Par défaut, la valeur « false » est appliquée.
+ *
+ * @example
+ *   var options = {
+ *      // options communes aux services
+ *      apiKey : null,
+ *      serverUrl : 'http://localhost/service/',
+ *      protocol : 'JSONP', // JSONP|XHR
+ *      proxyURL : null,
+ *      httpMethod : 'GET', // GET|POST
+ *      timeOut : 10000, // ms
+ *      rawResponse : false, // true|false
+ *      scope : null, // this
+ *      onSuccess : function (response) {},
+ *      onFailure : function (error) {},
+ *      // spécifique au service
+ *      position : {
+ *           x : 2.3242664298058053,
+ *           y : 48.86118017324745
+ *      },
+ *      distance : 200,
+ *      [time : ]
+ *      method : "distance",
+ *      exclusions : ["Bridge", "Tunnel", "Toll"],
+ *      graph : "voiture",
+ *      reverse : false,
+ *      smoothing : false,
+ *      holes : false
+ *  };
+ * @private
+ */
+
+function ProcessIsoCurve (options) {
+    if (!(this instanceof ProcessIsoCurve)) {
+        throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "ProcessIsoCurve"));
+    }
+
+    /**
+     * Nom de la classe (heritage)
+     * FIXME instance ou classe ?
+     */
+    this.CLASSNAME = "ProcessIsoCurve";
+
+    // appel du constructeur par heritage
+    _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, arguments);
+
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.ProcessIsoCurve");
+    this.logger.trace("[Constructeur ProcessIsoCurve (options)]");
+
+    if (!options.position) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "position"));
+    }
+
+    // on lance une exception afin d'eviter au service de le faire...
+    if (options.position.x === null) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "position.x"));
+    }
+
+    if (options.position.y === null) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "position.y"));
+    }
+
+    if (!options.time && !options.distance) {
+        throw new Error("Parameter (s) 'distance' missing. Parameter time to calculate an isochrone, parameter distance for an isodistance");
+    }
+
+    // si on a que le paramètre "distance" en entrée, on calcule une isodistance.
+    // Le paramètre "méthode" doit pour avoir une réponse du service, être passé à "distance"
+    if (!options.time && options.distance) {
+        this.options.method = "distance";
+        // on supprime l'éventuel attribut time, résidu d'un appel antérieur
+        if (this.options.time) {
+            delete this.options.time;
+        }
+    }
+
+    // si on a que le paramètre "time" en entrée, on calcule une isochrone.
+    // Le paramètre "méthode" doit pour avoir une réponse du service, être passé à "time"
+    if (options.time && !options.distance) {
+        this.options.method = "time";
+        // on supprime l'éventuel attribut time, résidu d'un appel antérieur
+        if (this.options.distance) {
+            delete this.options.distance;
+        }
+    }
+
+    // au cas où on a ni l'un, ni l'autre...
+    this.options.method = this.options.method || "time";
+
+    // options par defaut du service
+    this.options.exclusions = options.exclusions || null;
+    this.options.graph = options.graph || "Voiture"; // TODO test de la valeur à faire !
+    this.options.reverse = options.reverse || false;
+    this.options.smoothing = options.smoothing || false;
+    this.options.holes = options.holes || false;
+    this.options.srs = options.srs || "EPSG:4326";
+
+    // on passe l'option outputFormat en minuscules afin d'éviter des exceptions.
+    this.options.outputFormat = (typeof options.outputFormat === "string") ? options.outputFormat.toLowerCase() : "json";
+
+    // gestion de l'url du service par defaut
+    // si l'url n'est pas renseignée, il faut utiliser les urls par defaut
+    if (!this.options.serverUrl) {
+        var lstUrlByDefault = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].ProcessIsoCurve.url(this.options.apiKey);
+
+        var urlFound = lstUrlByDefault["iso" + "-" + this.options.outputFormat];
+        if (!urlFound) {
+            throw new Error("Url by default not found !");
+        }
+        this.options.serverUrl = urlFound;
+        this.logger.trace("Serveur URL par defaut : " + this.options.serverUrl);
+    }
+
+    // gestion du type de service
+    // si l'extension de l'url est .json ou .xml, on surcharge le format de sortie (outputFormat)
+    var idx = this.options.serverUrl.lastIndexOf(".");
+    if (idx !== -1) {
+        var extension = this.options.serverUrl.substring(idx + 1);
+        if (extension && extension.length < 5) { // FIXME extension de moins de 4 car. ...
+            this.logger.trace("Serveur Extension URL : " + extension);
+            switch (extension.toLowerCase()) {
+                case "json":
+                case "xml":
+                    this.options.outputFormat = extension.toLowerCase();
+                    break;
+                default:
+                    throw new Error("type of service : unknown or unsupported (json or xml) !");
+            }
+        }
+    }
+}
+
+/**
+ * @lends module:ProcessIsoCurve#
+ */
+ProcessIsoCurve.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, {
+    // todo
+    // getter/setter
+});
+
+/*
+ * Constructeur (alias)
+ */
+ProcessIsoCurve.prototype.constructor = ProcessIsoCurve;
+
+/**
+ * Création de la requête (overwrite)
+ *
+ * @param {Function} error   - callback des erreurs
+ * @param {Function} success - callback
+ */
+ProcessIsoCurve.prototype.buildRequest = function (error, success) {
+    try {
+        var oIsoCurve = new _Request_ProcessIsoCurveRequest__WEBPACK_IMPORTED_MODULE_5__["default"](this.options);
+        if (!oIsoCurve.processRequestString()) {
+            throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_REQUEST_BUILD"));
+        }
+
+        this.request = oIsoCurve.requestString;
+    } catch (e) {
+        error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](e.message));
+        return;
+    }
+
+    success.call(this, this.request);
+};
+
+/**
+ * (overwrite)
+ * Analyse de la reponse
+ *
+ * @param {Function} onError   - callback des erreurs
+ * @param {Function} onSuccess - callback de succès de l'analyse de la réponse
+ */
+ProcessIsoCurve.prototype.analyzeResponse = function (onError, onSuccess) {
+    if (this.response) {
+        var options = {
+            response : this.response,
+            outputFormat : this.options.outputFormat,
+            rawResponse : this.options.rawResponse,
+            onSuccess : onSuccess,
+            onError : onError,
+            scope : this
+        };
+
+        _Response_ProcessIsoCurveResponseFactory__WEBPACK_IMPORTED_MODULE_6__["default"].build(options);
+    } else {
+        onError.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY")));
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurve);
+
+
+/***/ }),
+/* 135 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _model_ProcessIsoCurveParam__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(136);
+
+
+
+
+
+/**
+ * @classdesc
+ * Classe de gestion des requêtes sur le service de calcul d'isoschrone/isodistance.
+ *  Les requêtes peuvent être en mode GET ou POST,
+ *  et le format de sorti est en JSON ou en XML.
+ *
+ * @constructor
+ * @alias Gp.Services.ProcessIsoCurve.Request.ProcessIsoCurveRequest
+ * @param {Object} options - options
+ *
+ * @example
+ * var options = {
+ *      httpMethod : 'GET', // GET|POST
+ *      // spécifique au service
+ *      exclusions : ['Bridge', 'Tunnel'],
+ *      position : {
+ *          x : 2.3242664298058053,
+ *          y : 48.86118017324745
+ *      },
+ *      graph : "Voiture",
+ *      method : 'time',
+ *      time : 1000, //distance : 200
+ *      reverse : false,
+ *      smoothing : false,
+ *      holes : false,
+ *      srs : 'EPSG:4326'
+ *  };
+ *
+ * try {
+ *
+ *      var oIsoCurve = new ProcessIsoCurveRequest (options);
+ *      if (!oIsoCurve.processRequestString ()) {
+ *          // error
+ *      }
+ *
+ *      var request = oIsoCurve.requestString;
+ *
+ * } catch (e) {
+ *      // error
+ * }
+ * @private
+ */
+function ProcessIsoCurveRequest (options) {
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("ProcessIsoCurveRequest");
+    this.logger.trace("[Constructeur ProcessIsoCurveRequest ()]");
+
+    if (!(this instanceof ProcessIsoCurveRequest)) {
+        throw new TypeError("ProcessIsoCurveRequest constructor cannot be called as a function.");
+    }
+
+    // existance des options
+    if (!options) {
+        throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "options"));
+    }
+
+    /**
+     * Liste des options
+     */
+    this.settings = options;
+
+    /**
+     * Mode HTPP.
+     * Par defaut, "GET".
+     * @type {String}
+     */
+    this.mode = this.settings.httpMethod || "GET";
+}
+
+ProcessIsoCurveRequest.prototype = {
+
+    /**
+     * @lends module:ProcessIsoCurveRequest#
+     */
+
+    /**
+     * Requête
+     * @type {String}
+     */
+    requestString : null,
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : ProcessIsoCurveRequest,
+
+    /**
+     * Template de la requête (POST)
+     * * __X__ __Y__ __SRS__ __GRAPHNAME__ __METHOD__  (obligatoire)
+     * * __REVERSE__ __SMOOTHING__ __HOLES__           (par defaut)
+     * * __TIME__ __TIMEVALUE__                        (choix)
+     * * __DISTANCE__ __DISTANCEVALUE__                (choix)
+     * * __EXCLUSIONS__ __EXCLUSIONFEATURE__ __EXCLUSIONVALUE__ (optionnel)
+     * * __PROFIL__ __PROFILID__ __PROFILNAME__                 (très optionnel)
+     * * __ID__ __IDVALUE__                                     (très optionnel)
+     */
+    template : {
+        container : "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+            "<isochroneRequest>\n" +
+            "__ID__" +
+            "\t<location>\n" +
+            "\t\t<x>__X__</x>\n" +
+            "\t\t<y>__Y__</y>\n" +
+            "\t</location>\n" +
+            "\t<srs>__SRS__</srs>\n" +
+            "\t<graphName>__GRAPHNAME__</graphName>\n" +
+            "__PROFIL__" +
+            "__EXCLUSIONS__" +
+            "\t<method>__METHOD__</method>\n" +
+            "__TIME__" +
+            "__DISTANCE__" +
+            "\t<reverse>__REVERSE__</reverse>\n" +
+            "\t<smoothing>__SMOOTHING__</smoothing>\n" +
+            "\t<holes>__HOLES__</holes>\n" +
+            "</isochroneRequest>",
+        id : "\t<id>__IDVALUE__</id>\n",
+        profil : "\t<profileId>__PROFILID__</profileId>\n" + "\t<profileName>__PROFILNAME__</profileName>\n",
+        exclusions : {
+            container : "\t<exclusions>\n" +
+                "__EXCLUSIONFEATURE__\n" +
+                "\t</exclusions>\n",
+            feature : "\t\t<exclusion>__EXCLUSIONVALUE__</exclusion>"
+        },
+        time : "\t<time>__TIMEVALUE__</time>\n",
+        distance : "\t<distance>__DISTANCEVALUE__</distance>\n"
+    },
+
+    /**
+     * Construction de la requête.
+     *
+     * @example
+     * // GET  out :
+     *   //  (http://wxs.ign.fr/KEY/isochrone/isochrone.json?)
+     *   //  location=&
+     *   //  time=& ou distance=&
+     *   //  method="DISTANCE|TIME"&
+     *   //  graph=Pieton&
+     *   //  graphName=Pieton&
+     *   //  exclusions=&
+     *   //  reverse=10&
+     *   //  smoothing=&
+     *   //  holes=&
+     *   //  srs=
+     *
+     * // POST out :
+     *   // <?xml version="1.0" encoding="UTF-8"?>
+     *   // <isochroneRequest>
+     *   //   <id>1</id>
+     *   //   <location>
+     *   //     <x>-1.557189</x>
+     *   //     <y>47.217122</y>
+     *   //   </location>
+     *   //   <srs></srs>
+     *   //   <graphName></graphName>
+     *   //   <profileId></profileId>
+     *   //   <profileName></profileName>
+     *   //   <exclusions>
+     *   //     <exclusion></exclusion>
+     *   //     <exclusion></exclusion>
+     *   //   </exclusions>
+     *   //   <method></method>
+     *   //   <time>50</time>
+     *   //   <distance></distance>
+     *   //   <reverse></reverse>
+     *   //   <smoothing></smoothing>
+     *   //   <holes></holes>
+     *   // </isochroneRequest>
+     *
+     * @returns {String} request
+     */
+    processRequestString : function () {
+        var request = "";
+        var i = 0;
+
+        switch (this.mode) {
+            case "GET":
+                this.logger.trace("Process GET Request");
+
+                // Mapping des options avec le service de l'API REST
+                var oParams = new _model_ProcessIsoCurveParam__WEBPACK_IMPORTED_MODULE_2__["default"](this.settings);
+                var params = oParams.getParams();
+
+                for (i = 0; i < params.length; i++) {
+                    var o = params[i];
+                    if (request) {
+                        request += "&";
+                    }
+                    request += o.k + "=" + o.v;
+                }
+
+                break;
+
+            case "POST":
+                this.logger.trace("Process POST Request");
+
+                request = this.template.container;
+
+                // options non prises en compte car non implémentées !
+                // clean : id
+                request = request.replace(/__ID__/g, "");
+                // clean : profil
+                request = request.replace(/__PROFIL__/g, "");
+
+                // options obligatoires
+                request = request.replace(/__X__/g, this.settings.position.x);
+                request = request.replace(/__Y__/g, this.settings.position.y);
+                request = request.replace(/__GRAPHNAME__/g, this.settings.graph);
+
+                // options par defaut
+                request = request.replace(/__SRS__/g, this.settings.srs);
+                request = request.replace(/__SMOOTHING__/g, this.settings.smoothing);
+                request = request.replace(/__HOLES__/g, this.settings.holes);
+                request = request.replace(/__REVERSE__/g, this.settings.reverse);
+
+                // options conditionnelles
+
+                // exclusions
+                if (this.settings.exclusions) {
+                    var tmplExclusions = this.template.exclusions.container;
+                    var exclusions = [];
+                    for (i = 0; i < this.settings.exclusions.length; i++) {
+                        var tmplFeature = this.template.exclusions.feature;
+                        tmplFeature = tmplFeature.replace(/__EXCLUSIONVALUE__/, this.settings.exclusions[i]);
+                        exclusions.push(tmplFeature);
+                    }
+                    tmplExclusions = tmplExclusions.replace(/__EXCLUSIONFEATURE__/, exclusions.join("\n"));
+                    request = request.replace(/__EXCLUSIONS__/g, tmplExclusions);
+                }
+                // clean exclusions
+                request = request.replace(/__EXCLUSIONS__/g, "");
+
+                // distance
+                if (this.settings.distance) {
+                    var tmplDistance = this.template.distance;
+                    tmplDistance = tmplDistance.replace(/__DISTANCEVALUE__/g, this.settings.distance);
+                    request = request.replace(/__DISTANCE__/g, tmplDistance);
+                    // method
+                    request = request.replace(/__METHOD__/g, "distance");
+                }
+                // clean
+                request = request.replace(/__DISTANCE__/g, "");
+
+                // time
+                if (this.settings.time) {
+                    var tmplTime = this.template.time;
+                    tmplTime = tmplTime.replace(/__TIMEVALUE__/g, this.settings.time);
+                    request = request.replace(/__TIME__/g, tmplTime);
+                    // method
+                    request = request.replace(/__METHOD__/g, "time");
+                }
+                // clean
+                request = request.replace(/__TIME__/g, "");
+                break;
+
+            default:
+                this.logger.error("No other HTTP method supported by the service !");
+        }
+
+        this.logger.trace(request);
+        this.requestString = request;
+
+        return this.requestString;
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurveRequest);
+
+
+/***/ }),
+/* 136 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+
+
+
+/**
+ * @classdesc
+ *
+ * Classe de gestion des param. des requêtes du service de calcul des iso.
+ * Permet le mapping avec les options du service.
+ *
+ * @constructor
+ * @alias Gp.Services.ProcessIsoCurve.Request.ProcessIsoCurveParam
+ * @param {Object} options - options
+ * @private
+ *
+ */
+function ProcessIsoCurveParam (options) {
+    if (!(this instanceof ProcessIsoCurveParam)) {
+        throw new TypeError("ProcessIsoCurveParam constructor cannot be called as a function.");
+    }
+
+    this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger();
+    this.logger.trace("[Constructeur ProcessIsoCurveParam ()]");
+
+    /**
+     * Options en paramêtres du constructeur.
+     */
+    this.options = options || {};
+
+    // mapping des options avec l'API REST
+
+    /** Identifiant de l’isochrone */
+    this.id = this.options.id;
+
+    /** Coordonnées de départ (ou arrivée si le reverse est à true). */
+    this.location = this.options.position;
+
+    /** projection (code EPSG comme epsg:4326 ou wgs84) */
+    this.srs = this.options.srs;
+
+    /**
+     * Profil de véhicule à utiliser pour le calcul.
+     * Voiture ou Pieton
+     */
+    this.graphName = this.options.graph;
+
+    /**
+     * Identifiant et nom du véhicule
+     * FIXME non utilisé
+     */
+    this.profileId = this.options.profileId || null; // TODO !
+    this.profileName = this.options.profileName || null; // TODO !
+
+    /** Liste des règles de restrictions à utiliser */
+    this.exclusions = this.options.exclusions;
+
+    this.reverse = this.options.reverse;
+    this.smoothing = this.options.smoothing;
+    this.holes = this.options.holes;
+
+    /**
+     * "time" pour isochrone ou "distance" for isodistance.
+     * Par defaut, time...
+     */
+    var value = this.options.method;
+    switch (value) {
+        case "time":
+            this.method = "time";
+            this.time = this.options.time;
+            break;
+        case "distance":
+            this.method = "distance";
+            this.distance = this.options.distance;
+            break;
+        default:
+            this.logger.warn("Par defaut, on calcule un isochrone !");
+            this.method = "time";
+    }
+}
+
+/**
+ * CLASSNAME
+ */
+ProcessIsoCurveParam.CLASSNAME = "ProcessIsoCurveParam";
+
+ProcessIsoCurveParam.prototype = {
+
+    /**
+     * @lends module:ProcessIsoCurveParam#
+     */
+
+    /**
+     * Constructeur (alias)
+     */
+    constructor : ProcessIsoCurveParam,
+
+    /**
+     * Retourne la liste des exclusions
+     * @returns {String} x,y
+     */
+    getLocation : function () {
+        return this.location.x + "," + this.location.y;
+    },
+
+    /**
+     * Retourne la liste des exclusions
+     * @returns {String} exclusions
+     */
+    getExclusions : function () {
+        return this.exclusions.join(";");
+    }
+};
+
+/**
+ * Tableau de clefs/valeurs pour param.
+ *
+ * @returns {Object[]} KVP
+ */
+ProcessIsoCurveParam.prototype.getParams = function () {
+    var map = [];
+
+    map.push({
+        k : "location",
+        v : this.getLocation()
+    });
+
+    map.push({
+        k : "smoothing",
+        v : this.smoothing
+    });
+
+    map.push({
+        k : "holes",
+        v : this.holes
+    });
+
+    map.push({
+        k : "reverse",
+        v : this.reverse
+    });
+
+    map.push({
+        k : "method",
+        v : this.method
+    });
+
+    if (this.time) {
+        map.push({
+            k : "time",
+            v : this.time
+        });
+    }
+
+    if (this.distance) {
+        map.push({
+            k : "distance",
+            v : this.distance
+        });
+    }
+
+    map.push({
+        k : "graphName",
+        v : this.graphName
+    });
+
+    if (this.exclusions) {
+        map.push({
+            k : "exclusions",
+            v : this.getExclusions()
+        });
+    }
+
+    if (this.srs) {
+        map.push({
+            k : "srs",
+            v : this.srs
+        });
+    }
+
+    return map;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurveParam);
+
+
+/***/ }),
+/* 137 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45);
+/* harmony import */ var _Formats_XML__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(66);
+/* harmony import */ var _Formats_WKT__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(129);
+/* harmony import */ var _Formats_ProcessIsoCurveResponseReader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(138);
+/* harmony import */ var _model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(139);
+/**
+ * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON
+ * (Factory)
+ *
+ * @module ProcessIsoCurveResponseFactory
+ * @alias Gp.Services.ProcessIsoCurve.Response.ProcessIsoCurveResponseFactory
+ * @private
+ */
+
+
+
+
+
+
+
+
+var ProcessIsoCurveResponseFactory = {
+
+    /**
+     * interface unique
+     *
+     * @method build
+     * @static
+     * @param {Object} options - options definies dans le composant ProcessIsoCurve
+     *
+     * @example
+     *   var options = {
+     *      response :
+     *      outputFormat :
+     *      rawResponse :
+     *      scope :
+     *      onSuccess :
+     *      onError :
+     *   };
+     *
+     */
+    build : function (options) {
+        // logger
+        var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("ProcessIsoCurveResponseFactory");
+        logger.trace(["ProcessIsoCurveResponseFactory::build()"]);
+
+        var data = null;
+
+        if (options.response) {
+            if (options.rawResponse) {
+                logger.trace("analyze response : raw");
+                data = options.response;
+            } else {
+                switch (options.outputFormat) {
+                    case "xml":
+                        logger.trace("analyze response : xml");
+
+                        try {
+                            var p = new _Formats_XML__WEBPACK_IMPORTED_MODULE_3__["default"]({
+                                reader : _Formats_ProcessIsoCurveResponseReader__WEBPACK_IMPORTED_MODULE_5__["default"]
+                            });
+
+                            // FIXME : mode XHR ne retourne que des string ? JSONP aussi à ce niveau ?
+                            if (typeof options.response === "string") {
+                                p.setXMLString(options.response);
+                            } else {
+                                p.setXMLDoc(options.response);
+                            }
+
+                            data = p.parse();
+
+                            if (!data) {
+                                throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION_2"));
+                            }
+                        } catch (e) {
+                            var message = e.message;
+                            message += "\n (raw response service : '" + options.response + "')";
+                            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                                message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", message),
+                                status : 200,
+                                type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR
+                            }));
+                            return;
+                        }
+
+                        break;
+
+                    case "json":
+                        logger.trace("analyze response : json");
+
+                        var JSONResponse;
+                        if (typeof options.response === "string") {
+                            JSONResponse = JSON.parse(options.response);
+                        } else {
+                            JSONResponse = options.response;
+                        }
+
+                        // analyse de la reponse
+                        if (JSONResponse.status === "OK" || JSONResponse.status === "ok") {
+                            // création de l'objet de réponse
+                            data = new _model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_6__["default"]();
+
+                            // remplissage de l'objet créé avec les attribtuts de la réponse du service
+                            if (data) {
+                                data.time = JSONResponse.time;
+                                data.distance = JSONResponse.distance;
+                                data.message = JSONResponse.message;
+                                data.id = JSONResponse.id;
+                                data.srs = JSONResponse.srs;
+                                // callback de la reponse
+                                var onWKTSuccess = function (json) {
+                                    data.geometry = json;
+                                };
+                                // callback d'erreur
+                                var onWKTError = function () {
+                                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                                        message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_FORMAT", "wktGeometry")
+                                    }));
+                                };
+                                if (data.hasOwnProperty("geometry")) {
+                                    _Formats_WKT__WEBPACK_IMPORTED_MODULE_4__["default"].toJson(JSONResponse.wktGeometry, onWKTSuccess, onWKTError);
+                                    if (!data.geometry) {
+                                        return;
+                                    }
+                                }
+                                var coords = JSONResponse.location.split(",");
+                                if (data.location) {
+                                    data.location.x = coords[0];
+                                    data.location.y = coords[1];
+                                }
+                            } else {
+                                options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE", options.response)));
+                                return;
+                            }
+                        } else if (JSONResponse.status === "ERROR" || JSONResponse.status === "error") {
+                            // JSHint bug if var message is used !?
+                            var mess = JSONResponse.message;
+                            mess += "\n (raw response service : '" + JSONResponse + "')";
+                            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", mess)));
+                            return;
+                        }
+                        break;
+
+                    default:
+                        options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_FORMAT", "json", "xml")));
+                        return;
+                }
+
+                // info : en cas de problèmes de droits (clé invalide ou autre), la réponse est au format XML !!
+                // ex. <ExceptionReport><Exception exceptionCode="MissingParameter">Key does not exist or has expired</Exception></ExceptionReport>
+                // mais le statut est 403, l'erreur est donc remontée plus tôt.
+                if (data && data.exceptionReport) {
+                    options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                        message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport),
+                        type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR,
+                        status : 200
+                    }));
+                    return;
+                }
+            }
+        } else {
+            // si la réponse est vide, on appelle le callback d'erreur
+            options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY")));
+            return;
+        }
+
+        // si tout s'est bien passé, on appelle le callback de succès
+        options.onSuccess.call(options.scope, data);
+    }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurveResponseFactory);
+
+
+/***/ }),
+/* 138 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(44);
+/* harmony import */ var _Formats_WKT__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(129);
+/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45);
+/* harmony import */ var _Response_model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(139);
+/**
+ * Analyse de la reponse XML
+ *
+ * @module ProcessIsoCurveResponseReader
+ * @alias Gp.Services.ProcessIsoCurve.Formats.ProcessIsoCurveResponseReader
+ * @todo not yet implemented !
+ * @private
+ */
+
+
+
+
+
+
+/**
+ * Objet ProcessIsoCurveResponseReader
+ *
+ * @member {Object} ProcessIsoCurveResponseReader
+ *
+ * @property {Object} ProcessIsoCurveResponseReader.READERS - Objet contenant des fonctions de lecture, appelées "readers"
+ *      dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire
+ *      et la valeur associée est une fonction (node, data)
+ *      où node est un noeud du document DOM
+ *      et data est un objet où l'on stocke les informations lues dans le XML.
+ *
+ * @property {Method} ProcessIsoCurveResponseReader.read -  Méthode permettant de lancer la lecture d'une réponse XML
+ *       du service de calcul isochrone/isodistance, à l'aide des readers de la classe.
+ *
+ */
+
+var ProcessIsoCurveResponseReader = {};
+
+/*
+    // INFO
+    // Exemple d'erreur du service
+    // <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+    // <isochroneResult>
+    //  <message>Location point must have 2 components separated with a ,</message>
+    //  <status>ERROR</status>
+    // </isochroneResult>
+
+    // <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+    // <serviceResult>
+    //   <message>ServiceException : Error in isochron computation Error in smartrouting null</message>
+    //   <status>ERROR</status>
+    // </serviceResult>
+
+    // INFO
+    // Exemple d'erreur NGinx
+    // <ExceptionReport><Exception exceptionCode="MissingParameter">Resource parameter not found</Exception></ExceptionReport>
+*/
+
+/*
+    // INFO
+    // Exemple de réponse du service
+
+     // <IsochroneResult>
+     //    <status>OK</status>
+     //    <id/>
+     //    <location>-1.557189,47.217122</location>
+     //    <srs/>
+     //    <distance>5000</distance>
+     //    <wktGeometry>POLYGON ((-1.545312 47.178178, -1.545312 47.180418, ...))</wktGeometry>
+     // </IsochroneResult>
+
+    // <isochronResult>
+    //    <status>OK</status>
+    //    <id>1</id>
+    //    <location>-1.557189,47.217122</location>
+    //    <srs/>
+    //    <time>50</time>
+    //    <wktGeometry>POLYGON ((-1.556864 47.216487, -1.556864 47.216948, ...))</wktGeometry>
+    // </isochronResult>
+*/
+
+ProcessIsoCurveResponseReader.READERS = {
+
+    /** TODO : jsdoc block */
+    isochronResult : function (root) {
+        // racine de la réponse XML : on crée l'objet de réponse
+        var response = new _Response_model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_3__["default"]();
+
+        if (root.hasChildNodes()) {
+            var children = root.childNodes;
+            var child;
+
+            for (var i = 0; i < children.length; i++) {
+                child = children[i];
+
+                if (ProcessIsoCurveResponseReader.READERS[child.nodeName]) {
+                    ProcessIsoCurveResponseReader.READERS[child.nodeName](child, response);
+                }
+            }
+        }
+
+        if (response.status === "error") {
+            var message = _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION",
+                response.message);
+            throw new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                message : message,
+                type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR
+            });
+        }
+        return response;
+    },
+
+    /** TODO : jsdoc block */
+    message : function (node, response) {
+        if (response) {
+            response.message = __getChildValue(node);
+        }
+    },
+
+    /** TODO : jsdoc block */
+    status : function (node, response) {
+        var status = __getChildValue(node);
+        if (status === "ERROR" || status === "error") {
+            if (response) {
+                response.status = "error";
+            }
+        }
+    },
+
+    /** TODO : jsdoc block */
+    id : function (node, response) {
+        if (response) {
+            response.id = __getChildValue(node);
+        }
+    },
+
+    /** TODO : jsdoc block */
+    location : function (node, response) {
+        var coords = __getChildValue(node);
+        if (response && response.location) {
+            response.location.x = parseFloat(coords.split(",")[0]);
+            response.location.y = parseFloat(coords.split(",")[1]);
+        }
+    },
+
+    /** TODO : jsdoc block */
+    srs : function (node, response) {
+        if (response) {
+            response.srs = __getChildValue(node);
+        }
+    },
+
+    /** TODO : jsdoc block */
+    distance : function (node, response) {
+        if (response) {
+            response.distance = parseFloat(__getChildValue(node));
+        }
+    },
+
+    /** TODO : jsdoc block */
+    time : function (node, response) {
+        if (response) {
+            response.time = parseFloat(__getChildValue(node));
+        }
+    },
+
+    /** TODO : jsdoc block */
+    wktGeometry : function (node, response) {
+        if (response) {
+            var wktGeometry = node.innerHTML;
+            /** TODO : jsdoc block */
+            var onWKTSuccess = function (json) {
+                response.geometry = json;
+            };
+            /** TODO : jsdoc block */
+            var onWKTError = function () {
+                var msg = _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__["default"].getMessage("PARAM_FORMAT", ["wktGeometry"]);
+                throw new Error(msg);
+            };
+            if (response.hasOwnProperty("geometry")) {
+                _Formats_WKT__WEBPACK_IMPORTED_MODULE_1__["default"].toJson(wktGeometry, onWKTSuccess, onWKTError);
+            }
+        }
+    },
+
+    /** TODO : jsdoc block */
+    serviceResult : function (node) {
+        // en cas d'exception du service
+        var response = {};
+        if (node.hasChildNodes()) {
+            var children = node.childNodes;
+            var child;
+            for (var i = 0; i < children.length; i++) {
+                child = children[i];
+                if (ProcessIsoCurveResponseReader.READERS[child.nodeName]) {
+                    ProcessIsoCurveResponseReader.READERS[child.nodeName](child, response);
+                }
+            }
+        }
+        return response;
+    },
+
+    /** TODO : jsdoc block */
+    ExceptionReport : function (node) {
+        var response = {};
+        if (node.hasChildNodes()) {
+            var children = node.childNodes;
+            var child;
+            for (var i = 0; i < children.length; i++) {
+                child = children[i];
+                if (child.nodeName === "Exception") {
+                    response.exceptionReport = ProcessIsoCurveResponseReader.READERS["Exception"](child);
+                }
+            }
+        }
+        return response;
+    },
+
+    /** TODO : jsdoc block */
+    Exception : function (node) {
+        var exceptionReport = {};
+
+        // get exception code
+        var exceptionCode = node.getAttribute("exceptionCode");
+        if (exceptionCode) {
+            exceptionReport.exceptionCode = exceptionCode;
+        }
+
+        // get exception message
+        var textNode = node.firstChild;
+        if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+            exceptionReport.exception = textNode.nodeValue;
+        }
+
+        return exceptionReport;
+    }
+};
+
+/** TODO : jsdoc block */
+ProcessIsoCurveResponseReader.read = function (root) {
+    var response;
+
+    if (root.nodeName === "isochronResult" || root.nodeName === "isochroneResult" || root.nodeName === "IsochroneResult") {
+        response = ProcessIsoCurveResponseReader.READERS["isochronResult"](root);
+        return response;
+    } else if (root.nodeName === "ExceptionReport") {
+        response = ProcessIsoCurveResponseReader.READERS[root.nodeName](root);
+        return response;
+    } else if (ProcessIsoCurveResponseReader.READERS[root.nodeName]) {
+        response = ProcessIsoCurveResponseReader.READERS[root.nodeName](root);
+        if (response.status === "error") {
+            var errMsg = _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION",
+                response.message);
+            throw new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+                message : errMsg,
+                type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR
+            });
+        }
+        return response;
+    } else {
+        throw new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({
+            message : _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__["default"].getMessage("SERVICE_RESPONSE_ANALYSE", root.nodeName),
+            type : _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_UNKERR
+        });
+    }
+};
+
+/**
+ * Lecture de la valeur du premier child d'un noeud, si elle existe.
+ *
+ * @private
+ * @memberof ProcessIsoCurveResponseReader
+ * @method __getChildValue
+ * @param {DOMElement} node - a DOM node
+ * @return {String} value - valeur du firstChild du noeud en entrée, ou chaîne vide.
+ */
+function __getChildValue (node) {
+    var textNode;
+    var value = "";
+
+    if (node.hasChildNodes()) {
+        textNode = node.firstChild;
+        if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
+            value = textNode.nodeValue;
+        }
+    }
+    return value;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurveResponseReader);
+
+
+/***/ }),
+/* 139 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+/**
+ * Response object for {@link module:Services~isoCurve Gp.Services.isoCurve ()} invocation when successful. Received as the argument of onSuccess callback function.
+ *
+ * @property {Float} distance - distance (expressed in meters) used for the request.
+ * @property {Float} time - time (expressed in seconds) used for the request.
+ * @property {Object} geometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the isocurve.
+ * @property {String} id - request id (used by underlying webservice).
+ * @property {Gp.Point} location - Position of the start or end point used for the request (expressed in "srs" coordinates system).
+ * @property {String} message - message
+ * @property {String} srs - Identifier of the coordinates system used for the isocurve.
+ *
+ * @namespace
+ * @alias Gp.Services.IsoCurveResponse
+ *
+ */
+function ProcessIsoCurveResponse () {
+    if (!(this instanceof ProcessIsoCurveResponse)) {
+        throw new TypeError("ProcessIsoCurveResponse constructor cannot be called as a function.");
+    }
+
+    this.message = null;
+
+    this.id = null;
+
+    this.location = {};
+    this.location.x = null;
+    this.location.y = null;
+
+    this.srs = null;
+
+    this.geometry = null;
+
+    this.time = null;
+
+    this.distance = null;
+}
+
+ProcessIsoCurveResponse.prototype = {
+
+    constructor : ProcessIsoCurveResponse
+
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurveResponse);
+
+
+/***/ }),
+/* 140 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(34);
+/* harmony import */ var _Config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(141);
+
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  /**
+   * Contrôle des droits sur les ressources.
+   *
+   * @param {Object} options - liste des options
+   * @param {String} options.key - clef API
+   * @param {Array} options.resources - liste des ressources
+   * @param {Array} options.services - liste des services
+   * @returns {Object} rightManagement - undefined ou {
+   *       key : "",
+   *       service-1 : [resource-1, resource-2],
+   *       service-2 : [resource-1, resource-2]
+   * }
+   */
+  check: function check(options) {
+    // logger
+    var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("checkrightmanagement"); // si aucune option n'est renseignée...
+
+    if (!options) {
+      // message orienté pour le developpeur !
+      logger.error("WARNING : " + "no parameter specified !");
+      return;
+    } // les options
+
+
+    var _key = options.key;
+
+    var _resources = options.resources || [];
+
+    var _services = options.services || []; // si aucune information sur les ressources,
+    // il est impossible de controler quelquechose !!!
+
+
+    if (!_resources || _resources.length === 0) {
+      // message orienté pour le developpeur !
+      logger.error("WARNING : " + "no parameter 'resources' specified !");
+      return;
+    } // si aucune information sur les services,
+    // il est impossible de controler quelquechose !!!
+
+
+    if (!_services || _services.length === 0) {
+      // message orienté pour le developpeur !
+      logger.error("WARNING : " + "no parameter 'services' specified !");
+      return;
+    } // les ressources controlées :
+    // Ex.
+    // {
+    //   "Itineraire"     : ["Pieton", "Voiture"],
+    //   "Geocode"        : ["PositionOfInterest", "StreetAddress", "CadastralParcel", "Administratif"],
+    //   "AutoCompletion" : ["PositionOfInterest", "StreetAddress", "CadastralParcel", "Administratif"],
+    //   "Elevation"      : ["SERVICE_CALCUL_ALTIMETRIQUE_RSC"]
+    // }
+
+
+    var _rightManagement = {}; // la clef API n'est pas renseignée
+
+    if (!_key) {
+      // on verifie si l'autoconfiguration est disponible
+      if (!_Config__WEBPACK_IMPORTED_MODULE_1__["default"].isConfigLoaded()) {
+        // si l'autoconfiguration n'est pas chargée,
+        // aucune vérification des droits est possible...
+        logger.warn("WARNING : " + "The 'apiKey' parameter is missing, " + "and the contract key configuration has not been loaded, " + "so impossible to check yours rights !");
+        return;
+      } else {
+        // si l'autoconfiguration est chargée,
+        // on recupere la clef API, et on en profitera ensuite pour controler
+        // les droits sur les ressources.
+        // FIXME par defaut, on recupere toujours la première...
+        _key = Object.keys(_Config__WEBPACK_IMPORTED_MODULE_1__["default"].configuration.generalOptions.apiKeys)[0];
+        logger.log(_key);
+      }
+    } // la clef API est renseignée ou recuperée de l'autoconfiguration
+
+
+    if (_key) {
+      // on verifie si l'autoconfiguration est disponible
+      if (!_Config__WEBPACK_IMPORTED_MODULE_1__["default"].isConfigLoaded()) {
+        // si l'autoconfiguration n'est pas chargée,
+        // il est toujours possible de requeter le service avec une clef API,
+        // mais les droits sur les ressources ne sont pas garantis, on risque
+        // d'obtenir des erreurs 403 forbidden...
+        // la responsabilité revient à l'utilisateur (message d'information)...
+        logger.warn("WARNING : " + "the contract key configuration has not been loaded, " + "so be carefull !"); // les ressouces non controlées
+
+        var _noRightManagement = {};
+
+        for (var i = 0; i < _services.length; i++) {
+          var service = _services[i];
+          _noRightManagement[service] = [];
+
+          for (var j = 0; j < _resources.length; j++) {
+            var resource = _resources[j];
+
+            _noRightManagement[service].push(resource);
+          }
+        } // on ajoute la clef
+
+
+        _noRightManagement.key = _key;
+        logger.log("right management not checked", _noRightManagement);
+        return _noRightManagement;
+      } else {
+        // si l'autoconf est chargée,
+        // on verifie la correspondance entre la clef et l'autoconfiguration,
+        // on previent l'utilisateur (message d'information) s'il n'a
+        // pas de droits sur certaines ressources ...
+        // doit on ecarter les ressources sans droit ?
+        // oui, si possible avec un message d'information pour l'utilisateur...
+        for (var k = 0; k < _resources.length; k++) {
+          var _resource = _resources[k];
+
+          for (var l = 0; l < _services.length; l++) {
+            var _service = _services[l];
+            var params = _Config__WEBPACK_IMPORTED_MODULE_1__["default"].getServiceParams(_resource, _service, _key);
+
+            if (!params || Object.keys(params).length === 0) {
+              logger.warn("WARNING : " + "The contract key configuration has no rights to load this geoportal " + "resource (" + _resource + ") " + "for this service (" + _service + ") ");
+              continue;
+            }
+
+            if (!_rightManagement[_service]) {
+              _rightManagement[_service] = [];
+            }
+
+            _rightManagement[_service].push(_resource);
+          }
+        }
+
+        if (!_rightManagement || Object.keys(_rightManagement).length === 0) {
+          logger.warn("WARNING : " + "The contract key configuration has been loaded, " + "and the 'apiKey' parameter has been set, " + "but, there is a problem on the mapping between the contract and the key !");
+          return;
+        } // on ajoute la clef
+
+
+        _rightManagement.key = _key;
+        logger.log("right management checked", _rightManagement);
+        return _rightManagement;
+      }
+    }
+  }
+});
+
+/***/ }),
+/* 141 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(34);
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("config");
+var Config = {
+  /** autoconf */
+  configuration: null,
+
+  /**
+   * Controle du chargement de l'autoconf
+   *
+   * @returns {Boolean} isConfigLoaded - True si l'autoconf a déjà été chargée, False sinon.
+   */
+  isConfigLoaded: function isConfigLoaded() {
+    var scope = typeof window !== "undefined" ? window : typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : {};
+
+    if (scope.Gp && scope.Gp.Config && Object.keys(scope.Gp.Config).length !== 0) {
+      this.configuration = scope.Gp.Config;
+      return true;
+    }
+
+    return false;
+  },
+
+  /**
+   * Recuperation de l'identifiant d'une couche donnée
+   *
+   * @param {String} layerName - nom de la couche (par ex. "ORTHOIMAGERY.ORTHOPHOTOS")
+   * @param {String} service   - nom du service (par ex. "WMS" ou "WMTS")
+   * @returns {String} layerId - identifiant de la couche (par ex. "ORTHOIMAGERY.ORTHOPHOTOS$GEOPORTAIL:OGC:WMTS")
+   */
+  getLayerId: function getLayerId(layerName, service) {
+    var layerId = null; // layer
+    // key : [layerName]$[contexte]:OGC:[service]
+    // ex : "ORTHOIMAGERY.ORTHOPHOTOS$GEOPORTAIL:OGC:WMTS"
+    // service
+    // key : [layerName]$[contexte];[service]
+    // ex : PositionOfInterest$OGC:OPENLS;ReverseGeocode
+
+    if (this.configuration) {
+      var layers = this.configuration["layers"];
+
+      for (var key in layers) {
+        if (layers.hasOwnProperty(key)) {
+          var parts = key.split("$");
+
+          if (layerName === parts[0]) {
+            if (parts[1]) {
+              var servicePartsLayer = parts[1].split(":");
+              var servicePartsService = parts[1].split(";");
+
+              if (servicePartsService[1] === service) {
+                layerId = key;
+                break;
+              }
+
+              if (servicePartsLayer[2] === service) {
+                layerId = key;
+                break;
+              }
+            }
+          }
+        }
+      }
+    }
+
+    if (!layerId) {
+      logger.error("ERROR layer id (layer name: " + layerName + " / service: " + service + ") was not found !?");
+    }
+
+    return layerId;
+  },
+
+  /**
+   * Récupération des paramètres nécessaires à l'affichage d'une couche WMS ou WMTS
+   *
+   * @param {String} layerName - nom de la couche (par ex. "ORTHOIMAGERY.ORTHOPHOTOS")
+   * @param {String} service   - nom du service (par ex. "WMS" ou "WMTS")
+   * @param {String} [apiKey]  - Clé de contrat API
+   * @returns {Object} params  - paramètres du service (WMS ou WMTS) pour la couche donnée
+   * @returns {String} params.url        - Url du service à requêter pour afficher la couche
+   * @returns {String} params.version    - Version du service
+   * @returns {String} params.styles     - Style par défaut de la couche
+   * @returns {String} params.format     - Format par défaut de la couche
+   * @returns {String} params.projection - Projection par défaut de la couche
+   * @returns {Number} params.minScale   - Dénominateur d'échelle minimum de la couche
+   * @returns {Number} params.maxScale   - Dénominateur d'échelle maximum de la couche
+   * @returns {Gp.BBox} params.extent    - Etendue de la couche, dans la projection de la couche
+   * @returns {Array} params.legends     - Tableau des légendes associées à la couche
+   * @returns {Array} params.metadata    - Tableau des métadonnées associées à la couche
+   * @returns {Array} params.originators - Tableau des originators associés à la couche
+   * @returns {Array} params.title       - Nom de la resource, lisible par un humain.
+   * @returns {Array} params.description - Url de l'image d'aperçu rapide de la ressource.
+   * @returns {Array} params.quicklookUrl- Tableau des originators associés à la couche
+   * @returns {String} params.[TMSLink]          - Identifiant de la pyramide (TMS), dans le cas d'une couche WMTS
+   * @returns {Gp.Point} params.[matrixOrigin]   - Origine de la matrice (top left corner), dans le cas d'une couche WMTS
+   * @returns {Array} params.[nativeResolutions] - Tableau regroupant les résolutions de chaque niveau de la matrice, dans le cas d'une couche WMTS
+   * @returns {Array} params.[matrixIds]         - Tableau regroupant les identifiants de chaque niveau de la matrice, dans le cas d'une couche WMTS
+   */
+  getLayerParams: function getLayerParams(layerName, service, apiKey) {
+    var params = {};
+
+    if (this.configuration) {
+      // récupération de l'identifiant complet de la couche.
+      var layerId = this.getLayerId(layerName, service);
+
+      if (layerId) {
+        // récupération de l'objet de configuration de la couche
+        var layerConf = this.configuration.layers[layerId]; // controle de la clef
+
+        var key = layerConf.apiKeys[0];
+
+        if (apiKey) {
+          if (apiKey !== key) {
+            logger.error("ERROR different keys (" + apiKey + " !== " + key + ") !?");
+            return;
+          }
+        }
+
+        apiKey = apiKey || key;
+        params.key = apiKey; // récupération des paramètres du service
+
+        params.url = layerConf.getServerUrl(apiKey);
+        params.version = layerConf.getServiceParams().version;
+        params.styles = layerConf.getDefaultStyle();
+        params.format = layerConf.getDefaultFormat();
+        params.projection = layerConf.getDefaultProjection(); // récupération des infos de la couche
+
+        params.minScale = layerConf.getMinScaleDenominator();
+        params.maxScale = layerConf.getMaxScaleDenominator();
+        params.extent = layerConf.getBBOX();
+        params.legends = layerConf.getLegends();
+        params.metadata = layerConf.getMetadata();
+        params.originators = layerConf.getOriginators();
+        params.title = layerConf.getTitle();
+        params.description = layerConf.getDescription();
+        params.quicklookUrl = layerConf.getQuicklookUrl(); // WMTS : récupération des tileMatrixSetLimits
+
+        if (layerConf.wmtsOptions) {
+          params.tileMatrixSetLimits = layerConf.wmtsOptions.tileMatrixSetLimits;
+        } // WMTS : récupération des paramètres de la pyramide (TMS)
+
+
+        var TMSLink = layerConf.getTMSID();
+
+        if (TMSLink) {
+          params.TMSLink = TMSLink;
+          var tmsConf = this.configuration.getTMSConf(TMSLink); // Get matrix origin : Gp.Point = Object{x:Float, y:Float}
+
+          params.matrixOrigin = tmsConf.getTopLeftCorner();
+          params.nativeResolutions = tmsConf.nativeResolutions;
+          params.matrixIds = tmsConf.matrixIds;
+          params.tileMatrices = tmsConf.tileMatrices;
+        }
+      }
+    }
+
+    return params;
+  },
+
+  /**
+   * Recuperation des parametres d'un service
+   *
+   * @param {String} [resource] - "PositionOfInterest", "StreetAddress", "Voiture", "Pieton", ...
+   * @param {String} [service] - Geocode, Itineraire, ...
+   * @param {String} [apiKey]  - Clé de contrat API
+   * @returns {Object} params - paramètres de la ressource
+   * @returns {String} params. -
+   * @returns {String} params. -
+   * @returns {String} params. -
+   */
+  getServiceParams: function getServiceParams(resource, service, apiKey) {
+    var params = {};
+
+    if (this.configuration) {
+      // récupération de l'identifiant complet de la couche.
+      var layerId = this.getLayerId(resource, service);
+
+      if (layerId) {
+        // récupération de l'objet de configuration de la couche
+        var layerConf = this.configuration.layers[layerId]; // controle de la clef
+
+        var key = layerConf.apiKeys[0];
+
+        if (apiKey) {
+          if (apiKey !== key) {
+            return;
+          }
+        }
+
+        apiKey = apiKey || key;
+        params.key = apiKey; // récupération des paramètres du service
+
+        params.url = layerConf.getServerUrl(apiKey);
+        params.version = layerConf.getServiceParams().version; // récupération des infos de la couche
+
+        params.extent = layerConf.getBBOX();
+        params.title = layerConf.getTitle();
+        params.description = layerConf.getDescription();
+      }
+    }
+
+    return params;
+  },
+
+  /**
+   * Resolution en geographique
+   *
+   * @returns {Array} resolutions
+   */
+  getResolutions: function getResolutions() {
+    var resolutions = [];
+
+    if (this.configuration) {
+      resolutions = this.configuration["generalOptions"]["wgs84Resolutions"];
+    }
+
+    return resolutions;
+  },
+
+  /**
+   * Recuperation des parametres TMS de la configuration
+   * @param {String} tmsName - tile matrix set name
+   *
+   * @returns {Object} tile matrix set
+   */
+  getTileMatrix: function getTileMatrix(tmsName) {
+    var tms = {};
+
+    if (this.configuration) {
+      if (tmsName) {
+        tms = this.configuration["tileMatrixSets"][tmsName.toUpperCase()];
+      }
+    }
+
+    return tms;
+  },
+
+  /**
+   * Récupération des contraintes générales d'une couche donnée : extent, minScale, maxScale, projection
+   *
+   * @param {String} layerId - identifiant de la couche
+   * @returns {Object} params - contraintes de la couche
+   * @returns {String} params.projection - Projection par défaut de la couche
+   * @returns {Number} params.minScale   - Dénominateur d'échelle minimum de la couche
+   * @returns {Number} params.maxScale   - Dénominateur d'échelle maximum de la couche
+   * @returns {Gp.BBox} params.extent    - Etendue de la couche, dans la projection de la couche
+   */
+  getGlobalConstraints: function getGlobalConstraints(layerId) {
+    var params = {};
+
+    if (layerId) {
+      // récupération de l'objet de configuration de la couche
+      var layerConf = this.configuration.layers[layerId];
+      params.projection = layerConf.getDefaultProjection();
+      params.minScale = layerConf.getMinScaleDenominator();
+      params.maxScale = layerConf.getMaxScaleDenominator();
+      params.extent = layerConf.getBBOX();
+    }
+
+    return params;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (Config);
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(52)))
+
+/***/ }),
+/* 142 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(40);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(34);
+/* harmony import */ var _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(140);
+/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(36);
+/* harmony import */ var _Common_Controls_LocationSelectorDOM__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(143);
+/* harmony import */ var _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(144);
+/* harmony import */ var _Utils_IconDefault__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(145);
+
+
+
+
+
+
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__["default"].getLogger("locationselector");
+/**
+* @classdesc
+*
+* LocationSelector Control.
+*
+* @private
+* @constructor LocationSelector
+* @alias LocationSelector
+* @extends {L.Control}
+* LocationSelector component. Enables to select a location, using autocompletion or picking location on the map
+* @param {Object} [options] - component options
+* @param {Boolean} [options.displayInfo = true] - whether to display info in a popup or not (not implemented yet) Default is true
+* @param {Boolean} [options.disableReverse = false] - whether to enable/disable the reverse geocoding.
+* @param {Object} [options.tag] - tag options
+* @param {Number} [options.tag.id = 0] - order id number in a locations group, in case several LocationSelector are used. For instance in route case : departure tag id should be 0, arrival tag id should be 1, and other ones : 2, 3, ...
+* @param {Number} [options.tag.unique = null] - locationSelector global component id (in case locationSelector is called by another graphic component, e.g. route control)
+* @param {String} [options.tag.label = ">"] - text to display in component (e.g. "Departure"). Default is ">"
+* @param {String} [options.tag.color = blue] - color of marker (blue, green, orange and red)
+* @param {Boolean} [options.tag.display = true] - whether to display or hide component. Default is true
+* @param {Boolean} [options.tag.addOption = false] - whether to display picto to add another LocationSelector (in case of route control)
+* @param {Boolean} [options.tag.removeOption = false] - whether to display picto to remove a LocationSelector (in case of route control)
+* @param {Object} [options.autocompleteOptions] - autocomplete service options
+* @param {Object} [options.reverseGeocodeOptions] - reverse geocoding service options
+
+* @example
+*  var point = L.geoportalControl.LocationSelector({
+*  });
+*/
+
+var LocationSelector = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Control.extend(
+/** @lends LocationSelector.prototype */
+{
+  includes: _Common_Controls_LocationSelectorDOM__WEBPACK_IMPORTED_MODULE_5__["default"],
+
+  /**
+   * options by default
+   *
+   * @private
+   */
+  options: {
+    position: "topleft",
+    tag: {
+      id: 0,
+      // numero d'ordre sur un groupe de locations !
+      unique: null,
+      // numero unique pour tous les locations d'un groupe !
+      label: ">",
+      color: "blue",
+      display: true,
+      addOption: false,
+      removeOption: false
+    },
+    disableReverse: false,
+    // on l'active par defaut !
+    displayInfo: true,
+    autocompleteOptions: {},
+    reverseGeocodeOptions: {}
+  },
+
+  /**
+   * constructor
+   * (extend to L.Control)
+   *
+   * @param {Object} options - options of component
+   * @param {String}  [options.position] - position of component into a map.
+   * @param {Object}  [options.tag] - options ...
+   * @param {Object}  [options.autocompleteOptions] - autocomplete service options
+   * @param {Object}  [options.reverseGeocodeOptions] - reverse geocoding service options
+   *
+   * @private
+   */
+  initialize: function initialize(options) {
+    // FIXME pb de merge sur tag:{} !?
+    // on transmet les options au controle
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.setOptions(this, options);
+    /** uuid */
+
+    this._uid = this.options.tag.unique || null;
+    /** mode drag&drop */
+
+    this._activeDragAndDrop = false;
+    this._pressedKeyOnDragAndDrop = false;
+    /** container map */
+
+    this._map = null;
+    /** container principal des entrées  */
+
+    this._inputsContainer = null;
+    /** container du label du point */
+
+    this._inputLabelContainer = null;
+    /** container de la saisi de l'autocompletion */
+
+    this._inputAutoCompleteContainer = null;
+    /** container du pointer de saisi sur la carte */
+
+    this._inputShowPointerContainer = null;
+    /** container des coordonnées */
+
+    this._inputCoordinateContainer = null;
+    /**
+     * coordonnées du point selectionné
+     * Ces dernieres sont envoyées à l'API service IGN,
+     * donc X->LON et Y->LAT quelquesoit la logique des projections...
+     */
+
+    this._coordinate = null;
+    /** container des reponses de l'autocompletion */
+
+    this._suggestedContainer = null;
+    /** listes des reponses de l'autocompletion */
+
+    this._suggestedLocations = [];
+    /** localisant */
+
+    this._currentLocation = null;
+    /** marker */
+
+    this._marker = null;
+    /** ressources du services d'autocompletion et geocodage inverse (ayant droit!) */
+
+    this._resources = {};
+    /** a t on des droits sur les ressources du service ? */
+
+    this._noRightManagement = false; // gestion des droits sur les ressources/services
+
+    this._checkRightsManagement(); // creation du DOM dans le constructeur uniquement si ce composant
+    // est appelé par un autre composant graphique
+
+
+    this._container = this._uid ? this._initLayout() : null;
+  },
+  // ################################################################### //
+  // ################## handlers for display graphic ################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.addTo(map)
+   * and fills variable : this._container = this.onAdd(map)
+   *
+   * @returns {DOMElement} DOM element
+   * @private
+   */
+  onAdd: function onAdd()
+  /* map */
+  {
+    // si on ajout ce composant à la carte en tant que objet graphique,
+    // un uuid doit être generé automatiquement !
+    this._uid = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__["default"].generate(); // DOM du composant
+
+    var container = this._initLayout(); // deactivate of events that may interfere with the map
+
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
+    return container;
+  },
+
+  /**
+   * this method is called when the control is removed from the map
+   * and removes events on map.
+   *
+   * @private
+   */
+  onRemove: function onRemove()
+  /* map */
+  {},
+  // ################################################################### //
+  // ########################## publics methods ######################## //
+  // ################################################################### //
+
+  /**
+   * get coordinate
+   * @returns {Object} Coordinate
+   */
+  getCoordinate: function getCoordinate() {
+    return this._coordinate;
+  },
+
+  /**
+   * set coordinate : {lon,lat || x,y || N,E}
+   * @param {Object} coordinate - Coordinate
+   */
+  setCoordinate: function setCoordinate(coordinate) {
+    this._displayResultOfCoordinate(coordinate);
+  },
+
+  /**
+   * get coordinate inverse (EPSG:4326)
+   * @returns {Object} Coordinate
+   */
+  getCoordinateInverse: function getCoordinateInverse() {
+    if (!this._coordinate) {
+      return;
+    }
+
+    var coordinateInv = {
+      x: this._coordinate.y,
+      y: this._coordinate.x
+    };
+    return coordinateInv;
+  },
+
+  /**
+   * set map
+   *
+   * @param {Object} map - the map
+   */
+  setMap: function setMap(map) {
+    if (!this._map) {
+      this._map = map;
+    }
+  },
+
+  /**
+   * clean
+   */
+  clear: function clear() {
+    this._setCursor();
+
+    this._setMarker();
+
+    this._clearResults();
+
+    this._inputLabelContainer.click();
+  },
+
+  /**
+   * disable/enable the drag&drop mode
+   *
+   * @param {Boolean} active - true:enable | false:disable
+   */
+  dragging: function dragging(active) {
+    if (this._marker) {
+      if (active) {
+        this._marker.dragging.enable();
+      } else {
+        this._marker.dragging.disable();
+      }
+    }
+  },
+  // ################################################################### //
+  // ########################## pivates methods ######################## //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onAdd(map)
+   * and initialize the container HTMLElement
+   *
+   * @returns {DOMElement} DOM element
+   *
+   * @private
+   */
+  _initLayout: function _initLayout() {
+    var id = this.options.tag.id; // create main container
+
+    var container = this._createMainContainerElement();
+
+    var inputs = this._inputsContainer = this._createLocationPointElement(id, this.options.tag.display);
+
+    container.appendChild(inputs);
+
+    var _inputLabel = this._inputLabelContainer = this._createLocationPointLabelElement(id, this.options.tag.label);
+
+    inputs.appendChild(_inputLabel);
+
+    var _inputAutoComplete = this._inputAutoCompleteContainer = this._createLocationAutoCompleteteInputElement(id);
+
+    inputs.appendChild(_inputAutoComplete);
+
+    var _inputCoordinate = this._inputCoordinateContainer = this._createLocationCoordinateInputElement(id);
+
+    inputs.appendChild(_inputCoordinate);
+
+    var _inputShowPointer = this._inputShowPointerContainer = this._createLocationPointerShowInputElement(id);
+
+    inputs.appendChild(_inputShowPointer);
+
+    var _inputPointer = this._createLocationPointerInputElement(id);
+
+    inputs.appendChild(_inputPointer);
+
+    if (this.options.tag.addOption) {
+      var _inputAddStage = this._createLocationAddPointElement();
+
+      inputs.appendChild(_inputAddStage);
+    }
+
+    if (this.options.tag.removeOption) {
+      var _inputRemoveStage = this._createLocationRemovePointElement(id);
+
+      inputs.appendChild(_inputRemoveStage);
+    }
+
+    var results = this._suggestedContainer = this._createLocationAutoCompleteResultElement(id);
+
+    container.appendChild(results);
+    return container;
+  },
+
+  /**
+   * this method is called by constructor
+   * and check the rights to resources and services
+   *
+   * @private
+   */
+  _checkRightsManagement: function _checkRightsManagement() {
+    var _opts = null;
+    var _res = [];
+    var _key = null; // les ressources du service du calcul inverse de geocodage
+
+    _key = this.options.reverseGeocodeOptions.apiKey;
+    _opts = this.options.reverseGeocodeOptions.filterOptions;
+    _res = _opts ? _opts.type : [];
+
+    if (!_res || _res.length === 0) {
+      _res = ["PositionOfInterest", "StreetAddress"];
+    }
+
+    var rightManagementRerverse = _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_3__["default"].check({
+      key: _key || this.options.apiKey,
+      resources: _res,
+      services: ["ReverseGeocode"]
+    }); // les ressources du service d'autocompletion
+
+    _key = this.options.autocompleteOptions.apiKey;
+    _opts = this.options.autocompleteOptions.filterOptions;
+    _res = _opts ? _opts.type : [];
+
+    if (!_res || _res.length === 0) {
+      _res = ["PositionOfInterest", "StreetAddress"];
+    }
+
+    var rightManagementAutoComplete = _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_3__["default"].check({
+      key: _key || this.options.apiKey,
+      resources: _res,
+      services: ["AutoCompletion"]
+    }); // au cas où pas de droit !
+
+    if (!rightManagementRerverse && !rightManagementAutoComplete) {
+      this._noRightManagement = true;
+    } // FIXME je reconstruis differement la structure pour la gestion des clefs differentes
+    // pour chaque service...
+
+
+    if (rightManagementAutoComplete) {
+      this._resources["AutoCompletion"] = {};
+      this._resources["AutoCompletion"]["resources"] = rightManagementAutoComplete["AutoCompletion"];
+      this._resources["AutoCompletion"]["key"] = rightManagementAutoComplete["key"];
+    }
+
+    if (rightManagementRerverse) {
+      this._resources["ReverseGeocode"] = {};
+      this._resources["ReverseGeocode"]["resources"] = rightManagementRerverse["ReverseGeocode"];
+      this._resources["ReverseGeocode"]["key"] = rightManagementRerverse["key"];
+    }
+  },
+  // ################################################################### //
+  // ################# privates methods use by events ################## //
+  // ################################################################### //
+
+  /**
+   * this sends the label to the panel.
+   *
+   * @param {String} label - label suggested location
+   *
+   * @private
+   */
+  _setLabel: function _setLabel(label) {
+    this._inputAutoCompleteContainer.value = label || "";
+  },
+
+  /**
+   * this sends the coordinates to the panel.
+   *
+   * @param {Object} oLatLng - geographic coordinate (L.LatLng)
+   *
+   * @private
+   */
+  _setCoordinate: function _setCoordinate(oLatLng) {
+    // structure
+    // L.LatLng
+    //     lat: 4.07249425916745
+    //     lng: 2.4609375
+    // FIXME les coordonnées en lat/lon sur du EPSG:4326 !
+    // Mais règle sur les services : X -> LON et Y -> LAT
+    this._coordinate = {
+      x: oLatLng.lng,
+      y: oLatLng.lat
+    };
+    var lat = null;
+    var lng = null; // decimal by default !
+
+    lat = _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_6__["default"].roundToDecimal(oLatLng.lat, 4);
+    lng = _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_6__["default"].roundToDecimal(oLatLng.lng, 4); // on envoie du lon/lat à l'affichage
+
+    var value = lng + " , " + lat;
+    this.GPdisplayCoordinate(value);
+  },
+
+  /**
+   * this method is called by this.on*ResultsItemClick()
+   * and move/zoom on a position.
+   *
+   * @param {Object} position - {x: ..., y: ...}
+   *
+   * @private
+   */
+  _setPosition: function _setPosition(position) {
+    logger.log("_setPosition()", position);
+    var map = this._map; // TODO zoom
+    // map.setZoomAround(L.latLng(position.y, position.x), map.getMaxZoom(), true);
+    // FIXME on veut du lat/lon sur Leaflet donc on inverse !
+
+    map.panTo(leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.latLng(position.y, position.x));
+  },
+
+  /**
+   * this method is called by this.on*ResultsItemClick()
+   * and displays a marker.
+   * FIXME : marker IGN et informations ?
+   *
+   * @param {Object} position - position {x: ..., y: ...}
+   * @param {Object|String} information - suggested or geocoded information
+   * @param {Boolean} display - display a popup information
+   *
+   * @private
+   */
+  _setMarker: function _setMarker(position, information, display) {
+    logger.log("_setMarker()", position, information, display); // sur du drag&drop, on garde le même marker !
+
+    if (this._activeDragAndDrop) {
+      return;
+    }
+
+    var map = this._map; // on supprime le marker, ainsi que les events
+    // sur le drag&drop
+
+    if (this._marker != null) {
+      this._marker.off("mousedown", this.onMouseDownMarker, this);
+
+      this._marker.off("dragstart", this.onStartDragMarker, this);
+
+      this._marker.off("drag", this.onDragMarker, this);
+
+      this._marker.off("dragend", this.onEndDragMarker, this);
+
+      map.removeLayer(this._marker);
+      this._marker = null;
+    }
+
+    if (position) {
+      // cf. http://leafletjs.com/reference.html#marker-options
+      var options = {
+        icon: new _Utils_IconDefault__WEBPACK_IMPORTED_MODULE_7__["default"](this.options.tag.color),
+        draggable: true,
+        clickable: true,
+        zIndexOffset: 1000
+      }; // FIXME on veut du lat/lon sur Leaflet donc on inverse !
+
+      this._marker = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.marker(leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.latLng(position.y, position.x), options);
+
+      this._marker.on("mousedown", this.onMouseDownMarker, this);
+
+      this._marker.on("dragstart", this.onStartDragMarker, this);
+
+      this._marker.on("drag", this.onDragMarker, this);
+
+      this._marker.on("dragend", this.onEndDragMarker, this); // this._marker.on("movestart", this.onStartMoveMarker, this);
+      // this._marker.on("move",      this.onMoveMarker, this);
+      // this._marker.on("moveend",   this.onEndMoveMarker, this);
+
+
+      this._marker.addTo(map); // FIXME
+      // doit on mettre une information
+      // - correctement construite ?
+      // - uniquement informatif ?
+      // - RIEN ?
+
+
+      if (display) {
+        var popupContent = null;
+
+        if (typeof information !== "string") {
+          if (information.fields.fullText) {
+            popupContent = information.fields.fullText;
+          } else {
+            var values = [];
+            values.push(information.fields.street || "");
+            values.push(information.fields.postalCode || "");
+            values.push(information.fields.commune || "");
+
+            if (information.type === "PositionOfInterest") {
+              values.push(information.fields.poi || "");
+              values.push(information.fields.kind || "");
+            }
+
+            popupContent = values.join(" - ");
+          }
+        } else {
+          popupContent = information;
+        }
+
+        this._marker.bindPopup(popupContent);
+      }
+    }
+  },
+
+  /**
+   * this method is called by this.on()
+   * and change the cursor of the map when entering a point.
+   *
+   * @param {String} cursor - cursor style
+   *
+   * @private
+   */
+  _setCursor: function _setCursor(cursor) {
+    var div = this._map.getContainer();
+
+    if (cursor) {
+      div.style.cursor = cursor;
+    } else {
+      div.style.cursor = null;
+    }
+  },
+
+  /**
+   * this method is called by this.()
+   * and it clears all results and the marker.
+   *
+   * @private
+   */
+  _clearResults: function _clearResults() {
+    this._currentLocation = null;
+    this._coordinate = null;
+
+    this._clearSuggestedLocation();
+  },
+
+  /**
+   * this method is called by this.onAutoCompleteSearchText()
+   * and it clears all suggested location.
+   *
+   * @private
+   */
+  _clearSuggestedLocation: function _clearSuggestedLocation() {
+    // suppression du dom
+    this._suggestedLocations = [];
+
+    if (this._suggestedContainer) {
+      while (this._suggestedContainer.firstChild) {
+        this._suggestedContainer.removeChild(this._suggestedContainer.firstChild);
+      }
+    }
+  },
+  // ################################################################### //
+  // ############## privates methods use by autocomplete ############### //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onAutoCompleteSearch()
+   * and executes a request to the service.
+   *
+   * @param {Object} settings - service settings
+   * @param {String}   settings.text - text
+   * @param {Function} settings.onSuccess - callback
+   * @param {Function} settings.onFailure - callback
+   *
+   * @private
+   */
+  _requestAutoComplete: function _requestAutoComplete(settings) {
+    logger.log("_requestAutoComplete()", settings); // on ne fait pas de requête si on n'a pas renseigné de parametres !
+
+    if (!settings || Object.keys(settings).length === 0) {
+      return;
+    } // on ne fait pas de requête si la parametre 'text' est vide !
+
+
+    if (!settings.text) {
+      return;
+    }
+
+    logger.log(settings); // on ne fait pas de requête si aucun droit !
+
+    if (this._noRightManagement) {
+      logger.log("no rights for all service !?");
+      return;
+    } // gestion des droits !
+
+
+    if (!this._resources["AutoCompletion"]) {
+      logger.log("no rights for this service !?");
+      return;
+    }
+
+    var resources = this._resources["AutoCompletion"].resources;
+
+    if (!resources || Object.keys(resources).length === 0) {
+      return;
+    } // gestion de la clef !
+
+
+    var key = this._resources["AutoCompletion"]["key"];
+    var options = {}; // on recupere les options du service
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, this.options.autocompleteOptions); // ainsi que la recherche et les callbacks
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, settings); // cas où la clef API n'est pas renseignée dans les options du service,
+    // on utilise celle de l'autoconf ou celle renseignée au niveau du controle
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      apiKey: options.apiKey || this.options.apiKey || key
+    });
+    logger.log(options);
+    geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__["default"].Services.autoComplete(options);
+  },
+
+  /**
+   * this method is called by this.onAutoCompleteSearchText()
+   * and fills the container of the location list.
+   * it creates a HTML Element per location
+   * (cf. this. ...)
+   *
+   * @param {Object[]} locations - locations
+   *
+   * @private
+   */
+  _fillAutoCompletedLocationListContainer: function _fillAutoCompletedLocationListContainer(locations) {
+    logger.log("_fillAutoCompletedLocationListContainer()", locations);
+
+    if (!locations || locations.length === 0) {
+      return;
+    } // on vide la liste avant de la construire
+
+
+    var element = this._suggestedContainer;
+
+    if (element.childElementCount) {
+      while (element.firstChild) {
+        element.removeChild(element.firstChild);
+      }
+    }
+
+    for (var i = 0; i < locations.length; i++) {
+      // Proposals are dynamically filled in Javascript by autocomplete service
+      this._createLocationAutoCompletedLocationElement(this.options.tag.id, locations[i], i);
+    } // sauvegarde de l'etat des locations
+
+
+    this._suggestedLocations = locations;
+  },
+  // ################################################################### //
+  // ################# privates methods use by reverse ################# //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onMouseMapClick() or this.onEndDragMarker()
+   * and executes a request to the service.
+   *
+   * @param {Object} settings - service settings
+   * @param {String}   settings.position - position
+   * @param {Function} settings.onSuccess - callback
+   * @param {Function} settings.onFailure - callback
+   *
+   * @private
+   */
+  _requestReverseGeocode: function _requestReverseGeocode(settings) {
+    logger.log("_requestReverseGeocode()", settings); // on ne fait pas de requête si on n'a pas renseigné de parametres !
+
+    if (!settings || Object.keys(settings).length === 0) {
+      return;
+    } // on ne fait pas de requête si la parametre 'position' est vide !
+
+
+    if (!settings.position || Object.keys(settings.position).length === 0) {
+      return;
+    } // on ne fait pas de requête si aucun droit !
+
+
+    if (this._noRightManagement) {
+      logger.log("no rights for all service !?");
+      return;
+    } // gestion des droits !
+
+
+    if (!this._resources["ReverseGeocode"]) {
+      logger.log("no rights for this service !?");
+      return;
+    }
+
+    var resources = this._resources["ReverseGeocode"].resources;
+
+    if (!resources || Object.keys(resources).length === 0) {
+      return;
+    } // gestion de la clef !
+
+
+    var key = this._resources["ReverseGeocode"]["key"];
+    var options = {}; // on recupere les options du service
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, this.options.reverseGeocodeOptions); // ainsi que la positions et les callbacks
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, settings); // on force qq options !
+    // La table de geocodage est toujours par defaut : StreetAddress !
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      returnFreeForm: true,
+      // FIXME cette option n'est pas implementée !?
+      filterOptions: {
+        type: ["StreetAddress"]
+      }
+    }); // cas où la clef API n'est pas renseignée dans les options du service,
+    // on utilise celle de l'autoconf ou celle renseignée au niveau du controle
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      apiKey: options.apiKey || this.options.apiKey || key
+    });
+    logger.log(options);
+    geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__["default"].Services.reverseGeocode(options);
+  },
+
+  /**
+   * display Coordinate on panel, and places the marker on map
+   *
+   * @param {Object} oLatLng - geographic coordinate (L.LatLng)
+   * @private
+   */
+  _displayResultOfCoordinate: function _displayResultOfCoordinate(oLatLng) {
+    // on transmet les coordonnées au panneau
+    this._setCoordinate(oLatLng); // on met en place le marker
+
+
+    this._setMarker({
+      x: oLatLng.lng,
+      y: oLatLng.lat
+    }, null, false);
+
+    logger.log(this.getCoordinate()); // on desactive l'event sur la map en activant le gestionnaire !
+
+    this.onActivateMapPointClick();
+  },
+
+  /**
+   * display Label on panel, and places the marker on map
+   *
+   * @param {Object} oLocation - location Object
+   * @private
+   */
+  _displayResultOfLabel: function _displayResultOfLabel(oLocation) {
+    // FIXME Le service est intérrogé en SRS EPSG:4326 par defaut,
+    // donc on récupère du lat/lon en reponse.
+    // mais on inverse car on souhaite transmettre des coordonnées en lon/lat...
+    // FIXME on construit une addresse car l'option freeForm ne semble pas
+    // être fonctionnelle...
+    // Par defaut, on doit être sur du type 'StreetAddress' par defaut.
+    var places = oLocation.placeAttributes;
+    var label = places.number + " " + places.street + ", " + places.postalCode + " " + places.commune; // on transmet les coordonnées au panneau,
+    // même si on ne les affiche pas...
+
+    this._setCoordinate({
+      lat: oLocation.position.x,
+      lng: oLocation.position.y
+    }); // on transmet le texte au panneau
+
+
+    this._setLabel(label); // on met en place le marker
+
+
+    this._setMarker({
+      x: oLocation.position.y,
+      // LON
+      y: oLocation.position.x // LAT
+
+    }, null, false);
+
+    this._inputShowPointerContainer.checked = false;
+    this._inputAutoCompleteContainer.className = "GPlocationOriginVisible";
+    this._inputCoordinateContainer.className = "GPlocationOriginHidden"; // on desactive l'event sur la map en activant le gestionnaire !
+
+    this.onActivateMapPointClick();
+  },
+  // ################################################################### //
+  // ###################### handlers events (dom) ###################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by event 'keyup' on 'GPLocationOrigin' tag input
+   * (cf. this.), and it gets the value of input.
+   * this value is passed as a parameter for the service autocomplete (text).
+   * the results of the request are displayed into a drop down menu.
+   * FIXME
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onAutoCompleteSearchText: function onAutoCompleteSearchText(e) {
+    logger.log("onAutoCompleteSearchText()", e);
+    var value = e.target.value;
+
+    if (!value) {
+      return;
+    } // aucun droits !
+    // on evite une requête...
+
+
+    if (this._noRightManagement) {
+      logger.log("no rights for this service !?");
+      return;
+    } // on sauvegarde le localisant
+
+
+    this._currentLocation = value; // on limite les requêtes à partir de 3 car. saisie !
+
+    if (value.length < 3) {
+      return;
+    } // INFORMATION
+    // on effectue la requête au service d'autocompletion.
+    // on met en place des callbacks afin de recuperer les resultats ou
+    // les messages d'erreurs du service.
+    // les resultats sont affichés dans une liste deroulante.
+
+
+    var context = this;
+
+    this._requestAutoComplete({
+      text: value,
+      maximumResponses: 5,
+      // FIXME je limite le nombre de reponse car le container DOM est limité dans l'affichage !!!
+      // callback onSuccess
+      onSuccess: function onSuccess(results) {
+        logger.log(results);
+
+        if (results) {
+          var locations = results.suggestedLocations;
+
+          context._fillAutoCompletedLocationListContainer(locations);
+        }
+      },
+      // callback onFailure
+      onFailure: function onFailure(error) {
+        // FIXME
+        // où affiche t on les messages : ex. 'No suggestion matching the search' ?
+        // doit on nettoyer la liste des suggestions dernierement enregistrée :
+        context._clearSuggestedLocation();
+
+        logger.log(error.message);
+      }
+    });
+  },
+
+  /**
+   * this method is called by event 'click' on 'GPautoCompleteResultsList' tag div
+   * (cf. this._createAutoCompleteListElement), and it selects the location.
+   * this location displays a marker on the map.
+   * FIXME
+   * TODO
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onAutoCompletedResultsItemClick: function onAutoCompletedResultsItemClick(e) {
+    logger.log("onAutoCompletedResultsItemClick()", e);
+    var idx = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__["default"].index(e.target.id);
+    logger.log(idx);
+    logger.log(this._suggestedLocations[idx]);
+
+    if (!idx) {
+      return;
+    }
+
+    var position = {
+      x: this._suggestedLocations[idx].position.x,
+      // LON !
+      y: this._suggestedLocations[idx].position.y // LAT !
+
+    };
+    var info = {
+      type: this._suggestedLocations[idx].type,
+      fields: this._suggestedLocations[idx]
+    };
+    var label = this._suggestedLocations[idx].fullText;
+
+    this._setLabel(label);
+
+    this._setPosition(position);
+
+    this._setMarker(position, info, this.options.displayInfo); // on sauvegarde le point courant
+
+
+    this._coordinate = position;
+  },
+
+  /**
+   * this method is called by event 'click' on '' tag input
+   * (cf. this.), and it create or remove the event of click map.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onActivateMapPointClick: function onActivateMapPointClick(e) {
+    logger.trace("onActivateMapPointClick()", e);
+    var map = this._map;
+
+    if (this._inputShowPointerContainer.checked) {
+      if (!this._activeDragAndDrop) {
+        map.on("click", this.onMouseMapClick, this); // on change le curseur
+
+        this._setCursor("crosshair"); // on supprime le marker
+
+
+        this._setMarker(); // on efface l'ancien resultat
+
+
+        this._clearResults();
+      }
+    } else {
+      if (!this._activeDragAndDrop) {
+        map.off("click", this.onMouseMapClick, this); // on retablie le curseur d'origine
+
+        this._setCursor();
+      }
+    }
+  },
+
+  /**
+   * this method is called by event 'click' on '(n)' tag label
+   * (cf. this.).
+   * this point is erased.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onLocationClearPointClick: function onLocationClearPointClick(e) {
+    logger.log("onLocationClearPointClick", e);
+
+    this._setCursor();
+
+    this._setMarker();
+
+    this._clearResults();
+
+    this._inputAutoCompleteContainer.focus();
+  },
+
+  /**
+   * this method is called by event 'click' on '(n)' tag input
+   * (cf. this.).
+   * this point is deleted.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onLocationRemovePointClick: function onLocationRemovePointClick(e) {
+    logger.log("onLocationRemovePointClick", e);
+
+    this._setCursor();
+
+    this._setMarker();
+
+    this._clearResults();
+  },
+
+  /**
+   * TODO this method is called by event 'click' on '(n)' tag input
+   * (cf. this.).
+   * this point is added as a parameter for the service Location.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onLocationAddPointClick: function onLocationAddPointClick(e) {
+    logger.log("onLocationAddPointClick", e);
+  },
+  // ################################################################### //
+  // #################### handlers events (control) #################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by event 'click' on map
+   * (cf. this.onLocationMapPointClick), and it gets the coordinate of click on map.
+   * this point is saved as a parameter for the service Location.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onMouseMapClick: function onMouseMapClick(e) {
+    logger.log("onMouseMapClick", e); // les coordonnées
+
+    var oLatLng = e.latlng; // si le geocodage inverse est desactivé,
+    // on transmet les coordonnées au panneau,
+    // sinon, on transmet la reponse du service
+
+    if (this.options.disableReverse || this._noRightManagement) {
+      // on transmet les coordonnées au panneau, puis on place le marker
+      this._displayResultOfCoordinate(oLatLng);
+    } else {
+      // contexte
+      var self = this; // on realise une requête au service, si la reponse est vide ou
+      // en échec, on transmet les coordonnées !
+
+      this._requestReverseGeocode({
+        position: {
+          x: oLatLng.lat,
+          // on envoie X->LAT à l'API service IGN car on spécifie EPSG:4326
+          y: oLatLng.lng // on envoie Y->LON à l'API service IGN car on spécifie EPSG:4326
+
+        },
+        srs: "EPSG:4326",
+        // callback onSuccess
+        onSuccess: function onSuccess(results) {
+          logger.log(results);
+
+          if (results.locations.length !== 0) {
+            var oLocation = results.locations[0];
+
+            self._displayResultOfLabel(oLocation);
+          } else {
+            self._displayResultOfCoordinate(oLatLng);
+          }
+        },
+        // callback onFailure
+        onFailure: function onFailure(error) {
+          logger.log(error.message);
+
+          self._displayResultOfCoordinate(oLatLng);
+        }
+      });
+    }
+  },
+
+  /**
+   * this method is called by event 'startdrag' on marker
+   * and it initializes the drag&drop.
+   *
+   * @private
+   */
+  onStartDragMarker: function onStartDragMarker() {
+    if (!this._marker) {
+      return;
+    }
+
+    this._activeDragAndDrop = true;
+    this._inputShowPointerContainer.checked = true;
+    this._inputAutoCompleteContainer.className = "GPlocationOriginHidden";
+    this._inputCoordinateContainer.className = "GPlocationOriginVisible";
+
+    this._marker.unbindPopup();
+
+    this._setLabel();
+
+    this._clearResults();
+  },
+
+  /**
+   * this method is called by event 'drag' on marker
+   * and it updates the panel of coordinate.
+   *
+   * @private
+   */
+  onDragMarker: function onDragMarker() {
+    if (!this._marker) {
+      return;
+    }
+
+    this._activeDragAndDrop = false;
+    this._inputShowPointerContainer.checked = true; // on transmet les coordonnées au panneau
+
+    var oLatLng = this._marker.getLatLng();
+
+    this._setCoordinate(oLatLng);
+  },
+
+  /**
+   * this method is called by event 'enddrag' on marker
+   * and it finishes the drag&drop.
+   * this point is saved as a parameter for the service Location.
+   *
+   * @private
+   */
+  onEndDragMarker: function onEndDragMarker() {
+    if (!this._marker) {
+      return;
+    }
+
+    this._inputShowPointerContainer.checked = true;
+
+    var oLatLng = this._marker.getLatLng();
+
+    if (this._pressedKeyOnDragAndDrop) {
+      // on transmet les coordonnées au panneau
+      this._setCoordinate(oLatLng);
+    } else {
+      logger.log("No key pressed, so autocomplete solution !");
+      this.onMouseMapClick({
+        latlng: oLatLng
+      });
+    } // init
+
+
+    this._activeDragAndDrop = false;
+    this._pressedKeyOnDragAndDrop = false;
+  },
+
+  /**
+   * this method is called by event 'mousedown' on marker..
+   * this event gets the pressed key code.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onMouseDownMarker: function onMouseDownMarker(e) {
+    if (!this._marker) {
+      return;
+    }
+
+    this._pressedKeyOnDragAndDrop = e.originalEvent.ctrlKey;
+  }
+});
+/* harmony default export */ __webpack_exports__["default"] = (LocationSelector);
+
+/***/ }),
+/* 143 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34);
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_1__["default"].getLogger("LocationSelectorDOM");
+var LocationSelectorDOM = {
+  /**
+  * Add uuid to the tag ID
+  * @param {String} id - id selector
+  * @returns {String} uid - id selector with an unique id
+  */
+  _addUID: function _addUID(id) {
+    var uid = this._uid ? id + "-" + this._uid : id;
+    return uid;
+  },
+
+  /**
+   * Main container (DOM)
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createMainContainerElement: function _createMainContainerElement() {
+    var container = document.createElement("div");
+    container.className = this._addUID("GPlocationPoint"); // ceci permet de gerer les groupes de points !
+
+    container.className += " GPwidget";
+    return container;
+  },
+
+  /**
+   * Create Container Point
+   * see event !
+   *
+   * @param {Number} id - tag ID
+   * @param {Number} display  - display
+   * @returns {DOMElement} DOM element
+   */
+  _createLocationPointElement: function _createLocationPointElement(id, display) {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPlocationPoint_" + id);
+    div.className = display ? "GPflexInput GPlocationStageFlexInput" : "GPflexInput GPlocationStageFlexInputHidden";
+    div.style.cssText = "";
+    return div;
+  },
+
+  /**
+   * Create Container Point
+   * see event !
+   *
+   * @param {Number} id - tag ID
+   * @param {String} text - label
+   * @returns {DOMElement} DOM element
+   */
+  _createLocationPointLabelElement: function _createLocationPointLabelElement(id, text) {
+    // contexte d'execution
+    var self = this;
+    var labelOrigin = document.createElement("label");
+    labelOrigin.id = this._addUID("GPlocationOriginLabel_" + id);
+    labelOrigin.htmlFor = "GPlocationOrigin_" + id;
+    labelOrigin.innerHTML = text;
+    labelOrigin.addEventListener("click", function (e) {
+      var i = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(this.id);
+      var points = document.getElementsByClassName(self._addUID("GPlocationPoint"));
+
+      for (var j = 0; j < points.length; j++) {
+        var tag = points[j].childNodes[0].id;
+        var id = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(tag);
+        document.getElementById(self._addUID("GPlocationPoint_" + id)).style.cssText = "";
+      }
+
+      document.getElementById(self._addUID("GPlocationOriginCoords_" + i)).value = "";
+      document.getElementById(self._addUID("GPlocationOrigin_" + i)).value = "";
+      document.getElementById(self._addUID("GPlocationPoint_" + i)).style.cssText = "";
+      document.getElementById(self._addUID("GPlocationOriginPointer_" + i)).checked = false;
+      document.getElementById(self._addUID("GPlocationOrigin_" + i)).className = "GPlocationOriginVisible";
+      document.getElementById(self._addUID("GPlocationOriginCoords_" + i)).className = "GPlocationOriginHidden";
+
+      if (document.getElementById(self._addUID("GPlocationStageRemove_" + i))) {
+        document.getElementById(self._addUID("GPlocationStageRemove_" + i)).className = "GPlocationStageRemove";
+      }
+
+      if (document.getElementById(self._addUID("GPlocationStageAdd"))) {
+        document.getElementById(self._addUID("GPlocationStageAdd")).className = "";
+      } // document.getElementById(self._addUID("GPlocationOriginCoords_" + i)).disabled = true;
+
+
+      self.onLocationClearPointClick(e);
+    });
+    return labelOrigin;
+  },
+
+  /**
+   * Create Input AutoComplete Point tag
+   *
+   * @param {Number} id - tag ID
+   * @returns {DOMElement} DOM element
+   */
+  _createLocationAutoCompleteteInputElement: function _createLocationAutoCompleteteInputElement(id) {
+    // contexte d'execution
+    var self = this;
+    var inputOrigin = document.createElement("input");
+    inputOrigin.id = this._addUID("GPlocationOrigin_" + id);
+    inputOrigin.className = "GPlocationOriginVisible";
+    inputOrigin.type = "text";
+    inputOrigin.placeholder = "Saisir une adresse";
+    inputOrigin.autocomplete = "off";
+    inputOrigin.addEventListener("keyup", function (e) {
+      var charCode = e.which || e.keyCode;
+
+      if (charCode === 13 || charCode === 10 || charCode === 38 || charCode === 40) {
+        return;
+      }
+
+      var i = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(this.id);
+
+      if (document.getElementById(self._addUID("GPlocationOrigin_" + i)).value.length > 2) {
+        document.getElementById(self._addUID("GPlocationAutoCompleteList_" + i)).style.display = "block";
+      } else {
+        document.getElementById(self._addUID("GPlocationAutoCompleteList_" + i)).style.display = "none";
+      } // gestionnaire d'evenement :
+      // on récupère la valeur de saisie pour une requête sur le service d'autocompletion.
+      // le resultat de la requête nous permet de recuperer les coordonnées du point...
+
+
+      self.onAutoCompleteSearchText(e);
+    });
+    inputOrigin.addEventListener("keydown", function (e) {
+      var charCode = e.which || e.keyCode;
+      var container = document.getElementById(self._addUID("GPlocationAutoCompleteList_" + id)); // si aucun container !?
+
+      if (!container) {
+        return;
+      }
+
+      var curr = container.getElementsByClassName("GPautoCompleteProposal current");
+      var list = container.getElementsByClassName("GPautoCompleteProposal"); // si aucune suggestion, on ne va pas plus loin !
+
+      var length = list.length;
+
+      if (!length) {
+        return;
+      }
+
+      var current = null; // si aucun item courant, on prend le 1er !
+
+      if (!curr.length) {
+        current = list[0];
+        current.className = "GPautoCompleteProposal current";
+        current.style.color = "#000000";
+        current.style["background-color"] = "#CEDBEF";
+        return;
+      } else {
+        current = curr[0];
+      }
+
+      var index = parseInt(_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(current.id), 10);
+      var next = index === length - 1 ? list[0] : list[index + 1];
+      var prev = index === 0 ? list[length - 1] : list[index - 1];
+      current.style["background-color"] = "";
+      current.style.color = "";
+      prev.style["background-color"] = "";
+      prev.style.color = "";
+      next.style["background-color"] = "";
+      next.style.color = "";
+
+      switch (charCode) {
+        case 38:
+          // arrow up
+          logger.log("arrow up");
+          current.className = "GPautoCompleteProposal";
+          prev.className = "GPautoCompleteProposal current";
+          prev.style.color = "#000000";
+          prev.style["background-color"] = "#CEDBEF";
+          break;
+
+        case 40:
+          // arrow down
+          logger.log("arrow down");
+          current.className = "GPautoCompleteProposal";
+          next.className = "GPautoCompleteProposal current";
+          next.style.color = "#000000";
+          next.style["background-color"] = "#CEDBEF";
+          break;
+
+        case 13:
+          // enter
+          logger.log("enter");
+          current.click(e);
+          break;
+      }
+
+      current.focus();
+    });
+    return inputOrigin;
+  },
+
+  /**
+   * Create Input Coordinate Point tag
+   *
+   * @param {Number} id - tag ID
+   * @returns {DOMElement} DOM element
+   */
+  _createLocationCoordinateInputElement: function _createLocationCoordinateInputElement(id) {
+    // contexte d'execution
+    var self = this;
+    var inputOriginCoord = document.createElement("input");
+    inputOriginCoord.id = this._addUID("GPlocationOriginCoords_" + id);
+    inputOriginCoord.className = "GPlocationOriginHidden";
+    inputOriginCoord.type = "text";
+    inputOriginCoord.disabled = false;
+    inputOriginCoord.addEventListener("click", function () {
+      var i = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(this.id);
+      document.getElementById(self._addUID("GPlocationOriginLabel_" + i)).click();
+    });
+    return inputOriginCoord;
+  },
+
+  /**
+   * Create Show Pointer tag
+   *
+   * @param {Number} id - tag ID
+   * @returns {DOMElement} DOM element
+   */
+  _createLocationPointerShowInputElement: function _createLocationPointerShowInputElement(id) {
+    var inputOriginPointer = document.createElement("input");
+    inputOriginPointer.id = this._addUID("GPlocationOriginPointer_" + id);
+    inputOriginPointer.type = "checkbox";
+    return inputOriginPointer;
+  },
+
+  /**
+   * Create Input Pointer tag
+   *
+   * @param {Number} id - tag ID
+   * @returns {DOMElement} DOM element
+   */
+  _createLocationPointerInputElement: function _createLocationPointerInputElement(id) {
+    // contexte d'execution
+    var self = this;
+    var labelOriginPointer = document.createElement("label");
+    labelOriginPointer.id = this._addUID("GPlocationOriginPointerImg_" + id);
+    labelOriginPointer.htmlFor = "GPlocationOriginPointer_" + id;
+    labelOriginPointer.className = "GPlocationOriginPointerImg";
+    labelOriginPointer.title = "Pointer un lieu sur la carte";
+    labelOriginPointer.addEventListener("click", function (e) {
+      e.preventDefault();
+      e.stopPropagation();
+      var i = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(this.id);
+      var points = document.getElementsByClassName(self._addUID("GPlocationPoint"));
+      var j;
+      var tag;
+      var id;
+
+      for (j = 0; j < points.length; j++) {
+        tag = points[j].childNodes[0].id;
+        id = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(tag);
+
+        if (i !== id) {
+          document.getElementById(self._addUID("GPlocationOriginPointer_" + id)).checked = false;
+
+          if (document.getElementById(self._addUID("GPlocationOriginCoords_" + id)).value === "Pointer un lieu sur la carte") {
+            document.getElementById(self._addUID("GPlocationOriginCoords_" + id)).value = "";
+            document.getElementById(self._addUID("GPlocationOrigin_" + id)).className = "GPlocationOriginVisible";
+            document.getElementById(self._addUID("GPlocationOriginCoords_" + id)).className = "GPlocationOriginHidden";
+          }
+        }
+      }
+
+      if (document.getElementById(self._addUID("GPlocationOriginPointer_" + i)).checked) {
+        document.getElementById(self._addUID("GPlocationOriginCoords_" + i)).value = "";
+
+        for (j = 0; j < points.length; j++) {
+          tag = points[j].childNodes[0].id;
+          id = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(tag);
+          document.getElementById(self._addUID("GPlocationPoint_" + id)).style.cssText = "";
+        }
+
+        if (document.getElementById(self._addUID("GPlocationStageRemove_" + i))) {
+          document.getElementById(self._addUID("GPlocationStageRemove_" + i)).className = "GPlocationStageRemove";
+        }
+
+        if (document.getElementById(self._addUID("GPlocationStageAdd"))) {
+          document.getElementById(self._addUID("GPlocationStageAdd")).className = "";
+        }
+
+        document.getElementById(self._addUID("GPlocationOriginPointer_" + i)).checked = false;
+        document.getElementById(self._addUID("GPlocationOrigin_" + i)).className = "GPlocationOriginVisible";
+        document.getElementById(self._addUID("GPlocationOriginCoords_" + i)).className = "GPlocationOriginHidden";
+      } else {
+        document.getElementById(self._addUID("GPlocationOriginCoords_" + i)).value = "Pointer un lieu sur la carte";
+
+        for (j = 0; j < points.length; j++) {
+          tag = points[j].childNodes[0].id;
+          id = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(tag);
+
+          if (i === id) {
+            document.getElementById(self._addUID("GPlocationPoint_" + id)).style.cssText = "";
+          } else {
+            document.getElementById(self._addUID("GPlocationPoint_" + id)).style.display = "none";
+          }
+        }
+
+        if (document.getElementById(self._addUID("GPlocationStageRemove_" + i))) {
+          document.getElementById(self._addUID("GPlocationStageRemove_" + i)).className = "GPlocationOriginHidden";
+        }
+
+        if (document.getElementById(self._addUID("GPlocationStageAdd"))) {
+          document.getElementById(self._addUID("GPlocationStageAdd")).className = "GPlocationOriginHidden";
+        }
+
+        document.getElementById(self._addUID("GPlocationOriginPointer_" + i)).checked = true;
+        document.getElementById(self._addUID("GPlocationOrigin_" + i)).className = "GPlocationOriginHidden";
+        document.getElementById(self._addUID("GPlocationOriginCoords_" + i)).className = "GPlocationOriginVisible";
+        document.getElementById(self._addUID("GPlocationOriginCoords_" + i)).disabled = true;
+      } // gestionnaire d'evenement :
+      // on stocke la valeur du point, utilisée pour la requête sur le service de calcul d'itiniraire
+
+
+      self.onActivateMapPointClick(e);
+    });
+    return labelOriginPointer;
+  },
+
+  /**
+   * Create Remove Point tag
+   * see event !
+   *
+   * @param {Number} id - tag ID
+   * @returns {DOMElement} DOM element
+   */
+  _createLocationRemovePointElement: function _createLocationRemovePointElement(id) {
+    // contexte d'execution
+    var self = this;
+    var divRm = document.createElement("div");
+    divRm.id = this._addUID("GPlocationStageRemove_" + id);
+    divRm.className = "GPlocationStageRemove";
+    divRm.title = "Supprimer l'étape";
+    divRm.addEventListener("click", function (e) {
+      var points = document.getElementsByClassName(self._addUID("GPlocationPoint"));
+      var last = points.length - 1;
+      var start = points[0].childNodes[0].id;
+      var end = points[last].childNodes[0].id;
+      var startID = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(start);
+      var endID = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(end);
+
+      if (id !== startID && id !== endID) {
+        var i = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(this.id);
+        document.getElementById(self._addUID("GPlocationPoint_" + i)).className = "GPflexInput GPlocationStageFlexInputHidden";
+        document.getElementById(self._addUID("GPlocationOrigin_" + i)).value = "";
+        document.getElementById(self._addUID("GPlocationOrigin_" + i)).className = "GPlocationOriginVisible";
+        document.getElementById(self._addUID("GPlocationOriginCoords_" + i)).value = "";
+        document.getElementById(self._addUID("GPlocationOriginCoords_" + i)).className = "GPlocationOriginHidden";
+        document.getElementById(self._addUID("GPlocationStageAdd")).style.display = ""; // Moving up exclusions picto
+        // var exclusionsPictoTop = document.getElementById(self._addUID("GPshowLocationExclusionsPicto")).style.top;
+        // document.getElementById(self._addUID("GPshowLocationExclusionsPicto")).style.top = (parseInt(exclusionsPictoTop) - 33).toString() + "px";
+        // gestionnaire d'evenement :
+        // on supprime le point, utilisé pour la requête sur le service d'itiniraire
+
+        self.onLocationRemovePointClick(e);
+      }
+    });
+    return divRm;
+  },
+
+  /**
+   * Create Add Point tag
+   * see event !
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createLocationAddPointElement: function _createLocationAddPointElement() {
+    // contexte d'execution
+    var self = this;
+    var divAdd = document.createElement("div");
+    divAdd.id = this._addUID("GPlocationStageAdd");
+    divAdd.title = "Ajouter une étape";
+    divAdd.addEventListener("click", function (e) {
+      var lastStage = 1;
+      var nbStages = 0;
+      var points = document.getElementsByClassName(self._addUID("GPlocationPoint"));
+
+      for (var i = 1; i < points.length - 1; i++) {
+        var tag = points[i].childNodes[0].id;
+        var id = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(tag);
+
+        if (document.getElementById(self._addUID("GPlocationPoint_" + id))) {
+          if (document.getElementById(self._addUID("GPlocationPoint_" + id)).className === "GPflexInput GPlocationStageFlexInputHidden") {
+            if (lastStage === 1) {
+              lastStage = id;
+            }
+          } else {
+            nbStages++;
+          }
+        }
+      } // FIXME algo à revoir : lastStage = id hors si id = 300 sur 3 points !?
+
+
+      if (lastStage < points.length) {
+        document.getElementById(self._addUID("GPlocationPoint_" + lastStage)).className = "GPflexInput GPlocationStageFlexInput"; // Moving down exclusions picto
+        // var exclusionsPictoTop = document.getElementById(self._addUID("GPshowLocationExclusionsPicto")).style.top;
+        // document.getElementById(self._addUID("GPshowLocationExclusionsPicto")).style.top = (parseInt(exclusionsPictoTop) + 33).toString() + "px";
+      }
+
+      if (nbStages === 4) {
+        document.getElementById(self._addUID("GPlocationStageAdd")).style.display = "none";
+      } // gestionnaire d'evenement :
+      // on ajoute le point, utilisé pour la requête sur le service d'itiniraire
+
+
+      self.onLocationAddPointClick(e);
+    });
+    return divAdd;
+  },
+
+  /**
+   * Create Results autocompletion to the point
+   * see event!
+   *
+   * @param {Number} id - tag ID
+   * @returns {DOMElement} DOM element
+   */
+  _createLocationAutoCompleteResultElement: function _createLocationAutoCompleteResultElement(id) {
+    // contexte d'execution
+    var self = this;
+    var div = document.createElement("div");
+    div.id = this._addUID("GPlocationAutoCompleteList_" + id);
+    div.className = "GPadvancedAutoCompleteList";
+
+    if (div.addEventListener) {
+      div.addEventListener("click", function (e) {
+        self.onAutoCompletedResultsItemClick(e);
+        document.getElementById(self._addUID("GPlocationAutoCompleteList_" + id)).style.display = "none";
+      }, false);
+    } else if (div.attachEvent) {
+      div.attachEvent("onclick", function (e) {
+        self.onAutoCompletedResultsItemClick(e);
+        document.getElementById(self._addUID("GPlocationAutoCompleteList_" + id)).style.display = "none";
+      });
+    }
+
+    return div;
+  },
+
+  /**
+   * Autocompletion result to a point.
+   * Proposals are dynamically filled in Javascript by autocomplete service
+   *
+   * TODO formaliser le contenu des reponse
+   *
+   * @param {Number} id - tag ID
+   * @param {Object} location - suggested location result
+   * @param {Number} n  - number of the point
+   */
+  _createLocationAutoCompletedLocationElement: function _createLocationAutoCompletedLocationElement(id, location, n) {
+    var container = document.getElementById(this._addUID("GPlocationAutoCompleteList_" + id));
+    var div = document.createElement("div");
+    div.id = this._addUID("AutoCompletedLocation_" + n);
+    div.className = "GPautoCompleteProposal";
+    div.innerHTML = location.fullText;
+    container.appendChild(div);
+  },
+
+  /**
+  * Display Coordinate
+  * @param {String} value - a Coordinate
+  */
+  GPdisplayCoordinate: function GPdisplayCoordinate(value) {
+    var points = document.getElementsByClassName(this._addUID("GPlocationPoint"));
+
+    for (var i = 0; i < points.length; i++) {
+      var tag = points[i].childNodes[0].id;
+      var id1 = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(tag);
+
+      if (document.getElementById(this._addUID("GPlocationOriginPointer_" + id1)).checked) {
+        document.getElementById(this._addUID("GPlocationOriginCoords_" + id1)).value = value;
+        document.getElementById(this._addUID("GPlocationOriginCoords_" + id1)).disabled = false;
+
+        for (var j = 0; j < points.length; j++) {
+          tag = points[j].childNodes[0].id;
+          var id2 = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(tag);
+          document.getElementById(this._addUID("GPlocationPoint_" + id2)).style.cssText = "";
+
+          if (document.getElementById(this._addUID("GPlocationStageRemove_" + id2))) {
+            document.getElementById(this._addUID("GPlocationStageRemove_" + id2)).className = "GPlocationStageRemove";
+          }
+        }
+
+        document.getElementById(this._addUID("GPlocationOriginPointer_" + id1)).checked = false;
+
+        if (document.getElementById(this._addUID("GPlocationStageAdd"))) {
+          document.getElementById(this._addUID("GPlocationStageAdd")).className = "";
+        }
+
+        return;
+      }
+    }
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (LocationSelectorDOM);
+
+/***/ }),
+/* 144 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/**
+* implementation :
+* cf. http://uihacker.blogspot.fr/2011/07/javascript-formatting-latitudelongitude.html?m=1
+* cf. http://andrew.hedges.name/experiments/convert_lat_long/
+* FIXME formater la sortie
+* cf. http://mottie.github.io/javascript-number-formatter/
+* cf. https://github.com/j-/number-formatter
+*
+*/
+
+/** ... */
+var PositionFormater = {
+  /** ... */
+  NORTH: "N",
+
+  /** ... */
+  SOUTH: "S",
+
+  /** ... */
+  EAST: "E",
+
+  /** ... */
+  WEST: "O",
+
+  /** ... */
+  digitSecond: 2,
+
+  /** ... */
+  digitDecimal: 5,
+
+  /** ... */
+  digitRadian: 8,
+
+  /**
+   * @param {Number} inputNum -inputNum
+   * @param {Integer} numPoints - numPoints
+   *
+   * @returns {Number} rounded result
+   */
+  roundToDecimal: function roundToDecimal(inputNum, numPoints) {
+    var multiplier = Math.pow(10, numPoints);
+    return Math.round(inputNum * multiplier) / multiplier;
+  },
+
+  /**
+   * @param {Number} location -location
+   *
+   * @returns {Number} location in radian
+   */
+  decimalToRadian: function decimalToRadian(location) {
+    var d = 0.01745329251994329577;
+    return this.roundToDecimal(location * d, this.digitRadian);
+  },
+
+  /**
+   * @param {Number} location -location
+   *
+   * @returns {Number} location in grade
+   */
+  decimalToGrade: function decimalToGrade(location) {
+    var d = 1.11111111111111111111;
+    return this.roundToDecimal(location * d, this.digitRadian);
+  },
+
+  /**
+   * @param {Number} location -location
+   * @param {String} hemisphere -hemisphere
+   * @param {Boolean} obj -specifies if an object must be returned
+   *
+   * @returns {String|Object} DMS (String or Object depending on obj parameter value)
+   */
+  decimalToDMS: function decimalToDMS(location, hemisphere, obj) {
+    if (location < 0) {
+      location *= -1; // strip dash '-'
+    }
+
+    var degrees = Math.floor(location); // strip decimal remainer for degrees
+
+    var minutesFromRemainder = (location - degrees) * 60; // multiply the remainer by 60
+
+    var minutes = Math.floor(minutesFromRemainder); // get minutes from integer
+
+    var secondsFromRemainder = (minutesFromRemainder - minutes) * 60; // multiply the remainer by 60
+
+    var seconds = this.roundToDecimal(secondsFromRemainder, this.digitSecond); // get minutes by rounding to integer
+
+    var dms = degrees + "° " + minutes + "' " + seconds + "\" ";
+
+    if (hemisphere) {
+      dms += hemisphere;
+    }
+
+    if (obj) {
+      return {
+        d: degrees,
+        m: minutes,
+        s: seconds,
+        direction: hemisphere
+      };
+    }
+
+    return dms;
+  },
+
+  /**
+   * @param {Number} location -location
+   * @param {Boolean} obj -specifies if an object must be returned
+   *
+   * @returns {String|Object} DMS (String or Object depending on obj parameter value)
+   */
+  decimalLatToDMS: function decimalLatToDMS(location, obj) {
+    var hemisphere = location < 0 ? this.SOUTH : this.NORTH; // south if negative
+
+    return this.decimalToDMS(location, hemisphere, obj);
+  },
+
+  /**
+   * @param {Number} location -location
+   * @param {Boolean} obj -specifies if an object must be returned
+   *
+   * @returns {String|Object} DMS (String or Object depending on obj parameter value)
+   */
+  decimalLonToDMS: function decimalLonToDMS(location, obj) {
+    var hemisphere = location < 0 ? this.WEST : this.EAST; // west if negative
+
+    return this.decimalToDMS(location, hemisphere, obj);
+  },
+
+  /**
+   * @param {Number} degrees -degrees
+   * @param {Number} minutes -minutes
+   * @param {Number} seconds -seconds
+   * @param {String} hemisphere -hemisphere
+   *
+   * @returns {Number} decimal
+   */
+  DMSToDecimal: function DMSToDecimal(degrees, minutes, seconds, hemisphere) {
+    var ddVal = degrees + minutes / 60 + seconds / 3600;
+    ddVal = hemisphere === this.SOUTH || hemisphere === this.WEST ? ddVal * -1 : ddVal;
+    var decimal = this.roundToDecimal(ddVal, this.digitDecimal);
+    return decimal;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (PositionFormater);
+
+/***/ }),
+/* 145 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34);
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_1__["default"].getLogger("icondefault");
+/**  cf. http://leafletjs.com/reference.html#icon */
+
+var IconDefault = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Icon.Default.extend(
+/** @lends IconDefault.prototype */
+{
+  /**
+  * Liste des icones
+  *   TODO : image retina à convertir en x2...
+  */
+  images: {
+    retina: {
+      shadow: "data:image/png;base64,...",
+      color: {
+        blue: "data:image/png;base64,...",
+        orange: "data:image/png;base64,...",
+        red: "data:image/png;base64,...",
+        green: "data:image/png;base64,..."
+      }
+    },
+    shadow: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=",
+    color: {
+      blue: "data:image/png;base64,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",
+      orange: "data:image/png;base64,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",
+      red: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAASAAAAEgARslrPgAABe5JREFUWMOdlWuIXGcZx3/nPbe5ZWbO2c0a8VIEpSq0io2QBT8FUlIFEbzfokUUKfgxIuSbn+JtYTEQqFQCQmkxVIiNFhcLwZoVtrFNt40ESrPEJju7s/eZM+f+Pn6Y2XVnZ3Zn0/fwcA7veZ/ze5//87zPMf56fJIHGB8Far3n20D79Nz1kU7GXw6G+MD3gdPAKdtxMJQFQJZEaK0bwBXg2Sfmrl87AHJi2LwJnAXOVf3xSrFcoVAuDyzKs4yw3SLY2iTqBC8BP31ibnZ+AHJ1MBIfeK7qeaeqno9l2+g4IQ86ILpvoXIczCMVAFob66wuLYXAmc/PXb/cB3nxsRN7AdfrY2MPe+Pj6Cjufnyk6Aa2XyfshLQ21glarae+8OrsxZ3N7JHoj3Xff9jzx8jWN8hbbdB6tOU5aXOVguNQ98YAfnv1+OTJHYgAPTt7pFY76Xk+2fo6kiSg8wEzLLMr25B32eoqjm0x8b5jpsBzLx6f9LsQARF8Ec7Vq1V0J0CSuM9ZFVxsr47t1RHHxq7XsL06Vq06AEqby5RLReq12lERzvbkEkC+VatWKpapyNtt6JERwfY9DMdmdW2NOwsLrCmDdxYWWFpaIopjbN/rarLLJw8C6rUqID/682MnTEsQgK9XSiV0nHQ17g2rViWOI95tLPOxJ89w4sx3sCvdarr3txnmf/kbqnFE3auTrqzu+OkgwC4WcAuuH0XRpBKhIsJkwbHJN9f79TcVG5tbPHruZ3z8qR/vAAA+8PgpPvf737Eehug8Rbn2gHQl10WE00rgw7ZtmdtVspMH2yKJY/TEBA996YsDVSsilD/0QR76ypfZ3GphFgp9AN3p4FgmAp9UIuIrQw2UpXJdwijGe+SRoQAArTXepz9FEEbdfOzylyxHddfWLEESLbpblrtPtM4AQafJvgARIY8iDMMY8DcM6a5BQiUY99I8H9hJHgSUHZvluVfRaToA2obc/8c/qbg2kqV9/oapyPIcwbinRKSRZnlb53l3R9vhRjGWAYV2i7cuXByIAmBx9l+sz8xQK7jkW1v9EKVI0hQRuWt+9dj7Bfhs0VSfKFZK6CDoq/lKucTya69x/+Y8pWPHcMd8Nu8s8M7lF5j/xa+ZKBVwTdWFbPsZBmaxwGIrINP6J8bzj34G4GTZcf7+kXqFtNns77SlMma5xEaUsBbGhFmGY5rUXBu/6GIpNeBjHz3KRpTw7lZ75ms3bzxudQXg5XaSzLbjZLI8Nka2srLrYLWRqEPdH6Pu2n0f050OaRD0l54yQIS1MELg5wDbEIBfrYbRCxW3MvDfkEyTLi+NavjdKMYn2Ixi2mn28jdu3nil1yCFnl3ZiNO3ozjtNb5DtPihbV+z2okRkfPDWn0uMLUSxhim9Z4AlufRThK20uzGN9/498wOhN0HUfSllShuZnmOKhXZ826kGYbBSicG0ed3S7g7EgRCgaebYYxZLvW/GWGW79HJM9bT7LbAn/oh/8/Jtk0vRkmotUY5zqGlMpSi2cvFt+dfz/dEYrDHmoLxh5Uwxjxy5FAAs1olynJWUn1XMJ7dW3FKGHpN3Y2yXEQwTDVSKuU6NKMEQaa+++brySBkUC5E5LaIXF2LE0zfR7Te11SpRJLlNJK8KSLPDDs76oA9Ti3H+UipVLHIUpggcOF7b73RHg4ZHgkicm0r17OtLMc6Oj5cpnKJXAv3U90Wken9uoAaUZzTS1GGIQxPeLFEI04RuPjkrfnN9wq5vKJ5OxTBrNb2JNtFFPw3lURg6qB+dpBciEguItONOEO5zkDZLoYpInLpB7fmGwdDRp/nS4sZzVQEVS6DCIZjIyIspOQC5xkx1O6/4D7WRuTpRpRhlkrdRlirsxRnIPL8D//z5p2RkH0O497rwt2cRBBUwQWExVwQZGQUPchAWxlmDcG41Eg0Zq1GM9EEoq4KxvyhIA/QaacXs+5z736+O3+YSEamZMduBaKuNFNhU9Q1EV6RwzEOnZOdxnk/7eZie+aQcj3QuLaJegZ46UGc/gcUeTtzDg/o4wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMi0wOC0xOFQxNDo1MDo1NiswMTowMBZQpF8AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTItMDgtMThUMTQ6NTA6NTYrMDE6MDBnDRzjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==",
+      green: "data:image/png;base64,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"
+    }
+  },
+
+  /**
+   * constructor
+   * (extend to L.Icon.Default)
+   *
+   * @param {String} color - blue, green or red, blue by default.
+   * @param {Object} options - options of L.Icon
+   */
+  initialize: function initialize(color, options) {
+    // on merge les options avec celles par defaut
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.extend(this.options, options);
+    var _color = null;
+    var _images =
+    /* (L.Browser.retina) ? this.images.retina : */
+    this.images;
+
+    switch (color) {
+      case "red":
+        _color = _images.color.red;
+        break;
+
+      case "green":
+        _color = _images.color.green;
+        break;
+
+      case "orange":
+        _color = _images.color.orange;
+        break;
+
+      case "blue":
+        _color = _images.color.blue;
+        break;
+
+      default:
+        _color = _images.color.blue;
+    } // icones classiques
+
+
+    this.options.iconUrl = _color;
+    this.options.shadowUrl = _images.shadow; // icones pour écran Retina
+
+    if (leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Browser.retina) {
+      this.options.iconRetinaUrl = _color;
+      this.options.shadowRetinaUrl = _images.shadow;
+    }
+  },
+
+  /**
+   * Overload function to ensure compatibility between versions 0.7.X and 1.0.X
+   * (extend to L.Icon._getIconUrl)
+   *
+   * @param {String} name - name
+   *
+   * @returns {String} url
+   *
+   */
+  _getIconUrl: function _getIconUrl(name) {
+    logger.trace("OVERWRITTEN L.Icon.Default._getIconUrl(" + name + ")");
+    return leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Icon.prototype._getIconUrl.call(this, name);
+  }
+});
+/* harmony default export */ __webpack_exports__["default"] = (IconDefault);
+
+/***/ }),
+/* 146 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var IsoDOM = {
+  /**
+  * Add uuid to the tag ID
+  * @param {String} id - id selector
+  * @returns {String} uid - id selector with an unique id
+  */
+  _addUID: function _addUID(id) {
+    var uid = this._uid ? id + "-" + this._uid : id;
+    return uid;
+  },
+
+  /**
+   * Main container (DOM)
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createMainContainerElement: function _createMainContainerElement() {
+    var container = document.createElement("div");
+    container.id = this._addUID("GPisochron");
+    container.className = "GPwidget";
+    return container;
+  },
+  // ################################################################### //
+  // ################# Methods to display Main Panel ################### //
+  // ################################################################### //
+
+  /**
+   * Hidden checkbox for minimizing/maximizing panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowIsoElement: function _createShowIsoElement() {
+    var input = document.createElement("input");
+    input.id = this._addUID("GPshowIsochron");
+    input.type = "checkbox";
+    return input;
+  },
+
+  /**
+   * Show iso control
+   * see event !
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowIsoPictoElement: function _createShowIsoPictoElement() {
+    // contexte d'execution
+    var context = this;
+    var label = document.createElement("label");
+    label.id = this._addUID("GPshowIsochronPicto");
+    label.className = "GPshowAdvancedToolPicto";
+    label.htmlFor = this._addUID("GPshowIsochron");
+    label.title = "Calculer une isochrone"; // gestionnaire d'evenement :
+    // on ouvre le menu de saisie du calcul d'isochrone
+    // L'ouverture/Fermeture permet de faire le menage
+    // (reinitialisation)
+
+    if (label.addEventListener) {
+      label.addEventListener("click", function (e) {
+        context.onShowIsoPanelClick(e);
+      });
+    } else if (label.attachEvent) {
+      label.attachEvent("onclick", function (e) {
+        context.onShowIsoPanelClick(e);
+      });
+    }
+
+    var spanOpen = document.createElement("span");
+    spanOpen.id = this._addUID("GPshowIsochronOpen");
+    spanOpen.className = "GPshowAdvancedToolOpen";
+    label.appendChild(spanOpen);
+    return label;
+  },
+  // ################################################################### //
+  // ################## Methods to display Inputs Panel ################ //
+  // ################################################################### //
+
+  /**
+   * Create Container Panel
+   *
+   * FIXME
+   * don't call this._createIsoPanelHeaderElement
+   * don't call this._createIsoPanelFormElement
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoPanelElement: function _createIsoPanelElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPisochronPanel");
+    div.className = "GPpanel"; // div.appendChild(this._createIsoPanelHeaderElement());
+    // div.appendChild(this._createIsoPanelFormElement());
+
+    return div;
+  },
+
+  /**
+   * Create Header Panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoPanelHeaderElement: function _createIsoPanelHeaderElement() {
+    var self = this;
+    var container = document.createElement("div");
+    container.className = "GPpanelHeader";
+    var div = document.createElement("div");
+    div.className = "GPpanelTitle";
+    div.innerHTML = "Calcul d'isochrone";
+    container.appendChild(div); // on desactive l'impl. reduction de la fenetre
+    // var divReduce  = document.createElement("div");
+    // divReduce.id = this._addUID("GPisochronPanelReduce");
+    // divReduce.className = "GPpanelReduce";
+    // divReduce.title = "Masquer le panneau";
+    //
+    // if (divReduce.addEventListener) {
+    //     divReduce.addEventListener("click", function () {
+    //         if ( typeof self.onReduceIsoPanelClick === "function") {
+    //             document.getElementById(self._addUID("GPshowIsochron")).checked = false;
+    //             self.onReduceIsoPanelClick();
+    //         }
+    //     }, false);
+    // } else if (divReduce.attachEvent) {
+    //     divReduce.attachEvent("onclick", function () {
+    //         if ( typeof self.onReduceIsoPanelClick === "function") {
+    //             document.getElementById(self._addUID("GPshowIsochron")).checked = false;
+    //             self.onReduceIsoPanelClick();
+    //         }
+    //     });
+    // }
+    // container.appendChild(divReduce);
+
+    var divClose = document.createElement("div");
+    divClose.id = this._addUID("GPisochronPanelClose");
+    divClose.className = "GPpanelClose";
+    divClose.title = "Fermer le panneau"; // Link panel close / visibility checkbox
+
+    if (divClose.addEventListener) {
+      divClose.addEventListener("click", function () {
+        document.getElementById(self._addUID("GPshowIsochronPicto")).click();
+      }, false);
+    } else if (divClose.attachEvent) {
+      divClose.attachEvent("onclick", function () {
+        document.getElementById(self._addUID("GPshowIsochronPicto")).click();
+      });
+    }
+
+    container.appendChild(divClose);
+    return container;
+  },
+
+  /**
+   * Create Form
+   * see evenement !
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoPanelFormElement: function _createIsoPanelFormElement() {
+    // contexte d'execution
+    var self = this;
+    var form = document.createElement("form");
+    form.id = this._addUID("GPisochronForm");
+    form.addEventListener("submit", function (e) {
+      e.preventDefault();
+      self.onIsoComputationSubmit(e);
+      return false;
+    });
+    return form;
+  },
+
+  /**
+   * Create Waiting Panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoWaitingElement: function _createIsoWaitingElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPisochronCalcWaitingContainer");
+    div.className = "GPisochronCalcWaitingContainerHidden";
+    var p = document.createElement("p");
+    p.className = "GPisochronCalcWaiting";
+    p.innerHTML = "Calcul en cours...";
+    div.appendChild(p);
+    return div;
+  },
+  // ################################################################### //
+  // ############# Methods to the type choice into form ################ //
+  // ################################################################### //
+
+  /**
+   * Create Container to type choice
+   *
+   * FIXME
+   * don't call this._createIsoPanelFormTypeChoiceChronElement
+   * don't call this._createIsoPanelFormTypeChoiceDistElement
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoPanelFormTypeChoiceElement: function _createIsoPanelFormTypeChoiceElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPisochronChoice"); // div.appendChild(this._createIsoPanelFormTypeChoiceChronElement());
+    // div.appendChild(this._createIsoPanelFormTypeChoiceDistElement());
+
+    return div;
+  },
+
+  /**
+   * Create Type choice Chron
+   * see event !
+   * FIXME event not useful
+   * @param {Boolean} checked - checked
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoPanelFormTypeChoiceChronElement: function _createIsoPanelFormTypeChoiceChronElement(checked) {
+    var self = this;
+    var div = document.createElement("div");
+    div.className = "GPisochronChoiceAlt";
+    var input = document.createElement("input");
+    input.id = this._addUID("GPisochronChoiceAltChron");
+    input.name = "GPisochronChoiceMode";
+    input.type = "radio";
+    input.checked = !!checked;
+
+    if (input.addEventListener) {
+      input.addEventListener("change", function (e) {
+        document.getElementById(self._addUID("GPisochronValueChron")).className = "GPflexInput";
+        document.getElementById(self._addUID("GPisochronValueDist")).className = "GPisochronValueHidden";
+        self.onIsoTypeChoiceChange(e);
+      }, false);
+    } else if (input.attachEvent) {
+      input.attachEvent("onchange", function () {
+        document.getElementById(self._addUID("GPisochronValueChron")).className = "GPflexInput";
+        document.getElementById(self._addUID("GPisochronValueDist")).className = "GPisochronValueHidden";
+        self.onIsoTypeChoiceChange();
+      });
+    } // info: Internet explorer support
+
+
+    input.value = "isochron";
+    div.appendChild(input);
+    var label = document.createElement("label");
+    label.className = "GPisochronChoiceAltImg";
+    label.htmlFor = this._addUID("GPisochronChoiceAltChron");
+    div.appendChild(label);
+    var span = document.createElement("span");
+    span.id = this._addUID("GPisochronChoiceAltChronTxt");
+    span.innerHTML = "isochrone";
+
+    if (span.addEventListener) {
+      span.addEventListener("click", function () {
+        document.getElementById(self._addUID("GPisochronChoiceAltChron")).click();
+      }, false);
+    } else if (span.attachEvent) {
+      span.attachEvent("onclick", function () {
+        document.getElementById(self._addUID("GPisochronChoiceAltChron")).click();
+      });
+    }
+
+    div.appendChild(span);
+    return div;
+  },
+
+  /**
+   * Create Type choice Dist
+   * see event !
+   * FIXME event not useful
+   * @param {Boolean} checked - checked
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoPanelFormTypeChoiceDistElement: function _createIsoPanelFormTypeChoiceDistElement(checked) {
+    var self = this;
+    var div = document.createElement("div");
+    div.className = "GPisochronChoiceAlt";
+    var input = document.createElement("input");
+    input.id = this._addUID("GPisochronChoiceAltDist");
+    input.name = "GPisochronChoiceMode";
+    input.type = "radio";
+    input.checked = !!checked;
+
+    if (input.addEventListener) {
+      input.addEventListener("change", function (e) {
+        document.getElementById(self._addUID("GPisochronValueDist")).className = "GPflexInput";
+        document.getElementById(self._addUID("GPisochronValueChron")).className = "GPisochronValueHidden";
+        self.onIsoTypeChoiceChange(e);
+      }, false);
+    } else if (input.attachEvent) {
+      input.attachEvent("onchange", function () {
+        document.getElementById(self._addUID("GPisochronValueDist")).className = "GPflexInput";
+        document.getElementById(self._addUID("GPisochronValueChron")).className = "GPisochronValueHidden";
+        self.onIsoTypeChoiceChange();
+      });
+    } // info: Internet explorer support
+
+
+    input.value = "isodistance";
+    div.appendChild(input);
+    var label = document.createElement("label");
+    label.className = "GPisochronChoiceAltImg";
+    label.htmlFor = this._addUID("GPisochronChoiceAltDist");
+    div.appendChild(label);
+    var span = document.createElement("span");
+    span.id = this._addUID("GPisochronChoiceAltDistTxt");
+    span.innerHTML = "isodistance";
+
+    if (span.addEventListener) {
+      span.addEventListener("click", function () {
+        document.getElementById(self._addUID("GPisochronChoiceAltDist")).click();
+      }, false);
+    } else if (span.attachEvent) {
+      span.attachEvent("onclick", function () {
+        document.getElementById(self._addUID("GPisochronChoiceAltDist")).click();
+      });
+    }
+
+    div.appendChild(span);
+    return div;
+  },
+  // ################################################################### //
+  // ############### Methods to the value iso into form ################ //
+  // ################################################################### //
+
+  /**
+   * Create isochron inputs values
+   * see event !
+   * @param {Boolean} checked - checked
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoPanelFormValueIsochronElement: function _createIsoPanelFormValueIsochronElement(checked) {
+    // contexte
+    var context = this;
+    var div = document.createElement("div");
+    div.id = this._addUID("GPisochronValueChron");
+    div.className = checked ? "GPflexInput" : "GPisochronValueHidden";
+    var label = document.createElement("label");
+    label.id = this._addUID("GPisochronValueChronLabel");
+    label.htmlFor = this._addUID("GPisochronValueChronInput");
+    label.innerHTML = "Temps";
+    div.appendChild(label);
+    var input1 = document.createElement("input");
+    input1.id = this._addUID("GPisochronValueChronInput1");
+    input1.min = "0";
+    input1.step = "1";
+    input1.value = "0";
+    input1.type = "number";
+
+    if (input1.addEventListener) {
+      input1.addEventListener("change", function (e) {
+        if (typeof context.onIsoValueChronTimeMinuteChange === "function") {
+          context.onIsoValueChronTimeHourChange(e);
+        }
+      });
+    } else if (input1.attachEvent) {
+      input1.attachEvent("onchange", function (e) {
+        if (typeof context.onIsoValueChronTimeMinuteChange === "function") {
+          context.onIsoValueChronTimeHourChange(e);
+        }
+      });
+    }
+
+    div.appendChild(input1);
+    var label1 = document.createElement("label");
+    label1.innerHTML = "h";
+    div.appendChild(label1);
+    var input2 = document.createElement("input");
+    input2.id = this._addUID("GPisochronValueChronInput2");
+    input2.min = "0";
+    input2.max = "59";
+    input2.step = "1";
+    input2.value = "0";
+    input2.type = "number";
+
+    if (input2.addEventListener) {
+      input2.addEventListener("change", function (e) {
+        if (typeof context.onIsoValueChronTimeMinuteChange === "function") {
+          context.onIsoValueChronTimeMinuteChange(e);
+        }
+      });
+    } else if (input2.attachEvent) {
+      input2.attachEvent("onchange", function (e) {
+        if (typeof context.onIsoValueChronTimeMinuteChange === "function") {
+          context.onIsoValueChronTimeMinuteChange(e);
+        }
+      });
+    }
+
+    div.appendChild(input2);
+    var label2 = document.createElement("label");
+    label2.innerHTML = "min";
+    div.appendChild(label2);
+    return div;
+  },
+
+  /**
+   * Create isodistance inputs values
+   * see event !
+   * @param {Boolean} checked - checked
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoPanelFormValueIsodistanceElement: function _createIsoPanelFormValueIsodistanceElement(checked) {
+    // contexte
+    var context = this;
+    var div = document.createElement("div");
+    div.id = this._addUID("GPisochronValueDist");
+    div.className = checked ? "GPflexInput" : "GPisochronValueHidden";
+    var label = document.createElement("label");
+    label.id = this._addUID("GPisochronValueDistLabel");
+    label.htmlFor = this._addUID("GPisochronValueDistInput");
+    label.innerHTML = "Distance";
+    div.appendChild(label);
+    var input1 = document.createElement("input");
+    input1.id = this._addUID("GPisochronValueDistInput");
+    input1.min = "0";
+    input1.step = "any";
+    input1.value = "0";
+    input1.type = "number";
+
+    if (input1.addEventListener) {
+      input1.addEventListener("change", function (e) {
+        if (typeof context.onIsoValueDistChange === "function") {
+          context.onIsoValueDistChange(e);
+        }
+      });
+    } else if (input1.attachEvent) {
+      input1.attachEvent("onchange", function (e) {
+        if (typeof context.onIsoValueDistChange === "function") {
+          context.onIsoValueDistChange(e);
+        }
+      });
+    }
+
+    div.appendChild(input1);
+    var label1 = document.createElement("label");
+    label1.innerHTML = "km";
+    div.appendChild(label1);
+    return div;
+  },
+  // ################################################################### //
+  // ############ Methods to the mode choice into form ################# //
+  // ################################################################### //
+
+  /**
+   * Create Container to Mode choice
+   *
+   * FIXME
+   * don't call this._createIsoPanelFormModeChoiceTransportElement
+   * don't call this._createIsoPanelFormModeChoiceDirectionElement
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoPanelFormModeChoiceElement: function _createIsoPanelFormModeChoiceElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPisochronModeChoice"); // div.appendChild(this._createIsoPanelFormModeChoiceTransportElement());
+    // div.appendChild(this._createIsoPanelFormModeChoiceDirectionElement());
+
+    return div;
+  },
+
+  /**
+   * Create Mode choice transport
+   * see event !
+   * FIXME event not useful
+   * @param {Array} transports - transports in a list
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoPanelFormModeChoiceTransportElement: function _createIsoPanelFormModeChoiceTransportElement(transports) {
+    // contexte d'execution
+    var context = this;
+    var div = document.createElement("div");
+    div.id = this._addUID("GPisochronTransportChoice");
+    var span = document.createElement("span");
+    span.className = "GPisochronModeLabel";
+    span.innerHTML = "Mode de transport";
+    div.appendChild(span);
+    /* jshint -W083 */
+
+    for (var i = 0; i < transports.length; i++) {
+      var transport = transports[i];
+
+      if (transport === "Voiture") {
+        var inputCar = document.createElement("input");
+        inputCar.id = this._addUID("GPisochronTransportCar");
+        inputCar.type = "radio";
+        inputCar.name = "GPisochronTransport";
+
+        if (i === 0) {
+          inputCar.checked = true;
+        } // gestionnaire d'evenement :
+        // on stocke le mode de transport,
+        // utilisation pour la requête sur le service de calcul d'itiniraire
+
+
+        if (inputCar.addEventListener) {
+          inputCar.addEventListener("change", function (e) {
+            context.onIsoModeTransportChange(e);
+          });
+        } else if (inputCar.attachEvent) {
+          inputCar.attachEvent("onchange", function (e) {
+            context.onIsoModeTransportChange(e);
+          });
+        } // info : internet explorer support
+
+
+        inputCar.value = "Voiture";
+        div.appendChild(inputCar);
+        var labelCar = document.createElement("label");
+        labelCar.className = "GPisochronTransportImg";
+        labelCar.htmlFor = this._addUID("GPisochronTransportCar");
+        labelCar.title = "Voiture";
+        div.appendChild(labelCar);
+      }
+
+      if (transport === "Pieton") {
+        var inputPedestrian = document.createElement("input");
+        inputPedestrian.id = this._addUID("GPisochronTransportPedestrian");
+        inputPedestrian.type = "radio";
+        inputPedestrian.name = "GPisochronTransport";
+
+        if (i === 0) {
+          inputPedestrian.checked = true;
+        } // gestionnaire d'evenement :
+        // on stocke le mode de transport,
+        // utilisation pour la requête sur le service de calcul d'itiniraire
+
+
+        if (inputPedestrian.addEventListener) {
+          inputPedestrian.addEventListener("change", function (e) {
+            context.onIsoModeTransportChange(e);
+          });
+        } else if (inputPedestrian.attachEvent) {
+          inputPedestrian.attachEvent("onchange", function (e) {
+            context.onIsoModeTransportChange(e);
+          });
+        } // info : internet explorer support
+
+
+        inputPedestrian.value = "Pieton";
+        div.appendChild(inputPedestrian);
+        var labelPedestrian = document.createElement("label");
+        labelPedestrian.className = "GPisochronTransportImg";
+        labelPedestrian.htmlFor = this._addUID("GPisochronTransportPedestrian");
+        labelPedestrian.title = "Piéton";
+        div.appendChild(labelPedestrian);
+      }
+    }
+
+    return div;
+  },
+
+  /**
+   * Create Mode choice direction
+   * see event!
+   *
+   * @param {Array} directions - directions to display in list ("Departure", "Arrival"). First element will be selected by default
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoPanelFormModeChoiceDirectionElement: function _createIsoPanelFormModeChoiceDirectionElement(directions) {
+    // contexte d'execution
+    var self = this;
+    var div = document.createElement("div");
+    div.id = this._addUID("GPisochronDirectionChoice");
+    var span = document.createElement("span");
+    span.className = "GPisochronModeLabel";
+    span.innerHTML = "Sens de parcours";
+    div.appendChild(span);
+    var select = document.createElement("select");
+    select.id = this._addUID("GPisochronDirectionSelect");
+    select.className = "GPinputSelect"; // gestionnaire d'evenement :
+    // on stocke la valeur du mode de calcul,
+    // utilisation pour la requête sur le service de calcul d'iso
+
+    select.addEventListener("change", function (e) {
+      self.onIsoModeDirectionChange(e);
+    });
+
+    for (var i = 0; i < directions.length; i++) {
+      var direction = directions[i];
+
+      if (direction.toLowerCase() === "departure") {
+        var departureOption = document.createElement("option");
+
+        if (i === 0) {
+          departureOption.selected = "selected";
+        }
+
+        departureOption.value = "departure";
+        departureOption.text = "Départ";
+        select.appendChild(departureOption);
+      }
+
+      if (direction.toLowerCase() === "arrival") {
+        var arrivalOption = document.createElement("option");
+
+        if (i === 0) {
+          arrivalOption.selected = "selected";
+        }
+
+        arrivalOption.value = "arrival";
+        arrivalOption.text = "Arrivée";
+        select.appendChild(arrivalOption);
+      }
+    }
+
+    div.appendChild(select);
+    return div;
+  },
+  // ################################################################### //
+  // ################# Methods to the choice exclusions ################ //
+  // ################################################################### //
+
+  /**
+   * Hidden checkbox for minimizing/maximizing Exclusions Options
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowIsoExclusionsElement: function _createShowIsoExclusionsElement() {
+    var input = document.createElement("input");
+    input.id = this._addUID("GPshowIsoExclusions");
+    input.type = "checkbox";
+    return input;
+  },
+
+  /**
+   * Label to Exclusions Options
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowIsoExclusionsPictoElement: function _createShowIsoExclusionsPictoElement() {
+    var label = document.createElement("label");
+    label.id = this._addUID("GPshowIsoExclusionsPicto");
+    label.className = "GPshowMoreOptionsImage GPshowMoreOptions GPshowIsoExclusionsPicto";
+    label.htmlFor = this._addUID("GPshowIsoExclusions");
+    label.title = "Exclusions";
+    label.style.top = "240px";
+    return label;
+  },
+
+  /**
+   * Create Container to Exclusions
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoPanelFormExclusionsElement: function _createIsoPanelFormExclusionsElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPisoExclusions");
+    var span = document.createElement("span");
+    span.className = "GPisoExclusionsLabel";
+    span.innerHTML = "Passages autorisés";
+    div.appendChild(span); // div.appendChild(this._createIsoPanelFormExclusionOptionsElement());
+
+    return div;
+  },
+
+  /**
+   * Create Exclusions Options
+   * see event !
+   * FIXME event not useful
+   * @param {Array} exclusions - exclusions to display in list
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoPanelFormExclusionOptionsElement: function _createIsoPanelFormExclusionOptionsElement(exclusions) {
+    // contexte d'execution
+    var context = this;
+    var div = document.createElement("div");
+    div.className = "GPisoExclusionsOptions";
+    /* jshint -W083 */
+
+    for (var value in exclusions) {
+      if (exclusions.hasOwnProperty(value)) {
+        var status = exclusions[value];
+
+        switch (value) {
+          case "toll":
+            var inputToll = document.createElement("input");
+            inputToll.id = this._addUID("GPisoExclusionsToll");
+            inputToll.type = "checkbox";
+            inputToll.checked = !status; // gestionnaire d'evenement :
+            // on stocke l'exclusion,
+            // utilisation pour la requête sur le service de calcul d'itiniraire
+
+            if (inputToll.addEventListener) {
+              inputToll.addEventListener("change", function (e) {
+                context.onIsoExclusionsChange(e);
+              });
+            } else if (inputToll.attachEvent) {
+              inputToll.attachEvent("onchange", function (e) {
+                context.onIsoExclusionsChange(e);
+              });
+            } // info : internet explorer support
+
+
+            inputToll.value = "Toll";
+            div.appendChild(inputToll);
+            var labelToll = document.createElement("label");
+            labelToll.className = "GPisoExclusionsOption";
+            labelToll.htmlFor = this._addUID("GPisoExclusionsToll");
+            labelToll.innerHTML = "Péages";
+            div.appendChild(labelToll);
+            break;
+
+          case "tunnel":
+            var inputTunnel = document.createElement("input");
+            inputTunnel.id = this._addUID("GPisoExclusionsTunnel");
+            inputTunnel.type = "checkbox";
+            inputTunnel.checked = !status; // gestionnaire d'evenement :
+            // on stocke l'exclusion,
+            // utilisation pour la requête sur le service de calcul d'itiniraire
+
+            if (inputTunnel.addEventListener) {
+              inputTunnel.addEventListener("change", function (e) {
+                context.onIsoExclusionsChange(e);
+              });
+            } else if (inputTunnel.attachEvent) {
+              inputTunnel.attachEvent("onchange", function (e) {
+                context.onIsoExclusionsChange(e);
+              });
+            } // info : internet explorer support
+
+
+            inputTunnel.value = "Tunnel";
+            div.appendChild(inputTunnel);
+            var labelTunnel = document.createElement("label");
+            labelTunnel.className = "GPisoExclusionsOption";
+            labelTunnel.htmlFor = this._addUID("GPisoExclusionsTunnel");
+            labelTunnel.innerHTML = "Tunnels";
+            div.appendChild(labelTunnel);
+            break;
+
+          case "bridge":
+            var inputBridge = document.createElement("input");
+            inputBridge.id = this._addUID("GPisoExclusionsBridge");
+            inputBridge.type = "checkbox";
+            inputBridge.checked = !status; // gestionnaire d'evenement :
+            // on stocke l'exclusion,
+            // utilisation pour la requête sur le service de calcul d'itiniraire
+
+            if (inputBridge.addEventListener) {
+              inputBridge.addEventListener("change", function (e) {
+                context.onIsoExclusionsChange(e);
+              });
+            } else if (inputBridge.attachEvent) {
+              inputBridge.attachEvent("onchange", function (e) {
+                context.onIsoExclusionsChange(e);
+              });
+            } // info : internet explorer support
+
+
+            inputBridge.value = "Bridge";
+            div.appendChild(inputBridge);
+            var labelBridge = document.createElement("label");
+            labelBridge.className = "GPisoExclusionsOption";
+            labelBridge.htmlFor = this._addUID("GPisoExclusionsBridge");
+            labelBridge.innerHTML = "Ponts";
+            div.appendChild(labelBridge);
+            break;
+        }
+      }
+    }
+
+    return div;
+  },
+  // ################################################################### //
+  // ############################### Submit Form ####################### //
+  // ################################################################### //
+
+  /**
+   * Create Submit Form Element
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoSubmitFormElement: function _createIsoSubmitFormElement() {
+    var input = document.createElement("input");
+    input.id = this._addUID("GPisochronSubmit");
+    input.className = "GPinputSubmit";
+    input.type = "submit";
+    input.value = "Calculer";
+    return input;
+  },
+  // ################################################################### //
+  // ############################### Reset picto ####################### //
+  // ################################################################### //
+
+  /**
+   * Create Reset Picto Element
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createIsoFormResetElement: function _createIsoFormResetElement() {
+    var self = this;
+    var divReset = document.createElement("div");
+    divReset.id = this._addUID("GPisochronReset");
+    divReset.title = "Réinitialiser les paramètres";
+    divReset.addEventListener("click", function (e) {
+      self.onIsoResetClick(e);
+    });
+    return divReset;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (IsoDOM);
+
+/***/ }),
+/* 147 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(40);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(34);
+/* harmony import */ var _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(140);
+/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(36);
+/* harmony import */ var _Common_Utils_MathUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(148);
+/* harmony import */ var _Common_Controls_MousePositionDOM__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(149);
+/* harmony import */ var _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(144);
+/* harmony import */ var _CRS_CRS__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(150);
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+
+
+
+
+
+
+
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__["default"].getLogger("mouseposition");
+/**
+ * @classdesc
+ *
+ * Leaflet Control Class to display Mouse position in various CRS and altitude using the <a href="https://geoservices.ign.fr/documentation/geoservices/alti.html" target="_blank">altimetric web service of the Geoportal Platform</a>.
+ *
+ * Use {@link module:Controls.MousePosition L.geoportalControl.MousePosition()} factory to create instances of that class.
+ *
+ * **Extends** Leaflet <a href="http://leafletjs.com/reference.html#control" target="_blank">L.Control</a> native class.
+ *
+ * @namespace
+ * @alias L.geoportalControl.MousePosition
+ */
+
+var MousePosition = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Control.extend(
+/** @lends L.geoportalControl.MousePosition.prototype */
+{
+  includes: _Common_Controls_MousePositionDOM__WEBPACK_IMPORTED_MODULE_6__["default"],
+
+  /**
+   * options by default
+   *
+   * @private
+   */
+  options: {
+    position: "bottomleft",
+    collapsed: true,
+    units: [],
+    systems: [],
+    displayAltitude: true,
+    displayCoordinates: true,
+    editCoordinates: false,
+    altitude: {
+      triggerDelay: 200,
+      responseDelay: 500,
+      noDataValue: -99999,
+      noDataValueTolerance: 90000,
+      serviceOptions: {}
+    }
+  },
+
+  /**
+   * @constructor MousePosition
+   *
+   * @private
+   * @alias MousePosition
+   * @extends {L.Control}
+   * @param {Object} options - options for function call.
+   * @param {Sting}   [options.apiKey] - API key, mandatory if autoconf service has not been charged in advance
+   * @param {Boolean} [options.ssl = true] - use of ssl or not (default true, service requested using https protocol)
+   * @param {String}  [options.position] - position of component into the map, 'bottomleft' by default
+   * @param {Boolean} [options.collapsed] - collapse mode, false by default
+   * @param {Array}   [options.systems] - list of projection systems, GEOGRAPHIC, MERCATOR, LAMB93 and LAMB2E by default
+   *      Each array element (=system) is an object with following properties :
+   * @param {String}  options.systems.crs - Proj4 crs alias (from proj4 defs). e.g. : "EPSG:4326". Required
+   * @param {String}  [options.systems.label] - CRS label to be displayed in control. Default is crs code (e.g. "EPSG:4326")
+   * @param {String}  [options.systems.type] - CRS units type for coordinates conversion : "Geographical" or "Metric". Default: "Metric"
+   * @param {Object}  [options.systems.geoBBox] - Aera covered by the system (WGS84 coordinates).
+   * @param {Number}  options.systems.geoBBox.right - Right bound.
+   * @param {Number}  options.systems.geoBBox.left - Left bound.
+   * @param {Number}  options.systems.geoBBox.top - Top bound.
+   * @param {Number}  options.systems.geoBBox.bottom - Bottom bound.
+   * @param {Array}   [options.units] - list of units by system, Geographical and Metric by default
+   *      Values may be "DEC" (decimal degrees), "DMS" (sexagecimal), "RAD" (radians) and "GON" (grades) for geographical coordinates,
+   *      and "M" or "KM" for metric coordinates
+   * @param {Boolean} [options.displayAltitude] - active/desactivate the altitude panel, if desactivate, have just the coordinate panel, true by default
+   * @param {Boolean} [options.displayCoordinates] - active/desactivate the coordinate panel, if desactivate, have just the altitude panel, true by default
+   * @param {Boolean} [options.editCoordinates = false] - add edit coordinates options. False by default.
+   * @param {Object}  [options.altitude] - elevation configuration
+   * @param {Object}  [options.altitude.serviceOptions] - options of elevation service
+   * @param {Number}  [options.altitude.responseDelay] - latency for altitude request, 500 ms by default
+   * @param {Number}  [options.altitude.triggerDelay] - immobilisation time of movement on the map to trigger the elevation calculation, 200 ms by default
+   * @param {Number}  [options.altitude.noDataValue] - value used for altitude service no data (default is -99999). In this case, "---m" will be displayed instead of "-99999m"
+   * @param {Number}  [options.altitude.noDataValueTolerance] - tolerance for no data value :
+   *                  values in [noDataValue - noDataValueTolerance ; noDataValue + noDataValueTolerance] interval will not be displayed, but "---m" will be displayed instead.
+   *                  Default is 90000
+   * @example
+   *  var MousePosition = L.geoportalControl.MousePosition({
+   *      position : 'bottomleft',
+   *      collapsed : false,
+   *      displayAltitude : true,
+   *      displayCoordinates : true,
+   *      editCoordinates : false,
+   *      altitude : {
+   *           triggerDelay : 100,
+   *           responseDelay : 500,
+   *           noDataValue : -99999,
+   *           noDataValueTolerance : 90000,
+   *           serviceOptions : {}
+   *      },
+   *      systems : [
+   *       {
+   *          crs : L.CRS.EPSG4326,
+   *          label : "Lon,Lat",
+   *          type : "Geographical"
+   *        },
+   *       {
+   *          crs : L.geoportalCRS.EPSG2154,
+   *          label : "Lambert 93",
+   *          type : "Metric"
+   *        }
+   *      ],
+   *      units : ["DEC", "DMS"]
+   *  });
+   */
+  initialize: function initialize(options) {
+    // on merge les options avec celles par defaut
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(this.options, options); // uuid
+
+    this._uid = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__["default"].generate(); // initialisation des systemes de projections
+
+    this._projectionSystems = [];
+
+    this._initProjectionSystems(); // initialisation des systemes des unités
+
+
+    this._projectionUnits = {};
+
+    this._initProjectionUnits(); // detection du support : desktop ou tactile
+
+
+    this._isDesktop = this._detectSupport(); // on met en place un seuil sur le timer
+
+    if (this.options.altitude.triggerDelay < 100) {
+      this.options.altitude.triggerDelay = 100;
+    } // timer sur le delai d'immobilisation du mouvement
+
+
+    this._timer = this.options.altitude.triggerDelay; // Systeme de projection selectionné (cf. _initProjectionSystems)
+
+    this._currentProjectionSystems = this._projectionSystems[0]; // Container des systemes
+
+    this._projectionSystemsContainer = null;
+    /** Type d'unité de projection selectionnés : Geographical ou Metric (cf._initProjectionSystems ) */
+
+    this._currentProjectionType = this._projectionSystems[0].type; // Unité de projection selectionnés (cf. _initProjectionUnits)
+
+    this._currentProjectionUnits = this._projectionUnits[this._currentProjectionType][0].code; // Container des unités
+
+    this._projectionUnitsContainer = null;
+    /** Container de visualisation du panneau du composant */
+
+    this._showContainer = null;
+    this._pictoContainer = null;
+    this._panelContainer = null;
+    this._panelHeaderContainer = null; // gestion de l'affichage du panneau de l'altitude / coordonnées
+
+    if (!this.options.displayAltitude && !this.options.displayCoordinates) {
+      // on reactive cette option !
+      this.options.displayCoordinates = true;
+    }
+
+    if (!this.options.displayCoordinates) {
+      // si les coordonnées ne sont pas affichées : pas besoin de les éditer...
+      this.options.editCoordinates = false;
+    }
+    /** Edition des coordonnées en cours ou non */
+
+
+    this._isEditing = false;
+    /**
+     * Droit sur le ressource alti.
+     * Par defaut, on n'en s'occupe pas
+     * sauf si l'autoconfiguration est chargée !
+     */
+
+    this._noRightManagement = false; // gestion des droits sur les ressources/services
+    // si l'on souhaite un calcul d'altitude, on verifie
+    // les droits sur les ressources d'alti...
+
+    if (this.options.displayAltitude) {
+      this._checkRightsManagement();
+    } // on transmet les options au controle
+
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.setOptions(this, this.options);
+  },
+
+  /**
+   * this method is called by this.addTo(map) when the control is added on the map
+   * and fills variable 'this._container = this.onAdd(map)',
+   * and create events on map.
+   * @param {Object} map - the map
+   *
+   * @returns {DOMElement} DOM element
+   * @private
+   */
+  onAdd: function onAdd(map) {
+    // initialisation du DOM du composant
+    var container = this._container = this._initLayout(); // on met en place l'evenement sur la carte pour recuperer les coordonnées,
+    // on l'active à l'ouverture du panneau uniquement !
+
+
+    if (!this.options.collapsed) {
+      // this.onShowMousePositionClick();
+      // evenement valable pour le mode desktop !
+      if (this._isDesktop) {
+        map.on("mousemove", this.onMouseMove, this);
+      } else {
+        map.on("move", this.onMapMove, this);
+      }
+    } // deactivate of events that may interfere with the map
+
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomEvent.disableClickPropagation(container).disableScrollPropagation(container); // on stoppe la propagation de l'événement mousemove sur le container
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomEvent.addListener(container, "mousemove", leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomEvent.stopPropagation).addListener(container, "mousemove", leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomEvent.preventDefault);
+    return container;
+  },
+
+  /**
+   * this method is called when the control is removed from the map
+   * and removes events on map.
+   * @param {Object} map - the map
+   *
+   * @private
+   */
+  onRemove: function onRemove(map) {
+    map.off("mousemove", this.onMouseMove);
+  },
+
+  /**
+   * this method is called by the constructor and initialize the projection
+   * systems.
+   * getting coordinates in the requested projection :
+   * see this.onMousePositionProjectionSystemChange()
+   *
+   * @private
+   */
+  _initProjectionSystems: function _initProjectionSystems() {
+    // on donne la possibilité à l'utilisateur de modifier
+    // la liste des systèmes à afficher
+    // Ex. this.options.systems
+    // systemes de projection disponible par defaut
+    var projectionSystemsByDefault = [{
+      label: "G\xE9ographique",
+      crs: leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.CRS.Simple,
+      // L.Projection.LonLat !
+      type: "Geographical"
+    }, {
+      label: "Web Mercator",
+      crs: leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.CRS.EPSG3395,
+      // L.Projection.SphericalMercator !
+      type: "Metric"
+    }, {
+      label: "Lambert 93",
+      crs: _CRS_CRS__WEBPACK_IMPORTED_MODULE_8__["default"].EPSG2154,
+      type: "Metric",
+      geoBBox: {
+        left: -9.86,
+        bottom: 41.15,
+        right: 10.38,
+        top: 51.56
+      }
+    }, {
+      label: "Lambert II \xE9tendu",
+      crs: _CRS_CRS__WEBPACK_IMPORTED_MODULE_8__["default"].EPSG27572,
+      type: "Metric",
+      geoBBox: {
+        left: -4.87,
+        bottom: 42.33,
+        right: 8.23,
+        top: 51.14
+      }
+    }];
+    var systems = this.options.systems;
+
+    for (var i = 0; i < systems.length; i++) {
+      // definition d'un systeme de reference
+      var sys = systems[i];
+
+      if (!sys.label) {
+        logger.error("not defined !");
+        continue;
+      }
+
+      if (!sys.crs) {
+        logger.error("crs not defined !");
+        continue;
+      }
+
+      if (!sys.type) {
+        logger.warn("type srs not defined, use 'Metric' by default !");
+        sys.type = "Metric";
+      }
+
+      this._projectionSystems.push(systems[i]); // it's a just a test ...
+
+
+      var found = false;
+
+      for (var j = 0; j < projectionSystemsByDefault.length; j++) {
+        var obj = projectionSystemsByDefault[j];
+
+        if (sys.crs === obj.crs) {
+          found = true;
+          logger.info("crs '{}' already configured by default", obj.code);
+        }
+      }
+
+      if (!found) {
+        logger.info("crs '{}' not found, it's a new projection", sys.code || sys.label);
+      }
+    } // au cas où...
+
+
+    if (this._projectionSystems.length === 0) {
+      this._projectionSystems = projectionSystemsByDefault;
+    } // re-initilisation des codes pour gerer le lien entre _projectionSystems et select du mouse position (lien code/value)
+
+
+    for (var k = 0; k < this._projectionSystems.length; ++k) {
+      this._projectionSystems[k].code = k;
+    }
+  },
+
+  /**
+   * this method is called by the constructor and initialize the units.
+   * getting coordinates in the requested units :
+   * see this.onMousePositionProjectionUnitsChange()
+   *
+   * @private
+   */
+  _initProjectionUnits: function _initProjectionUnits() {
+    // on donne la possibilité à l'utilisateur de modifier
+    // la liste des unités à afficher
+    // Ex.
+    // this.options.units : ["DEC", "DMS"]
+    // unités disponible par defaut
+    var projectionUnitsByDefault = {
+      Geographical: [{
+        code: "DEC",
+        label: "degrés décimaux",
+        format: this._displayDEC
+      }, {
+        code: "DMS",
+        label: "degrés sexagésimaux",
+        format: this._displayDMS
+      }, {
+        code: "RAD",
+        label: "radians",
+        format: this._displayRAD
+      }, {
+        code: "GON",
+        label: "grades",
+        format: this._displayGON
+      }],
+      Metric: [{
+        code: "M",
+        label: "mètres",
+        format: this._displayMeter
+      }, {
+        code: "KM",
+        label: "kilomètres",
+        format: this._displayKMeter
+      }]
+    };
+    var units = this.options.units;
+
+    for (var type in projectionUnitsByDefault) {
+      if (projectionUnitsByDefault.hasOwnProperty(type)) {
+        var found = false;
+
+        for (var j = 0; j < projectionUnitsByDefault[type].length; j++) {
+          var obj = projectionUnitsByDefault[type][j];
+
+          for (var i = 0; i < units.length; i++) {
+            var unit = units[i];
+
+            if (obj.code === unit) {
+              found = true;
+
+              if (!this._projectionUnits[type]) {
+                this._projectionUnits[type] = [];
+              }
+
+              this._projectionUnits[type].push(obj);
+            }
+          }
+        }
+
+        if (!found) {
+          this._projectionUnits[type] = projectionUnitsByDefault[type];
+        }
+      }
+    } // au cas où...
+
+
+    if (Object.keys(this._projectionUnits).length === 0) {
+      this._projectionUnits = projectionUnitsByDefault;
+    }
+  },
+
+  /**
+   * this method is called by constructor
+   * and check the rights to resources
+   *
+   * @private
+   */
+  _checkRightsManagement: function _checkRightsManagement() {
+    var rightManagement = _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_3__["default"].check({
+      key: this.options.apiKey,
+      resources: ["SERVICE_CALCUL_ALTIMETRIQUE_RSC"],
+      services: ["Elevation"]
+    });
+    this._noRightManagement = !rightManagement; // on recupère les informations utiles
+    // sur ce controle, on ne s'occupe pas de la ressource car elle est unique...
+    // Ex. la clef API issue de l'autoconfiguration si elle n'a pas
+    // été renseignée.
+
+    if (!this.options.apiKey) {
+      this.options.apiKey = rightManagement ? rightManagement.key : null;
+    }
+  },
+
+  /**
+   * this method is called by the constructor.
+   * this information is useful to switch to touch mode.
+   * Detection : test for desktop or tactile
+   *
+   * @returns {Boolean} is desktop
+   * @private
+   */
+  _detectSupport: function _detectSupport() {
+    // TODO
+    // Choix de gérer la détection dans le code du composant au lieu du DOM car :
+    // Utilisation de l'implémentation Leaflet
+    // http://leafletjs.com/reference.html#browser
+    var isDesktop = true;
+    var userAgent = window.navigator.userAgent.toLowerCase();
+
+    if (userAgent.indexOf("iphone") !== -1 || userAgent.indexOf("ipod") !== -1 || userAgent.indexOf("ipad") !== -1 || userAgent.indexOf("android") !== -1 || userAgent.indexOf("mobile") !== -1 || userAgent.indexOf("blackberry") !== -1 || userAgent.indexOf("tablet") !== -1 || userAgent.indexOf("phone") !== -1 || userAgent.indexOf("touch") !== -1) {
+      isDesktop = false;
+    }
+
+    if (userAgent.indexOf("msie") !== -1 || userAgent.indexOf("trident") !== -1) {
+      isDesktop = true;
+    }
+
+    return isDesktop;
+  },
+  // ################################################################### //
+  // ######################## methods handle dom ####################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onAdd(map)
+   * and initialize the container HTMLElement
+   *
+   * @returns {DOMElement} DOM element
+   * @private
+   */
+  _initLayout: function _initLayout() {
+    // create main container
+    var container = this._createMainContainerElement();
+
+    var inputShow = this._showContainer = this._createShowMousePositionElement();
+
+    container.appendChild(inputShow); // mode "collapsed"
+
+    if (!this.options.collapsed) {
+      inputShow.checked = true;
+    }
+
+    var picto = this._pictoContainer = this._createShowMousePositionPictoElement(this._isDesktop);
+
+    container.appendChild(picto);
+
+    var panel = this._panelContainer = this._createMousePositionPanelElement();
+
+    var header = this._panelHeaderContainer = this._createMousePositionPanelHeaderElement();
+
+    panel.appendChild(header);
+
+    var basic = this._createMousePositionPanelBasicElement(this.options.displayAltitude, this.options.displayCoordinates, this.options.editCoordinates);
+
+    panel.appendChild(basic);
+
+    var arraySettings = this._createShowMousePositionSettingsElement(this.options.displayCoordinates);
+
+    for (var j = 0; j < arraySettings.length; j++) {
+      panel.appendChild(arraySettings[j]);
+    }
+
+    var settings = this._createMousePositionSettingsElement();
+
+    var systems = this._projectionSystemsContainer = this._createMousePositionSettingsSystemsElement(this._projectionSystems);
+
+    var units = this._projectionUnitsContainer = this._createMousePositionSettingsUnitsElement(this._projectionUnits[this._currentProjectionType]);
+
+    settings.appendChild(systems);
+    settings.appendChild(units);
+    panel.appendChild(settings);
+    container.appendChild(panel); // ce tag n'est pas à placer dans le container du controle,
+    // mais dans celui de la map !
+
+    var center = this._createMapCenter();
+
+    var map = this._map;
+    map.getContainer().appendChild(center);
+    return container;
+  },
+
+  /**
+   * this method is called by this.()
+   * and it changes the elevation view panel into the dom.
+   * FIXME call by ID !
+   *
+   * @param {Boolean} active - true:active, false:disable
+   *
+   * @private
+   */
+  _setElevationPanel: function _setElevationPanel(active) {
+    var div = null;
+
+    if (!active) {
+      div = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get(this._addUID("GPmousePositionAltitude"));
+      div.style.display = "none";
+    }
+
+    if (active && this._noRightManagement) {
+      div = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get(this._addUID("GPmousePositionAlt"));
+      div.innerHTML = "no right !";
+    }
+  },
+
+  /**
+   * this method is called by this.()
+   * and it changes the coordinate view panel into the dom.
+   * FIXME call by ID !
+   *
+   * @param {Boolean} active - true:active, false:disable
+   *
+   * @private
+   */
+  _setCoordinatePanel: function _setCoordinatePanel(active) {
+    if (!active) {
+      var div = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get(this._addUID("GPmousePositionCoordinate"));
+      div.style.display = "none";
+    }
+  },
+
+  /**
+   * this method is called by this.()
+   * and it changes the settings view panel into the dom.
+   * FIXME call by ID !
+   *
+   * @param {Boolean} active - true:active, false:disable
+   *
+   * @private
+   */
+  _setSettingsPanel: function _setSettingsPanel(active) {
+    if (!active) {
+      var divPicto = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("GPshowMousePositionSettingsPicto");
+      var divPanel = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get(this._addUID("GPmousePositionSettings"));
+      divPicto.style.display = "none";
+      divPanel.style.display = "none";
+    }
+  },
+
+  /**
+   * this method is called by this.onMousePositionProjectionSystemChange()
+   * when changes to a metric or a geographical units.
+   *
+   * @param {String} type - Geographical or Metric
+   *
+   * @private
+   */
+  _setTypeUnitsPanel: function _setTypeUnitsPanel(type) {
+    var container = this._projectionUnitsContainer; // on supprime les enfants...
+
+    while (container.firstChild) {
+      container.removeChild(container.firstChild);
+    }
+
+    var units = this._projectionUnits[type];
+
+    for (var j = 0; j < units.length; j++) {
+      var obj = units[j];
+      var option = document.createElement("option");
+      option.value = obj.code ? obj.code : j;
+      option.text = obj.label || j; // option.label = obj.label;
+
+      container.appendChild(option);
+    }
+
+    var projectionUnits = this._projectionUnits[type][0].code;
+
+    if (this._currentProjectionUnits === "DMS" || projectionUnits === "DMS") {
+      this._resetCoordinateElements(this.options.editCoordinates, type, projectionUnits);
+
+      this._setEditMode(this._isEditing);
+    } // le nouveau type de system ...
+
+
+    this._currentProjectionType = type; // Mise a jour des elements labels et unites
+
+    this._resetLabelElements(type);
+
+    this._resetUnitElements(projectionUnits); // et comme on a changé de type de systeme,
+    // il faut changer aussi d'unité !
+
+
+    this._currentProjectionUnits = this._projectionUnits[type][0].code;
+  },
+  // ################################################################### //
+  // ######################## method units format ###################### //
+  // ################################################################### //
+
+  /**
+   * degreedecimal
+   * @param {Object} oLatLng - coordinates
+   *
+   * @returns {Object} coordinates in decimal
+   * @private
+   */
+  _displayDEC: function _displayDEC(oLatLng) {
+    var coordinate = {};
+    coordinate.lat = _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_7__["default"].roundToDecimal(oLatLng.lat, 6);
+    coordinate.lng = _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_7__["default"].roundToDecimal(oLatLng.lng, 6);
+    coordinate.unit = "°";
+    return coordinate;
+  },
+
+  /**
+   * degreedecimal2sexagecimal
+   * @param {Object} oLatLng - coordinates
+   *
+   * @returns {Object} coordinates in DMS
+   * @private
+   */
+  _displayDMS: function _displayDMS(oLatLng) {
+    var coordinate = {};
+    coordinate.lat = _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_7__["default"].decimalLatToDMS(oLatLng.lat, true);
+    coordinate.lng = _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_7__["default"].decimalLonToDMS(oLatLng.lng, true);
+    return coordinate;
+  },
+
+  /**
+   * degreedecimal2radian
+   * @param {Object} oLatLng - coordinates
+   *
+   * @returns {Object} coordinates in radian
+   * @private
+   */
+  _displayRAD: function _displayRAD(oLatLng) {
+    var coordinate = {};
+    coordinate.lat = _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_7__["default"].decimalToRadian(oLatLng.lat);
+    coordinate.lng = _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_7__["default"].decimalToRadian(oLatLng.lng);
+    coordinate.unit = "rad";
+    return coordinate;
+  },
+
+  /**
+   * degreedecimal2grade
+   * @param {Object} oLatLng - coordinates
+   *
+   * @returns {Object} coordinates in gon
+   * @private
+   */
+  _displayGON: function _displayGON(oLatLng) {
+    var coordinate = {};
+    coordinate.lat = _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_7__["default"].decimalToGrade(oLatLng.lat);
+    coordinate.lng = _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_7__["default"].decimalToGrade(oLatLng.lng);
+    coordinate.unit = "gon";
+    return coordinate;
+  },
+
+  /**
+   * meter
+   * @param {Object} oXY - coordinates
+   *
+   * @returns {Object} coordinates in meters
+   * @private
+   */
+  _displayMeter: function _displayMeter(oXY) {
+    // on recoit toujours des coordonnées metriques
+    var coordinate = {};
+    coordinate.x = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.formatNum(oXY.x, 2);
+    coordinate.y = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.formatNum(oXY.y, 2);
+    coordinate.unit = "m";
+    return coordinate;
+  },
+
+  /**
+   * kilometer
+   * @param {Object} oXY - coordinates
+   *
+   * @returns {Object} coordinates in km
+   * @private
+   */
+  _displayKMeter: function _displayKMeter(oXY) {
+    var coordinate = {};
+    coordinate.x = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.formatNum(oXY.x / 1000, 2);
+    coordinate.y = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.formatNum(oXY.y / 1000, 2);
+    coordinate.unit = "km";
+    return coordinate;
+  },
+  // ################################################################### //
+  // ####################### method system project ##################### //
+  // ################################################################### //
+
+  /**
+   * this method projects a coordinate to a specific projection.
+   * FIXME
+   *
+   * @param {Object} oLatLng - geographic coordinate (L.LatLng)
+   * @param {Object} crs - projection system (ex. GEOGRAPHIC, LAMB93, LAMB2E, MERCATOR, ...)
+   * @returns {Object} oXY - coordinate
+   * @private
+   */
+  _project: function _project(oLatLng, crs) {
+    // cf. http://leafletjs.com/reference.html#iprojection
+    // notre carte est dans la projection par defaut :
+    // Spherical Mercator projection (EPSG:3857)
+    // - GEOGRAPHIC : conversion native, L.CRS.Simple ou L.Projection.LngLat.project(latlng)
+    // - LAMB93 : L.GeoportalCRS.EPSG2154 ou projection.project(latlng)
+    // - LAMB2E : L.GeoportalCRS.EPSG27572 ou projection.project(latlng)
+    // - MERCATOR ou EPSG:3395 : L.CRS.EPSG3395 ou L.Projection.Mercator.project(latlng)
+    if (typeof crs === "function") {
+      // "crs is an function !"... en mode AMD !
+      crs = crs();
+    }
+
+    if (_typeof(crs) !== "object") {
+      logger.log("crs is not an object !");
+      return;
+    } // pas de reprojection pour le systeme de projection natif !
+
+
+    if (crs === leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.CRS.Simple) {
+      return oLatLng;
+    }
+
+    if (!crs.projection || _typeof(crs.projection) !== "object") {
+      logger.error("projection is not an object !");
+      return;
+    }
+
+    var oPoint = crs.projection.project(oLatLng); // FIXME reprojeter du geographique en geographique cause qq problemes
+    // Ex. LatLng en EPSG4326 !
+    // FIXME probleme d'inversion d'axe sur les projections geographiques
+    // Ex. EPSG:4326 -> lat/lon
+    //     IGNF:RGF93G -> lon/lat
+
+    if (this._currentProjectionType === "Geographical") {
+      oPoint.lat = oPoint.y;
+      oPoint.lng = oPoint.x;
+    }
+
+    if (!oPoint || Object.keys(oPoint).length === 0) {
+      logger.error("Failed to project with crs code : " + crs.code);
+    }
+
+    return oPoint;
+  },
+
+  /**
+   * this method unprojects a coordinate to a geographic projection.
+   *
+   * @param {Object} oXY - coordinate
+   * @returns {Object} oLatLng - geographic coordinate (L.LatLng)
+   * @private
+   */
+  _unproject: function _unproject(oXY) {
+    // cf. http://leafletjs.com/reference.html#iprojection
+    // notre carte est dans la projection par defaut :
+    // Spherical Mercator projection (EPSG:3857)
+    // - GEOGRAPHIC : conversion native, L.CRS.Simple ou L.Projection.LngLat.project(latlng)
+    // - LAMB93 : L.GeoportalCRS.EPSG2154 ou projection.project(latlng)
+    // - LAMB2E : L.GeoportalCRS.EPSG27572 ou projection.project(latlng)
+    // - MERCATOR ou EPSG:3395 : L.CRS.EPSG3395 ou L.Projection.Mercator.project(latlng)
+    var oSrs = this._currentProjectionSystems.crs;
+
+    if (!oSrs) {
+      logger.log("system crs not found");
+      return;
+    }
+
+    if (typeof oSrs === "function") {
+      // "crs is an function !"... en mode AMD !
+      oSrs = oSrs();
+    }
+
+    if (_typeof(oSrs) !== "object") {
+      logger.log("crs is not an object !");
+      return;
+    } // pas de reprojection pour le systeme de projection natif !
+
+
+    if (oSrs === leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.CRS.Simple) {
+      return {
+        lat: oXY.y,
+        lng: oXY.x
+      };
+    }
+
+    if (this._currentProjectionType === "Geographical") {
+      return {
+        lat: oXY.y,
+        lng: oXY.x
+      };
+    }
+
+    if (!oSrs.projection || _typeof(oSrs.projection) !== "object") {
+      logger.error("projection is not an object !");
+      return;
+    }
+
+    var oLatLng = oSrs.projection.unproject(oXY);
+
+    if (!oLatLng || Object.keys(oLatLng).length === 0) {
+      logger.error("Failed to unproject coordinate");
+    }
+
+    return oLatLng;
+  },
+  // ################################################################### //
+  // ##################### handlers events to control ################## //
+  // ################################################################### //
+
+  /**
+   * this sends the coordinates to the panel.
+   * (cf. this.GPdisplayCoords() into the DOM functions)
+   *
+   * @param {Object} oLatLng - geographic coordinate (L.LatLng)
+   *
+   * @private
+   */
+  _setCoordinate: function _setCoordinate(oLatLng) {
+    // structure
+    // L.LatLng
+    //     lat: 4.07249425916745
+    //     lng: 2.4609375
+    // type de systeme : Geographical ou Metric
+    var type = this._currentProjectionSystems.type; // on recherche la fonction de formatage dans l'unitée demandée
+
+    var format = null;
+    var units = this._projectionUnits[type];
+
+    for (var i = 0; i < units.length; i++) {
+      if (units[i].code === this._currentProjectionUnits) {
+        format = units[i].format;
+        break;
+      }
+    } // structure pour les coordonnées en fonctin du type demandé :
+    // {x:, y:, unit:} ou {lng:, lat:} ou {lon:, lat:} ou {e:, n:, unit:}...
+
+
+    var coordinate = {}; // on projete le point dans le systeme demandé
+
+    var oSrs = this._currentProjectionSystems.crs;
+
+    if (!oSrs) {
+      logger.error("crs not found !");
+      return;
+    }
+
+    coordinate = format(this._project(oLatLng, oSrs));
+
+    if (!coordinate || Object.keys(coordinate).lenght === 0) {
+      return;
+    }
+
+    this.GPdisplayCoords(coordinate);
+  },
+
+  /**
+   * this sends the coordinates to the panel.
+   * (cf. this.GPdisplayElevation() into the DOM functions)
+   *
+   * @param {Object} oLatLng - geographic coordinate (L.LatLng)
+   *
+   * @private
+   */
+  _setElevation: function _setElevation(oLatLng) {
+    // gestion du timer de la requete du service d'altitude
+    var delay = this.options.altitude.responseDelay;
+    var noDataValue = this.options.altitude.noDataValue;
+    var noDataValueTolerance = this.options.altitude.noDataValueTolerance;
+    this.GPdisplayElevation(oLatLng, delay, noDataValue, noDataValueTolerance);
+  },
+
+  /**
+   * this method is triggered when the mouse or the map is stopped.
+   * (cf. onMouseMove and onMapMove)
+   *
+   * @param {Object} oLatLng - geographic coordinate (L.LatLng)
+   *
+   * @private
+   */
+  onMoveStopped: function onMoveStopped(oLatLng) {
+    // si pas de droit, on ne met pas à jour l'affichage !
+    if (this._noRightManagement) {
+      return;
+    }
+
+    this._setElevation(oLatLng);
+  },
+
+  /**
+   * this method is an handler event to control. The event is 'mousemove' on
+   * the map. The handler sends the coordinates to the panel.
+   * (cf. this.GPdisplayCoords() into the DOM functions)
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onMouseMove: function onMouseMove(e) {
+    var self = this;
+    var oLatLng = e.latlng;
+
+    this._setCoordinate(oLatLng);
+
+    clearTimeout(this._timer);
+    this._timer = setTimeout(function () {
+      self.onMoveStopped(oLatLng);
+    }, this.options.altitude.triggerDelay);
+  },
+
+  /**
+   * this method is an handler event to control. The event is 'moveend' on
+   * the map. The handler sends the coordinates to the panel.
+   * (cf. this.GPdisplayCoords() into the DOM functions)
+   *
+   * @private
+   */
+  onMapMove: function onMapMove() {
+    var self = this;
+    var map = this._map;
+    var oLatLng = map.getCenter();
+
+    this._setCoordinate(oLatLng);
+
+    clearTimeout(this._timer);
+    this._timer = setTimeout(function () {
+      self.onMoveStopped(oLatLng);
+    }, this.options.altitude.triggerDelay);
+  },
+  // ################################################################### //
+  // ####################### handlers events to dom #################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.GPdisplayCoords() in the dom, and
+   * it executes a request to the elevation service.
+   *
+   * @param {Object} coordinate - {lat:..., lng:...}
+   * @param {Function} callback - callback
+   *
+   * @private
+   */
+  onRequestAltitude: function onRequestAltitude(coordinate, callback) {
+    logger.log("onRequestAltitude"); // INFORMATION
+    // on effectue la requête au service d'altitude...
+    // on met en place des callbacks afin de recuperer les resultats ou
+    // les messages d'erreurs du service.
+    // le resultat est affiché dans une balise du dom.
+    // les messages d'erreurs sont affichés sur la console (?)
+
+    if (!coordinate || Object.keys(coordinate).length === 0) {
+      return;
+    } // si on ne veut pas de calcul d'altitude, on ne continue pas !
+
+
+    if (!this.options.displayAltitude) {
+      return;
+    } // si on n'a pas les droits sur la ressource, pas la peine de
+    // continuer !
+
+
+    if (this._noRightManagement) {
+      return;
+    }
+
+    logger.log(coordinate);
+    var options = {}; // on recupere les options du service
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, this.options.altitude.serviceOptions); // ainsi que les coordonnées
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      zonly: true,
+      positions: [{
+        lon: coordinate.lon || coordinate.lng,
+        lat: coordinate.lat
+      }]
+    }); // et les callbacks
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      scope: this,
+      // callback onSuccess
+      onSuccess: function onSuccess(results) {
+        logger.log(results);
+
+        if (results && Object.keys(results)) {
+          // var context = this.options.scope;
+          // context._setAltidude(results.elevations[0].z);
+          callback.call(this, results.elevations[0].z);
+        }
+      },
+      // callback onFailure
+      onFailure: function onFailure(error) {
+        logger.error(error.message);
+      }
+    }); // cas où la clef API n'est pas renseignée dans les options du service,
+    // on utilise celle de l'autoconf ou celle renseignée au niveau du controle
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      apiKey: options.apiKey || this.options.apiKey
+    }); // si l'utilisateur a spécifié le paramètre ssl au niveau du control, on s'en sert
+    // true par défaut (https)
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      ssl: this.options.ssl
+    });
+    logger.log(options);
+    geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__["default"].Services.getAltitude(options);
+  },
+
+  /**
+   * this method is called by event 'click' on 'GPshowMousePositionPicto' tag label
+   * (cf. this._createShowMousePositionPictoElement),
+   * and toggles event 'mousemove' on map.
+   * FIXME
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onShowMousePositionClick: function onShowMousePositionClick(e) {
+    logger.log(e); // checked : true - panel close
+    // checked : false - panel open
+
+    var map = this._map; // evenement declenché à l'ouverture/fermeture du panneau,
+    // et en fonction du mode : desktop ou tactile !
+
+    if (this._showContainer.checked) {
+      this._isDesktop ? map.off("mousemove", this.onMouseMove, this) : map.off("move", this.onMapMove, this);
+    } else {
+      this._isDesktop ? map.on("mousemove", this.onMouseMove, this) : map.on("move", this.onMapMove, this);
+    } // on gère l'affichage des panneaux ici...,
+    // même si ce n'est pas l'endroit adequate...
+
+
+    this._setElevationPanel(this.options.displayAltitude);
+
+    this._setCoordinatePanel(this.options.displayCoordinates);
+
+    if (!this.options.displayCoordinates) {
+      this._setSettingsPanel(false);
+    }
+  },
+
+  /**
+   * this method is called by event 'click' on input coordinate
+   *
+   * @param {Boolean} editing - editing mode
+   * @private
+   */
+  onMousePositionEditModeClick: function onMousePositionEditModeClick(editing) {
+    if (!this.options.editCoordinates) {
+      return;
+    }
+
+    if (this._isEditing === editing) {
+      return;
+    }
+
+    this._isEditing = editing; // Affichage des outils, input en ecriture
+
+    this._setEditMode(this._isEditing);
+
+    var map = this._map;
+
+    if (this._isDesktop) {
+      this._isEditing ? map.off("mousemove", this.onMouseMove, this) : map.on("mousemove", this.onMouseMove, this);
+    } else {
+      this._isEditing ? map.off("move", this.onMapMove, this) : map.on("move", this.onMapMove, this);
+    }
+  },
+
+  /**
+   * Convert Coordinate value : km to meters, radians, grades to decimal degrees
+   * @param {Number} value - value to convert
+   * @param {String} unit - unit
+   *
+   * @returns {Number} converted value
+   * @private
+   */
+  _convertCoordinate: function _convertCoordinate(value, unit) {
+    var result;
+
+    if (unit === "DEC" || unit === "DMS") {
+      // DMS est converti en DEC !
+      result = value;
+    } else if (unit === "M") {
+      result = value;
+    } else if (unit === "KM") {
+      result = value * 1000;
+    } else if (unit === "RAD") {
+      var rd = (180 / Math.PI).toFixed(20);
+      result = (value * rd).toFixed(20);
+    } else if (unit === "GON") {
+      var d = (9 / 10).toFixed(20);
+      result = (value * d).toFixed(20);
+    }
+
+    return result;
+  },
+
+  /**
+   * Validate Extend coordinate
+   *
+   * @param {String} coordType - Lat or Lon
+   * @param {String} value - coordinate
+   * @param {Event} e - event
+   * @returns {Boolean} value is within extent
+   */
+  validateExtentCoordinate: function validateExtentCoordinate(coordType, value, e) {
+    // FIXME pas de validation...
+    if (e !== undefined) {
+      return true;
+    }
+
+    if (["Lon", "Lat"].indexOf(coordType) === -1) {
+      return false;
+    }
+
+    var geoBBox = this._currentProjectionSystems.geoBBox;
+
+    if (geoBBox === undefined) {
+      return true;
+    }
+
+    if (geoBBox) {
+      // check if coordinates are in the extent
+      var extent = [geoBBox.left, geoBBox.bottom, geoBBox.right, geoBBox.top];
+      var unit = this._currentProjectionUnits; // on convertit un point..., mais on n'a pas de fonction
+      // de conversion comme pour openlayers...
+
+      var oLatLon = this._unproject({
+        x: coordType === "Lon" ? this._convertCoordinate(value, unit) : 0,
+        y: coordType === "Lat" ? this._convertCoordinate(value, unit) : 0
+      });
+
+      if (coordType === "Lon" && (oLatLon.lng < extent[0] || oLatLon.lng > extent[2])) {
+        logger.warn("coordinates (lon) out of extent !?");
+        return false;
+      }
+
+      if (coordType === "Lat" && (oLatLon.lat < extent[1] || oLatLon.lat > extent[3])) {
+        logger.warn("coordinates (lat) out of extent !?");
+        return false;
+      }
+    }
+
+    return true;
+  },
+
+  /**
+   * Get coordinate from inputs and select in decimal degrees
+   *
+   * @param {String} coordType - "Lon" or "Lat"
+   * @returns {String} coordinate
+   * @private
+   */
+  _getCoordinate: function _getCoordinate(coordType) {
+    var inputDegrees = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get(this._addUID("GPmousePosition" + coordType + "Degrees"));
+    var degrees = inputDegrees.value;
+
+    if (!degrees) {
+      return null;
+    }
+
+    degrees = degrees.replace(",", ".");
+
+    if (!_Common_Utils_MathUtils__WEBPACK_IMPORTED_MODULE_5__["default"].isInteger(degrees)) {
+      return null;
+    }
+
+    var result = _Common_Utils_MathUtils__WEBPACK_IMPORTED_MODULE_5__["default"].toInteger(degrees);
+
+    if (result < Number(inputDegrees.dataset.min) || result > Number(inputDegrees.dataset.max)) {
+      return null;
+    }
+
+    var direction = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get(this._addUID("GPmousePosition" + coordType + "Direction")).value;
+    var inputMinutes = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get(this._addUID("GPmousePosition" + coordType + "Minutes"));
+    var minutes = inputMinutes.value;
+
+    if (minutes) {
+      minutes = minutes.replace(",", ".");
+
+      if (_Common_Utils_MathUtils__WEBPACK_IMPORTED_MODULE_5__["default"].isInteger(minutes)) {
+        var mins = _Common_Utils_MathUtils__WEBPACK_IMPORTED_MODULE_5__["default"].toInteger(minutes);
+
+        if (mins >= Number(inputMinutes.dataset.min) && mins <= Number(inputMinutes.dataset.max)) {
+          result += mins / 60;
+        }
+      }
+    }
+
+    var inputSeconds = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get(this._addUID("GPmousePosition" + coordType + "Seconds"));
+    var seconds = inputSeconds.value;
+
+    if (seconds) {
+      seconds = seconds.replace(",", ".");
+      var secs = _Common_Utils_MathUtils__WEBPACK_IMPORTED_MODULE_5__["default"].toFloat(seconds);
+
+      if (secs && secs >= Number(inputSeconds.dataset.min) && secs <= Number(inputSeconds.dataset.max)) {
+        result += secs / 3600;
+      }
+    }
+
+    if (direction === "O" || direction === "S") {
+      result = -result;
+    }
+
+    return result;
+  },
+
+  /**
+   * locate DMS coordinates on map
+   *
+   * @private
+   */
+  _locateDMSCoordinates: function _locateDMSCoordinates() {
+    // on est toujours en coordonnées geographiques...
+    var oLatLon = {
+      lat: this._getCoordinate("Lat"),
+      lng: this._getCoordinate("Lon")
+    };
+
+    if (!this.validateExtentCoordinate("Lon", oLatLon.lng)) {
+      return;
+    }
+
+    if (!this.validateExtentCoordinate("Lat", oLatLon.lat)) {
+      return;
+    } // FIXME https://github.com/Leaflet/Leaflet/issues/922
+
+
+    var map = this._map;
+    map.panTo(oLatLon);
+  },
+
+  /**
+   * locate coordinates on map (not DMS)
+   *
+   * @private
+   */
+  _locateCoordinates: function _locateCoordinates() {
+    // soit longitude ou soit y
+    var lonYDom = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get(this._addUID("GPmousePositionLon")).value;
+    lonYDom = lonYDom.replace(",", ".");
+    lonYDom = parseFloat(lonYDom);
+
+    if (isNaN(lonYDom)) {
+      return;
+    } // soit lattitude ou soit x
+
+
+    var latXDom = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get(this._addUID("GPmousePositionLat")).value;
+    latXDom = latXDom.replace(",", ".");
+    latXDom = parseFloat(latXDom);
+
+    if (isNaN(latXDom)) {
+      return;
+    }
+
+    var lon = null;
+    var lat = null;
+    var x = null;
+    var y = null;
+
+    if (this._currentProjectionType === "Geographical") {
+      lon = lonYDom;
+      lat = latXDom;
+    } else {
+      x = latXDom;
+      y = lonYDom;
+    }
+
+    if (!this.validateExtentCoordinate("Lon", lon || x)) {
+      return;
+    }
+
+    if (!this.validateExtentCoordinate("Lat", lat || y)) {
+      return;
+    }
+
+    var unit = this._currentProjectionUnits;
+
+    var oLatLon = this._unproject({
+      x: this._convertCoordinate(lon !== null ? lon : x, unit),
+      y: this._convertCoordinate(lat !== null ? lat : y, unit)
+    }); // FIXME https://github.com/Leaflet/Leaflet/issues/922
+
+
+    var map = this._map;
+    map.panTo(oLatLon);
+  },
+
+  /**
+   * locate coordinates on map
+   *
+   * @method locate
+   * @private
+   */
+  onMousePositionEditModeLocateClick: function onMousePositionEditModeLocateClick() {
+    if (!this.options.editCoordinates) {
+      return;
+    }
+
+    if (!this._isEditing) {
+      this.onMousePositionEditModeClick(true);
+      return;
+    }
+
+    this._currentProjectionUnits === "DMS" ? this._locateDMSCoordinates() : this._locateCoordinates();
+  },
+
+  /**
+   * this method is called by event 'change' on 'GPmousePositionProjectionSystem'
+   * tag select (cf. this._createMousePositionSettingsElement),
+   * and selects the system projection.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onMousePositionProjectionSystemChange: function onMousePositionProjectionSystemChange(e) {
+    logger.log("onMousePositionProjectionSystemChange", e);
+    var idx = e.target.selectedIndex; // index
+
+    var value = e.target.options[idx].value; // crs, ex. MERCATOR (optionnel)
+
+    var label = e.target.options[idx].label; // etiquette, ex Géographiques
+
+    logger.log(idx, value, label);
+
+    this._setCurrentSystem(value);
+  },
+
+  /**
+   * this method selects the current system projection.
+   *
+   * @param {Object} systemCode - inner code (rank in array _projectionSystems)
+   *
+   * @private
+   */
+  _setCurrentSystem: function _setCurrentSystem(systemCode) {
+    // si on change de type de systeme, on doit aussi changer le type d'unités !
+    var type = null;
+
+    for (var i = 0; i < this._projectionSystems.length; ++i) {
+      if (this._projectionSystems[i].code === Number(systemCode)) {
+        type = this._projectionSystems[i].type;
+        break;
+      }
+    }
+
+    if (!type) {
+      logger.log("system not found in projection systems container");
+      return;
+    }
+
+    if (type !== this._currentProjectionType) {
+      this._setTypeUnitsPanel(type);
+    } // on enregistre le systeme courrant
+
+
+    this._currentProjectionSystems = this._projectionSystems[Number(systemCode)]; // on simule un deplacement en mode tactile pour mettre à jour les
+    // resultats
+
+    if (!this._isDesktop) {
+      this.onMapMove();
+    }
+  },
+
+  /**
+   * this method is called by event 'mouseover' on 'GPmousePositionProjectionSystem'
+   * tag select (cf. this._createMousePositionSettingsElement),
+   * and selects the system projection.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onMousePositionProjectionSystemMouseOver: function onMousePositionProjectionSystemMouseOver(e) {
+    logger.log("onMousePositionProjectionSystemMouseOver", e);
+    var map = this._map;
+
+    if (!map) {
+      return;
+    } // clear select
+
+
+    var systemList = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get(this._addUID("GPmousePositionProjectionSystem"));
+    systemList.innerHTML = ""; // add systems whose extent intersects the map extent
+
+    for (var j = 0; j < this._projectionSystems.length; j++) {
+      var proj = this._projectionSystems[j];
+      var option = null;
+
+      if (proj.geoBBox) {
+        // bboxes intersection test
+        if (map.getBounds()._southWest.lng > proj.geoBBox.right || map.getBounds()._southWest.lat > proj.geoBBox.top || map.getBounds()._northEast.lng < proj.geoBBox.left || map.getBounds()._northEast.lat < proj.geoBBox.bottom) {
+          if (proj === this._currentProjectionSystems) {
+            option = document.createElement("option");
+            option.value = proj.code;
+            option.text = proj.label || j;
+            option.setAttribute("selected", "selected");
+            option.setAttribute("disabled", "disabled");
+            systemList.appendChild(option);
+          }
+
+          continue; // do not intersect
+        }
+      }
+
+      option = document.createElement("option");
+      option.value = proj.code;
+      option.text = proj.label || j;
+
+      if (proj === this._currentProjectionSystems) {
+        option.setAttribute("selected", "selected");
+      }
+
+      systemList.appendChild(option);
+    }
+  },
+
+  /**
+   * this method is called by event 'change' on 'GPmousePositionProjectionUnits'
+   * tag select (cf. this._createMousePositionSettingsElement),
+   * and selects the units projection.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onMousePositionProjectionUnitsChange: function onMousePositionProjectionUnitsChange(e) {
+    logger.log("onMousePositionProjectionUnitsChange", e);
+    var idx = e.target.selectedIndex;
+    var value = e.target.options[idx].value;
+    var label = e.target.options[idx].label;
+    logger.log(idx, value, label);
+    var oldProjectionUnits = this._currentProjectionUnits;
+    var newProjectionUnits = this._currentProjectionUnits = value;
+    var newProjectionType = this._currentProjectionType; // Mise a jour des elements lebels et unites
+
+    this._resetLabelElements(newProjectionType);
+
+    this._resetUnitElements(newProjectionUnits); // mise a jour des inputs pour les coordonnees
+
+
+    if (oldProjectionUnits === "DMS" || newProjectionUnits === "DMS") {
+      this._resetCoordinateElements(this.options.editCoordinates, newProjectionType, newProjectionUnits);
+
+      this._setEditMode(this._isEditing);
+    } // on simule un deplacement en mode tactile pour mettre à jour les
+    // resultats
+
+
+    if (!this._isDesktop) {
+      this.onMapMove();
+    }
+  },
+  // ################################################################### //
+  // ###### METHODES PUBLIQUES (INTERFACE AVEC LE CONTROLE) ############ //
+  // ################################################################### //
+
+  /**
+   * This method is public.
+   * It allows to control the execution of a movement.
+   *
+   * @param {Object} position - position = {lon: , lat: }
+   * @param {Number} zoom - zoom
+   * @param {Object} options - Zoom/pan options
+   */
+  moveTo: function moveTo(position, zoom, options) {
+    if (!this._showContainer.checked) {
+      this._pictoContainer.click();
+    }
+
+    var map = this._map;
+
+    if (!map) {
+      return;
+    }
+
+    this.onMouseMove({
+      latlng: position
+    });
+    map.flyTo(position, zoom || 10, options || {});
+  }
+});
+/* harmony default export */ __webpack_exports__["default"] = (MousePosition);
+
+/***/ }),
+/* 148 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/**
+* @module MathUtils
+* @alias Gp.MathUtils
+* @description
+* ...
+*
+* @example
+* modulo();
+* decimalToDMS();
+* toInteger();
+* isInteger();
+* toFloat();
+*/
+var MathUtils = {
+  /**
+   * Reste de la division euclidienne
+   * @param {Number} a - divisor
+   * @param {Number} b - quotient
+   * @returns {Number} Modulo
+   */
+  modulo: function modulo(a, b) {
+    var r = a % b;
+    return r * b < 0 ? r + b : r;
+  },
+
+  /**
+   * Transform degrees, minutes, seconds form decimal degrees -
+   * Largely inspired by the private function degreesToStringHDMS from ol/coordinate.js
+   *
+   * @param {Number} degrees - decimal degrees
+   * @param {Array} hemispheres - "NS" ou "EO"
+   * @param {Number} numDigits - number of digits for seconds
+   * @returns {Object} DMS coordinate
+   */
+  decimalToDMS: function decimalToDMS(degrees, hemispheres, numDigits) {
+    var normalizedDegrees = this.modulo(degrees + 180, 360) - 180;
+    var x = Math.abs(3600 * normalizedDegrees);
+    var dflPrecision = numDigits || 0;
+    var precision = Math.pow(10, dflPrecision);
+    var deg = Math.floor(x / 3600);
+    var min = Math.floor((x - deg * 3600) / 60);
+    var sec = x - deg * 3600 - min * 60;
+    sec = Math.ceil(sec * precision) / precision;
+
+    if (sec >= 60) {
+      sec = 0;
+      min += 1;
+    }
+
+    if (min >= 60) {
+      min = 0;
+      deg += 1;
+    }
+
+    var direction = hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0);
+    return {
+      d: deg,
+      m: min,
+      s: sec,
+      direction: direction
+    };
+  },
+
+  /**
+   * Converts string to Integer
+   *
+   * @param {String} s - string number
+   * @param {Numeric} base - between 2 and 36
+   * @returns {null|Numeric} result
+   */
+  toInteger: function toInteger(s, base) {
+    var _base = base || 10;
+
+    var n = parseInt(s, _base);
+
+    if (!isNaN(n) && isFinite(n)) {
+      return n;
+    }
+
+    return null;
+  },
+
+  /**
+   * check if s represents an integer
+   *
+   * @param {String} s - string number
+   * @returns {Boolean} is integer
+   */
+  isInteger: function isInteger(s) {
+    if (isNaN(s)) {
+      return false;
+    }
+
+    var v = parseFloat(s);
+    return (v | 0) === v;
+  },
+
+  /**
+   * Converts s to float
+   *
+   * @param {String} s - string number
+   * @returns {null|Numeric} result
+   */
+  toFloat: function toFloat(s) {
+    var n = parseFloat(s);
+
+    if (!isNaN(n) && isFinite(n)) {
+      return n;
+    }
+
+    return null;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (MathUtils);
+
+/***/ }),
+/* 149 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+var MousePositionDOM = {
+  /**
+  * Add uuid to the tag ID
+  * @param {String} id - id selector
+  * @returns {String} uid - id selector with an unique id
+  */
+  _addUID: function _addUID(id) {
+    var uid = this._uid ? id + "-" + this._uid : id;
+    return uid;
+  },
+
+  /**
+   * Main container (DOM)
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createMainContainerElement: function _createMainContainerElement() {
+    var container = document.createElement("div");
+    container.id = this._addUID("GPmousePosition");
+    container.className = "GPwidget";
+    return container;
+  },
+  // ################################################################### //
+  // ################### Methods of main container ##################### //
+  // ################################################################### //
+
+  /**
+   * Hidden checkbox for minimizing/maximizing
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowMousePositionElement: function _createShowMousePositionElement() {
+    var input = document.createElement("input");
+    input.id = this._addUID("GPshowMousePosition");
+    input.type = "checkbox";
+    return input;
+  },
+
+  /**
+   * Show mouse position control
+   * @param {Boolean} isDesktop - specifies if the support is desktop or tactile
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowMousePositionPictoElement: function _createShowMousePositionPictoElement(isDesktop) {
+    // contexte d'execution
+    var self = this;
+    var label = document.createElement("label");
+    label.id = this._addUID("GPshowMousePositionPicto");
+    label.className = "GPshowAdvancedToolPicto";
+    label.htmlFor = this._addUID("GPshowMousePosition");
+    label.title = "Afficher les coordonnées du curseur"; // FIXME detection disponible dans le JS !
+    // Detection : test for desktop or tactile
+    // var isDesktop = true;
+    // var userAgent = window.navigator.userAgent.toLowerCase();
+    // if (userAgent.indexOf("iphone") !== -1 ||
+    // userAgent.indexOf("ipod") !== -1 ||
+    // userAgent.indexOf("ipad") !== -1 ||
+    // userAgent.indexOf("android") !== -1 ||
+    // userAgent.indexOf("mobile") !== -1 ||
+    // userAgent.indexOf("blackberry") !== -1 ||
+    // userAgent.indexOf("tablet") !== -1 ||
+    // userAgent.indexOf("phone") !== -1 ||
+    // userAgent.indexOf("touch") !== -1 ) {
+    //     isDesktop = false;
+    // }
+    // if (userAgent.indexOf("msie") !== -1 ||
+    // userAgent.indexOf("trident") !== -1) {
+    //     isDesktop = true;
+    // }
+    // Show map center localisation if panel opened and tactile support
+
+    label.addEventListener("click", function (e) {
+      var mapCenterClass = "";
+
+      if (!document.getElementById(self._addUID("GPshowMousePosition")).checked && !isDesktop) {
+        mapCenterClass = "GPmapCenterVisible";
+      }
+
+      document.getElementById("GPmapCenter").className = mapCenterClass;
+      self.onShowMousePositionClick(e);
+    });
+    var spanOpen = document.createElement("span");
+    spanOpen.id = this._addUID("GPshowMousePositionOpen");
+    spanOpen.className = "GPshowAdvancedToolOpen";
+    label.appendChild(spanOpen);
+    return label;
+  },
+
+  /**
+   * mouse position panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createMousePositionPanelElement: function _createMousePositionPanelElement() {
+    var panel = document.createElement("div");
+    panel.id = this._addUID("GPmousePositionPanel");
+    panel.className = "GPpanel"; // FIXME on decompose la fonction pour les besoins du controle,
+    // on ajoutera ces childs à la main...
+    // div.appendChild(this._createMousePositionPanelHeaderElement());
+    // div.appendChild(this._createMousePositionPanelBasicElement());
+    // div.appendChild(this._createShowMousePositionSettingsElement());
+    // div.appendChild(this._createMousePositionSettingsElement());
+
+    return panel;
+  },
+
+  /**
+   * Map center localisation (tactile use)
+   *
+   * @returns {DOMElement} container
+   */
+  _createMapCenter: function _createMapCenter() {
+    var div = document.createElement("div");
+    div.id = "GPmapCenter";
+    div.className = "";
+    return div;
+  },
+  // ################################################################### //
+  // ####################### Panel container ########################### //
+  // ################################################################### //
+
+  /**
+   * @returns {DOMElement} container
+   */
+  _createMousePositionPanelHeaderElement: function _createMousePositionPanelHeaderElement() {
+    var container = document.createElement("div");
+    container.className = "GPpanelHeader";
+    var divTitle = document.createElement("div");
+    divTitle.className = "GPpanelTitle";
+    divTitle.innerHTML = "Coordonnées";
+    container.appendChild(divTitle);
+    var divClose = document.createElement("div");
+    divClose.id = "GPmousePositionPanelClose";
+    divClose.className = "GPpanelClose";
+    divClose.title = "Fermer le panneau"; // Link panel close / visibility checkbox
+
+    var self = this;
+
+    if (divClose.addEventListener) {
+      divClose.addEventListener("click", function () {
+        document.getElementById(self._addUID("GPshowMousePositionPicto")).click();
+      }, false);
+    } else if (divClose.attachEvent) {
+      divClose.attachEvent("onclick", function () {
+        document.getElementById(self._addUID("GPshowMousePositionPicto")).click();
+      });
+    }
+
+    container.appendChild(divClose);
+    return container;
+  },
+
+  /**
+   * coordinate panel
+   * @param {Boolean} [displayAltitude] - specifies if the altitude panel must be displayed
+   * @param {Boolean} [displayCoordinates] - specifies if the coordinates panel must be displayed
+   * @param {Boolean} [editCoordinates] - specifies if the coordinates edition is allowed
+   * @param {Boolean} [currentProjectionUnits] - specifies if the current projection units
+   *
+   * FIXME
+   * call this._createMousePositionPanelBasicCoordinateElement
+   * call this._createMousePositionPanelBasicAltitudeElement
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createMousePositionPanelBasicElement: function _createMousePositionPanelBasicElement(displayAltitude, displayCoordinates, editCoordinates, currentProjectionUnits) {
+    // default Values
+    displayAltitude = typeof displayAltitude === "undefined" ? true : displayAltitude;
+    displayCoordinates = typeof displayCoordinates === "undefined" ? true : displayCoordinates;
+    editCoordinates = typeof editCoordinates === "undefined" ? false : editCoordinates;
+    var container = document.createElement("div");
+    container.id = this._addUID("GPmousePositionBasicPanel"); // FIXME on devrait decomposer la fonction pour les besoins du controle,
+    // on ajoutera ces childs à la main...
+
+    container.appendChild(this._createMousePositionPanelBasicCoordinateElement(displayCoordinates, editCoordinates, currentProjectionUnits));
+    container.appendChild(this._createMousePositionPanelEditToolsElement(editCoordinates));
+    container.appendChild(this._createMousePositionPanelBasicAltitudeElement(displayAltitude));
+    return container;
+  },
+
+  /**
+   * create coordinate elements
+   *
+   * @param {String} coordType - ("Lon" ou "Lat")
+   * @param {Boolean} [editCoordinates=false] - specifies if the coordinates edition is allowed
+   *
+   * @returns {Array} list of DOM elements
+   */
+  _createCoordinateElement: function _createCoordinateElement(coordType, editCoordinates) {
+    var context = this;
+
+    if (["Lon", "Lat"].indexOf(coordType) === -1) {
+      return [];
+    }
+
+    var list = [];
+    var input = document.createElement("input");
+    input.id = this._addUID("GPmousePosition" + coordType);
+    input.title = editCoordinates === true ? "Cliquer pour saisir des coordonnées" : "";
+    input.readOnly = true;
+
+    if (editCoordinates) {
+      input.addEventListener("click", function () {
+        context.onMousePositionEditModeClick(true);
+      });
+      input.addEventListener("change", function (e) {
+        this.classList.remove("error");
+        var valid = context.validateExtentCoordinate(coordType, this.value, e);
+        valid ? this.classList.remove("error") : this.classList.add("error");
+      });
+    }
+
+    list.push(input);
+    var span = document.createElement("span");
+    span.className = "GPmousePositionUnits";
+    list.push(span);
+    return list;
+  },
+
+  /**
+   *
+   * @param {String} coordType - ("Lon" ou "Lat")
+   * @param {Boolean} [editCoordinates=false] - specifies if the coordinates edition is allowed
+   *
+   * @returns {Array} list of DOM elements
+   */
+  _createDMSCoordinateElement: function _createDMSCoordinateElement(coordType, editCoordinates) {
+    if (["Lon", "Lat"].indexOf(coordType) === -1) {
+      return [];
+    }
+
+    var context = this;
+    var list = [];
+    var input = document.createElement("input");
+    input.id = this._addUID("GPmousePosition" + coordType + "Degrees");
+    input.className = "GPSexagesimal";
+    input.setAttribute("name", "degrees");
+    input.title = editCoordinates === true ? "Cliquer pour saisir des coordonnées" : "";
+    input.readOnly = true;
+    input.dataset.min = 0;
+    input.dataset.max = coordType === "Lon" ? 180 : 90;
+
+    if (editCoordinates) {
+      input.addEventListener("click", function () {
+        context.onMousePositionEditModeClick(true);
+      });
+      input.addEventListener("change", function () {
+        this.classList.remove("error");
+
+        var valid = context._checkDMSDegrees(coordType, this);
+
+        valid ? this.classList.remove("error") : this.classList.add("error");
+      });
+    }
+
+    list.push(input);
+    var span = document.createElement("span");
+    span.className = "GPmousePositionSexagesimalLabel";
+    span.innerHTML = "°";
+    list.push(span);
+    var input1 = document.createElement("input");
+    input1.id = this._addUID("GPmousePosition" + coordType + "Minutes");
+    input1.className = "GPSexagesimal";
+    input1.setAttribute("name", "minutes");
+    input1.title = editCoordinates === true ? "Cliquer pour saisir des coordonnées" : "";
+    input1.readOnly = true;
+    input1.dataset.min = 0;
+    input1.dataset.max = 59;
+
+    if (editCoordinates) {
+      input1.addEventListener("click", function () {
+        context.onMousePositionEditModeClick(true);
+      });
+      input1.addEventListener("change", function () {
+        this.classList.remove("error");
+
+        var valid = context._checkDMSElement(this);
+
+        valid ? this.classList.remove("error") : this.classList.add("error");
+      });
+    }
+
+    list.push(input1);
+    var span1 = document.createElement("span");
+    span1.className = "GPmousePositionSexagesimalLabel";
+    span1.innerHTML = "'";
+    list.push(span1);
+    var input2 = document.createElement("input");
+    input2.id = this._addUID("GPmousePosition" + coordType + "Seconds");
+    input2.className = "GPSexagesimalsec";
+    input2.setAttribute("name", "seconds");
+    input2.title = editCoordinates === true ? "Cliquer pour saisir des coordonnées" : "";
+    input2.readOnly = true;
+    input2.dataset.min = 0;
+    input2.dataset.max = 59;
+
+    if (editCoordinates) {
+      input2.addEventListener("click", function () {
+        context.onMousePositionEditModeClick(true);
+      });
+      input2.addEventListener("change", function () {
+        this.classList.remove("error");
+
+        var valid = context._checkDMSElement(this, true);
+
+        valid ? this.classList.remove("error") : this.classList.add("error");
+      });
+    }
+
+    list.push(input2);
+    var span2 = document.createElement("span");
+    span2.className = "GPmousePositionSexagesimalLabel";
+    span2.innerHTML = "''";
+    list.push(span2);
+    var select = document.createElement("select");
+    select.id = this._addUID("GPmousePosition" + coordType + "Direction");
+    select.className = "GPmousePositionDirection";
+    select.setAttribute("name", "direction");
+    select.disabled = true;
+    var option = document.createElement("option");
+    option.value = coordType === "Lon" ? "E" : "N";
+    option.innerHTML = coordType === "Lon" ? "E" : "N";
+    select.appendChild(option);
+    var option1 = document.createElement("option");
+    option1.value = coordType === "Lon" ? "O" : "S";
+    option1.innerHTML = coordType === "Lon" ? "O" : "S";
+    select.appendChild(option1);
+    list.push(select);
+    return list;
+  },
+
+  /**
+   * @param {Boolean} [display=false] - specifies if the coordinates panel must be displayed
+   * @param {Boolean} [editCoordinates] - specifies if the coordinates edition is allowed
+   * @param {Boolean} [currentProjectionUnits] - specifies if the current projection units
+   *
+   * @returns {DOMElement} container
+   */
+  _createMousePositionPanelBasicCoordinateElement: function _createMousePositionPanelBasicCoordinateElement(display, editCoordinates, currentProjectionUnits) {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPmousePositionCoordinate");
+    div.style.display = display ? "block" : "none"; // latitude
+
+    var divLat = document.createElement("div");
+    var spanLat = document.createElement("span");
+    spanLat.className = "GPmousePositionLabel";
+    spanLat.id = this._addUID("GPmousePositionLatLabel");
+    spanLat.innerHTML = "Latitude : ";
+    divLat.appendChild(spanLat);
+    var span = document.createElement("span");
+    span.id = this._addUID("GPmousePositionLatCoordinate");
+    var arrayCoords;
+
+    if (currentProjectionUnits === "DMS") {
+      arrayCoords = this._createDMSCoordinateElement("Lat", editCoordinates);
+    } else {
+      arrayCoords = this._createCoordinateElement("Lat", editCoordinates);
+    }
+
+    for (var i = 0; i < arrayCoords.length; i++) {
+      span.appendChild(arrayCoords[i]);
+    }
+
+    divLat.appendChild(span);
+    div.appendChild(divLat); // longitude
+
+    var divLon = document.createElement("div");
+    var spanLon = document.createElement("span");
+    spanLon.className = "GPmousePositionLabel";
+    spanLon.id = this._addUID("GPmousePositionLonLabel");
+    spanLon.innerHTML = "Longitude : ";
+    divLon.appendChild(spanLon);
+    var span1 = document.createElement("span");
+    span1.id = this._addUID("GPmousePositionLonCoordinate");
+    var arrayCoords1;
+
+    if (currentProjectionUnits === "DMS") {
+      arrayCoords1 = this._createDMSCoordinateElement("Lon", editCoordinates);
+    } else {
+      arrayCoords1 = this._createCoordinateElement("Lon", editCoordinates);
+    }
+
+    for (var j = 0; j < arrayCoords1.length; j++) {
+      span1.appendChild(arrayCoords1[j]);
+    }
+
+    divLon.appendChild(span1);
+    div.appendChild(divLon);
+    return div;
+  },
+
+  /**
+   * @param {Boolean} [display=false] - specifies if the altitude panel must be displayed
+   *
+   * @returns {DOMElement} container
+   */
+  _createMousePositionPanelBasicAltitudeElement: function _createMousePositionPanelBasicAltitudeElement(display) {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPmousePositionAltitude");
+    div.style.display = display ? "block" : "none";
+    var spanLabel = document.createElement("span");
+    spanLabel.className = "GPmousePositionLabel";
+    spanLabel.innerHTML = "Altitude : ";
+    div.appendChild(spanLabel);
+    var spanAlt = document.createElement("span");
+    spanAlt.className = "GPmousePositionCoords";
+    spanAlt.id = this._addUID("GPmousePositionAlt");
+    spanAlt.innerHTML = "...";
+    div.appendChild(spanAlt);
+    var spanUnits = document.createElement("span");
+    spanUnits.className = "GPmousePositionAltitudeUnits";
+    spanUnits.innerHTML = "m";
+    div.appendChild(spanUnits);
+    return div;
+  },
+
+  /**
+   * @param {Boolean} [editCoordinates=false] - specifies if the coordinates edition is allowed
+   *
+   * @returns {DOMElement} container
+   */
+  _createMousePositionPanelEditToolsElement: function _createMousePositionPanelEditToolsElement(editCoordinates) {
+    var context = this;
+    var div = document.createElement("div");
+    div.className = "GPmousePositionPanelEditTools";
+    div.id = this._addUID("GPmousePositionPanelEditTools");
+
+    if (!editCoordinates) {
+      div.style.display = "none";
+    }
+
+    var span1 = document.createElement("span");
+    span1.className = "GPmousePositionEditTool";
+    span1.id = this._addUID("GPmousePositionLocate");
+    span1.title = editCoordinates === true ? "Cliquer pour saisir des coordonnées" : "";
+
+    if (editCoordinates) {
+      span1.addEventListener("click", function () {
+        context.onMousePositionEditModeLocateClick();
+      });
+    }
+
+    div.appendChild(span1);
+    var span2 = document.createElement("span");
+    span2.className = "GPmousePositionEditTool";
+    span2.id = this._addUID("GPmousePositionCloseEdit");
+    span2.title = "Quitter la saisie des coordonnées";
+    span2.style.display = "none";
+
+    if (editCoordinates) {
+      span2.addEventListener("click", function () {
+        context.onMousePositionEditModeClick(false);
+      });
+    }
+
+    div.appendChild(span2);
+    return div;
+  },
+  // ################################################################### //
+  // #################### Settings container ########################### //
+  // ################################################################### //
+
+  /**
+   * @param {Boolean} [display=false] - specifies if the settings panel must be displayed
+   *
+   * @returns {DOMElement[]} array containing input and label elements
+   */
+  _createShowMousePositionSettingsElement: function _createShowMousePositionSettingsElement(display) {
+    var list = [];
+    var context = this;
+    var input = document.createElement("input");
+    input.type = "checkbox";
+    input.id = this._addUID("GPshowMousePositionSettings");
+    var label = document.createElement("label");
+    label.id = this._addUID("GPshowMousePositionSettingsPicto");
+    label.htmlFor = this._addUID("GPshowMousePositionSettings");
+    label.title = "Réglages";
+    label.className = "GPshowMoreOptionsImage GPshowMoreOptions GPshowMousePositionSettingsPicto"; // FIXME classname and id ?
+
+    label.style.display = display ? "block" : "none";
+
+    if (label.addEventListener) {
+      label.addEventListener("click", function (e) {
+        if (typeof context.onShowMousePositionSettingsClick === "function") {
+          context.onShowMousePositionSettingsClick(e);
+        }
+      }, false);
+    } else if (label.attachEvent) {
+      label.attachEvent("onclick", function (e) {
+        if (typeof context.onShowMousePositionSettingsClick === "function") {
+          context.onShowMousePositionSettingsClick(e);
+        }
+      });
+    }
+
+    list.push(input);
+    list.push(label);
+    return list;
+  },
+
+  /**
+   * settings panel
+   * @param {Boolean} [display=true] - specifies if the settings panel must be displayed
+   *
+   * FIXME
+   * don't call this._createMousePositionSettingsSystemsElement
+   * don't call this._createMousePositionSettingsUnitsElement
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createMousePositionSettingsElement: function _createMousePositionSettingsElement(display) {
+    var container = document.createElement("div");
+    container.id = this._addUID("GPmousePositionSettings");
+    container.style.display = display === undefined || display ? "block" : "none";
+    var span = document.createElement("span");
+    span.className = "GPmousePositionSettingsLabel";
+    span.innerHTML = "Système de référence";
+    container.appendChild(span); // FIXME on decompose la fonction pour les besoins du controle,
+    // on ajoutera ces childs à la main...
+    // FIXME tableau statique !
+    // var systems = [
+    //     {
+    //         code : "GEOGRAPHIC",
+    //         label : "Géographique"
+    //     },
+    //     {
+    //         code : "MERCATOR",
+    //         label : "Mercator"
+    //     },
+    //     {
+    //         code : "LAMB93",
+    //         label : "Lambert 93"
+    //     },
+    //     {
+    //         code : "LAMB2E",
+    //         label : "Lambert II étendu"
+    //     }
+    // ];
+    //
+    // var selectSystem = this._createMousePositionSettingsSystemsElement(systems);
+    //
+    // container.appendChild(selectSystem);
+    // FIXME on decompose la fonction pour les besoins du controle,
+    // on ajoutera ces childs à la main...
+    // FIXME tableau statique !
+    // var units = [
+    //     {
+    //         code : "DEC",
+    //         label : "degrés décimaux",
+    //     },
+    //     {
+    //         code : "DMS",
+    //         label : "degrés sexagésimaux",
+    //     },
+    //     {
+    //         code : "RAD",
+    //         label : "radians",
+    //     },
+    //     {
+    //         code : "GON",
+    //         label : "grades"
+    //     }
+    // ];
+    //
+    // var selectUnits = this._createMousePositionSettingsUnitsElement(units);
+    //
+    // container.appendChild(selectUnits);
+
+    return container;
+  },
+
+  /**
+   * @param {Object[]} systems - list of systems
+   *
+   * @returns {DOMElement} DOM element select
+   */
+  _createMousePositionSettingsSystemsElement: function _createMousePositionSettingsSystemsElement(systems) {
+    // contexte d'execution
+    var context = this;
+    var selectSystem = document.createElement("select");
+    selectSystem.id = this._addUID("GPmousePositionProjectionSystem");
+    selectSystem.className = "GPinputSelect GPmousePositionSettingsSelect";
+    selectSystem.addEventListener("change", function (e) {
+      context.onMousePositionProjectionSystemChange(e);
+    });
+    selectSystem.addEventListener("mouseover", function (e) {
+      // FIXME mettre une condition si target === option
+      if (e.target.nodeName !== "OPTION") {
+        context.onMousePositionProjectionSystemMouseOver(e);
+      }
+    });
+
+    for (var i = 0; i < systems.length; i++) {
+      var obj = systems[i];
+      var option = document.createElement("option");
+      option.value = obj.code;
+      option.text = obj.label || i; // option.label = obj.label;
+
+      selectSystem.appendChild(option);
+    }
+
+    return selectSystem;
+  },
+
+  /**
+   * @param {Object[]} units - list of units
+   *
+   * @returns {DOMElement} DOM element select
+   */
+  _createMousePositionSettingsUnitsElement: function _createMousePositionSettingsUnitsElement(units) {
+    // contexte d'execution
+    var context = this;
+    var selectUnits = document.createElement("select");
+    selectUnits.id = this._addUID("GPmousePositionProjectionUnits");
+    selectUnits.className = "GPinputSelect GPmousePositionSettingsSelect";
+    selectUnits.addEventListener("change", function (e) {
+      context.onMousePositionProjectionUnitsChange(e);
+    });
+
+    for (var j = 0; j < units.length; j++) {
+      var obj = units[j];
+      var option = document.createElement("option");
+      option.value = obj.code ? obj.code : j;
+      option.text = obj.label || j; // option.label = obj.label;
+
+      selectUnits.appendChild(option);
+    }
+
+    return selectUnits;
+  },
+
+  /**
+   * @param {String} [currentProjectionType="Metric"] - "Geographical" or "Metric"
+   */
+  _resetLabelElements: function _resetLabelElements(currentProjectionType) {
+    // Changement des labels dans le formulaire de saisie
+    var spanLat = document.getElementById(this._addUID("GPmousePositionLatLabel"));
+    spanLat.innerHTML = currentProjectionType === "Geographical" ? "Latitude :" : "X :";
+    var spanLon = document.getElementById(this._addUID("GPmousePositionLonLabel"));
+    spanLon.innerHTML = currentProjectionType === "Geographical" ? "Longitude :" : "Y :";
+  },
+
+  /**
+   * @param {String} currentProjectionUnits - projection units
+   */
+  _resetUnitElements: function _resetUnitElements(currentProjectionUnits) {
+    var value = "";
+
+    if (currentProjectionUnits === "M" || currentProjectionUnits === "KM") {
+      value = currentProjectionUnits.toLowerCase();
+    }
+
+    var elts = document.getElementsByClassName("GPmousePositionUnits");
+
+    for (var e = 0; e < elts.length; e++) {
+      elts[e].innerHTML = value;
+    }
+  },
+
+  /**
+   * @method _resetCoordinateElements
+   * @param {Boolean} editCoordinates - edit coordinates option
+   * @param {String} currentProjectionType - current projection type
+   * @param {String} currentProjectionUnits - current projection unit
+   */
+  _resetCoordinateElements: function _resetCoordinateElements(editCoordinates, currentProjectionType, currentProjectionUnits) {
+    // Suppression de tous les enfants de GPmousePositionLatCoordinate
+    var latElt = document.getElementById(this._addUID("GPmousePositionLatCoordinate"));
+
+    while (latElt.firstChild) {
+      latElt.removeChild(latElt.firstChild);
+    }
+
+    var arrayCoords;
+
+    if (currentProjectionUnits === "DMS") {
+      arrayCoords = this._createDMSCoordinateElement("Lat", editCoordinates);
+    } else {
+      arrayCoords = this._createCoordinateElement("Lat", editCoordinates);
+    }
+
+    for (var i = 0; i < arrayCoords.length; i++) {
+      latElt.appendChild(arrayCoords[i]);
+    } // Suppression de tous les enfants de GPmousePositionLonCoordinate
+
+
+    var lonElt = document.getElementById(this._addUID("GPmousePositionLonCoordinate"));
+
+    while (lonElt.firstChild) {
+      lonElt.removeChild(lonElt.firstChild);
+    }
+
+    var arrayCoords1;
+
+    if (currentProjectionUnits === "DMS") {
+      arrayCoords1 = this._createDMSCoordinateElement("Lon", editCoordinates);
+    } else {
+      arrayCoords1 = this._createCoordinateElement("Lon", editCoordinates);
+    }
+
+    for (var j = 0; j < arrayCoords1.length; j++) {
+      lonElt.appendChild(arrayCoords1[j]);
+    } // FIXME on simule un deplacement ?
+    // this.onMapMove();
+
+  },
+
+  /**
+   * Set/unset editing mode
+   *
+   * @method _setEditMode
+   * @param {Boolean} editing - active edit coordinates mode
+   */
+  _setEditMode: function _setEditMode(editing) {
+    var locateElt = document.getElementById(this._addUID("GPmousePositionLocate"));
+    locateElt.title = editing ? "Aller à la position ..." : "Cliquer pour saisir des coordonnées";
+    var closeEditElt = document.getElementById(this._addUID("GPmousePositionCloseEdit"));
+    closeEditElt.style.display = editing ? "inline-block" : "none";
+    var selector = "div[id^=" + this._addUID("GPmousePositionCoordinate") + "]";
+    var inputs = document.querySelectorAll(selector + " input");
+
+    for (var i = 0; i < inputs.length; i++) {
+      inputs[i].readOnly = !editing;
+
+      if (editing) {
+        inputs[i].value = "";
+        inputs[i].classList.remove("error");
+      }
+    }
+
+    var selects = document.querySelectorAll(selector + " select");
+
+    for (var j = 0; j < selects.length; j++) {
+      selects[j].disabled = !editing;
+    }
+  },
+
+  /**
+   *
+   * @param {DOMElement} input - input element
+   * @param {Boolean} isFloat - check for float value
+   *
+   * @returns {Boolean} true if input value is within bounds
+   */
+  _checkDMSElement: function _checkDMSElement(input, isFloat) {
+    var b = isFloat !== undefined;
+    var value = input.value;
+
+    if (b) {
+      value = value.replace(",", ".");
+    }
+
+    if (isNaN(value)) {
+      return false;
+    }
+
+    var v = parseFloat(value);
+
+    if (!b && (v | 0) !== v) {
+      // is it an integer
+      return false;
+    }
+
+    var min = Number(input.dataset.min);
+    var max = Number(input.dataset.max);
+    return v >= min && v <= max;
+  },
+
+  /**
+   * @param {String} coordType - "Lon" or "Lat"
+   * @param {DOMElement} input - input element
+   *
+   * @returns {Boolean} true if input value is within bounds
+   */
+  _checkDMSDegrees: function _checkDMSDegrees(coordType, input) {
+    if (isNaN(input.value)) {
+      return false;
+    }
+
+    var v = parseFloat(input.value);
+
+    if ((v | 0) !== v) {
+      // is it an integer
+      return false;
+    }
+
+    var min = Number(input.dataset.min);
+    var max = Number(input.dataset.max);
+
+    if (v < min || v > max) {
+      return false;
+    }
+
+    var inputMinutes = document.getElementById(this._addUID("GPmousePosition" + coordType + "Minutes"));
+    var inputSeconds = document.getElementById(this._addUID("GPmousePosition" + coordType + "Seconds"));
+
+    if (v >= max) {
+      inputMinutes.dataset.max = 0;
+      inputSeconds.dataset.max = 0;
+    } else {
+      inputMinutes.dataset.max = 59;
+      inputSeconds.dataset.max = 59.9999;
+    }
+
+    return true;
+  },
+  // ################################################################### //
+  // ####################### handlers Event ############################ //
+  // ################################################################### //
+
+  /**
+   * Function displaying coordinates from cursor position (desktop)
+   * or map center (tactile)
+   * @param {Object} coordinate - coordinates
+   */
+  GPdisplayCoords: function GPdisplayCoords(coordinate) {
+    // Compute coords in case of cursor position (desktop)
+    if (coordinate && coordinate != null) {
+      var labelLon = document.getElementById(this._addUID("GPmousePositionLonLabel"));
+      var labelLat = document.getElementById(this._addUID("GPmousePositionLatLabel"));
+
+      if (coordinate.x || coordinate.y) {
+        labelLat.innerHTML = "X : ";
+        labelLon.innerHTML = "Y : ";
+      } else if (coordinate.e || coordinate.n) {
+        labelLat.innerHTML = "E : ";
+        labelLon.innerHTML = "N : ";
+      } else {
+        labelLat.innerHTML = "Latitude : ";
+        labelLon.innerHTML = "Longitude : ";
+      }
+
+      if (_typeof(coordinate.lat) === "object" && _typeof(coordinate.lng) === "object") {
+        var parts = {
+          lng: "Lon",
+          lat: "Lat"
+        };
+        var units = ["Degrees", "Minutes", "Seconds"];
+
+        for (var p in parts) {
+          for (var u = 0; u < units.length; ++u) {
+            var selector = "GPmousePosition" + parts[p] + units[u];
+            var elt = document.getElementById(this._addUID(selector));
+            var key = units[u].charAt(0).toLowerCase();
+            elt.value = coordinate[p][key];
+          }
+        } // directions
+
+
+        document.getElementById(this._addUID("GPmousePositionLonDirection")).value = coordinate.lng.direction;
+        document.getElementById(this._addUID("GPmousePositionLatDirection")).value = coordinate.lat.direction;
+      } else {
+        var elLat = document.getElementById(this._addUID("GPmousePositionLat"));
+        var elLon = document.getElementById(this._addUID("GPmousePositionLon"));
+        elLat.value = coordinate.x || coordinate.lat || coordinate.e || "0";
+        elLon.value = coordinate.y || coordinate.lng || coordinate.lon || coordinate.n || "0"; // les unites
+
+        var unit = coordinate.unit === undefined ? "" : coordinate.unit;
+        var elements = document.getElementsByClassName("GPmousePositionUnits");
+
+        for (var n = 0; n < elements.length; ++n) {
+          elements[n].innerHTML = unit;
+        }
+      }
+    }
+  },
+
+  /**
+   * Function displaying altitude from cursor position (desktop)
+   * or map center (tactile)
+   * @param {Object} coordinate - coordinates
+   * @param {Number} altitudeTimeoutDelay - when the mouse stop moving, delay before the altitude request is launched
+   * @param {Number} noDataValue - the no data value
+   * @param {Number} noDataValueTolerance - the no data value tolerance
+   */
+  GPdisplayElevation: function GPdisplayElevation(coordinate, altitudeTimeoutDelay, noDataValue, noDataValueTolerance) {
+    // contexte d'execution
+    var self = this; // Latency for altitude request
+
+    var altitudeTimeout;
+
+    if (!altitudeTimeoutDelay) {
+      altitudeTimeoutDelay = 500;
+    }
+
+    clearTimeout(altitudeTimeout);
+    document.getElementById(this._addUID("GPmousePositionAlt")).innerHTML = "...";
+
+    if (noDataValue == null) {
+      noDataValue = -99999;
+    }
+
+    if (noDataValueTolerance == null) {
+      noDataValueTolerance = 99980;
+    }
+
+    var maxThreshold = noDataValue + noDataValueTolerance;
+    var minThreshold = noDataValue - noDataValueTolerance; // Compute coords in case of cursor position (desktop)
+
+    if (coordinate && coordinate != null) {
+      // If no altitude panel, don't call altitude request
+      if (document.getElementById(this._addUID("GPmousePositionAltitude"))) {
+        altitudeTimeout = setTimeout(function () {
+          self.onRequestAltitude(coordinate, function (z) {
+            if (minThreshold < z && z < maxThreshold) {
+              self.GPresetElevation();
+            } else {
+              document.getElementById(self._addUID("GPmousePositionAlt")).innerHTML = z;
+            }
+          });
+        }, altitudeTimeoutDelay);
+      }
+    }
+  },
+
+  /**
+   * Function reseting altitude value
+   */
+  GPresetElevation: function GPresetElevation() {
+    if (document.getElementById(this._addUID("GPmousePositionAltitude"))) {
+      document.getElementById(this._addUID("GPmousePositionAlt")).innerHTML = "---";
+    }
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (MousePositionDOM);
+
+/***/ }),
+/* 150 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var proj4__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(151);
+/* harmony import */ var proj4__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(proj4__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var proj4leaflet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(153);
+/* harmony import */ var proj4leaflet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(proj4leaflet__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _Common_Utils_Register__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(154);
+/* harmony import */ var _EPSG2154__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(155);
+/* harmony import */ var _EPSG27572__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(156);
+/* harmony import */ var _EPSG4326__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(157);
+
+
+
+
+
+
+/** autoload function */
+
+(function () {
+  // load all defs into proj4
+  _Common_Utils_Register__WEBPACK_IMPORTED_MODULE_2__["default"].load(proj4__WEBPACK_IMPORTED_MODULE_0___default.a);
+})();
+/**
+ * CRS (Coordinate Reference Systems) Factory to create <a href="http://kartena.github.io/Proj4Leaflet/api/#l-proj-crs" target="_blank">L.Proj.CRS</a> instances.
+ *
+ * @module CRS
+ * @alias L.geoportalCRS
+ * @ignore
+ * @example
+ *  var map = L.Map('divmap', {
+ *    crs : L.geoportalCRS.EPSG2154
+ *  }).setView();
+ *
+ *  var lyr = L.geoportalLayer.WMTS(
+ *    {
+ *      layer : "ORTHOIMAGERY.ORTHOPHOTOS.BDORTHO.L93"
+ *    },
+ *    {
+ *      opacity : 1,
+ *      transparent : true,
+ *      minZoom : 1,
+ *      maxZoom : 21
+ *      ...
+ *    });
+ *
+ *  lyr.addTo(map); // ou map.addLayer(lyr);
+ */
+
+
+var CRS = {
+  /**
+   * Lambert 93 ("EPSG:2154") CRS definition to be used with Leaflet.
+   *
+   * @method EPSG2154
+   * @static
+   * @alias L.geoportalCRS.EPSG2154
+   * @returns {EPSG2154} epsg code
+   */
+  EPSG2154: function EPSG2154() {
+    return _EPSG2154__WEBPACK_IMPORTED_MODULE_3__["default"].build();
+  },
+
+  /**
+   * CRS : Lambert 2 extened
+   *
+   * @ignore
+   * @method EPSG27572
+   * @alias L.geoportalCRS.EPSG27572
+   * @returns {EPSG27572} epsg code
+   */
+  EPSG27572: function EPSG27572() {
+    return _EPSG27572__WEBPACK_IMPORTED_MODULE_4__["default"].build();
+  },
+
+  /**
+   * CRS : EPSG4326
+   *
+   * @ignore
+   * @method EPSG4326
+   * @alias L.geoportalCRS.EPSG4326
+   * @returns {EPSG4326} epsg code
+   */
+  EPSG4326: function EPSG4326() {
+    return _EPSG4326__WEBPACK_IMPORTED_MODULE_5__["default"].build();
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (CRS);
+
+/***/ }),
+/* 151 */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global) {module.exports = global["proj4"] = __webpack_require__(152);
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(52)))
+
+/***/ }),
+/* 152 */
+/***/ (function(module, exports, __webpack_require__) {
+
+(function (global, factory) {
+     true ? module.exports = factory() :
+    undefined;
+}(this, (function () { 'use strict';
+
+    var globals = function(defs) {
+      defs('EPSG:4326', "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees");
+      defs('EPSG:4269', "+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees");
+      defs('EPSG:3857', "+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs");
+
+      defs.WGS84 = defs['EPSG:4326'];
+      defs['EPSG:3785'] = defs['EPSG:3857']; // maintain backward compat, official code is 3857
+      defs.GOOGLE = defs['EPSG:3857'];
+      defs['EPSG:900913'] = defs['EPSG:3857'];
+      defs['EPSG:102113'] = defs['EPSG:3857'];
+    };
+
+    var PJD_3PARAM = 1;
+    var PJD_7PARAM = 2;
+    var PJD_WGS84 = 4; // WGS84 or equivalent
+    var PJD_NODATUM = 5; // WGS84 or equivalent
+    var SEC_TO_RAD = 4.84813681109535993589914102357e-6;
+    var HALF_PI = Math.PI/2;
+    // ellipoid pj_set_ell.c
+    var SIXTH = 0.1666666666666666667;
+    /* 1/6 */
+    var RA4 = 0.04722222222222222222;
+    /* 17/360 */
+    var RA6 = 0.02215608465608465608;
+    var EPSLN = 1.0e-10;
+    // you'd think you could use Number.EPSILON above but that makes
+    // Mollweide get into an infinate loop.
+
+    var D2R = 0.01745329251994329577;
+    var R2D = 57.29577951308232088;
+    var FORTPI = Math.PI/4;
+    var TWO_PI = Math.PI * 2;
+    // SPI is slightly greater than Math.PI, so values that exceed the -180..180
+    // degree range by a tiny amount don't get wrapped. This prevents points that
+    // have drifted from their original location along the 180th meridian (due to
+    // floating point error) from changing their sign.
+    var SPI = 3.14159265359;
+
+    var exports$1 = {};
+    exports$1.greenwich = 0.0; //"0dE",
+    exports$1.lisbon = -9.131906111111; //"9d07'54.862\"W",
+    exports$1.paris = 2.337229166667; //"2d20'14.025\"E",
+    exports$1.bogota = -74.080916666667; //"74d04'51.3\"W",
+    exports$1.madrid = -3.687938888889; //"3d41'16.58\"W",
+    exports$1.rome = 12.452333333333; //"12d27'8.4\"E",
+    exports$1.bern = 7.439583333333; //"7d26'22.5\"E",
+    exports$1.jakarta = 106.807719444444; //"106d48'27.79\"E",
+    exports$1.ferro = -17.666666666667; //"17d40'W",
+    exports$1.brussels = 4.367975; //"4d22'4.71\"E",
+    exports$1.stockholm = 18.058277777778; //"18d3'29.8\"E",
+    exports$1.athens = 23.7163375; //"23d42'58.815\"E",
+    exports$1.oslo = 10.722916666667; //"10d43'22.5\"E"
+
+    var units = {
+      ft: {to_meter: 0.3048},
+      'us-ft': {to_meter: 1200 / 3937}
+    };
+
+    var ignoredChar = /[\s_\-\/\(\)]/g;
+    function match(obj, key) {
+      if (obj[key]) {
+        return obj[key];
+      }
+      var keys = Object.keys(obj);
+      var lkey = key.toLowerCase().replace(ignoredChar, '');
+      var i = -1;
+      var testkey, processedKey;
+      while (++i < keys.length) {
+        testkey = keys[i];
+        processedKey = testkey.toLowerCase().replace(ignoredChar, '');
+        if (processedKey === lkey) {
+          return obj[testkey];
+        }
+      }
+    }
+
+    var parseProj = function(defData) {
+      var self = {};
+      var paramObj = defData.split('+').map(function(v) {
+        return v.trim();
+      }).filter(function(a) {
+        return a;
+      }).reduce(function(p, a) {
+        var split = a.split('=');
+        split.push(true);
+        p[split[0].toLowerCase()] = split[1];
+        return p;
+      }, {});
+      var paramName, paramVal, paramOutname;
+      var params = {
+        proj: 'projName',
+        datum: 'datumCode',
+        rf: function(v) {
+          self.rf = parseFloat(v);
+        },
+        lat_0: function(v) {
+          self.lat0 = v * D2R;
+        },
+        lat_1: function(v) {
+          self.lat1 = v * D2R;
+        },
+        lat_2: function(v) {
+          self.lat2 = v * D2R;
+        },
+        lat_ts: function(v) {
+          self.lat_ts = v * D2R;
+        },
+        lon_0: function(v) {
+          self.long0 = v * D2R;
+        },
+        lon_1: function(v) {
+          self.long1 = v * D2R;
+        },
+        lon_2: function(v) {
+          self.long2 = v * D2R;
+        },
+        alpha: function(v) {
+          self.alpha = parseFloat(v) * D2R;
+        },
+        lonc: function(v) {
+          self.longc = v * D2R;
+        },
+        x_0: function(v) {
+          self.x0 = parseFloat(v);
+        },
+        y_0: function(v) {
+          self.y0 = parseFloat(v);
+        },
+        k_0: function(v) {
+          self.k0 = parseFloat(v);
+        },
+        k: function(v) {
+          self.k0 = parseFloat(v);
+        },
+        a: function(v) {
+          self.a = parseFloat(v);
+        },
+        b: function(v) {
+          self.b = parseFloat(v);
+        },
+        r_a: function() {
+          self.R_A = true;
+        },
+        zone: function(v) {
+          self.zone = parseInt(v, 10);
+        },
+        south: function() {
+          self.utmSouth = true;
+        },
+        towgs84: function(v) {
+          self.datum_params = v.split(",").map(function(a) {
+            return parseFloat(a);
+          });
+        },
+        to_meter: function(v) {
+          self.to_meter = parseFloat(v);
+        },
+        units: function(v) {
+          self.units = v;
+          var unit = match(units, v);
+          if (unit) {
+            self.to_meter = unit.to_meter;
+          }
+        },
+        from_greenwich: function(v) {
+          self.from_greenwich = v * D2R;
+        },
+        pm: function(v) {
+          var pm = match(exports$1, v);
+          self.from_greenwich = (pm ? pm : parseFloat(v)) * D2R;
+        },
+        nadgrids: function(v) {
+          if (v === '@null') {
+            self.datumCode = 'none';
+          }
+          else {
+            self.nadgrids = v;
+          }
+        },
+        axis: function(v) {
+          var legalAxis = "ewnsud";
+          if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) {
+            self.axis = v;
+          }
+        }
+      };
+      for (paramName in paramObj) {
+        paramVal = paramObj[paramName];
+        if (paramName in params) {
+          paramOutname = params[paramName];
+          if (typeof paramOutname === 'function') {
+            paramOutname(paramVal);
+          }
+          else {
+            self[paramOutname] = paramVal;
+          }
+        }
+        else {
+          self[paramName] = paramVal;
+        }
+      }
+      if(typeof self.datumCode === 'string' && self.datumCode !== "WGS84"){
+        self.datumCode = self.datumCode.toLowerCase();
+      }
+      return self;
+    };
+
+    var NEUTRAL = 1;
+    var KEYWORD = 2;
+    var NUMBER = 3;
+    var QUOTED = 4;
+    var AFTERQUOTE = 5;
+    var ENDED = -1;
+    var whitespace = /\s/;
+    var latin = /[A-Za-z]/;
+    var keyword = /[A-Za-z84]/;
+    var endThings = /[,\]]/;
+    var digets = /[\d\.E\-\+]/;
+    // const ignoredChar = /[\s_\-\/\(\)]/g;
+    function Parser(text) {
+      if (typeof text !== 'string') {
+        throw new Error('not a string');
+      }
+      this.text = text.trim();
+      this.level = 0;
+      this.place = 0;
+      this.root = null;
+      this.stack = [];
+      this.currentObject = null;
+      this.state = NEUTRAL;
+    }
+    Parser.prototype.readCharicter = function() {
+      var char = this.text[this.place++];
+      if (this.state !== QUOTED) {
+        while (whitespace.test(char)) {
+          if (this.place >= this.text.length) {
+            return;
+          }
+          char = this.text[this.place++];
+        }
+      }
+      switch (this.state) {
+        case NEUTRAL:
+          return this.neutral(char);
+        case KEYWORD:
+          return this.keyword(char)
+        case QUOTED:
+          return this.quoted(char);
+        case AFTERQUOTE:
+          return this.afterquote(char);
+        case NUMBER:
+          return this.number(char);
+        case ENDED:
+          return;
+      }
+    };
+    Parser.prototype.afterquote = function(char) {
+      if (char === '"') {
+        this.word += '"';
+        this.state = QUOTED;
+        return;
+      }
+      if (endThings.test(char)) {
+        this.word = this.word.trim();
+        this.afterItem(char);
+        return;
+      }
+      throw new Error('havn\'t handled "' +char + '" in afterquote yet, index ' + this.place);
+    };
+    Parser.prototype.afterItem = function(char) {
+      if (char === ',') {
+        if (this.word !== null) {
+          this.currentObject.push(this.word);
+        }
+        this.word = null;
+        this.state = NEUTRAL;
+        return;
+      }
+      if (char === ']') {
+        this.level--;
+        if (this.word !== null) {
+          this.currentObject.push(this.word);
+          this.word = null;
+        }
+        this.state = NEUTRAL;
+        this.currentObject = this.stack.pop();
+        if (!this.currentObject) {
+          this.state = ENDED;
+        }
+
+        return;
+      }
+    };
+    Parser.prototype.number = function(char) {
+      if (digets.test(char)) {
+        this.word += char;
+        return;
+      }
+      if (endThings.test(char)) {
+        this.word = parseFloat(this.word);
+        this.afterItem(char);
+        return;
+      }
+      throw new Error('havn\'t handled "' +char + '" in number yet, index ' + this.place);
+    };
+    Parser.prototype.quoted = function(char) {
+      if (char === '"') {
+        this.state = AFTERQUOTE;
+        return;
+      }
+      this.word += char;
+      return;
+    };
+    Parser.prototype.keyword = function(char) {
+      if (keyword.test(char)) {
+        this.word += char;
+        return;
+      }
+      if (char === '[') {
+        var newObjects = [];
+        newObjects.push(this.word);
+        this.level++;
+        if (this.root === null) {
+          this.root = newObjects;
+        } else {
+          this.currentObject.push(newObjects);
+        }
+        this.stack.push(this.currentObject);
+        this.currentObject = newObjects;
+        this.state = NEUTRAL;
+        return;
+      }
+      if (endThings.test(char)) {
+        this.afterItem(char);
+        return;
+      }
+      throw new Error('havn\'t handled "' +char + '" in keyword yet, index ' + this.place);
+    };
+    Parser.prototype.neutral = function(char) {
+      if (latin.test(char)) {
+        this.word = char;
+        this.state = KEYWORD;
+        return;
+      }
+      if (char === '"') {
+        this.word = '';
+        this.state = QUOTED;
+        return;
+      }
+      if (digets.test(char)) {
+        this.word = char;
+        this.state = NUMBER;
+        return;
+      }
+      if (endThings.test(char)) {
+        this.afterItem(char);
+        return;
+      }
+      throw new Error('havn\'t handled "' +char + '" in neutral yet, index ' + this.place);
+    };
+    Parser.prototype.output = function() {
+      while (this.place < this.text.length) {
+        this.readCharicter();
+      }
+      if (this.state === ENDED) {
+        return this.root;
+      }
+      throw new Error('unable to parse string "' +this.text + '". State is ' + this.state);
+    };
+
+    function parseString(txt) {
+      var parser = new Parser(txt);
+      return parser.output();
+    }
+
+    function mapit(obj, key, value) {
+      if (Array.isArray(key)) {
+        value.unshift(key);
+        key = null;
+      }
+      var thing = key ? {} : obj;
+
+      var out = value.reduce(function(newObj, item) {
+        sExpr(item, newObj);
+        return newObj
+      }, thing);
+      if (key) {
+        obj[key] = out;
+      }
+    }
+
+    function sExpr(v, obj) {
+      if (!Array.isArray(v)) {
+        obj[v] = true;
+        return;
+      }
+      var key = v.shift();
+      if (key === 'PARAMETER') {
+        key = v.shift();
+      }
+      if (v.length === 1) {
+        if (Array.isArray(v[0])) {
+          obj[key] = {};
+          sExpr(v[0], obj[key]);
+          return;
+        }
+        obj[key] = v[0];
+        return;
+      }
+      if (!v.length) {
+        obj[key] = true;
+        return;
+      }
+      if (key === 'TOWGS84') {
+        obj[key] = v;
+        return;
+      }
+      if (key === 'AXIS') {
+        if (!(key in obj)) {
+          obj[key] = [];
+        }
+        obj[key].push(v);
+        return;
+      }
+      if (!Array.isArray(key)) {
+        obj[key] = {};
+      }
+
+      var i;
+      switch (key) {
+        case 'UNIT':
+        case 'PRIMEM':
+        case 'VERT_DATUM':
+          obj[key] = {
+            name: v[0].toLowerCase(),
+            convert: v[1]
+          };
+          if (v.length === 3) {
+            sExpr(v[2], obj[key]);
+          }
+          return;
+        case 'SPHEROID':
+        case 'ELLIPSOID':
+          obj[key] = {
+            name: v[0],
+            a: v[1],
+            rf: v[2]
+          };
+          if (v.length === 4) {
+            sExpr(v[3], obj[key]);
+          }
+          return;
+        case 'PROJECTEDCRS':
+        case 'PROJCRS':
+        case 'GEOGCS':
+        case 'GEOCCS':
+        case 'PROJCS':
+        case 'LOCAL_CS':
+        case 'GEODCRS':
+        case 'GEODETICCRS':
+        case 'GEODETICDATUM':
+        case 'EDATUM':
+        case 'ENGINEERINGDATUM':
+        case 'VERT_CS':
+        case 'VERTCRS':
+        case 'VERTICALCRS':
+        case 'COMPD_CS':
+        case 'COMPOUNDCRS':
+        case 'ENGINEERINGCRS':
+        case 'ENGCRS':
+        case 'FITTED_CS':
+        case 'LOCAL_DATUM':
+        case 'DATUM':
+          v[0] = ['name', v[0]];
+          mapit(obj, key, v);
+          return;
+        default:
+          i = -1;
+          while (++i < v.length) {
+            if (!Array.isArray(v[i])) {
+              return sExpr(v, obj[key]);
+            }
+          }
+          return mapit(obj, key, v);
+      }
+    }
+
+    var D2R$1 = 0.01745329251994329577;
+    function rename(obj, params) {
+      var outName = params[0];
+      var inName = params[1];
+      if (!(outName in obj) && (inName in obj)) {
+        obj[outName] = obj[inName];
+        if (params.length === 3) {
+          obj[outName] = params[2](obj[outName]);
+        }
+      }
+    }
+
+    function d2r(input) {
+      return input * D2R$1;
+    }
+
+    function cleanWKT(wkt) {
+      if (wkt.type === 'GEOGCS') {
+        wkt.projName = 'longlat';
+      } else if (wkt.type === 'LOCAL_CS') {
+        wkt.projName = 'identity';
+        wkt.local = true;
+      } else {
+        if (typeof wkt.PROJECTION === 'object') {
+          wkt.projName = Object.keys(wkt.PROJECTION)[0];
+        } else {
+          wkt.projName = wkt.PROJECTION;
+        }
+      }
+      if (wkt.AXIS) {
+        var axisOrder = '';
+        for (var i = 0, ii = wkt.AXIS.length; i < ii; ++i) {
+          var axis = wkt.AXIS[i];
+          var descriptor = axis[0].toLowerCase();
+          if (descriptor.indexOf('north') !== -1) {
+            axisOrder += 'n';
+          } else if (descriptor.indexOf('south') !== -1) {
+            axisOrder += 's';
+          } else if (descriptor.indexOf('east') !== -1) {
+            axisOrder += 'e';
+          } else if (descriptor.indexOf('west') !== -1) {
+            axisOrder += 'w';
+          }
+        }
+        if (axisOrder.length === 2) {
+          axisOrder += 'u';
+        }
+        if (axisOrder.length === 3) {
+          wkt.axis = axisOrder;
+        }
+      }
+      if (wkt.UNIT) {
+        wkt.units = wkt.UNIT.name.toLowerCase();
+        if (wkt.units === 'metre') {
+          wkt.units = 'meter';
+        }
+        if (wkt.UNIT.convert) {
+          if (wkt.type === 'GEOGCS') {
+            if (wkt.DATUM && wkt.DATUM.SPHEROID) {
+              wkt.to_meter = wkt.UNIT.convert*wkt.DATUM.SPHEROID.a;
+            }
+          } else {
+            wkt.to_meter = wkt.UNIT.convert;
+          }
+        }
+      }
+      var geogcs = wkt.GEOGCS;
+      if (wkt.type === 'GEOGCS') {
+        geogcs = wkt;
+      }
+      if (geogcs) {
+        //if(wkt.GEOGCS.PRIMEM&&wkt.GEOGCS.PRIMEM.convert){
+        //  wkt.from_greenwich=wkt.GEOGCS.PRIMEM.convert*D2R;
+        //}
+        if (geogcs.DATUM) {
+          wkt.datumCode = geogcs.DATUM.name.toLowerCase();
+        } else {
+          wkt.datumCode = geogcs.name.toLowerCase();
+        }
+        if (wkt.datumCode.slice(0, 2) === 'd_') {
+          wkt.datumCode = wkt.datumCode.slice(2);
+        }
+        if (wkt.datumCode === 'new_zealand_geodetic_datum_1949' || wkt.datumCode === 'new_zealand_1949') {
+          wkt.datumCode = 'nzgd49';
+        }
+        if (wkt.datumCode === 'wgs_1984' || wkt.datumCode === 'world_geodetic_system_1984') {
+          if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') {
+            wkt.sphere = true;
+          }
+          wkt.datumCode = 'wgs84';
+        }
+        if (wkt.datumCode.slice(-6) === '_ferro') {
+          wkt.datumCode = wkt.datumCode.slice(0, - 6);
+        }
+        if (wkt.datumCode.slice(-8) === '_jakarta') {
+          wkt.datumCode = wkt.datumCode.slice(0, - 8);
+        }
+        if (~wkt.datumCode.indexOf('belge')) {
+          wkt.datumCode = 'rnb72';
+        }
+        if (geogcs.DATUM && geogcs.DATUM.SPHEROID) {
+          wkt.ellps = geogcs.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\_18/, 'clrk');
+          if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') {
+            wkt.ellps = 'intl';
+          }
+
+          wkt.a = geogcs.DATUM.SPHEROID.a;
+          wkt.rf = parseFloat(geogcs.DATUM.SPHEROID.rf, 10);
+        }
+
+        if (geogcs.DATUM && geogcs.DATUM.TOWGS84) {
+          wkt.datum_params = geogcs.DATUM.TOWGS84;
+        }
+        if (~wkt.datumCode.indexOf('osgb_1936')) {
+          wkt.datumCode = 'osgb36';
+        }
+        if (~wkt.datumCode.indexOf('osni_1952')) {
+          wkt.datumCode = 'osni52';
+        }
+        if (~wkt.datumCode.indexOf('tm65')
+          || ~wkt.datumCode.indexOf('geodetic_datum_of_1965')) {
+          wkt.datumCode = 'ire65';
+        }
+        if (wkt.datumCode === 'ch1903+') {
+          wkt.datumCode = 'ch1903';
+        }
+        if (~wkt.datumCode.indexOf('israel')) {
+          wkt.datumCode = 'isr93';
+        }
+      }
+      if (wkt.b && !isFinite(wkt.b)) {
+        wkt.b = wkt.a;
+      }
+
+      function toMeter(input) {
+        var ratio = wkt.to_meter || 1;
+        return input * ratio;
+      }
+      var renamer = function(a) {
+        return rename(wkt, a);
+      };
+      var list = [
+        ['standard_parallel_1', 'Standard_Parallel_1'],
+        ['standard_parallel_2', 'Standard_Parallel_2'],
+        ['false_easting', 'False_Easting'],
+        ['false_northing', 'False_Northing'],
+        ['central_meridian', 'Central_Meridian'],
+        ['latitude_of_origin', 'Latitude_Of_Origin'],
+        ['latitude_of_origin', 'Central_Parallel'],
+        ['scale_factor', 'Scale_Factor'],
+        ['k0', 'scale_factor'],
+        ['latitude_of_center', 'Latitude_Of_Center'],
+        ['latitude_of_center', 'Latitude_of_center'],
+        ['lat0', 'latitude_of_center', d2r],
+        ['longitude_of_center', 'Longitude_Of_Center'],
+        ['longitude_of_center', 'Longitude_of_center'],
+        ['longc', 'longitude_of_center', d2r],
+        ['x0', 'false_easting', toMeter],
+        ['y0', 'false_northing', toMeter],
+        ['long0', 'central_meridian', d2r],
+        ['lat0', 'latitude_of_origin', d2r],
+        ['lat0', 'standard_parallel_1', d2r],
+        ['lat1', 'standard_parallel_1', d2r],
+        ['lat2', 'standard_parallel_2', d2r],
+        ['azimuth', 'Azimuth'],
+        ['alpha', 'azimuth', d2r],
+        ['srsCode', 'name']
+      ];
+      list.forEach(renamer);
+      if (!wkt.long0 && wkt.longc && (wkt.projName === 'Albers_Conic_Equal_Area' || wkt.projName === 'Lambert_Azimuthal_Equal_Area')) {
+        wkt.long0 = wkt.longc;
+      }
+      if (!wkt.lat_ts && wkt.lat1 && (wkt.projName === 'Stereographic_South_Pole' || wkt.projName === 'Polar Stereographic (variant B)')) {
+        wkt.lat0 = d2r(wkt.lat1 > 0 ? 90 : -90);
+        wkt.lat_ts = wkt.lat1;
+      }
+    }
+    var wkt = function(wkt) {
+      var lisp = parseString(wkt);
+      var type = lisp.shift();
+      var name = lisp.shift();
+      lisp.unshift(['name', name]);
+      lisp.unshift(['type', type]);
+      var obj = {};
+      sExpr(lisp, obj);
+      cleanWKT(obj);
+      return obj;
+    };
+
+    function defs(name) {
+      /*global console*/
+      var that = this;
+      if (arguments.length === 2) {
+        var def = arguments[1];
+        if (typeof def === 'string') {
+          if (def.charAt(0) === '+') {
+            defs[name] = parseProj(arguments[1]);
+          }
+          else {
+            defs[name] = wkt(arguments[1]);
+          }
+        } else {
+          defs[name] = def;
+        }
+      }
+      else if (arguments.length === 1) {
+        if (Array.isArray(name)) {
+          return name.map(function(v) {
+            if (Array.isArray(v)) {
+              defs.apply(that, v);
+            }
+            else {
+              defs(v);
+            }
+          });
+        }
+        else if (typeof name === 'string') {
+          if (name in defs) {
+            return defs[name];
+          }
+        }
+        else if ('EPSG' in name) {
+          defs['EPSG:' + name.EPSG] = name;
+        }
+        else if ('ESRI' in name) {
+          defs['ESRI:' + name.ESRI] = name;
+        }
+        else if ('IAU2000' in name) {
+          defs['IAU2000:' + name.IAU2000] = name;
+        }
+        else {
+          console.log(name);
+        }
+        return;
+      }
+
+
+    }
+    globals(defs);
+
+    function testObj(code){
+      return typeof code === 'string';
+    }
+    function testDef(code){
+      return code in defs;
+    }
+     var codeWords = ['PROJECTEDCRS', 'PROJCRS', 'GEOGCS','GEOCCS','PROJCS','LOCAL_CS', 'GEODCRS', 'GEODETICCRS', 'GEODETICDATUM', 'ENGCRS', 'ENGINEERINGCRS'];
+    function testWKT(code){
+      return codeWords.some(function (word) {
+        return code.indexOf(word) > -1;
+      });
+    }
+    var codes = ['3857', '900913', '3785', '102113'];
+    function checkMercator(item) {
+      var auth = match(item, 'authority');
+      if (!auth) {
+        return;
+      }
+      var code = match(auth, 'epsg');
+      return code && codes.indexOf(code) > -1;
+    }
+    function checkProjStr(item) {
+      var ext = match(item, 'extension');
+      if (!ext) {
+        return;
+      }
+      return match(ext, 'proj4');
+    }
+    function testProj(code){
+      return code[0] === '+';
+    }
+    function parse(code){
+      if (testObj(code)) {
+        //check to see if this is a WKT string
+        if (testDef(code)) {
+          return defs[code];
+        }
+        if (testWKT(code)) {
+          var out = wkt(code);
+          // test of spetial case, due to this being a very common and often malformed
+          if (checkMercator(out)) {
+            return defs['EPSG:3857'];
+          }
+          var maybeProjStr = checkProjStr(out);
+          if (maybeProjStr) {
+            return parseProj(maybeProjStr);
+          }
+          return out;
+        }
+        if (testProj(code)) {
+          return parseProj(code);
+        }
+      }else{
+        return code;
+      }
+    }
+
+    var extend = function(destination, source) {
+      destination = destination || {};
+      var value, property;
+      if (!source) {
+        return destination;
+      }
+      for (property in source) {
+        value = source[property];
+        if (value !== undefined) {
+          destination[property] = value;
+        }
+      }
+      return destination;
+    };
+
+    var msfnz = function(eccent, sinphi, cosphi) {
+      var con = eccent * sinphi;
+      return cosphi / (Math.sqrt(1 - con * con));
+    };
+
+    var sign = function(x) {
+      return x<0 ? -1 : 1;
+    };
+
+    var adjust_lon = function(x) {
+      return (Math.abs(x) <= SPI) ? x : (x - (sign(x) * TWO_PI));
+    };
+
+    var tsfnz = function(eccent, phi, sinphi) {
+      var con = eccent * sinphi;
+      var com = 0.5 * eccent;
+      con = Math.pow(((1 - con) / (1 + con)), com);
+      return (Math.tan(0.5 * (HALF_PI - phi)) / con);
+    };
+
+    var phi2z = function(eccent, ts) {
+      var eccnth = 0.5 * eccent;
+      var con, dphi;
+      var phi = HALF_PI - 2 * Math.atan(ts);
+      for (var i = 0; i <= 15; i++) {
+        con = eccent * Math.sin(phi);
+        dphi = HALF_PI - 2 * Math.atan(ts * (Math.pow(((1 - con) / (1 + con)), eccnth))) - phi;
+        phi += dphi;
+        if (Math.abs(dphi) <= 0.0000000001) {
+          return phi;
+        }
+      }
+      //console.log("phi2z has NoConvergence");
+      return -9999;
+    };
+
+    function init() {
+      var con = this.b / this.a;
+      this.es = 1 - con * con;
+      if(!('x0' in this)){
+        this.x0 = 0;
+      }
+      if(!('y0' in this)){
+        this.y0 = 0;
+      }
+      this.e = Math.sqrt(this.es);
+      if (this.lat_ts) {
+        if (this.sphere) {
+          this.k0 = Math.cos(this.lat_ts);
+        }
+        else {
+          this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));
+        }
+      }
+      else {
+        if (!this.k0) {
+          if (this.k) {
+            this.k0 = this.k;
+          }
+          else {
+            this.k0 = 1;
+          }
+        }
+      }
+    }
+
+    /* Mercator forward equations--mapping lat,long to x,y
+      --------------------------------------------------*/
+
+    function forward(p) {
+      var lon = p.x;
+      var lat = p.y;
+      // convert to radians
+      if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) {
+        return null;
+      }
+
+      var x, y;
+      if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {
+        return null;
+      }
+      else {
+        if (this.sphere) {
+          x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0);
+          y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat));
+        }
+        else {
+          var sinphi = Math.sin(lat);
+          var ts = tsfnz(this.e, lat, sinphi);
+          x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0);
+          y = this.y0 - this.a * this.k0 * Math.log(ts);
+        }
+        p.x = x;
+        p.y = y;
+        return p;
+      }
+    }
+
+    /* Mercator inverse equations--mapping x,y to lat/long
+      --------------------------------------------------*/
+    function inverse(p) {
+
+      var x = p.x - this.x0;
+      var y = p.y - this.y0;
+      var lon, lat;
+
+      if (this.sphere) {
+        lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0)));
+      }
+      else {
+        var ts = Math.exp(-y / (this.a * this.k0));
+        lat = phi2z(this.e, ts);
+        if (lat === -9999) {
+          return null;
+        }
+      }
+      lon = adjust_lon(this.long0 + x / (this.a * this.k0));
+
+      p.x = lon;
+      p.y = lat;
+      return p;
+    }
+
+    var names$1 = ["Mercator", "Popular Visualisation Pseudo Mercator", "Mercator_1SP", "Mercator_Auxiliary_Sphere", "merc"];
+    var merc = {
+      init: init,
+      forward: forward,
+      inverse: inverse,
+      names: names$1
+    };
+
+    function init$1() {
+      //no-op for longlat
+    }
+
+    function identity(pt) {
+      return pt;
+    }
+    var names$2 = ["longlat", "identity"];
+    var longlat = {
+      init: init$1,
+      forward: identity,
+      inverse: identity,
+      names: names$2
+    };
+
+    var projs = [merc, longlat];
+    var names = {};
+    var projStore = [];
+
+    function add(proj, i) {
+      var len = projStore.length;
+      if (!proj.names) {
+        console.log(i);
+        return true;
+      }
+      projStore[len] = proj;
+      proj.names.forEach(function(n) {
+        names[n.toLowerCase()] = len;
+      });
+      return this;
+    }
+
+    function get(name) {
+      if (!name) {
+        return false;
+      }
+      var n = name.toLowerCase();
+      if (typeof names[n] !== 'undefined' && projStore[names[n]]) {
+        return projStore[names[n]];
+      }
+    }
+
+    function start() {
+      projs.forEach(add);
+    }
+    var projections = {
+      start: start,
+      add: add,
+      get: get
+    };
+
+    var exports$2 = {};
+    exports$2.MERIT = {
+      a: 6378137.0,
+      rf: 298.257,
+      ellipseName: "MERIT 1983"
+    };
+
+    exports$2.SGS85 = {
+      a: 6378136.0,
+      rf: 298.257,
+      ellipseName: "Soviet Geodetic System 85"
+    };
+
+    exports$2.GRS80 = {
+      a: 6378137.0,
+      rf: 298.257222101,
+      ellipseName: "GRS 1980(IUGG, 1980)"
+    };
+
+    exports$2.IAU76 = {
+      a: 6378140.0,
+      rf: 298.257,
+      ellipseName: "IAU 1976"
+    };
+
+    exports$2.airy = {
+      a: 6377563.396,
+      b: 6356256.910,
+      ellipseName: "Airy 1830"
+    };
+
+    exports$2.APL4 = {
+      a: 6378137,
+      rf: 298.25,
+      ellipseName: "Appl. Physics. 1965"
+    };
+
+    exports$2.NWL9D = {
+      a: 6378145.0,
+      rf: 298.25,
+      ellipseName: "Naval Weapons Lab., 1965"
+    };
+
+    exports$2.mod_airy = {
+      a: 6377340.189,
+      b: 6356034.446,
+      ellipseName: "Modified Airy"
+    };
+
+    exports$2.andrae = {
+      a: 6377104.43,
+      rf: 300.0,
+      ellipseName: "Andrae 1876 (Den., Iclnd.)"
+    };
+
+    exports$2.aust_SA = {
+      a: 6378160.0,
+      rf: 298.25,
+      ellipseName: "Australian Natl & S. Amer. 1969"
+    };
+
+    exports$2.GRS67 = {
+      a: 6378160.0,
+      rf: 298.2471674270,
+      ellipseName: "GRS 67(IUGG 1967)"
+    };
+
+    exports$2.bessel = {
+      a: 6377397.155,
+      rf: 299.1528128,
+      ellipseName: "Bessel 1841"
+    };
+
+    exports$2.bess_nam = {
+      a: 6377483.865,
+      rf: 299.1528128,
+      ellipseName: "Bessel 1841 (Namibia)"
+    };
+
+    exports$2.clrk66 = {
+      a: 6378206.4,
+      b: 6356583.8,
+      ellipseName: "Clarke 1866"
+    };
+
+    exports$2.clrk80 = {
+      a: 6378249.145,
+      rf: 293.4663,
+      ellipseName: "Clarke 1880 mod."
+    };
+
+    exports$2.clrk58 = {
+      a: 6378293.645208759,
+      rf: 294.2606763692654,
+      ellipseName: "Clarke 1858"
+    };
+
+    exports$2.CPM = {
+      a: 6375738.7,
+      rf: 334.29,
+      ellipseName: "Comm. des Poids et Mesures 1799"
+    };
+
+    exports$2.delmbr = {
+      a: 6376428.0,
+      rf: 311.5,
+      ellipseName: "Delambre 1810 (Belgium)"
+    };
+
+    exports$2.engelis = {
+      a: 6378136.05,
+      rf: 298.2566,
+      ellipseName: "Engelis 1985"
+    };
+
+    exports$2.evrst30 = {
+      a: 6377276.345,
+      rf: 300.8017,
+      ellipseName: "Everest 1830"
+    };
+
+    exports$2.evrst48 = {
+      a: 6377304.063,
+      rf: 300.8017,
+      ellipseName: "Everest 1948"
+    };
+
+    exports$2.evrst56 = {
+      a: 6377301.243,
+      rf: 300.8017,
+      ellipseName: "Everest 1956"
+    };
+
+    exports$2.evrst69 = {
+      a: 6377295.664,
+      rf: 300.8017,
+      ellipseName: "Everest 1969"
+    };
+
+    exports$2.evrstSS = {
+      a: 6377298.556,
+      rf: 300.8017,
+      ellipseName: "Everest (Sabah & Sarawak)"
+    };
+
+    exports$2.fschr60 = {
+      a: 6378166.0,
+      rf: 298.3,
+      ellipseName: "Fischer (Mercury Datum) 1960"
+    };
+
+    exports$2.fschr60m = {
+      a: 6378155.0,
+      rf: 298.3,
+      ellipseName: "Fischer 1960"
+    };
+
+    exports$2.fschr68 = {
+      a: 6378150.0,
+      rf: 298.3,
+      ellipseName: "Fischer 1968"
+    };
+
+    exports$2.helmert = {
+      a: 6378200.0,
+      rf: 298.3,
+      ellipseName: "Helmert 1906"
+    };
+
+    exports$2.hough = {
+      a: 6378270.0,
+      rf: 297.0,
+      ellipseName: "Hough"
+    };
+
+    exports$2.intl = {
+      a: 6378388.0,
+      rf: 297.0,
+      ellipseName: "International 1909 (Hayford)"
+    };
+
+    exports$2.kaula = {
+      a: 6378163.0,
+      rf: 298.24,
+      ellipseName: "Kaula 1961"
+    };
+
+    exports$2.lerch = {
+      a: 6378139.0,
+      rf: 298.257,
+      ellipseName: "Lerch 1979"
+    };
+
+    exports$2.mprts = {
+      a: 6397300.0,
+      rf: 191.0,
+      ellipseName: "Maupertius 1738"
+    };
+
+    exports$2.new_intl = {
+      a: 6378157.5,
+      b: 6356772.2,
+      ellipseName: "New International 1967"
+    };
+
+    exports$2.plessis = {
+      a: 6376523.0,
+      rf: 6355863.0,
+      ellipseName: "Plessis 1817 (France)"
+    };
+
+    exports$2.krass = {
+      a: 6378245.0,
+      rf: 298.3,
+      ellipseName: "Krassovsky, 1942"
+    };
+
+    exports$2.SEasia = {
+      a: 6378155.0,
+      b: 6356773.3205,
+      ellipseName: "Southeast Asia"
+    };
+
+    exports$2.walbeck = {
+      a: 6376896.0,
+      b: 6355834.8467,
+      ellipseName: "Walbeck"
+    };
+
+    exports$2.WGS60 = {
+      a: 6378165.0,
+      rf: 298.3,
+      ellipseName: "WGS 60"
+    };
+
+    exports$2.WGS66 = {
+      a: 6378145.0,
+      rf: 298.25,
+      ellipseName: "WGS 66"
+    };
+
+    exports$2.WGS7 = {
+      a: 6378135.0,
+      rf: 298.26,
+      ellipseName: "WGS 72"
+    };
+
+    var WGS84 = exports$2.WGS84 = {
+      a: 6378137.0,
+      rf: 298.257223563,
+      ellipseName: "WGS 84"
+    };
+
+    exports$2.sphere = {
+      a: 6370997.0,
+      b: 6370997.0,
+      ellipseName: "Normal Sphere (r=6370997)"
+    };
+
+    function eccentricity(a, b, rf, R_A) {
+      var a2 = a * a; // used in geocentric
+      var b2 = b * b; // used in geocentric
+      var es = (a2 - b2) / a2; // e ^ 2
+      var e = 0;
+      if (R_A) {
+        a *= 1 - es * (SIXTH + es * (RA4 + es * RA6));
+        a2 = a * a;
+        es = 0;
+      } else {
+        e = Math.sqrt(es); // eccentricity
+      }
+      var ep2 = (a2 - b2) / b2; // used in geocentric
+      return {
+        es: es,
+        e: e,
+        ep2: ep2
+      };
+    }
+    function sphere(a, b, rf, ellps, sphere) {
+      if (!a) { // do we have an ellipsoid?
+        var ellipse = match(exports$2, ellps);
+        if (!ellipse) {
+          ellipse = WGS84;
+        }
+        a = ellipse.a;
+        b = ellipse.b;
+        rf = ellipse.rf;
+      }
+
+      if (rf && !b) {
+        b = (1.0 - 1.0 / rf) * a;
+      }
+      if (rf === 0 || Math.abs(a - b) < EPSLN) {
+        sphere = true;
+        b = a;
+      }
+      return {
+        a: a,
+        b: b,
+        rf: rf,
+        sphere: sphere
+      };
+    }
+
+    var exports$3 = {};
+    exports$3.wgs84 = {
+      towgs84: "0,0,0",
+      ellipse: "WGS84",
+      datumName: "WGS84"
+    };
+
+    exports$3.ch1903 = {
+      towgs84: "674.374,15.056,405.346",
+      ellipse: "bessel",
+      datumName: "swiss"
+    };
+
+    exports$3.ggrs87 = {
+      towgs84: "-199.87,74.79,246.62",
+      ellipse: "GRS80",
+      datumName: "Greek_Geodetic_Reference_System_1987"
+    };
+
+    exports$3.nad83 = {
+      towgs84: "0,0,0",
+      ellipse: "GRS80",
+      datumName: "North_American_Datum_1983"
+    };
+
+    exports$3.nad27 = {
+      nadgrids: "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",
+      ellipse: "clrk66",
+      datumName: "North_American_Datum_1927"
+    };
+
+    exports$3.potsdam = {
+      towgs84: "606.0,23.0,413.0",
+      ellipse: "bessel",
+      datumName: "Potsdam Rauenberg 1950 DHDN"
+    };
+
+    exports$3.carthage = {
+      towgs84: "-263.0,6.0,431.0",
+      ellipse: "clark80",
+      datumName: "Carthage 1934 Tunisia"
+    };
+
+    exports$3.hermannskogel = {
+      towgs84: "653.0,-212.0,449.0",
+      ellipse: "bessel",
+      datumName: "Hermannskogel"
+    };
+
+    exports$3.osni52 = {
+      towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",
+      ellipse: "airy",
+      datumName: "Irish National"
+    };
+
+    exports$3.ire65 = {
+      towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",
+      ellipse: "mod_airy",
+      datumName: "Ireland 1965"
+    };
+
+    exports$3.rassadiran = {
+      towgs84: "-133.63,-157.5,-158.62",
+      ellipse: "intl",
+      datumName: "Rassadiran"
+    };
+
+    exports$3.nzgd49 = {
+      towgs84: "59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",
+      ellipse: "intl",
+      datumName: "New Zealand Geodetic Datum 1949"
+    };
+
+    exports$3.osgb36 = {
+      towgs84: "446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",
+      ellipse: "airy",
+      datumName: "Airy 1830"
+    };
+
+    exports$3.s_jtsk = {
+      towgs84: "589,76,480",
+      ellipse: 'bessel',
+      datumName: 'S-JTSK (Ferro)'
+    };
+
+    exports$3.beduaram = {
+      towgs84: '-106,-87,188',
+      ellipse: 'clrk80',
+      datumName: 'Beduaram'
+    };
+
+    exports$3.gunung_segara = {
+      towgs84: '-403,684,41',
+      ellipse: 'bessel',
+      datumName: 'Gunung Segara Jakarta'
+    };
+
+    exports$3.rnb72 = {
+      towgs84: "106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",
+      ellipse: "intl",
+      datumName: "Reseau National Belge 1972"
+    };
+
+    function datum(datumCode, datum_params, a, b, es, ep2) {
+      var out = {};
+
+      if (datumCode === undefined || datumCode === 'none') {
+        out.datum_type = PJD_NODATUM;
+      } else {
+        out.datum_type = PJD_WGS84;
+      }
+
+      if (datum_params) {
+        out.datum_params = datum_params.map(parseFloat);
+        if (out.datum_params[0] !== 0 || out.datum_params[1] !== 0 || out.datum_params[2] !== 0) {
+          out.datum_type = PJD_3PARAM;
+        }
+        if (out.datum_params.length > 3) {
+          if (out.datum_params[3] !== 0 || out.datum_params[4] !== 0 || out.datum_params[5] !== 0 || out.datum_params[6] !== 0) {
+            out.datum_type = PJD_7PARAM;
+            out.datum_params[3] *= SEC_TO_RAD;
+            out.datum_params[4] *= SEC_TO_RAD;
+            out.datum_params[5] *= SEC_TO_RAD;
+            out.datum_params[6] = (out.datum_params[6] / 1000000.0) + 1.0;
+          }
+        }
+      }
+
+      out.a = a; //datum object also uses these values
+      out.b = b;
+      out.es = es;
+      out.ep2 = ep2;
+      return out;
+    }
+
+    function Projection(srsCode,callback) {
+      if (!(this instanceof Projection)) {
+        return new Projection(srsCode);
+      }
+      callback = callback || function(error){
+        if(error){
+          throw error;
+        }
+      };
+      var json = parse(srsCode);
+      if(typeof json !== 'object'){
+        callback(srsCode);
+        return;
+      }
+      var ourProj = Projection.projections.get(json.projName);
+      if(!ourProj){
+        callback(srsCode);
+        return;
+      }
+      if (json.datumCode && json.datumCode !== 'none') {
+        var datumDef = match(exports$3, json.datumCode);
+        if (datumDef) {
+          json.datum_params = datumDef.towgs84 ? datumDef.towgs84.split(',') : null;
+          json.ellps = datumDef.ellipse;
+          json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode;
+        }
+      }
+      json.k0 = json.k0 || 1.0;
+      json.axis = json.axis || 'enu';
+      json.ellps = json.ellps || 'wgs84';
+      var sphere_ = sphere(json.a, json.b, json.rf, json.ellps, json.sphere);
+      var ecc = eccentricity(sphere_.a, sphere_.b, sphere_.rf, json.R_A);
+      var datumObj = json.datum || datum(json.datumCode, json.datum_params, sphere_.a, sphere_.b, ecc.es, ecc.ep2);
+
+      extend(this, json); // transfer everything over from the projection because we don't know what we'll need
+      extend(this, ourProj); // transfer all the methods from the projection
+
+      // copy the 4 things over we calulated in deriveConstants.sphere
+      this.a = sphere_.a;
+      this.b = sphere_.b;
+      this.rf = sphere_.rf;
+      this.sphere = sphere_.sphere;
+
+      // copy the 3 things we calculated in deriveConstants.eccentricity
+      this.es = ecc.es;
+      this.e = ecc.e;
+      this.ep2 = ecc.ep2;
+
+      // add in the datum object
+      this.datum = datumObj;
+
+      // init the projection
+      this.init();
+
+      // legecy callback from back in the day when it went to spatialreference.org
+      callback(null, this);
+
+    }
+    Projection.projections = projections;
+    Projection.projections.start();
+
+    'use strict';
+    function compareDatums(source, dest) {
+      if (source.datum_type !== dest.datum_type) {
+        return false; // false, datums are not equal
+      } else if (source.a !== dest.a || Math.abs(source.es - dest.es) > 0.000000000050) {
+        // the tolerance for es is to ensure that GRS80 and WGS84
+        // are considered identical
+        return false;
+      } else if (source.datum_type === PJD_3PARAM) {
+        return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2]);
+      } else if (source.datum_type === PJD_7PARAM) {
+        return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2] && source.datum_params[3] === dest.datum_params[3] && source.datum_params[4] === dest.datum_params[4] && source.datum_params[5] === dest.datum_params[5] && source.datum_params[6] === dest.datum_params[6]);
+      } else {
+        return true; // datums are equal
+      }
+    } // cs_compare_datums()
+
+    /*
+     * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates
+     * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z),
+     * according to the current ellipsoid parameters.
+     *
+     *    Latitude  : Geodetic latitude in radians                     (input)
+     *    Longitude : Geodetic longitude in radians                    (input)
+     *    Height    : Geodetic height, in meters                       (input)
+     *    X         : Calculated Geocentric X coordinate, in meters    (output)
+     *    Y         : Calculated Geocentric Y coordinate, in meters    (output)
+     *    Z         : Calculated Geocentric Z coordinate, in meters    (output)
+     *
+     */
+    function geodeticToGeocentric(p, es, a) {
+      var Longitude = p.x;
+      var Latitude = p.y;
+      var Height = p.z ? p.z : 0; //Z value not always supplied
+
+      var Rn; /*  Earth radius at location  */
+      var Sin_Lat; /*  Math.sin(Latitude)  */
+      var Sin2_Lat; /*  Square of Math.sin(Latitude)  */
+      var Cos_Lat; /*  Math.cos(Latitude)  */
+
+      /*
+       ** Don't blow up if Latitude is just a little out of the value
+       ** range as it may just be a rounding issue.  Also removed longitude
+       ** test, it should be wrapped by Math.cos() and Math.sin().  NFW for PROJ.4, Sep/2001.
+       */
+      if (Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI) {
+        Latitude = -HALF_PI;
+      } else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) {
+        Latitude = HALF_PI;
+      } else if (Latitude < -HALF_PI) {
+        /* Latitude out of range */
+        //..reportError('geocent:lat out of range:' + Latitude);
+        return { x: -Infinity, y: -Infinity, z: p.z };
+      } else if (Latitude > HALF_PI) {
+        /* Latitude out of range */
+        return { x: Infinity, y: Infinity, z: p.z };
+      }
+
+      if (Longitude > Math.PI) {
+        Longitude -= (2 * Math.PI);
+      }
+      Sin_Lat = Math.sin(Latitude);
+      Cos_Lat = Math.cos(Latitude);
+      Sin2_Lat = Sin_Lat * Sin_Lat;
+      Rn = a / (Math.sqrt(1.0e0 - es * Sin2_Lat));
+      return {
+        x: (Rn + Height) * Cos_Lat * Math.cos(Longitude),
+        y: (Rn + Height) * Cos_Lat * Math.sin(Longitude),
+        z: ((Rn * (1 - es)) + Height) * Sin_Lat
+      };
+    } // cs_geodetic_to_geocentric()
+
+    function geocentricToGeodetic(p, es, a, b) {
+      /* local defintions and variables */
+      /* end-criterium of loop, accuracy of sin(Latitude) */
+      var genau = 1e-12;
+      var genau2 = (genau * genau);
+      var maxiter = 30;
+
+      var P; /* distance between semi-minor axis and location */
+      var RR; /* distance between center and location */
+      var CT; /* sin of geocentric latitude */
+      var ST; /* cos of geocentric latitude */
+      var RX;
+      var RK;
+      var RN; /* Earth radius at location */
+      var CPHI0; /* cos of start or old geodetic latitude in iterations */
+      var SPHI0; /* sin of start or old geodetic latitude in iterations */
+      var CPHI; /* cos of searched geodetic latitude */
+      var SPHI; /* sin of searched geodetic latitude */
+      var SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */
+      var iter; /* # of continous iteration, max. 30 is always enough (s.a.) */
+
+      var X = p.x;
+      var Y = p.y;
+      var Z = p.z ? p.z : 0.0; //Z value not always supplied
+      var Longitude;
+      var Latitude;
+      var Height;
+
+      P = Math.sqrt(X * X + Y * Y);
+      RR = Math.sqrt(X * X + Y * Y + Z * Z);
+
+      /*      special cases for latitude and longitude */
+      if (P / a < genau) {
+
+        /*  special case, if P=0. (X=0., Y=0.) */
+        Longitude = 0.0;
+
+        /*  if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis
+         *  of ellipsoid (=center of mass), Latitude becomes PI/2 */
+        if (RR / a < genau) {
+          Latitude = HALF_PI;
+          Height = -b;
+          return {
+            x: p.x,
+            y: p.y,
+            z: p.z
+          };
+        }
+      } else {
+        /*  ellipsoidal (geodetic) longitude
+         *  interval: -PI < Longitude <= +PI */
+        Longitude = Math.atan2(Y, X);
+      }
+
+      /* --------------------------------------------------------------
+       * Following iterative algorithm was developped by
+       * "Institut for Erdmessung", University of Hannover, July 1988.
+       * Internet: www.ife.uni-hannover.de
+       * Iterative computation of CPHI,SPHI and Height.
+       * Iteration of CPHI and SPHI to 10**-12 radian resp.
+       * 2*10**-7 arcsec.
+       * --------------------------------------------------------------
+       */
+      CT = Z / RR;
+      ST = P / RR;
+      RX = 1.0 / Math.sqrt(1.0 - es * (2.0 - es) * ST * ST);
+      CPHI0 = ST * (1.0 - es) * RX;
+      SPHI0 = CT * RX;
+      iter = 0;
+
+      /* loop to find sin(Latitude) resp. Latitude
+       * until |sin(Latitude(iter)-Latitude(iter-1))| < genau */
+      do {
+        iter++;
+        RN = a / Math.sqrt(1.0 - es * SPHI0 * SPHI0);
+
+        /*  ellipsoidal (geodetic) height */
+        Height = P * CPHI0 + Z * SPHI0 - RN * (1.0 - es * SPHI0 * SPHI0);
+
+        RK = es * RN / (RN + Height);
+        RX = 1.0 / Math.sqrt(1.0 - RK * (2.0 - RK) * ST * ST);
+        CPHI = ST * (1.0 - RK) * RX;
+        SPHI = CT * RX;
+        SDPHI = SPHI * CPHI0 - CPHI * SPHI0;
+        CPHI0 = CPHI;
+        SPHI0 = SPHI;
+      }
+      while (SDPHI * SDPHI > genau2 && iter < maxiter);
+
+      /*      ellipsoidal (geodetic) latitude */
+      Latitude = Math.atan(SPHI / Math.abs(CPHI));
+      return {
+        x: Longitude,
+        y: Latitude,
+        z: Height
+      };
+    } // cs_geocentric_to_geodetic()
+
+    /****************************************************************/
+    // pj_geocentic_to_wgs84( p )
+    //  p = point to transform in geocentric coordinates (x,y,z)
+
+
+    /** point object, nothing fancy, just allows values to be
+        passed back and forth by reference rather than by value.
+        Other point classes may be used as long as they have
+        x and y properties, which will get modified in the transform method.
+    */
+    function geocentricToWgs84(p, datum_type, datum_params) {
+
+      if (datum_type === PJD_3PARAM) {
+        // if( x[io] === HUGE_VAL )
+        //    continue;
+        return {
+          x: p.x + datum_params[0],
+          y: p.y + datum_params[1],
+          z: p.z + datum_params[2],
+        };
+      } else if (datum_type === PJD_7PARAM) {
+        var Dx_BF = datum_params[0];
+        var Dy_BF = datum_params[1];
+        var Dz_BF = datum_params[2];
+        var Rx_BF = datum_params[3];
+        var Ry_BF = datum_params[4];
+        var Rz_BF = datum_params[5];
+        var M_BF = datum_params[6];
+        // if( x[io] === HUGE_VAL )
+        //    continue;
+        return {
+          x: M_BF * (p.x - Rz_BF * p.y + Ry_BF * p.z) + Dx_BF,
+          y: M_BF * (Rz_BF * p.x + p.y - Rx_BF * p.z) + Dy_BF,
+          z: M_BF * (-Ry_BF * p.x + Rx_BF * p.y + p.z) + Dz_BF
+        };
+      }
+    } // cs_geocentric_to_wgs84
+
+    /****************************************************************/
+    // pj_geocentic_from_wgs84()
+    //  coordinate system definition,
+    //  point to transform in geocentric coordinates (x,y,z)
+    function geocentricFromWgs84(p, datum_type, datum_params) {
+
+      if (datum_type === PJD_3PARAM) {
+        //if( x[io] === HUGE_VAL )
+        //    continue;
+        return {
+          x: p.x - datum_params[0],
+          y: p.y - datum_params[1],
+          z: p.z - datum_params[2],
+        };
+
+      } else if (datum_type === PJD_7PARAM) {
+        var Dx_BF = datum_params[0];
+        var Dy_BF = datum_params[1];
+        var Dz_BF = datum_params[2];
+        var Rx_BF = datum_params[3];
+        var Ry_BF = datum_params[4];
+        var Rz_BF = datum_params[5];
+        var M_BF = datum_params[6];
+        var x_tmp = (p.x - Dx_BF) / M_BF;
+        var y_tmp = (p.y - Dy_BF) / M_BF;
+        var z_tmp = (p.z - Dz_BF) / M_BF;
+        //if( x[io] === HUGE_VAL )
+        //    continue;
+
+        return {
+          x: x_tmp + Rz_BF * y_tmp - Ry_BF * z_tmp,
+          y: -Rz_BF * x_tmp + y_tmp + Rx_BF * z_tmp,
+          z: Ry_BF * x_tmp - Rx_BF * y_tmp + z_tmp
+        };
+      } //cs_geocentric_from_wgs84()
+    }
+
+    function checkParams(type) {
+      return (type === PJD_3PARAM || type === PJD_7PARAM);
+    }
+
+    var datum_transform = function(source, dest, point) {
+      // Short cut if the datums are identical.
+      if (compareDatums(source, dest)) {
+        return point; // in this case, zero is sucess,
+        // whereas cs_compare_datums returns 1 to indicate TRUE
+        // confusing, should fix this
+      }
+
+      // Explicitly skip datum transform by setting 'datum=none' as parameter for either source or dest
+      if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) {
+        return point;
+      }
+
+      // If this datum requires grid shifts, then apply it to geodetic coordinates.
+
+      // Do we need to go through geocentric coordinates?
+      if (source.es === dest.es && source.a === dest.a && !checkParams(source.datum_type) &&  !checkParams(dest.datum_type)) {
+        return point;
+      }
+
+      // Convert to geocentric coordinates.
+      point = geodeticToGeocentric(point, source.es, source.a);
+      // Convert between datums
+      if (checkParams(source.datum_type)) {
+        point = geocentricToWgs84(point, source.datum_type, source.datum_params);
+      }
+      if (checkParams(dest.datum_type)) {
+        point = geocentricFromWgs84(point, dest.datum_type, dest.datum_params);
+      }
+      return geocentricToGeodetic(point, dest.es, dest.a, dest.b);
+
+    };
+
+    var adjust_axis = function(crs, denorm, point) {
+      var xin = point.x,
+        yin = point.y,
+        zin = point.z || 0.0;
+      var v, t, i;
+      var out = {};
+      for (i = 0; i < 3; i++) {
+        if (denorm && i === 2 && point.z === undefined) {
+          continue;
+        }
+        if (i === 0) {
+          v = xin;
+          if ("ew".indexOf(crs.axis[i]) !== -1) {
+            t = 'x';
+          } else {
+            t = 'y';
+          }
+
+        }
+        else if (i === 1) {
+          v = yin;
+          if ("ns".indexOf(crs.axis[i]) !== -1) {
+            t = 'y';
+          } else {
+            t = 'x';
+          }
+        }
+        else {
+          v = zin;
+          t = 'z';
+        }
+        switch (crs.axis[i]) {
+        case 'e':
+          out[t] = v;
+          break;
+        case 'w':
+          out[t] = -v;
+          break;
+        case 'n':
+          out[t] = v;
+          break;
+        case 's':
+          out[t] = -v;
+          break;
+        case 'u':
+          if (point[t] !== undefined) {
+            out.z = v;
+          }
+          break;
+        case 'd':
+          if (point[t] !== undefined) {
+            out.z = -v;
+          }
+          break;
+        default:
+          //console.log("ERROR: unknow axis ("+crs.axis[i]+") - check definition of "+crs.projName);
+          return null;
+        }
+      }
+      return out;
+    };
+
+    var toPoint = function (array){
+      var out = {
+        x: array[0],
+        y: array[1]
+      };
+      if (array.length>2) {
+        out.z = array[2];
+      }
+      if (array.length>3) {
+        out.m = array[3];
+      }
+      return out;
+    };
+
+    var checkSanity = function (point) {
+      checkCoord(point.x);
+      checkCoord(point.y);
+    };
+    function checkCoord(num) {
+      if (typeof Number.isFinite === 'function') {
+        if (Number.isFinite(num)) {
+          return;
+        }
+        throw new TypeError('coordinates must be finite numbers');
+      }
+      if (typeof num !== 'number' || num !== num || !isFinite(num)) {
+        throw new TypeError('coordinates must be finite numbers');
+      }
+    }
+
+    function checkNotWGS(source, dest) {
+      return ((source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM) && dest.datumCode !== 'WGS84') || ((dest.datum.datum_type === PJD_3PARAM || dest.datum.datum_type === PJD_7PARAM) && source.datumCode !== 'WGS84');
+    }
+
+    function transform(source, dest, point) {
+      var wgs84;
+      if (Array.isArray(point)) {
+        point = toPoint(point);
+      }
+      checkSanity(point);
+      // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84
+      if (source.datum && dest.datum && checkNotWGS(source, dest)) {
+        wgs84 = new Projection('WGS84');
+        point = transform(source, wgs84, point);
+        source = wgs84;
+      }
+      // DGR, 2010/11/12
+      if (source.axis !== 'enu') {
+        point = adjust_axis(source, false, point);
+      }
+      // Transform source points to long/lat, if they aren't already.
+      if (source.projName === 'longlat') {
+        point = {
+          x: point.x * D2R,
+          y: point.y * D2R,
+          z: point.z || 0
+        };
+      } else {
+        if (source.to_meter) {
+          point = {
+            x: point.x * source.to_meter,
+            y: point.y * source.to_meter,
+            z: point.z || 0
+          };
+        }
+        point = source.inverse(point); // Convert Cartesian to longlat
+        if (!point) {
+          return;
+        }
+      }
+      // Adjust for the prime meridian if necessary
+      if (source.from_greenwich) {
+        point.x += source.from_greenwich;
+      }
+
+      // Convert datums if needed, and if possible.
+      point = datum_transform(source.datum, dest.datum, point);
+
+      // Adjust for the prime meridian if necessary
+      if (dest.from_greenwich) {
+        point = {
+          x: point.x - dest.from_greenwich,
+          y: point.y,
+          z: point.z || 0
+        };
+      }
+
+      if (dest.projName === 'longlat') {
+        // convert radians to decimal degrees
+        point = {
+          x: point.x * R2D,
+          y: point.y * R2D,
+          z: point.z || 0
+        };
+      } else { // else project
+        point = dest.forward(point);
+        if (dest.to_meter) {
+          point = {
+            x: point.x / dest.to_meter,
+            y: point.y / dest.to_meter,
+            z: point.z || 0
+          };
+        }
+      }
+
+      // DGR, 2010/11/12
+      if (dest.axis !== 'enu') {
+        return adjust_axis(dest, true, point);
+      }
+
+      return point;
+    }
+
+    var wgs84 = Projection('WGS84');
+
+    function transformer(from, to, coords) {
+      var transformedArray, out, keys;
+      if (Array.isArray(coords)) {
+        transformedArray = transform(from, to, coords) || {x: NaN, y: NaN};
+        if (coords.length > 2) {
+          if ((typeof from.name !== 'undefined' && from.name === 'geocent') || (typeof to.name !== 'undefined' && to.name === 'geocent')) {
+            if (typeof transformedArray.z === 'number') {
+              return [transformedArray.x, transformedArray.y, transformedArray.z].concat(coords.splice(3));
+            } else {
+              return [transformedArray.x, transformedArray.y, coords[2]].concat(coords.splice(3));
+            }
+          } else {
+            return [transformedArray.x, transformedArray.y].concat(coords.splice(2));
+          }
+        } else {
+          return [transformedArray.x, transformedArray.y];
+        }
+      } else {
+        out = transform(from, to, coords);
+        keys = Object.keys(coords);
+        if (keys.length === 2) {
+          return out;
+        }
+        keys.forEach(function (key) {
+          if ((typeof from.name !== 'undefined' && from.name === 'geocent') || (typeof to.name !== 'undefined' && to.name === 'geocent')) {
+            if (key === 'x' || key === 'y' || key === 'z') {
+              return;
+            }
+          } else {
+            if (key === 'x' || key === 'y') {
+              return;
+            }
+          }
+          out[key] = coords[key];
+        });
+        return out;
+      }
+    }
+
+    function checkProj(item) {
+      if (item instanceof Projection) {
+        return item;
+      }
+      if (item.oProj) {
+        return item.oProj;
+      }
+      return Projection(item);
+    }
+
+    function proj4$1(fromProj, toProj, coord) {
+      fromProj = checkProj(fromProj);
+      var single = false;
+      var obj;
+      if (typeof toProj === 'undefined') {
+        toProj = fromProj;
+        fromProj = wgs84;
+        single = true;
+      } else if (typeof toProj.x !== 'undefined' || Array.isArray(toProj)) {
+        coord = toProj;
+        toProj = fromProj;
+        fromProj = wgs84;
+        single = true;
+      }
+      toProj = checkProj(toProj);
+      if (coord) {
+        return transformer(fromProj, toProj, coord);
+      } else {
+        obj = {
+          forward: function (coords) {
+            return transformer(fromProj, toProj, coords);
+          },
+          inverse: function (coords) {
+            return transformer(toProj, fromProj, coords);
+          }
+        };
+        if (single) {
+          obj.oProj = toProj;
+        }
+        return obj;
+      }
+    }
+
+    /**
+     * UTM zones are grouped, and assigned to one of a group of 6
+     * sets.
+     *
+     * {int} @private
+     */
+    var NUM_100K_SETS = 6;
+
+    /**
+     * The column letters (for easting) of the lower left value, per
+     * set.
+     *
+     * {string} @private
+     */
+    var SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS';
+
+    /**
+     * The row letters (for northing) of the lower left value, per
+     * set.
+     *
+     * {string} @private
+     */
+    var SET_ORIGIN_ROW_LETTERS = 'AFAFAF';
+
+    var A = 65; // A
+    var I = 73; // I
+    var O = 79; // O
+    var V = 86; // V
+    var Z = 90; // Z
+    var mgrs = {
+      forward: forward$1,
+      inverse: inverse$1,
+      toPoint: toPoint$1
+    };
+    /**
+     * Conversion of lat/lon to MGRS.
+     *
+     * @param {object} ll Object literal with lat and lon properties on a
+     *     WGS84 ellipsoid.
+     * @param {int} accuracy Accuracy in digits (5 for 1 m, 4 for 10 m, 3 for
+     *      100 m, 2 for 1000 m or 1 for 10000 m). Optional, default is 5.
+     * @return {string} the MGRS string for the given location and accuracy.
+     */
+    function forward$1(ll, accuracy) {
+      accuracy = accuracy || 5; // default accuracy 1m
+      return encode(LLtoUTM({
+        lat: ll[1],
+        lon: ll[0]
+      }), accuracy);
+    }
+
+    /**
+     * Conversion of MGRS to lat/lon.
+     *
+     * @param {string} mgrs MGRS string.
+     * @return {array} An array with left (longitude), bottom (latitude), right
+     *     (longitude) and top (latitude) values in WGS84, representing the
+     *     bounding box for the provided MGRS reference.
+     */
+    function inverse$1(mgrs) {
+      var bbox = UTMtoLL(decode(mgrs.toUpperCase()));
+      if (bbox.lat && bbox.lon) {
+        return [bbox.lon, bbox.lat, bbox.lon, bbox.lat];
+      }
+      return [bbox.left, bbox.bottom, bbox.right, bbox.top];
+    }
+
+    function toPoint$1(mgrs) {
+      var bbox = UTMtoLL(decode(mgrs.toUpperCase()));
+      if (bbox.lat && bbox.lon) {
+        return [bbox.lon, bbox.lat];
+      }
+      return [(bbox.left + bbox.right) / 2, (bbox.top + bbox.bottom) / 2];
+    }
+    /**
+     * Conversion from degrees to radians.
+     *
+     * @private
+     * @param {number} deg the angle in degrees.
+     * @return {number} the angle in radians.
+     */
+    function degToRad(deg) {
+      return (deg * (Math.PI / 180.0));
+    }
+
+    /**
+     * Conversion from radians to degrees.
+     *
+     * @private
+     * @param {number} rad the angle in radians.
+     * @return {number} the angle in degrees.
+     */
+    function radToDeg(rad) {
+      return (180.0 * (rad / Math.PI));
+    }
+
+    /**
+     * Converts a set of Longitude and Latitude co-ordinates to UTM
+     * using the WGS84 ellipsoid.
+     *
+     * @private
+     * @param {object} ll Object literal with lat and lon properties
+     *     representing the WGS84 coordinate to be converted.
+     * @return {object} Object literal containing the UTM value with easting,
+     *     northing, zoneNumber and zoneLetter properties, and an optional
+     *     accuracy property in digits. Returns null if the conversion failed.
+     */
+    function LLtoUTM(ll) {
+      var Lat = ll.lat;
+      var Long = ll.lon;
+      var a = 6378137.0; //ellip.radius;
+      var eccSquared = 0.00669438; //ellip.eccsq;
+      var k0 = 0.9996;
+      var LongOrigin;
+      var eccPrimeSquared;
+      var N, T, C, A, M;
+      var LatRad = degToRad(Lat);
+      var LongRad = degToRad(Long);
+      var LongOriginRad;
+      var ZoneNumber;
+      // (int)
+      ZoneNumber = Math.floor((Long + 180) / 6) + 1;
+
+      //Make sure the longitude 180.00 is in Zone 60
+      if (Long === 180) {
+        ZoneNumber = 60;
+      }
+
+      // Special zone for Norway
+      if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) {
+        ZoneNumber = 32;
+      }
+
+      // Special zones for Svalbard
+      if (Lat >= 72.0 && Lat < 84.0) {
+        if (Long >= 0.0 && Long < 9.0) {
+          ZoneNumber = 31;
+        }
+        else if (Long >= 9.0 && Long < 21.0) {
+          ZoneNumber = 33;
+        }
+        else if (Long >= 21.0 && Long < 33.0) {
+          ZoneNumber = 35;
+        }
+        else if (Long >= 33.0 && Long < 42.0) {
+          ZoneNumber = 37;
+        }
+      }
+
+      LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin
+      // in middle of
+      // zone
+      LongOriginRad = degToRad(LongOrigin);
+
+      eccPrimeSquared = (eccSquared) / (1 - eccSquared);
+
+      N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad));
+      T = Math.tan(LatRad) * Math.tan(LatRad);
+      C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad);
+      A = Math.cos(LatRad) * (LongRad - LongOriginRad);
+
+      M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - (35 * eccSquared * eccSquared * eccSquared / 3072) * Math.sin(6 * LatRad));
+
+      var UTMEasting = (k0 * N * (A + (1 - T + C) * A * A * A / 6.0 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120.0) + 500000.0);
+
+      var UTMNorthing = (k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24.0 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720.0)));
+      if (Lat < 0.0) {
+        UTMNorthing += 10000000.0; //10000000 meter offset for
+        // southern hemisphere
+      }
+
+      return {
+        northing: Math.round(UTMNorthing),
+        easting: Math.round(UTMEasting),
+        zoneNumber: ZoneNumber,
+        zoneLetter: getLetterDesignator(Lat)
+      };
+    }
+
+    /**
+     * Converts UTM coords to lat/long, using the WGS84 ellipsoid. This is a convenience
+     * class where the Zone can be specified as a single string eg."60N" which
+     * is then broken down into the ZoneNumber and ZoneLetter.
+     *
+     * @private
+     * @param {object} utm An object literal with northing, easting, zoneNumber
+     *     and zoneLetter properties. If an optional accuracy property is
+     *     provided (in meters), a bounding box will be returned instead of
+     *     latitude and longitude.
+     * @return {object} An object literal containing either lat and lon values
+     *     (if no accuracy was provided), or top, right, bottom and left values
+     *     for the bounding box calculated according to the provided accuracy.
+     *     Returns null if the conversion failed.
+     */
+    function UTMtoLL(utm) {
+
+      var UTMNorthing = utm.northing;
+      var UTMEasting = utm.easting;
+      var zoneLetter = utm.zoneLetter;
+      var zoneNumber = utm.zoneNumber;
+      // check the ZoneNummber is valid
+      if (zoneNumber < 0 || zoneNumber > 60) {
+        return null;
+      }
+
+      var k0 = 0.9996;
+      var a = 6378137.0; //ellip.radius;
+      var eccSquared = 0.00669438; //ellip.eccsq;
+      var eccPrimeSquared;
+      var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared));
+      var N1, T1, C1, R1, D, M;
+      var LongOrigin;
+      var mu, phi1Rad;
+
+      // remove 500,000 meter offset for longitude
+      var x = UTMEasting - 500000.0;
+      var y = UTMNorthing;
+
+      // We must know somehow if we are in the Northern or Southern
+      // hemisphere, this is the only time we use the letter So even
+      // if the Zone letter isn't exactly correct it should indicate
+      // the hemisphere correctly
+      if (zoneLetter < 'N') {
+        y -= 10000000.0; // remove 10,000,000 meter offset used
+        // for southern hemisphere
+      }
+
+      // There are 60 zones with zone 1 being at West -180 to -174
+      LongOrigin = (zoneNumber - 1) * 6 - 180 + 3; // +3 puts origin
+      // in middle of
+      // zone
+
+      eccPrimeSquared = (eccSquared) / (1 - eccSquared);
+
+      M = y / k0;
+      mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256));
+
+      phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + (151 * e1 * e1 * e1 / 96) * Math.sin(6 * mu);
+      // double phi1 = ProjMath.radToDeg(phi1Rad);
+
+      N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad));
+      T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad);
+      C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad);
+      R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5);
+      D = x / (N1 * k0);
+
+      var lat = phi1Rad - (N1 * Math.tan(phi1Rad) / R1) * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720);
+      lat = radToDeg(lat);
+
+      var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad);
+      lon = LongOrigin + radToDeg(lon);
+
+      var result;
+      if (utm.accuracy) {
+        var topRight = UTMtoLL({
+          northing: utm.northing + utm.accuracy,
+          easting: utm.easting + utm.accuracy,
+          zoneLetter: utm.zoneLetter,
+          zoneNumber: utm.zoneNumber
+        });
+        result = {
+          top: topRight.lat,
+          right: topRight.lon,
+          bottom: lat,
+          left: lon
+        };
+      }
+      else {
+        result = {
+          lat: lat,
+          lon: lon
+        };
+      }
+      return result;
+    }
+
+    /**
+     * Calculates the MGRS letter designator for the given latitude.
+     *
+     * @private
+     * @param {number} lat The latitude in WGS84 to get the letter designator
+     *     for.
+     * @return {char} The letter designator.
+     */
+    function getLetterDesignator(lat) {
+      //This is here as an error flag to show that the Latitude is
+      //outside MGRS limits
+      var LetterDesignator = 'Z';
+
+      if ((84 >= lat) && (lat >= 72)) {
+        LetterDesignator = 'X';
+      }
+      else if ((72 > lat) && (lat >= 64)) {
+        LetterDesignator = 'W';
+      }
+      else if ((64 > lat) && (lat >= 56)) {
+        LetterDesignator = 'V';
+      }
+      else if ((56 > lat) && (lat >= 48)) {
+        LetterDesignator = 'U';
+      }
+      else if ((48 > lat) && (lat >= 40)) {
+        LetterDesignator = 'T';
+      }
+      else if ((40 > lat) && (lat >= 32)) {
+        LetterDesignator = 'S';
+      }
+      else if ((32 > lat) && (lat >= 24)) {
+        LetterDesignator = 'R';
+      }
+      else if ((24 > lat) && (lat >= 16)) {
+        LetterDesignator = 'Q';
+      }
+      else if ((16 > lat) && (lat >= 8)) {
+        LetterDesignator = 'P';
+      }
+      else if ((8 > lat) && (lat >= 0)) {
+        LetterDesignator = 'N';
+      }
+      else if ((0 > lat) && (lat >= -8)) {
+        LetterDesignator = 'M';
+      }
+      else if ((-8 > lat) && (lat >= -16)) {
+        LetterDesignator = 'L';
+      }
+      else if ((-16 > lat) && (lat >= -24)) {
+        LetterDesignator = 'K';
+      }
+      else if ((-24 > lat) && (lat >= -32)) {
+        LetterDesignator = 'J';
+      }
+      else if ((-32 > lat) && (lat >= -40)) {
+        LetterDesignator = 'H';
+      }
+      else if ((-40 > lat) && (lat >= -48)) {
+        LetterDesignator = 'G';
+      }
+      else if ((-48 > lat) && (lat >= -56)) {
+        LetterDesignator = 'F';
+      }
+      else if ((-56 > lat) && (lat >= -64)) {
+        LetterDesignator = 'E';
+      }
+      else if ((-64 > lat) && (lat >= -72)) {
+        LetterDesignator = 'D';
+      }
+      else if ((-72 > lat) && (lat >= -80)) {
+        LetterDesignator = 'C';
+      }
+      return LetterDesignator;
+    }
+
+    /**
+     * Encodes a UTM location as MGRS string.
+     *
+     * @private
+     * @param {object} utm An object literal with easting, northing,
+     *     zoneLetter, zoneNumber
+     * @param {number} accuracy Accuracy in digits (1-5).
+     * @return {string} MGRS string for the given UTM location.
+     */
+    function encode(utm, accuracy) {
+      // prepend with leading zeroes
+      var seasting = "00000" + utm.easting,
+        snorthing = "00000" + utm.northing;
+
+      return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy);
+    }
+
+    /**
+     * Get the two letter 100k designator for a given UTM easting,
+     * northing and zone number value.
+     *
+     * @private
+     * @param {number} easting
+     * @param {number} northing
+     * @param {number} zoneNumber
+     * @return the two letter 100k designator for the given UTM location.
+     */
+    function get100kID(easting, northing, zoneNumber) {
+      var setParm = get100kSetForZone(zoneNumber);
+      var setColumn = Math.floor(easting / 100000);
+      var setRow = Math.floor(northing / 100000) % 20;
+      return getLetter100kID(setColumn, setRow, setParm);
+    }
+
+    /**
+     * Given a UTM zone number, figure out the MGRS 100K set it is in.
+     *
+     * @private
+     * @param {number} i An UTM zone number.
+     * @return {number} the 100k set the UTM zone is in.
+     */
+    function get100kSetForZone(i) {
+      var setParm = i % NUM_100K_SETS;
+      if (setParm === 0) {
+        setParm = NUM_100K_SETS;
+      }
+
+      return setParm;
+    }
+
+    /**
+     * Get the two-letter MGRS 100k designator given information
+     * translated from the UTM northing, easting and zone number.
+     *
+     * @private
+     * @param {number} column the column index as it relates to the MGRS
+     *        100k set spreadsheet, created from the UTM easting.
+     *        Values are 1-8.
+     * @param {number} row the row index as it relates to the MGRS 100k set
+     *        spreadsheet, created from the UTM northing value. Values
+     *        are from 0-19.
+     * @param {number} parm the set block, as it relates to the MGRS 100k set
+     *        spreadsheet, created from the UTM zone. Values are from
+     *        1-60.
+     * @return two letter MGRS 100k code.
+     */
+    function getLetter100kID(column, row, parm) {
+      // colOrigin and rowOrigin are the letters at the origin of the set
+      var index = parm - 1;
+      var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index);
+      var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index);
+
+      // colInt and rowInt are the letters to build to return
+      var colInt = colOrigin + column - 1;
+      var rowInt = rowOrigin + row;
+      var rollover = false;
+
+      if (colInt > Z) {
+        colInt = colInt - Z + A - 1;
+        rollover = true;
+      }
+
+      if (colInt === I || (colOrigin < I && colInt > I) || ((colInt > I || colOrigin < I) && rollover)) {
+        colInt++;
+      }
+
+      if (colInt === O || (colOrigin < O && colInt > O) || ((colInt > O || colOrigin < O) && rollover)) {
+        colInt++;
+
+        if (colInt === I) {
+          colInt++;
+        }
+      }
+
+      if (colInt > Z) {
+        colInt = colInt - Z + A - 1;
+      }
+
+      if (rowInt > V) {
+        rowInt = rowInt - V + A - 1;
+        rollover = true;
+      }
+      else {
+        rollover = false;
+      }
+
+      if (((rowInt === I) || ((rowOrigin < I) && (rowInt > I))) || (((rowInt > I) || (rowOrigin < I)) && rollover)) {
+        rowInt++;
+      }
+
+      if (((rowInt === O) || ((rowOrigin < O) && (rowInt > O))) || (((rowInt > O) || (rowOrigin < O)) && rollover)) {
+        rowInt++;
+
+        if (rowInt === I) {
+          rowInt++;
+        }
+      }
+
+      if (rowInt > V) {
+        rowInt = rowInt - V + A - 1;
+      }
+
+      var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt);
+      return twoLetter;
+    }
+
+    /**
+     * Decode the UTM parameters from a MGRS string.
+     *
+     * @private
+     * @param {string} mgrsString an UPPERCASE coordinate string is expected.
+     * @return {object} An object literal with easting, northing, zoneLetter,
+     *     zoneNumber and accuracy (in meters) properties.
+     */
+    function decode(mgrsString) {
+
+      if (mgrsString && mgrsString.length === 0) {
+        throw ("MGRSPoint coverting from nothing");
+      }
+
+      var length = mgrsString.length;
+
+      var hunK = null;
+      var sb = "";
+      var testChar;
+      var i = 0;
+
+      // get Zone number
+      while (!(/[A-Z]/).test(testChar = mgrsString.charAt(i))) {
+        if (i >= 2) {
+          throw ("MGRSPoint bad conversion from: " + mgrsString);
+        }
+        sb += testChar;
+        i++;
+      }
+
+      var zoneNumber = parseInt(sb, 10);
+
+      if (i === 0 || i + 3 > length) {
+        // A good MGRS string has to be 4-5 digits long,
+        // ##AAA/#AAA at least.
+        throw ("MGRSPoint bad conversion from: " + mgrsString);
+      }
+
+      var zoneLetter = mgrsString.charAt(i++);
+
+      // Should we check the zone letter here? Why not.
+      if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') {
+        throw ("MGRSPoint zone letter " + zoneLetter + " not handled: " + mgrsString);
+      }
+
+      hunK = mgrsString.substring(i, i += 2);
+
+      var set = get100kSetForZone(zoneNumber);
+
+      var east100k = getEastingFromChar(hunK.charAt(0), set);
+      var north100k = getNorthingFromChar(hunK.charAt(1), set);
+
+      // We have a bug where the northing may be 2000000 too low.
+      // How
+      // do we know when to roll over?
+
+      while (north100k < getMinNorthing(zoneLetter)) {
+        north100k += 2000000;
+      }
+
+      // calculate the char index for easting/northing separator
+      var remainder = length - i;
+
+      if (remainder % 2 !== 0) {
+        throw ("MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters" + mgrsString);
+      }
+
+      var sep = remainder / 2;
+
+      var sepEasting = 0.0;
+      var sepNorthing = 0.0;
+      var accuracyBonus, sepEastingString, sepNorthingString, easting, northing;
+      if (sep > 0) {
+        accuracyBonus = 100000.0 / Math.pow(10, sep);
+        sepEastingString = mgrsString.substring(i, i + sep);
+        sepEasting = parseFloat(sepEastingString) * accuracyBonus;
+        sepNorthingString = mgrsString.substring(i + sep);
+        sepNorthing = parseFloat(sepNorthingString) * accuracyBonus;
+      }
+
+      easting = sepEasting + east100k;
+      northing = sepNorthing + north100k;
+
+      return {
+        easting: easting,
+        northing: northing,
+        zoneLetter: zoneLetter,
+        zoneNumber: zoneNumber,
+        accuracy: accuracyBonus
+      };
+    }
+
+    /**
+     * Given the first letter from a two-letter MGRS 100k zone, and given the
+     * MGRS table set for the zone number, figure out the easting value that
+     * should be added to the other, secondary easting value.
+     *
+     * @private
+     * @param {char} e The first letter from a two-letter MGRS 100´k zone.
+     * @param {number} set The MGRS table set for the zone number.
+     * @return {number} The easting value for the given letter and set.
+     */
+    function getEastingFromChar(e, set) {
+      // colOrigin is the letter at the origin of the set for the
+      // column
+      var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1);
+      var eastingValue = 100000.0;
+      var rewindMarker = false;
+
+      while (curCol !== e.charCodeAt(0)) {
+        curCol++;
+        if (curCol === I) {
+          curCol++;
+        }
+        if (curCol === O) {
+          curCol++;
+        }
+        if (curCol > Z) {
+          if (rewindMarker) {
+            throw ("Bad character: " + e);
+          }
+          curCol = A;
+          rewindMarker = true;
+        }
+        eastingValue += 100000.0;
+      }
+
+      return eastingValue;
+    }
+
+    /**
+     * Given the second letter from a two-letter MGRS 100k zone, and given the
+     * MGRS table set for the zone number, figure out the northing value that
+     * should be added to the other, secondary northing value. You have to
+     * remember that Northings are determined from the equator, and the vertical
+     * cycle of letters mean a 2000000 additional northing meters. This happens
+     * approx. every 18 degrees of latitude. This method does *NOT* count any
+     * additional northings. You have to figure out how many 2000000 meters need
+     * to be added for the zone letter of the MGRS coordinate.
+     *
+     * @private
+     * @param {char} n Second letter of the MGRS 100k zone
+     * @param {number} set The MGRS table set number, which is dependent on the
+     *     UTM zone number.
+     * @return {number} The northing value for the given letter and set.
+     */
+    function getNorthingFromChar(n, set) {
+
+      if (n > 'V') {
+        throw ("MGRSPoint given invalid Northing " + n);
+      }
+
+      // rowOrigin is the letter at the origin of the set for the
+      // column
+      var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1);
+      var northingValue = 0.0;
+      var rewindMarker = false;
+
+      while (curRow !== n.charCodeAt(0)) {
+        curRow++;
+        if (curRow === I) {
+          curRow++;
+        }
+        if (curRow === O) {
+          curRow++;
+        }
+        // fixing a bug making whole application hang in this loop
+        // when 'n' is a wrong character
+        if (curRow > V) {
+          if (rewindMarker) { // making sure that this loop ends
+            throw ("Bad character: " + n);
+          }
+          curRow = A;
+          rewindMarker = true;
+        }
+        northingValue += 100000.0;
+      }
+
+      return northingValue;
+    }
+
+    /**
+     * The function getMinNorthing returns the minimum northing value of a MGRS
+     * zone.
+     *
+     * Ported from Geotrans' c Lattitude_Band_Value structure table.
+     *
+     * @private
+     * @param {char} zoneLetter The MGRS zone to get the min northing for.
+     * @return {number}
+     */
+    function getMinNorthing(zoneLetter) {
+      var northing;
+      switch (zoneLetter) {
+      case 'C':
+        northing = 1100000.0;
+        break;
+      case 'D':
+        northing = 2000000.0;
+        break;
+      case 'E':
+        northing = 2800000.0;
+        break;
+      case 'F':
+        northing = 3700000.0;
+        break;
+      case 'G':
+        northing = 4600000.0;
+        break;
+      case 'H':
+        northing = 5500000.0;
+        break;
+      case 'J':
+        northing = 6400000.0;
+        break;
+      case 'K':
+        northing = 7300000.0;
+        break;
+      case 'L':
+        northing = 8200000.0;
+        break;
+      case 'M':
+        northing = 9100000.0;
+        break;
+      case 'N':
+        northing = 0.0;
+        break;
+      case 'P':
+        northing = 800000.0;
+        break;
+      case 'Q':
+        northing = 1700000.0;
+        break;
+      case 'R':
+        northing = 2600000.0;
+        break;
+      case 'S':
+        northing = 3500000.0;
+        break;
+      case 'T':
+        northing = 4400000.0;
+        break;
+      case 'U':
+        northing = 5300000.0;
+        break;
+      case 'V':
+        northing = 6200000.0;
+        break;
+      case 'W':
+        northing = 7000000.0;
+        break;
+      case 'X':
+        northing = 7900000.0;
+        break;
+      default:
+        northing = -1.0;
+      }
+      if (northing >= 0.0) {
+        return northing;
+      }
+      else {
+        throw ("Invalid zone letter: " + zoneLetter);
+      }
+
+    }
+
+    function Point(x, y, z) {
+      if (!(this instanceof Point)) {
+        return new Point(x, y, z);
+      }
+      if (Array.isArray(x)) {
+        this.x = x[0];
+        this.y = x[1];
+        this.z = x[2] || 0.0;
+      } else if(typeof x === 'object') {
+        this.x = x.x;
+        this.y = x.y;
+        this.z = x.z || 0.0;
+      } else if (typeof x === 'string' && typeof y === 'undefined') {
+        var coords = x.split(',');
+        this.x = parseFloat(coords[0], 10);
+        this.y = parseFloat(coords[1], 10);
+        this.z = parseFloat(coords[2], 10) || 0.0;
+      } else {
+        this.x = x;
+        this.y = y;
+        this.z = z || 0.0;
+      }
+      console.warn('proj4.Point will be removed in version 3, use proj4.toPoint');
+    }
+
+    Point.fromMGRS = function(mgrsStr) {
+      return new Point(toPoint$1(mgrsStr));
+    };
+    Point.prototype.toMGRS = function(accuracy) {
+      return forward$1([this.x, this.y], accuracy);
+    };
+
+    var C00 = 1;
+    var C02 = 0.25;
+    var C04 = 0.046875;
+    var C06 = 0.01953125;
+    var C08 = 0.01068115234375;
+    var C22 = 0.75;
+    var C44 = 0.46875;
+    var C46 = 0.01302083333333333333;
+    var C48 = 0.00712076822916666666;
+    var C66 = 0.36458333333333333333;
+    var C68 = 0.00569661458333333333;
+    var C88 = 0.3076171875;
+
+    var pj_enfn = function(es) {
+      var en = [];
+      en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08)));
+      en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08)));
+      var t = es * es;
+      en[2] = t * (C44 - es * (C46 + es * C48));
+      t *= es;
+      en[3] = t * (C66 - es * C68);
+      en[4] = t * es * C88;
+      return en;
+    };
+
+    var pj_mlfn = function(phi, sphi, cphi, en) {
+      cphi *= sphi;
+      sphi *= sphi;
+      return (en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4]))));
+    };
+
+    var MAX_ITER = 20;
+
+    var pj_inv_mlfn = function(arg, es, en) {
+      var k = 1 / (1 - es);
+      var phi = arg;
+      for (var i = MAX_ITER; i; --i) { /* rarely goes over 2 iterations */
+        var s = Math.sin(phi);
+        var t = 1 - es * s * s;
+        //t = this.pj_mlfn(phi, s, Math.cos(phi), en) - arg;
+        //phi -= t * (t * Math.sqrt(t)) * k;
+        t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k;
+        phi -= t;
+        if (Math.abs(t) < EPSLN) {
+          return phi;
+        }
+      }
+      //..reportError("cass:pj_inv_mlfn: Convergence error");
+      return phi;
+    };
+
+    // Heavily based on this tmerc projection implementation
+    // https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/tmerc.js
+
+    function init$2() {
+      this.x0 = this.x0 !== undefined ? this.x0 : 0;
+      this.y0 = this.y0 !== undefined ? this.y0 : 0;
+      this.long0 = this.long0 !== undefined ? this.long0 : 0;
+      this.lat0 = this.lat0 !== undefined ? this.lat0 : 0;
+
+      if (this.es) {
+        this.en = pj_enfn(this.es);
+        this.ml0 = pj_mlfn(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en);
+      }
+    }
+
+    /**
+        Transverse Mercator Forward  - long/lat to x/y
+        long/lat in radians
+      */
+    function forward$2(p) {
+      var lon = p.x;
+      var lat = p.y;
+
+      var delta_lon = adjust_lon(lon - this.long0);
+      var con;
+      var x, y;
+      var sin_phi = Math.sin(lat);
+      var cos_phi = Math.cos(lat);
+
+      if (!this.es) {
+        var b = cos_phi * Math.sin(delta_lon);
+
+        if ((Math.abs(Math.abs(b) - 1)) < EPSLN) {
+          return (93);
+        }
+        else {
+          x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b)) + this.x0;
+          y = cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - Math.pow(b, 2));
+          b = Math.abs(y);
+
+          if (b >= 1) {
+            if ((b - 1) > EPSLN) {
+              return (93);
+            }
+            else {
+              y = 0;
+            }
+          }
+          else {
+            y = Math.acos(y);
+          }
+
+          if (lat < 0) {
+            y = -y;
+          }
+
+          y = this.a * this.k0 * (y - this.lat0) + this.y0;
+        }
+      }
+      else {
+        var al = cos_phi * delta_lon;
+        var als = Math.pow(al, 2);
+        var c = this.ep2 * Math.pow(cos_phi, 2);
+        var cs = Math.pow(c, 2);
+        var tq = Math.abs(cos_phi) > EPSLN ? Math.tan(lat) : 0;
+        var t = Math.pow(tq, 2);
+        var ts = Math.pow(t, 2);
+        con = 1 - this.es * Math.pow(sin_phi, 2);
+        al = al / Math.sqrt(con);
+        var ml = pj_mlfn(lat, sin_phi, cos_phi, this.en);
+
+        x = this.a * (this.k0 * al * (1 +
+          als / 6 * (1 - t + c +
+          als / 20 * (5 - 18 * t + ts + 14 * c - 58 * t * c +
+          als / 42 * (61 + 179 * ts - ts * t - 479 * t))))) +
+          this.x0;
+
+        y = this.a * (this.k0 * (ml - this.ml0 +
+          sin_phi * delta_lon * al / 2 * (1 +
+          als / 12 * (5 - t + 9 * c + 4 * cs +
+          als / 30 * (61 + ts - 58 * t + 270 * c - 330 * t * c +
+          als / 56 * (1385 + 543 * ts - ts * t - 3111 * t)))))) +
+          this.y0;
+      }
+
+      p.x = x;
+      p.y = y;
+
+      return p;
+    }
+
+    /**
+        Transverse Mercator Inverse  -  x/y to long/lat
+      */
+    function inverse$2(p) {
+      var con, phi;
+      var lat, lon;
+      var x = (p.x - this.x0) * (1 / this.a);
+      var y = (p.y - this.y0) * (1 / this.a);
+
+      if (!this.es) {
+        var f = Math.exp(x / this.k0);
+        var g = 0.5 * (f - 1 / f);
+        var temp = this.lat0 + y / this.k0;
+        var h = Math.cos(temp);
+        con = Math.sqrt((1 - Math.pow(h, 2)) / (1 + Math.pow(g, 2)));
+        lat = Math.asin(con);
+
+        if (y < 0) {
+          lat = -lat;
+        }
+
+        if ((g === 0) && (h === 0)) {
+          lon = 0;
+        }
+        else {
+          lon = adjust_lon(Math.atan2(g, h) + this.long0);
+        }
+      }
+      else { // ellipsoidal form
+        con = this.ml0 + y / this.k0;
+        phi = pj_inv_mlfn(con, this.es, this.en);
+
+        if (Math.abs(phi) < HALF_PI) {
+          var sin_phi = Math.sin(phi);
+          var cos_phi = Math.cos(phi);
+          var tan_phi = Math.abs(cos_phi) > EPSLN ? Math.tan(phi) : 0;
+          var c = this.ep2 * Math.pow(cos_phi, 2);
+          var cs = Math.pow(c, 2);
+          var t = Math.pow(tan_phi, 2);
+          var ts = Math.pow(t, 2);
+          con = 1 - this.es * Math.pow(sin_phi, 2);
+          var d = x * Math.sqrt(con) / this.k0;
+          var ds = Math.pow(d, 2);
+          con = con * tan_phi;
+
+          lat = phi - (con * ds / (1 - this.es)) * 0.5 * (1 -
+            ds / 12 * (5 + 3 * t - 9 * c * t + c - 4 * cs -
+            ds / 30 * (61 + 90 * t - 252 * c * t + 45 * ts + 46 * c -
+            ds / 56 * (1385 + 3633 * t + 4095 * ts + 1574 * ts * t))));
+
+          lon = adjust_lon(this.long0 + (d * (1 -
+            ds / 6 * (1 + 2 * t + c -
+            ds / 20 * (5 + 28 * t + 24 * ts + 8 * c * t + 6 * c -
+            ds / 42 * (61 + 662 * t + 1320 * ts + 720 * ts * t)))) / cos_phi));
+        }
+        else {
+          lat = HALF_PI * sign(y);
+          lon = 0;
+        }
+      }
+
+      p.x = lon;
+      p.y = lat;
+
+      return p;
+    }
+
+    var names$3 = ["Transverse_Mercator", "Transverse Mercator", "tmerc"];
+    var tmerc = {
+      init: init$2,
+      forward: forward$2,
+      inverse: inverse$2,
+      names: names$3
+    };
+
+    var sinh = function(x) {
+      var r = Math.exp(x);
+      r = (r - 1 / r) / 2;
+      return r;
+    };
+
+    var hypot = function(x, y) {
+      x = Math.abs(x);
+      y = Math.abs(y);
+      var a = Math.max(x, y);
+      var b = Math.min(x, y) / (a ? a : 1);
+
+      return a * Math.sqrt(1 + Math.pow(b, 2));
+    };
+
+    var log1py = function(x) {
+      var y = 1 + x;
+      var z = y - 1;
+
+      return z === 0 ? x : x * Math.log(y) / z;
+    };
+
+    var asinhy = function(x) {
+      var y = Math.abs(x);
+      y = log1py(y * (1 + y / (hypot(1, y) + 1)));
+
+      return x < 0 ? -y : y;
+    };
+
+    var gatg = function(pp, B) {
+      var cos_2B = 2 * Math.cos(2 * B);
+      var i = pp.length - 1;
+      var h1 = pp[i];
+      var h2 = 0;
+      var h;
+
+      while (--i >= 0) {
+        h = -h2 + cos_2B * h1 + pp[i];
+        h2 = h1;
+        h1 = h;
+      }
+
+      return (B + h * Math.sin(2 * B));
+    };
+
+    var clens = function(pp, arg_r) {
+      var r = 2 * Math.cos(arg_r);
+      var i = pp.length - 1;
+      var hr1 = pp[i];
+      var hr2 = 0;
+      var hr;
+
+      while (--i >= 0) {
+        hr = -hr2 + r * hr1 + pp[i];
+        hr2 = hr1;
+        hr1 = hr;
+      }
+
+      return Math.sin(arg_r) * hr;
+    };
+
+    var cosh = function(x) {
+      var r = Math.exp(x);
+      r = (r + 1 / r) / 2;
+      return r;
+    };
+
+    var clens_cmplx = function(pp, arg_r, arg_i) {
+      var sin_arg_r = Math.sin(arg_r);
+      var cos_arg_r = Math.cos(arg_r);
+      var sinh_arg_i = sinh(arg_i);
+      var cosh_arg_i = cosh(arg_i);
+      var r = 2 * cos_arg_r * cosh_arg_i;
+      var i = -2 * sin_arg_r * sinh_arg_i;
+      var j = pp.length - 1;
+      var hr = pp[j];
+      var hi1 = 0;
+      var hr1 = 0;
+      var hi = 0;
+      var hr2;
+      var hi2;
+
+      while (--j >= 0) {
+        hr2 = hr1;
+        hi2 = hi1;
+        hr1 = hr;
+        hi1 = hi;
+        hr = -hr2 + r * hr1 - i * hi1 + pp[j];
+        hi = -hi2 + i * hr1 + r * hi1;
+      }
+
+      r = sin_arg_r * cosh_arg_i;
+      i = cos_arg_r * sinh_arg_i;
+
+      return [r * hr - i * hi, r * hi + i * hr];
+    };
+
+    // Heavily based on this etmerc projection implementation
+    // https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/etmerc.js
+
+    function init$3() {
+      if (this.es === undefined || this.es <= 0) {
+        throw new Error('incorrect elliptical usage');
+      }
+
+      this.x0 = this.x0 !== undefined ? this.x0 : 0;
+      this.y0 = this.y0 !== undefined ? this.y0 : 0;
+      this.long0 = this.long0 !== undefined ? this.long0 : 0;
+      this.lat0 = this.lat0 !== undefined ? this.lat0 : 0;
+
+      this.cgb = [];
+      this.cbg = [];
+      this.utg = [];
+      this.gtu = [];
+
+      var f = this.es / (1 + Math.sqrt(1 - this.es));
+      var n = f / (2 - f);
+      var np = n;
+
+      this.cgb[0] = n * (2 + n * (-2 / 3 + n * (-2 + n * (116 / 45 + n * (26 / 45 + n * (-2854 / 675 ))))));
+      this.cbg[0] = n * (-2 + n * ( 2 / 3 + n * ( 4 / 3 + n * (-82 / 45 + n * (32 / 45 + n * (4642 / 4725))))));
+
+      np = np * n;
+      this.cgb[1] = np * (7 / 3 + n * (-8 / 5 + n * (-227 / 45 + n * (2704 / 315 + n * (2323 / 945)))));
+      this.cbg[1] = np * (5 / 3 + n * (-16 / 15 + n * ( -13 / 9 + n * (904 / 315 + n * (-1522 / 945)))));
+
+      np = np * n;
+      this.cgb[2] = np * (56 / 15 + n * (-136 / 35 + n * (-1262 / 105 + n * (73814 / 2835))));
+      this.cbg[2] = np * (-26 / 15 + n * (34 / 21 + n * (8 / 5 + n * (-12686 / 2835))));
+
+      np = np * n;
+      this.cgb[3] = np * (4279 / 630 + n * (-332 / 35 + n * (-399572 / 14175)));
+      this.cbg[3] = np * (1237 / 630 + n * (-12 / 5 + n * ( -24832 / 14175)));
+
+      np = np * n;
+      this.cgb[4] = np * (4174 / 315 + n * (-144838 / 6237));
+      this.cbg[4] = np * (-734 / 315 + n * (109598 / 31185));
+
+      np = np * n;
+      this.cgb[5] = np * (601676 / 22275);
+      this.cbg[5] = np * (444337 / 155925);
+
+      np = Math.pow(n, 2);
+      this.Qn = this.k0 / (1 + n) * (1 + np * (1 / 4 + np * (1 / 64 + np / 256)));
+
+      this.utg[0] = n * (-0.5 + n * ( 2 / 3 + n * (-37 / 96 + n * ( 1 / 360 + n * (81 / 512 + n * (-96199 / 604800))))));
+      this.gtu[0] = n * (0.5 + n * (-2 / 3 + n * (5 / 16 + n * (41 / 180 + n * (-127 / 288 + n * (7891 / 37800))))));
+
+      this.utg[1] = np * (-1 / 48 + n * (-1 / 15 + n * (437 / 1440 + n * (-46 / 105 + n * (1118711 / 3870720)))));
+      this.gtu[1] = np * (13 / 48 + n * (-3 / 5 + n * (557 / 1440 + n * (281 / 630 + n * (-1983433 / 1935360)))));
+
+      np = np * n;
+      this.utg[2] = np * (-17 / 480 + n * (37 / 840 + n * (209 / 4480 + n * (-5569 / 90720 ))));
+      this.gtu[2] = np * (61 / 240 + n * (-103 / 140 + n * (15061 / 26880 + n * (167603 / 181440))));
+
+      np = np * n;
+      this.utg[3] = np * (-4397 / 161280 + n * (11 / 504 + n * (830251 / 7257600)));
+      this.gtu[3] = np * (49561 / 161280 + n * (-179 / 168 + n * (6601661 / 7257600)));
+
+      np = np * n;
+      this.utg[4] = np * (-4583 / 161280 + n * (108847 / 3991680));
+      this.gtu[4] = np * (34729 / 80640 + n * (-3418889 / 1995840));
+
+      np = np * n;
+      this.utg[5] = np * (-20648693 / 638668800);
+      this.gtu[5] = np * (212378941 / 319334400);
+
+      var Z = gatg(this.cbg, this.lat0);
+      this.Zb = -this.Qn * (Z + clens(this.gtu, 2 * Z));
+    }
+
+    function forward$3(p) {
+      var Ce = adjust_lon(p.x - this.long0);
+      var Cn = p.y;
+
+      Cn = gatg(this.cbg, Cn);
+      var sin_Cn = Math.sin(Cn);
+      var cos_Cn = Math.cos(Cn);
+      var sin_Ce = Math.sin(Ce);
+      var cos_Ce = Math.cos(Ce);
+
+      Cn = Math.atan2(sin_Cn, cos_Ce * cos_Cn);
+      Ce = Math.atan2(sin_Ce * cos_Cn, hypot(sin_Cn, cos_Cn * cos_Ce));
+      Ce = asinhy(Math.tan(Ce));
+
+      var tmp = clens_cmplx(this.gtu, 2 * Cn, 2 * Ce);
+
+      Cn = Cn + tmp[0];
+      Ce = Ce + tmp[1];
+
+      var x;
+      var y;
+
+      if (Math.abs(Ce) <= 2.623395162778) {
+        x = this.a * (this.Qn * Ce) + this.x0;
+        y = this.a * (this.Qn * Cn + this.Zb) + this.y0;
+      }
+      else {
+        x = Infinity;
+        y = Infinity;
+      }
+
+      p.x = x;
+      p.y = y;
+
+      return p;
+    }
+
+    function inverse$3(p) {
+      var Ce = (p.x - this.x0) * (1 / this.a);
+      var Cn = (p.y - this.y0) * (1 / this.a);
+
+      Cn = (Cn - this.Zb) / this.Qn;
+      Ce = Ce / this.Qn;
+
+      var lon;
+      var lat;
+
+      if (Math.abs(Ce) <= 2.623395162778) {
+        var tmp = clens_cmplx(this.utg, 2 * Cn, 2 * Ce);
+
+        Cn = Cn + tmp[0];
+        Ce = Ce + tmp[1];
+        Ce = Math.atan(sinh(Ce));
+
+        var sin_Cn = Math.sin(Cn);
+        var cos_Cn = Math.cos(Cn);
+        var sin_Ce = Math.sin(Ce);
+        var cos_Ce = Math.cos(Ce);
+
+        Cn = Math.atan2(sin_Cn * cos_Ce, hypot(sin_Ce, cos_Ce * cos_Cn));
+        Ce = Math.atan2(sin_Ce, cos_Ce * cos_Cn);
+
+        lon = adjust_lon(Ce + this.long0);
+        lat = gatg(this.cgb, Cn);
+      }
+      else {
+        lon = Infinity;
+        lat = Infinity;
+      }
+
+      p.x = lon;
+      p.y = lat;
+
+      return p;
+    }
+
+    var names$4 = ["Extended_Transverse_Mercator", "Extended Transverse Mercator", "etmerc"];
+    var etmerc = {
+      init: init$3,
+      forward: forward$3,
+      inverse: inverse$3,
+      names: names$4
+    };
+
+    var adjust_zone = function(zone, lon) {
+      if (zone === undefined) {
+        zone = Math.floor((adjust_lon(lon) + Math.PI) * 30 / Math.PI) + 1;
+
+        if (zone < 0) {
+          return 0;
+        } else if (zone > 60) {
+          return 60;
+        }
+      }
+      return zone;
+    };
+
+    var dependsOn = 'etmerc';
+    function init$4() {
+      var zone = adjust_zone(this.zone, this.long0);
+      if (zone === undefined) {
+        throw new Error('unknown utm zone');
+      }
+      this.lat0 = 0;
+      this.long0 =  ((6 * Math.abs(zone)) - 183) * D2R;
+      this.x0 = 500000;
+      this.y0 = this.utmSouth ? 10000000 : 0;
+      this.k0 = 0.9996;
+
+      etmerc.init.apply(this);
+      this.forward = etmerc.forward;
+      this.inverse = etmerc.inverse;
+    }
+
+    var names$5 = ["Universal Transverse Mercator System", "utm"];
+    var utm = {
+      init: init$4,
+      names: names$5,
+      dependsOn: dependsOn
+    };
+
+    var srat = function(esinp, exp) {
+      return (Math.pow((1 - esinp) / (1 + esinp), exp));
+    };
+
+    var MAX_ITER$1 = 20;
+    function init$6() {
+      var sphi = Math.sin(this.lat0);
+      var cphi = Math.cos(this.lat0);
+      cphi *= cphi;
+      this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi);
+      this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es));
+      this.phic0 = Math.asin(sphi / this.C);
+      this.ratexp = 0.5 * this.C * this.e;
+      this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp));
+    }
+
+    function forward$5(p) {
+      var lon = p.x;
+      var lat = p.y;
+
+      p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI;
+      p.x = this.C * lon;
+      return p;
+    }
+
+    function inverse$5(p) {
+      var DEL_TOL = 1e-14;
+      var lon = p.x / this.C;
+      var lat = p.y;
+      var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C);
+      for (var i = MAX_ITER$1; i > 0; --i) {
+        lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), - 0.5 * this.e)) - HALF_PI;
+        if (Math.abs(lat - p.y) < DEL_TOL) {
+          break;
+        }
+        p.y = lat;
+      }
+      /* convergence failed */
+      if (!i) {
+        return null;
+      }
+      p.x = lon;
+      p.y = lat;
+      return p;
+    }
+
+    var names$7 = ["gauss"];
+    var gauss = {
+      init: init$6,
+      forward: forward$5,
+      inverse: inverse$5,
+      names: names$7
+    };
+
+    function init$5() {
+      gauss.init.apply(this);
+      if (!this.rc) {
+        return;
+      }
+      this.sinc0 = Math.sin(this.phic0);
+      this.cosc0 = Math.cos(this.phic0);
+      this.R2 = 2 * this.rc;
+      if (!this.title) {
+        this.title = "Oblique Stereographic Alternative";
+      }
+    }
+
+    function forward$4(p) {
+      var sinc, cosc, cosl, k;
+      p.x = adjust_lon(p.x - this.long0);
+      gauss.forward.apply(this, [p]);
+      sinc = Math.sin(p.y);
+      cosc = Math.cos(p.y);
+      cosl = Math.cos(p.x);
+      k = this.k0 * this.R2 / (1 + this.sinc0 * sinc + this.cosc0 * cosc * cosl);
+      p.x = k * cosc * Math.sin(p.x);
+      p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl);
+      p.x = this.a * p.x + this.x0;
+      p.y = this.a * p.y + this.y0;
+      return p;
+    }
+
+    function inverse$4(p) {
+      var sinc, cosc, lon, lat, rho;
+      p.x = (p.x - this.x0) / this.a;
+      p.y = (p.y - this.y0) / this.a;
+
+      p.x /= this.k0;
+      p.y /= this.k0;
+      if ((rho = Math.sqrt(p.x * p.x + p.y * p.y))) {
+        var c = 2 * Math.atan2(rho, this.R2);
+        sinc = Math.sin(c);
+        cosc = Math.cos(c);
+        lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho);
+        lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc);
+      }
+      else {
+        lat = this.phic0;
+        lon = 0;
+      }
+
+      p.x = lon;
+      p.y = lat;
+      gauss.inverse.apply(this, [p]);
+      p.x = adjust_lon(p.x + this.long0);
+      return p;
+    }
+
+    var names$6 = ["Stereographic_North_Pole", "Oblique_Stereographic", "Polar_Stereographic", "sterea","Oblique Stereographic Alternative","Double_Stereographic"];
+    var sterea = {
+      init: init$5,
+      forward: forward$4,
+      inverse: inverse$4,
+      names: names$6
+    };
+
+    function ssfn_(phit, sinphi, eccen) {
+      sinphi *= eccen;
+      return (Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen));
+    }
+
+    function init$7() {
+      this.coslat0 = Math.cos(this.lat0);
+      this.sinlat0 = Math.sin(this.lat0);
+      if (this.sphere) {
+        if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {
+          this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts));
+        }
+      }
+      else {
+        if (Math.abs(this.coslat0) <= EPSLN) {
+          if (this.lat0 > 0) {
+            //North pole
+            //trace('stere:north pole');
+            this.con = 1;
+          }
+          else {
+            //South pole
+            //trace('stere:south pole');
+            this.con = -1;
+          }
+        }
+        this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e));
+        if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {
+          this.k0 = 0.5 * this.cons * msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / tsfnz(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts));
+        }
+        this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0);
+        this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI;
+        this.cosX0 = Math.cos(this.X0);
+        this.sinX0 = Math.sin(this.X0);
+      }
+    }
+
+    // Stereographic forward equations--mapping lat,long to x,y
+    function forward$6(p) {
+      var lon = p.x;
+      var lat = p.y;
+      var sinlat = Math.sin(lat);
+      var coslat = Math.cos(lat);
+      var A, X, sinX, cosX, ts, rh;
+      var dlon = adjust_lon(lon - this.long0);
+
+      if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) {
+        //case of the origine point
+        //trace('stere:this is the origin point');
+        p.x = NaN;
+        p.y = NaN;
+        return p;
+      }
+      if (this.sphere) {
+        //trace('stere:sphere case');
+        A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon));
+        p.x = this.a * A * coslat * Math.sin(dlon) + this.x0;
+        p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0;
+        return p;
+      }
+      else {
+        X = 2 * Math.atan(this.ssfn_(lat, sinlat, this.e)) - HALF_PI;
+        cosX = Math.cos(X);
+        sinX = Math.sin(X);
+        if (Math.abs(this.coslat0) <= EPSLN) {
+          ts = tsfnz(this.e, lat * this.con, this.con * sinlat);
+          rh = 2 * this.a * this.k0 * ts / this.cons;
+          p.x = this.x0 + rh * Math.sin(lon - this.long0);
+          p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0);
+          //trace(p.toString());
+          return p;
+        }
+        else if (Math.abs(this.sinlat0) < EPSLN) {
+          //Eq
+          //trace('stere:equateur');
+          A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon));
+          p.y = A * sinX;
+        }
+        else {
+          //other case
+          //trace('stere:normal case');
+          A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon)));
+          p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0;
+        }
+        p.x = A * cosX * Math.sin(dlon) + this.x0;
+      }
+      //trace(p.toString());
+      return p;
+    }
+
+    //* Stereographic inverse equations--mapping x,y to lat/long
+    function inverse$6(p) {
+      p.x -= this.x0;
+      p.y -= this.y0;
+      var lon, lat, ts, ce, Chi;
+      var rh = Math.sqrt(p.x * p.x + p.y * p.y);
+      if (this.sphere) {
+        var c = 2 * Math.atan(rh / (2 * this.a * this.k0));
+        lon = this.long0;
+        lat = this.lat0;
+        if (rh <= EPSLN) {
+          p.x = lon;
+          p.y = lat;
+          return p;
+        }
+        lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh);
+        if (Math.abs(this.coslat0) < EPSLN) {
+          if (this.lat0 > 0) {
+            lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y));
+          }
+          else {
+            lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y));
+          }
+        }
+        else {
+          lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(c), rh * this.coslat0 * Math.cos(c) - p.y * this.sinlat0 * Math.sin(c)));
+        }
+        p.x = lon;
+        p.y = lat;
+        return p;
+      }
+      else {
+        if (Math.abs(this.coslat0) <= EPSLN) {
+          if (rh <= EPSLN) {
+            lat = this.lat0;
+            lon = this.long0;
+            p.x = lon;
+            p.y = lat;
+            //trace(p.toString());
+            return p;
+          }
+          p.x *= this.con;
+          p.y *= this.con;
+          ts = rh * this.cons / (2 * this.a * this.k0);
+          lat = this.con * phi2z(this.e, ts);
+          lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, - 1 * p.y));
+        }
+        else {
+          ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1));
+          lon = this.long0;
+          if (rh <= EPSLN) {
+            Chi = this.X0;
+          }
+          else {
+            Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh);
+            lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(ce), rh * this.cosX0 * Math.cos(ce) - p.y * this.sinX0 * Math.sin(ce)));
+          }
+          lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi)));
+        }
+      }
+      p.x = lon;
+      p.y = lat;
+
+      //trace(p.toString());
+      return p;
+
+    }
+
+    var names$8 = ["stere", "Stereographic_South_Pole", "Polar Stereographic (variant B)"];
+    var stere = {
+      init: init$7,
+      forward: forward$6,
+      inverse: inverse$6,
+      names: names$8,
+      ssfn_: ssfn_
+    };
+
+    /*
+      references:
+        Formules et constantes pour le Calcul pour la
+        projection cylindrique conforme à axe oblique et pour la transformation entre
+        des systèmes de référence.
+        http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf
+      */
+
+    function init$8() {
+      var phy0 = this.lat0;
+      this.lambda0 = this.long0;
+      var sinPhy0 = Math.sin(phy0);
+      var semiMajorAxis = this.a;
+      var invF = this.rf;
+      var flattening = 1 / invF;
+      var e2 = 2 * flattening - Math.pow(flattening, 2);
+      var e = this.e = Math.sqrt(e2);
+      this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2));
+      this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4));
+      this.b0 = Math.asin(sinPhy0 / this.alpha);
+      var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2));
+      var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2));
+      var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0));
+      this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3;
+    }
+
+    function forward$7(p) {
+      var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2));
+      var Sa2 = this.e / 2 * Math.log((1 + this.e * Math.sin(p.y)) / (1 - this.e * Math.sin(p.y)));
+      var S = -this.alpha * (Sa1 + Sa2) + this.K;
+
+      // spheric latitude
+      var b = 2 * (Math.atan(Math.exp(S)) - Math.PI / 4);
+
+      // spheric longitude
+      var I = this.alpha * (p.x - this.lambda0);
+
+      // psoeudo equatorial rotation
+      var rotI = Math.atan(Math.sin(I) / (Math.sin(this.b0) * Math.tan(b) + Math.cos(this.b0) * Math.cos(I)));
+
+      var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - Math.sin(this.b0) * Math.cos(b) * Math.cos(I));
+
+      p.y = this.R / 2 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0;
+      p.x = this.R * rotI + this.x0;
+      return p;
+    }
+
+    function inverse$7(p) {
+      var Y = p.x - this.x0;
+      var X = p.y - this.y0;
+
+      var rotI = Y / this.R;
+      var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4);
+
+      var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI));
+      var I = Math.atan(Math.sin(rotI) / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) * Math.tan(rotB)));
+
+      var lambda = this.lambda0 + I / this.alpha;
+
+      var S = 0;
+      var phy = b;
+      var prevPhy = -1000;
+      var iteration = 0;
+      while (Math.abs(phy - prevPhy) > 0.0000001) {
+        if (++iteration > 20) {
+          //...reportError("omercFwdInfinity");
+          return;
+        }
+        //S = Math.log(Math.tan(Math.PI / 4 + phy / 2));
+        S = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + b / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(phy)) / 2));
+        prevPhy = phy;
+        phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2;
+      }
+
+      p.x = lambda;
+      p.y = phy;
+      return p;
+    }
+
+    var names$9 = ["somerc"];
+    var somerc = {
+      init: init$8,
+      forward: forward$7,
+      inverse: inverse$7,
+      names: names$9
+    };
+
+    /* Initialize the Oblique Mercator  projection
+        ------------------------------------------*/
+    function init$9() {
+      this.no_off = this.no_off || false;
+      this.no_rot = this.no_rot || false;
+
+      if (isNaN(this.k0)) {
+        this.k0 = 1;
+      }
+      var sinlat = Math.sin(this.lat0);
+      var coslat = Math.cos(this.lat0);
+      var con = this.e * sinlat;
+
+      this.bl = Math.sqrt(1 + this.es / (1 - this.es) * Math.pow(coslat, 4));
+      this.al = this.a * this.bl * this.k0 * Math.sqrt(1 - this.es) / (1 - con * con);
+      var t0 = tsfnz(this.e, this.lat0, sinlat);
+      var dl = this.bl / coslat * Math.sqrt((1 - this.es) / (1 - con * con));
+      if (dl * dl < 1) {
+        dl = 1;
+      }
+      var fl;
+      var gl;
+      if (!isNaN(this.longc)) {
+        //Central point and azimuth method
+
+        if (this.lat0 >= 0) {
+          fl = dl + Math.sqrt(dl * dl - 1);
+        }
+        else {
+          fl = dl - Math.sqrt(dl * dl - 1);
+        }
+        this.el = fl * Math.pow(t0, this.bl);
+        gl = 0.5 * (fl - 1 / fl);
+        this.gamma0 = Math.asin(Math.sin(this.alpha) / dl);
+        this.long0 = this.longc - Math.asin(gl * Math.tan(this.gamma0)) / this.bl;
+
+      }
+      else {
+        //2 points method
+        var t1 = tsfnz(this.e, this.lat1, Math.sin(this.lat1));
+        var t2 = tsfnz(this.e, this.lat2, Math.sin(this.lat2));
+        if (this.lat0 >= 0) {
+          this.el = (dl + Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl);
+        }
+        else {
+          this.el = (dl - Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl);
+        }
+        var hl = Math.pow(t1, this.bl);
+        var ll = Math.pow(t2, this.bl);
+        fl = this.el / hl;
+        gl = 0.5 * (fl - 1 / fl);
+        var jl = (this.el * this.el - ll * hl) / (this.el * this.el + ll * hl);
+        var pl = (ll - hl) / (ll + hl);
+        var dlon12 = adjust_lon(this.long1 - this.long2);
+        this.long0 = 0.5 * (this.long1 + this.long2) - Math.atan(jl * Math.tan(0.5 * this.bl * (dlon12)) / pl) / this.bl;
+        this.long0 = adjust_lon(this.long0);
+        var dlon10 = adjust_lon(this.long1 - this.long0);
+        this.gamma0 = Math.atan(Math.sin(this.bl * (dlon10)) / gl);
+        this.alpha = Math.asin(dl * Math.sin(this.gamma0));
+      }
+
+      if (this.no_off) {
+        this.uc = 0;
+      }
+      else {
+        if (this.lat0 >= 0) {
+          this.uc = this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha));
+        }
+        else {
+          this.uc = -1 * this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha));
+        }
+      }
+
+    }
+
+    /* Oblique Mercator forward equations--mapping lat,long to x,y
+        ----------------------------------------------------------*/
+    function forward$8(p) {
+      var lon = p.x;
+      var lat = p.y;
+      var dlon = adjust_lon(lon - this.long0);
+      var us, vs;
+      var con;
+      if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {
+        if (lat > 0) {
+          con = -1;
+        }
+        else {
+          con = 1;
+        }
+        vs = this.al / this.bl * Math.log(Math.tan(FORTPI + con * this.gamma0 * 0.5));
+        us = -1 * con * HALF_PI * this.al / this.bl;
+      }
+      else {
+        var t = tsfnz(this.e, lat, Math.sin(lat));
+        var ql = this.el / Math.pow(t, this.bl);
+        var sl = 0.5 * (ql - 1 / ql);
+        var tl = 0.5 * (ql + 1 / ql);
+        var vl = Math.sin(this.bl * (dlon));
+        var ul = (sl * Math.sin(this.gamma0) - vl * Math.cos(this.gamma0)) / tl;
+        if (Math.abs(Math.abs(ul) - 1) <= EPSLN) {
+          vs = Number.POSITIVE_INFINITY;
+        }
+        else {
+          vs = 0.5 * this.al * Math.log((1 - ul) / (1 + ul)) / this.bl;
+        }
+        if (Math.abs(Math.cos(this.bl * (dlon))) <= EPSLN) {
+          us = this.al * this.bl * (dlon);
+        }
+        else {
+          us = this.al * Math.atan2(sl * Math.cos(this.gamma0) + vl * Math.sin(this.gamma0), Math.cos(this.bl * dlon)) / this.bl;
+        }
+      }
+
+      if (this.no_rot) {
+        p.x = this.x0 + us;
+        p.y = this.y0 + vs;
+      }
+      else {
+
+        us -= this.uc;
+        p.x = this.x0 + vs * Math.cos(this.alpha) + us * Math.sin(this.alpha);
+        p.y = this.y0 + us * Math.cos(this.alpha) - vs * Math.sin(this.alpha);
+      }
+      return p;
+    }
+
+    function inverse$8(p) {
+      var us, vs;
+      if (this.no_rot) {
+        vs = p.y - this.y0;
+        us = p.x - this.x0;
+      }
+      else {
+        vs = (p.x - this.x0) * Math.cos(this.alpha) - (p.y - this.y0) * Math.sin(this.alpha);
+        us = (p.y - this.y0) * Math.cos(this.alpha) + (p.x - this.x0) * Math.sin(this.alpha);
+        us += this.uc;
+      }
+      var qp = Math.exp(-1 * this.bl * vs / this.al);
+      var sp = 0.5 * (qp - 1 / qp);
+      var tp = 0.5 * (qp + 1 / qp);
+      var vp = Math.sin(this.bl * us / this.al);
+      var up = (vp * Math.cos(this.gamma0) + sp * Math.sin(this.gamma0)) / tp;
+      var ts = Math.pow(this.el / Math.sqrt((1 + up) / (1 - up)), 1 / this.bl);
+      if (Math.abs(up - 1) < EPSLN) {
+        p.x = this.long0;
+        p.y = HALF_PI;
+      }
+      else if (Math.abs(up + 1) < EPSLN) {
+        p.x = this.long0;
+        p.y = -1 * HALF_PI;
+      }
+      else {
+        p.y = phi2z(this.e, ts);
+        p.x = adjust_lon(this.long0 - Math.atan2(sp * Math.cos(this.gamma0) - vp * Math.sin(this.gamma0), Math.cos(this.bl * us / this.al)) / this.bl);
+      }
+      return p;
+    }
+
+    var names$10 = ["Hotine_Oblique_Mercator", "Hotine Oblique Mercator", "Hotine_Oblique_Mercator_Azimuth_Natural_Origin", "Hotine_Oblique_Mercator_Azimuth_Center", "omerc"];
+    var omerc = {
+      init: init$9,
+      forward: forward$8,
+      inverse: inverse$8,
+      names: names$10
+    };
+
+    function init$10() {
+
+      // array of:  r_maj,r_min,lat1,lat2,c_lon,c_lat,false_east,false_north
+      //double c_lat;                   /* center latitude                      */
+      //double c_lon;                   /* center longitude                     */
+      //double lat1;                    /* first standard parallel              */
+      //double lat2;                    /* second standard parallel             */
+      //double r_maj;                   /* major axis                           */
+      //double r_min;                   /* minor axis                           */
+      //double false_east;              /* x offset in meters                   */
+      //double false_north;             /* y offset in meters                   */
+
+      if (!this.lat2) {
+        this.lat2 = this.lat1;
+      } //if lat2 is not defined
+      if (!this.k0) {
+        this.k0 = 1;
+      }
+      this.x0 = this.x0 || 0;
+      this.y0 = this.y0 || 0;
+      // Standard Parallels cannot be equal and on opposite sides of the equator
+      if (Math.abs(this.lat1 + this.lat2) < EPSLN) {
+        return;
+      }
+
+      var temp = this.b / this.a;
+      this.e = Math.sqrt(1 - temp * temp);
+
+      var sin1 = Math.sin(this.lat1);
+      var cos1 = Math.cos(this.lat1);
+      var ms1 = msfnz(this.e, sin1, cos1);
+      var ts1 = tsfnz(this.e, this.lat1, sin1);
+
+      var sin2 = Math.sin(this.lat2);
+      var cos2 = Math.cos(this.lat2);
+      var ms2 = msfnz(this.e, sin2, cos2);
+      var ts2 = tsfnz(this.e, this.lat2, sin2);
+
+      var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0));
+
+      if (Math.abs(this.lat1 - this.lat2) > EPSLN) {
+        this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2);
+      }
+      else {
+        this.ns = sin1;
+      }
+      if (isNaN(this.ns)) {
+        this.ns = sin1;
+      }
+      this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns));
+      this.rh = this.a * this.f0 * Math.pow(ts0, this.ns);
+      if (!this.title) {
+        this.title = "Lambert Conformal Conic";
+      }
+    }
+
+    // Lambert Conformal conic forward equations--mapping lat,long to x,y
+    // -----------------------------------------------------------------
+    function forward$9(p) {
+
+      var lon = p.x;
+      var lat = p.y;
+
+      // singular cases :
+      if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) {
+        lat = sign(lat) * (HALF_PI - 2 * EPSLN);
+      }
+
+      var con = Math.abs(Math.abs(lat) - HALF_PI);
+      var ts, rh1;
+      if (con > EPSLN) {
+        ts = tsfnz(this.e, lat, Math.sin(lat));
+        rh1 = this.a * this.f0 * Math.pow(ts, this.ns);
+      }
+      else {
+        con = lat * this.ns;
+        if (con <= 0) {
+          return null;
+        }
+        rh1 = 0;
+      }
+      var theta = this.ns * adjust_lon(lon - this.long0);
+      p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0;
+      p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0;
+
+      return p;
+    }
+
+    // Lambert Conformal Conic inverse equations--mapping x,y to lat/long
+    // -----------------------------------------------------------------
+    function inverse$9(p) {
+
+      var rh1, con, ts;
+      var lat, lon;
+      var x = (p.x - this.x0) / this.k0;
+      var y = (this.rh - (p.y - this.y0) / this.k0);
+      if (this.ns > 0) {
+        rh1 = Math.sqrt(x * x + y * y);
+        con = 1;
+      }
+      else {
+        rh1 = -Math.sqrt(x * x + y * y);
+        con = -1;
+      }
+      var theta = 0;
+      if (rh1 !== 0) {
+        theta = Math.atan2((con * x), (con * y));
+      }
+      if ((rh1 !== 0) || (this.ns > 0)) {
+        con = 1 / this.ns;
+        ts = Math.pow((rh1 / (this.a * this.f0)), con);
+        lat = phi2z(this.e, ts);
+        if (lat === -9999) {
+          return null;
+        }
+      }
+      else {
+        lat = -HALF_PI;
+      }
+      lon = adjust_lon(theta / this.ns + this.long0);
+
+      p.x = lon;
+      p.y = lat;
+      return p;
+    }
+
+    var names$11 = ["Lambert Tangential Conformal Conic Projection", "Lambert_Conformal_Conic", "Lambert_Conformal_Conic_2SP", "lcc"];
+    var lcc = {
+      init: init$10,
+      forward: forward$9,
+      inverse: inverse$9,
+      names: names$11
+    };
+
+    function init$11() {
+      this.a = 6377397.155;
+      this.es = 0.006674372230614;
+      this.e = Math.sqrt(this.es);
+      if (!this.lat0) {
+        this.lat0 = 0.863937979737193;
+      }
+      if (!this.long0) {
+        this.long0 = 0.7417649320975901 - 0.308341501185665;
+      }
+      /* if scale not set default to 0.9999 */
+      if (!this.k0) {
+        this.k0 = 0.9999;
+      }
+      this.s45 = 0.785398163397448; /* 45 */
+      this.s90 = 2 * this.s45;
+      this.fi0 = this.lat0;
+      this.e2 = this.es;
+      this.e = Math.sqrt(this.e2);
+      this.alfa = Math.sqrt(1 + (this.e2 * Math.pow(Math.cos(this.fi0), 4)) / (1 - this.e2));
+      this.uq = 1.04216856380474;
+      this.u0 = Math.asin(Math.sin(this.fi0) / this.alfa);
+      this.g = Math.pow((1 + this.e * Math.sin(this.fi0)) / (1 - this.e * Math.sin(this.fi0)), this.alfa * this.e / 2);
+      this.k = Math.tan(this.u0 / 2 + this.s45) / Math.pow(Math.tan(this.fi0 / 2 + this.s45), this.alfa) * this.g;
+      this.k1 = this.k0;
+      this.n0 = this.a * Math.sqrt(1 - this.e2) / (1 - this.e2 * Math.pow(Math.sin(this.fi0), 2));
+      this.s0 = 1.37008346281555;
+      this.n = Math.sin(this.s0);
+      this.ro0 = this.k1 * this.n0 / Math.tan(this.s0);
+      this.ad = this.s90 - this.uq;
+    }
+
+    /* ellipsoid */
+    /* calculate xy from lat/lon */
+    /* Constants, identical to inverse transform function */
+    function forward$10(p) {
+      var gfi, u, deltav, s, d, eps, ro;
+      var lon = p.x;
+      var lat = p.y;
+      var delta_lon = adjust_lon(lon - this.long0);
+      /* Transformation */
+      gfi = Math.pow(((1 + this.e * Math.sin(lat)) / (1 - this.e * Math.sin(lat))), (this.alfa * this.e / 2));
+      u = 2 * (Math.atan(this.k * Math.pow(Math.tan(lat / 2 + this.s45), this.alfa) / gfi) - this.s45);
+      deltav = -delta_lon * this.alfa;
+      s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav));
+      d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s));
+      eps = this.n * d;
+      ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(s / 2 + this.s45), this.n);
+      p.y = ro * Math.cos(eps) / 1;
+      p.x = ro * Math.sin(eps) / 1;
+
+      if (!this.czech) {
+        p.y *= -1;
+        p.x *= -1;
+      }
+      return (p);
+    }
+
+    /* calculate lat/lon from xy */
+    function inverse$10(p) {
+      var u, deltav, s, d, eps, ro, fi1;
+      var ok;
+
+      /* Transformation */
+      /* revert y, x*/
+      var tmp = p.x;
+      p.x = p.y;
+      p.y = tmp;
+      if (!this.czech) {
+        p.y *= -1;
+        p.x *= -1;
+      }
+      ro = Math.sqrt(p.x * p.x + p.y * p.y);
+      eps = Math.atan2(p.y, p.x);
+      d = eps / Math.sin(this.s0);
+      s = 2 * (Math.atan(Math.pow(this.ro0 / ro, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45);
+      u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d));
+      deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u));
+      p.x = this.long0 - deltav / this.alfa;
+      fi1 = u;
+      ok = 0;
+      var iter = 0;
+      do {
+        p.y = 2 * (Math.atan(Math.pow(this.k, - 1 / this.alfa) * Math.pow(Math.tan(u / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(fi1)) / (1 - this.e * Math.sin(fi1)), this.e / 2)) - this.s45);
+        if (Math.abs(fi1 - p.y) < 0.0000000001) {
+          ok = 1;
+        }
+        fi1 = p.y;
+        iter += 1;
+      } while (ok === 0 && iter < 15);
+      if (iter >= 15) {
+        return null;
+      }
+
+      return (p);
+    }
+
+    var names$12 = ["Krovak", "krovak"];
+    var krovak = {
+      init: init$11,
+      forward: forward$10,
+      inverse: inverse$10,
+      names: names$12
+    };
+
+    var mlfn = function(e0, e1, e2, e3, phi) {
+      return (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi));
+    };
+
+    var e0fn = function(x) {
+      return (1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x)));
+    };
+
+    var e1fn = function(x) {
+      return (0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x)));
+    };
+
+    var e2fn = function(x) {
+      return (0.05859375 * x * x * (1 + 0.75 * x));
+    };
+
+    var e3fn = function(x) {
+      return (x * x * x * (35 / 3072));
+    };
+
+    var gN = function(a, e, sinphi) {
+      var temp = e * sinphi;
+      return a / Math.sqrt(1 - temp * temp);
+    };
+
+    var adjust_lat = function(x) {
+      return (Math.abs(x) < HALF_PI) ? x : (x - (sign(x) * Math.PI));
+    };
+
+    var imlfn = function(ml, e0, e1, e2, e3) {
+      var phi;
+      var dphi;
+
+      phi = ml / e0;
+      for (var i = 0; i < 15; i++) {
+        dphi = (ml - (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi))) / (e0 - 2 * e1 * Math.cos(2 * phi) + 4 * e2 * Math.cos(4 * phi) - 6 * e3 * Math.cos(6 * phi));
+        phi += dphi;
+        if (Math.abs(dphi) <= 0.0000000001) {
+          return phi;
+        }
+      }
+
+      //..reportError("IMLFN-CONV:Latitude failed to converge after 15 iterations");
+      return NaN;
+    };
+
+    function init$12() {
+      if (!this.sphere) {
+        this.e0 = e0fn(this.es);
+        this.e1 = e1fn(this.es);
+        this.e2 = e2fn(this.es);
+        this.e3 = e3fn(this.es);
+        this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);
+      }
+    }
+
+    /* Cassini forward equations--mapping lat,long to x,y
+      -----------------------------------------------------------------------*/
+    function forward$11(p) {
+
+      /* Forward equations
+          -----------------*/
+      var x, y;
+      var lam = p.x;
+      var phi = p.y;
+      lam = adjust_lon(lam - this.long0);
+
+      if (this.sphere) {
+        x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam));
+        y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0);
+      }
+      else {
+        //ellipsoid
+        var sinphi = Math.sin(phi);
+        var cosphi = Math.cos(phi);
+        var nl = gN(this.a, this.e, sinphi);
+        var tl = Math.tan(phi) * Math.tan(phi);
+        var al = lam * Math.cos(phi);
+        var asq = al * al;
+        var cl = this.es * cosphi * cosphi / (1 - this.es);
+        var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);
+
+        x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120));
+        y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24);
+
+
+      }
+
+      p.x = x + this.x0;
+      p.y = y + this.y0;
+      return p;
+    }
+
+    /* Inverse equations
+      -----------------*/
+    function inverse$11(p) {
+      p.x -= this.x0;
+      p.y -= this.y0;
+      var x = p.x / this.a;
+      var y = p.y / this.a;
+      var phi, lam;
+
+      if (this.sphere) {
+        var dd = y + this.lat0;
+        phi = Math.asin(Math.sin(dd) * Math.cos(x));
+        lam = Math.atan2(Math.tan(x), Math.cos(dd));
+      }
+      else {
+        /* ellipsoid */
+        var ml1 = this.ml0 / this.a + y;
+        var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3);
+        if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) {
+          p.x = this.long0;
+          p.y = HALF_PI;
+          if (y < 0) {
+            p.y *= -1;
+          }
+          return p;
+        }
+        var nl1 = gN(this.a, this.e, Math.sin(phi1));
+
+        var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es);
+        var tl1 = Math.pow(Math.tan(phi1), 2);
+        var dl = x * this.a / nl1;
+        var dsq = dl * dl;
+        phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24);
+        lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1);
+
+      }
+
+      p.x = adjust_lon(lam + this.long0);
+      p.y = adjust_lat(phi);
+      return p;
+
+    }
+
+    var names$13 = ["Cassini", "Cassini_Soldner", "cass"];
+    var cass = {
+      init: init$12,
+      forward: forward$11,
+      inverse: inverse$11,
+      names: names$13
+    };
+
+    var qsfnz = function(eccent, sinphi) {
+      var con;
+      if (eccent > 1.0e-7) {
+        con = eccent * sinphi;
+        return ((1 - eccent * eccent) * (sinphi / (1 - con * con) - (0.5 / eccent) * Math.log((1 - con) / (1 + con))));
+      }
+      else {
+        return (2 * sinphi);
+      }
+    };
+
+    /*
+      reference
+        "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder,
+        The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.
+      */
+
+    var S_POLE = 1;
+
+    var N_POLE = 2;
+    var EQUIT = 3;
+    var OBLIQ = 4;
+
+    /* Initialize the Lambert Azimuthal Equal Area projection
+      ------------------------------------------------------*/
+    function init$13() {
+      var t = Math.abs(this.lat0);
+      if (Math.abs(t - HALF_PI) < EPSLN) {
+        this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE;
+      }
+      else if (Math.abs(t) < EPSLN) {
+        this.mode = this.EQUIT;
+      }
+      else {
+        this.mode = this.OBLIQ;
+      }
+      if (this.es > 0) {
+        var sinphi;
+
+        this.qp = qsfnz(this.e, 1);
+        this.mmf = 0.5 / (1 - this.es);
+        this.apa = authset(this.es);
+        switch (this.mode) {
+        case this.N_POLE:
+          this.dd = 1;
+          break;
+        case this.S_POLE:
+          this.dd = 1;
+          break;
+        case this.EQUIT:
+          this.rq = Math.sqrt(0.5 * this.qp);
+          this.dd = 1 / this.rq;
+          this.xmf = 1;
+          this.ymf = 0.5 * this.qp;
+          break;
+        case this.OBLIQ:
+          this.rq = Math.sqrt(0.5 * this.qp);
+          sinphi = Math.sin(this.lat0);
+          this.sinb1 = qsfnz(this.e, sinphi) / this.qp;
+          this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1);
+          this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * sinphi * sinphi) * this.rq * this.cosb1);
+          this.ymf = (this.xmf = this.rq) / this.dd;
+          this.xmf *= this.dd;
+          break;
+        }
+      }
+      else {
+        if (this.mode === this.OBLIQ) {
+          this.sinph0 = Math.sin(this.lat0);
+          this.cosph0 = Math.cos(this.lat0);
+        }
+      }
+    }
+
+    /* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y
+      -----------------------------------------------------------------------*/
+    function forward$12(p) {
+
+      /* Forward equations
+          -----------------*/
+      var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi;
+      var lam = p.x;
+      var phi = p.y;
+
+      lam = adjust_lon(lam - this.long0);
+      if (this.sphere) {
+        sinphi = Math.sin(phi);
+        cosphi = Math.cos(phi);
+        coslam = Math.cos(lam);
+        if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {
+          y = (this.mode === this.EQUIT) ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam;
+          if (y <= EPSLN) {
+            return null;
+          }
+          y = Math.sqrt(2 / y);
+          x = y * cosphi * Math.sin(lam);
+          y *= (this.mode === this.EQUIT) ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam;
+        }
+        else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {
+          if (this.mode === this.N_POLE) {
+            coslam = -coslam;
+          }
+          if (Math.abs(phi + this.lat0) < EPSLN) {
+            return null;
+          }
+          y = FORTPI - phi * 0.5;
+          y = 2 * ((this.mode === this.S_POLE) ? Math.cos(y) : Math.sin(y));
+          x = y * Math.sin(lam);
+          y *= coslam;
+        }
+      }
+      else {
+        sinb = 0;
+        cosb = 0;
+        b = 0;
+        coslam = Math.cos(lam);
+        sinlam = Math.sin(lam);
+        sinphi = Math.sin(phi);
+        q = qsfnz(this.e, sinphi);
+        if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {
+          sinb = q / this.qp;
+          cosb = Math.sqrt(1 - sinb * sinb);
+        }
+        switch (this.mode) {
+        case this.OBLIQ:
+          b = 1 + this.sinb1 * sinb + this.cosb1 * cosb * coslam;
+          break;
+        case this.EQUIT:
+          b = 1 + cosb * coslam;
+          break;
+        case this.N_POLE:
+          b = HALF_PI + phi;
+          q = this.qp - q;
+          break;
+        case this.S_POLE:
+          b = phi - HALF_PI;
+          q = this.qp + q;
+          break;
+        }
+        if (Math.abs(b) < EPSLN) {
+          return null;
+        }
+        switch (this.mode) {
+        case this.OBLIQ:
+        case this.EQUIT:
+          b = Math.sqrt(2 / b);
+          if (this.mode === this.OBLIQ) {
+            y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam);
+          }
+          else {
+            y = (b = Math.sqrt(2 / (1 + cosb * coslam))) * sinb * this.ymf;
+          }
+          x = this.xmf * b * cosb * sinlam;
+          break;
+        case this.N_POLE:
+        case this.S_POLE:
+          if (q >= 0) {
+            x = (b = Math.sqrt(q)) * sinlam;
+            y = coslam * ((this.mode === this.S_POLE) ? b : -b);
+          }
+          else {
+            x = y = 0;
+          }
+          break;
+        }
+      }
+
+      p.x = this.a * x + this.x0;
+      p.y = this.a * y + this.y0;
+      return p;
+    }
+
+    /* Inverse equations
+      -----------------*/
+    function inverse$12(p) {
+      p.x -= this.x0;
+      p.y -= this.y0;
+      var x = p.x / this.a;
+      var y = p.y / this.a;
+      var lam, phi, cCe, sCe, q, rho, ab;
+      if (this.sphere) {
+        var cosz = 0,
+          rh, sinz = 0;
+
+        rh = Math.sqrt(x * x + y * y);
+        phi = rh * 0.5;
+        if (phi > 1) {
+          return null;
+        }
+        phi = 2 * Math.asin(phi);
+        if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {
+          sinz = Math.sin(phi);
+          cosz = Math.cos(phi);
+        }
+        switch (this.mode) {
+        case this.EQUIT:
+          phi = (Math.abs(rh) <= EPSLN) ? 0 : Math.asin(y * sinz / rh);
+          x *= sinz;
+          y = cosz * rh;
+          break;
+        case this.OBLIQ:
+          phi = (Math.abs(rh) <= EPSLN) ? this.lat0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh);
+          x *= sinz * this.cosph0;
+          y = (cosz - Math.sin(phi) * this.sinph0) * rh;
+          break;
+        case this.N_POLE:
+          y = -y;
+          phi = HALF_PI - phi;
+          break;
+        case this.S_POLE:
+          phi -= HALF_PI;
+          break;
+        }
+        lam = (y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ)) ? 0 : Math.atan2(x, y);
+      }
+      else {
+        ab = 0;
+        if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {
+          x /= this.dd;
+          y *= this.dd;
+          rho = Math.sqrt(x * x + y * y);
+          if (rho < EPSLN) {
+            p.x = this.long0;
+            p.y = this.lat0;
+            return p;
+          }
+          sCe = 2 * Math.asin(0.5 * rho / this.rq);
+          cCe = Math.cos(sCe);
+          x *= (sCe = Math.sin(sCe));
+          if (this.mode === this.OBLIQ) {
+            ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho;
+            q = this.qp * ab;
+            y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe;
+          }
+          else {
+            ab = y * sCe / rho;
+            q = this.qp * ab;
+            y = rho * cCe;
+          }
+        }
+        else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {
+          if (this.mode === this.N_POLE) {
+            y = -y;
+          }
+          q = (x * x + y * y);
+          if (!q) {
+            p.x = this.long0;
+            p.y = this.lat0;
+            return p;
+          }
+          ab = 1 - q / this.qp;
+          if (this.mode === this.S_POLE) {
+            ab = -ab;
+          }
+        }
+        lam = Math.atan2(x, y);
+        phi = authlat(Math.asin(ab), this.apa);
+      }
+
+      p.x = adjust_lon(this.long0 + lam);
+      p.y = phi;
+      return p;
+    }
+
+    /* determine latitude from authalic latitude */
+    var P00 = 0.33333333333333333333;
+
+    var P01 = 0.17222222222222222222;
+    var P02 = 0.10257936507936507936;
+    var P10 = 0.06388888888888888888;
+    var P11 = 0.06640211640211640211;
+    var P20 = 0.01641501294219154443;
+
+    function authset(es) {
+      var t;
+      var APA = [];
+      APA[0] = es * P00;
+      t = es * es;
+      APA[0] += t * P01;
+      APA[1] = t * P10;
+      t *= es;
+      APA[0] += t * P02;
+      APA[1] += t * P11;
+      APA[2] = t * P20;
+      return APA;
+    }
+
+    function authlat(beta, APA) {
+      var t = beta + beta;
+      return (beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t));
+    }
+
+    var names$14 = ["Lambert Azimuthal Equal Area", "Lambert_Azimuthal_Equal_Area", "laea"];
+    var laea = {
+      init: init$13,
+      forward: forward$12,
+      inverse: inverse$12,
+      names: names$14,
+      S_POLE: S_POLE,
+      N_POLE: N_POLE,
+      EQUIT: EQUIT,
+      OBLIQ: OBLIQ
+    };
+
+    var asinz = function(x) {
+      if (Math.abs(x) > 1) {
+        x = (x > 1) ? 1 : -1;
+      }
+      return Math.asin(x);
+    };
+
+    function init$14() {
+
+      if (Math.abs(this.lat1 + this.lat2) < EPSLN) {
+        return;
+      }
+      this.temp = this.b / this.a;
+      this.es = 1 - Math.pow(this.temp, 2);
+      this.e3 = Math.sqrt(this.es);
+
+      this.sin_po = Math.sin(this.lat1);
+      this.cos_po = Math.cos(this.lat1);
+      this.t1 = this.sin_po;
+      this.con = this.sin_po;
+      this.ms1 = msfnz(this.e3, this.sin_po, this.cos_po);
+      this.qs1 = qsfnz(this.e3, this.sin_po, this.cos_po);
+
+      this.sin_po = Math.sin(this.lat2);
+      this.cos_po = Math.cos(this.lat2);
+      this.t2 = this.sin_po;
+      this.ms2 = msfnz(this.e3, this.sin_po, this.cos_po);
+      this.qs2 = qsfnz(this.e3, this.sin_po, this.cos_po);
+
+      this.sin_po = Math.sin(this.lat0);
+      this.cos_po = Math.cos(this.lat0);
+      this.t3 = this.sin_po;
+      this.qs0 = qsfnz(this.e3, this.sin_po, this.cos_po);
+
+      if (Math.abs(this.lat1 - this.lat2) > EPSLN) {
+        this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1);
+      }
+      else {
+        this.ns0 = this.con;
+      }
+      this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1;
+      this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0) / this.ns0;
+    }
+
+    /* Albers Conical Equal Area forward equations--mapping lat,long to x,y
+      -------------------------------------------------------------------*/
+    function forward$13(p) {
+
+      var lon = p.x;
+      var lat = p.y;
+
+      this.sin_phi = Math.sin(lat);
+      this.cos_phi = Math.cos(lat);
+
+      var qs = qsfnz(this.e3, this.sin_phi, this.cos_phi);
+      var rh1 = this.a * Math.sqrt(this.c - this.ns0 * qs) / this.ns0;
+      var theta = this.ns0 * adjust_lon(lon - this.long0);
+      var x = rh1 * Math.sin(theta) + this.x0;
+      var y = this.rh - rh1 * Math.cos(theta) + this.y0;
+
+      p.x = x;
+      p.y = y;
+      return p;
+    }
+
+    function inverse$13(p) {
+      var rh1, qs, con, theta, lon, lat;
+
+      p.x -= this.x0;
+      p.y = this.rh - p.y + this.y0;
+      if (this.ns0 >= 0) {
+        rh1 = Math.sqrt(p.x * p.x + p.y * p.y);
+        con = 1;
+      }
+      else {
+        rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);
+        con = -1;
+      }
+      theta = 0;
+      if (rh1 !== 0) {
+        theta = Math.atan2(con * p.x, con * p.y);
+      }
+      con = rh1 * this.ns0 / this.a;
+      if (this.sphere) {
+        lat = Math.asin((this.c - con * con) / (2 * this.ns0));
+      }
+      else {
+        qs = (this.c - con * con) / this.ns0;
+        lat = this.phi1z(this.e3, qs);
+      }
+
+      lon = adjust_lon(theta / this.ns0 + this.long0);
+      p.x = lon;
+      p.y = lat;
+      return p;
+    }
+
+    /* Function to compute phi1, the latitude for the inverse of the
+       Albers Conical Equal-Area projection.
+    -------------------------------------------*/
+    function phi1z(eccent, qs) {
+      var sinphi, cosphi, con, com, dphi;
+      var phi = asinz(0.5 * qs);
+      if (eccent < EPSLN) {
+        return phi;
+      }
+
+      var eccnts = eccent * eccent;
+      for (var i = 1; i <= 25; i++) {
+        sinphi = Math.sin(phi);
+        cosphi = Math.cos(phi);
+        con = eccent * sinphi;
+        com = 1 - con * con;
+        dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con)));
+        phi = phi + dphi;
+        if (Math.abs(dphi) <= 1e-7) {
+          return phi;
+        }
+      }
+      return null;
+    }
+
+    var names$15 = ["Albers_Conic_Equal_Area", "Albers", "aea"];
+    var aea = {
+      init: init$14,
+      forward: forward$13,
+      inverse: inverse$13,
+      names: names$15,
+      phi1z: phi1z
+    };
+
+    /*
+      reference:
+        Wolfram Mathworld "Gnomonic Projection"
+        http://mathworld.wolfram.com/GnomonicProjection.html
+        Accessed: 12th November 2009
+      */
+    function init$15() {
+
+      /* Place parameters in static storage for common use
+          -------------------------------------------------*/
+      this.sin_p14 = Math.sin(this.lat0);
+      this.cos_p14 = Math.cos(this.lat0);
+      // Approximation for projecting points to the horizon (infinity)
+      this.infinity_dist = 1000 * this.a;
+      this.rc = 1;
+    }
+
+    /* Gnomonic forward equations--mapping lat,long to x,y
+        ---------------------------------------------------*/
+    function forward$14(p) {
+      var sinphi, cosphi; /* sin and cos value        */
+      var dlon; /* delta longitude value      */
+      var coslon; /* cos of longitude        */
+      var ksp; /* scale factor          */
+      var g;
+      var x, y;
+      var lon = p.x;
+      var lat = p.y;
+      /* Forward equations
+          -----------------*/
+      dlon = adjust_lon(lon - this.long0);
+
+      sinphi = Math.sin(lat);
+      cosphi = Math.cos(lat);
+
+      coslon = Math.cos(dlon);
+      g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;
+      ksp = 1;
+      if ((g > 0) || (Math.abs(g) <= EPSLN)) {
+        x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g;
+        y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g;
+      }
+      else {
+
+        // Point is in the opposing hemisphere and is unprojectable
+        // We still need to return a reasonable point, so we project
+        // to infinity, on a bearing
+        // equivalent to the northern hemisphere equivalent
+        // This is a reasonable approximation for short shapes and lines that
+        // straddle the horizon.
+
+        x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon);
+        y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);
+
+      }
+      p.x = x;
+      p.y = y;
+      return p;
+    }
+
+    function inverse$14(p) {
+      var rh; /* Rho */
+      var sinc, cosc;
+      var c;
+      var lon, lat;
+
+      /* Inverse equations
+          -----------------*/
+      p.x = (p.x - this.x0) / this.a;
+      p.y = (p.y - this.y0) / this.a;
+
+      p.x /= this.k0;
+      p.y /= this.k0;
+
+      if ((rh = Math.sqrt(p.x * p.x + p.y * p.y))) {
+        c = Math.atan2(rh, this.rc);
+        sinc = Math.sin(c);
+        cosc = Math.cos(c);
+
+        lat = asinz(cosc * this.sin_p14 + (p.y * sinc * this.cos_p14) / rh);
+        lon = Math.atan2(p.x * sinc, rh * this.cos_p14 * cosc - p.y * this.sin_p14 * sinc);
+        lon = adjust_lon(this.long0 + lon);
+      }
+      else {
+        lat = this.phic0;
+        lon = 0;
+      }
+
+      p.x = lon;
+      p.y = lat;
+      return p;
+    }
+
+    var names$16 = ["gnom"];
+    var gnom = {
+      init: init$15,
+      forward: forward$14,
+      inverse: inverse$14,
+      names: names$16
+    };
+
+    var iqsfnz = function(eccent, q) {
+      var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent));
+      if (Math.abs(Math.abs(q) - temp) < 1.0E-6) {
+        if (q < 0) {
+          return (-1 * HALF_PI);
+        }
+        else {
+          return HALF_PI;
+        }
+      }
+      //var phi = 0.5* q/(1-eccent*eccent);
+      var phi = Math.asin(0.5 * q);
+      var dphi;
+      var sin_phi;
+      var cos_phi;
+      var con;
+      for (var i = 0; i < 30; i++) {
+        sin_phi = Math.sin(phi);
+        cos_phi = Math.cos(phi);
+        con = eccent * sin_phi;
+        dphi = Math.pow(1 - con * con, 2) / (2 * cos_phi) * (q / (1 - eccent * eccent) - sin_phi / (1 - con * con) + 0.5 / eccent * Math.log((1 - con) / (1 + con)));
+        phi += dphi;
+        if (Math.abs(dphi) <= 0.0000000001) {
+          return phi;
+        }
+      }
+
+      //console.log("IQSFN-CONV:Latitude failed to converge after 30 iterations");
+      return NaN;
+    };
+
+    /*
+      reference:
+        "Cartographic Projection Procedures for the UNIX Environment-
+        A User's Manual" by Gerald I. Evenden,
+        USGS Open File Report 90-284and Release 4 Interim Reports (2003)
+    */
+    function init$16() {
+      //no-op
+      if (!this.sphere) {
+        this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));
+      }
+    }
+
+    /* Cylindrical Equal Area forward equations--mapping lat,long to x,y
+        ------------------------------------------------------------*/
+    function forward$15(p) {
+      var lon = p.x;
+      var lat = p.y;
+      var x, y;
+      /* Forward equations
+          -----------------*/
+      var dlon = adjust_lon(lon - this.long0);
+      if (this.sphere) {
+        x = this.x0 + this.a * dlon * Math.cos(this.lat_ts);
+        y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts);
+      }
+      else {
+        var qs = qsfnz(this.e, Math.sin(lat));
+        x = this.x0 + this.a * this.k0 * dlon;
+        y = this.y0 + this.a * qs * 0.5 / this.k0;
+      }
+
+      p.x = x;
+      p.y = y;
+      return p;
+    }
+
+    /* Cylindrical Equal Area inverse equations--mapping x,y to lat/long
+        ------------------------------------------------------------*/
+    function inverse$15(p) {
+      p.x -= this.x0;
+      p.y -= this.y0;
+      var lon, lat;
+
+      if (this.sphere) {
+        lon = adjust_lon(this.long0 + (p.x / this.a) / Math.cos(this.lat_ts));
+        lat = Math.asin((p.y / this.a) * Math.cos(this.lat_ts));
+      }
+      else {
+        lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a);
+        lon = adjust_lon(this.long0 + p.x / (this.a * this.k0));
+      }
+
+      p.x = lon;
+      p.y = lat;
+      return p;
+    }
+
+    var names$17 = ["cea"];
+    var cea = {
+      init: init$16,
+      forward: forward$15,
+      inverse: inverse$15,
+      names: names$17
+    };
+
+    function init$17() {
+
+      this.x0 = this.x0 || 0;
+      this.y0 = this.y0 || 0;
+      this.lat0 = this.lat0 || 0;
+      this.long0 = this.long0 || 0;
+      this.lat_ts = this.lat_ts || 0;
+      this.title = this.title || "Equidistant Cylindrical (Plate Carre)";
+
+      this.rc = Math.cos(this.lat_ts);
+    }
+
+    // forward equations--mapping lat,long to x,y
+    // -----------------------------------------------------------------
+    function forward$16(p) {
+
+      var lon = p.x;
+      var lat = p.y;
+
+      var dlon = adjust_lon(lon - this.long0);
+      var dlat = adjust_lat(lat - this.lat0);
+      p.x = this.x0 + (this.a * dlon * this.rc);
+      p.y = this.y0 + (this.a * dlat);
+      return p;
+    }
+
+    // inverse equations--mapping x,y to lat/long
+    // -----------------------------------------------------------------
+    function inverse$16(p) {
+
+      var x = p.x;
+      var y = p.y;
+
+      p.x = adjust_lon(this.long0 + ((x - this.x0) / (this.a * this.rc)));
+      p.y = adjust_lat(this.lat0 + ((y - this.y0) / (this.a)));
+      return p;
+    }
+
+    var names$18 = ["Equirectangular", "Equidistant_Cylindrical", "eqc"];
+    var eqc = {
+      init: init$17,
+      forward: forward$16,
+      inverse: inverse$16,
+      names: names$18
+    };
+
+    var MAX_ITER$2 = 20;
+
+    function init$18() {
+      /* Place parameters in static storage for common use
+          -------------------------------------------------*/
+      this.temp = this.b / this.a;
+      this.es = 1 - Math.pow(this.temp, 2); // devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles
+      this.e = Math.sqrt(this.es);
+      this.e0 = e0fn(this.es);
+      this.e1 = e1fn(this.es);
+      this.e2 = e2fn(this.es);
+      this.e3 = e3fn(this.es);
+      this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); //si que des zeros le calcul ne se fait pas
+    }
+
+    /* Polyconic forward equations--mapping lat,long to x,y
+        ---------------------------------------------------*/
+    function forward$17(p) {
+      var lon = p.x;
+      var lat = p.y;
+      var x, y, el;
+      var dlon = adjust_lon(lon - this.long0);
+      el = dlon * Math.sin(lat);
+      if (this.sphere) {
+        if (Math.abs(lat) <= EPSLN) {
+          x = this.a * dlon;
+          y = -1 * this.a * this.lat0;
+        }
+        else {
+          x = this.a * Math.sin(el) / Math.tan(lat);
+          y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat));
+        }
+      }
+      else {
+        if (Math.abs(lat) <= EPSLN) {
+          x = this.a * dlon;
+          y = -1 * this.ml0;
+        }
+        else {
+          var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat);
+          x = nl * Math.sin(el);
+          y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el));
+        }
+
+      }
+      p.x = x + this.x0;
+      p.y = y + this.y0;
+      return p;
+    }
+
+    /* Inverse equations
+      -----------------*/
+    function inverse$17(p) {
+      var lon, lat, x, y, i;
+      var al, bl;
+      var phi, dphi;
+      x = p.x - this.x0;
+      y = p.y - this.y0;
+
+      if (this.sphere) {
+        if (Math.abs(y + this.a * this.lat0) <= EPSLN) {
+          lon = adjust_lon(x / this.a + this.long0);
+          lat = 0;
+        }
+        else {
+          al = this.lat0 + y / this.a;
+          bl = x * x / this.a / this.a + al * al;
+          phi = al;
+          var tanphi;
+          for (i = MAX_ITER$2; i; --i) {
+            tanphi = Math.tan(phi);
+            dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1);
+            phi += dphi;
+            if (Math.abs(dphi) <= EPSLN) {
+              lat = phi;
+              break;
+            }
+          }
+          lon = adjust_lon(this.long0 + (Math.asin(x * Math.tan(phi) / this.a)) / Math.sin(lat));
+        }
+      }
+      else {
+        if (Math.abs(y + this.ml0) <= EPSLN) {
+          lat = 0;
+          lon = adjust_lon(this.long0 + x / this.a);
+        }
+        else {
+
+          al = (this.ml0 + y) / this.a;
+          bl = x * x / this.a / this.a + al * al;
+          phi = al;
+          var cl, mln, mlnp, ma;
+          var con;
+          for (i = MAX_ITER$2; i; --i) {
+            con = this.e * Math.sin(phi);
+            cl = Math.sqrt(1 - con * con) * Math.tan(phi);
+            mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);
+            mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi);
+            ma = mln / this.a;
+            dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp);
+            phi -= dphi;
+            if (Math.abs(dphi) <= EPSLN) {
+              lat = phi;
+              break;
+            }
+          }
+
+          //lat=phi4z(this.e,this.e0,this.e1,this.e2,this.e3,al,bl,0,0);
+          cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat);
+          lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat));
+        }
+      }
+
+      p.x = lon;
+      p.y = lat;
+      return p;
+    }
+
+    var names$19 = ["Polyconic", "poly"];
+    var poly = {
+      init: init$18,
+      forward: forward$17,
+      inverse: inverse$17,
+      names: names$19
+    };
+
+    /*
+      reference
+        Department of Land and Survey Technical Circular 1973/32
+          http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf
+        OSG Technical Report 4.1
+          http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf
+      */
+
+    /**
+     * iterations: Number of iterations to refine inverse transform.
+     *     0 -> km accuracy
+     *     1 -> m accuracy -- suitable for most mapping applications
+     *     2 -> mm accuracy
+     */
+
+
+    function init$19() {
+      this.A = [];
+      this.A[1] = 0.6399175073;
+      this.A[2] = -0.1358797613;
+      this.A[3] = 0.063294409;
+      this.A[4] = -0.02526853;
+      this.A[5] = 0.0117879;
+      this.A[6] = -0.0055161;
+      this.A[7] = 0.0026906;
+      this.A[8] = -0.001333;
+      this.A[9] = 0.00067;
+      this.A[10] = -0.00034;
+
+      this.B_re = [];
+      this.B_im = [];
+      this.B_re[1] = 0.7557853228;
+      this.B_im[1] = 0;
+      this.B_re[2] = 0.249204646;
+      this.B_im[2] = 0.003371507;
+      this.B_re[3] = -0.001541739;
+      this.B_im[3] = 0.041058560;
+      this.B_re[4] = -0.10162907;
+      this.B_im[4] = 0.01727609;
+      this.B_re[5] = -0.26623489;
+      this.B_im[5] = -0.36249218;
+      this.B_re[6] = -0.6870983;
+      this.B_im[6] = -1.1651967;
+
+      this.C_re = [];
+      this.C_im = [];
+      this.C_re[1] = 1.3231270439;
+      this.C_im[1] = 0;
+      this.C_re[2] = -0.577245789;
+      this.C_im[2] = -0.007809598;
+      this.C_re[3] = 0.508307513;
+      this.C_im[3] = -0.112208952;
+      this.C_re[4] = -0.15094762;
+      this.C_im[4] = 0.18200602;
+      this.C_re[5] = 1.01418179;
+      this.C_im[5] = 1.64497696;
+      this.C_re[6] = 1.9660549;
+      this.C_im[6] = 2.5127645;
+
+      this.D = [];
+      this.D[1] = 1.5627014243;
+      this.D[2] = 0.5185406398;
+      this.D[3] = -0.03333098;
+      this.D[4] = -0.1052906;
+      this.D[5] = -0.0368594;
+      this.D[6] = 0.007317;
+      this.D[7] = 0.01220;
+      this.D[8] = 0.00394;
+      this.D[9] = -0.0013;
+    }
+
+    /**
+        New Zealand Map Grid Forward  - long/lat to x/y
+        long/lat in radians
+      */
+    function forward$18(p) {
+      var n;
+      var lon = p.x;
+      var lat = p.y;
+
+      var delta_lat = lat - this.lat0;
+      var delta_lon = lon - this.long0;
+
+      // 1. Calculate d_phi and d_psi    ...                          // and d_lambda
+      // For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians.
+      var d_phi = delta_lat / SEC_TO_RAD * 1E-5;
+      var d_lambda = delta_lon;
+      var d_phi_n = 1; // d_phi^0
+
+      var d_psi = 0;
+      for (n = 1; n <= 10; n++) {
+        d_phi_n = d_phi_n * d_phi;
+        d_psi = d_psi + this.A[n] * d_phi_n;
+      }
+
+      // 2. Calculate theta
+      var th_re = d_psi;
+      var th_im = d_lambda;
+
+      // 3. Calculate z
+      var th_n_re = 1;
+      var th_n_im = 0; // theta^0
+      var th_n_re1;
+      var th_n_im1;
+
+      var z_re = 0;
+      var z_im = 0;
+      for (n = 1; n <= 6; n++) {
+        th_n_re1 = th_n_re * th_re - th_n_im * th_im;
+        th_n_im1 = th_n_im * th_re + th_n_re * th_im;
+        th_n_re = th_n_re1;
+        th_n_im = th_n_im1;
+        z_re = z_re + this.B_re[n] * th_n_re - this.B_im[n] * th_n_im;
+        z_im = z_im + this.B_im[n] * th_n_re + this.B_re[n] * th_n_im;
+      }
+
+      // 4. Calculate easting and northing
+      p.x = (z_im * this.a) + this.x0;
+      p.y = (z_re * this.a) + this.y0;
+
+      return p;
+    }
+
+    /**
+        New Zealand Map Grid Inverse  -  x/y to long/lat
+      */
+    function inverse$18(p) {
+      var n;
+      var x = p.x;
+      var y = p.y;
+
+      var delta_x = x - this.x0;
+      var delta_y = y - this.y0;
+
+      // 1. Calculate z
+      var z_re = delta_y / this.a;
+      var z_im = delta_x / this.a;
+
+      // 2a. Calculate theta - first approximation gives km accuracy
+      var z_n_re = 1;
+      var z_n_im = 0; // z^0
+      var z_n_re1;
+      var z_n_im1;
+
+      var th_re = 0;
+      var th_im = 0;
+      for (n = 1; n <= 6; n++) {
+        z_n_re1 = z_n_re * z_re - z_n_im * z_im;
+        z_n_im1 = z_n_im * z_re + z_n_re * z_im;
+        z_n_re = z_n_re1;
+        z_n_im = z_n_im1;
+        th_re = th_re + this.C_re[n] * z_n_re - this.C_im[n] * z_n_im;
+        th_im = th_im + this.C_im[n] * z_n_re + this.C_re[n] * z_n_im;
+      }
+
+      // 2b. Iterate to refine the accuracy of the calculation
+      //        0 iterations gives km accuracy
+      //        1 iteration gives m accuracy -- good enough for most mapping applications
+      //        2 iterations bives mm accuracy
+      for (var i = 0; i < this.iterations; i++) {
+        var th_n_re = th_re;
+        var th_n_im = th_im;
+        var th_n_re1;
+        var th_n_im1;
+
+        var num_re = z_re;
+        var num_im = z_im;
+        for (n = 2; n <= 6; n++) {
+          th_n_re1 = th_n_re * th_re - th_n_im * th_im;
+          th_n_im1 = th_n_im * th_re + th_n_re * th_im;
+          th_n_re = th_n_re1;
+          th_n_im = th_n_im1;
+          num_re = num_re + (n - 1) * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);
+          num_im = num_im + (n - 1) * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);
+        }
+
+        th_n_re = 1;
+        th_n_im = 0;
+        var den_re = this.B_re[1];
+        var den_im = this.B_im[1];
+        for (n = 2; n <= 6; n++) {
+          th_n_re1 = th_n_re * th_re - th_n_im * th_im;
+          th_n_im1 = th_n_im * th_re + th_n_re * th_im;
+          th_n_re = th_n_re1;
+          th_n_im = th_n_im1;
+          den_re = den_re + n * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);
+          den_im = den_im + n * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);
+        }
+
+        // Complex division
+        var den2 = den_re * den_re + den_im * den_im;
+        th_re = (num_re * den_re + num_im * den_im) / den2;
+        th_im = (num_im * den_re - num_re * den_im) / den2;
+      }
+
+      // 3. Calculate d_phi              ...                                    // and d_lambda
+      var d_psi = th_re;
+      var d_lambda = th_im;
+      var d_psi_n = 1; // d_psi^0
+
+      var d_phi = 0;
+      for (n = 1; n <= 9; n++) {
+        d_psi_n = d_psi_n * d_psi;
+        d_phi = d_phi + this.D[n] * d_psi_n;
+      }
+
+      // 4. Calculate latitude and longitude
+      // d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians.
+      var lat = this.lat0 + (d_phi * SEC_TO_RAD * 1E5);
+      var lon = this.long0 + d_lambda;
+
+      p.x = lon;
+      p.y = lat;
+
+      return p;
+    }
+
+    var names$20 = ["New_Zealand_Map_Grid", "nzmg"];
+    var nzmg = {
+      init: init$19,
+      forward: forward$18,
+      inverse: inverse$18,
+      names: names$20
+    };
+
+    /*
+      reference
+        "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder,
+        The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.
+      */
+
+
+    /* Initialize the Miller Cylindrical projection
+      -------------------------------------------*/
+    function init$20() {
+      //no-op
+    }
+
+    /* Miller Cylindrical forward equations--mapping lat,long to x,y
+        ------------------------------------------------------------*/
+    function forward$19(p) {
+      var lon = p.x;
+      var lat = p.y;
+      /* Forward equations
+          -----------------*/
+      var dlon = adjust_lon(lon - this.long0);
+      var x = this.x0 + this.a * dlon;
+      var y = this.y0 + this.a * Math.log(Math.tan((Math.PI / 4) + (lat / 2.5))) * 1.25;
+
+      p.x = x;
+      p.y = y;
+      return p;
+    }
+
+    /* Miller Cylindrical inverse equations--mapping x,y to lat/long
+        ------------------------------------------------------------*/
+    function inverse$19(p) {
+      p.x -= this.x0;
+      p.y -= this.y0;
+
+      var lon = adjust_lon(this.long0 + p.x / this.a);
+      var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4);
+
+      p.x = lon;
+      p.y = lat;
+      return p;
+    }
+
+    var names$21 = ["Miller_Cylindrical", "mill"];
+    var mill = {
+      init: init$20,
+      forward: forward$19,
+      inverse: inverse$19,
+      names: names$21
+    };
+
+    var MAX_ITER$3 = 20;
+    function init$21() {
+      /* Place parameters in static storage for common use
+        -------------------------------------------------*/
+
+
+      if (!this.sphere) {
+        this.en = pj_enfn(this.es);
+      }
+      else {
+        this.n = 1;
+        this.m = 0;
+        this.es = 0;
+        this.C_y = Math.sqrt((this.m + 1) / this.n);
+        this.C_x = this.C_y / (this.m + 1);
+      }
+
+    }
+
+    /* Sinusoidal forward equations--mapping lat,long to x,y
+      -----------------------------------------------------*/
+    function forward$20(p) {
+      var x, y;
+      var lon = p.x;
+      var lat = p.y;
+      /* Forward equations
+        -----------------*/
+      lon = adjust_lon(lon - this.long0);
+
+      if (this.sphere) {
+        if (!this.m) {
+          lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat;
+        }
+        else {
+          var k = this.n * Math.sin(lat);
+          for (var i = MAX_ITER$3; i; --i) {
+            var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat));
+            lat -= V;
+            if (Math.abs(V) < EPSLN) {
+              break;
+            }
+          }
+        }
+        x = this.a * this.C_x * lon * (this.m + Math.cos(lat));
+        y = this.a * this.C_y * lat;
+
+      }
+      else {
+
+        var s = Math.sin(lat);
+        var c = Math.cos(lat);
+        y = this.a * pj_mlfn(lat, s, c, this.en);
+        x = this.a * lon * c / Math.sqrt(1 - this.es * s * s);
+      }
+
+      p.x = x;
+      p.y = y;
+      return p;
+    }
+
+    function inverse$20(p) {
+      var lat, temp, lon, s;
+
+      p.x -= this.x0;
+      lon = p.x / this.a;
+      p.y -= this.y0;
+      lat = p.y / this.a;
+
+      if (this.sphere) {
+        lat /= this.C_y;
+        lon = lon / (this.C_x * (this.m + Math.cos(lat)));
+        if (this.m) {
+          lat = asinz((this.m * lat + Math.sin(lat)) / this.n);
+        }
+        else if (this.n !== 1) {
+          lat = asinz(Math.sin(lat) / this.n);
+        }
+        lon = adjust_lon(lon + this.long0);
+        lat = adjust_lat(lat);
+      }
+      else {
+        lat = pj_inv_mlfn(p.y / this.a, this.es, this.en);
+        s = Math.abs(lat);
+        if (s < HALF_PI) {
+          s = Math.sin(lat);
+          temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat));
+          //temp = this.long0 + p.x / (this.a * Math.cos(lat));
+          lon = adjust_lon(temp);
+        }
+        else if ((s - EPSLN) < HALF_PI) {
+          lon = this.long0;
+        }
+      }
+      p.x = lon;
+      p.y = lat;
+      return p;
+    }
+
+    var names$22 = ["Sinusoidal", "sinu"];
+    var sinu = {
+      init: init$21,
+      forward: forward$20,
+      inverse: inverse$20,
+      names: names$22
+    };
+
+    function init$22() {}
+    /* Mollweide forward equations--mapping lat,long to x,y
+        ----------------------------------------------------*/
+    function forward$21(p) {
+
+      /* Forward equations
+          -----------------*/
+      var lon = p.x;
+      var lat = p.y;
+
+      var delta_lon = adjust_lon(lon - this.long0);
+      var theta = lat;
+      var con = Math.PI * Math.sin(lat);
+
+      /* Iterate using the Newton-Raphson method to find theta
+          -----------------------------------------------------*/
+      while (true) {
+        var delta_theta = -(theta + Math.sin(theta) - con) / (1 + Math.cos(theta));
+        theta += delta_theta;
+        if (Math.abs(delta_theta) < EPSLN) {
+          break;
+        }
+      }
+      theta /= 2;
+
+      /* If the latitude is 90 deg, force the x coordinate to be "0 + false easting"
+           this is done here because of precision problems with "cos(theta)"
+           --------------------------------------------------------------------------*/
+      if (Math.PI / 2 - Math.abs(lat) < EPSLN) {
+        delta_lon = 0;
+      }
+      var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0;
+      var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0;
+
+      p.x = x;
+      p.y = y;
+      return p;
+    }
+
+    function inverse$21(p) {
+      var theta;
+      var arg;
+
+      /* Inverse equations
+          -----------------*/
+      p.x -= this.x0;
+      p.y -= this.y0;
+      arg = p.y / (1.4142135623731 * this.a);
+
+      /* Because of division by zero problems, 'arg' can not be 1.  Therefore
+           a number very close to one is used instead.
+           -------------------------------------------------------------------*/
+      if (Math.abs(arg) > 0.999999999999) {
+        arg = 0.999999999999;
+      }
+      theta = Math.asin(arg);
+      var lon = adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta))));
+      if (lon < (-Math.PI)) {
+        lon = -Math.PI;
+      }
+      if (lon > Math.PI) {
+        lon = Math.PI;
+      }
+      arg = (2 * theta + Math.sin(2 * theta)) / Math.PI;
+      if (Math.abs(arg) > 1) {
+        arg = 1;
+      }
+      var lat = Math.asin(arg);
+
+      p.x = lon;
+      p.y = lat;
+      return p;
+    }
+
+    var names$23 = ["Mollweide", "moll"];
+    var moll = {
+      init: init$22,
+      forward: forward$21,
+      inverse: inverse$21,
+      names: names$23
+    };
+
+    function init$23() {
+
+      /* Place parameters in static storage for common use
+          -------------------------------------------------*/
+      // Standard Parallels cannot be equal and on opposite sides of the equator
+      if (Math.abs(this.lat1 + this.lat2) < EPSLN) {
+        return;
+      }
+      this.lat2 = this.lat2 || this.lat1;
+      this.temp = this.b / this.a;
+      this.es = 1 - Math.pow(this.temp, 2);
+      this.e = Math.sqrt(this.es);
+      this.e0 = e0fn(this.es);
+      this.e1 = e1fn(this.es);
+      this.e2 = e2fn(this.es);
+      this.e3 = e3fn(this.es);
+
+      this.sinphi = Math.sin(this.lat1);
+      this.cosphi = Math.cos(this.lat1);
+
+      this.ms1 = msfnz(this.e, this.sinphi, this.cosphi);
+      this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1);
+
+      if (Math.abs(this.lat1 - this.lat2) < EPSLN) {
+        this.ns = this.sinphi;
+      }
+      else {
+        this.sinphi = Math.sin(this.lat2);
+        this.cosphi = Math.cos(this.lat2);
+        this.ms2 = msfnz(this.e, this.sinphi, this.cosphi);
+        this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2);
+        this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1);
+      }
+      this.g = this.ml1 + this.ms1 / this.ns;
+      this.ml0 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);
+      this.rh = this.a * (this.g - this.ml0);
+    }
+
+    /* Equidistant Conic forward equations--mapping lat,long to x,y
+      -----------------------------------------------------------*/
+    function forward$22(p) {
+      var lon = p.x;
+      var lat = p.y;
+      var rh1;
+
+      /* Forward equations
+          -----------------*/
+      if (this.sphere) {
+        rh1 = this.a * (this.g - lat);
+      }
+      else {
+        var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat);
+        rh1 = this.a * (this.g - ml);
+      }
+      var theta = this.ns * adjust_lon(lon - this.long0);
+      var x = this.x0 + rh1 * Math.sin(theta);
+      var y = this.y0 + this.rh - rh1 * Math.cos(theta);
+      p.x = x;
+      p.y = y;
+      return p;
+    }
+
+    /* Inverse equations
+      -----------------*/
+    function inverse$22(p) {
+      p.x -= this.x0;
+      p.y = this.rh - p.y + this.y0;
+      var con, rh1, lat, lon;
+      if (this.ns >= 0) {
+        rh1 = Math.sqrt(p.x * p.x + p.y * p.y);
+        con = 1;
+      }
+      else {
+        rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);
+        con = -1;
+      }
+      var theta = 0;
+      if (rh1 !== 0) {
+        theta = Math.atan2(con * p.x, con * p.y);
+      }
+
+      if (this.sphere) {
+        lon = adjust_lon(this.long0 + theta / this.ns);
+        lat = adjust_lat(this.g - rh1 / this.a);
+        p.x = lon;
+        p.y = lat;
+        return p;
+      }
+      else {
+        var ml = this.g - rh1 / this.a;
+        lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3);
+        lon = adjust_lon(this.long0 + theta / this.ns);
+        p.x = lon;
+        p.y = lat;
+        return p;
+      }
+
+    }
+
+    var names$24 = ["Equidistant_Conic", "eqdc"];
+    var eqdc = {
+      init: init$23,
+      forward: forward$22,
+      inverse: inverse$22,
+      names: names$24
+    };
+
+    /* Initialize the Van Der Grinten projection
+      ----------------------------------------*/
+    function init$24() {
+      //this.R = 6370997; //Radius of earth
+      this.R = this.a;
+    }
+
+    function forward$23(p) {
+
+      var lon = p.x;
+      var lat = p.y;
+
+      /* Forward equations
+        -----------------*/
+      var dlon = adjust_lon(lon - this.long0);
+      var x, y;
+
+      if (Math.abs(lat) <= EPSLN) {
+        x = this.x0 + this.R * dlon;
+        y = this.y0;
+      }
+      var theta = asinz(2 * Math.abs(lat / Math.PI));
+      if ((Math.abs(dlon) <= EPSLN) || (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN)) {
+        x = this.x0;
+        if (lat >= 0) {
+          y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta);
+        }
+        else {
+          y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta);
+        }
+        //  return(OK);
+      }
+      var al = 0.5 * Math.abs((Math.PI / dlon) - (dlon / Math.PI));
+      var asq = al * al;
+      var sinth = Math.sin(theta);
+      var costh = Math.cos(theta);
+
+      var g = costh / (sinth + costh - 1);
+      var gsq = g * g;
+      var m = g * (2 / sinth - 1);
+      var msq = m * m;
+      var con = Math.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq);
+      if (dlon < 0) {
+        con = -con;
+      }
+      x = this.x0 + con;
+      //con = Math.abs(con / (Math.PI * this.R));
+      var q = asq + g;
+      con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq);
+      if (lat >= 0) {
+        //y = this.y0 + Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con);
+        y = this.y0 + con;
+      }
+      else {
+        //y = this.y0 - Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con);
+        y = this.y0 - con;
+      }
+      p.x = x;
+      p.y = y;
+      return p;
+    }
+
+    /* Van Der Grinten inverse equations--mapping x,y to lat/long
+      ---------------------------------------------------------*/
+    function inverse$23(p) {
+      var lon, lat;
+      var xx, yy, xys, c1, c2, c3;
+      var a1;
+      var m1;
+      var con;
+      var th1;
+      var d;
+
+      /* inverse equations
+        -----------------*/
+      p.x -= this.x0;
+      p.y -= this.y0;
+      con = Math.PI * this.R;
+      xx = p.x / con;
+      yy = p.y / con;
+      xys = xx * xx + yy * yy;
+      c1 = -Math.abs(yy) * (1 + xys);
+      c2 = c1 - 2 * yy * yy + xx * xx;
+      c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys;
+      d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27;
+      a1 = (c1 - c2 * c2 / 3 / c3) / c3;
+      m1 = 2 * Math.sqrt(-a1 / 3);
+      con = ((3 * d) / a1) / m1;
+      if (Math.abs(con) > 1) {
+        if (con >= 0) {
+          con = 1;
+        }
+        else {
+          con = -1;
+        }
+      }
+      th1 = Math.acos(con) / 3;
+      if (p.y >= 0) {
+        lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;
+      }
+      else {
+        lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;
+      }
+
+      if (Math.abs(xx) < EPSLN) {
+        lon = this.long0;
+      }
+      else {
+        lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx);
+      }
+
+      p.x = lon;
+      p.y = lat;
+      return p;
+    }
+
+    var names$25 = ["Van_der_Grinten_I", "VanDerGrinten", "vandg"];
+    var vandg = {
+      init: init$24,
+      forward: forward$23,
+      inverse: inverse$23,
+      names: names$25
+    };
+
+    function init$25() {
+      this.sin_p12 = Math.sin(this.lat0);
+      this.cos_p12 = Math.cos(this.lat0);
+    }
+
+    function forward$24(p) {
+      var lon = p.x;
+      var lat = p.y;
+      var sinphi = Math.sin(p.y);
+      var cosphi = Math.cos(p.y);
+      var dlon = adjust_lon(lon - this.long0);
+      var e0, e1, e2, e3, Mlp, Ml, tanphi, Nl1, Nl, psi, Az, G, H, GH, Hs, c, kp, cos_c, s, s2, s3, s4, s5;
+      if (this.sphere) {
+        if (Math.abs(this.sin_p12 - 1) <= EPSLN) {
+          //North Pole case
+          p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon);
+          p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon);
+          return p;
+        }
+        else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {
+          //South Pole case
+          p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon);
+          p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon);
+          return p;
+        }
+        else {
+          //default case
+          cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon);
+          c = Math.acos(cos_c);
+          kp = c ? c / Math.sin(c) : 1;
+          p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon);
+          p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon));
+          return p;
+        }
+      }
+      else {
+        e0 = e0fn(this.es);
+        e1 = e1fn(this.es);
+        e2 = e2fn(this.es);
+        e3 = e3fn(this.es);
+        if (Math.abs(this.sin_p12 - 1) <= EPSLN) {
+          //North Pole case
+          Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);
+          Ml = this.a * mlfn(e0, e1, e2, e3, lat);
+          p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon);
+          p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon);
+          return p;
+        }
+        else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {
+          //South Pole case
+          Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);
+          Ml = this.a * mlfn(e0, e1, e2, e3, lat);
+          p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon);
+          p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon);
+          return p;
+        }
+        else {
+          //Default case
+          tanphi = sinphi / cosphi;
+          Nl1 = gN(this.a, this.e, this.sin_p12);
+          Nl = gN(this.a, this.e, sinphi);
+          psi = Math.atan((1 - this.es) * tanphi + this.es * Nl1 * this.sin_p12 / (Nl * cosphi));
+          Az = Math.atan2(Math.sin(dlon), this.cos_p12 * Math.tan(psi) - this.sin_p12 * Math.cos(dlon));
+          if (Az === 0) {
+            s = Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi));
+          }
+          else if (Math.abs(Math.abs(Az) - Math.PI) <= EPSLN) {
+            s = -Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi));
+          }
+          else {
+            s = Math.asin(Math.sin(dlon) * Math.cos(psi) / Math.sin(Az));
+          }
+          G = this.e * this.sin_p12 / Math.sqrt(1 - this.es);
+          H = this.e * this.cos_p12 * Math.cos(Az) / Math.sqrt(1 - this.es);
+          GH = G * H;
+          Hs = H * H;
+          s2 = s * s;
+          s3 = s2 * s;
+          s4 = s3 * s;
+          s5 = s4 * s;
+          c = Nl1 * s * (1 - s2 * Hs * (1 - Hs) / 6 + s3 / 8 * GH * (1 - 2 * Hs) + s4 / 120 * (Hs * (4 - 7 * Hs) - 3 * G * G * (1 - 7 * Hs)) - s5 / 48 * GH);
+          p.x = this.x0 + c * Math.sin(Az);
+          p.y = this.y0 + c * Math.cos(Az);
+          return p;
+        }
+      }
+
+
+    }
+
+    function inverse$24(p) {
+      p.x -= this.x0;
+      p.y -= this.y0;
+      var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, N1, psi, Az, cosAz, tmp, A, B, D, Ee, F, sinpsi;
+      if (this.sphere) {
+        rh = Math.sqrt(p.x * p.x + p.y * p.y);
+        if (rh > (2 * HALF_PI * this.a)) {
+          return;
+        }
+        z = rh / this.a;
+
+        sinz = Math.sin(z);
+        cosz = Math.cos(z);
+
+        lon = this.long0;
+        if (Math.abs(rh) <= EPSLN) {
+          lat = this.lat0;
+        }
+        else {
+          lat = asinz(cosz * this.sin_p12 + (p.y * sinz * this.cos_p12) / rh);
+          con = Math.abs(this.lat0) - HALF_PI;
+          if (Math.abs(con) <= EPSLN) {
+            if (this.lat0 >= 0) {
+              lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y));
+            }
+            else {
+              lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y));
+            }
+          }
+          else {
+            /*con = cosz - this.sin_p12 * Math.sin(lat);
+            if ((Math.abs(con) < EPSLN) && (Math.abs(p.x) < EPSLN)) {
+              //no-op, just keep the lon value as is
+            } else {
+              var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh));
+              lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh)));
+            }*/
+            lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz));
+          }
+        }
+
+        p.x = lon;
+        p.y = lat;
+        return p;
+      }
+      else {
+        e0 = e0fn(this.es);
+        e1 = e1fn(this.es);
+        e2 = e2fn(this.es);
+        e3 = e3fn(this.es);
+        if (Math.abs(this.sin_p12 - 1) <= EPSLN) {
+          //North pole case
+          Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);
+          rh = Math.sqrt(p.x * p.x + p.y * p.y);
+          M = Mlp - rh;
+          lat = imlfn(M / this.a, e0, e1, e2, e3);
+          lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y));
+          p.x = lon;
+          p.y = lat;
+          return p;
+        }
+        else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {
+          //South pole case
+          Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);
+          rh = Math.sqrt(p.x * p.x + p.y * p.y);
+          M = rh - Mlp;
+
+          lat = imlfn(M / this.a, e0, e1, e2, e3);
+          lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y));
+          p.x = lon;
+          p.y = lat;
+          return p;
+        }
+        else {
+          //default case
+          rh = Math.sqrt(p.x * p.x + p.y * p.y);
+          Az = Math.atan2(p.x, p.y);
+          N1 = gN(this.a, this.e, this.sin_p12);
+          cosAz = Math.cos(Az);
+          tmp = this.e * this.cos_p12 * cosAz;
+          A = -tmp * tmp / (1 - this.es);
+          B = 3 * this.es * (1 - A) * this.sin_p12 * this.cos_p12 * cosAz / (1 - this.es);
+          D = rh / N1;
+          Ee = D - A * (1 + A) * Math.pow(D, 3) / 6 - B * (1 + 3 * A) * Math.pow(D, 4) / 24;
+          F = 1 - A * Ee * Ee / 2 - D * Ee * Ee * Ee / 6;
+          psi = Math.asin(this.sin_p12 * Math.cos(Ee) + this.cos_p12 * Math.sin(Ee) * cosAz);
+          lon = adjust_lon(this.long0 + Math.asin(Math.sin(Az) * Math.sin(Ee) / Math.cos(psi)));
+          sinpsi = Math.sin(psi);
+          lat = Math.atan2((sinpsi - this.es * F * this.sin_p12) * Math.tan(psi), sinpsi * (1 - this.es));
+          p.x = lon;
+          p.y = lat;
+          return p;
+        }
+      }
+
+    }
+
+    var names$26 = ["Azimuthal_Equidistant", "aeqd"];
+    var aeqd = {
+      init: init$25,
+      forward: forward$24,
+      inverse: inverse$24,
+      names: names$26
+    };
+
+    function init$26() {
+      //double temp;      /* temporary variable    */
+
+      /* Place parameters in static storage for common use
+          -------------------------------------------------*/
+      this.sin_p14 = Math.sin(this.lat0);
+      this.cos_p14 = Math.cos(this.lat0);
+    }
+
+    /* Orthographic forward equations--mapping lat,long to x,y
+        ---------------------------------------------------*/
+    function forward$25(p) {
+      var sinphi, cosphi; /* sin and cos value        */
+      var dlon; /* delta longitude value      */
+      var coslon; /* cos of longitude        */
+      var ksp; /* scale factor          */
+      var g, x, y;
+      var lon = p.x;
+      var lat = p.y;
+      /* Forward equations
+          -----------------*/
+      dlon = adjust_lon(lon - this.long0);
+
+      sinphi = Math.sin(lat);
+      cosphi = Math.cos(lat);
+
+      coslon = Math.cos(dlon);
+      g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;
+      ksp = 1;
+      if ((g > 0) || (Math.abs(g) <= EPSLN)) {
+        x = this.a * ksp * cosphi * Math.sin(dlon);
+        y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);
+      }
+      p.x = x;
+      p.y = y;
+      return p;
+    }
+
+    function inverse$25(p) {
+      var rh; /* height above ellipsoid      */
+      var z; /* angle          */
+      var sinz, cosz; /* sin of z and cos of z      */
+      var con;
+      var lon, lat;
+      /* Inverse equations
+          -----------------*/
+      p.x -= this.x0;
+      p.y -= this.y0;
+      rh = Math.sqrt(p.x * p.x + p.y * p.y);
+      z = asinz(rh / this.a);
+
+      sinz = Math.sin(z);
+      cosz = Math.cos(z);
+
+      lon = this.long0;
+      if (Math.abs(rh) <= EPSLN) {
+        lat = this.lat0;
+        p.x = lon;
+        p.y = lat;
+        return p;
+      }
+      lat = asinz(cosz * this.sin_p14 + (p.y * sinz * this.cos_p14) / rh);
+      con = Math.abs(this.lat0) - HALF_PI;
+      if (Math.abs(con) <= EPSLN) {
+        if (this.lat0 >= 0) {
+          lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y));
+        }
+        else {
+          lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y));
+        }
+        p.x = lon;
+        p.y = lat;
+        return p;
+      }
+      lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz), rh * this.cos_p14 * cosz - p.y * this.sin_p14 * sinz));
+      p.x = lon;
+      p.y = lat;
+      return p;
+    }
+
+    var names$27 = ["ortho"];
+    var ortho = {
+      init: init$26,
+      forward: forward$25,
+      inverse: inverse$25,
+      names: names$27
+    };
+
+    // QSC projection rewritten from the original PROJ4
+    // https://github.com/OSGeo/proj.4/blob/master/src/PJ_qsc.c
+
+    /* constants */
+    var FACE_ENUM = {
+        FRONT: 1,
+        RIGHT: 2,
+        BACK: 3,
+        LEFT: 4,
+        TOP: 5,
+        BOTTOM: 6
+    };
+
+    var AREA_ENUM = {
+        AREA_0: 1,
+        AREA_1: 2,
+        AREA_2: 3,
+        AREA_3: 4
+    };
+
+    function init$27() {
+
+      this.x0 = this.x0 || 0;
+      this.y0 = this.y0 || 0;
+      this.lat0 = this.lat0 || 0;
+      this.long0 = this.long0 || 0;
+      this.lat_ts = this.lat_ts || 0;
+      this.title = this.title || "Quadrilateralized Spherical Cube";
+
+      /* Determine the cube face from the center of projection. */
+      if (this.lat0 >= HALF_PI - FORTPI / 2.0) {
+        this.face = FACE_ENUM.TOP;
+      } else if (this.lat0 <= -(HALF_PI - FORTPI / 2.0)) {
+        this.face = FACE_ENUM.BOTTOM;
+      } else if (Math.abs(this.long0) <= FORTPI) {
+        this.face = FACE_ENUM.FRONT;
+      } else if (Math.abs(this.long0) <= HALF_PI + FORTPI) {
+        this.face = this.long0 > 0.0 ? FACE_ENUM.RIGHT : FACE_ENUM.LEFT;
+      } else {
+        this.face = FACE_ENUM.BACK;
+      }
+
+      /* Fill in useful values for the ellipsoid <-> sphere shift
+       * described in [LK12]. */
+      if (this.es !== 0) {
+        this.one_minus_f = 1 - (this.a - this.b) / this.a;
+        this.one_minus_f_squared = this.one_minus_f * this.one_minus_f;
+      }
+    }
+
+    // QSC forward equations--mapping lat,long to x,y
+    // -----------------------------------------------------------------
+    function forward$26(p) {
+      var xy = {x: 0, y: 0};
+      var lat, lon;
+      var theta, phi;
+      var t, mu;
+      /* nu; */
+      var area = {value: 0};
+
+      // move lon according to projection's lon
+      p.x -= this.long0;
+
+      /* Convert the geodetic latitude to a geocentric latitude.
+       * This corresponds to the shift from the ellipsoid to the sphere
+       * described in [LK12]. */
+      if (this.es !== 0) {//if (P->es != 0) {
+        lat = Math.atan(this.one_minus_f_squared * Math.tan(p.y));
+      } else {
+        lat = p.y;
+      }
+
+      /* Convert the input lat, lon into theta, phi as used by QSC.
+       * This depends on the cube face and the area on it.
+       * For the top and bottom face, we can compute theta and phi
+       * directly from phi, lam. For the other faces, we must use
+       * unit sphere cartesian coordinates as an intermediate step. */
+      lon = p.x; //lon = lp.lam;
+      if (this.face === FACE_ENUM.TOP) {
+        phi = HALF_PI - lat;
+        if (lon >= FORTPI && lon <= HALF_PI + FORTPI) {
+          area.value = AREA_ENUM.AREA_0;
+          theta = lon - HALF_PI;
+        } else if (lon > HALF_PI + FORTPI || lon <= -(HALF_PI + FORTPI)) {
+          area.value = AREA_ENUM.AREA_1;
+          theta = (lon > 0.0 ? lon - SPI : lon + SPI);
+        } else if (lon > -(HALF_PI + FORTPI) && lon <= -FORTPI) {
+          area.value = AREA_ENUM.AREA_2;
+          theta = lon + HALF_PI;
+        } else {
+          area.value = AREA_ENUM.AREA_3;
+          theta = lon;
+        }
+      } else if (this.face === FACE_ENUM.BOTTOM) {
+        phi = HALF_PI + lat;
+        if (lon >= FORTPI && lon <= HALF_PI + FORTPI) {
+          area.value = AREA_ENUM.AREA_0;
+          theta = -lon + HALF_PI;
+        } else if (lon < FORTPI && lon >= -FORTPI) {
+          area.value = AREA_ENUM.AREA_1;
+          theta = -lon;
+        } else if (lon < -FORTPI && lon >= -(HALF_PI + FORTPI)) {
+          area.value = AREA_ENUM.AREA_2;
+          theta = -lon - HALF_PI;
+        } else {
+          area.value = AREA_ENUM.AREA_3;
+          theta = (lon > 0.0 ? -lon + SPI : -lon - SPI);
+        }
+      } else {
+        var q, r, s;
+        var sinlat, coslat;
+        var sinlon, coslon;
+
+        if (this.face === FACE_ENUM.RIGHT) {
+          lon = qsc_shift_lon_origin(lon, +HALF_PI);
+        } else if (this.face === FACE_ENUM.BACK) {
+          lon = qsc_shift_lon_origin(lon, +SPI);
+        } else if (this.face === FACE_ENUM.LEFT) {
+          lon = qsc_shift_lon_origin(lon, -HALF_PI);
+        }
+        sinlat = Math.sin(lat);
+        coslat = Math.cos(lat);
+        sinlon = Math.sin(lon);
+        coslon = Math.cos(lon);
+        q = coslat * coslon;
+        r = coslat * sinlon;
+        s = sinlat;
+
+        if (this.face === FACE_ENUM.FRONT) {
+          phi = Math.acos(q);
+          theta = qsc_fwd_equat_face_theta(phi, s, r, area);
+        } else if (this.face === FACE_ENUM.RIGHT) {
+          phi = Math.acos(r);
+          theta = qsc_fwd_equat_face_theta(phi, s, -q, area);
+        } else if (this.face === FACE_ENUM.BACK) {
+          phi = Math.acos(-q);
+          theta = qsc_fwd_equat_face_theta(phi, s, -r, area);
+        } else if (this.face === FACE_ENUM.LEFT) {
+          phi = Math.acos(-r);
+          theta = qsc_fwd_equat_face_theta(phi, s, q, area);
+        } else {
+          /* Impossible */
+          phi = theta = 0;
+          area.value = AREA_ENUM.AREA_0;
+        }
+      }
+
+      /* Compute mu and nu for the area of definition.
+       * For mu, see Eq. (3-21) in [OL76], but note the typos:
+       * compare with Eq. (3-14). For nu, see Eq. (3-38). */
+      mu = Math.atan((12 / SPI) * (theta + Math.acos(Math.sin(theta) * Math.cos(FORTPI)) - HALF_PI));
+      t = Math.sqrt((1 - Math.cos(phi)) / (Math.cos(mu) * Math.cos(mu)) / (1 - Math.cos(Math.atan(1 / Math.cos(theta)))));
+
+      /* Apply the result to the real area. */
+      if (area.value === AREA_ENUM.AREA_1) {
+        mu += HALF_PI;
+      } else if (area.value === AREA_ENUM.AREA_2) {
+        mu += SPI;
+      } else if (area.value === AREA_ENUM.AREA_3) {
+        mu += 1.5 * SPI;
+      }
+
+      /* Now compute x, y from mu and nu */
+      xy.x = t * Math.cos(mu);
+      xy.y = t * Math.sin(mu);
+      xy.x = xy.x * this.a + this.x0;
+      xy.y = xy.y * this.a + this.y0;
+
+      p.x = xy.x;
+      p.y = xy.y;
+      return p;
+    }
+
+    // QSC inverse equations--mapping x,y to lat/long
+    // -----------------------------------------------------------------
+    function inverse$26(p) {
+      var lp = {lam: 0, phi: 0};
+      var mu, nu, cosmu, tannu;
+      var tantheta, theta, cosphi, phi;
+      var t;
+      var area = {value: 0};
+
+      /* de-offset */
+      p.x = (p.x - this.x0) / this.a;
+      p.y = (p.y - this.y0) / this.a;
+
+      /* Convert the input x, y to the mu and nu angles as used by QSC.
+       * This depends on the area of the cube face. */
+      nu = Math.atan(Math.sqrt(p.x * p.x + p.y * p.y));
+      mu = Math.atan2(p.y, p.x);
+      if (p.x >= 0.0 && p.x >= Math.abs(p.y)) {
+        area.value = AREA_ENUM.AREA_0;
+      } else if (p.y >= 0.0 && p.y >= Math.abs(p.x)) {
+        area.value = AREA_ENUM.AREA_1;
+        mu -= HALF_PI;
+      } else if (p.x < 0.0 && -p.x >= Math.abs(p.y)) {
+        area.value = AREA_ENUM.AREA_2;
+        mu = (mu < 0.0 ? mu + SPI : mu - SPI);
+      } else {
+        area.value = AREA_ENUM.AREA_3;
+        mu += HALF_PI;
+      }
+
+      /* Compute phi and theta for the area of definition.
+       * The inverse projection is not described in the original paper, but some
+       * good hints can be found here (as of 2011-12-14):
+       * http://fits.gsfc.nasa.gov/fitsbits/saf.93/saf.9302
+       * (search for "Message-Id: <9302181759.AA25477 at fits.cv.nrao.edu>") */
+      t = (SPI / 12) * Math.tan(mu);
+      tantheta = Math.sin(t) / (Math.cos(t) - (1 / Math.sqrt(2)));
+      theta = Math.atan(tantheta);
+      cosmu = Math.cos(mu);
+      tannu = Math.tan(nu);
+      cosphi = 1 - cosmu * cosmu * tannu * tannu * (1 - Math.cos(Math.atan(1 / Math.cos(theta))));
+      if (cosphi < -1) {
+        cosphi = -1;
+      } else if (cosphi > +1) {
+        cosphi = +1;
+      }
+
+      /* Apply the result to the real area on the cube face.
+       * For the top and bottom face, we can compute phi and lam directly.
+       * For the other faces, we must use unit sphere cartesian coordinates
+       * as an intermediate step. */
+      if (this.face === FACE_ENUM.TOP) {
+        phi = Math.acos(cosphi);
+        lp.phi = HALF_PI - phi;
+        if (area.value === AREA_ENUM.AREA_0) {
+          lp.lam = theta + HALF_PI;
+        } else if (area.value === AREA_ENUM.AREA_1) {
+          lp.lam = (theta < 0.0 ? theta + SPI : theta - SPI);
+        } else if (area.value === AREA_ENUM.AREA_2) {
+          lp.lam = theta - HALF_PI;
+        } else /* area.value == AREA_ENUM.AREA_3 */ {
+          lp.lam = theta;
+        }
+      } else if (this.face === FACE_ENUM.BOTTOM) {
+        phi = Math.acos(cosphi);
+        lp.phi = phi - HALF_PI;
+        if (area.value === AREA_ENUM.AREA_0) {
+          lp.lam = -theta + HALF_PI;
+        } else if (area.value === AREA_ENUM.AREA_1) {
+          lp.lam = -theta;
+        } else if (area.value === AREA_ENUM.AREA_2) {
+          lp.lam = -theta - HALF_PI;
+        } else /* area.value == AREA_ENUM.AREA_3 */ {
+          lp.lam = (theta < 0.0 ? -theta - SPI : -theta + SPI);
+        }
+      } else {
+        /* Compute phi and lam via cartesian unit sphere coordinates. */
+        var q, r, s;
+        q = cosphi;
+        t = q * q;
+        if (t >= 1) {
+          s = 0;
+        } else {
+          s = Math.sqrt(1 - t) * Math.sin(theta);
+        }
+        t += s * s;
+        if (t >= 1) {
+          r = 0;
+        } else {
+          r = Math.sqrt(1 - t);
+        }
+        /* Rotate q,r,s into the correct area. */
+        if (area.value === AREA_ENUM.AREA_1) {
+          t = r;
+          r = -s;
+          s = t;
+        } else if (area.value === AREA_ENUM.AREA_2) {
+          r = -r;
+          s = -s;
+        } else if (area.value === AREA_ENUM.AREA_3) {
+          t = r;
+          r = s;
+          s = -t;
+        }
+        /* Rotate q,r,s into the correct cube face. */
+        if (this.face === FACE_ENUM.RIGHT) {
+          t = q;
+          q = -r;
+          r = t;
+        } else if (this.face === FACE_ENUM.BACK) {
+          q = -q;
+          r = -r;
+        } else if (this.face === FACE_ENUM.LEFT) {
+          t = q;
+          q = r;
+          r = -t;
+        }
+        /* Now compute phi and lam from the unit sphere coordinates. */
+        lp.phi = Math.acos(-s) - HALF_PI;
+        lp.lam = Math.atan2(r, q);
+        if (this.face === FACE_ENUM.RIGHT) {
+          lp.lam = qsc_shift_lon_origin(lp.lam, -HALF_PI);
+        } else if (this.face === FACE_ENUM.BACK) {
+          lp.lam = qsc_shift_lon_origin(lp.lam, -SPI);
+        } else if (this.face === FACE_ENUM.LEFT) {
+          lp.lam = qsc_shift_lon_origin(lp.lam, +HALF_PI);
+        }
+      }
+
+      /* Apply the shift from the sphere to the ellipsoid as described
+       * in [LK12]. */
+      if (this.es !== 0) {
+        var invert_sign;
+        var tanphi, xa;
+        invert_sign = (lp.phi < 0 ? 1 : 0);
+        tanphi = Math.tan(lp.phi);
+        xa = this.b / Math.sqrt(tanphi * tanphi + this.one_minus_f_squared);
+        lp.phi = Math.atan(Math.sqrt(this.a * this.a - xa * xa) / (this.one_minus_f * xa));
+        if (invert_sign) {
+          lp.phi = -lp.phi;
+        }
+      }
+
+      lp.lam += this.long0;
+      p.x = lp.lam;
+      p.y = lp.phi;
+      return p;
+    }
+
+    /* Helper function for forward projection: compute the theta angle
+     * and determine the area number. */
+    function qsc_fwd_equat_face_theta(phi, y, x, area) {
+      var theta;
+      if (phi < EPSLN) {
+        area.value = AREA_ENUM.AREA_0;
+        theta = 0.0;
+      } else {
+        theta = Math.atan2(y, x);
+        if (Math.abs(theta) <= FORTPI) {
+          area.value = AREA_ENUM.AREA_0;
+        } else if (theta > FORTPI && theta <= HALF_PI + FORTPI) {
+          area.value = AREA_ENUM.AREA_1;
+          theta -= HALF_PI;
+        } else if (theta > HALF_PI + FORTPI || theta <= -(HALF_PI + FORTPI)) {
+          area.value = AREA_ENUM.AREA_2;
+          theta = (theta >= 0.0 ? theta - SPI : theta + SPI);
+        } else {
+          area.value = AREA_ENUM.AREA_3;
+          theta += HALF_PI;
+        }
+      }
+      return theta;
+    }
+
+    /* Helper function: shift the longitude. */
+    function qsc_shift_lon_origin(lon, offset) {
+      var slon = lon + offset;
+      if (slon < -SPI) {
+        slon += TWO_PI;
+      } else if (slon > +SPI) {
+        slon -= TWO_PI;
+      }
+      return slon;
+    }
+
+    var names$28 = ["Quadrilateralized Spherical Cube", "Quadrilateralized_Spherical_Cube", "qsc"];
+    var qsc = {
+      init: init$27,
+      forward: forward$26,
+      inverse: inverse$26,
+      names: names$28
+    };
+
+    // Robinson projection
+    // Based on https://github.com/OSGeo/proj.4/blob/master/src/PJ_robin.c
+    // Polynomial coeficients from http://article.gmane.org/gmane.comp.gis.proj-4.devel/6039
+
+    var COEFS_X = [
+        [1.0000, 2.2199e-17, -7.15515e-05, 3.1103e-06],
+        [0.9986, -0.000482243, -2.4897e-05, -1.3309e-06],
+        [0.9954, -0.00083103, -4.48605e-05, -9.86701e-07],
+        [0.9900, -0.00135364, -5.9661e-05, 3.6777e-06],
+        [0.9822, -0.00167442, -4.49547e-06, -5.72411e-06],
+        [0.9730, -0.00214868, -9.03571e-05, 1.8736e-08],
+        [0.9600, -0.00305085, -9.00761e-05, 1.64917e-06],
+        [0.9427, -0.00382792, -6.53386e-05, -2.6154e-06],
+        [0.9216, -0.00467746, -0.00010457, 4.81243e-06],
+        [0.8962, -0.00536223, -3.23831e-05, -5.43432e-06],
+        [0.8679, -0.00609363, -0.000113898, 3.32484e-06],
+        [0.8350, -0.00698325, -6.40253e-05, 9.34959e-07],
+        [0.7986, -0.00755338, -5.00009e-05, 9.35324e-07],
+        [0.7597, -0.00798324, -3.5971e-05, -2.27626e-06],
+        [0.7186, -0.00851367, -7.01149e-05, -8.6303e-06],
+        [0.6732, -0.00986209, -0.000199569, 1.91974e-05],
+        [0.6213, -0.010418, 8.83923e-05, 6.24051e-06],
+        [0.5722, -0.00906601, 0.000182, 6.24051e-06],
+        [0.5322, -0.00677797, 0.000275608, 6.24051e-06]
+    ];
+
+    var COEFS_Y = [
+        [-5.20417e-18, 0.0124, 1.21431e-18, -8.45284e-11],
+        [0.0620, 0.0124, -1.26793e-09, 4.22642e-10],
+        [0.1240, 0.0124, 5.07171e-09, -1.60604e-09],
+        [0.1860, 0.0123999, -1.90189e-08, 6.00152e-09],
+        [0.2480, 0.0124002, 7.10039e-08, -2.24e-08],
+        [0.3100, 0.0123992, -2.64997e-07, 8.35986e-08],
+        [0.3720, 0.0124029, 9.88983e-07, -3.11994e-07],
+        [0.4340, 0.0123893, -3.69093e-06, -4.35621e-07],
+        [0.4958, 0.0123198, -1.02252e-05, -3.45523e-07],
+        [0.5571, 0.0121916, -1.54081e-05, -5.82288e-07],
+        [0.6176, 0.0119938, -2.41424e-05, -5.25327e-07],
+        [0.6769, 0.011713, -3.20223e-05, -5.16405e-07],
+        [0.7346, 0.0113541, -3.97684e-05, -6.09052e-07],
+        [0.7903, 0.0109107, -4.89042e-05, -1.04739e-06],
+        [0.8435, 0.0103431, -6.4615e-05, -1.40374e-09],
+        [0.8936, 0.00969686, -6.4636e-05, -8.547e-06],
+        [0.9394, 0.00840947, -0.000192841, -4.2106e-06],
+        [0.9761, 0.00616527, -0.000256, -4.2106e-06],
+        [1.0000, 0.00328947, -0.000319159, -4.2106e-06]
+    ];
+
+    var FXC = 0.8487;
+    var FYC = 1.3523;
+    var C1 = R2D/5; // rad to 5-degree interval
+    var RC1 = 1/C1;
+    var NODES = 18;
+
+    var poly3_val = function(coefs, x) {
+        return coefs[0] + x * (coefs[1] + x * (coefs[2] + x * coefs[3]));
+    };
+
+    var poly3_der = function(coefs, x) {
+        return coefs[1] + x * (2 * coefs[2] + x * 3 * coefs[3]);
+    };
+
+    function newton_rapshon(f_df, start, max_err, iters) {
+        var x = start;
+        for (; iters; --iters) {
+            var upd = f_df(x);
+            x -= upd;
+            if (Math.abs(upd) < max_err) {
+                break;
+            }
+        }
+        return x;
+    }
+
+    function init$28() {
+        this.x0 = this.x0 || 0;
+        this.y0 = this.y0 || 0;
+        this.long0 = this.long0 || 0;
+        this.es = 0;
+        this.title = this.title || "Robinson";
+    }
+
+    function forward$27(ll) {
+        var lon = adjust_lon(ll.x - this.long0);
+
+        var dphi = Math.abs(ll.y);
+        var i = Math.floor(dphi * C1);
+        if (i < 0) {
+            i = 0;
+        } else if (i >= NODES) {
+            i = NODES - 1;
+        }
+        dphi = R2D * (dphi - RC1 * i);
+        var xy = {
+            x: poly3_val(COEFS_X[i], dphi) * lon,
+            y: poly3_val(COEFS_Y[i], dphi)
+        };
+        if (ll.y < 0) {
+            xy.y = -xy.y;
+        }
+
+        xy.x = xy.x * this.a * FXC + this.x0;
+        xy.y = xy.y * this.a * FYC + this.y0;
+        return xy;
+    }
+
+    function inverse$27(xy) {
+        var ll = {
+            x: (xy.x - this.x0) / (this.a * FXC),
+            y: Math.abs(xy.y - this.y0) / (this.a * FYC)
+        };
+
+        if (ll.y >= 1) { // pathologic case
+            ll.x /= COEFS_X[NODES][0];
+            ll.y = xy.y < 0 ? -HALF_PI : HALF_PI;
+        } else {
+            // find table interval
+            var i = Math.floor(ll.y * NODES);
+            if (i < 0) {
+                i = 0;
+            } else if (i >= NODES) {
+                i = NODES - 1;
+            }
+            for (;;) {
+                if (COEFS_Y[i][0] > ll.y) {
+                    --i;
+                } else if (COEFS_Y[i+1][0] <= ll.y) {
+                    ++i;
+                } else {
+                    break;
+                }
+            }
+            // linear interpolation in 5 degree interval
+            var coefs = COEFS_Y[i];
+            var t = 5 * (ll.y - coefs[0]) / (COEFS_Y[i+1][0] - coefs[0]);
+            // find t so that poly3_val(coefs, t) = ll.y
+            t = newton_rapshon(function(x) {
+                return (poly3_val(coefs, x) - ll.y) / poly3_der(coefs, x);
+            }, t, EPSLN, 100);
+
+            ll.x /= poly3_val(COEFS_X[i], t);
+            ll.y = (5 * i + t) * D2R;
+            if (xy.y < 0) {
+                ll.y = -ll.y;
+            }
+        }
+
+        ll.x = adjust_lon(ll.x + this.long0);
+        return ll;
+    }
+
+    var names$29 = ["Robinson", "robin"];
+    var robin = {
+      init: init$28,
+      forward: forward$27,
+      inverse: inverse$27,
+      names: names$29
+    };
+
+    function init$29() {
+        this.name = 'geocent';
+
+    }
+
+    function forward$28(p) {
+        var point = geodeticToGeocentric(p, this.es, this.a);
+        return point;
+    }
+
+    function inverse$28(p) {
+        var point = geocentricToGeodetic(p, this.es, this.a, this.b);
+        return point;
+    }
+
+    var names$30 = ["Geocentric", 'geocentric', "geocent", "Geocent"];
+    var geocent = {
+        init: init$29,
+        forward: forward$28,
+        inverse: inverse$28,
+        names: names$30
+    };
+
+    var mode = {
+      N_POLE: 0,
+      S_POLE: 1,
+      EQUIT: 2,
+      OBLIQ: 3
+    };
+
+    var params = {
+      h:     { def: 100000, num: true },           // default is Karman line, no default in PROJ.7
+      azi:   { def: 0, num: true, degrees: true }, // default is North
+      tilt:  { def: 0, num: true, degrees: true }, // default is Nadir
+      long0: { def: 0, num: true },                // default is Greenwich, conversion to rad is automatic
+      lat0:  { def: 0, num: true }                 // default is Equator, conversion to rad is automatic
+    };
+
+    function init$30() {
+      Object.keys(params).forEach(function (p) {
+        if (typeof this[p] === "undefined") {
+          this[p] = params[p].def;
+        } else if (params[p].num && isNaN(this[p])) {
+          throw new Error("Invalid parameter value, must be numeric " + p + " = " + this[p]);
+        } else if (params[p].num) {
+          this[p] = parseFloat(this[p]);
+        }
+        if (params[p].degrees) {
+          this[p] = this[p] * D2R;
+        }
+      }.bind(this));
+
+      if (Math.abs((Math.abs(this.lat0) - HALF_PI)) < EPSLN) {
+        this.mode = this.lat0 < 0 ? mode.S_POLE : mode.N_POLE;
+      } else if (Math.abs(this.lat0) < EPSLN) {
+        this.mode = mode.EQUIT;
+      } else {
+        this.mode = mode.OBLIQ;
+        this.sinph0 = Math.sin(this.lat0);
+        this.cosph0 = Math.cos(this.lat0);
+      }
+
+      this.pn1 = this.h / this.a;  // Normalize relative to the Earth's radius
+
+      if (this.pn1 <= 0 || this.pn1 > 1e10) {
+        throw new Error("Invalid height");
+      }
+      
+      this.p = 1 + this.pn1;
+      this.rp = 1 / this.p;
+      this.h1 = 1 / this.pn1;
+      this.pfact = (this.p + 1) * this.h1;
+      this.es = 0;
+
+      var omega = this.tilt;
+      var gamma = this.azi;
+      this.cg = Math.cos(gamma);
+      this.sg = Math.sin(gamma);
+      this.cw = Math.cos(omega);
+      this.sw = Math.sin(omega);
+    }
+
+    function forward$29(p) {
+      p.x -= this.long0;
+      var sinphi = Math.sin(p.y);
+      var cosphi = Math.cos(p.y);
+      var coslam = Math.cos(p.x);
+      var x, y;
+      switch (this.mode) {
+        case mode.OBLIQ:
+          y = this.sinph0 * sinphi + this.cosph0 * cosphi * coslam;
+          break;
+        case mode.EQUIT:
+          y = cosphi * coslam;
+          break;
+        case mode.S_POLE:
+          y = -sinphi;
+          break;
+        case mode.N_POLE:
+          y = sinphi;
+          break;
+      }
+      y = this.pn1 / (this.p - y);
+      x = y * cosphi * Math.sin(p.x);
+
+      switch (this.mode) {
+        case mode.OBLIQ:
+          y *= this.cosph0 * sinphi - this.sinph0 * cosphi * coslam;
+          break;
+        case mode.EQUIT:
+          y *= sinphi;
+          break;
+        case mode.N_POLE:
+          y *= -(cosphi * coslam);
+          break;
+        case mode.S_POLE:
+          y *= cosphi * coslam;
+          break;
+      }
+
+      // Tilt 
+      var yt, ba;
+      yt = y * this.cg + x * this.sg;
+      ba = 1 / (yt * this.sw * this.h1 + this.cw);
+      x = (x * this.cg - y * this.sg) * this.cw * ba;
+      y = yt * ba;
+
+      p.x = x * this.a;
+      p.y = y * this.a;
+      return p;
+    }
+
+    function inverse$29(p) {
+      p.x /= this.a;
+      p.y /= this.a;
+      var r = { x: p.x, y: p.y };
+
+      // Un-Tilt
+      var bm, bq, yt;
+      yt = 1 / (this.pn1 - p.y * this.sw);
+      bm = this.pn1 * p.x * yt;
+      bq = this.pn1 * p.y * this.cw * yt;
+      p.x = bm * this.cg + bq * this.sg;
+      p.y = bq * this.cg - bm * this.sg;
+
+      var rh = hypot(p.x, p.y);
+      if (Math.abs(rh) < EPSLN) {
+        r.x = 0;
+        r.y = p.y;
+      } else {
+        var cosz, sinz;
+        sinz = 1 - rh * rh * this.pfact;
+        sinz = (this.p - Math.sqrt(sinz)) / (this.pn1 / rh + rh / this.pn1);
+        cosz = Math.sqrt(1 - sinz * sinz);
+        switch (this.mode) {
+          case mode.OBLIQ:
+            r.y = Math.asin(cosz * this.sinph0 + p.y * sinz * this.cosph0 / rh);
+            p.y = (cosz - this.sinph0 * Math.sin(r.y)) * rh;
+            p.x *= sinz * this.cosph0;
+            break;
+          case mode.EQUIT:
+            r.y = Math.asin(p.y * sinz / rh);
+            p.y = cosz * rh;
+            p.x *= sinz;
+            break;
+          case mode.N_POLE:
+            r.y = Math.asin(cosz);
+            p.y = -p.y;
+            break;
+          case mode.S_POLE:
+            r.y = -Math.asin(cosz);
+            break;
+        }
+        r.x = Math.atan2(p.x, p.y);
+      }
+
+      p.x = r.x + this.long0;
+      p.y = r.y;
+      return p;
+    }
+
+    var names$31 = ["Tilted_Perspective", "tpers"];
+    var tpers = {
+      init: init$30,
+      forward: forward$29,
+      inverse: inverse$29,
+      names: names$31
+    };
+
+    var includedProjections = function(proj4){
+      proj4.Proj.projections.add(tmerc);
+      proj4.Proj.projections.add(etmerc);
+      proj4.Proj.projections.add(utm);
+      proj4.Proj.projections.add(sterea);
+      proj4.Proj.projections.add(stere);
+      proj4.Proj.projections.add(somerc);
+      proj4.Proj.projections.add(omerc);
+      proj4.Proj.projections.add(lcc);
+      proj4.Proj.projections.add(krovak);
+      proj4.Proj.projections.add(cass);
+      proj4.Proj.projections.add(laea);
+      proj4.Proj.projections.add(aea);
+      proj4.Proj.projections.add(gnom);
+      proj4.Proj.projections.add(cea);
+      proj4.Proj.projections.add(eqc);
+      proj4.Proj.projections.add(poly);
+      proj4.Proj.projections.add(nzmg);
+      proj4.Proj.projections.add(mill);
+      proj4.Proj.projections.add(sinu);
+      proj4.Proj.projections.add(moll);
+      proj4.Proj.projections.add(eqdc);
+      proj4.Proj.projections.add(vandg);
+      proj4.Proj.projections.add(aeqd);
+      proj4.Proj.projections.add(ortho);
+      proj4.Proj.projections.add(qsc);
+      proj4.Proj.projections.add(robin);
+      proj4.Proj.projections.add(geocent);
+      proj4.Proj.projections.add(tpers);
+    };
+
+    proj4$1.defaultDatum = 'WGS84'; //default datum
+    proj4$1.Proj = Projection;
+    proj4$1.WGS84 = new proj4$1.Proj('WGS84');
+    proj4$1.Point = Point;
+    proj4$1.toPoint = toPoint;
+    proj4$1.defs = defs;
+    proj4$1.transform = transform;
+    proj4$1.mgrs = mgrs;
+    proj4$1.version = '2.6.3';
+    includedProjections(proj4$1);
+
+    return proj4$1;
+
+})));
+
+
+/***/ }),
+/* 153 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (factory) {
+	var L, proj4;
+	if (true) {
+		// AMD
+		!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(2), __webpack_require__(151)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+	} else {}
+}(function (L, proj4) {
+	if (proj4.__esModule && proj4.default) {
+		// If proj4 was bundled as an ES6 module, unwrap it to get
+		// to the actual main proj4 object.
+		// See discussion in https://github.com/kartena/Proj4Leaflet/pull/147
+		proj4 = proj4.default;
+	}
+ 
+	L.Proj = {};
+
+	L.Proj._isProj4Obj = function(a) {
+		return (typeof a.inverse !== 'undefined' &&
+			typeof a.forward !== 'undefined');
+	};
+
+	L.Proj.Projection = L.Class.extend({
+		initialize: function(code, def, bounds) {
+			var isP4 = L.Proj._isProj4Obj(code);
+			this._proj = isP4 ? code : this._projFromCodeDef(code, def);
+			this.bounds = isP4 ? def : bounds;
+		},
+
+		project: function (latlng) {
+			var point = this._proj.forward([latlng.lng, latlng.lat]);
+			return new L.Point(point[0], point[1]);
+		},
+
+		unproject: function (point, unbounded) {
+			var point2 = this._proj.inverse([point.x, point.y]);
+			return new L.LatLng(point2[1], point2[0], unbounded);
+		},
+
+		_projFromCodeDef: function(code, def) {
+			if (def) {
+				proj4.defs(code, def);
+			} else if (proj4.defs[code] === undefined) {
+				var urn = code.split(':');
+				if (urn.length > 3) {
+					code = urn[urn.length - 3] + ':' + urn[urn.length - 1];
+				}
+				if (proj4.defs[code] === undefined) {
+					throw 'No projection definition for code ' + code;
+				}
+			}
+
+			return proj4(code);
+		}
+	});
+
+	L.Proj.CRS = L.Class.extend({
+		includes: L.CRS,
+
+		options: {
+			transformation: new L.Transformation(1, 0, -1, 0)
+		},
+
+		initialize: function(a, b, c) {
+			var code,
+			    proj,
+			    def,
+			    options;
+
+			if (L.Proj._isProj4Obj(a)) {
+				proj = a;
+				code = proj.srsCode;
+				options = b || {};
+
+				this.projection = new L.Proj.Projection(proj, options.bounds);
+			} else {
+				code = a;
+				def = b;
+				options = c || {};
+				this.projection = new L.Proj.Projection(code, def, options.bounds);
+			}
+
+			L.Util.setOptions(this, options);
+			this.code = code;
+			this.transformation = this.options.transformation;
+
+			if (this.options.origin) {
+				this.transformation =
+					new L.Transformation(1, -this.options.origin[0],
+						-1, this.options.origin[1]);
+			}
+
+			if (this.options.scales) {
+				this._scales = this.options.scales;
+			} else if (this.options.resolutions) {
+				this._scales = [];
+				for (var i = this.options.resolutions.length - 1; i >= 0; i--) {
+					if (this.options.resolutions[i]) {
+						this._scales[i] = 1 / this.options.resolutions[i];
+					}
+				}
+			}
+
+			this.infinite = !this.options.bounds;
+
+		},
+
+		scale: function(zoom) {
+			var iZoom = Math.floor(zoom),
+				baseScale,
+				nextScale,
+				scaleDiff,
+				zDiff;
+			if (zoom === iZoom) {
+				return this._scales[zoom];
+			} else {
+				// Non-integer zoom, interpolate
+				baseScale = this._scales[iZoom];
+				nextScale = this._scales[iZoom + 1];
+				scaleDiff = nextScale - baseScale;
+				zDiff = (zoom - iZoom);
+				return baseScale + scaleDiff * zDiff;
+			}
+		},
+
+		zoom: function(scale) {
+			// Find closest number in this._scales, down
+			var downScale = this._closestElement(this._scales, scale),
+				downZoom = this._scales.indexOf(downScale),
+				nextScale,
+				nextZoom,
+				scaleDiff;
+			// Check if scale is downScale => return array index
+			if (scale === downScale) {
+				return downZoom;
+			}
+			if (downScale === undefined) {
+				return -Infinity;
+			}
+			// Interpolate
+			nextZoom = downZoom + 1;
+			nextScale = this._scales[nextZoom];
+			if (nextScale === undefined) {
+				return Infinity;
+			}
+			scaleDiff = nextScale - downScale;
+			return (scale - downScale) / scaleDiff + downZoom;
+		},
+
+		distance: L.CRS.Earth.distance,
+
+		R: L.CRS.Earth.R,
+
+		/* Get the closest lowest element in an array */
+		_closestElement: function(array, element) {
+			var low;
+			for (var i = array.length; i--;) {
+				if (array[i] <= element && (low === undefined || low < array[i])) {
+					low = array[i];
+				}
+			}
+			return low;
+		}
+	});
+
+	L.Proj.GeoJSON = L.GeoJSON.extend({
+		initialize: function(geojson, options) {
+			this._callLevel = 0;
+			L.GeoJSON.prototype.initialize.call(this, geojson, options);
+		},
+
+		addData: function(geojson) {
+			var crs;
+
+			if (geojson) {
+				if (geojson.crs && geojson.crs.type === 'name') {
+					crs = new L.Proj.CRS(geojson.crs.properties.name);
+				} else if (geojson.crs && geojson.crs.type) {
+					crs = new L.Proj.CRS(geojson.crs.type + ':' + geojson.crs.properties.code);
+				}
+
+				if (crs !== undefined) {
+					this.options.coordsToLatLng = function(coords) {
+						var point = L.point(coords[0], coords[1]);
+						return crs.projection.unproject(point);
+					};
+				}
+			}
+
+			// Base class' addData might call us recursively, but
+			// CRS shouldn't be cleared in that case, since CRS applies
+			// to the whole GeoJSON, inluding sub-features.
+			this._callLevel++;
+			try {
+				L.GeoJSON.prototype.addData.call(this, geojson);
+			} finally {
+				this._callLevel--;
+				if (this._callLevel === 0) {
+					delete this.options.coordsToLatLng;
+				}
+			}
+		}
+	});
+
+	L.Proj.geoJson = function(geojson, options) {
+		return new L.Proj.GeoJSON(geojson, options);
+	};
+
+	L.Proj.ImageOverlay = L.ImageOverlay.extend({
+		initialize: function (url, bounds, options) {
+			L.ImageOverlay.prototype.initialize.call(this, url, null, options);
+			this._projectedBounds = bounds;
+		},
+
+		// Danger ahead: Overriding internal methods in Leaflet.
+		// Decided to do this rather than making a copy of L.ImageOverlay
+		// and doing very tiny modifications to it.
+		// Future will tell if this was wise or not.
+		_animateZoom: function (event) {
+			var scale = this._map.getZoomScale(event.zoom);
+			var northWest = L.point(this._projectedBounds.min.x, this._projectedBounds.max.y);
+			var offset = this._projectedToNewLayerPoint(northWest, event.zoom, event.center);
+
+			L.DomUtil.setTransform(this._image, offset, scale);
+		},
+
+		_reset: function () {
+			var zoom = this._map.getZoom();
+			var pixelOrigin = this._map.getPixelOrigin();
+			var bounds = L.bounds(
+				this._transform(this._projectedBounds.min, zoom)._subtract(pixelOrigin),
+				this._transform(this._projectedBounds.max, zoom)._subtract(pixelOrigin)
+			);
+			var size = bounds.getSize();
+
+			L.DomUtil.setPosition(this._image, bounds.min);
+			this._image.style.width = size.x + 'px';
+			this._image.style.height = size.y + 'px';
+		},
+
+		_projectedToNewLayerPoint: function (point, zoom, center) {
+			var viewHalf = this._map.getSize()._divideBy(2);
+			var newTopLeft = this._map.project(center, zoom)._subtract(viewHalf)._round();
+			var topLeft = newTopLeft.add(this._map._getMapPanePos());
+
+			return this._transform(point, zoom)._subtract(topLeft);
+		},
+
+		_transform: function (point, zoom) {
+			var crs = this._map.options.crs;
+			var transformation = crs.transformation;
+			var scale = crs.scale(zoom);
+
+			return transformation.transform(point, scale);
+		}
+	});
+
+	L.Proj.imageOverlay = function (url, bounds, options) {
+		return new L.Proj.ImageOverlay(url, bounds, options);
+	};
+
+	return L.Proj;
+}));
+
+
+/***/ }),
+/* 154 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+// FIXME
+// - exception lors du register IGNF des projections geocent ?
+// Ex. Transforming EPSG:4978 geocent projection fails?
+// cf. https://github.com/proj4js/proj4js/issues/195
+// - probleme de performance avec le chargement des projections (env. 4s),
+// et ceci bloque le rendu graphique...
+
+/**
+ * Register definition for IGNF, and EPSG CRS.
+ * @example
+ * Gp.Register.IGNF.AMST63
+ *   // return : "+title=Amsterdam 1963 +proj=geocent +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs"
+ * Gp.Register.get("IGNF:AMST63")
+ *   // same as Gp.Register.IGNF.AMST63
+ */
+var Register = {
+  /**
+   * instance already loaded into proj4
+   */
+  isLoaded: false,
+
+  /**
+   * get the definition for a code
+   *
+   * @param {String} name - ie. EPSG:2154 (Lambert)
+   * @returns {Object} definition
+   * @example
+   * Register.get("EPSG:2154");
+   * // "+title=RGF93 / Lambert-93 +proj=lcc +lat_1=49 ..."
+   */
+  get: function get(name) {
+    if (name === "" || name === null || typeof name === "undefined") {
+      return;
+    }
+
+    var s = name.split(":");
+
+    if (s.length !== 2) {
+      return;
+    }
+
+    var _register = s[0];
+    var _code = s[1];
+
+    if (!this.hasOwnProperty(_register)) {
+      return;
+    }
+
+    if (!this[_register].hasOwnProperty(_code)) {
+      return;
+    }
+
+    return this[_register][_code];
+  },
+
+  /**
+   *  does projection code exist ?
+   *
+   * @param {String} name - ie. EPSG:2154 (Lambert)
+   * @returns {Boolean} true/false
+   * @example
+   * Register.exist("EPSG:2154"); // true
+   */
+  exist: function exist(name) {
+    if (name === "" || name === null || typeof name === "undefined") {
+      return false;
+    }
+
+    var s = name.split(":");
+
+    if (s.length !== 2) {
+      return false;
+    }
+
+    var _register = s[0];
+    var _code = s[1];
+
+    if (!this.hasOwnProperty(_register)) {
+      return false;
+    }
+
+    if (!this[_register].hasOwnProperty(_code)) {
+      return false;
+    }
+
+    return true;
+  },
+
+  /**
+   * load all defs to proj4
+   * @param {Object} Proj4 - proj4 instance
+   */
+  load: function load(Proj4) {
+    // un flag pour savoir si le chargement est déjà realisé
+    // (car ceci peut être couteux !)
+    if (!this.isLoaded) {
+      var registers = ["IGNF", // exception lors du register IGNF ?
+      "EPSG", "CRS"];
+
+      for (var i = 0; i < registers.length; i++) {
+        var _register = registers[i];
+        var codes = this[_register];
+
+        for (var _code in codes) {
+          if (codes.hasOwnProperty(_code)) {
+            var name = _register + ":" + _code;
+            Proj4.defs(name, this.get(name)); // on enlève la dependance à OpenLayers...
+            // la fonction register est donc à appeller afin d'enregistrer
+            // les definitions dans OpenLayers :
+            //  import { get } from "ol/proj";
+            //  import proj4 from "proj4";
+            //  import { register } from "ol/proj/proj4";
+            //      Register.load();
+            //      // Make projections defined in proj4 (with proj4.defs()) available in OpenLayers.
+            //      // see ol/proj/proj4.register (https://openlayers.org/en/latest/apidoc/module-ol_proj_proj4.html)
+            //      register(proj4);
+            //      console.log(get("CRS:84").getCode()); // "CRS:84"
+          }
+        }
+      }
+
+      this.isLoaded = true;
+    }
+  },
+
+  /**
+   * load defs by default to proj4
+   *
+   * include into proj4 :
+   * - WGS84
+   * - ['EPSG:4326']
+   * - ['EPSG:3785'], ['EPSG:3857'], GOOGLE, ['EPSG:900913'], ['EPSG:102113']
+   * +
+   * - ["EPSG:2154"], ["EPSG:27571"],  ["EPSG:27572"],  ["EPSG:27573"],  ["EPSG:2757"],
+   * - ["CRS:84"],
+   * - ["IGNF:LAMB93"],
+   * - ["IGNF:LAMBE"], ["IGNF:LAMB1"],  ["IGNF:LAMB2"],  ["IGNF:LAMB3"],  ["IGNF:LAMB4"],
+   * - ["IGNF:RGF93G"],
+   * - ["IGNF:WGS84G"]
+   *
+   * @param {Object} Proj4 - proj4 instance
+   */
+  loadByDefault: function loadByDefault(Proj4) {
+    // la liste de projections par defaut...
+    var registers = {
+      EPSG: {
+        2154: Register["EPSG"]["2154"],
+        27571: Register["EPSG"]["27571"],
+        27572: Register["EPSG"]["27572"],
+        27573: Register["EPSG"]["27573"],
+        27574: Register["EPSG"]["27574"]
+      },
+      CRS: {
+        84: Register["CRS"]["84"]
+      },
+      IGNF: {
+        LAMB93: Register["IGNF"]["LAMB93"],
+        LAMBE: Register["IGNF"]["LAMBE"],
+        LAMB1: Register["IGNF"]["LAMB1"],
+        LAMB2: Register["IGNF"]["LAMB2"],
+        LAMB3: Register["IGNF"]["LAMB3"],
+        LAMB4: Register["IGNF"]["LAMB4"],
+        RGF93G: Register["IGNF"]["RGF93G"],
+        WGS84G: Register["IGNF"]["WGS84G"]
+      }
+    };
+
+    for (var register in registers) {
+      if (registers.hasOwnProperty(register)) {
+        var codes = registers[register];
+
+        for (var code in codes) {
+          if (codes.hasOwnProperty(code)) {
+            var name = register + ":" + code;
+            Proj4.defs(name, codes[code]);
+          }
+        }
+      }
+    }
+  },
+
+  /**
+   * load only a def to proj4
+   * @param {Object} Proj4 - proj4 instance
+   * @param {String} name - ie. EPSG:2154 (Lambert)
+   * @returns {Boolean} true/false
+   */
+  loadByName: function loadByName(Proj4, name) {
+    if (!this.exist(name)) {
+      return false;
+    }
+
+    try {
+      Proj4.defs(name, this.get(name));
+    } catch (e) {
+      // FIXME message !?
+      return false;
+    }
+
+    return true;
+  },
+  // definitions
+  EPSG: {
+    // 4978 : "+proj=geocent +datum=WGS84 +units=m +no_defs ",
+    3857: "+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs",
+    3785: "+title=WGS 84 / Pseudo-Mercator (deprecated) +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs",
+    4149: "+title=CH1903 +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs ",
+    4150: "+title=CH1903plus +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs ",
+    4151: "+title=CHTRF95 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",
+    4171: "+title=RGF93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",
+    4230: "+title=ED50 +proj=longlat +ellps=intl +no_defs ",
+    4235: "+title=Guyane Francaise +proj=longlat +ellps=intl +no_defs ",
+    4258: "+title=ETRS89 +proj=longlat +ellps=GRS80 +no_defs ",
+    4275: "+title=NTF +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +no_defs ",
+    4322: "+title=WGS 72 +proj=longlat +ellps=WGS72 +no_defs ",
+    4326: "+title=WGS 84 +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ",
+    4467: "+proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    4470: "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",
+    4471: "+proj=utm +zone=38 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    4474: "+proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs ",
+    4558: "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",
+    4559: "+proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    4621: "+title=Fort Marigot +proj=longlat +ellps=intl +towgs84=137,248,-430,0,0,0,0 +no_defs ",
+    4622: "+title=Guadeloupe 1948 +proj=longlat +ellps=intl +no_defs ",
+    4623: "+title=CSG67 +proj=longlat +ellps=intl +towgs84=-186,230,110,0,0,0,0 +no_defs ",
+    4624: "+title=RGFG95 +proj=longlat +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +no_defs ",
+    4625: "+title=Martinique 1938 +proj=longlat +ellps=intl +no_defs ",
+    4626: "+title=Reunion 1947 +proj=longlat +ellps=intl +no_defs ",
+    4627: "+title=RGR92 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",
+    4628: "+title=Tahiti 52 +proj=longlat +ellps=intl +towgs84=162,117,154,0,0,0,0 +no_defs ",
+    4629: "+title=Tahaa 54 +proj=longlat +ellps=intl +no_defs ",
+    4630: "+title=IGN72 Nuku Hiva +proj=longlat +ellps=intl +no_defs ",
+    4632: "+title=Combani 1950 +proj=longlat +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +no_defs ",
+    4633: "+title=IGN56 Lifou +proj=longlat +ellps=intl +no_defs ",
+    4634: "+title=IGN72 Grand Terre +proj=longlat +ellps=intl +no_defs ",
+    4637: "+title=Perroud 1950 +proj=longlat +ellps=intl +towgs84=325,154,172,0,0,0,0 +no_defs ",
+    4638: "+title=Saint Pierre et Miquelon 1950 +proj=longlat +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +no_defs ",
+    4640: "+title=RRAF 1991 +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs ",
+    4641: "+title=IGN53 Mare +proj=longlat +ellps=intl +no_defs ",
+    4645: "+title=RGNC 1991 +proj=longlat +ellps=intl +towgs84=0,0,0,0,0,0,0 +no_defs ",
+    4687: "+proj=longlat +ellps=GRS80 +no_defs ",
+    4662: "+title=IGN72 Grande Terre +proj=longlat +ellps=intl +no_defs ",
+    4689: "+title=IGN63 Hiva Oa +proj=longlat +ellps=intl +no_defs ",
+    4690: "+title=Tahiti 79 +proj=longlat +ellps=intl +no_defs ",
+    4691: "+title=Moorea 87 +proj=longlat +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +no_defs ",
+    4692: "+title=Maupiti 83 +proj=longlat +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +no_defs ",
+    4698: "+title=IGN 1962 Kerguelen +proj=longlat +ellps=intl +towgs84=145,-187,103,0,0,0,0 +no_defs ",
+    4749: "+title=RGNC91-93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",
+    4750: "+title=ST87 Ouvea +proj=longlat +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +no_defs ",
+    4807: "+title=NTF (Paris) +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +no_defs ",
+    2056: "+title=CH1903+ / LV95 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ",
+    2154: "+title=RGF93 / Lambert-93 +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    2213: "+title=ETRS89 / TM 30 NE +proj=tmerc +lat_0=0 +lon_0=30 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs ",
+    2969: "+title=Fort Marigot / UTM zone 20N +proj=utm +zone=20 +ellps=intl +towgs84=137,248,-430,0,0,0,0 +units=m +no_defs ",
+    2970: "+title=Guadeloupe 1948 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs ",
+    2971: "+title=CSG67 / UTM zone 22N +proj=utm +zone=22 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs ",
+    2972: "+title=RGFG95 / UTM zone 22N +proj=utm +zone=22 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs ",
+    2973: "+title=Martinique 1938 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs ",
+    2975: "+title=RGR92 / UTM zone 40S +proj=utm +zone=40 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    2976: "+title=Tahiti 52 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=162,117,154,0,0,0,0 +units=m +no_defs ",
+    2977: "+title=Tahaa 54 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +units=m +no_defs ",
+    2978: "+title=IGN72 Nuku Hiva / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs ",
+    2980: "+title=Combani 1950 / UTM zone 38S +proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs ",
+    2981: "+title=IGN56 Lifou / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",
+    2982: "+title=IGN72 Grand Terre / UTM zone 58S (deprecated) +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",
+    2984: "+title=RGNC 1991 / Lambert New Caledonia (deprecated) +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=intl +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    2986: "+title=Terre Adelie 1950 +proj=stere +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +lat_ts=-67.000000000 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs",
+    2987: "+title=Saint Pierre et Miquelon 1950 / UTM zone 21N +proj=utm +zone=21 +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +units=m +no_defs ",
+    2989: "+title=RRAF 1991 / UTM zone 20N +proj=utm +zone=20 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    2990: "+title=Reunion 1947 / TM Reunion (deprecated) +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=50000 +y_0=160000 +ellps=intl +units=m +no_defs ",
+    2995: "+title=IGN53 Mare / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",
+    3038: "+proj=utm +zone=26 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3039: "+proj=utm +zone=27 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3040: "+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3041: "+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    // 3042 : "+proj=utm +zone=30 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    // 3043 : "+proj=utm +zone=31 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    // 3044 : "+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3045: "+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3046: "+proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3047: "+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3048: "+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3049: "+proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3050: "+proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3051: "+proj=utm +zone=39 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3034: "+title=ETRS89 / ETRS-LCC +proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +units=m +no_defs ",
+    3035: "+title=ETRS89 / ETRS-LAEA +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs ",
+    3042: "+title=ETRS89 / ETRS-TM30 +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs ",
+    3043: "+title=ETRS89 / ETRS-TM31 +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs ",
+    3044: "+title=ETRS89 / ETRS-TM32 +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs ",
+    25828: "+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    25829: "+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    // 25830 : "+proj=utm +zone=30 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    // 25831 : "+proj=utm +zone=31 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    // 25832 : "+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    25833: "+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    25834: "+proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    25835: "+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    25836: "+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    25837: "+proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    25838: "+proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3060: "+title=IGN72 Grande Terre / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",
+    3163: "+title=RGNC91-93 / Lambert New Caledonia +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3164: "+title=ST87 Ouvea / UTM zone 58S +proj=utm +zone=58 +south +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +units=m +no_defs ",
+    3165: "+title=NEA74 Noumea / Noumea Lambert +proj=lcc +lat_1=-22.24469175 +lat_2=-22.29469175 +lat_0=-22.26969175 +lon_0=166.44242575 +x_0=0.66 +y_0=1.02 +ellps=intl +units=m +no_defs ",
+    3166: "+title=NEA74 Noumea / Noumea Lambert 2 +proj=lcc +lat_1=-22.24472222222222 +lat_2=-22.29472222222222 +lat_0=-22.26972222222222 +lon_0=166.4425 +x_0=8.313000000000001 +y_0=-2.354 +ellps=intl +units=m +no_defs ",
+    3169: "+title=RGNC91-93 / UTM zone 57S +proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3170: "+title=RGNC91-93 / UTM zone 58S +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3171: "+title=RGNC91-93 / UTM zone 59S +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",
+    3172: "+title=IGN53 Mare / UTM zone 59S +proj=utm +zone=59 +south +ellps=intl +units=m +no_defs ",
+    3296: "+title=RGPF / UTM zone 5S +proj=utm +zone=5 +south +ellps=GRS80 +units=m +no_defs ",
+    3297: "+title=RGPF / UTM zone 6S +proj=utm +zone=6 +south +ellps=GRS80 +units=m +no_defs ",
+    3298: "+title=RGPF / UTM zone 7S +proj=utm +zone=7 +south +ellps=GRS80 +units=m +no_defs ",
+    3299: "+title=RGPF / UTM zone 8S +proj=utm +zone=8 +south +ellps=GRS80 +units=m +no_defs ",
+    3302: "+title=IGN63 Hiva Oa / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs ",
+    3303: "+title=Fatu Iva 72 / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +towgs84=347.103,1078.12,2623.92,-33.8875,70.6773,-9.3943,186.074 +units=m +no_defs ",
+    3304: "+title=Tahiti 79 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +units=m +no_defs ",
+    3305: "+title=Moorea 87 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +units=m +no_defs ",
+    3306: "+title=Maupiti 83 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +units=m +no_defs ",
+    3312: "+title=CSG67 / UTM zone 21N +proj=utm +zone=21 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs ",
+    3313: "+title=RGFG95 / UTM zone 21N +proj=utm +zone=21 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs ",
+    3336: "+title=IGN 1962 Kerguelen / UTM zone 42S +proj=utm +zone=42 +south +ellps=intl +towgs84=145,-187,103,0,0,0,0 +units=m +no_defs ",
+    3395: "+title=WGS 84 / World Mercator +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    3727: "+title=Reunion 1947 / TM Reunion +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=160000 +y_0=50000 +ellps=intl +units=m +no_defs ",
+    21781: "+title=CH1903 / LV03 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ",
+    25830: "+title=ETRS89 / UTM zone 30N +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs ",
+    25831: "+title=ETRS89 / UTM zone 31N +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs ",
+    25832: "+title=ETRS89 / UTM zone 32N +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs ",
+    27561: "+title=NTF (Paris) / Lambert Nord France +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27562: "+title=NTF (Paris) / Lambert Centre France +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27563: "+title=NTF (Paris) / Lambert Sud France +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27564: "+title=NTF (Paris) / Lambert Corse +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27571: "+title=NTF (Paris) / Lambert zone I +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27572: "+title=NTF (Paris) / Lambert zone II +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27573: "+title=NTF (Paris) / Lambert zone III +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27574: "+title=NTF (Paris) / Lambert zone IV +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27581: "+title=NTF (Paris) / France I (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27582: "+title=NTF (Paris) / France II (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27583: "+title=NTF (Paris) / France III (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27584: "+title=NTF (Paris) / France IV (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27591: "+title=NTF (Paris) / Nord France (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27592: "+title=NTF (Paris) / Centre France (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27593: "+title=NTF (Paris) / Sud France (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    27594: "+title=NTF (Paris) / Corse (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",
+    32601: "+proj=utm +zone=1 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32602: "+proj=utm +zone=2 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32603: "+proj=utm +zone=3 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32604: "+proj=utm +zone=4 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32605: "+proj=utm +zone=5 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32606: "+proj=utm +zone=6 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32607: "+proj=utm +zone=7 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32608: "+proj=utm +zone=8 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32609: "+proj=utm +zone=9 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32610: "+proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32611: "+proj=utm +zone=11 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32612: "+proj=utm +zone=12 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32613: "+proj=utm +zone=13 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32614: "+proj=utm +zone=14 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32615: "+proj=utm +zone=15 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32616: "+proj=utm +zone=16 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32617: "+proj=utm +zone=17 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32618: "+proj=utm +zone=18 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32619: "+proj=utm +zone=19 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32620: "+proj=utm +zone=20 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32621: "+proj=utm +zone=21 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32622: "+proj=utm +zone=22 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32623: "+proj=utm +zone=23 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32624: "+proj=utm +zone=24 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32625: "+proj=utm +zone=25 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32626: "+proj=utm +zone=26 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32627: "+proj=utm +zone=27 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32628: "+proj=utm +zone=28 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32629: "+proj=utm +zone=29 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32630: "+proj=utm +zone=30 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32631: "+proj=utm +zone=31 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32632: "+proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32633: "+proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32634: "+proj=utm +zone=34 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32635: "+proj=utm +zone=35 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32636: "+proj=utm +zone=36 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32637: "+proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32638: "+proj=utm +zone=38 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32639: "+proj=utm +zone=39 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32640: "+proj=utm +zone=40 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32641: "+proj=utm +zone=41 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32642: "+proj=utm +zone=42 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32643: "+proj=utm +zone=43 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32644: "+proj=utm +zone=44 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32645: "+proj=utm +zone=45 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32646: "+proj=utm +zone=46 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32647: "+proj=utm +zone=47 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32648: "+proj=utm +zone=48 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32649: "+proj=utm +zone=49 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32650: "+proj=utm +zone=50 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32651: "+proj=utm +zone=51 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32652: "+proj=utm +zone=52 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32653: "+proj=utm +zone=53 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32654: "+proj=utm +zone=54 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32655: "+proj=utm +zone=55 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32656: "+proj=utm +zone=56 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32657: "+proj=utm +zone=57 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32658: "+proj=utm +zone=58 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32659: "+proj=utm +zone=59 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32660: "+proj=utm +zone=60 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32661: "+proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32662: "+title=WGS 84 / Plate Carree +proj=eqc +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32701: "+proj=utm +zone=1 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32702: "+proj=utm +zone=2 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32703: "+proj=utm +zone=3 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32704: "+proj=utm +zone=4 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32705: "+proj=utm +zone=5 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32706: "+proj=utm +zone=6 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32707: "+proj=utm +zone=7 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32708: "+proj=utm +zone=8 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32709: "+proj=utm +zone=9 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32710: "+proj=utm +zone=10 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32711: "+proj=utm +zone=11 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32712: "+proj=utm +zone=12 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32713: "+proj=utm +zone=13 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32714: "+proj=utm +zone=14 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32715: "+proj=utm +zone=15 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32716: "+proj=utm +zone=16 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32717: "+proj=utm +zone=17 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32718: "+proj=utm +zone=18 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32719: "+proj=utm +zone=19 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32720: "+proj=utm +zone=20 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32721: "+proj=utm +zone=21 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32722: "+proj=utm +zone=22 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32723: "+proj=utm +zone=23 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32724: "+proj=utm +zone=24 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32725: "+proj=utm +zone=25 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32726: "+proj=utm +zone=26 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32727: "+proj=utm +zone=27 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32728: "+proj=utm +zone=28 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32729: "+proj=utm +zone=29 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32730: "+proj=utm +zone=30 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32731: "+proj=utm +zone=31 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32732: "+proj=utm +zone=32 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32733: "+proj=utm +zone=33 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32734: "+proj=utm +zone=34 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32735: "+proj=utm +zone=35 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32736: "+proj=utm +zone=36 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32737: "+proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32738: "+proj=utm +zone=38 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32739: "+proj=utm +zone=39 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32740: "+proj=utm +zone=40 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32741: "+proj=utm +zone=41 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32742: "+proj=utm +zone=42 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32743: "+proj=utm +zone=43 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32744: "+proj=utm +zone=44 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32745: "+proj=utm +zone=45 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32746: "+proj=utm +zone=46 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32747: "+proj=utm +zone=47 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32748: "+proj=utm +zone=48 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32749: "+proj=utm +zone=49 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32750: "+proj=utm +zone=50 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32751: "+proj=utm +zone=51 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32752: "+proj=utm +zone=52 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32753: "+proj=utm +zone=53 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32754: "+proj=utm +zone=54 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32755: "+proj=utm +zone=55 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32756: "+proj=utm +zone=56 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32757: "+proj=utm +zone=57 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32758: "+proj=utm +zone=58 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32759: "+proj=utm +zone=59 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32760: "+proj=utm +zone=60 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    32761: "+proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
+    310024802: "+title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    310915814: "+title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    310486805: "+title=Geoportail - Guyane +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    310700806: "+title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    310702807: "+title=Geoportail - Mayotte +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    310706808: "+title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    310547809: "+title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    310642810: "+title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    310032811: "+title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    310642812: "+title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-49.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    310642801: "+title=Geoportail - Crozet +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    310642813: "+title=Geoportail - Amsterdam et Saint-Paul +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-38.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    310642901: "+title=Geoportail - Monde +proj=mill +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    5489: "+title=RGAF09 geographiques (dms) +proj=longlat +nadgrids=@null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137 +rf=298.257222101 +units=m +no_defs",
+    5490: "+title=RGAF09 UTM Nord Fuseau 20 +proj=tmerc +nadgrids=@null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137 +rf=298.257222101 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs"
+  },
+  CRS: {
+    84: "+title=WGS 84 longitude-latitude +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs "
+  },
+  IGNF: {
+    // AMST63 : "+title=Amsterdam 1963 +proj=geocent +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // CROZ63 : "+title=Crozet 1963 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // CSG67 : "+title=Guyane CSG67 +proj=geocent +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // ED50 : "+title=ED50 +proj=geocent +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // ETRS89 : "+title=Systeme de reference terrestre Europeen (1989) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    // GUAD48 : "+title=Guadeloupe Ste Anne +proj=geocent +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // GUADFM49 : "+title=Guadeloupe Fort Marigot +proj=geocent +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // IGN63 : "+title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=geocent +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // IGN72 : "+title=IGN 1972 Grande-Terre / Ile des Pins +proj=geocent +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // KERG62CAR : "+title=Kerguelen - K0 +proj=geocent +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // MART38 : "+title=Martinique Fort-Desaix +proj=geocent +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // MAYO50 : "+title=Mayotte Combani +proj=geocent +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // MOOREA87 : "+title=Moorea 1987 +proj=geocent +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // NTF : "+title=Nouvelle Triangulation Francaise +proj=geocent +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs",
+    // NUKU72 : "+title=IGN 1972 Nuku Hiva +proj=geocent +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // REUN47 : "+title=Reunion 1947 +proj=geocent +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // RGF93 : "+title=Reseau geodesique francais 1993 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    // RGFG95 : "+title=Reseau geodesique francais de Guyane 1995 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    // RGM04 : "+title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    // RGNC : "+title=Reseau Geodesique de Nouvelle-Caledonie +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    // RGPF : "+title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    // RGR92 : "+title=Reseau geodesique Reunion 1992 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    // RGSPM06 : "+title=Reseau Geodesique Saint-Pierre-et-Miquelon (2006) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    // RGTAAF07 : "+title=Reseau Geodesique des TAAF (2007) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    // RRAF91 : "+title=RRAF 1991 (Reseau de Reference des Antilles Francaises) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    // STPL69 : "+title=Saint-Paul 1969 +proj=geocent +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // STPM50 : "+title=St Pierre et Miquelon 1950 +proj=geocent +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs",
+    // TAHAA : "+title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=geocent +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // TAHI79 : "+title=IGN79 (Tahiti) Iles de la Societe +proj=geocent +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // TERA50 : "+title=Pointe Geologie - Perroud 1950 +proj=geocent +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // WALL78 : "+title=Wallis-Uvea 1978 (MOP78) +proj=geocent +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    // WGS72 : "+title=World Geodetic System 1972 +proj=geocent +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs",
+    // WGS84 : "+title=World Geodetic System 1984 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    AMST63GEO: "+title=Amsterdam 1963 +proj=longlat +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    CROZ63GEO: "+title=Crozet 1963 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    CSG67GEO: "+title=Guyane CSG67 +proj=longlat +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    ED50G: "+title=ED50 +proj=longlat +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    GUAD48GEO: "+title=Guadeloupe Ste Anne +proj=longlat +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    GUADFM49GEO: "+title=Guadeloupe Fort Marigot +proj=longlat +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    IGN63GEO: "+title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=longlat +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    IGN72GEO: "+title=IGN 1972 Grande-Terre / Ile des Pins +proj=longlat +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    KERG62GEO: "+title=Kerguelen - K0 +proj=longlat +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    MART38GEO: "+title=Martinique Fort-Desaix +proj=longlat +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    MAYO50GEO: "+title=Mayotte Combani +proj=longlat +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    MOOREA87GEO: "+title=Moorea 1987 +proj=longlat +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    NTFG: "+title=Nouvelle Triangulation Francaise Greenwich degres sexagesimaux +proj=longlat +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs",
+    NTFP: "+title=Nouvelle Triangulation Francaise Paris grades +proj=longlat +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +units=m +no_defs",
+    NUKU72GEO: "+title=IGN 1972 Nuku Hiva +proj=longlat +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    REUN47GEO: "+title=Reunion 1947 +proj=longlat +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    RGF93G: "+title=Reseau geodesique francais 1993 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    RGFG95GEO: "+title=Reseau geodesique francais de Guyane 1995 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    RGM04GEO: "+title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    RGNCGEO: "+title=Reseau Geodesique de Nouvelle-Caledonie +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    RGPFGEO: "+title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    RGR92GEO: "+title=Reseau geodesique de la Reunion 1992 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    RGSPM06GEO: "+title=Saint-Pierre-et-Miquelon (2006) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    RGTAAF07G: "+title=Reseau Geodesique des TAAF (2007) (dms) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    STPL69GEO: "+title=Saint-Paul 1969 +proj=longlat +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    STPM50GEO: "+title=St Pierre et Miquelon 1950  +proj=longlat +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs",
+    TAHAAGEO: "+title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=longlat +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    TAHI79GEO: "+title=IGN79 (Tahiti) Iles de la Societe +proj=longlat +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    TERA50G: "+title=Pointe Geologie - Perroud 1950 +proj=longlat +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    WALL78GEO: "+title=Wallis - Uvea 1978 (MOP78) +proj=longlat +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",
+    WGS72G: "+title=WGS72 +proj=longlat +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs",
+    WGS84G: "+title=World Geodetic System 1984 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    WGS84RRAFGEO: "+title=Reseau de reference des Antilles francaises (1988-1991) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    XGEO: "+title=Systeme CIO-BIH +proj=longlat +towgs84=0.0000,0.0000,0.5000,0.0000,0.0000,0.0140,-0.100000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    AMST63UTM43S: "+title=Amsterdam 1963 UTM fuseau 43 Sud +proj=tmerc +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    CROZ63UTM39S: "+title=Crozet 1963 +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    CSG67UTM21: "+title=Guyane CSG67 UTM fuseau 21 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    CSG67UTM22: "+title=Guyane CSG67 UTM fuseau 22 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    GEOPORTALANF: "+title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    GEOPORTALASP: "+title=Geoportail - Amsterdam et Saint-Paul +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-38.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    GEOPORTALCRZ: "+title=Geoportail - Crozet +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    GEOPORTALFXX: "+title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    GEOPORTALGUF: "+title=Geoportail - Guyane +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    GEOPORTALKER: "+title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-49.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    GEOPORTALMYT: "+title=Geoportail - Mayotte +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    GEOPORTALNCL: "+title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    GEOPORTALPYF: "+title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    GEOPORTALREU: "+title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    GEOPORTALSPM: "+title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    GEOPORTALWLF: "+title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    GUAD48UTM20: "+title=Guadeloupe Ste Anne +proj=tmerc +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    GUADFM49U20: "+title=Guadeloupe Fort Marigot  +proj=tmerc +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    IGN63UTM7S: "+title=IGN 1963 - Hiva Oa, Tahuata, Mohotani - UTM fuseau 7 Sud +proj=tmerc +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    IGN72UTM58S: "+title=IGN 1972 - UTM fuseau 58 Sud +proj=tmerc +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    KERG62UTM42S: "+title=Kerguelen 1962 +proj=tmerc +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    LAMB1: "+title=Lambert I +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs",
+    LAMB1C: "+title=Lambert I Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=1200000.000 +units=m +no_defs",
+    LAMB2: "+title=Lambert II +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs",
+    LAMB2C: "+title=Lambert II Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs",
+    LAMB3: "+title=Lambert III +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs",
+    LAMB3C: "+title=Lambert III Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=3200000.000 +units=m +no_defs",
+    LAMB4: "+title=Lambert IV +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=185861.369 +units=m +no_defs",
+    LAMB4C: "+title=Lambert IV Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=4185861.369 +units=m +no_defs",
+    LAMB93: "+title=Lambert 93 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.500000000 +lon_0=3.000000000 +lat_1=44.000000000 +lat_2=49.000000000 +x_0=700000.000 +y_0=6600000.000 +units=m +no_defs",
+    RGF93CC42: "+title=Lambert conique conforme Zone 1 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=42.000000000 +lon_0=3.000000000 +lat_1=41.200000000 +lat_2=42.800000000 +x_0=1700000.000 +y_0=1200000.000 +units=m +no_defs",
+    RGF93CC43: "+title=Lambert conique conforme Zone 2 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=43.000000000 +lon_0=3.000000000 +lat_1=42.200000000 +lat_2=43.800000000 +x_0=1700000.000 +y_0=2200000.000 +units=m +no_defs",
+    RGF93CC44: "+title=Lambert conique conforme Zone 3 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=44.000000000 +lon_0=3.000000000 +lat_1=43.200000000 +lat_2=44.800000000 +x_0=1700000.000 +y_0=3200000.000 +units=m +no_defs",
+    RGF93CC45: "+title=Lambert conique conforme Zone 4 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=45.000000000 +lon_0=3.000000000 +lat_1=44.200000000 +lat_2=45.800000000 +x_0=1700000.000 +y_0=4200000.000 +units=m +no_defs",
+    RGF93CC46: "+title=Lambert conique conforme Zone 5 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.000000000 +lon_0=3.000000000 +lat_1=45.200000000 +lat_2=46.800000000 +x_0=1700000.000 +y_0=5200000.000 +units=m +no_defs",
+    RGF93CC47: "+title=Lambert conique conforme Zone 6 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=47.000000000 +lon_0=3.000000000 +lat_1=46.200000000 +lat_2=47.800000000 +x_0=1700000.000 +y_0=6200000.000 +units=m +no_defs",
+    RGF93CC48: "+title=Lambert conique conforme Zone 7 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=48.000000000 +lon_0=3.000000000 +lat_1=47.200000000 +lat_2=48.800000000 +x_0=1700000.000 +y_0=7200000.000 +units=m +no_defs",
+    RGF93CC49: "+title=Lambert conique conforme Zone 8 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=49.000000000 +lon_0=3.000000000 +lat_1=48.200000000 +lat_2=49.800000000 +x_0=1700000.000 +y_0=8200000.000 +units=m +no_defs",
+    RGF93CC50: "+title=Lambert conique conforme Zone 9 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=50.000000000 +lon_0=3.000000000 +lat_1=49.200000000 +lat_2=50.800000000 +x_0=1700000.000 +y_0=9200000.000 +units=m +no_defs",
+    LAMBE: "+title=Lambert II etendu +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs",
+    MART38UTM20: "+title=Martinique Fort-Desaix +proj=tmerc +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    MAYO50UTM38S: "+title=Mayotte Combani +proj=tmerc +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    MILLER: "+title=Geoportail - Monde +proj=mill +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",
+    MOOREA87U6S: "+title=Moorea 1987 - UTM fuseau 6 Sud +proj=tmerc +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    NUKU72U7S: "+title=IGN 1972 Nuku Hiva - UTM fuseau 7 Sud +proj=tmerc +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    // REUN47GAUSSL : "+title=Reunion Gauss Laborde +proj=gstmerc +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-21.116666667 +lon_0=55.533333333 +k_0=1.00000000 +x_0=160000.000 +y_0=50000.000 +units=m +no_defs",
+    RGM04UTM38S: "+title=UTM fuseau 38 Sud (Reseau Geodesique de Mayotte 2004) +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    RGNCUTM57S: "+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 57 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=159.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    RGNCUTM58S: "+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 58 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    RGNCUTM59S: "+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 59 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=171.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    RGPFUTM5S: "+title=RGPF - UTM fuseau 5 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    RGPFUTM6S: "+title=RGPF - UTM fuseau 6 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    RGPFUTM7S: "+title=RGPF - UTM fuseau 7 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    RGR92UTM40S: "+title=RGR92 UTM fuseau 40 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    RGSPM06U21: "+title=Saint-Pierre-et-Miquelon (2006) UTM Fuseau 21 Nord +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    STPL69UTM43S: "+title=Saint-Paul 1969 UTM fuseau 43 Sud +proj=tmerc +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    STPM50UTM21: "+title=St Pierre et Miquelon 1950 +proj=tmerc +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    TAHAAUTM05S: "+title=Tahaa 1951 +proj=tmerc +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    TAHI51UTM06S: "+title=Tahiti-Terme Nord UTM fuseau 6 Sud +proj=tmerc +towgs84=162.0000,117.0000,154.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    TAHI79UTM6S: "+title=Tahiti 1979 +proj=tmerc +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    TERA50STEREO: "+title=Terre Adelie 1950 +proj=stere +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +lat_ts=-67 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs",
+    UTM01SW84: "+title=World Geodetic System 1984 UTM fuseau 01 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    UTM20W84GUAD: "+title=World Geodetic System 1984 UTM fuseau 20 Nord-Guadeloupe +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM20W84MART: "+title=World Geodetic System 1984 UTM fuseau 20 Nord-Martinique +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM22RGFG95: "+title=RGFG95 UTM fuseau 22 Nord-Guyane +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM39SW84: "+title=World Geodetic System 1984 UTM fuseau 39 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    UTM42SW84: "+title=World Geodetic System 1984 UTM fuseau 42 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    UTM43SW84: "+title=World Geodetic System 1984 UTM fuseau 43 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    WALL78UTM1S: "+title=Wallis-Uvea 1978 (MOP78) UTM 1 SUD +proj=tmerc +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",
+    ETRS89GEO: "+title=ETRS89 geographiques (dms) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",
+    ETRS89LAEA: "+title=ETRS89 Lambert Azimutal Equal Area +proj=laea +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=52.000000000 +lon_0=10.000000000 +x_0=4321000.000 +y_0=3210000.000 +units=m +no_defs",
+    ETRS89LCC: "+title=ETRS89 Lambert Conformal Conic +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=52.000000000 +lon_0=9.999999995 +lat_1=35.000000000 +lat_2=65.000000000 +x_0=4000000.000 +y_0=2800000.000 +units=m +no_defs",
+    UTM26ETRS89: "+title=Europe - de 30d a 24d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-27.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM27ETRS89: "+title=Europe - de 24d a 18d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-21.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM28ETRS89: "+title=Europe - de 18d a 12d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-15.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM29ETRS89: "+title=Europe - de 12d a 6d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-9.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM30ETRS89: "+title=Europe - de -6d a 0d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-3.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM31ETRS89: "+title=Europe - de 0d a 6d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=3.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM32ETRS89: "+title=Europe - de 6d a 12d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=9.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM33ETRS89: "+title=Europe - de 12d a 18d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=15.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM34ETRS89: "+title=Europe - de 18d a 24d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=21.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM35ETRS89: "+title=Europe - de 24d a 30d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=27.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM36ETRS89: "+title=Europe - de 30d a 36d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=33.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM37ETRS89: "+title=Europe - de 36d a 42d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=39.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",
+    UTM38ETRS89: "+title=Europe - de 42d a 48d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs"
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (Register);
+
+/***/ }),
+/* 155 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(141);
+/* harmony import */ var _Common_Utils_Register__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(154);
+
+
+
+/**
+ * @classdesc
+ *
+ * Leaflet Lambert 93 (EPSG:2154) <a href="http://leafletjs.com/reference.html#icrs" target="_blank">ICRS compatible</a> definition.
+ *
+ * @namespace
+ * @alias L.geoportalCRS.EPSG2154
+ * @example
+ *  var map = L.Map('divmap', {
+ *    crs : L.geoportalCRS.EPSG2154
+ *  }).setView();
+ *  var lyr = L.geoportalLayer.WMTS(
+ *    {
+ *      layer : "ORTHOIMAGERY.ORTHOPHOTOS.BDORTHO.L93"
+ *    });
+ *
+ *  lyr.addTo(map); // ou map.addLayer(lyr);
+ */
+
+var EPSG2154 = {
+  /**
+   * instance
+   *
+   * @private
+   */
+  instance: null,
+
+  /**
+   * execution
+   *
+   * @returns {Object} instance
+   * @private
+   */
+  build: function build() {
+    // singleton
+    if (!this.instance) {
+      var crs = new leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Proj.CRS("EPSG:2154", _Common_Utils_Register__WEBPACK_IMPORTED_MODULE_2__["default"].get("EPSG:2154"), {
+        // FIXME issue de l'autoconf cf. nativeResolutions
+        resolutions: this._getResolutions(),
+        origin: this._getOrigin()
+      });
+      this.instance = crs;
+    }
+
+    return this.instance;
+  },
+
+  /**
+   * resolutions
+   *
+   * @returns {Number[]} resolutions
+   * @private
+   */
+  _getResolutions: function _getResolutions() {
+    var resolutions = []; // resolutions issues de l'autoconf
+
+    if (_Common_Utils_Config__WEBPACK_IMPORTED_MODULE_1__["default"].isConfigLoaded()) {
+      var o = _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_1__["default"].getTileMatrix("LAMB93");
+      resolutions = o.nativeResolutions;
+    }
+
+    if (resolutions.length) {
+      return resolutions;
+    } // resolution par defaut
+
+
+    return [104579.22454989408, 52277.53235379051, 26135.487078595408, 13066.891381800004, 6533.228604113456, 3266.5595244626675, 1633.2660045974187, 816.6295549860224, 408.31391467683596, 204.15674151090204, 102.07831678324082, 51.0391448966112, 25.519569074269395, 12.759783693647506, 6.379891635966491, 3.18994576530532, 1.5949728694977277, 0.7974864315474559, 0.398743214900604, 0.19937160727567999, 0.099685803696052, 0.049842901818919996];
+  },
+
+  /**
+   * origine
+   *
+   * @returns {Number[]} origin
+   * @private
+   */
+  _getOrigin: function _getOrigin() {
+    return [0, 12000000];
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (EPSG2154);
+
+/***/ }),
+/* 156 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(141);
+/* harmony import */ var _Common_Utils_Register__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(154);
+
+
+
+/**
+ *
+ * Projection Lambert 2 étendu
+ *
+ * @ignore
+ * @module EPSG27572
+ * @alias EPSG27572
+ * @returns {L.Proj.CRS}
+ * @example
+ *  var map = L.Map('divmap', {
+ *    crs : L.geoportalCRS.EPSG27572
+ *  }).setView();
+ *  var lyr = L.geoportalLayer.WMTS(
+ *    {
+ *      layer : "ORTHOIMAGERY.ORTHOPHOTOS.BDORTHO.L93",
+ *      apiKey : "wqxljfvklsdhvlfkjqfmlq787645"
+ *    },
+ *    {
+ *      attribution : "test for layer ORTHOIMAGERY",
+ *      opacity : 1,
+ *      transparent : true,
+ *      minZoom : 1,
+ *      maxZoom : 21
+ *      ...
+ *    });
+ *
+ *  lyr.addTo(map); // ou map.addLayer(lyr);
+ */
+
+var EPSG27572 = {
+  /**
+   * instance
+   *
+   * @private
+   */
+  instance: null,
+
+  /**
+   * execution
+   *
+   * @returns {Object} instance
+   * @private
+   */
+  build: function build() {
+    // singleton
+    if (!this.instance) {
+      var crs = new leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Proj.CRS("EPSG:27572", _Common_Utils_Register__WEBPACK_IMPORTED_MODULE_2__["default"].get("EPSG:27572"), {
+        // FIXME issue de l'autoconf cf. nativeResolutions
+        resolutions: this._getResolutions(),
+        origin: this._getOrigin()
+      });
+      this.instance = crs;
+    }
+
+    return this.instance;
+  },
+
+  /**
+   * resolutions
+   *
+   * @returns {Number[]} resolutions
+   * @private
+   */
+  _getResolutions: function _getResolutions() {
+    var resolutions = []; // resolutions issues de l'autoconf
+
+    if (_Common_Utils_Config__WEBPACK_IMPORTED_MODULE_1__["default"].isConfigLoaded()) {
+      var o = _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_1__["default"].getTileMatrix("LAMB2E");
+
+      if (o && Object.keys(o)) {
+        resolutions = o.nativeResolutions;
+      }
+    }
+
+    if (resolutions.length) {
+      return resolutions;
+    } // FIXME resolution par defaut ???
+
+
+    return [104579.22454989408, 52277.53235379051, 26135.487078595408, 13066.891381800004, 6533.228604113456, 3266.5595244626675, 1633.2660045974187, 816.6295549860224, 408.31391467683596, 204.15674151090204, 102.07831678324082, 51.0391448966112, 25.519569074269395, 12.759783693647506, 6.379891635966491, 3.18994576530532, 1.5949728694977277, 0.7974864315474559, 0.398743214900604, 0.19937160727567999, 0.099685803696052, 0.049842901818919996];
+  },
+
+  /**
+   * origine
+   *
+   * @returns {Number[]} origin
+   * @private
+   */
+  _getOrigin: function _getOrigin() {
+    return [0, 12000000];
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (EPSG27572);
+
+/***/ }),
+/* 157 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(141);
+/* harmony import */ var _Common_Utils_Register__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(154);
+
+
+ // FIXME prototype
+// il ne fonctionne pas car les bbox ne sont pas bien formatées !?
+//   > BBOX=xmin,ymin,xmax,ymax --> conversion en EPSG --> BBOX=ymin,xmin,ymax,xmax
+// cf. methode L.TileLayer.WMS.getTileUrl()
+//   > inversion des coordonnées si crs = L.CRS.EPSG4326
+// il faudrait donc surcharger cette methode afin qu'elle prenne en compte la condition suivante :
+//   > crs.code = "EPSG:4326"
+
+/**
+ * Projection Geographic (EPSG:4326)
+ * (PROTOTYPE)
+ *
+ * @ignore
+ * @module EPSG4326
+ * @alias EPSG4326
+ * @returns {L.Proj.CRS}
+ * @example
+ *  var map = L.Map('divmap', {
+ *    crs : L.geoportalCRS.EPSG4326 // ou L.CRS.EPSG4326
+ *  }).setView();
+ *  var lyr = L.geoportalLayer.WMTS(
+ *    {
+ *      layer : "ORTHOIMAGERY.ORTHOPHOTOS.BDORTHO",
+ *      apiKey : "wqxljfvklsdhvlfkjqfmlq787645"
+ *    },
+ *    {
+ *      attribution : "test for layer ORTHOIMAGERY",
+ *      opacity : 1,
+ *      transparent : true,
+ *      minZoom : 1,
+ *      maxZoom : 21
+ *      ...
+ *    });
+ *
+ *  lyr.addTo(map); // ou map.addLayer(lyr);
+ */
+
+var EPSG4326 = {
+  /**
+   * instance
+   *
+   * @private
+   */
+  instance: null,
+
+  /**
+   * execution
+   *
+   * @returns {Object} instance
+   * @private
+   */
+  build: function build() {
+    // singleton
+    if (!this.instance) {
+      var crs = new leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Proj.CRS("EPSG:4326", _Common_Utils_Register__WEBPACK_IMPORTED_MODULE_2__["default"].get("EPSG:4326"), {
+        resolutions: this._getResolutions(),
+        origin: [-180, 90] // ???
+
+      });
+      this.instance = crs;
+    }
+
+    return this.instance;
+  },
+
+  /**
+   * resolutions
+   *
+   * @returns {Number[]} resolutions
+   * @private
+   */
+  _getResolutions: function _getResolutions() {
+    var resolutions = []; // FIXME resolutions issues de l'autoconf
+    // mais pas celle du TMS WGS84G
+
+    if (_Common_Utils_Config__WEBPACK_IMPORTED_MODULE_1__["default"].isConfigLoaded()) {
+      resolutions = _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_1__["default"].getResolutions();
+    }
+
+    if (resolutions.length) {
+      return resolutions;
+    }
+
+    return [1.40625, 0.703125, 0.3515625, 0.17578125, 0.087890625, 0.0439453125, 0.02197265625, 0.010986328125, 0.0054931640625, 0.00274658203125, 0.001373291015625, 0.0006866455078125, 0.00034332275390625, 0.000171661376953126, 0.0000858306884765628, 0.0000429153442382813, 0.0000214576721191407, 0.0000107288360595703, 0.00000536441802978517, 0.00000268220901489259, 0.0000013411045074463, 0.000000670552253723145, 0.00000033527612686157];
+  },
+
+  /**
+   * origine
+   *
+   * @private
+   */
+  _getOrigin: function _getOrigin() {}
+};
+/* harmony default export */ __webpack_exports__["default"] = (EPSG4326);
+
+/***/ }),
+/* 158 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(40);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var leaflet_draw__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(159);
+/* harmony import */ var leaflet_draw__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(leaflet_draw__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(34);
+/* harmony import */ var _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(140);
+/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(36);
+/* harmony import */ var _Utils_IconDefault__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(145);
+/* harmony import */ var _Common_Controls_ReverseGeocodingDOM__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(160);
+
+
+
+
+
+
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__["default"].getLogger("reversegeocoding");
+/**
+ * @classdesc
+ *
+ * Leaflet Control Class to find locations by clicking on a map using <a href="https://geoservices.ign.fr/documentation/geoservices/geocodage-inverse.html" target="_blank">reverse geocoding service</a> of the Geoportal platform.
+ *
+ * Use {@link module :Controls.ReverseGeocode L.geoportalControl.ReverseGeocode()} factory to create instances of that class.
+ *
+ * **Extends** Leaflet <a href="http://leafletjs.com/reference.html#control" target="_blank">L.Control</a> native class.
+ *
+ * @namespace
+ * @alias L.geoportalControl.ReverseGeocode
+ */
+
+var ReverseGeocoding = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Control.extend(
+/** @lends L.geoportalControl.ReverseGeocode.prototype */
+{
+  includes: _Common_Controls_ReverseGeocodingDOM__WEBPACK_IMPORTED_MODULE_7__["default"],
+
+  /**
+   * options by default
+   *
+   * @private
+   */
+  options: {
+    position: "bottomleft",
+    collapsed: true,
+    resources: ["StreetAddress", "PositionOfInterest"],
+    delimitations: ["Point", "Circle", "Extent"],
+    reverseGeocodeOptions: {}
+  },
+
+  /**
+   * @constructor ReverseGeocode
+   * @param {Object} options - ReverseGeocoding control options
+   * @param {String}  [options.apiKey] - API key for services call (reverse geocode service), mandatory if autoconf service has not been charged in advance
+   * @param {Boolean} [options.ssl = true] - use of ssl or not (default true, service requested using https protocol)
+   * @param {String}  [options.position] - position of component into the map, 'topleft' by default
+   * @param {Boolean} [options.collapsed] - Specify if widget has to be collapsed (true) or not (false) on map loading. Default is true.
+   * @param {Array}  [options.resources] - resources for geocoding, by default : ["StreetAddress", "PositionOfInterest"]
+   * @param {Array}  [options.delimitations] - delimitations for reverse geocoding, by default : ["Point", "Circle", "Extent"]
+   * @param {Object}  [options.reverseGeocodeOptions] - reverse geocode service options. see {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~ReverseGeocode Gp.Services.reverseGeocode()} to know all reverse geocode options.
+   * @example
+   *  var iso = L.geoportalControl.ReverseGeocode({
+   *      collapsed : false,
+   *      position : "topright",
+   *      resources : ["StreetAddress", "PositionOfInterest"],
+   *      delimitations : ["Point", "Circle"],
+   *      reverseGeocodeOptions : {}
+   *  });
+   * @private
+   */
+  initialize: function initialize(options) {
+    // on merge les options avec celles par defaut
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(this.options, options);
+    /**
+     * Droit sur la ressource.
+     * Par defaut, on n'en s'occupe pas
+     * sauf si l'autoconfiguration est chargée !
+     */
+
+    this._noRightManagement = false; // ressources des services d'autocompletion et de geocodage
+
+    this._servicesRightManagement = {}; // gestion des droits sur les ressources/services
+
+    this._checkRightsManagement(); // check input options format (resources and delimitations arrays)
+
+
+    this._checkInputOptions();
+    /** uuid */
+
+
+    this._uid = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_5__["default"].generate(); // Type de géocodage sélectionné (StreetAddress, PositionOfInterest, ...)
+
+    this._currentGeocodingType = null;
+
+    this._initGeocodingType(); // Type de délimitation à utiliser pour la requête + pour sélection sur la containerDistance
+
+
+    this._currentGeocodingDelimitation = null;
+
+    this._initGeocodingDelimitation(); // ################################################################## //
+    // ################### Elements principaux du DOM ################### //
+    // containers principaux
+
+
+    this._showReverseGeocodingContainer = null; // header panel
+
+    this._panelHeaderContainer = null;
+    this._panelTitleContainer = null;
+    this._returnPictoContainer = null; // form
+
+    this._formContainer = null; // results
+
+    this._resultsContainer = null;
+    this._resultsListContainer = null; // waiting
+
+    this._waitingContainer = null; // ###################################################################### //
+    // ################### informations des points saisis ################### //
+    // couche vectorielle dans laquelle seront saisis les points (features ci-dessus)
+
+    this._inputFeaturesLayer = null;
+    this._inputResultsLayer = null;
+    this._lastIdLayer = 0;
+    this._currentIdLayer = 0; // interaction avec la carte (de type "Point", "Circle" ou "Polygon")
+
+    this._currentFeature = null; // #################################################################### //
+    // ################### informations pour la requête ################### //
+    // position du géocodage inverse qui sera envoyée dans la requête
+
+    this._requestPosition = null; // eventuels filtres géométriques saisis par l'utilisateur : cercle ou bbox
+
+    this._requestCircleFilter = null;
+    this._requestBboxFilter = null; // pour savoir si un calcul est en cours ou non
+
+    this._waiting = false; // timer pour cacher la patience après un certain temps
+
+    this._timer = null; // #################################################################### //
+    // #################### informations des résultats #################### //
+
+    this._reverseGeocodingLocations = [];
+  },
+
+  /**
+   * this method is called by this.addTo(map) when the control is added on the map
+   * and fills variable 'this._container = this.onAdd(map)',
+   * and create events on map.
+   *
+   * @param {Object} map - the map
+   *
+   * @returns {DOMElement} DOM element
+   *
+   * @private
+   */
+  onAdd: function onAdd(map) {
+    // initialisation du DOM du composant
+    var container = this._container = this._initLayout(); // deactivate of events that may interfere with the map
+
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
+
+    if (map) {
+      // lors de l'ajout à la map, on active la saisie du point,
+      // mais seulement si le widget est ouvert
+      if (!this.options.collapsed) {
+        this._activateMapInteraction(map);
+      }
+    }
+
+    return container;
+  },
+
+  /**
+   * this method is called when the control is removed from the map
+   * and removes events on map.
+   *
+   * @param {Object} map - the map
+   *
+   * @private
+   */
+  onRemove: function onRemove(map) {
+    this._clearLocations();
+
+    this._clearLocationsFeature(map);
+
+    this._clearInputRequest(); // on supprime l'éventuelle précédente interaction
+
+
+    this._removeMapInteraction(map);
+  },
+  // ################################################################### //
+  // ##################### init component ############################## //
+  // ################################################################### //
+
+  /**
+   * this method is called by constructor
+   * and check the rights to resources
+   *
+   * @private
+   */
+  _checkRightsManagement: function _checkRightsManagement() {
+    var _resources = [];
+
+    var _key;
+
+    var _opts = null; // les ressources du service de geocodage
+
+    _key = this.options.reverseGeocodeOptions.apiKey;
+    _opts = this.options.reverseGeocodeOptions.filterOptions; // on récupère les éventuelles ressources passées en option, soit dans reverseGeocodeOptions :
+
+    _resources = _opts ? _opts.type : []; // soit directement dans options.resources.geocode :
+
+    if (!_resources || _resources.length === 0) {
+      _resources = this.options.resources;
+    } // ou celles par défaut sinon.
+
+
+    if (!_resources || _resources.length === 0) {
+      _resources = ["StreetAddress", "PositionOfInterest"];
+    }
+
+    var rightManagementGeocode = _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_4__["default"].check({
+      key: _key || this.options.apiKey,
+      resources: _resources,
+      services: ["Geocode"]
+    });
+    logger.log("rightManagementGeocode", rightManagementGeocode); // aucun droit !
+
+    if (!rightManagementGeocode) {
+      this._noRightManagement = true;
+      return;
+    } // on recupère les informations utiles
+    // Ex. la clef API issue de l'autoconfiguration si elle n'a pas
+    // été renseignée.
+
+
+    if (!this.options.apiKey) {
+      this.options.apiKey = rightManagementGeocode.key;
+    }
+
+    if (rightManagementGeocode) {
+      this._servicesRightManagement["Geocode"] = rightManagementGeocode["Geocode"];
+    }
+  },
+
+  /**
+   * this method is called by this.initialize()
+   * and makes sure input options are correctly formated
+   *
+   * @private
+   */
+  _checkInputOptions: function _checkInputOptions() {
+    var i; // on vérifie le tableau des resources
+
+    if (this.options.resources) {
+      var resources = this.options.resources; // on vérifie que la liste des ressources de geocodage est bien un tableau
+
+      if (!Array.isArray(resources)) {
+        logger.log("[ReverseGeocoding] 'options.resources' parameter should be an array");
+        resources = null;
+      }
+
+      var resourcesList = ["StreetAddress", "PositionOfInterest", "CadastralParcel", "Administratif"];
+
+      for (i = 0; i < resources.length; i++) {
+        if (resourcesList.indexOf(resources[i]) === -1) {
+          // si la resource n'est pas référencée, on l'enlève
+          // resources.splice(i, 1);
+          logger.log("[ReverseGeocoding] options.resources : " + resources[i] + " is not a resource for reverse geocode");
+        }
+      }
+    } // et le tableau des délimitations
+
+
+    if (this.options.delimitations) {
+      var delimitations = this.options.delimitations; // on vérifie que la liste des delimitations est bien un tableau
+
+      if (!Array.isArray(delimitations)) {
+        logger.log("[ReverseGeocoding] 'options.delimitations' parameter should be an array");
+        delimitations = null;
+      }
+
+      var delimitationsList = ["Circle", "Point", "Extent"];
+
+      for (i = 0; i < delimitations.length; i++) {
+        if (delimitationsList.indexOf(delimitations[i]) === -1) {
+          // si la delimitations n'est pas référencée, on l'enlève
+          // resources.splice(i, 1);
+          logger.log("[ReverseGeocoding] options.delimitations : " + delimitations[i] + " is not a delimitation for reverse geocode");
+        }
+      }
+    }
+  },
+
+  /**
+   * this method is called by this.initialize() and initialize geocoding type (=resource)
+   * ("StreetAddress", "PositionOfInterest", "CadastralParcel", "Administratif")
+   *
+   * @private
+   */
+  _initGeocodingType: function _initGeocodingType() {
+    // Type de géocodage selectionné
+    this._currentGeocodingType = "StreetAddress"; // par defaut
+    // par defaut
+
+    var resources = this.options.resources;
+
+    if (!resources || resources.length === 0) {
+      this.options.resources = ["StreetAddress", "PositionOfInterest", "CadastralParcel"];
+    } // options utilisateur
+
+
+    if (Array.isArray(resources) && resources.length) {
+      // vérification des droits
+      var noRightsIndexes = [];
+
+      for (var i = 0; i < resources.length; i++) {
+        if (this._servicesRightManagement["Geocode"].indexOf(resources[i]) < 0) {
+          // si on n'a pas les droits sur la ressource, on va la supprimer : on stocke son index
+          noRightsIndexes.push(i);
+          logger.log("[ReverseGeocode] no rights for options.resources : " + resources[i]);
+        }
+      } // on retire les ressoures non autorisées qu'on a pu rencontrer
+
+
+      if (noRightsIndexes.length !== 0) {
+        for (var j = 0; j < noRightsIndexes.length; j++) {
+          resources.splice(noRightsIndexes[j], 1);
+        }
+      } // récupération du type par défaut
+
+
+      if (resources[0] === "StreetAddress" || resources[0] === "PositionOfInterest" || resources[0] === "CadastralParcel" || resources[0] === "Administratif") {
+        this._currentGeocodingType = resources[0];
+      }
+    } // si l'utilisateur a spécifié au moins une ressource dans le service, on surcharge les options du widget
+
+
+    var serviceOptions = this.options.reverseGeocodeOptions;
+
+    if (serviceOptions.filterOptions && Array.isArray(serviceOptions.filterOptions.type) && serviceOptions.filterOptions.type.length !== 0) {
+      this._currentGeocodingType = serviceOptions.filterOptions.type[0];
+    }
+  },
+
+  /**
+   * this method is called by this.initialize() and initialize geocoding delimitation
+   * ("Point", "Circle", "Extent")
+   *
+   * @private
+   */
+  _initGeocodingDelimitation: function _initGeocodingDelimitation() {
+    // Type de délimitation selectionné
+    this._currentGeocodingDelimitation = "Point"; // par defaut
+    // par defaut
+
+    var delimitations = this.options.delimitations;
+
+    if (!delimitations || delimitations.length === 0) {
+      this.options.delimitations = ["Point", "Circle", "Extent"];
+    } // options utilisateur
+
+
+    if (Array.isArray(delimitations) && delimitations.length) {
+      var d = delimitations[0].toLowerCase();
+
+      if (d === "point" || d === "circle" || d === "extent") {
+        this._currentGeocodingDelimitation = delimitations[0];
+      }
+    }
+  },
+  // ################################################################### //
+  // ######################## methods handle dom ####################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onAdd(map)
+   * and initialize the container HTMLElement
+   *
+   * @returns {DOMElement} DOM element
+   *
+   * @private
+   */
+  _initLayout: function _initLayout() {
+    // create main container
+    var container = this._createMainContainerElement(); // create show ReverseGeocoding element
+
+
+    var inputShow = this._showReverseGeocodingContainer = this._createShowReverseGeocodingElement();
+
+    container.appendChild(inputShow); // mode "collapsed"
+
+    if (!this.options.collapsed) {
+      inputShow.checked = true;
+    } // create ReverseGeocoding picto
+
+
+    var picto = this._createShowReverseGeocodingPictoElement();
+
+    container.appendChild(picto); // panel
+
+    var reverseGeocodingPanel = this._createReverseGeocodingPanelElement(); // header
+
+
+    var panelHeader = this._panelHeaderContainer = this._createReverseGeocodingPanelHeaderElement(); // return picto (hidden at start)
+
+
+    var returnPicto = this._returnPictoContainer = this._createReverseGeocodingPanelReturnPictoElement();
+
+    panelHeader.appendChild(returnPicto); // pane title
+
+    var panelTitle = this._panelTitleContainer = this._createReverseGeocodingPanelTitleElement();
+
+    panelHeader.appendChild(panelTitle); // close picto
+
+    var closeDiv = this._createReverseGeocodingPanelCloseElement();
+
+    panelHeader.appendChild(closeDiv);
+    reverseGeocodingPanel.appendChild(panelHeader); // form
+
+    var reverseGeocodingForm = this._formContainer = this._createReverseGeocodingPanelFormElement(); // choices element
+
+
+    reverseGeocodingForm.appendChild(this._createReverseGeocodingFormModeChoiceGeocodingTypeElement(this.options.resources));
+    reverseGeocodingForm.appendChild(this._createReverseGeocodingFormModeChoiceGeocodingDelimitationElement(this.options.delimitations)); // submit (bouton "Chercher")
+
+    var submit = this._createReverseGeocodingSubmitFormElement();
+
+    reverseGeocodingForm.appendChild(submit);
+    reverseGeocodingPanel.appendChild(reverseGeocodingForm); // waiting
+
+    var waiting = this._waitingContainer = this._createReverseGeocodingWaitingElement();
+
+    reverseGeocodingPanel.appendChild(waiting); // results (dans le panel)
+
+    var resultsPanel = this._resultsContainer = this._createReverseGeocodingResultsPanelElement();
+
+    var reverseGeocodingResultsList = this._resultsListContainer = this._createReverseGeocodingResultsListElement();
+
+    resultsPanel.appendChild(reverseGeocodingResultsList);
+    reverseGeocodingPanel.appendChild(resultsPanel);
+    container.appendChild(reverseGeocodingPanel);
+    logger.log(container);
+    return container;
+  },
+  // ################################################################### //
+  // ################### Map interactions management ################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onAdd,
+   * or by this.onShowReverseGeocodingClick,
+   * and calls method corresponding to current delimitation, if widget is not collapsed.
+   *
+   * @param {Object} map - control map.
+   * @private
+   */
+  _activateMapInteraction: function _activateMapInteraction(map) {
+    logger.info("_activateMapInteraction()"); // Creation de la couche vectorielle sur laquelle on va dessiner
+
+    if (this._inputFeaturesLayer === null) {
+      this._inputFeaturesLayer = new leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.FeatureGroup();
+      map.addLayer(this._inputFeaturesLayer);
+      var self = this;
+      /* evenement sur la carte lors d'une saisie,
+      on y ajoute le layer, et on y stocke les coordonnées */
+
+      map.on("draw:created", function (e) {
+        var layer = e.layer;
+        var type = e.layerType;
+        logger.trace("draw:created"); // TODO
+        // comment mettre en place un icone dynamiquement ?
+        // if (type === "marker") {}
+
+        self._setFeaturePosition(layer, type);
+
+        self._currentIdLayer = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.stamp(layer);
+
+        self._setFeatureLayer(layer);
+      });
+      /* evenements */
+
+      map.on("draw:drawstart", function () {
+        logger.trace("draw:drawstart");
+
+        self._removeFeatureLayer(self._lastIdLayer);
+
+        self._lastIdLayer = self._currentIdLayer;
+      });
+      /* evenements */
+
+      map.on("draw:drawstop", function () {
+        logger.trace("draw:drawstop");
+      });
+    } // Création de l'interaction de dessin, selon le type de délimitation sélectionné
+
+
+    var delimitation = this._currentGeocodingDelimitation.toLowerCase();
+
+    switch (delimitation) {
+      case "point":
+        this._activatePointInteraction(map);
+
+        break;
+
+      case "circle":
+        this._activateCircleInteraction(map);
+
+        break;
+
+      case "extent":
+        this._activateBoxInteraction(map);
+
+        break;
+
+      default:
+        break;
+    }
+  },
+
+  /**
+   * remove draw interaction from map (if exists)
+   *
+   * @param {Object} map - control map.
+   * @private
+   */
+  _removeMapInteraction: function _removeMapInteraction(map) {
+    if (!map) {
+      return;
+    }
+
+    if (this._inputFeaturesLayer !== null) {
+      map.off("draw:created");
+      map.off("draw:drawstart");
+      map.off("draw:drawstop");
+      map.removeLayer(this._inputFeaturesLayer);
+      this._inputFeaturesLayer = null;
+    }
+
+    this._lastIdLayer = this._currentIdLayer = 0; // FIXME delete this._currentFeature ?
+
+    if (this._currentFeature) {
+      this._currentFeature.disable();
+    }
+  },
+
+  /**
+   * TODO this method is called by this._activateMapInteraction,
+   * and creates map point drawing interaction.
+   *
+   * @param {Object} map - control map.
+   * @private
+   */
+  _activatePointInteraction: function _activatePointInteraction(map) {
+    logger.info("_activatePointInteraction()");
+
+    if (this._currentFeature) {
+      this._currentFeature.disable();
+    } // on modifie le tooltip du marker
+
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.drawLocal.draw.handlers.marker.tooltip.start = "click map to place search point"; // TODO styles des icones
+
+    var markerOptions = {
+      // icon : par defaut...
+      repeatMode: true
+    };
+    this._currentFeature = new leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Draw.Marker(map, markerOptions);
+
+    this._currentFeature.enable();
+  },
+
+  /**
+   * TODO this method is called by this._activateMapInteraction,
+   * and creates map circle drawing interaction.
+   *
+   * @param {Object} map - control map.
+   * @private
+   */
+  _activateCircleInteraction: function _activateCircleInteraction(map) {
+    logger.info("_activateCircleInteraction()");
+
+    if (this._currentFeature) {
+      this._currentFeature.disable();
+    }
+
+    var circleOptions = {
+      repeatMode: true
+    }; // TODO styles
+
+    this._currentFeature = new leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Draw.Circle(map, circleOptions);
+
+    this._currentFeature.enable();
+  },
+
+  /**
+   * TODO this method is called by this._activateMapInteraction,
+   * and creates map box drawing interaction.
+   *
+   * @param {Object} map - control map.
+   * @private
+   */
+  _activateBoxInteraction: function _activateBoxInteraction(map) {
+    logger.info("_activateBoxInteraction()");
+
+    if (this._currentFeature) {
+      this._currentFeature.disable();
+    }
+
+    var rectangleOptions = {
+      repeatMode: true
+    }; // TODO styles
+
+    this._currentFeature = new leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Draw.Rectangle(map, rectangleOptions);
+
+    this._currentFeature.enable();
+  },
+
+  /**
+   * set current position of feature
+   *
+   * @param {Object} layer - layer
+   * @param {String} type - type
+   *
+   * @private
+   */
+  _setFeaturePosition: function _setFeaturePosition(layer, type) {
+    // on transmet toujours des coordonnées au service en EPSG:4326
+    var oLatLng = null;
+
+    if (type === "marker") {
+      oLatLng = layer.getLatLng();
+      this._requestPosition = {
+        x: oLatLng.lat,
+        y: oLatLng.lng
+      };
+    } else if (type === "circle") {
+      oLatLng = layer.getLatLng();
+      this._requestPosition = {
+        x: oLatLng.lat,
+        y: oLatLng.lng
+      };
+      this._requestCircleFilter = {
+        x: oLatLng.lat,
+        y: oLatLng.lng,
+        radius: layer.getRadius()
+      };
+    } else if (type === "rectangle") {
+      oLatLng = layer.getBounds();
+      var center = {
+        lng: (oLatLng.getSouthWest().lng + oLatLng.getNorthEast().lng) / 2,
+        lat: (oLatLng.getSouthWest().lat + oLatLng.getNorthEast().lat) / 2
+      };
+      this._requestPosition = {
+        x: center.lat,
+        y: center.lng
+      };
+      this._requestBboxFilter = {
+        left: oLatLng.getSouthWest().lat,
+        right: oLatLng.getNorthEast().lat,
+        bottom: oLatLng.getSouthWest().lng,
+        top: oLatLng.getNorthEast().lng
+      };
+    } else {
+      logger.warn("type gemetric not defined !?");
+    }
+
+    logger.log(oLatLng);
+  },
+
+  /**
+   * set current layer of feature
+   *
+   * @param {Object} layer - layer
+   *
+   * @private
+   */
+  _setFeatureLayer: function _setFeatureLayer(layer) {
+    if (!this._inputFeaturesLayer) {
+      return;
+    }
+
+    this._inputFeaturesLayer.addLayer(layer);
+  },
+
+  /**
+   * remove layer feature from group
+   * @param {Integer} id - id
+   *
+   * @private
+   */
+  _removeFeatureLayer: function _removeFeatureLayer(id) {
+    if (!this._inputFeaturesLayer) {
+      return;
+    }
+
+    if (id === 0) {
+      return;
+    }
+
+    if (!id) {
+      this._inputFeaturesLayer.clearLayers();
+    } else {
+      this._inputFeaturesLayer.removeLayer(id);
+    }
+  },
+  // ################################################################### //
+  // ##################### Reverse Geocoding request ################### //
+  // ################################################################### //
+
+  /**
+   * this methode is called by this.onReverseGeocodingSubmit method,
+   * it generates and sends reverse geocode request, then displays results
+   * @param {Object} settings - settings
+   *
+   * @private
+   */
+  _reverseGeocodingRequest: function _reverseGeocodingRequest(settings) {
+    // retrait de l'interaction sur la map pendant l'attente (et l'affichage des résultats)
+    var map = this._map;
+
+    this._removeMapInteraction(map); // on construit les options pour la requête
+
+
+    var options = {}; // on surcharge avec les options utilisateur
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, this.options.reverseGeocodeOptions); // la recherche et les callbacks
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, settings); // options par defaut
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      apiKey: this.options.apiKey,
+      ssl: this.options.ssl,
+      srs: "EPSG:4326",
+      returnFreeForm: false,
+      // maximumResponses : 25, // on peut la surcharger !
+      timeOut: 30000,
+      protocol: "XHR"
+    }); // FIXME pourquoi je perds cette option ????
+
+    var _type = options.filterOptions.type; // on récupère d'éventuels filtres
+
+    if (this._currentGeocodingDelimitation.toLowerCase() === "circle" && this._requestCircleFilter) {
+      // FIXME : a confirmer !
+      if (this._requestCircleFilter.radius > 1000) {
+        logger.log("INFO : initial circle radius (" + this._requestCircleFilter.radius + ") limited to 1000m.");
+        this._requestCircleFilter.radius = 1000;
+      }
+
+      leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+        filterOptions: {
+          type: _type,
+          circle: this._requestCircleFilter
+        }
+      });
+    }
+
+    if (this._currentGeocodingDelimitation.toLowerCase() === "extent" && this._requestBboxFilter) {
+      leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+        filterOptions: {
+          type: _type,
+          bbox: this._requestBboxFilter
+        }
+      });
+    }
+
+    logger.log("reverseGeocode request options : ", options); // affichage d'une patience pendant l'attente
+
+    this._displayWaitingContainer(); // envoi de la requête
+
+
+    geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__["default"].Services.reverseGeocode(options);
+  },
+  // ################################################################### //
+  // ############################# results list ######################## //
+  // ################################################################### //
+
+  /**
+   * this method is called by this._reverseGeocodingRequest() (in case of reverse geocode success)
+   * and display results : in both container list and map
+   *
+   * @param {Array} locations - array of geocoded locations (reverse geocode results)
+   * @private
+   */
+  _displayGeocodedLocations: function _displayGeocodedLocations(locations) {
+    var map = this._map; // 1. on vide les résultats précédents
+
+    this._clearLocations();
+
+    this._clearLocationsFeature(map);
+
+    this._reverseGeocodingLocations = locations;
+
+    if (!locations || locations.length === 0) {
+      this._clearInputRequest(); // FIXME pas sûr que se soit le bon endroit...
+
+
+      return;
+    } // 2. cache de la patience et du formulaire
+
+
+    this._formContainer.className = "GPreverseGeocodingComponentHidden";
+
+    this._hideWaitingContainer(); // affichage de la div des résultats (et changement du titre)
+
+
+    this._panelTitleContainer.innerHTML = "Résultats de la recherche";
+    this._returnPictoContainer.className = "";
+    this._resultsContainer.className = "GPpanel"; // 3. ajout de la liste des résultats dans le container des resultats
+
+    this._fillGeocodedLocationListContainer(locations); // 4. affichage des résultats sur la carte (+ zoom ?)
+
+
+    this._displayGeocodedLocationsOnMap(locations); // on zoom sur l'emprise des markers
+
+
+    map.fitBounds(this._inputResultsLayer.getBounds());
+  },
+
+  /**
+   * this method is called by this._displayGeocodedLocations()
+   * and fills the container with results list
+   *
+   * @param {Array} locations - array of geocoded locations (reverse geocode results)
+   * @private
+   */
+  _fillGeocodedLocationListContainer: function _fillGeocodedLocationListContainer(locations) {
+    //  ajout de la liste des résultats dans le container des resultats
+    for (var i = 0; i < locations.length; i++) {
+      var location = locations[i];
+      logger.log(location); // on récupère la description à afficher dans la liste
+
+      var locationDescription = this._fillGeocodedLocationDescription(location); // on ajoute chaque résutat à la liste
+
+
+      if (locationDescription.length !== 0) {
+        this._createReverseGeocodingResultElement(locationDescription, i);
+      }
+    }
+  },
+
+  /**
+   * this method is called by this._fillGeocodedLocationListContainer()
+   * and fills location description (String), depending on matchType
+   *
+   * @param {Object} location - geocoded location (from reverse geocode results)
+   * @returns {String} locationDescription - geocoded location description to be displayed
+   * @private
+   */
+  _fillGeocodedLocationDescription: function _fillGeocodedLocationDescription(location) {
+    if (!location || !location.placeAttributes) {
+      return;
+    }
+
+    var attr = location.placeAttributes;
+    var locationDescription = ""; // on sélectionne les infos à afficher selon le type
+
+    switch (location.type) {
+      case "StreetAddress":
+        if (attr.street) {
+          locationDescription += attr.number ? attr.number + " " : "";
+          locationDescription += attr.street + ", ";
+        }
+
+        locationDescription += attr.postalCode + " " + attr.commune;
+        break;
+
+      case "PositionOfInterest":
+        if (location.matchType === "City" && attr.commune) {
+          locationDescription += attr.commune;
+          locationDescription += attr.postalCode ? ", " + attr.postalCode : "";
+        } else if (location.matchType === "Département" && attr.municipality) {
+          locationDescription += attr.municipality;
+          locationDescription += attr.postalCode ? ", " + attr.postalCode : "";
+        } else if (location.matchType === "Toponym" && attr.municipality) {
+          locationDescription += attr.municipality;
+          locationDescription += attr.postalCode ? ", " + attr.postalCode : "";
+          locationDescription += attr.commune ? " " + attr.commune : "";
+        } else {
+          locationDescription += attr.municipality ? attr.municipality : "";
+        }
+
+        locationDescription += attr.nature ? " (" + attr.nature + ") " : "";
+        break;
+
+      case "CadastralParcel":
+        locationDescription += attr.cadastralParcel ? attr.cadastralParcel : "";
+        locationDescription += attr.municipality ? " (" + attr.municipality + ")" : "";
+        break;
+
+      case "Administratif":
+        locationDescription += attr.municipality ? attr.municipality : "";
+
+        if (attr.inseeDepartment) {
+          locationDescription += "(Département)";
+        } else if (attr.inseeRegion) {
+          locationDescription += "(Région)";
+        }
+
+        break;
+
+      default:
+        locationDescription += attr.municipality ? attr.municipality : "";
+        break;
+    }
+
+    ;
+    return locationDescription;
+  },
+  // ################################################################### //
+  // ######################## map results (markers) #################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by this._displayGeocodedLocations()
+   * and display locations in map (markers)
+   *
+   * @param {Object} locations - geocoded locations (reverse geocode result)
+   * @private
+   */
+  _displayGeocodedLocationsOnMap: function _displayGeocodedLocationsOnMap(locations) {
+    var map = this._map;
+    var self = this; // function set style Highlight for results
+
+    function _setHighLight(e) {
+      var layer = e.target;
+      layer.setIcon(new _Utils_IconDefault__WEBPACK_IMPORTED_MODULE_6__["default"]("red"));
+      var div = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("ReverseGeocodedLocation_" + layer.options.id + "-" + self._uid);
+      leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.addClass(div, "GPreverseGeocodedLocationHighlight");
+      div.scrollIntoView(false);
+    } // function reset style Highlight for results
+
+
+    function _resetHighLight(e) {
+      var layer = e.target;
+      layer.setIcon(new _Utils_IconDefault__WEBPACK_IMPORTED_MODULE_6__["default"]("green"));
+      var div = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("ReverseGeocodedLocation_" + layer.options.id + "-" + self._uid);
+      leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.removeClass(div, "GPreverseGeocodedLocationHighlight");
+    } // création de la couche où seront ajoutés les résultats
+
+
+    this._inputResultsLayer = new leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.FeatureGroup();
+    map.addLayer(this._inputResultsLayer); // ajout de chaque résultat à la couche (marker)
+
+    for (var i = 0; i < locations.length; i++) {
+      var location = locations[i];
+
+      if (!location) {
+        continue;
+      }
+
+      var options = {
+        id: i,
+        icon: new _Utils_IconDefault__WEBPACK_IMPORTED_MODULE_6__["default"]("green"),
+        riseOnHover: true,
+        draggable: false,
+        clickable: true,
+        zIndexOffset: 1000
+      };
+
+      var _marker = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.marker(leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.latLng(location.position.x, location.position.y), options); // creation du contenu de la popup
+
+
+      var popupContent = "<ul>";
+      var attributes = location.placeAttributes;
+
+      for (var attr in attributes) {
+        if (attributes.hasOwnProperty(attr)) {
+          if (attr !== "bbox") {
+            popupContent += "<li>";
+            popupContent += "<span class=\"gp-attname-others-span\">" + attr.toUpperCase() + " : </span>";
+            popupContent += attributes[attr];
+            popupContent += " </li>";
+          }
+        }
+      }
+
+      popupContent += " </ul>";
+
+      _marker.bindPopup(popupContent);
+      /** evenement mouseover sur le marker */
+
+
+      _marker.on("mouseover", _setHighLight);
+      /** evenement mouseout sur le marker */
+
+
+      _marker.on("mouseout", _resetHighLight);
+
+      this._inputResultsLayer.addLayer(_marker);
+    }
+  },
+  // ################################################################### //
+  // ####################### handlers events to dom #################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by event 'click' on 'GPshowReverseGeocodingPicto' tag label
+   * (cf. ReverseGeocodingDOM._createShowReverseGeocodingPictoElement), and it cleans the component
+   * when it's closed.
+   *
+   * @private
+   */
+  onShowReverseGeocodingClick: function onShowReverseGeocodingClick() {
+    var map = this._map; // interactions declenchées à l'ouverture/fermeture du panneau
+
+    if (this._showReverseGeocodingContainer.checked) {
+      this._removeMapInteraction(map);
+    } else {
+      if (!this._waiting && !this._reverseGeocodingLocations.length) {
+        this._activateMapInteraction(map);
+      }
+    }
+  },
+
+  /**
+   * this method is called by event 'change' on 'GPreverseGeocodingCode' tag select
+   * (cf. ReverseGeocodingDOM._createReverseGeocodingFormModeChoiceGeocodingTypeElement).
+   * this value is saved as a parameter for reverseGeocode service.
+   *
+   * @param {Object} e - HTMLElement
+   * @private
+   */
+  onReverseGeocodingTypeChange: function onReverseGeocodingTypeChange(e) {
+    var idx = e.target.selectedIndex;
+    var value = e.target.options[idx].value;
+
+    if (!value) {
+      return;
+    }
+
+    logger.log(value);
+    this._currentGeocodingType = value;
+  },
+
+  /**
+   * this method is called by event 'change' on 'GPreverseGeocodingCode' tag select
+   * (cf. ReverseGeocodingDOM._createReverseGeocodingFormModeChoiceGeocodingDelimitationElement).
+   * this value is saved as a parameter for reverseGeocode service.
+   *
+   * @param {Object} e - HTMLElement
+   * @private
+   */
+  onReverseGeocodingDelimitationChange: function onReverseGeocodingDelimitationChange(e) {
+    var idx = e.target.selectedIndex;
+    var value = e.target.options[idx].value;
+
+    if (!value) {
+      return;
+    }
+
+    logger.log(value);
+    this._currentGeocodingDelimitation = value; // on supprime l'interaction précédente,
+    // ainsi que les géométries et valeurs stockées (filtres, position)
+
+    this._clearInputRequest(); // on met à jour l'interaction de la map en fonction de la nouvelle délimitation
+
+
+    var map = this._map; // on supprime l'éventuelle précédente interaction
+
+    this._removeMapInteraction(map); // on crée une nouvelle interaction
+
+
+    this._activateMapInteraction(map);
+  },
+
+  /**
+   * TODO this method is called by event 'click' on 'GPreverseGeocodingReturnPicto' div
+   * (cf. ReverseGeocodingDOM._createReverseGeocodingPanelReturnPictoElement),
+   * and clear geocoded location (from both list container and map)
+   *
+   * @private
+   */
+  onGPreverseGeocodingReturnPictoClick: function onGPreverseGeocodingReturnPictoClick() {
+    var map = this._map; // suppression des résultats précédents
+
+    this._clearLocations();
+
+    this._clearLocationsFeature(map); // on efface les points qui ont pu être saisis précédemment
+
+
+    this._clearInputRequest(); // et on réactive l'interaction sur la map
+
+
+    this._activateMapInteraction(map);
+  },
+
+  /**
+   * TODO this methode is called by event 'submit' on reverseGeocoding form ('GPreverseGeocodingForm')
+   * (cf. ReverseGeocodingDOM._createReverseGeocodingPanelFormElement),
+   * it checks reverse geocode mandatory parameters,
+   * then call this._reverseGeocodingRequest() to generate and send request
+   *
+   * @private
+   */
+  onReverseGeocodingSubmit: function onReverseGeocodingSubmit() {
+    // le paramètre position est obligatoire
+    if (!this._requestPosition) {
+      logger.log("missing position");
+      return;
+    } // si on n'a trouvé aucun droit, on evite une requête inutile ...
+
+
+    if (this._noRightManagement) {
+      return;
+    }
+
+    var map = this._map;
+    var self = this;
+
+    this._reverseGeocodingRequest({
+      position: self._requestPosition,
+      filterOptions: {
+        type: [self._currentGeocodingType]
+      },
+      // callback onSuccess
+      onSuccess: function onSuccess(results) {
+        logger.log(results);
+
+        if (results) {
+          var locations = results.locations;
+
+          self._displayGeocodedLocations(locations);
+
+          self._hideWaitingContainer();
+        }
+      },
+      // callback onFailure
+      onFailure: function onFailure(error) {
+        self._hideWaitingContainer(); // suppression d'éventuels résultats précédents
+
+
+        self._clearLocations();
+
+        self._clearLocationsFeature(map); // on efface les points qui ont été saisis précédemment
+
+
+        self._clearInputRequest();
+
+        logger.log(error.message);
+      }
+    });
+  },
+
+  /**
+   * TODO this method is called by event 'click' on 'ReverseGeocodedLocation_' div
+   * (cf. ReverseGeocodingDOM._createReverseGeocodingResultElement),
+   * and zoom to location ?
+   * TODO
+   *
+   * @param {Object} e - HTMLElement
+   * @private
+   */
+  onReverseGeocodingResultClick: function onReverseGeocodingResultClick(e) {
+    logger.log("onReverseGeocodingResultClick", e);
+  },
+
+  /**
+   * TODO this method is called by event 'mouseover' on 'ReverseGeocodedLocation_' div
+   * (cf. ReverseGeocodingDOM._createReverseGeocodingResultElement),
+   * and changes style of matching marker on map (selected)
+   *
+   * @param {Object} e - HTMLElement
+   * @private
+   */
+  onReverseGeocodingResultMouseOver: function onReverseGeocodingResultMouseOver(e) {
+    // récupération de l'id du résultat survolé
+    var idx = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_5__["default"].index(e.target.id); // on passe le texte en gras
+
+    if (e.target.classList) {
+      e.target.classList.add("GPreverseGeocodedLocationHighlight");
+    }
+
+    if (!this._inputResultsLayer) {
+      return;
+    }
+
+    this._inputResultsLayer.eachLayer(function (layer) {
+      if (layer.options.id === parseInt(idx, 10)) {
+        layer.fire("mouseover");
+      }
+    });
+  },
+
+  /**
+   * TODO this method is called by event 'mouseout' on 'ReverseGeocodedLocation_' div
+   * (cf. ReverseGeocodingDOM._createReverseGeocodingResultElement),
+   * and changes style of matching marker on map (default)
+   *
+   * @param {Object} e - HTMLElement
+   * @private
+   */
+  onReverseGeocodingResultMouseOut: function onReverseGeocodingResultMouseOut(e) {
+    // récupération de l'id du résultat survolé
+    var idx = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_5__["default"].index(e.target.id); // on repasse le texte en style normal
+
+    if (e.target.classList) {
+      e.target.classList.remove("GPreverseGeocodedLocationHighlight");
+    }
+
+    if (!this._inputResultsLayer) {
+      return;
+    }
+
+    this._inputResultsLayer.eachLayer(function (layer) {
+      if (layer.options.id === parseInt(idx, 10)) {
+        layer.fire("mouseout");
+      }
+    });
+  },
+  // ################################################################### //
+  // ################################ clean ############################ //
+  // ################################################################### //
+
+  /**
+   * TODO this method clears previous location results
+   *
+   * @private
+   */
+  _clearLocations: function _clearLocations() {
+    this._reverseGeocodingLocations = []; // on vide le container avec la liste des résultats
+
+    if (this._resultsListContainer) {
+      while (this._resultsListContainer.firstChild) {
+        this._resultsListContainer.removeChild(this._resultsListContainer.firstChild);
+      }
+    }
+  },
+
+  /**
+   * TODO this method clears previous location results marker
+   * @param {Object} map - the map
+   *
+   * @private
+   */
+  _clearLocationsFeature: function _clearLocationsFeature(map) {
+    // suppression des anciens resultats
+    if (this._inputResultsLayer !== null) {
+      map.removeLayer(this._inputResultsLayer);
+      this._inputResultsLayer = null;
+    }
+  },
+
+  /**
+   * TODO this method clears previous input features (features, position and filters)
+   *
+   * @private
+   */
+  _clearInputRequest: function _clearInputRequest() {
+    // on supprime les valeurs stockées (filtres, position)
+    this._requestPosition = null;
+    this._requestCircleFilter = null;
+    this._requestBboxFilter = null;
+  },
+  // ################################################################### //
+  // ############################ Patience ############################# //
+  // ################################################################### //
+
+  /**
+   * this method displays waiting container and sets a timeout
+   *
+   * @private
+   */
+  _displayWaitingContainer: function _displayWaitingContainer() {
+    this._waitingContainer.className = "GPreverseGeocodingCalcWaitingContainerVisible";
+    this._waiting = true; // mise en place d'un timeout pour réinitialiser le panel (cacher la patience)
+    // si on est toujours en attente (si la requête est bloquée par exemple)
+
+    if (this._timer) {
+      clearTimeout(this._timer);
+      this._timer = null;
+    }
+
+    var context = this;
+    this._timer = setTimeout(function () {
+      if (context._waiting === true) {
+        context._hideWaitingContainer();
+      } else {
+        if (context._timer) {
+          clearTimeout(context._timer);
+        }
+      }
+    }, 16000);
+  },
+
+  /**
+   * this method hides waiting container and clears timeout
+   *
+   * @private
+   */
+  _hideWaitingContainer: function _hideWaitingContainer() {
+    if (this._waiting) {
+      this._waitingContainer.className = "GPreverseGeocodingCalcWaitingContainerHidden";
+      this._waiting = false;
+      clearTimeout(this._timer);
+      this._timer = null;
+    }
+  }
+});
+/* harmony default export */ __webpack_exports__["default"] = (ReverseGeocoding);
+
+/***/ }),
+/* 159 */
+/***/ (function(module, exports) {
+
+/*
+ Leaflet.draw 1.0.4, a plugin that adds drawing and editing tools to Leaflet powered maps.
+ (c) 2012-2017, Jacob Toye, Jon West, Smartrak, Leaflet
+
+ https://github.com/Leaflet/Leaflet.draw
+ http://leafletjs.com
+ */
+(function (window, document, undefined) {/**
+ * Leaflet.draw assumes that you have already included the Leaflet library.
+ */
+L.drawVersion = "1.0.4";
+/**
+ * @class L.Draw
+ * @aka Draw
+ *
+ *
+ * To add the draw toolbar set the option drawControl: true in the map options.
+ *
+ * @example
+ * ```js
+ *      var map = L.map('map', {drawControl: true}).setView([51.505, -0.09], 13);
+ *
+ *      L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
+ *          attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
+ *      }).addTo(map);
+ * ```
+ *
+ * ### Adding the edit toolbar
+ * To use the edit toolbar you must initialise the Leaflet.draw control and manually add it to the map.
+ *
+ * ```js
+ *      var map = L.map('map').setView([51.505, -0.09], 13);
+ *
+ *      L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
+ *          attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
+ *      }).addTo(map);
+ *
+ *      // FeatureGroup is to store editable layers
+ *      var drawnItems = new L.FeatureGroup();
+ *      map.addLayer(drawnItems);
+ *
+ *      var drawControl = new L.Control.Draw({
+ *          edit: {
+ *              featureGroup: drawnItems
+ *          }
+ *      });
+ *      map.addControl(drawControl);
+ * ```
+ *
+ * The key here is the featureGroup option. This tells the plugin which FeatureGroup contains the layers that
+ * should be editable. The featureGroup can contain 0 or more features with geometry types Point, LineString, and Polygon.
+ * Leaflet.draw does not work with multigeometry features such as MultiPoint, MultiLineString, MultiPolygon,
+ * or GeometryCollection. If you need to add multigeometry features to the draw plugin, convert them to a
+ * FeatureCollection of non-multigeometries (Points, LineStrings, or Polygons).
+ */
+L.Draw = {};
+
+/**
+ * @class L.drawLocal
+ * @aka L.drawLocal
+ *
+ * The core toolbar class of the API — it is used to create the toolbar ui
+ *
+ * @example
+ * ```js
+ *      var modifiedDraw = L.drawLocal.extend({
+ *          draw: {
+ *              toolbar: {
+ *                  buttons: {
+ *                      polygon: 'Draw an awesome polygon'
+ *                  }
+ *              }
+ *          }
+ *      });
+ * ```
+ *
+ * The default state for the control is the draw toolbar just below the zoom control.
+ *  This will allow map users to draw vectors and markers.
+ *  **Please note the edit toolbar is not enabled by default.**
+ */
+L.drawLocal = {
+	// format: {
+	// 	numeric: {
+	// 		delimiters: {
+	// 			thousands: ',',
+	// 			decimal: '.'
+	// 		}
+	// 	}
+	// },
+	draw: {
+		toolbar: {
+			// #TODO: this should be reorganized where actions are nested in actions
+			// ex: actions.undo  or actions.cancel
+			actions: {
+				title: 'Cancel drawing',
+				text: 'Cancel'
+			},
+			finish: {
+				title: 'Finish drawing',
+				text: 'Finish'
+			},
+			undo: {
+				title: 'Delete last point drawn',
+				text: 'Delete last point'
+			},
+			buttons: {
+				polyline: 'Draw a polyline',
+				polygon: 'Draw a polygon',
+				rectangle: 'Draw a rectangle',
+				circle: 'Draw a circle',
+				marker: 'Draw a marker',
+				circlemarker: 'Draw a circlemarker'
+			}
+		},
+		handlers: {
+			circle: {
+				tooltip: {
+					start: 'Click and drag to draw circle.'
+				},
+				radius: 'Radius'
+			},
+			circlemarker: {
+				tooltip: {
+					start: 'Click map to place circle marker.'
+				}
+			},
+			marker: {
+				tooltip: {
+					start: 'Click map to place marker.'
+				}
+			},
+			polygon: {
+				tooltip: {
+					start: 'Click to start drawing shape.',
+					cont: 'Click to continue drawing shape.',
+					end: 'Click first point to close this shape.'
+				}
+			},
+			polyline: {
+				error: '<strong>Error:</strong> shape edges cannot cross!',
+				tooltip: {
+					start: 'Click to start drawing line.',
+					cont: 'Click to continue drawing line.',
+					end: 'Click last point to finish line.'
+				}
+			},
+			rectangle: {
+				tooltip: {
+					start: 'Click and drag to draw rectangle.'
+				}
+			},
+			simpleshape: {
+				tooltip: {
+					end: 'Release mouse to finish drawing.'
+				}
+			}
+		}
+	},
+	edit: {
+		toolbar: {
+			actions: {
+				save: {
+					title: 'Save changes',
+					text: 'Save'
+				},
+				cancel: {
+					title: 'Cancel editing, discards all changes',
+					text: 'Cancel'
+				},
+				clearAll: {
+					title: 'Clear all layers',
+					text: 'Clear All'
+				}
+			},
+			buttons: {
+				edit: 'Edit layers',
+				editDisabled: 'No layers to edit',
+				remove: 'Delete layers',
+				removeDisabled: 'No layers to delete'
+			}
+		},
+		handlers: {
+			edit: {
+				tooltip: {
+					text: 'Drag handles or markers to edit features.',
+					subtext: 'Click cancel to undo changes.'
+				}
+			},
+			remove: {
+				tooltip: {
+					text: 'Click on a feature to remove.'
+				}
+			}
+		}
+	}
+};
+
+
+
+/**
+ * ### Events
+ * Once you have successfully added the Leaflet.draw plugin to your map you will want to respond to the different
+ * actions users can initiate. The following events will be triggered on the map:
+ *
+ * @class L.Draw.Event
+ * @aka Draw.Event
+ *
+ * Use `L.Draw.Event.EVENTNAME` constants to ensure events are correct.
+ *
+ * @example
+ * ```js
+ * map.on(L.Draw.Event.CREATED; function (e) {
+ *    var type = e.layerType,
+ *        layer = e.layer;
+ *
+ *    if (type === 'marker') {
+ *        // Do marker specific actions
+ *    }
+ *
+ *    // Do whatever else you need to. (save to db; add to map etc)
+ *    map.addLayer(layer);
+ *});
+ * ```
+ */
+L.Draw.Event = {};
+/**
+ * @event draw:created: PolyLine; Polygon; Rectangle; Circle; Marker | String
+ *
+ * Layer that was just created.
+ * The type of layer this is. One of: `polyline`; `polygon`; `rectangle`; `circle`; `marker`
+ * Triggered when a new vector or marker has been created.
+ *
+ */
+L.Draw.Event.CREATED = 'draw:created';
+
+/**
+ * @event draw:edited: LayerGroup
+ *
+ * List of all layers just edited on the map.
+ *
+ *
+ * Triggered when layers in the FeatureGroup; initialised with the plugin; have been edited and saved.
+ *
+ * @example
+ * ```js
+ *      map.on('draw:edited', function (e) {
+     *          var layers = e.layers;
+     *          layers.eachLayer(function (layer) {
+     *              //do whatever you want; most likely save back to db
+     *          });
+     *      });
+ * ```
+ */
+L.Draw.Event.EDITED = 'draw:edited';
+
+/**
+ * @event draw:deleted: LayerGroup
+ *
+ * List of all layers just removed from the map.
+ *
+ * Triggered when layers have been removed (and saved) from the FeatureGroup.
+ */
+L.Draw.Event.DELETED = 'draw:deleted';
+
+/**
+ * @event draw:drawstart: String
+ *
+ * The type of layer this is. One of:`polyline`; `polygon`; `rectangle`; `circle`; `marker`
+ *
+ * Triggered when the user has chosen to draw a particular vector or marker.
+ */
+L.Draw.Event.DRAWSTART = 'draw:drawstart';
+
+/**
+ * @event draw:drawstop: String
+ *
+ * The type of layer this is. One of: `polyline`; `polygon`; `rectangle`; `circle`; `marker`
+ *
+ * Triggered when the user has finished a particular vector or marker.
+ */
+
+L.Draw.Event.DRAWSTOP = 'draw:drawstop';
+
+/**
+ * @event draw:drawvertex: LayerGroup
+ *
+ * List of all layers just being added from the map.
+ *
+ * Triggered when a vertex is created on a polyline or polygon.
+ */
+L.Draw.Event.DRAWVERTEX = 'draw:drawvertex';
+
+/**
+ * @event draw:editstart: String
+ *
+ * The type of edit this is. One of: `edit`
+ *
+ * Triggered when the user starts edit mode by clicking the edit tool button.
+ */
+
+L.Draw.Event.EDITSTART = 'draw:editstart';
+
+/**
+ * @event draw:editmove: ILayer
+ *
+ *  Layer that was just moved.
+ *
+ * Triggered as the user moves a rectangle; circle or marker.
+ */
+L.Draw.Event.EDITMOVE = 'draw:editmove';
+
+/**
+ * @event draw:editresize: ILayer
+ *
+ * Layer that was just moved.
+ *
+ * Triggered as the user resizes a rectangle or circle.
+ */
+L.Draw.Event.EDITRESIZE = 'draw:editresize';
+
+/**
+ * @event draw:editvertex: LayerGroup
+ *
+ * List of all layers just being edited from the map.
+ *
+ * Triggered when a vertex is edited on a polyline or polygon.
+ */
+L.Draw.Event.EDITVERTEX = 'draw:editvertex';
+
+/**
+ * @event draw:editstop: String
+ *
+ * The type of edit this is. One of: `edit`
+ *
+ * Triggered when the user has finshed editing (edit mode) and saves edits.
+ */
+L.Draw.Event.EDITSTOP = 'draw:editstop';
+
+/**
+ * @event draw:deletestart: String
+ *
+ * The type of edit this is. One of: `remove`
+ *
+ * Triggered when the user starts remove mode by clicking the remove tool button.
+ */
+L.Draw.Event.DELETESTART = 'draw:deletestart';
+
+/**
+ * @event draw:deletestop: String
+ *
+ * The type of edit this is. One of: `remove`
+ *
+ * Triggered when the user has finished removing shapes (remove mode) and saves.
+ */
+L.Draw.Event.DELETESTOP = 'draw:deletestop';
+
+/**
+ * @event draw:toolbaropened: String
+ *
+ * Triggered when a toolbar is opened.
+ */
+L.Draw.Event.TOOLBAROPENED = 'draw:toolbaropened';
+
+/**
+ * @event draw:toolbarclosed: String
+ *
+ * Triggered when a toolbar is closed.
+ */
+L.Draw.Event.TOOLBARCLOSED = 'draw:toolbarclosed';
+
+/**
+ * @event draw:markercontext: String
+ *
+ * Triggered when a marker is right clicked.
+ */
+L.Draw.Event.MARKERCONTEXT = 'draw:markercontext';
+
+
+L.Draw = L.Draw || {};
+
+/**
+ * @class L.Draw.Feature
+ * @aka Draw.Feature
+ */
+L.Draw.Feature = L.Handler.extend({
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		this._map = map;
+		this._container = map._container;
+		this._overlayPane = map._panes.overlayPane;
+		this._popupPane = map._panes.popupPane;
+
+		// Merge default shapeOptions options with custom shapeOptions
+		if (options && options.shapeOptions) {
+			options.shapeOptions = L.Util.extend({}, this.options.shapeOptions, options.shapeOptions);
+		}
+		L.setOptions(this, options);
+
+		var version = L.version.split('.');
+		//If Version is >= 1.2.0
+		if (parseInt(version[0], 10) === 1 && parseInt(version[1], 10) >= 2) {
+			L.Draw.Feature.include(L.Evented.prototype);
+		} else {
+			L.Draw.Feature.include(L.Mixin.Events);
+		}
+	},
+
+	// @method enable(): void
+	// Enables this handler
+	enable: function () {
+		if (this._enabled) {
+			return;
+		}
+
+		L.Handler.prototype.enable.call(this);
+
+		this.fire('enabled', {handler: this.type});
+
+		this._map.fire(L.Draw.Event.DRAWSTART, {layerType: this.type});
+	},
+
+	// @method disable(): void
+	disable: function () {
+		if (!this._enabled) {
+			return;
+		}
+
+		L.Handler.prototype.disable.call(this);
+
+		this._map.fire(L.Draw.Event.DRAWSTOP, {layerType: this.type});
+
+		this.fire('disabled', {handler: this.type});
+	},
+
+	// @method addHooks(): void
+	// Add's event listeners to this handler
+	addHooks: function () {
+		var map = this._map;
+
+		if (map) {
+			L.DomUtil.disableTextSelection();
+
+			map.getContainer().focus();
+
+			this._tooltip = new L.Draw.Tooltip(this._map);
+
+			L.DomEvent.on(this._container, 'keyup', this._cancelDrawing, this);
+		}
+	},
+
+	// @method removeHooks(): void
+	// Removes event listeners from this handler
+	removeHooks: function () {
+		if (this._map) {
+			L.DomUtil.enableTextSelection();
+
+			this._tooltip.dispose();
+			this._tooltip = null;
+
+			L.DomEvent.off(this._container, 'keyup', this._cancelDrawing, this);
+		}
+	},
+
+	// @method setOptions(object): void
+	// Sets new options to this handler
+	setOptions: function (options) {
+		L.setOptions(this, options);
+	},
+
+	_fireCreatedEvent: function (layer) {
+		this._map.fire(L.Draw.Event.CREATED, {layer: layer, layerType: this.type});
+	},
+
+	// Cancel drawing when the escape key is pressed
+	_cancelDrawing: function (e) {
+		if (e.keyCode === 27) {
+			this._map.fire('draw:canceled', {layerType: this.type});
+			this.disable();
+		}
+	}
+});
+
+
+
+/**
+ * @class L.Draw.Polyline
+ * @aka Draw.Polyline
+ * @inherits L.Draw.Feature
+ */
+L.Draw.Polyline = L.Draw.Feature.extend({
+	statics: {
+		TYPE: 'polyline'
+	},
+
+	Poly: L.Polyline,
+
+	options: {
+		allowIntersection: true,
+		repeatMode: false,
+		drawError: {
+			color: '#b00b00',
+			timeout: 2500
+		},
+		icon: new L.DivIcon({
+			iconSize: new L.Point(8, 8),
+			className: 'leaflet-div-icon leaflet-editing-icon'
+		}),
+		touchIcon: new L.DivIcon({
+			iconSize: new L.Point(20, 20),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
+		}),
+		guidelineDistance: 20,
+		maxGuideLineLength: 4000,
+		shapeOptions: {
+			stroke: true,
+			color: '#3388ff',
+			weight: 4,
+			opacity: 0.5,
+			fill: false,
+			clickable: true
+		},
+		metric: true, // Whether to use the metric measurement system or imperial
+		feet: true, // When not metric, to use feet instead of yards for display.
+		nautic: false, // When not metric, not feet use nautic mile for display
+		showLength: true, // Whether to display distance in the tooltip
+		zIndexOffset: 2000, // This should be > than the highest z-index any map layers
+		factor: 1, // To change distance calculation
+		maxPoints: 0 // Once this number of points are placed, finish shape
+	},
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		// if touch, switch to touch icon
+		if (L.Browser.touch) {
+			this.options.icon = this.options.touchIcon;
+		}
+
+		// Need to set this here to ensure the correct message is used.
+		this.options.drawError.message = L.drawLocal.draw.handlers.polyline.error;
+
+		// Merge default drawError options with custom options
+		if (options && options.drawError) {
+			options.drawError = L.Util.extend({}, this.options.drawError, options.drawError);
+		}
+
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.Draw.Polyline.TYPE;
+
+		L.Draw.Feature.prototype.initialize.call(this, map, options);
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler
+	addHooks: function () {
+		L.Draw.Feature.prototype.addHooks.call(this);
+		if (this._map) {
+			this._markers = [];
+
+			this._markerGroup = new L.LayerGroup();
+			this._map.addLayer(this._markerGroup);
+
+			this._poly = new L.Polyline([], this.options.shapeOptions);
+
+			this._tooltip.updateContent(this._getTooltipText());
+
+			// Make a transparent marker that will used to catch click events. These click
+			// events will create the vertices. We need to do this so we can ensure that
+			// we can create vertices over other map layers (markers, vector layers). We
+			// also do not want to trigger any click handlers of objects we are clicking on
+			// while drawing.
+			if (!this._mouseMarker) {
+				this._mouseMarker = L.marker(this._map.getCenter(), {
+					icon: L.divIcon({
+						className: 'leaflet-mouse-marker',
+						iconAnchor: [20, 20],
+						iconSize: [40, 40]
+					}),
+					opacity: 0,
+					zIndexOffset: this.options.zIndexOffset
+				});
+			}
+
+			this._mouseMarker
+				.on('mouseout', this._onMouseOut, this)
+				.on('mousemove', this._onMouseMove, this) // Necessary to prevent 0.8 stutter
+				.on('mousedown', this._onMouseDown, this)
+				.on('mouseup', this._onMouseUp, this) // Necessary for 0.8 compatibility
+				.addTo(this._map);
+
+			this._map
+				.on('mouseup', this._onMouseUp, this) // Necessary for 0.7 compatibility
+				.on('mousemove', this._onMouseMove, this)
+				.on('zoomlevelschange', this._onZoomEnd, this)
+				.on('touchstart', this._onTouch, this)
+				.on('zoomend', this._onZoomEnd, this);
+
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler.
+	removeHooks: function () {
+		L.Draw.Feature.prototype.removeHooks.call(this);
+
+		this._clearHideErrorTimeout();
+
+		this._cleanUpShape();
+
+		// remove markers from map
+		this._map.removeLayer(this._markerGroup);
+		delete this._markerGroup;
+		delete this._markers;
+
+		this._map.removeLayer(this._poly);
+		delete this._poly;
+
+		this._mouseMarker
+			.off('mousedown', this._onMouseDown, this)
+			.off('mouseout', this._onMouseOut, this)
+			.off('mouseup', this._onMouseUp, this)
+			.off('mousemove', this._onMouseMove, this);
+		this._map.removeLayer(this._mouseMarker);
+		delete this._mouseMarker;
+
+		// clean up DOM
+		this._clearGuides();
+
+		this._map
+			.off('mouseup', this._onMouseUp, this)
+			.off('mousemove', this._onMouseMove, this)
+			.off('zoomlevelschange', this._onZoomEnd, this)
+			.off('zoomend', this._onZoomEnd, this)
+			.off('touchstart', this._onTouch, this)
+			.off('click', this._onTouch, this);
+	},
+
+	// @method deleteLastVertex(): void
+	// Remove the last vertex from the polyline, removes polyline from map if only one point exists.
+	deleteLastVertex: function () {
+		if (this._markers.length <= 1) {
+			return;
+		}
+
+		var lastMarker = this._markers.pop(),
+			poly = this._poly,
+			// Replaces .spliceLatLngs()
+			latlngs = poly.getLatLngs(),
+			latlng = latlngs.splice(-1, 1)[0];
+		this._poly.setLatLngs(latlngs);
+
+		this._markerGroup.removeLayer(lastMarker);
+
+		if (poly.getLatLngs().length < 2) {
+			this._map.removeLayer(poly);
+		}
+
+		this._vertexChanged(latlng, false);
+	},
+
+	// @method addVertex(): void
+	// Add a vertex to the end of the polyline
+	addVertex: function (latlng) {
+		var markersLength = this._markers.length;
+		// markersLength must be greater than or equal to 2 before intersections can occur
+		if (markersLength >= 2 && !this.options.allowIntersection && this._poly.newLatLngIntersects(latlng)) {
+			this._showErrorTooltip();
+			return;
+		}
+		else if (this._errorShown) {
+			this._hideErrorTooltip();
+		}
+
+		this._markers.push(this._createMarker(latlng));
+
+		this._poly.addLatLng(latlng);
+
+		if (this._poly.getLatLngs().length === 2) {
+			this._map.addLayer(this._poly);
+		}
+
+		this._vertexChanged(latlng, true);
+	},
+
+	// @method completeShape(): void
+	// Closes the polyline between the first and last points
+	completeShape: function () {
+		if (this._markers.length <= 1 || !this._shapeIsValid()) {
+			return;
+		}
+
+		this._fireCreatedEvent();
+		this.disable();
+
+		if (this.options.repeatMode) {
+			this.enable();
+		}
+	},
+
+	_finishShape: function () {
+		var latlngs = this._poly._defaultShape ? this._poly._defaultShape() : this._poly.getLatLngs();
+		var intersects = this._poly.newLatLngIntersects(latlngs[latlngs.length - 1]);
+
+		if ((!this.options.allowIntersection && intersects) || !this._shapeIsValid()) {
+			this._showErrorTooltip();
+			return;
+		}
+
+		this._fireCreatedEvent();
+		this.disable();
+		if (this.options.repeatMode) {
+			this.enable();
+		}
+	},
+
+	// Called to verify the shape is valid when the user tries to finish it
+	// Return false if the shape is not valid
+	_shapeIsValid: function () {
+		return true;
+	},
+
+	_onZoomEnd: function () {
+		if (this._markers !== null) {
+			this._updateGuide();
+		}
+	},
+
+	_onMouseMove: function (e) {
+		var newPos = this._map.mouseEventToLayerPoint(e.originalEvent);
+		var latlng = this._map.layerPointToLatLng(newPos);
+
+		// Save latlng
+		// should this be moved to _updateGuide() ?
+		this._currentLatLng = latlng;
+
+		this._updateTooltip(latlng);
+
+		// Update the guide line
+		this._updateGuide(newPos);
+
+		// Update the mouse marker position
+		this._mouseMarker.setLatLng(latlng);
+
+		L.DomEvent.preventDefault(e.originalEvent);
+	},
+
+	_vertexChanged: function (latlng, added) {
+		this._map.fire(L.Draw.Event.DRAWVERTEX, {layers: this._markerGroup});
+		this._updateFinishHandler();
+
+		this._updateRunningMeasure(latlng, added);
+
+		this._clearGuides();
+
+		this._updateTooltip();
+	},
+
+	_onMouseDown: function (e) {
+		if (!this._clickHandled && !this._touchHandled && !this._disableMarkers) {
+			this._onMouseMove(e);
+			this._clickHandled = true;
+			this._disableNewMarkers();
+			var originalEvent = e.originalEvent;
+			var clientX = originalEvent.clientX;
+			var clientY = originalEvent.clientY;
+			this._startPoint.call(this, clientX, clientY);
+		}
+	},
+
+	_startPoint: function (clientX, clientY) {
+		this._mouseDownOrigin = L.point(clientX, clientY);
+	},
+
+	_onMouseUp: function (e) {
+		var originalEvent = e.originalEvent;
+		var clientX = originalEvent.clientX;
+		var clientY = originalEvent.clientY;
+		this._endPoint.call(this, clientX, clientY, e);
+		this._clickHandled = null;
+	},
+
+	_endPoint: function (clientX, clientY, e) {
+		if (this._mouseDownOrigin) {
+			var dragCheckDistance = L.point(clientX, clientY)
+				.distanceTo(this._mouseDownOrigin);
+			var lastPtDistance = this._calculateFinishDistance(e.latlng);
+			if (this.options.maxPoints > 1 && this.options.maxPoints == this._markers.length + 1) {
+				this.addVertex(e.latlng);
+				this._finishShape();
+			} else if (lastPtDistance < 10 && L.Browser.touch) {
+				this._finishShape();
+			} else if (Math.abs(dragCheckDistance) < 9 * (window.devicePixelRatio || 1)) {
+				this.addVertex(e.latlng);
+			}
+			this._enableNewMarkers(); // after a short pause, enable new markers
+		}
+		this._mouseDownOrigin = null;
+	},
+
+	// ontouch prevented by clickHandled flag because some browsers fire both click/touch events,
+	// causing unwanted behavior
+	_onTouch: function (e) {
+		var originalEvent = e.originalEvent;
+		var clientX;
+		var clientY;
+		if (originalEvent.touches && originalEvent.touches[0] && !this._clickHandled && !this._touchHandled && !this._disableMarkers) {
+			clientX = originalEvent.touches[0].clientX;
+			clientY = originalEvent.touches[0].clientY;
+			this._disableNewMarkers();
+			this._touchHandled = true;
+			this._startPoint.call(this, clientX, clientY);
+			this._endPoint.call(this, clientX, clientY, e);
+			this._touchHandled = null;
+		}
+		this._clickHandled = null;
+	},
+
+	_onMouseOut: function () {
+		if (this._tooltip) {
+			this._tooltip._onMouseOut.call(this._tooltip);
+		}
+	},
+
+	// calculate if we are currently within close enough distance
+	// of the closing point (first point for shapes, last point for lines)
+	// this is semi-ugly code but the only reliable way i found to get the job done
+	// note: calculating point.distanceTo between mouseDownOrigin and last marker did NOT work
+	_calculateFinishDistance: function (potentialLatLng) {
+		var lastPtDistance;
+		if (this._markers.length > 0) {
+			var finishMarker;
+			if (this.type === L.Draw.Polyline.TYPE) {
+				finishMarker = this._markers[this._markers.length - 1];
+			} else if (this.type === L.Draw.Polygon.TYPE) {
+				finishMarker = this._markers[0];
+			} else {
+				return Infinity;
+			}
+			var lastMarkerPoint = this._map.latLngToContainerPoint(finishMarker.getLatLng()),
+				potentialMarker = new L.Marker(potentialLatLng, {
+					icon: this.options.icon,
+					zIndexOffset: this.options.zIndexOffset * 2
+				});
+			var potentialMarkerPint = this._map.latLngToContainerPoint(potentialMarker.getLatLng());
+			lastPtDistance = lastMarkerPoint.distanceTo(potentialMarkerPint);
+		} else {
+			lastPtDistance = Infinity;
+		}
+		return lastPtDistance;
+	},
+
+	_updateFinishHandler: function () {
+		var markerCount = this._markers.length;
+		// The last marker should have a click handler to close the polyline
+		if (markerCount > 1) {
+			this._markers[markerCount - 1].on('click', this._finishShape, this);
+		}
+
+		// Remove the old marker click handler (as only the last point should close the polyline)
+		if (markerCount > 2) {
+			this._markers[markerCount - 2].off('click', this._finishShape, this);
+		}
+	},
+
+	_createMarker: function (latlng) {
+		var marker = new L.Marker(latlng, {
+			icon: this.options.icon,
+			zIndexOffset: this.options.zIndexOffset * 2
+		});
+
+		this._markerGroup.addLayer(marker);
+
+		return marker;
+	},
+
+	_updateGuide: function (newPos) {
+		var markerCount = this._markers ? this._markers.length : 0;
+
+		if (markerCount > 0) {
+			newPos = newPos || this._map.latLngToLayerPoint(this._currentLatLng);
+
+			// draw the guide line
+			this._clearGuides();
+			this._drawGuide(
+				this._map.latLngToLayerPoint(this._markers[markerCount - 1].getLatLng()),
+				newPos
+			);
+		}
+	},
+
+	_updateTooltip: function (latLng) {
+		var text = this._getTooltipText();
+
+		if (latLng) {
+			this._tooltip.updatePosition(latLng);
+		}
+
+		if (!this._errorShown) {
+			this._tooltip.updateContent(text);
+		}
+	},
+
+	_drawGuide: function (pointA, pointB) {
+		var length = Math.floor(Math.sqrt(Math.pow((pointB.x - pointA.x), 2) + Math.pow((pointB.y - pointA.y), 2))),
+			guidelineDistance = this.options.guidelineDistance,
+			maxGuideLineLength = this.options.maxGuideLineLength,
+			// Only draw a guideline with a max length
+			i = length > maxGuideLineLength ? length - maxGuideLineLength : guidelineDistance,
+			fraction,
+			dashPoint,
+			dash;
+
+		//create the guides container if we haven't yet
+		if (!this._guidesContainer) {
+			this._guidesContainer = L.DomUtil.create('div', 'leaflet-draw-guides', this._overlayPane);
+		}
+
+		//draw a dash every GuildeLineDistance
+		for (; i < length; i += this.options.guidelineDistance) {
+			//work out fraction along line we are
+			fraction = i / length;
+
+			//calculate new x,y point
+			dashPoint = {
+				x: Math.floor((pointA.x * (1 - fraction)) + (fraction * pointB.x)),
+				y: Math.floor((pointA.y * (1 - fraction)) + (fraction * pointB.y))
+			};
+
+			//add guide dash to guide container
+			dash = L.DomUtil.create('div', 'leaflet-draw-guide-dash', this._guidesContainer);
+			dash.style.backgroundColor =
+				!this._errorShown ? this.options.shapeOptions.color : this.options.drawError.color;
+
+			L.DomUtil.setPosition(dash, dashPoint);
+		}
+	},
+
+	_updateGuideColor: function (color) {
+		if (this._guidesContainer) {
+			for (var i = 0, l = this._guidesContainer.childNodes.length; i < l; i++) {
+				this._guidesContainer.childNodes[i].style.backgroundColor = color;
+			}
+		}
+	},
+
+	// removes all child elements (guide dashes) from the guides container
+	_clearGuides: function () {
+		if (this._guidesContainer) {
+			while (this._guidesContainer.firstChild) {
+				this._guidesContainer.removeChild(this._guidesContainer.firstChild);
+			}
+		}
+	},
+
+	_getTooltipText: function () {
+		var showLength = this.options.showLength,
+			labelText, distanceStr;
+		if (this._markers.length === 0) {
+			labelText = {
+				text: L.drawLocal.draw.handlers.polyline.tooltip.start
+			};
+		} else {
+			distanceStr = showLength ? this._getMeasurementString() : '';
+
+			if (this._markers.length === 1) {
+				labelText = {
+					text: L.drawLocal.draw.handlers.polyline.tooltip.cont,
+					subtext: distanceStr
+				};
+			} else {
+				labelText = {
+					text: L.drawLocal.draw.handlers.polyline.tooltip.end,
+					subtext: distanceStr
+				};
+			}
+		}
+		return labelText;
+	},
+
+	_updateRunningMeasure: function (latlng, added) {
+		var markersLength = this._markers.length,
+			previousMarkerIndex, distance;
+
+		if (this._markers.length === 1) {
+			this._measurementRunningTotal = 0;
+		} else {
+			previousMarkerIndex = markersLength - (added ? 2 : 1);
+
+			// Calculate the distance based on the version
+			if (L.GeometryUtil.isVersion07x()) {
+				distance = latlng.distanceTo(this._markers[previousMarkerIndex].getLatLng()) * (this.options.factor || 1);
+			} else {
+				distance = this._map.distance(latlng, this._markers[previousMarkerIndex].getLatLng()) * (this.options.factor || 1);
+			}
+
+			this._measurementRunningTotal += distance * (added ? 1 : -1);
+		}
+	},
+
+	_getMeasurementString: function () {
+		var currentLatLng = this._currentLatLng,
+			previousLatLng = this._markers[this._markers.length - 1].getLatLng(),
+			distance;
+
+		// Calculate the distance from the last fixed point to the mouse position based on the version
+		if (L.GeometryUtil.isVersion07x()) {
+			distance = previousLatLng && currentLatLng && currentLatLng.distanceTo ? this._measurementRunningTotal + currentLatLng.distanceTo(previousLatLng) * (this.options.factor || 1) : this._measurementRunningTotal || 0;
+		} else {
+			distance = previousLatLng && currentLatLng ? this._measurementRunningTotal + this._map.distance(currentLatLng, previousLatLng) * (this.options.factor || 1) : this._measurementRunningTotal || 0;
+		}
+
+		return L.GeometryUtil.readableDistance(distance, this.options.metric, this.options.feet, this.options.nautic, this.options.precision);
+	},
+
+	_showErrorTooltip: function () {
+		this._errorShown = true;
+
+		// Update tooltip
+		this._tooltip
+			.showAsError()
+			.updateContent({text: this.options.drawError.message});
+
+		// Update shape
+		this._updateGuideColor(this.options.drawError.color);
+		this._poly.setStyle({color: this.options.drawError.color});
+
+		// Hide the error after 2 seconds
+		this._clearHideErrorTimeout();
+		this._hideErrorTimeout = setTimeout(L.Util.bind(this._hideErrorTooltip, this), this.options.drawError.timeout);
+	},
+
+	_hideErrorTooltip: function () {
+		this._errorShown = false;
+
+		this._clearHideErrorTimeout();
+
+		// Revert tooltip
+		this._tooltip
+			.removeError()
+			.updateContent(this._getTooltipText());
+
+		// Revert shape
+		this._updateGuideColor(this.options.shapeOptions.color);
+		this._poly.setStyle({color: this.options.shapeOptions.color});
+	},
+
+	_clearHideErrorTimeout: function () {
+		if (this._hideErrorTimeout) {
+			clearTimeout(this._hideErrorTimeout);
+			this._hideErrorTimeout = null;
+		}
+	},
+
+	// disable new markers temporarily;
+	// this is to prevent duplicated touch/click events in some browsers
+	_disableNewMarkers: function () {
+		this._disableMarkers = true;
+	},
+
+	// see _disableNewMarkers
+	_enableNewMarkers: function () {
+		setTimeout(function () {
+			this._disableMarkers = false;
+		}.bind(this), 50);
+	},
+
+	_cleanUpShape: function () {
+		if (this._markers.length > 1) {
+			this._markers[this._markers.length - 1].off('click', this._finishShape, this);
+		}
+	},
+
+	_fireCreatedEvent: function () {
+		var poly = new this.Poly(this._poly.getLatLngs(), this.options.shapeOptions);
+		L.Draw.Feature.prototype._fireCreatedEvent.call(this, poly);
+	}
+});
+
+
+
+/**
+ * @class L.Draw.Polygon
+ * @aka Draw.Polygon
+ * @inherits L.Draw.Polyline
+ */
+L.Draw.Polygon = L.Draw.Polyline.extend({
+	statics: {
+		TYPE: 'polygon'
+	},
+
+	Poly: L.Polygon,
+
+	options: {
+		showArea: false,
+		showLength: false,
+		shapeOptions: {
+			stroke: true,
+			color: '#3388ff',
+			weight: 4,
+			opacity: 0.5,
+			fill: true,
+			fillColor: null, //same as color by default
+			fillOpacity: 0.2,
+			clickable: true
+		},
+		// Whether to use the metric measurement system (truthy) or not (falsy).
+		// Also defines the units to use for the metric system as an array of
+		// strings (e.g. `['ha', 'm']`).
+		metric: true,
+		feet: true, // When not metric, to use feet instead of yards for display.
+		nautic: false, // When not metric, not feet use nautic mile for display
+		// Defines the precision for each type of unit (e.g. {km: 2, ft: 0}
+		precision: {}
+	},
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		L.Draw.Polyline.prototype.initialize.call(this, map, options);
+
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.Draw.Polygon.TYPE;
+	},
+
+	_updateFinishHandler: function () {
+		var markerCount = this._markers.length;
+
+		// The first marker should have a click handler to close the polygon
+		if (markerCount === 1) {
+			this._markers[0].on('click', this._finishShape, this);
+		}
+
+		// Add and update the double click handler
+		if (markerCount > 2) {
+			this._markers[markerCount - 1].on('dblclick', this._finishShape, this);
+			// Only need to remove handler if has been added before
+			if (markerCount > 3) {
+				this._markers[markerCount - 2].off('dblclick', this._finishShape, this);
+			}
+		}
+	},
+
+	_getTooltipText: function () {
+		var text, subtext;
+
+		if (this._markers.length === 0) {
+			text = L.drawLocal.draw.handlers.polygon.tooltip.start;
+		} else if (this._markers.length < 3) {
+			text = L.drawLocal.draw.handlers.polygon.tooltip.cont;
+			subtext = this._getMeasurementString();
+		} else {
+			text = L.drawLocal.draw.handlers.polygon.tooltip.end;
+			subtext = this._getMeasurementString();
+		}
+
+		return {
+			text: text,
+			subtext: subtext
+		};
+	},
+
+	_getMeasurementString: function () {
+		var area = this._area,
+			measurementString = '';
+
+
+		if (!area && !this.options.showLength) {
+			return null;
+		}
+
+		if (this.options.showLength) {
+			measurementString = L.Draw.Polyline.prototype._getMeasurementString.call(this);
+		}
+
+		if (area) {
+			measurementString += '<br>' + L.GeometryUtil.readableArea(area, this.options.metric, this.options.precision);
+		}
+
+		return measurementString;
+	},
+
+	_shapeIsValid: function () {
+		return this._markers.length >= 3;
+	},
+
+	_vertexChanged: function (latlng, added) {
+		var latLngs;
+
+		// Check to see if we should show the area
+		if (!this.options.allowIntersection && this.options.showArea) {
+			latLngs = this._poly.getLatLngs();
+
+			this._area = L.GeometryUtil.geodesicArea(latLngs);
+		}
+
+		L.Draw.Polyline.prototype._vertexChanged.call(this, latlng, added);
+	},
+
+	_cleanUpShape: function () {
+		var markerCount = this._markers.length;
+
+		if (markerCount > 0) {
+			this._markers[0].off('click', this._finishShape, this);
+
+			if (markerCount > 2) {
+				this._markers[markerCount - 1].off('dblclick', this._finishShape, this);
+			}
+		}
+	}
+});
+
+
+
+L.SimpleShape = {};
+/**
+ * @class L.Draw.SimpleShape
+ * @aka Draw.SimpleShape
+ * @inherits L.Draw.Feature
+ */
+L.Draw.SimpleShape = L.Draw.Feature.extend({
+	options: {
+		repeatMode: false
+	},
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		this._endLabelText = L.drawLocal.draw.handlers.simpleshape.tooltip.end;
+
+		L.Draw.Feature.prototype.initialize.call(this, map, options);
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler.
+	addHooks: function () {
+		L.Draw.Feature.prototype.addHooks.call(this);
+		if (this._map) {
+			this._mapDraggable = this._map.dragging.enabled();
+
+			if (this._mapDraggable) {
+				this._map.dragging.disable();
+			}
+
+			//TODO refactor: move cursor to styles
+			this._container.style.cursor = 'crosshair';
+
+			this._tooltip.updateContent({text: this._initialLabelText});
+
+			this._map
+				.on('mousedown', this._onMouseDown, this)
+				.on('mousemove', this._onMouseMove, this)
+				.on('touchstart', this._onMouseDown, this)
+				.on('touchmove', this._onMouseMove, this);
+
+			// we should prevent default, otherwise default behavior (scrolling) will fire,
+			// and that will cause document.touchend to fire and will stop the drawing
+			// (circle, rectangle) in touch mode.
+			// (update): we have to send passive now to prevent scroll, because by default it is {passive: true} now, which means,
+			// handler can't event.preventDefault
+			// check the news https://developers.google.com/web/updates/2016/06/passive-event-listeners
+			document.addEventListener('touchstart', L.DomEvent.preventDefault, {passive: false});
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler.
+	removeHooks: function () {
+		L.Draw.Feature.prototype.removeHooks.call(this);
+		if (this._map) {
+			if (this._mapDraggable) {
+				this._map.dragging.enable();
+			}
+
+			//TODO refactor: move cursor to styles
+			this._container.style.cursor = '';
+
+			this._map
+				.off('mousedown', this._onMouseDown, this)
+				.off('mousemove', this._onMouseMove, this)
+				.off('touchstart', this._onMouseDown, this)
+				.off('touchmove', this._onMouseMove, this);
+
+			L.DomEvent.off(document, 'mouseup', this._onMouseUp, this);
+			L.DomEvent.off(document, 'touchend', this._onMouseUp, this);
+
+			document.removeEventListener('touchstart', L.DomEvent.preventDefault);
+
+			// If the box element doesn't exist they must not have moved the mouse, so don't need to destroy/return
+			if (this._shape) {
+				this._map.removeLayer(this._shape);
+				delete this._shape;
+			}
+		}
+		this._isDrawing = false;
+	},
+
+	_getTooltipText: function () {
+		return {
+			text: this._endLabelText
+		};
+	},
+
+	_onMouseDown: function (e) {
+		this._isDrawing = true;
+		this._startLatLng = e.latlng;
+
+		L.DomEvent
+			.on(document, 'mouseup', this._onMouseUp, this)
+			.on(document, 'touchend', this._onMouseUp, this)
+			.preventDefault(e.originalEvent);
+	},
+
+	_onMouseMove: function (e) {
+		var latlng = e.latlng;
+
+		this._tooltip.updatePosition(latlng);
+		if (this._isDrawing) {
+			this._tooltip.updateContent(this._getTooltipText());
+			this._drawShape(latlng);
+		}
+	},
+
+	_onMouseUp: function () {
+		if (this._shape) {
+			this._fireCreatedEvent();
+		}
+
+		this.disable();
+		if (this.options.repeatMode) {
+			this.enable();
+		}
+	}
+});
+
+
+
+/**
+ * @class L.Draw.Rectangle
+ * @aka Draw.Rectangle
+ * @inherits L.Draw.SimpleShape
+ */
+L.Draw.Rectangle = L.Draw.SimpleShape.extend({
+	statics: {
+		TYPE: 'rectangle'
+	},
+
+	options: {
+		shapeOptions: {
+			stroke: true,
+			color: '#3388ff',
+			weight: 4,
+			opacity: 0.5,
+			fill: true,
+			fillColor: null, //same as color by default
+			fillOpacity: 0.2,
+			clickable: true
+		},
+		showArea: true, //Whether to show the area in the tooltip
+		metric: true // Whether to use the metric measurement system or imperial
+	},
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.Draw.Rectangle.TYPE;
+
+		this._initialLabelText = L.drawLocal.draw.handlers.rectangle.tooltip.start;
+
+		L.Draw.SimpleShape.prototype.initialize.call(this, map, options);
+	},
+
+	// @method disable(): void
+	disable: function () {
+		if (!this._enabled) {
+			return;
+		}
+
+		this._isCurrentlyTwoClickDrawing = false;
+		L.Draw.SimpleShape.prototype.disable.call(this);
+	},
+
+	_onMouseUp: function (e) {
+		if (!this._shape && !this._isCurrentlyTwoClickDrawing) {
+			this._isCurrentlyTwoClickDrawing = true;
+			return;
+		}
+
+		// Make sure closing click is on map
+		if (this._isCurrentlyTwoClickDrawing && !_hasAncestor(e.target, 'leaflet-pane')) {
+			return;
+		}
+
+		L.Draw.SimpleShape.prototype._onMouseUp.call(this);
+	},
+
+	_drawShape: function (latlng) {
+		if (!this._shape) {
+			this._shape = new L.Rectangle(new L.LatLngBounds(this._startLatLng, latlng), this.options.shapeOptions);
+			this._map.addLayer(this._shape);
+		} else {
+			this._shape.setBounds(new L.LatLngBounds(this._startLatLng, latlng));
+		}
+	},
+
+	_fireCreatedEvent: function () {
+		var rectangle = new L.Rectangle(this._shape.getBounds(), this.options.shapeOptions);
+		L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, rectangle);
+	},
+
+	_getTooltipText: function () {
+		var tooltipText = L.Draw.SimpleShape.prototype._getTooltipText.call(this),
+			shape = this._shape,
+			showArea = this.options.showArea,
+			latLngs, area, subtext;
+
+		if (shape) {
+			latLngs = this._shape._defaultShape ? this._shape._defaultShape() : this._shape.getLatLngs();
+			area = L.GeometryUtil.geodesicArea(latLngs);
+			subtext = showArea ? L.GeometryUtil.readableArea(area, this.options.metric) : '';
+		}
+
+		return {
+			text: tooltipText.text,
+			subtext: subtext
+		};
+	}
+});
+
+function _hasAncestor(el, cls) {
+	while ((el = el.parentElement) && !el.classList.contains(cls)) {
+		;
+	}
+	return el;
+}
+
+
+
+/**
+ * @class L.Draw.Marker
+ * @aka Draw.Marker
+ * @inherits L.Draw.Feature
+ */
+L.Draw.Marker = L.Draw.Feature.extend({
+	statics: {
+		TYPE: 'marker'
+	},
+
+	options: {
+		icon: new L.Icon.Default(),
+		repeatMode: false,
+		zIndexOffset: 2000 // This should be > than the highest z-index any markers
+	},
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.Draw.Marker.TYPE;
+
+		this._initialLabelText = L.drawLocal.draw.handlers.marker.tooltip.start;
+
+		L.Draw.Feature.prototype.initialize.call(this, map, options);
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler.
+	addHooks: function () {
+		L.Draw.Feature.prototype.addHooks.call(this);
+
+		if (this._map) {
+			this._tooltip.updateContent({text: this._initialLabelText});
+
+			// Same mouseMarker as in Draw.Polyline
+			if (!this._mouseMarker) {
+				this._mouseMarker = L.marker(this._map.getCenter(), {
+					icon: L.divIcon({
+						className: 'leaflet-mouse-marker',
+						iconAnchor: [20, 20],
+						iconSize: [40, 40]
+					}),
+					opacity: 0,
+					zIndexOffset: this.options.zIndexOffset
+				});
+			}
+
+			this._mouseMarker
+				.on('click', this._onClick, this)
+				.addTo(this._map);
+
+			this._map.on('mousemove', this._onMouseMove, this);
+			this._map.on('click', this._onTouch, this);
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler.
+	removeHooks: function () {
+		L.Draw.Feature.prototype.removeHooks.call(this);
+
+		if (this._map) {
+			this._map
+				.off('click', this._onClick, this)
+				.off('click', this._onTouch, this);
+			if (this._marker) {
+				this._marker.off('click', this._onClick, this);
+				this._map
+					.removeLayer(this._marker);
+				delete this._marker;
+			}
+
+			this._mouseMarker.off('click', this._onClick, this);
+			this._map.removeLayer(this._mouseMarker);
+			delete this._mouseMarker;
+
+			this._map.off('mousemove', this._onMouseMove, this);
+		}
+	},
+
+	_onMouseMove: function (e) {
+		var latlng = e.latlng;
+
+		this._tooltip.updatePosition(latlng);
+		this._mouseMarker.setLatLng(latlng);
+
+		if (!this._marker) {
+			this._marker = this._createMarker(latlng);
+			// Bind to both marker and map to make sure we get the click event.
+			this._marker.on('click', this._onClick, this);
+			this._map
+				.on('click', this._onClick, this)
+				.addLayer(this._marker);
+		}
+		else {
+			latlng = this._mouseMarker.getLatLng();
+			this._marker.setLatLng(latlng);
+		}
+	},
+
+	_createMarker: function (latlng) {
+		return new L.Marker(latlng, {
+			icon: this.options.icon,
+			zIndexOffset: this.options.zIndexOffset
+		});
+	},
+
+	_onClick: function () {
+		this._fireCreatedEvent();
+
+		this.disable();
+		if (this.options.repeatMode) {
+			this.enable();
+		}
+	},
+
+	_onTouch: function (e) {
+		// called on click & tap, only really does any thing on tap
+		this._onMouseMove(e); // creates & places marker
+		this._onClick(); // permanently places marker & ends interaction
+	},
+
+	_fireCreatedEvent: function () {
+		var marker = new L.Marker.Touch(this._marker.getLatLng(), {icon: this.options.icon});
+		L.Draw.Feature.prototype._fireCreatedEvent.call(this, marker);
+	}
+});
+
+
+
+/**
+ * @class L.Draw.CircleMarker
+ * @aka Draw.CircleMarker
+ * @inherits L.Draw.Marker
+ */
+L.Draw.CircleMarker = L.Draw.Marker.extend({
+	statics: {
+		TYPE: 'circlemarker'
+	},
+
+	options: {
+		stroke: true,
+		color: '#3388ff',
+		weight: 4,
+		opacity: 0.5,
+		fill: true,
+		fillColor: null, //same as color by default
+		fillOpacity: 0.2,
+		clickable: true,
+		zIndexOffset: 2000 // This should be > than the highest z-index any markers
+	},
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.Draw.CircleMarker.TYPE;
+
+		this._initialLabelText = L.drawLocal.draw.handlers.circlemarker.tooltip.start;
+
+		L.Draw.Feature.prototype.initialize.call(this, map, options);
+	},
+
+
+	_fireCreatedEvent: function () {
+		var circleMarker = new L.CircleMarker(this._marker.getLatLng(), this.options);
+		L.Draw.Feature.prototype._fireCreatedEvent.call(this, circleMarker);
+	},
+
+	_createMarker: function (latlng) {
+		return new L.CircleMarker(latlng, this.options);
+	}
+});
+
+
+
+/**
+ * @class L.Draw.Circle
+ * @aka Draw.Circle
+ * @inherits L.Draw.SimpleShape
+ */
+L.Draw.Circle = L.Draw.SimpleShape.extend({
+	statics: {
+		TYPE: 'circle'
+	},
+
+	options: {
+		shapeOptions: {
+			stroke: true,
+			color: '#3388ff',
+			weight: 4,
+			opacity: 0.5,
+			fill: true,
+			fillColor: null, //same as color by default
+			fillOpacity: 0.2,
+			clickable: true
+		},
+		showRadius: true,
+		metric: true, // Whether to use the metric measurement system or imperial
+		feet: true, // When not metric, use feet instead of yards for display
+		nautic: false // When not metric, not feet use nautic mile for display
+	},
+
+	// @method initialize(): void
+	initialize: function (map, options) {
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.Draw.Circle.TYPE;
+
+		this._initialLabelText = L.drawLocal.draw.handlers.circle.tooltip.start;
+
+		L.Draw.SimpleShape.prototype.initialize.call(this, map, options);
+	},
+
+	_drawShape: function (latlng) {
+		// Calculate the distance based on the version
+		if (L.GeometryUtil.isVersion07x()) {
+			var distance = this._startLatLng.distanceTo(latlng);
+		} else {
+			var distance = this._map.distance(this._startLatLng, latlng);
+		}
+
+		if (!this._shape) {
+			this._shape = new L.Circle(this._startLatLng, distance, this.options.shapeOptions);
+			this._map.addLayer(this._shape);
+		} else {
+			this._shape.setRadius(distance);
+		}
+	},
+
+	_fireCreatedEvent: function () {
+		var circle = new L.Circle(this._startLatLng, this._shape.getRadius(), this.options.shapeOptions);
+		L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, circle);
+	},
+
+	_onMouseMove: function (e) {
+		var latlng = e.latlng,
+			showRadius = this.options.showRadius,
+			useMetric = this.options.metric,
+			radius;
+
+		this._tooltip.updatePosition(latlng);
+		if (this._isDrawing) {
+			this._drawShape(latlng);
+
+			// Get the new radius (rounded to 1 dp)
+			radius = this._shape.getRadius().toFixed(1);
+
+			var subtext = '';
+			if (showRadius) {
+				subtext = L.drawLocal.draw.handlers.circle.radius + ': ' +
+					L.GeometryUtil.readableDistance(radius, useMetric, this.options.feet, this.options.nautic);
+			}
+			this._tooltip.updateContent({
+				text: this._endLabelText,
+				subtext: subtext
+			});
+		}
+	}
+});
+
+
+
+L.Edit = L.Edit || {};
+
+/**
+ * @class L.Edit.Marker
+ * @aka Edit.Marker
+ */
+L.Edit.Marker = L.Handler.extend({
+	// @method initialize(): void
+	initialize: function (marker, options) {
+		this._marker = marker;
+		L.setOptions(this, options);
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler
+	addHooks: function () {
+		var marker = this._marker;
+
+		marker.dragging.enable();
+		marker.on('dragend', this._onDragEnd, marker);
+		this._toggleMarkerHighlight();
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler
+	removeHooks: function () {
+		var marker = this._marker;
+
+		marker.dragging.disable();
+		marker.off('dragend', this._onDragEnd, marker);
+		this._toggleMarkerHighlight();
+	},
+
+	_onDragEnd: function (e) {
+		var layer = e.target;
+		layer.edited = true;
+		this._map.fire(L.Draw.Event.EDITMOVE, {layer: layer});
+	},
+
+	_toggleMarkerHighlight: function () {
+		var icon = this._marker._icon;
+
+		// Don't do anything if this layer is a marker but doesn't have an icon. Markers
+		// should usually have icons. If using Leaflet.draw with Leaflet.markercluster there
+		// is a chance that a marker doesn't.
+		if (!icon) {
+			return;
+		}
+
+		// This is quite naughty, but I don't see another way of doing it. (short of setting a new icon)
+		icon.style.display = 'none';
+
+		if (L.DomUtil.hasClass(icon, 'leaflet-edit-marker-selected')) {
+			L.DomUtil.removeClass(icon, 'leaflet-edit-marker-selected');
+			// Offset as the border will make the icon move.
+			this._offsetMarker(icon, -4);
+
+		} else {
+			L.DomUtil.addClass(icon, 'leaflet-edit-marker-selected');
+			// Offset as the border will make the icon move.
+			this._offsetMarker(icon, 4);
+		}
+
+		icon.style.display = '';
+	},
+
+	_offsetMarker: function (icon, offset) {
+		var iconMarginTop = parseInt(icon.style.marginTop, 10) - offset,
+			iconMarginLeft = parseInt(icon.style.marginLeft, 10) - offset;
+
+		icon.style.marginTop = iconMarginTop + 'px';
+		icon.style.marginLeft = iconMarginLeft + 'px';
+	}
+});
+
+L.Marker.addInitHook(function () {
+	if (L.Edit.Marker) {
+		this.editing = new L.Edit.Marker(this);
+
+		if (this.options.editable) {
+			this.editing.enable();
+		}
+	}
+});
+
+
+
+L.Edit = L.Edit || {};
+
+/**
+ * @class L.Edit.Polyline
+ * @aka L.Edit.Poly
+ * @aka Edit.Poly
+ */
+L.Edit.Poly = L.Handler.extend({
+	// @method initialize(): void
+	initialize: function (poly) {
+
+		this.latlngs = [poly._latlngs];
+		if (poly._holes) {
+			this.latlngs = this.latlngs.concat(poly._holes);
+		}
+
+		this._poly = poly;
+
+		this._poly.on('revert-edited', this._updateLatLngs, this);
+	},
+
+	// Compatibility method to normalize Poly* objects
+	// between 0.7.x and 1.0+
+	_defaultShape: function () {
+		if (!L.Polyline._flat) {
+			return this._poly._latlngs;
+		}
+		return L.Polyline._flat(this._poly._latlngs) ? this._poly._latlngs : this._poly._latlngs[0];
+	},
+
+	_eachVertexHandler: function (callback) {
+		for (var i = 0; i < this._verticesHandlers.length; i++) {
+			callback(this._verticesHandlers[i]);
+		}
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler
+	addHooks: function () {
+		this._initHandlers();
+		this._eachVertexHandler(function (handler) {
+			handler.addHooks();
+		});
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler
+	removeHooks: function () {
+		this._eachVertexHandler(function (handler) {
+			handler.removeHooks();
+		});
+	},
+
+	// @method updateMarkers(): void
+	// Fire an update for each vertex handler
+	updateMarkers: function () {
+		this._eachVertexHandler(function (handler) {
+			handler.updateMarkers();
+		});
+	},
+
+	_initHandlers: function () {
+		this._verticesHandlers = [];
+		for (var i = 0; i < this.latlngs.length; i++) {
+			this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(this._poly, this.latlngs[i], this._poly.options.poly));
+		}
+	},
+
+	_updateLatLngs: function (e) {
+		this.latlngs = [e.layer._latlngs];
+		if (e.layer._holes) {
+			this.latlngs = this.latlngs.concat(e.layer._holes);
+		}
+	}
+
+});
+
+/**
+ * @class L.Edit.PolyVerticesEdit
+ * @aka Edit.PolyVerticesEdit
+ */
+L.Edit.PolyVerticesEdit = L.Handler.extend({
+	options: {
+		icon: new L.DivIcon({
+			iconSize: new L.Point(8, 8),
+			className: 'leaflet-div-icon leaflet-editing-icon'
+		}),
+		touchIcon: new L.DivIcon({
+			iconSize: new L.Point(20, 20),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
+		}),
+		drawError: {
+			color: '#b00b00',
+			timeout: 1000
+		}
+
+
+	},
+
+	// @method intialize(): void
+	initialize: function (poly, latlngs, options) {
+		// if touch, switch to touch icon
+		if (L.Browser.touch) {
+			this.options.icon = this.options.touchIcon;
+		}
+		this._poly = poly;
+
+		if (options && options.drawError) {
+			options.drawError = L.Util.extend({}, this.options.drawError, options.drawError);
+		}
+
+		this._latlngs = latlngs;
+
+		L.setOptions(this, options);
+	},
+
+	// Compatibility method to normalize Poly* objects
+	// between 0.7.x and 1.0+
+	_defaultShape: function () {
+		if (!L.Polyline._flat) {
+			return this._latlngs;
+		}
+		return L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0];
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler.
+	addHooks: function () {
+		var poly = this._poly;
+		var path = poly._path;
+
+		if (!(poly instanceof L.Polygon)) {
+			poly.options.fill = false;
+			if (poly.options.editing) {
+				poly.options.editing.fill = false;
+			}
+		}
+
+		if (path) {
+			if (poly.options.editing && poly.options.editing.className) {
+				if (poly.options.original.className) {
+					poly.options.original.className.split(' ').forEach(function (className) {
+						L.DomUtil.removeClass(path, className);
+					});
+				}
+				poly.options.editing.className.split(' ').forEach(function (className) {
+					L.DomUtil.addClass(path, className);
+				});
+			}
+		}
+
+		poly.setStyle(poly.options.editing);
+
+		if (this._poly._map) {
+
+			this._map = this._poly._map; // Set map
+
+			if (!this._markerGroup) {
+				this._initMarkers();
+			}
+			this._poly._map.addLayer(this._markerGroup);
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler.
+	removeHooks: function () {
+		var poly = this._poly;
+		var path = poly._path;
+
+		if (path) {
+			if (poly.options.editing && poly.options.editing.className) {
+				poly.options.editing.className.split(' ').forEach(function (className) {
+					L.DomUtil.removeClass(path, className);
+				});
+				if (poly.options.original.className) {
+					poly.options.original.className.split(' ').forEach(function (className) {
+						L.DomUtil.addClass(path, className);
+					});
+				}
+			}
+		}
+
+		poly.setStyle(poly.options.original);
+
+		if (poly._map) {
+			poly._map.removeLayer(this._markerGroup);
+			delete this._markerGroup;
+			delete this._markers;
+		}
+	},
+
+	// @method updateMarkers(): void
+	// Clear markers and update their location
+	updateMarkers: function () {
+		this._markerGroup.clearLayers();
+		this._initMarkers();
+	},
+
+	_initMarkers: function () {
+		if (!this._markerGroup) {
+			this._markerGroup = new L.LayerGroup();
+		}
+		this._markers = [];
+
+		var latlngs = this._defaultShape(),
+			i, j, len, marker;
+
+		for (i = 0, len = latlngs.length; i < len; i++) {
+
+			marker = this._createMarker(latlngs[i], i);
+			marker.on('click', this._onMarkerClick, this);
+			marker.on('contextmenu', this._onContextMenu, this);
+			this._markers.push(marker);
+		}
+
+		var markerLeft, markerRight;
+
+		for (i = 0, j = len - 1; i < len; j = i++) {
+			if (i === 0 && !(L.Polygon && (this._poly instanceof L.Polygon))) {
+				continue;
+			}
+
+			markerLeft = this._markers[j];
+			markerRight = this._markers[i];
+
+			this._createMiddleMarker(markerLeft, markerRight);
+			this._updatePrevNext(markerLeft, markerRight);
+		}
+	},
+
+	_createMarker: function (latlng, index) {
+		// Extending L.Marker in TouchEvents.js to include touch.
+		var marker = new L.Marker.Touch(latlng, {
+			draggable: true,
+			icon: this.options.icon,
+		});
+
+		marker._origLatLng = latlng;
+		marker._index = index;
+
+		marker
+			.on('dragstart', this._onMarkerDragStart, this)
+			.on('drag', this._onMarkerDrag, this)
+			.on('dragend', this._fireEdit, this)
+			.on('touchmove', this._onTouchMove, this)
+			.on('touchend', this._fireEdit, this)
+			.on('MSPointerMove', this._onTouchMove, this)
+			.on('MSPointerUp', this._fireEdit, this);
+
+		this._markerGroup.addLayer(marker);
+
+		return marker;
+	},
+
+	_onMarkerDragStart: function () {
+		this._poly.fire('editstart');
+	},
+
+	_spliceLatLngs: function () {
+		var latlngs = this._defaultShape();
+		var removed = [].splice.apply(latlngs, arguments);
+		this._poly._convertLatLngs(latlngs, true);
+		this._poly.redraw();
+		return removed;
+	},
+
+	_removeMarker: function (marker) {
+		var i = marker._index;
+
+		this._markerGroup.removeLayer(marker);
+		this._markers.splice(i, 1);
+		this._spliceLatLngs(i, 1);
+		this._updateIndexes(i, -1);
+
+		marker
+			.off('dragstart', this._onMarkerDragStart, this)
+			.off('drag', this._onMarkerDrag, this)
+			.off('dragend', this._fireEdit, this)
+			.off('touchmove', this._onMarkerDrag, this)
+			.off('touchend', this._fireEdit, this)
+			.off('click', this._onMarkerClick, this)
+			.off('MSPointerMove', this._onTouchMove, this)
+			.off('MSPointerUp', this._fireEdit, this);
+	},
+
+	_fireEdit: function () {
+		this._poly.edited = true;
+		this._poly.fire('edit');
+		this._poly._map.fire(L.Draw.Event.EDITVERTEX, {layers: this._markerGroup, poly: this._poly});
+	},
+
+	_onMarkerDrag: function (e) {
+		var marker = e.target;
+		var poly = this._poly;
+
+		var oldOrigLatLng = L.LatLngUtil.cloneLatLng(marker._origLatLng);
+		L.extend(marker._origLatLng, marker._latlng);
+		if (poly.options.poly) {
+			var tooltip = poly._map._editTooltip; // Access the tooltip
+
+			// If we don't allow intersections and the polygon intersects
+			if (!poly.options.poly.allowIntersection && poly.intersects()) {
+				L.extend(marker._origLatLng, oldOrigLatLng);
+				marker.setLatLng(oldOrigLatLng);
+				var originalColor = poly.options.color;
+				poly.setStyle({color: this.options.drawError.color});
+				if (tooltip) {
+					tooltip.updateContent({
+						text: L.drawLocal.draw.handlers.polyline.error
+					});
+				}
+
+				// Reset everything back to normal after a second
+				setTimeout(function () {
+					poly.setStyle({color: originalColor});
+					if (tooltip) {
+						tooltip.updateContent({
+							text: L.drawLocal.edit.handlers.edit.tooltip.text,
+							subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
+						});
+					}
+				}, 1000);
+			}
+		}
+
+		if (marker._middleLeft) {
+			marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
+		}
+		if (marker._middleRight) {
+			marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
+		}
+
+		//refresh the bounds when draging
+		this._poly._bounds._southWest = L.latLng(Infinity, Infinity);
+		this._poly._bounds._northEast = L.latLng(-Infinity, -Infinity);
+		var latlngs = this._poly.getLatLngs();
+		this._poly._convertLatLngs(latlngs, true);
+		this._poly.redraw();
+		this._poly.fire('editdrag');
+	},
+
+	_onMarkerClick: function (e) {
+
+		var minPoints = L.Polygon && (this._poly instanceof L.Polygon) ? 4 : 3,
+			marker = e.target;
+
+		// If removing this point would create an invalid polyline/polygon don't remove
+		if (this._defaultShape().length < minPoints) {
+			return;
+		}
+
+		// remove the marker
+		this._removeMarker(marker);
+
+		// update prev/next links of adjacent markers
+		this._updatePrevNext(marker._prev, marker._next);
+
+		// remove ghost markers near the removed marker
+		if (marker._middleLeft) {
+			this._markerGroup.removeLayer(marker._middleLeft);
+		}
+		if (marker._middleRight) {
+			this._markerGroup.removeLayer(marker._middleRight);
+		}
+
+		// create a ghost marker in place of the removed one
+		if (marker._prev && marker._next) {
+			this._createMiddleMarker(marker._prev, marker._next);
+
+		} else if (!marker._prev) {
+			marker._next._middleLeft = null;
+
+		} else if (!marker._next) {
+			marker._prev._middleRight = null;
+		}
+
+		this._fireEdit();
+	},
+
+	_onContextMenu: function (e) {
+		var marker = e.target;
+		var poly = this._poly;
+		this._poly._map.fire(L.Draw.Event.MARKERCONTEXT, {marker: marker, layers: this._markerGroup, poly: this._poly});
+		L.DomEvent.stopPropagation;
+	},
+
+	_onTouchMove: function (e) {
+
+		var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]),
+			latlng = this._map.layerPointToLatLng(layerPoint),
+			marker = e.target;
+
+		L.extend(marker._origLatLng, latlng);
+
+		if (marker._middleLeft) {
+			marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
+		}
+		if (marker._middleRight) {
+			marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
+		}
+
+		this._poly.redraw();
+		this.updateMarkers();
+	},
+
+	_updateIndexes: function (index, delta) {
+		this._markerGroup.eachLayer(function (marker) {
+			if (marker._index > index) {
+				marker._index += delta;
+			}
+		});
+	},
+
+	_createMiddleMarker: function (marker1, marker2) {
+		var latlng = this._getMiddleLatLng(marker1, marker2),
+			marker = this._createMarker(latlng),
+			onClick,
+			onDragStart,
+			onDragEnd;
+
+		marker.setOpacity(0.6);
+
+		marker1._middleRight = marker2._middleLeft = marker;
+
+		onDragStart = function () {
+			marker.off('touchmove', onDragStart, this);
+			var i = marker2._index;
+
+			marker._index = i;
+
+			marker
+				.off('click', onClick, this)
+				.on('click', this._onMarkerClick, this);
+
+			latlng.lat = marker.getLatLng().lat;
+			latlng.lng = marker.getLatLng().lng;
+			this._spliceLatLngs(i, 0, latlng);
+			this._markers.splice(i, 0, marker);
+
+			marker.setOpacity(1);
+
+			this._updateIndexes(i, 1);
+			marker2._index++;
+			this._updatePrevNext(marker1, marker);
+			this._updatePrevNext(marker, marker2);
+
+			this._poly.fire('editstart');
+		};
+
+		onDragEnd = function () {
+			marker.off('dragstart', onDragStart, this);
+			marker.off('dragend', onDragEnd, this);
+			marker.off('touchmove', onDragStart, this);
+
+			this._createMiddleMarker(marker1, marker);
+			this._createMiddleMarker(marker, marker2);
+		};
+
+		onClick = function () {
+			onDragStart.call(this);
+			onDragEnd.call(this);
+			this._fireEdit();
+		};
+
+		marker
+			.on('click', onClick, this)
+			.on('dragstart', onDragStart, this)
+			.on('dragend', onDragEnd, this)
+			.on('touchmove', onDragStart, this);
+
+		this._markerGroup.addLayer(marker);
+	},
+
+	_updatePrevNext: function (marker1, marker2) {
+		if (marker1) {
+			marker1._next = marker2;
+		}
+		if (marker2) {
+			marker2._prev = marker1;
+		}
+	},
+
+	_getMiddleLatLng: function (marker1, marker2) {
+		var map = this._poly._map,
+			p1 = map.project(marker1.getLatLng()),
+			p2 = map.project(marker2.getLatLng());
+
+		return map.unproject(p1._add(p2)._divideBy(2));
+	}
+});
+
+L.Polyline.addInitHook(function () {
+
+	// Check to see if handler has already been initialized. This is to support versions of Leaflet that still have L.Handler.PolyEdit
+	if (this.editing) {
+		return;
+	}
+
+	if (L.Edit.Poly) {
+
+		this.editing = new L.Edit.Poly(this);
+
+		if (this.options.editable) {
+			this.editing.enable();
+		}
+	}
+
+	this.on('add', function () {
+		if (this.editing && this.editing.enabled()) {
+			this.editing.addHooks();
+		}
+	});
+
+	this.on('remove', function () {
+		if (this.editing && this.editing.enabled()) {
+			this.editing.removeHooks();
+		}
+	});
+});
+
+
+
+L.Edit = L.Edit || {};
+/**
+ * @class L.Edit.SimpleShape
+ * @aka Edit.SimpleShape
+ */
+L.Edit.SimpleShape = L.Handler.extend({
+	options: {
+		moveIcon: new L.DivIcon({
+			iconSize: new L.Point(8, 8),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move'
+		}),
+		resizeIcon: new L.DivIcon({
+			iconSize: new L.Point(8, 8),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize'
+		}),
+		touchMoveIcon: new L.DivIcon({
+			iconSize: new L.Point(20, 20),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon'
+		}),
+		touchResizeIcon: new L.DivIcon({
+			iconSize: new L.Point(20, 20),
+			className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon'
+		}),
+	},
+
+	// @method intialize(): void
+	initialize: function (shape, options) {
+		// if touch, switch to touch icon
+		if (L.Browser.touch) {
+			this.options.moveIcon = this.options.touchMoveIcon;
+			this.options.resizeIcon = this.options.touchResizeIcon;
+		}
+
+		this._shape = shape;
+		L.Util.setOptions(this, options);
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler
+	addHooks: function () {
+		var shape = this._shape;
+		if (this._shape._map) {
+			this._map = this._shape._map;
+			shape.setStyle(shape.options.editing);
+
+			if (shape._map) {
+				this._map = shape._map;
+				if (!this._markerGroup) {
+					this._initMarkers();
+				}
+				this._map.addLayer(this._markerGroup);
+			}
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler
+	removeHooks: function () {
+		var shape = this._shape;
+
+		shape.setStyle(shape.options.original);
+
+		if (shape._map) {
+			this._unbindMarker(this._moveMarker);
+
+			for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
+				this._unbindMarker(this._resizeMarkers[i]);
+			}
+			this._resizeMarkers = null;
+
+			this._map.removeLayer(this._markerGroup);
+			delete this._markerGroup;
+		}
+
+		this._map = null;
+	},
+
+	// @method updateMarkers(): void
+	// Remove the edit markers from this layer
+	updateMarkers: function () {
+		this._markerGroup.clearLayers();
+		this._initMarkers();
+	},
+
+	_initMarkers: function () {
+		if (!this._markerGroup) {
+			this._markerGroup = new L.LayerGroup();
+		}
+
+		// Create center marker
+		this._createMoveMarker();
+
+		// Create edge marker
+		this._createResizeMarker();
+	},
+
+	_createMoveMarker: function () {
+		// Children override
+	},
+
+	_createResizeMarker: function () {
+		// Children override
+	},
+
+	_createMarker: function (latlng, icon) {
+		// Extending L.Marker in TouchEvents.js to include touch.
+		var marker = new L.Marker.Touch(latlng, {
+			draggable: true,
+			icon: icon,
+			zIndexOffset: 10
+		});
+
+		this._bindMarker(marker);
+
+		this._markerGroup.addLayer(marker);
+
+		return marker;
+	},
+
+	_bindMarker: function (marker) {
+		marker
+			.on('dragstart', this._onMarkerDragStart, this)
+			.on('drag', this._onMarkerDrag, this)
+			.on('dragend', this._onMarkerDragEnd, this)
+			.on('touchstart', this._onTouchStart, this)
+			.on('touchmove', this._onTouchMove, this)
+			.on('MSPointerMove', this._onTouchMove, this)
+			.on('touchend', this._onTouchEnd, this)
+			.on('MSPointerUp', this._onTouchEnd, this);
+	},
+
+	_unbindMarker: function (marker) {
+		marker
+			.off('dragstart', this._onMarkerDragStart, this)
+			.off('drag', this._onMarkerDrag, this)
+			.off('dragend', this._onMarkerDragEnd, this)
+			.off('touchstart', this._onTouchStart, this)
+			.off('touchmove', this._onTouchMove, this)
+			.off('MSPointerMove', this._onTouchMove, this)
+			.off('touchend', this._onTouchEnd, this)
+			.off('MSPointerUp', this._onTouchEnd, this);
+	},
+
+	_onMarkerDragStart: function (e) {
+		var marker = e.target;
+		marker.setOpacity(0);
+
+		this._shape.fire('editstart');
+	},
+
+	_fireEdit: function () {
+		this._shape.edited = true;
+		this._shape.fire('edit');
+	},
+
+	_onMarkerDrag: function (e) {
+		var marker = e.target,
+			latlng = marker.getLatLng();
+
+		if (marker === this._moveMarker) {
+			this._move(latlng);
+		} else {
+			this._resize(latlng);
+		}
+
+		this._shape.redraw();
+		this._shape.fire('editdrag');
+	},
+
+	_onMarkerDragEnd: function (e) {
+		var marker = e.target;
+		marker.setOpacity(1);
+
+		this._fireEdit();
+	},
+
+	_onTouchStart: function (e) {
+		L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e);
+
+		if (typeof(this._getCorners) === 'function') {
+			// Save a reference to the opposite point
+			var corners = this._getCorners(),
+				marker = e.target,
+				currentCornerIndex = marker._cornerIndex;
+
+			marker.setOpacity(0);
+
+			// Copyed from Edit.Rectangle.js line 23 _onMarkerDragStart()
+			// Latlng is null otherwise.
+			this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];
+			this._toggleCornerMarkers(0, currentCornerIndex);
+		}
+
+		this._shape.fire('editstart');
+	},
+
+	_onTouchMove: function (e) {
+		var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]),
+			latlng = this._map.layerPointToLatLng(layerPoint),
+			marker = e.target;
+
+		if (marker === this._moveMarker) {
+			this._move(latlng);
+		} else {
+			this._resize(latlng);
+		}
+
+		this._shape.redraw();
+
+		// prevent touchcancel in IOS
+		// e.preventDefault();
+		return false;
+	},
+
+	_onTouchEnd: function (e) {
+		var marker = e.target;
+		marker.setOpacity(1);
+		this.updateMarkers();
+		this._fireEdit();
+	},
+
+	_move: function () {
+		// Children override
+	},
+
+	_resize: function () {
+		// Children override
+	}
+});
+
+
+
+L.Edit = L.Edit || {};
+/**
+ * @class L.Edit.Rectangle
+ * @aka Edit.Rectangle
+ * @inherits L.Edit.SimpleShape
+ */
+L.Edit.Rectangle = L.Edit.SimpleShape.extend({
+	_createMoveMarker: function () {
+		var bounds = this._shape.getBounds(),
+			center = bounds.getCenter();
+
+		this._moveMarker = this._createMarker(center, this.options.moveIcon);
+	},
+
+	_createResizeMarker: function () {
+		var corners = this._getCorners();
+
+		this._resizeMarkers = [];
+
+		for (var i = 0, l = corners.length; i < l; i++) {
+			this._resizeMarkers.push(this._createMarker(corners[i], this.options.resizeIcon));
+			// Monkey in the corner index as we will need to know this for dragging
+			this._resizeMarkers[i]._cornerIndex = i;
+		}
+	},
+
+	_onMarkerDragStart: function (e) {
+		L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e);
+
+		// Save a reference to the opposite point
+		var corners = this._getCorners(),
+			marker = e.target,
+			currentCornerIndex = marker._cornerIndex;
+
+		this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];
+
+		this._toggleCornerMarkers(0, currentCornerIndex);
+	},
+
+	_onMarkerDragEnd: function (e) {
+		var marker = e.target,
+			bounds, center;
+
+		// Reset move marker position to the center
+		if (marker === this._moveMarker) {
+			bounds = this._shape.getBounds();
+			center = bounds.getCenter();
+
+			marker.setLatLng(center);
+		}
+
+		this._toggleCornerMarkers(1);
+
+		this._repositionCornerMarkers();
+
+		L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this, e);
+	},
+
+	_move: function (newCenter) {
+		var latlngs = this._shape._defaultShape ? this._shape._defaultShape() : this._shape.getLatLngs(),
+			bounds = this._shape.getBounds(),
+			center = bounds.getCenter(),
+			offset, newLatLngs = [];
+
+		// Offset the latlngs to the new center
+		for (var i = 0, l = latlngs.length; i < l; i++) {
+			offset = [latlngs[i].lat - center.lat, latlngs[i].lng - center.lng];
+			newLatLngs.push([newCenter.lat + offset[0], newCenter.lng + offset[1]]);
+		}
+
+		this._shape.setLatLngs(newLatLngs);
+
+		// Reposition the resize markers
+		this._repositionCornerMarkers();
+
+		this._map.fire(L.Draw.Event.EDITMOVE, {layer: this._shape});
+	},
+
+	_resize: function (latlng) {
+		var bounds;
+
+		// Update the shape based on the current position of this corner and the opposite point
+		this._shape.setBounds(L.latLngBounds(latlng, this._oppositeCorner));
+
+		// Reposition the move marker
+		bounds = this._shape.getBounds();
+		this._moveMarker.setLatLng(bounds.getCenter());
+
+		this._map.fire(L.Draw.Event.EDITRESIZE, {layer: this._shape});
+	},
+
+	_getCorners: function () {
+		var bounds = this._shape.getBounds(),
+			nw = bounds.getNorthWest(),
+			ne = bounds.getNorthEast(),
+			se = bounds.getSouthEast(),
+			sw = bounds.getSouthWest();
+
+		return [nw, ne, se, sw];
+	},
+
+	_toggleCornerMarkers: function (opacity) {
+		for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
+			this._resizeMarkers[i].setOpacity(opacity);
+		}
+	},
+
+	_repositionCornerMarkers: function () {
+		var corners = this._getCorners();
+
+		for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
+			this._resizeMarkers[i].setLatLng(corners[i]);
+		}
+	}
+});
+
+L.Rectangle.addInitHook(function () {
+	if (L.Edit.Rectangle) {
+		this.editing = new L.Edit.Rectangle(this);
+
+		if (this.options.editable) {
+			this.editing.enable();
+		}
+	}
+});
+
+
+
+L.Edit = L.Edit || {};
+/**
+ * @class L.Edit.CircleMarker
+ * @aka Edit.Circle
+ * @inherits L.Edit.SimpleShape
+ */
+L.Edit.CircleMarker = L.Edit.SimpleShape.extend({
+	_createMoveMarker: function () {
+		var center = this._shape.getLatLng();
+
+		this._moveMarker = this._createMarker(center, this.options.moveIcon);
+	},
+
+	_createResizeMarker: function () {
+		// To avoid an undefined check in L.Edit.SimpleShape.removeHooks
+		this._resizeMarkers = [];
+	},
+
+	_move: function (latlng) {
+		if (this._resizeMarkers.length) {
+			var resizemarkerPoint = this._getResizeMarkerPoint(latlng);
+			// Move the resize marker
+			this._resizeMarkers[0].setLatLng(resizemarkerPoint);
+		}
+
+		// Move the circle
+		this._shape.setLatLng(latlng);
+
+		this._map.fire(L.Draw.Event.EDITMOVE, {layer: this._shape});
+	},
+});
+
+L.CircleMarker.addInitHook(function () {
+	if (L.Edit.CircleMarker) {
+		this.editing = new L.Edit.CircleMarker(this);
+
+		if (this.options.editable) {
+			this.editing.enable();
+		}
+	}
+
+	this.on('add', function () {
+		if (this.editing && this.editing.enabled()) {
+			this.editing.addHooks();
+		}
+	});
+
+	this.on('remove', function () {
+		if (this.editing && this.editing.enabled()) {
+			this.editing.removeHooks();
+		}
+	});
+});
+
+
+
+L.Edit = L.Edit || {};
+/**
+ * @class L.Edit.Circle
+ * @aka Edit.Circle
+ * @inherits L.Edit.CircleMarker
+ */
+L.Edit.Circle = L.Edit.CircleMarker.extend({
+
+	_createResizeMarker: function () {
+		var center = this._shape.getLatLng(),
+			resizemarkerPoint = this._getResizeMarkerPoint(center);
+
+		this._resizeMarkers = [];
+		this._resizeMarkers.push(this._createMarker(resizemarkerPoint, this.options.resizeIcon));
+	},
+
+	_getResizeMarkerPoint: function (latlng) {
+		// From L.shape.getBounds()
+		var delta = this._shape._radius * Math.cos(Math.PI / 4),
+			point = this._map.project(latlng);
+		return this._map.unproject([point.x + delta, point.y - delta]);
+	},
+
+	_resize: function (latlng) {
+		var moveLatLng = this._moveMarker.getLatLng();
+
+		// Calculate the radius based on the version
+		if (L.GeometryUtil.isVersion07x()) {
+			radius = moveLatLng.distanceTo(latlng);
+		} else {
+			radius = this._map.distance(moveLatLng, latlng);
+		}
+		this._shape.setRadius(radius);
+
+		if (this._map.editTooltip) {
+			this._map._editTooltip.updateContent({
+				text: L.drawLocal.edit.handlers.edit.tooltip.subtext + '<br />' + L.drawLocal.edit.handlers.edit.tooltip.text,
+				subtext: L.drawLocal.draw.handlers.circle.radius + ': ' +
+				L.GeometryUtil.readableDistance(radius, true, this.options.feet, this.options.nautic)
+			});
+		}
+
+		this._shape.setRadius(radius);
+
+		this._map.fire(L.Draw.Event.EDITRESIZE, {layer: this._shape});
+	}
+});
+
+L.Circle.addInitHook(function () {
+	if (L.Edit.Circle) {
+		this.editing = new L.Edit.Circle(this);
+
+		if (this.options.editable) {
+			this.editing.enable();
+		}
+	}
+});
+
+
+
+L.Map.mergeOptions({
+	touchExtend: true
+});
+
+/**
+ * @class L.Map.TouchExtend
+ * @aka TouchExtend
+ */
+L.Map.TouchExtend = L.Handler.extend({
+
+	// @method initialize(): void
+	// Sets TouchExtend private accessor variables
+	initialize: function (map) {
+		this._map = map;
+		this._container = map._container;
+		this._pane = map._panes.overlayPane;
+	},
+
+	// @method addHooks(): void
+	// Adds dom listener events to the map container
+	addHooks: function () {
+		L.DomEvent.on(this._container, 'touchstart', this._onTouchStart, this);
+		L.DomEvent.on(this._container, 'touchend', this._onTouchEnd, this);
+		L.DomEvent.on(this._container, 'touchmove', this._onTouchMove, this);
+		if (this._detectIE()) {
+			L.DomEvent.on(this._container, 'MSPointerDown', this._onTouchStart, this);
+			L.DomEvent.on(this._container, 'MSPointerUp', this._onTouchEnd, this);
+			L.DomEvent.on(this._container, 'MSPointerMove', this._onTouchMove, this);
+			L.DomEvent.on(this._container, 'MSPointerCancel', this._onTouchCancel, this);
+
+		} else {
+			L.DomEvent.on(this._container, 'touchcancel', this._onTouchCancel, this);
+			L.DomEvent.on(this._container, 'touchleave', this._onTouchLeave, this);
+		}
+	},
+
+	// @method removeHooks(): void
+	// Removes dom listener events from the map container
+	removeHooks: function () {
+		L.DomEvent.off(this._container, 'touchstart', this._onTouchStart, this);
+		L.DomEvent.off(this._container, 'touchend', this._onTouchEnd, this);
+		L.DomEvent.off(this._container, 'touchmove', this._onTouchMove, this);
+		if (this._detectIE()) {
+			L.DomEvent.off(this._container, 'MSPointerDown', this._onTouchStart, this);
+			L.DomEvent.off(this._container, 'MSPointerUp', this._onTouchEnd, this);
+			L.DomEvent.off(this._container, 'MSPointerMove', this._onTouchMove, this);
+			L.DomEvent.off(this._container, 'MSPointerCancel', this._onTouchCancel, this);
+		} else {
+			L.DomEvent.off(this._container, 'touchcancel', this._onTouchCancel, this);
+			L.DomEvent.off(this._container, 'touchleave', this._onTouchLeave, this);
+		}
+	},
+
+	_touchEvent: function (e, type) {
+		// #TODO: fix the pageX error that is do a bug in Android where a single touch triggers two click events
+		// _filterClick is what leaflet uses as a workaround.
+		// This is a problem with more things than just android. Another problem is touchEnd has no touches in
+		// its touch list.
+		var touchEvent = {};
+		if (typeof e.touches !== 'undefined') {
+			if (!e.touches.length) {
+				return;
+			}
+			touchEvent = e.touches[0];
+		} else if (e.pointerType === 'touch') {
+			touchEvent = e;
+			if (!this._filterClick(e)) {
+				return;
+			}
+		} else {
+			return;
+		}
+
+		var containerPoint = this._map.mouseEventToContainerPoint(touchEvent),
+			layerPoint = this._map.mouseEventToLayerPoint(touchEvent),
+			latlng = this._map.layerPointToLatLng(layerPoint);
+
+		this._map.fire(type, {
+			latlng: latlng,
+			layerPoint: layerPoint,
+			containerPoint: containerPoint,
+			pageX: touchEvent.pageX,
+			pageY: touchEvent.pageY,
+			originalEvent: e
+		});
+	},
+
+	/** Borrowed from Leaflet and modified for bool ops **/
+	_filterClick: function (e) {
+		var timeStamp = (e.timeStamp || e.originalEvent.timeStamp),
+			elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);
+
+		// are they closer together than 500ms yet more than 100ms?
+		// Android typically triggers them ~300ms apart while multiple listeners
+		// on the same event should be triggered far faster;
+		// or check if click is simulated on the element, and if it is, reject any non-simulated events
+		if ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) {
+			L.DomEvent.stop(e);
+			return false;
+		}
+		L.DomEvent._lastClick = timeStamp;
+		return true;
+	},
+
+	_onTouchStart: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchstart';
+		this._touchEvent(e, type);
+
+	},
+
+	_onTouchEnd: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchend';
+		this._touchEvent(e, type);
+	},
+
+	_onTouchCancel: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchcancel';
+		if (this._detectIE()) {
+			type = 'pointercancel';
+		}
+		this._touchEvent(e, type);
+	},
+
+	_onTouchLeave: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchleave';
+		this._touchEvent(e, type);
+	},
+
+	_onTouchMove: function (e) {
+		if (!this._map._loaded) {
+			return;
+		}
+
+		var type = 'touchmove';
+		this._touchEvent(e, type);
+	},
+
+	_detectIE: function () {
+		var ua = window.navigator.userAgent;
+
+		var msie = ua.indexOf('MSIE ');
+		if (msie > 0) {
+			// IE 10 or older => return version number
+			return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
+		}
+
+		var trident = ua.indexOf('Trident/');
+		if (trident > 0) {
+			// IE 11 => return version number
+			var rv = ua.indexOf('rv:');
+			return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
+		}
+
+		var edge = ua.indexOf('Edge/');
+		if (edge > 0) {
+			// IE 12 => return version number
+			return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
+		}
+
+		// other browser
+		return false;
+	}
+});
+
+L.Map.addInitHook('addHandler', 'touchExtend', L.Map.TouchExtend);
+
+
+/**
+ * @class L.Marker.Touch
+ * @aka Marker.Touch
+ *
+ * This isn't full Touch support. This is just to get markers to also support dom touch events after creation
+ * #TODO: find a better way of getting markers to support touch.
+ */
+L.Marker.Touch = L.Marker.extend({
+
+	_initInteraction: function () {
+		if (!this.addInteractiveTarget) {
+			// 0.7.x support
+			return this._initInteractionLegacy();
+		}
+		// TODO this may need be updated to re-add touch events for 1.0+
+		return L.Marker.prototype._initInteraction.apply(this);
+	},
+
+	// This is an exact copy of https://github.com/Leaflet/Leaflet/blob/v0.7/src/layer/marker/Marker.js
+	// with the addition of the touch events
+	_initInteractionLegacy: function () {
+
+		if (!this.options.clickable) {
+			return;
+		}
+
+		// TODO refactor into something shared with Map/Path/etc. to DRY it up
+
+		var icon = this._icon,
+			events = ['dblclick',
+				'mousedown',
+				'mouseover',
+				'mouseout',
+				'contextmenu',
+				'touchstart',
+				'touchend',
+				'touchmove'];
+		if (this._detectIE) {
+			events.concat(['MSPointerDown',
+				'MSPointerUp',
+				'MSPointerMove',
+				'MSPointerCancel']);
+		} else {
+			events.concat(['touchcancel']);
+		}
+
+		L.DomUtil.addClass(icon, 'leaflet-clickable');
+		L.DomEvent.on(icon, 'click', this._onMouseClick, this);
+		L.DomEvent.on(icon, 'keypress', this._onKeyPress, this);
+
+		for (var i = 0; i < events.length; i++) {
+			L.DomEvent.on(icon, events[i], this._fireMouseEvent, this);
+		}
+
+		if (L.Handler.MarkerDrag) {
+			this.dragging = new L.Handler.MarkerDrag(this);
+
+			if (this.options.draggable) {
+				this.dragging.enable();
+			}
+		}
+	},
+
+	_detectIE: function () {
+		var ua = window.navigator.userAgent;
+
+		var msie = ua.indexOf('MSIE ');
+		if (msie > 0) {
+			// IE 10 or older => return version number
+			return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
+		}
+
+		var trident = ua.indexOf('Trident/');
+		if (trident > 0) {
+			// IE 11 => return version number
+			var rv = ua.indexOf('rv:');
+			return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
+		}
+
+		var edge = ua.indexOf('Edge/');
+		if (edge > 0) {
+			// IE 12 => return version number
+			return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
+		}
+
+		// other browser
+		return false;
+	}
+});
+
+
+
+/**
+ * @class L.LatLngUtil
+ * @aka LatLngUtil
+ */
+L.LatLngUtil = {
+	// Clones a LatLngs[], returns [][]
+
+	// @method cloneLatLngs(LatLngs[]): L.LatLngs[]
+	// Clone the latLng point or points or nested points and return an array with those points
+	cloneLatLngs: function (latlngs) {
+		var clone = [];
+		for (var i = 0, l = latlngs.length; i < l; i++) {
+			// Check for nested array (Polyline/Polygon)
+			if (Array.isArray(latlngs[i])) {
+				clone.push(L.LatLngUtil.cloneLatLngs(latlngs[i]));
+			} else {
+				clone.push(this.cloneLatLng(latlngs[i]));
+			}
+		}
+		return clone;
+	},
+
+	// @method cloneLatLng(LatLng): L.LatLng
+	// Clone the latLng and return a new LatLng object.
+	cloneLatLng: function (latlng) {
+		return L.latLng(latlng.lat, latlng.lng);
+	}
+};
+
+
+
+(function () {
+
+	var defaultPrecision = {
+		km: 2,
+		ha: 2,
+		m: 0,
+		mi: 2,
+		ac: 2,
+		yd: 0,
+		ft: 0,
+		nm: 2
+	};
+
+
+	/**
+	 * @class L.GeometryUtil
+	 * @aka GeometryUtil
+	 */
+	L.GeometryUtil = L.extend(L.GeometryUtil || {}, {
+		// Ported from the OpenLayers implementation. See https://github.com/openlayers/openlayers/blob/master/lib/OpenLayers/Geometry/LinearRing.js#L270
+
+		// @method geodesicArea(): number
+		geodesicArea: function (latLngs) {
+			var pointsCount = latLngs.length,
+				area = 0.0,
+				d2r = Math.PI / 180,
+				p1, p2;
+
+			if (pointsCount > 2) {
+				for (var i = 0; i < pointsCount; i++) {
+					p1 = latLngs[i];
+					p2 = latLngs[(i + 1) % pointsCount];
+					area += ((p2.lng - p1.lng) * d2r) *
+						(2 + Math.sin(p1.lat * d2r) + Math.sin(p2.lat * d2r));
+				}
+				area = area * 6378137.0 * 6378137.0 / 2.0;
+			}
+
+			return Math.abs(area);
+		},
+
+		// @method formattedNumber(n, precision): string
+		// Returns n in specified number format (if defined) and precision
+		formattedNumber: function (n, precision) {
+			var formatted = parseFloat(n).toFixed(precision),
+				format = L.drawLocal.format && L.drawLocal.format.numeric,
+				delimiters = format && format.delimiters,
+				thousands = delimiters && delimiters.thousands,
+				decimal = delimiters && delimiters.decimal;
+
+			if (thousands || decimal) {
+				var splitValue = formatted.split('.');
+				formatted = thousands ? splitValue[0].replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + thousands) : splitValue[0];
+				decimal = decimal || '.';
+				if (splitValue.length > 1) {
+					formatted = formatted + decimal + splitValue[1];
+				}
+			}
+
+			return formatted;
+		},
+
+		// @method readableArea(area, isMetric, precision): string
+		// Returns a readable area string in yards or metric.
+		// The value will be rounded as defined by the precision option object.
+		readableArea: function (area, isMetric, precision) {
+			var areaStr,
+				units,
+				precision = L.Util.extend({}, defaultPrecision, precision);
+
+			if (isMetric) {
+				units = ['ha', 'm'];
+				type = typeof isMetric;
+				if (type === 'string') {
+					units = [isMetric];
+				} else if (type !== 'boolean') {
+					units = isMetric;
+				}
+
+				if (area >= 1000000 && units.indexOf('km') !== -1) {
+					areaStr = L.GeometryUtil.formattedNumber(area * 0.000001, precision['km']) + ' km²';
+				} else if (area >= 10000 && units.indexOf('ha') !== -1) {
+					areaStr = L.GeometryUtil.formattedNumber(area * 0.0001, precision['ha']) + ' ha';
+				} else {
+					areaStr = L.GeometryUtil.formattedNumber(area, precision['m']) + ' m²';
+				}
+			} else {
+				area /= 0.836127; // Square yards in 1 meter
+
+				if (area >= 3097600) { //3097600 square yards in 1 square mile
+					areaStr = L.GeometryUtil.formattedNumber(area / 3097600, precision['mi']) + ' mi²';
+				} else if (area >= 4840) { //4840 square yards in 1 acre
+					areaStr = L.GeometryUtil.formattedNumber(area / 4840, precision['ac']) + ' acres';
+				} else {
+					areaStr = L.GeometryUtil.formattedNumber(area, precision['yd']) + ' yd²';
+				}
+			}
+
+			return areaStr;
+		},
+
+		// @method readableDistance(distance, units): string
+		// Converts a metric distance to one of [ feet, nauticalMile, metric or yards ] string
+		//
+		// @alternative
+		// @method readableDistance(distance, isMetric, useFeet, isNauticalMile, precision): string
+		// Converts metric distance to distance string.
+		// The value will be rounded as defined by the precision option object.
+		readableDistance: function (distance, isMetric, isFeet, isNauticalMile, precision) {
+			var distanceStr,
+				units,
+				precision = L.Util.extend({}, defaultPrecision, precision);
+
+			if (isMetric) {
+				units = typeof isMetric == 'string' ? isMetric : 'metric';
+			} else if (isFeet) {
+				units = 'feet';
+			} else if (isNauticalMile) {
+				units = 'nauticalMile';
+			} else {
+				units = 'yards';
+			}
+
+			switch (units) {
+				case 'metric':
+					// show metres when distance is < 1km, then show km
+					if (distance > 1000) {
+						distanceStr = L.GeometryUtil.formattedNumber(distance / 1000, precision['km']) + ' km';
+					} else {
+						distanceStr = L.GeometryUtil.formattedNumber(distance, precision['m']) + ' m';
+					}
+					break;
+				case 'feet':
+					distance *= 1.09361 * 3;
+					distanceStr = L.GeometryUtil.formattedNumber(distance, precision['ft']) + ' ft';
+
+					break;
+				case 'nauticalMile':
+					distance *= 0.53996;
+					distanceStr = L.GeometryUtil.formattedNumber(distance / 1000, precision['nm']) + ' nm';
+					break;
+				case 'yards':
+				default:
+					distance *= 1.09361;
+
+					if (distance > 1760) {
+						distanceStr = L.GeometryUtil.formattedNumber(distance / 1760, precision['mi']) + ' miles';
+					} else {
+						distanceStr = L.GeometryUtil.formattedNumber(distance, precision['yd']) + ' yd';
+					}
+					break;
+			}
+			return distanceStr;
+		},
+
+		// @method isVersion07x(): boolean
+		// Returns true if the Leaflet version is 0.7.x, false otherwise.
+		isVersion07x: function () {
+			var version = L.version.split('.');
+			//If Version is == 0.7.*
+			return parseInt(version[0], 10) === 0 && parseInt(version[1], 10) === 7;
+		},
+	});
+
+})();
+
+
+
+/**
+ * @class L.LineUtil
+ * @aka Util
+ * @aka L.Utils
+ */
+L.Util.extend(L.LineUtil, {
+
+	// @method segmentsIntersect(): boolean
+	// Checks to see if two line segments intersect. Does not handle degenerate cases.
+	// http://compgeom.cs.uiuc.edu/~jeffe/teaching/373/notes/x06-sweepline.pdf
+	segmentsIntersect: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2, /*Point*/ p3) {
+		return this._checkCounterclockwise(p, p2, p3) !==
+			this._checkCounterclockwise(p1, p2, p3) &&
+			this._checkCounterclockwise(p, p1, p2) !==
+			this._checkCounterclockwise(p, p1, p3);
+	},
+
+	// check to see if points are in counterclockwise order
+	_checkCounterclockwise: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {
+		return (p2.y - p.y) * (p1.x - p.x) > (p1.y - p.y) * (p2.x - p.x);
+	}
+});
+
+
+
+/**
+ * @class L.Polyline
+ * @aka Polyline
+ */
+L.Polyline.include({
+
+	// @method intersects(): boolean
+	// Check to see if this polyline has any linesegments that intersect.
+	// NOTE: does not support detecting intersection for degenerate cases.
+	intersects: function () {
+		var points = this._getProjectedPoints(),
+			len = points ? points.length : 0,
+			i, p, p1;
+
+		if (this._tooFewPointsForIntersection()) {
+			return false;
+		}
+
+		for (i = len - 1; i >= 3; i--) {
+			p = points[i - 1];
+			p1 = points[i];
+
+
+			if (this._lineSegmentsIntersectsRange(p, p1, i - 2)) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	// @method newLatLngIntersects(): boolean
+	// Check for intersection if new latlng was added to this polyline.
+	// NOTE: does not support detecting intersection for degenerate cases.
+	newLatLngIntersects: function (latlng, skipFirst) {
+		// Cannot check a polyline for intersecting lats/lngs when not added to the map
+		if (!this._map) {
+			return false;
+		}
+
+		return this.newPointIntersects(this._map.latLngToLayerPoint(latlng), skipFirst);
+	},
+
+	// @method newPointIntersects(): boolean
+	// Check for intersection if new point was added to this polyline.
+	// newPoint must be a layer point.
+	// NOTE: does not support detecting intersection for degenerate cases.
+	newPointIntersects: function (newPoint, skipFirst) {
+		var points = this._getProjectedPoints(),
+			len = points ? points.length : 0,
+			lastPoint = points ? points[len - 1] : null,
+			// The previous previous line segment. Previous line segment doesn't need testing.
+			maxIndex = len - 2;
+
+		if (this._tooFewPointsForIntersection(1)) {
+			return false;
+		}
+
+		return this._lineSegmentsIntersectsRange(lastPoint, newPoint, maxIndex, skipFirst ? 1 : 0);
+	},
+
+	// Polylines with 2 sides can only intersect in cases where points are collinear (we don't support detecting these).
+	// Cannot have intersection when < 3 line segments (< 4 points)
+	_tooFewPointsForIntersection: function (extraPoints) {
+		var points = this._getProjectedPoints(),
+			len = points ? points.length : 0;
+		// Increment length by extraPoints if present
+		len += extraPoints || 0;
+
+		return !points || len <= 3;
+	},
+
+	// Checks a line segment intersections with any line segments before its predecessor.
+	// Don't need to check the predecessor as will never intersect.
+	_lineSegmentsIntersectsRange: function (p, p1, maxIndex, minIndex) {
+		var points = this._getProjectedPoints(),
+			p2, p3;
+
+		minIndex = minIndex || 0;
+
+		// Check all previous line segments (beside the immediately previous) for intersections
+		for (var j = maxIndex; j > minIndex; j--) {
+			p2 = points[j - 1];
+			p3 = points[j];
+
+			if (L.LineUtil.segmentsIntersect(p, p1, p2, p3)) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	_getProjectedPoints: function () {
+		if (!this._defaultShape) {
+			return this._originalPoints;
+		}
+		var points = [],
+			_shape = this._defaultShape();
+
+		for (var i = 0; i < _shape.length; i++) {
+			points.push(this._map.latLngToLayerPoint(_shape[i]));
+		}
+		return points;
+	}
+});
+
+
+
+/**
+ * @class L.Polygon
+ * @aka Polygon
+ */
+L.Polygon.include({
+
+	// @method intersects(): boolean
+	// Checks a polygon for any intersecting line segments. Ignores holes.
+	intersects: function () {
+		var polylineIntersects,
+			points = this._getProjectedPoints(),
+			len, firstPoint, lastPoint, maxIndex;
+
+		if (this._tooFewPointsForIntersection()) {
+			return false;
+		}
+
+		polylineIntersects = L.Polyline.prototype.intersects.call(this);
+
+		// If already found an intersection don't need to check for any more.
+		if (polylineIntersects) {
+			return true;
+		}
+
+		len = points.length;
+		firstPoint = points[0];
+		lastPoint = points[len - 1];
+		maxIndex = len - 2;
+
+		// Check the line segment between last and first point. Don't need to check the first line segment (minIndex = 1)
+		return this._lineSegmentsIntersectsRange(lastPoint, firstPoint, maxIndex, 1);
+	}
+});
+
+
+
+/**
+ * @class L.Control.Draw
+ * @aka L.Draw
+ */
+L.Control.Draw = L.Control.extend({
+
+	// Options
+	options: {
+		position: 'topleft',
+		draw: {},
+		edit: false
+	},
+
+	// @method initialize(): void
+	// Initializes draw control, toolbars from the options
+	initialize: function (options) {
+		if (L.version < '0.7') {
+			throw new Error('Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/');
+		}
+
+		L.Control.prototype.initialize.call(this, options);
+
+		var toolbar;
+
+		this._toolbars = {};
+
+		// Initialize toolbars
+		if (L.DrawToolbar && this.options.draw) {
+			toolbar = new L.DrawToolbar(this.options.draw);
+
+			this._toolbars[L.DrawToolbar.TYPE] = toolbar;
+
+			// Listen for when toolbar is enabled
+			this._toolbars[L.DrawToolbar.TYPE].on('enable', this._toolbarEnabled, this);
+		}
+
+		if (L.EditToolbar && this.options.edit) {
+			toolbar = new L.EditToolbar(this.options.edit);
+
+			this._toolbars[L.EditToolbar.TYPE] = toolbar;
+
+			// Listen for when toolbar is enabled
+			this._toolbars[L.EditToolbar.TYPE].on('enable', this._toolbarEnabled, this);
+		}
+		L.toolbar = this; //set global var for editing the toolbar
+	},
+
+	// @method onAdd(): container
+	// Adds the toolbar container to the map
+	onAdd: function (map) {
+		var container = L.DomUtil.create('div', 'leaflet-draw'),
+			addedTopClass = false,
+			topClassName = 'leaflet-draw-toolbar-top',
+			toolbarContainer;
+
+		for (var toolbarId in this._toolbars) {
+			if (this._toolbars.hasOwnProperty(toolbarId)) {
+				toolbarContainer = this._toolbars[toolbarId].addToolbar(map);
+
+				if (toolbarContainer) {
+					// Add class to the first toolbar to remove the margin
+					if (!addedTopClass) {
+						if (!L.DomUtil.hasClass(toolbarContainer, topClassName)) {
+							L.DomUtil.addClass(toolbarContainer.childNodes[0], topClassName);
+						}
+						addedTopClass = true;
+					}
+
+					container.appendChild(toolbarContainer);
+				}
+			}
+		}
+
+		return container;
+	},
+
+	// @method onRemove(): void
+	// Removes the toolbars from the map toolbar container
+	onRemove: function () {
+		for (var toolbarId in this._toolbars) {
+			if (this._toolbars.hasOwnProperty(toolbarId)) {
+				this._toolbars[toolbarId].removeToolbar();
+			}
+		}
+	},
+
+	// @method setDrawingOptions(options): void
+	// Sets options to all toolbar instances
+	setDrawingOptions: function (options) {
+		for (var toolbarId in this._toolbars) {
+			if (this._toolbars[toolbarId] instanceof L.DrawToolbar) {
+				this._toolbars[toolbarId].setOptions(options);
+			}
+		}
+	},
+
+	_toolbarEnabled: function (e) {
+		var enabledToolbar = e.target;
+
+		for (var toolbarId in this._toolbars) {
+			if (this._toolbars[toolbarId] !== enabledToolbar) {
+				this._toolbars[toolbarId].disable();
+			}
+		}
+	}
+});
+
+L.Map.mergeOptions({
+	drawControlTooltips: true,
+	drawControl: false
+});
+
+L.Map.addInitHook(function () {
+	if (this.options.drawControl) {
+		this.drawControl = new L.Control.Draw();
+		this.addControl(this.drawControl);
+	}
+});
+
+
+
+/**
+ * @class L.Draw.Toolbar
+ * @aka Toolbar
+ *
+ * The toolbar class of the API — it is used to create the ui
+ * This will be depreciated
+ *
+ * @example
+ *
+ * ```js
+ *    var toolbar = L.Toolbar();
+ *    toolbar.addToolbar(map);
+ * ```
+ *
+ * ### Disabling a toolbar
+ *
+ * If you do not want a particular toolbar in your app you can turn it off by setting the toolbar to false.
+ *
+ * ```js
+ *      var drawControl = new L.Control.Draw({
+ *          draw: false,
+ *          edit: {
+ *              featureGroup: editableLayers
+ *          }
+ *      });
+ * ```
+ *
+ * ### Disabling a toolbar item
+ *
+ * If you want to turn off a particular toolbar item, set it to false. The following disables drawing polygons and
+ * markers. It also turns off the ability to edit layers.
+ *
+ * ```js
+ *      var drawControl = new L.Control.Draw({
+ *          draw: {
+ *              polygon: false,
+ *              marker: false
+ *          },
+ *          edit: {
+ *              featureGroup: editableLayers,
+ *              edit: false
+ *          }
+ *      });
+ * ```
+ */
+L.Toolbar = L.Class.extend({
+	// @section Methods for modifying the toolbar
+
+	// @method initialize(options): void
+	// Toolbar constructor
+	initialize: function (options) {
+		L.setOptions(this, options);
+
+		this._modes = {};
+		this._actionButtons = [];
+		this._activeMode = null;
+
+		var version = L.version.split('.');
+		//If Version is >= 1.2.0
+		if (parseInt(version[0], 10) === 1 && parseInt(version[1], 10) >= 2) {
+			L.Toolbar.include(L.Evented.prototype);
+		} else {
+			L.Toolbar.include(L.Mixin.Events);
+		}
+	},
+
+	// @method enabled(): boolean
+	// Gets a true/false of whether the toolbar is enabled
+	enabled: function () {
+		return this._activeMode !== null;
+	},
+
+	// @method disable(): void
+	// Disables the toolbar
+	disable: function () {
+		if (!this.enabled()) {
+			return;
+		}
+
+		this._activeMode.handler.disable();
+	},
+
+	// @method addToolbar(map): L.DomUtil
+	// Adds the toolbar to the map and returns the toolbar dom element
+	addToolbar: function (map) {
+		var container = L.DomUtil.create('div', 'leaflet-draw-section'),
+			buttonIndex = 0,
+			buttonClassPrefix = this._toolbarClass || '',
+			modeHandlers = this.getModeHandlers(map),
+			i;
+
+		this._toolbarContainer = L.DomUtil.create('div', 'leaflet-draw-toolbar leaflet-bar');
+		this._map = map;
+
+		for (i = 0; i < modeHandlers.length; i++) {
+			if (modeHandlers[i].enabled) {
+				this._initModeHandler(
+					modeHandlers[i].handler,
+					this._toolbarContainer,
+					buttonIndex++,
+					buttonClassPrefix,
+					modeHandlers[i].title
+				);
+			}
+		}
+
+		// if no buttons were added, do not add the toolbar
+		if (!buttonIndex) {
+			return;
+		}
+
+		// Save button index of the last button, -1 as we would have ++ after the last button
+		this._lastButtonIndex = --buttonIndex;
+
+		// Create empty actions part of the toolbar
+		this._actionsContainer = L.DomUtil.create('ul', 'leaflet-draw-actions');
+
+		// Add draw and cancel containers to the control container
+		container.appendChild(this._toolbarContainer);
+		container.appendChild(this._actionsContainer);
+
+		return container;
+	},
+
+	// @method removeToolbar(): void
+	// Removes the toolbar and drops the handler event listeners
+	removeToolbar: function () {
+		// Dispose each handler
+		for (var handlerId in this._modes) {
+			if (this._modes.hasOwnProperty(handlerId)) {
+				// Unbind handler button
+				this._disposeButton(
+					this._modes[handlerId].button,
+					this._modes[handlerId].handler.enable,
+					this._modes[handlerId].handler
+				);
+
+				// Make sure is disabled
+				this._modes[handlerId].handler.disable();
+
+				// Unbind handler
+				this._modes[handlerId].handler
+					.off('enabled', this._handlerActivated, this)
+					.off('disabled', this._handlerDeactivated, this);
+			}
+		}
+		this._modes = {};
+
+		// Dispose the actions toolbar
+		for (var i = 0, l = this._actionButtons.length; i < l; i++) {
+			this._disposeButton(
+				this._actionButtons[i].button,
+				this._actionButtons[i].callback,
+				this
+			);
+		}
+		this._actionButtons = [];
+		this._actionsContainer = null;
+	},
+
+	_initModeHandler: function (handler, container, buttonIndex, classNamePredix, buttonTitle) {
+		var type = handler.type;
+
+		this._modes[type] = {};
+
+		this._modes[type].handler = handler;
+
+		this._modes[type].button = this._createButton({
+			type: type,
+			title: buttonTitle,
+			className: classNamePredix + '-' + type,
+			container: container,
+			callback: this._modes[type].handler.enable,
+			context: this._modes[type].handler
+		});
+
+		this._modes[type].buttonIndex = buttonIndex;
+
+		this._modes[type].handler
+			.on('enabled', this._handlerActivated, this)
+			.on('disabled', this._handlerDeactivated, this);
+	},
+
+	/* Detect iOS based on browser User Agent, based on:
+	 * http://stackoverflow.com/a/9039885 */
+	_detectIOS: function () {
+		var iOS = (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream);
+		return iOS;
+	},
+
+	_createButton: function (options) {
+
+		var link = L.DomUtil.create('a', options.className || '', options.container);
+		// Screen reader tag
+		var sr = L.DomUtil.create('span', 'sr-only', options.container);
+
+		link.href = '#';
+		link.appendChild(sr);
+
+		if (options.title) {
+			link.title = options.title;
+			sr.innerHTML = options.title;
+		}
+
+		if (options.text) {
+			link.innerHTML = options.text;
+			sr.innerHTML = options.text;
+		}
+
+		/* iOS does not use click events */
+		var buttonEvent = this._detectIOS() ? 'touchstart' : 'click';
+
+		L.DomEvent
+			.on(link, 'click', L.DomEvent.stopPropagation)
+			.on(link, 'mousedown', L.DomEvent.stopPropagation)
+			.on(link, 'dblclick', L.DomEvent.stopPropagation)
+			.on(link, 'touchstart', L.DomEvent.stopPropagation)
+			.on(link, 'click', L.DomEvent.preventDefault)
+			.on(link, buttonEvent, options.callback, options.context);
+
+		return link;
+	},
+
+	_disposeButton: function (button, callback) {
+		/* iOS does not use click events */
+		var buttonEvent = this._detectIOS() ? 'touchstart' : 'click';
+
+		L.DomEvent
+			.off(button, 'click', L.DomEvent.stopPropagation)
+			.off(button, 'mousedown', L.DomEvent.stopPropagation)
+			.off(button, 'dblclick', L.DomEvent.stopPropagation)
+			.off(button, 'touchstart', L.DomEvent.stopPropagation)
+			.off(button, 'click', L.DomEvent.preventDefault)
+			.off(button, buttonEvent, callback);
+	},
+
+	_handlerActivated: function (e) {
+		// Disable active mode (if present)
+		this.disable();
+
+		// Cache new active feature
+		this._activeMode = this._modes[e.handler];
+
+		L.DomUtil.addClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled');
+
+		this._showActionsToolbar();
+
+		this.fire('enable');
+	},
+
+	_handlerDeactivated: function () {
+		this._hideActionsToolbar();
+
+		L.DomUtil.removeClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled');
+
+		this._activeMode = null;
+
+		this.fire('disable');
+	},
+
+	_createActions: function (handler) {
+		var container = this._actionsContainer,
+			buttons = this.getActions(handler),
+			l = buttons.length,
+			li, di, dl, button;
+
+		// Dispose the actions toolbar (todo: dispose only not used buttons)
+		for (di = 0, dl = this._actionButtons.length; di < dl; di++) {
+			this._disposeButton(this._actionButtons[di].button, this._actionButtons[di].callback);
+		}
+		this._actionButtons = [];
+
+		// Remove all old buttons
+		while (container.firstChild) {
+			container.removeChild(container.firstChild);
+		}
+
+		for (var i = 0; i < l; i++) {
+			if ('enabled' in buttons[i] && !buttons[i].enabled) {
+				continue;
+			}
+
+			li = L.DomUtil.create('li', '', container);
+
+			button = this._createButton({
+				title: buttons[i].title,
+				text: buttons[i].text,
+				container: li,
+				callback: buttons[i].callback,
+				context: buttons[i].context
+			});
+
+			this._actionButtons.push({
+				button: button,
+				callback: buttons[i].callback
+			});
+		}
+	},
+
+	_showActionsToolbar: function () {
+		var buttonIndex = this._activeMode.buttonIndex,
+			lastButtonIndex = this._lastButtonIndex,
+			toolbarPosition = this._activeMode.button.offsetTop - 1;
+
+		// Recreate action buttons on every click
+		this._createActions(this._activeMode.handler);
+
+		// Correctly position the cancel button
+		this._actionsContainer.style.top = toolbarPosition + 'px';
+
+		if (buttonIndex === 0) {
+			L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop');
+			L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-top');
+		}
+
+		if (buttonIndex === lastButtonIndex) {
+			L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom');
+			L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-bottom');
+		}
+
+		this._actionsContainer.style.display = 'block';
+		this._map.fire(L.Draw.Event.TOOLBAROPENED);
+	},
+
+	_hideActionsToolbar: function () {
+		this._actionsContainer.style.display = 'none';
+
+		L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop');
+		L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom');
+		L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-top');
+		L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-bottom');
+		this._map.fire(L.Draw.Event.TOOLBARCLOSED);
+	}
+});
+
+
+
+L.Draw = L.Draw || {};
+/**
+ * @class L.Draw.Tooltip
+ * @aka Tooltip
+ *
+ * The tooltip class — it is used to display the tooltip while drawing
+ * This will be depreciated
+ *
+ * @example
+ *
+ * ```js
+ *    var tooltip = L.Draw.Tooltip();
+ * ```
+ *
+ */
+L.Draw.Tooltip = L.Class.extend({
+
+	// @section Methods for modifying draw state
+
+	// @method initialize(map): void
+	// Tooltip constructor
+	initialize: function (map) {
+		this._map = map;
+		this._popupPane = map._panes.popupPane;
+		this._visible = false;
+
+		this._container = map.options.drawControlTooltips ?
+			L.DomUtil.create('div', 'leaflet-draw-tooltip', this._popupPane) : null;
+		this._singleLineLabel = false;
+
+		this._map.on('mouseout', this._onMouseOut, this);
+	},
+
+	// @method dispose(): void
+	// Remove Tooltip DOM and unbind events
+	dispose: function () {
+		this._map.off('mouseout', this._onMouseOut, this);
+
+		if (this._container) {
+			this._popupPane.removeChild(this._container);
+			this._container = null;
+		}
+	},
+
+	// @method updateContent(labelText): this
+	// Changes the tooltip text to string in function call
+	updateContent: function (labelText) {
+		if (!this._container) {
+			return this;
+		}
+		labelText.subtext = labelText.subtext || '';
+
+		// update the vertical position (only if changed)
+		if (labelText.subtext.length === 0 && !this._singleLineLabel) {
+			L.DomUtil.addClass(this._container, 'leaflet-draw-tooltip-single');
+			this._singleLineLabel = true;
+		}
+		else if (labelText.subtext.length > 0 && this._singleLineLabel) {
+			L.DomUtil.removeClass(this._container, 'leaflet-draw-tooltip-single');
+			this._singleLineLabel = false;
+		}
+
+		this._container.innerHTML =
+			(labelText.subtext.length > 0 ?
+				'<span class="leaflet-draw-tooltip-subtext">' + labelText.subtext + '</span>' + '<br />' : '') +
+			'<span>' + labelText.text + '</span>';
+
+		if (!labelText.text && !labelText.subtext) {
+			this._visible = false;
+			this._container.style.visibility = 'hidden';
+		} else {
+			this._visible = true;
+			this._container.style.visibility = 'inherit';
+		}
+
+		return this;
+	},
+
+	// @method updatePosition(latlng): this
+	// Changes the location of the tooltip
+	updatePosition: function (latlng) {
+		var pos = this._map.latLngToLayerPoint(latlng),
+			tooltipContainer = this._container;
+
+		if (this._container) {
+			if (this._visible) {
+				tooltipContainer.style.visibility = 'inherit';
+			}
+			L.DomUtil.setPosition(tooltipContainer, pos);
+		}
+
+		return this;
+	},
+
+	// @method showAsError(): this
+	// Applies error class to tooltip
+	showAsError: function () {
+		if (this._container) {
+			L.DomUtil.addClass(this._container, 'leaflet-error-draw-tooltip');
+		}
+		return this;
+	},
+
+	// @method removeError(): this
+	// Removes the error class from the tooltip
+	removeError: function () {
+		if (this._container) {
+			L.DomUtil.removeClass(this._container, 'leaflet-error-draw-tooltip');
+		}
+		return this;
+	},
+
+	_onMouseOut: function () {
+		if (this._container) {
+			this._container.style.visibility = 'hidden';
+		}
+	}
+});
+
+
+
+/**
+ * @class L.DrawToolbar
+ * @aka Toolbar
+ */
+L.DrawToolbar = L.Toolbar.extend({
+
+	statics: {
+		TYPE: 'draw'
+	},
+
+	options: {
+		polyline: {},
+		polygon: {},
+		rectangle: {},
+		circle: {},
+		marker: {},
+		circlemarker: {}
+	},
+
+	// @method initialize(): void
+	initialize: function (options) {
+		// Ensure that the options are merged correctly since L.extend is only shallow
+		for (var type in this.options) {
+			if (this.options.hasOwnProperty(type)) {
+				if (options[type]) {
+					options[type] = L.extend({}, this.options[type], options[type]);
+				}
+			}
+		}
+
+		this._toolbarClass = 'leaflet-draw-draw';
+		L.Toolbar.prototype.initialize.call(this, options);
+	},
+
+	// @method getModeHandlers(): object
+	// Get mode handlers information
+	getModeHandlers: function (map) {
+		return [
+			{
+				enabled: this.options.polyline,
+				handler: new L.Draw.Polyline(map, this.options.polyline),
+				title: L.drawLocal.draw.toolbar.buttons.polyline
+			},
+			{
+				enabled: this.options.polygon,
+				handler: new L.Draw.Polygon(map, this.options.polygon),
+				title: L.drawLocal.draw.toolbar.buttons.polygon
+			},
+			{
+				enabled: this.options.rectangle,
+				handler: new L.Draw.Rectangle(map, this.options.rectangle),
+				title: L.drawLocal.draw.toolbar.buttons.rectangle
+			},
+			{
+				enabled: this.options.circle,
+				handler: new L.Draw.Circle(map, this.options.circle),
+				title: L.drawLocal.draw.toolbar.buttons.circle
+			},
+			{
+				enabled: this.options.marker,
+				handler: new L.Draw.Marker(map, this.options.marker),
+				title: L.drawLocal.draw.toolbar.buttons.marker
+			},
+			{
+				enabled: this.options.circlemarker,
+				handler: new L.Draw.CircleMarker(map, this.options.circlemarker),
+				title: L.drawLocal.draw.toolbar.buttons.circlemarker
+			}
+		];
+	},
+
+	// @method getActions(): object
+	// Get action information
+	getActions: function (handler) {
+		return [
+			{
+				enabled: handler.completeShape,
+				title: L.drawLocal.draw.toolbar.finish.title,
+				text: L.drawLocal.draw.toolbar.finish.text,
+				callback: handler.completeShape,
+				context: handler
+			},
+			{
+				enabled: handler.deleteLastVertex,
+				title: L.drawLocal.draw.toolbar.undo.title,
+				text: L.drawLocal.draw.toolbar.undo.text,
+				callback: handler.deleteLastVertex,
+				context: handler
+			},
+			{
+				title: L.drawLocal.draw.toolbar.actions.title,
+				text: L.drawLocal.draw.toolbar.actions.text,
+				callback: this.disable,
+				context: this
+			}
+		];
+	},
+
+	// @method setOptions(): void
+	// Sets the options to the toolbar
+	setOptions: function (options) {
+		L.setOptions(this, options);
+
+		for (var type in this._modes) {
+			if (this._modes.hasOwnProperty(type) && options.hasOwnProperty(type)) {
+				this._modes[type].handler.setOptions(options[type]);
+			}
+		}
+	}
+});
+
+
+
+/*L.Map.mergeOptions({
+ editControl: true
+ });*/
+/**
+ * @class L.EditToolbar
+ * @aka EditToolbar
+ */
+L.EditToolbar = L.Toolbar.extend({
+	statics: {
+		TYPE: 'edit'
+	},
+
+	options: {
+		edit: {
+			selectedPathOptions: {
+				dashArray: '10, 10',
+
+				fill: true,
+				fillColor: '#fe57a1',
+				fillOpacity: 0.1,
+
+				// Whether to user the existing layers color
+				maintainColor: false
+			}
+		},
+		remove: {},
+		poly: null,
+		featureGroup: null /* REQUIRED! TODO: perhaps if not set then all layers on the map are selectable? */
+	},
+
+	// @method intialize(): void
+	initialize: function (options) {
+		// Need to set this manually since null is an acceptable value here
+		if (options.edit) {
+			if (typeof options.edit.selectedPathOptions === 'undefined') {
+				options.edit.selectedPathOptions = this.options.edit.selectedPathOptions;
+			}
+			options.edit.selectedPathOptions = L.extend({}, this.options.edit.selectedPathOptions, options.edit.selectedPathOptions);
+		}
+
+		if (options.remove) {
+			options.remove = L.extend({}, this.options.remove, options.remove);
+		}
+
+		if (options.poly) {
+			options.poly = L.extend({}, this.options.poly, options.poly);
+		}
+
+		this._toolbarClass = 'leaflet-draw-edit';
+		L.Toolbar.prototype.initialize.call(this, options);
+
+		this._selectedFeatureCount = 0;
+	},
+
+	// @method getModeHandlers(): object
+	// Get mode handlers information
+	getModeHandlers: function (map) {
+		var featureGroup = this.options.featureGroup;
+		return [
+			{
+				enabled: this.options.edit,
+				handler: new L.EditToolbar.Edit(map, {
+					featureGroup: featureGroup,
+					selectedPathOptions: this.options.edit.selectedPathOptions,
+					poly: this.options.poly
+				}),
+				title: L.drawLocal.edit.toolbar.buttons.edit
+			},
+			{
+				enabled: this.options.remove,
+				handler: new L.EditToolbar.Delete(map, {
+					featureGroup: featureGroup
+				}),
+				title: L.drawLocal.edit.toolbar.buttons.remove
+			}
+		];
+	},
+
+	// @method getActions(): object
+	// Get actions information
+	getActions: function (handler) {
+		var actions = [
+			{
+				title: L.drawLocal.edit.toolbar.actions.save.title,
+				text: L.drawLocal.edit.toolbar.actions.save.text,
+				callback: this._save,
+				context: this
+			},
+			{
+				title: L.drawLocal.edit.toolbar.actions.cancel.title,
+				text: L.drawLocal.edit.toolbar.actions.cancel.text,
+				callback: this.disable,
+				context: this
+			}
+		];
+
+		if (handler.removeAllLayers) {
+			actions.push({
+				title: L.drawLocal.edit.toolbar.actions.clearAll.title,
+				text: L.drawLocal.edit.toolbar.actions.clearAll.text,
+				callback: this._clearAllLayers,
+				context: this
+			});
+		}
+
+		return actions;
+	},
+
+	// @method addToolbar(map): L.DomUtil
+	// Adds the toolbar to the map
+	addToolbar: function (map) {
+		var container = L.Toolbar.prototype.addToolbar.call(this, map);
+
+		this._checkDisabled();
+
+		this.options.featureGroup.on('layeradd layerremove', this._checkDisabled, this);
+
+		return container;
+	},
+
+	// @method removeToolbar(): void
+	// Removes the toolbar from the map
+	removeToolbar: function () {
+		this.options.featureGroup.off('layeradd layerremove', this._checkDisabled, this);
+
+		L.Toolbar.prototype.removeToolbar.call(this);
+	},
+
+	// @method disable(): void
+	// Disables the toolbar
+	disable: function () {
+		if (!this.enabled()) {
+			return;
+		}
+
+		this._activeMode.handler.revertLayers();
+
+		L.Toolbar.prototype.disable.call(this);
+	},
+
+	_save: function () {
+		this._activeMode.handler.save();
+		if (this._activeMode) {
+			this._activeMode.handler.disable();
+		}
+	},
+
+	_clearAllLayers: function () {
+		this._activeMode.handler.removeAllLayers();
+		if (this._activeMode) {
+			this._activeMode.handler.disable();
+		}
+	},
+
+	_checkDisabled: function () {
+		var featureGroup = this.options.featureGroup,
+			hasLayers = featureGroup.getLayers().length !== 0,
+			button;
+
+		if (this.options.edit) {
+			button = this._modes[L.EditToolbar.Edit.TYPE].button;
+
+			if (hasLayers) {
+				L.DomUtil.removeClass(button, 'leaflet-disabled');
+			} else {
+				L.DomUtil.addClass(button, 'leaflet-disabled');
+			}
+
+			button.setAttribute(
+				'title',
+				hasLayers ?
+					L.drawLocal.edit.toolbar.buttons.edit
+					: L.drawLocal.edit.toolbar.buttons.editDisabled
+			);
+		}
+
+		if (this.options.remove) {
+			button = this._modes[L.EditToolbar.Delete.TYPE].button;
+
+			if (hasLayers) {
+				L.DomUtil.removeClass(button, 'leaflet-disabled');
+			} else {
+				L.DomUtil.addClass(button, 'leaflet-disabled');
+			}
+
+			button.setAttribute(
+				'title',
+				hasLayers ?
+					L.drawLocal.edit.toolbar.buttons.remove
+					: L.drawLocal.edit.toolbar.buttons.removeDisabled
+			);
+		}
+	}
+});
+
+
+
+/**
+ * @class L.EditToolbar.Edit
+ * @aka EditToolbar.Edit
+ */
+L.EditToolbar.Edit = L.Handler.extend({
+	statics: {
+		TYPE: 'edit'
+	},
+
+	// @method intialize(): void
+	initialize: function (map, options) {
+		L.Handler.prototype.initialize.call(this, map);
+
+		L.setOptions(this, options);
+
+		// Store the selectable layer group for ease of access
+		this._featureGroup = options.featureGroup;
+
+		if (!(this._featureGroup instanceof L.FeatureGroup)) {
+			throw new Error('options.featureGroup must be a L.FeatureGroup');
+		}
+
+		this._uneditedLayerProps = {};
+
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.EditToolbar.Edit.TYPE;
+
+		var version = L.version.split('.');
+		//If Version is >= 1.2.0
+		if (parseInt(version[0], 10) === 1 && parseInt(version[1], 10) >= 2) {
+			L.EditToolbar.Edit.include(L.Evented.prototype);
+		} else {
+			L.EditToolbar.Edit.include(L.Mixin.Events);
+		}
+	},
+
+	// @method enable(): void
+	// Enable the edit toolbar
+	enable: function () {
+		if (this._enabled || !this._hasAvailableLayers()) {
+			return;
+		}
+		this.fire('enabled', {handler: this.type});
+		//this disable other handlers
+
+		this._map.fire(L.Draw.Event.EDITSTART, {handler: this.type});
+		//allow drawLayer to be updated before beginning edition.
+
+		L.Handler.prototype.enable.call(this);
+		this._featureGroup
+			.on('layeradd', this._enableLayerEdit, this)
+			.on('layerremove', this._disableLayerEdit, this);
+	},
+
+	// @method disable(): void
+	// Disable the edit toolbar
+	disable: function () {
+		if (!this._enabled) {
+			return;
+		}
+		this._featureGroup
+			.off('layeradd', this._enableLayerEdit, this)
+			.off('layerremove', this._disableLayerEdit, this);
+		L.Handler.prototype.disable.call(this);
+		this._map.fire(L.Draw.Event.EDITSTOP, {handler: this.type});
+		this.fire('disabled', {handler: this.type});
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks for this handler
+	addHooks: function () {
+		var map = this._map;
+
+		if (map) {
+			map.getContainer().focus();
+
+			this._featureGroup.eachLayer(this._enableLayerEdit, this);
+
+			this._tooltip = new L.Draw.Tooltip(this._map);
+			this._tooltip.updateContent({
+				text: L.drawLocal.edit.handlers.edit.tooltip.text,
+				subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
+			});
+
+			// Quickly access the tooltip to update for intersection checking
+			map._editTooltip = this._tooltip;
+
+			this._updateTooltip();
+
+			this._map
+				.on('mousemove', this._onMouseMove, this)
+				.on('touchmove', this._onMouseMove, this)
+				.on('MSPointerMove', this._onMouseMove, this)
+				.on(L.Draw.Event.EDITVERTEX, this._updateTooltip, this);
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks for this handler
+	removeHooks: function () {
+		if (this._map) {
+			// Clean up selected layers.
+			this._featureGroup.eachLayer(this._disableLayerEdit, this);
+
+			// Clear the backups of the original layers
+			this._uneditedLayerProps = {};
+
+			this._tooltip.dispose();
+			this._tooltip = null;
+
+			this._map
+				.off('mousemove', this._onMouseMove, this)
+				.off('touchmove', this._onMouseMove, this)
+				.off('MSPointerMove', this._onMouseMove, this)
+				.off(L.Draw.Event.EDITVERTEX, this._updateTooltip, this);
+		}
+	},
+
+	// @method revertLayers(): void
+	// Revert each layer's geometry changes
+	revertLayers: function () {
+		this._featureGroup.eachLayer(function (layer) {
+			this._revertLayer(layer);
+		}, this);
+	},
+
+	// @method save(): void
+	// Save the layer geometries
+	save: function () {
+		var editedLayers = new L.LayerGroup();
+		this._featureGroup.eachLayer(function (layer) {
+			if (layer.edited) {
+				editedLayers.addLayer(layer);
+				layer.edited = false;
+			}
+		});
+		this._map.fire(L.Draw.Event.EDITED, {layers: editedLayers});
+	},
+
+	_backupLayer: function (layer) {
+		var id = L.Util.stamp(layer);
+
+		if (!this._uneditedLayerProps[id]) {
+			// Polyline, Polygon or Rectangle
+			if (layer instanceof L.Polyline || layer instanceof L.Polygon || layer instanceof L.Rectangle) {
+				this._uneditedLayerProps[id] = {
+					latlngs: L.LatLngUtil.cloneLatLngs(layer.getLatLngs())
+				};
+			} else if (layer instanceof L.Circle) {
+				this._uneditedLayerProps[id] = {
+					latlng: L.LatLngUtil.cloneLatLng(layer.getLatLng()),
+					radius: layer.getRadius()
+				};
+			} else if (layer instanceof L.Marker || layer instanceof L.CircleMarker) { // Marker
+				this._uneditedLayerProps[id] = {
+					latlng: L.LatLngUtil.cloneLatLng(layer.getLatLng())
+				};
+			}
+		}
+	},
+
+	_getTooltipText: function () {
+		return ({
+			text: L.drawLocal.edit.handlers.edit.tooltip.text,
+			subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
+		});
+	},
+
+	_updateTooltip: function () {
+		this._tooltip.updateContent(this._getTooltipText());
+	},
+
+	_revertLayer: function (layer) {
+		var id = L.Util.stamp(layer);
+		layer.edited = false;
+		if (this._uneditedLayerProps.hasOwnProperty(id)) {
+			// Polyline, Polygon or Rectangle
+			if (layer instanceof L.Polyline || layer instanceof L.Polygon || layer instanceof L.Rectangle) {
+				layer.setLatLngs(this._uneditedLayerProps[id].latlngs);
+			} else if (layer instanceof L.Circle) {
+				layer.setLatLng(this._uneditedLayerProps[id].latlng);
+				layer.setRadius(this._uneditedLayerProps[id].radius);
+			} else if (layer instanceof L.Marker || layer instanceof L.CircleMarker) { // Marker or CircleMarker
+				layer.setLatLng(this._uneditedLayerProps[id].latlng);
+			}
+
+			layer.fire('revert-edited', {layer: layer});
+		}
+	},
+
+	_enableLayerEdit: function (e) {
+		var layer = e.layer || e.target || e,
+			pathOptions, poly;
+
+		// Back up this layer (if haven't before)
+		this._backupLayer(layer);
+
+		if (this.options.poly) {
+			poly = L.Util.extend({}, this.options.poly);
+			layer.options.poly = poly;
+		}
+
+		// Set different style for editing mode
+		if (this.options.selectedPathOptions) {
+			pathOptions = L.Util.extend({}, this.options.selectedPathOptions);
+
+			// Use the existing color of the layer
+			if (pathOptions.maintainColor) {
+				pathOptions.color = layer.options.color;
+				pathOptions.fillColor = layer.options.fillColor;
+			}
+
+			layer.options.original = L.extend({}, layer.options);
+			layer.options.editing = pathOptions;
+
+		}
+
+		if (layer instanceof L.Marker) {
+			if (layer.editing) {
+				layer.editing.enable();
+			}
+			layer.dragging.enable();
+			layer
+				.on('dragend', this._onMarkerDragEnd)
+				// #TODO: remove when leaflet finally fixes their draggable so it's touch friendly again.
+				.on('touchmove', this._onTouchMove, this)
+				.on('MSPointerMove', this._onTouchMove, this)
+				.on('touchend', this._onMarkerDragEnd, this)
+				.on('MSPointerUp', this._onMarkerDragEnd, this);
+		} else {
+			layer.editing.enable();
+		}
+	},
+
+	_disableLayerEdit: function (e) {
+		var layer = e.layer || e.target || e;
+
+		layer.edited = false;
+		if (layer.editing) {
+			layer.editing.disable();
+		}
+
+		delete layer.options.editing;
+		delete layer.options.original;
+		// Reset layer styles to that of before select
+		if (this._selectedPathOptions) {
+			if (layer instanceof L.Marker) {
+				this._toggleMarkerHighlight(layer);
+			} else {
+				// reset the layer style to what is was before being selected
+				layer.setStyle(layer.options.previousOptions);
+				// remove the cached options for the layer object
+				delete layer.options.previousOptions;
+			}
+		}
+
+		if (layer instanceof L.Marker) {
+			layer.dragging.disable();
+			layer
+				.off('dragend', this._onMarkerDragEnd, this)
+				.off('touchmove', this._onTouchMove, this)
+				.off('MSPointerMove', this._onTouchMove, this)
+				.off('touchend', this._onMarkerDragEnd, this)
+				.off('MSPointerUp', this._onMarkerDragEnd, this);
+		} else {
+			layer.editing.disable();
+		}
+	},
+
+	_onMouseMove: function (e) {
+		this._tooltip.updatePosition(e.latlng);
+	},
+
+	_onMarkerDragEnd: function (e) {
+		var layer = e.target;
+		layer.edited = true;
+		this._map.fire(L.Draw.Event.EDITMOVE, {layer: layer});
+	},
+
+	_onTouchMove: function (e) {
+		var touchEvent = e.originalEvent.changedTouches[0],
+			layerPoint = this._map.mouseEventToLayerPoint(touchEvent),
+			latlng = this._map.layerPointToLatLng(layerPoint);
+		e.target.setLatLng(latlng);
+	},
+
+	_hasAvailableLayers: function () {
+		return this._featureGroup.getLayers().length !== 0;
+	}
+});
+
+
+
+/**
+ * @class L.EditToolbar.Delete
+ * @aka EditToolbar.Delete
+ */
+L.EditToolbar.Delete = L.Handler.extend({
+	statics: {
+		TYPE: 'remove' // not delete as delete is reserved in js
+	},
+
+	// @method intialize(): void
+	initialize: function (map, options) {
+		L.Handler.prototype.initialize.call(this, map);
+
+		L.Util.setOptions(this, options);
+
+		// Store the selectable layer group for ease of access
+		this._deletableLayers = this.options.featureGroup;
+
+		if (!(this._deletableLayers instanceof L.FeatureGroup)) {
+			throw new Error('options.featureGroup must be a L.FeatureGroup');
+		}
+
+		// Save the type so super can fire, need to do this as cannot do this.TYPE :(
+		this.type = L.EditToolbar.Delete.TYPE;
+
+		var version = L.version.split('.');
+		//If Version is >= 1.2.0
+		if (parseInt(version[0], 10) === 1 && parseInt(version[1], 10) >= 2) {
+			L.EditToolbar.Delete.include(L.Evented.prototype);
+		} else {
+			L.EditToolbar.Delete.include(L.Mixin.Events);
+		}
+
+	},
+
+	// @method enable(): void
+	// Enable the delete toolbar
+	enable: function () {
+		if (this._enabled || !this._hasAvailableLayers()) {
+			return;
+		}
+		this.fire('enabled', {handler: this.type});
+
+		this._map.fire(L.Draw.Event.DELETESTART, {handler: this.type});
+
+		L.Handler.prototype.enable.call(this);
+
+		this._deletableLayers
+			.on('layeradd', this._enableLayerDelete, this)
+			.on('layerremove', this._disableLayerDelete, this);
+	},
+
+	// @method disable(): void
+	// Disable the delete toolbar
+	disable: function () {
+		if (!this._enabled) {
+			return;
+		}
+
+		this._deletableLayers
+			.off('layeradd', this._enableLayerDelete, this)
+			.off('layerremove', this._disableLayerDelete, this);
+
+		L.Handler.prototype.disable.call(this);
+
+		this._map.fire(L.Draw.Event.DELETESTOP, {handler: this.type});
+
+		this.fire('disabled', {handler: this.type});
+	},
+
+	// @method addHooks(): void
+	// Add listener hooks to this handler
+	addHooks: function () {
+		var map = this._map;
+
+		if (map) {
+			map.getContainer().focus();
+
+			this._deletableLayers.eachLayer(this._enableLayerDelete, this);
+			this._deletedLayers = new L.LayerGroup();
+
+			this._tooltip = new L.Draw.Tooltip(this._map);
+			this._tooltip.updateContent({text: L.drawLocal.edit.handlers.remove.tooltip.text});
+
+			this._map.on('mousemove', this._onMouseMove, this);
+		}
+	},
+
+	// @method removeHooks(): void
+	// Remove listener hooks from this handler
+	removeHooks: function () {
+		if (this._map) {
+			this._deletableLayers.eachLayer(this._disableLayerDelete, this);
+			this._deletedLayers = null;
+
+			this._tooltip.dispose();
+			this._tooltip = null;
+
+			this._map.off('mousemove', this._onMouseMove, this);
+		}
+	},
+
+	// @method revertLayers(): void
+	// Revert the deleted layers back to their prior state.
+	revertLayers: function () {
+		// Iterate of the deleted layers and add them back into the featureGroup
+		this._deletedLayers.eachLayer(function (layer) {
+			this._deletableLayers.addLayer(layer);
+			layer.fire('revert-deleted', {layer: layer});
+		}, this);
+	},
+
+	// @method save(): void
+	// Save deleted layers
+	save: function () {
+		this._map.fire(L.Draw.Event.DELETED, {layers: this._deletedLayers});
+	},
+
+	// @method removeAllLayers(): void
+	// Remove all delateable layers
+	removeAllLayers: function () {
+		// Iterate of the delateable layers and add remove them
+		this._deletableLayers.eachLayer(function (layer) {
+			this._removeLayer({layer: layer});
+		}, this);
+		this.save();
+	},
+
+	_enableLayerDelete: function (e) {
+		var layer = e.layer || e.target || e;
+
+		layer.on('click', this._removeLayer, this);
+	},
+
+	_disableLayerDelete: function (e) {
+		var layer = e.layer || e.target || e;
+
+		layer.off('click', this._removeLayer, this);
+
+		// Remove from the deleted layers so we can't accidentally revert if the user presses cancel
+		this._deletedLayers.removeLayer(layer);
+	},
+
+	_removeLayer: function (e) {
+		var layer = e.layer || e.target || e;
+
+		this._deletableLayers.removeLayer(layer);
+
+		this._deletedLayers.addLayer(layer);
+
+		layer.fire('deleted');
+	},
+
+	_onMouseMove: function (e) {
+		this._tooltip.updatePosition(e.latlng);
+	},
+
+	_hasAvailableLayers: function () {
+		return this._deletableLayers.getLayers().length !== 0;
+	}
+});
+
+
+
+}(window, document));
+//# sourceMappingURL=leaflet.draw-src.map
+
+/***/ }),
+/* 160 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var ReverseGeocodingDOM = {
+  /**
+  * Add uuid to the tag ID
+  * @param {String} id - id selector
+  * @returns {String} uid - id selector with an unique id
+  */
+  _addUID: function _addUID(id) {
+    var uid = this._uid ? id + "-" + this._uid : id;
+    return uid;
+  },
+
+  /**
+   * Main container (DOM)
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createMainContainerElement: function _createMainContainerElement() {
+    var container = document.createElement("div");
+    container.id = this._addUID("GPreverseGeocoding");
+    container.className = "GPwidget";
+    return container;
+  },
+  // ################################################################### //
+  // ################### Methods of main container ##################### //
+  // ################################################################### //
+
+  /**
+   * Hidden checkbox for minimizing/maximizing
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowReverseGeocodingElement: function _createShowReverseGeocodingElement() {
+    var input = document.createElement("input");
+    input.id = this._addUID("GPshowReverseGeocoding");
+    input.type = "checkbox";
+    return input;
+  },
+
+  /**
+   * Show ReverseGeocoding
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowReverseGeocodingPictoElement: function _createShowReverseGeocodingPictoElement() {
+    // contexte d'execution
+    var self = this;
+    var label = document.createElement("label");
+    label.id = this._addUID("GPshowReverseGeocodingPicto");
+    label.className = "GPshowAdvancedToolPicto";
+    label.htmlFor = this._addUID("GPshowReverseGeocoding");
+    label.title = "Ouvrir la recherche inverse"; // Close all results and panels when minimizing the widget
+
+    if (label.addEventListener) {
+      label.addEventListener("click", function () {
+        self.onShowReverseGeocodingClick();
+      });
+    } else if (label.attachEvent) {
+      label.attachEvent("onclick", function () {
+        self.onShowReverseGeocodingClick();
+      });
+    }
+
+    var spanOpen = document.createElement("span");
+    spanOpen.id = this._addUID("GPshowReverseGeocodingOpen");
+    spanOpen.className = "GPshowAdvancedToolOpen";
+    label.appendChild(spanOpen);
+    return label;
+  },
+
+  /**
+   * Create Waiting Panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createReverseGeocodingWaitingElement: function _createReverseGeocodingWaitingElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPreverseGeocodingCalcWaitingContainer");
+    div.className = "GPreverseGeocodingCalcWaitingContainerHidden";
+    var p = document.createElement("p");
+    p.className = "GPreverseGeocodingCalcWaiting";
+    p.innerHTML = "Recherche en cours...";
+    div.appendChild(p);
+    return div;
+  },
+
+  /**
+   * Reverse geocoding results panel element.
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createReverseGeocodingResultsPanelElement: function _createReverseGeocodingResultsPanelElement() {
+    var resultsPanelDiv = document.createElement("div");
+    resultsPanelDiv.id = this._addUID("GPreverseGeocodingResultsPanel");
+    resultsPanelDiv.className = "GPpanel GPreverseGeocodingComponentHidden";
+    return resultsPanelDiv;
+  },
+
+  /**
+   * Reverse geocoding results list.
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createReverseGeocodingResultsListElement: function _createReverseGeocodingResultsListElement() {
+    var container = document.createElement("div");
+    container.id = this._addUID("GPreverseGeocodingResultsList"); // Results are dynamically filled in Javascript by reverse geocoding service
+
+    return container;
+  },
+
+  /**
+   *  Add Result
+   * (results dynamically generate !)
+   *
+   * @param {String} locationDescription - reverse geocoded location results
+   * @param {Number} id - ID
+   */
+  _createReverseGeocodingResultElement: function _createReverseGeocodingResultElement(locationDescription, id) {
+    // contexte
+    var context = this;
+    var container = document.getElementById(this._addUID("GPreverseGeocodingResultsList"));
+    var div = document.createElement("div");
+    div.id = this._addUID("ReverseGeocodedLocation_" + id);
+    div.className = "GPautoCompleteProposal";
+    div.innerHTML = locationDescription;
+    div.title = locationDescription;
+
+    if (div.addEventListener) {
+      div.addEventListener("mouseover", function (e) {
+        context.onReverseGeocodingResultMouseOver(e);
+      });
+      div.addEventListener("mouseout", function (e) {
+        context.onReverseGeocodingResultMouseOut(e);
+      });
+      div.addEventListener("click", function (e) {
+        if (typeof context.onReverseGeocodingResultClick === "function") {
+          context.onReverseGeocodingResultClick(e);
+        }
+      });
+    } else if (div.attachEvent) {
+      div.attachEvent("onmouseover", function (e) {
+        context.onReverseGeocodingResultMouseOver(e);
+      });
+      div.attachEvent("onmouseout", function (e) {
+        context.onReverseGeocodingResultMouseOut(e);
+      });
+      div.attachEvent("onclick", function (e) {
+        if (typeof context.onReverseGeocodingResultClick === "function") {
+          context.onReverseGeocodingResultClick(e);
+        }
+      });
+    }
+
+    container.appendChild(div);
+  },
+  // ################################################################### //
+  // ######################### Inputs panel ############################ //
+  // ################################################################### //
+
+  /**
+   * Create Container Panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createReverseGeocodingPanelElement: function _createReverseGeocodingPanelElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPreverseGeocodingPanel");
+    div.className = "GPpanel";
+    return div;
+  },
+
+  /**
+   * Create Header Panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createReverseGeocodingPanelHeaderElement: function _createReverseGeocodingPanelHeaderElement() {
+    var container = document.createElement("div");
+    container.className = "GPpanelHeader"; // info: on sépare les appels pour la création du picto de retour,
+    // du titre et de la croix de fermeture pour les récupérer dans le composant
+
+    return container;
+  },
+
+  /**
+   * Create return picto in panel header
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createReverseGeocodingPanelReturnPictoElement: function _createReverseGeocodingPanelReturnPictoElement() {
+    // contexte
+    var self = this;
+    var divNew = document.createElement("div");
+    divNew.id = this._addUID("GPreverseGeocodingReturnPicto");
+    divNew.title = "Nouvelle recherche";
+    divNew.className = "GPreverseGeocodingReturnPictoHidden";
+
+    if (divNew.addEventListener) {
+      divNew.addEventListener("click", function (e) {
+        document.getElementById(self._addUID("GPreverseGeocodingResultsPanel")).className = "GProuteComponentHidden";
+        document.getElementById(self._addUID("GPreverseGeocodingForm")).className = "";
+        document.getElementById(self._addUID("GPreverseGeocodingHeaderTitle")).innerHTML = "Recherche inverse";
+        document.getElementById(self._addUID("GPreverseGeocodingReturnPicto")).className = "GPreverseGeocodingReturnPictoHidden";
+        self.onGPreverseGeocodingReturnPictoClick(e);
+      });
+    } else if (divNew.attachEvent) {
+      divNew.attachEvent("onclick", function (e) {
+        document.getElementById(self._addUID("GPreverseGeocodingResultsPanel")).className = "GProuteComponentHidden";
+        document.getElementById(self._addUID("GPreverseGeocodingForm")).className = "";
+        document.getElementById(self._addUID("GPreverseGeocodingHeaderTitle")).innerHTML = "Recherche inverse";
+        document.getElementById(self._addUID("GPreverseGeocodingReturnPicto")).className = "GPreverseGeocodingReturnPictoHidden";
+        self.onGPreverseGeocodingReturnPictoClick(e);
+      });
+    }
+
+    return divNew;
+  },
+
+  /**
+   * Create Header Title Panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createReverseGeocodingPanelTitleElement: function _createReverseGeocodingPanelTitleElement() {
+    var div = document.createElement("div");
+    div.className = "GPpanelTitle";
+    div.id = this._addUID("GPreverseGeocodingHeaderTitle");
+    div.innerHTML = "Recherche inverse";
+    return div;
+  },
+
+  /**
+   * Create Header close div
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createReverseGeocodingPanelCloseElement: function _createReverseGeocodingPanelCloseElement() {
+    // contexte
+    var self = this;
+    var divClose = document.createElement("div");
+    divClose.id = this._addUID("GPreverseGeocodingPanelClose");
+    divClose.className = "GPpanelClose";
+    divClose.title = "Fermer le panneau"; // Link panel close / visibility checkbox
+
+    if (divClose.addEventListener) {
+      divClose.addEventListener("click", function () {
+        document.getElementById(self._addUID("GPshowReverseGeocodingPicto")).click();
+      }, false);
+    } else if (divClose.attachEvent) {
+      divClose.attachEvent("onclick", function () {
+        document.getElementById(self._addUID("GPshowReverseGeocodingPicto")).click();
+      });
+    }
+
+    return divClose;
+  },
+
+  /**
+   * Create Form
+   * see event !
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createReverseGeocodingPanelFormElement: function _createReverseGeocodingPanelFormElement() {
+    // contexte d'execution
+    var self = this;
+    var form = document.createElement("form");
+    form.id = this._addUID("GPreverseGeocodingForm");
+
+    if (form.addEventListener) {
+      form.addEventListener("submit", function (e) {
+        e.preventDefault();
+        self.onReverseGeocodingSubmit();
+      });
+    } else if (form.attachEvent) {
+      form.attachEvent("onsubmit", function (e) {
+        e.preventDefault();
+        self.onReverseGeocodingSubmit();
+      });
+    }
+
+    return form;
+  },
+  // ################################################################### //
+  // ####################### Choice mode into form ##################### //
+  // ################################################################### //
+
+  /**
+   * Create Container to Mode choice geocoding type
+   *
+   * @param {Array} resources - geocoding resources to be displayed (and used)
+   * @returns {DOMElement} DOM element
+   */
+  _createReverseGeocodingFormModeChoiceGeocodingTypeElement: function _createReverseGeocodingFormModeChoiceGeocodingTypeElement(resources) {
+    // contexte d'execution
+    var context = this;
+    var div = document.createElement("div");
+    div.className = "GPflexInput";
+    var label = document.createElement("label");
+    label.className = "GPreverseGeocodingCodeLabel";
+    label.innerHTML = "Recherche par";
+    label.title = "Recherche par";
+    div.appendChild(label);
+    var select = document.createElement("select");
+    select.className = "GPreverseGeocodingCode"; // gestionnaire d'evenement : on stocke la valeur du type de geocodage,
+    // utilisé dans la requête de géocodage inverse
+
+    if (select.addEventListener) {
+      select.addEventListener("change", function (e) {
+        context.onReverseGeocodingTypeChange(e);
+      });
+    } else if (select.attachEvent) {
+      select.attachEvent("onchange", function (e) {
+        context.onReverseGeocodingTypeChange(e);
+      });
+    } // on prend soit les valeurs passées par l'utilisateur, soit des valeurs par défaut
+
+
+    if (!resources || !Array.isArray(resources)) {
+      resources = ["StreetAddress", "PositionOfInterest", "CadastralParcel"];
+    }
+
+    for (var i = 0; i < resources.length; i++) {
+      switch (resources[i]) {
+        case "PositionOfInterest":
+          var POIOption = document.createElement("option");
+          POIOption.value = "PositionOfInterest";
+          POIOption.text = "Lieux/toponymes";
+          select.appendChild(POIOption);
+          break;
+
+        case "StreetAddress":
+          var SAOption = document.createElement("option");
+          SAOption.value = "StreetAddress";
+          SAOption.text = "Adresses";
+          select.appendChild(SAOption);
+          break;
+
+        case "CadastralParcel":
+          var CPOption = document.createElement("option");
+          CPOption.value = "CadastralParcel";
+          CPOption.text = "Parcelles cadastrales";
+          select.appendChild(CPOption);
+          break;
+
+        case "Administratif":
+          var adminOption = document.createElement("option");
+          adminOption.value = "Administratif";
+          adminOption.text = "Unités administratives";
+          select.appendChild(adminOption);
+          break;
+
+        default:
+          break;
+      }
+    }
+
+    div.appendChild(select);
+    return div;
+  },
+
+  /**
+   * Create Container to Mode choice geocoding delimitation
+   *
+   * @param {Array} delimitations - geocoding delimitations to be displayed (and used)
+   * @returns {DOMElement} DOM element
+   */
+  _createReverseGeocodingFormModeChoiceGeocodingDelimitationElement: function _createReverseGeocodingFormModeChoiceGeocodingDelimitationElement(delimitations) {
+    // contexte d'execution
+    var context = this;
+    var div = document.createElement("div");
+    div.className = "GPflexInput";
+    var label = document.createElement("label");
+    label.className = "GPreverseGeocodingCodeLabel";
+    label.innerHTML = "Délimitation";
+    label.title = "Délimitation";
+    div.appendChild(label);
+    var select = document.createElement("select");
+    select.className = "GPreverseGeocodingCode"; // gestionnaire d'evenement : on stocke la valeur du type de délimitation,
+    // et on modifie l'événement de pointage sur la carte en fonction
+
+    if (select.addEventListener) {
+      select.addEventListener("change", function (e) {
+        context.onReverseGeocodingDelimitationChange(e);
+      });
+    } else if (select.attachEvent) {
+      select.attachEvent("onchange", function (e) {
+        context.onReverseGeocodingDelimitationChange(e);
+      });
+    } // on prend soit les valeurs passées par l'utilisateur, soit des valeurs par défaut
+
+
+    if (!delimitations || !Array.isArray(delimitations)) {
+      delimitations = ["Point", "Circle", "Extent"];
+    }
+
+    for (var i = 0; i < delimitations.length; i++) {
+      switch (delimitations[i].toLowerCase()) {
+        case "point":
+          var pointOption = document.createElement("option");
+          pointOption.value = "point";
+          pointOption.text = "Pointer un lieu";
+          select.appendChild(pointOption);
+          break;
+
+        case "circle":
+          var circleOption = document.createElement("option");
+          circleOption.value = "circle";
+          circleOption.text = "Dessiner un cercle";
+          select.appendChild(circleOption);
+          break;
+
+        case "extent":
+          var extentOption = document.createElement("option");
+          extentOption.value = "extent";
+          extentOption.text = "Dessiner une emprise";
+          select.appendChild(extentOption);
+          break;
+
+        default:
+          break;
+      }
+    }
+
+    div.appendChild(select);
+    return div;
+  },
+  // ################################################################### //
+  // ########################### Submit Form ########################### //
+  // ################################################################### //
+
+  /**
+   * Create Submit Form Element
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createReverseGeocodingSubmitFormElement: function _createReverseGeocodingSubmitFormElement() {
+    var input = document.createElement("input");
+    input.id = this._addUID("GPreverseGeocodingSubmit");
+    input.className = "GPinputSubmit";
+    input.type = "submit";
+    input.value = "Rechercher";
+    return input;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (ReverseGeocodingDOM);
+
+/***/ }),
+/* 161 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(40);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(34);
+/* harmony import */ var _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(140);
+/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(36);
+/* harmony import */ var _LocationSelector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(142);
+/* harmony import */ var _Common_Controls_RouteDOM__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(162);
+
+
+
+
+
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__["default"].getLogger("route(plus)");
+/**
+ * @classdesc
+ *
+ * Leaflet Control Class to compute and display route between start and end points using routing service of the geoportal platform.
+ *
+ * Use {@link module:Controls.Route L.geoportalControl.Route()} factory to create instances of that class.
+ *
+ * **Extends** Leaflet <a href="http://leafletjs.com/reference.html#control" target="_blank">L.Control</a> native class.
+ *
+ * @namespace
+ * @alias L.geoportalControl.Route
+ */
+
+var Route = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Control.extend(
+/** @lends L.geoportalControl.Route.prototype */
+{
+  includes: _Common_Controls_RouteDOM__WEBPACK_IMPORTED_MODULE_6__["default"],
+
+  /**
+   * Options du service
+   *
+   * @private
+   */
+  options: {
+    position: "topleft",
+    collapsed: true,
+    // plier !
+    graphs: ["Voiture", "Pieton"],
+    exclusions: {
+      toll: false,
+      tunnel: false,
+      bridge: false
+    },
+    disableReverse: false,
+    routeOptions: {},
+    // FIXME a t on besoin des options de ce service ?
+    autocompleteOptions: {}
+  },
+
+  /**
+   * @constructor Route
+   * @private
+   * @param {Object} options - options for function call.
+   * @param {Sting}   [options.apiKey] - API key, mandatory if autoconf service has not been charged in advance
+   * @param {Boolean} [options.ssl = true] - use of ssl or not (default true, service requested using https protocol)
+   * @param {String}  [options.position] - position of component into the map, 'topleft' by default
+   * @param {Boolean} [options.collapsed] - collapse mode, false by default
+   * @param {Object}  [options.exclusions] - list of exclusions with status
+   * @param {Array}   [options.graphs] - list of resources, by default : ["Voiture", "Pieton"], and the first element is selected
+   * @param {Boolean} [options.disableReverse = false] - whether to enable/disable the reverse geocoding
+   * @param {Object}  [options.autocompleteOptions] - options of autocomplete service
+   * @param {Object}  [options.routeOptions] - options of route service
+   * @example
+   *  var route = L.geoportalControl.Route({
+   *      position : "topright",
+   *      collapsed : true,
+   *      exclusions : {
+   *         "toll" : true,
+   *         "bridge" : false,
+   *         "tunnel" : true
+   *      },
+   *      graphs : ['Pieton', 'Voiture'],
+   *      autocompleteOptions : {},
+   *      routeOptions : {}
+   *  });
+   */
+  initialize: function initialize(options) {
+    // on transmet les options au controle
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.setOptions(this, options);
+    /** uuid */
+
+    this._uid = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__["default"].generate(); // initialisation
+
+    this._initTransport();
+
+    this._initExclusions();
+
+    this._initComputation();
+    /** container principaux */
+
+
+    this._showRouteContainer = null;
+    this._pictoRouteContainer = null;
+    this._waitingContainer = null;
+    this._formRouteContainer = null;
+    this._resultsRouteContainer = null;
+    /** detection du support : desktop ou tactile */
+
+    this._isDesktop = this._detectSupport();
+    /** liste de points selectionnée */
+
+    this._currentPoints = [];
+    /** Mode de transport selectionné : 'Voiture' ou 'Pieton' */
+
+    this._currentTransport = null;
+    /** Mode de calcul selectionné : 'Plus rapide' ou 'plus court' */
+
+    this._currentComputation = null;
+    /** Exclusions selectionnées : Tunnel, Toll et Bridge */
+
+    this._currentExclusions = [];
+    /** la geometrie du parcours */
+
+    this._geojsonRoute = null;
+    /** la geometrie des troncons */
+
+    this._geojsonSections = null;
+    /** si un calcul est en cours ou non */
+
+    this._waiting = false;
+    /** timer pour cacher la patience après un certain temps */
+
+    this._timer = null;
+    /**
+     * reponse du service
+     * Ex. {
+     *   totalTime, totalDistance, bbox, routeGeometry,
+     *   routeInstructions : [{duration, distance, code, instruction, bbox, geometry}]
+     * }
+     */
+
+    this._currentRouteInformations = null;
+    /**
+     * liste des ressources avec droits par service
+     * Ex. {
+     *   "Route" : {
+     *       key : "ger4g456re45er456t4er5ge5",
+     *       resources : ["Pieton", "Voiture"]
+     *   }
+     * }
+     */
+
+    this._resources = {};
+    /** aucun droits sur les ressources */
+
+    this._noRightManagement = false; // gestion des droits sur les ressources/services
+
+    this._checkRightsManagement();
+  },
+
+  /**
+   * this method is called by this.addTo(map) when the control is added on the map
+   * and fills variable 'this._container = this.onAdd(map)',
+   * and create or disable events on map.
+   *
+   * @param {Object} map - the map
+   *
+   * @returns {DOMElement} DOM element
+   *
+   * @private
+   */
+  onAdd: function onAdd(map) {
+    // initialisation du DOM du composant
+    var container = this._container = this._initLayout(map); // deactivate of events that may interfere with the map
+
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
+    return container;
+  },
+
+  /**
+   * TODO this method is called when the control is removed from the map
+   * and removes events on map.
+   *
+   * @private
+   */
+  onRemove: function onRemove()
+  /* map */
+  {},
+  // ################################################################### //
+  // ####################### init application ########################## //
+  // ################################################################### //
+
+  /**
+   * this method is called by the constructor and initialize the ...
+   *
+   * @private
+   */
+  _initTransport: function _initTransport() {
+    // Mode de transport selectionné
+    this._currentTransport = "Voiture"; // par defaut
+    // par defaut
+
+    var transport = this.options.graphs;
+
+    if (!transport || transport.length === 0) {
+      this.options.graphs = ["Voiture", "Pieton"];
+    } // option
+
+
+    if (leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.isArray(transport) && transport.length) {
+      // FIXME pb si le 1er graphe n'est pas une ressource connue !
+      if (transport[0] === "Voiture" || transport[0] === "Pieton") {
+        this._currentTransport = transport[0];
+      }
+    } // TODO option sur le service
+
+
+    var serviceOptions = this.options.routeOptions;
+
+    if (serviceOptions.graph) {
+      this._currentTransport = serviceOptions.graph;
+    }
+  },
+
+  /**
+   * this method is called by the constructor and initialize the ...
+   *
+   * @private
+   */
+  _initComputation: function _initComputation() {
+    // Mode de calcul selectionné
+    this._currentComputation = "fastest"; // par defaut
+    // TODO option sur le service
+
+    var serviceOptions = this.options.routeOptions;
+
+    if (serviceOptions.routePreference) {
+      this._currentComputation = serviceOptions.routePreference;
+    }
+  },
+
+  /**
+   * this method is called by the constructor and initialize the ...
+   *
+   * @private
+   */
+  _initExclusions: function _initExclusions() {
+    // Exclusions selectionnées : Tunnel, Toll et Bridge
+    this._currentExclusions = []; // par defaut
+    // par defaut
+
+    var exclusion = this.options.exclusions;
+
+    if (!exclusion || Object.keys(exclusion).length === 0) {
+      this.options.exclusions = {
+        toll: false,
+        tunnel: false,
+        bridge: false
+      };
+    } // option
+
+
+    if (exclusion && Object.keys(exclusion).length) {
+      for (var k in exclusion) {
+        if (exclusion.hasOwnProperty(k)) {
+          if (exclusion.k) {
+            this._currentExclusions.push(k);
+          }
+        }
+      }
+    } // TODO option sur le service
+
+
+    var serviceOptions = this.options.routeOptions;
+
+    if (leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.isArray(serviceOptions.exclusions)) {
+      this._currentExclusions = serviceOptions.exclusions;
+    }
+  },
+  // ################################################################### //
+  // ############################## other init ######################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by constructor
+   * and check the rights to resources
+   * FIXME à revoir...
+   *
+   * @private
+   */
+  _checkRightsManagement: function _checkRightsManagement() {
+    var _opts = null;
+    var _res = [];
+    var _key = null; // les ressources du service du calcul d'Itineraire
+
+    _key = this.options.routeOptions.apiKey;
+    _opts = this.options.routeOptions.filterOptions;
+    _res = _opts ? _opts.type : [];
+
+    if (!_res || _res.length === 0) {
+      _res = ["Voiture", "Pieton"];
+    }
+
+    var rightManagementRoute = _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_3__["default"].check({
+      key: _key || this.options.apiKey,
+      resources: _res,
+      services: ["Itineraire"]
+    }); // les ressources du service d'autocompletion
+
+    _key = this.options.autocompleteOptions.apiKey;
+    _opts = this.options.autocompleteOptions.filterOptions;
+    _res = _opts ? _opts.type : [];
+
+    if (!_res || _res.length === 0) {
+      _res = ["StreetAddress", "PositionOfInterest" // "CadastralParcel",
+      // "Administratif"
+      ];
+    }
+
+    var rightManagementAutoComplete = _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_3__["default"].check({
+      key: _key || this.options.apiKey,
+      resources: _res,
+      services: ["AutoCompletion"]
+    }); // au cas où pas de droit !
+
+    if (!rightManagementRoute && !rightManagementAutoComplete) {
+      this._noRightManagement = true;
+    } // FIXME je reconstruis differement la structure pour la gestion des clefs differentes
+    // pour chaque service...
+
+
+    if (rightManagementAutoComplete) {
+      this._resources["AutoCompletion"] = {};
+      this._resources["AutoCompletion"]["resources"] = rightManagementAutoComplete["AutoCompletion"];
+      this._resources["AutoCompletion"]["key"] = rightManagementAutoComplete["key"];
+    }
+
+    if (rightManagementRoute) {
+      this._resources["Itineraire"] = {};
+      this._resources["Itineraire"]["resources"] = rightManagementRoute["Itineraire"];
+      this._resources["Itineraire"]["key"] = rightManagementRoute["key"];
+    }
+  },
+
+  /**
+   * TODO this method is called by the constructor.
+   * this information is useful to switch to touch mode.
+   * Detection : test for desktop or tactile
+   *
+   * @returns {Boolean} is desktop
+   *
+   * @private
+   */
+  _detectSupport: function _detectSupport() {
+    // TODO
+    // Choix de gérer la détection dans le code du composant au lieu du DOM car :
+    // Utilisation de l'implémentation Leaflet
+    // http://leafletjs.com/reference.html#browser
+    var isDesktop = true;
+    var userAgent = window.navigator.userAgent.toLowerCase();
+
+    if (userAgent.indexOf("iphone") !== -1 || userAgent.indexOf("ipod") !== -1 || userAgent.indexOf("ipad") !== -1 || userAgent.indexOf("android") !== -1 || userAgent.indexOf("mobile") !== -1 || userAgent.indexOf("blackberry") !== -1 || userAgent.indexOf("tablet") !== -1 || userAgent.indexOf("phone") !== -1 || userAgent.indexOf("touch") !== -1) {
+      isDesktop = false;
+    }
+
+    if (userAgent.indexOf("msie") !== -1 || userAgent.indexOf("trident") !== -1) {
+      isDesktop = true;
+    }
+
+    return isDesktop;
+  },
+  // ################################################################### //
+  // ########################### init dom ############################## //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onAdd(map)
+   * and initialize the container HTMLElement
+   *
+   * @param {Object} map - the map
+   *
+   * @returns {DOMElement} DOM element
+   *
+   * @private
+   */
+  _initLayout: function _initLayout(map) {
+    // create main container
+    var container = this._createMainContainerElement();
+
+    var inputShow = this._showRouteContainer = this._createShowRouteElement();
+
+    container.appendChild(inputShow); // mode "collapsed"
+
+    if (!this.options.collapsed) {
+      inputShow.checked = true;
+    }
+
+    var picto = this._pictoRouteContainer = this._createShowRoutePictoElement();
+
+    container.appendChild(picto);
+
+    var routePanel = this._createRoutePanelElement(); // header form
+
+
+    var routeHeader = this._createRoutePanelHeaderElement();
+
+    routePanel.appendChild(routeHeader); // form
+
+    var routeForm = this._formRouteContainer = this._createRoutePanelFormElement(); // form: menu des points
+
+
+    var points = this._createRoutePanelFormPointsElement(map);
+
+    for (var i = 0; i < points.length; i++) {
+      routeForm.appendChild(points[i]);
+    } // form: menu des modes
+
+
+    var choice = this._createRoutePanelFormModeChoiceElement();
+
+    choice.appendChild(this._createRoutePanelFormModeChoiceTransportElement(this.options.graphs));
+    choice.appendChild(this._createRoutePanelFormModeChoiceComputeElement());
+    routeForm.appendChild(choice); // form: menu des exclusions
+
+    routeForm.appendChild(this._createShowRouteExclusionsElement());
+    routeForm.appendChild(this._createShowRouteExclusionsPictoElement());
+
+    var exclusion = this._createRoutePanelFormExclusionsElement();
+
+    exclusion.appendChild(this._createRoutePanelFormExclusionOptionsElement(this.options.exclusions));
+    routeForm.appendChild(exclusion); // form: bouton du calcul
+
+    var submit = this._createRouteSubmitFormElement();
+
+    routeForm.appendChild(submit);
+    routePanel.appendChild(routeForm); // results
+
+    var routeResults = this._resultsRouteContainer = this._createRoutePanelResultsElement();
+
+    routePanel.appendChild(routeResults); // waiting
+
+    var waiting = this._waitingContainer = this._createRouteWaitingElement();
+
+    routePanel.appendChild(waiting);
+    container.appendChild(routePanel);
+    return container;
+  },
+  // ################################################################### //
+  // ############################## DOM ################################ //
+  // ################################################################### //
+
+  /**
+   * Create List Points
+   * FIXME OVERWRITTEN RouteDOM._createRoutePanelFormPointsElement() !
+   *
+   * @param {Object} map - the map
+   *
+   * @returns {Array} List DOM element
+   *
+   * @private
+   */
+  _createRoutePanelFormPointsElement: function _createRoutePanelFormPointsElement(map) {
+    var points = [];
+    var count = 1; // point de depart
+
+    var start = new _LocationSelector__WEBPACK_IMPORTED_MODULE_5__["default"]({
+      apiKey: this.options.apiKey || null,
+      tag: {
+        id: count,
+        unique: this._uid,
+        label: "Départ",
+        color: "blue",
+        display: true
+      },
+      disableReverse: this.options.disableReverse,
+      autocompleteOptions: this.options.autocompleteOptions || null
+    });
+    start.setMap(map);
+    var opts = this.options.routeOptions;
+
+    if (opts.startPoint) {
+      start._inputAutoCompleteContainer.value = opts.startPoint.x + " , " + opts.startPoint.y;
+      start.setCoordinate({
+        lng: opts.startPoint.x,
+        lat: opts.startPoint.y
+      });
+    }
+
+    points.push(start.getContainer());
+
+    this._currentPoints.push(start); // points intermediaires
+
+
+    for (count = 2; count < 7; count++) {
+      var step = new _LocationSelector__WEBPACK_IMPORTED_MODULE_5__["default"]({
+        apiKey: this.options.apiKey || null,
+        tag: {
+          id: count,
+          unique: this._uid,
+          label: "Etape",
+          color: "green",
+          display: false,
+          removeOption: true
+        },
+        disableReverse: this.options.disableReverse,
+        autocompleteOptions: this.options.autocompleteOptions || null
+      });
+      step.setMap(map);
+      points.push(step.getContainer());
+
+      this._currentPoints.push(step);
+    } // point d'arrivé
+
+
+    var end = new _LocationSelector__WEBPACK_IMPORTED_MODULE_5__["default"]({
+      apiKey: this.options.apiKey || null,
+      tag: {
+        id: count,
+        unique: this._uid,
+        label: "Arrivée",
+        color: "red",
+        display: true,
+        addOption: true,
+        removeOption: false
+      },
+      disableReverse: this.options.disableReverse,
+      autocompleteOptions: this.options.autocompleteOptions || null
+    });
+    end.setMap(map);
+
+    if (opts.endPoint) {
+      end._inputAutoCompleteContainer.value = opts.endPoint.x + " , " + opts.endPoint.y;
+      end.setCoordinate({
+        lng: opts.endPoint.x,
+        lat: opts.endPoint.y
+      });
+    }
+
+    points.push(end.getContainer());
+
+    this._currentPoints.push(end);
+
+    return points;
+  },
+  // ################################################################### //
+  // ####################### handlers events to dom #################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by event 'click' on ''
+   * tag label (cf. this._createShowRoutePictoElement),
+   * and it cleans all value of input.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onShowRoutePanelClick: function onShowRoutePanelClick(e) {
+    logger.log("onShowRoutePanelClick", e); // clean !
+
+    if (!this._geojsonSections) {
+      this._clear();
+    }
+  },
+
+  /**
+   * this method is called by event 'change' on '' tag select
+   * (cf. this.).
+   * this value is saved as a parameter for the service route.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onRouteModeComputationChange: function onRouteModeComputationChange(e) {
+    logger.log("onRouteModeComputationChange", e);
+    var idx = e.target.selectedIndex;
+    var value = e.target.options[idx].value;
+
+    if (!value) {
+      return;
+    }
+
+    logger.log(value);
+    this._currentComputation = value;
+  },
+
+  /**
+   * this method is called by event 'change' on '' tag select
+   * (cf. this.).
+   * this value is saved as a parameter for the service route,
+   * and this launches the route request !
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onRouteModeComputationChangeAndRun: function onRouteModeComputationChangeAndRun(e) {
+    logger.log("onRouteModeComputationChangeAndRun", e); // event choice computation
+
+    this.onRouteModeComputationChange(e); // clean avant un nouveau calcul !
+
+    this._clearRouteResultsDetails();
+
+    this._clearRouteResultsGeometry();
+
+    this._clearRouteResultsFeatureGeometry(); // submit request
+
+
+    this.onRouteComputationSubmit({
+      computation: this._currentComputation,
+      transport: this._currentTransport,
+      exclusions: this._currentExclusions
+    });
+  },
+
+  /**
+   * this method is called by event 'change' on '' tag input
+   * (cf. this.).
+   * this value is saved as a parameter for the service route.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onRouteModeTransportChange: function onRouteModeTransportChange(e) {
+    logger.log("onRouteModeTransportChange", e);
+    var value = e.target.value;
+
+    if (!value) {
+      return;
+    }
+
+    logger.log(value);
+    this._currentTransport = value;
+  },
+
+  /**
+   * this method is called by event 'click' on '' tag input
+   * (cf. this.), and it displays the panel options of exclusions.
+   * Not use !
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onShowRouteExclusionsClick: function onShowRouteExclusionsClick(e) {
+    logger.log("onShowRouteExclusionsClick", e); // not use !
+  },
+
+  /**
+   * this method is called by event 'change' on '' tag input
+   * (cf. this.).
+   * this value is saved as a parameter for the service route.
+   * Not use !
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onRouteExclusionsChange: function onRouteExclusionsChange(e) {
+    logger.log("onRouteExclusionsChange", e);
+    var value = e.target.value;
+    var checked = e.target.checked;
+
+    if (!value) {
+      return;
+    }
+
+    logger.log(value, checked);
+    var bFound = false;
+    var iFound = null;
+
+    for (var i = 0; i < this._currentExclusions.length; i++) {
+      if (this._currentExclusions[i] === value) {
+        iFound = i;
+        bFound = true;
+      }
+    } // on l'ajoute si la valeur n'existe pas et est selectionnée
+
+
+    if (!bFound && checked) {
+      this._currentExclusions.push(value);
+    } // on la retire si la valeur existe et est desselectionnée
+
+
+    if (bFound && !checked) {
+      this._currentExclusions[iFound] = null;
+    }
+  },
+
+  /**
+   * this method is called by event 'submit' on '' tag form
+   * (cf. this.), and it displays the results.
+   *
+   * @param {Object} options - options
+   *
+   * @private
+   */
+  onRouteComputationSubmit: function onRouteComputationSubmit(options) {
+    logger.log("onRouteComputationSubmit", options); // FIXME on lance une requête en EPSG:4326, les coordonnées
+    // doivent donc être du type cad en lat/lon.
+    // hors, BUG du service du calcul d'itineraire car les
+    // coordonnées envoyées doivent être en lon/lat avec une SRS en EPSG:4326 !?
+    // sinon, ça plante...
+    // Liste des points
+
+    var points = this._currentPoints; // - point de depart
+
+    var start = points[0].getCoordinate();
+    points[0].dragging(false);
+    logger.log("start", start); // - point d'arrivée
+
+    var end = points[points.length - 1].getCoordinate();
+    points[points.length - 1].dragging(false);
+    logger.log("end", end); // - les étapes
+
+    var step = [];
+
+    for (var i = 1; i < points.length - 1; i++) {
+      var coordinate = points[i].getCoordinate();
+      points[i].dragging(false);
+
+      if (coordinate) {
+        logger.log("step", coordinate);
+        step.push(coordinate);
+      }
+    } // oups, aucun droits !
+    // on evite donc une requête inutile ...
+
+
+    if (this._noRightManagement) {
+      return;
+    } // valeurs selectionnées
+
+
+    this._currentTransport = options.transport;
+    this._currentComputation = options.computation;
+    this._currentExclusions = options.exclusions; // mise en place de la patience
+
+    this._displayWaitingContainer(); // on met en place l'affichage des resultats dans la fenetre de resultats.
+
+
+    var context = this;
+
+    this._requestRouting({
+      startPoint: start,
+      endPoint: end,
+      viaPoints: step,
+      graph: this._currentTransport,
+      routePreference: this._currentComputation,
+      exclusions: this._currentExclusions,
+      geometryInInstructions: true,
+      // surcharge obligatoire !
+      distanceUnit: "m",
+      // surcharge obligatoire !
+      // callback onSuccess
+      onSuccess: function onSuccess(results) {
+        logger.log(results);
+
+        if (results) {
+          context._fillRouteResultsDetails(results);
+        }
+      },
+      // callback onFailure
+      onFailure: function onFailure(error) {
+        // FIXME mise à jour du controle mais le service ne repond pas en 200 !?
+        context._hideWaitingContainer();
+
+        context._clearRouteResultsDetails();
+
+        logger.log(error.message);
+      }
+    });
+  },
+
+  /**
+   * this method is called by event 'click' on ''
+   * tag label (cf. this.),
+   * and it cleans the old route geometry.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onShowRouteResultsNewClick: function onShowRouteResultsNewClick(e) {
+    logger.log("onShowRouteResultsNewClick", e); // on reactive le drag&drop
+
+    var points = this._currentPoints;
+
+    for (var i = 0; i < points.length; i++) {
+      points[i].dragging(true);
+    } // clean avant un nouveau calcul !
+
+
+    this._clearRouteResultsDetails();
+
+    this._clearRouteResultsGeometry();
+
+    this._clearRouteResultsFeatureGeometry();
+  },
+
+  /**
+   * this method is called by event 'mouseover' on ''
+   * tag label (cf. this.),
+   * and it makes a style on feature route.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onRouteResultsDetailsMouseOver: function onRouteResultsDetailsMouseOver(e) {
+    logger.log("onRouteResultsDetailsMouseOver", e);
+    var idx = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__["default"].index(e.target.id); // valable uniquement pour le mode desktop !
+
+    if (!this._isDesktop) {
+      return;
+    }
+
+    if (!this._geojsonSections) {
+      return;
+    }
+
+    this._geojsonSections.eachLayer(function (layer) {
+      if (layer.feature.id === parseInt(idx, 10)) {
+        layer.setStyle({
+          weight: 10,
+          color: "#0F9DE8",
+          opacity: 0.5
+        });
+      }
+    });
+  },
+
+  /**
+   * this method is called by event 'mouseout' on ''
+   * tag label (cf. this.),
+   * and it deletes a style on feature route.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onRouteResultsDetailsMouseOut: function onRouteResultsDetailsMouseOut(e) {
+    logger.log("onRouteResultsDetailsMouseOut", e);
+    var idx = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__["default"].index(e.target.id); // valable uniquement pour le mode desktop !
+
+    if (!this._isDesktop) {
+      return;
+    }
+
+    if (!this._geojsonSections) {
+      return;
+    }
+
+    this._geojsonSections.eachLayer(function (layer) {
+      if (layer.feature.id === parseInt(idx, 10)) {
+        layer.setStyle({
+          color: "#ED7F10",
+          weight: 5,
+          opacity: 0.75
+        });
+      }
+    });
+  },
+
+  /**
+   * this method is called by event 'click' on ''
+   * tag label (cf. this.),
+   * and it deletes a style on feature route.
+   * Only for mobile !
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onRouteResultsDetailsClick: function onRouteResultsDetailsClick(e) {
+    logger.log("onRouteResultsDetailsClick", e);
+    var idx = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__["default"].index(e.target.id);
+    var self = this; // valable uniquement pour le mode mobile !
+
+    if (this._isDesktop) {
+      return;
+    }
+
+    if (!this._geojsonSections) {
+      return;
+    } // afficher le detail cumulé du parcours !
+
+
+    var newInstruction = e.target.title;
+    var oldInstruction = e.target.innerHTML;
+
+    this._geojsonSections.eachLayer(function (layer) {
+      if (layer.feature.id === parseInt(idx, 10)) {
+        e.target.innerHTML = newInstruction;
+        layer.setStyle({
+          weight: 10,
+          color: "#0F9DE8",
+          opacity: 0.5
+        });
+      }
+    });
+
+    clearTimeout(1000);
+    setTimeout(function () {
+      self._geojsonSections.eachLayer(function (layer) {
+        if (layer.feature.id === parseInt(idx, 10)) {
+          e.target.innerHTML = oldInstruction;
+          layer.setStyle({
+            color: "#ED7F10",
+            weight: 5,
+            opacity: 0.75
+          });
+        }
+      });
+    }, 1000);
+  },
+  // ################################################################### //
+  // ########################### Routing ############################### //
+  // ############## (methods to request and results) ################### //
+
+  /**
+   * this method is called by this.onRouteComputationSubmit()
+   * and executes a request to the service.
+   *
+   * @param {Object} settings - service settings
+   * @param {Function} settings.onSuccess - callback
+   * @param {Function} settings.onFailure - callback
+   *
+   * @private
+   */
+  _requestRouting: function _requestRouting(settings) {
+    // on ne fait pas de requête si on n'a pas renseigné de parametres !
+    if (!settings || Object.keys(settings).length === 0) {
+      return;
+    } // on ne fait pas de requête si
+    // - la parametre 'startPoint' est vide !
+
+
+    if (!settings.startPoint) {
+      return;
+    } // - la parametre 'endPoint' est vide !
+
+
+    if (!settings.endPoint) {
+      return;
+    }
+
+    logger.log(settings); // on ne fait pas de requête si aucun droit !
+
+    if (this._noRightManagement) {
+      logger.log("no rights for all service !?");
+      return;
+    } // gestion des droits !
+
+
+    if (!this._resources["Itineraire"]) {
+      logger.log("no rights for this service !?");
+      return;
+    }
+
+    var resources = this._resources["Itineraire"].resources;
+
+    if (!resources || Object.keys(resources).length === 0) {
+      return;
+    } // gestion de la clef !
+
+
+    var key = this._resources["Itineraire"]["key"];
+    var options = {}; // on recupere les options du service
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, this.options.routeOptions); // ainsi que les parametres de saisie et les callbacks
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, settings); // la ressource donne elle des droits ?
+
+    var bFound = false;
+
+    for (var i = 0; i < resources.length; i++) {
+      if (resources[i] === options.graph) {
+        bFound = true;
+      }
+    } // on fait quoi ?
+
+
+    if (!bFound) {
+      logger.log("no rights for this service !?");
+      return;
+    } // cas où la clef API n'est pas renseignée dans les options du service,
+    // on utilise celle de l'autoconf ou celle renseignée au niveau du controle
+
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      apiKey: this.options.routeOptions.apiKey || this.options.apiKey || key
+    }); // si l'utilisateur a spécifié le paramètre ssl au niveau du control, on s'en sert
+    // true par défaut (https)
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      ssl: this.options.ssl
+    });
+    logger.log(options);
+    geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__["default"].Services.route(options);
+  },
+
+  /**
+   * this method is called by this.onRouteComputationSubmit()
+   * and fills the container of the route instructions list, distance and time
+   * information, aslo, constructs the geometry route.
+   *
+   * @param {Object} results - results of the route calculation
+   *
+   * @private
+   */
+  _fillRouteResultsDetails: function _fillRouteResultsDetails(results) {
+    // FIXME
+    // gestion des temps de traitement avec des callback !?
+    // Distance et Durée
+    var distance = results.totalDistance;
+    var duration = results.totalTime; // Détails avec simplifications des troncons
+
+    var instructions = this._simplifiedInstructions(results.routeInstructions); // var instructions = results.routeInstructions;
+
+
+    if (instructions) {
+      this._fillRouteResultsDetailsContainer(distance, duration, instructions);
+    } // Geometries simplifiées
+
+
+    var geometry = results.routeGeometry;
+
+    if (geometry) {
+      this._fillRouteResultsDetailsGeometry(geometry);
+    } // existe t il une geometrie pour chaque troncon de route ?
+
+
+    var bGeometryInstructions = instructions[0].geometry.length !== 0; // Geometries des tronçon
+
+    if (instructions && bGeometryInstructions) {
+      this._fillRouteResultsDetailsFeatureGeometry(instructions);
+    } // Emprise
+
+
+    var bbox = results.bbox;
+
+    if (bbox) {
+      var map = this._map;
+      var bounds = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.latLngBounds([bbox.bottom, bbox.left], [bbox.top, bbox.right]);
+      map.fitBounds(bounds, {
+        padding: [1, 1]
+      });
+    } // sauvegarde de l'etat des resultats
+
+
+    this._currentRouteInformations = results; // mise à jour du controle !
+
+    this._formRouteContainer.className = "GProuteComponentHidden";
+
+    this._hideWaitingContainer();
+
+    this._resultsRouteContainer.className = "";
+  },
+
+  /**
+   * this method is called by this._fillRouteResultsDetails()
+   * and fills the container of the route instructions list, distance and time
+   * information.
+   *
+   * @param {Number} distance - distance
+   * @param {Number} duration - duration
+   * @param {Object[]} instructions - list of instructions
+   *
+   * @private
+   */
+  _fillRouteResultsDetailsContainer: function _fillRouteResultsDetailsContainer(distance, duration, instructions) {
+    // FIXME callback
+    // Distance et Durée
+    this._resultsRouteValuesContainer = this._addRouteResultsValuesElement(distance, duration, this._convertSecondsToTime); // Détails
+
+    this._resultsRouteDetailsContainer = this._addRouteResultsDetailsElement(instructions, this._convertSecondsToTime);
+  },
+
+  /**
+   * this method is called by this._fillRouteResultsDetails()
+   * and constructs the simplified geometry route.
+   *
+   * @param {Object} geometry - geometry
+   *
+   * @private
+   */
+  _fillRouteResultsDetailsGeometry: function _fillRouteResultsDetailsGeometry(geometry) {
+    // FIXME callback
+    this._clearRouteResultsGeometry();
+
+    var map = this._map;
+    var _style = {
+      color: "#ff7800",
+      weight: 5,
+      opacity: 0.65
+    };
+    this._geojsonRoute = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.geoJson(geometry, {
+      style: _style
+    }).addTo(map);
+  },
+
+  /**
+   * this method is called by this._fillRouteResultsDetails()
+   * and constructs the geometries street with informations.
+   *
+   * @param {Object[]} instructions - instructions
+   *
+   * @private
+   */
+  _fillRouteResultsDetailsFeatureGeometry: function _fillRouteResultsDetailsFeatureGeometry(instructions) {
+    // FIXME callback
+    this._clearRouteResultsFeatureGeometry();
+
+    var map = this._map;
+    var _style = {
+      color: "#ED7F10",
+      weight: 5,
+      opacity: 0.75
+    };
+    var _geometry = {
+      type: "FeatureCollection",
+      features: []
+    };
+
+    for (var i = 0; i < instructions.length; i++) {
+      var o = instructions[i];
+      var id = i + 1;
+
+      _geometry.features.push({
+        id: id,
+        type: "Feature",
+        geometry: o.geometry,
+        properties: {
+          popupContent: "(" + id + ") distance : " + this._convertDistance(o.distance) + " / temps : " + this._convertSecondsToTime(o.duration)
+        }
+      });
+    }
+
+    var self = this;
+
+    function resetHighlight(e) {
+      var layer = e.target;
+
+      self._geojsonSections.resetStyle(layer);
+
+      var div = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("GProuteResultsDetailsInstruction_" + layer.feature.id + "-" + self._uid);
+      leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.removeClass(div, "GProuteResultsDetailsHighlight");
+    }
+
+    function highlightFeature(e) {
+      var layer = e.target;
+      logger.log(layer);
+      layer.setStyle({
+        weight: 10,
+        color: "#0F9DE8",
+        opacity: 0.5
+      });
+      var div = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("GProuteResultsDetailsInstruction_" + layer.feature.id + "-" + self._uid);
+      leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.addClass(div, "GProuteResultsDetailsHighlight");
+    }
+
+    this._geojsonSections = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.geoJson(_geometry, {
+      style: _style,
+      // Function that will be called on each created feature layer.
+      onEachFeature: function onEachFeature(feature, layer) {
+        layer.on({
+          mouseover: highlightFeature,
+          mouseout: resetHighlight
+        });
+        layer.bindPopup(feature.properties.popupContent);
+      }
+    }).addTo(map);
+  },
+  // ################################################################### //
+  // ############################# Clean ############################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onShowRoutePanelClick()
+   * and it clears all elements (reinit).
+   *
+   * @private
+   */
+  _clear: function _clear() {
+    this._currentTransport = null;
+    this._currentExclusions = [];
+    this._currentComputation = null; // les resultats
+
+    this._clearRouteResultsDetails(); // la geometrie
+
+
+    this._clearRouteResultsGeometry();
+
+    this._clearRouteResultsFeatureGeometry(); // les points
+
+
+    for (var i = 0; i < this._currentPoints.length; i++) {
+      this._currentPoints[i].clear();
+    }
+  },
+
+  /**
+   * this method is called by this.onRouteComputationSubmit()
+   * and it clears all route instructions.
+   *
+   * @private
+   */
+  _clearRouteResultsDetails: function _clearRouteResultsDetails() {
+    this._currentRouteInformations = null; // doit on nettoyer le container "GProuteResultsDetails" ?
+    // il sera de toute façon écrasé par la prochaine requête...
+
+    if (this._resultsRouteDetailsContainer) {
+      var divD = this._resultsRouteDetailsContainer;
+
+      if (divD.childElementCount) {
+        while (divD.firstChild) {
+          divD.removeChild(divD.firstChild);
+        }
+      }
+    }
+
+    if (this._resultsRouteValuesContainer) {
+      var divV = this._resultsRouteValuesContainer;
+
+      if (divV.childElementCount) {
+        while (divV.firstChild) {
+          divV.removeChild(divV.firstChild);
+        }
+      }
+    }
+  },
+
+  /**
+   * this method is called by this.onRouteComputationSubmit()
+   * and it clears all route geometries.
+   *
+   * @private
+   */
+  _clearRouteResultsGeometry: function _clearRouteResultsGeometry() {
+    var map = this._map;
+
+    if (this._geojsonRoute != null) {
+      map.removeLayer(this._geojsonRoute);
+      this._geojsonRoute = null;
+    }
+  },
+
+  /**
+   * this method is called by this.onRouteComputationSubmit()
+   * and it clears all route geometries.
+   *
+   * @private
+   */
+  _clearRouteResultsFeatureGeometry: function _clearRouteResultsFeatureGeometry() {
+    var map = this._map;
+
+    if (this._geojsonSections != null) {
+      map.removeLayer(this._geojsonSections);
+      this._geojsonSections = null;
+    }
+  },
+  // ################################################################### //
+  // ############################ Patience ############################# //
+  // ################################################################### //
+
+  /**
+   * this method displays waiting container and sets a timeout
+   *
+   * @private
+   */
+  _displayWaitingContainer: function _displayWaitingContainer() {
+    this._waitingContainer.className = "GProuteCalcWaitingContainerVisible";
+    this._waiting = true; // mise en place d'un timeout pour réinitialiser le panel (cacher la patience)
+    // si on est toujours en attente (si la requête est bloquée par exemple)
+
+    if (this._timer) {
+      clearTimeout(this._timer);
+      this._timer = null;
+    }
+
+    var context = this;
+    this._timer = setTimeout(function () {
+      if (context._waiting === true) {
+        context._hideWaitingContainer();
+      } else {
+        if (context._timer) {
+          clearTimeout(context._timer);
+        }
+      }
+    }, 16000);
+  },
+
+  /**
+   * this method hides waiting container and clears timeout
+   *
+   * @private
+   */
+  _hideWaitingContainer: function _hideWaitingContainer() {
+    if (this._waiting) {
+      this._waitingContainer.className = "GProuteCalcWaitingContainerHidden";
+      this._waiting = false;
+      clearTimeout(this._timer);
+      this._timer = null;
+    }
+  },
+  // ################################################################### //
+  // ########################## Geometry ############################### //
+  // ################################################################### //
+
+  /**
+   * simplifies instructions
+   *
+   * @param {Object[]} instructions - instructions
+   *
+   * @returns {Object[]} simplified instructions
+   *
+   * @private
+   */
+  _simplifiedInstructions: function _simplifiedInstructions(instructions) {
+    var newInstructions = [];
+    var current = instructions[0]; // cas où...
+
+    if (instructions.length === 1) {
+      newInstructions.push(current);
+    }
+
+    for (var i = 1; i < instructions.length; i++) {
+      var o = instructions[i];
+
+      if (o.instruction === current.instruction) {
+        current.distance = (parseFloat(o.distance) + parseFloat(current.distance)).toString();
+        current.duration = (parseFloat(o.duration) + parseFloat(current.duration)).toString();
+
+        for (var j = 1; j < o.geometry.coordinates.length; j++) {
+          current.geometry.coordinates.push(o.geometry.coordinates[j]);
+        } // last
+
+
+        if (i === instructions.length - 1) {
+          newInstructions.push(current);
+          current = null;
+        }
+      } else {
+        newInstructions.push(current);
+        current = o; // last
+
+        if (i === instructions.length - 1) {
+          newInstructions.push(o);
+          current = null;
+        }
+      }
+    }
+
+    logger.log(newInstructions);
+    return newInstructions;
+  },
+  // ################################################################### //
+  // ################# Utils for Distance/Duration ##################### //
+  // ################################################################### //
+
+  /**
+   * convert seconds to time : HH:MM:SS
+   *
+   * @param {Number} duration - duration in seconds
+   *
+   * @returns {String} duration in HH:MM:SS
+   *
+   * @private
+   */
+  _convertSecondsToTime: function _convertSecondsToTime(duration) {
+    var time = "";
+    duration = Math.round(duration);
+    var hours = Math.floor(duration / (60 * 60));
+
+    if (!hours) {
+      hours = "00";
+    }
+
+    var divisor4minutes = duration % (60 * 60);
+    var minutes = Math.floor(divisor4minutes / 60);
+
+    if (!minutes) {
+      minutes = "00";
+    }
+
+    var divisor4seconds = divisor4minutes % 60;
+    var seconds = Math.ceil(divisor4seconds);
+
+    if (!seconds) {
+      seconds = "00";
+    }
+
+    time = hours + "h " + minutes + "m " + seconds + "s";
+    return time;
+  },
+
+  /**
+   * convert distance in meters or kilometers
+   *
+   * @param {Number} distance - distance in meters
+   *
+   * @returns {String} distance in km
+   *
+   * @private
+   */
+  _convertDistance: function _convertDistance(distance) {
+    var d = "";
+    var distanceKm = parseInt(distance / 1000, 10);
+
+    if (!distanceKm) {
+      d = parseInt(distance, 10) + " m"; // arrondi !
+    } else {
+      d = distanceKm + " km";
+    }
+
+    return d;
+  },
+  // ################################################################### //
+  // ###### METHODES PUBLIQUES (INTERFACE AVEC LE CONTROLE) ############ //
+  // ################################################################### //
+
+  /**
+   * This method is public.
+   * It allows to control the execution of a traitment.
+   *
+   * @param {Object} positions - positions = [{lng: , lat: }]
+   * @param {Object} options - options = {...}
+   */
+  compute: function compute(positions, options) {
+    if (!this._showRouteContainer.checked) {
+      this._pictoRouteContainer.click();
+    }
+
+    var map = this._map;
+
+    if (!map) {
+      return;
+    } // Les options par defauts
+
+
+    var settings = {
+      computation: "fastest",
+      transport: "Voiture",
+      exclusions: []
+    }; // On recupere les options
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(settings, options); // Liste des points !
+
+    var points = this._currentPoints;
+    var start = 0;
+    points[start].setCoordinate(positions[start]);
+    var startInput = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("GPlocationOrigin_" + 1 + "-" + this._uid);
+    startInput.value = positions[start].lng + " , " + positions[start].lat;
+    var end = positions.length - 1;
+    points[6].setCoordinate(positions[end]);
+    var endInput = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("GPlocationOrigin_" + 7 + "-" + this._uid);
+    endInput.value = positions[end].lng + " , " + positions[end].lat;
+
+    for (var i = 1; i < positions.length - 1; i++) {
+      points[i].setCoordinate(positions[i]);
+      var stepInput = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("GPlocationOrigin_" + i + "-" + this._uid);
+      stepInput.value = positions[i].lng + " , " + positions[i].lat;
+    }
+
+    settings.transport === "Voiture" ? leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("GProuteTransportCar-" + this._uid).checked = true : leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("GProuteTransportPedestrian-" + this._uid).checked = true;
+    settings.computation === "fastest" ? leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("GProuteComputationSelect-" + this._uid).selectedIndex = 0 : leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("GProuteComputationSelect-" + this._uid).selectedIndex = 1; // TODO exclusion !
+    // Calcul
+
+    this.onRouteComputationSubmit(settings);
+  }
+});
+/* harmony default export */ __webpack_exports__["default"] = (Route);
+
+/***/ }),
+/* 162 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34);
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_1__["default"].getLogger("RouteDOM");
+var RouteDOM = {
+  /**
+  * Add uuid to the tag ID
+  * @param {String} id - id selector
+  * @returns {String} uid - id selector with an unique id
+  */
+  _addUID: function _addUID(id) {
+    var uid = this._uid ? id + "-" + this._uid : id;
+    return uid;
+  },
+
+  /**
+   * Main container (DOM)
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createMainContainerElement: function _createMainContainerElement() {
+    var container = document.createElement("div");
+    container.id = this._addUID("GProute");
+    container.className = "GPwidget";
+    return container;
+  },
+  // ################################################################### //
+  // ################# Methods to display Main Panel ################### //
+  // ################################################################### //
+
+  /**
+   * Hidden checkbox for minimizing/maximizing panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowRouteElement: function _createShowRouteElement() {
+    var input = document.createElement("input");
+    input.id = this._addUID("GPshowRoute");
+    input.type = "checkbox";
+    return input;
+  },
+
+  /**
+   * Show route control
+   * see event !
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowRoutePictoElement: function _createShowRoutePictoElement() {
+    // contexte d'execution
+    var context = this;
+    var label = document.createElement("label");
+    label.id = this._addUID("GPshowRoutePicto");
+    label.className = "GPshowAdvancedToolPicto";
+    label.htmlFor = this._addUID("GPshowRoute");
+    label.title = "Ouvrir le calcul d'itinéraire"; // gestionnaire d'evenement :
+    // on ouvre le menu de saisie du calcul d'itiniraire
+    // L'ouverture/Fermeture permet de faire le menage
+    // (reinitialisation)
+
+    if (label.addEventListener) {
+      label.addEventListener("click", function (e) {
+        context.onShowRoutePanelClick(e);
+      });
+    } else if (label.attachEvent) {
+      label.attachEvent("onclick", function (e) {
+        context.onShowRoutePanelClick(e);
+      });
+    }
+
+    var spanOpen = document.createElement("span");
+    spanOpen.id = this._addUID("GPshowRouteOpen");
+    spanOpen.className = "GPshowAdvancedToolOpen";
+    label.appendChild(spanOpen);
+    return label;
+  },
+  // ################################################################### //
+  // ################## Methods to display Inputs Panel ################ //
+  // ################################################################### //
+
+  /**
+   * Create Container Panel
+   *
+   * FIXME
+   * don't call this._createRoutePanelHeaderElement
+   * don't call this._createRoutePanelFormElement
+   * don't call this._createRoutePanelResultsElement
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRoutePanelElement: function _createRoutePanelElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GProutePanel");
+    div.className = "GPpanel"; // div.appendChild(this._createRoutePanelHeaderElement());
+    // div.appendChild(this._createRoutePanelFormElement());
+    // div.appendChild(this._createRoutePanelResultsElement());
+
+    return div;
+  },
+
+  /**
+   * Create Header Panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRoutePanelHeaderElement: function _createRoutePanelHeaderElement() {
+    // contexte d'execution
+    var self = this;
+    var container = document.createElement("div");
+    container.className = "GPpanelHeader";
+    var div = document.createElement("div");
+    div.className = "GPpanelTitle";
+    div.innerHTML = "Calcul d'itinéraire";
+    container.appendChild(div);
+    var divClose = document.createElement("div");
+    divClose.id = this._addUID("GProutePanelClose");
+    divClose.className = "GPpanelClose";
+    divClose.title = "Masquer le panneau"; // Link panel close / visibility checkbox
+
+    if (divClose.addEventListener) {
+      divClose.addEventListener("click", function () {
+        document.getElementById(self._addUID("GPshowRoutePicto")).click();
+      }, false);
+    } else if (divClose.attachEvent) {
+      divClose.attachEvent("onclick", function () {
+        document.getElementById(self._addUID("GPshowRoutePicto")).click();
+      });
+    }
+
+    container.appendChild(divClose);
+    return container;
+  },
+
+  /**
+   * Create Form
+   * see evenement !
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRoutePanelFormElement: function _createRoutePanelFormElement() {
+    // contexte d'execution
+    var self = this;
+    var form = document.createElement("form");
+    form.id = this._addUID("GProuteForm");
+    form.setAttribute("onkeypress", "return event.keyCode != 13;"); // FIXME hack pour desactiver l'execution via 'enter' au clavier !
+
+    form.addEventListener("submit", function (e) {
+      logger.log(e);
+      e.preventDefault(); // points
+
+      var points = document.getElementsByClassName(self._addUID("GPlocationPoint")); // Must have at least two origin points
+
+      var start = points[0].childNodes[0].id;
+      var end = points[points.length - 1].childNodes[0].id;
+      var startID = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(start);
+      var endID = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(end);
+
+      if (document.getElementById(self._addUID("GPlocationOrigin_" + startID)).value === "" && document.getElementById(self._addUID("GPlocationOriginCoords_" + startID)).value === "" || document.getElementById(self._addUID("GPlocationOrigin_" + endID)).value === "" && document.getElementById(self._addUID("GPlocationOriginCoords_" + endID)).value === "") {
+        return false;
+      } // Send stages to results panel
+
+
+      var id;
+      document.getElementById(self._addUID("GProuteResultsStages")).innerHTML = "";
+
+      for (var i = 0; i < points.length; i++) {
+        var tag = points[i].childNodes[0].id;
+        id = _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(tag);
+
+        if (document.getElementById(self._addUID("GPlocationPoint_" + id)).className === "GPflexInput GPlocationStageFlexInput") {
+          var resultStage = document.createElement("div");
+          resultStage.className = "GProuteResultsStages";
+          var resultStageLabel = document.createElement("div");
+          resultStageLabel.className = "GProuteResultStageLabel";
+          resultStageLabel.innerHTML = document.getElementById(self._addUID("GPlocationOriginLabel_" + id)).innerHTML + " :";
+          resultStage.appendChild(resultStageLabel);
+          var resultStageValue = document.createElement("div");
+          resultStageValue.className = "GProuteResultStageValue";
+          var elementCoords = document.getElementById(self._addUID("GPlocationOriginCoords_" + id));
+          var stageCoords = elementCoords.value;
+          var visible = elementCoords.className === "GPlocationOriginVisible";
+
+          if (stageCoords !== null && stageCoords !== "" && visible) {
+            resultStageValue.innerHTML = stageCoords;
+          } else {
+            resultStageValue.innerHTML = document.getElementById(self._addUID("GPlocationOrigin_" + id)).value;
+          }
+
+          resultStage.appendChild(resultStageValue);
+
+          if (resultStageValue.innerHTML !== "") {
+            document.getElementById(self._addUID("GProuteResultsStages")).appendChild(resultStage);
+          }
+        }
+      } // on peut récuperer les valeurs utiles pour les transmettre au service d'iti...
+      // - le mode de calcul
+      // - le mode de transport
+      // - les exclusions
+      // Les points sont déjà stockés dans l'application.
+      // computation mode params
+
+
+      var modeComputation = null;
+
+      if (document.getElementById(self._addUID("GProuteComputationSelect"))) {
+        var select = document.getElementById(self._addUID("GProuteResultsComputationSelect"));
+        select.selectedIndex = document.getElementById(self._addUID("GProuteComputationSelect")).selectedIndex;
+        modeComputation = select.options[select.selectedIndex].value;
+      } // transport mode params
+
+
+      var modeTransport = null; // voiture ?
+
+      if (document.getElementById(self._addUID("GProuteTransportCar"))) {
+        if (document.getElementById(self._addUID("GProuteTransportCar")).checked) {
+          modeTransport = document.getElementById(self._addUID("GProuteTransportCar")).value;
+        }
+      } // pieton ?
+
+
+      if (document.getElementById(self._addUID("GProuteTransportPedestrian"))) {
+        if (document.getElementById(self._addUID("GProuteTransportPedestrian")).checked) {
+          modeTransport = document.getElementById(self._addUID("GProuteTransportPedestrian")).value;
+        }
+      } // exclusions params
+
+
+      var exclusions = [];
+      var exclusionsElement = document.getElementsByClassName("GProuteExclusionsOption");
+
+      for (var j = 0; j < exclusionsElement.length; j++) {
+        id = exclusionsElement[j].htmlFor;
+        var el = document.getElementById(id);
+
+        if (!el.checked) {
+          exclusions.push(el.value);
+        }
+      }
+
+      self.onRouteComputationSubmit({
+        computation: modeComputation,
+        transport: modeTransport,
+        exclusions: exclusions
+      }); // FIXME mise à jour du controle dans le composant JS !
+      // document.getElementById(self._addUID("GProuteForm")).className = "GProuteComponentHidden";
+      // document.getElementById(self._addUID("GProuteResultsPanel")).className = "";
+
+      return false;
+    });
+    return form;
+  },
+
+  /**
+   * Create Results Panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRoutePanelResultsElement: function _createRoutePanelResultsElement() {
+    var container = document.createElement("div");
+    container.id = this._addUID("GProuteResultsPanel");
+    container.className = "GProuteComponentHidden";
+    container.appendChild(this._createRouteResultsStagesElement());
+    container.appendChild(this._createRouteResultsElement());
+    var divBorderUp = document.createElement("div");
+    divBorderUp.className = "GPfakeBorder GPfakeBorderLeft";
+    container.appendChild(divBorderUp);
+    container.appendChild(this._createRouteShowResultsDetailsElement());
+    var labelShow = document.createElement("label");
+    labelShow.htmlFor = this._addUID("GProuteResultsShowDetails");
+    labelShow.innerHTML = "Afficher le détail";
+    container.appendChild(labelShow);
+    var labelHide = document.createElement("label");
+    labelHide.htmlFor = this._addUID("GProuteResultsShowDetails");
+    labelHide.innerHTML = "Masquer le détail";
+    container.appendChild(labelHide);
+    var divBorderDown = document.createElement("div");
+    divBorderDown.className = "GPfakeBorder";
+    container.appendChild(divBorderDown);
+    container.appendChild(this._createRouteResultsDetailsElement());
+    return container;
+  },
+
+  /**
+   * Create Waiting Panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRouteWaitingElement: function _createRouteWaitingElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GProuteCalcWaitingContainer");
+    div.className = "GProuteCalcWaitingContainerHidden";
+    var p = document.createElement("p");
+    p.className = "GProuteCalcWaiting";
+    p.innerHTML = "Calcul en cours...";
+    div.appendChild(p);
+    return div;
+  },
+  // ################################################################### //
+  // ############### Methods to the window results ##################### //
+  // ################################################################### //
+
+  /**
+   * Create Results Stages
+   * (results dynamically generate !)
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRouteResultsStagesElement: function _createRouteResultsStagesElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GProuteResultsStages");
+    return div;
+  },
+
+  /**
+   * Create Show Results
+   * see event!
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRouteResultsElement: function _createRouteResultsElement() {
+    // contexte
+    var self = this;
+    var container = document.createElement("div");
+    container.id = this._addUID("GProuteResults"); // FIXME Route results are dynamically filled in Javascript by route service
+
+    var divValue = document.createElement("div");
+    divValue.id = this._addUID("GProuteResultsValues");
+    container.appendChild(divValue);
+    var divMode = document.createElement("div");
+    divMode.id = this._addUID("GProuteResultsMode");
+    var select = document.createElement("select");
+    select.id = this._addUID("GProuteResultsComputationSelect");
+    select.className = "GPinputSelect"; // gestionnaire d'evenement :
+    // on stocke la valeur du mode de calcul, et on relance le calcul d'itiniraire
+
+    select.addEventListener("change", function (e) {
+      self.onRouteModeComputationChangeAndRun(e);
+    });
+    var computes = [{
+      code: "fastest",
+      label: "Plus rapide"
+    }, {
+      code: "shortest",
+      label: "Plus court"
+    }];
+
+    for (var i = 0; i < computes.length; i++) {
+      var option = document.createElement("option");
+      option.value = computes[i].code;
+      option.text = computes[i].label;
+      select.appendChild(option);
+    }
+
+    divMode.appendChild(select);
+    container.appendChild(divMode);
+    var divNew = document.createElement("div");
+    divNew.id = this._addUID("GProuteResultsNew");
+    divNew.title = "Modifier le calcul";
+    divNew.addEventListener("click", function (e) {
+      document.getElementById(self._addUID("GProuteResultsPanel")).className = "GProuteComponentHidden";
+      document.getElementById(self._addUID("GProuteForm")).className = "";
+      self.onShowRouteResultsNewClick(e);
+    });
+    container.appendChild(divNew);
+    return container;
+  },
+
+  /**
+   * Add Results Duration and Distance
+   * (results dynamically generate !)
+   * see event!
+   * @param {Number} distance - distance
+   * @param {Number} duration - duration
+   * @param {Function} fconvert - fconvert
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _addRouteResultsValuesElement: function _addRouteResultsValuesElement(distance, duration, fconvert) {
+    var div = document.getElementById(this._addUID("GProuteResultsValues")); // clean !
+
+    if (div.childElementCount) {
+      while (div.firstChild) {
+        div.removeChild(div.firstChild);
+      }
+    }
+
+    var containerDistance = document.createElement("div");
+    containerDistance.className = "GProuteResultsValue";
+    var labelDistance = document.createElement("label");
+    labelDistance.className = "GProuteResultsValueLabel";
+    labelDistance.innerHTML = "Distance :";
+    containerDistance.appendChild(labelDistance);
+    var distanceLabel = 0;
+    var isKm = parseInt(distance / 1000, 10);
+
+    if (!isKm) {
+      distanceLabel = Math.round(distance) + " m";
+    } else {
+      var distanceArrondi = Math.round(distance);
+      distanceArrondi = distanceArrondi / 1000;
+      distanceLabel = distanceArrondi + " km";
+    }
+
+    var divDistance = document.createElement("div");
+    divDistance.id = this._addUID("GProuteResultsValueDist");
+    divDistance.innerHTML = distanceLabel;
+    containerDistance.appendChild(divDistance);
+    div.appendChild(containerDistance);
+    var containerDuration = document.createElement("div");
+    containerDuration.className = "GProuteResultsValue";
+    var labelDuration = document.createElement("label");
+    labelDuration.className = "GProuteResultsValueLabel";
+    labelDuration.innerHTML = "Durée :";
+    containerDuration.appendChild(labelDuration);
+    var divDuration = document.createElement("div");
+    divDuration.id = this._addUID("GProuteResultsValueDist");
+    divDuration.innerHTML = fconvert(duration);
+    containerDuration.appendChild(divDuration);
+    div.appendChild(containerDuration);
+    return div;
+  },
+
+  /**
+   * Create Show Results Details
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRouteShowResultsDetailsElement: function _createRouteShowResultsDetailsElement() {
+    var input = document.createElement("input");
+    input.id = this._addUID("GProuteResultsShowDetails");
+    input.type = "checkbox";
+    return input;
+  },
+
+  /**
+   *  Create Results Details
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRouteResultsDetailsElement: function _createRouteResultsDetailsElement() {
+    // <!-- Route results details are dynamically filled in Javascript by route service -->
+    var div = document.createElement("div");
+    div.id = this._addUID("GProuteResultsDetails");
+    return div;
+  },
+
+  /**
+   *  Add Results Details
+   * (results dynamically generate !)
+   * @param {Object[]} instructions - instructions
+   * @param {Function} fconvert - fconvert
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _addRouteResultsDetailsElement: function _addRouteResultsDetailsElement(instructions, fconvert) {
+    // contexte
+    var context = this;
+    var div = document.getElementById(this._addUID("GProuteResultsDetails")); // clean !
+
+    if (div.childElementCount) {
+      while (div.firstChild) {
+        div.removeChild(div.firstChild);
+      }
+    } // calcul des valeurs cumulé !
+
+
+    var distanceCumul = 0;
+    var durationCumul = 0;
+    /* jshint -W083 */
+
+    for (var i = 0; i < instructions.length; i++) {
+      var id = i + 1;
+      var o = instructions[i];
+      var divNum = document.createElement("div");
+      divNum.className = "GProuteResultsDetailsNumber";
+      divNum.innerHTML = id + ".";
+      div.appendChild(divNum);
+      durationCumul += parseFloat(o.duration);
+      distanceCumul += parseFloat(o.distance);
+      var distance = 0;
+      var isCumulKm = parseInt(distanceCumul / 1000, 10);
+
+      if (!isCumulKm) {
+        distance = Math.round(distanceCumul) + " m";
+      } else {
+        var distanceArrondi = Math.round(distanceCumul);
+        distanceArrondi = distanceArrondi / 1000;
+        distance = distanceArrondi + " km";
+      }
+
+      var divIns = document.createElement("div");
+      divIns.className = "GProuteResultsDetailsInstruction";
+      divIns.id = this._addUID("GProuteResultsDetailsInstruction_" + id);
+      divIns.title = "distance : " + distance + " / " + "temps : " + fconvert(durationCumul);
+      divIns.innerHTML = o.instruction;
+      divIns.addEventListener("mouseover", function (e) {
+        context.onRouteResultsDetailsMouseOver(e);
+      });
+      divIns.addEventListener("mouseout", function (e) {
+        context.onRouteResultsDetailsMouseOut(e);
+      });
+      divIns.addEventListener("click", function (e) {
+        // mode mobile !
+        if (typeof context.onRouteResultsDetailsClick === "function") {
+          context.onRouteResultsDetailsClick(e);
+        }
+      });
+      div.appendChild(divIns);
+    }
+
+    return div;
+  },
+  // ################################################################### //
+  // ################### Methods to the form points #################### //
+  // ################# OVERWRITTEN BY LOCATIONSELECTOR ! ################# //
+
+  /**
+   * Create Point
+   * see event !
+   * OVERWRITTEN BY LOCATIONSELECTOR !
+   * (version initial without LOCATIONSELECTOR PLUGIN)
+   * @param {Integer} n - n
+   * @param {String} text - text
+   * @param {Boolean} visibility - visibility
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRoutePanelFormPointElement: function _createRoutePanelFormPointElement(n, text, visibility) {
+    // contexte d'execution
+    var context = this;
+    var div = document.createElement("div");
+    div.id = "GProutePoint" + n;
+    div.className = visibility ? "GPflexInput GProuteStageFlexInput" : "GPflexInput GProuteStageFlexInputHidden";
+    var labelOrigin = document.createElement("label");
+    labelOrigin.id = "GProuteOriginLabel" + n;
+    labelOrigin.htmlFor = "GProuteOrigin" + n;
+    labelOrigin.innerHTML = text;
+    labelOrigin.addEventListener("click", function () {
+      var i = this.id.charAt(this.id.length - 1);
+      document.getElementById("GProuteOriginCoords" + i).value = "";
+
+      for (var j = 1; j < 8; j++) {
+        document.getElementById("GProutePoint" + j).style.display = "flex";
+      }
+
+      document.getElementById("GProuteForm").className = "";
+      document.getElementById("GProuteOriginPointer" + i).checked = false;
+      document.getElementById("GProuteOrigin" + i).className = "GProuteOriginVisible";
+      document.getElementById("GProuteOriginCoords" + i).className = "GProuteOriginHidden";
+    });
+    div.appendChild(labelOrigin);
+    var inputOrigin = document.createElement("input");
+    inputOrigin.id = "GProuteOrigin" + n;
+    inputOrigin.className = "GProuteOriginVisible";
+    inputOrigin.type = "text";
+    inputOrigin.placeholder = "Saisir une adresse";
+    inputOrigin.addEventListener("keyup", function (e) {
+      var charCode = e.which || e.keyCode;
+
+      if (charCode === 13 || charCode === 10) {
+        return;
+      }
+
+      var i = this.id.charAt(this.id.length - 1);
+
+      if (document.getElementById("GProuteOrigin" + i).value.length > 2) {
+        document.getElementById("GProuteAutoCompleteList" + i).style.display = "block";
+      } else {
+        document.getElementById("GProuteAutoCompleteList" + i).style.display = "none";
+      } // gestionnaire d'evenement :
+      // on récupère la valeur de saisie pour une requête sur le service d'autocompletion.
+      // le resultat de la requête nous permet de recuperer les coordonnées du point...
+
+
+      context.onAutoCompleteSearchText(e);
+    });
+    inputOrigin.addEventListener("blur", function () {
+      var i = this.id.charAt(this.id.length - 1);
+      document.getElementById("GProuteAutoCompleteList" + i).style.display = "none";
+    });
+    div.appendChild(inputOrigin);
+    var inputOriginCoord = document.createElement("input");
+    inputOriginCoord.id = "GProuteOriginCoords" + n;
+    inputOriginCoord.className = "GProuteOriginHidden";
+    inputOriginCoord.type = "text";
+    inputOriginCoord.disabled = true;
+    div.appendChild(inputOriginCoord);
+    var inputOriginPointer = document.createElement("input");
+    inputOriginPointer.id = "GProuteOriginPointer" + n;
+    inputOriginPointer.type = "checkbox";
+    div.appendChild(inputOriginPointer);
+    var labelOriginPointer = document.createElement("label");
+    labelOriginPointer.id = "GProuteOriginPointerImg" + n;
+    labelOriginPointer.htmlFor = "GProuteOriginPointer" + n;
+    labelOriginPointer.className = "GProuteOriginPointerImg";
+    labelOriginPointer.title = "Pointer un lieu sur la carte";
+    labelOriginPointer.addEventListener("click", function (evt) {
+      evt.preventDefault();
+      evt.stopPropagation();
+      var i = this.id.charAt(this.id.length - 1);
+      var j;
+
+      for (j = 1; j < 8; j++) {
+        if (i !== j) {
+          document.getElementById("GProuteOriginPointer" + j).checked = false;
+
+          if (document.getElementById("GProuteOriginCoords" + j).value === "Pointer un lieu sur la carte") {
+            document.getElementById("GProuteOriginCoords" + j).value = "";
+            document.getElementById("GProuteOrigin" + j).className = "GProuteOriginVisible";
+            document.getElementById("GProuteOriginCoords" + j).className = "GProuteOriginHidden";
+          }
+        }
+      }
+
+      if (document.getElementById("GProuteOriginPointer" + i).checked) {
+        document.getElementById("GProuteOriginCoords" + i).value = "";
+
+        for (j = 1; j < 8; j++) {
+          document.getElementById("GProutePoint" + j).style.display = "flex";
+        }
+
+        document.getElementById("GProuteForm").className = "";
+        document.getElementById("GProuteOriginPointer" + i).checked = false;
+        document.getElementById("GProuteOrigin" + i).className = "GProuteOriginVisible";
+        document.getElementById("GProuteOriginCoords" + i).className = "GProuteOriginHidden";
+      } else {
+        document.getElementById("GProuteOriginCoords" + i).value = "Pointer un lieu sur la carte";
+
+        for (j = 1; j < 8; j++) {
+          if (i === j) {
+            document.getElementById("GProutePoint" + j).style.display = "flex";
+          } else {
+            document.getElementById("GProutePoint" + j).style.display = "none";
+          }
+        }
+
+        document.getElementById("GProuteForm").className = "GProuteFormMini";
+        document.getElementById("GProuteOriginPointer" + i).checked = true;
+        document.getElementById("GProuteOrigin" + i).className = "GProuteOriginHidden";
+        document.getElementById("GProuteOriginCoords" + i).className = "GProuteOriginVisible";
+      } // gestionnaire d'evenement :
+      // on stocke la valeur du point, utilisée pour la requête sur le service de calcul d'itiniraire
+
+
+      context.onRouteMapPointClick(evt);
+    });
+    div.appendChild(labelOriginPointer);
+    return div;
+  },
+
+  /**
+   * Create Remove Point tag
+   * see event !
+   * OVERWRITTEN BY LOCATIONSELECTOR !
+   * (version initial without LOCATIONSELECTOR PLUGIN)
+   * @param {Integer} n - n
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRoutePanelFormRemoveStageElement: function _createRoutePanelFormRemoveStageElement(n) {
+    // contexte d'execution
+    var context = this;
+    var divRm = document.createElement("div");
+    divRm.id = "GProuteStageRemove" + n;
+    divRm.className = "GProuteStageRemove";
+    divRm.title = "Supprimer l'étape";
+
+    if (n !== 1 && n !== 7) {
+      divRm.addEventListener("click", function (e) {
+        var i = this.id.charAt(this.id.length - 1);
+        document.getElementById("GProutePoint" + i).className = "GPflexInput GProuteStageFlexInputHidden";
+        document.getElementById("GProuteOrigin" + i).value = "";
+        document.getElementById("GProuteOrigin" + i).className = "GProuteOriginVisible";
+        document.getElementById("GProuteOriginCoords" + i).value = "";
+        document.getElementById("GProuteOriginCoords" + i).className = "GProuteOriginHidden";
+        document.getElementById("GProuteStageAdd").style.display = ""; // Moving up exclusions picto
+        // var exclusionsPictoTop = document.getElementById("GPshowRouteExclusionsPicto").style.top;
+        // document.getElementById("GPshowRouteExclusionsPicto").style.top = (parseInt(exclusionsPictoTop, 10) - 33).toString() + "px";
+        // gestionnaire d'evenement :
+        // on supprime le point, utilisé pour la requête sur le service d'itiniraire
+
+        context.onRouteRemovePointClick(e);
+      });
+    }
+
+    return divRm;
+  },
+
+  /**
+   * Create Add Point tag
+   * see event !
+   * OVERWRITTEN BY LOCATIONSELECTOR !
+   * (version initial without LOCATIONSELECTOR PLUGIN)
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRoutePanelFormAddStageElement: function _createRoutePanelFormAddStageElement() {
+    // contexte d'execution
+    var context = this;
+    var divAdd = document.createElement("div");
+    divAdd.id = "GProuteStageAdd";
+    divAdd.title = "Ajouter une étape";
+    divAdd.addEventListener("click", function (e) {
+      var lastStage = 1;
+      var nbStages = 0;
+
+      for (var i = 2; i < 7; i++) {
+        if (document.getElementById("GProutePoint" + i).className === "GPflexInput GProuteStageFlexInputHidden") {
+          if (lastStage === 1) {
+            lastStage = i;
+          }
+        } else {
+          nbStages++;
+        }
+      }
+
+      if (lastStage < 7) {
+        document.getElementById("GProutePoint" + lastStage).className = "GPflexInput GProuteStageFlexInput"; // Moving down exclusions picto
+        // var exclusionsPictoTop = document.getElementById("GPshowRouteExclusionsPicto").style.top;
+        // document.getElementById("GPshowRouteExclusionsPicto").style.top = (parseInt(exclusionsPictoTop, 10) + 33).toString() + "px";
+      }
+
+      if (nbStages === 4) {
+        document.getElementById("GProuteStageAdd").style.display = "none";
+      } // gestionnaire d'evenement :
+      // on ajoute le point, utilisé pour la requête sur le service d'itiniraire
+
+
+      context.onRouteAddPointClick(e);
+    });
+    return divAdd;
+  },
+
+  /**
+   * Create Results autocompletion to the point
+   * see event!
+   * OVERWRITTEN BY LOCATIONSELECTOR !
+   * (version initial without LOCATIONSELECTOR PLUGIN)
+   * @param {Integer} n - n
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRoutePanelFormAutoCompleteListElement: function _createRoutePanelFormAutoCompleteListElement(n) {
+    // contexte d'execution
+    var context = this;
+    var div = document.createElement("div");
+    div.id = "GProuteAutoCompleteList" + n;
+    div.className = "GPadvancedAutoCompleteList";
+
+    if (div.addEventListener) {
+      div.addEventListener("click", function (e) {
+        context.onAutoCompletedResultsItemClick(e);
+        document.getElementById("GProuteAutoCompleteList" + n).style.display = "none";
+      }, false);
+    } else if (div.attachEvent) {
+      div.attachEvent("onclick", function (e) {
+        context.onAutoCompletedResultsItemClick(e);
+        document.getElementById("GProuteAutoCompleteList" + n).style.display = "none";
+      });
+    } // Proposals are dynamically filled in Javascript by autocomplete service
+    // <div class="GPautoCompleteProposal">...</div>
+
+
+    return div;
+  },
+
+  /**
+   * Autocompletion result to a point.
+   * Proposals are dynamically filled in Javascript by autocomplete service
+   * OVERWRITTEN BY LOCATIONSELECTOR !
+   * (version initial without LOCATIONSELECTOR PLUGIN)
+   *
+   *
+   * @param {Object} location - suggested location results
+   * @param {Number} n  - number of the point
+   * @param {Number} id - ID
+   */
+  _createRouteAutoCompletedLocationElement: function _createRouteAutoCompletedLocationElement(location, n, id) {
+    var container = document.getElementById("GProuteAutoCompleteList" + n);
+    var div = document.createElement("div");
+    div.id = "AutoCompletedLocation" + id;
+    div.className = "GPautoCompleteProposal";
+    div.innerHTML = location.fullText;
+    container.appendChild(div);
+  },
+  // ################################################################### //
+  // ############## Methods to the choice mode into form ############### //
+  // ################################################################### //
+
+  /**
+   * Create Container to Mode choice transport
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRoutePanelFormModeChoiceElement: function _createRoutePanelFormModeChoiceElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GProuteModeChoice"); // div.appendChild(this._createRoutePanelFormModeChoiceTransportElement());
+    // div.appendChild(this._createRoutePanelFormModeChoiceComputeElement());
+
+    return div;
+  },
+
+  /**
+   * Create Mode choice transport
+   * see event !
+   * FIXME event not useful
+   * @param {String[]} transports - transports
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRoutePanelFormModeChoiceTransportElement: function _createRoutePanelFormModeChoiceTransportElement(transports) {
+    // contexte d'execution
+    var context = this;
+    var div = document.createElement("div");
+    div.id = this._addUID("GProuteTransportChoice");
+    var span = document.createElement("span");
+    span.className = "GProuteModeLabel";
+    span.innerHTML = "Mode de transport";
+    div.appendChild(span);
+    /* jshint -W083 */
+
+    for (var i = 0; i < transports.length; i++) {
+      var transport = transports[i];
+
+      if (transport === "Voiture") {
+        var inputCar = document.createElement("input");
+        inputCar.id = this._addUID("GProuteTransportCar");
+        inputCar.type = "radio";
+        inputCar.name = "GProuteTransport";
+        inputCar.value = "Voiture";
+
+        if (i === 0) {
+          inputCar.checked = true;
+        } // gestionnaire d'evenement :
+        // on stocke le mode de transport,
+        // utilisation pour la requête sur le service de calcul d'itiniraire
+
+
+        if (inputCar.addEventListener) {
+          inputCar.addEventListener("change", function (e) {
+            context.onRouteModeTransportChange(e);
+          });
+        } else if (inputCar.attachEvent) {
+          inputCar.attachEvent("onchange", function (e) {
+            context.onRouteModeTransportChange(e);
+          });
+        }
+
+        div.appendChild(inputCar);
+        var labelCar = document.createElement("label");
+        labelCar.className = "GProuteTransportImg";
+        labelCar.htmlFor = this._addUID("GProuteTransportCar");
+        labelCar.title = "Voiture";
+        div.appendChild(labelCar);
+      }
+
+      if (transport === "Pieton") {
+        var inputPedestrian = document.createElement("input");
+        inputPedestrian.id = this._addUID("GProuteTransportPedestrian");
+        inputPedestrian.type = "radio";
+        inputPedestrian.name = "GProuteTransport";
+        inputPedestrian.value = "Pieton";
+
+        if (i === 0) {
+          inputPedestrian.checked = true;
+        } // gestionnaire d'evenement :
+        // on stocke le mode de transport,
+        // utilisation pour la requête sur le service de calcul d'itiniraire
+
+
+        if (inputPedestrian.addEventListener) {
+          inputPedestrian.addEventListener("change", function (e) {
+            context.onRouteModeTransportChange(e);
+          });
+        } else if (inputPedestrian.attachEvent) {
+          inputPedestrian.attachEvent("onchange", function (e) {
+            context.onRouteModeTransportChange(e);
+          });
+        }
+
+        div.appendChild(inputPedestrian);
+        var labelPedestrian = document.createElement("label");
+        labelPedestrian.className = "GProuteTransportImg";
+        labelPedestrian.htmlFor = this._addUID("GProuteTransportPedestrian");
+        labelPedestrian.title = "Piéton";
+        div.appendChild(labelPedestrian);
+      }
+    }
+
+    return div;
+  },
+
+  /**
+   * Create Mode choice computation
+   * see event!
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRoutePanelFormModeChoiceComputeElement: function _createRoutePanelFormModeChoiceComputeElement() {
+    // contexte d'execution
+    var context = this;
+    var div = document.createElement("div");
+    div.id = this._addUID("GProuteComputationChoice");
+    var span = document.createElement("span");
+    span.className = "GProuteModeLabel";
+    span.innerHTML = "Mode de calcul";
+    div.appendChild(span);
+    var select = document.createElement("select");
+    select.id = this._addUID("GProuteComputationSelect");
+    select.className = "GPinputSelect"; // gestionnaire d'evenement :
+    // on stocke la valeur du mode de calcul,
+    // utilisation pour la requête sur le service de calcul d'itiniraire
+
+    select.addEventListener("change", function (e) {
+      context.onRouteModeComputationChange(e);
+    });
+    var computes = [{
+      code: "fastest",
+      label: "Plus rapide"
+    }, {
+      code: "shortest",
+      label: "Plus court"
+    }];
+
+    for (var i = 0; i < computes.length; i++) {
+      var option = document.createElement("option");
+      option.value = computes[i].code;
+      option.text = computes[i].label;
+      select.appendChild(option);
+    }
+
+    div.appendChild(select);
+    return div;
+  },
+  // ################################################################### //
+  // ################# Methods to the choice exclusions ################ //
+  // ################################################################### //
+
+  /**
+   * Hidden checkbox for minimizing/maximizing Exclusions Options
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowRouteExclusionsElement: function _createShowRouteExclusionsElement() {
+    var input = document.createElement("input");
+    input.id = this._addUID("GPshowRouteExclusions");
+    input.type = "checkbox";
+    return input;
+  },
+
+  /**
+   * Label to Exclusions Options
+   * see event !
+   * FIXME event not useful
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowRouteExclusionsPictoElement: function _createShowRouteExclusionsPictoElement() {
+    // contexte d'execution
+    var context = this;
+    var label = document.createElement("label");
+    label.id = this._addUID("GPshowRouteExclusionsPicto");
+    label.className = "GPshowMoreOptionsImage GPshowMoreOptions GPshowRouteExclusionsPicto";
+    label.htmlFor = this._addUID("GPshowRouteExclusions");
+    label.title = "Exclusions"; // label.style.top = "185px";
+    // gestionnaire d'evenement :
+    // on ouvre le menu des options des exclusions
+
+    if (label.addEventListener) {
+      label.addEventListener("click", function (e) {
+        context.onShowRouteExclusionsClick(e);
+      });
+    } else if (label.attachEvent) {
+      label.attachEvent("onclick", function (e) {
+        context.onShowRouteExclusionsClick(e);
+      });
+    }
+
+    return label;
+  },
+
+  /**
+   * Create Container to Exclusions
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRoutePanelFormExclusionsElement: function _createRoutePanelFormExclusionsElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GProuteExclusions");
+    var span = document.createElement("span");
+    span.className = "GProuteExclusionsLabel";
+    span.innerHTML = "Passages autorisés";
+    div.appendChild(span); // div.appendChild(this._createRoutePanelFormExclusionOptionsElement());
+
+    return div;
+  },
+
+  /**
+   * Create Exclusions Options
+   * see event !
+   * FIXME event not useful
+   * @param {Object[]} exclusions - exclusions
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRoutePanelFormExclusionOptionsElement: function _createRoutePanelFormExclusionOptionsElement(exclusions) {
+    // contexte d'execution
+    var context = this;
+    var div = document.createElement("div");
+    div.className = "GProuteExclusionsOptions";
+    /* jshint -W083 */
+
+    for (var value in exclusions) {
+      if (exclusions.hasOwnProperty(value)) {
+        var status = exclusions[value];
+
+        switch (value) {
+          case "toll":
+            var inputToll = document.createElement("input");
+            inputToll.id = this._addUID("GProuteExclusionsToll");
+            inputToll.type = "checkbox";
+            inputToll.value = "Toll";
+            inputToll.checked = !status; // gestionnaire d'evenement :
+            // on stocke l'exclusion,
+            // utilisation pour la requête sur le service de calcul d'itiniraire
+
+            if (inputToll.addEventListener) {
+              inputToll.addEventListener("change", function (e) {
+                context.onRouteExclusionsChange(e);
+              });
+            } else if (inputToll.attachEvent) {
+              inputToll.attachEvent("onchange", function (e) {
+                context.onRouteExclusionsChange(e);
+              });
+            }
+
+            div.appendChild(inputToll);
+            var labelToll = document.createElement("label");
+            labelToll.className = "GProuteExclusionsOption";
+            labelToll.htmlFor = this._addUID("GProuteExclusionsToll");
+            labelToll.innerHTML = "Péages";
+            div.appendChild(labelToll);
+            break;
+
+          case "tunnel":
+            var inputTunnel = document.createElement("input");
+            inputTunnel.id = this._addUID("GProuteExclusionsTunnel");
+            inputTunnel.type = "checkbox";
+            inputTunnel.value = "Tunnel";
+            inputTunnel.checked = !status; // gestionnaire d'evenement :
+            // on stocke l'exclusion,
+            // utilisation pour la requête sur le service de calcul d'itiniraire
+
+            if (inputTunnel.addEventListener) {
+              inputTunnel.addEventListener("change", function (e) {
+                context.onRouteExclusionsChange(e);
+              });
+            } else if (inputTunnel.attachEvent) {
+              inputTunnel.attachEvent("onchange", function (e) {
+                context.onRouteExclusionsChange(e);
+              });
+            }
+
+            div.appendChild(inputTunnel);
+            var labelTunnel = document.createElement("label");
+            labelTunnel.className = "GProuteExclusionsOption";
+            labelTunnel.htmlFor = this._addUID("GProuteExclusionsTunnel");
+            labelTunnel.innerHTML = "Tunnels";
+            div.appendChild(labelTunnel);
+            break;
+
+          case "bridge":
+            var inputBridge = document.createElement("input");
+            inputBridge.id = this._addUID("GProuteExclusionsBridge");
+            inputBridge.type = "checkbox";
+            inputBridge.value = "Bridge";
+            inputBridge.checked = !status; // gestionnaire d'evenement :
+            // on stocke l'exclusion,
+            // utilisation pour la requête sur le service de calcul d'itiniraire
+
+            if (inputBridge.addEventListener) {
+              inputBridge.addEventListener("change", function (e) {
+                context.onRouteExclusionsChange(e);
+              });
+            } else if (inputBridge.attachEvent) {
+              inputBridge.attachEvent("onchange", function (e) {
+                context.onRouteExclusionsChange(e);
+              });
+            }
+
+            div.appendChild(inputBridge);
+            var labelBridge = document.createElement("label");
+            labelBridge.className = "GProuteExclusionsOption";
+            labelBridge.htmlFor = this._addUID("GProuteExclusionsBridge");
+            labelBridge.innerHTML = "Ponts";
+            div.appendChild(labelBridge);
+            break;
+        }
+      }
+    }
+
+    return div;
+  },
+  // ################################################################### //
+  // ############################### Submit Form ####################### //
+  // ################################################################### //
+
+  /**
+   * Create Submit Form Element
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRouteSubmitFormElement: function _createRouteSubmitFormElement() {
+    var input = document.createElement("input");
+    input.id = this._addUID("GProuteSubmit");
+    input.className = "GPinputSubmit";
+    input.type = "submit";
+    input.value = "Calculer";
+    return input;
+  },
+  // ################################################################### //
+  // ############################### Reset picto ####################### //
+  // ################################################################### //
+
+  /**
+   * Create Reset Picto Element
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createRouteFormResetElement: function _createRouteFormResetElement() {
+    var self = this;
+    var divReset = document.createElement("div");
+    divReset.id = this._addUID("GProuteReset");
+    divReset.title = "Réinitialiser les paramètres";
+    divReset.addEventListener("click", function (e) {
+      self.onRouteResetClick(e);
+    });
+    return divReset;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (RouteDOM);
+
+/***/ }),
+/* 163 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(40);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(34);
+/* harmony import */ var _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(140);
+/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(36);
+/* harmony import */ var _Common_Utils_SearchEngineUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(164);
+/* harmony import */ var _Utils_IconDefault__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(145);
+/* harmony import */ var _Common_Controls_SearchEngineDOM__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(165);
+/* global KeyboardEvent */
+
+
+
+
+
+
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__["default"].getLogger("searchengine");
+/**
+ * @classdesc
+ *
+ * Leaflet Control Class to search positons of geographic identifiers (places names, address, cadastral parcel) using :
+ *
+ * - the [geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage.html}.
+ * - the [autocompletion service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/autocompletion.html}
+ * <br/>
+ *
+ * Use {@link module :Controls.SearchEngine L.geoportalControl.SearchEngine()} factory to create instances of that class.
+ *
+ * **Extends** Leaflet <a href="http://leafletjs.com/reference.html#control" target="_blank">L.Control</a> native class.
+ *
+ * @namespace
+ * @alias L.geoportalControl.SearchEngine
+ */
+
+var SearchEngine = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Control.extend(
+/** @lends L.geoportalControl.SearchEngine.prototype */
+{
+  includes: _Common_Controls_SearchEngineDOM__WEBPACK_IMPORTED_MODULE_7__["default"],
+
+  /**
+   * options by default
+   *
+   * @private
+   */
+  options: {
+    position: "topleft",
+    collapsed: true,
+    displayInfo: true,
+    zoomTo: "",
+    resources: [],
+    placeholder: "Rechercher un lieu, une adresse",
+    displayMarker: true,
+    markerStyle: "blue",
+    displayAdvancedSearch: true,
+    advancedSearch: {},
+    geocodeOptions: {},
+    autocompleteOptions: {
+      serviceOptions: {},
+      triggerGeocode: false,
+      triggerDelay: 1000
+    }
+  },
+
+  /**
+   * @constructor SearchEngine
+   *
+   * @private
+   * @alias SearchEngine
+   * @extends {L.Control}
+   * @param {Object} options - control options
+   * @param {String} [options.apiKey] - API key, mandatory if autoconf service has not been charged in advance
+   * @param {Boolean} [options.ssl = true] - use of ssl or not (default true, service requested using https protocol)
+   * @param {Boolean} [options.collapsed] - collapse mode, false by default
+   * @param {String} [options.position] - position of component into the map, 'topleft' by default
+   * @param {Boolean} [options.displayInfo] - get informations on popup marker
+   * @param {Sting|Numeric|Function} [options.zoomTo] - zoom to results, by default, current zoom.
+   *       Value possible : auto or zoom level.
+   *       Possible to overload it with a function :
+   *       zoomTo : function (info) {
+   *           // do some stuff...
+   *           return zoom;
+   *       }
+   * @param {String}  [options.placeholder] - set placeholder in search bar. Default is "Rechercher un lieu, une adresse".
+   * @param {Boolean}  [options.displayMarker] - set a marker on search result, defaults to true.
+   * @param {String|Object}  [options.markerStyle] - set a marker style. Currently possible values are "blue" (default value), "orange", "red" and "green". But you can use an L.Icon object (see {@link http://leafletjs.com/reference-1.2.0.html#icon L.Icon }).
+   * @param {Sting} [options.apiKey] - API key, mandatory if autoconf service has not been charged in advance
+   * @param {Object} [options.resources] - resources to be used by geocode and autocompletion services, by default : ["StreetAddress", "PositionOfInterest"]
+   * @param {Boolean} [options.displayAdvancedSearch] - False to disable advanced search tools (it will not be displayed). Default is true (displayed)
+   * @param {Object} [options.advancedSearch] - advanced search for geocoding (filters)
+   * @param {Object} [options.geocodeOptions] - options of geocode service
+   * @param {Object} [options.autocompleteOptions] - options of autocomplete service
+   * @param {Object} [options.autocompleteOptions.serviceOptions] - options of autocomplete service
+   * @param {Boolean} [options.autocompleteOptions.triggerGeocode] - trigger a geocoding request if the autocompletion does not return any suggestions, false by default
+   * @param {Number}  [options.autocompleteOptions.triggerDelay] - waiting time before sending the geocoding request, 1000ms by default
+   * @example
+   *  var SearchEngine = L.geoportalControl.SearchEngine({
+   *      position : "topright",
+   *      collapsed : true,
+   *      displayInfo : true,
+   *      displayAdvancedSearch : true,
+   *      placeholder : "Rechercher un lieu, une adresse",
+   *      displayMarker : true,
+   *      markerStyle : L.icon(iconUrl : 'https://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png');
+   *      zoomTo : 15,
+   *      resources : ["PositionOfInterest", "StreetAddress"],
+   *      advancedSearch : {
+   *          PositionOfInterest : [{name : "municipality", title : "Ville"}],
+   *          StreetAddress : [{...}],
+   *          CadastralParcel : null,
+   *      },
+   *      apiKey : "zfgzrgffg57rfg8ar7gr4g5r4",
+   *      geocodeOptions : {},
+   *      autocompleteOptions : {}
+   *  });
+   *
+   */
+  initialize: function initialize(options) {
+    // on transmet les options au controle
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.setOptions(this, options);
+    /** uuid */
+
+    this._uid = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__["default"].generate();
+    /** affichage du container de saisie */
+
+    this._showContainer = null;
+    this._pictoContainer = null;
+    /** container de la saisie du la recherche */
+
+    this._inputContainer = null;
+    /** container des reponses de l'autocompletion */
+
+    this._suggestedContainer = null;
+    /** listes des reponses de l'autocompletion */
+
+    this._suggestedLocations = [];
+    /** container des reponses du geocodage */
+
+    this._geocodedContainer = null;
+    /** liste des reponses du geocodage */
+
+    this._geocodedLocations = [];
+    /** container des filtres du geocodage */
+
+    this._filterContainer = null;
+    /** ressource de geocodage selectionnée pour le geocodage avancé */
+
+    this._currentGeocodingCode = null;
+    /** localisant */
+
+    this._currentGeocodingLocation = null;
+    /** liste des filtres du geocodage pour le geocodage avancé */
+
+    this._advancedSearchFilters = {};
+    /** liste des ressources du geocodage pour le geocodage avancé */
+
+    this._advancedSearchCodes = [];
+    /** marker */
+
+    this._marker = null;
+    /** ressources des services d'autocompletion et de geocodage */
+
+    this._servicesRightManagement = {};
+    /**
+     * Droit sur les ressources sur les services.
+     * Par defaut, on n'en s'occupe pas
+     * sauf si l'autoconfiguration est chargée !
+     */
+
+    this._noRightManagement = false; // gestion des droits sur les ressources/services
+
+    this._checkRightsManagement(); // trigger geocode
+
+
+    this._triggerHandler = null;
+  },
+
+  /**
+   * this method is called by this.addTo(map)
+   * and fills variable : this._container = this.onAdd(map)
+   *
+   * @returns {DOMElement} DOM element
+   * @private
+   */
+  onAdd: function onAdd()
+  /* map */
+  {
+    // TODO initialisation des ressources du geocodage avancé
+    this._initAdvancedSearchCodes(); // initialisation des filtres du geocodage avancé
+
+
+    this._initAdvancedSearchFilters(); // initialisation du DOM du composant
+
+
+    var container = this._initLayout(); // deactivate of events that may interfere with the map
+
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
+    return container;
+  },
+
+  /**
+   * this method is called when the control is removed from the map
+   * and removes events on map.
+   *
+   * @param {Object} map - the map
+   *
+   * @private
+   */
+  onRemove: function onRemove(map) {
+    this._clearSuggestedLocation();
+
+    this._clearGeocodedLocation();
+
+    if (this._marker != null) {
+      map.removeLayer(this._marker);
+      this._marker = null;
+    }
+  },
+  // ################################################################### //
+  // ##################### methods rights management ################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by constructor
+   * and check the rights to resources and services
+   *
+   * @private
+   */
+  _checkRightsManagement: function _checkRightsManagement() {
+    // INFORMATION
+    // l'autoconfiguration n'est utile que pour récupérer la clef si elle
+    // n'est pas renseignée, et pour vérifier les droits sur les ressources
+    // et les services.
+    // si l'autoconfiguration n'est pas chargée,
+    // il est toujours possible de requeter le service avec une clef API,
+    // mais les droits sur les ressources ne sont pas garantis, on risque
+    // d'obtenir des erreurs 403 forbidden..., la responsabilité revient
+    // à l'utilisateur (message d'information)...
+    // par contre, sans clef API renseignée au niveau du controle,
+    // l'utilisateur doit la renseigner au niveau des services...,
+    // sinon, Exception du service
+    // si l'autoconfiguration est chargée,
+    // si une clef API est renseignée au niveau controle, on controle
+    // le mapping entre le contrat et la clef...
+    // on obtient la liste des ressources ayant droits,
+    // si on ne trouve pas de ressources ou certaines ressources ne sont
+    // pas disponible, on previent l'utilisateur (message d'information).
+    // les ressources en options pour les 2 services
+    // on en definit par defaut
+    if (!this.options.resources || this.options.resources.length === 0) {
+      this.options.resources = ["StreetAddress", "PositionOfInterest" // FIXME choix par defaut ?
+      // "CadastralParcel",
+      // "Administratif"
+      ];
+    }
+
+    var _opts = null;
+    var _res = [];
+    var _key = null; // les ressources du service de geocodage
+    // on prend celles des options du services en priorité
+
+    _key = this.options.geocodeOptions.apiKey;
+    _opts = this.options.geocodeOptions.filterOptions;
+    _res = _opts ? _opts.type : [];
+
+    if (!_res || _res.length === 0) {
+      _res = this.options.resources || ["StreetAddress", "PositionOfInterest" // "CadastralParcel",
+      // "Administratif"
+      ];
+    }
+
+    var rightManagementGeocode = _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_3__["default"].check({
+      key: _key || this.options.apiKey,
+      resources: _res,
+      services: ["Geocode"]
+    }); // les ressources du service d'autocompletion
+    // on prend celles des options du services en priorité
+
+    _key = this.options.autocompleteOptions.apiKey;
+    _opts = this.options.autocompleteOptions.filterOptions;
+    _res = _opts ? _opts.type : [];
+
+    if (!_res || _res.length === 0) {
+      _res = this.options.resources || ["StreetAddress", "PositionOfInterest" // "CadastralParcel",
+      // "Administratif"
+      ];
+    }
+
+    var rightManagementAutoComplete = _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_3__["default"].check({
+      key: _key || this.options.apiKey,
+      resources: _res,
+      services: ["AutoCompletion"]
+    }); // au cas où pas de droit !
+
+    if (!rightManagementGeocode && !rightManagementAutoComplete) {
+      this._noRightManagement = true;
+    } // je reconstruis differement la structure pour la gestion des clefs differentes
+    // pour chaque service...
+
+
+    if (rightManagementAutoComplete) {
+      this._servicesRightManagement["AutoCompletion"] = {};
+      this._servicesRightManagement["AutoCompletion"]["resources"] = rightManagementAutoComplete["AutoCompletion"];
+      this._servicesRightManagement["AutoCompletion"]["key"] = rightManagementAutoComplete["key"];
+    }
+
+    if (rightManagementGeocode) {
+      this._servicesRightManagement["Geocode"] = {};
+      this._servicesRightManagement["Geocode"]["resources"] = rightManagementGeocode["Geocode"];
+      this._servicesRightManagement["Geocode"]["key"] = rightManagementGeocode["key"];
+    } // FIXME doit on construire les menus du geocodage avancé en fonction des ressources
+    // disponibles ?
+
+
+    if (!this.options.advancedSearch || Object.keys(this.options.advancedSearch).length === 0) {
+      var r = this._servicesRightManagement["Geocode"]["resources"];
+
+      for (var i = 0; i < r.length; i++) {
+        var code = r[i];
+        this.options.advancedSearch[code] = [];
+      }
+    }
+  },
+  // ################################################################### //
+  // ########################## methods DOM ############################ //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onAdd(map)
+   * and initialize the container HTMLElement
+   *
+   * @returns {DOMElement} DOM element
+   *
+   * @private
+   */
+  _initLayout: function _initLayout() {
+    // create main container
+    var container = this._createMainContainerElement(); // create show search engine element
+
+
+    var inputShow = this._showContainer = this._createShowSearchEngineElement();
+
+    container.appendChild(inputShow); // mode "collapsed"
+
+    if (!this.options.collapsed) {
+      inputShow.checked = "true";
+    } // create search engine picto
+
+
+    var picto = this._pictoContainer = this._createShowSearchEnginePictoElement();
+
+    container.appendChild(picto);
+
+    var search = this._createSearchInputElement(this.options.placeholder);
+
+    container.appendChild(search);
+
+    if (this.options.displayAdvancedSearch) {
+      var advancedShow = this._createShowAdvancedSearchElement();
+
+      container.appendChild(advancedShow); // INFO je decompose les appels car j'ai besoin de recuperer le container
+      // des filtres
+
+      var advancedPanel = this._createAdvancedSearchPanelElement();
+
+      var advancedHeader = this._createAdvancedSearchPanelHeaderElement();
+
+      var advancedForm = this._createAdvancedSearchPanelFormElement(this._advancedSearchCodes);
+
+      var advancedFormFilters = this._filterContainer = this._createAdvancedSearchFormFiltersElement();
+
+      this._setFilter(this._advancedSearchCodes[0].id); // ex "PositionOfInterest"
+
+
+      var advancedFormInput = this._createAdvancedSearchFormInputElement();
+
+      advancedForm.appendChild(advancedFormFilters);
+      advancedForm.appendChild(advancedFormInput);
+      advancedPanel.appendChild(advancedHeader);
+      advancedPanel.appendChild(advancedForm);
+      container.appendChild(advancedPanel);
+    } // INFO je decompose les appels car j'ai besoin de recuperer le container
+    // des resultats de l'autocompletion
+
+
+    var autocomplete = this._createAutoCompleteElement();
+
+    var autocompleteList = this._suggestedContainer = this._createAutoCompleteListElement();
+
+    autocomplete.appendChild(autocompleteList);
+    container.appendChild(autocomplete); // INFO je decompose les appels car j'ai besoin de recuperer le container
+    // des resultats du geocodage
+
+    var geocode = this._createGeocodeResultsElement();
+
+    var geocodeList = this._geocodedContainer = this._createGeocodeResultsListElement();
+
+    geocode.appendChild(geocodeList);
+    container.appendChild(geocode);
+    return container;
+  },
+  // ################################################################### //
+  // ################# methods Filters Geocode Advanced ################ //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onAdd()
+   * and initialize the geocoding resources.
+   * TODO
+   *
+   * @private
+   */
+  _initAdvancedSearchCodes: function _initAdvancedSearchCodes() {
+    // INFORMATION
+    // on y ajoute les filtres attributaires pour une table de ressources
+    // selectionnée via un evenement (onchange) de la liste deroulante du
+    // menu avancé du geocodage.
+    // cf. onGeocodingAdvancedSearchCodeChange() pour la selection de la
+    // ressource de geocodage à afficher
+    // TODO la liste des ressources de geocodage est codée en statique
+    // dans le DOM, cad les 4 ressources sont donc disponibles dans le menu
+    // deroulant :
+    // - PositionOfInterest
+    // - StreetAddress
+    // - CadastralParcel
+    // - Administratif
+    // Cette liste doit elle être dynamique ? Ne doit on pas prendre en
+    // compte uniquement les ressources que le client a renseigné ?
+    var advancedSearchCodesByDefault = [{
+      id: "PositionOfInterest",
+      title: "Lieux/toponymes"
+    }, {
+      id: "StreetAddress",
+      title: "Adresses"
+    }, {
+      id: "CadastralParcel",
+      title: "Parcelles cadastrales"
+    }, {
+      id: "Administratif",
+      title: "Administratif"
+    }];
+
+    var _resources = Object.keys(this.options.advancedSearch);
+
+    for (var i = 0; i < _resources.length; i++) {
+      var id = _resources[i];
+
+      for (var j = 0; j < advancedSearchCodesByDefault.length; j++) {
+        if (advancedSearchCodesByDefault[j].id === id) {
+          this._advancedSearchCodes.push(advancedSearchCodesByDefault[j]);
+        }
+      }
+    }
+
+    if (this._advancedSearchCodes.length === 0) {
+      this._advancedSearchCodes = advancedSearchCodesByDefault;
+    }
+
+    logger.log("advancedSearchCodes", this._advancedSearchCodes);
+  },
+
+  /**
+   * this method is called by this.onAdd()
+   * and initialize the advanced geocoding filters.
+   * FIXME
+   *
+   * @private
+   */
+  _initAdvancedSearchFilters: function _initAdvancedSearchFilters() {
+    // FIXME la liste des filtres attributaires doit elle être recuperée
+    // de l'objet geocode ? doit on tous les mettre ou doit on faire un choix ?
+    // liste des filtres par defauts pour toutes les ressources
+    var advancedSearchFiltersByDefault = {
+      PositionOfInterest: [{
+        name: "city",
+        // municipality !?
+        title: "Ville",
+        filter: false,
+        sep: true
+      }, {
+        name: "importance",
+        title: "Importance",
+        filter: true
+      }, {
+        name: "nature",
+        title: "Nature",
+        filter: true
+      }, {
+        name: "territory",
+        title: "Territoire",
+        filter: true
+      }, {
+        name: "insee",
+        title: "Code commune (INSEE)",
+        filter: true
+      }, {
+        name: "department",
+        title: "Département",
+        filter: true
+      }],
+      StreetAddress: [// INFO
+      // ce ne sont pas des filtres mais une location dite structurée !
+      {
+        name: "number",
+        title: "Numéro",
+        filter: false,
+        sep: true
+      }, {
+        name: "street",
+        title: "Rue",
+        filter: false,
+        sep: true
+      }, {
+        name: "postalCode",
+        title: "Code Postal",
+        filter: false,
+        sep: true
+      }, {
+        name: "city",
+        // municipality !?
+        title: "Ville",
+        filter: false,
+        sep: true
+      }, // {
+      //     name : "municipality", // commune !?
+      //     title : "Commune",
+      //     filter : true,
+      //     sep : true
+      // },
+      {
+        name: "territory",
+        title: "Territoire",
+        filter: true
+      }, {
+        name: "insee",
+        title: "Code commune (INSEE)",
+        filter: true
+      }, {
+        name: "department",
+        title: "Département",
+        filter: true
+      }],
+      CadastralParcel: [// INFO
+      // ce ne sont pas des filtres mais une location dite structurée !
+      // ex 94 067 000 0D 0041
+      {
+        name: "department",
+        title: "Département",
+        filter: false,
+        sep: false,
+        value: "__"
+      }, {
+        name: "commune",
+        title: "Commune",
+        filter: false,
+        sep: false,
+        value: "___"
+      }, {
+        name: "absorbedCity",
+        title: "Commune absorbée",
+        filter: false,
+        sep: false,
+        value: "___"
+      }, {
+        name: "section",
+        title: "Section",
+        filter: false,
+        sep: false,
+        value: "__"
+      }, // {
+      //     name : "sheet",
+      //     title :  "Feuille",
+      //     filter : false,
+      //     sep : false
+      // },
+      {
+        name: "number",
+        title: "Numéro",
+        filter: false,
+        sep: false,
+        value: "____"
+      } // {
+      //     name : "insee",
+      //     title : "Code commune (INSEE)",
+      //     filter : false,
+      //     sep : false
+      // },
+      // {
+      //     name : "municipality",
+      //     title : "Ville",
+      //     filter : false,
+      //     sep : false
+      // }
+      ],
+      Administratif: [{
+        name: "prefecture",
+        title: "Préfecture",
+        filter: true
+      }, {
+        name: "inseeRegion",
+        title: "Code région (INSEE)",
+        filter: true
+      }, {
+        name: "inseeDepartment",
+        title: "Code département (INSEE)",
+        filter: true
+      }, {
+        name: "city",
+        // municipality !?
+        title: "Ville",
+        filter: false,
+        sep: true
+      }]
+    }; // on merge les options avancées avec celles par defaut
+
+    var advancedSearchFiltersCustom = this.options.advancedSearch;
+
+    for (var code in advancedSearchFiltersCustom) {
+      if (advancedSearchFiltersCustom.hasOwnProperty(code)) {
+        // si object null ou vide (StreetAddress : [] || null), on prend les params. par defaut
+        // sauf si pas de droit !
+        if (!advancedSearchFiltersCustom[code] || advancedSearchFiltersCustom[code].length === 0) {
+          advancedSearchFiltersCustom[code] = advancedSearchFiltersByDefault[code];
+          continue;
+        } // si la clef filter est absente, on l'ajoute...
+        // par defaut, le filtre municipality est dit structuré !
+
+
+        var filters = advancedSearchFiltersCustom[code];
+
+        for (var i = 0; i < filters.length; i++) {
+          var o = filters[i];
+
+          if (!o.hasOwnProperty("filter")) {
+            o.filter = o.name !== "municipality";
+          }
+        }
+      }
+    }
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(this._advancedSearchFilters, advancedSearchFiltersByDefault, advancedSearchFiltersCustom);
+    logger.log("advancedSearchFilters", this._advancedSearchFilters);
+  },
+
+  /**
+   * this method is called by :
+   * - this._initLayout() : ...
+   * - this.onGeocodingAdvancedSearchCodeChoice() : ...
+   * and initialize or create the filters container HTMLElement
+   * to the geocoding advanced menu.
+   *
+   * @param {String} code - resource geocoding name
+   *
+   * @returns {DOMElement} DOM element
+   *
+   * @private
+   */
+  _setFilter: function _setFilter(code) {
+    // INFORMATION
+    // Nous avons 2 solutions possibles pour la mise en place des filtres.
+    // 1. Soit on decide de creer tous les filtres pour chaque ressource
+    // de geocodage à l'initialisation du composant, et on joue sur le
+    // mode 'hidden' pour n'afficher que la ressource selectionnée.
+    // 2. Soit on decide de creer à chaque fois les filtres pour la
+    // ressource selectionnée.
+    // Chaque solution a ses inconvenients/avantages.
+    // Implementation du choix 2 car elle offre plus de souplesse pour
+    // recuperer les 'form-data'...
+    var container = this._filterContainer;
+    var codeFound = false;
+
+    for (var i = 0; i < this._advancedSearchCodes.length; i++) {
+      if (this._advancedSearchCodes[i].id === code) {
+        codeFound = true;
+        break;
+      }
+    }
+
+    if (!codeFound) {
+      // cette ressource n'est pas disponible,
+      // on supprime les anciens enfants...
+      while (container.firstChild) {
+        container.removeChild(container.firstChild);
+      }
+
+      return;
+    } // on sauvegarde la ressource de geocodage sélectionnée
+
+
+    this._currentGeocodingCode = code; // on supprime les enfants...
+
+    while (container.firstChild) {
+      container.removeChild(container.firstChild);
+    }
+
+    var lstAttributs = this._advancedSearchFilters[code];
+
+    if (!lstAttributs || lstAttributs.length === 0) {
+      // cette ressource n'est pas parametrable
+      return;
+    }
+
+    var divTable = this._createAdvancedSearchFiltersTableElement(code, true);
+
+    for (var j = 0; j < lstAttributs.length; j++) {
+      var divFilter = this._createAdvancedSearchFiltersAttributElement(lstAttributs[j]);
+
+      divTable.appendChild(divFilter);
+    }
+
+    container.appendChild(divTable);
+    return container;
+  },
+  // ################################################################### //
+  // ################ methods to request and results ################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onAutoCompleteSearch()
+   * and executes a request to the service.
+   *
+   * @param {Object} settings - service settings
+   * @param {String}   settings.text - text
+   * @param {Function} settings.onSuccess - callback
+   * @param {Function} settings.onFailure - callback
+   *
+   * @private
+   */
+  _requestAutoComplete: function _requestAutoComplete(settings) {
+    // on ne fait pas de requête si on n'a pas renseigné de parametres !
+    if (!settings || Object.keys(settings).length === 0) {
+      return;
+    } // on ne fait pas de requête si la parametre 'text' est vide !
+
+
+    if (!settings.text) {
+      return;
+    }
+
+    logger.log(settings); // on ne fait pas de requête si aucun droit !
+
+    if (this._noRightManagement) {
+      logger.log("no rights for all service !?");
+      return;
+    } // gestion des droits !
+
+
+    if (!this._servicesRightManagement["AutoCompletion"]) {
+      logger.log("no rights for this service !?");
+      return;
+    }
+
+    var options = {}; // on recupere les options du service
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, this.options.autocompleteOptions.serviceOptions); // ainsi que la recherche et les callbacks
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, settings);
+    var resources = this._servicesRightManagement["AutoCompletion"].resources;
+
+    if (!resources || Object.keys(resources).length === 0) {
+      return;
+    } // au cas où les options du services ne sont pas renseignées, on y ajoute
+    // les tables de ressources
+
+
+    if (resources && leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.isArray(resources) && !options.filterOptions) {
+      if (!options.filterOptions) {
+        options.filterOptions = {};
+      }
+
+      options.filterOptions.type = resources;
+    } // gestion de la clef !
+
+
+    var key = this._servicesRightManagement["AutoCompletion"]["key"]; // cas où la clef API n'est pas renseignée dans les options du service,
+    // on utilise celle de l'autoconf ou celle renseignée au niveau du controle
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      apiKey: options.apiKey || this.options.apiKey || key
+    }); // si l'utilisateur a spécifié le paramètre ssl au niveau du control, on s'en sert
+    // true par défaut (https)
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      ssl: this.options.ssl
+    });
+    logger.log(options);
+    geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__["default"].Services.autoComplete(options);
+  },
+
+  /**
+   * this method is called by this.onGeocodingSearch()
+   * and fills the container of the location list.
+   * it creates a HTML Element per location
+   * (cf. this. ...)
+   *
+   * @param {Array} locations - Array of Gp.Services.AutoComplete.SuggestedLocation corresponding to autocomplete results list
+   * @private
+   */
+  _fillAutoCompletedLocationListContainer: function _fillAutoCompletedLocationListContainer(locations) {
+    if (!locations || locations.length === 0) {
+      return;
+    } // on vide la liste avant de la construire
+
+
+    var element = this._suggestedContainer;
+
+    if (element.childElementCount) {
+      while (element.firstChild) {
+        element.removeChild(element.firstChild);
+      }
+    }
+
+    for (var i = 0; i < locations.length; i++) {
+      // Proposals are dynamically filled in Javascript by autocomplete service
+      this._createAutoCompletedLocationElement(locations[i], i);
+    }
+  },
+
+  /**
+   * this method is called by this.onAutoCompleteSearch()
+   * and executes a request to the service.
+   *
+   * @param {Object} settings - service settings
+   * @param {String}   settings.location - text
+   * @param {Function} settings.onSuccess - callback
+   * @param {Function} settings.onFailure - callback
+   *
+   * @private
+   */
+  _requestGeocoding: function _requestGeocoding(settings) {
+    // on ne fait pas de requête si on n'a pas renseigné de parametres !
+    if (!settings || Object.keys(settings).length === 0) {
+      return;
+    } // on ne fait pas de requête si la parametre 'text' est vide !
+
+
+    if (!settings.location) {
+      return;
+    }
+
+    logger.log(settings); // on ne fait pas de requête si aucun droit !
+
+    if (this._noRightManagement) {
+      logger.log("no rights for all service !?");
+      return;
+    } // gestion des droits !
+
+
+    if (!this._servicesRightManagement["Geocode"]) {
+      logger.log("no rights for this service !?");
+      return;
+    }
+
+    var options = {}; // on recupere les options du service
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, this.options.geocodeOptions); // ainsi que la recherche, les filtres du geocodage avancé et les callbacks
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, settings); // on y force le param suivant, s'il n'a pas été surchargé :
+
+    if (!options.hasOwnProperty("returnFreeForm")) {
+      leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+        returnFreeForm: true
+      });
+    }
+
+    var resources = this._servicesRightManagement["Geocode"].resources;
+
+    if (!resources || Object.keys(resources).length === 0) {
+      return;
+    } // au cas où les options du services ne sont pas renseignées, on y ajoute
+    // les tables de ressources
+
+
+    if (resources && leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.isArray(resources) && !options.filterOptions) {
+      if (!options.filterOptions) {
+        options.filterOptions = {};
+      }
+
+      options.filterOptions.type = resources;
+    } // gestion de la clef !
+
+
+    var key = this._servicesRightManagement["Geocode"]["key"]; // cas où la clef API n'est pas renseignée dans les options du service,
+    // on utilise celle de l'autoconf ou celle renseignée au niveau du controle
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      apiKey: options.apiKey || this.options.apiKey || key
+    }); // si l'utilisateur a spécifié le paramètre ssl au niveau du control, on s'en sert
+    // true par défaut (https)
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      ssl: this.options.ssl
+    });
+    logger.log(options);
+    geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__["default"].Services.geocode(options);
+  },
+
+  /**
+   * this method is called by this.onGeocodingSearch()
+   * and fills the container of the location results.
+   * it creates a HTML Element per location
+   * (cf. this. ...)
+   *
+   * @param {Object[]} locations - locations
+   *
+   * @private
+   */
+  _fillGeocodedLocationListContainer: function _fillGeocodedLocationListContainer(locations) {
+    if (!locations || locations.length === 0) {
+      this._clearGeocodedLocation();
+
+      return;
+    } // on vide la liste avant de la construire
+
+
+    var element = this._geocodedContainer;
+
+    if (element.childElementCount) {
+      while (element.firstChild) {
+        element.removeChild(element.firstChild);
+      }
+    }
+
+    for (var i = 0; i < locations.length; i++) {
+      logger.log(locations[i]); // Proposals are dynamically filled in Javascript by autocomplete service
+
+      this._createGeocodedLocationElement(locations[i], i);
+    } // sauvegarde de l'etat des locations
+
+
+    this._geocodedLocations = locations;
+  },
+
+  /**
+   * this method is called by Gp.Services.autoComplete callback in case of success
+   * (cf. this.onAutoCompleteSearchText), for suggested locations with null coordinates
+   * (case of postalCode research for instance).
+   * Send a geocode request with suggested location 'fullText' attribute, to get its coordinates and display it in autocomplete results list container.
+   *
+   * @param {Gp.Services.AutoCompleteResponse.SuggestedLocation} suggestedLocation - autocompletion result (with null coordinates) to be geocoded
+   * @param {Number} i - suggestedLocation position in Gp.Services.AutoCompleteResponse.suggestedLocations autocomplete results list
+   * @private
+   */
+  _getGeocodeCoordinatesFromFullText: function _getGeocodeCoordinatesFromFullText(suggestedLocation, i) {
+    var _location = suggestedLocation.fullText;
+    var context = this;
+
+    this._requestGeocoding({
+      location: _location,
+      // callback onSuccess
+      onSuccess: function onSuccess(response) {
+        logger.log("request from Geocoding (coordinates null)", response);
+
+        if (response.locations && response.locations.length !== 0 && response.locations[0].position) {
+          // on modifie les coordonnées du résultat en EPSG:4326 donc lat,lon
+          if (context._suggestedLocations && context._suggestedLocations[i]) {
+            context._suggestedLocations[i].position = {
+              x: response.locations[0].position.y,
+              y: response.locations[0].position.x
+            }; // et on l'affiche dans la liste
+
+            context._locationsToBeDisplayed.unshift(context._suggestedLocations[i]);
+
+            context._fillAutoCompletedLocationListContainer(context._locationsToBeDisplayed);
+          }
+        }
+      },
+
+      /** callback onFailure */
+      onFailure: function onFailure() {
+        // si on n'a pas réussi à récupérer les coordonnées, on affiche quand même le résultat
+        if (context._suggestedLocations && context._suggestedLocations[i]) {
+          context._createAutoCompletedLocationElement(context._suggestedLocations[i], i);
+        }
+      }
+    });
+  },
+  // ################################################################### //
+  // ######################### other methods ########################### //
+  // ################################################################### //
+
+  /**
+   * this sends the label to the input panel.
+   *
+   * FIXME appel en dur d'un identifiant CSS !
+   *
+   * @param {String} label - label suggested location
+   *
+   * @private
+   */
+  _setLabel: function _setLabel(label) {
+    var element = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("GPsearchInputText-" + this._uid);
+    element.value = label || "";
+  },
+
+  /**
+   * this method is called by this.on*ResultsItemClick()
+   * and move/zoom on a position.
+   *
+   * @param {Object} position - {x : ..., y : ...}
+   * @param {Number} zoom - zoom level
+   *
+   * @private
+   */
+  _setPosition: function _setPosition(position, zoom) {
+    var map = this._map;
+    map.setZoomAround(leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.latLng(position.x, position.y), zoom, true);
+    map.panTo(leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.latLng(position.x, position.y));
+  },
+
+  /**
+   * this method is called by this.on*ResultsItemClick()
+   * and get zoom.
+   *
+   * @param {Object} info - info
+   *
+   * @returns {Integer} zoom level
+   *
+   * @private
+   */
+  _getZoom: function _getZoom(info) {
+    var map = this._map;
+    var key = this.options.zoomTo;
+    var zoom = null; // les valeurs du zooms sont determinées
+    // soit par les mots clefs suivants :  max, min ou auto
+    // soit par un niveau de zoom
+    // soit defini par l'utilisateur via une fonction
+
+    if (typeof key === "function") {
+      logger.trace("zoom function");
+      zoom = key.call(this, info);
+    }
+
+    if (typeof key === "number") {
+      logger.trace("zoom level");
+      zoom = key;
+    }
+
+    if (typeof key === "string") {
+      // if (key === "max") {
+      //     zoom = map.getMaxZoom();
+      // } else if (key === "min") {
+      //     zoom = map.getMinZoom();
+      // } else
+      if (key === "auto") {
+        logger.trace("zoom auto");
+        zoom = _Common_Utils_SearchEngineUtils__WEBPACK_IMPORTED_MODULE_5__["default"].zoomToResultsByDefault(info);
+      } else {
+        logger.trace("zoom level parsing");
+        var value = parseInt(key, 10);
+
+        if (!isNaN(value)) {
+          logger.trace("zoom parsing");
+          zoom = value;
+        }
+      }
+    } // polyfill IE
+
+
+    Number.isInteger = Number.isInteger || function (value) {
+      return typeof value === "number" && isFinite(value) && Math.floor(value) === value;
+    }; // test de validité du zoom,
+    // on prend le zoom courant par defaut ...
+
+
+    if (!zoom || zoom === "" || !Number.isInteger(zoom)) {
+      logger.trace("zoom not found, current zoom...");
+      zoom = map.getZoom();
+    } // test si le zoom est dans l'espace de la carte
+
+
+    var min = map.getMinZoom();
+    var max = map.getMaxZoom();
+
+    if (zoom < min) {
+      logger.trace("zoom level min...");
+      zoom = min;
+    }
+
+    if (zoom > max) {
+      logger.trace("zoom level max...");
+      zoom = max;
+    }
+
+    logger.trace("zoom", zoom);
+    return zoom;
+  },
+
+  /**
+   * this method is called by this.on*ResultsItemClick()
+   * and displays a marker.
+   * FIXME
+   *
+   * @param {Object} position - position {x : ..., y : ...}
+   * @param {Object} information - suggested or geocoded information
+   * @param {Boolean} display - display a popup information
+   * @param {String} marker - style style
+   *
+   * @private
+   */
+  _setMarker: function _setMarker(position, information, display, marker) {
+    var map = this._map;
+
+    if (this._marker != null) {
+      map.removeLayer(this._marker);
+      this._marker = null;
+    }
+
+    if (position) {
+      var _icon = null;
+
+      if (typeof marker === "string") {
+        _icon = new _Utils_IconDefault__WEBPACK_IMPORTED_MODULE_6__["default"](marker);
+      } else if (marker instanceof leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Icon) {
+        _icon = marker;
+      } else {
+        _icon = new _Utils_IconDefault__WEBPACK_IMPORTED_MODULE_6__["default"]("blue");
+        logger.log("Utilisation du marker par défaut !");
+      } // cf. http://leafletjs.com/reference.html#marker-options
+
+
+      var options = {
+        clickable: true,
+        zIndexOffset: 1000,
+        icon: _icon
+      };
+      this._marker = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.marker(leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.latLng(position.x, position.y), options);
+
+      this._marker.addTo(map); // FIXME
+      // doit on mettre une information
+      // - correctement construite ?
+      // - uniquement informatif ?
+      // - RIEN ?
+
+
+      if (display) {
+        var popupContent = null;
+
+        if (typeof information !== "string") {
+          var values = [];
+
+          if (information.service === "DirectGeocodedLocation") {
+            if (information.fields.freeform) {
+              popupContent = information.fields.freeform;
+            } else {
+              var attributs = this._advancedSearchFilters[information.type];
+
+              for (var i = 0; i < attributs.length; i++) {
+                var key = attributs[i].name;
+                var value = information.fields[key]; // on prend que les chaines de caractères
+
+                if (typeof value === "string" || typeof value === "number") {
+                  values.push(value);
+                }
+              }
+
+              popupContent = values.join(" - ");
+            }
+          } else if (information.service === "SuggestedLocation") {
+            if (information.fields.fullText) {
+              popupContent = information.fields.fullText;
+            } else {
+              values.push(information.fields.street || "");
+              values.push(information.fields.postalCode || "");
+              values.push(information.fields.commune || "");
+
+              if (information.type === "PositionOfInterest") {
+                values.push(information.fields.poi || "");
+                values.push(information.fields.kind || "");
+              }
+
+              popupContent = values.join(" - ");
+            }
+          } else {
+            popupContent = "sans informations.";
+          }
+        } else {
+          popupContent = information;
+        }
+
+        this._marker.bindPopup(popupContent);
+      }
+    }
+  },
+
+  /**
+   * this method is called by this.onSearchReset()
+   * and it clears all results and the marker.
+   *
+   * @private
+   */
+  _clearResults: function _clearResults() {
+    this._currentGeocodingLocation = null;
+
+    this._clearSuggestedLocation();
+
+    this._clearGeocodedLocation();
+
+    this._setMarker();
+  },
+
+  /**
+   * this method is called by this.onAutoCompleteSearchText()
+   * and it clears all suggested location.
+   *
+   * @private
+   */
+  _clearSuggestedLocation: function _clearSuggestedLocation() {
+    this._suggestedLocations = [];
+
+    if (this._suggestedContainer) {
+      while (this._suggestedContainer.firstChild) {
+        this._suggestedContainer.removeChild(this._suggestedContainer.firstChild);
+      }
+    }
+  },
+
+  /**
+   * this method is called by this.onGeocodingAdvancedSearchSubmit()
+   * and it clears all geocoded location.
+   *
+   * @private
+   */
+  _clearGeocodedLocation: function _clearGeocodedLocation() {
+    this._geocodedLocations = [];
+
+    if (this._geocodedContainer) {
+      while (this._geocodedContainer.firstChild) {
+        this._geocodedContainer.removeChild(this._geocodedContainer.firstChild);
+      }
+    }
+  },
+  // ################################################################### //
+  // ###################### other handlers events ###################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by event 'click' on 'GPshowSearchEnginePicto' tag label
+   * (cf. this._createShowSearchEnginePictoElement), and it cleans the component
+   * when it's closed.
+   * FIXME
+   *
+   * @private
+   */
+  onShowSearchEngineClick: function onShowSearchEngineClick() {// FIXME on nettoie ou pas ?
+    // this._clearResults();
+  },
+
+  /**
+   * this method is called by event 'click' on 'GPsearchInputReset' tag div
+   * (cf. this._createSearchInputElement), and it cleans the value of input.
+   *
+   * @private
+   */
+  onSearchResetClick: function onSearchResetClick() {
+    this._clearResults();
+  },
+  // ################################################################### //
+  // ################## handlers events AutoComplete ################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by event 'keyup' on 'GPsearchInputText' tag input
+   * (cf. this._createSearchInputElement), and it gets the value of input.
+   * this value is passed as a parameter for the service autocomplete (text).
+   * the results of the request are displayed into a drop down menu.
+   * FIXME
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onAutoCompleteSearchText: function onAutoCompleteSearchText(e) {
+    var value = e.target.value;
+
+    if (!value) {
+      return;
+    } // aucun droits !
+    // on evite une requête...
+
+
+    if (this._noRightManagement) {
+      return;
+    } // on sauvegarde le localisant
+
+
+    this._currentGeocodingLocation = value; // on limite les requêtes à partir de 3 car. saisie !
+
+    if (value.length < 3) {
+      return;
+    }
+
+    var _triggerGeocode = this.options.autocompleteOptions.triggerGeocode;
+    var _triggerDelay = this.options.autocompleteOptions.triggerDelay; // INFORMATION
+    // on effectue la requête au service d'autocompletion.
+    // on met en place des callbacks afin de recuperer les resultats ou
+    // les messages d'erreurs du service.
+    // les resultats sont affichés dans une liste deroulante.
+    // les messages d'erreurs sont affichés sur la console (?)
+
+    var context = this;
+
+    this._requestAutoComplete({
+      text: value,
+      // callback onSuccess
+      onSuccess: function onSuccess(results) {
+        logger.log("request from AutoComplete", results);
+
+        if (results) {
+          // on sauvegarde l'etat des résultats
+          context._suggestedLocations = results.suggestedLocations;
+          context._locationsToBeDisplayed = [];
+
+          if (context._servicesRightManagement["Geocode"] && context._servicesRightManagement["Geocode"]["key"]) {
+            // on vérifie qu'on n'a pas récupéré des coordonnées nulles (par ex recherche par code postal)
+            for (var i = 0; i < context._suggestedLocations.length; i++) {
+              var ilocation = context._suggestedLocations[i];
+
+              if (ilocation.position && ilocation.position.x === 0 && ilocation.position.y === 0 && ilocation.fullText) {
+                // si les coordonnées sont nulles, il faut relancer une requête de géocodage avec l'attribut "fullText" récupéré
+                context._getGeocodeCoordinatesFromFullText(ilocation, i);
+              } else {
+                // sinon on peut afficher normalement le résultat dans la liste
+                context._locationsToBeDisplayed.push(ilocation);
+              }
+            }
+
+            ;
+          } else {
+            // si on n'a aucun droit d'accès au géocodage, on affiche la liste telle quelle (pas d'autre option pour les coordonnées nulles)
+            context._locationsToBeDisplayed = context._suggestedLocations;
+          } // on affiche les résultats qui n'ont pas des coordonnées nulles
+
+
+          context._fillAutoCompletedLocationListContainer(context._locationsToBeDisplayed); // on annule eventuellement une requete de geocodage en cours car on obtient des
+          // de nouveau des resultats d'autocompletion...
+
+
+          if (context._triggerHandler) {
+            clearTimeout(context._triggerHandler);
+            context._triggerHandler = null;
+            logger.warn("Cancel a geocode request !");
+          }
+        }
+      },
+      // callback onFailure
+      onFailure: function onFailure(error) {
+        // FIXME
+        // où affiche t on les messages : ex. 'No suggestion matching the search' ?
+        context._clearSuggestedLocation();
+
+        logger.log(error.message); // on envoie une requete de geocodage si aucun resultat d'autocompletion
+        // n'a été trouvé ! Et on n'oublie pas d'annuler celle qui est en cours !
+
+        if (error.message === "No suggestion matching the search" && _triggerGeocode) {
+          if (context._triggerHandler) {
+            clearTimeout(context._triggerHandler);
+            logger.warn("Cancel the last geocode request !");
+          }
+
+          context._triggerHandler = setTimeout(function () {
+            logger.warn("Launch a geocode request (code postal) !");
+
+            context._requestGeocoding({
+              location: value,
+              returnFreeForm: true,
+              // callback onSuccess
+              onSuccess: function onSuccess(results) {
+                logger.log("request from Geocoding", results);
+
+                if (results) {
+                  context._locationsToBeDisplayed = []; // on modifie la structure des reponses pour être
+                  // compatible avec l'autocompletion !
+
+                  var locations = results.locations;
+
+                  for (var i = 0; i < locations.length; i++) {
+                    var location = locations[i];
+                    location.fullText = location.placeAttributes.freeform;
+                    location.position = {
+                      x: location.position.y,
+                      y: location.position.x
+                    };
+
+                    context._locationsToBeDisplayed.push(location);
+                  }
+
+                  context._fillAutoCompletedLocationListContainer(locations);
+                }
+              },
+              // callback onFailure
+              onFailure: function onFailure(error) {
+                logger.log(error.message);
+              }
+            });
+          }, _triggerDelay);
+        }
+      }
+    });
+  },
+
+  /**
+   * this method is called by event 'click' on 'GPautoCompleteResultsList' tag div
+   * (cf. this._createAutoCompleteListElement), and it selects the location.
+   * this location displays a marker on the map.
+   * FIXME
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onAutoCompletedResultsItemClick: function onAutoCompletedResultsItemClick(e) {
+    var idx = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__["default"].index(e.target.id);
+    var label = e.target.innerHTML;
+    logger.log(idx, label);
+    logger.log(this._locationsToBeDisplayed[idx]);
+
+    if (!idx) {
+      return;
+    } // FIXME
+    // les coordonnées sont inversées entre les 2 services !?
+    // AutoCompletion : lon/lat
+    // Geocoding : lat/lon
+
+
+    var position = {
+      x: this._locationsToBeDisplayed[idx].position.y,
+      y: this._locationsToBeDisplayed[idx].position.x
+    };
+    var info = {
+      service: "SuggestedLocation",
+      type: this._locationsToBeDisplayed[idx].type,
+      fields: this._locationsToBeDisplayed[idx]
+    };
+
+    var zoom = this._getZoom(info);
+
+    this._setLabel(label);
+
+    this._setPosition(position, zoom);
+
+    if (this.options.displayMarker) {
+      this._setMarker(position, info, this.options.displayInfo, this.options.markerStyle);
+    }
+  },
+  // ################################################################### //
+  // ################### handlers events Geocode ####################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by event 'submit' on 'GPsearchInput' tag form
+   * (cf. this._createSearchInputElement), and it gets the value of input.
+   * this value is passed as a parameter for the service geocoding.
+   * the results of the request are displayed into a window.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onGeocodingSearchSubmit: function onGeocodingSearchSubmit(e) {
+    logger.log(e);
+    var value = e.target[0].value;
+
+    if (!value) {
+      return;
+    } // aucun droits !
+    // on evite une requête...
+
+
+    if (this._noRightManagement) {
+      return;
+    } // on sauvegarde le localisant
+
+
+    this._currentGeocodingLocation = value; // on met en place l'affichage des resultats dans une fenetre de recherche.
+
+    var context = this;
+
+    this._requestGeocoding({
+      location: value,
+      // callback onSuccess
+      onSuccess: function onSuccess(results) {
+        logger.log("request from Geocoding", results);
+
+        if (results) {
+          var locations = results.locations;
+
+          context._fillGeocodedLocationListContainer(locations);
+        }
+      },
+      // callback onFailure
+      onFailure: function onFailure(error) {
+        // FIXME cf. this.onAutoCompleteSearch()
+        context._clearGeocodedLocation();
+
+        logger.log(error.message);
+      }
+    });
+  },
+
+  /**
+   * this method is called by event 'submit' on 'GPgeocodeResultsList' tag div
+   * (cf. this._createGeocodeResultsListElement), and it selects the location.
+   * this location displays a marker on the map.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onGeocodedResultsItemClick: function onGeocodedResultsItemClick(e) {
+    var idx = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_4__["default"].index(e.target.id);
+    var label = e.target.innerHTML;
+    logger.log(idx, label);
+    logger.log(this._geocodedLocations[idx]);
+
+    if (!idx) {
+      return;
+    }
+
+    var position = this._geocodedLocations[idx].position;
+    var info = {
+      service: "DirectGeocodedLocation",
+      type: this._geocodedLocations[idx].type,
+      fields: this._geocodedLocations[idx].placeAttributes
+    };
+
+    var zoom = this._getZoom(info);
+
+    this._setLabel(label);
+
+    this._setPosition(position, zoom);
+
+    if (this.options.displayMarker) {
+      this._setMarker(position, info, this.options.displayInfo, this.options.markerStyle);
+    }
+  },
+  // ################################################################### //
+  // ############## handlers events Geocode Advanced ################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by event 'change' on 'GPadvancedSearchCode' tag select
+   * (cf. this._createAdvancedSearchFormCodeElement), and it gets the value of
+   * option selected.
+   * this value is passed as a parameter to create the attributs container.
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onGeocodingAdvancedSearchCodeChange: function onGeocodingAdvancedSearchCodeChange(e) {
+    logger.log(e);
+    var idx = e.target.selectedIndex;
+    var value = e.target.options[idx].value;
+
+    if (!value) {
+      return;
+    } // INFORMATION
+    // le declenchement de l'evenement va creer un container de filtre à la volée...
+    // l'insertion des containers d'attributs dans le DOM sont :
+    // - soit GPadvancedSearchFilters > PositionOfInterest
+    // - soit GPadvancedSearchFilters > StreetAddress
+    // - soit GPadvancedSearchFilters > CadastralParcel
+    // cf. _setFilter() pour la creation du container
+
+
+    this._setFilter(value);
+  },
+
+  /**
+   * this method is called by event 'submit' on 'GPadvancedSearchForm' tag form
+   * (cf. this._createAdvancedSearchPanelFormElement), and it gets the value of all input.
+   * this value is passed as a parameter for the service geocoding.
+   * the results of the request are displayed into a window.
+   * TODO
+   *
+   * @param {Object} e - HTMLElement
+   * @param {Array} data - [{key : ..., value : ...}]
+   *
+   * @private
+   */
+  onGeocodingAdvancedSearchSubmit: function onGeocodingAdvancedSearchSubmit(e, data) {
+    logger.log(data);
+
+    if (!data || data.length === 0) {
+      return;
+    } // recuperation des parametres des filtres pour les transmettre
+    // à la requête, ainsi que le type de table de ressources de geocodage,
+    // et le localisant
+
+
+    var _filterOptions = {};
+    _filterOptions["type"] = [this._currentGeocodingCode];
+
+    var _location = this._currentGeocodingLocation || "";
+
+    if (this._currentGeocodingCode === "CadastralParcel") {
+      _location = ""; // on ne souhaite plus la saisie libre...
+    }
+
+    for (var i = 0; i < data.length; i++) {
+      var filter = data[i]; // on ne verifie pas les clefs sans valeur...
+
+      if (!filter.value) {
+        continue;
+      }
+
+      var filters = this._advancedSearchFilters[this._currentGeocodingCode];
+
+      for (var j = 0; j < filters.length; j++) {
+        var o = filters[j];
+
+        if (o.name === filter.key) {
+          if (o.filter) {
+            _filterOptions[filter.key] = filter.value;
+          } else {
+            // on concatene tous les valeurs des champs de recherche,
+            // et on complete au besoin avec les valeur par defaut
+            // (ex. '_')
+            if (o.value) {
+              var cur = filter.value.length;
+              var max = o.value.length;
+
+              if (max !== cur) {
+                var masked = max - cur;
+                var filler = o.value.charAt(0);
+
+                while (filler.length < masked) {
+                  filler += filler;
+                }
+
+                var fillerSlice = filler.slice(0, masked);
+                filter.value = filter.value + fillerSlice;
+              } // la location est de type concaténée dite "freeform"
+
+
+              _location += filter.value;
+            } else {
+              // on est dans le cas où l'utilisateur utilise
+              // la location structurée de la recherche avancée,
+              // donc on ne tient plus compte de la saisie libre...
+              if (typeof _location === "string") {
+                _location = {};
+              }
+
+              _location[filter.key] = filter.value;
+            }
+          }
+        }
+      }
+    } // on met en place l'affichage des resultats dans une fenetre de recherche.
+
+
+    var context = this;
+
+    this._requestGeocoding({
+      location: _location,
+      filterOptions: _filterOptions,
+      // callback onSuccess
+      onSuccess: function onSuccess(results) {
+        logger.log(results);
+
+        if (results) {
+          var locations = results.locations;
+
+          context._fillGeocodedLocationListContainer(locations);
+        }
+      },
+      // callback onFailure
+      onFailure: function onFailure(error) {
+        // FIXME cf. this.onAutoCompleteSearch()
+        context._clearGeocodedLocation();
+
+        logger.log(error.message);
+      }
+    });
+  },
+  // ################################################################### //
+  // ###### METHODES PUBLIQUES (INTERFACE AVEC LE CONTROLE) ############ //
+  // ################################################################### //
+
+  /**
+   * This method is public.
+   * It allows to control the execution of a geocoding or an autocompletion.
+   *
+   * @param {String} text - location
+   * @param {Boolean} type - true (geocoding) / false (autocompletion)
+   * @param {Object} options - options
+   */
+  setText: function setText(text, type, options) {
+    if (!this._showContainer.checked) {
+      this._pictoContainer.click();
+    } // on récupere les options des services
+
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(this.options, options);
+    var element = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("GPsearchInputText-" + this._uid);
+    element.value = text;
+
+    if (type) {
+      var form = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("GPsearchInput-" + this._uid);
+      form.dispatchEvent(new Event("submit", {
+        bubbles: true,
+        cancelable: true
+      }));
+    } else {
+      element.dispatchEvent(new KeyboardEvent("keyup"));
+    }
+  }
+});
+/* harmony default export */ __webpack_exports__["default"] = (SearchEngine);
+
+/***/ }),
+/* 164 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var SearchEngineUtils = {
+  /**
+   * Advanced Search Filters by default
+   */
+  advancedSearchFiltersByDefault: {
+    PositionOfInterest: [{
+      name: "importance",
+      title: "Importance"
+    }, {
+      name: "nature",
+      title: "Nature"
+    }, {
+      name: "territory",
+      title: "Territoire"
+    }, {
+      name: "insee",
+      title: "Code INSEE"
+    }, {
+      name: "municipality",
+      title: "Ville"
+    }, {
+      name: "department",
+      title: "Département"
+    }],
+    StreetAddress: [// INFO
+    // ce ne sont pas des filtres mais une location dite structurée !
+    // {name : "number", title : "Numéro"},
+    // {name : "street", title : "Rue"},
+    // {name : "postalCode", title : "Code Postal"},
+    // {name : "city", title : "Commune"},
+    {
+      name: "territory",
+      title: "Territoire"
+    }, {
+      name: "insee",
+      title: "Code INSEE"
+    }, {
+      name: "municipality",
+      title: "Ville"
+    }, {
+      name: "department",
+      title: "Département"
+    }],
+    CadastralParcel: [{
+      name: "department",
+      title: "Département",
+      description: "Numéro du département (ex: 01, 94)"
+    }, {
+      name: "commune",
+      title: "Code commune (INSEE)",
+      description: "Code commune (INSEE) : 3 chiffres (ex: 067)"
+    }, // {
+    //     name : "insee",
+    //     title : "Code INSEE"
+    // },
+    {
+      name: "absorbedCity",
+      title: "Commune absorbée",
+      description: "Commune absorbée : 3 chiffres (ex: 000, 001)"
+    }, {
+      name: "section",
+      title: "Section",
+      description: "Section : 2 caractères (ex: AA, 0D)"
+    }, {
+      name: "number",
+      title: "Numéro",
+      description: "Numéro de la parcelle : 4 chiffres (ex: 0041, 0250)"
+    }],
+    Administratif: [{
+      name: "prefecture",
+      title: "Préfecture"
+    }, {
+      name: "inseeRegion",
+      title: "Code région (INSEE)"
+    }, {
+      name: "inseeDepartment",
+      title: "Code département (INSEE)"
+    }, {
+      name: "municipality",
+      title: "Ville"
+    }]
+  },
+
+  /**
+   * Provides default zoom based on results.
+   *
+   * @param {Object} info - location information
+   * @returns {Integer} zoom level
+   */
+  zoomToResultsByDefault: function zoomToResultsByDefault(info) {
+    // FIXME
+    // la classification du geocodage est differente de l'importance de l'autocompletion !
+    var zoom = 15;
+    var service = info.service;
+    var fields = info.fields;
+    var type = info.type;
+    var importance = {
+      1: 11,
+      2: 12,
+      3: 13,
+      4: 14,
+      5: 15,
+      6: 16,
+      7: 17,
+      8: 17
+    }; // AutoCompletion POI
+
+    if (service === "SuggestedLocation") {
+      if (type === "PositionOfInterest") {
+        zoom = importance[fields.classification];
+      }
+    } // Geocodage POI
+
+
+    if (service === "DirectGeocodedLocation") {
+      if (type === "PositionOfInterest") {
+        zoom = importance[fields.importance] || 14; // au cas où la recherche est en freeform !
+      }
+    }
+
+    if (type === "StreetAddress") {
+      zoom = 17;
+    }
+
+    if (type === "CadastralParcel") {
+      zoom = 17;
+    }
+
+    if (type === "Administratif") {
+      zoom = 12;
+    }
+
+    return zoom;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (SearchEngineUtils);
+
+/***/ }),
+/* 165 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36);
+
+var SearchEngineDOM = {
+  /**
+  * Add uuid to the tag ID
+  * @param {String} id - id selector
+  * @returns {String} uid - id selector with an unique id
+  */
+  _addUID: function _addUID(id) {
+    var uid = this._uid ? id + "-" + this._uid : id;
+    return uid;
+  },
+
+  /**
+   * Main container (DOM)
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createMainContainerElement: function _createMainContainerElement() {
+    var container = document.createElement("div");
+    container.id = this._addUID("GPsearchEngine");
+    container.className = "GPwidget";
+    return container;
+  },
+  // ################################################################### //
+  // ################### Methods of main container ##################### //
+  // ################################################################### //
+
+  /**
+   * Hidden checkbox for minimizing/maximizing
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowSearchEngineElement: function _createShowSearchEngineElement() {
+    var input = document.createElement("input");
+    input.id = this._addUID("GPshowSearchEngine");
+    input.type = "checkbox";
+    return input;
+  },
+
+  /**
+   * Show search engine
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowSearchEnginePictoElement: function _createShowSearchEnginePictoElement() {
+    // contexte d'execution
+    var self = this;
+    var label = document.createElement("label");
+    label.id = this._addUID("GPshowSearchEnginePicto");
+    label.className = "GPshowAdvancedToolPicto";
+    label.htmlFor = this._addUID("GPshowSearchEngine");
+    label.title = "Afficher/masquer la recherche par lieux"; // Close all results and panels when minimizing the widget
+
+    label.addEventListener("click", function () {
+      document.getElementById(self._addUID("GPautoCompleteList")).style.display = "none";
+      document.getElementById(self._addUID("GPgeocodeResultsList")).style.display = "none";
+      var showAdvancedSearch = document.getElementById(self._addUID("GPshowAdvancedSearch"));
+
+      if (showAdvancedSearch) {
+        showAdvancedSearch.style.display = null;
+        document.getElementById(self._addUID("GPadvancedSearchPanel")).style.display = "none";
+      }
+
+      var id = "#GPsearchInput-" + self._uid;
+      document.querySelector(id + " input").disabled = false; // FIXME form[id^=GPsearchInput] = #GPsearchInput ?
+
+      self.onShowSearchEngineClick();
+    });
+    var spanOpen = document.createElement("span");
+    spanOpen.id = this._addUID("GPshowSearchEngineOpen");
+    spanOpen.className = "GPshowAdvancedToolOpen";
+    label.appendChild(spanOpen);
+    return label;
+  },
+
+  /**
+   * Simple search input
+   * @param {String} placeholder - placeholder
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createSearchInputElement: function _createSearchInputElement(placeholder) {
+    // contexte d'execution
+    var self = this;
+    var form = document.createElement("form");
+    form.id = this._addUID("GPsearchInput"); // Open geocode results panel when submitting the input
+
+    form.addEventListener("submit", function (e) {
+      e.preventDefault();
+      document.getElementById(self._addUID("GPgeocodeResultsList")).style.display = "block";
+      document.getElementById(self._addUID("GPautoCompleteList")).style.display = "none"; // cf. FIXME
+      // document.querySelector("#GPsearchInput input").blur ();
+      // gestionnaire d'evenement :
+      // on récupère la valeur de saisie pour requête sur le service de geocodage
+
+      self.onGeocodingSearchSubmit(e);
+      return false;
+    });
+    var input = document.createElement("input");
+    input.id = this._addUID("GPsearchInputText");
+    input.type = "text";
+    input.placeholder = placeholder;
+    input.autocomplete = "off"; // Manage autocomplete list appearance when filling the address input
+
+    input.addEventListener("keyup", function (e) {
+      var charCode = e.which || e.keyCode;
+
+      if (charCode === 13 || charCode === 10 || charCode === 38 || charCode === 40) {
+        return;
+      }
+
+      document.getElementById(self._addUID("GPgeocodeResultsList")).style.display = "none";
+
+      if (input.value.length > 2) {
+        document.getElementById(self._addUID("GPautoCompleteList")).style.display = "block";
+      } else {
+        document.getElementById(self._addUID("GPautoCompleteList")).style.display = "none";
+      } // gestionnaire d'evenement :
+      // on récupère la valeur de saisie pour requête sur le service d'autocompletion
+
+
+      self.onAutoCompleteSearchText(e);
+    }); // FIXME ce code interfere avec le click sur la liste des suggested locations !
+    // input.addEventListener("blur", function(e) {
+    //     document.getElementById(self._addUID("GPautoCompleteList")).style.display = "none";
+    // });
+
+    input.addEventListener("keydown", function (e) {
+      // FIXME
+      // l'action clavier 'enter (13)' lance le submit de la form !
+      // Ce comportement n'est pas souhaité car le submit execute un geocodage !
+      // Il faut donc trouver le moyen d'eviter le submit sur un return venant
+      // seulement d'une selection de suggestion...
+      var charCode = e.which || e.keyCode;
+      var container = document.getElementById(self._addUID("GPautocompleteResults")); // si aucun container !?
+
+      if (!container) {
+        return;
+      }
+
+      var curr = container.getElementsByClassName("GPautoCompleteProposal current");
+      var list = container.getElementsByClassName("GPautoCompleteProposal"); // si aucune suggestion, on ne va pas plus loin !
+
+      var length = list.length;
+
+      if (!length) {
+        return;
+      }
+
+      var current = null; // si aucun item courant, on prend le 1er !
+
+      if (!curr.length) {
+        current = list[0];
+        current.className = "GPautoCompleteProposal current";
+        current.style.color = "#000000";
+        current.style["background-color"] = "#CEDBEF";
+        return;
+      } else {
+        current = curr[0];
+      }
+
+      var index = parseInt(_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_0__["default"].index(current.id), 10);
+      var next = index === length - 1 ? list[0] : list[index + 1];
+      var prev = index === 0 ? list[length - 1] : list[index - 1];
+      current.style["background-color"] = "";
+      current.style.color = "";
+      prev.style["background-color"] = "";
+      prev.style.color = "";
+      next.style["background-color"] = "";
+      next.style.color = "";
+
+      switch (charCode) {
+        case 38:
+          // arrow up
+          current.className = "GPautoCompleteProposal";
+          prev.className = "GPautoCompleteProposal current";
+          prev.style.color = "#000000";
+          prev.style["background-color"] = "#CEDBEF";
+          break;
+
+        case 40:
+          // arrow down
+          current.className = "GPautoCompleteProposal";
+          next.className = "GPautoCompleteProposal current";
+          next.style.color = "#000000";
+          next.style["background-color"] = "#CEDBEF";
+          break;
+
+        case 13:
+          // enter
+          // cf. FIXME
+          e.preventDefault();
+          current.click(e);
+          break;
+      }
+
+      current.focus();
+    });
+    form.appendChild(input);
+    var div = document.createElement("div");
+    div.id = this._addUID("GPsearchInputReset"); // Reset input
+
+    div.addEventListener("click", function () {
+      document.getElementById(self._addUID("GPsearchInputText")).value = "";
+      document.getElementById(self._addUID("GPautoCompleteList")).style.display = "none";
+      document.getElementById(self._addUID("GPgeocodeResultsList")).style.display = "none";
+      self.onSearchResetClick();
+    });
+    form.appendChild(div);
+    return form;
+  },
+
+  /**
+   * Show advanced search panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowAdvancedSearchElement: function _createShowAdvancedSearchElement() {
+    // contexte d'execution
+    var self = this;
+    var div = document.createElement("div");
+    div.id = this._addUID("GPshowAdvancedSearch");
+    div.className = "GPshowAdvancedToolPicto";
+    div.title = "Ouvrir la recherche avancée"; // Open advanced search
+
+    div.addEventListener("click", function () {
+      var id = "#GPsearchInput-" + self._uid;
+      document.querySelector(id + " input").disabled = true;
+      document.getElementById(self._addUID("GPautoCompleteList")).style.display = "none";
+      document.getElementById(self._addUID("GPgeocodeResultsList")).style.display = "none";
+      document.getElementById(self._addUID("GPshowAdvancedSearch")).style.display = "none";
+      document.getElementById(self._addUID("GPadvancedSearchPanel")).style.display = "inline-block";
+    });
+    var span = document.createElement("span");
+    span.id = this._addUID("GPshowAdvancedSearchOpen");
+    span.className = "GPshowAdvancedToolOpen";
+    div.appendChild(span);
+    return div;
+  },
+
+  /**
+   * Advanced search panel
+   *
+   * FIXME
+   * don't call this._createAdvancedSearchPanelHeaderElement
+   * don't call this._createAdvancedSearchPanelFormElement
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createAdvancedSearchPanelElement: function _createAdvancedSearchPanelElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPadvancedSearchPanel");
+    div.className = "GPpanel";
+    div.style.display = "none"; // FIXME on decompose la fonction pour les besoins du controle,
+    // on ajoutera ces childs à la main...
+    // div.appendChild(this._createAdvancedSearchPanelHeaderElement ());
+    // div.appendChild(this._createAdvancedSearchPanelFormElement ());
+
+    return div;
+  },
+
+  /**
+   * Geocoding results
+   *
+   * FIXME
+   * don't call this._createGeocodeResultsListElement
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createGeocodeResultsElement: function _createGeocodeResultsElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPgeocodeResultsList");
+    div.className = "GPpanel";
+    div.style.display = "none";
+    div.appendChild(this._createGeocodeResultsHeaderElement()); // FIXME on decompose la fonction pour les besoins du controle,
+    // on ajoutera ces childs à la main...
+    // div.appendChild(this._createGeocodeResultsListElement ());
+
+    return div;
+  },
+
+  /**
+   * Autocompletion results
+   *
+   * FIXME
+   * don't call this._createAutoCompleteListElement
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createAutoCompleteElement: function _createAutoCompleteElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPautoCompleteList");
+    div.className = "GPautoCompleteList"; // GPpanel ?
+
+    div.style.display = "none"; // FIXME on decompose la fonction pour les besoins du controle,
+    // on ajoutera ces childs à la main...
+    // div.appendChild(this._createAutoCompleteListElement ());
+
+    return div;
+  },
+  // ################################################################### //
+  // ################### Autocompletion container ###################### //
+  // ################################################################### //
+
+  /**
+   * Autocompletion results list.
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createAutoCompleteListElement: function _createAutoCompleteListElement() {
+    // contexte d'execution
+    var self = this;
+    var container = document.createElement("div");
+    container.id = this._addUID("GPautocompleteResults");
+
+    if (container.addEventListener) {
+      container.addEventListener("click", function (e) {
+        self.onAutoCompletedResultsItemClick(e);
+        document.getElementById(self._addUID("GPautoCompleteList")).style.display = "none";
+      }, false);
+    } else if (container.attachEvent) {
+      container.attachEvent("onclick", function (e) {
+        self.onAutoCompletedResultsItemClick(e);
+        document.getElementById(self._addUID("GPautoCompleteList")).style.display = "none";
+      });
+    } // Proposals are dynamically filled in Javascript by autocomplete service
+    // <div class="GPautoCompleteProposal">...</div>
+
+
+    return container;
+  },
+
+  /**
+   * Autocompletion result.
+   * Proposals are dynamically filled in Javascript by autocomplete service
+   *
+   * TODO formaliser le contenu des reponse
+   *
+   * @param {Object} location - suggested or geocoded location results
+   * @param {Number} id - ID
+   */
+  _createAutoCompletedLocationElement: function _createAutoCompletedLocationElement(location, id) {
+    var container = document.getElementById(this._addUID("GPautocompleteResults"));
+    var div = document.createElement("div");
+    div.id = this._addUID("AutoCompletedLocation_" + id);
+    div.className = "GPautoCompleteProposal";
+    div.innerHTML = location.fullText;
+
+    if (div.addEventListener) {
+      div.addEventListener("click", function (e) {
+        container.click(e);
+      }, false);
+    } else if (div.attachEvent) {
+      div.attachEvent("onclick", function (e) {
+        container.click(e);
+      });
+    }
+
+    container.appendChild(div);
+  },
+  // ################################################################### //
+  // ############### Geocoding with advanced container ################# //
+  // ################################################################### //
+
+  /**
+   * @returns {DOMElement} DOM element
+   */
+  _createAdvancedSearchPanelHeaderElement: function _createAdvancedSearchPanelHeaderElement() {
+    // contexte d'execution
+    var self = this;
+    var container = document.createElement("div");
+    container.className = "GPpanelHeader";
+    var divTitle = document.createElement("div");
+    divTitle.className = "GPpanelTitle";
+    divTitle.innerHTML = "Recherche avancée";
+    container.appendChild(divTitle);
+    var divClose = document.createElement("div");
+    divClose.id = this._addUID("GPadvancedSearchClose");
+    divClose.className = "GPpanelClose";
+    divClose.title = "Fermer la recherche avancée";
+
+    if (divClose.addEventListener) {
+      divClose.addEventListener("click", function () {
+        var id = "#GPsearchInput-" + self._uid;
+        document.querySelector(id + " input").disabled = false;
+        document.getElementById(self._addUID("GPgeocodeResultsList")).style.display = "none";
+        document.getElementById(self._addUID("GPshowAdvancedSearch")).style.display = "inline-block";
+        document.getElementById(self._addUID("GPadvancedSearchPanel")).style.display = "none";
+      }, false);
+    } else if (divClose.attachEvent) {
+      divClose.attachEvent("onclick", function () {
+        var id = "#GPsearchInput-" + self._uid;
+        document.querySelector(id + " input").disabled = false;
+        document.getElementById(self._addUID("GPgeocodeResultsList")).style.display = "none";
+        document.getElementById(self._addUID("GPshowAdvancedSearch")).style.display = "inline-block";
+        document.getElementById(self._addUID("GPadvancedSearchPanel")).style.display = "none";
+      });
+    }
+
+    container.appendChild(divClose);
+    return container;
+  },
+
+  /**
+   * @param {Object[]} advancedSearchCodes - codes
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createAdvancedSearchPanelFormElement: function _createAdvancedSearchPanelFormElement(advancedSearchCodes) {
+    // contexte d'execution
+    var self = this;
+    var form = document.createElement("form");
+    form.id = this._addUID("GPadvancedSearchForm");
+    form.addEventListener("submit", function (e) {
+      e.preventDefault(); // data
+
+      var data = []; // liste des attributs de la ressource de geocodage
+
+      var id = "#GPadvancedSearchFilters-" + self._uid;
+      var matchesFilters = document.querySelectorAll(id + " > div > div > input");
+
+      for (var i = 0; i < matchesFilters.length; i++) {
+        var element = matchesFilters[i];
+        data.push({
+          key: element.name,
+          value: element.value
+        });
+      } // gestionnaire d'evenement :
+      // on récupère les valeurs de saisies pour requête sur le service de geocodage
+
+
+      self.onGeocodingAdvancedSearchSubmit(e, data);
+      document.getElementById(self._addUID("GPgeocodeResultsList")).style.display = "block";
+      return false;
+    });
+    var div = document.createElement("div");
+    div.className = "GPflexInput";
+    var label = document.createElement("label");
+    label.className = "GPadvancedSearchCodeLabel";
+    label.innerHTML = "Recherche par";
+    div.appendChild(label);
+
+    var select = this._createAdvancedSearchFormCodeElement(advancedSearchCodes);
+
+    div.appendChild(select); // FIXME on decompose la fonction pour les besoins du controle,
+    // on ajoutera ces childs à la main...
+    // var filters = this._createAdvancedSearchFormFiltersElement ();
+    // form.appendChild(filters);
+    // var input = this._createAdvancedSearchFormInputElement ();
+    // form.appendChild(input);
+
+    form.appendChild(div);
+    return form;
+  },
+
+  /**
+   * @param {Object[]} codes - codes
+   * @returns {DOMElement} DOM element
+   */
+  _createAdvancedSearchFormCodeElement: function _createAdvancedSearchFormCodeElement(codes) {
+    // contexte d'execution
+    var self = this;
+    var select = document.createElement("select");
+    select.id = this._addUID("GPadvancedSearchCode");
+    select.className = "GPadvancedSearchCode";
+    select.addEventListener("change", function (e) {
+      // var idx   = e.target.selectedIndex;
+      // var value = e.target.options[idx].value;
+      // gestionnaire d'evenement :
+      // permet de recuperer des informations diverses...
+      self.onGeocodingAdvancedSearchCodeChange(e);
+    }, false); // liste statique au cas où des codes n'ont pas été passés en entrée
+
+    if (!codes) {
+      codes = [{
+        id: "PositionOfInterest",
+        title: "Lieux/toponymes"
+      }, {
+        id: "StreetAddress",
+        title: "Adresses"
+      }, {
+        id: "CadastralParcel",
+        title: "Parcelles cadastrales"
+      }, {
+        id: "Administratif",
+        title: "Administratif"
+      }];
+    }
+
+    for (var i = 0; i < codes.length; i++) {
+      var option = document.createElement("option");
+      option.value = codes[i].id;
+      option.text = codes[i].title;
+      select.appendChild(option);
+    }
+
+    return select;
+  },
+
+  /**
+   * @returns {DOMElement} DOM element
+   */
+  _createAdvancedSearchFormInputElement: function _createAdvancedSearchFormInputElement() {
+    var input = document.createElement("input");
+    input.type = "submit";
+    input.id = this._addUID("GPadvancedSearchSubmit");
+    input.className = "GPinputSubmit";
+    input.value = "Chercher";
+    return input;
+  },
+
+  /**
+   * Filters geocoding.
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createAdvancedSearchFormFiltersElement: function _createAdvancedSearchFormFiltersElement() {
+    var container = document.createElement("div");
+    container.id = this._addUID("GPadvancedSearchFilters");
+    return container;
+  },
+
+  /**
+   * Create filter container for resources :
+   * "PositionOfInterest", "StreetAddress", ...
+   *
+   * @param {String} code - code of geocoding resource
+   * @param {Boolean} display - display
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createAdvancedSearchFiltersTableElement: function _createAdvancedSearchFiltersTableElement(code, display) {
+    var container = document.createElement("div");
+    container.id = this._addUID(code);
+
+    if (!display) {
+      container.style.display = "none";
+    }
+
+    return container;
+  },
+
+  /**
+   * Create filter attribut for a resource :
+   * "PositionOfInterest", "StreetAddress", ...
+   * Research filters are filled in Javascript depending on developer choice
+   *
+   * @param {Object} filterAttributes - filter attributes :
+   * @param {String} filterAttributes.code - code of geocoding resource
+   * @param {String} filterAttributes.name - ID
+   * @param {String} filterAttributes.title - label
+   * @param {String} filterAttributes.description - description
+   * @param {String} filterAttributes.value - value
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createAdvancedSearchFiltersAttributElement: function _createAdvancedSearchFiltersAttributElement(filterAttributes) {
+    // INFORMATION
+    // cette methode peut être appelée si le document n'existe pas, elle
+    // permet ainsi de creer une div sans insertion dans le container...
+    var container = null;
+    var name = filterAttributes.name;
+    var title = filterAttributes.title;
+    var description = filterAttributes.description;
+    var code = filterAttributes.code;
+    var value = filterAttributes.value;
+    var div = document.createElement("div");
+    div.className = "GPflexInput";
+    var label = document.createElement("label");
+    label.className = "GPadvancedSearchFilterLabel";
+    label.htmlFor = name;
+    label.title = description || title;
+    label.innerHTML = title;
+    div.appendChild(label);
+    var input = document.createElement("input");
+    input.id = name;
+    input.className = "GPadvancedSearchFilterInput";
+    input.type = "text";
+    input.name = name;
+
+    if (value) {
+      input.value = value;
+    }
+
+    div.appendChild(input);
+    container = document.getElementById(this._addUID(code));
+
+    if (container) {
+      container.appendChild(div);
+    } else {
+      // le container, c'est la div !
+      container = div;
+    }
+
+    return container;
+  },
+  // ################################################################### //
+  // ################## Geocoding results container #################### //
+  // ################################################################### //
+
+  /**
+   * @returns {DOMElement} DOM element
+   */
+  _createGeocodeResultsHeaderElement: function _createGeocodeResultsHeaderElement() {
+    var self = this;
+    var container = document.createElement("div");
+    container.className = "GPpanelHeader";
+    var divTitle = document.createElement("div");
+    divTitle.className = "GPpanelTitle";
+    divTitle.innerHTML = "Résultats de la recherche";
+    container.appendChild(divTitle);
+    var divClose = document.createElement("div");
+    divClose.id = this._addUID("GPgeocodeResultsClose");
+    divClose.className = "GPpanelClose";
+    divClose.title = "Fermer la fenêtre de résultats";
+
+    if (divClose.addEventListener) {
+      divClose.addEventListener("click", function () {
+        document.getElementById(self._addUID("GPgeocodeResultsList")).style.display = "none";
+      }, false);
+    } else if (divClose.attachEvent) {
+      divClose.attachEvent("onclick", function () {
+        document.getElementById(self._addUID("GPgeocodeResultsList")).style.display = "none";
+      });
+    }
+
+    container.appendChild(divClose);
+    return container;
+  },
+
+  /**
+   * Geocoding results list.
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createGeocodeResultsListElement: function _createGeocodeResultsListElement() {
+    // contexte d'execution
+    var self = this;
+    var container = document.createElement("div");
+    container.id = this._addUID("GPgeocodeResults");
+
+    if (container.addEventListener) {
+      container.addEventListener("click", function (e) {
+        if (!e.ctrlKey) {
+          document.getElementById(self._addUID("GPgeocodeResultsList")).style.display = "none";
+        }
+
+        self.onGeocodedResultsItemClick(e);
+      }, false);
+    } else if (container.attachEvent) {
+      container.attachEvent("onclick", function (e) {
+        if (!e.ctrlKey) {
+          document.getElementById(self._addUID("GPgeocodeResultsList")).style.display = "none";
+        }
+
+        self.onGeocodedResultsItemClick(e);
+      });
+    } // Results are dynamically filled in Javascript by geocoding service
+    // <div class="GPautoCompleteProposal">...</div>
+
+
+    return container;
+  },
+
+  /**
+   * Geocoding result.
+   * Results are dynamically filled in Javascript by geocoding service
+   *
+   * TODO formaliser le contenu des reponses
+   * FIXME formater la reponse en amont !
+   *
+   * @param {Object} location - suggested or geocoded location results
+   * @param {Number} id - ID
+   */
+  _createGeocodedLocationElement: function _createGeocodedLocationElement(location, id) {
+    var container = document.getElementById(this._addUID("GPgeocodeResults"));
+    var div = document.createElement("div");
+    div.id = this._addUID("GeocodedLocation_" + id);
+    div.className = "GPautoCompleteProposal";
+
+    if (typeof location === "string") {
+      div.innerHTML = location;
+    } else {
+      var places = location.placeAttributes;
+
+      if (places.freeform) {
+        // reponse en freeForm
+        div.innerHTML = places.freeform;
+      } else if (places.postalCode) {
+        // cas des StreetAddress, PositionOfInterest, Administratif
+        // on affiche uniquement ce qui est commun aux ressources ...
+        div.innerHTML = places.postalCode + " " + places.commune;
+      } else if (places.cadastralParcel) {
+        // cas des CadastralParcel
+        div.innerHTML = places.cadastralParcel;
+      } else {
+        div.innerHTML = "...";
+      }
+    }
+
+    container.appendChild(div);
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (SearchEngineDOM);
+
+/***/ }),
+/* 166 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(40);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var leaflet_draw__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(159);
+/* harmony import */ var leaflet_draw__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(leaflet_draw__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(34);
+/* harmony import */ var _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(140);
+/* harmony import */ var _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(36);
+/* harmony import */ var _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(144);
+/* harmony import */ var _Utils_IconDefault__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(145);
+/* harmony import */ var _Common_Controls_ElevationPathDOM__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(167);
+/* harmony import */ var _Common_Controls_ProfileElevationPathDOM__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(168);
+/* globals AmCharts, d3 */
+
+
+
+
+
+
+
+
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__["default"].getLogger("ElevationPath");
+/**
+ * @classdesc
+ *
+ * Leaflet Control Class to compute and display Profil Elevation.
+ *
+ * Use {@link module :Controls.ElevationPath L.geoportalControl.ElevationPath()} factory to create instances of that class.
+ *
+ * **Extends** Leaflet <a href="http://leafletjs.com/reference.html#control" target="_blank">L.Control</a> native class.
+ *
+ * @namespace
+ * @alias L.geoportalControl.ElevationPath
+ */
+
+var ElevationPath = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Control.extend(
+/** @lends L.geoportalControl.ElevationPath.prototype */
+{
+  includes: _Common_Controls_ElevationPathDOM__WEBPACK_IMPORTED_MODULE_8__["default"],
+
+  /**
+   * Options du service
+   *
+   * @private
+   */
+  options: {
+    position: "topleft",
+    active: false,
+    elevationPathOptions: {},
+    stylesOptions: {},
+    displayProfileOptions: {
+      greaterSlope: true,
+      meanSlope: true,
+      ascendingElevation: true,
+      descendingElevation: true,
+      currentSlope: true,
+      apply: null,
+      target: null
+    }
+  },
+
+  /**
+   * constructor
+   *
+   * @private
+   * @param {Object} options - ElevationPath control options
+   * @param {Sting}   [options.apiKey] - API key for services call (isocurve and autocomplete services), mandatory if autoconf service has not been charged in advance
+  * @param {Boolean} [options.ssl = true] - use of ssl or not (default true, service requested using https protocol)
+   * @param {Boolean} [options.active] - Specify if widget has to be actived to drawing (true) or not (false) on map loading. Default is false.
+   * @param {Object} [options.elevationPathOptions = {}] - elevation service options. See {@link http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~getAltitude Gp.Services.getAltitude()} to know all elevation options
+   * @param {Object} [options.displayProfileOptions = {}] - profile options.
+   * @param {Function} [options.displayProfileOptions.apply] - function to display profil panel.
+   * @param {Object} [options.displayProfileOptions.target] - container DOM for the profil panel.
+   * @param {Boolean} [options.displayProfileOptions.greaterSlope = true] - display the greater slope into the graph
+   * @param {Boolean} [options.displayProfileOptions.meanSlope = true] -  display the mean slope into the graph
+   * @param {Boolean} [options.displayProfileOptions.ascendingElevation = true] -  display the ascending elevation into the graph
+   * @param {Boolean} [options.displayProfileOptions.descendingElevation = true] -  display the descending elevation into the graph
+   * @param {Boolean} [options.displayProfileOptions.currentSlope = true] -  display current slope value on profile mouseover
+   *
+   * @example
+   *  var e = L.geoportalControl.ElevationPath({
+   *      active : false,
+   *      stylesOptions : {},
+   *      elevationPathOptions : {},
+   *      displayProfileOptions : {
+   *       apply : null,
+   *       target : null
+   *      }
+   *  });
+   * Exemples :
+   * - displayProfileOptions.apply : null
+   * - displayProfileOptions.apply : function (elevations, container, context) {  // do some stuff... }
+   * - displayProfileOptions.apply : ol.control.ElevationPath.DISPLAY_PROFILE_{LIB_AMCHARTS | LIB_D3 | RAW}
+   * (detect auto lib. : d3 / AmCharts)
+   */
+  initialize: function initialize(options) {
+    // on transmet les options au controle
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.setOptions(this, options); // uuid
+
+    this._uid = _Common_Utils_SelectorID__WEBPACK_IMPORTED_MODULE_5__["default"].generate(); // initialisation
+
+    this._initDisplayProfileOptions(); // les container
+
+
+    this._showContainer = null;
+    this._pictoContainer = null;
+    this._panelContainer = null;
+    this._profilContainer = null;
+    this._waitingContainer = null;
+    this._infoContainer = null; // timer sur la fenetre d'informations des données
+
+    this._timerHdlr = null; // detection si le panneau est reduit
+
+    this._reducePanel = false; // couche vectorielle dans laquelle seront saisis les points (features ci-dessus)
+
+    this._featuresLayer = null;
+    this._lastIdLayer = 0;
+    this._currentIdLayer = 0;
+    this._currentFeature = null; // graph
+
+    this._profile = null;
+    this._marker = null; // geometry à transmettre au service :  { lon : [], lat : []}
+
+    this._geometry = null; // distance du segment
+
+    this._distance = 0; // data elevations
+
+    this._data = {}; // aucun droits sur les ressources
+
+    this._noRightManagement = false; // gestion des droits sur les ressources/services
+
+    this._checkRightsManagement();
+  },
+
+  /**
+   * this method is called by this.addTo(map) when the control is added on the map
+   * and fills variable 'this._container = this.onAdd(map)',
+   * and create or disable events on map.
+   *
+   * @param {Object} map - the map
+   *
+   * @returns {DOMElement} DOM element
+   * @private
+   */
+  onAdd: function onAdd(map) {
+    // initialisation du DOM du composant
+    var container = this._container = this._initLayout();
+
+    if (map) {
+      // lors de l'ajout à la map, on active la saisie du point,
+      // mais seulement si le widget est ouvert
+      if (this.options.active) {
+        if (this._profile === null) {
+          this._panelContainer.style.display = "none"; // this._panelContainer.style.visibility = "hidden";
+        }
+
+        this._activateMapInteraction(map);
+      }
+    } // deactivate of events that may interfere with the map
+
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
+    return container;
+  },
+
+  /**
+   * TODO this method is called when the control is removed from the map
+   * and removes events on map.
+   *
+   * @private
+   */
+  onRemove: function onRemove()
+  /* map */
+  {},
+  // ################################################################### //
+  // ########################## init resources ######################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by constructor
+   * and check the rights to resources
+   *
+   * @private
+   */
+  _checkRightsManagement: function _checkRightsManagement() {
+    var rightManagement = _Common_Utils_CheckRightManagement__WEBPACK_IMPORTED_MODULE_4__["default"].check({
+      key: this.options.apiKey,
+      resources: ["SERVICE_CALCUL_ALTIMETRIQUE_RSC"],
+      services: ["ElevationLine"]
+    });
+
+    if (!rightManagement) {
+      this._noRightManagement = true;
+    } // on recupère les informations utiles
+    // sur ce controle, on ne s'occupe pas de la ressource car elle est unique...
+    // Ex. la clef API issue de l'autoconfiguration si elle n'a pas
+    // été renseignée.
+
+
+    if (!this.options.apiKey) {
+      this.options.apiKey = rightManagement.key;
+    }
+  },
+  // ################################################################### //
+  // ####################### init application ########################## //
+  // ################################################################### //
+
+  /**
+   * this method is called by the constructor and initialize the ...
+   *
+   * @private
+   */
+  _initDisplayProfileOptions: function _initDisplayProfileOptions() {
+    // gestion de l'affichage du profil
+    var _profileOpts = this.options.displayProfileOptions; // gestion de la fonction du profil
+
+    var displayFunction = _profileOpts.apply;
+    _profileOpts.apply = typeof displayFunction === "function" ? displayFunction : ElevationPath.DISPLAY_PROFILE_BY_DEFAULT; // gestion du container du profil
+
+    var displayContainer = _profileOpts.target;
+    _profileOpts.target = typeof displayContainer !== "undefined" ? displayContainer : null; // les autres options
+
+    var _protoOpts = Object.getPrototypeOf(this.options);
+
+    if (typeof _profileOpts.meanSlope === "undefined") {
+      _profileOpts.meanSlope = _protoOpts.displayProfileOptions.meanSlope;
+    }
+
+    if (typeof _profileOpts.greaterSlope === "undefined") {
+      _profileOpts.greaterSlope = _protoOpts.displayProfileOptions.greaterSlope;
+    }
+
+    if (typeof _profileOpts.ascendingElevation === "undefined") {
+      _profileOpts.ascendingElevation = _protoOpts.displayProfileOptions.ascendingElevation;
+    }
+
+    if (typeof _profileOpts.descendingElevation === "undefined") {
+      _profileOpts.descendingElevation = _protoOpts.displayProfileOptions.descendingElevation;
+    }
+
+    if (typeof _profileOpts.currentSlope === "undefined") {
+      _profileOpts.currentSlope = _protoOpts.displayProfileOptions.currentSlope;
+    }
+  },
+  // ################################################################### //
+  // ########################### init dom ############################## //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onAdd(map)
+   * and initialize the container HTMLElement
+   *
+   * @returns {DOMElement} DOM element
+   * @private
+   */
+  _initLayout: function _initLayout() {
+    // create main container
+    var container = this._createMainContainerElement();
+
+    var inputShow = this._showContainer = this._createShowElevationPathElement();
+
+    container.appendChild(inputShow); // mode "collapsed"
+
+    if (this.options.active) {
+      this._showContainer.checked = true;
+    }
+
+    var picto = this._pictoContainer = this._createShowElevationPathPictoElement();
+
+    container.appendChild(picto); // panneau
+
+    var panel = this._panelContainer = this._createElevationPathPanelElement(); // header
+
+
+    var header = this._createElevationPathPanelHeaderElement();
+
+    panel.appendChild(header); // profil
+
+    var profil = this._profilContainer = this._createElevationPathPanelProfilElement();
+
+    panel.appendChild(profil); // waiting
+
+    var waiting = this._waitingContainer = this._createElevationPathWaitingElement();
+
+    panel.appendChild(waiting); // info
+
+    var info = this._infoContainer = this._createElevationPathInformationsElement();
+
+    panel.appendChild(info);
+    container.appendChild(panel);
+    return container;
+  },
+  // ################################################################### //
+  // ####################### handlers events to dom #################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by event 'click' on '' picto
+   * and ...
+   *
+   * @param {Object} e - HTMLElement
+   *
+   * @private
+   */
+  onShowElevationPathClick: function onShowElevationPathClick(e) {
+    logger.trace(e);
+    var map = this._map; // interactions avec la carte
+
+    if (!this._reducePanel) {
+      if (this._showContainer.checked) {
+        this._pictoContainer.style.display = "block";
+        this._panelContainer.style.display = "none";
+
+        this._removeMapInteraction(map);
+
+        this._clear();
+      } else {
+        if (this._profile === null) {
+          this._panelContainer.style.display = "none";
+        }
+
+        this._activateMapInteraction(map);
+      }
+    } else {
+      if (this._profile !== null) {
+        if (this.options.displayProfileOptions.target === null) {
+          this._pictoContainer.style.display = "none";
+        }
+
+        this._panelContainer.style.display = "block";
+      }
+    }
+
+    this._reducePanel = false;
+  },
+
+  /**
+   * this method is called by event 'click' on '' picto
+   * (cf. this.),
+   * and reduce the panel
+   *
+   * @private
+   */
+  onReduceElevationPathPanelClick: function onReduceElevationPathPanelClick() {
+    this._reducePanel = true;
+    this._pictoContainer.style.display = "block";
+    this._panelContainer.style.display = "none";
+  },
+
+  /**
+   * this method is called by event 'click' on '' picto
+   * (cf. this.),
+   * and display the panel info
+   * TODO
+   *
+   * @private
+   */
+  onOpenElevationPathInfoClick: function onOpenElevationPathInfoClick() {
+    // options d'affichage
+    var meanSlope = this.options.displayProfileOptions.meanSlope;
+    var greaterSlope = this.options.displayProfileOptions.greaterSlope;
+    var ascendingElevation = this.options.displayProfileOptions.ascendingElevation;
+    var descendingElevation = this.options.displayProfileOptions.descendingElevation; // clean
+
+    var div = this._infoContainer;
+
+    if (div.childElementCount) {
+      while (div.firstChild) {
+        div.removeChild(div.firstChild);
+      }
+    } // creation des infomations
+
+
+    if (ascendingElevation) {
+      this._addElevationPathInformationsItem("Dénivelé positif : " + this._data.ascendingElevation.toLocaleString() + " m");
+    }
+
+    if (descendingElevation) {
+      this._addElevationPathInformationsItem("Dénivelé négatif : " + this._data.descendingElevation.toLocaleString() + " m");
+    }
+
+    if (meanSlope) {
+      this._addElevationPathInformationsItem("Pente moyenne : " + this._data.meanSlope.toLocaleString() + " %");
+    }
+
+    if (greaterSlope) {
+      this._addElevationPathInformationsItem("Plus forte pente : " + this._data.greaterSlope.toLocaleString() + " %");
+    } // show des informations !
+
+
+    if (div.className === "GPelevationPathInformationsContainerVisible") {
+      clearTimeout(this._timerHdlr);
+      div.className = "GPelevationPathInformationsContainerHidden";
+    } else {
+      div.className = "GPelevationPathInformationsContainerVisible";
+    } // hidden des informations !
+
+
+    this._timerHdlr = setTimeout(function () {
+      div.className = "GPelevationPathInformationsContainerHidden";
+    }, 4000);
+  },
+  // ################################################################### //
+  // ################### Map interactions management ################### //
+  // ################################################################### //
+
+  /**
+   * this method is called by this.onShowElevationPathClick,
+   * and calls method corresponding to current delimitation, if widget is not collapsed.
+   *
+   * @param {Object} map - control map.
+   * @private
+   */
+  _activateMapInteraction: function _activateMapInteraction(map) {
+    logger.info("_activateMapInteraction()"); // Creation de la couche vectorielle sur laquelle on va dessiner
+
+    if (this._featuresLayer === null) {
+      this._featuresLayer = new leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.FeatureGroup();
+      map.addLayer(this._featuresLayer);
+      var self = this;
+      /* evenements : on desactive le menu systeme pour la saisie */
+
+      map.on("contextmenu", function () {});
+      /* evenement sur la carte lors d'une saisie,
+      on y ajoute le layer, et on y stocke les coordonnées */
+
+      map.on("draw:created", function (e) {
+        logger.trace("draw:created");
+        self._currentIdLayer = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.stamp(e.layer);
+
+        self._getFeatureGeometry(e.layer);
+
+        self._addFeatureLayer(e.layer);
+      });
+      /* evenements */
+
+      map.on("draw:drawstart", function () {
+        logger.trace("draw:drawstart");
+
+        self._removeFeatureLayer(self._lastIdLayer);
+
+        self._lastIdLayer = self._currentIdLayer;
+      });
+      /* evenements */
+
+      map.on("draw:drawstop", function () {
+        logger.trace("draw:drawstop");
+
+        if (typeof self.options.elevationPathOptions.onSuccess === "undefined" && self.options.displayProfileOptions.target === null) {
+          self._pictoContainer.style.display = "none";
+          self._panelContainer.style.display = "block";
+        }
+
+        self._altiRequest();
+      });
+    }
+
+    this._activatePolyLineInteraction(map);
+  },
+
+  /**
+   * remove draw interaction from map (if exists)
+   *
+   * @param {Object} map - control map.
+   * @private
+   */
+  _removeMapInteraction: function _removeMapInteraction(map) {
+    if (!map) {
+      return;
+    }
+
+    if (this._featuresLayer !== null) {
+      map.off("draw:created");
+      map.off("draw:drawstart");
+      map.off("draw:drawstop");
+      map.removeLayer(this._featuresLayer);
+      this._featuresLayer = null;
+    }
+
+    this._lastIdLayer = this._currentIdLayer = 0; // FIXME delete this._currentFeature ?
+
+    if (this._currentFeature) {
+      this._currentFeature.disable();
+    }
+  },
+
+  /**
+   * this method is called by this._activateMapInteraction,
+   * and creates map polyline drawing interaction.
+   *
+   * @param {Object} map - control map.
+   * @private
+   */
+  _activatePolyLineInteraction: function _activatePolyLineInteraction(map) {
+    if (this._currentFeature) {
+      this._currentFeature.disable();
+    } // liste des options par defaut
+    // cf. https://leaflet.github.io/Leaflet.draw/docs/leaflet-draw-latest.html
+    // var polylineOptions = {
+    //     allowIntersection : true,
+    //     repeatMode : false,
+    //     drawError : {
+    //         color : "#b00b00",
+    //         timeout : 2500
+    //     },
+    //     icon : new L.DivIcon({
+    //         iconSize : new L.Point(8, 8),
+    //         className : 'leaflet-div-icon leaflet-editing-icon'
+    //     }),
+    //     touchIcon : new L.DivIcon({
+    //         iconSize : new L.Point(20, 20),
+    //         className : 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
+    //     }),
+    //     guidelineDistance : 20,
+    //     maxGuideLineLength : 4000,
+    //     shapeOptions : {
+    //         stroke : true,
+    //         color : '#f06eaa',
+    //         weight : 4,
+    //         opacity : 0.5,
+    //         fill : false,
+    //         clickable : true
+    //     },
+    //     metric : true, // Whether to use the metric measurement system or imperial
+    //     feet : true, // When not metric, to use feet instead of yards for display.
+    //     nautic : false, // When not metric, not feet use nautic mile for display
+    //     showLength : true, // Whether to display distance in the tooltip
+    //     zIndexOffset : 2000 // This should be > than the highest z-index any map layersallowIntersection : true,
+    // };
+
+
+    var styles = this.options.stylesOptions || {};
+
+    var _shapeOptions = Object.keys(styles).length !== 0 ? styles : {
+      stroke: true,
+      color: "#C77A04",
+      weight: 4,
+      opacity: 0.5,
+      fill: false
+    };
+
+    this._currentFeature = new leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Draw.Polyline(map, {
+      shapeOptions: _shapeOptions
+    });
+
+    this._currentFeature.enable();
+  },
+
+  /**
+   * set current position of feature
+   *
+   * @param {Object} layer - layer
+   * @private
+   */
+  _getFeatureGeometry: function _getFeatureGeometry(layer) {
+    // on transmet toujours des coordonnées au service en EPSG:4326
+    logger.log(layer.getLatLngs());
+
+    if (this._geometry !== null) {
+      this._geometry = null;
+    }
+
+    this._geometry = [];
+    this._distance = 0;
+    var geometry = layer.getLatLngs();
+
+    for (var i = 0; i < geometry.length; i++) {
+      // on transmet au service des coordonnées en EPSG:4326
+      var LatLngI = geometry[i];
+      var LatLngJ = geometry[i + 1];
+
+      this._geometry.push({
+        lon: LatLngI.lng,
+        lat: LatLngI.lat
+      }); // on calcul la distance du segment
+
+
+      if (LatLngJ) {
+        this._distance += LatLngI.distanceTo(LatLngJ);
+      }
+    }
+
+    logger.log("Geometry", this._geometry);
+    logger.log("Distance", this._distance);
+  },
+
+  /**
+   * set current layer of feature
+   *
+   * @param {Object} layer - layer
+   * @private
+   */
+  _addFeatureLayer: function _addFeatureLayer(layer) {
+    if (!this._featuresLayer) {
+      return;
+    }
+
+    this._featuresLayer.addLayer(layer);
+  },
+
+  /**
+   * remove layer feature from group
+   *
+   * @param {Integer} id - id
+   * @private
+   */
+  _removeFeatureLayer: function _removeFeatureLayer(id) {
+    if (!this._featuresLayer) {
+      return;
+    }
+
+    if (id === 0) {
+      return;
+    }
+
+    if (!id) {
+      this._featuresLayer.clearLayers();
+    } else {
+      this._featuresLayer.removeLayer(id);
+    }
+  },
+  // ################################################################### //
+  // ############################ Alti request ######################### //
+  // ################################################################### //
+
+  /**
+   * this methode is called by this. method,
+   * it generates and sends alti request, then displays results
+   *
+   * @private
+   */
+  _altiRequest: function _altiRequest() {
+    logger.log("_altiRequest"); // les coordonnées sont obligatoires
+
+    if (!this._geometry) {
+      logger.log("missing position");
+      return;
+    } // oups, aucun droits !
+
+
+    if (this._noRightManagement) {
+      return;
+    } // on construit les options pour la requête
+
+
+    var options = {}; // on surcharge avec les options de l'utilisateur
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, this.options.elevationPathOptions); // au cas où la clef API n'est pas renseignée dans les options du service,
+    // on utilise celle de l'autoconf ou celle renseignée au niveau du controle
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      apiKey: options.apiKey || this.options.apiKey
+    }); // si l'utilisateur a spécifié le paramètre ssl au niveau du control, on s'en sert
+    // true par défaut (https)
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      ssl: this.options.ssl
+    }); // le sampling est soit defini par l'utilisateur (opts),
+    // ou soit calculé dynamiquement...
+
+    var _sampling = options.sampling;
+
+    if (!_sampling) {
+      // computing sampling
+      var _computeSampling = 50;
+      var _length = this._currentFeature._measurementRunningTotal; // FIXME !!!
+
+      logger.trace("length", _length);
+      var p = Math.floor(_length) / 5; // en mètre sur un pas moyen de 5m !
+
+      if (p >= 200) {
+        _computeSampling = 200;
+      } else {
+        _computeSampling = Math.floor(p);
+      }
+
+      _sampling = _computeSampling;
+    } // on y ajoute les callbacks ainsi que les options par defaut
+
+
+    var self = this;
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      /** sampling à 200 (iso portail) */
+      sampling: _sampling,
+      // callback onSuccess
+      onSuccess: this.options.elevationPathOptions.onSuccess || function (result) {
+        logger.log(result);
+
+        if (result) {
+          if (self.options.displayProfileOptions.target !== null) {
+            self._pictoContainer.style.display = "block";
+            self._panelContainer.style.display = "block";
+          }
+
+          self._displayProfil(result.elevations);
+
+          self._waitingContainer.className = "GPelevationPathCalcWaitingContainerHidden";
+          self._waiting = false;
+        }
+      },
+      // callback onFailure
+      onFailure: this.options.elevationPathOptions.onFailure || function (error) {
+        logger.log(error.message);
+        self._pictoContainer.style.display = "block";
+        self._panelContainer.style.display = "none";
+        self._waitingContainer.className = "GPelevationPathCalcWaitingContainerHidden";
+        self._waiting = false;
+
+        self._clear();
+      }
+    }); // et enfin, la geometrie
+
+    var positions = this._geometry;
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(options, {
+      positions: positions
+    });
+    logger.log(options); // mise en place de la patience
+
+    this._waitingContainer.className = "GPelevationPathCalcWaitingContainerVisible"; // Request altitude service
+
+    geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__["default"].Services.getAltitude(options);
+  },
+  // ################################################################### //
+  // ########################## Profil display ######################### //
+  // ################################################################### //
+
+  /**
+   * this method computes results elevations (Z and distance)
+   *
+   * @param {Array} elevations - array of elevation
+   * @return {Array} elevations
+   * @private
+   */
+  _computeElevationMeasure: function _computeElevationMeasure(elevations) {
+    // Returns the distance from c1 to c2 using the haversine formula
+    var _haversineDistance = function _haversineDistance(c1, c2) {
+      var lat1 = _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_6__["default"].decimalToRadian(c1[1]);
+      var lat2 = _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_6__["default"].decimalToRadian(c2[1]);
+      var deltaLatBy2 = (lat2 - lat1) / 2;
+      var deltaLonBy2 = _Utils_PositionFormater__WEBPACK_IMPORTED_MODULE_6__["default"].decimalToRadian(c2[0] - c1[0]) / 2;
+      var a = Math.sin(deltaLatBy2) * Math.sin(deltaLatBy2) + Math.sin(deltaLonBy2) * Math.sin(deltaLonBy2) * Math.cos(lat1) * Math.cos(lat2);
+      return 2 * 6378137 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+    };
+
+    var _data = elevations; // FIXME facteur à 2000 doit il etre une option ?
+
+    var _limite = 2000; // metres
+
+    var _unit = "km";
+    var _factor = 1000;
+
+    if (this._distance < _limite) {
+      _factor = 1;
+      _unit = "m";
+    } // Calcul de la distance au départ pour chaque point + arrondi des lat/lon
+
+
+    _data[0].dist = 0;
+    _data[0].slope = 0;
+    var _distanceMinus = 0;
+    var _distancePlus = 0;
+    var _ascendingElevation = 0;
+    var _descendingElevation = 0;
+    var _distance = 0;
+    var _slopes = 0;
+
+    for (var i = 1; i < _data.length; i++) {
+      var a = [_data[i].lon, _data[i].lat];
+      var b = [_data[i - 1].lon, _data[i - 1].lat];
+
+      var dist = _haversineDistance(a, b);
+
+      var za = _data[i].z;
+      var zb = _data[i - 1].z;
+
+      if (za < 0) {
+        za = 0;
+      }
+
+      if (zb < 0) {
+        zb = 0;
+      }
+
+      var slope = za - zb;
+
+      if (slope < 0) {
+        _distanceMinus += dist;
+        _descendingElevation += slope;
+      } else if (slope > 0) {
+        _distancePlus += dist;
+        _ascendingElevation += slope;
+      }
+
+      _distance += dist / _factor;
+      _data[i].dist = _distance;
+      _slopes += slope ? Math.abs(Math.round(slope / dist * 100)) : 0;
+      _data[i].slope = slope ? Math.abs(Math.round(slope / dist * 100)) : 0; // EVOL ?
+      // cf. gradiant
+      // http://www.color-hex.com/color/00b798
+
+      var value = _data[i].slope;
+
+      if (value > 15 && value < 30) {
+        _data[i].color = "#005b4c";
+      } else if (value > 30 && value < 45) {
+        _data[i].color = "#00362d";
+      } else if (value > 45) {
+        _data[i].color = "#00120f";
+      } else {
+        _data[i].color = "#00B798";
+      }
+
+      _data[i].lat = Math.round(_data[i].lat * 10000) / 10000;
+      _data[i].lon = Math.round(_data[i].lon * 10000) / 10000;
+    } // Valeur du coeff d'arrondi des distances en fonction de la distance totale
+
+
+    var coeffArrond = 100;
+
+    if (_distance > 100) {
+      coeffArrond = 1;
+    } else if (_distance > 10) {
+      coeffArrond = 10;
+    } // Correction arrondi distance totale
+
+
+    _distance = Math.round(_distance * coeffArrond) / coeffArrond;
+    _distanceMinus = Math.round(_distanceMinus * coeffArrond) / coeffArrond;
+    _distancePlus = Math.round(_distancePlus * coeffArrond) / coeffArrond; // Correction des altitudes aberrantes + arrondi des calculs de distance + ...
+
+    var _altMin = _data[0].z;
+    var _altMax = _data[0].z;
+    var _greaterSlope = _data[0].slope;
+
+    for (var ji = 0; ji < _data.length; ji++) {
+      var d = _data[ji];
+
+      if (d.z < 0) {
+        d.z = 0;
+      }
+
+      if (d.z >= _altMax) {
+        _altMax = d.z;
+      }
+
+      if (d.z <= _altMin) {
+        _altMin = d.z;
+      }
+
+      d.dist = Math.round(d.dist * coeffArrond) / coeffArrond; // FIXME erreur avec D3 car cette lib souhaite un numerique !
+      // d.dist = d.dist.toLocaleString();
+
+      if (d.slope > _greaterSlope) {
+        _greaterSlope = d.slope;
+      }
+    }
+
+    return {
+      greaterSlope: _greaterSlope,
+      // pente max
+      meanSlope: Math.round(_slopes / _data.length),
+      // pente moyenne
+      distancePlus: _distancePlus.toLocaleString(),
+      // distance cumulée positive
+      distanceMinus: _distanceMinus.toLocaleString(),
+      // distance cumulée négative
+      ascendingElevation: _ascendingElevation,
+      // dénivelé cumulée positive
+      descendingElevation: _descendingElevation,
+      // dénivelé cumulée négative
+      altMin: _altMin.toLocaleString(),
+      // altitude min
+      altMax: _altMax.toLocaleString(),
+      // altitude max
+      distance: _distance.toLocaleString(),
+      // distance totale
+      unit: _unit,
+      // unité des mesures de distance
+      points: _data
+    };
+  },
+
+  /**
+   * this method is called by this. (in case of success)
+   * and display results
+   *
+   * @param {Array} elevations - array of elevation
+   * @private
+   */
+  _displayProfil: function _displayProfil(elevations) {
+    // on reactive le menu systeme en fin de saisie !
+    var map = this._map;
+    map.off("contextmenu"); // data
+
+    if (this._data) {
+      this._data = {};
+    } // sauvegarde des données
+
+
+    var data = this._data = this._computeElevationMeasure(elevations); // container
+
+
+    var container = this.options.displayProfileOptions.target;
+
+    if (container) {
+      container.appendChild(this._panelContainer);
+    }
+
+    container = this._profilContainer; // TODO contexte ?
+
+    var context = this;
+    var _profileOpts = this.options.displayProfileOptions; // fonction
+
+    var displayFunction = _profileOpts.apply; // Calcul du profil
+
+    if (typeof AmCharts !== "undefined" && typeof d3 !== "undefined") {
+      logger.trace("Aucune lib. n'est presente !");
+    } // execution...
+
+
+    displayFunction.call(this, data, container, context); // affichage des informations du profil ?
+
+    var element = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.DomUtil.get("GPelevationPathPanelInfo-" + this._uid);
+
+    if (_profileOpts.greaterSlope || _profileOpts.meanSlope || _profileOpts.ascendingElevation || _profileOpts.descendingElevation) {
+      // on affiche les informations
+      element.style.display = "block";
+    }
+  },
+  // ################################################################### //
+  // ################################ clean ############################ //
+  // ################################################################### //
+
+  /**
+   * this method clears all data
+   *
+   * @private
+   */
+  _clear: function _clear() {
+    this._geometry = null;
+    this._profile = null; // on vide le container
+
+    if (this._profilContainer) {
+      while (this._profilContainer.firstChild) {
+        this._profilContainer.removeChild(this._profilContainer.firstChild);
+      }
+    } // on supprime le marker
+
+
+    var map = this._map;
+
+    if (this._marker) {
+      map.removeLayer(this._marker);
+      this._marker = null;
+    }
+  }
+});
+/**
+ * create Profile Marker
+ *
+ * @param {Object} context - context
+ * @param {Object} data - data
+ */
+
+ElevationPath.__createProfileMarker = function (context, data) {
+  logger.log("__createProfileMarker");
+  var self = context;
+  var map = self._map; // var _srs    = L.CRS.EPSG4326;
+  // var _pointA = _srs.latLngToPoint(L.latLng(self._geometry[0].lat, self._geometry[0].lon));
+  // var _pointB = _srs.latLngToPoint(L.latLng(self._geometry[self._geometry.length - 1].lat, self._geometry[self._geometry.length - 1].lon));
+  // var _point  = L.LineUtil.closestPointOnSegment(_srs.latLngToPoint(L.latLng(data.lat, data.lon)), _pointA, _pointB );
+  // creation d"un marker
+
+  self._marker = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.marker(leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.latLng(data), {
+    icon: new _Utils_IconDefault__WEBPACK_IMPORTED_MODULE_7__["default"]("orange"),
+    draggable: false,
+    clickable: false,
+    zIndexOffset: 1000
+  });
+
+  self._marker.addTo(map);
+};
+/**
+ * update Profile Marker
+ *
+ * @param {Object} context - context
+ * @param {Object} data - data
+ */
+
+
+ElevationPath.__updateProfileMarker = function (context, data) {
+  logger.log("__updateProfileMarker");
+  var self = context;
+  var map = self._map; // var _srs    = L.CRS.EPSG4326;
+  // var _pointA = _srs.latLngToPoint(L.latLng(self._geometry[0].lat, self._geometry[0].lon));
+  // var _pointB = _srs.latLngToPoint(L.latLng(self._geometry[self._geometry.length - 1].lat, self._geometry[self._geometry.length - 1].lon));
+  // var _point  = L.LineUtil.closestPointOnSegment( _srs.latLngToPoint(L.latLng(data.lat, data.lon)), _pointA, _pointB );
+
+  if (self._marker) {
+    self._marker.setLatLng(leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.latLng(data));
+
+    self._marker.update();
+  } else {
+    // creation d"un marker
+    self._marker = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.marker(leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.latLng(data), {
+      icon: new _Utils_IconDefault__WEBPACK_IMPORTED_MODULE_7__["default"]("orange"),
+      draggable: false,
+      clickable: false,
+      zIndexOffset: 1000
+    });
+
+    self._marker.addTo(map);
+  }
+};
+/**
+ * remove Profile Marker
+ *
+ * @param {Object} context - context
+ */
+
+
+ElevationPath.__removeProfileMarker = function (context) {
+  logger.log("__removeProfileMarker");
+  var self = context;
+  var map = self._map;
+
+  if (self._marker) {
+    map.removeLayer(self._marker);
+    self._marker = null;
+  }
+};
+/**
+ * custom operation into raw profil...
+ * TODO
+ */
+
+
+ElevationPath.__customRawProfileOperation = function () {
+  logger.log("__customRawProfileOperation");
+};
+/**
+ * custom operation into raw profil...
+ * TODO
+ *
+ * @param {Object} context - context
+ * @param {Object} e - event
+ */
+
+
+ElevationPath.__customRawProfileMouseOverEvent = function (context, e) {
+  logger.log("__customRawProfileMouseOverEvent", context, e);
+};
+/**
+ * Display Profile function used by default : no additonal framework needed.
+ *
+ * @static
+ * @param {Object} data - elevations values for profile
+ * @param {HTMLElement} container - html container where to display profile
+ * @param {Object} context - this control object
+ */
+
+
+ElevationPath.DISPLAY_PROFILE_BY_DEFAULT = function (data, container, context) {
+  logger.trace("ElevationPath.DISPLAY_PROFILE_BY_DEFAULT");
+  var profile = _Common_Controls_ProfileElevationPathDOM__WEBPACK_IMPORTED_MODULE_9__["default"].displayProfileByDefault(data, container, context, ElevationPath); // on sauvegarde le profil du container dans l'objet
+
+  if (profile) {
+    this._profile = profile;
+  }
+};
+/**
+ * Display Profile without graphical rendering (raw service response)
+ *
+ * @static
+ * @param {Object} data - elevations values for profile
+ * @param {HTMLElement} container - html container where to display profile
+ * @param {Object} context - this control object
+ */
+
+
+ElevationPath.DISPLAY_PROFILE_RAW = function (data, container, context) {
+  logger.trace("ElevationPath.DISPLAY_PROFILE_RAW");
+  var profile = _Common_Controls_ProfileElevationPathDOM__WEBPACK_IMPORTED_MODULE_9__["default"].displayProfileRaw(data, container, context, ElevationPath); // on sauvegarde le profil du container dans l'objet
+
+  if (profile) {
+    this._profile = profile;
+  }
+};
+/**
+ * Display Profile using D3 javascript framework. This method needs D3 libraries to be loaded.
+ *
+ * @static
+ * @param {Object} data - elevations values for profile
+ * @param {HTMLElement} container - html container where to display profile
+ * @param {Object} context - this control object
+ */
+
+
+ElevationPath.DISPLAY_PROFILE_LIB_D3 = function (data, container, context) {
+  logger.trace("ElevationPath.DISPLAY_PROFILE_LIB_D3");
+
+  if (typeof d3 === "undefined") {
+    logger.log("Lib. D3 is not loaded !");
+    return;
+  }
+
+  var profile = _Common_Controls_ProfileElevationPathDOM__WEBPACK_IMPORTED_MODULE_9__["default"].displayProfileLibD3(data, container, context, ElevationPath); // on sauvegarde le profil du container dans l'objet
+
+  if (profile) {
+    this._profile = profile;
+  }
+};
+/**
+ * Display Profile using Amcharts framework. This method needs AmCharts libraries to be loaded.
+ *
+ * @static
+ * @param {Object} data - elevations values for profile
+ * @param {HTMLElement} container - html container where to display profile
+ * @param {Object} context - this control object
+ */
+
+
+ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS = function (data, container, context) {
+  logger.trace("ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS"); // Calcul du profile
+
+  if (typeof AmCharts === "undefined") {
+    logger.log("Lib. AmCharts is not loaded !");
+    return;
+  }
+
+  var profile = _Common_Controls_ProfileElevationPathDOM__WEBPACK_IMPORTED_MODULE_9__["default"].displayProfileLibAmCharts(data, container, context, ElevationPath); // on sauvegarde le profil du container dans l'objet
+
+  if (profile) {
+    this._profile = profile;
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (ElevationPath);
+
+/***/ }),
+/* 167 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var ElevationPathDOM = {
+  /**
+  * Add uuid to the tag ID
+  * @param {String} id - id selector
+  * @returns {String} uid - id selector with an unique id
+  */
+  _addUID: function _addUID(id) {
+    var uid = this._uid ? id + "-" + this._uid : id;
+    return uid;
+  },
+
+  /**
+   * Main container (DOM)
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createMainContainerElement: function _createMainContainerElement() {
+    var container = document.createElement("div");
+    container.id = this._addUID("GPelevationPath");
+    container.className = "GPwidget";
+    return container;
+  },
+  // ################################################################### //
+  // ################# Methods to display Main Panel ################### //
+  // ################################################################### //
+
+  /**
+   * Hidden checkbox for minimizing/maximizing panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowElevationPathElement: function _createShowElevationPathElement() {
+    var input = document.createElement("input");
+    input.id = this._addUID("GPshowElevationPath");
+    input.type = "checkbox";
+    return input;
+  },
+
+  /**
+   * Show control
+   * see event !
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createShowElevationPathPictoElement: function _createShowElevationPathPictoElement() {
+    // contexte d'execution
+    var context = this;
+    var label = document.createElement("label");
+    label.id = this._addUID("GPshowElevationPathPicto");
+    label.className = "GPshowAdvancedToolPicto";
+    label.htmlFor = this._addUID("GPshowElevationPath");
+    label.title = "Calculer un profil"; // gestionnaire d'evenement :
+    // on ouvre le menu de saisie de saisie
+    // L'ouverture/Fermeture permet de faire le menage
+    // (reinitialisation)
+
+    if (label.addEventListener) {
+      label.addEventListener("click", function (e) {
+        context.onShowElevationPathClick(e);
+      });
+    } else if (label.attachEvent) {
+      label.attachEvent("onclick", function (e) {
+        context.onShowElevationPathClick(e);
+      });
+    }
+
+    var spanOpen = document.createElement("span");
+    spanOpen.id = this._addUID("GPshowElevationPathOpen");
+    spanOpen.className = "GPshowAdvancedToolOpen";
+    label.appendChild(spanOpen);
+    return label;
+  },
+  // ################################################################### //
+  // ######################### Methods to Panel ######################## //
+  // ################################################################### //
+
+  /**
+   * Create Container Panel
+   *
+   * FIXME
+   * don't call this._createElevationPathPanelHeaderElement
+   * don't call this._createElevationPathPanelProfilElement
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createElevationPathPanelElement: function _createElevationPathPanelElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPelevationPathPanel");
+    div.className = "GPpanel"; // div.appendChild(this._createElevationPathPanelHeaderElement());
+    // div.appendChild(this._createElevationPathPanelProfilElement());
+
+    return div;
+  },
+
+  /**
+   * Create Header Panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createElevationPathPanelHeaderElement: function _createElevationPathPanelHeaderElement() {
+    var self = this;
+    var container = document.createElement("div");
+    container.className = "GPpanelHeader";
+    var divInfo = document.createElement("div");
+    divInfo.id = this._addUID("GPelevationPathPanelInfo");
+    divInfo.className = "GPpanelInfo";
+    divInfo.title = "Informations"; // add event on click
+
+    if (divInfo.addEventListener) {
+      divInfo.addEventListener("click", function () {
+        self.onOpenElevationPathInfoClick();
+      });
+    } else if (divInfo.attachEvent) {
+      // internet explorer
+      divInfo.attachEvent("onclick", function () {
+        self.onOpenElevationPathInfoClick();
+      });
+    }
+
+    container.appendChild(divInfo);
+    var divTitle = document.createElement("div");
+    divTitle.className = "GPpanelTitle";
+    divTitle.innerHTML = "Profil Altimétrique";
+    container.appendChild(divTitle);
+    var divReduce = document.createElement("div");
+    divReduce.id = this._addUID("GPelevationPathPanelReduce");
+    divReduce.className = "GPpanelReduce";
+    divReduce.title = "Masquer le panneau";
+
+    if (divReduce.addEventListener) {
+      divReduce.addEventListener("click", function () {
+        if (typeof self.onReduceElevationPathPanelClick === "function") {
+          document.getElementById(self._addUID("GPshowElevationPath")).checked = false;
+          self.onReduceElevationPathPanelClick();
+        }
+      }, false);
+    } else if (divReduce.attachEvent) {
+      divReduce.attachEvent("onclick", function () {
+        if (typeof self.onReduceElevationPathPanelClick === "function") {
+          document.getElementById(self._addUID("GPshowElevationPath")).checked = false;
+          self.onReduceElevationPathPanelClick();
+        }
+      });
+    }
+
+    container.appendChild(divReduce);
+    var divClose = document.createElement("div");
+    divClose.id = this._addUID("GPelevationPathPanelClose");
+    divClose.className = "GPpanelClose";
+    divClose.title = "Fermer le panneau"; // Link panel close / visibility checkbox
+
+    if (divClose.addEventListener) {
+      divClose.addEventListener("click", function () {
+        document.getElementById(self._addUID("GPshowElevationPathPicto")).click();
+      }, false);
+    } else if (divClose.attachEvent) {
+      divClose.attachEvent("onclick", function () {
+        document.getElementById(self._addUID("GPshowElevationPathPicto")).click();
+      });
+    }
+
+    container.appendChild(divClose);
+    return container;
+  },
+
+  /**
+   * Create Form
+   * see evenement !
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createElevationPathPanelProfilElement: function _createElevationPathPanelProfilElement() {
+    var div = document.createElement("div");
+    div.id = "GPelevationPathProfil";
+    return div;
+  },
+
+  /**
+   * Create Waiting Panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createElevationPathWaitingElement: function _createElevationPathWaitingElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPelevationPathCalcWaitingContainer");
+    div.className = "GPelevationPathCalcWaitingContainerHidden";
+    var p = document.createElement("p");
+    p.className = "GPelevationPathCalcWaiting";
+    p.innerHTML = "Calcul en cours...";
+    div.appendChild(p);
+    return div;
+  },
+
+  /**
+   * Create information Panel
+   *
+   * @returns {DOMElement} DOM element
+   */
+  _createElevationPathInformationsElement: function _createElevationPathInformationsElement() {
+    var div = document.createElement("div");
+    div.id = this._addUID("GPelevationPathInformationsContainer");
+    div.className = "GPelevationPathInformationsContainerHidden";
+    var p = document.createElement("p");
+    p.className = "GPelevationPathInformations";
+    p.innerHTML = "Aucune information...";
+    div.appendChild(p);
+    return div;
+  },
+
+  /**
+   * Add a information into Panel
+   *
+   * @param {String} value - value of item
+   * @returns {DOMElement} DOM element
+   */
+  _addElevationPathInformationsItem: function _addElevationPathInformationsItem(value) {
+    var div = document.getElementById(this._addUID("GPelevationPathInformationsContainer"));
+
+    if (div) {
+      var p = document.createElement("p");
+      p.className = "GPelevationPathInformations";
+      p.innerHTML = value;
+      div.appendChild(p);
+    }
+
+    return div;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (ElevationPathDOM);
+
+/***/ }),
+/* 168 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* globals AmCharts, d3 */
+var ProfileElevationPathDOM = {
+  /**
+   * Display Profile function used by default : no additonal framework needed.
+   * @param {Object} data - elevations values for profile
+   * @param {HTMLElement} container - html container where to display profile
+   * @param {Object} context - this control object
+   * @param {Object} className - calling class (ie ElevationPath)
+   * @returns {DOMElement} profil container
+   */
+  displayProfileByDefault: function displayProfileByDefault(data, container, context, className) {
+    var self = context; // on nettoie toujours...
+
+    if (container) {
+      while (container.firstChild) {
+        container.removeChild(container.firstChild);
+      }
+    }
+
+    if (!data) {
+      return;
+    }
+
+    var _displayProfileOptions = self.options.displayProfileOptions;
+    var _points = data.points;
+    var sortedElev = JSON.parse(JSON.stringify(_points));
+    sortedElev.sort(function (e1, e2) {
+      return e1.z - e2.z;
+    });
+    var minZ = sortedElev[0].z;
+    var maxZ = sortedElev[sortedElev.length - 1].z;
+    var diff = maxZ - minZ;
+    var dist = data.distance;
+    var unit = data.unit; // var distMin = 0;
+
+    var barwidth = 100 / _points.length;
+    var div = document.createElement("div");
+    div.id = "profileElevationByDefault";
+    container.appendChild(div);
+    var divBox = document.createElement("div");
+    divBox.className = "profile-box";
+    var divZ = document.createElement("div");
+    divZ.className = "profile-z-vertical";
+    var ulZ = document.createElement("ul");
+    var liZmin = document.createElement("li");
+    liZmin.setAttribute("class", "profile-min-z");
+    liZmin.innerHTML = minZ + " m";
+    var liZmax = document.createElement("li");
+    liZmax.setAttribute("class", "profile-max-z");
+    liZmax.innerHTML = maxZ + " m"; // var divUnit = document.createElement("div");
+    // divUnit.className = "profile-unit";
+    // divUnit.innerHTML = "m";
+
+    ulZ.appendChild(liZmax);
+    ulZ.appendChild(liZmin);
+    divZ.appendChild(ulZ); // divZ.appendChild(divUnit);
+
+    divBox.appendChild(divZ);
+    var divData = document.createElement("div");
+    divData.className = "profile-content";
+    divData.addEventListener("mouseover", function (e) {
+      var _lon = parseFloat(e.target.dataset["lon"]);
+
+      var _lat = parseFloat(e.target.dataset["lat"]);
+
+      if (_lon && _lat) {
+        className.__createProfileMarker(self, {
+          lat: _lat,
+          lon: _lon
+        });
+      }
+    });
+    divData.addEventListener("mousemove", function (e) {
+      var _lon = parseFloat(e.target.dataset["lon"]);
+
+      var _lat = parseFloat(e.target.dataset["lat"]);
+
+      if (_lon && _lat) {
+        className.__updateProfileMarker(self, {
+          lat: _lat,
+          lon: _lon
+        });
+      }
+    });
+    divData.addEventListener("mouseout", function () {
+      className.__removeProfileMarker(self);
+    });
+    var ulData = document.createElement("ul");
+    ulData.id = "profile-data";
+    ulData.className = "profile-z-axis profile-x-axis";
+    divData.appendChild(ulData);
+
+    for (var i = 0; i < _points.length; i++) {
+      var d = _points[i];
+      var li = document.createElement("li");
+      li.setAttribute("data-z", d.z);
+      li.setAttribute("data-lon", d.lon);
+      li.setAttribute("data-lat", d.lat);
+      li.setAttribute("data-dist", d.dist);
+      var pct = Math.floor((d.z - minZ) * 100 / diff);
+      li.setAttribute("class", "percent v" + pct);
+      li.title = "Altitude : " + d.z + "m";
+
+      if (_displayProfileOptions.currentSlope) {
+        li.title += " - Pente : " + d.slope + "%";
+      }
+
+      li.title += " (Lat : " + d.lat + " / Lon : " + d.lon + ")";
+      li.setAttribute("style", "width: " + barwidth + "%");
+      ulData.appendChild(li);
+    }
+
+    divBox.appendChild(divData);
+    div.appendChild(divBox);
+    var divX = document.createElement("div");
+    divX.className = "profile-x-horizontal";
+    var ulX = document.createElement("ul");
+    var liXmin = document.createElement("li");
+    liXmin.setAttribute("class", "profile-min-x");
+    liXmin.innerHTML = "";
+    var liXmax = document.createElement("li");
+    liXmax.setAttribute("class", "profile-max-x");
+    liXmax.innerHTML = dist + " " + unit;
+    ulX.appendChild(liXmin);
+    ulX.appendChild(liXmax);
+    divX.appendChild(ulX);
+    div.appendChild(divX);
+    return container;
+  },
+
+  /**
+   * Display Profile without graphical rendering (raw service response)
+   * @param {Object} data - elevations values for profile
+   * @param {HTMLElement} container - html container where to display profile
+   * @param {Object} context - this control object
+   * @param {Object} className - calling class (ie ElevationPath)
+   * @returns {DOMElement} profil container
+   */
+  displayProfileRaw: function displayProfileRaw(data, container, context, className) {
+    // on nettoie toujours...
+    if (container) {
+      while (container.firstChild) {
+        container.removeChild(container.firstChild);
+      }
+    }
+
+    var _points = data.points;
+    var div = document.createElement("textarea");
+    div.id = "profilElevationResults";
+    div.rows = 10;
+    div.cols = 50;
+    div.style.width = "100%";
+    div.innerHTML = JSON.stringify(_points, undefined, 4);
+    div.addEventListener("mouseover", function (e) {
+      className.__customRawProfileMouseOverEvent(context, e);
+    }); // TODO
+    // for (var i = 0; i < _points.length; i++) {
+    //     var point = _points[i];
+    //     var divC  = document.createElement("code");
+    //     divC.id = "point_" + i;
+    //     divC.innerHTML = JSON.stringify(point, undefined, 4);
+    //     div.appendChild(divC);
+    //     divC.addEventListener("mouseover", function (e) {
+    //          className.__customRawProfileMouseOverEvent(context, e);
+    //     });
+    // }
+
+    container.appendChild(div);
+    return container;
+  },
+
+  /**
+   * Display Profile using D3 javascript framework. This method needs D3 libraries to be loaded.
+   * @param {Object} data - elevations values for profile
+   * @param {HTMLElement} container - html container where to display profile
+   * @param {Object} context - this control object
+   * @param {Object} className - calling class (ie ElevationPath)
+   * @returns {DOMElement} profil container
+   */
+  displayProfileLibD3: function displayProfileLibD3(data, container, context, className) {
+    var self = context; // on nettoie toujours...
+
+    if (container) {
+      while (container.firstChild) {
+        container.removeChild(container.firstChild);
+      }
+    }
+
+    var _points = data.points;
+    var _displayProfileOptions = self.options.displayProfileOptions;
+    var margin = {
+      top: 20,
+      right: 20,
+      bottom: 30,
+      left: 40
+    };
+    var width = container.clientWidth - margin.left - margin.right;
+    var height = container.clientHeight - margin.top - margin.bottom;
+    var x = d3.scale.linear().range([0, width]);
+    var y = d3.scale.linear().range([height, 0]);
+    var xAxis = d3.svg.axis().scale(x).orient("bottom").ticks(5);
+    var yAxis = d3.svg.axis().scale(y).orient("left").ticks(5);
+    var line = d3.svg.line().interpolate("basis").x(function (d) {
+      return x(d.dist);
+    }).y(function (d) {
+      return y(d.z);
+    });
+    var area = d3.svg.area().interpolate("basis").x(function (d) {
+      return x(d.dist);
+    }).y0(height).y1(function (d) {
+      return y(d.z);
+    });
+    var svg = d3.select(container).append("svg").attr("width", width + margin.left + margin.right).attr("height", height + margin.top + margin.bottom).append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");
+    var xDomain = d3.extent(_points, function (d) {
+      return d.dist;
+    });
+    x.domain(xDomain);
+    var yDomain = [0, d3.max(_points, function (d) {
+      return d.z;
+    })];
+    y.domain(yDomain);
+    svg.append("path").datum(_points).attr("class", "area-d3").attr("d", area);
+    svg.append("g").attr("class", "x axis-d3").attr("transform", "translate(0," + height + ")").call(xAxis).append("text").attr("y", -15).attr("dy", ".71em").attr("x", width).text("Distance (" + data.unit + ")");
+    svg.append("g").attr("class", "y axis-d3").call(yAxis).append("text").attr("transform", "rotate(-90)").attr("y", 6).attr("dy", ".71em").text("Altitude (m)");
+    svg.append("g").attr("class", "grid-d3 vertical").attr("transform", "translate(0," + height + ")").call(xAxis.orient("bottom").tickSize(-height, 0, 0).tickFormat(""));
+    svg.append("g").attr("class", "grid-d3 horizontal").call(yAxis.orient("left").tickSize(-width, 0, 0).tickFormat(""));
+    svg.append("path").datum(_points).attr("class", "line-d3").attr("d", line);
+    svg.selectAll("circle").data(_points).enter().append("circle").attr("cx", function (d) {
+      return x(d.dist);
+    }).attr("cy", function (d) {
+      return y(d.z);
+    }).attr("r", 0).attr("class", "circle-d3");
+    var focus = svg.append("g").style("display", "none");
+    focus.append("line").attr("id", "focusLineX").attr("class", "focusLine-d3");
+    focus.append("line").attr("id", "focusLineY").attr("class", "focusLine-d3");
+    focus.append("circle").attr("id", "focusCircle").attr("r", 4).attr("class", "circle-d3 focusCircle-d3");
+    var div = d3.select(container).append("div").attr("class", "tooltip-d3").style("opacity", 0);
+    var bisectDist = d3.bisector(function (d) {
+      return d.dist;
+    }).left;
+    svg.append("rect").attr("class", "overlay-d3").attr("width", width).attr("height", height).on("mouseover", function () {
+      focus.style("display", null);
+
+      className.__createProfileMarker(self, _points[0]);
+    }).on("mouseout", function () {
+      focus.style("display", "none");
+
+      className.__removeProfileMarker(self); // tooltips
+
+
+      div.transition().duration(500).style("opacity", 0);
+    }).on("mousemove", function () {
+      var m = d3.mouse(this);
+      var distance = x.invert(m[0]);
+      var i = bisectDist(_points, distance);
+      var d0 = _points[i - 1];
+      var d1 = _points[i];
+      var d = distance - d0[0] > d1[0] - distance ? d1 : d0;
+      var xc = x(d.dist);
+      var yc = y(d.z);
+      focus.select("#focusCircle").attr("cx", xc).attr("cy", yc);
+      focus.select("#focusLineX").attr("x1", xc).attr("y1", y(yDomain[0])).attr("x2", xc).attr("y2", y(yDomain[1]));
+      focus.select("#focusLineY").attr("x1", x(xDomain[0])).attr("y1", yc).attr("x2", x(xDomain[1])).attr("y2", yc);
+
+      className.__updateProfileMarker(self, d); // tooltips
+
+
+      div.transition().duration(200).style("opacity", 0.9);
+      var _message = "";
+      _message += " Altitude : " + d.z + " m";
+
+      if (_displayProfileOptions.currentSlope) {
+        _message += "<br/> Pente : " + d.slope + " %";
+      }
+
+      _message += "<br/> (Lat : " + d.lat + "/ Lon : " + d.lon + ")";
+      div.html(_message).style("left", d3.event.pageX + "px").style("top", d3.event.pageY - 28 + "px");
+    }); // return d3.selectAll("rect.overlay")[0][0];
+
+    return svg;
+  },
+
+  /**
+   * Display Profile using Amcharts framework. This method needs AmCharts libraries to be loaded.
+   * @param {Object} data - elevations values for profile
+   * @param {HTMLElement} container - html container where to display profile
+   * @param {Object} context - this control object
+   * @param {Object} className - calling class (ie ElevationPath)
+   * @returns {DOMElement} profil container
+   */
+  displayProfileLibAmCharts: function displayProfileLibAmCharts(data, container, context, className) {
+    var self = context;
+    var _points = data.points;
+    var ballonText = "<span class='altiPathValue'>[[title]] : [[value]]m</span><br/>";
+    var currentSlope = self.options.displayProfileOptions.currentSlope;
+
+    if (currentSlope) {
+      ballonText += "<span class='altiPathValue'>Pente : [[slope]] %</span><br/>";
+    }
+
+    ballonText += "<span class='altiPathCoords'>(Lat: [[lat]] / Lon:[[lon]])</span>";
+    AmCharts.addInitHandler(function () {});
+    var settings = {
+      type: "serial",
+      pathToImages: "http://cdn.amcharts.com/lib/3/images/",
+      categoryField: "dist",
+      autoMarginOffset: 0,
+      marginRight: 10,
+      marginTop: 10,
+      startDuration: 0,
+      color: "#5E5E5E",
+      fontSize: 8,
+      theme: "light",
+      thousandsSeparator: "",
+      numberFormatter: {
+        precision: -1,
+        decimalSeparator: ",",
+        thousandsSeparato: " "
+      },
+      categoryAxis: {
+        color: "#5E5E5E",
+        gridPosition: "start",
+        minHorizontalGap: 40,
+        tickPosition: "start",
+        title: "Distance (" + data.unit + ")",
+        titleColor: "#5E5E5E",
+        labelOffset: 0,
+        startOnAxis: true
+      },
+      chartCursor: {
+        animationDuration: 0,
+        bulletsEnabled: true,
+        bulletSize: 10,
+        categoryBalloonEnabled: false,
+        cursorColor: "#F90",
+        graphBulletAlpha: 1,
+        graphBulletSize: 1,
+        zoomable: false
+      },
+      trendLines: [],
+      graphs: [{
+        balloonColor: "#CCCCCC",
+        balloonText: ballonText,
+        bullet: "round",
+        bulletAlpha: 0,
+        bulletBorderColor: "#FFF",
+        bulletBorderThickness: 2,
+        bulletColor: "#F90",
+        bulletSize: 6,
+        hidden: false,
+        id: "AmGraph-1",
+        fillAlphas: 0.4,
+        fillColors: "#C77A04",
+        lineAlpha: 1,
+        lineColor: "#C77A04",
+        lineThickness: 1,
+        title: "Altitude",
+        valueField: "z"
+      }],
+      guides: [],
+      valueAxes: [{
+        id: "ValueAxis-1",
+        minVerticalGap: 20,
+        title: "Altitude (m)"
+      }],
+      balloon: {
+        borderColor: "#CCCCCC",
+        borderThickness: 1,
+        fillColor: "#FFFFFF",
+        showBullet: true
+      },
+      titles: [],
+      allLabels: [],
+      dataProvider: _points
+    };
+
+    var _containerProfile = AmCharts.makeChart(container, settings);
+
+    _containerProfile.addListener("changed", function (e) {
+      var obj = e.chart.dataProvider[e.index];
+
+      className.__updateProfileMarker(self, obj);
+    });
+
+    return _containerProfile;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (ProfileElevationPathDOM);
+
+/***/ }),
+/* 169 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_0__);
+
+/**
+ * @classdesc
+ *
+ * Control Logo
+ *
+ * @private
+ * @constructor
+ * @extends {L.Control}
+ * @alias Logo
+ * @param {Object} options - options for function call.
+ * @param {String} options.position - 'topright' by default
+ * @param {String} options.url - URL
+ * @param {String} options.text - text
+ * @param {String} options.picto - picto
+ * @example
+ * var map  = L.map('map').setView([48, 2], 4);
+ * var logo = L.geoportalControl.Logo({
+ *   position : "topright",
+ *   picto : "http://www.ign.fr/logo-ign.jpg",
+ *   url : "http://www.ign.fr",
+ *   text : "© IGN",
+ *   size : "70px"
+ * });
+ * logo.addTo(map);
+ */
+
+var Logo = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Control.extend(
+/** @lends Logo.prototype */
+{
+  /**
+   * Options du service
+   *
+   * @private
+   */
+  options: {
+    position: "topright",
+    picto: null,
+    url: null,
+    text: null,
+    size: "30px"
+  },
+
+  /**
+   * constructor
+   *
+   * @param {Object} options - options
+   * @private
+   */
+  initialize: function initialize(options) {
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.setOptions(this, options);
+  },
+
+  /**
+   * event
+   *
+   * @returns {DOMElement} DOM element
+   * @private
+   */
+  onAdd: function onAdd()
+  /* map */
+  {
+    var container = null;
+    container = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.create("div", "gp-control-logo", container);
+    var bLink = !!(this.options.url || this.options.text);
+    var link = null;
+
+    if (bLink) {
+      link = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.create("a", "", container);
+      link.target = "_blank";
+
+      if (this.options.url) {
+        link.href = this.options.url;
+        if (this.options.text) link.title = this.options.text;
+      }
+    } // FIXME mise en forme à prévoir !
+
+
+    if (bLink && this.options.text) {
+      link.text = this.options.text;
+    }
+
+    var bImage = !!this.options.picto;
+    var image = null;
+
+    if (bImage) {
+      if (bLink) {
+        image = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.create("img", "", link);
+      } else {
+        image = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.DomUtil.create("img", "", container);
+      }
+
+      image.src = this.options.picto;
+
+      if (typeof this.options.size === "string") {
+        image.style.height = image.style.width = this.options.size;
+      } else {
+        image.style.height = this.options.size.height;
+        image.style.width = this.options.size.width;
+      }
+    }
+
+    return container;
+  }
+});
+/* harmony default export */ __webpack_exports__["default"] = (Logo);
+
+/***/ }),
+/* 170 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34);
+/* harmony import */ var _LayerConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(171);
+/* harmony import */ var _WMS__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(173);
+/* harmony import */ var _WMTS__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(175);
+
+
+
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_1__["default"].getLogger("layers");
+/**
+ * Geoportal Layers Factory to be used together with Leaflet Maps.
+ *
+ * @module Layers
+ * @alias L.geoportalLayer
+ * @example
+ * var map = L.Map(...) ;
+ * var layer = L.geoportalLayer.WMTS({
+ *      layer : "ORTHOIMAGERY.ORTHOPHOTOS",
+ * }).addTo(map) ;
+ */
+
+var Layers = {
+  options: {},
+  params: {},
+  protocol: null,
+  serviceUrl: "http://localhost?no-rights-found-for=[{layer}]",
+
+  /**
+   * initialize options
+   */
+  _initOptions: function _initOptions() {
+    if (!this.options || Object.keys(this.options) === 0) {
+      throw new Error("PARAM_MISSING : options !");
+    }
+
+    if (!this.options.layer) {
+      throw new Error("PARAM_MISSING : layer !");
+    } // FIXME est ce utile de le preciser ?
+
+
+    if (!this.options.apiKey) {
+      logger.log("PARAM_MISSING : apiKey !");
+    } // par defaut
+
+
+    if (typeof this.options.ssl === "undefined") {
+      this.options.ssl = true;
+    }
+  },
+
+  /**
+   * get runtime context
+   */
+  _initContext: function _initContext() {
+    // si ssl = false on fait du http
+    // par défaut, ssl = true, on fait du https
+    this.protocol = this.options.ssl === false ? "http://" : "https://";
+  },
+
+  /**
+   * initialize parameters
+   *
+   * @param {String} service - service name, WMS or WMTS
+   */
+  _initParams: function _initParams(service) {
+    // par defaut...
+    if (!service) {
+      service = "WMTS";
+    } // Gestion de l'autoconf
+
+
+    this.params = _LayerConfig__WEBPACK_IMPORTED_MODULE_2__["default"].get({
+      key: this.options.apiKey,
+      layer: this.options.layer,
+      service: service
+    });
+
+    if (!this.params || Object.keys(this.params) === 0) {
+      this.params = {};
+
+      if (!this.options.apiKey) {
+        // FIXME on retire l'exception...
+        logger.log("WARNING PARAM_MISSING : parameter 'apiKey' is mandatory if the contract key configuration has not been loaded !");
+      }
+    }
+  },
+
+  /**
+   * Factory function for Geoportal or INSPIRE WMS Layers creation.
+   *
+   * @method WMS
+   * @static
+   * @alias L.geoportalLayer.WMS
+   * @extends {L.TileLayer.WMS}
+   *
+   * @param {Object} options - options for function call.
+   * @param {String} options.layer - layer name (e.g. "ORTHOIMAGERY.ORTHOPHOTOS")
+   * @param {Boolean} [options.ssl] - if set true, enforce protocol https (only for nodejs)
+   * @param {String} [options.apiKey] - access key to Geoportal platform, obtained [here]{@link http://professionnels.ign.fr/ign/contrats}.
+   * @param {Object} [settings] - other options for L.TileLayer.WMS function (see {@link http://leafletjs.com/reference.html#tilelayer-wms-options})
+   *
+   * @returns {L.geoportalLayer.WMS} WMS layer
+   *
+   * @example
+   *  var map = L.Map('divmap').setView();
+   *  var lyr = L.geoportalLayer.WMS(
+   *    {
+   *      layer : "OI.OrthoimageCoverage"
+   *    },
+   *    {
+   *      opacity : 1,
+   *      transparent : true,
+   *      minZoom : 1,
+   *      maxZoom : 21
+   *      ...
+   *    });
+   *
+   *  lyr.addTo(map); // ou map.addLayer(lyr);
+   */
+  WMS: function WMS(options, settings) {
+    // gestion du logger
+    var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_1__["default"].getLogger("layers-wms");
+    /** options du plugins */
+
+    this.options = options || {}; // gestion des options
+
+    this._initOptions();
+    /** options natives de Leaflet */
+
+
+    this.settings = settings || {}; // env d'execution : browser ou non ?
+
+    this._initContext(); // gestion de l'autoconf
+
+
+    this._initParams("WMS");
+
+    logger.log(this.params); // url du service
+
+    var serviceUrl = null;
+
+    if (this.params.key || this.options.apiKey) {
+      // url de l'autoconf ou le service par defaut
+      serviceUrl = this.params.url || leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.template("https://wxs.ign.fr/{key}/geoportail/r/wms", {
+        key: this.params.key || this.options.apiKey
+      });
+    } else {
+      // pas d'autoconf, ni de clef API !
+      // on évite l'exception en envoyant les requêtes vers localhost...
+      serviceUrl = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.template(this.serviceUrl, {
+        layer: this.options.layer
+      });
+    } // params du service WMS (par defaut)
+
+
+    var paramsWms = {
+      layers: this.options.layer,
+      styles: this.params.styles || "normal",
+      format: this.params.format || "image/jpeg",
+      version: this.params.version || "1.3.0"
+    }; // options natives de leaflet (par defaut)
+
+    var paramsNative = {
+      // zoom level
+      minZoom: this.params.minZoom || 1,
+      maxZoom: this.params.maxZoom || 21
+    }; // merge des autres options natives de leaflet
+
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.extend(paramsNative, this.settings);
+    return new _WMS__WEBPACK_IMPORTED_MODULE_3__["default"](serviceUrl.replace(/(http|https):\/\//, this.protocol), {
+      paramsNative: paramsNative,
+      paramsWms: paramsWms,
+      originators: this.params.originators || [],
+      legends: this.params.legends || [],
+      metadata: this.params.metadata || [],
+      title: this.params.title || null,
+      description: this.params.description || null,
+      quicklookUrl: this.params.quicklookUrl || null
+    });
+  },
+
+  /**
+   * Factory function for Geoportal WMTS Layers creation.
+   *
+   * @method WMTS
+   * @static
+   * @alias L.geoportalLayer.WMTS
+   * @extends {L.TileLayer}
+   *
+   * @param {Object} options - options for function call.
+   * @param {String} options.layer - layer name (e.g. "ORTHOIMAGERY.ORTHOPHOTOS")
+   * @param {Boolean} [options.ssl] - if set true, enforce protocol https (only for nodejs)
+   * @param {String} [options.apiKey] - access key to Geoportal platform, obtained [here]{@link http://professionnels.ign.fr/ign/contrats}.
+   * @param {Object} [settings] - other options for L.TileLayer function (see {@link http://leafletjs.com/reference.html#tilelayer-options})
+   *
+   * @returns {L.geoportalLayer.WMTS} WMTS layer
+   *
+   * @example
+   *  var map = L.Map('divmap').setView();
+   *  var lyr = L.geoportalLayer.WMTS(
+   *    {
+   *      layer : "ORTHOIMAGERY.ORTHOPHOTOS"
+   *    },
+   *    {
+   *      opacity : 1,
+   *      transparent : true,
+   *      minZoom : 1,
+   *      maxZoom : 21
+   *      ...
+   *    });
+   *
+   *  lyr.addTo(map); // ou map.addLayer(lyr);
+   */
+  WMTS: function WMTS(options, settings) {
+    // gestion du logger
+    var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_1__["default"].getLogger("layers-wmts");
+    /** options du plugins */
+
+    this.options = options || {}; // gestion des options
+
+    this._initOptions();
+    /** options natives de Leaflet */
+
+
+    this.settings = settings || {}; // env d'execution : browser ou non ?
+
+    this._initContext(); // gestion de l'autoconf
+
+
+    this._initParams("WMTS");
+
+    logger.log(this.params); // url du service (par defaut)
+
+    var serviceUrl = null;
+
+    if (this.params.key || this.options.apiKey) {
+      serviceUrl = this.params.url || leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.template("https://wxs.ign.fr/{key}/geoportail/wmts", {
+        key: this.params.key || this.options.apiKey
+      });
+    } else {
+      // FIXME pas d'autoconf, ni clef API !
+      // on évite l'exception en envoyant les requêtes vers localhost
+      serviceUrl = leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.template(this.serviceUrl, {
+        layer: this.options.layer
+      });
+    } // params du service WMS (par defaut)
+
+
+    var paramsWmts = {
+      layer: this.options.layer,
+      style: this.params.styles || "normal",
+      format: this.params.format || "image/jpeg",
+      version: this.params.version || "1.0.0",
+      tilematrixset: this.params.TMSLink || "PM"
+    }; // options natives de leaflet (par defaut)
+    //    minZoom : 0
+    //    maxZoom : 18
+    //    tileSize : 256
+    //    subdomains : 'abc'
+    //    errorTileUrl : ''
+    //    attribution : ''
+    //    zoomOffset : 0
+    //    opacity : 1
+
+    var paramsNative = {
+      // zoom level
+      minZoom: this.params.minZoom || 1,
+      maxZoom: this.params.maxZoom || 21
+    }; // merge des autres options natives de leaflet
+
+    leaflet__WEBPACK_IMPORTED_MODULE_0___default.a.Util.extend(paramsNative, this.settings);
+    return new _WMTS__WEBPACK_IMPORTED_MODULE_4__["default"](serviceUrl.replace(/(http|https):\/\//, this.protocol), {
+      paramsNative: paramsNative,
+      paramsWmts: paramsWmts,
+      originators: this.params.originators || [],
+      legends: this.params.legends || [],
+      metadata: this.params.metadata || [],
+      title: this.params.title || "",
+      description: this.params.description || "",
+      quicklookUrl: this.params.quicklookUrl || ""
+    });
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (Layers);
+
+/***/ }),
+/* 171 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(34);
+/* harmony import */ var _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(141);
+/* harmony import */ var _Common_Utils_LayerUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(172);
+
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("layer-config");
+/**
+ * @classdesc
+ *
+ * Configuration des couches Geoportail via l'appel du service d'autoconfiguration
+ * @private
+ */
+
+var LayerConfig = {
+  /**
+   * options : key, layer, service
+   *
+   * @param {Object} options - options
+   *
+   * @returns {Object} layer parameters
+   */
+  get: function get(options) {
+    var params = {}; // Gestion de l'autoconf
+
+    if (!_Common_Utils_Config__WEBPACK_IMPORTED_MODULE_1__["default"].isConfigLoaded()) {
+      logger.warn("WARNING AUTOCONF_MISSING : contract key configuration has to be loaded to load Geoportal layers !");
+      return;
+    } // gestion des parametres
+
+
+    params = _Common_Utils_Config__WEBPACK_IMPORTED_MODULE_1__["default"].getLayerParams(options.layer, options.service, options.key);
+
+    if (!params || Object.keys(params).length === 0) {
+      logger.warn("WARNING AUTOCONF_FAILED : params not found ?!");
+      return;
+    } // gestion des zoom
+
+
+    params.minZoom = _Common_Utils_LayerUtils__WEBPACK_IMPORTED_MODULE_2__["default"].getZoomLevelFromScaleDenominator(params.maxScale) || 1;
+    params.maxZoom = _Common_Utils_LayerUtils__WEBPACK_IMPORTED_MODULE_2__["default"].getZoomLevelFromScaleDenominator(params.minScale) || 21;
+    return params;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (LayerConfig);
+
+/***/ }),
+/* 172 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/**
+* @module LayerUtils
+* @alias Gp.LayerUtils
+* @description
+* ...
+*
+* @example
+* getZoomLevelFromScaleDenominator();
+* getAttributions();
+* intersects();
+*/
+var LayerUtils = {
+  /**
+   * Obtenir le ZoomLevel à partir du ScaleDenominator
+   * @param {Number} scaleDenominator - the scale denominator
+   * @param {String} crs - the crs
+   *
+   * @returns {Integer} zoom level
+   */
+  getZoomLevelFromScaleDenominator: function getZoomLevelFromScaleDenominator(scaleDenominator, crs) {
+    // ------------------------------------------------- //
+    // Code issu de l'API Geoportal/Catalogue/Config.js  //
+    // ------------------------------------------------- //
+    //     var configuration = Gp.Config;
+    //     var general = configuration.generalOptions;
+    //     var layers  = configuration.layersContext;
+    //
+    //     for (var tms in general.tileMatrixSets) {
+    //         var tileMatrixSet = general.tileMatrixSets[tms];
+    //         // IGN's WMTS bug : epsg:nnnn instead of EPSG:nnnn
+    //         var crs = tileMatrixSet.supportedCRS = tileMatrixSet.supportedCRS.replace(/epsg/,"EPSG");
+    //
+    //         if (!Geoportal.Catalogue.CRSRESOLUTIONS.hasOwnProperty(crs)) {
+    //             var p= new OpenLayers.Projection(crs);
+    //             Geoportal.Catalogue.CRSRESOLUTIONS[crs]= [];
+    //             var matrixIds= tileMatrixSet.matrixIds;
+    //             for (var i= 0, li= matrixIds.length; i<li; ++i) {
+    //                 var mid= matrixIds[i];
+    //                 Geoportal.Catalogue.CRSRESOLUTIONS[crs].push(
+    //                     0.00028*mid.scaleDenominator
+    //                     /(OpenLayers.METERS_PER_INCH*OpenLayers.INCHES_PER_UNIT[p.getUnits()]));
+    //                     mid.supportedCRS= mid.supportedCRS.replace(/epsg/,"EPSG");
+    //                 }
+    //                 Geoportal.Catalogue.CRSRESOLUTIONS[crs].sort(function (a,b){ return b-a; });
+    //             }
+    //         }
+    //         var llR= Geoportal.Catalogue.CRSRESOLUTIONS['CRS:84'];
+    //         if (!llR) {
+    //             llR= Geoportal.Catalogue.CRSRESOLUTIONS['CRS:84']= general.resolutions.slice();
+    //         }
+    //         var wmR= Geoportal.Catalogue.CRSRESOLUTIONS['EPSG:3857'];
+    //         if (!wmR) {//FIXME : should never happened !!
+    //             // reproject resolutions from CRS84 to WebMercator (transform resolutions from degree/px to meter/px)
+    //             wmR= Geoportal.Catalogue.CRSRESOLUTIONS['EPSG:3857']= new Array(llR.length);
+    //             for (var i= 0, len= llR.length; i<len; i++) {
+    //                 var pt= new OpenLayers.LonLat(llR[i], 0);
+    //                 pt.transform(OpenLayers.Projection.CRS84, OpenLayers.Projection.WebMercator);
+    //                 wmR[i]= pt.lon;
+    //             }
+    //         }
+    //         Geoportal.Catalogue.RESOLUTIONS= wmR;
+    //
+    //         var getResolutionsFromCRS= function(crs) {
+    //             if (OpenLayers.Projection.WebMercator.isAliasOf(crs)) {
+    //                 return wmR;
+    //             }
+    //             if (OpenLayers.Projection.CRS84.isAliasOf(crs)) {
+    //                 return llR;
+    //             }
+    //             return Geoportal.Catalogue.CRSRESOLUTIONS[crs]?Geoportal.Catalogue.CRSRESOLUTIONS[crs]:null ;
+    //         };
+    //
+    //         var retrieveZoomFromResolution= function(resolutions, resolution) {
+    //             for (var i= 0, li= resolutions.length; i<li; i++) {
+    //                 if (resolutions[i]-resolution <= resolutions[li-1]) {
+    //                     return i;
+    //                 }
+    //             }
+    //             return -1;
+    //         };
+    //
+    //         var getZoomLevelFromScaleDenominator= function(scaleDenominator,crs) {
+    //             var resolution= scaleDenominator * 0.00028;
+    //             var R= getResolutionsFromCRS(crs);
+    //             if (R) {
+    //                 return retrieveZoomFromResolution(R,resolution);
+    //             }
+    //             resolution= resolution/(OpenLayers.METERS_PER_INCH * OpenLayers.INCHES_PER_UNIT["degrees"]);
+    //             return retrieveZoomFromResolution(llR,resolution);
+    //         };
+    //
+    //         var getZoomLevelFromResolution= function(resolution,crs){
+    //             var R= getResolutionsFromCRS(crs);
+    //             if (R) {
+    //                 return retrieveZoomFromResolution(R,resolution);
+    //             }
+    //             var pt0= new OpenLayers.LonLat(0, 0);
+    //             var pt1= new OpenLayers.LonLat(1, 0);
+    //             pt0.transform(new OpenLayers.Projection(crs),OpenLayers.Projection.CRS84);
+    //             pt1.transform(new OpenLayers.Projection(crs),OpenLayers.Projection.CRS84);
+    //             resolution= resolution*(Math.abs(pt1.lon-pt0.lon));
+    //             return retrieveZoomFromResolution(llR,resolution);
+    //         };
+    // par defaut, on utilise la projection WebMercator (EPSG:3857 = PM)
+    // soit la liste des resolutions natives
+    var resolutionsNatives = {};
+
+    switch (crs) {
+      case "EPSG:2154":
+        resolutionsNatives = {
+          0: 104579.224549894,
+          1: 52277.5323537905,
+          2: 26135.4870785954,
+          3: 13066.8913818,
+          4: 6533.2286041135,
+          5: 3266.5595244627,
+          6: 1633.2660045974,
+          7: 816.629554986,
+          8: 408.3139146768,
+          9: 204.1567415109,
+          10: 102.0783167832,
+          11: 51.0391448966,
+          12: 25.5195690743,
+          13: 12.7597836936,
+          14: 6.379891636,
+          15: 3.1899457653,
+          16: 1.5949728695,
+          17: 0.7974864315,
+          18: 0.3987432149,
+          19: 0.1993716073,
+          20: 0.0996858037,
+          21: 0.0498429018
+        };
+        break;
+
+      default:
+        resolutionsNatives = {
+          0: 156543.033928041,
+          1: 78271.51696402048,
+          2: 39135.758482010235,
+          3: 19567.87924100512,
+          4: 9783.93962050256,
+          5: 4891.96981025128,
+          6: 2445.98490512564,
+          7: 1222.99245256282,
+          8: 611.49622628141,
+          9: 305.7481131407048,
+          10: 152.8740565703525,
+          11: 76.43702828517624,
+          12: 38.21851414258813,
+          13: 19.10925707129406,
+          14: 9.554628535647032,
+          15: 4.777314267823516,
+          16: 2.388657133911758,
+          17: 1.194328566955879,
+          18: 0.5971642834779395,
+          19: 0.2985821417389697,
+          20: 0.1492910708694849,
+          21: 0.0746455354347424
+        };
+        break;
+    } // gestion des autres SRS
+    // TODO
+    // if (crs) {
+    // }
+
+
+    var resolution = scaleDenominator * 0.00028;
+
+    for (var index in resolutionsNatives) {
+      if (resolutionsNatives.hasOwnProperty(index)) {
+        if (resolutionsNatives[index] <= resolution) {
+          index = parseInt(index, 10);
+          return index;
+        }
+      }
+    }
+
+    return 0; // -1 ?
+  },
+
+  /**
+   * Get attributions list for a layer, based on current zoom and extent
+   *
+   * @param {Object} params - function params
+   * @param {Array.<Float>} params.extent - map current geographical extent (EPSG:4326) : [top, left, bottom, right] = [maxy, minx, miny, maxx]
+   * @param {Number} params.zoom - map current zoom
+   * @param {String} params.crs - map current projection code (ex "EPSG:2154")
+   * @param {Boolean} params.visibility - layer visibility
+   * @param {Gp.Services.Config.Originator} params.originators - resource originators (from Gp.Config.layers[].originators)
+   * @returns {Object} attributions - associative array, mapping originators url (keys) with their properties : html attributions elements
+   */
+  getAttributions: function getAttributions(params) {
+    var zoom = params.zoom;
+    var attributions = [];
+
+    if (params.originators != null && params.visibility) {
+      // drawLogo = boolean, true if attribution should be displayed (zoom, extent), false otherwise
+      var drawLogo;
+
+      for (var j = 0, jl = params.originators.length; j < jl; j++) {
+        drawLogo = true;
+        var originator = params.originators[j];
+        var constraints = params.originators[j].constraints || [];
+
+        for (var k = 0, kl = constraints.length; k < kl; k++) {
+          var constraint = constraints[k];
+          drawLogo = true;
+          var minZoomLevel = this.getZoomLevelFromScaleDenominator(constraint.maxScaleDenominator, params.crs);
+          var maxZoomLevel = this.getZoomLevelFromScaleDenominator(constraint.minScaleDenominator, params.crs) || 21; // min zoom constraints
+
+          if (minZoomLevel && minZoomLevel > zoom) {
+            drawLogo = false;
+          } // max zoom constraints
+
+
+          if (drawLogo && maxZoomLevel !== null && maxZoomLevel < zoom) {
+            drawLogo = false;
+          } // bbox constraints
+
+
+          var bbox = constraint.bbox;
+
+          if (drawLogo && bbox) {
+            drawLogo = false;
+            var viewExtent = params.extent;
+
+            if (viewExtent) {
+              var bounds = [bbox.top, bbox.left, bbox.bottom, bbox.right];
+
+              if (this.intersects(viewExtent, bounds)) {
+                // at least one constraint matches the map ones
+                drawLogo = true;
+                break;
+              }
+            }
+          }
+        }
+
+        if (drawLogo) {
+          // on a un originator qui correspond au zoom et à l'étendue.
+          var logo = originator.logo;
+          var url = originator.url;
+          var name = originator.name ? originator.name : "";
+          var text = originator.attribution;
+          var container = document.createElement("div");
+          container.className = "gp-control-attribution"; // on crée un lien dans tous les cas (même s'il ne pointe pas vers une référence), pour avoir accès à la class CSS (pour surcharge)
+
+          var link = null;
+          link = document.createElement("a");
+          link.className = "gp-control-attribution-link";
+          link.target = "_blank";
+          container.appendChild(link);
+
+          if (url) {
+            link.href = url;
+          }
+
+          var bImage = !!logo;
+          var image = null; // si on a un logo, on l'affiche à l'interieur du lien
+
+          if (bImage) {
+            image = document.createElement("img");
+
+            if (link) {
+              image.className = "gp-control-attribution-image";
+              link.appendChild(image);
+            } else {
+              image.className = "";
+              container.appendChild(image);
+            }
+
+            image.src = logo; // FIXME : mixContent !
+
+            image.title = text || name;
+            image.style.height = "30px";
+            image.style.width = "30px";
+          } else {
+            // sinon, on affiche le nom de l'originator, ou sa description ou l'url.
+            if (name) {
+              link.textContent = name;
+            } else if (text) {
+              link.textContent = text;
+            } else if (url) {
+              link.textContent = url;
+            } else {
+              link.textContent = "";
+            }
+          }
+
+          attributions.push(container.innerHTML + " ");
+        }
+      }
+    }
+
+    return attributions;
+  },
+
+  /**
+   * Determines if one extent (extent1) intersects another (extent2)
+   *
+   * @param {Array.<Float>} extent1 - First extent : [top, left, bottom, right] = [maxy, minx, miny, maxx]
+   * @param {Array.<Float>} extent2 - Second extent : [top, left, bottom, right] = [maxy, minx, miny, maxx]
+   * @return {Boolean} intersects - True if the two extents intersect, false otherwise.
+   */
+  intersects: function intersects(extent1, extent2) {
+    var intersectsX = extent1[1] <= extent2[3] && extent2[1] <= extent1[3];
+    var intersectsY = extent1[2] <= extent2[0] && extent2[2] <= extent1[0];
+    return intersectsX && intersectsY;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (LayerUtils);
+
+/***/ }),
+/* 173 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(40);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(34);
+/* harmony import */ var _LayerEvent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(174);
+/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(1);
+var _package_json__WEBPACK_IMPORTED_MODULE_4___namespace = /*#__PURE__*/__webpack_require__.t(1, 1);
+/**
+* desativation JSHINT
+* W106 - Identifier '_geoportal_id' is not in camel case
+*/
+
+/* jshint -W106 */
+
+
+
+ // package.json (extract version)
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__["default"].getLogger("wms");
+/**
+ * @namespace
+ * @alias L.geoportalLayers.WMS
+ * @classdesc
+ *
+ * Leaflet Layer Class for Geoportal or INSPIRE WMS Layers.
+ *
+ * Use {@link module:Layers.WMS L.geoportalLayer.WMS()} factory to create instances of that class.
+ *
+ * **Extends** Leaflet <a href="http://leafletjs.com/reference.html#tilelayer-wms" target="_blank">L.TileLayer.WMS</a> native class.
+ *
+ */
+
+var WMS = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.TileLayer.WMS.extend(
+/** @lends WMS.prototype */
+{
+  includes: _LayerEvent__WEBPACK_IMPORTED_MODULE_3__["default"],
+
+  /**
+   *
+   * @constructor
+   * @param {String} url - url service
+   * @param {Object} options - options for function call.
+   * @param {Array} [options.originators] - originators
+   * @param {Array} [options.legends] - legends
+   * @param {Array} [options.metadata] - metadata
+   * @param {String} [options.title] - title
+   * @param {String} [options.description] - description
+   * @param {String} [options.quicklookUrl] - quicklookUrl
+   * @param {Object} options.paramsWms - WMS options
+   * @param {String} options.paramsWms.layers - eg "ORTHOIMAGERY.ORTHOPHOTOS.BDORTHO",
+   * @param {String} options.paramsWms.styles - "normal",
+   * @param {String} options.paramsWms.format - "image/jpeg",
+   * @param {String} options.paramsWms.version - "1.3.0"
+   * @param {Object} [options.paramsNative] - other options for L.TileLayer.WMS function (see {@link http://leafletjs.com/reference.html#tilelayer-wms-options})
+   * @example
+   * var wms = new WMS("http://wxs.ign.fr/jhyvi0fgmnuxvfv0zjzorvdn/geoportail/r/wms", {
+   *     paramsNative : {
+   *         minZoom : 1,
+   *         maxZoom : 21
+   *     },
+   *     paramsWms   : {
+   *         layers  : "ORTHOIMAGERY.ORTHOPHOTOS.BDORTHO",
+   *         styles  : "normal",
+   *         format  : "image/jpeg",
+   *         version : "1.3.0"
+   *     },
+   *     originators  : [],
+   *     legends      : [],
+   *     metadata     : [],
+   *     title        : "",
+   *     description  : "",
+   *     quicklookUrl : ""
+   * });
+   *
+   * @ignore
+   */
+  initialize: function initialize(url, options) {
+    var settings = {};
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(settings, options.paramsWms, options.paramsNative); // appel du constructeur de la classe étendue
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.TileLayer.WMS.prototype.initialize.call(this, // tracker extension leaflet
+    // FIXME : gp-ext version en mode AMD
+    geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__["default"].Helper.normalyzeUrl(url, {
+      "gp-leaflet-ext": _package_json__WEBPACK_IMPORTED_MODULE_4__.leafletExtVersion || _package_json__WEBPACK_IMPORTED_MODULE_4__.version
+    }, false), settings); // sauvegarde
+
+    this._originators = options.originators;
+    this._legends = options.legends;
+    this._metadata = options.metadata;
+    this._title = options.title;
+    this._description = options.description;
+    this._quicklookUrl = options.quicklookUrl; // init id du Layer
+
+    this._geoportal_id = 0; // FIXME L.stamp(this);
+  },
+
+  /**
+   * event
+   * (overwritten)
+   *
+   * @param {Object} map - map leaflet object
+   * @private
+   */
+  onAdd: function onAdd(map) {
+    logger.trace("onAdd layer", this._geoportal_id); // recuperation de la map
+
+    this._map = map; // enregistrement de l'id Geoportal
+
+    this._geoportal_id = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.stamp(this); // appel de la methode de la classe étendue
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.TileLayer.WMS.prototype.onAdd.call(this, map);
+    this.setVisible(true); // y a t il des attributions/originators pour ce layer ?
+
+    this.updateAttributions(map);
+    /**
+     * Evenement sur l'ajout du layer sur la carte avec gestion des deplacements (zoom)
+     * Les deplacemnts sur la carte permettent de mettre à jour la liste des attributions.
+     */
+
+    map.on({
+      /**
+       * Permet de desactiver la visibilité des attributions sur le retrait
+       * d'un layer de type overlay.
+       * Les attributions ne doivent plus apparaitre si le layer est invisible !
+       */
+      overlayremove: this._onRemoveLayer,
+
+      /**
+       * Permet d'activer la visibilité des attributions sur l'ajout
+       * d'un layer de type overlay.
+       * Les attributions doivent apparaitre si le layer est visible !
+       */
+      overlayadd: this._onAddLayer,
+
+      /**
+       * Permet de desactiver la visibilité des attributions sur le retrait
+       * d'un layer de type layer.
+       * Les attributions ne doivent plus apparaitre si le layer est invisible !
+       */
+      layerremove: this._onRemoveLayer,
+
+      /**
+       * Permet d'activer la visibilité des attributions sur l'ajout
+       * d'un layer de type layer.
+       * Les attributions doivent apparaitre si le layer est visible !
+       */
+      layeradd: this._onAddLayer,
+
+      /**
+       * Permet d'ajouter des fonctionnalités lors de la creation du layer
+       * sur les evenements de fin de mouvemenent (move ou zoom)
+       */
+      moveend: this._onMoveEndLayer
+    }, this); // if (map.attributionControl) {
+    //
+    //     // ceci permet de mofifier le prefixe leaflet !
+    //     // ce dernier etant obligatoire...
+    //     // Ex. map.attributionControl.setPrefix("Plugin © IGN with Leaflet - 2016");
+    //     // map.attributionControl.setPrefix("Leaflet + Géoportail");
+    //     map.attributionControl.setPrefix("Plugin © " +
+    //         "<a href=\"http://www.ign.fr\" " +
+    //         "title=\"Institut national de l'information géographique et forestière\">IGN</a>" +
+    //         " with " +
+    //         "<a href=\"http://leafletjs.com/\" " +
+    //         "title=\"an open-source JavaScript library for mobile-friendly interactive maps\">Leaflet</a>" +
+    //         " - 2016");
+    // }
+  },
+
+  /**
+   * event
+   * (overwritten)
+   *
+   * @param {Object} map - map leaflet object
+   * @private
+   */
+  onRemove: function onRemove(map) {
+    logger.trace("onRemove layer", this._geoportal_id); // recuperation de la map
+
+    this._map = map; // appel de la methode de la classe étendue
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.TileLayer.prototype.onRemove.call(this, map);
+    this.setVisible(false); // suppression des attributions
+
+    this.removeAttributions(map); // supprimer les evenements
+
+    map.off({
+      overlayremove: this._onRemoveLayer,
+      overlayadd: this._onAddLayer,
+      layerremove: this._onRemoveLayer,
+      layeradd: this._onAddLayer,
+      moveend: this._onMoveEndLayer
+    }, this);
+  },
+
+  /**
+   * event
+   * (overwritten)
+   *
+   * @param {Object} tilePoint - Point object
+   *
+   * @returns {String} url
+   * @private
+   */
+  getTileUrl: function getTileUrl(tilePoint) {
+    // (Point, Number) -> String
+    // FIXME
+    // on surcharge cette methode à cause d'un BUG Leaflet sur l'inversion de
+    // coordonnées sur les codes EPSG en geographiques en WMS 1.3.0.
+    // En attente de resolution du ticket suivant :
+    //   Axis option for crs, Issue 4253 on Leaflet/Leaflet
+    //   https://github.com/Leaflet/Leaflet/issues/4253
+    var lstProjEpsgGeographic = ["EPSG:4326"]; // ex. "EPSG:4641"
+
+    var map = this._map;
+    var tileSize = this.options.tileSize;
+    var nwPoint = tilePoint.multiplyBy(tileSize);
+    var sePoint = nwPoint.add([tileSize, tileSize]);
+
+    var nw = this._crs.project(map.unproject(nwPoint, tilePoint.z));
+
+    var se = this._crs.project(map.unproject(sePoint, tilePoint.z));
+
+    var bbox = this._wmsVersion >= 1.3 && lstProjEpsgGeographic.indexOf(this._crs.code) !== -1 ? [se.y, nw.x, nw.y, se.x].join(",") : [nw.x, se.y, se.x, nw.y].join(",");
+    var url = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.template(this._url, {
+      s: this._getSubdomain(tilePoint)
+    });
+    return url + leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.getParamString(this.wmsParams, url, true) + "&BBOX=" + bbox;
+  }
+});
+/* harmony default export */ __webpack_exports__["default"] = (WMS);
+
+/***/ }),
+/* 174 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(34);
+/* harmony import */ var _Common_Utils_LayerUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172);
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("layer-event");
+/**
+ * @classdesc
+ *
+ * Evenement sur les couches Geoportail
+ * @private
+ */
+
+var LayerEvent = {
+  _id: null,
+  _attributions: [],
+  _visibility: true,
+  _originators: [],
+
+  /**
+   * activation du controle attribution
+   *
+   * @param {Object} map - the map
+   *
+   * @return {Boolean} attribution controle is enable
+   */
+  isEnable: function isEnable(map) {
+    if (!map.attributionControl) {
+      return false;
+    }
+
+    return true;
+  },
+
+  /**
+   * visibilité de la couche
+   *
+   * @param {Boolean} visibility - true|false
+   */
+  setVisible: function setVisible(visibility) {
+    logger.log("visibility", visibility);
+    this._visibility = visibility;
+    this.fire("visibilitychange");
+  },
+
+  /**
+   * visibilité de la couche
+   *
+   * @returns {Boolean} visibility
+   */
+  getVisible: function getVisible() {
+    return this._visibility;
+  },
+
+  /**
+   * fonction de suppresion d'un layer du controle des layers
+   *
+   * @param {Object} e - event
+   */
+  _onRemoveLayer: function _onRemoveLayer(e) {
+    logger.trace("onRemove event", e);
+
+    if (e.layer._geoportal_id !== this._geoportal_id) {
+      return;
+    } // attributions non visibles
+
+
+    this.setVisible(false);
+  },
+
+  /**
+   * fonction d'ajout d'un layer du controle des layers
+   *
+   * @param {Object} e - event
+   */
+  _onAddLayer: function _onAddLayer(e) {
+    logger.trace("onAdd event", e);
+
+    if (e.layer._geoportal_id !== this._geoportal_id) {
+      return;
+    } // attributions visibles
+
+
+    this.setVisible(true);
+  },
+
+  /**
+   * fonction de deplacement d'un layer
+   *
+   * @param {Object} e - event
+   */
+  _onMoveEndLayer: function _onMoveEndLayer(e) {
+    logger.trace("moveend event", e); // mise à jour des attributions
+
+    this.updateAttributions(this._map, this);
+  },
+
+  /**
+   * updateAttributions
+   *
+   * @param {Object} map - the map
+   */
+  updateAttributions: function updateAttributions(map) {
+    // FIXME on peut realiser une mise à jour plus intelligente que cette manière brutale...
+    // Ex. mise en place de la notion 'hidden' de l'originators à desactiver
+    if (!this.isEnable(map)) {
+      return;
+    }
+
+    this.removeAttributions(map);
+    this.addAttributions(map);
+    this.fire("attributionchange");
+  },
+
+  /**
+   * removeAttributions
+   *
+   * @param {Object} map - the map
+   */
+  removeAttributions: function removeAttributions(map) {
+    logger.trace("removeAttributions...", this._geoportal_id); // suppression des attributions
+    // L.Map utilise la methode getAttribution() du layer.
+    // La construction concerne le layer courant.
+    // Cet evenement declenche la construction des attributions
+
+    if (!this.isEnable(map)) {
+      return;
+    }
+
+    for (var i = 0; i < this._attributions.length; i++) {
+      map.attributionControl.removeAttribution(this._attributions[i]);
+    } // suppression des attributions de liste
+
+
+    if (this._attributions) {
+      this._attributions = [];
+    }
+  },
+
+  /**
+   * addAttributions
+   *
+   * @param {Object} map - the map
+   */
+  addAttributions: function addAttributions(map) {
+    logger.trace("addAttributions...", this._geoportal_id); // on interroge les originators en options pour obtenir les infos
+    // suivantes :
+    // - echelles
+    // - contraintes d'emprise
+    // - information sur le(s) proprietaire(s) du layer
+    // - ...
+    // mais on a besoin de qq informations sur la carte tels que :
+    // - zoom
+    // - bounds
+    // - ...
+
+    if (!this.isEnable(map)) {
+      return;
+    } // ajout des attributions
+
+
+    var topLeft = map.getBounds().getNorthWest();
+    var bottomRight = map.getBounds().getSouthEast();
+    var arrayBounds = [topLeft.lat, topLeft.lng, bottomRight.lat, bottomRight.lng];
+    var params = {
+      extent: arrayBounds,
+      // map.getBounds(),
+      zoom: map.getZoom(),
+      originators: this._originators,
+      visibility: this._visibility
+    };
+    logger.log(params);
+    var attributionsOriginators = _Common_Utils_LayerUtils__WEBPACK_IMPORTED_MODULE_1__["default"].getAttributions(params);
+    logger.log(attributionsOriginators);
+
+    if (attributionsOriginators && attributionsOriginators.length !== 0) {
+      // on les ajoute dans la liste
+      // et on ajoute les attributions dans le controle Leaflet "L.Control.Attribution"
+      for (var i = 0; i < attributionsOriginators.length; i++) {
+        this._attributions.push(attributionsOriginators[i]);
+
+        map.attributionControl.addAttribution(attributionsOriginators[i]);
+      }
+    }
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (LayerEvent);
+
+/***/ }),
+/* 175 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(40);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
+/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(34);
+/* harmony import */ var _LayerEvent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(174);
+/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(1);
+var _package_json__WEBPACK_IMPORTED_MODULE_4___namespace = /*#__PURE__*/__webpack_require__.t(1, 1);
+/**
+* desativation JSHINT
+* W106 - Identifier '_geoportal_id' is not in camel case
+*/
+
+
+
+ // package.json (extract version)
+
+
+var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_2__["default"].getLogger("wmts");
+/**
+ * @namespace
+ * @alias L.geoportalLayers.WMTS
+ * @classdesc
+ *
+ * Leaflet Layer Class for Geoportal WMTS Layers.
+ *
+ * Use {@link module:Layers.WMTS L.geoportalLayer.WMTS()} factory to create instances of that class.
+ *
+ * **Extends** Leaflet <a href="http://leafletjs.com/reference.html#tilelayer" target="_blank">L.TileLayer</a> native class.
+ *
+ */
+
+var WMTS = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.TileLayer.extend(
+/** @lends WMTS.prototype */
+{
+  includes: _LayerEvent__WEBPACK_IMPORTED_MODULE_3__["default"],
+  defaultWmtsParams: {
+    service: "WMTS",
+    request: "GetTile",
+    version: "1.0.0",
+    layer: "",
+    style: "",
+    tilematrixset: "PM",
+    format: "image/jpeg"
+  },
+
+  /**
+   *
+   * @constructor
+   * @param {String} url - url service
+   * @param {Object} options - options for function call.
+   * @param {Array} [options.originators] - originators
+   * @param {Array} [options.legends] - legends
+   * @param {Array} [options.metadata] - metadata
+   * @param {String} [options.title] - title
+   * @param {String} [options.description] - description
+   * @param {String} [options.quicklookUrl] - quicklookUrl
+   * @param {Object} options.paramsWmts - WMTS options
+   * @param {String} options.paramsWmts.service - "WMTS",
+   * @param {String} options.paramsWmts.request - "GetTile",
+   * @param {String} options.paramsWmts.version - "1.0.0",
+   * @param {String} options.paramsWmts.layer - "",
+   * @param {String} options.paramsWmts.style - "",
+   * @param {String} options.paramsWmts.tilematrixset - "PM",
+   * @param {String} options.paramsWmts.format - "image/jpeg"
+   * @param {Object} [options.paramsNative] - other options for L.TileLayer function (see {@link http://leafletjs.com/reference.html#tilelayer-options})
+   * @example
+   * var wmts = new WMTS("http://wxs.ign.fr/jhyvi0fgmnuxvfv0zjzorvdn/geoportail/wmts", {
+   *     paramsNative : {
+   *         minZoom : 1,
+   *         maxZoom : 21
+   *     },
+   *     paramsWmts   : {
+   *         layer   : "ORTHOIMAGERY.ORTHOPHOTOS",
+   *         style   : "normal",
+   *         format  : "image/jpeg",
+   *         version : "1.0.0",
+   *         tilematrixset : "PM"
+   *     },
+   *     originators  : [],
+   *     legends      : [],
+   *     metadata     : [],
+   *     title        : "",
+   *     description  : "",
+   *     quicklookUrl : ""
+   * });
+   *
+   * @ignore
+   */
+  initialize: function initialize(url, options) {
+    logger.log("initialize"); // parametres WMTS
+
+    this._wmtsParams = {};
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.extend(this._wmtsParams, this.defaultWmtsParams, options.paramsWmts); // appel du constructeur de la classe étendue
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.TileLayer.prototype.initialize.call(this, // tracker extension leaflet
+    // FIXME : gp-ext version en mode AMD
+    geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__["default"].Helper.normalyzeUrl(url, {
+      "gp-leaflet-ext": _package_json__WEBPACK_IMPORTED_MODULE_4__.leafletExtVersion || _package_json__WEBPACK_IMPORTED_MODULE_4__.version
+    }, false), options.paramsNative); // sauvegarde des originators
+
+    this._originators = options.originators;
+    this._legends = options.legends;
+    this._metadata = options.metadata;
+    this._title = options.title;
+    this._description = options.description;
+    this._quicklookUrl = options.quicklookUrl; // id du Layer
+
+    this._geoportal_id = 0; // FIXME L.stamp(this);
+  },
+
+  /**
+   * event 'onAdd'
+   * (overwritten)
+   *
+   * @param {Object} map - map leaflet object
+   * @private
+   */
+  onAdd: function onAdd(map) {
+    logger.trace("onAdd layer", this._geoportal_id); // recuperation de la map
+
+    this._map = map; // enregistrement de l'id Geoportal
+
+    this._geoportal_id = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.stamp(this); // appel de la methode de la classe étendue
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.TileLayer.prototype.onAdd.call(this, map);
+    this.setVisible(true); // y a t il des attributions/originators pour ce layer ?
+
+    this.updateAttributions(map);
+    /**
+     * Evenement sur l'ajout du layer sur la carte avec gestion des deplacements (zoom)
+     * Les deplacemnts sur la carte permettent de mettre à jour la liste des attributions.
+     */
+
+    map.on({
+      /**
+       * Permet de desactiver la visibilité des attributions sur le retrait
+       * d'un layer de type overlay.
+       * Les attributions ne doivent plus apparaitre si le layer est invisible !
+       */
+      overlayremove: this._onRemoveLayer,
+
+      /**
+       * Permet d'activer la visibilité des attributions sur l'ajout
+       * d'un layer de type overlay.
+       * Les attributions doivent apparaitre si le layer est visible !
+       */
+      overlayadd: this._onAddLayer,
+
+      /**
+       * Permet de desactiver la visibilité des attributions sur le retrait
+       * d'un layer de type layer.
+       * Les attributions ne doivent plus apparaitre si le layer est invisible !
+       */
+      layerremove: this._onRemoveLayer,
+
+      /**
+       * Permet d'activer la visibilité des attributions sur l'ajout
+       * d'un layer de type layer.
+       * Les attributions doivent apparaitre si le layer est visible !
+       */
+      layeradd: this._onAddLayer,
+
+      /**
+       * Permet d'ajouter des fonctionnalités lors de la creation du layer
+       * sur les evenements de fin de mouvemenent (move ou zoom)
+       */
+      moveend: this._onMoveEndLayer
+    }, this); // if (map.attributionControl) {
+    //     // ceci permet de mofifier le prefixe leaflet !
+    //     // ce dernier etant obligatoire...
+    //     // Ex. map.attributionControl.setPrefix("Plugin © IGN with Leaflet - 2016");
+    //     // map.attributionControl.setPrefix("Leaflet + Géoportail");
+    //     map.attributionControl.setPrefix("Plugin © " +
+    //         "<a href=\"http://www.ign.fr\" " +
+    //         "title=\"Institut national de l'information géographique et forestière\">IGN</a>" +
+    //         " with " +
+    //         "<a href=\"http://leafletjs.com/\" " +
+    //         "title=\"an open-source JavaScript library for mobile-friendly interactive maps\">Leaflet</a>" +
+    //         " - 2016");
+    // }
+  },
+
+  /**
+   * event 'onRemove'
+   * (overwritten)
+   *
+   * @param {Object} map - map leaflet object
+   * @private
+   */
+  onRemove: function onRemove(map) {
+    logger.trace("onRemove layer", this._geoportal_id); // recuperation de la map
+
+    this._map = map; // appel de la methode de la classe étendue
+
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.TileLayer.prototype.onRemove.call(this, map);
+    this.setVisible(false); // suppression des attributions
+
+    this.removeAttributions(map); // supprimer les evenements
+
+    map.off({
+      overlayremove: this._onRemoveLayer,
+      overlayadd: this._onAddLayer,
+      layerremove: this._onRemoveLayer,
+      layeradd: this._onAddLayer,
+      moveend: this._onMoveEndLayer
+    }, this);
+  },
+
+  /**
+   * event 'getTileUrl'
+   * (overwritten)
+   *
+   * @param {Object} tilePoint - Point leaflet object
+   *
+   * @returns {String} url
+   * @private
+   */
+  getTileUrl: function getTileUrl(tilePoint) {
+    // (Point, Number) -> String
+    // ex http://wxs.ign.fr/j5tcdln4ya4xggpdu4j0f0cn/geoportail/wmts?
+    // SERVICE=WMTS&
+    // REQUEST=GetTile&
+    // VERSION=1.0.0&
+    // LAYER=ORTHOIMAGERY.ORTHOPHOTOS&
+    // STYLE=normal&
+    // TILEMATRIXSET=PM&
+    // TILEMATRIX=2&
+    // TILEROW=2&
+    // TILECOL=1&
+    // FORMAT=image%2Fjpeg
+    var zoom = this._getZoomForUrl();
+
+    var url = leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.template(this._url, {
+      s: this._getSubdomain(tilePoint)
+    });
+    return url + leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.Util.getParamString(this._wmtsParams, url) + "&tilematrix=" + zoom + "&tilerow=" + tilePoint.y + "&tilecol=" + tilePoint.x;
+  },
+
+  /**
+   * event 'setParams'
+   * (overwritten)
+   *
+   * @param {Object} params - parameters
+   * @param {Object} noRedraw - no redraw
+   *
+   * @returns {Object} this
+   * @private
+   */
+  setParams: function setParams(params, noRedraw) {
+    leaflet__WEBPACK_IMPORTED_MODULE_1___default.a.extend(this._wmtsParams, params);
+
+    if (!noRedraw) {
+      this.redraw();
+    }
+
+    return this;
+  }
+});
+/* harmony default export */ __webpack_exports__["default"] = (WMTS);
+
+/***/ }),
+/* 176 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(40);
+
+
+(function () {
+  var scripts = document.getElementsByTagName("script");
+  var key = scripts[scripts.length - 1].getAttribute("data-key"); // in case of several keys
+
+  if (key) {
+    var splitKeys = key.split(/;|,|\|/);
+
+    if (key && splitKeys.length > 1) {
+      var keys = [];
+
+      for (var i = 0; i < splitKeys.length; i++) {
+        keys.push(splitKeys[i]);
+      }
+
+      key = keys;
+    }
+  }
+
+  var url = scripts[scripts.length - 1].getAttribute("data-url");
+  var timeout = scripts[scripts.length - 1].getAttribute("data-timeout"); // callback
+
+  var success = function success() {// Pas de messages en mode prod
+    // console.log("GetConfig success!");
+  }; // callback
+
+
+  var error = function error(e) {
+    throw new Error("Configuration load failed : " + e.message);
+  };
+
+  if (!key && !url) {
+    // pas de message d'information !
+    // console.log("WARNING : parameters missing 'data-key' and 'data-url', the loading of configuration can not be done !");
+    return;
+  }
+
+  var options = {
+    apiKey: key,
+    onSuccess: success,
+    onFailure: error
+  };
+
+  if (url) {
+    options.serverUrl = url;
+    options.callbackSuffix = "";
+  }
+
+  if (timeout) {
+    options.timeOut = timeout;
+  } // test d'existance de la varibale globale Gp.Config
+
+
+  if (!geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__["default"].Config) {
+    // appel du service
+    geoportal_access_lib__WEBPACK_IMPORTED_MODULE_0__["default"].Services.getConfig(options);
+  }
+})();
+
+/***/ }),
+/* 177 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(34);
+
+/**
+* @module ProxyUtils
+* @alias Gp.ProxyUtils
+* @description
+* ...
+*
+* @example
+* proxifyUrl();
+*/
+
+var ProxyUtils = {
+  /**
+   * Ajoute un proxy aux url des couches vecteurs si besoin.
+   *
+   * @param {String} url - Url to proxify.
+   * @param {Object} [proxyOptions] - Object defining proxy options.
+   * @param {String} proxyOptions.proxyUrl - Proxy URL.
+   * @param {Array.<String>} [proxyOptions.noProxyDomains] - Proxy will not be used for this list of domain names.
+   *
+   * @returns {String} proxy url
+   */
+  proxifyUrl: function proxifyUrl(url, proxyOptions) {
+    // logger
+    var logger = _Common_Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("proxifyUrl");
+
+    if (!proxyOptions || !proxyOptions.hasOwnProperty("proxyUrl") || proxyOptions.proxyUrl === null || proxyOptions.proxyUrl.trim().length === 0) {
+      return url;
+    } // on regarde si l'url nest pas dans les domaines sans proxy
+
+
+    if (proxyOptions.noProxyDomains && Array.isArray(proxyOptions.noProxyDomains) && proxyOptions.noProxyDomains.length > 0) {
+      for (var i in proxyOptions.noProxyDomains) {
+        logger.trace("[ProxyUtils] proxifyUrl : analyzing " + proxyOptions.noProxyDomains[i]);
+
+        if (url.indexOf(proxyOptions.noProxyDomains[i]) !== -1) {
+          logger.info("[ProxyUtils] proxifyUrl : " + url + " found in noProxyDomains list (" + proxyOptions.noProxyDomains[i] + ").");
+          return url;
+        }
+      }
+    }
+
+    return proxyOptions.proxyUrl + encodeURIComponent(url);
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (ProxyUtils);
+
+/***/ }),
+/* 178 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/**
+* @module ColorUtils
+* @alias Gp.ColorUtils
+* @description
+* ...
+*
+* @example
+* rgbaToHex();
+* hexToRgba();
+*/
+var ColorUtils = {
+  /**
+   * Converts rgba String to #RRGGBBAA
+   * (Code adapted from : https://gist.github.com/mstssk/afda4ce9e5c335fd79cd)
+   *
+   * @param {String} rgba - A color of RGB or RGBA format.
+   * @returns {Object} hex and opacity formated values
+   */
+  rgbaToHex: function rgbaToHex(rgba) {
+    // number to hex conversion
+    function hex(number) {
+      if (number > 255) {
+        throw new Error("'" + number + "'' is greater than 255(0xff);");
+      }
+
+      var str = Number(number).toString(16);
+      return ("0" + str).slice(-2);
+    }
+
+    var regex = /rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(0?.?\d+)\s*)?\)/;
+    var parsed = regex.exec(rgba);
+
+    if (!parsed) {
+      throw new Error("Invalid format: " + rgba);
+    }
+
+    var red = parsed[1];
+    var green = parsed[2];
+    var blue = parsed[3];
+    var alpha = parsed[4];
+    var elems = [hex(red), hex(green), hex(blue)];
+    var result = {};
+    result.hex = "#" + elems.join("");
+
+    if (alpha) {
+      // elems.push(hex(alpha));
+      result.opacity = parseFloat(alpha);
+    }
+
+    return result;
+  },
+
+  /**
+   * Converts hex color and opacity value to rgba String.
+   * (Code adapted from : http://stackoverflow.com/a/5624139)
+   * @param {String} hex - A color value on RGB format (hexa).
+   * @param {Number} opacity - A opacity value.
+   * @returns {String} A color of RGB or RGBA format
+   */
+  hexToRgba: function hexToRgba(hex, opacity) {
+    // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
+    var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
+
+    if (!hex) {
+      throw new Error("Invalid format");
+    }
+
+    hex = hex.replace(shorthandRegex, function (m, r, g, b) {
+      return r + r + g + g + b + b;
+    });
+    var rgb = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
+    rgb = rgb ? {
+      r: parseInt(rgb[1], 16),
+      g: parseInt(rgb[2], 16),
+      b: parseInt(rgb[3], 16)
+    } : null;
+    var result = rgb ? "rgba(" + rgb.r + ", " + rgb.g + ", " + rgb.b + ", " + opacity + ")" : null;
+    return result;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = (ColorUtils);
+
+/***/ })
+/******/ ]);
+});
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-gp-2.1.7.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,97 @@
+/*!
+ * @brief French Geoportal Extension for Leaflet
+ *
+ * This software is released under the licence CeCILL-B (Free BSD compatible)
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ * @see http://www.cecill.info/
+ *
+ * @copyright copyright (c) IGN 
+ * @license CeCILL-B
+ * @author IGN
+ * @version 2.1.7
+ * @date 09/12/2020
+ *
+ */
+/*!
+ * @overview  Proj4Leaflet - Smooth Proj4js integration with Leaflet
+ * @copyright Copyright (c) 2012, Kartena AB
+ * @license   BSD 2-Clause "Simplified" License
+ *            See https://raw.githubusercontent.com/kartena/Proj4Leaflet/master/LICENSE
+ * @version 1.0.2
+ */
+/*!
+ * @overview  leaflet-draw - Vector drawing and editing plugin for Leaflet 
+ * @copyright Copyright (c) 2012-2017 Jon West, Jacob Toye, and Leaflet
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/Leaflet/Leaflet.draw/master/MIT-LICENSE.md
+ * @version   1.0.4
+ */
+/*!
+ * Sortable -- JavaScript library for reorderable drag-and-drop lists on modern
+ * browsers and touch devices. No jQuery required. Supports Meteor, AngularJS,
+ * React, Polymer, Vue, Knockout and any CSS library, e.g. Bootstrap.
+ *
+ * Released under MIT LICENSE
+ *
+ * Copyright Lebedev Konstantin <ibnRubaXa@gmail.com>
+ * https://github.com/SortableJS/Sortable
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * @version 1.8.4
+ */
+/*!
+ * @overview  es6-promise - a tiny implementation of Promises/A+.
+ * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
+ * @version   v4.2.4
+ */
+/*!
+ * @overview   Proj4js - Javascript reprojection library.
+ *
+ * @authors
+ * - Mike Adair madairATdmsolutions.ca
+ * - Richard Greenwood richATgreenwoodmap.com
+ * - Didier Richard didier.richardATign.fr
+ * - Stephen Irons stephen.ironsATclear.net.nz
+ * - Olivier Terral oterralATgmail.com
+ * - Calvin Metcalf cmetcalfATappgeo.com
+ *
+ * @copyright Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons, Olivier Terral and Calvin Metcalf
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/proj4js/proj4js/master/LICENSE.md
+ * @version   ^2.6.2
+ */
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("leaflet"),require("request"),require("xmldom")):"function"==typeof define&&define.amd?define("Gp",["leaflet","require","require"],e):"object"==typeof exports?exports.Gp=e(require("leaflet"),require("request"),require("xmldom")):t.Gp=e(t.L,t[void 0],t[void 0])}(window,(function(t,e,i){return function(t){var e={};function i(o){if(e[o])return e[o].exports;var n=e[o]={i:o,l:!1,exports:{}};return t[o].call(n.exports,n,n.exports,i),n.l=!0,n.exports}return i.m=t,i.c=e,i.d=function(t,e,o){i.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:o})},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var o=Object.create(null);if(i.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)i.d(o,n,function(e){return t[e]}.bind(null,n));return o},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=0)}([function(t,e,i){"use strict";i.r(e),i.d(e,"Services",(function(){return f})),i.d(e,"Error",(function(){return _})),i.d(e,"Helper",(function(){return g})),i.d(e,"Protocols",(function(){return v})),i.d(e,"servicesDate",(function(){return y})),i.d(e,"servicesVersion",(function(){return E})),i.d(e,"leafletExtVersion",(function(){return P})),i.d(e,"leafletExtDate",(function(){return w}));var o=i(1),n=i(2),s=i.n(n);i.d(e,"LExtended",(function(){return s.a}));i(3),i(21);var a=i(32),r=i(166),l=i(170),c=i(150),u=(i(176),i(40)),h=i(172);i.d(e,"LayerUtils",(function(){return h.default}));var d=i(177);i.d(e,"ProxyUtils",(function(){return d.default}));var p=i(178);i.d(e,"ColorUtils",(function(){return p.default}));var m=i(148);i.d(e,"MathUtils",(function(){return m.default}));var f=u.default.Services,_=u.default.Error,g=u.default.Helper,v=u.default.Protocols,y=u.default.servicesDate,E=u.default.servicesVersion,P=o.leafletExtVersion,w=o.date;s.a.geoportalLayer=l.default,s.a.geoportalControl=a.default,s.a.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_D3=r.default.DISPLAY_PROFILE_LIB_D3,s.a.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS=r.default.DISPLAY_PROFILE_LIB_AMCHARTS,s.a.geoportalControl.ElevationPath.DISPLAY_PROFILE_RAW=r.default.DISPLAY_PROFILE_RAW,s.a.geoportalControl.ElevationPath.DISPLAY_PROFILE_BY_DEFAULT=r.default.DISPLAY_PROFILE_BY_DEFAULT,s.a.geoportalCRS=c.default,s.a.geoportalCRS.EPSG2154=c.default.EPSG2154(),s.a.geoportalCRS.EPSG27572=c.default.EPSG27572(),s.a.geoportalCRS.EPSG4326=c.default.EPSG4326()},function(t){t.exports=JSON.parse('{"name":"geoportal-extensions","description":"French Geoportal Extensions for OpenLayers, Leaflet and iTowns libraries","version":"2.3.1","date":"09/12/2020","leafletExtName":"French Geoportal Extension for Leaflet","leafletExtVersion":"2.1.7","olExtName":"French Geoportal Extension for OpenLayers","olExtVersion":"3.0.13","itownsExtName":"French Geoportal Extension for Itowns","itownsExtVersion":"2.3.0","main":"dist/leaflet/GpPluginLeaflet.js, dist/openlayers/GpPluginOpenLayers.js, dist/itowns/GpPluginItowns.js","module":"src/Leaflet/index.js, src/OpenLayers/index.js, src/Itowns/index.js","directories":{},"scripts":{"setup":"npm install","clean":"echo \\"Warning: target not yet implemented!\\" && exit 0","eslint":"eslint src/","test":"npm run test:serve","test:serve":"cd test && webpack-dev-server --hot --config webpack.test.serve.js","sample":"npm run sample:serve","sample:serve":"npm run sample:ol:serve","sample:itowns:serve":"webpack-dev-server --config build/webpack/webpack.config.itowns --https --open-page samples/index-itowns-map.html --content-base . --output-public-path \'/dist/itowns/\' --port 9001 --open \'google-chrome\'","sample:leaflet:serve":"webpack-dev-server --config build/webpack/webpack.config.leaflet --https --open-page samples/index-leaflet-map.html --content-base . --output-public-path \'/dist/leaflet/\' --port 9001 --open \'google-chrome\'","sample:ol:serve":"webpack-dev-server --config build/webpack/webpack.config.openlayers --https --open-page samples/index-openlayers-map.html --content-base . --output-public-path \'/dist/openlayers/\' --port 9001 --open \'google-chrome\'","doc":"npm run doc:serve","doc:serve":"npm run doc:ol:serve","doc:itowns:serve":"webpack-dev-server --config build/webpack/webpack.config.itowns --content-base jsdoc/itowns --port 9001 --open","doc:leaflet:serve":"webpack-dev-server --config build/webpack/webpack.config.leaflet --content-base jsdoc/leaflet --port 9001 --open","doc:ol:serve":"webpack-dev-server --config build/webpack/webpack.config.openlayers --content-base jsdoc/openlayers --port 9001 --open","build:dev":"npm-run-all --print-label --print-name build:*:dev","build:prod":"npm-run-all --print-label --print-name build:*:prod","build:src":"npm-run-all --print-label --print-name build:*:src","build":"npm-run-all --print-label --print-name build:*:*","build:itowns":"npm-run-all --print-label --print-name build:itowns:*","build:itowns:dev":"webpack --config build/webpack/webpack.config.itowns --mode=development","build:itowns:prod":"webpack --config build/webpack/webpack.config.itowns --mode=production","build:itowns:src":"webpack --config build/webpack/webpack.config.itowns --mode=none","build:ol":"npm-run-all --print-label --print-name build:ol:*","build:ol:dev":"webpack --config build/webpack/webpack.config.openlayers --mode=development","build:ol:prod":"webpack --config build/webpack/webpack.config.openlayers --mode=production","build:ol:src":"webpack --config build/webpack/webpack.config.openlayers --mode=none","build:leaflet":"npm-run-all --print-label --print-name build:leaflet:*","build:leaflet:dev":"webpack --config build/webpack/webpack.config.leaflet --mode=development","build:leaflet:prod":"webpack --config build/webpack/webpack.config.leaflet --mode=production","build:leaflet:src":"webpack --config build/webpack/webpack.config.leaflet --mode=none"},"repository":{"type":"git","url":"https://github.com/IGNF/geoportal-extensions.git"},"author":"IGNF","keywords":["geoportail","javascript","OpenLayers","Leaflet","Itowns","3D"],"license":"CECILL-B","bugs":{"url":"https://github.com/IGNF/geoportal-extensions/issues"},"homepage":"https://github.com/IGNF/geoportal-extensions#readme","dependencies":{"@mapbox/mapbox-gl-style-spec":"13.11.0","eventbusjs":"0.2.0","geoportal-access-lib":"2.1.6","itowns":"2.27.0","leaflet":"1.7.1","leaflet-draw":"1.0.4","loglevel":"^1.6.7","ol":"5.3.0","ol-mapbox-style":"4.2.1","proj4":"^2.6.2","proj4leaflet":"1.0.2","sortablejs":"1.8.4","three":"^0.121.1","whatwg-fetch":"3.0.0"},"devDependencies":{"@babel/core":"^7.4.4","@babel/plugin-transform-template-literals":"^7.7.4","@babel/preset-env":"^7.4.4","babel-loader":"^8.0.5","chai":"^4.2.0","chalk":"^4.0.0","clean-webpack-plugin":"^3.0.0","copy-webpack-plugin":"^5.0.3","core-js":"^3.6.4","css-loader":"^3.4.2","eslint":"^6.8.0","eslint-config-standard":"^14.1.1","eslint-loader":"^4.0.0","eslint-plugin-import":"^2.17.2","eslint-plugin-node":"^11.1.0","eslint-plugin-promise":"^4.1.1","eslint-plugin-standard":"^4.0.0","exports-loader":"^0.7.0","expose-loader":"^0.7.5","fs-extra":"^9.0.0","handlebars":"^4.7.5","handlebars-layouts":"^3.1.4","html-webpack-plugin":"^4.0.4","jsdoc-webpack-plugin":"^0.3.0","mini-css-extract-plugin":"^0.9.0","mocha":"^7.1.1","mocha-loader":"^5.0.0","npm-run-all":"^4.1.5","optimize-css-assets-webpack-plugin":"^5.0.1","path":"^0.12.7","replace-bundle-webpack-plugin":"^1.0.0","requirejs":"^2.3.6","responsive-loader":"^1.2.0","speed-measure-webpack-plugin":"^1.3.0","string-template":"^1.0.0","style-loader":"^1.1.3","terser-webpack-plugin":"^2.0.0","url-loader":"^4.0.0","webpack":"^4.30.0","webpack-cli":"^3.3.1","webpack-dev-server":"^3.3.1","webpack-node-externals":"^1.7.2"}}')},function(e,i){e.exports=t},function(t,e,i){"use strict";i.r(e);i(4),i(5),i(6),i(7),i(8),i(9),i(10),i(11),i(12),i(13),i(14),i(15),i(16),i(17),i(18),i(19),i(20)},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){"use strict";i.r(e);i(22),i(23),i(24),i(25),i(26),i(27),i(28),i(29),i(30);i(31)},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){},function(t,e,i){"use strict";i.r(e);var o=i(33),n=i(39),s=i(147),a=i(158),r=i(161),l=i(163),c=i(166),u=i(169),h={LayerSwitcher:function(t){return new o.default(t)},Isocurve:function(t){return new n.default(t)},MousePosition:function(t){return new s.default(t)},ReverseGeocode:function(t){return new a.default(t)},Route:function(t){return new r.default(t)},SearchEngine:function(t){return new l.default(t)},ElevationPath:function(t){return new c.default(t)},Logo:function(t){return new u.default(t)}};e.default=h},function(t,e,i){"use strict";i.r(e);var o=i(2),n=i.n(o),s=i(34),a=i(36),r=i(37),l=s.default.getLogger("layerswitcher"),c=n.a.Control.Layers.extend({includes:r.default,options:{collapsed:!0,position:"topright",autoZIndex:!0,layers:[]},initialize:function(t){if(n.a.Util.setOptions(this,t),this._uid=a.default.generate(),this._hasLayersConfig=!(!this.options.layers||0===Object.keys(this.options.layers).length),this._layersConfig=this._hasLayersConfig?this.options.layers:[],this._layers={},this._lastZIndex=0,this._hasLayersConfig)for(var e=0;e<this._layersConfig.length;e++){var i=this._layersConfig[e];this._addLayer(i.layer,null,!0)}},onAdd:function(t){var e=t._layers;if(0!==Object.keys(e).length){var i=Object.keys(e);this._lastZIndex=0;for(var o=0;o<i.length;o++){var n=i[o];this.options.autoZIndex&&e[n].setZIndex&&(this._lastZIndex++,e[n].setZIndex(this._lastZIndex)),this._hasLayersConfig&&this._layers[n]||this.addOverlay(e[n])}}if(0===Object.keys(e).length){var s=this._layersConfig;this._lastZIndex=0;for(var a=0;a<s.length;a++){var r=s[a].layer;t.hasLayer(r)||(t.addLayer(r),this.addOverlay(r,null),this.options.autoZIndex&&r.setZIndex&&(this._lastZIndex++,r.setZIndex(this._lastZIndex)))}}for(var c in this._layers)if(this._layers.hasOwnProperty(c)){var u=this._layers[c],h=u.layer;u.visibility||this._updateVisibilityLayer(h)}return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this),t.on("layerremove",this._onLayerChange,this),t.eachLayer((function(t){t.on("visibilitychange",(function(){l.trace("visibilitychange",t)}),this),t.on("attributionchange",(function(){l.trace("attributionchange",t)}),this)})),this._container},_addLayer:function(t,e,i){var o=t._geoportal_id?t._geoportal_id:t._leaflet_id;if(void 0!==o){var s={};for(var a in this._layersConfig)if(this._layersConfig.hasOwnProperty(a)&&o===n.a.stamp(this._layersConfig[a].layer)){if(s=this._layersConfig[a].config,!(void 0===this._layersConfig[a].display||this._layersConfig[a].display))return;break}this._layers[o]={layer:t,id:o,overlay:i,title:t._geoportal_id&&t._title?t._title:e||o,description:t._geoportal_id&&t._description?t._description:e||o,visibility:!0,legends:t._geoportal_id?t._legends:null,metadata:t._geoportal_id?t._metadata:null,quicklookUrl:t._geoportal_id?t._quicklookUrl:null},s&&Object.keys(s)&&n.a.Util.extend(this._layers[o],s);var r=this._layers[o].visibility;t._geoportal_id&&t.setVisible(r),r||this._updateVisibilityLayer(t)}},addTo:function(t){return n.a.Control.prototype.addTo.call(this,t),this},_initLayout:function(){var t=this._container=this._createMainContainerElement(),e=this._createMainLayersShowElement();t.appendChild(e),this.options.collapsed||(e.checked=!0);var i=this._overlaysList=this._createMainLayersElement();t.appendChild(i);var o=this._createMainPictoElement();t.appendChild(o);var s=this._createMainInfoElement();switch(t.appendChild(s),this._createDraggableElement(this._overlaysList,this),n.a.DomEvent.disableClickPropagation(t).disableScrollPropagation(t),this._map.on("moveend",this._onOutOfRangeLayerZoom,this),this.getPosition()){case"topright":t.style.position="relative",t.style.top="0",t.style.right="0";break;case"topleft":case"bottomleft":t.style.position="relative",t.style.top="0",t.style.right="initial",o.style.float="left",i.style.borderBottomRightRadius="5px",i.style.borderBottomLeftRadius="0",s.style.right="initial",s.style.left="190px";break;case"bottomright":t.style.position="relative",t.style.top="0",t.style.right="0";break;default:t.style.position="relative",t.style.top="0",t.style.right="0"}},_update:function(){if(this._container){this._overlaysList.innerHTML="";var t=[];for(var e in this._layers)this._layers.hasOwnProperty(e)&&t.push(e);for(var i=t.sort((function(t,e){return parseInt(t,10)-parseInt(e,10)})).reverse(),o=0;o<i.length;o++){var n=i[o],s=this._layers[n];this._addItem(s)}}},_addItem:function(t){l.log("_addItem",t),t.opacity=t.layer.options.opacity;var e=this._createContainerLayerElement(t);return t.layer.options.minZoom>this._map.getZoom()||t.layer.options.maxZoom<this._map.getZoom()?n.a.DomUtil.addClass(e,"outOfRange"):n.a.DomUtil.removeClass(e,"outOfRange"),this._overlaysList.appendChild(e),e},_onLayerChange:function(t){var e=this._layers[n.a.stamp(t.layer)];if(e){this._handlingClick||this._update();var i="layeradd"===t.type?"overlayadd":"overlayremove";i&&this._map.fire(i,e)}},removeLayer:function(t){var e=n.a.stamp(t);delete this._layers[e],this._update();var i=this._map;return i&&i.hasLayer(t)&&i.removeLayer(t),this},_updateVisibilityLayer:function(t){if(this._map){this._handlingClick=!0;var e=this._layers[n.a.stamp(t)].visibility;e&&!this._map.hasLayer(t)?this._map.addLayer(t):!e&&this._map.hasLayer(t)?this._map.removeLayer(t):l.log("Status unknown layer !?"),this._handlingClick=!1,this._refocusOnMap()}},_updateVisibilityDOMLayer:function(t){var e=n.a.stamp(t),i=n.a.DomUtil.get(this._addUID("GPvisibility_ID_"+e)),o=this._layers[e].visibility;i.checked=o},_updateOpacityDOMLayer:function(t){var e=n.a.stamp(t),i=t.options.opacity,o=n.a.DomUtil.get(this._addUID("GPopacityValue_ID_"+e));o.innerHTML=parseInt(100*i,10)+"%",o.value=parseInt(100*i,10)},_onOutOfRangeLayerZoom:function(){var t=this._map,e=this._layers;for(var i in e)if(e.hasOwnProperty(i)){var o=e[i].layer,s=e[i].id,a=n.a.DomUtil.get(this._addUID("GPlayerSwitcher_ID_"+s));o.options.minZoom>t.getZoom()||o.options.maxZoom<t.getZoom()?n.a.DomUtil.addClass(a,"outOfRange"):n.a.DomUtil.removeClass(a,"outOfRange")}},_onVisibilityLayerClick:function(t){var e=t.target.id,i=a.default.index(e);this._layers[i].visibility=n.a.DomUtil.get(e).checked;var o=this._layers[i].layer;this._updateVisibilityLayer(o)},_onDropLayerClick:function(t){var e=t.target.id,i=a.default.index(e),o=this._layers[i].layer;this.removeLayer(o)},_onChangeLayerOpacity:function(t){var e=t.target.id,i=a.default.index(e),o=this._layers[i].layer,s=t.target.value;n.a.DomUtil.get(this._addUID("GPopacityValue_ID_"+i)).innerHTML=s+"%",this._map.hasLayer(o)&&(void 0!==o.setOpacity?o.setOpacity(s/100):o.setStyle({fillOpacity:s/100,opacity:s/100}))},_onOpenLayerInfoClick:function(t){var e=t.target.id,i=a.default.index(e),o=this._layers[i],s=n.a.DomUtil.get(t.target.id),r=null,l=null;if("GPlayerInfoOpened"===s.className)return n.a.DomUtil.removeClass(s,"GPlayerInfoOpened"),n.a.DomUtil.addClass(s,"GPlayerInfo"),r=n.a.DomUtil.get(this._addUID("GPlayerInfoPanel")),n.a.DomUtil.removeClass(r,"GPpanel"),n.a.DomUtil.removeClass(r,"GPlayerInfoPanelOpened"),n.a.DomUtil.addClass(r,"GPlayerInfoPanelClosed"),l=n.a.DomUtil.get(this._addUID("GPlayerInfoContent")),void r.removeChild(l);for(var c=document.getElementsByClassName("GPlayerInfoOpened"),u=0;u<c.length;u++)c[u].className="GPlayerInfo";n.a.DomUtil.removeClass(s,"GPlayerInfo"),n.a.DomUtil.addClass(s,"GPlayerInfoOpened"),r=n.a.DomUtil.get(this._addUID("GPlayerInfoPanel")),n.a.DomUtil.addClass(r,"GPpanel"),n.a.DomUtil.removeClass(r,"GPlayerInfoPanelClosed"),n.a.DomUtil.addClass(r,"GPlayerInfoPanelOpened"),(l=n.a.DomUtil.get(this._addUID("GPlayerInfoContent")))&&r.removeChild(l);var h=this._createContainerLayerInfoElement(o);r.appendChild(h)},_onDragAndDropLayerClick:function(t){var e=t.target.id,i=a.default.index(e),o=this._layers[i];l.log(o);var n=document.querySelectorAll("div.GPlayerSwitcher_layer");this._lastZIndex=n.length;for(var s=0;s<n.length;s++){var r=n[s].id,c=a.default.index(r),u=this._layers[c].layer;this.options.autoZIndex&&u.setZIndex&&(this._lastZIndex--,u.setZIndex(this._lastZIndex))}},addLayer:function(t,e){var i=this._map,o=this._layersConfig;if(t){i.hasLayer(t)||(l.log("[WARN] LayerSwitcher:addLayer - layer has not been added on map !"),i.addLayer(t));var s=n.a.stamp(t);for(var a in o)if(o.hasOwnProperty(a)&&s===n.a.stamp(o[a].layer)){delete o[a];break}var r=e||{};n.a.Util.extend(r,{layer:t}),o.push(r),this._layers[s]||t.setZIndex(this._lastZIndex++),this.addOverlay(t),this._update()}else l.log("[ERROR] LayerSwitcher:addLayer - missing layer parameter !")},setOpacity:function(t,e){l.trace(t,e),e>1||e<0||this._map.hasLayer(t)&&(void 0!==t.setOpacity?t.setOpacity(e):(t.options.opacity=e,t.setStyle({fillOpacity:e,opacity:e})),this._updateOpacityDOMLayer(t))},setVisibility:function(t,e){l.trace(t,e),this._layers[n.a.stamp(t)].visibility=e,this._updateVisibilityDOMLayer(t),this._updateVisibilityLayer(t)}});e.default=c},function(t,e,i){"use strict";i.r(e);var o=i(35),n={getLogger:function(t){"false".match(/true/)?o.disableAll():o.enableAll();var e=t||"default";return o.getLogger(e)}};e.default=n},function(t,e,i){var o,n;!function(s,a){"use strict";void 0===(n="function"==typeof(o=function(){var t=function(){},e="undefined",i=typeof window!==e&&typeof window.navigator!==e&&/Trident\/|MSIE /.test(window.navigator.userAgent),o=["trace","debug","info","warn","error"];function n(t,e){var i=t[e];if("function"==typeof i.bind)return i.bind(t);try{return Function.prototype.bind.call(i,t)}catch(e){return function(){return Function.prototype.apply.apply(i,[t,arguments])}}}function s(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function a(e,i){for(var n=0;n<o.length;n++){var s=o[n];this[s]=n<e?t:this.methodFactory(s,e,i)}this.log=this.debug}function r(t,i,o){return function(){typeof console!==e&&(a.call(this,i,o),this[t].apply(this,arguments))}}function l(o,a,l){return function(o){return"debug"===o&&(o="log"),typeof console!==e&&("trace"===o&&i?s:void 0!==console[o]?n(console,o):void 0!==console.log?n(console,"log"):t)}(o)||r.apply(this,arguments)}function c(t,i,n){var s,r=this,c="loglevel";function u(){var t;if(typeof window!==e&&c){try{t=window.localStorage[c]}catch(t){}if(typeof t===e)try{var i=window.document.cookie,o=i.indexOf(encodeURIComponent(c)+"=");-1!==o&&(t=/^([^;]+)/.exec(i.slice(o))[1])}catch(t){}return void 0===r.levels[t]&&(t=void 0),t}}"string"==typeof t?c+=":"+t:"symbol"==typeof t&&(c=void 0),r.name=t,r.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},r.methodFactory=n||l,r.getLevel=function(){return s},r.setLevel=function(i,n){if("string"==typeof i&&void 0!==r.levels[i.toUpperCase()]&&(i=r.levels[i.toUpperCase()]),!("number"==typeof i&&i>=0&&i<=r.levels.SILENT))throw"log.setLevel() called with invalid level: "+i;if(s=i,!1!==n&&function(t){var i=(o[t]||"silent").toUpperCase();if(typeof window!==e&&c){try{return void(window.localStorage[c]=i)}catch(t){}try{window.document.cookie=encodeURIComponent(c)+"="+i+";"}catch(t){}}}(i),a.call(r,i,t),typeof console===e&&i<r.levels.SILENT)return"No console available for logging"},r.setDefaultLevel=function(t){u()||r.setLevel(t,!1)},r.enableAll=function(t){r.setLevel(r.levels.TRACE,t)},r.disableAll=function(t){r.setLevel(r.levels.SILENT,t)};var h=u();null==h&&(h=null==i?"WARN":i),r.setLevel(h,!1)}var u=new c,h={};u.getLogger=function(t){if("symbol"!=typeof t&&"string"!=typeof t||""===t)throw new TypeError("You must supply a name when creating a logger.");var e=h[t];return e||(e=h[t]=new c(t,u.getLevel(),u.methodFactory)),e};var d=typeof window!==e?window.log:void 0;return u.noConflict=function(){return typeof window!==e&&window.log===u&&(window.log=d),u},u.getLoggers=function(){return h},u.default=u,u})?o.call(e,i,e,t):o)||(t.exports=n)}()},function(t,e,i){"use strict";i.r(e);var o,n={generate:(o=Math.floor(Date.now()),function(){return o++}),name:function(t){var e=null,i=t.lastIndexOf("-");return e=-1===i?t:t.substring(0,i),e},index:function(t){var e=null,i=this.name(t),o=i.lastIndexOf("_");return-1!==o&&(e=i.substring(o+1)),e},uuid:function(t){var e=null,i=t.lastIndexOf("-");return-1!==i&&(e=parseInt(t.substring(i+1),10)),e}};e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(38),n=i.n(o),s={_createDraggableElement:function(t,e){n.a.create(t,{handle:".GPlayerName",draggable:".draggable-layer",ghostClass:"GPghostLayer",animation:200,onEnd:function(t){e._onDragAndDropLayerClick(t)}})},_addUID:function(t){return this._uid?t+"-"+this._uid:t},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPlayerSwitcher"),t.className="GPwidget",t},_createMainLayersShowElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowLayersList"),t.type="checkbox",t},_createMainLayersElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPlayersList"),t.className="GPpanel",t},_createMainPictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowLayersListPicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowLayersList"),e.title="Afficher/masquer le gestionnaire de couches";var i=document.createElement("span");i.id=this._addUID("GPshowLayersListOpen"),i.className="GPshowAdvancedToolOpen",i.addEventListener("click",(function(){if(document.getElementById(t._addUID("GPshowLayersList")).checked){for(var e=document.getElementsByClassName("GPlayerInfoOpened"),i=0;i<e.length;i++)e[i].className="GPlayerInfo";document.getElementById(t._addUID("GPlayerInfoPanel")).className="GPlayerInfoPanelClosed"}})),e.appendChild(i);var o=document.createElement("span");return o.addEventListener("click",(function(){if(document.getElementById(t._addUID("GPshowLayersList")).checked){for(var e=document.getElementsByClassName("GPlayerInfoOpened"),i=0;i<e.length;i++)e[i].className="GPlayerInfo";document.getElementById(t._addUID("GPlayerInfoPanel")).className="GPlayerInfoPanelClosed"}})),o.id=t._addUID("GPshowLayersListClose"),e.appendChild(o),e},_createMainInfoElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPlayerInfoPanel"),t.className="GPpanel GPlayerInfoPanelClosed",t},_createContainerLayerElement:function(t){var e=document.createElement("div");e.id=this._addUID("GPlayerSwitcher_ID_"+t.id),e.className="GPlayerSwitcher_layer draggable-layer",e.appendChild(this._createBasicToolElement(t));for(var i=this._createAdvancedToolShowElement(t),o=0;o<i.length;o++)e.appendChild(i[o]);return e.appendChild(this._createAdvancedToolElement(t)),e},_createBasicToolElement:function(t){var e=document.createElement("div");e.id=this._addUID("GPbasicTools_ID_"+t.id),e.className="GPlayerBasicTools",e.appendChild(this._createBasicToolNameElement(t));for(var i=this._createBasicToolVisibilityElement(t),o=0;o<i.length;o++)e.appendChild(i[o]);return e},_createBasicToolNameElement:function(t){var e=document.createElement("span");return e.id=this._addUID("GPname_ID_"+t.id),e.className="GPlayerName",e.title=t.description||t.title,e.innerHTML=t.title,e},_createBasicToolVisibilityElement:function(t){var e=[],i=void 0===t.visibility||t.visibility,o=this._addUID("GPvisibility_ID_"+t.id),n=document.createElement("input");n.id=o,n.type="checkbox",n.checked=i;var s=document.createElement("label");s.htmlFor=o,s.id=this._addUID("GPvisibilityPicto_ID_"+t.id),s.className="GPlayerVisibility",s.title="Afficher/masquer la couche";var a=this;return n.addEventListener?n.addEventListener("click",(function(t){a._onVisibilityLayerClick(t)})):n.attachEvent&&n.attachEvent("onclick",(function(t){a._onVisibilityLayerClick(t)})),e.push(n),e.push(s),e},_createAdvancedToolShowElement:function(t){var e=[],i=document.createElement("label");i.id=this._addUID("GPshowAdvancedToolsPicto_ID_"+t.id),i.htmlFor=this._addUID("GPshowAdvancedTools_ID_"+t.id),i.title="Plus d'outils",i.className="GPshowMoreOptions GPshowLayerAdvancedTools";var o=document.createElement("input");return o.type="checkbox",o.id=this._addUID("GPshowAdvancedTools_ID_"+t.id),e.push(o),e.push(i),e},_createAdvancedToolElement:function(t){var e=document.createElement("div");if(e.id=this._addUID("GPadvancedTools_ID_"+t.id),e.className="GPlayerAdvancedTools",e.appendChild(this._createAdvancedToolDeleteElement(t)),t.title&&t.description&&e.appendChild(this._createAdvancedToolInformationElement(t)),"feature"!==t.type)for(var i=this._createAdvancedToolOpacityElement(t),o=0;o<i.length;o++)e.appendChild(i[o]);return e},_createAdvancedToolDeleteElement:function(t){var e=document.createElement("div");e.id=this._addUID("GPremove_ID_"+t.id),e.className="GPlayerRemove",e.title="Supprimer la couche",e.layerId=t.id;var i=this;return e.addEventListener?e.addEventListener("click",(function(t){i._onDropLayerClick(t)})):e.attachEvent&&e.attachEvent("onclick",(function(t){i._onDropLayerClick(t)})),e},_createAdvancedToolInformationElement:function(t){var e=document.createElement("div");e.id=this._addUID("GPinfo_ID_"+t.id),e.className="GPlayerInfo",e.title="Informations/légende",e.layerId=t.id;var i=this;return e.addEventListener?e.addEventListener("click",(function(t){i._onOpenLayerInfoClick(t)})):e.attachEvent&&e.attachEvent("onclick",(function(t){i._onOpenLayerInfoClick(t)})),e},_createAdvancedToolOpacityElement:function(t){var e=[],i=document.createElement("div");i.id=this._addUID("GPopacity_ID_"+t.id),i.className="GPlayerOpacity",i.title="Opacité";var o=void 0!==t.opacity?t.opacity:1;o=Math.round(100*o);var n=document.createElement("input");n.id=this._addUID("GPopacityValueDiv_ID_"+t.id),n.type="range",n.value=o;var s=this;n.addEventListener?n.addEventListener("change",(function(t){s._onChangeLayerOpacity(t)})):n.attachEvent&&n.attachEvent("onchange",(function(t){s._onChangeLayerOpacity(t)})),n.addEventListener?n.addEventListener("input",(function(t){s._onChangeLayerOpacity(t)})):n.attachEvent&&n.attachEvent("oninput",(function(t){s._onChangeLayerOpacity(t)})),i.appendChild(n);var a=document.createElement("div");a.id=this._addUID("GPopacityValueDiv_ID_"+t.id),a.className="GPlayerOpacityValue";var r=document.createElement("span");return r.id=this._addUID("GPopacityValue_ID_"+t.id),r.innerHTML=o+"%",a.appendChild(r),e.push(i),e.push(a),e},_createContainerLayerInfoElement:function(t){var e=document.createElement("div");e.id=this._addUID("GPlayerInfoContent");var i=document.createElement("div");if(i.id=this._addUID("GPlayerInfoTitle"),i.innerHTML=t.title,e.appendChild(i),t.quicklookUrl){var o=document.createElement("div");o.id=this._addUID("GPlayerInfoQuicklook"),o.title="Afficher un aperçu de la couche";var n=document.createElement("a");n.href=t.quicklookUrl,n.appendChild(o),e.appendChild(n)}var s=document.createElement("div");s.id=this._addUID("GPlayerInfoClose"),s.title="Fermer la fenêtre";var a=this,r=function(){document.getElementById(a._addUID("GPlayerInfoPanel")).className="GPlayerInfoPanelClosed";for(var t=document.getElementsByClassName("GPlayerInfoOpened"),e=0;e<t.length;e++)t[e].className="GPlayerInfo"};s.addEventListener?s.addEventListener("click",r):s.attachEvent&&s.attachEvent("onclick",r),e.appendChild(s);var l=document.createElement("div");if(l.id=this._addUID("GPlayerInfoDescription"),l.innerHTML=t.description,e.appendChild(l),t.metadata){var c=document.createElement("div");c.id=this._addUID("GPlayerInfoMetadata");var u=document.createElement("div");u.className="GPlayerInfoSubtitle",u.innerHTML="Métadonnées",c.appendChild(u);for(var h=0;h<t.metadata.length;h++){var d=t.metadata[h].url,p=document.createElement("div");p.className="GPlayerInfoLink";var m=document.createElement("a");m.href=d,m.innerHTML=d,p.appendChild(m),c.appendChild(p)}0!==t.metadata.length&&e.appendChild(c)}if(t.legends){var f=document.createElement("div");f.id=this._addUID("GPlayerInfoLegend");var _=document.createElement("div");_.className="GPlayerInfoSubtitle",_.innerHTML="Légende",f.appendChild(_);for(var g={},v=t.maxScaleDenominator||56e7,y=0;y<t.legends.length;y++){var E=t.legends[y].minScaleDenominator;if(E){var P=E.toString();E=Math.round(parseInt(P.substring(0,3),10)/10)*Math.pow(10,P.length-2)}else E=270;g[E]=t.legends[y]}for(var w in g)if(g.hasOwnProperty(w)){var C=g[w].url;if("string"==typeof C&&-1===C.toLowerCase().indexOf("nolegend.jpg")){var M=document.createElement("div");M.className="GPlayerInfoLink",v=g[w].maxScaleDenominator||v;var S=document.createElement("a");S.href=C,S.innerHTML="Du 1/"+w+" au 1/"+v,M.appendChild(S),f.appendChild(M)}else delete g[w]}0!==Object.keys(g).length&&e.appendChild(f)}return e}};e.default=s},function(t,e,i){var o,n;
+/**!
+ * Sortable
+ * @author	RubaXa   <trash@rubaxa.org>
+ * @author	owenm    <owen23355@gmail.com>
+ * @license MIT
+ */!function(s){"use strict";void 0===(n="function"==typeof(o=s)?o.call(e,i,e,t):o)||(t.exports=n)}((function(){"use strict";if("undefined"==typeof window||!window.document)return function(){throw new Error("Sortable.js requires a window with a document")};var t,e,i,o,n,s,a,r,l,c,u,h,d,p,m,f,_,g,v,y,E,P,w,C,M,S,L=[],b=!1,R=!1,x=!1,I=[],G=!1,A=!1,T=[],k=/\s+/g,D="Sortable"+(new Date).getTime(),O=window,N=O.document,U=O.parseInt,j=O.setTimeout,F=O.jQuery||O.Zepto,B=O.Polymer,z={capture:!1,passive:!1},q=!!navigator.userAgent.match(/(?:Trident.*rv[ :]?11\.|msie|iemobile)/i),H=!!navigator.userAgent.match(/Edge/i),W=!!navigator.userAgent.match(/firefox/i),V=!(!navigator.userAgent.match(/safari/i)||navigator.userAgent.match(/chrome/i)||navigator.userAgent.match(/android/i)),Y=!!navigator.userAgent.match(/iP(ad|od|hone)/i),X=H||q?"cssFloat":"float",K="draggable"in N.createElement("div"),Z=function(){if(q)return!1;var t=N.createElement("x");return t.style.cssText="pointer-events:auto","auto"===t.style.pointerEvents}(),Q=!1,J=!1,$=Math.abs,tt=Math.min,et=Math.max,it=[],ot=function(t,e){var i=Ct(t),o=U(i.width)-U(i.paddingLeft)-U(i.paddingRight)-U(i.borderLeftWidth)-U(i.borderRightWidth),n=It(t,0,e),s=It(t,1,e),a=n&&Ct(n),r=s&&Ct(s),l=a&&U(a.marginLeft)+U(a.marginRight)+Bt(n).width,c=r&&U(r.marginLeft)+U(r.marginRight)+Bt(s).width;if("flex"===i.display)return"column"===i.flexDirection||"column-reverse"===i.flexDirection?"vertical":"horizontal";if("grid"===i.display)return i.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(n&&"none"!==a.float){var u="left"===a.float?"left":"right";return!s||"both"!==r.clear&&r.clear!==u?"horizontal":"vertical"}return n&&("block"===a.display||"flex"===a.display||"table"===a.display||"grid"===a.display||l>=o&&"none"===i[X]||s&&"none"===i[X]&&l+c>o)?"vertical":"horizontal"},nt=function(t,e){if(!t||!t.getBoundingClientRect)return st();var i=t,o=!1;do{if(i.clientWidth<i.scrollWidth||i.clientHeight<i.scrollHeight){var n=Ct(i);if(i.clientWidth<i.scrollWidth&&("auto"==n.overflowX||"scroll"==n.overflowX)||i.clientHeight<i.scrollHeight&&("auto"==n.overflowY||"scroll"==n.overflowY)){if(!i||!i.getBoundingClientRect||i===N.body)return st();if(o||e)return i;o=!0}}}while(i=i.parentNode);return st()},st=function(){return q?N.documentElement:N.scrollingElement},at=function(t,e,i){t.scrollLeft+=e,t.scrollTop+=i},rt=Ot((function(t,e,i,o){if(e.scroll){var n=i?i[D]:window,s=e.scrollSensitivity,a=e.scrollSpeed,u=t.clientX,h=t.clientY,d=st(),p=!1;l!==i&&(lt(),r=e.scroll,c=e.scrollFn,!0===r&&(r=nt(i,!0),l=r));var m=0,f=r;do{var _,g,y,E,P,w,C,M,S,R=f,x=Bt(R),I=x.top,G=x.bottom,A=x.left,T=x.right,k=x.width,O=x.height;if(_=R.scrollWidth,g=R.scrollHeight,y=Ct(R),M=R.scrollLeft,S=R.scrollTop,R===d?(w=k<_&&("auto"===y.overflowX||"scroll"===y.overflowX||"visible"===y.overflowX),C=O<g&&("auto"===y.overflowY||"scroll"===y.overflowY||"visible"===y.overflowY)):(w=k<_&&("auto"===y.overflowX||"scroll"===y.overflowX),C=O<g&&("auto"===y.overflowY||"scroll"===y.overflowY)),E=w&&($(T-u)<=s&&M+k<_)-($(A-u)<=s&&!!M),P=C&&($(G-h)<=s&&S+O<g)-($(I-h)<=s&&!!S),!L[m])for(var N=0;N<=m;N++)L[N]||(L[N]={});L[m].vx==E&&L[m].vy==P&&L[m].el===R||(L[m].el=R,L[m].vx=E,L[m].vy=P,clearInterval(L[m].pid),!R||0==E&&0==P||(p=!0,L[m].pid=setInterval(function(){o&&0===this.layer&&(gt.active._emulateDragOver(!0),gt.active._onTouchMove(v,!0));var e=L[this.layer].vy?L[this.layer].vy*a:0,i=L[this.layer].vx?L[this.layer].vx*a:0;"function"==typeof c&&"continue"!==c.call(n,i,e,t,v,L[this.layer].el)||at(L[this.layer].el,i,e)}.bind({layer:m}),24))),m++}while(e.bubbleScroll&&f!==d&&(f=nt(f,!1)));b=p}}),30),lt=function(){L.forEach((function(t){clearInterval(t.pid)})),L=[]},ct=function(t){function e(t,i){return function(o,n,s,a){var r=o.options.group.name&&n.options.group.name&&o.options.group.name===n.options.group.name;if(null==t&&(i||r))return!0;if(null==t||!1===t)return!1;if(i&&"clone"===t)return t;if("function"==typeof t)return e(t(o,n,s,a),i)(o,n,s,a);var l=(i?o:n).options.group.name;return!0===t||"string"==typeof t&&t===l||t.join&&t.indexOf(l)>-1}}var i={},o=t.group;o&&"object"==typeof o||(o={name:o}),i.name=o.name,i.checkPull=e(o.pull,!0),i.checkPut=e(o.put),i.revertClone=o.revertClone,t.group=i},ut=function(e){t&&t.parentNode&&t.parentNode[D]&&t.parentNode[D]._computeIsAligned(e)},ht=function(t,e){for(var i=e;!i[D];)i=i.parentNode;return t===i},dt=function(t,e,i){for(var o=t.parentNode;o&&!o[D];)o=o.parentNode;o&&o[D][i](Nt(e,{artificialBubble:!0}))},pt=function(){!Z&&i&&Ct(i,"display","none")},mt=function(){!Z&&i&&Ct(i,"display","")};N.addEventListener("click",(function(t){if(x)return t.preventDefault(),t.stopPropagation&&t.stopPropagation(),t.stopImmediatePropagation&&t.stopImmediatePropagation(),x=!1,!1}),!0);var ft,_t=function(e){if(e=e.touches?e.touches[0]:e,t){var i=function(t,e){for(var i=0;i<I.length;i++)if(!Gt(I[i])){var o=Bt(I[i]),n=I[i][D].options.emptyInsertThreshold,s=t>=o.left-n&&t<=o.right+n,a=e>=o.top-n&&e<=o.bottom+n;if(s&&a)return I[i]}}(e.clientX,e.clientY);i&&i[D]._onDragOver({clientX:e.clientX,clientY:e.clientY,target:i,rootEl:i})}};function gt(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be HTMLElement, not "+{}.toString.call(t);this.el=t,this.options=e=Nt({},e),t[D]=this;var i={group:null,sort:!0,disabled:!1,store:null,handle:null,scroll:!0,scrollSensitivity:30,scrollSpeed:10,bubbleScroll:!0,draggable:/[uo]l/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return ot(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,touchStartThreshold:U(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==gt.supportPointer&&("PointerEvent"in window||window.navigator&&"msPointerEnabled"in window.navigator),emptyInsertThreshold:5};for(var o in i)!(o in e)&&(e[o]=i[o]);for(var n in ct(e),this)"_"===n.charAt(0)&&"function"==typeof this[n]&&(this[n]=this[n].bind(this));this.nativeDraggable=!e.forceFallback&&K,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?Et(t,"pointerdown",this._onTapStart):(Et(t,"mousedown",this._onTapStart),Et(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(Et(t,"dragover",this),Et(t,"dragenter",this)),I.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[])}function vt(t,e,i,o){if(t){i=i||N;do{if(null!=e&&(">"===e[0]&&t.parentNode===i&&Dt(t,e.substring(1))||Dt(t,e))||o&&t===i)return t;if(t===i)break}while(t=yt(t))}return null}function yt(t){return t.host&&t!==N&&t.host.nodeType?t.host:t.parentNode}function Et(t,e,i){t.addEventListener(e,i,z)}function Pt(t,e,i){t.removeEventListener(e,i,z)}function wt(t,e,i){if(t&&e)if(t.classList)t.classList[i?"add":"remove"](e);else{var o=(" "+t.className+" ").replace(k," ").replace(" "+e+" "," ");t.className=(o+(i?" "+e:"")).replace(k," ")}}function Ct(t,e,i){var o=t&&t.style;if(o){if(void 0===i)return N.defaultView&&N.defaultView.getComputedStyle?i=N.defaultView.getComputedStyle(t,""):t.currentStyle&&(i=t.currentStyle),void 0===e?i:i[e];e in o||-1!==e.indexOf("webkit")||(e="-webkit-"+e),o[e]=i+("string"==typeof i?"":"px")}}function Mt(t){var e="";do{var i=Ct(t,"transform");i&&"none"!==i&&(e=i+" "+e)}while(t=t.parentNode);return window.DOMMatrix?new DOMMatrix(e):window.WebKitCSSMatrix?new WebKitCSSMatrix(e):window.CSSMatrix?new CSSMatrix(e):void 0}function St(t,e,i){if(t){var o=t.getElementsByTagName(e),n=0,s=o.length;if(i)for(;n<s;n++)i(o[n],n);return o}return[]}function Lt(t,e,i,n,s,a,r,l,c){var u,h=(t=t||e[D]).options,d="on"+i.charAt(0).toUpperCase()+i.substr(1);!window.CustomEvent||q||H?(u=N.createEvent("Event")).initEvent(i,!0,!0):u=new CustomEvent(i,{bubbles:!0,cancelable:!0}),u.to=s||e,u.from=a||e,u.item=n||e,u.clone=o,u.oldIndex=r,u.newIndex=l,u.originalEvent=c,u.pullMode=p?p.lastPutMode:void 0,e&&e.dispatchEvent(u),h[d]&&h[d].call(t,u)}function bt(t,e,i,o,n,s,a,r){var l,c,u=t[D],h=u.options.onMove;return!window.CustomEvent||q||H?(l=N.createEvent("Event")).initEvent("move",!0,!0):l=new CustomEvent("move",{bubbles:!0,cancelable:!0}),l.to=e,l.from=t,l.dragged=i,l.draggedRect=o,l.related=n||e,l.relatedRect=s||Bt(e),l.willInsertAfter=r,l.originalEvent=a,t.dispatchEvent(l),h&&(c=h.call(u,l,a)),c}function Rt(t){t.draggable=!1}function xt(){Q=!1}function It(e,o,n){for(var s=0,a=0,r=e.children;a<r.length;){if("none"!==r[a].style.display&&r[a]!==i&&r[a]!==t&&vt(r[a],n.draggable,e,!1)){if(s===o)return r[a];s++}a++}return null}function Gt(t){for(var e=t.lastElementChild;e&&(e===i||"none"===e.style.display);)e=e.previousElementSibling;return e||null}function At(e){return kt(t)<kt(e)?1:-1}function Tt(t){for(var e=t.tagName+t.className+t.src+t.href+t.textContent,i=e.length,o=0;i--;)o+=e.charCodeAt(i);return o.toString(36)}function kt(t,e){var i=0;if(!t||!t.parentNode)return-1;for(;t&&(t=t.previousElementSibling);)"TEMPLATE"!==t.nodeName.toUpperCase()&&t!==o&&i++;return i}function Dt(t,e){if(t)try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return!1}return!1}function Ot(t,e){return function(){if(!ft){var i=arguments,o=this;ft=j((function(){1===i.length?t.call(o,i[0]):t.apply(o,i),ft=void 0}),e)}}}function Nt(t,e){if(t&&e)for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function Ut(t){return B&&B.dom?B.dom(t).cloneNode(!0):F?F(t).clone(!0)[0]:t.cloneNode(!0)}function jt(t){return j(t,0)}function Ft(t){return clearTimeout(t)}function Bt(t,e,i,o){if(t.getBoundingClientRect||t===O){var n,s,a,r,l,c,u;if(t!==O&&t!==st()?(s=(n=t.getBoundingClientRect()).top,a=n.left,r=n.bottom,l=n.right,c=n.height,u=n.width):(s=0,a=0,r=window.innerHeight,l=window.innerWidth,c=window.innerHeight,u=window.innerWidth),o&&t!==O&&(i=i||t.parentNode,!q))do{if(i&&i.getBoundingClientRect&&"none"!==Ct(i,"transform")){var h=i.getBoundingClientRect();s-=h.top+U(Ct(i,"border-top-width")),a-=h.left+U(Ct(i,"border-left-width")),r=s+n.height,l=a+n.width;break}}while(i=i.parentNode);if(e&&t!==O){var d=Mt(i||t),p=d&&d.a,m=d&&d.d;d&&(r=(s/=m)+(c/=m),l=(a/=p)+(u/=p))}return{top:s,left:a,bottom:r,right:l,width:u,height:c}}}function zt(t,e){for(var i=nt(t,!0),o=Bt(t)[e];i;){var n=Bt(i)[e];if(!("top"===e||"left"===e?o>=n:o<=n))return i;if(i===st())break;i=nt(i,!1)}return!1}function qt(t){var e=0,i=0,o=st();if(t)do{var n=Mt(t),s=n.a,a=n.d;e+=t.scrollLeft*s,i+=t.scrollTop*a}while(t!==o&&(t=t.parentNode));return[e,i]}return Et(N,"dragover",_t),Et(N,"mousemove",_t),Et(N,"touchmove",_t),gt.prototype={constructor:gt,_computeIsAligned:function(e){var o;if(i&&!Z?(pt(),o=N.elementFromPoint(e.clientX,e.clientY),mt()):o=e.target,o=vt(o,this.options.draggable,this.el,!1),!J&&t&&t.parentNode===this.el){for(var n,s,a,r,l,c,u,h,d=this.el.children,p=0;p<d.length;p++)vt(d[p],this.options.draggable,this.el,!1)&&d[p]!==o&&(d[p].sortableMouseAligned=(n=e.clientX,s=e.clientY,a=d[p],r=this._getDirection(e,null),this.options,l=void 0,c=void 0,u=void 0,h=void 0,l=Bt(a),c="vertical"===r?l.left:l.top,u="vertical"===r?l.right:l.bottom,c<(h="vertical"===r?n:s)&&h<u));vt(o,this.options.draggable,this.el,!0)||(E=null),J=!0,j((function(){J=!1}),30)}},_getDirection:function(e,i){return"function"==typeof this.options.direction?this.options.direction.call(this,e,i,t):this.options.direction},_onTapStart:function(e){if(e.cancelable){var i,o=this,n=this.el,s=this.options,r=s.preventOnFilter,l=e.type,c=e.touches&&e.touches[0],u=(c||e).target,h=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||u,d=s.filter;if(function(t){it.length=0;var e=t.getElementsByTagName("input"),i=e.length;for(;i--;){var o=e[i];o.checked&&it.push(o)}}(n),(!q||e.artificialBubble||ht(n,u))&&!t&&!(/mousedown|pointerdown/.test(l)&&0!==e.button||s.disabled||h.isContentEditable))if(u=vt(u,s.draggable,n,!1)){if(a!==u){if(i=kt(u,s.draggable),"function"==typeof d){if(d.call(this,e,u,this))return Lt(o,h,"filter",u,n,n,i),void(r&&e.cancelable&&e.preventDefault())}else if(d&&(d=d.split(",").some((function(t){if(t=vt(h,t.trim(),n,!1))return Lt(o,t,"filter",u,n,n,i),!0}))))return void(r&&e.cancelable&&e.preventDefault());s.handle&&!vt(h,s.handle,n,!1)||this._prepareDragStart(e,c,u,i)}}else q&&dt(n,e,"_onTapStart")}},_handleAutoScroll:function(e,i){if(t&&this.options.scroll){var o=e.clientX,n=e.clientY,s=N.elementFromPoint(o,n),a=this;if(i||H||q||V){rt(e,a.options,s,i);var r=nt(s,!0);!b||m&&o===f&&n===_||(m&&clearInterval(m),m=setInterval((function(){if(t){var s=nt(N.elementFromPoint(o,n),!0);s!==r&&(r=s,lt(),rt(e,a.options,r,i))}}),10),f=o,_=n)}else{if(!a.options.bubbleScroll||nt(s,!0)===st())return void lt();rt(e,a.options,nt(s,!1),!1)}}},_prepareDragStart:function(i,o,r,l){var c,h=this,p=h.el,m=h.options,f=p.ownerDocument;r&&!t&&r.parentNode===p&&(n=p,e=(t=r).parentNode,s=t.nextSibling,a=r,d=m.group,u=l,g={target:t,clientX:(o||i).clientX,clientY:(o||i).clientY},this._lastX=(o||i).clientX,this._lastY=(o||i).clientY,t.style["will-change"]="all",t.style.transition="",t.style.transform="",c=function(){h._disableDelayedDragEvents(),!W&&h.nativeDraggable&&(t.draggable=!0),h._triggerDragStart(i,o),Lt(h,n,"choose",t,n,n,u),wt(t,m.chosenClass,!0)},m.ignore.split(",").forEach((function(e){St(t,e.trim(),Rt)})),m.supportPointer?Et(f,"pointerup",h._onDrop):(Et(f,"mouseup",h._onDrop),Et(f,"touchend",h._onDrop),Et(f,"touchcancel",h._onDrop)),W&&this.nativeDraggable&&(this.options.touchStartThreshold=4,t.draggable=!0),!m.delay||this.nativeDraggable&&(H||q)?c():(Et(f,"mouseup",h._disableDelayedDrag),Et(f,"touchend",h._disableDelayedDrag),Et(f,"touchcancel",h._disableDelayedDrag),Et(f,"mousemove",h._delayedDragTouchMoveHandler),Et(f,"touchmove",h._delayedDragTouchMoveHandler),m.supportPointer&&Et(f,"pointermove",h._delayedDragTouchMoveHandler),h._dragStartTimer=j(c,m.delay)))},_delayedDragTouchMoveHandler:function(t){var e=t.touches?t.touches[0]:t;et($(e.clientX-this._lastX),$(e.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){t&&Rt(t),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;Pt(t,"mouseup",this._disableDelayedDrag),Pt(t,"touchend",this._disableDelayedDrag),Pt(t,"touchcancel",this._disableDelayedDrag),Pt(t,"mousemove",this._delayedDragTouchMoveHandler),Pt(t,"touchmove",this._delayedDragTouchMoveHandler),Pt(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(e,i){i=i||("touch"==e.pointerType?e:null),!this.nativeDraggable||i?this.options.supportPointer?Et(N,"pointermove",this._onTouchMove):Et(N,i?"touchmove":"mousemove",this._onTouchMove):(Et(t,"dragend",this),Et(n,"dragstart",this._onDragStart));try{N.selection?jt((function(){N.selection.empty()})):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(e,i){if(R=!1,n&&t){this.nativeDraggable&&(Et(N,"dragover",this._handleAutoScroll),Et(N,"dragover",ut));var o=this.options;!e&&wt(t,o.dragClass,!1),wt(t,o.ghostClass,!0),Ct(t,"transform",""),gt.active=this,e&&this._appendGhost(),Lt(this,n,"start",t,n,n,u,void 0,i)}else this._nulling()},_emulateDragOver:function(e){if(v){if(this._lastX===v.clientX&&this._lastY===v.clientY&&!e)return;this._lastX=v.clientX,this._lastY=v.clientY,pt();for(var i=N.elementFromPoint(v.clientX,v.clientY),o=i;i&&i.shadowRoot;)o=i=i.shadowRoot.elementFromPoint(v.clientX,v.clientY);if(o)do{if(o[D])if(o[D]._onDragOver({clientX:v.clientX,clientY:v.clientY,target:i,rootEl:o})&&!this.options.dragoverBubble)break;i=o}while(o=o.parentNode);t.parentNode[D]._computeIsAligned(v),mt()}},_onTouchMove:function(t,e){if(g){var o=this.options,n=o.fallbackTolerance,s=o.fallbackOffset,a=t.touches?t.touches[0]:t,r=i&&Mt(i),l=i&&r&&r.a,c=i&&r&&r.d,u=Y&&M&&qt(M),h=(a.clientX-g.clientX+s.x)/(l||1)+(u?u[0]-T[0]:0)/(l||1),d=(a.clientY-g.clientY+s.y)/(c||1)+(u?u[1]-T[1]:0)/(c||1),p=t.touches?"translate3d("+h+"px,"+d+"px,0)":"translate("+h+"px,"+d+"px)";if(!gt.active&&!R){if(n&&tt($(a.clientX-this._lastX),$(a.clientY-this._lastY))<n)return;this._onDragStart(t,!0)}!e&&this._handleAutoScroll(a,!0),y=!0,v=a,Ct(i,"webkitTransform",p),Ct(i,"mozTransform",p),Ct(i,"msTransform",p),Ct(i,"transform",p),t.cancelable&&t.preventDefault()}},_appendGhost:function(){if(!i){var e=this.options.fallbackOnBody?N.body:n,o=Bt(t,!0,e,!Y),s=(Ct(t),this.options);if(Y){for(M=e;"static"===Ct(M,"position")&&"none"===Ct(M,"transform")&&M!==N;)M=M.parentNode;if(M!==N){var a=Bt(M,!0);o.top-=a.top,o.left-=a.left}M!==N.body&&M!==N.documentElement?(M===N&&(M=st()),o.top+=M.scrollTop,o.left+=M.scrollLeft):M=st(),T=qt(M)}wt(i=t.cloneNode(!0),s.ghostClass,!1),wt(i,s.fallbackClass,!0),wt(i,s.dragClass,!0),Ct(i,"box-sizing","border-box"),Ct(i,"margin",0),Ct(i,"top",o.top),Ct(i,"left",o.left),Ct(i,"width",o.width),Ct(i,"height",o.height),Ct(i,"opacity","0.8"),Ct(i,"position",Y?"absolute":"fixed"),Ct(i,"zIndex","100000"),Ct(i,"pointerEvents","none"),e.appendChild(i)}},_onDragStart:function(e,i){var s=this,a=e.dataTransfer,r=s.options;(o=Ut(t)).draggable=!1,o.style["will-change"]="",this._hideClone(),wt(o,s.options.chosenClass,!1),s._cloneId=jt((function(){s.options.removeCloneOnHide||n.insertBefore(o,t),Lt(s,n,"clone",t)})),!i&&wt(t,r.dragClass,!0),i?(x=!0,s._loopId=setInterval(s._emulateDragOver,50)):(Pt(N,"mouseup",s._onDrop),Pt(N,"touchend",s._onDrop),Pt(N,"touchcancel",s._onDrop),a&&(a.effectAllowed="move",r.setData&&r.setData.call(s,a,t)),Et(N,"drop",s),Ct(t,"transform","translateZ(0)")),R=!0,s._dragStartId=jt(s._dragStarted.bind(s,i,e)),Et(N,"selectstart",s),V&&Ct(N.body,"user-select","none")},_onDragOver:function(i){var o,a,r,l=this.el,c=i.target,h=this.options,m=h.group,f=gt.active,_=d===m,g=h.sort,v=this;if(!Q&&(!q||i.rootEl||i.artificialBubble||ht(l,c))){if(void 0!==i.preventDefault&&i.cancelable&&i.preventDefault(),y=!0,c=vt(c,h.draggable,l,!0),vt(i.target,null,t,!0)||c.animated)return H(!1);if(c!==t&&(x=!1),f&&!h.disabled&&(_?g||(r=!n.contains(t)):p===this||(this.lastPutMode=d.checkPull(this,f,t,i))&&m.checkPut(this,f,t,i))){var M=this._getDirection(i,c);if(o=Bt(t),r)return this._hideClone(),e=n,s?n.insertBefore(t,s):n.appendChild(t),H(!0);var L=Gt(l);if(!L||function(t,e,i){var o=Bt(Gt(i)),n="vertical"===e?t.clientY:t.clientX,s="vertical"===e?t.clientX:t.clientY,a="vertical"===e?o.bottom:o.right,r="vertical"===e?o.left:o.top,l="vertical"===e?o.right:o.bottom;return"vertical"===e?s>l+10||s<=l&&n>a&&s>=r:n>a&&s>r||n<=a&&s>l+10}(i,M,l)&&!L.animated){if(L&&l===i.target&&(c=L),c&&(a=Bt(c)),_?f._hideClone():f._showClone(this),!1!==bt(n,l,t,o,c,a,i,!!c))return l.appendChild(t),e=l,S=null,W(),H(!0)}else if(c&&c!==t&&c.parentNode===l){var b,R=0,I=c.sortableMouseAligned,T=t.parentNode!==l,k="vertical"===M?"top":"left",O=zt(c,"top")||zt(t,"top"),U=O?O.scrollTop:void 0;if(E!==c&&(w=null,b=Bt(c)[k],G=!1),function(e,i,o){var n=e===t&&S||Bt(e),s=i===t&&S||Bt(i),a="vertical"===o?n.left:n.top,r="vertical"===o?n.right:n.bottom,l="vertical"===o?n.width:n.height,c="vertical"===o?s.left:s.top,u="vertical"===o?s.right:s.bottom,h="vertical"===o?s.width:s.height;return a===c||r===u||a+l/2===c+h/2}(t,c,M)&&I||T||O||h.invertSwap||"insert"===w||"swap"===w?("swap"!==w&&(A=h.invertSwap||T),R=function(e,i,o,n,s,a,r){var l=Bt(i),c="vertical"===o?e.clientY:e.clientX,u="vertical"===o?l.height:l.width,h="vertical"===o?l.top:l.left,d="vertical"===o?l.bottom:l.right,p=Bt(t),m=!1;if(!a)if(r&&C<u*n)if(!G&&(1===P?c>h+u*s/2:c<d-u*s/2)&&(G=!0),G)m=!0;else{"vertical"===o?p.top:p.left,"vertical"===o?p.bottom:p.right;if(1===P?c<h+C:c>d-C)return-1*P}else if(c>h+u*(1-n)/2&&c<d-u*(1-n)/2)return At(i);if((m=m||a)&&(c<h+u*s/2||c>d-u*s/2))return c>h+u/2?1:-1;return 0}(i,c,M,h.swapThreshold,null==h.invertedSwapThreshold?h.swapThreshold:h.invertedSwapThreshold,A,E===c),w="swap"):(R=At(c),w="insert"),0===R)return H(!1);S=null,E=c,P=R,a=Bt(c);var F=c.nextElementSibling,B=!1,z=bt(n,l,t,o,c,a,i,B=1===R);if(!1!==z)return 1!==z&&-1!==z||(B=1===z),Q=!0,j(xt,30),_?f._hideClone():f._showClone(this),B&&!F?l.appendChild(t):c.parentNode.insertBefore(t,B?F:c),O&&at(O,0,U-O.scrollTop),e=t.parentNode,void 0===b||A||(C=$(b-Bt(c)[k])),W(),H(!0)}if(l.contains(t))return H(!1)}return q&&!i.rootEl&&dt(l,i,"_onDragOver"),!1}function H(e){return e&&(_?f._hideClone():f._showClone(v),f&&(wt(t,p?p.options.ghostClass:f.options.ghostClass,!1),wt(t,h.ghostClass,!0)),p!==v&&v!==gt.active?p=v:v===gt.active&&(p=null),o&&v._animate(o,t),c&&a&&v._animate(a,c)),(c===t&&!t.animated||c===l&&!c.animated)&&(E=null),h.dragoverBubble||i.rootEl||c===N||(v._handleAutoScroll(i),t.parentNode[D]._computeIsAligned(i)),!h.dragoverBubble&&i.stopPropagation&&i.stopPropagation(),!0}function W(){Lt(v,n,"change",c,l,n,u,kt(t,h.draggable),i)}},_animate:function(e,i){var o=this.options.animation;if(o){var n=Bt(i);if(i===t&&(S=n),1===e.nodeType&&(e=Bt(e)),e.left+e.width/2!==n.left+n.width/2||e.top+e.height/2!==n.top+n.height/2){var s=Mt(this.el),a=s&&s.a,r=s&&s.d;Ct(i,"transition","none"),Ct(i,"transform","translate3d("+(e.left-n.left)/(a||1)+"px,"+(e.top-n.top)/(r||1)+"px,0)"),i.offsetWidth,Ct(i,"transition","transform "+o+"ms"+(this.options.easing?" "+this.options.easing:"")),Ct(i,"transform","translate3d(0,0,0)")}"number"==typeof i.animated&&clearTimeout(i.animated),i.animated=j((function(){Ct(i,"transition",""),Ct(i,"transform",""),i.animated=!1}),o)}},_offUpEvents:function(){var t=this.el.ownerDocument;Pt(N,"touchmove",this._onTouchMove),Pt(N,"pointermove",this._onTouchMove),Pt(t,"mouseup",this._onDrop),Pt(t,"touchend",this._onDrop),Pt(t,"pointerup",this._onDrop),Pt(t,"touchcancel",this._onDrop),Pt(N,"selectstart",this)},_onDrop:function(a){var r=this.el,l=this.options;R=!1,b=!1,A=!1,G=!1,clearInterval(this._loopId),clearInterval(m),lt(),clearTimeout(ft),ft=void 0,clearTimeout(this._dragStartTimer),Ft(this._cloneId),Ft(this._dragStartId),Pt(N,"mousemove",this._onTouchMove),this.nativeDraggable&&(Pt(N,"drop",this),Pt(r,"dragstart",this._onDragStart),Pt(N,"dragover",this._handleAutoScroll),Pt(N,"dragover",ut)),V&&Ct(N.body,"user-select",""),this._offUpEvents(),a&&(y&&(a.cancelable&&a.preventDefault(),!l.dropBubble&&a.stopPropagation()),i&&i.parentNode&&i.parentNode.removeChild(i),(n===e||p&&"clone"!==p.lastPutMode)&&o&&o.parentNode&&o.parentNode.removeChild(o),t&&(this.nativeDraggable&&Pt(t,"dragend",this),Rt(t),t.style["will-change"]="",wt(t,p?p.options.ghostClass:this.options.ghostClass,!1),wt(t,this.options.chosenClass,!1),Lt(this,n,"unchoose",t,e,n,u,null,a),n!==e?((h=kt(t,l.draggable))>=0&&(Lt(null,e,"add",t,e,n,u,h,a),Lt(this,n,"remove",t,e,n,u,h,a),Lt(null,e,"sort",t,e,n,u,h,a),Lt(this,n,"sort",t,e,n,u,h,a)),p&&p.save()):t.nextSibling!==s&&(h=kt(t,l.draggable))>=0&&(Lt(this,n,"update",t,e,n,u,h,a),Lt(this,n,"sort",t,e,n,u,h,a)),gt.active&&(null!=h&&-1!==h||(h=u),Lt(this,n,"end",t,e,n,u,h,a),this.save()))),this._nulling()},_nulling:function(){n=t=e=i=s=o=a=r=l=L.length=m=f=_=g=v=y=h=u=E=P=S=p=d=gt.active=null,it.forEach((function(t){t.checked=!0})),it.length=0},handleEvent:function(e){switch(e.type){case"drop":case"dragend":this._onDrop(e);break;case"dragenter":case"dragover":t&&(this._onDragOver(e),function(t){t.dataTransfer&&(t.dataTransfer.dropEffect="move");t.cancelable&&t.preventDefault()}(e));break;case"selectstart":e.preventDefault()}},toArray:function(){for(var t,e=[],i=this.el.children,o=0,n=i.length,s=this.options;o<n;o++)vt(t=i[o],s.draggable,this.el,!1)&&e.push(t.getAttribute(s.dataIdAttr)||Tt(t));return e},sort:function(t){var e={},i=this.el;this.toArray().forEach((function(t,o){var n=i.children[o];vt(n,this.options.draggable,i,!1)&&(e[t]=n)}),this),t.forEach((function(t){e[t]&&(i.removeChild(e[t]),i.appendChild(e[t]))}))},save:function(){var t=this.options.store;t&&t.set&&t.set(this)},closest:function(t,e){return vt(t,e||this.options.draggable,this.el,!1)},option:function(t,e){var i=this.options;if(void 0===e)return i[t];i[t]=e,"group"===t&&ct(i)},destroy:function(){var t=this.el;t[D]=null,Pt(t,"mousedown",this._onTapStart),Pt(t,"touchstart",this._onTapStart),Pt(t,"pointerdown",this._onTapStart),this.nativeDraggable&&(Pt(t,"dragover",this),Pt(t,"dragenter",this)),Array.prototype.forEach.call(t.querySelectorAll("[draggable]"),(function(t){t.removeAttribute("draggable")})),this._onDrop(),I.splice(I.indexOf(this.el),1),this.el=t=null},_hideClone:function(){o.cloneHidden||(Ct(o,"display","none"),o.cloneHidden=!0,o.parentNode&&this.options.removeCloneOnHide&&o.parentNode.removeChild(o))},_showClone:function(e){"clone"===e.lastPutMode?o.cloneHidden&&(n.contains(t)&&!this.options.group.revertClone?n.insertBefore(o,t):s?n.insertBefore(o,s):n.appendChild(o),this.options.group.revertClone&&this._animate(t,o),Ct(o,"display",""),o.cloneHidden=!1):this._hideClone()}},Et(N,"touchmove",(function(t){(gt.active||R)&&t.cancelable&&t.preventDefault()})),gt.utils={on:Et,off:Pt,css:Ct,find:St,is:function(t,e){return!!vt(t,e,t,!1)},extend:Nt,throttle:Ot,closest:vt,toggleClass:wt,clone:Ut,index:kt,nextTick:jt,cancelNextTick:Ft,detectDirection:ot,getChild:It},gt.create=function(t,e){return new gt(t,e)},gt.version="1.8.4",gt}))},function(t,e,i){"use strict";i.r(e);var o=i(2),n=i.n(o),s=i(34),a=i(40),r=i(140),l=i(36),c=i(142),u=i(146);function h(t){return(h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var d=s.default.getLogger("Isocurve"),p=n.a.Control.extend({includes:u.default,options:{position:"topleft",collapsed:!0,methods:["time","distance"],graphs:["Voiture","Pieton"],exclusions:{toll:!1,tunnel:!1,bridge:!1},directions:["departure","arrival"],disableReverse:!1,isocurveOptions:{},autocompleteOptions:{}},initialize:function(t){n.a.Util.setOptions(this,t),this._uid=l.default.generate(),this._isDesktop=this._detectSupport(),this._waitingContainer=null,this._showContainer=null,this._pictoContainer=null,this._formContainer=null,this._submitContainer=null,this._currentTransport=null,this._currentDirection=null,this._currentComputation=null,this._currentTimeHour=0,this._currentTimeMinute=0,this._currentDistance=0,this._currentExclusions=[],this._initTransport(),this._initComputation(),this._initDirection(),this._initExclusions(),this._currentPoint=null,this._geojsonIso=null,this._waiting=!1,this._timer=null,this._currentIsoResults=null,this._resources={},this._noRightManagement=!1,this._checkRightsManagement()},onAdd:function(t){var e=this._container=this._initLayout(t);return n.a.DomEvent.disableClickPropagation(e).disableScrollPropagation(e),e},onRemove:function(){},_initTransport:function(){this._currentTransport="Voiture";var t=this.options.graphs;t&&0!==t.length||(this.options.graphs=["Voiture","Pieton"]),n.a.Util.isArray(t)&&t.length&&("Voiture"!==t[0]&&"Pieton"!==t[0]||(this._currentTransport=t[0]));var e=this.options.isocurveOptions;e.graph&&(this._currentTransport=e.graph)},_initDirection:function(){this._currentDirection="departure";var t=this.options.directions;t&&0!==t.length||(this.options.directions=["departure","arrival"]),n.a.Util.isArray(t)&&t.length&&("departure"!==t[0]&&"arrival"!==t[0]||(this._currentDirection=t[0]));var e=this.options.isocurveOptions;e.reverse||(this._currentDirection="departure"),!0===e.reverse&&(this._currentDirection="arrival",this.options.directions=["arrival","departure"])},_initComputation:function(){this._currentComputation="time";var t=this.options.methods;t&&0!==t.length||(this.options.methods=["time","distance"]),n.a.Util.isArray(t)&&t.length&&("time"!==t[0]&&"distance"!==t[0]||(this._currentComputation=t[0]));var e=this.options.isocurveOptions;e.method&&(this._currentComputation=e.method),e.time&&(this._currentComputation="time"),e.distance&&(this._currentComputation="distance")},_initExclusions:function(){this._currentExclusions=[];var t=this.options.exclusions;if((!t||"object"===h(t)&&0===Object.keys(t).length)&&(this.options.exclusions={toll:!1,tunnel:!1,bridge:!1}),t&&"object"===h(t)&&Object.keys(t).length)for(var e in t)t.hasOwnProperty(e)&&t.k&&this._currentExclusions.push(e);var i=this.options.isocurveOptions;Array.isArray(i.exclusions)&&(this._currentExclusions=i.exclusions)},_checkRightsManagement:function(){var t=null,e=[],i=null;i=this.options.isocurveOptions.apiKey,(e=(t=this.options.isocurveOptions.filterOptions)?t.type:[])&&0!==e.length||(e=["Voiture","Pieton"]);var o=r.default.check({key:i||this.options.apiKey,resources:e,services:["Isochrone"]});d.log("rightManagementIsochrone",o),i=this.options.autocompleteOptions.apiKey,(e=(t=this.options.autocompleteOptions.filterOptions)?t.type:[])&&0!==e.length||(e=["PositionOfInterest","StreetAddress"]);var n=r.default.check({key:i||this.options.apiKey,resources:e,services:["AutoCompletion"]});d.log("rightManagementAutoComplete",n),o||n||(this._noRightManagement=!0),n&&(this._resources.AutoCompletion={},this._resources.AutoCompletion.resources=n.AutoCompletion,this._resources.AutoCompletion.key=n.key),o&&(this._resources.Isochrone={},this._resources.Isochrone.resources=o.Isochrone,this._resources.Isochrone.key=o.key)},_detectSupport:function(){var t=!0,e=window.navigator.userAgent.toLowerCase();return-1===e.indexOf("iphone")&&-1===e.indexOf("ipod")&&-1===e.indexOf("ipad")&&-1===e.indexOf("android")&&-1===e.indexOf("mobile")&&-1===e.indexOf("blackberry")&&-1===e.indexOf("tablet")&&-1===e.indexOf("phone")&&-1===e.indexOf("touch")||(t=!1),-1===e.indexOf("msie")&&-1===e.indexOf("trident")||(t=!0),t},_initLayout:function(t){var e=this._createMainContainerElement(),i=this._showContainer=this._createShowIsoElement();e.appendChild(i),this.options.collapsed||(i.checked=!0);var o=this._pictoContainer=this._createShowIsoPictoElement();e.appendChild(o);var n=this._createIsoPanelElement(),s=this._createIsoPanelHeaderElement();n.appendChild(s);var a=this._formContainer=this._createIsoPanelFormElement(),r=this._createIsoPanelFormPointElement(t);a.appendChild(r);for(var l=!1,c=!1,u=this._createIsoPanelFormTypeChoiceElement(),d=0;d<this.options.methods.length;d++)"time"===this.options.methods[d]&&(l=0===d,u.appendChild(this._createIsoPanelFormTypeChoiceChronElement(l))),"distance"===this.options.methods[d]&&(c=0===d,u.appendChild(this._createIsoPanelFormTypeChoiceDistElement(c)));a.appendChild(u),a.appendChild(this._createIsoPanelFormValueIsochronElement(l)),a.appendChild(this._createIsoPanelFormValueIsodistanceElement(c));var p=this._createIsoPanelFormModeChoiceElement();if(p.appendChild(this._createIsoPanelFormModeChoiceTransportElement(this.options.graphs)),p.appendChild(this._createIsoPanelFormModeChoiceDirectionElement(this.options.directions)),a.appendChild(p),this.options.exclusions&&"object"===h(this.options.exclusions)&&0!==Object.keys(this.options.exclusions).length){a.appendChild(this._createShowIsoExclusionsElement()),a.appendChild(this._createShowIsoExclusionsPictoElement());var m=this._createIsoPanelFormExclusionsElement();m.appendChild(this._createIsoPanelFormExclusionOptionsElement(this.options.exclusions)),a.appendChild(m)}var f=this._createIsoFormResetElement();a.appendChild(f);var _=this._submitContainer=this._createIsoSubmitFormElement();a.appendChild(_),n.appendChild(a);var g=this._waitingContainer=this._createIsoWaitingElement();return n.appendChild(g),e.appendChild(n),e},_createIsoPanelFormPointElement:function(t){return this._currentPoint=new c.default({apiKey:this.options.apiKey||null,tag:{id:0,unique:this._uid,label:"Départ",color:"red",display:!0},displayInfo:!0,disableReverse:this.options.disableReverse,autocompleteOptions:this.options.autocompleteOptions||null}),this._currentPoint.setMap(t),this._currentPoint.getContainer()},onShowIsoPanelClick:function(t){d.log("onShowIsoPanelClick",t)},onIsoResetClick:function(t){d.log("onIsoResetClick",t),this._clear()},onIsoTypeChoiceChange:function(t){var e=t.target.value;e&&("isodistance"===e&&(this._currentComputation="distance"),"isochron"===e&&(this._currentComputation="time"))},onIsoModeTransportChange:function(t){var e=t.target.value;e&&(this._currentTransport=e)},onIsoModeDirectionChange:function(t){var e=t.target.value;e&&(this._currentDirection=e)},onIsoValueChronTimeHourChange:function(t){var e=t.target.value;this._timeHourContainer=t.target,e&&(this._currentTimeHour=e)},onIsoValueChronTimeMinuteChange:function(t){var e=t.target.value;this._timeMinuteContainer=t.target,e&&(this._currentTimeMinute=e)},onIsoValueDistChange:function(t){var e=t.target.value;this._distanceContainer=t.target,e&&(this._currentDistance=e)},onIsoExclusionsChange:function(t){var e=t.target.value,i=t.target.checked;if(e){for(var o=!1,n=null,s=0;s<this._currentExclusions.length;s++)this._currentExclusions[s]===e&&(n=s,o=!0);o||i||this._currentExclusions.push(e),o&&i&&this._currentExclusions.splice(n,1)}},onIsoComputationSubmit:function(){var t,e;if(this._currentPoint&&this._currentPoint.getCoordinate&&this._currentPoint.getCoordinate())if("time"===this._currentComputation.toLowerCase()&&(t=3600*this._currentTimeHour+60*this._currentTimeMinute,d.log("time : ",t)),"distance"===this._currentComputation.toLowerCase()&&(e=1e3*this._currentDistance,d.log("distance : ",e)),t||e){if(!this._noRightManagement){this._displayWaitingContainer();var i=this;this._requestIsoCurve({position:i._currentPoint.getCoordinate(),graph:i._currentTransport,exclusions:i._currentExclusions,method:i._currentComputation,reverse:"arrival"===i._currentDirection.toLowerCase(),time:t,distance:e,smoothing:!0,timeout:7e3,protocol:"XHR",onSuccess:function(t){d.log(t),t&&i._drawIsoResults(t)},onFailure:function(t){i._hideWaitingContainer(),i._clearIsoResultsGeometry(),d.log(t.message)}})}}else d.log("Missing time or distance parameter")},_requestIsoCurve:function(t){if(t&&("object"!==h(t)||0!==Object.keys(t).length)&&t.position&&!this._noRightManagement){var e=this._resources.Isochrone;if(e){var i=e.resources;if(i&&("object"!==h(i)||0!==Object.keys(i).length)){var o={};n.a.Util.extend(o,t),n.a.Util.extend(o,this.options.isocurveOptions);for(var s=!1,r=0;r<i.length;r++)i[r]===o.graph&&(s=!0);if(s){var l=this._resources.Isochrone.key;o.apiKey=this.options.isocurveOptions.apiKey||this.options.apiKey||l,o.ssl=this.options.ssl,d.log(o),a.default.Services.isoCurve(o)}else d.log("no rights for this service !?")}}}},_drawIsoResults:function(t){if(this._clearIsoResultsGeometry(),this._currentIsoResults=t,t.geometry){var e=this._map,i=t.geometry;this._geojsonIso=n.a.geoJson(i,{style:{color:"#ff7800",weight:5,opacity:.65}}).addTo(e),this._hideWaitingContainer(),this._formContainer.className="GPisochroComponentHidden"}else this._hideWaitingContainer()},_clear:function(){this._initTransport(),this._initExclusions(),this._initComputation(),this._initDirection(),this._currentIsoResults=null,this._clearIsoResultsGeometry(),this._currentPoint.clear(),this._timeHourContainer&&(this._timeHourContainer.value=0),this._timeMinuteContainer&&(this._timeMinuteContainer.value=0),this._distanceContainer&&(this._distanceContainer.value=0)},_clearIsoResultsGeometry:function(){var t=this._map;null!=this._geojsonIso&&(t.removeLayer(this._geojsonIso),this._geojsonIso=null)},_displayWaitingContainer:function(){this._waitingContainer.className="GPisochronCalcWaitingContainerVisible",this._waiting=!0,this._timer&&(clearTimeout(this._timer),this._timer=null);var t=this;this._timer=setTimeout((function(){!0===t._waiting?t._hideWaitingContainer():t._timer&&clearTimeout(t._timer)}),16e3)},_hideWaitingContainer:function(){this._waiting&&(this._waitingContainer.className="GPisochronCalcWaitingContainerHidden",this._waiting=!1,clearTimeout(this._timer),this._timer=null)},compute:function(t,e,i){this._showContainer.checked||this._pictoContainer.click();var o=this._map;if(o){var s={direction:"departure",method:"time",transport:"Voiture",exclusions:[]};if(n.a.Util.extend(s,i),this._currentPoint.setCoordinate(t),n.a.DomUtil.get("GPlocationOrigin_0-"+this._uid).value=t.lng+" , "+t.lat,this._currentTransport=s.transport,"Voiture"===s.transport?n.a.DomUtil.get("GPisochronTransportCar-"+this._uid).checked=!0:n.a.DomUtil.get("GPisochronTransportPedestrian-"+this._uid).checked=!0,this._currentExclusions=s.exclusions,this._currentComputation=s.method,"time"===s.method){var a=e.split(".");this._currentTimeHour=a[0]||0,n.a.DomUtil.get("GPisochronValueChronInput1-"+this._uid).value=this._currentTimeHour,this._currentTimeMinute=a[1]||0,n.a.DomUtil.get("GPisochronValueChronInput2-"+this._uid).value=this._currentTimeMinute,n.a.DomUtil.get("GPisochronChoiceAltChron-"+this._uid).click()}else this._currentDistance=e,n.a.DomUtil.get("GPisochronValueDistInput-"+this._uid).value=this._currentDistance,n.a.DomUtil.get("GPisochronChoiceAltDist-"+this._uid).click();this._currentDirection=s.direction,n.a.DomUtil.get("GPisochronDirectionSelect-"+this._uid).selectedIndex="departure"===s.direction?0:1,this.onIsoComputationSubmit(),o.flyTo(t)}}});e.default=p},function(t,e,i){"use strict";i.r(e),i.d(e,"servicesVersion",(function(){return k})),i.d(e,"servicesDate",(function(){return D}));var o=i(41),n=i(56),s=i(68),a=i(69),r=i(117),l=i(118),c=i(73),u=i(74),h=i(75),d=i(76),p=i(77),m=i(78),f=i(79),_=i(80),g=i(81),v=i(82),y=i(83),E=i(85),P=i(86),w=i(84),C=i(107),M=i(109),S=i(108),L=i(114),b=i(139),R=i(131),x=i(132),I=i(49),G=i(45),A=i(47),T=i(57);const k=T.version,D=T.date;var O={};O.servicesVersion=k,O.servicesDate=D,O.Protocols={},O.Protocols.XHR=I.default,O.Services=o.default,O.Services.DefaultUrl=n.default,O.Services.AltiResponse=s.default,O.Services.Alti={},O.Services.Alti.Elevation=a.default,O.Services.AutoCompleteResponse=r.default,O.Services.AutoComplete={},O.Services.AutoComplete.SuggestedLocation=l.default,O.Services.GetConfigResponse=c.default,O.Services.Config={},O.Services.Config.Constraint=u.default,O.Services.Config.Format=h.default,O.Services.Config.Layer=d.default,O.Services.Config.Legend=p.default,O.Services.Config.Metadata=m.default,O.Services.Config.Originator=f.default,O.Services.Config.Service=_.default,O.Services.Config.Style=g.default,O.Services.Config.Territory=v.default,O.Services.Config.Thematic=y.default,O.Services.Config.TileMatrix=E.default,O.Services.Config.TileMatrixLimit=P.default,O.Services.Config.TileMatrixSet=w.default,O.Services.GeocodeResponse=C.default,O.Services.Geocode={},O.Services.Geocode.GeocodedLocation=M.default,O.Services.Geocode.DirectGeocodedLocation=S.default,O.Services.Geocode.ReverseGeocodedLocation=L.default,O.Services.IsoCurveResponse=b.default,O.Services.RouteResponse=R.default,O.Services.Route={},O.Services.Route.RouteInstruction=x.default,O.Error=G.default,O.Helper=A.default,e.default=O},function(t,e,i){"use strict";i.r(e);var o=i(42),n=i(70),s=i(87),a=i(110),r=i(115),l=i(119),c=i(134),u={getConfig:function(t){new n.default(t).call()},getAltitude:function(t){new o.default(t).call()},geocode:function(t){new s.default(t).call()},reverseGeocode:function(t){new a.default(t).call()},autoComplete:function(t){new r.default(t).call()},route:function(t){new l.default(t).call()},isoCurve:function(t){new c.default(t).call()}};e.default=u},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(45),a=i(46),r=i(56),l=i(58),c=i(65);function u(t){if(!(this instanceof u))throw new TypeError(n.default.getMessage("CLASS_CONSTRUCTOR","Alti"));if(this.CLASSNAME="Alti",a.default.apply(this,arguments),this.logger=o.default.getLogger("Gp.Services.Alti"),this.logger.trace("[Constructeur Alti (options)]"),!t.positions)throw new Error(n.default.getMessage("PARAM_MISSING","positions"));if(0===t.positions.length)throw new Error(n.default.getMessage("PARAM_EMPTY","positions"));if(this.options.positions=t.positions,this.options.outputFormat="string"==typeof t.outputFormat?t.outputFormat.toLowerCase():"xml",this.options.sampling=t.sampling||null,this.options.api="string"==typeof t.api?t.api.toUpperCase():"REST","REST"===this.options.api&&(this.options.httpMethod="GET"),this.options.zonly=t.zonly||!1,!this.options.serverUrl){var e=r.default.Alti.url(this.options.apiKey),i=null;switch(this.options.api){case"WPS":i=e.wps;break;case"REST":i=e[(t.sampling?"profil":"elevation")+"-"+this.options.outputFormat];break;default:throw new Error(n.default.getMessage("PARAM_UNKNOWN","api"))}if(!i)throw new Error("Url by default not found !");this.options.serverUrl=i,this.logger.trace("Server URL by default : "+this.options.serverUrl)}var s=this.options.serverUrl.lastIndexOf(".");if(-1!==s){var l=this.options.serverUrl.substring(s+1);if(l&&l.length<5)switch(this.logger.trace("Server Extension URL : "+l),l.toLowerCase()){case"json":case"xml":this.options.outputFormat=l.toLowerCase();break;default:throw new Error("type of service : unknown or unsupported (json or xml) !")}}}u.prototype=Object.create(a.default.prototype,{}),u.prototype.constructor=u,u.prototype.buildRequest=function(t,e){var i={httpMethod:this.options.httpMethod,onSuccess:function(t){this.request=t,e.call(this,this.request)},onError:t,scope:this,positions:this.options.positions,outputFormat:this.options.outputFormat,sampling:this.options.sampling,api:this.options.api,zonly:this.options.zonly};l.default.build(i)},u.prototype.analyzeResponse=function(t,e){if(this.response){var i={response:this.response,outputFormat:this.options.outputFormat,rawResponse:this.options.rawResponse,onError:t,onSuccess:e,scope:this};c.default.build(i)}else t.call(this,new s.default(n.default.getMessage("SERVICE_RESPONSE_EMPTY")))},e.default=u},function(t,e,i){"use strict";i.r(e);var o=i(35),n={getLogger:function(t){"false".match(/true/)?o.disableAll():o.enableAll();var e=t||"default";return o.getLogger(e)}};e.default=n},function(t,e,i){"use strict";i.r(e);var o={PARAM_MISSING:"Parameter(s) '%var%' missing",PARAM_EMPTY:"Parameter(s) '%var%' empty",PARAM_TYPE:"Wrong type(s) for parameter(s) '%var%'",PARAM_FORMAT:"Parameter(s) '%var%' not correctly formatted",PARAM_NOT_SUPPORT:"Value(s) for parameter(s) '%var%' not supported",PARAM_NOT_SUPPORT_NODEJS:"Value(s) for parameter(s) '%var%' not supported to NodeJS",PARAM_UNKNOWN:"Value(s) for parameter(s) '%var%' unknown",SERVICE_REQUEST_BUILD:"An error occurred during the request building of the service",SERVICE_REQUEST_EMPTY:"The request sent to the service is empty",SERVICE_RESPONSE_EXCEPTION:"The service returned an exception : '%var%'",SERVICE_RESPONSE_EXCEPTION_2:"The service returned an exception",SERVICE_RESPONSE_ANALYSE:"An error occurred while parsing the response '%var%' of the service",SERVICE_RESPONSE_ANALYSE_2:"An unknown error occurred while parsing the response",SERVICE_RESPONSE_EMPTY:"The response of the service is empty",SERVICE_RESPONSE_EMPTY_2:"The response from the service could not be analyzed or is empty",SERVICE_RESPONSE_FORMAT:"The format of the service response is not supported (handled format(s) : '%var%')",SERVICE_RESPONSE_FORMAT_2:"The format of the service response is not supported",SERVICE_RESPONSE_FORMAT_3:"No suggestion matching the search",CLASS_CONSTRUCTOR:"'%var%' constructor cannot be called as a function.",getMessage:function(t,e){if(0===Object.keys(arguments).length)return"Message indefined !";var i=Array.prototype.slice.call(arguments),o=i.shift(),n=i,s=this[o];try{s=Array.isArray(n)&&n.length>0?s.replace("%var%",n.join(" - ")):s.replace("%var%","%var% (not specified)")}catch(t){}return s}};e.default=o},function(t,e,i){"use strict";function o(t){if(!(this instanceof o))throw new TypeError("ErrorService constructor cannot be called as a function.");var e=t;"string"==typeof t||t instanceof String?(this.message=t,this.status=-1,this.type=o.TYPE_UNKERR):(this.message=e.message||"undefined!?",this.type=e.type,this.status=e.status||-1),this.name="ErrorService",this.stack=(new Error).stack}i.r(e),o.TYPE_SRVERR="SERVICE_ERROR",o.TYPE_USEERR="USAGE_ERROR",o.TYPE_UNKERR="UNKNOWN_ERROR",o.prototype=Object.create(Error.prototype,{constructor:{value:o,writable:!0,configurable:!0}}),e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(47),s=i(44),a=i(48),r=i(45),l=i(56),c=i(57);function u(t){if(!(this instanceof u))throw new TypeError(s.default.getMessage("CLASS_CONSTRUCTOR"));for(var e in this.logger=o.default.getLogger("CommonService"),this.logger.trace("[Constructeur CommonService (options)]"),this.options={protocol:"XHR",ssl:!0,proxyURL:"",callbackSuffix:null,httpMethod:"GET",timeOut:0,rawResponse:!1,scope:this,onSuccess:function(t){console.log("onSuccess - la reponse est la suivante : ",t)},onFailure:function(t){200!==t.status&&t.status?console.log("onFailure - Erreur (",t.status,") : ",t.message):console.log("onFailure : ",t.message)}},t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);if(!this.options.apiKey&&!this.options.serverUrl)throw new Error(s.default.getMessage("PARAM_MISSING","apiKey","serverUrl"));if(this.options.rawResponse&&!this.options.onSuccess&&(this.options.onSuccess=function(t){console.log("onSuccess - la réponse brute du service est la suivante : ",t)}),!!(null===this.options.onSuccess||"function"!=typeof this.options.onSuccess))throw new Error(s.default.getMessage("PARAM_MISSING","onSuccess()"));if(!this.options.serverUrl){l.default.ssl=this.options.ssl;var i=l.default[this.CLASSNAME].url(this.options.apiKey);"string"==typeof i?this.options.serverUrl=i:this.logger.trace("URL par defaut à determiner au niveau du composant...")}switch(this.options.httpMethod="string"==typeof t.httpMethod?t.httpMethod.toUpperCase():"GET",this.options.httpMethod){case"POST":case"GET":break;case"PUT":case"DELETE":case"HEAD":case"OPTIONS":throw new Error(s.default.getMessage("PARAM_NOT_SUPPORT","httpMethod"));default:throw new Error(s.default.getMessage("PARAM_UNKNOWN","httpMethod"))}switch(this.options.protocol="string"==typeof t.protocol?t.protocol.toUpperCase():"XHR",this.options.protocol){case"JSONP":case"XHR":break;default:throw new Error(s.default.getMessage("PARAM_UNKNOWN","protocol"))}if("undefined"==typeof window&&"JSONP"===this.options.protocol)throw new Error(s.default.getMessage("PARAM_NOT_SUPPORT_NODEJS","protocol=JSONP (instead use XHR)"));"JSONP"===this.options.protocol&&(this.options.httpMethod="GET"),this.options.nocache=t.nocache||!1,this.options.outputFormat=null,this.request=null,this.response=null}u.prototype={constructor:u,call:function(){this.logger.trace("CommonService::call ()");var t=this;function e(e){this.logger.trace("CommonService::onBuildRequest : ",e),this.callService.call(t,n,i)}function i(e){this.logger.trace("CommonService::onCallService : ",e),this.analyzeResponse.call(t,n,o)}function o(t){if(this.logger.trace("CommonService::onAnalyzeResponse : ",t),!t)return n.call(this,new r.default("Analyse de la reponse en échec !?"));this.options.onSuccess.call(this,t)}function n(t){this.logger.trace("CommonService::onError()");var e=t;e instanceof r.default||(e=new r.default(t.message)),this.options.onFailure.call(this,e)}(function(){this.logger.trace("CommonService::run ()"),this.buildRequest.call(t,n,e)}).call(t)},buildRequest:function(t,e){this.logger.error("overwritten method !"),t&&t.call(this,"This method must be overwritten !"),e.call(this,"This method must be overwritten !")},callService:function(t,e){var i=null,o=this.request,s=!(!this.options.proxyURL||"XHR"!==this.options.protocol);this.options.serverUrl=n.default.normalyzeUrl(this.options.serverUrl,{"gp-access-lib":c.version},!1),s&&("GET"===this.options.httpMethod&&(i=this.options.proxyURL+n.default.normalyzeUrl(this.options.serverUrl,this.request,!0),o=null),"POST"===this.options.httpMethod&&(i=this.options.proxyURL+n.default.normalyzeUrl(this.options.serverUrl,null,!0),o=this.request));var l=this,u={url:i||this.options.serverUrl,method:this.options.httpMethod,protocol:this.options.protocol,timeOut:this.options.timeOut||0,format:this.options.outputFormat,nocache:this.options.nocache||!1,wrap:"XHR"!==this.options.protocol,callbackSuffix:this.options.callbackSuffix,data:o,headers:null,content:this.options.contentType||"application/xml",scope:this.options.scope||this,onResponse:function(i){l.logger.trace("callService::onResponse()");var o=null;if("XHR"===l.options.protocol&&(l.logger.trace("Response XHR",i),o=i),"JSONP"===l.options.protocol){if(l.logger.trace("Response JSON",i),!i)return void t.call(l,new r.default("Le contenu de la reponse est vide !?"));if(i.http){if(200!==i.http.status)return void t.call(l,new r.default({status:i.http.status,message:i.http.error,type:r.default.TYPE_SRVERR}));o=i.xml,l.options.rawResponse&&(o=i)}else o=i}if("function"==typeof l.options.onBeforeParse){var n=l.options.onBeforeParse(o);"string"==typeof n&&(o=n)}l.response=o,e.call(l,o)},onFailure:function(e){l.logger.trace("callService::onFailure()"),e.type=r.default.TYPE_SRVERR,t.call(l,new r.default(e))},onTimeOut:function(){l.logger.trace("callService::onTimeOut()"),t.call(l,new r.default("TimeOut!"))}};a.default.send(u)},analyzeResponse:function(t,e){this.logger.error("overwritten method !"),t&&t.call(this,"This method must be overwritten !"),e.call(this,"This method must be overwritten !")}},e.default=u},function(t,e,i){"use strict";i.r(e);var o={normalyzeParameters:function(t){var e=null;if(t){var i=[];for(var o in t)if(t.hasOwnProperty(o)){var n=t[o];n||(n=""),i.push(o+"="+n)}e=i.join("&")}return e},normalyzeUrl:function(t,e,i){var o=t;if(t){var n=t.indexOf("?");-1===n&&(o+="?"),-1!==n&&n!==t.length-1&&(o+="&")}return e&&(o+="string"==typeof e?e:this.normalyzeParameters(e)),i&&(o=encodeURIComponent(o)),o},indent:function(t,e){return new Array((t||0)+1).join("\t")+e}};e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(47),n=i(49),s=i(55),a={send:function(t){var e=t||{method:"GET",protocol:"XHR",timeOut:0,format:null,wrap:!0,nocache:!0,output:"json",callback:null,callbackSuffix:null};if("undefined"!=typeof window||"JSONP"!==t.protocol){if("XHR"===t.protocol||"json"===t.format?e.wrap=!1:"JSONP"===t.protocol&&"xml"===t.format&&(e.wrap=!0),e.callback=(t.protocol,null),e.output=e.wrap?"json":null,e.wrap){var i={};i.output=e.output,i.callback=e.callback,delete i.callback,e.url=o.default.normalyzeUrl(t.url,i)}switch(e.protocol){case"XHR":"GET"===t.method&&t.nocache&&(e.url=o.default.normalyzeUrl(e.url,{t:(new Date).getTime()})),n.default.call(e);break;case"JSONP":e.data&&(e.url=o.default.normalyzeUrl(e.url,e.data)),s.default.call(e);break;default:throw new Error("protocol not supported (XHR|JSONP) !")}}else console.log("Value (s) for parameter (s) 'protocol=JSONP (instead use XHR)' not supported to NodeJS")}};e.default=a},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(47),s=i(50),a=i.n(s),r={call:function(t){var e=o.default.getLogger("XHR");if(e.trace("[XHR::call()]"),a.a.polyfill(),!t.url)throw new Error("missing parameter : url is not defined !");if(!t.method)throw new Error("missing parameter : method is not defined !");t.format||(t.format="text");var i={};switch(i.url=t.url,i.data=t.data?t.data:null,i.method=t.method,i.timeOut=t.timeOut||0,i.scope=t.scope||this,i.proxy=t.proxy||null,i.content=t.content||null,i.headers=t.headers||{referer:"http://localhost"},t.method){case"DELETE":case"GET":break;case"PUT":case"POST":i.content=t.content?t.content:"application/x-www-form-urlencoded",i.headers=t.headers?t.headers:{referer:"http://localhost"};break;case"HEAD":case"OPTIONS":throw new Error("HTTP method not yet supported !");default:throw new Error("HTTP method unknown !")}switch(t.format){case"text":this.__call(i).then((function(i){e.trace(i),t.onResponse.call(this,i)})).catch((function(e){t.onFailure.call(this,e)}));break;case"json":this.__callJSON(i).then((function(i){e.trace(i),t.onResponse.call(this,i)})).catch((function(e){t.onFailure.call(this,e)}));break;case"xml":this.__callXML(i).then((function(i){e.trace(i),t.onResponse.call(this,i)})).catch((function(e){t.onFailure.call(this,e)}));break;default:throw new Error("This output Format is not yet supported !")}},__call:function(t){var e=o.default.getLogger("XHR");return e.trace("[XHR::__call()]"),new Promise((function(o,s){var a="POST"===t.method||"PUT"===t.method?1:0;t.data&&("object"==typeof t.data&&Object.keys(t.data).length||"string"==typeof t.data&&t.data.length)&&!a&&(t.url=n.default.normalyzeUrl(t.url,t.data)),e.trace("URL = ",t.url);var r=null;if("undefined"==typeof window){var l=i(53);t.data&&"string"==typeof t.data&&a&&(t.body=t.data),t.rejectUnauthorized=!1,l(t,(function(t,e,i){!t&&200===e.statusCode&&i?o(i):s("Errors Occured on Http Request (nodejs) : "+t)}))}else if(window.XMLHttpRequest){e.trace("XMLHttpRequest"),(r=new XMLHttpRequest).open(t.method,t.url,!0),r.overrideMimeType=t.content;var c=null;t.timeOut>0&&(e.trace("XHR - TimeOut actif !"),c=window.setTimeout((function(){s({message:"TimeOut Occured on Http Request with XMLHttpRequest !",status:-1})}),t.timeOut)),a&&(e.trace("data = ",t.data),r.setRequestHeader("Content-type",t.content)),r.onerror=function(t){console.log(t),s(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},r.ontimeout=function(t){console.log(t),s(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},r.onreadystatechange=function(t){if(4===r.readyState)if(200===r.status)window.clearTimeout(c),o(r.response);else{var e="Errors Occured on Http Request (status : '"+t.target.statusText+"' | url : '"+t.target.responseURL+"')",i=t.target.status;s({message:e,status:i})}};var u=t.data&&a?t.data:null;r.send(u)}else{if(!window.XDomainRequest)throw new Error("CORS not supported");e.trace("XDomainRequest"),(r=new XDomainRequest).open(t.method,t.url),r.overrideMimeType=t.content,t.timeOut>0&&(r.timeout=t.timeout,e.trace("XHR - TimeOut actif !")),a&&r.setRequestHeader("Content-type",t.content),r.onerror=function(){s(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},r.ontimeout=function(){s(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},r.onload=function(t){if(200===r.status)o(r.responseText);else{var e="Errors Occured on Http Request (status : '"+t.target.statusText+"' | url : '"+t.target.responseURL+"')",i=t.target.status;s({message:e,status:i})}};var h=t.data&&a?t.data:null;r.send(h)}}))},__callJSON:function(t){return this.__call(t).then(JSON.parse).catch((function(e){console.log("_callJSON failed on : ",t.url,e)}))},__callXML:function(t){return this.__call(t).then((function(t){var e;"undefined"==typeof window?e=(new(0,i(54).DOMParser)).parseFromString(t,"text/xml"):window.DOMParser?e=(new window.DOMParser).parseFromString(t,"text/xml"):((e=new window.ActiveXObject("Microsoft.XMLDOM")).async=!1,e.loadXML(t));return e})).catch((function(e){console.log("__callXML failed on : ",t.url,e)}))}};e.default=r},function(t,e,i){(function(e,i){
+/*!
+ * @overview es6-promise - a tiny implementation of Promises/A+.
+ * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
+ * @version   v4.2.8+1e68dce6
+ */var o;o=function(){"use strict";function t(t){return"function"==typeof t}var o=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},n=0,s=void 0,a=void 0,r=function(t,e){m[n]=t,m[n+1]=e,2===(n+=2)&&(a?a(f):E())},l="undefined"!=typeof window?window:void 0,c=l||{},u=c.MutationObserver||c.WebKitMutationObserver,h="undefined"==typeof self&&void 0!==e&&"[object process]"==={}.toString.call(e),d="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function p(){var t=setTimeout;return function(){return t(f,1)}}var m=new Array(1e3);function f(){for(var t=0;t<n;t+=2)(0,m[t])(m[t+1]),m[t]=void 0,m[t+1]=void 0;n=0}var _,g,v,y,E=void 0;function P(t,e){var i=this,o=new this.constructor(M);void 0===o[C]&&N(o);var n=i._state;if(n){var s=arguments[n-1];r((function(){return D(n,o,s,i._result)}))}else T(i,o,t,e);return o}function w(t){if(t&&"object"==typeof t&&t.constructor===this)return t;var e=new this(M);return x(e,t),e}h?E=function(){return e.nextTick(f)}:u?(g=0,v=new u(f),y=document.createTextNode(""),v.observe(y,{characterData:!0}),E=function(){y.data=g=++g%2}):d?((_=new MessageChannel).port1.onmessage=f,E=function(){return _.port2.postMessage(0)}):E=void 0===l?function(){try{var t=Function("return this")().require("vertx");return void 0!==(s=t.runOnLoop||t.runOnContext)?function(){s(f)}:p()}catch(t){return p()}}():p();var C=Math.random().toString(36).substring(2);function M(){}var S=void 0,L=1,b=2;function R(e,i,o){i.constructor===e.constructor&&o===P&&i.constructor.resolve===w?function(t,e){e._state===L?G(t,e._result):e._state===b?A(t,e._result):T(e,void 0,(function(e){return x(t,e)}),(function(e){return A(t,e)}))}(e,i):void 0===o?G(e,i):t(o)?function(t,e,i){r((function(t){var o=!1,n=function(t,e,i,o){try{t.call(e,i,o)}catch(t){return t}}(i,e,(function(i){o||(o=!0,e!==i?x(t,i):G(t,i))}),(function(e){o||(o=!0,A(t,e))}),t._label);!o&&n&&(o=!0,A(t,n))}),t)}(e,i,o):G(e,i)}function x(t,e){if(t===e)A(t,new TypeError("You cannot resolve a promise with itself"));else if(function(t){var e=typeof t;return null!==t&&("object"===e||"function"===e)}(e)){var i=void 0;try{i=e.then}catch(e){return void A(t,e)}R(t,e,i)}else G(t,e)}function I(t){t._onerror&&t._onerror(t._result),k(t)}function G(t,e){t._state===S&&(t._result=e,t._state=L,0!==t._subscribers.length&&r(k,t))}function A(t,e){t._state===S&&(t._state=b,t._result=e,r(I,t))}function T(t,e,i,o){var n=t._subscribers,s=n.length;t._onerror=null,n[s]=e,n[s+L]=i,n[s+b]=o,0===s&&t._state&&r(k,t)}function k(t){var e=t._subscribers,i=t._state;if(0!==e.length){for(var o=void 0,n=void 0,s=t._result,a=0;a<e.length;a+=3)o=e[a],n=e[a+i],o?D(i,o,n,s):n(s);t._subscribers.length=0}}function D(e,i,o,n){var s=t(o),a=void 0,r=void 0,l=!0;if(s){try{a=o(n)}catch(t){l=!1,r=t}if(i===a)return void A(i,new TypeError("A promises callback cannot return that same promise."))}else a=n;i._state!==S||(s&&l?x(i,a):!1===l?A(i,r):e===L?G(i,a):e===b&&A(i,a))}var O=0;function N(t){t[C]=O++,t._state=void 0,t._result=void 0,t._subscribers=[]}var U=function(){function t(t,e){this._instanceConstructor=t,this.promise=new t(M),this.promise[C]||N(this.promise),o(e)?(this.length=e.length,this._remaining=e.length,this._result=new Array(this.length),0===this.length?G(this.promise,this._result):(this.length=this.length||0,this._enumerate(e),0===this._remaining&&G(this.promise,this._result))):A(this.promise,new Error("Array Methods must be provided an Array"))}return t.prototype._enumerate=function(t){for(var e=0;this._state===S&&e<t.length;e++)this._eachEntry(t[e],e)},t.prototype._eachEntry=function(t,e){var i=this._instanceConstructor,o=i.resolve;if(o===w){var n=void 0,s=void 0,a=!1;try{n=t.then}catch(t){a=!0,s=t}if(n===P&&t._state!==S)this._settledAt(t._state,e,t._result);else if("function"!=typeof n)this._remaining--,this._result[e]=t;else if(i===j){var r=new i(M);a?A(r,s):R(r,t,n),this._willSettleAt(r,e)}else this._willSettleAt(new i((function(e){return e(t)})),e)}else this._willSettleAt(o(t),e)},t.prototype._settledAt=function(t,e,i){var o=this.promise;o._state===S&&(this._remaining--,t===b?A(o,i):this._result[e]=i),0===this._remaining&&G(o,this._result)},t.prototype._willSettleAt=function(t,e){var i=this;T(t,void 0,(function(t){return i._settledAt(L,e,t)}),(function(t){return i._settledAt(b,e,t)}))},t}(),j=function(){function e(t){this[C]=O++,this._result=this._state=void 0,this._subscribers=[],M!==t&&("function"!=typeof t&&function(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}(),this instanceof e?function(t,e){try{e((function(e){x(t,e)}),(function(e){A(t,e)}))}catch(e){A(t,e)}}(this,t):function(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}())}return e.prototype.catch=function(t){return this.then(null,t)},e.prototype.finally=function(e){var i=this.constructor;return t(e)?this.then((function(t){return i.resolve(e()).then((function(){return t}))}),(function(t){return i.resolve(e()).then((function(){throw t}))})):this.then(e,e)},e}();return j.prototype.then=P,j.all=function(t){return new U(this,t).promise},j.race=function(t){var e=this;return o(t)?new e((function(i,o){for(var n=t.length,s=0;s<n;s++)e.resolve(t[s]).then(i,o)})):new e((function(t,e){return e(new TypeError("You must pass an array to race."))}))},j.resolve=w,j.reject=function(t){var e=new this(M);return A(e,t),e},j._setScheduler=function(t){a=t},j._setAsap=function(t){r=t},j._asap=r,j.polyfill=function(){var t=void 0;if(void 0!==i)t=i;else if("undefined"!=typeof self)t=self;else try{t=Function("return this")()}catch(t){throw new Error("polyfill failed because global object is unavailable in this environment")}var e=t.Promise;if(e){var o=null;try{o=Object.prototype.toString.call(e.resolve())}catch(t){}if("[object Promise]"===o&&!e.cast)return}t.Promise=j},j.Promise=j,j},t.exports=o()}).call(this,i(51),i(52))},function(t,e){var i,o,n=t.exports={};function s(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function r(t){if(i===setTimeout)return setTimeout(t,0);if((i===s||!i)&&setTimeout)return i=setTimeout,setTimeout(t,0);try{return i(t,0)}catch(e){try{return i.call(null,t,0)}catch(e){return i.call(this,t,0)}}}!function(){try{i="function"==typeof setTimeout?setTimeout:s}catch(t){i=s}try{o="function"==typeof clearTimeout?clearTimeout:a}catch(t){o=a}}();var l,c=[],u=!1,h=-1;function d(){u&&l&&(u=!1,l.length?c=l.concat(c):h=-1,c.length&&p())}function p(){if(!u){var t=r(d);u=!0;for(var e=c.length;e;){for(l=c,c=[];++h<e;)l&&l[h].run();h=-1,e=c.length}l=null,u=!1,function(t){if(o===clearTimeout)return clearTimeout(t);if((o===a||!o)&&clearTimeout)return o=clearTimeout,clearTimeout(t);try{o(t)}catch(e){try{return o.call(null,t)}catch(e){return o.call(this,t)}}}(t)}}function m(t,e){this.fun=t,this.array=e}function f(){}n.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)e[i-1]=arguments[i];c.push(new m(t,e)),1!==c.length||u||r(p)},m.prototype.run=function(){this.fun.apply(null,this.array)},n.title="browser",n.browser=!0,n.env={},n.argv=[],n.version="",n.versions={},n.on=f,n.addListener=f,n.once=f,n.off=f,n.removeListener=f,n.removeAllListeners=f,n.emit=f,n.prependListener=f,n.prependOnceListener=f,n.listeners=function(t){return[]},n.binding=function(t){throw new Error("process.binding is not supported")},n.cwd=function(){return"/"},n.chdir=function(t){throw new Error("process.chdir is not supported")},n.umask=function(){return 0}},function(t,e){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(t){"object"==typeof window&&(i=window)}t.exports=i},function(t,i){t.exports=e},function(t,e){t.exports=i},function(t,e,i){"use strict";i.r(e);var o,n=i(43),s={uuid:(o=Math.floor(Date.now()),function(){return o++}),call:function(t){var e=n.default.getLogger("JSONP");if(e.trace("[JSONP::call ()]"),!t)throw e.error("missing parameter : options !"),new Error("missing parameter : options !");if(!t.url)throw e.error("missing parameter : options.url !"),new Error("missing parameter : options.url !");if(t.timeOut||(e.info("setting 'options.timeOut' default value"),t.timeOut=0),!t.onResponse)throw e.error("missing parameter : options.onResponse !"),new Error("missing parameter : options.onResponse !");var i="string"==typeof t.callbackSuffix?t.callbackSuffix:this.uuid(),o=!1,s=!1,a=t.url.indexOf("callback=");if(-1!==a){o=!0;var r=t.url.indexOf("&",a);-1===r&&(r=t.url.length);var l=t.url.substring(a+9,r);l&&(s=!0,t.callbackName=l,e.info("setting 'options.callbackName' value ("+t.callbackName+") from 'options.url' parameter"))}if(!o){var c=t.url.indexOf("?");-1===c?t.url=t.url+"?callback=":c===t.url.length?t.url=t.url+"callback=":t.url=t.url+"&callback=",e.info("setting callback default key in 'options.url' : "+t.url)}var u=!!t.callbackName||s;if(s||(t.callbackName||(e.info("setting 'options.callbackName' default value"),t.callbackName="callback",(i||""===i)&&(t.callbackName+=i)),t.url=t.url.replace("callback=","callback="+t.callbackName),e.info("setting callback function name in 'options.url' : "+t.url)),t.onTimeOut||(e.info("setting 'options.onTimeOut' default value"),t.onTimeOut=function(){console.log("TimeOut while invoking url : "+t.url)}),!u){var h=this,d=null;t.timeOut>0&&(d=window.setTimeout((function(){window[t.callbackName]=function(){},t.onTimeOut(),h._deleteScript(i)}),t.timeOut)),window[t.callbackName]=function(e){window.clearTimeout(d),t.onResponse(e),h._deleteScript(i)}}this._createScript(i,t.url)},_createScript:function(t,e){var i,o=document.getElementById("results"+t);(i=document.createElement("script")).setAttribute("type","text/javascript"),i.setAttribute("src",e),i.setAttribute("charset","UTF-8"),i.setAttribute("id","results"+t),i.setAttribute("async","true");var n=document.documentElement||document.getElementsByTagName("head")[0];null===o?n.appendChild(i):n.replaceChild(i,o)},_deleteScript:function(t){var e=document.getElementById("results"+t);if(e){var i=e.parentNode||document.documentElement;if(!i)return;i.removeChild(e)}}};e.default=s},function(t,e,i){"use strict";i.r(e);var o={ssl:!0,url:function(t,e){return(!1===o.ssl?"http://":"https://")+"wxs.ign.fr".concat("/",t,e)},Alti:{_key:{"elevation-json":"/alti/rest/elevation.json","elevation-xml":"/alti/rest/elevation.xml","profil-json":"/alti/rest/elevationLine.json","profil-xml":"/alti/rest/elevationLine.xml",wps:"/alti/wps"},url:function(t){return{"elevation-json":o.url(t,this._key["elevation-json"]),"elevation-xml":o.url(t,this._key["elevation-xml"]),"profil-json":o.url(t,this._key["profil-json"]),"profil-xml":o.url(t,this._key["profil-xml"]),wps:o.url(t,this._key.wps)}}},ProcessIsoCurve:{_key:{"iso-json":"/isochrone/isochrone.json","iso-xml":"/isochrone/isochrone.xml"},url:function(t){return{"iso-json":o.url(t,this._key["iso-json"]),"iso-xml":o.url(t,this._key["iso-xml"])}}},AutoComplete:{_key:"/ols/apis/completion",url:function(t){return o.url(t,this._key)}},ReverseGeocode:{_key:"/geoportail/ols",url:function(t){return o.url(t,this._key)}},AutoConf:{_key:{apiKey:"/autoconf",apiKeys:"/autoconf?keys=%KEYS%",aggregate:"/autoconf/id/"},url:function(t){var e="";if(Array.isArray(t)&&t.length>0){e=t[0];for(var i=1;i<t.length;i++)e+=","+t[i]}return{apiKey:o.url(t,this._key.apiKey),apiKeys:o.url(t[0],this._key.apiKeys).replace("%KEYS%",e),aggregate:o.url(t,this._key.aggregate)}}},Geocode:{_key:"/geoportail/ols",url:function(t){return o.url(t,this._key)}},Route:{_key:{ols:"/itineraire/ols","route-json":"/itineraire/rest/route.json","route-xml":"/itineraire/rest/route.xml"},url:function(t){return{ols:o.url(t,this._key.ols),"route-json":o.url(t,this._key["route-json"]),"route-xml":o.url(t,this._key["route-xml"])}}}};e.default=o},function(t){t.exports=JSON.parse('{"_from":"geoportal-access-lib@2.1.6","_id":"geoportal-access-lib@2.1.6","_inBundle":false,"_integrity":"sha512-zQpSjZq8YkGW+ooB1WloQd2KZHCKyg4/pbIFLSPCk3et2Zan/O2hZlKOf2alEX2zbsg7Wd+e8KiLc7cHZKniag==","_location":"/geoportal-access-lib","_phantomChildren":{},"_requested":{"type":"version","registry":true,"raw":"geoportal-access-lib@2.1.6","name":"geoportal-access-lib","escapedName":"geoportal-access-lib","rawSpec":"2.1.6","saveSpec":null,"fetchSpec":"2.1.6"},"_requiredBy":["/"],"_resolved":"https://registry.npmjs.org/geoportal-access-lib/-/geoportal-access-lib-2.1.6.tgz","_shasum":"8bb0d4cc7045c39c3392fe076ba699aace2b6066","_spec":"geoportal-access-lib@2.1.6","_where":"/home/runner/work/geoportal-extensions/geoportal-extensions","author":{"name":"IGNF"},"bugs":{"url":"https://github.com/IGNF/geoportal-access-lib/issues"},"bundleDependencies":false,"date":"03/10/2019","dependencies":{"es6-promise":"^4.2.4","request":"^2.87.0","xmldom":"^0.1.27"},"deprecated":false,"description":"French Geoportal resources access library","devDependencies":{"babel-core":"^6.26.3","babel-loader":"^7.1.2","babel-preset-env":"^1.7.0","chai":"^4.1.2","clean-webpack-plugin":"^0.1.18","copy-webpack-plugin":"^4.5.1","eslint":"^4.18.2","eslint-config-standard":"^11.0.0","eslint-loader":"^2.0.0","eslint-plugin-import":"^2.9.0","eslint-plugin-node":"^6.0.1","eslint-plugin-promise":"^3.7.0","eslint-plugin-standard":"^3.0.1","glob":"^7.1.2","handlebars-layouts":"^3.1.4","handlebars-webpack-plugin":"^1.4.1","html-webpack-plugin":"^2.30.1","istanbul-instrumenter-loader":"^3.0.1","jsdoc-webpack-plugin":"0.0.1","loglevel":"^1.6.1","mocha":"^4.0.0","mocha-loader":"^1.1.3","mocha-webpack":"^1.0.1","nyc":"^12.0.2","path":"^0.12.7","replace-bundle-webpack-plugin":"^1.0.0","sinon":"^4.3.0","sinon-es6":"0.0.3","speed-measure-webpack-plugin":"^1.2.2","string-template":"^1.0.0","webpack":"^3.11.0","webpack-dev-server":"^2.11.3","webpack-node-externals":"^1.6.0","webpack-shell-plugin":"^0.5.0"},"homepage":"https://github.com/IGNF/geoportal-access-lib#readme","keywords":["geoportail","webservice","javascript","es6"],"license":"CECILL-B","main":"dist/GpServices-src.js","module":"src/Gp.js","name":"geoportal-access-lib","nyc":{"include":["src/**/*.js"],"instrument":false,"sourceMap":false},"optionalDependencies":{},"peerDependencies":{},"repository":{"type":"git","url":"git+https://github.com/IGNF/geoportal-access-lib.git"},"scripts":{"build":"webpack","build:dev":"webpack --env.development","build:prod":"webpack --env.production","clean":"echo \\"Warning: no yet implemented!\\" && exit 0","cover":"nyc --reporter=lcov --reporter=text npm run test","doc":"npm run doc:serve","doc:serve":"webpack-dev-server --content-base jsdoc --port 9001 --open","sample":"npm run sample:serve","sample:serve":"webpack-dev-server --open-page samples/index-src.html --https --content-base .  --output-public-path \'/dist/\' --port 9001 --open \'google-chrome\'","sample:serve:dev":"webpack-dev-server --env.development --open-page samples/index-map.html --content-base . --output-public-path \'/dist/\' --port 9001 --open \'google-chrome","sample:serve:prod":"webpack-dev-server --env.production --open-page samples/index.html --content-base . --output-public-path \'/dist/\' --port 9001 --open \'google-chrome","setup":"npm install","test":"mocha-webpack --webpack-config webpack.test.js --glob \\"test_*.js\\" test/spec/","test:end-to-end:serve":"webpack-dev-server --hot --config webpack.end-to-end.serve.js","test:serve":"webpack-dev-server --hot --config webpack.test.serve.js"},"version":"2.1.6"}')},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(45),s=i(59),a=i(63),r={build:function(t){o.default.getLogger("AltiRequestFactory").trace(["AltiRequestFactory::build()"]);var e=null,i={type:t.sampling?"Profil":"Elevation",method:t.httpMethod,param:{positions:null,delimiter:null,indent:null,crs:null,format:null,sampling:null,zonly:null}};i.param.positions=t.positions,i.param.format=t.outputFormat,i.param.sampling=t.sampling,i.param.zonly=t.zonly;var r=!(null===t.onError||"function"!=typeof t.onError),l=!(null===t.onSuccess||"function"!=typeof t.onSuccess),c=null;switch(t.api){case"REST":var u=new s.default(i);if(!u.processRequestString()){if(c="Error in process request (rest) !",r)return void t.onError.call(t.scope,new n.default(c));throw new Error(c)}e=u.requestString;break;case"WPS":if(i.wps={service:null,version:null,identifier:null,rawdataoutput:null,request:null},!(e=a.default.build(i))){if(c="Error in process request (wps) !",r)return void t.onError.call(t.scope,new n.default(c));throw new Error(c)}break;default:if(c="Type of API is not supported by service (REST or WPS) !",r)return void t.onError.call(t.scope,new n.default(c));throw new Error(c)}return l&&t.onSuccess.call(t.scope,e),e}};e.default=r},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(60),a=i(62);function r(t){if(this.logger=o.default.getLogger("AltiRequestREST"),this.logger.trace("[Constructeur AltiRequestREST ()]"),!(this instanceof r))throw new TypeError("AltiRequestREST constructor cannot be called as a function.");if(this.options=t||{},!this.options)throw new Error(n.default.getMessage("PARAM_EMPTY","options"));if(!this.options.type)throw new Error(n.default.getMessage("PARAM_EMPTY","type (Elevation or Profil)"));switch(this.DataObject=null,this.options.type){case"Elevation":this.DataObject=new s.default(this.options.param);break;case"Profil":this.DataObject=new a.default(this.options.param);break;default:throw new Error(n.default.getMessage("PARAM_TYPE","type (Elevation or Profil)"))}this.method=this.options.method||"GET"}r.prototype={requestString:null,constructor:r,template:{get:{value:"lon=__LON__&lat=__LAT__&indent=__INDENT__&crs='__CRS__'",input:{point:"&zonly=__ZONLY__",profil:"&sampling=__SAMPLING__"}},post:{value:"lon=__LON__\nlat=__LAT__\nindent=__INDENT__\ncrs='__CRS__'\n",input:{point:"zonly=__ZONLY__",profil:"sampling=__SAMPLING__"}}},processRequestString:function(){this.logger.trace("AltiRequestREST::processRequestString ()");var t="";return"POST"===this.method?t=this.template.post.value:"GET"===this.method&&(t=this.template.get.value),t=(t=(t=(t=t.replace(/__LON__/g,this.DataObject.getLon())).replace(/__LAT__/g,this.DataObject.getLat())).replace(/__INDENT__/g,this.DataObject.indent)).replace(/__CRS__/g,this.DataObject.crs),t+=this.__addDataInputs(),this.logger.trace("traduction tmpl",t),this.requestString=t,this.requestString},__addDataInputs:function(){var t;if(this.logger.trace("AltiRequestREST::addDataInput ()"),"POST"===this.method)t=this.template.post;else{if("GET"!==this.method)throw new Error("No other HTTP method supported by the service !");t=this.template.get}if("AltiElevationRequest"===this.DataObject.CLASSNAME)return t.input.point.replace(/__ZONLY__/g,this.DataObject.zonly);if("AltiProfilRequest"===this.DataObject.CLASSNAME)return t.input.profil.replace(/__SAMPLING__/g,this.DataObject.sampling);throw new Error("No other object supported than elevation or profil !?")}},e.default=r},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(61);function s(t){if(!(this instanceof s))throw new TypeError("AltiElevationRequest constructor cannot be called as a function.");this.CLASSNAME="AltiElevationRequest",n.default.apply(this,arguments),this.logger=o.default.getLogger(),this.logger.trace("[Constructeur AltiElevationRequest ()]"),this.zonly=this.options.zonly||!1}s.prototype=Object.create(n.default.prototype,{zonly:{get:function(){return this._zonly},set:function(t){this._zonly=t}}}),s.prototype.constructor=s,s.prototype.getData=function(){var t=[];return t.push({k:"lon",v:this.getLon()}),t.push({k:"lat",v:this.getLat()}),t.push({k:"indent",v:this.indent}),t.push({k:"crs",v:this.crs}),t.push({k:"zonly",v:this.zonly}),t.push({k:"format",v:this.format}),t},e.default=s},function(t,e,i){"use strict";i.r(e);var o=i(43);function n(t){if(!(this instanceof n))throw new TypeError("AltiRequest constructor cannot be called as a function.");this.logger=o.default.getLogger(),this.logger.trace("[Constructeur AltiRequest ()]"),this.options=t||{},this.positions=this.options.positions||[],this.delimiter=this.options.delimiter||"|",this.indent=this.options.indent||!1,this.crs=this.options.crs||"CRS:84",this.format=this.options.format||"json"}n.CLASSNAME="AltiRequest",n.prototype={constructor:n,setPositions:function(t){for(var e=[],i=0;i<t.length;i++){var o=t[i];o.lon&&o.lat&&e.push(o)}this.positions=e},getPositions:function(t){if(!t)return this.positions;var e=this.positions.length-1;return t>e||t<e?(this.logger.warn("index out of range !"),this.positions):this.positions[t]},addPositions:function(t){for(var e=0;e<t.length;e++){var i=t[e];i.lon&&i.lat&&this.positions.push(t[e])}},getLon:function(){for(var t=[],e=0;e<this.positions.length;e++)t.push(this.positions[e].lon);return this.logger.trace(t),t.join(this.delimiter)},getLat:function(){for(var t=[],e=0;e<this.positions.length;e++)t.push(this.positions[e].lat);return this.logger.trace(t),t.join(this.delimiter)}},n.prototype.getData=function(){var t=[];return t.push({k:"lon",v:this.getLon()}),t.push({k:"lat",v:this.getLat()}),t.push({k:"delimiter",v:this.delimiter}),t.push({k:"indent",v:this.indent}),t.push({k:"crs",v:this.crs}),t.push({k:"format",v:this.format}),t},e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(61);function s(t){if(!(this instanceof s))throw new TypeError("AltiProfilRequest constructor cannot be called as a function.");this.CLASSNAME="AltiProfilRequest",n.default.apply(this,arguments),this.logger=o.default.getLogger(),this.logger.trace("[Constructeur AltiProfilRequest ()]"),this.sampling=this.options.sampling||3}s.prototype=Object.create(n.default.prototype,{sampling:{get:function(){return this._sampling},set:function(t){this._sampling=t}}}),s.prototype.constructor=s,s.prototype.getData=function(){var t=[];return t.push({k:"lon",v:this.getLon()}),t.push({k:"lat",v:this.getLat()}),t.push({k:"indent",v:this.indent}),t.push({k:"crs",v:this.crs}),t.push({k:"sampling",v:this.sampling}),t.push({k:"format",v:this.format}),t},e.default=s},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(64),a=i(60),r=i(62),l={build:function(t){if(o.default.getLogger("AltiRequestWPS").trace(["AltiRequestWPS::build()"]),!t)throw new Error(n.default.getMessage("PARAM_EMPTY","options"));if(!t.type)throw new Error(n.default.getMessage("PARAM_EMPTY","type (Elevation or Profil)"));var e=null;switch(t.type){case"Elevation":t.wps.identifier="gs:WPSElevation",e=new a.default(t.param);break;case"Profil":t.wps.identifier="gs:WPSLineElevation",e=new r.default(t.param);break;default:throw new Error(n.default.getMessage("PARAM_TYPE","type (Elevation or Profil)"))}var i={data:e,method:t.method,param:t.wps},l=new s.default(i);if(!l.processRequestString())throw new Error("Enable to process request !");return l.requestString}};e.default=l},function(t,e,i){"use strict";i.r(e);var o=i(43);function n(t){if(this.logger=o.default.getLogger(),this.logger.trace("[Constructeur WPS()]"),!(this instanceof n))throw new TypeError("WPS constructor cannot be called as a function.");if(this.options=t||{},this.DataObject=this.options.data,!this.DataObject)throw new TypeError("This data object is not defined !");this.paramservice=this.options.param.service||"WPS",this.paramversion=this.options.param.version||"1.0.0",this.paramidentifier=this.options.param.identifier||"gs:WPS",this.paramrawdataoutput=this.options.param.rawdataoutput||"result",this.paramrequest=this.options.param.request||"Execute",this.method=this.options.method||"GET"}n.prototype={requestString:null,constructor:n,template:{get:{value:"service=__SERVICE__&version=__VERSION__&rawdataoutput=__RAWDATAOUTPUT__&identifier=__IDENTIFIER__&request=__REQUEST__&datainputs=\x3c!-- __DATAINPUTS__ --\x3e",input:"__KEY__=__DATA__"},post:{value:'<?xml version="1.0" encoding="UTF-8"?><wps:__REQUEST__ version="__VERSION__" service="__SERVICE__" __NAMESPACE__ __SCHEMALOCATION__><ows:Identifier>__IDENTIFIER__</ows:Identifier><wps:DataInputs>\x3c!-- __DATAINPUTS__ --\x3e</wps:DataInputs><wps:ResponseForm><wps:RawDataOutput><ows:Identifier>__RAWDATAOUTPUT__</ows:Identifier></wps:RawDataOutput></wps:ResponseForm></wps:__REQUEST__>',input:"<wps:Input><ows:Identifier>__KEY__</ows:Identifier><wps:Data><wps:LiteralData>__DATA__</wps:LiteralData></wps:Data></wps:Input>"}},namespaceByDefault:function(){return['xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"','xmlns="http://www.opengis.net/wps/1.0.0"','xmlns:wfs="http://www.opengis.net/wfs"','xmlns:wps="http://www.opengis.net/wps/1.0.0"','xmlns:ows="http://www.opengis.net/ows/1.1"','xmlns:gml="http://www.opengis.net/gml"','xmlns:ogc="http://www.opengis.net/ogc"','xmlns:wcs="http://www.opengis.net/wcs/1.1.1"','xmlns:xlink="http://www.w3.org/1999/xlink"'].join(" ")},schemaLocationByDefault:function(){return'xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd"'},processRequestString:function(){this.logger.trace("WPS::processRequestString ()");var t="";if("POST"===this.method)t=this.template.post.value;else{if("GET"!==this.method)return this.logger.error("No other method supported by the service !"),!1;t=this.template.get.value}return t=(t=(t=(t=(t=t.replace(/__SERVICE__/g,this.paramservice)).replace(/__VERSION__/g,this.paramversion)).replace(/__RAWDATAOUTPUT__/g,this.paramrawdataoutput)).replace(/__IDENTIFIER__/g,this.paramidentifier)).replace(/__REQUEST__/g,this.paramrequest),"POST"===this.method&&(t=(t=t.replace(/__NAMESPACE__/g,this.namespaceByDefault)).replace(/__SCHEMALOCATION__/g,this.schemaLocationByDefault)),(t=t.replace(/<!-- __DATAINPUTS__ -->/g,this.__addDataInputs()))?(this.requestString=t,this.logger.trace("traduction tmpl",t),!0):(this.logger.warn("traduction tmpl : empty request !?"),!1)},__addDataInputs:function(){this.logger.trace("WPS::__addDataInputs ()");for(var t,e="GET"===this.method?this.template.get.input:this.template.post.input,i="GET"===this.method?";":"",o="",n=this,s=this.DataObject.getData(),a=0;a<s.length;a++)t=a,i&&(i=t===s.length-1?"":";"),o=o.concat(n.__addDataInput(e,s[t].k,s[t].v),i);return o},__addDataInput:function(t,e,i){var o=t;return o=(o=o.replace(/__KEY__/g,e)).replace(/__DATA__/g,i)},setMethod:function(t){"GET"===t||"POST"===t?this.method=t:this.logger.warn("support only GET and POST method !")},getMethod:function(){return this.method}},e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(45),a=i(66),r=i(67),l=i(68),c=i(69),u={build:function(t){var e=o.default.getLogger("AltiResponseFactory");e.trace(["AltiResponseFactory::build()"]);var i=null;if(t.response){if(t.rawResponse)e.trace("analyze response : raw"),i=t.response;else{switch(t.outputFormat){case"xml":e.trace("analyze response : xml");try{var u=new a.default({reader:r.default});if("string"==typeof t.response?u.setXMLString(t.response):u.setXMLDoc(t.response),!(i=u.parse()))throw new Error(n.default.getMessage("SERVICE_RESPONSE_EXCEPTION_2"))}catch(e){var h=e.message;return void t.onError.call(t.scope,new s.default({message:n.default.getMessage("SERVICE_RESPONSE_EXCEPTION",h),status:200,type:s.default.TYPE_SRVERR}))}break;case"json":var d;if(e.trace("analyze response : json"),e.trace("analyze response : ",typeof t.response),(d="string"==typeof t.response?JSON.parse(t.response):t.response).error)return void t.onError.call(t.scope,new s.default({message:n.default.getMessage("SERVICE_RESPONSE_EXCEPTION",d.error.description),status:200,type:s.default.TYPE_SRVERR}));if(d){var p,m=d.elevations,f=new l.default;if(Array.isArray(m)&&m.length)for(var _=0;_<m.length;_++)p=new c.default,"object"==typeof m[_]?(m[_].lon&&(p.lon=m[_].lon),m[_].lat&&(p.lat=m[_].lat),m[_].z&&(p.z=m[_].z),m[_].acc&&(p.acc=m[_].acc)):"number"==typeof m[_]&&(p.z=m[_]),Array.isArray(f.elevations)&&f.elevations.push(p);i=f}if(!i)return void t.onError.call(t.scope,new s.default({message:n.default.getMessage("SERVICE_RESPONSE_ANALYSE_2"),type:s.default.TYPE_UNKERR,status:-1}));break;default:return void t.onError.call(t.scope,new s.default({message:n.default.getMessage("SERVICE_RESPONSE_FORMAT_2"),type:s.default.TYPE_UNKERR,status:-1}))}if(i.exceptionReport)return void t.onError.call(t.scope,new s.default({message:n.default.getMessage("SERVICE_RESPONSE_EXCEPTION",i.exceptionReport),type:s.default.TYPE_SRVERR,status:200}));if(i.error){var g=i.error.description;return void t.onError.call(t.scope,new s.default({message:n.default.getMessage("SERVICE_RESPONSE_EXCEPTION",g),type:s.default.TYPE_SRVERR,status:200}))}}t.onSuccess.call(t.scope,i)}else t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_EMPTY")))}};e.default=u},function(t,e,i){"use strict";i.r(e);var o=i(43);function n(t){if(!(this instanceof n))throw new TypeError("XML constructor cannot be called as a function.");this.logger=o.default.getLogger(),this.logger.trace("[Constructeur XML ()]"),this.xmlString=null,this.xmlDoc=null,this.reader=null,t&&(t.xmlString&&"string"==typeof t.xmlString&&(this.xmlString=t.xmlString,this.xmlDoc=s(t.xmlString)),t.reader&&this.setReader(t.reader))}function s(t){if("undefined"==typeof window)return(new(0,i(54).DOMParser)).parseFromString(t,"text/xml");var e,o,n="Erreur lors du parsing de la réponse du service : XML non conforme";if(window.ActiveXObject){(o=new window.ActiveXObject("Microsoft.XMLDOM")).async=!1,o.loadXML(t);var s=o.parseError;if(s.errorCode)throw s.line&&s.linepos&&(n+="( ligne "+s.line+", colonne "+s.linepos),s.reason&&(n+=":  "+s.reason+")"),new Error(n);return o}if(window.DOMParser){e=new window.DOMParser;try{o=e.parseFromString(t,"text/xml")}catch(t){throw"SyntaxError"===t.message?new Error(n):new Error("Erreur lors du parsing de la réponse du service : "+t.message)}if(o.getElementsByTagName("parsererror").length>0)for(var a=o.getElementsByTagName("parsererror"),r=0;r<a.length;r++){var l=a[r].innerHTML;if(-1===l.indexOf("Huge input lookup"))throw n+="("+l+")",new Error(n)}else if(!o.documentElement)throw new Error(n);return o}throw new Error("Incompatible DOM Parser pour ce navigateur !")}n.prototype={constructor:n,getXMLString:function(){return this.xmlString},setXMLString:function(t){t&&"string"==typeof t&&(this.xmlString=t,this.xmlDoc=s(t))},getReader:function(){return this.reader},setReader:function(t){t&&t.read&&"function"==typeof t.read&&(this.reader=t)},getXMLDoc:function(){return this.xmlDoc},setXMLDoc:function(t){this.xmlDoc=t},parse:function(){if(!this.xmlDoc&&this.xmlString&&(this.xmlDoc=s(this.xmlString)),this.xmlDoc){var t,e=function(t){var e;9===t.nodeType?e=t.documentElement:1===t.nodeType&&(e=t);return e}(this.xmlDoc);return e?(this.reader&&this.reader.read?t=this.reader.read(e):(t={})[e.nodeName]=function t(e){var i={};if(e.attributes.length>0){var o=function(t){if(t.attributes.length>0){for(var e={},i=t.attributes,o=0;o<i.length;o++){var n=i[o];e[n.nodeName]=n.nodeValue}return e}}(e);i.attributes=o}if(e.hasChildNodes())for(var n,s={},a=e.childNodes,r=0;r<a.length;r++)if(3===(n=a[r]).nodeType)i.textContent=n.nodeValue;else if(1===n.nodeType)if(s=t(n),i[n.nodeName]){if(!Array.isArray(i[n.nodeName])){var l=i[n.nodeName];i[n.nodeName]=[],i[n.nodeName].push(l)}i[n.nodeName].push(s)}else i[n.nodeName]=s;return i}(e),t):{}}}},e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(68),n=i(69),s={};s.READERS={elevations:function(t){var e=new o.default;if(t.hasChildNodes())for(var i,n,a=t.childNodes,r=0;r<a.length;r++)i=a[r],s.READERS[i.nodeName]&&(n=s.READERS[i.nodeName](i),e.elevations.push(n));return e},elevation:function(t){var e=new n.default;if(t.hasChildNodes())for(var i,o=t.childNodes,a=0;a<o.length;a++)i=o[a],s.READERS[i.nodeName]&&s.READERS[i.nodeName](i,e);return e},lat:function(t,e){var i=t.firstChild;if(!i||3!==i.nodeType)throw new Error("Erreur dans la lecture de la réponse du service : latitude attendue mais absente");e.lat=parseFloat(i.nodeValue)},lon:function(t,e){var i=t.firstChild;if(!i||3!==i.nodeType)throw new Error("Erreur dans la lecture de la réponse du service : longitude attendue mais absente");e.lon=parseFloat(i.nodeValue)},z:function(t,e){var i=t.firstChild;if(!i||3!==i.nodeType)throw new Error("Erreur dans la lecture de la réponse du service : altitude attendue mais absente");if(!e)return(e=new n.default).z=parseFloat(i.nodeValue),e;e.z=parseFloat(i.nodeValue)},acc:function(t,e){var i=t.firstChild;if(!i||3!==i.nodeType)throw new Error("Erreur dans la lecture de la réponse du service : précision (acc) attendue mais absente");e.acc=parseFloat(i.nodeValue)},exceptionreport:function(t){var e={};if(t.hasChildNodes())for(var i,o=t.childNodes,n=0;n<o.length;n++)"Exception"===(i=o[n]).nodeName&&(e.exceptionReport=s.READERS.exception(i));return e},exception:function(t){var e={},i=t.getAttribute("exceptionCode");i&&(e.exceptionCode=i);var o=t.firstChild;return o&&3===o.nodeType&&(e.exception=o.nodeValue),e},error:function(t){var e={error:{}};if(t.hasChildNodes())for(var i,o=t.childNodes,n=0;n<o.length;n++){var s;1===(i=o[n]).nodeType&&"code"===i.nodeName&&(s=i.firstChild)&&3===s.nodeType&&(e.error.code=s.nodeValue),1===i.nodeType&&"description"===i.nodeName&&(s=i.firstChild)&&3===s.nodeType&&(e.error.description=s.nodeValue)}return e}},s.read=function(t){if("elevations"===t.nodeName)return s.READERS.elevations(t);if("ExceptionReport"===t.nodeName)return s.READERS.exceptionreport(t);if("error"===t.nodeName)return s.READERS.error(t);throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.")},e.default=s},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("AltiResponse constructor cannot be called as a function.");this.elevations=[]}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("Elevation constructor cannot be called as a function.");this.z=null}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(47),a=i(45),r=i(56),l=i(46),c=i(71);function u(t){if(!(this instanceof u))throw new TypeError(n.default.getMessage("CLASS_CONSTRUCTOR","AutoConf"));if(this.CLASSNAME="AutoConf",t||(t={}),t.protocol=t.protocol||"JSONP",l.default.apply(this,arguments),this.logger=o.default.getLogger("Gp.Services.AutoConf"),this.logger.trace("[Constructeur AutoConf (options)]"),!this.options.serverUrl&&!this.options.serverUrl){var e=r.default.AutoConf.url(this.options.apiKey);this.options.layerId?this.options.serverUrl=e.aggregate+this.options.layerId:Array.isArray(this.options.apiKey)&&this.options.apiKey.length>0?this.options.serverUrl=e.apiKeys:this.options.serverUrl=e.apiKey}"XHR"===this.options.protocol&&"POST"===this.options.httpMethod&&(this.logger.warn("Le service ne gére pas le mode d'interrogation en POST, on bascule sur du GET !"),this.options.httpMethod="GET"),this.options.outputFormat=this.options.rawResponse?"":"xml"}u.prototype=Object.create(l.default.prototype,{}),u.prototype.constructor=u,u.prototype.buildRequest=function(t,e){var i="undefined"!=typeof window?window:{};if(i.Gp&&i.Gp.Config&&i.Gp.Config.generalOptions&&i.Gp.Config.layers&&i.Gp.Config.generalOptions.apiKeys[this.options.apiKey]){if(!this.options.layerId)return this.logger.warn("Gp.Config existe déjà pour cette clé"),void this.options.onSuccess.call(this,i.Gp.Config);if(i.Gp.Config.layers[this.options.layerId]&&i.Gp.Config.layers[this.options.layerId].aggregatedLayers)return this.logger.warn("Gp.Config existe déjà pour cette clé et cette couche"),void this.options.onSuccess.call(this,i.Gp.Config)}this.request="",!(-1===this.options.serverUrl.indexOf("http://"))&&this.layerId&&(this.request=s.default.normalyzeParameters({layerId:this.layerId})),this.request||""===this.request?e.call(this,this.request):t.call(this,new a.default(n.default.getMessage("SERVICE_REQUEST_BUILD")))},u.prototype.analyzeResponse=function(t,e){if(this.response){var i={layerId:this.options.layerId,response:this.response,rawResponse:this.options.rawResponse,onSuccess:e,onError:t,scope:this};c.default.build(i)}else t.call(this,new a.default(n.default.getMessage("SERVICE_RESPONSE_EMPTY")))},e.default=u},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(45),a=i(66),r=i(72),l={build:function(t){o.default.getLogger("AutoConfResponseFactory").trace(["AutoConfResponseFactory::build()"]);var e=null;if(t.response){if(t.rawResponse)e=t.response;else{try{var i=new a.default({reader:r.default});"string"==typeof t.response?i.setXMLString(t.response):i.setXMLDoc(t.response),e=i.parse()}catch(e){var l=e.message;return"string"==typeof t.response?l+="\n (raw response service'"+t.response+"')":l+="\n (raw response service'"+t.response.documentElement.innerHTML+"')",void t.onError.call(t.scope,new s.default({message:n.default.getMessage("SERVICE_RESPONSE_EXCEPTION",l),status:200,type:s.default.TYPE_SRVERR}))}var c=!0;for(var u in e)e.hasOwnProperty(u)&&(c=!1);if(c)return void t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_EMPTY_2")));if(e.exceptionReport)return void t.onError.call(t.scope,new s.default({message:n.default.getMessage("SERVICE_RESPONSE_EXCEPTION",e.exceptionReport),type:s.default.TYPE_SRVERR,status:200}))}var h="undefined"!=typeof window?window:{};h.Gp||(h.Gp={}),h.Gp.Config?this.mergeConfig(h.Gp.Config,e,t.layerId):h.Gp.Config=e,t.onSuccess.call(t.scope,h.Gp.Config)}else t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_EMPTY")))},mergeConfig:function(t,e,i){if(e&&t){for(var o in e)if(e.hasOwnProperty(o))if("generalOptions"===o)for(var n in e[o].apiKeys)e[o].apiKeys.hasOwnProperty(n)&&!t.generalOptions.apiKeys[n]&&(t.generalOptions.apiKeys[n]=e[o].apiKeys[n]);else if(t[o])for(var s in e[o])e[o].hasOwnProperty(s)&&!t[o][s]&&(t[o][s]=e[o][s]);if(i){var a=[];for(var r in e.layers)e.layers.hasOwnProperty(r)&&a.push(r);t.layers[i]&&(t.layers[i].aggregatedLayers=a)}}}};e.default=l},function(t,e,i){"use strict";i.r(e);var o=i(73),n=i(74),s=i(75),a=i(76),r=i(77),l=i(78),c=i(79),u=i(80),h=i(81),d=i(82),p=i(83),m=i(84),f=i(85),_=i(86),g={};function v(t,e){if(t.hasChildNodes())for(var i,o,n,s=t.childNodes,a=0;a<s.length;a++){if(1===(i=s[a]).nodeType)if(o=i.localName||i.baseName||i.nodeName,n=i.prefix||g.DEFAULTPREFIX,g.READERS[n][o])(0,g.READERS[n][o])(i,e);else v(i,e)}}function y(t){var e,i="";return t.hasChildNodes()&&(3!==(e=t.firstChild).nodeType&&4!==e.nodeType||(i=e.nodeValue)),i}g.VERSION="1.1.0",g.NAMESPACES={xmlns:"http://www.opengis.net/context",gpp:"http://api.ign.fr/geoportail",ows:"http://www.opengis.net/ows/1.1",sld:"http://www.opengis.net/sld",wmts:"http://www.opengis.net/wmts/1.0",xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance"},g.SCHEMALOCATION=["http://www.opengis.net/context http://wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://wxs.ign.fr/schemas/autoconf/autoconf.xsd","http://www.opengis.net/context http://wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://wxs.ign.fr/schemas/autoconf.xsd"],g.DEFAULTPREFIX="context",g.READERS={context:{ViewContext:function(t){!function(t){if(t.attributes.length>0){var e=function(t){if(t.attributes.length>0){for(var e={},i=t.attributes,o=0;o<i.length;o++){var n=i[o];e[n.nodeName]=n.nodeValue}return e}}(t);for(var i in e)if(e.hasOwnProperty(i)){if("version"===i&&e.version!==g.VERSION)return void console.log("[AutoConfResponseReader] autoconf version is not the expected one : there may be errors in parsing");if("xmlns"===i){if(e[i]!==g.NAMESPACES.xmlns)return void console.log("[AutoConfResponseReader] autoconf response default namespace is not the expected one");continue}var o=i.split(":")[0],n=i.split(":")[1];if("xmlns"===o&&n&&g.NAMESPACES[n]&&g.NAMESPACES[n]!==e[i])return void console.log("[AutoConfResponseReader] autoconf response "+i+" namespace is not the expected one");if("schemaLocation"===n&&e[i]!==g.SCHEMALOCATION[0]&&e[i]!==g.SCHEMALOCATION[1])return void console.log("[AutoConfResponseReader] autoconf response schema location is not the expected one")}}}(t);var e=new o.default;return v(t,e),e},Title:function(t,e){e&&e.generalOptions?e.generalOptions.title=y(t):e&&e.lyr&&(e.lyr.title=y(t))},Abstract:function(t,e){e&&e.lyr&&(e.lyr.description=y(t))},Server:function(t,e){var i=t.getAttribute("service"),o=t.getAttribute("title"),n=t.getAttribute("version");if(i)if(e&&e.services&&"object"==typeof e.services&&!e.services[i]){var s=new u.default;s.title=o,s.version=n,v(t,s),e.services[i]=s}else e&&e.lyr&&(e.lyr.serviceParams||(e.lyr.serviceParams={}),e.lyr.serviceParams.id=i,e.lyr.serviceParams.version=n)},OnlineResource:function(t,e){e&&e.hasOwnProperty("serverUrl")&&(e.serverUrl=t.getAttribute("xlink:href"))},LayerList:function(t,e){if(v(t,e),e&&e.layers&&e.generalOptions&&e.services)for(var i in e.layers)if(e.layers.hasOwnProperty(i)){var o=e.layers[i],n=o.apiKeys;if(n&&Array.isArray(n))for(var s=0;s<n.length;s++){var a=n[s];e.generalOptions.apiKeys&&(e.generalOptions.apiKeys[a]&&Array.isArray(e.generalOptions.apiKeys[a])||(e.generalOptions.apiKeys[a]=[]),e.generalOptions.apiKeys[a].push(i))}var r=o.serviceParams;if(r&&r.id&&!e.services[r.id]){var l=new u.default;r.serverUrl&&(l.serverUrl=r.serverUrl),r.version&&(l.version=r.version),e.services[r.id]=l}if(o.wmtsOptions&&o.wmtsOptions.tileMatrixSetLink&&e.tileMatrixSets){var c=o.wmtsOptions.tileMatrixSetLink,h=e.tileMatrixSets;for(var d in h)h.hasOwnProperty(d)&&d===c&&(o.defaultProjection=h[d].projection)}}},Layer:function(t,e){if(e&&e.layers){var i={lyr:new a.default,lyrId:null},o=t.getAttribute("hidden");i.lyr.hidden="1"===o;var n=t.getAttribute("queryable");if(i.lyr.queryable="1"===n,v(t,i),i.lyrId){if(i.lyr.serviceParams&&i.lyr.serviceParams.id){var s=i.lyr.serviceParams.id;if(-1!==s.toUpperCase().indexOf("OPENLS")||-1!==s.toUpperCase().indexOf("ELEVATION")){var r=i.lyrId.split("$")[0];i.lyrId=r+"$"+s}}i.lyr.layerId=i.lyrId,e.layers[i.lyrId]=i.lyr}}},Name:function(t,e){e&&e.lyr&&(e.lyr.name=y(t))},SRS:function(t,e){e&&e.lyr&&(e.lyr.defaultProjection=y(t))},Format:function(t,e){if(e&&e.lyr){var i=new s.default,o=t.getAttribute("current");i.current="1"===o,i.name=y(t),e.lyr.formats&&Array.isArray(e.lyr.formats)||(e.lyr.formats=[]),e.lyr.formats.push(i)}},Style:function(t,e){if(e&&e.lyr){var i=new h.default,o=t.getAttribute("current");if(i.current="1"===o||1===o,t.hasChildNodes)for(var n,s,a=t.childNodes,r=0;r<a.length;r++)1===(n=a[r]).nodeType&&("Name"===(s=n.localName||n.baseName||n.nodeName)?i.name=y(n):"Title"===s?i.title=y(n):"URL"===s&&(i.url=y(n)));e.lyr.styles&&Array.isArray(e.lyr.styles)||(e.lyr.styles=[]),e.lyr.styles.push(i)}},Dimension:function(t,e){var i=t.getAttribute("name"),o=y(t);e&&e.lyr&&(e.lyr.dimensions||(e.lyr.dimensions={}),"Type"===i?e.lyr.dimensions.type=o:"VisibilityRange"===i?e.lyr.dimensions.visibilityRange=o:"VisibilityMode "===i?e.lyr.dimensions.visibilityMode=o:"GeometricType"===i?e.lyr.dimensions.geometricType=o:"NoDataValue"===i&&(e.lyr.dimensions.noDataValue=o))}},gpp:{Theme:function(t,e){e&&e.generalOptions&&e.generalOptions.hasOwnProperty("theme")&&(e.generalOptions.theme=y(t))},defaultGMLGFIStyleUrl:function(t,e){e&&e.generalOptions&&e.generalOptions.hasOwnProperty("defaultGMLGFIStyle")&&(e.generalOptions.defaultGMLGFIStyle=y(t))},Territory:function(t,e){var i=t.getAttribute("id");if(i){var o=new d.default,n=t.getAttribute("default");o.isDefault="1"===n,v(t,o),e&&e.territories&&"object"==typeof e.territories&&(e.territories[i]=o)}},defaultCRS:function(t,e){e&&e.hasOwnProperty("defaultCRS")&&(e.defaultCRS=y(t))},AdditionalCRS:function(t,e){var i=y(t);i&&e&&(Array.isArray(e.additionalCRS)?e.additionalCRS.push(i):(e.additionalProjections&&Array.isArray(e.additionalProjections)||(e.additionalProjections=[]),e.additionalProjections.push(i)))},DefaultLayer:function(t,e){var i=t.getAttribute("layerId");i&&e&&Array.isArray(e.defaultLayers)&&e.defaultLayers.push(i)},BoundingBox:function(t,e){if(e){var i=y(t).split(",");if(4===i.length){var o={left:parseFloat(i[0]),right:parseFloat(i[2]),top:parseFloat(i[3]),bottom:parseFloat(i[1])},s=t.getAttribute("minT"),a=t.getAttribute("maxT");if(e.hasOwnProperty("geoBBOX"))e.geoBBOX=o;else if(e.hasOwnProperty("bbox"))if(e.bbox.left||e.bbox.right||e.bbox.top||e.bbox.bottom){e.multiConstraints||(e.multiConstraints=[]);var r=new n.default;r.bbox=o,r.temporalExtent=[s,a],e.multiConstraints.push(r)}else e.bbox=o,e.temporalExtent=[s,a];else e.globalConstraint||(e.globalConstraint=new n.default),e.globalConstraint.bbox=o,e.globalConstraint.temporalExtent=[s,a]}}},Resolution:function(t,e){var i=y(t);i&&e&&e.defaultOptions&&e.defaultOptions.hasOwnProperty("resolution")&&(e.defaultOptions.resolution=parseFloat(i))},x:function(t,e){var i=y(t);i&&e&&e.geoCenter&&e.geoCenter.hasOwnProperty("lon")&&(e.geoCenter.lon=parseFloat(i))},y:function(t,e){var i=y(t);i&&e&&e.geoCenter&&e.geoCenter.hasOwnProperty("lat")&&(e.geoCenter.lat=parseFloat(i))},Resolutions:function(t,e){e&&e.generalOptions&&e.generalOptions.hasOwnProperty("wgs84Resolutions")&&(e.generalOptions.wgs84Resolutions=y(t).split(","))},Layer:function(t,e){if(e&&e.hasOwnProperty("lyrId")&&e.lyr){e.lyrId=t.getAttribute("id");var i=t.getAttribute("aggregate"),o=t.getAttribute("more");(i||o)&&(e.lyr.isAggregate=!0),v(t,e.lyr)}},Constraint:function(t,e){var i=new n.default;if(v(t,i),e)if(e.constraints&&Array.isArray(e.constraints)||(e.constraints=[]),i.multiConstraints&&Array.isArray(i.multiConstraints)){var o=new n.default;o.crs=i.crs,o.bbox=i.bbox,o.minScaleDenominator=i.minScaleDenominator,o.maxScaleDenominator=i.maxScaleDenominator,o.temporalExtent=i.temporalExtent,e.constraints.push(o);for(var s=0;s<i.multiConstraints.length;s++)(o=new n.default).crs=i.crs,o.minScaleDenominator=i.minScaleDenominator,o.maxScaleDenominator=i.maxScaleDenominator,o.bbox=i.multiConstraints[s].bbox,o.temporalExtent=i.multiConstraints[s].temporalExtent,e.constraints.push(o)}else e.constraints.push(i)},CRS:function(t,e){e&&e.hasOwnProperty("crs")&&(e.crs=y(t))},Thematic:function(t,e){if(e){var i=new p.default;i.inspire=!1,i.name=y(t),e.thematics&&Array.isArray(e.thematics)||(e.thematics=[]),e.thematics.push(i)}},InspireThematic:function(t,e){if(e){var i=new p.default;i.inspire=!0,i.name=y(t),e.thematics&&Array.isArray(e.thematics)||(e.thematics=[]),e.thematics.push(i)}},Originator:function(t,e){if(e){var i=new c.default;i.name=t.getAttribute("name"),v(t,i),e.originators&&Array.isArray(e.originators)||(e.originators=[]),e.originators.push(i)}},Attribution:function(t,e){e&&e.hasOwnProperty("attribution")&&(e.attribution=y(t))},Logo:function(t,e){e&&e.hasOwnProperty("logo")&&(e.logo=y(t))},URL:function(t,e){e&&e.hasOwnProperty("url")&&(e.url=y(t))},Legend:function(t,e){var i=new r.default;v(t,i),e&&(e.legends&&Array.isArray(e.legends)||(e.legends=[]),e.legends.push(i))},LegendURL:function(t,e){if(e&&e.hasOwnProperty("format")&&(e.format=t.getAttribute("format"),t.hasChildNodes)){var i=t.childNodes[0];"OnlineResource"===(i.localName||i.baseName||i.nodeName)&&e.hasOwnProperty("url")&&(e.url=i.getAttribute("xlink:href"))}},QuickLook:function(t,e){if(t.hasChildNodes){var i=t.childNodes[0];"OnlineResource"===(i.localName||i.baseName||i.nodeName)&&e&&(e.quicklookUrl=i.getAttribute("xlink:href"))}},MetadataURL:function(t,e){if(e){var i=new l.default;if(i.format=t.getAttribute("format"),t.hasChildNodes){var o=t.childNodes[0];"OnlineResource"===(o.localName||o.baseName||o.nodeName)&&(i.url=o.getAttribute("xlink:href"))}e.metadata||Array.isArray(e.metadata)||(e.metadata=[]),e.metadata.push(i)}},Key:function(t,e){if(e){var i=t.getAttribute("id");e.apiKeys&&Array.isArray(e.apiKeys)||(e.apiKeys=[]),e.apiKeys.push(i);var o=y(t);e.serviceParams||(e.serviceParams={}),e.serviceParams.serverUrl||(e.serviceParams.serverUrl={}),e.serviceParams.serverUrl[i]||(e.serviceParams.serverUrl[i]=o)}}},ows:{Identifier:function(t,e){e&&e.hasOwnProperty("TMS")?e.identifier=y(t):e&&e.hasOwnProperty("matrixId")&&(e.matrixId=y(t))},SupportedCRS:function(t,e){e&&e.TMS&&e.TMS.hasOwnProperty("projection")&&(e.TMS.projection=y(t))}},sld:{MinScaleDenominator:function(t,e){var i=y(t);i&&e&&(e.hasOwnProperty("defaultOptions")?e.defaultOptions.minScaleDenominator=parseFloat(i):e.lyr?(e.lyr.globalConstraint||(e.lyr.globalConstraint=new n.default),e.lyr.globalConstraint.minScaleDenominator=parseFloat(i)):e.hasOwnProperty("minScaleDenominator")&&(e.minScaleDenominator=parseFloat(i)))},MaxScaleDenominator:function(t,e){var i=y(t);i&&e&&(e.hasOwnProperty("defaultOptions")?e.defaultOptions.maxScaleDenominator=parseFloat(i):e.lyr?(e.lyr.globalConstraint||(e.lyr.globalConstraint=new n.default),e.lyr.globalConstraint.maxScaleDenominator=parseFloat(i)):e.hasOwnProperty("maxScaleDenominator")&&(e.maxScaleDenominator=parseFloat(i)))}},wmts:{TileMatrixSetLimits:function(t,e){if(e){var i={};v(t,i),e.wmtsOptions||(e.wmtsOptions={}),e.wmtsOptions.tileMatrixSetLimits=i}},TileMatrixLimits:function(t,e){var i,o=new _.default;if(t.hasChildNodes){for(var n=t.childNodes,s=0;s<n.length;s++){var a=n[s],r=a.localName||a.baseName||a.nodeName;"TileMatrix"===r?i=y(a):"MinTileRow"===r?o.minTileRow=y(a):"MaxTileRow"===r?o.maxTileRow=y(a):"MinTileCol"===r?o.minTileCol=y(a):"MaxTileCol"===r&&(o.maxTileCol=y(a))}i&&e&&!e[i]&&(e[i]=o)}},TileMatrixSet:function(t,e){if(e&&e.tileMatrixSets){var i={};i.TMS=new m.default,i.resolutions=[],v(t,i);var o=i.TMS.tileMatrices;for(var n in o)o.hasOwnProperty(n)&&i.TMS.matrixIds.push(n);if(("IGNF:WGS84G"===i.TMS.getProjection()||"EPSG:4326"===i.TMS.getProjection())&&e.generalOptions&&Array.isArray(e.generalOptions.wgs84Resolutions))for(var s=e.generalOptions.wgs84Resolutions,a=0;a<s.length;a++)i.resolutions[a]=parseFloat(s[a]);Array.isArray(i.resolutions)&&void 0!==i.resolutions.sort&&i.resolutions.sort((function(t,e){return e-t})),i.TMS.nativeResolutions=i.resolutions,e.tileMatrixSets[i.identifier]=i.TMS}else e&&!e.wmtsOptions&&(e.wmtsOptions={}),e.wmtsOptions.tileMatrixSetLink=y(t)},TileMatrix:function(t,e){if(e){var i=new f.default;if(v(t,i),e.TMS&&e.TMS.getProjection()){var o=e.TMS.getProjection();if("EPSG:3857"===o||"EPSG:2154"===o){var n=28e-5*i.scaleDenominator;e.resolutions&&Array.isArray(e.resolutions)&&e.resolutions.push(n)}}e.TMS&&e.TMS.tileMatrices&&(e.TMS.tileMatrices[i.matrixId]=i)}},ScaleDenominator:function(t,e){var i=y(t);i&&e&&e.hasOwnProperty("scaleDenominator")&&(e.scaleDenominator=parseFloat(i))},TopLeftCorner:function(t,e){var i=y(t).split(" ");i&&e&&(e.topLeftCorner={},e.topLeftCorner.x=parseFloat(i[0]),e.topLeftCorner.y=parseFloat(i[1]))},TileWidth:function(t,e){var i=y(t);i&&e&&e.hasOwnProperty("tileWidth")&&(e.tileWidth=parseInt(i,10))},TileHeight:function(t,e){var i=y(t);i&&e&&e.hasOwnProperty("tileHeight")&&(e.tileHeight=parseInt(i,10))},MatrixWidth:function(t,e){var i=y(t);i&&e&&e.hasOwnProperty("matrixWidth")&&(e.matrixWidth=parseInt(i,10))},MatrixHeight:function(t,e){var i=y(t);i&&e&&e.hasOwnProperty("matrixHeight")&&(e.matrixHeight=parseInt(i,10))}},serviceException:function(t){var e={};if(t.hasChildNodes())for(var i,o=t.childNodes,n=0;n<o.length;n++)"exception"===(i=o[n]).nodeName&&(e.exceptionReport=g.READERS.exception(i));return e},exception:function(t){var e={},i=t.getAttribute("code");i&&(e.exceptionCode=i);var o=t.firstChild;return o&&3===o.nodeType&&(e.exception=o.nodeValue),e}},g.read=function(t){if("ViewContext"===t.nodeName){var e=t.prefix||g.DEFAULTPREFIX;return g.READERS[e][t.nodeName](t)}if("serviceException"===t.nodeName)return g.READERS[t.nodeName](t);throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.")},e.default=g},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("AutoConfResponse constructor cannot be called as a function.");this.generalOptions={apiKeys:{},title:null,defaultGMLGFIStyle:null,theme:null,wgs84Resolutions:[]},this.layers={},this.territories={},this.tileMatrixSets={},this.services={}}i.r(e),o.prototype={constructor:o,isConfLoaded:function(t){if(t)return!!this.generalOptions.apiKeys[t]},getLayersId:function(t){return this.generalOptions.apiKeys[t]},getLayersConf:function(t){var e={},i=this.getLayersId(t);if(i)for(var o=0;o<i.length;o++){var n=i[o];e[n]=this.layers[n]}return e},getLayerConf:function(t){if(this.layers)return this.layers[t]},getTileMatrixSets:function(){return this.tileMatrixSets},getTMSConf:function(t){if(this.tileMatrixSets)return this.tileMatrixSets[t]},getTerritories:function(){return this.territories},getTerritoryConf:function(t){if(this.territories)return this.territories[t]},getServices:function(){return this.services},getServiceConf:function(t){if(this.services)return this.services[t]}},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("Constraint constructor cannot be called as a function.");this.crs=null,this.bbox={left:null,right:null,top:null,bottom:null},this.minScaleDenominator=null,this.maxScaleDenominator=null,this.temporalExtent=[null,null]}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("Format constructor cannot be called as a function.");this.current=null,this.name=null}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("Layer constructor cannot be called as a function.")}i.r(e),o.prototype={constructor:o,getName:function(){return this.name},getTitle:function(){return this.title},getDescription:function(){return this.description},getLayerId:function(){return this.layerId},getQuicklookUrl:function(){return this.quicklookUrl},getDefaultProjection:function(){return this.defaultProjection},getProjections:function(){var t=[];return t.push(this.defaultProjection),t.concat(this.additionalProjections)},getBBOX:function(){if(this.globalConstraint)return this.globalConstraint.bbox},getMinScaleDenominator:function(){if(this.globalConstraint)return this.globalConstraint.minScaleDenominator},getMaxScaleDenominator:function(){if(this.globalConstraint)return this.globalConstraint.maxScaleDenominator},getTMSID:function(){if(this.wmtsOptions)return this.wmtsOptions.tileMatrixSetLink},getServiceParams:function(){return this.serviceParams},getServerUrl:function(t){if(t&&this.serviceParams&&this.serviceParams.serverUrl)return this.serviceParams.serverUrl[t]},getLegends:function(){return this.legends},getMetadata:function(){return this.metadata},getStyles:function(){return this.styles},getDefaultStyle:function(){if(this.styles){for(var t,e=this.styles,i=0;i<e.length;i++)if(!0===e[i].current){t=e[i].name;break}return t}},getThematics:function(){return this.thematics},getDefaultFormat:function(){if(this.formats){for(var t,e=this.formats,i=0;i<e.length;i++)if(!0===e[i].current){t=e[i].name;break}return t}},getConstraints:function(){return this.constraints},getOriginators:function(){return this.originators},getDimensions:function(){return this.dimensions},getAggregatedLayers:function(){if(this.isAggregate)return this.aggregatedLayers}},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("Legend constructor cannot be called as a function.");this.format=null,this.url=null,this.minScaleDenominator=null}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("Metadata constructor cannot be called as a function.");this.format=null,this.url=null}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("Originator constructor cannot be called as a function.");this.name=null,this.attribution=null,this.logo=null,this.url=null,this.constraints=[]}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("Service constructor cannot be called as a function.");this.title=null,this.serverUrl=null,this.version=null}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("Style constructor cannot be called as a function.");this.name=null,this.title=null,this.current=null,this.url=null}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("Territory constructor cannot be called as a function.");this.isDefault=null,this.defaultCRS=null,this.additionalCRS=[],this.geoBBOX={left:null,right:null,top:null,bottom:null},this.geoCenter={lon:null,lat:null},this.defaultOptions={resolution:null,minScaleDenominator:null,maxScaleDenominator:null},this.defaultLayers=[]}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("Thematic constructor cannot be called as a function.");this.inspire=null,this.name=null}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("TileMatrixSet constructor cannot be called as a function.");this.projection=null,this.nativeResolutions=[],this.matrixIds=[],this.tileMatrices={}}i.r(e),o.prototype={constructor:o,getResolutions:function(){return this.nativeResolutions},getMatrixIds:function(){return this.matrixIds},getProjection:function(){return this.projection},getTileMatrices:function(){return this.tileMatrices},getTopLeftCorner:function(){var t,e=this.getTileMatrices();if(e)for(var i in e)if(e.hasOwnProperty(i)){t=e[i].topLeftCorner;break}return t}},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("TileMatrix constructor cannot be called as a function.");this.matrixId=null,this.matrixHeight=null,this.matrixWidth=null,this.scaleDenominator=null,this.tileHeight=null,this.tileWidth=null,this.topLeftCorner=null}i.r(e),o.prototype={constructor:o,getTopLeftCorner:function(){return this.topLeftCorner},getScaleDenominator:function(){return this.scaleDenominator},getTileHeight:function(){return this.tileHeight},getTileWidth:function(){return this.tileWidth},getMatrixHeight:function(){return this.matrixHeight},getMatrixWidth:function(){return this.matrixWidth}},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("TileMatrixLimit constructor cannot be called as a function.");this.minTileRow=null,this.maxTileRow=null,this.minTileCol=null,this.maxTileCol=null}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(45),a=i(46),r=i(88),l=i(105);function c(t){if(!(this instanceof c))throw new TypeError(n.default.getMessage("CLASS_CONSTRUCTOR","Geocode"));if(this.CLASSNAME="Geocode",a.default.apply(this,arguments),this.logger=o.default.getLogger("Gp.Services.Geocode"),this.logger.trace("[Constructeur Geocode (options)]"),!t.location)throw new Error(n.default.getMessage("PARAM_MISSING","location"));if("object"==typeof t.location&&0===Object.keys(t.location).length)throw new Error(n.default.getMessage("PARAM_EMPTY","location"));if("string"==typeof t.location&&0===t.location.length)throw new Error(n.default.getMessage("PARAM_EMPTY","location"));this.options.location=t.location,t.filterOptions&&"object"==typeof t.filterOptions||(this.options.filterOptions=t.filterOptions={type:["StreetAddress"]}),0===Object.keys(t.filterOptions).length&&(this.options.filterOptions={type:["StreetAddress"]});for(var e=Object.keys(t.filterOptions),i=0;i<e.length;i++){var s=e[i];-1!==["department","number","postalCode","insee","importance","ID","IDTR","absorbedCity","sheet","section","inseeRegion","inseeDepartment"].indexOf(s)&&"string"!=typeof t.filterOptions[s]&&(t.filterOptions[s]=t.filterOptions[s].toString()),t.filterOptions[s]||delete this.options.filterOptions[s]}this.options.filterOptions.type=t.filterOptions.type||["StreetAddress"],this.options.maximumResponses=t.maximumResponses||25,this.options.returnFreeForm=t.returnFreeForm||!1,this.options.srs=t.srs||"EPSG:4326",this.options.outputFormat=this.options.rawResponse?"":"xml"}c.prototype=Object.create(a.default.prototype,{}),c.prototype.constructor=c,c.prototype.buildRequest=function(t,e){var i={httpMethod:this.options.httpMethod,location:this.options.location,returnFreeForm:this.options.returnFreeForm,filterOptions:this.options.filterOptions,srs:this.options.srs,maximumResponses:this.options.maximumResponses};this.request=r.default.build(i),this.request?e.call(this,this.request):t.call(this,new s.default(n.default.getMessage("SERVICE_REQUEST_BUILD")))},c.prototype.analyzeResponse=function(t,e){if(this.response){var i={response:this.response,rawResponse:this.options.rawResponse,onError:t,onSuccess:e,scope:this};l.default.build(i)}else t.call(this,new s.default(n.default.getMessage("SERVICE_RESPONSE_EMPTY")))},e.default=c},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(89),s=i(93),a=i(96),r=i(100),l=i(102),c=i(103),u=i(104),h={build:function(t){var e=o.default.getLogger("DirectGeocodeRequestFactory");e.trace(["DirectGeocodeRequestFactory::build()"]);var i=null,h=new a.default;h.addFilterExtensions(new u.default),h.addFilterExtensions(new r.default),h.addFilterExtensions(new l.default),h.addFilterExtensions(new c.default);var d=new s.default({location:t.location,returnFreeForm:t.returnFreeForm,filterOptions:t.filterOptions});d.addFilter(h);var p=new n.default({srsName:t.srs,maximumResponses:t.maximumResponses});(p.namespace=!0,p.setService(d),i=p.build(),"GET"===t.httpMethod)&&(i="qxml="+encodeURIComponent(i).replace(/-/g,"%2D").replace(/_/g,"%5F").replace(/\./g,"%2E").replace(/!/g,"%21").replace(/~/g,"%7E").replace(/\*/g,"%2A").replace(/'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29"));return e.trace(i),i}};e.default=h},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(90),s=i(91),a=i(92);function r(t){if(this.logger=o.default.getLogger(),this.logger.trace("[Constructeur XLS()]"),!(this instanceof r))throw new TypeError("XLS constructor cannot be called as a function.");for(var e in this.options={srsName:"EPSG:4326",maximumResponses:25},t)t.hasOwnProperty(e)&&t[e]&&(this.options[e]=t[e])}r.VERSION="1.2",r.prototype={requestString:null,namespace:!1,oService:null,constructor:r,template:'<?xml version="1.0" encoding="UTF-8"?>\n<XLS version="__VERSION__"\n__NAMESPACE__ \n__SCHEMALOCATION__>\n__REQUESTHEADER__\n__REQUEST__\n</XLS>\n',namespaceByDefault:function(){return['xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"','xmlns:xls="http://www.opengis.net/xls"','xmlns:gml="http://www.opengis.net/gml"'].join(" ")},schemaLocationByDefault:function(){return'xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.2/olsAll.xsd"'},setService:function(t){t?t instanceof a.default?this.oService=t:this.logger.error("L'objet n'est pas du type 'LocationUtilityService' ou 'RouteService' !?"):this.logger.trace("L'objet de type Service XSL n'est pas encore defini !?")},getService:function(){return this.oService}},r.prototype.addNamespace=function(t,e){for(var i,o,n=t.key,s=!1,a=this.namespaceByDefault().split(" "),r=0;r<a.length;r++){if(a[r].split("=")[0]==="xmlns:"+n){s=!0;break}}return s?(i=/<(\w+[\s>])/g,o="<"+n+":$1",e=e.replace(i,o),i=/<\/(\w+[\s>])/g,o="</"+n+":$1",e=e.replace(i,o),this.logger.trace("namespace",e),e):(this.logger.warn("L'ajout d'un nouvel namespace n'est pas encore implémenté !"),e)},r.prototype.build=function(){var t=!!this.getService(),e="";e=(e=(e=(e=this.template).replace(/__VERSION__/g,r.VERSION)).replace(/__NAMESPACE__/g,this.namespaceByDefault)).replace(/__SCHEMALOCATION__/g,this.schemaLocationByDefault);var i=new n.default({srsName:this.options.srsName});e=e.replace(/__REQUESTHEADER__/g,i.toString());var o=new s.default({maximumResponses:this.options.maximumResponses,version:r.VERSION,methodName:t?this.getService().CLASSTYPE:null});if(e=e.replace(/__REQUEST__/g,o.toString()),t&&(e=e.replace(/<!-- __REQUESTSERVICE__ -->/g,this.getService().toString())),e)return this.namespace&&(e=this.addNamespace({key:"xls",url:"http://www.opengis.net/xls"},e)),this.requestString=e,this.logger.trace("traduction tmpl",e),this.requestString;this.logger.warn("traduction tmpl : empty request !?")},e.default=r},function(t,e,i){"use strict";i.r(e);var o=i(43);function n(t){if(this.logger=o.default.getLogger(),this.logger.trace("[Constructeur RequestHeader ()]"),!(this instanceof n))throw new TypeError("RequestHeader constructor cannot be called as a function.");for(var e in this.options=t||{srsName:"EPSG:4326"},t)t.hasOwnProperty(e)&&(this.options[e]=t[e])}n.prototype={requestString:null,template:'<RequestHeader srsName="__SRSNAME__"/>',constructor:n,toString:function(){var t=null;return t=(t=this.template).replace(/__SRSNAME__/g,this.options.srsName),this.requestString=t,this.requestString}},e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(43);function n(t){if(this.logger=o.default.getLogger(),this.logger.trace("[Constructeur Request ()]"),!(this instanceof n))throw new TypeError("Request constructor cannot be called as a function.");for(var e in this.options=t||{maximumResponses:25,methodName:null,version:"1.2"},t)t.hasOwnProperty(e)&&(this.options[e]=t[e])}n.prototype={requestString:null,template:'<Request maximumResponses="__MAXRESPONSES__" methodName="__METHODNAME__" requestID="__UUID__" version="__VERSION__">\x3c!-- __REQUESTSERVICE__ --\x3e</Request>',constructor:n,guid:function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(t){var e=16*Math.random()|0;return("x"===t?e:3&e|8).toString(16)}))},toString:function(){var t=null;return t=(t=(t=(t=(t=this.template).replace(/__MAXRESPONSES__/g,this.options.maximumResponses)).replace(/__METHODNAME__/g,this.options.methodName)).replace(/__UUID__/g,this.guid())).replace(/__VERSION__/g,this.options.version),this.requestString=t,this.requestString}},e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(43);function n(t){if(this.logger=o.default.getLogger(),this.logger.trace("[Constructeur AbstractService ()]"),!(this instanceof n))throw new TypeError("AbstractService constructor cannot be called as a function.");for(var e in this.options=t||{},t)t.hasOwnProperty(e)&&(this.options[e]=t[e])}n.prototype={strRequest:null,oRequest:null,oFilter:null,constructor:n,addRequest:function(t){this.logger.error("overwritten method !")},addFilter:function(t){this.logger.error("overwritten method !")},toString:function(){this.logger.error("overwritten method !")}},e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(92),s=i(94),a=i(97),r=i(96);function l(t){if(this.logger=o.default.getLogger(),this.logger.trace("[Constructeur LocationUtilityService ()]"),!(this instanceof l))throw new TypeError("LocationUtilityService constructor cannot be called as a function.");this.CLASSNAME="LocationUtilityService",this.CLASSTYPE=null,n.default.apply(this,arguments),this.options&&(this.CLASSTYPE=this.options.location?"GeocodeRequest":this.options.position?"ReverseGeocodeRequest":null)}l.prototype=Object.create(n.default.prototype,{}),l.prototype.constructor=l,l.prototype.addRequest=function(t){switch(this.CLASSTYPE=t.CLASSNAME,this.CLASSTYPE){case"GeocodeRequest":case"ReverseGeocodeRequest":this.oRequest=t;break;default:throw new Error("Ce n'est pas un objet de type 'LUS Request' !?")}},l.prototype.addFilter=function(t){t instanceof r.default&&(this.oFilter=t)},l.prototype.toString=function(){if(!this.oRequest){if(!this.options)throw new Error("Les options ne sont pas renseignées, impossible de construire la requête !");if("GeocodeRequest"===this.CLASSTYPE){var t={location:this.options.location,returnFreeForm:this.options.returnFreeForm,filterOptions:this.options.filterOptions||{}};this.oRequest=new s.default(t),this.oFilter&&this.oRequest.addFilter(this.oFilter)}else if("ReverseGeocodeRequest"===this.CLASSTYPE){var e={position:this.options.position,returnFreeForm:this.options.returnFreeForm,filterOptions:this.options.filterOptions||{}};this.oRequest=new a.default(e)}else this.logger.error("impossible de determiner le type de geocodage : Direct ou Inverse !?")}if(!this.oRequest)throw new Error("Type de Geocodage indefini !");return this.strRequest=this.oRequest.toString(),this.strRequest},e.default=l},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(95),s=i(96);function a(t){if(this.logger=o.default.getLogger(),this.logger.trace("[Constructeur GeocodeRequest ()]"),!(this instanceof a))throw new TypeError("GeocodeRequest constructor cannot be called as a function.");for(var e in this.options=t||{},t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);this.CLASSNAME="GeocodeRequest"}a.prototype={strRequest:null,oAddress:null,oFilter:null,template:'<GeocodeRequest returnFreeForm="__RETURNFREEFORM__">__ADDRESS__</GeocodeRequest>',addAddress:function(t){t instanceof n.default&&(this.oAddress=t)},addFilter:function(t){t instanceof s.default&&(this.oFilter=t)},constructor:a,toString:function(){var t="";if(t=this.template,!this.oAddress){var e={};if(e.location=this.options.location,e.type=this.options.filterOptions.type||["StreetAddress"],e.filter=this.options.filterOptions,delete e.filter.type,this.oFilter)for(var i in e.filter={},e.type){var o=e.type[i],s=this.oFilter.getFilter(o);if(s){for(var a=this.options.filterOptions,r=s.attributesList,l=0;l<r.length;l++){var c=r[l];if(a[c]){var u=s.serviceAttributes[l];s.placeAttributes[u]=a[c],this.logger.trace("Selection du filtre '"+c+"' sur le type '"+o+"'.")}}var h=s.placeAttributes;for(var d in h)h.hasOwnProperty(d)&&(e.filter[d]=h[d])}else this.logger.warn("Le filtre '"+o+"' n'existe pas !?")}if(this.oAddress=new n.default(e),!this.oAddress)throw new Error("La construction de l'adresse n'est pas correctement definie !?")}return t=(t=t.replace(/__ADDRESS__/g,this.oAddress.toString())).replace(/__RETURNFREEFORM__/g,this.options.returnFreeForm?"true":"false"),this.strRequest=t,this.strRequest}},e.default=a},function(t,e,i){"use strict";i.r(e);var o=i(43);function n(t){if(this.logger=o.default.getLogger("Address"),this.logger.trace("[Constructeur Address ()]"),!(this instanceof n))throw new TypeError("Address constructor cannot be called as a function.");if(this.options=t||{location:{},type:["StreetAddress"],filter:{}},!t.location)throw new Error("l'option 'location' n'est pas renseignée !");for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e])}n.prototype={constructor:n,requestString:null,template:{address:'<Address countryCode="__COUNTRYCODE__">__LOCATION____PLACE____POSTALCODE____ENVELOPE__</Address>',location:{freeFormAddress:"<freeFormAddress>__FREEFORMADDRESSVALUE__</freeFormAddress>",streetAddress:{container:"<StreetAddress>__STREET____BUILDING__</StreetAddress>",building:'<Building number="__BUILDINGVALUE__"/>',street:"<Street>__STREETVALUE__</Street>"}},place:'<Place type="__PLACETYPE__">__PLACEVALUE__</Place>',postalCode:"<PostalCode>__POSTALCODEVALUE__</PostalCode>",envelope:"<gml:Envelope><gml:lowerCorner>__LEFT__ __BOTTOM__</gml:lowerCorner><gml:upperCorner>__RIGHT__ __TOP__</gml:upperCorner></gml:Envelope>"}},n.prototype.toString=function(){var t=null;if(t=(t=this.template.address).replace(/__COUNTRYCODE__/g,this.options.type),"string"==typeof this.options.location){var e=this.template.location.freeFormAddress;e=e.replace(/__FREEFORMADDRESSVALUE__/g,this.options.location),t=t.replace(/__LOCATION__/g,e)}else{var i="",o="";this.options.location.number&&(i=(i=this.template.location.streetAddress.building).replace(/__BUILDINGVALUE__/g,this.options.location.number)),this.options.location.street&&(o=(o=this.template.location.streetAddress.street).replace(/__STREETVALUE__/g,this.options.location.street));var n=this.template.location.streetAddress.container;n=(n=n.replace(/__STREET__/g,o)).replace(/__BUILDING__/g,i),t=t.replace(/__LOCATION__/g,n)}var s="";this.options.location.postalCode&&(s=(s=this.template.postalCode).replace(/__POSTALCODEVALUE__/g,this.options.location.postalCode));var a="";if(this.options.filter){var r=this.options.filter.bbox;r&&(a=(a=(a=(a=(a=this.template.envelope).replace(/__LEFT__/g,r.left)).replace(/__BOTTOM__/g,r.bottom)).replace(/__RIGHT__/g,r.right)).replace(/__TOP__/g,r.top))}var l=[],c="";if(this.options.filter){var u=this.options.filter;for(var h in u)"bbox"!==h&&(c=(c=(c=this.template.place).replace(/__PLACETYPE__/g,h)).replace(/__PLACEVALUE__/g,u[h]),l.push(c))}var d="";return this.options.location.city&&(d=(d=(d=this.template.place).replace(/__PLACETYPE__/g,"Municipality")).replace(/__PLACEVALUE__/g,this.options.location.city),l.push(d)),t=(t=(t=t.replace(/__POSTALCODE__/g,s)).replace(/__PLACE__/g,l.join("\n"))).replace(/__ENVELOPE__/g,a),this.requestString=t,this.requestString},e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(43);function n(){if(this.logger=o.default.getLogger("GeocodeFilterExtension"),this.logger.trace("[Constructeur GeocodeFilterExtension ()]"),!(this instanceof n))throw new TypeError("GeocodeFilterExtension constructor cannot be called as a function.");this.filters=[]}n.prototype={constructor:n,addFilterExtensions:function(t){t&&this.filters.push(t)},getNames:function(){var t=[];for(var e in this.filters)t.push(this.filters[e].CLASSNAME);return this.logger.trace(t),t},getFilter:function(t){var e=null;for(var i in this.filters)this.filters[i].CLASSNAME===t&&(e=this.filters[i]);return this.logger.trace(e),e},getFilters:function(){return this.logger.trace(this.filters),this.filters},getAttributs:function(t){var e=[];for(var i in this.filters)this.filters[i].CLASSNAME===t&&(e=this.filters[i].attributesList);return this.logger.trace(e),e},setPlaceAttributs:function(t,e){var i=this.getFilter(t),o=this.getAttributs(t);for(var n in o){var s=o[n];e[s]&&(i.placeAttributes[s]=e[s])}},getPlaceAttributs:function(t){var e={};for(var i in this.filters)this.filters[i].CLASSNAME===t&&(e=this.filters[i].placeAttributes);return this.logger.trace(e),e}},e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(98),s=i(99);function a(t){if(this.logger=o.default.getLogger(),this.logger.trace("[Constructeur ReverseGeocodeRequest ()]"),!(this instanceof a))throw new TypeError("ReverseGeocodeRequest constructor cannot be called as a function.");for(var e in this.options=t||{},t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);this.CLASSNAME="ReverseGeocodeRequest"}a.prototype={strRequest:null,oPosition:null,oPreference:null,constructor:a,template:'<ReverseGeocodeRequest returnFreeForm="__RETURNFREEFORM__">__POSITION____PREFERENCE__</ReverseGeocodeRequest>',addPosition:function(t){t instanceof n.default&&(this.oPosition=t)},addPreferences:function(t){t instanceof s.default&&(this.oPreference=t)},toString:function(){var t="";if(t=this.template,!this.oPreference&&(this.oPreference=new s.default(this.options.filterOptions.type||["StreetAddress"]),!this.oPreference))throw new Error("Les preferences ne sont pas definies !?");if(t=t.replace(/__PREFERENCE__/g,this.oPreference.toString()),!this.oPosition){var e={position:this.options.position,filter:{}};if(this.options.filterOptions&&(e.filter=this.options.filterOptions,delete e.filter.type),this.oPosition=new n.default(e),!this.oPosition)throw new Error("La position et ses filtres ne sont pas definis !?")}return t=(t=t.replace(/__POSITION__/g,this.oPosition.toString())).replace(/__RETURNFREEFORM__/g,this.options.returnFreeForm?"true":"false"),this.strRequest=t,this.strRequest}},e.default=a},function(t,e,i){"use strict";i.r(e);var o=i(43);function n(t){if(this.logger=o.default.getLogger("Position"),this.logger.trace("[Constructeur Position ()]"),!(this instanceof n))throw new TypeError("Position constructor cannot be called as a function.");if(this.options=t||{},!t.position)throw new Error("l'option 'position' n'est pas renseignée !");for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e])}n.prototype={constructor:n,requestString:null,template:{position:"<Position>__GMLPOINT____GMLFILTER__</Position>",gml:{point:'<gml:Point xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos></gml:Point>',pos:null,filter:{bbox:'<gml:Envelope xmlns:gml="http://www.opengis.net/gml"><gml:lowerCorner>__LEFT__ __BOTTOM__</gml:lowerCorner><gml:upperCorner>__RIGHT__ __TOP__</gml:upperCorner></gml:Envelope>',circle:'<gml:CircleByCenterPoint xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos><gml:radius>__RADIUS__</gml:radius></gml:CircleByCenterPoint>',polygon:'<gml:Polygon xmlns:gml="http://www.opengis.net/gml"><gml:exterior><gml:LinearRing><gml:posList>__XY__</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>',multipolygon:null}}}},n.prototype.toString=function(){var t=this.template.position,e=this.template.gml.point;e=(e=e.replace(/__X__/g,this.options.position.x)).replace(/__Y__/g,this.options.position.y);var i="";if(this.options.filter){var o=this.options.filter;for(var n in o)switch(n){case"circle":i=(i=(i=(i=this.template.gml.filter[n]).replace(/__X__/g,o[n].x)).replace(/__Y__/g,o[n].y)).replace(/__RADIUS__/g,o[n].radius);break;case"bbox":i=(i=(i=(i=(i=this.template.gml.filter[n]).replace(/__LEFT__/g,o[n].left)).replace(/__BOTTOM__/g,o[n].bottom)).replace(/__RIGHT__/g,o[n].right)).replace(/__TOP__/g,o[n].top);break;case"polygon":i=this.template.gml.filter[n];for(var s="",a=o[n],r=0;r<a.length;r++){var l=a[r];if(Array.isArray(l)){this.logger.error("Holes are not implemented !");break}(l.x&&l.y||0===l.x||0===l.y)&&(s+=l.x+" "+l.y),a.length!==r+1&&(s+=" ")}i=i.replace(/__XY__/g,s);break;case"multipolygon":this.logger.warn("Filter '"+n+"' is not yet implemented !");break;default:this.logger.error("This filter '"+n+"' is not useful !")}}return t=(t=t.replace(/__GMLPOINT__/g,e)).replace(/__GMLFILTER__/g,i),this.requestString=t,this.requestString},e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(43);function n(t){if(this.logger=o.default.getLogger("Preference"),this.logger.trace("[Constructeur Preference ()]"),!(this instanceof n))throw new TypeError("Preference constructor cannot be called as a function.");this.type=t}n.prototype={constructor:n,requestString:null,template:"<ReverseGeocodePreference>__TYPE__</ReverseGeocodePreference>"},n.prototype.toString=function(){for(var t=[],e="",i=0;i<this.type.length;i++)e=(e=this.template).replace(/__TYPE__/g,this.type[i]),t.push(e);return this.strRequest=t.join("\n"),this.strRequest},e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(101);function n(){if(!(this instanceof n))throw new TypeError("StreetAddress constructor cannot be called as a function.");o.default.apply(this,arguments),this.CLASSNAME="StreetAddress",this.attributesList=["bbox","ID","IDTR","quality","territory","commune","department","insee","municipality"],this.serviceAttributes=["bbox","ID","IDTR","Qualite","Territoire","Commune","Departement","INSEE","Municipality"]}n.prototype=Object.create(o.default.prototype),n.prototype.constructor=n,e.default=n},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("GeocodeLocation constructor cannot be called as a function.");this.placeAttributes={},this.attributesList=[],this.serviceAttributes=[]}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(101);function n(){if(!(this instanceof n))throw new TypeError("PositionOfInterest constructor cannot be called as a function.");o.default.apply(this,arguments),this.CLASSNAME="PositionOfInterest",this.attributesList=["bbox","importance","nature","territory","commune","department","insee","municipality"],this.serviceAttributes=["bbox","Importance","Nature","Territoire","Commune","Departement","INSEE","Municipality"]}n.prototype=Object.create(o.default.prototype),n.prototype.constructor=n,e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(101);function n(){if(!(this instanceof n))throw new TypeError("CadastralParcel constructor cannot be called as a function.");o.default.apply(this,arguments),this.CLASSNAME="CadastralParcel",this.attributesList=["absorbedCity","sheet","number","section","commune","department","insee","municipality","origin"],this.serviceAttributes=["CommuneAbsorbee","Feuille","Numero","Section","Commune","Departement","INSEE","Municipality","Type"]}n.prototype=Object.create(o.default.prototype),n.prototype.constructor=n,e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(101);function n(){if(!(this instanceof n))throw new TypeError("Administratif constructor cannot be called as a function.");o.default.apply(this,arguments),this.CLASSNAME="Administratif",this.attributesList=["bbox","prefecture","inseeRegion","inseeDepartment","municipality"],this.serviceAttributes=["bbox","Prefecture","InseeRegion","InseeDepartement","Municipality"]}n.prototype=Object.create(o.default.prototype),n.prototype.constructor=n,e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(45),n=i(44),s=i(66),a=i(106),r={build:function(t){var e=null;if(t.response){if(t.rawResponse)e=t.response;else{try{var i=new s.default({reader:a.default});if("string"==typeof t.response?i.setXMLString(t.response):i.setXMLDoc(t.response),!(e=i.parse()))throw new Error("L'analyse de la réponse du service !?")}catch(e){var r=e.message;return"string"==typeof t.response?r+="('"+t.response+"')":r+="('"+t.response.documentElement.innerHTML+"')",void t.onError.call(t.scope,new o.default({message:n.default.getMessage("SERVICE_RESPONSE_ANALYSE",r),type:o.default.TYPE_UNKERR,status:-1}))}if(e.exceptionReport)return void t.onError.call(t.scope,new o.default({message:n.default.getMessage("SERVICE_RESPONSE_EXCEPTION",e.exceptionReport),type:o.default.TYPE_SRVERR,status:200}))}t.onSuccess.call(t.scope,e)}else t.onError.call(t.scope,new o.default({message:n.default.getMessage("SERVICE_RESPONSE_EMPTY"),type:o.default.TYPE_SRVERR,status:-1}))}};e.default=r},function(t,e,i){"use strict";i.r(e);var o=i(44),n=i(45),s=i(107),a=i(108),r={};function l(t,e){if(t.hasChildNodes())for(var i,o,n,s=t.childNodes,a=0;a<s.length;a++){if(1===(i=s[a]).nodeType)if(o=i.localName||i.baseName||i.nodeName,n=i.prefix||r.DEFAULTPREFIX,r.READERS[n][o])(0,r.READERS[n][o])(i,e);else l(i,e)}}function c(t){var e,i="";return t.hasChildNodes()&&3===(e=t.firstChild).nodeType&&(i=e.nodeValue),i}r.VERSION="1.2",r.NAMESPACES={xmlns:"http://www.opengis.net/xls",gml:"http://www.opengis.net/gml",xls:"http://www.opengis.net/xls",xlsext:"http://www.opengis.net/xlsext",xsi:"http://www.w3.org/2001/XMLSchema-instance"},r.SCHEMALOCATION="http://wxs.ign.fr/schemas/olsAll.xsd",r.DEFAULTPREFIX="xls",r.READERS={xls:{XLS:function(t){var e=new s.default;return function(t){if(t.attributes.length>0){var e=function(t){if(t.attributes.length>0){for(var e={},i=t.attributes,o=0;o<i.length;o++){var n=i[o];e[n.nodeName]=n.nodeValue}return e}}(t);for(var i in e)if(e.hasOwnProperty(i)){if("version"===i&&e.version!==r.VERSION)return void console.log("[DirectGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing");if("xmlns"===i){if(e[i]!==r.NAMESPACES[r.DEFAULTPREFIX])return void console.log("[DirectGeocodeResponseReader] geocode response default namespace is not the expected one");continue}var o=i.split(":")[0],n=i.split(":")[1];if("xmlns"===o&&n&&r.NAMESPACES[n]&&r.NAMESPACES[n]!==e[i])return void console.log("[DirectGeocodeResponseReader] geocode response "+i+" namespace is not the expected one");if("schemaLocation"===n&&r.SCHEMALOCATION!==e[i])return void console.log("[DirectGeocodeResponseReader] geocode response schema location is not the expected one")}}}(t),l(t,e),e},GeocodedAddress:function(t,e){var i=new a.default;l(t,i),e&&Array.isArray(e.locations)&&e.locations.push(i)},GeocodeMatchCode:function(t,e){var i=t.getAttribute("accuracy");i&&e&&(e.accuracy=parseFloat(i));var o=t.getAttribute("matchType");o&&e&&(e.matchType=o)},Address:function(t,e){var i=t.getAttribute("countryCode");e&&i&&(e.type=i),l(t,e)},freeFormAddress:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&(e.placeAttributes.freeform=c(t))},Building:function(t,e){var i=t.getAttribute("number");e&&e.hasOwnProperty("placeAttributes")&&(i?e.placeAttributes.number=i:t.getAttribute("buildingName")?e.placeAttributes.number=t.getAttribute("buildingName"):t.getAttribute("subdivision")&&(e.placeAttributes.number=t.getAttribute("subdivision")))},Street:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&("StreetAddress"===e.type?e.placeAttributes.street=c(t):"CadastralParcel"===e.type&&(e.placeAttributes.cadastralParcel=c(t)))},Place:function(t,e){var i=t.getAttribute("type"),o=c(t);if(e&&e.hasOwnProperty("placeAttributes"))if("Municipality"===i)e.placeAttributes.municipality=o;else if("Bbox"===i){var n=o.split(";");4===n.length&&(e.placeAttributes.bbox={left:parseFloat(n[0]),right:parseFloat(n[2]),top:parseFloat(n[1]),bottom:parseFloat(n[3])})}else"Commune"===i?e.placeAttributes.commune=o:"Departement"===i?e.placeAttributes.department=o:"INSEE"===i?e.placeAttributes.insee=o:"Qualite"===i?e.placeAttributes.quality=o:"Territoire"===i?e.placeAttributes.territory=o:"ID"===i?e.placeAttributes.ID=o:"ID_TR"===i?e.placeAttributes.IDTR=o:"Importance"===i?e.placeAttributes.importance=parseInt(o,10):"Nature"===i?e.placeAttributes.nature=o:"Numero"===i?e.placeAttributes.number=o:"Feuille"===i?e.placeAttributes.sheet=o:"Section"===i?e.placeAttributes.section=o:"CommuneAbsorbee"===i?e.placeAttributes.absorbedCity=o:"Arrondissement"===i?o&&(e.placeAttributes.arrondissement=o):"Type"===i?e.placeAttributes.origin=o:"Prefecture"===i?e.placeAttributes.prefecture=o:"InseeRegion"===i?e.placeAttributes.inseeRegion=o:"InseeDepartment"===i&&(e.placeAttributes.inseeDepartment=o)},PostalCode:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&(e.placeAttributes.postalCode=c(t))},Error:function(t){var e=t.getAttribute("message"),i=t.getAttribute("errorCode"),s=o.default.getMessage("SERVICE_RESPONSE_EXCEPTION","("+i+") : "+e);throw new n.default({message:s,type:n.default.TYPE_SRVERR})}},gml:{pos:function(t,e){var i=c(t);e&&i&&(e.position={x:parseFloat(i.split(" ")[0]),y:parseFloat(i.split(" ")[1])})}},ExceptionReport:function(t){var e={};if(t.hasChildNodes())for(var i,o=t.childNodes,n=0;n<o.length;n++)"Exception"===(i=o[n]).nodeName&&(e.exceptionReport=r.READERS.Exception(i));return e},Exception:function(t){var e={},i=t.getAttribute("exceptionCode");i&&(e.exceptionCode=i);var o=t.firstChild;return o&&3===o.nodeType&&(e.exception=o.nodeValue),e}},r.read=function(t){if("XLS"===t.nodeName){var e=t.prefix;return e||(e=r.DEFAULTPREFIX),r.READERS[e][t.nodeName](t)}if("ExceptionReport"===t.nodeName)return r.READERS[t.nodeName](t);var i=o.default.getMessage("SERVICE_RESPONSE_ANALYSE",t.nodeName);throw new n.default({message:i,type:n.default.TYPE_UNKERR,status:200})},e.default=r},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("GeocodeResponse constructor cannot be called as a function.");this.locations=[]}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(109);function n(){if(!(this instanceof n))throw new TypeError("DirectGeocodedLocation constructor cannot be called as a function.");o.default.apply(this,arguments),this.CLASSNAME="DirectGeocodedLocation",this.accuracy=null}n.prototype=Object.create(o.default.prototype),n.prototype.constructor=n,e.default=n},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("GeocodedLocation constructor cannot be called as a function.");this.position={x:null,y:null},this.matchType=null,this.placeAttributes={},this.type=null}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(45),a=i(46),r=i(111),l=i(112);function c(t){if(!(this instanceof c))throw new TypeError(n.default.getMessage("CLASS_CONSTRUCTOR","ReverseGeocode"));if(this.CLASSNAME="ReverseGeocode",a.default.apply(this,arguments),this.logger=o.default.getLogger("Gp.Services.ReverseGeocode"),this.logger.trace("[Constructeur ReverseGeocode (options)]"),!t.position)throw new Error(n.default.getMessage("PARAM_MISSING","position"));if(null===t.position.x)throw new Error(n.default.getMessage("PARAM_MISSING","position.x"));if(null===t.position.y)throw new Error(n.default.getMessage("PARAM_MISSING","position.y"));this.options.position=t.position,t.filterOptions&&"object"==typeof t.filterOptions||(this.options.filterOptions=t.filterOptions={type:["StreetAddress"]}),0===Object.keys(t.filterOptions).length&&(this.options.filterOptions={type:["StreetAddress"]});for(var e=Object.keys(t.filterOptions),i=0;i<e.length;i++){var s=e[i];t.filterOptions[s]&&0!==Object.keys(t.filterOptions[s]).length||delete this.options.filterOptions[s]}if(this.options.filterOptions.type=t.filterOptions.type||["StreetAddress"],!Array.isArray(this.options.filterOptions.type))throw new Error(n.default.getMessage("PARAM_TYPE","filterOptions.type"));if(this.options.maximumResponses=t.maximumResponses||25,this.options.returnFreeForm=t.returnFreeForm||!1,this.options.srs=t.srs||"CRS:84",-1===c.geoEPSG.indexOf(this.options.srs)){if(this.options.position={x:this.options.position.y,y:this.options.position.x},this.options.filterOptions&&this.options.filterOptions.circle){var r=this.options.filterOptions.circle;this.options.filterOptions.circle={x:r.y,y:r.x,radius:r.radius}}if(this.options.filterOptions&&this.options.filterOptions.polygon){var l=this.options.filterOptions.polygon;for(i=0;i<l.length;i++){var u=l[i];this.options.filterOptions.polygon[i]={x:u.y,y:u.x}}}}this.options.outputFormat=this.options.rawResponse?"":"xml"}c.prototype=Object.create(a.default.prototype,{}),c.prototype.constructor=c,c.prototype.buildRequest=function(t,e){var i={httpMethod:this.options.httpMethod,position:this.options.position,returnFreeForm:this.options.returnFreeForm,filterOptions:this.options.filterOptions,srs:"EPSG:4326",maximumResponses:this.options.maximumResponses};this.request=r.default.build(i),this.request?e.call(this,this.request):t.call(this,new s.default(n.default.getMessage("SERVICE_REQUEST_BUILD")))},c.prototype.analyzeResponse=function(t,e){if(this.response){var i={response:this.response,rawResponse:this.options.rawResponse,onError:t,onSuccess:e,scope:this};l.default.build(i)}else t.call(this,new s.default(n.default.getMessage("SERVICE_RESPONSE_EMPTY")))},c.geoEPSG=["EPSG:4326"],e.default=c},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(89),s=i(93),a={build:function(t){var e=o.default.getLogger("ReverseGeocodeRequestFactory");e.trace(["ReverseGeocodeRequestFactory::build()"]);var i=t||{},a=null,r=new s.default({position:i.position,returnFreeForm:i.returnFreeForm,filterOptions:i.filterOptions}),l=new n.default({srsName:i.srs,maximumResponses:i.maximumResponses});(l.namespace=!0,l.setService(r),a=l.build(),"GET"===i.httpMethod)&&(a="qxml="+encodeURIComponent(a).replace(/-/g,"%2D").replace(/_/g,"%5F").replace(/\./g,"%2E").replace(/!/g,"%21").replace(/~/g,"%7E").replace(/\*/g,"%2A").replace(/'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29"));return e.trace(a),a}};e.default=a},function(t,e,i){"use strict";i.r(e);var o=i(44),n=i(45),s=i(66),a=i(113),r={build:function(t){var e=null;if(t.response){if(t.rawResponse)e=t.response;else{try{var i=new s.default({reader:a.default});if("string"==typeof t.response?i.setXMLString(t.response):i.setXMLDoc(t.response),!(e=i.parse()))throw new Error("L'analyse de la réponse du service !?")}catch(e){return e.status=200,void t.onError.call(t.scope,e)}if(e.exceptionReport)return void t.onError.call(t.scope,new n.default({message:o.default.getMessage("SERVICE_RESPONSE_EXCEPTION",e.exceptionReport),type:n.default.TYPE_SRVERR,status:200}));var r,l;if(t.scope&&t.scope.options&&t.scope.options.srs&&"EPSG:4326"!==t.scope.options.srs)if(e||e.locations||e.locations.length)for(var c=0;c<e.locations.length;c++)(r=e.locations[c])&&(l=r.position)&&(r.position={x:l.y,y:l.x})}t.onSuccess.call(t.scope,e)}else t.onError.call(t.scope,new n.default({message:o.default.getMessage("SERVICE_RESPONSE_EMPTY"),type:n.default.TYPE_SRVERR,status:-1}))}};e.default=r},function(t,e,i){"use strict";i.r(e);var o=i(44),n=i(45),s=i(107),a=i(114),r={};function l(t,e){if(t.hasChildNodes())for(var i,o,n,s=t.childNodes,a=0;a<s.length;a++){if(1===(i=s[a]).nodeType)if(o=i.localName||i.baseName||i.nodeName,n=i.prefix||r.DEFAULTPREFIX,r.READERS[n][o])(0,r.READERS[n][o])(i,e);else l(i,e)}}function c(t){var e,i="";return t.hasChildNodes()&&3===(e=t.firstChild).nodeType&&(i=e.nodeValue),i}r.VERSION="1.2",r.NAMESPACES={xmlns:"http://www.opengis.net/xls",gml:"http://www.opengis.net/gml",xls:"http://www.opengis.net/xls",xlsext:"http://www.opengis.net/xlsext",xsi:"http://www.w3.org/2001/XMLSchema-instance"},r.SCHEMALOCATION="http://wxs.ign.fr/schemas/olsAll.xsd",r.DEFAULTPREFIX="xls",r.READERS={xls:{XLS:function(t){var e=new s.default;return function(t){if(t.attributes.length>0){var e=function(t){if(t.attributes.length>0){for(var e={},i=t.attributes,o=0;o<i.length;o++){var n=i[o];e[n.nodeName]=n.nodeValue}return e}}(t);for(var i in e)if(e.hasOwnProperty(i)){if("version"===i&&e.version!==r.VERSION)return void console.log("[ReverseGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing");if("xmlns"===i){if(e[i]!==r.NAMESPACES[r.DEFAULTPREFIX])return void console.log("[ReverseGeocodeResponseReader] geocode response default namespace is not the expected one");continue}var o=i.split(":")[0],n=i.split(":")[1];if("xmlns"===o&&n&&r.NAMESPACES[n]&&r.NAMESPACES[n]!==e[i])return void console.log("[ReverseGeocodeResponseReader] geocode response "+i+" namespace is not the expected one");if("schemaLocation"===n&&r.SCHEMALOCATION!==e[i])return void console.log("[ReverseGeocodeResponseReader] geocode response schema location is not the expected one")}}}(t),l(t,e),e},ReverseGeocodedLocation:function(t,e){var i=new a.default;l(t,i),e&&Array.isArray(e.locations)&&e.locations.push(i)},Address:function(t,e){var i=t.getAttribute("countryCode");e&&i&&(e.type=i),l(t,e)},Building:function(t,e){var i=t.getAttribute("number");e&&e.hasOwnProperty("placeAttributes")&&(i?e.placeAttributes.number=i:t.getAttribute("buildingName")?e.placeAttributes.number=t.getAttribute("buildingName"):t.getAttribute("subdivision")&&(e.placeAttributes.number=t.getAttribute("subdivision")))},Street:function(t,e){"StreetAddress"===e.type?e.placeAttributes.street=c(t):"CadastralParcel"===e.type&&(e.placeAttributes.cadastralParcel=c(t))},Place:function(t,e){var i=t.getAttribute("type"),o=c(t);if(e&&e.hasOwnProperty("placeAttributes"))if("Municipality"===i)e.placeAttributes.municipality=o;else if("Bbox"===i){var n=o.split(";");4===n.length&&(e.placeAttributes.bbox={left:parseFloat(n[0]),right:parseFloat(n[2]),top:parseFloat(n[1]),bottom:parseFloat(n[3])})}else"Commune"===i?e.placeAttributes.commune=o:"Departement"===i?e.placeAttributes.department=o:"INSEE"===i?e.placeAttributes.insee=o:"Qualite"===i?e.placeAttributes.quality=o:"Territoire"===i?e.placeAttributes.territory=o:"ID"===i?e.placeAttributes.ID=o:"ID_TR"===i?e.placeAttributes.IDTR=o:"Importance"===i?e.placeAttributes.importance=parseInt(o,10):"Nature"===i?e.placeAttributes.nature=o:"Numero"===i?e.placeAttributes.number=o:"Feuille"===i?e.placeAttributes.sheet=o:"Section"===i?e.placeAttributes.section=o:"CommuneAbsorbee"===i?e.placeAttributes.absorbedCity=o:"Arrondissement"===i?o&&(e.placeAttributes.arrondissement=o):"Type"===i?e.placeAttributes.origin=o:"Prefecture"===i?e.placeAttributes.prefecture=o:"InseeRegion"===i?e.placeAttributes.inseeRegion=o:"InseeDepartment"===i&&(e.placeAttributes.inseeDepartment=o)},PostalCode:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&(e.placeAttributes.postalCode=c(t))},SearchCentreDistance:function(t,e){e&&(e.searchCenterDistance=parseFloat(t.getAttribute("value")))},Error:function(t){var e=t.getAttribute("message"),i=t.getAttribute("errorCode"),s=o.default.getMessage("SERVICE_RESPONSE_EXCEPTION","("+i+") : "+e);throw new n.default({message:s,type:n.default.TYPE_SRVERR})}},gml:{pos:function(t,e){var i=c(t);e&&i&&(e.position={x:parseFloat(i.split(" ")[0]),y:parseFloat(i.split(" ")[1])})}},xlsext:{ExtendedGeocodeMatchCode:function(t,e){e&&(e.matchType=c(t))}},ExceptionReport:function(t){var e={};if(t.hasChildNodes())for(var i,o=t.childNodes,n=0;n<o.length;n++)"Exception"===(i=o[n]).nodeName&&(e.exceptionReport=r.READERS.Exception(i));return e},Exception:function(t){var e={},i=t.getAttribute("exceptionCode");i&&(e.exceptionCode=i);var o=t.firstChild;return o&&3===o.nodeType&&(e.exception=o.nodeValue),e}},r.read=function(t){if("XLS"===t.nodeName){var e=t.prefix;return e||(e=r.DEFAULTPREFIX),r.READERS[e][t.nodeName](t)}if("ExceptionReport"===t.nodeName)return r.READERS[t.nodeName](t);throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.")},e.default=r},function(t,e,i){"use strict";i.r(e);var o=i(109);function n(){if(!(this instanceof n))throw new TypeError("ReverseGeocodedLocation constructor cannot be called as a function.");o.default.apply(this,arguments),this.CLASSNAME="ReverseGeocodedLocation",this.searchCenterDistance=null}n.prototype=Object.create(o.default.prototype),n.prototype.constructor=n,e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(46),n=i(116),s=i(43),a=i(44),r=i(47),l=i(45);function c(t){if(!(this instanceof c))throw new TypeError(a.default.getMessage("CLASS_CONSTRUCTOR","AutoComplete"));if(this.CLASSNAME="AutoComplete",o.default.apply(this,arguments),this.logger=s.default.getLogger("Gp.Services.AutoComplete"),this.logger.trace("[Constructeur AutoComplete (options)]"),!t.text)throw new Error(a.default.getMessage("PARAM_MISSING","text"));this.options.text=t.text,t.filterOptions&&"object"==typeof t.filterOptions||(this.options.filterOptions=t.filterOptions={territory:[],type:["StreetAddress"]}),0===Object.keys(t.filterOptions).length&&(this.options.filterOptions={territory:[],type:["StreetAddress"]}),this.options.filterOptions.type=t.filterOptions.type||["StreetAddress"],this.options.filterOptions.territory=t.filterOptions.territory||[],this.options.maximumResponses=t.maximumResponses||10,"XHR"===this.options.protocol&&"POST"===this.options.httpMethod&&(this.logger.warn("Le service ne gére pas le mode d'interrogation en POST, on bascule sur du GET !"),this.options.httpMethod="GET"),this.options.outputFormat=this.options.rawResponse?"":"json"}c.prototype=Object.create(o.default.prototype,{}),c.prototype.constructor=c,c.prototype.buildRequest=function(t,e){var i="";this.options.filterOptions.territory&&(i=this.options.filterOptions.territory.join(";"));var o="";this.options.filterOptions.type&&(o=this.options.filterOptions.type.join(",")),this.request=r.default.normalyzeParameters({text:encodeURIComponent(this.options.text),type:o,terr:i,maximumResponses:this.options.maximumResponses}),this.request?e.call(this,this.request):t.call(this,new l.default(a.default.getMessage("SERVICE_REQUEST_BUILD")))},c.prototype.analyzeResponse=function(t,e){if(this.response){var i={response:this.response,rawResponse:this.options.rawResponse,onSuccess:e,onError:t,scope:this};n.default.build(i)}else t.call(this,new l.default(a.default.getMessage("SERVICE_RESPONSE_EMPTY")))},e.default=c},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(45),a=i(117),r=i(118),l={build:function(t){var e=o.default.getLogger("AutoCompleteResponseFactory");e.trace(["AutoCompleteResponseFactory::build()"]);var i=null;if(t.response){if(t.rawResponse)e.trace("analyze response : raw"),i=t.response;else{var l;if(l="string"==typeof t.response?JSON.parse(t.response):t.response){if(l.error)return void t.onError.call(t.scope,new s.default({message:n.default.getMessage("SERVICE_RESPONSE_EXCEPTION",l.error.description),status:l.error.code,type:s.default.TYPE_SRVERR}));if(i=new a.default,!l.results||!Array.isArray(l.results))return void t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_FORMAT_3")));for(var c,u=0;u<l.results.length;u++){var h=l.results[u];(c=new r.default)&&(h&&"StreetAddress"===h.country?(c.street=h.street,c.type="StreetAddress"):h&&"PositionOfInterest"===h.country&&(c.poi=h.street,c.kind=h.kind,c.type="PositionOfInterest"),c.position&&(c.position.x=h.x,c.position.y=h.y),c.commune=h.city,c.fullText=h.fulltext,c.postalCode=h.zipcode,c.classification=h.classification),i.suggestedLocations.push(c)}if(!i.suggestedLocations.length)return void t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_FORMAT_3")))}if(!i)return void t.onError.call(t.scope,new s.default({message:n.default.getMessage("SERVICE_RESPONSE_ANALYSE_2"),type:s.default.TYPE_UNKERR,status:-1}));if(i.exceptionReport)return void t.onError.call(t.scope,new s.default({message:n.default.getMessage("SERVICE_RESPONSE_EXCEPTION",i.exceptionReport),type:s.default.TYPE_SRVERR,status:200}))}t.onSuccess.call(t.scope,i)}else t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_EMPTY")))}};e.default=l},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("AutoCompleteResponse constructor cannot be called as a function.");this.suggestedLocations=[]}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("SuggestedLocation constructor cannot be called as a function.");this.type=null,this.position={x:null,y:null},this.commune=null,this.fullText=null,this.postalCode=null,this.classification=null,this.street=null,this.poi=null,this.kind=null}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(45),a=i(46),r=i(56),l=i(120),c=i(128);function u(t){if(!(this instanceof u))throw new TypeError(n.default.getMessage("CLASS_CONSTRUCTOR","Route"));if(this.CLASSNAME="Route",a.default.apply(this,arguments),this.logger=o.default.getLogger("Gp.Services.Route"),this.logger.trace("[Constructeur Route (options)]"),!t.startPoint)throw new Error(n.default.getMessage("PARAM_MISSING","startPoint"));if(null===t.startPoint.x)throw new Error(n.default.getMessage("PARAM_MISSING","startPoint.x"));if(null===t.startPoint.y)throw new Error(n.default.getMessage("PARAM_MISSING","startPoint.y"));if(!t.endPoint)throw new Error(n.default.getMessage("PARAM_MISSING","endPoint"));if(null===t.endPoint.x)throw new Error(n.default.getMessage("PARAM_MISSING","endPoint.x"));if(null===t.endPoint.y)throw new Error(n.default.getMessage("PARAM_MISSING","endPoint.y"));if(this.options.api="string"==typeof t.api?t.api.toUpperCase():"REST",this.options.outputFormat="string"==typeof t.outputFormat?t.outputFormat.toLowerCase():"json",this.options.startPoint=t.startPoint,this.options.endPoint=t.endPoint,this.options.viaPoints=t.viaPoints||null,this.options.exclusions=t.exclusions||null,this.options.routePreference=t.routePreference||"fastest",this.options.graph=t.graph||"Voiture",this.options.geometryInInstructions=t.geometryInInstructions||!1,this.options.provideBbox=t.provideBbox||!0,this.options.distanceUnit=t.distanceUnit||"km",this.options.expectedStartTime=null,this.options.srs=t.srs||"EPSG:4326",this.options.api="REST",this.logger.warn("Surcharge option 'api' : REST (readers OLS non implémentés)"),"XHR"===this.options.protocol&&(this.options.httpMethod="GET",this.logger.trace("Surcharge option 'HttpMethod' : "+this.options.httpMethod)),!this.options.serverUrl){var e=r.default.Route.url(this.options.apiKey),i=null;switch(this.options.api){case"OLS":i=e.ols;break;case"REST":i=e["route-"+this.options.outputFormat];break;default:throw new Error(n.default.getMessage("PARAM_UNKNOWN","api"))}if(!i)throw new Error("Url by default not found !");this.options.serverUrl=i,this.logger.trace("Serveur URL par defaut : "+this.options.serverUrl)}var s=this.options.serverUrl.lastIndexOf(".");if(-1!==s){var l=this.options.serverUrl.substring(s+1);if(l&&l.length<5)switch(this.logger.trace("Serveur Extension URL : "+l),l.toLowerCase()){case"json":case"xml":this.options.outputFormat=l.toLowerCase();break;default:throw new Error("type of service : unknown or unsupported (json or xml) !")}}}u.prototype=Object.create(a.default.prototype,{}),u.prototype.constructor=u,u.prototype.buildRequest=function(t,e){var i={api:this.options.api,startPoint:this.options.startPoint,endPoint:this.options.endPoint,viaPoints:this.options.viaPoints,provideBbox:this.options.provideBbox,exclusions:this.options.exclusions,distanceUnit:this.options.distanceUnit,graph:this.options.graph,geometryInInstructions:this.options.geometryInInstructions,routePreference:this.options.routePreference,srs:this.options.srs};this.request=l.default.build(i),this.request?e.call(this,this.request):t.call(this,new s.default(n.default.getMessage("SERVICE_REQUEST_BUILD")))},u.prototype.analyzeResponse=function(t,e){if(this.response){var i={distanceUnit:this.options.distanceUnit,response:this.response,outputFormat:this.options.outputFormat,api:this.options.api,rawResponse:this.options.rawResponse,onError:t,onSuccess:e,scope:this};c.default.build(i)}else t.call(this,new s.default(n.default.getMessage("SERVICE_RESPONSE_EMPTY")))},e.default=u},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(45),s=i(121),a=i(126),r={build:function(t){o.default.getLogger("RouteRequestFactory").trace(["RouteRequestFactory::build()"]);var e=null,i=t||{},r=!(null===t.onError||"function"!=typeof t.onError),l=null;switch(t.api){case"REST":var c=new a.default(i);if(!c.processRequestString()){if(l="Error process request (rest) !",r)return void t.onError.call(t.scope,new n.default(l));throw new Error(l)}e=c.requestString;break;case"OLS":if(!(e=s.default.build(i))){if(l="Error process request (ols) !",r)return void t.onError.call(t.scope,new n.default(l));throw new Error(l)}break;default:if(l="Type of API is not supported by service (REST or OLS) !",r)return void t.onError.call(t.scope,new n.default(l));throw new Error(l)}return e}};e.default=r},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(89),s=i(122),a={build:function(t){o.default.getLogger("RouteRequestOLS").trace(["RouteRequestOLS::build()"]);var e=null,i={startPoint:t.startPoint,endPoint:t.endPoint,viaPoint:t.viaPoints,provideBoundingBox:t.provideBbox,avoidFeature:t.exclusions,expectedStartTime:t.expectedStartTime,distanceUnit:t.distanceUnit,graph:t.graph,provideGeometry:t.geometryInInstructions,routePreference:t.routePreference},a=new s.default(i),r=new n.default({srsName:t.srs,maximumResponses:t.maximumResponses});(r.namespace=!0,r.setService(a),e=r.build(),"GET"===t.httpMethod)&&(e="qxml="+encodeURIComponent(e).replace(/-/g,"%2D").replace(/_/g,"%5F").replace(/\./g,"%2E").replace(/!/g,"%21").replace(/~/g,"%7E").replace(/\*/g,"%2A").replace(/'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29"));return e}};e.default=a},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(92),s=i(123),a=i(125),r=i.n(a);function l(t){if(this.logger=o.default.getLogger(),this.logger.trace("[Constructeur RouteService ()]"),!(this instanceof l))throw new TypeError("RouteService constructor cannot be called as a function.");this.CLASSNAME="RouteService",this.CLASSTYPE="RouteRequest",n.default.apply(this,arguments)}l.prototype=Object.create(n.default.prototype,{}),l.prototype.constructor=l,l.prototype.addRequest=function(t){if("DetermineRouteRequest"!==t.CLASSNAME)throw new Error("Ce n'est pas un objet de type 'Route Request' !?");this.oRequest=t},l.prototype.addFilter=function(t){t instanceof r.a&&(this.oFilter=t)},l.prototype.toString=function(){if(!this.oRequest){if(!this.options)throw new Error("Les options ne sont pas renseignées, impossible de construire la requête !");if("RouteRequest"===this.CLASSTYPE){var t={distanceUnit:this.options.distanceUnit||null,provideGeometry:this.options.provideGeometry||null,provideBoundingBox:this.options.provideBoundingBox||null,route:{routePreference:this.options.routePreference||null,startPoint:this.options.startPoint,viaPoint:this.options.viaPoint||null,endPoint:this.options.endPoint,avoidFeature:this.options.avoidFeature||null,graph:this.options.graph||null,expectedStartTime:this.options.expectedStartTime||null}};this.oRequest=new s.default(t),this.oFilter&&this.oRequest.addFilter(this.oFilter)}}if(!this.oRequest)throw new Error("Type de requête indefini !");return this.strRequest=this.oRequest.toString(),this.strRequest},e.default=l},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(124);function s(t){if(this.logger=o.default.getLogger(),this.logger.trace("[Constructeur DetermineRouteRequest ()]"),!(this instanceof s))throw new TypeError("DetermineRouteRequest constructor cannot be called as a function.");for(var e in this.options=t||{},t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);this.CLASSNAME="DetermineRouteRequest"}s.prototype={strRequest:null,oRoutePlan:null,template:{determineRouteRequest:'<DetermineRouteRequest distanceUnit="__DISTANCEUNIT__">__ROUTEPLAN____ROUTEINSTRUCTIONREQUEST____ROUTEGEOMETRYREQUEST____ROUTEMAPREQUEST__</DetermineRouteRequest>',routeInstructionRequest:'<RouteInstructionsRequest provideGeometry="__PROVIDEGEOMETRY__" provideBoundingBox="__PROVIDEBBOX__" />',routeGeometryRequest:"<RouteGeometryRequest />",routeMapRequest:""},addRoute:function(t){t instanceof n.default&&(this.oRoutePlan=t)},constructor:s,toString:function(){var t="";if(t=(t=this.template.determineRouteRequest).replace(/__DISTANCEUNIT__/g,this.options.distanceUnit||"KM"),!this.oRoutePlan){var e=this.options.route;if(this.oRoutePlan=new n.default(e),!this.oRoutePlan)throw new Error("La construction du calcul d'initineraire n'est pas correctement definie !?")}t=t.replace(/__ROUTEPLAN__/g,this.oRoutePlan.toString());var i=this.template.routeInstructionRequest;i=(i=i.replace(/__PROVIDEGEOMETRY__/g,this.options.provideGeometry||!1)).replace(/__PROVIDEBBOX__/g,this.options.provideBoundingBox||!1),t=t.replace(/__ROUTEINSTRUCTIONREQUEST__/g,i);var o=this.template.routeGeometryRequest;t=t.replace(/__ROUTEGEOMETRYREQUEST__/g,o);var s=this.template.routeMapRequest;return t=t.replace(/__ROUTEMAPREQUEST__/g,s),this.strRequest=t,this.strRequest}},e.default=s},function(t,e,i){"use strict";i.r(e);var o=i(43);function n(t){if(this.logger=o.default.getLogger("RoutePlan"),this.logger.trace("[Constructeur RoutePlan ()]"),!(this instanceof n))throw new TypeError("RoutePlan constructor cannot be called as a function.");if(this.options=t||{},!t.startPoint)throw new Error("l'option 'startPoint' n'est pas renseignée !");if(!t.endPoint)throw new Error("l'option 'endPoint' n'est pas renseignée !");for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e])}n.prototype={constructor:n,requestString:null,template:{routePlan:"<RoutePlan>__ROUTEPREFERENCE____GRAPH____WAYPOINTLIST____AVOIDLIST__</RoutePlan>",routePreference:"<RoutePreference>__VALUEROUTEPREFERENCE__</RoutePreference>",graph:'<xlsext:graphName xmlns:xlsext="http://www.opengis.net/xlsext" name="__VALUEGRAPH__"/>',wayPointList:{container:"<WayPointList>__STARTPOINT____VIAPOINT____ENDPOINT__</WayPointList>",point:'<Position><gml:Point xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos></gml:Point></Position>',startPoint:"<StartPoint>__POINT__</StartPoint>",endPoint:"<EndPoint>__POINT__</EndPoint>",viaPoint:"<ViaPoint>__POINT__</ViaPoint>"},avoidList:{container:"<AvoidList>__AVOIDFEATURE__</AvoidList>",avoidFeature:"<AvoidFeature>__VALUEAVOIDFEATURE__</AvoidFeature>"}},toString:function(){var t="";if(t=this.template.routePlan,this.options.routePreference){var e=this.template.routePreference;e=e.replace(/__VALUEROUTEPREFERENCE__/,this.options.routePreference),t=t.replace(/__ROUTEPREFERENCE__/g,e)}if(t=t.replace(/__ROUTEPREFERENCE__/g,""),this.options.avoidFeature){for(var i=this.template.avoidList.container,o=[],n=0;n<this.options.avoidFeature.length;n++){var s=this.template.avoidList.avoidFeature;s=s.replace(/__VALUEAVOIDFEATURE__/,this.options.avoidFeature[n]),o.push(s)}i=i.replace(/__AVOIDFEATURE__/,o.join("\n")),t=t.replace(/__AVOIDLIST__/g,i)}if(t=t.replace(/__AVOIDLIST__/g,""),this.options.graph){var a=this.template.graph;a=a.replace(/__VALUEGRAPH__/,this.options.graph),t=t.replace(/__GRAPH__/g,a)}t=t.replace(/__GRAPH__/g,"");var r=this.template.wayPointList.container,l="";if(l=(l=(l=this.template.wayPointList.point).replace(/__X__/,this.options.startPoint.x)).replace(/__Y__/,this.options.startPoint.y),r=r.replace(/__STARTPOINT__/,this.template.wayPointList.startPoint.replace(/__POINT__/,l)),l=(l=(l=this.template.wayPointList.point).replace(/__X__/,this.options.endPoint.x)).replace(/__Y__/,this.options.endPoint.y),r=r.replace(/__ENDPOINT__/,this.template.wayPointList.endPoint.replace(/__POINT__/,l)),this.options.viaPoint){for(var c=[],u=0;u<this.options.viaPoint.length;u++){var h=this.options.viaPoint[u];l=(l=(l=this.template.wayPointList.point).replace(/__X__/,h.x)).replace(/__Y__/,h.y),c.push(l)}r=r.replace(/__VIAPOINT__/,this.template.wayPointList.viaPoint.replace(/__POINT__/,c.join("\n")))}else r=r.replace(/__VIAPOINT__/,"");return t=t.replace(/__WAYPOINTLIST__/g,r),this.requestString=t,this.requestString}},e.default=n},function(t,e){},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(127);function a(t){if(this.logger=o.default.getLogger("RouteRequestREST"),this.logger.trace("[Constructeur RouteRequestREST ()]"),!(this instanceof a))throw new TypeError("RouteRequestREST constructor cannot be called as a function.");if(!t)throw new Error(n.default.getMessage("PARAM_EMPTY","options"));this.settings=t}a.prototype={requestString:null,constructor:a,processRequestString:function(){this.logger.warn(" PROTOTYPE !");for(var t=new s.default(this.settings).getParams(),e="",i=0;i<t.length;i++){var o=t[i];e&&(e+="&"),e+=o.k+"="+o.v}return this.logger.trace(e),this.requestString=e,this.requestString}},e.default=a},function(t,e,i){"use strict";i.r(e);var o=i(43);function n(t){if(!(this instanceof n))throw new TypeError("RouteParamREST constructor cannot be called as a function.");if(this.logger=o.default.getLogger(),this.logger.trace("[Constructeur RouteParamREST ()]"),this.options=t||{},this.origin=this.options.startPoint.x+","+this.options.startPoint.y,this.destination=this.options.endPoint.x+","+this.options.endPoint.y,this.waypoints=this.options.viaPoints||null,this.startDateTime=this.options.expectedStartTime||null,this.graphName=this.options.graph,this.srs=this.options.srs,this.exclusions=this.options.exclusions,this.method="TIME",this.options.routePreference)switch(this.options.routePreference){case"fastest":this.method="TIME";break;case"shortest":this.method="DISTANCE";break;default:this.logger.warn("Par defaut, on prend l'itinéraire le plus rapide !"),this.method="TIME"}this.format=this.options.geometryInInstructions?"STANDARDEXT":"STANDARD",this.tolerance=10,this.profileId=null,this.profileName=null}n.CLASSNAME="RouteParamREST",n.prototype={constructor:n,getWaypoints:function(){if(this.waypoints){for(var t=[],e=0;e<this.waypoints.length;e++){var i=this.waypoints[e];t.push(i.x+","+i.y)}return t.join(";")}},getExclusions:function(){return this.exclusions.join(";")}},n.prototype.getParams=function(){var t=[];return t.push({k:"origin",v:this.origin}),t.push({k:"destination",v:this.destination}),t.push({k:"method",v:this.method}),this.waypoints&&t.push({k:"waypoints",v:this.getWaypoints()}),this.startDateTime&&t.push({k:"startDateTime",v:this.startDateTime}),this.graphName&&t.push({k:"graphName",v:this.graphName}),this.exclusions&&t.push({k:"exclusions",v:this.getExclusions()}),this.srs&&t.push({k:"srs",v:this.srs}),this.format&&t.push({k:"format",v:this.format}),t},e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(45),a=i(66),r=i(129),l=i(130),c=i(133),u=i(131),h=i(132),d={build:function(t){var e=o.default.getLogger("RouteResponseFactory");e.trace("RouteResponseFactory::build()");var i=null;if(t.response){if(t.rawResponse)e.trace("analyze response : raw"),i=t.response;else{switch(t.outputFormat){case"xml":e.trace("analyze response : xml");var d="REST"===t.api?l.default:c.default;try{var p=new a.default({reader:d});if("string"==typeof t.response?p.setXMLString(t.response):p.setXMLDoc(t.response),!(i=p.parse()))throw new s.default(n.default.getMessage("SERVICE_RESPONSE_FORMAT","xml"))}catch(e){return void t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_ANALYSE",t.response)))}break;case"json":var m;if(e.trace("analyze response : json"),(m="string"==typeof t.response?JSON.parse(t.response):t.response).message)return void t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_EXCEPTION",m.message)));if(m){var f=[],_=[],g=[];if((i=new u.default).hasOwnProperty("totalTime")&&(i.totalTime=parseFloat(m.durationSeconds)),i.hasOwnProperty("totalDistance")&&(i.totalDistance="m"===t.distanceUnit?m.distanceMeters:m.distance),i.hasOwnProperty("bbox")){var v=m.bounds.split(/[,;]/);i.bbox.left=parseFloat(v[0]),i.bbox.bottom=parseFloat(v[1]),i.bbox.right=parseFloat(v[2]),i.bbox.top=parseFloat(v[3])}if(i.hasOwnProperty("routeGeometry")){var y=m.geometryWkt||m.simplifiedWkt;if(y&&(r.default.toJson(y,(function(t){i.routeGeometry=t}),(function(e){console.log(e),t.onError.call(t.scope,new s.default(n.default.getMessage("PARAM_FORMAT",["geometryWkt"])))})),!i.routeGeometry))return}if(i.hasOwnProperty("routeInstructions")){var E,P=m.legs;if(Array.isArray(P)&&P.length)for(E=0;E<P.length;E++)f.push(P[E]);if(Array.isArray(f)&&f.length)for(E=0;E<f.length;E++)_.push(f[E].steps);if(Array.isArray(_)&&_.length)for(E=0;E<_.length;E++)g=g.concat(_[E]);g.forEach((function(e){i.routeInstructions.push(new h.default),i.routeInstructions[i.routeInstructions.length-1].duration=e.durationSeconds,i.routeInstructions[i.routeInstructions.length-1].distance="m"===t.distanceUnit?e.distanceMeters:e.distance,i.routeInstructions[i.routeInstructions.length-1].code=e.navInstruction;for(var o=[],n=0;n<e.points.length;n++){var s=e.points[n].split(",");s&&o.push(s)}switch(o&&0!==o.length?i.routeInstructions[i.routeInstructions.length-1].geometry={coordinates:o,type:"LineString"}:i.routeInstructions[i.routeInstructions.length-1].geometry=null,"Valeur non renseignée"===e.name&&(e.name=""),e.navInstruction){case"F":e.name?i.routeInstructions[i.routeInstructions.length-1].instruction="Tout droit "+e.name:i.routeInstructions[i.routeInstructions.length-1].instruction="Continuer tout droit ";break;case"B":i.routeInstructions[i.routeInstructions.length-1].instruction="Demi-tour "+e.name;break;case"L":i.routeInstructions[i.routeInstructions.length-1].instruction="Tourner à gauche "+e.name;break;case"R":i.routeInstructions[i.routeInstructions.length-1].instruction="Tourner à droite "+e.name;break;case"BL":i.routeInstructions[i.routeInstructions.length-1].instruction="Tourner très à gauche "+e.name;break;case"BR":i.routeInstructions[i.routeInstructions.length-1].instruction="Tourner très à droite "+e.name;break;case"FL":i.routeInstructions[i.routeInstructions.length-1].instruction="Tourner légèrement à gauche "+e.name;break;case"FR":i.routeInstructions[i.routeInstructions.length-1].instruction="Tourner légèrement à droite "+e.name;break;case"round_about_entry":i.routeInstructions[i.routeInstructions.length-1].instruction="Entrée rond-point "+e.name;break;case"round_about_exit":i.routeInstructions[i.routeInstructions.length-1].instruction="Sortie rond-point "+e.name;break;case null:i.routeInstructions[i.routeInstructions.length-1].instruction="Prendre tout droit "+e.name;break;default:i.routeInstructions[i.routeInstructions.length-1].instruction="?"+e.navInstruction+"? "+e.name}}))}}if(!i)return void t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_ANALYSE","json")));break;default:return void t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_FORMAT","json","xml")))}if(i&&i.exceptionReport)return void t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_EXCEPTION_2")))}t.onSuccess.call(t.scope,i)}else t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_EMPTY")))}};e.default=d},function(t,e,i){"use strict";i.r(e);var o=i(43),n={toJson:function(t,e,i){var n=o.default.getLogger(),s=null;try{if(!t)throw new Error("La chaine WKT n'est pas renseignée !");var a,r;if(e||(e=function(t){console.log(t)}),i||(i=function(t){console.log(t)}),a=/(-?\d+\.?[0-9]*)\s(-?\d+\.?[0-9]+)/g,r="[$1,$2]",t=t.replace(a,r),(a=/^(\w+)/).exec(t),"POLYGON"===RegExp.$1?(r='{"type" : "Polygon",',t=t.replace(RegExp.$1,r),a=/(\({2}?)/,r='"coordinates" : [[',t=t.replace(a,r),a=/(\){2}?)/,r="]]}",t=t.replace(a,r),a=/(\()/g,r="[",t=t.replace(a,r),a=/(\))/g,r="]",t=t.replace(a,r)):"LINESTRING"===RegExp.$1&&(r='{"type" : "LineString",',t=t.replace(RegExp.$1,r),a=/(\(\(?)/,r='"coordinates" : [',t=t.replace(a,r),a=/(\)\)?)/,r="]}",t=t.replace(a,r)),n.trace(t),!(s=JSON.parse(t)))throw new Error("Le JSON est vide !");if(!s.type)throw new Error("Le type de geometrie n'est pas connu !");if(!s.coordinates)throw new Error("La liste des points est vide !");e.call(this,s)}catch(t){if("SyntaxError"===t.name)return void i.call(this,"Erreur de parsing JSON !");i.call(this,t)}}};e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(44),n=i(129),s=i(45),a=i(131),r=i(132),l={};function c(t){var e,i="";return t.hasChildNodes()&&(e=t.firstChild)&&3===e.nodeType&&(i=e.nodeValue),i}l.READERS={routeResult:function(t){var e=new a.default;if(function t(e,i){if(e.hasChildNodes())for(var o,n,s=e.childNodes,a=0;a<s.length;a++){if(1===(o=s[a]).nodeType)if(n=o.localName||o.baseName||o.nodeName,l.READERS[n])(0,l.READERS[n])(o,i);else t(o,i)}}(t,e),"error"===e.status){var i=o.default.getMessage("SERVICE_RESPONSE_EXCEPTION",e.message);throw new s.default({message:i,type:s.default.TYPE_SRVERR})}return e},status:function(t,e){var i=c(t);"ERROR"!==i&&"error"!==i||e&&(e.status="error")},message:function(t,e){e&&(e.message=c(t))},distance:function(t,e){e&&(e.totalDistance=c(t))},durationSeconds:function(t,e){e&&(e.totalTime=parseFloat(c(t)))},bounds:function(t,e){if(e&&e.bbox){var i=c(t).split(/[,;]/);e.bbox.left=parseFloat(i[0]),e.bbox.bottom=parseFloat(i[1]),e.bbox.right=parseFloat(i[2]),e.bbox.top=parseFloat(i[3])}},geometryWkt:function(t,e){if(e){var i=t.innerHTML;n.default.toJson(i,(function(t){e.routeGeometry=t}),(function(){var t=o.default.getMessage("PARAM_FORMAT",["geometryWkt"]);throw new Error(t)}))}},step:function(t,e){var i,o=new r.default;if(t.hasChildNodes)for(var n,s,a=t.childNodes,l=0;l<a.length;l++)1===(n=a[l]).nodeType&&("durationSeconds"===(s=n.localName||n.baseName||n.nodeName)?o.duration=c(n):"distance"===s?o.distance=c(n):"navInstruction"===s?o.code=c(n):"name"===s&&(i=c(n)));if(o.code)switch(o.code){case"F":o.instruction="Valeur non renseignée"!==i?"Tout droit "+i:"Continuer tout droit ";break;case"B":o.instruction="Demi-tour "+i;break;case"L":o.instruction="Tourner à gauche "+i;break;case"R":o.instruction="Tourner à droite "+i;break;case"BL":o.instruction="Tourner très à gauche "+i;break;case"BR":o.instruction="Tourner très à droite "+i;break;case"FL":o.instruction="Tourner légèrement à gauche "+i;break;case"FR":o.instruction="Tourner légèrement à droite "+i;break;case"round_about_entry":o.instruction="Entrée rond-point "+i;break;case"round_about_exit":o.instruction="Sortie rond-point "+i;break;case null:o.instruction="Prendre "+i;break;default:o.instruction="?"+o.code+"? "+i}Array.isArray(e.routeInstructions)&&e.routeInstructions.push(o)}},l.read=function(t){if("routeResult"===t.nodeName)return l.READERS.routeResult(t);throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.")},e.default=l},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("RouteResponse constructor cannot be called as a function.");this.totalTime=null,this.totalDistance=null,this.bbox={left:null,right:null,top:null,bottom:null},this.routeGeometry=null,this.routeInstructions=[]}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("RouteInstruction constructor cannot be called as a function.");this.duration=null,this.distance=null,this.code=null,this.instruction=null,this.geometry=null}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(43),n={READERS:{},read:function(t){o.default.getLogger("RouteResponseOLSReader").error("not yet implemented !")}};e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(45),a=i(46),r=i(56),l=i(135),c=i(137);function u(t){if(!(this instanceof u))throw new TypeError(n.default.getMessage("CLASS_CONSTRUCTOR","ProcessIsoCurve"));if(this.CLASSNAME="ProcessIsoCurve",a.default.apply(this,arguments),this.logger=o.default.getLogger("Gp.Services.ProcessIsoCurve"),this.logger.trace("[Constructeur ProcessIsoCurve (options)]"),!t.position)throw new Error(n.default.getMessage("PARAM_MISSING","position"));if(null===t.position.x)throw new Error(n.default.getMessage("PARAM_MISSING","position.x"));if(null===t.position.y)throw new Error(n.default.getMessage("PARAM_MISSING","position.y"));if(!t.time&&!t.distance)throw new Error("Parameter (s) 'distance' missing. Parameter time to calculate an isochrone, parameter distance for an isodistance");if(!t.time&&t.distance&&(this.options.method="distance",this.options.time&&delete this.options.time),t.time&&!t.distance&&(this.options.method="time",this.options.distance&&delete this.options.distance),this.options.method=this.options.method||"time",this.options.exclusions=t.exclusions||null,this.options.graph=t.graph||"Voiture",this.options.reverse=t.reverse||!1,this.options.smoothing=t.smoothing||!1,this.options.holes=t.holes||!1,this.options.srs=t.srs||"EPSG:4326",this.options.outputFormat="string"==typeof t.outputFormat?t.outputFormat.toLowerCase():"json",!this.options.serverUrl){var e=r.default.ProcessIsoCurve.url(this.options.apiKey)["iso-"+this.options.outputFormat];if(!e)throw new Error("Url by default not found !");this.options.serverUrl=e,this.logger.trace("Serveur URL par defaut : "+this.options.serverUrl)}var i=this.options.serverUrl.lastIndexOf(".");if(-1!==i){var s=this.options.serverUrl.substring(i+1);if(s&&s.length<5)switch(this.logger.trace("Serveur Extension URL : "+s),s.toLowerCase()){case"json":case"xml":this.options.outputFormat=s.toLowerCase();break;default:throw new Error("type of service : unknown or unsupported (json or xml) !")}}}u.prototype=Object.create(a.default.prototype,{}),u.prototype.constructor=u,u.prototype.buildRequest=function(t,e){try{var i=new l.default(this.options);if(!i.processRequestString())throw new Error(n.default.getMessage("SERVICE_REQUEST_BUILD"));this.request=i.requestString}catch(e){return void t.call(this,new s.default(e.message))}e.call(this,this.request)},u.prototype.analyzeResponse=function(t,e){if(this.response){var i={response:this.response,outputFormat:this.options.outputFormat,rawResponse:this.options.rawResponse,onSuccess:e,onError:t,scope:this};c.default.build(i)}else t.call(this,new s.default(n.default.getMessage("SERVICE_RESPONSE_EMPTY")))},e.default=u},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(136);function a(t){if(this.logger=o.default.getLogger("ProcessIsoCurveRequest"),this.logger.trace("[Constructeur ProcessIsoCurveRequest ()]"),!(this instanceof a))throw new TypeError("ProcessIsoCurveRequest constructor cannot be called as a function.");if(!t)throw new Error(n.default.getMessage("PARAM_EMPTY","options"));this.settings=t,this.mode=this.settings.httpMethod||"GET"}a.prototype={requestString:null,constructor:a,template:{container:'<?xml version="1.0" encoding="UTF-8"?>\n<isochroneRequest>\n__ID__\t<location>\n\t\t<x>__X__</x>\n\t\t<y>__Y__</y>\n\t</location>\n\t<srs>__SRS__</srs>\n\t<graphName>__GRAPHNAME__</graphName>\n__PROFIL____EXCLUSIONS__\t<method>__METHOD__</method>\n__TIME____DISTANCE__\t<reverse>__REVERSE__</reverse>\n\t<smoothing>__SMOOTHING__</smoothing>\n\t<holes>__HOLES__</holes>\n</isochroneRequest>',id:"\t<id>__IDVALUE__</id>\n",profil:"\t<profileId>__PROFILID__</profileId>\n\t<profileName>__PROFILNAME__</profileName>\n",exclusions:{container:"\t<exclusions>\n__EXCLUSIONFEATURE__\n\t</exclusions>\n",feature:"\t\t<exclusion>__EXCLUSIONVALUE__</exclusion>"},time:"\t<time>__TIMEVALUE__</time>\n",distance:"\t<distance>__DISTANCEVALUE__</distance>\n"},processRequestString:function(){var t="",e=0;switch(this.mode){case"GET":this.logger.trace("Process GET Request");var i=new s.default(this.settings).getParams();for(e=0;e<i.length;e++){var o=i[e];t&&(t+="&"),t+=o.k+"="+o.v}break;case"POST":if(this.logger.trace("Process POST Request"),t=(t=(t=(t=(t=(t=(t=(t=(t=(t=this.template.container).replace(/__ID__/g,"")).replace(/__PROFIL__/g,"")).replace(/__X__/g,this.settings.position.x)).replace(/__Y__/g,this.settings.position.y)).replace(/__GRAPHNAME__/g,this.settings.graph)).replace(/__SRS__/g,this.settings.srs)).replace(/__SMOOTHING__/g,this.settings.smoothing)).replace(/__HOLES__/g,this.settings.holes)).replace(/__REVERSE__/g,this.settings.reverse),this.settings.exclusions){var n=this.template.exclusions.container,a=[];for(e=0;e<this.settings.exclusions.length;e++){var r=this.template.exclusions.feature;r=r.replace(/__EXCLUSIONVALUE__/,this.settings.exclusions[e]),a.push(r)}n=n.replace(/__EXCLUSIONFEATURE__/,a.join("\n")),t=t.replace(/__EXCLUSIONS__/g,n)}if(t=t.replace(/__EXCLUSIONS__/g,""),this.settings.distance){var l=this.template.distance;l=l.replace(/__DISTANCEVALUE__/g,this.settings.distance),t=(t=t.replace(/__DISTANCE__/g,l)).replace(/__METHOD__/g,"distance")}if(t=t.replace(/__DISTANCE__/g,""),this.settings.time){var c=this.template.time;c=c.replace(/__TIMEVALUE__/g,this.settings.time),t=(t=t.replace(/__TIME__/g,c)).replace(/__METHOD__/g,"time")}t=t.replace(/__TIME__/g,"");break;default:this.logger.error("No other HTTP method supported by the service !")}return this.logger.trace(t),this.requestString=t,this.requestString}},e.default=a},function(t,e,i){"use strict";i.r(e);var o=i(43);function n(t){if(!(this instanceof n))throw new TypeError("ProcessIsoCurveParam constructor cannot be called as a function.");switch(this.logger=o.default.getLogger(),this.logger.trace("[Constructeur ProcessIsoCurveParam ()]"),this.options=t||{},this.id=this.options.id,this.location=this.options.position,this.srs=this.options.srs,this.graphName=this.options.graph,this.profileId=this.options.profileId||null,this.profileName=this.options.profileName||null,this.exclusions=this.options.exclusions,this.reverse=this.options.reverse,this.smoothing=this.options.smoothing,this.holes=this.options.holes,this.options.method){case"time":this.method="time",this.time=this.options.time;break;case"distance":this.method="distance",this.distance=this.options.distance;break;default:this.logger.warn("Par defaut, on calcule un isochrone !"),this.method="time"}}n.CLASSNAME="ProcessIsoCurveParam",n.prototype={constructor:n,getLocation:function(){return this.location.x+","+this.location.y},getExclusions:function(){return this.exclusions.join(";")}},n.prototype.getParams=function(){var t=[];return t.push({k:"location",v:this.getLocation()}),t.push({k:"smoothing",v:this.smoothing}),t.push({k:"holes",v:this.holes}),t.push({k:"reverse",v:this.reverse}),t.push({k:"method",v:this.method}),this.time&&t.push({k:"time",v:this.time}),this.distance&&t.push({k:"distance",v:this.distance}),t.push({k:"graphName",v:this.graphName}),this.exclusions&&t.push({k:"exclusions",v:this.getExclusions()}),this.srs&&t.push({k:"srs",v:this.srs}),t},e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(43),n=i(44),s=i(45),a=i(66),r=i(129),l=i(138),c=i(139),u={build:function(t){var e=o.default.getLogger("ProcessIsoCurveResponseFactory");e.trace(["ProcessIsoCurveResponseFactory::build()"]);var i=null;if(t.response){if(t.rawResponse)e.trace("analyze response : raw"),i=t.response;else{switch(t.outputFormat){case"xml":e.trace("analyze response : xml");try{var u=new a.default({reader:l.default});if("string"==typeof t.response?u.setXMLString(t.response):u.setXMLDoc(t.response),!(i=u.parse()))throw new Error(n.default.getMessage("SERVICE_RESPONSE_EXCEPTION_2"))}catch(e){var h=e.message;return h+="\n (raw response service : '"+t.response+"')",void t.onError.call(t.scope,new s.default({message:n.default.getMessage("SERVICE_RESPONSE_EXCEPTION",h),status:200,type:s.default.TYPE_SRVERR}))}break;case"json":var d;if(e.trace("analyze response : json"),"OK"===(d="string"==typeof t.response?JSON.parse(t.response):t.response).status||"ok"===d.status){if(!(i=new c.default))return void t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_ANALYSE",t.response)));i.time=d.time,i.distance=d.distance,i.message=d.message,i.id=d.id,i.srs=d.srs;if(i.hasOwnProperty("geometry")&&(r.default.toJson(d.wktGeometry,(function(t){i.geometry=t}),(function(){t.onError.call(t.scope,new s.default({message:n.default.getMessage("PARAM_FORMAT","wktGeometry")}))})),!i.geometry))return;var p=d.location.split(",");i.location&&(i.location.x=p[0],i.location.y=p[1])}else if("ERROR"===d.status||"error"===d.status){var m=d.message;return m+="\n (raw response service : '"+d+"')",void t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_EXCEPTION",m)))}break;default:return void t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_FORMAT","json","xml")))}if(i&&i.exceptionReport)return void t.onError.call(t.scope,new s.default({message:n.default.getMessage("SERVICE_RESPONSE_EXCEPTION",i.exceptionReport),type:s.default.TYPE_SRVERR,status:200}))}t.onSuccess.call(t.scope,i)}else t.onError.call(t.scope,new s.default(n.default.getMessage("SERVICE_RESPONSE_EMPTY")))}};e.default=u},function(t,e,i){"use strict";i.r(e);var o=i(44),n=i(129),s=i(45),a=i(139),r={};function l(t){var e,i="";return t.hasChildNodes()&&(e=t.firstChild)&&3===e.nodeType&&(i=e.nodeValue),i}r.READERS={isochronResult:function(t){var e=new a.default;if(t.hasChildNodes())for(var i,n=t.childNodes,l=0;l<n.length;l++)i=n[l],r.READERS[i.nodeName]&&r.READERS[i.nodeName](i,e);if("error"===e.status){var c=o.default.getMessage("SERVICE_RESPONSE_EXCEPTION",e.message);throw new s.default({message:c,type:s.default.TYPE_SRVERR})}return e},message:function(t,e){e&&(e.message=l(t))},status:function(t,e){var i=l(t);"ERROR"!==i&&"error"!==i||e&&(e.status="error")},id:function(t,e){e&&(e.id=l(t))},location:function(t,e){var i=l(t);e&&e.location&&(e.location.x=parseFloat(i.split(",")[0]),e.location.y=parseFloat(i.split(",")[1]))},srs:function(t,e){e&&(e.srs=l(t))},distance:function(t,e){e&&(e.distance=parseFloat(l(t)))},time:function(t,e){e&&(e.time=parseFloat(l(t)))},wktGeometry:function(t,e){if(e){var i=t.innerHTML;e.hasOwnProperty("geometry")&&n.default.toJson(i,(function(t){e.geometry=t}),(function(){var t=o.default.getMessage("PARAM_FORMAT",["wktGeometry"]);throw new Error(t)}))}},serviceResult:function(t){var e={};if(t.hasChildNodes())for(var i,o=t.childNodes,n=0;n<o.length;n++)i=o[n],r.READERS[i.nodeName]&&r.READERS[i.nodeName](i,e);return e},ExceptionReport:function(t){var e={};if(t.hasChildNodes())for(var i,o=t.childNodes,n=0;n<o.length;n++)"Exception"===(i=o[n]).nodeName&&(e.exceptionReport=r.READERS.Exception(i));return e},Exception:function(t){var e={},i=t.getAttribute("exceptionCode");i&&(e.exceptionCode=i);var o=t.firstChild;return o&&3===o.nodeType&&(e.exception=o.nodeValue),e}},r.read=function(t){var e;if("isochronResult"===t.nodeName||"isochroneResult"===t.nodeName||"IsochroneResult"===t.nodeName)return e=r.READERS.isochronResult(t);if("ExceptionReport"===t.nodeName)return e=r.READERS[t.nodeName](t);if(r.READERS[t.nodeName]){if("error"===(e=r.READERS[t.nodeName](t)).status){var i=o.default.getMessage("SERVICE_RESPONSE_EXCEPTION",e.message);throw new s.default({message:i,type:s.default.TYPE_SRVERR})}return e}throw new s.default({message:o.default.getMessage("SERVICE_RESPONSE_ANALYSE",t.nodeName),type:s.default.TYPE_UNKERR})},e.default=r},function(t,e,i){"use strict";function o(){if(!(this instanceof o))throw new TypeError("ProcessIsoCurveResponse constructor cannot be called as a function.");this.message=null,this.id=null,this.location={},this.location.x=null,this.location.y=null,this.srs=null,this.geometry=null,this.time=null,this.distance=null}i.r(e),o.prototype={constructor:o},e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(34),n=i(141);e.default={check:function(t){var e=o.default.getLogger("checkrightmanagement");if(t){var i=t.key,s=t.resources||[],a=t.services||[];if(s&&0!==s.length)if(a&&0!==a.length){var r={};if(!i){if(!n.default.isConfigLoaded())return void e.warn("WARNING : The 'apiKey' parameter is missing, and the contract key configuration has not been loaded, so impossible to check yours rights !");i=Object.keys(n.default.configuration.generalOptions.apiKeys)[0],e.log(i)}if(i){if(n.default.isConfigLoaded()){for(var l=0;l<s.length;l++)for(var c=s[l],u=0;u<a.length;u++){var h=a[u],d=n.default.getServiceParams(c,h,i);d&&0!==Object.keys(d).length?(r[h]||(r[h]=[]),r[h].push(c)):e.warn("WARNING : The contract key configuration has no rights to load this geoportal resource ("+c+") for this service ("+h+") ")}return r&&0!==Object.keys(r).length?(r.key=i,e.log("right management checked",r),r):void e.warn("WARNING : The contract key configuration has been loaded, and the 'apiKey' parameter has been set, but, there is a problem on the mapping between the contract and the key !")}e.warn("WARNING : the contract key configuration has not been loaded, so be carefull !");for(var p={},m=0;m<a.length;m++){var f=a[m];p[f]=[];for(var _=0;_<s.length;_++){var g=s[_];p[f].push(g)}}return p.key=i,e.log("right management not checked",p),p}}else e.error("WARNING : no parameter 'services' specified !");else e.error("WARNING : no parameter 'resources' specified !")}else e.error("WARNING : no parameter specified !")}}},function(t,e,i){"use strict";i.r(e),function(t){var o=i(34).default.getLogger("config"),n={configuration:null,isConfigLoaded:function(){var e="undefined"!=typeof window?window:"undefined"!=typeof self?self:void 0!==t?t:{};return!(!e.Gp||!e.Gp.Config||0===Object.keys(e.Gp.Config).length)&&(this.configuration=e.Gp.Config,!0)},getLayerId:function(t,e){var i=null;if(this.configuration){var n=this.configuration.layers;for(var s in n)if(n.hasOwnProperty(s)){var a=s.split("$");if(t===a[0]&&a[1]){var r=a[1].split(":");if(a[1].split(";")[1]===e){i=s;break}if(r[2]===e){i=s;break}}}}return i||o.error("ERROR layer id (layer name: "+t+" / service: "+e+") was not found !?"),i},getLayerParams:function(t,e,i){var n={};if(this.configuration){var s=this.getLayerId(t,e);if(s){var a=this.configuration.layers[s],r=a.apiKeys[0];if(i&&i!==r)return void o.error("ERROR different keys ("+i+" !== "+r+") !?");i=i||r,n.key=i,n.url=a.getServerUrl(i),n.version=a.getServiceParams().version,n.styles=a.getDefaultStyle(),n.format=a.getDefaultFormat(),n.projection=a.getDefaultProjection(),n.minScale=a.getMinScaleDenominator(),n.maxScale=a.getMaxScaleDenominator(),n.extent=a.getBBOX(),n.legends=a.getLegends(),n.metadata=a.getMetadata(),n.originators=a.getOriginators(),n.title=a.getTitle(),n.description=a.getDescription(),n.quicklookUrl=a.getQuicklookUrl(),a.wmtsOptions&&(n.tileMatrixSetLimits=a.wmtsOptions.tileMatrixSetLimits);var l=a.getTMSID();if(l){n.TMSLink=l;var c=this.configuration.getTMSConf(l);n.matrixOrigin=c.getTopLeftCorner(),n.nativeResolutions=c.nativeResolutions,n.matrixIds=c.matrixIds,n.tileMatrices=c.tileMatrices}}}return n},getServiceParams:function(t,e,i){var o={};if(this.configuration){var n=this.getLayerId(t,e);if(n){var s=this.configuration.layers[n],a=s.apiKeys[0];if(i&&i!==a)return;i=i||a,o.key=i,o.url=s.getServerUrl(i),o.version=s.getServiceParams().version,o.extent=s.getBBOX(),o.title=s.getTitle(),o.description=s.getDescription()}}return o},getResolutions:function(){var t=[];return this.configuration&&(t=this.configuration.generalOptions.wgs84Resolutions),t},getTileMatrix:function(t){var e={};return this.configuration&&t&&(e=this.configuration.tileMatrixSets[t.toUpperCase()]),e},getGlobalConstraints:function(t){var e={};if(t){var i=this.configuration.layers[t];e.projection=i.getDefaultProjection(),e.minScale=i.getMinScaleDenominator(),e.maxScale=i.getMaxScaleDenominator(),e.extent=i.getBBOX()}return e}};e.default=n}.call(this,i(52))},function(t,e,i){"use strict";i.r(e);var o=i(40),n=i(2),s=i.n(n),a=i(34),r=i(140),l=i(36),c=i(143),u=i(144),h=i(145),d=a.default.getLogger("locationselector"),p=s.a.Control.extend({includes:c.default,options:{position:"topleft",tag:{id:0,unique:null,label:">",color:"blue",display:!0,addOption:!1,removeOption:!1},disableReverse:!1,displayInfo:!0,autocompleteOptions:{},reverseGeocodeOptions:{}},initialize:function(t){s.a.Util.setOptions(this,t),this._uid=this.options.tag.unique||null,this._activeDragAndDrop=!1,this._pressedKeyOnDragAndDrop=!1,this._map=null,this._inputsContainer=null,this._inputLabelContainer=null,this._inputAutoCompleteContainer=null,this._inputShowPointerContainer=null,this._inputCoordinateContainer=null,this._coordinate=null,this._suggestedContainer=null,this._suggestedLocations=[],this._currentLocation=null,this._marker=null,this._resources={},this._noRightManagement=!1,this._checkRightsManagement(),this._container=this._uid?this._initLayout():null},onAdd:function(){this._uid=l.default.generate();var t=this._initLayout();return s.a.DomEvent.disableClickPropagation(t).disableScrollPropagation(t),t},onRemove:function(){},getCoordinate:function(){return this._coordinate},setCoordinate:function(t){this._displayResultOfCoordinate(t)},getCoordinateInverse:function(){if(this._coordinate)return{x:this._coordinate.y,y:this._coordinate.x}},setMap:function(t){this._map||(this._map=t)},clear:function(){this._setCursor(),this._setMarker(),this._clearResults(),this._inputLabelContainer.click()},dragging:function(t){this._marker&&(t?this._marker.dragging.enable():this._marker.dragging.disable())},_initLayout:function(){var t=this.options.tag.id,e=this._createMainContainerElement(),i=this._inputsContainer=this._createLocationPointElement(t,this.options.tag.display);e.appendChild(i);var o=this._inputLabelContainer=this._createLocationPointLabelElement(t,this.options.tag.label);i.appendChild(o);var n=this._inputAutoCompleteContainer=this._createLocationAutoCompleteteInputElement(t);i.appendChild(n);var s=this._inputCoordinateContainer=this._createLocationCoordinateInputElement(t);i.appendChild(s);var a=this._inputShowPointerContainer=this._createLocationPointerShowInputElement(t);i.appendChild(a);var r=this._createLocationPointerInputElement(t);if(i.appendChild(r),this.options.tag.addOption){var l=this._createLocationAddPointElement();i.appendChild(l)}if(this.options.tag.removeOption){var c=this._createLocationRemovePointElement(t);i.appendChild(c)}var u=this._suggestedContainer=this._createLocationAutoCompleteResultElement(t);return e.appendChild(u),e},_checkRightsManagement:function(){var t=null,e=[],i=null;i=this.options.reverseGeocodeOptions.apiKey,(e=(t=this.options.reverseGeocodeOptions.filterOptions)?t.type:[])&&0!==e.length||(e=["PositionOfInterest","StreetAddress"]);var o=r.default.check({key:i||this.options.apiKey,resources:e,services:["ReverseGeocode"]});i=this.options.autocompleteOptions.apiKey,(e=(t=this.options.autocompleteOptions.filterOptions)?t.type:[])&&0!==e.length||(e=["PositionOfInterest","StreetAddress"]);var n=r.default.check({key:i||this.options.apiKey,resources:e,services:["AutoCompletion"]});o||n||(this._noRightManagement=!0),n&&(this._resources.AutoCompletion={},this._resources.AutoCompletion.resources=n.AutoCompletion,this._resources.AutoCompletion.key=n.key),o&&(this._resources.ReverseGeocode={},this._resources.ReverseGeocode.resources=o.ReverseGeocode,this._resources.ReverseGeocode.key=o.key)},_setLabel:function(t){this._inputAutoCompleteContainer.value=t||""},_setCoordinate:function(t){this._coordinate={x:t.lng,y:t.lat};var e;e=u.default.roundToDecimal(t.lat,4);var i=u.default.roundToDecimal(t.lng,4)+" , "+e;this.GPdisplayCoordinate(i)},_setPosition:function(t){d.log("_setPosition()",t),this._map.panTo(s.a.latLng(t.y,t.x))},_setMarker:function(t,e,i){if(d.log("_setMarker()",t,e,i),!this._activeDragAndDrop){var o=this._map;if(null!=this._marker&&(this._marker.off("mousedown",this.onMouseDownMarker,this),this._marker.off("dragstart",this.onStartDragMarker,this),this._marker.off("drag",this.onDragMarker,this),this._marker.off("dragend",this.onEndDragMarker,this),o.removeLayer(this._marker),this._marker=null),t){var n={icon:new h.default(this.options.tag.color),draggable:!0,clickable:!0,zIndexOffset:1e3};if(this._marker=s.a.marker(s.a.latLng(t.y,t.x),n),this._marker.on("mousedown",this.onMouseDownMarker,this),this._marker.on("dragstart",this.onStartDragMarker,this),this._marker.on("drag",this.onDragMarker,this),this._marker.on("dragend",this.onEndDragMarker,this),this._marker.addTo(o),i){var a=null;if("string"!=typeof e)if(e.fields.fullText)a=e.fields.fullText;else{var r=[];r.push(e.fields.street||""),r.push(e.fields.postalCode||""),r.push(e.fields.commune||""),"PositionOfInterest"===e.type&&(r.push(e.fields.poi||""),r.push(e.fields.kind||"")),a=r.join(" - ")}else a=e;this._marker.bindPopup(a)}}}},_setCursor:function(t){var e=this._map.getContainer();e.style.cursor=t||null},_clearResults:function(){this._currentLocation=null,this._coordinate=null,this._clearSuggestedLocation()},_clearSuggestedLocation:function(){if(this._suggestedLocations=[],this._suggestedContainer)for(;this._suggestedContainer.firstChild;)this._suggestedContainer.removeChild(this._suggestedContainer.firstChild)},_requestAutoComplete:function(t){if(d.log("_requestAutoComplete()",t),t&&0!==Object.keys(t).length&&t.text)if(d.log(t),this._noRightManagement)d.log("no rights for all service !?");else if(this._resources.AutoCompletion){var e=this._resources.AutoCompletion.resources;if(e&&0!==Object.keys(e).length){var i=this._resources.AutoCompletion.key,n={};s.a.Util.extend(n,this.options.autocompleteOptions),s.a.Util.extend(n,t),s.a.Util.extend(n,{apiKey:n.apiKey||this.options.apiKey||i}),d.log(n),o.default.Services.autoComplete(n)}}else d.log("no rights for this service !?")},_fillAutoCompletedLocationListContainer:function(t){if(d.log("_fillAutoCompletedLocationListContainer()",t),t&&0!==t.length){var e=this._suggestedContainer;if(e.childElementCount)for(;e.firstChild;)e.removeChild(e.firstChild);for(var i=0;i<t.length;i++)this._createLocationAutoCompletedLocationElement(this.options.tag.id,t[i],i);this._suggestedLocations=t}},_requestReverseGeocode:function(t){if(d.log("_requestReverseGeocode()",t),t&&0!==Object.keys(t).length&&t.position&&0!==Object.keys(t.position).length)if(this._noRightManagement)d.log("no rights for all service !?");else if(this._resources.ReverseGeocode){var e=this._resources.ReverseGeocode.resources;if(e&&0!==Object.keys(e).length){var i=this._resources.ReverseGeocode.key,n={};s.a.Util.extend(n,this.options.reverseGeocodeOptions),s.a.Util.extend(n,t),s.a.Util.extend(n,{returnFreeForm:!0,filterOptions:{type:["StreetAddress"]}}),s.a.Util.extend(n,{apiKey:n.apiKey||this.options.apiKey||i}),d.log(n),o.default.Services.reverseGeocode(n)}}else d.log("no rights for this service !?")},_displayResultOfCoordinate:function(t){this._setCoordinate(t),this._setMarker({x:t.lng,y:t.lat},null,!1),d.log(this.getCoordinate()),this.onActivateMapPointClick()},_displayResultOfLabel:function(t){var e=t.placeAttributes,i=e.number+" "+e.street+", "+e.postalCode+" "+e.commune;this._setCoordinate({lat:t.position.x,lng:t.position.y}),this._setLabel(i),this._setMarker({x:t.position.y,y:t.position.x},null,!1),this._inputShowPointerContainer.checked=!1,this._inputAutoCompleteContainer.className="GPlocationOriginVisible",this._inputCoordinateContainer.className="GPlocationOriginHidden",this.onActivateMapPointClick()},onAutoCompleteSearchText:function(t){d.log("onAutoCompleteSearchText()",t);var e=t.target.value;if(e)if(this._noRightManagement)d.log("no rights for this service !?");else if(this._currentLocation=e,!(e.length<3)){var i=this;this._requestAutoComplete({text:e,maximumResponses:5,onSuccess:function(t){if(d.log(t),t){var e=t.suggestedLocations;i._fillAutoCompletedLocationListContainer(e)}},onFailure:function(t){i._clearSuggestedLocation(),d.log(t.message)}})}},onAutoCompletedResultsItemClick:function(t){d.log("onAutoCompletedResultsItemClick()",t);var e=l.default.index(t.target.id);if(d.log(e),d.log(this._suggestedLocations[e]),e){var i={x:this._suggestedLocations[e].position.x,y:this._suggestedLocations[e].position.y},o={type:this._suggestedLocations[e].type,fields:this._suggestedLocations[e]},n=this._suggestedLocations[e].fullText;this._setLabel(n),this._setPosition(i),this._setMarker(i,o,this.options.displayInfo),this._coordinate=i}},onActivateMapPointClick:function(t){d.trace("onActivateMapPointClick()",t);var e=this._map;this._inputShowPointerContainer.checked?this._activeDragAndDrop||(e.on("click",this.onMouseMapClick,this),this._setCursor("crosshair"),this._setMarker(),this._clearResults()):this._activeDragAndDrop||(e.off("click",this.onMouseMapClick,this),this._setCursor())},onLocationClearPointClick:function(t){d.log("onLocationClearPointClick",t),this._setCursor(),this._setMarker(),this._clearResults(),this._inputAutoCompleteContainer.focus()},onLocationRemovePointClick:function(t){d.log("onLocationRemovePointClick",t),this._setCursor(),this._setMarker(),this._clearResults()},onLocationAddPointClick:function(t){d.log("onLocationAddPointClick",t)},onMouseMapClick:function(t){d.log("onMouseMapClick",t);var e=t.latlng;if(this.options.disableReverse||this._noRightManagement)this._displayResultOfCoordinate(e);else{var i=this;this._requestReverseGeocode({position:{x:e.lat,y:e.lng},srs:"EPSG:4326",onSuccess:function(t){if(d.log(t),0!==t.locations.length){var o=t.locations[0];i._displayResultOfLabel(o)}else i._displayResultOfCoordinate(e)},onFailure:function(t){d.log(t.message),i._displayResultOfCoordinate(e)}})}},onStartDragMarker:function(){this._marker&&(this._activeDragAndDrop=!0,this._inputShowPointerContainer.checked=!0,this._inputAutoCompleteContainer.className="GPlocationOriginHidden",this._inputCoordinateContainer.className="GPlocationOriginVisible",this._marker.unbindPopup(),this._setLabel(),this._clearResults())},onDragMarker:function(){if(this._marker){this._activeDragAndDrop=!1,this._inputShowPointerContainer.checked=!0;var t=this._marker.getLatLng();this._setCoordinate(t)}},onEndDragMarker:function(){if(this._marker){this._inputShowPointerContainer.checked=!0;var t=this._marker.getLatLng();this._pressedKeyOnDragAndDrop?this._setCoordinate(t):(d.log("No key pressed, so autocomplete solution !"),this.onMouseMapClick({latlng:t})),this._activeDragAndDrop=!1,this._pressedKeyOnDragAndDrop=!1}},onMouseDownMarker:function(t){this._marker&&(this._pressedKeyOnDragAndDrop=t.originalEvent.ctrlKey)}});e.default=p},function(t,e,i){"use strict";i.r(e);var o=i(36),n=i(34).default.getLogger("LocationSelectorDOM"),s={_addUID:function(t){return this._uid?t+"-"+this._uid:t},_createMainContainerElement:function(){var t=document.createElement("div");return t.className=this._addUID("GPlocationPoint"),t.className+=" GPwidget",t},_createLocationPointElement:function(t,e){var i=document.createElement("div");return i.id=this._addUID("GPlocationPoint_"+t),i.className=e?"GPflexInput GPlocationStageFlexInput":"GPflexInput GPlocationStageFlexInputHidden",i.style.cssText="",i},_createLocationPointLabelElement:function(t,e){var i=this,n=document.createElement("label");return n.id=this._addUID("GPlocationOriginLabel_"+t),n.htmlFor="GPlocationOrigin_"+t,n.innerHTML=e,n.addEventListener("click",(function(t){for(var e=o.default.index(this.id),n=document.getElementsByClassName(i._addUID("GPlocationPoint")),s=0;s<n.length;s++){var a=n[s].childNodes[0].id,r=o.default.index(a);document.getElementById(i._addUID("GPlocationPoint_"+r)).style.cssText=""}document.getElementById(i._addUID("GPlocationOriginCoords_"+e)).value="",document.getElementById(i._addUID("GPlocationOrigin_"+e)).value="",document.getElementById(i._addUID("GPlocationPoint_"+e)).style.cssText="",document.getElementById(i._addUID("GPlocationOriginPointer_"+e)).checked=!1,document.getElementById(i._addUID("GPlocationOrigin_"+e)).className="GPlocationOriginVisible",document.getElementById(i._addUID("GPlocationOriginCoords_"+e)).className="GPlocationOriginHidden",document.getElementById(i._addUID("GPlocationStageRemove_"+e))&&(document.getElementById(i._addUID("GPlocationStageRemove_"+e)).className="GPlocationStageRemove"),document.getElementById(i._addUID("GPlocationStageAdd"))&&(document.getElementById(i._addUID("GPlocationStageAdd")).className=""),i.onLocationClearPointClick(t)})),n},_createLocationAutoCompleteteInputElement:function(t){var e=this,i=document.createElement("input");return i.id=this._addUID("GPlocationOrigin_"+t),i.className="GPlocationOriginVisible",i.type="text",i.placeholder="Saisir une adresse",i.autocomplete="off",i.addEventListener("keyup",(function(t){var i=t.which||t.keyCode;if(13!==i&&10!==i&&38!==i&&40!==i){var n=o.default.index(this.id);document.getElementById(e._addUID("GPlocationOrigin_"+n)).value.length>2?document.getElementById(e._addUID("GPlocationAutoCompleteList_"+n)).style.display="block":document.getElementById(e._addUID("GPlocationAutoCompleteList_"+n)).style.display="none",e.onAutoCompleteSearchText(t)}})),i.addEventListener("keydown",(function(i){var s=i.which||i.keyCode,a=document.getElementById(e._addUID("GPlocationAutoCompleteList_"+t));if(a){var r=a.getElementsByClassName("GPautoCompleteProposal current"),l=a.getElementsByClassName("GPautoCompleteProposal"),c=l.length;if(c){var u=null;if(!r.length)return(u=l[0]).className="GPautoCompleteProposal current",u.style.color="#000000",void(u.style["background-color"]="#CEDBEF");u=r[0];var h=parseInt(o.default.index(u.id),10),d=h===c-1?l[0]:l[h+1],p=0===h?l[c-1]:l[h-1];switch(u.style["background-color"]="",u.style.color="",p.style["background-color"]="",p.style.color="",d.style["background-color"]="",d.style.color="",s){case 38:n.log("arrow up"),u.className="GPautoCompleteProposal",p.className="GPautoCompleteProposal current",p.style.color="#000000",p.style["background-color"]="#CEDBEF";break;case 40:n.log("arrow down"),u.className="GPautoCompleteProposal",d.className="GPautoCompleteProposal current",d.style.color="#000000",d.style["background-color"]="#CEDBEF";break;case 13:n.log("enter"),u.click(i)}u.focus()}}})),i},_createLocationCoordinateInputElement:function(t){var e=this,i=document.createElement("input");return i.id=this._addUID("GPlocationOriginCoords_"+t),i.className="GPlocationOriginHidden",i.type="text",i.disabled=!1,i.addEventListener("click",(function(){var t=o.default.index(this.id);document.getElementById(e._addUID("GPlocationOriginLabel_"+t)).click()})),i},_createLocationPointerShowInputElement:function(t){var e=document.createElement("input");return e.id=this._addUID("GPlocationOriginPointer_"+t),e.type="checkbox",e},_createLocationPointerInputElement:function(t){var e=this,i=document.createElement("label");return i.id=this._addUID("GPlocationOriginPointerImg_"+t),i.htmlFor="GPlocationOriginPointer_"+t,i.className="GPlocationOriginPointerImg",i.title="Pointer un lieu sur la carte",i.addEventListener("click",(function(t){t.preventDefault(),t.stopPropagation();var i,n,s,a=o.default.index(this.id),r=document.getElementsByClassName(e._addUID("GPlocationPoint"));for(i=0;i<r.length;i++)n=r[i].childNodes[0].id,a!==(s=o.default.index(n))&&(document.getElementById(e._addUID("GPlocationOriginPointer_"+s)).checked=!1,"Pointer un lieu sur la carte"===document.getElementById(e._addUID("GPlocationOriginCoords_"+s)).value&&(document.getElementById(e._addUID("GPlocationOriginCoords_"+s)).value="",document.getElementById(e._addUID("GPlocationOrigin_"+s)).className="GPlocationOriginVisible",document.getElementById(e._addUID("GPlocationOriginCoords_"+s)).className="GPlocationOriginHidden"));if(document.getElementById(e._addUID("GPlocationOriginPointer_"+a)).checked){for(document.getElementById(e._addUID("GPlocationOriginCoords_"+a)).value="",i=0;i<r.length;i++)n=r[i].childNodes[0].id,s=o.default.index(n),document.getElementById(e._addUID("GPlocationPoint_"+s)).style.cssText="";document.getElementById(e._addUID("GPlocationStageRemove_"+a))&&(document.getElementById(e._addUID("GPlocationStageRemove_"+a)).className="GPlocationStageRemove"),document.getElementById(e._addUID("GPlocationStageAdd"))&&(document.getElementById(e._addUID("GPlocationStageAdd")).className=""),document.getElementById(e._addUID("GPlocationOriginPointer_"+a)).checked=!1,document.getElementById(e._addUID("GPlocationOrigin_"+a)).className="GPlocationOriginVisible",document.getElementById(e._addUID("GPlocationOriginCoords_"+a)).className="GPlocationOriginHidden"}else{for(document.getElementById(e._addUID("GPlocationOriginCoords_"+a)).value="Pointer un lieu sur la carte",i=0;i<r.length;i++)n=r[i].childNodes[0].id,a===(s=o.default.index(n))?document.getElementById(e._addUID("GPlocationPoint_"+s)).style.cssText="":document.getElementById(e._addUID("GPlocationPoint_"+s)).style.display="none";document.getElementById(e._addUID("GPlocationStageRemove_"+a))&&(document.getElementById(e._addUID("GPlocationStageRemove_"+a)).className="GPlocationOriginHidden"),document.getElementById(e._addUID("GPlocationStageAdd"))&&(document.getElementById(e._addUID("GPlocationStageAdd")).className="GPlocationOriginHidden"),document.getElementById(e._addUID("GPlocationOriginPointer_"+a)).checked=!0,document.getElementById(e._addUID("GPlocationOrigin_"+a)).className="GPlocationOriginHidden",document.getElementById(e._addUID("GPlocationOriginCoords_"+a)).className="GPlocationOriginVisible",document.getElementById(e._addUID("GPlocationOriginCoords_"+a)).disabled=!0}e.onActivateMapPointClick(t)})),i},_createLocationRemovePointElement:function(t){var e=this,i=document.createElement("div");return i.id=this._addUID("GPlocationStageRemove_"+t),i.className="GPlocationStageRemove",i.title="Supprimer l'étape",i.addEventListener("click",(function(i){var n=document.getElementsByClassName(e._addUID("GPlocationPoint")),s=n.length-1,a=n[0].childNodes[0].id,r=n[s].childNodes[0].id,l=o.default.index(a),c=o.default.index(r);if(t!==l&&t!==c){var u=o.default.index(this.id);document.getElementById(e._addUID("GPlocationPoint_"+u)).className="GPflexInput GPlocationStageFlexInputHidden",document.getElementById(e._addUID("GPlocationOrigin_"+u)).value="",document.getElementById(e._addUID("GPlocationOrigin_"+u)).className="GPlocationOriginVisible",document.getElementById(e._addUID("GPlocationOriginCoords_"+u)).value="",document.getElementById(e._addUID("GPlocationOriginCoords_"+u)).className="GPlocationOriginHidden",document.getElementById(e._addUID("GPlocationStageAdd")).style.display="",e.onLocationRemovePointClick(i)}})),i},_createLocationAddPointElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPlocationStageAdd"),e.title="Ajouter une étape",e.addEventListener("click",(function(e){for(var i=1,n=0,s=document.getElementsByClassName(t._addUID("GPlocationPoint")),a=1;a<s.length-1;a++){var r=s[a].childNodes[0].id,l=o.default.index(r);document.getElementById(t._addUID("GPlocationPoint_"+l))&&("GPflexInput GPlocationStageFlexInputHidden"===document.getElementById(t._addUID("GPlocationPoint_"+l)).className?1===i&&(i=l):n++)}i<s.length&&(document.getElementById(t._addUID("GPlocationPoint_"+i)).className="GPflexInput GPlocationStageFlexInput"),4===n&&(document.getElementById(t._addUID("GPlocationStageAdd")).style.display="none"),t.onLocationAddPointClick(e)})),e},_createLocationAutoCompleteResultElement:function(t){var e=this,i=document.createElement("div");return i.id=this._addUID("GPlocationAutoCompleteList_"+t),i.className="GPadvancedAutoCompleteList",i.addEventListener?i.addEventListener("click",(function(i){e.onAutoCompletedResultsItemClick(i),document.getElementById(e._addUID("GPlocationAutoCompleteList_"+t)).style.display="none"}),!1):i.attachEvent&&i.attachEvent("onclick",(function(i){e.onAutoCompletedResultsItemClick(i),document.getElementById(e._addUID("GPlocationAutoCompleteList_"+t)).style.display="none"})),i},_createLocationAutoCompletedLocationElement:function(t,e,i){var o=document.getElementById(this._addUID("GPlocationAutoCompleteList_"+t)),n=document.createElement("div");n.id=this._addUID("AutoCompletedLocation_"+i),n.className="GPautoCompleteProposal",n.innerHTML=e.fullText,o.appendChild(n)},GPdisplayCoordinate:function(t){for(var e=document.getElementsByClassName(this._addUID("GPlocationPoint")),i=0;i<e.length;i++){var n=e[i].childNodes[0].id,s=o.default.index(n);if(document.getElementById(this._addUID("GPlocationOriginPointer_"+s)).checked){document.getElementById(this._addUID("GPlocationOriginCoords_"+s)).value=t,document.getElementById(this._addUID("GPlocationOriginCoords_"+s)).disabled=!1;for(var a=0;a<e.length;a++){n=e[a].childNodes[0].id;var r=o.default.index(n);document.getElementById(this._addUID("GPlocationPoint_"+r)).style.cssText="",document.getElementById(this._addUID("GPlocationStageRemove_"+r))&&(document.getElementById(this._addUID("GPlocationStageRemove_"+r)).className="GPlocationStageRemove")}return document.getElementById(this._addUID("GPlocationOriginPointer_"+s)).checked=!1,void(document.getElementById(this._addUID("GPlocationStageAdd"))&&(document.getElementById(this._addUID("GPlocationStageAdd")).className=""))}}}};e.default=s},function(t,e,i){"use strict";i.r(e);var o={NORTH:"N",SOUTH:"S",EAST:"E",WEST:"O",digitSecond:2,digitDecimal:5,digitRadian:8,roundToDecimal:function(t,e){var i=Math.pow(10,e);return Math.round(t*i)/i},decimalToRadian:function(t){return this.roundToDecimal(.017453292519943295*t,this.digitRadian)},decimalToGrade:function(t){return this.roundToDecimal(1.1111111111111112*t,this.digitRadian)},decimalToDMS:function(t,e,i){t<0&&(t*=-1);var o=Math.floor(t),n=60*(t-o),s=Math.floor(n),a=60*(n-s),r=this.roundToDecimal(a,this.digitSecond),l=o+"° "+s+"' "+r+'" ';return e&&(l+=e),i?{d:o,m:s,s:r,direction:e}:l},decimalLatToDMS:function(t,e){var i=t<0?this.SOUTH:this.NORTH;return this.decimalToDMS(t,i,e)},decimalLonToDMS:function(t,e){var i=t<0?this.WEST:this.EAST;return this.decimalToDMS(t,i,e)},DMSToDecimal:function(t,e,i,o){var n=t+e/60+i/3600;return n=o===this.SOUTH||o===this.WEST?-1*n:n,this.roundToDecimal(n,this.digitDecimal)}};e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(2),n=i.n(o),s=i(34).default.getLogger("icondefault"),a=n.a.Icon.Default.extend({images:{retina:{shadow:"data:image/png;base64,...",color:{blue:"data:image/png;base64,...",orange:"data:image/png;base64,...",red:"data:image/png;base64,...",green:"data:image/png;base64,..."}},shadow:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=",color:{blue:"data:image/png;base64,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",orange:"data:image/png;base64,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",red:"data:image/png;base64,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",green:"data:image/png;base64,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"}},initialize:function(t,e){n.a.Util.extend(this.options,e);var i=null,o=this.images;switch(t){case"red":i=o.color.red;break;case"green":i=o.color.green;break;case"orange":i=o.color.orange;break;case"blue":i=o.color.blue;break;default:i=o.color.blue}this.options.iconUrl=i,this.options.shadowUrl=o.shadow,n.a.Browser.retina&&(this.options.iconRetinaUrl=i,this.options.shadowRetinaUrl=o.shadow)},_getIconUrl:function(t){return s.trace("OVERWRITTEN L.Icon.Default._getIconUrl("+t+")"),n.a.Icon.prototype._getIconUrl.call(this,t)}});e.default=a},function(t,e,i){"use strict";i.r(e);var o={_addUID:function(t){return this._uid?t+"-"+this._uid:t},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPisochron"),t.className="GPwidget",t},_createShowIsoElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowIsochron"),t.type="checkbox",t},_createShowIsoPictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowIsochronPicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowIsochron"),e.title="Calculer une isochrone",e.addEventListener?e.addEventListener("click",(function(e){t.onShowIsoPanelClick(e)})):e.attachEvent&&e.attachEvent("onclick",(function(e){t.onShowIsoPanelClick(e)}));var i=document.createElement("span");return i.id=this._addUID("GPshowIsochronOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createIsoPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPisochronPanel"),t.className="GPpanel",t},_createIsoPanelHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Calcul d'isochrone",e.appendChild(i);var o=document.createElement("div");return o.id=this._addUID("GPisochronPanelClose"),o.className="GPpanelClose",o.title="Fermer le panneau",o.addEventListener?o.addEventListener("click",(function(){document.getElementById(t._addUID("GPshowIsochronPicto")).click()}),!1):o.attachEvent&&o.attachEvent("onclick",(function(){document.getElementById(t._addUID("GPshowIsochronPicto")).click()})),e.appendChild(o),e},_createIsoPanelFormElement:function(){var t=this,e=document.createElement("form");return e.id=this._addUID("GPisochronForm"),e.addEventListener("submit",(function(e){return e.preventDefault(),t.onIsoComputationSubmit(e),!1})),e},_createIsoWaitingElement:function(){var t=document.createElement("div");t.id=this._addUID("GPisochronCalcWaitingContainer"),t.className="GPisochronCalcWaitingContainerHidden";var e=document.createElement("p");return e.className="GPisochronCalcWaiting",e.innerHTML="Calcul en cours...",t.appendChild(e),t},_createIsoPanelFormTypeChoiceElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPisochronChoice"),t},_createIsoPanelFormTypeChoiceChronElement:function(t){var e=this,i=document.createElement("div");i.className="GPisochronChoiceAlt";var o=document.createElement("input");o.id=this._addUID("GPisochronChoiceAltChron"),o.name="GPisochronChoiceMode",o.type="radio",o.checked=!!t,o.addEventListener?o.addEventListener("change",(function(t){document.getElementById(e._addUID("GPisochronValueChron")).className="GPflexInput",document.getElementById(e._addUID("GPisochronValueDist")).className="GPisochronValueHidden",e.onIsoTypeChoiceChange(t)}),!1):o.attachEvent&&o.attachEvent("onchange",(function(){document.getElementById(e._addUID("GPisochronValueChron")).className="GPflexInput",document.getElementById(e._addUID("GPisochronValueDist")).className="GPisochronValueHidden",e.onIsoTypeChoiceChange()})),o.value="isochron",i.appendChild(o);var n=document.createElement("label");n.className="GPisochronChoiceAltImg",n.htmlFor=this._addUID("GPisochronChoiceAltChron"),i.appendChild(n);var s=document.createElement("span");return s.id=this._addUID("GPisochronChoiceAltChronTxt"),s.innerHTML="isochrone",s.addEventListener?s.addEventListener("click",(function(){document.getElementById(e._addUID("GPisochronChoiceAltChron")).click()}),!1):s.attachEvent&&s.attachEvent("onclick",(function(){document.getElementById(e._addUID("GPisochronChoiceAltChron")).click()})),i.appendChild(s),i},_createIsoPanelFormTypeChoiceDistElement:function(t){var e=this,i=document.createElement("div");i.className="GPisochronChoiceAlt";var o=document.createElement("input");o.id=this._addUID("GPisochronChoiceAltDist"),o.name="GPisochronChoiceMode",o.type="radio",o.checked=!!t,o.addEventListener?o.addEventListener("change",(function(t){document.getElementById(e._addUID("GPisochronValueDist")).className="GPflexInput",document.getElementById(e._addUID("GPisochronValueChron")).className="GPisochronValueHidden",e.onIsoTypeChoiceChange(t)}),!1):o.attachEvent&&o.attachEvent("onchange",(function(){document.getElementById(e._addUID("GPisochronValueDist")).className="GPflexInput",document.getElementById(e._addUID("GPisochronValueChron")).className="GPisochronValueHidden",e.onIsoTypeChoiceChange()})),o.value="isodistance",i.appendChild(o);var n=document.createElement("label");n.className="GPisochronChoiceAltImg",n.htmlFor=this._addUID("GPisochronChoiceAltDist"),i.appendChild(n);var s=document.createElement("span");return s.id=this._addUID("GPisochronChoiceAltDistTxt"),s.innerHTML="isodistance",s.addEventListener?s.addEventListener("click",(function(){document.getElementById(e._addUID("GPisochronChoiceAltDist")).click()}),!1):s.attachEvent&&s.attachEvent("onclick",(function(){document.getElementById(e._addUID("GPisochronChoiceAltDist")).click()})),i.appendChild(s),i},_createIsoPanelFormValueIsochronElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GPisochronValueChron"),i.className=t?"GPflexInput":"GPisochronValueHidden";var o=document.createElement("label");o.id=this._addUID("GPisochronValueChronLabel"),o.htmlFor=this._addUID("GPisochronValueChronInput"),o.innerHTML="Temps",i.appendChild(o);var n=document.createElement("input");n.id=this._addUID("GPisochronValueChronInput1"),n.min="0",n.step="1",n.value="0",n.type="number",n.addEventListener?n.addEventListener("change",(function(t){"function"==typeof e.onIsoValueChronTimeMinuteChange&&e.onIsoValueChronTimeHourChange(t)})):n.attachEvent&&n.attachEvent("onchange",(function(t){"function"==typeof e.onIsoValueChronTimeMinuteChange&&e.onIsoValueChronTimeHourChange(t)})),i.appendChild(n);var s=document.createElement("label");s.innerHTML="h",i.appendChild(s);var a=document.createElement("input");a.id=this._addUID("GPisochronValueChronInput2"),a.min="0",a.max="59",a.step="1",a.value="0",a.type="number",a.addEventListener?a.addEventListener("change",(function(t){"function"==typeof e.onIsoValueChronTimeMinuteChange&&e.onIsoValueChronTimeMinuteChange(t)})):a.attachEvent&&a.attachEvent("onchange",(function(t){"function"==typeof e.onIsoValueChronTimeMinuteChange&&e.onIsoValueChronTimeMinuteChange(t)})),i.appendChild(a);var r=document.createElement("label");return r.innerHTML="min",i.appendChild(r),i},_createIsoPanelFormValueIsodistanceElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GPisochronValueDist"),i.className=t?"GPflexInput":"GPisochronValueHidden";var o=document.createElement("label");o.id=this._addUID("GPisochronValueDistLabel"),o.htmlFor=this._addUID("GPisochronValueDistInput"),o.innerHTML="Distance",i.appendChild(o);var n=document.createElement("input");n.id=this._addUID("GPisochronValueDistInput"),n.min="0",n.step="any",n.value="0",n.type="number",n.addEventListener?n.addEventListener("change",(function(t){"function"==typeof e.onIsoValueDistChange&&e.onIsoValueDistChange(t)})):n.attachEvent&&n.attachEvent("onchange",(function(t){"function"==typeof e.onIsoValueDistChange&&e.onIsoValueDistChange(t)})),i.appendChild(n);var s=document.createElement("label");return s.innerHTML="km",i.appendChild(s),i},_createIsoPanelFormModeChoiceElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPisochronModeChoice"),t},_createIsoPanelFormModeChoiceTransportElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GPisochronTransportChoice");var o=document.createElement("span");o.className="GPisochronModeLabel",o.innerHTML="Mode de transport",i.appendChild(o);for(var n=0;n<t.length;n++){var s=t[n];if("Voiture"===s){var a=document.createElement("input");a.id=this._addUID("GPisochronTransportCar"),a.type="radio",a.name="GPisochronTransport",0===n&&(a.checked=!0),a.addEventListener?a.addEventListener("change",(function(t){e.onIsoModeTransportChange(t)})):a.attachEvent&&a.attachEvent("onchange",(function(t){e.onIsoModeTransportChange(t)})),a.value="Voiture",i.appendChild(a);var r=document.createElement("label");r.className="GPisochronTransportImg",r.htmlFor=this._addUID("GPisochronTransportCar"),r.title="Voiture",i.appendChild(r)}if("Pieton"===s){var l=document.createElement("input");l.id=this._addUID("GPisochronTransportPedestrian"),l.type="radio",l.name="GPisochronTransport",0===n&&(l.checked=!0),l.addEventListener?l.addEventListener("change",(function(t){e.onIsoModeTransportChange(t)})):l.attachEvent&&l.attachEvent("onchange",(function(t){e.onIsoModeTransportChange(t)})),l.value="Pieton",i.appendChild(l);var c=document.createElement("label");c.className="GPisochronTransportImg",c.htmlFor=this._addUID("GPisochronTransportPedestrian"),c.title="Piéton",i.appendChild(c)}}return i},_createIsoPanelFormModeChoiceDirectionElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GPisochronDirectionChoice");var o=document.createElement("span");o.className="GPisochronModeLabel",o.innerHTML="Sens de parcours",i.appendChild(o);var n=document.createElement("select");n.id=this._addUID("GPisochronDirectionSelect"),n.className="GPinputSelect",n.addEventListener("change",(function(t){e.onIsoModeDirectionChange(t)}));for(var s=0;s<t.length;s++){var a=t[s];if("departure"===a.toLowerCase()){var r=document.createElement("option");0===s&&(r.selected="selected"),r.value="departure",r.text="Départ",n.appendChild(r)}if("arrival"===a.toLowerCase()){var l=document.createElement("option");0===s&&(l.selected="selected"),l.value="arrival",l.text="Arrivée",n.appendChild(l)}}return i.appendChild(n),i},_createShowIsoExclusionsElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowIsoExclusions"),t.type="checkbox",t},_createShowIsoExclusionsPictoElement:function(){var t=document.createElement("label");return t.id=this._addUID("GPshowIsoExclusionsPicto"),t.className="GPshowMoreOptionsImage GPshowMoreOptions GPshowIsoExclusionsPicto",t.htmlFor=this._addUID("GPshowIsoExclusions"),t.title="Exclusions",t.style.top="240px",t},_createIsoPanelFormExclusionsElement:function(){var t=document.createElement("div");t.id=this._addUID("GPisoExclusions");var e=document.createElement("span");return e.className="GPisoExclusionsLabel",e.innerHTML="Passages autorisés",t.appendChild(e),t},_createIsoPanelFormExclusionOptionsElement:function(t){var e=this,i=document.createElement("div");for(var o in i.className="GPisoExclusionsOptions",t)if(t.hasOwnProperty(o)){var n=t[o];switch(o){case"toll":var s=document.createElement("input");s.id=this._addUID("GPisoExclusionsToll"),s.type="checkbox",s.checked=!n,s.addEventListener?s.addEventListener("change",(function(t){e.onIsoExclusionsChange(t)})):s.attachEvent&&s.attachEvent("onchange",(function(t){e.onIsoExclusionsChange(t)})),s.value="Toll",i.appendChild(s);var a=document.createElement("label");a.className="GPisoExclusionsOption",a.htmlFor=this._addUID("GPisoExclusionsToll"),a.innerHTML="Péages",i.appendChild(a);break;case"tunnel":var r=document.createElement("input");r.id=this._addUID("GPisoExclusionsTunnel"),r.type="checkbox",r.checked=!n,r.addEventListener?r.addEventListener("change",(function(t){e.onIsoExclusionsChange(t)})):r.attachEvent&&r.attachEvent("onchange",(function(t){e.onIsoExclusionsChange(t)})),r.value="Tunnel",i.appendChild(r);var l=document.createElement("label");l.className="GPisoExclusionsOption",l.htmlFor=this._addUID("GPisoExclusionsTunnel"),l.innerHTML="Tunnels",i.appendChild(l);break;case"bridge":var c=document.createElement("input");c.id=this._addUID("GPisoExclusionsBridge"),c.type="checkbox",c.checked=!n,c.addEventListener?c.addEventListener("change",(function(t){e.onIsoExclusionsChange(t)})):c.attachEvent&&c.attachEvent("onchange",(function(t){e.onIsoExclusionsChange(t)})),c.value="Bridge",i.appendChild(c);var u=document.createElement("label");u.className="GPisoExclusionsOption",u.htmlFor=this._addUID("GPisoExclusionsBridge"),u.innerHTML="Ponts",i.appendChild(u)}}return i},_createIsoSubmitFormElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPisochronSubmit"),t.className="GPinputSubmit",t.type="submit",t.value="Calculer",t},_createIsoFormResetElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPisochronReset"),e.title="Réinitialiser les paramètres",e.addEventListener("click",(function(e){t.onIsoResetClick(e)})),e}};e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(40),n=i(2),s=i.n(n),a=i(34),r=i(140),l=i(36),c=i(148),u=i(149),h=i(144),d=i(150);function p(t){return(p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var m=a.default.getLogger("mouseposition"),f=s.a.Control.extend({includes:u.default,options:{position:"bottomleft",collapsed:!0,units:[],systems:[],displayAltitude:!0,displayCoordinates:!0,editCoordinates:!1,altitude:{triggerDelay:200,responseDelay:500,noDataValue:-99999,noDataValueTolerance:9e4,serviceOptions:{}}},initialize:function(t){s.a.Util.extend(this.options,t),this._uid=l.default.generate(),this._projectionSystems=[],this._initProjectionSystems(),this._projectionUnits={},this._initProjectionUnits(),this._isDesktop=this._detectSupport(),this.options.altitude.triggerDelay<100&&(this.options.altitude.triggerDelay=100),this._timer=this.options.altitude.triggerDelay,this._currentProjectionSystems=this._projectionSystems[0],this._projectionSystemsContainer=null,this._currentProjectionType=this._projectionSystems[0].type,this._currentProjectionUnits=this._projectionUnits[this._currentProjectionType][0].code,this._projectionUnitsContainer=null,this._showContainer=null,this._pictoContainer=null,this._panelContainer=null,this._panelHeaderContainer=null,this.options.displayAltitude||this.options.displayCoordinates||(this.options.displayCoordinates=!0),this.options.displayCoordinates||(this.options.editCoordinates=!1),this._isEditing=!1,this._noRightManagement=!1,this.options.displayAltitude&&this._checkRightsManagement(),s.a.Util.setOptions(this,this.options)},onAdd:function(t){var e=this._container=this._initLayout();return this.options.collapsed||(this._isDesktop?t.on("mousemove",this.onMouseMove,this):t.on("move",this.onMapMove,this)),s.a.DomEvent.disableClickPropagation(e).disableScrollPropagation(e),s.a.DomEvent.addListener(e,"mousemove",s.a.DomEvent.stopPropagation).addListener(e,"mousemove",s.a.DomEvent.preventDefault),e},onRemove:function(t){t.off("mousemove",this.onMouseMove)},_initProjectionSystems:function(){for(var t=[{label:"Géographique",crs:s.a.CRS.Simple,type:"Geographical"},{label:"Web Mercator",crs:s.a.CRS.EPSG3395,type:"Metric"},{label:"Lambert 93",crs:d.default.EPSG2154,type:"Metric",geoBBox:{left:-9.86,bottom:41.15,right:10.38,top:51.56}},{label:"Lambert II étendu",crs:d.default.EPSG27572,type:"Metric",geoBBox:{left:-4.87,bottom:42.33,right:8.23,top:51.14}}],e=this.options.systems,i=0;i<e.length;i++){var o=e[i];if(o.label)if(o.crs){o.type||(m.warn("type srs not defined, use 'Metric' by default !"),o.type="Metric"),this._projectionSystems.push(e[i]);for(var n=!1,a=0;a<t.length;a++){var r=t[a];o.crs===r.crs&&(n=!0,m.info("crs '{}' already configured by default",r.code))}n||m.info("crs '{}' not found, it's a new projection",o.code||o.label)}else m.error("crs not defined !");else m.error("not defined !")}0===this._projectionSystems.length&&(this._projectionSystems=t);for(var l=0;l<this._projectionSystems.length;++l)this._projectionSystems[l].code=l},_initProjectionUnits:function(){var t={Geographical:[{code:"DEC",label:"degrés décimaux",format:this._displayDEC},{code:"DMS",label:"degrés sexagésimaux",format:this._displayDMS},{code:"RAD",label:"radians",format:this._displayRAD},{code:"GON",label:"grades",format:this._displayGON}],Metric:[{code:"M",label:"mètres",format:this._displayMeter},{code:"KM",label:"kilomètres",format:this._displayKMeter}]},e=this.options.units;for(var i in t)if(t.hasOwnProperty(i)){for(var o=!1,n=0;n<t[i].length;n++)for(var s=t[i][n],a=0;a<e.length;a++){var r=e[a];s.code===r&&(o=!0,this._projectionUnits[i]||(this._projectionUnits[i]=[]),this._projectionUnits[i].push(s))}o||(this._projectionUnits[i]=t[i])}0===Object.keys(this._projectionUnits).length&&(this._projectionUnits=t)},_checkRightsManagement:function(){var t=r.default.check({key:this.options.apiKey,resources:["SERVICE_CALCUL_ALTIMETRIQUE_RSC"],services:["Elevation"]});this._noRightManagement=!t,this.options.apiKey||(this.options.apiKey=t?t.key:null)},_detectSupport:function(){var t=!0,e=window.navigator.userAgent.toLowerCase();return-1===e.indexOf("iphone")&&-1===e.indexOf("ipod")&&-1===e.indexOf("ipad")&&-1===e.indexOf("android")&&-1===e.indexOf("mobile")&&-1===e.indexOf("blackberry")&&-1===e.indexOf("tablet")&&-1===e.indexOf("phone")&&-1===e.indexOf("touch")||(t=!1),-1===e.indexOf("msie")&&-1===e.indexOf("trident")||(t=!0),t},_initLayout:function(){var t=this._createMainContainerElement(),e=this._showContainer=this._createShowMousePositionElement();t.appendChild(e),this.options.collapsed||(e.checked=!0);var i=this._pictoContainer=this._createShowMousePositionPictoElement(this._isDesktop);t.appendChild(i);var o=this._panelContainer=this._createMousePositionPanelElement(),n=this._panelHeaderContainer=this._createMousePositionPanelHeaderElement();o.appendChild(n);var s=this._createMousePositionPanelBasicElement(this.options.displayAltitude,this.options.displayCoordinates,this.options.editCoordinates);o.appendChild(s);for(var a=this._createShowMousePositionSettingsElement(this.options.displayCoordinates),r=0;r<a.length;r++)o.appendChild(a[r]);var l=this._createMousePositionSettingsElement(),c=this._projectionSystemsContainer=this._createMousePositionSettingsSystemsElement(this._projectionSystems),u=this._projectionUnitsContainer=this._createMousePositionSettingsUnitsElement(this._projectionUnits[this._currentProjectionType]);l.appendChild(c),l.appendChild(u),o.appendChild(l),t.appendChild(o);var h=this._createMapCenter();return this._map.getContainer().appendChild(h),t},_setElevationPanel:function(t){t||(s.a.DomUtil.get(this._addUID("GPmousePositionAltitude")).style.display="none"),t&&this._noRightManagement&&(s.a.DomUtil.get(this._addUID("GPmousePositionAlt")).innerHTML="no right !")},_setCoordinatePanel:function(t){t||(s.a.DomUtil.get(this._addUID("GPmousePositionCoordinate")).style.display="none")},_setSettingsPanel:function(t){if(!t){var e=s.a.DomUtil.get("GPshowMousePositionSettingsPicto"),i=s.a.DomUtil.get(this._addUID("GPmousePositionSettings"));e.style.display="none",i.style.display="none"}},_setTypeUnitsPanel:function(t){for(var e=this._projectionUnitsContainer;e.firstChild;)e.removeChild(e.firstChild);for(var i=this._projectionUnits[t],o=0;o<i.length;o++){var n=i[o],s=document.createElement("option");s.value=n.code?n.code:o,s.text=n.label||o,e.appendChild(s)}var a=this._projectionUnits[t][0].code;"DMS"!==this._currentProjectionUnits&&"DMS"!==a||(this._resetCoordinateElements(this.options.editCoordinates,t,a),this._setEditMode(this._isEditing)),this._currentProjectionType=t,this._resetLabelElements(t),this._resetUnitElements(a),this._currentProjectionUnits=this._projectionUnits[t][0].code},_displayDEC:function(t){var e={};return e.lat=h.default.roundToDecimal(t.lat,6),e.lng=h.default.roundToDecimal(t.lng,6),e.unit="°",e},_displayDMS:function(t){var e={};return e.lat=h.default.decimalLatToDMS(t.lat,!0),e.lng=h.default.decimalLonToDMS(t.lng,!0),e},_displayRAD:function(t){var e={};return e.lat=h.default.decimalToRadian(t.lat),e.lng=h.default.decimalToRadian(t.lng),e.unit="rad",e},_displayGON:function(t){var e={};return e.lat=h.default.decimalToGrade(t.lat),e.lng=h.default.decimalToGrade(t.lng),e.unit="gon",e},_displayMeter:function(t){var e={};return e.x=s.a.Util.formatNum(t.x,2),e.y=s.a.Util.formatNum(t.y,2),e.unit="m",e},_displayKMeter:function(t){var e={};return e.x=s.a.Util.formatNum(t.x/1e3,2),e.y=s.a.Util.formatNum(t.y/1e3,2),e.unit="km",e},_project:function(t,e){if("function"==typeof e&&(e=e()),"object"===p(e)){if(e===s.a.CRS.Simple)return t;if(e.projection&&"object"===p(e.projection)){var i=e.projection.project(t);return"Geographical"===this._currentProjectionType&&(i.lat=i.y,i.lng=i.x),i&&0!==Object.keys(i).length||m.error("Failed to project with crs code : "+e.code),i}m.error("projection is not an object !")}else m.log("crs is not an object !")},_unproject:function(t){var e=this._currentProjectionSystems.crs;if(e)if("function"==typeof e&&(e=e()),"object"===p(e)){if(e===s.a.CRS.Simple)return{lat:t.y,lng:t.x};if("Geographical"===this._currentProjectionType)return{lat:t.y,lng:t.x};if(e.projection&&"object"===p(e.projection)){var i=e.projection.unproject(t);return i&&0!==Object.keys(i).length||m.error("Failed to unproject coordinate"),i}m.error("projection is not an object !")}else m.log("crs is not an object !");else m.log("system crs not found")},_setCoordinate:function(t){for(var e=this._currentProjectionSystems.type,i=null,o=this._projectionUnits[e],n=0;n<o.length;n++)if(o[n].code===this._currentProjectionUnits){i=o[n].format;break}var s,a=this._currentProjectionSystems.crs;a?(s=i(this._project(t,a)))&&0!==Object.keys(s).lenght&&this.GPdisplayCoords(s):m.error("crs not found !")},_setElevation:function(t){var e=this.options.altitude.responseDelay,i=this.options.altitude.noDataValue,o=this.options.altitude.noDataValueTolerance;this.GPdisplayElevation(t,e,i,o)},onMoveStopped:function(t){this._noRightManagement||this._setElevation(t)},onMouseMove:function(t){var e=this,i=t.latlng;this._setCoordinate(i),clearTimeout(this._timer),this._timer=setTimeout((function(){e.onMoveStopped(i)}),this.options.altitude.triggerDelay)},onMapMove:function(){var t=this,e=this._map.getCenter();this._setCoordinate(e),clearTimeout(this._timer),this._timer=setTimeout((function(){t.onMoveStopped(e)}),this.options.altitude.triggerDelay)},onRequestAltitude:function(t,e){if(m.log("onRequestAltitude"),t&&0!==Object.keys(t).length&&this.options.displayAltitude&&!this._noRightManagement){m.log(t);var i={};s.a.Util.extend(i,this.options.altitude.serviceOptions),s.a.Util.extend(i,{zonly:!0,positions:[{lon:t.lon||t.lng,lat:t.lat}]}),s.a.Util.extend(i,{scope:this,onSuccess:function(t){m.log(t),t&&Object.keys(t)&&e.call(this,t.elevations[0].z)},onFailure:function(t){m.error(t.message)}}),s.a.Util.extend(i,{apiKey:i.apiKey||this.options.apiKey}),s.a.Util.extend(i,{ssl:this.options.ssl}),m.log(i),o.default.Services.getAltitude(i)}},onShowMousePositionClick:function(t){m.log(t);var e=this._map;this._showContainer.checked?this._isDesktop?e.off("mousemove",this.onMouseMove,this):e.off("move",this.onMapMove,this):this._isDesktop?e.on("mousemove",this.onMouseMove,this):e.on("move",this.onMapMove,this),this._setElevationPanel(this.options.displayAltitude),this._setCoordinatePanel(this.options.displayCoordinates),this.options.displayCoordinates||this._setSettingsPanel(!1)},onMousePositionEditModeClick:function(t){if(this.options.editCoordinates&&this._isEditing!==t){this._isEditing=t,this._setEditMode(this._isEditing);var e=this._map;this._isDesktop?this._isEditing?e.off("mousemove",this.onMouseMove,this):e.on("mousemove",this.onMouseMove,this):this._isEditing?e.off("move",this.onMapMove,this):e.on("move",this.onMapMove,this)}},_convertCoordinate:function(t,e){var i;if("DEC"===e||"DMS"===e)i=t;else if("M"===e)i=t;else if("KM"===e)i=1e3*t;else if("RAD"===e){i=(t*(180/Math.PI).toFixed(20)).toFixed(20)}else if("GON"===e){i=(t*.9.toFixed(20)).toFixed(20)}return i},validateExtentCoordinate:function(t,e,i){if(void 0!==i)return!0;if(-1===["Lon","Lat"].indexOf(t))return!1;var o=this._currentProjectionSystems.geoBBox;if(void 0===o)return!0;if(o){var n=[o.left,o.bottom,o.right,o.top],s=this._currentProjectionUnits,a=this._unproject({x:"Lon"===t?this._convertCoordinate(e,s):0,y:"Lat"===t?this._convertCoordinate(e,s):0});if("Lon"===t&&(a.lng<n[0]||a.lng>n[2]))return m.warn("coordinates (lon) out of extent !?"),!1;if("Lat"===t&&(a.lat<n[1]||a.lat>n[3]))return m.warn("coordinates (lat) out of extent !?"),!1}return!0},_getCoordinate:function(t){var e=s.a.DomUtil.get(this._addUID("GPmousePosition"+t+"Degrees")),i=e.value;if(!i)return null;if(i=i.replace(",","."),!c.default.isInteger(i))return null;var o=c.default.toInteger(i);if(o<Number(e.dataset.min)||o>Number(e.dataset.max))return null;var n=s.a.DomUtil.get(this._addUID("GPmousePosition"+t+"Direction")).value,a=s.a.DomUtil.get(this._addUID("GPmousePosition"+t+"Minutes")),r=a.value;if(r&&(r=r.replace(",","."),c.default.isInteger(r))){var l=c.default.toInteger(r);l>=Number(a.dataset.min)&&l<=Number(a.dataset.max)&&(o+=l/60)}var u=s.a.DomUtil.get(this._addUID("GPmousePosition"+t+"Seconds")),h=u.value;if(h){h=h.replace(",",".");var d=c.default.toFloat(h);d&&d>=Number(u.dataset.min)&&d<=Number(u.dataset.max)&&(o+=d/3600)}return"O"!==n&&"S"!==n||(o=-o),o},_locateDMSCoordinates:function(){var t={lat:this._getCoordinate("Lat"),lng:this._getCoordinate("Lon")};this.validateExtentCoordinate("Lon",t.lng)&&(this.validateExtentCoordinate("Lat",t.lat)&&this._map.panTo(t))},_locateCoordinates:function(){var t=s.a.DomUtil.get(this._addUID("GPmousePositionLon")).value;if(t=t.replace(",","."),t=parseFloat(t),!isNaN(t)){var e=s.a.DomUtil.get(this._addUID("GPmousePositionLat")).value;if(e=e.replace(",","."),e=parseFloat(e),!isNaN(e)){var i=null,o=null,n=null,a=null;if("Geographical"===this._currentProjectionType?(i=t,o=e):(n=e,a=t),this.validateExtentCoordinate("Lon",i||n)&&this.validateExtentCoordinate("Lat",o||a)){var r=this._currentProjectionUnits,l=this._unproject({x:this._convertCoordinate(null!==i?i:n,r),y:this._convertCoordinate(null!==o?o:a,r)});this._map.panTo(l)}}}},onMousePositionEditModeLocateClick:function(){this.options.editCoordinates&&(this._isEditing?"DMS"===this._currentProjectionUnits?this._locateDMSCoordinates():this._locateCoordinates():this.onMousePositionEditModeClick(!0))},onMousePositionProjectionSystemChange:function(t){m.log("onMousePositionProjectionSystemChange",t);var e=t.target.selectedIndex,i=t.target.options[e].value,o=t.target.options[e].label;m.log(e,i,o),this._setCurrentSystem(i)},_setCurrentSystem:function(t){for(var e=null,i=0;i<this._projectionSystems.length;++i)if(this._projectionSystems[i].code===Number(t)){e=this._projectionSystems[i].type;break}e?(e!==this._currentProjectionType&&this._setTypeUnitsPanel(e),this._currentProjectionSystems=this._projectionSystems[Number(t)],this._isDesktop||this.onMapMove()):m.log("system not found in projection systems container")},onMousePositionProjectionSystemMouseOver:function(t){m.log("onMousePositionProjectionSystemMouseOver",t);var e=this._map;if(e){var i=s.a.DomUtil.get(this._addUID("GPmousePositionProjectionSystem"));i.innerHTML="";for(var o=0;o<this._projectionSystems.length;o++){var n=this._projectionSystems[o],a=null;n.geoBBox&&(e.getBounds()._southWest.lng>n.geoBBox.right||e.getBounds()._southWest.lat>n.geoBBox.top||e.getBounds()._northEast.lng<n.geoBBox.left||e.getBounds()._northEast.lat<n.geoBBox.bottom)?n===this._currentProjectionSystems&&((a=document.createElement("option")).value=n.code,a.text=n.label||o,a.setAttribute("selected","selected"),a.setAttribute("disabled","disabled"),i.appendChild(a)):((a=document.createElement("option")).value=n.code,a.text=n.label||o,n===this._currentProjectionSystems&&a.setAttribute("selected","selected"),i.appendChild(a))}}},onMousePositionProjectionUnitsChange:function(t){m.log("onMousePositionProjectionUnitsChange",t);var e=t.target.selectedIndex,i=t.target.options[e].value,o=t.target.options[e].label;m.log(e,i,o);var n=this._currentProjectionUnits,s=this._currentProjectionUnits=i,a=this._currentProjectionType;this._resetLabelElements(a),this._resetUnitElements(s),"DMS"!==n&&"DMS"!==s||(this._resetCoordinateElements(this.options.editCoordinates,a,s),this._setEditMode(this._isEditing)),this._isDesktop||this.onMapMove()},moveTo:function(t,e,i){this._showContainer.checked||this._pictoContainer.click();var o=this._map;o&&(this.onMouseMove({latlng:t}),o.flyTo(t,e||10,i||{}))}});e.default=f},function(t,e,i){"use strict";i.r(e);var o={modulo:function(t,e){var i=t%e;return i*e<0?i+e:i},decimalToDMS:function(t,e,i){var o=this.modulo(t+180,360)-180,n=Math.abs(3600*o),s=i||0,a=Math.pow(10,s),r=Math.floor(n/3600),l=Math.floor((n-3600*r)/60),c=n-3600*r-60*l;return(c=Math.ceil(c*a)/a)>=60&&(c=0,l+=1),l>=60&&(l=0,r+=1),{d:r,m:l,s:c,direction:e.charAt(o<0?1:0)}},toInteger:function(t,e){var i=parseInt(t,e||10);return!isNaN(i)&&isFinite(i)?i:null},isInteger:function(t){if(isNaN(t))return!1;var e=parseFloat(t);return(0|e)===e},toFloat:function(t){var e=parseFloat(t);return!isNaN(e)&&isFinite(e)?e:null}};e.default=o},function(t,e,i){"use strict";function o(t){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}i.r(e);var n={_addUID:function(t){return this._uid?t+"-"+this._uid:t},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPmousePosition"),t.className="GPwidget",t},_createShowMousePositionElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowMousePosition"),t.type="checkbox",t},_createShowMousePositionPictoElement:function(t){var e=this,i=document.createElement("label");i.id=this._addUID("GPshowMousePositionPicto"),i.className="GPshowAdvancedToolPicto",i.htmlFor=this._addUID("GPshowMousePosition"),i.title="Afficher les coordonnées du curseur",i.addEventListener("click",(function(i){var o="";document.getElementById(e._addUID("GPshowMousePosition")).checked||t||(o="GPmapCenterVisible"),document.getElementById("GPmapCenter").className=o,e.onShowMousePositionClick(i)}));var o=document.createElement("span");return o.id=this._addUID("GPshowMousePositionOpen"),o.className="GPshowAdvancedToolOpen",i.appendChild(o),i},_createMousePositionPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPmousePositionPanel"),t.className="GPpanel",t},_createMapCenter:function(){var t=document.createElement("div");return t.id="GPmapCenter",t.className="",t},_createMousePositionPanelHeaderElement:function(){var t=document.createElement("div");t.className="GPpanelHeader";var e=document.createElement("div");e.className="GPpanelTitle",e.innerHTML="Coordonnées",t.appendChild(e);var i=document.createElement("div");i.id="GPmousePositionPanelClose",i.className="GPpanelClose",i.title="Fermer le panneau";var o=this;return i.addEventListener?i.addEventListener("click",(function(){document.getElementById(o._addUID("GPshowMousePositionPicto")).click()}),!1):i.attachEvent&&i.attachEvent("onclick",(function(){document.getElementById(o._addUID("GPshowMousePositionPicto")).click()})),t.appendChild(i),t},_createMousePositionPanelBasicElement:function(t,e,i,o){t=void 0===t||t,e=void 0===e||e,i=void 0!==i&&i;var n=document.createElement("div");return n.id=this._addUID("GPmousePositionBasicPanel"),n.appendChild(this._createMousePositionPanelBasicCoordinateElement(e,i,o)),n.appendChild(this._createMousePositionPanelEditToolsElement(i)),n.appendChild(this._createMousePositionPanelBasicAltitudeElement(t)),n},_createCoordinateElement:function(t,e){var i=this;if(-1===["Lon","Lat"].indexOf(t))return[];var o=[],n=document.createElement("input");n.id=this._addUID("GPmousePosition"+t),n.title=!0===e?"Cliquer pour saisir des coordonnées":"",n.readOnly=!0,e&&(n.addEventListener("click",(function(){i.onMousePositionEditModeClick(!0)})),n.addEventListener("change",(function(e){this.classList.remove("error"),i.validateExtentCoordinate(t,this.value,e)?this.classList.remove("error"):this.classList.add("error")}))),o.push(n);var s=document.createElement("span");return s.className="GPmousePositionUnits",o.push(s),o},_createDMSCoordinateElement:function(t,e){if(-1===["Lon","Lat"].indexOf(t))return[];var i=this,o=[],n=document.createElement("input");n.id=this._addUID("GPmousePosition"+t+"Degrees"),n.className="GPSexagesimal",n.setAttribute("name","degrees"),n.title=!0===e?"Cliquer pour saisir des coordonnées":"",n.readOnly=!0,n.dataset.min=0,n.dataset.max="Lon"===t?180:90,e&&(n.addEventListener("click",(function(){i.onMousePositionEditModeClick(!0)})),n.addEventListener("change",(function(){this.classList.remove("error"),i._checkDMSDegrees(t,this)?this.classList.remove("error"):this.classList.add("error")}))),o.push(n);var s=document.createElement("span");s.className="GPmousePositionSexagesimalLabel",s.innerHTML="°",o.push(s);var a=document.createElement("input");a.id=this._addUID("GPmousePosition"+t+"Minutes"),a.className="GPSexagesimal",a.setAttribute("name","minutes"),a.title=!0===e?"Cliquer pour saisir des coordonnées":"",a.readOnly=!0,a.dataset.min=0,a.dataset.max=59,e&&(a.addEventListener("click",(function(){i.onMousePositionEditModeClick(!0)})),a.addEventListener("change",(function(){this.classList.remove("error"),i._checkDMSElement(this)?this.classList.remove("error"):this.classList.add("error")}))),o.push(a);var r=document.createElement("span");r.className="GPmousePositionSexagesimalLabel",r.innerHTML="'",o.push(r);var l=document.createElement("input");l.id=this._addUID("GPmousePosition"+t+"Seconds"),l.className="GPSexagesimalsec",l.setAttribute("name","seconds"),l.title=!0===e?"Cliquer pour saisir des coordonnées":"",l.readOnly=!0,l.dataset.min=0,l.dataset.max=59,e&&(l.addEventListener("click",(function(){i.onMousePositionEditModeClick(!0)})),l.addEventListener("change",(function(){this.classList.remove("error"),i._checkDMSElement(this,!0)?this.classList.remove("error"):this.classList.add("error")}))),o.push(l);var c=document.createElement("span");c.className="GPmousePositionSexagesimalLabel",c.innerHTML="''",o.push(c);var u=document.createElement("select");u.id=this._addUID("GPmousePosition"+t+"Direction"),u.className="GPmousePositionDirection",u.setAttribute("name","direction"),u.disabled=!0;var h=document.createElement("option");h.value="Lon"===t?"E":"N",h.innerHTML="Lon"===t?"E":"N",u.appendChild(h);var d=document.createElement("option");return d.value="Lon"===t?"O":"S",d.innerHTML="Lon"===t?"O":"S",u.appendChild(d),o.push(u),o},_createMousePositionPanelBasicCoordinateElement:function(t,e,i){var o=document.createElement("div");o.id=this._addUID("GPmousePositionCoordinate"),o.style.display=t?"block":"none";var n=document.createElement("div"),s=document.createElement("span");s.className="GPmousePositionLabel",s.id=this._addUID("GPmousePositionLatLabel"),s.innerHTML="Latitude : ",n.appendChild(s);var a,r=document.createElement("span");r.id=this._addUID("GPmousePositionLatCoordinate"),a="DMS"===i?this._createDMSCoordinateElement("Lat",e):this._createCoordinateElement("Lat",e);for(var l=0;l<a.length;l++)r.appendChild(a[l]);n.appendChild(r),o.appendChild(n);var c=document.createElement("div"),u=document.createElement("span");u.className="GPmousePositionLabel",u.id=this._addUID("GPmousePositionLonLabel"),u.innerHTML="Longitude : ",c.appendChild(u);var h,d=document.createElement("span");d.id=this._addUID("GPmousePositionLonCoordinate"),h="DMS"===i?this._createDMSCoordinateElement("Lon",e):this._createCoordinateElement("Lon",e);for(var p=0;p<h.length;p++)d.appendChild(h[p]);return c.appendChild(d),o.appendChild(c),o},_createMousePositionPanelBasicAltitudeElement:function(t){var e=document.createElement("div");e.id=this._addUID("GPmousePositionAltitude"),e.style.display=t?"block":"none";var i=document.createElement("span");i.className="GPmousePositionLabel",i.innerHTML="Altitude : ",e.appendChild(i);var o=document.createElement("span");o.className="GPmousePositionCoords",o.id=this._addUID("GPmousePositionAlt"),o.innerHTML="...",e.appendChild(o);var n=document.createElement("span");return n.className="GPmousePositionAltitudeUnits",n.innerHTML="m",e.appendChild(n),e},_createMousePositionPanelEditToolsElement:function(t){var e=this,i=document.createElement("div");i.className="GPmousePositionPanelEditTools",i.id=this._addUID("GPmousePositionPanelEditTools"),t||(i.style.display="none");var o=document.createElement("span");o.className="GPmousePositionEditTool",o.id=this._addUID("GPmousePositionLocate"),o.title=!0===t?"Cliquer pour saisir des coordonnées":"",t&&o.addEventListener("click",(function(){e.onMousePositionEditModeLocateClick()})),i.appendChild(o);var n=document.createElement("span");return n.className="GPmousePositionEditTool",n.id=this._addUID("GPmousePositionCloseEdit"),n.title="Quitter la saisie des coordonnées",n.style.display="none",t&&n.addEventListener("click",(function(){e.onMousePositionEditModeClick(!1)})),i.appendChild(n),i},_createShowMousePositionSettingsElement:function(t){var e=[],i=this,o=document.createElement("input");o.type="checkbox",o.id=this._addUID("GPshowMousePositionSettings");var n=document.createElement("label");return n.id=this._addUID("GPshowMousePositionSettingsPicto"),n.htmlFor=this._addUID("GPshowMousePositionSettings"),n.title="Réglages",n.className="GPshowMoreOptionsImage GPshowMoreOptions GPshowMousePositionSettingsPicto",n.style.display=t?"block":"none",n.addEventListener?n.addEventListener("click",(function(t){"function"==typeof i.onShowMousePositionSettingsClick&&i.onShowMousePositionSettingsClick(t)}),!1):n.attachEvent&&n.attachEvent("onclick",(function(t){"function"==typeof i.onShowMousePositionSettingsClick&&i.onShowMousePositionSettingsClick(t)})),e.push(o),e.push(n),e},_createMousePositionSettingsElement:function(t){var e=document.createElement("div");e.id=this._addUID("GPmousePositionSettings"),e.style.display=void 0===t||t?"block":"none";var i=document.createElement("span");return i.className="GPmousePositionSettingsLabel",i.innerHTML="Système de référence",e.appendChild(i),e},_createMousePositionSettingsSystemsElement:function(t){var e=this,i=document.createElement("select");i.id=this._addUID("GPmousePositionProjectionSystem"),i.className="GPinputSelect GPmousePositionSettingsSelect",i.addEventListener("change",(function(t){e.onMousePositionProjectionSystemChange(t)})),i.addEventListener("mouseover",(function(t){"OPTION"!==t.target.nodeName&&e.onMousePositionProjectionSystemMouseOver(t)}));for(var o=0;o<t.length;o++){var n=t[o],s=document.createElement("option");s.value=n.code,s.text=n.label||o,i.appendChild(s)}return i},_createMousePositionSettingsUnitsElement:function(t){var e=this,i=document.createElement("select");i.id=this._addUID("GPmousePositionProjectionUnits"),i.className="GPinputSelect GPmousePositionSettingsSelect",i.addEventListener("change",(function(t){e.onMousePositionProjectionUnitsChange(t)}));for(var o=0;o<t.length;o++){var n=t[o],s=document.createElement("option");s.value=n.code?n.code:o,s.text=n.label||o,i.appendChild(s)}return i},_resetLabelElements:function(t){document.getElementById(this._addUID("GPmousePositionLatLabel")).innerHTML="Geographical"===t?"Latitude :":"X :",document.getElementById(this._addUID("GPmousePositionLonLabel")).innerHTML="Geographical"===t?"Longitude :":"Y :"},_resetUnitElements:function(t){var e="";"M"!==t&&"KM"!==t||(e=t.toLowerCase());for(var i=document.getElementsByClassName("GPmousePositionUnits"),o=0;o<i.length;o++)i[o].innerHTML=e},_resetCoordinateElements:function(t,e,i){for(var o,n=document.getElementById(this._addUID("GPmousePositionLatCoordinate"));n.firstChild;)n.removeChild(n.firstChild);o="DMS"===i?this._createDMSCoordinateElement("Lat",t):this._createCoordinateElement("Lat",t);for(var s=0;s<o.length;s++)n.appendChild(o[s]);for(var a,r=document.getElementById(this._addUID("GPmousePositionLonCoordinate"));r.firstChild;)r.removeChild(r.firstChild);a="DMS"===i?this._createDMSCoordinateElement("Lon",t):this._createCoordinateElement("Lon",t);for(var l=0;l<a.length;l++)r.appendChild(a[l])},_setEditMode:function(t){document.getElementById(this._addUID("GPmousePositionLocate")).title=t?"Aller à la position ...":"Cliquer pour saisir des coordonnées",document.getElementById(this._addUID("GPmousePositionCloseEdit")).style.display=t?"inline-block":"none";for(var e="div[id^="+this._addUID("GPmousePositionCoordinate")+"]",i=document.querySelectorAll(e+" input"),o=0;o<i.length;o++)i[o].readOnly=!t,t&&(i[o].value="",i[o].classList.remove("error"));for(var n=document.querySelectorAll(e+" select"),s=0;s<n.length;s++)n[s].disabled=!t},_checkDMSElement:function(t,e){var i=void 0!==e,o=t.value;if(i&&(o=o.replace(",",".")),isNaN(o))return!1;var n=parseFloat(o);if(!i&&(0|n)!==n)return!1;var s=Number(t.dataset.min),a=Number(t.dataset.max);return n>=s&&n<=a},_checkDMSDegrees:function(t,e){if(isNaN(e.value))return!1;var i=parseFloat(e.value);if((0|i)!==i)return!1;var o=Number(e.dataset.min),n=Number(e.dataset.max);if(i<o||i>n)return!1;var s=document.getElementById(this._addUID("GPmousePosition"+t+"Minutes")),a=document.getElementById(this._addUID("GPmousePosition"+t+"Seconds"));return i>=n?(s.dataset.max=0,a.dataset.max=0):(s.dataset.max=59,a.dataset.max=59.9999),!0},GPdisplayCoords:function(t){if(t&&null!=t){var e=document.getElementById(this._addUID("GPmousePositionLonLabel")),i=document.getElementById(this._addUID("GPmousePositionLatLabel"));if(t.x||t.y?(i.innerHTML="X : ",e.innerHTML="Y : "):t.e||t.n?(i.innerHTML="E : ",e.innerHTML="N : "):(i.innerHTML="Latitude : ",e.innerHTML="Longitude : "),"object"===o(t.lat)&&"object"===o(t.lng)){var n={lng:"Lon",lat:"Lat"},s=["Degrees","Minutes","Seconds"];for(var a in n)for(var r=0;r<s.length;++r){var l="GPmousePosition"+n[a]+s[r],c=document.getElementById(this._addUID(l)),u=s[r].charAt(0).toLowerCase();c.value=t[a][u]}document.getElementById(this._addUID("GPmousePositionLonDirection")).value=t.lng.direction,document.getElementById(this._addUID("GPmousePositionLatDirection")).value=t.lat.direction}else{var h=document.getElementById(this._addUID("GPmousePositionLat")),d=document.getElementById(this._addUID("GPmousePositionLon"));h.value=t.x||t.lat||t.e||"0",d.value=t.y||t.lng||t.lon||t.n||"0";for(var p=void 0===t.unit?"":t.unit,m=document.getElementsByClassName("GPmousePositionUnits"),f=0;f<m.length;++f)m[f].innerHTML=p}}},GPdisplayElevation:function(t,e,i,o){var n,s=this;e||(e=500),clearTimeout(n),document.getElementById(this._addUID("GPmousePositionAlt")).innerHTML="...",null==i&&(i=-99999),null==o&&(o=99980);var a=i+o,r=i-o;t&&null!=t&&document.getElementById(this._addUID("GPmousePositionAltitude"))&&(n=setTimeout((function(){s.onRequestAltitude(t,(function(t){r<t&&t<a?s.GPresetElevation():document.getElementById(s._addUID("GPmousePositionAlt")).innerHTML=t}))}),e))},GPresetElevation:function(){document.getElementById(this._addUID("GPmousePositionAltitude"))&&(document.getElementById(this._addUID("GPmousePositionAlt")).innerHTML="---")}};e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(151),n=i.n(o),s=(i(153),i(154)),a=i(155),r=i(156),l=i(157);s.default.load(n.a);var c={EPSG2154:function(){return a.default.build()},EPSG27572:function(){return r.default.build()},EPSG4326:function(){return l.default.build()}};e.default=c},function(t,e,i){(function(e){t.exports=e.proj4=i(152)}).call(this,i(52))},function(t,e,i){t.exports=function(){"use strict";var t=1,e=2,i=4,o=5,n=484813681109536e-20,s=Math.PI/2,a=.16666666666666666,r=.04722222222222222,l=.022156084656084655,c=1e-10,u=.017453292519943295,h=57.29577951308232,d=Math.PI/4,p=2*Math.PI,m=3.14159265359,f={greenwich:0,lisbon:-9.131906111111,paris:2.337229166667,bogota:-74.080916666667,madrid:-3.687938888889,rome:12.452333333333,bern:7.439583333333,jakarta:106.807719444444,ferro:-17.666666666667,brussels:4.367975,stockholm:18.058277777778,athens:23.7163375,oslo:10.722916666667},_={ft:{to_meter:.3048},"us-ft":{to_meter:1200/3937}},g=/[\s_\-\/\(\)]/g;function v(t,e){if(t[e])return t[e];for(var i,o=Object.keys(t),n=e.toLowerCase().replace(g,""),s=-1;++s<o.length;)if((i=o[s]).toLowerCase().replace(g,"")===n)return t[i]}var y=function(t){var e,i,o,n={},s=t.split("+").map((function(t){return t.trim()})).filter((function(t){return t})).reduce((function(t,e){var i=e.split("=");return i.push(!0),t[i[0].toLowerCase()]=i[1],t}),{}),a={proj:"projName",datum:"datumCode",rf:function(t){n.rf=parseFloat(t)},lat_0:function(t){n.lat0=t*u},lat_1:function(t){n.lat1=t*u},lat_2:function(t){n.lat2=t*u},lat_ts:function(t){n.lat_ts=t*u},lon_0:function(t){n.long0=t*u},lon_1:function(t){n.long1=t*u},lon_2:function(t){n.long2=t*u},alpha:function(t){n.alpha=parseFloat(t)*u},lonc:function(t){n.longc=t*u},x_0:function(t){n.x0=parseFloat(t)},y_0:function(t){n.y0=parseFloat(t)},k_0:function(t){n.k0=parseFloat(t)},k:function(t){n.k0=parseFloat(t)},a:function(t){n.a=parseFloat(t)},b:function(t){n.b=parseFloat(t)},r_a:function(){n.R_A=!0},zone:function(t){n.zone=parseInt(t,10)},south:function(){n.utmSouth=!0},towgs84:function(t){n.datum_params=t.split(",").map((function(t){return parseFloat(t)}))},to_meter:function(t){n.to_meter=parseFloat(t)},units:function(t){n.units=t;var e=v(_,t);e&&(n.to_meter=e.to_meter)},from_greenwich:function(t){n.from_greenwich=t*u},pm:function(t){var e=v(f,t);n.from_greenwich=(e||parseFloat(t))*u},nadgrids:function(t){"@null"===t?n.datumCode="none":n.nadgrids=t},axis:function(t){3===t.length&&-1!=="ewnsud".indexOf(t.substr(0,1))&&-1!=="ewnsud".indexOf(t.substr(1,1))&&-1!=="ewnsud".indexOf(t.substr(2,1))&&(n.axis=t)}};for(e in s)i=s[e],e in a?"function"==typeof(o=a[e])?o(i):n[o]=i:n[e]=i;return"string"==typeof n.datumCode&&"WGS84"!==n.datumCode&&(n.datumCode=n.datumCode.toLowerCase()),n},E=1,P=/\s/,w=/[A-Za-z]/,C=/[A-Za-z84]/,M=/[,\]]/,S=/[\d\.E\-\+]/;function L(t){if("string"!=typeof t)throw new Error("not a string");this.text=t.trim(),this.level=0,this.place=0,this.root=null,this.stack=[],this.currentObject=null,this.state=E}function b(t,e,i){Array.isArray(e)&&(i.unshift(e),e=null);var o=e?{}:t,n=i.reduce((function(t,e){return R(e,t),t}),o);e&&(t[e]=n)}function R(t,e){if(Array.isArray(t)){var i=t.shift();if("PARAMETER"===i&&(i=t.shift()),1===t.length)return Array.isArray(t[0])?(e[i]={},void R(t[0],e[i])):void(e[i]=t[0]);if(t.length)if("TOWGS84"!==i){if("AXIS"===i)return i in e||(e[i]=[]),void e[i].push(t);var o;switch(Array.isArray(i)||(e[i]={}),i){case"UNIT":case"PRIMEM":case"VERT_DATUM":return e[i]={name:t[0].toLowerCase(),convert:t[1]},void(3===t.length&&R(t[2],e[i]));case"SPHEROID":case"ELLIPSOID":return e[i]={name:t[0],a:t[1],rf:t[2]},void(4===t.length&&R(t[3],e[i]));case"PROJECTEDCRS":case"PROJCRS":case"GEOGCS":case"GEOCCS":case"PROJCS":case"LOCAL_CS":case"GEODCRS":case"GEODETICCRS":case"GEODETICDATUM":case"EDATUM":case"ENGINEERINGDATUM":case"VERT_CS":case"VERTCRS":case"VERTICALCRS":case"COMPD_CS":case"COMPOUNDCRS":case"ENGINEERINGCRS":case"ENGCRS":case"FITTED_CS":case"LOCAL_DATUM":case"DATUM":return t[0]=["name",t[0]],void b(e,i,t);default:for(o=-1;++o<t.length;)if(!Array.isArray(t[o]))return R(t,e[i]);return b(e,i,t)}}else e[i]=t;else e[i]=!0}else e[t]=!0}L.prototype.readCharicter=function(){var t=this.text[this.place++];if(4!==this.state)for(;P.test(t);){if(this.place>=this.text.length)return;t=this.text[this.place++]}switch(this.state){case E:return this.neutral(t);case 2:return this.keyword(t);case 4:return this.quoted(t);case 5:return this.afterquote(t);case 3:return this.number(t);case-1:return}},L.prototype.afterquote=function(t){if('"'===t)return this.word+='"',void(this.state=4);if(M.test(t))return this.word=this.word.trim(),void this.afterItem(t);throw new Error("havn't handled \""+t+'" in afterquote yet, index '+this.place)},L.prototype.afterItem=function(t){return","===t?(null!==this.word&&this.currentObject.push(this.word),this.word=null,void(this.state=E)):"]"===t?(this.level--,null!==this.word&&(this.currentObject.push(this.word),this.word=null),this.state=E,this.currentObject=this.stack.pop(),void(this.currentObject||(this.state=-1))):void 0},L.prototype.number=function(t){if(!S.test(t)){if(M.test(t))return this.word=parseFloat(this.word),void this.afterItem(t);throw new Error("havn't handled \""+t+'" in number yet, index '+this.place)}this.word+=t},L.prototype.quoted=function(t){'"'!==t?this.word+=t:this.state=5},L.prototype.keyword=function(t){if(C.test(t))this.word+=t;else{if("["===t){var e=[];return e.push(this.word),this.level++,null===this.root?this.root=e:this.currentObject.push(e),this.stack.push(this.currentObject),this.currentObject=e,void(this.state=E)}if(!M.test(t))throw new Error("havn't handled \""+t+'" in keyword yet, index '+this.place);this.afterItem(t)}},L.prototype.neutral=function(t){if(w.test(t))return this.word=t,void(this.state=2);if('"'===t)return this.word="",void(this.state=4);if(S.test(t))return this.word=t,void(this.state=3);if(!M.test(t))throw new Error("havn't handled \""+t+'" in neutral yet, index '+this.place);this.afterItem(t)},L.prototype.output=function(){for(;this.place<this.text.length;)this.readCharicter();if(-1===this.state)return this.root;throw new Error('unable to parse string "'+this.text+'". State is '+this.state)};var x=.017453292519943295;function I(t){return t*x}var G=function(t){var e=new L(t).output(),i=e.shift(),o=e.shift();e.unshift(["name",o]),e.unshift(["type",i]);var n={};return R(e,n),function(t){if("GEOGCS"===t.type?t.projName="longlat":"LOCAL_CS"===t.type?(t.projName="identity",t.local=!0):"object"==typeof t.PROJECTION?t.projName=Object.keys(t.PROJECTION)[0]:t.projName=t.PROJECTION,t.AXIS){for(var e="",i=0,o=t.AXIS.length;i<o;++i){var n=t.AXIS[i][0].toLowerCase();-1!==n.indexOf("north")?e+="n":-1!==n.indexOf("south")?e+="s":-1!==n.indexOf("east")?e+="e":-1!==n.indexOf("west")&&(e+="w")}2===e.length&&(e+="u"),3===e.length&&(t.axis=e)}t.UNIT&&(t.units=t.UNIT.name.toLowerCase(),"metre"===t.units&&(t.units="meter"),t.UNIT.convert&&("GEOGCS"===t.type?t.DATUM&&t.DATUM.SPHEROID&&(t.to_meter=t.UNIT.convert*t.DATUM.SPHEROID.a):t.to_meter=t.UNIT.convert));var s=t.GEOGCS;function a(e){return e*(t.to_meter||1)}"GEOGCS"===t.type&&(s=t),s&&(s.DATUM?t.datumCode=s.DATUM.name.toLowerCase():t.datumCode=s.name.toLowerCase(),"d_"===t.datumCode.slice(0,2)&&(t.datumCode=t.datumCode.slice(2)),"new_zealand_geodetic_datum_1949"!==t.datumCode&&"new_zealand_1949"!==t.datumCode||(t.datumCode="nzgd49"),"wgs_1984"!==t.datumCode&&"world_geodetic_system_1984"!==t.datumCode||("Mercator_Auxiliary_Sphere"===t.PROJECTION&&(t.sphere=!0),t.datumCode="wgs84"),"_ferro"===t.datumCode.slice(-6)&&(t.datumCode=t.datumCode.slice(0,-6)),"_jakarta"===t.datumCode.slice(-8)&&(t.datumCode=t.datumCode.slice(0,-8)),~t.datumCode.indexOf("belge")&&(t.datumCode="rnb72"),s.DATUM&&s.DATUM.SPHEROID&&(t.ellps=s.DATUM.SPHEROID.name.replace("_19","").replace(/[Cc]larke\_18/,"clrk"),"international"===t.ellps.toLowerCase().slice(0,13)&&(t.ellps="intl"),t.a=s.DATUM.SPHEROID.a,t.rf=parseFloat(s.DATUM.SPHEROID.rf,10)),s.DATUM&&s.DATUM.TOWGS84&&(t.datum_params=s.DATUM.TOWGS84),~t.datumCode.indexOf("osgb_1936")&&(t.datumCode="osgb36"),~t.datumCode.indexOf("osni_1952")&&(t.datumCode="osni52"),(~t.datumCode.indexOf("tm65")||~t.datumCode.indexOf("geodetic_datum_of_1965"))&&(t.datumCode="ire65"),"ch1903+"===t.datumCode&&(t.datumCode="ch1903"),~t.datumCode.indexOf("israel")&&(t.datumCode="isr93")),t.b&&!isFinite(t.b)&&(t.b=t.a),[["standard_parallel_1","Standard_Parallel_1"],["standard_parallel_2","Standard_Parallel_2"],["false_easting","False_Easting"],["false_northing","False_Northing"],["central_meridian","Central_Meridian"],["latitude_of_origin","Latitude_Of_Origin"],["latitude_of_origin","Central_Parallel"],["scale_factor","Scale_Factor"],["k0","scale_factor"],["latitude_of_center","Latitude_Of_Center"],["latitude_of_center","Latitude_of_center"],["lat0","latitude_of_center",I],["longitude_of_center","Longitude_Of_Center"],["longitude_of_center","Longitude_of_center"],["longc","longitude_of_center",I],["x0","false_easting",a],["y0","false_northing",a],["long0","central_meridian",I],["lat0","latitude_of_origin",I],["lat0","standard_parallel_1",I],["lat1","standard_parallel_1",I],["lat2","standard_parallel_2",I],["azimuth","Azimuth"],["alpha","azimuth",I],["srsCode","name"]].forEach((function(e){return function(t,e){var i=e[0],o=e[1];!(i in t)&&o in t&&(t[i]=t[o],3===e.length&&(t[i]=e[2](t[i])))}(t,e)})),t.long0||!t.longc||"Albers_Conic_Equal_Area"!==t.projName&&"Lambert_Azimuthal_Equal_Area"!==t.projName||(t.long0=t.longc),t.lat_ts||!t.lat1||"Stereographic_South_Pole"!==t.projName&&"Polar Stereographic (variant B)"!==t.projName||(t.lat0=I(t.lat1>0?90:-90),t.lat_ts=t.lat1)}(n),n};function A(t){var e=this;if(2===arguments.length){var i=arguments[1];"string"==typeof i?"+"===i.charAt(0)?A[t]=y(arguments[1]):A[t]=G(arguments[1]):A[t]=i}else if(1===arguments.length){if(Array.isArray(t))return t.map((function(t){Array.isArray(t)?A.apply(e,t):A(t)}));if("string"==typeof t){if(t in A)return A[t]}else"EPSG"in t?A["EPSG:"+t.EPSG]=t:"ESRI"in t?A["ESRI:"+t.ESRI]=t:"IAU2000"in t?A["IAU2000:"+t.IAU2000]=t:console.log(t);return}}!function(t){t("EPSG:4326","+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"),t("EPSG:4269","+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"),t("EPSG:3857","+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"),t.WGS84=t["EPSG:4326"],t["EPSG:3785"]=t["EPSG:3857"],t.GOOGLE=t["EPSG:3857"],t["EPSG:900913"]=t["EPSG:3857"],t["EPSG:102113"]=t["EPSG:3857"]}(A);var T=["PROJECTEDCRS","PROJCRS","GEOGCS","GEOCCS","PROJCS","LOCAL_CS","GEODCRS","GEODETICCRS","GEODETICDATUM","ENGCRS","ENGINEERINGCRS"],k=["3857","900913","3785","102113"];function D(t){if(!function(t){return"string"==typeof t}(t))return t;if(function(t){return t in A}(t))return A[t];if(function(t){return T.some((function(e){return t.indexOf(e)>-1}))}(t)){var e=G(t);if(function(t){var e=v(t,"authority");if(e){var i=v(e,"epsg");return i&&k.indexOf(i)>-1}}(e))return A["EPSG:3857"];var i=function(t){var e=v(t,"extension");if(e)return v(e,"proj4")}(e);return i?y(i):e}return function(t){return"+"===t[0]}(t)?y(t):void 0}var O=function(t,e){var i,o;if(t=t||{},!e)return t;for(o in e)void 0!==(i=e[o])&&(t[o]=i);return t},N=function(t,e,i){var o=t*e;return i/Math.sqrt(1-o*o)},U=function(t){return t<0?-1:1},j=function(t){return Math.abs(t)<=m?t:t-U(t)*p},F=function(t,e,i){var o=t*i,n=.5*t;return o=Math.pow((1-o)/(1+o),n),Math.tan(.5*(s-e))/o},B=function(t,e){for(var i,o,n=.5*t,a=s-2*Math.atan(e),r=0;r<=15;r++)if(i=t*Math.sin(a),a+=o=s-2*Math.atan(e*Math.pow((1-i)/(1+i),n))-a,Math.abs(o)<=1e-10)return a;return-9999};function z(t){return t}var q=[{init:function(){var t=this.b/this.a;this.es=1-t*t,"x0"in this||(this.x0=0),"y0"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.sphere?this.k0=Math.cos(this.lat_ts):this.k0=N(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k?this.k0=this.k:this.k0=1)},forward:function(t){var e,i,o=t.x,n=t.y;if(n*h>90&&n*h<-90&&o*h>180&&o*h<-180)return null;if(Math.abs(Math.abs(n)-s)<=c)return null;if(this.sphere)e=this.x0+this.a*this.k0*j(o-this.long0),i=this.y0+this.a*this.k0*Math.log(Math.tan(d+.5*n));else{var a=Math.sin(n),r=F(this.e,n,a);e=this.x0+this.a*this.k0*j(o-this.long0),i=this.y0-this.a*this.k0*Math.log(r)}return t.x=e,t.y=i,t},inverse:function(t){var e,i,o=t.x-this.x0,n=t.y-this.y0;if(this.sphere)i=s-2*Math.atan(Math.exp(-n/(this.a*this.k0)));else{var a=Math.exp(-n/(this.a*this.k0));if(-9999===(i=B(this.e,a)))return null}return e=j(this.long0+o/(this.a*this.k0)),t.x=e,t.y=i,t},names:["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{init:function(){},forward:z,inverse:z,names:["longlat","identity"]}],H={},W=[];function V(t,e){var i=W.length;return t.names?(W[i]=t,t.names.forEach((function(t){H[t.toLowerCase()]=i})),this):(console.log(e),!0)}var Y={start:function(){q.forEach(V)},add:V,get:function(t){if(!t)return!1;var e=t.toLowerCase();return void 0!==H[e]&&W[H[e]]?W[H[e]]:void 0}},X={MERIT:{a:6378137,rf:298.257,ellipseName:"MERIT 1983"},SGS85:{a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},GRS80:{a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},IAU76:{a:6378140,rf:298.257,ellipseName:"IAU 1976"},airy:{a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},APL4:{a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},NWL9D:{a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},mod_airy:{a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},andrae:{a:6377104.43,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},aust_SA:{a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},GRS67:{a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},bessel:{a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},bess_nam:{a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},clrk66:{a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},clrk80:{a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},clrk58:{a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},CPM:{a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},delmbr:{a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},engelis:{a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},evrst30:{a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},evrst48:{a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},evrst56:{a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},evrst69:{a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},evrstSS:{a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},fschr60:{a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},fschr60m:{a:6378155,rf:298.3,ellipseName:"Fischer 1960"},fschr68:{a:6378150,rf:298.3,ellipseName:"Fischer 1968"},helmert:{a:6378200,rf:298.3,ellipseName:"Helmert 1906"},hough:{a:6378270,rf:297,ellipseName:"Hough"},intl:{a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},kaula:{a:6378163,rf:298.24,ellipseName:"Kaula 1961"},lerch:{a:6378139,rf:298.257,ellipseName:"Lerch 1979"},mprts:{a:6397300,rf:191,ellipseName:"Maupertius 1738"},new_intl:{a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},plessis:{a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},krass:{a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},SEasia:{a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},walbeck:{a:6376896,b:6355834.8467,ellipseName:"Walbeck"},WGS60:{a:6378165,rf:298.3,ellipseName:"WGS 60"},WGS66:{a:6378145,rf:298.25,ellipseName:"WGS 66"},WGS7:{a:6378135,rf:298.26,ellipseName:"WGS 72"}},K=X.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"};X.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"};var Z={};function Q(s,u){if(!(this instanceof Q))return new Q(s);u=u||function(t){if(t)throw t};var h=D(s);if("object"==typeof h){var d=Q.projections.get(h.projName);if(d){if(h.datumCode&&"none"!==h.datumCode){var p=v(Z,h.datumCode);p&&(h.datum_params=p.towgs84?p.towgs84.split(","):null,h.ellps=p.ellipse,h.datumName=p.datumName?p.datumName:h.datumCode)}h.k0=h.k0||1,h.axis=h.axis||"enu",h.ellps=h.ellps||"wgs84";var m,f,_,g,y,E,P,w=function(t,e,i,o,n){if(!t){var s=v(X,o);s||(s=K),t=s.a,e=s.b,i=s.rf}return i&&!e&&(e=(1-1/i)*t),(0===i||Math.abs(t-e)<c)&&(n=!0,e=t),{a:t,b:e,rf:i,sphere:n}}(h.a,h.b,h.rf,h.ellps,h.sphere),C=(m=w.a,f=w.b,w.rf,_=h.R_A,E=((g=m*m)-(y=f*f))/g,P=0,_?(g=(m*=1-E*(a+E*(r+E*l)))*m,E=0):P=Math.sqrt(E),{es:E,e:P,ep2:(g-y)/y}),M=h.datum||function(s,a,r,l,c,u){var h={};return h.datum_type=void 0===s||"none"===s?o:i,a&&(h.datum_params=a.map(parseFloat),0===h.datum_params[0]&&0===h.datum_params[1]&&0===h.datum_params[2]||(h.datum_type=t),h.datum_params.length>3&&(0===h.datum_params[3]&&0===h.datum_params[4]&&0===h.datum_params[5]&&0===h.datum_params[6]||(h.datum_type=e,h.datum_params[3]*=n,h.datum_params[4]*=n,h.datum_params[5]*=n,h.datum_params[6]=h.datum_params[6]/1e6+1))),h.a=r,h.b=l,h.es=c,h.ep2=u,h}(h.datumCode,h.datum_params,w.a,w.b,C.es,C.ep2);O(this,h),O(this,d),this.a=w.a,this.b=w.b,this.rf=w.rf,this.sphere=w.sphere,this.es=C.es,this.e=C.e,this.ep2=C.ep2,this.datum=M,this.init(),u(null,this)}else u(s)}else u(s)}function J(t,e,i){var o,n,a,r,l=t.x,c=t.y,u=t.z?t.z:0;if(c<-s&&c>-1.001*s)c=-s;else if(c>s&&c<1.001*s)c=s;else{if(c<-s)return{x:-1/0,y:-1/0,z:t.z};if(c>s)return{x:1/0,y:1/0,z:t.z}}return l>Math.PI&&(l-=2*Math.PI),n=Math.sin(c),r=Math.cos(c),a=n*n,{x:((o=i/Math.sqrt(1-e*a))+u)*r*Math.cos(l),y:(o+u)*r*Math.sin(l),z:(o*(1-e)+u)*n}}function $(t,e,i,o){var n,s,a,r,l,c,u,h,d,p,m,f,_,g,v,y=t.x,E=t.y,P=t.z?t.z:0;if(n=Math.sqrt(y*y+E*E),s=Math.sqrt(y*y+E*E+P*P),n/i<1e-12){if(g=0,s/i<1e-12)return v=-o,{x:t.x,y:t.y,z:t.z}}else g=Math.atan2(E,y);a=P/s,h=(r=n/s)*(1-e)*(l=1/Math.sqrt(1-e*(2-e)*r*r)),d=a*l,_=0;do{_++,c=e*(u=i/Math.sqrt(1-e*d*d))/(u+(v=n*h+P*d-u*(1-e*d*d))),f=(m=a*(l=1/Math.sqrt(1-c*(2-c)*r*r)))*h-(p=r*(1-c)*l)*d,h=p,d=m}while(f*f>1e-24&&_<30);return{x:g,y:Math.atan(m/Math.abs(p)),z:v}}function tt(i){return i===t||i===e}Z.wgs84={towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},Z.ch1903={towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},Z.ggrs87={towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},Z.nad83={towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},Z.nad27={nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},Z.potsdam={towgs84:"606.0,23.0,413.0",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},Z.carthage={towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},Z.hermannskogel={towgs84:"653.0,-212.0,449.0",ellipse:"bessel",datumName:"Hermannskogel"},Z.osni52={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"airy",datumName:"Irish National"},Z.ire65={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},Z.rassadiran={towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},Z.nzgd49={towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},Z.osgb36={towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},Z.s_jtsk={towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},Z.beduaram={towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},Z.gunung_segara={towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},Z.rnb72={towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"},Q.projections=Y,Q.projections.start();var et=function(i,n,s){return function(i,o){return i.datum_type===o.datum_type&&!(i.a!==o.a||Math.abs(i.es-o.es)>5e-11)&&(i.datum_type===t?i.datum_params[0]===o.datum_params[0]&&i.datum_params[1]===o.datum_params[1]&&i.datum_params[2]===o.datum_params[2]:i.datum_type!==e||i.datum_params[0]===o.datum_params[0]&&i.datum_params[1]===o.datum_params[1]&&i.datum_params[2]===o.datum_params[2]&&i.datum_params[3]===o.datum_params[3]&&i.datum_params[4]===o.datum_params[4]&&i.datum_params[5]===o.datum_params[5]&&i.datum_params[6]===o.datum_params[6])}(i,n)?s:i.datum_type===o||n.datum_type===o?s:i.es!==n.es||i.a!==n.a||tt(i.datum_type)||tt(n.datum_type)?(s=J(s,i.es,i.a),tt(i.datum_type)&&(s=function(i,o,n){if(o===t)return{x:i.x+n[0],y:i.y+n[1],z:i.z+n[2]};if(o===e){var s=n[0],a=n[1],r=n[2],l=n[3],c=n[4],u=n[5],h=n[6];return{x:h*(i.x-u*i.y+c*i.z)+s,y:h*(u*i.x+i.y-l*i.z)+a,z:h*(-c*i.x+l*i.y+i.z)+r}}}(s,i.datum_type,i.datum_params)),tt(n.datum_type)&&(s=function(i,o,n){if(o===t)return{x:i.x-n[0],y:i.y-n[1],z:i.z-n[2]};if(o===e){var s=n[0],a=n[1],r=n[2],l=n[3],c=n[4],u=n[5],h=n[6],d=(i.x-s)/h,p=(i.y-a)/h,m=(i.z-r)/h;return{x:d+u*p-c*m,y:-u*d+p+l*m,z:c*d-l*p+m}}}(s,n.datum_type,n.datum_params)),$(s,n.es,n.a,n.b)):s},it=function(t,e,i){var o,n,s,a=i.x,r=i.y,l=i.z||0,c={};for(s=0;s<3;s++)if(!e||2!==s||void 0!==i.z)switch(0===s?(o=a,n=-1!=="ew".indexOf(t.axis[s])?"x":"y"):1===s?(o=r,n=-1!=="ns".indexOf(t.axis[s])?"y":"x"):(o=l,n="z"),t.axis[s]){case"e":c[n]=o;break;case"w":c[n]=-o;break;case"n":c[n]=o;break;case"s":c[n]=-o;break;case"u":void 0!==i[n]&&(c.z=o);break;case"d":void 0!==i[n]&&(c.z=-o);break;default:return null}return c},ot=function(t){var e={x:t[0],y:t[1]};return t.length>2&&(e.z=t[2]),t.length>3&&(e.m=t[3]),e},nt=function(t){st(t.x),st(t.y)};function st(t){if("function"==typeof Number.isFinite){if(Number.isFinite(t))return;throw new TypeError("coordinates must be finite numbers")}if("number"!=typeof t||t!=t||!isFinite(t))throw new TypeError("coordinates must be finite numbers")}function at(i,o,n){var s;if(Array.isArray(n)&&(n=ot(n)),nt(n),i.datum&&o.datum&&function(i,o){return(i.datum.datum_type===t||i.datum.datum_type===e)&&"WGS84"!==o.datumCode||(o.datum.datum_type===t||o.datum.datum_type===e)&&"WGS84"!==i.datumCode}(i,o)&&(n=at(i,s=new Q("WGS84"),n),i=s),"enu"!==i.axis&&(n=it(i,!1,n)),"longlat"===i.projName)n={x:n.x*u,y:n.y*u,z:n.z||0};else if(i.to_meter&&(n={x:n.x*i.to_meter,y:n.y*i.to_meter,z:n.z||0}),!(n=i.inverse(n)))return;return i.from_greenwich&&(n.x+=i.from_greenwich),n=et(i.datum,o.datum,n),o.from_greenwich&&(n={x:n.x-o.from_greenwich,y:n.y,z:n.z||0}),"longlat"===o.projName?n={x:n.x*h,y:n.y*h,z:n.z||0}:(n=o.forward(n),o.to_meter&&(n={x:n.x/o.to_meter,y:n.y/o.to_meter,z:n.z||0})),"enu"!==o.axis?it(o,!0,n):n}var rt=Q("WGS84");function lt(t,e,i){var o,n,s;return Array.isArray(i)?(o=at(t,e,i)||{x:NaN,y:NaN},i.length>2?void 0!==t.name&&"geocent"===t.name||void 0!==e.name&&"geocent"===e.name?"number"==typeof o.z?[o.x,o.y,o.z].concat(i.splice(3)):[o.x,o.y,i[2]].concat(i.splice(3)):[o.x,o.y].concat(i.splice(2)):[o.x,o.y]):(n=at(t,e,i),2===(s=Object.keys(i)).length?n:(s.forEach((function(o){if(void 0!==t.name&&"geocent"===t.name||void 0!==e.name&&"geocent"===e.name){if("x"===o||"y"===o||"z"===o)return}else if("x"===o||"y"===o)return;n[o]=i[o]})),n))}function ct(t){return t instanceof Q?t:t.oProj?t.oProj:Q(t)}function ut(t,e,i){t=ct(t);var o,n=!1;return void 0===e?(e=t,t=rt,n=!0):(void 0!==e.x||Array.isArray(e))&&(i=e,e=t,t=rt,n=!0),e=ct(e),i?lt(t,e,i):(o={forward:function(i){return lt(t,e,i)},inverse:function(i){return lt(e,t,i)}},n&&(o.oProj=e),o)}var ht=6,dt="AJSAJS",pt="AFAFAF",mt=65,ft=73,_t=79,gt=86,vt=90,yt={forward:Et,inverse:function(t){var e=Mt(Lt(t.toUpperCase()));return e.lat&&e.lon?[e.lon,e.lat,e.lon,e.lat]:[e.left,e.bottom,e.right,e.top]},toPoint:Pt};function Et(t,e){return e=e||5,function(t,e){var i,o,n,s,a,r,l,c,u,h,d,p,m,f,_="00000"+t.easting,g="00000"+t.northing;return t.zoneNumber+t.zoneLetter+(u=t.easting,h=t.northing,d=t.zoneNumber,p=St(d),m=Math.floor(u/1e5),f=Math.floor(h/1e5)%20,i=m,o=f,n=p-1,s=dt.charCodeAt(n),a=pt.charCodeAt(n),c=!1,(r=s+i-1)>vt&&(r=r-vt+mt-1,c=!0),(r===ft||s<ft&&r>ft||(r>ft||s<ft)&&c)&&r++,(r===_t||s<_t&&r>_t||(r>_t||s<_t)&&c)&&++r===ft&&r++,r>vt&&(r=r-vt+mt-1),(l=a+o)>gt?(l=l-gt+mt-1,c=!0):c=!1,(l===ft||a<ft&&l>ft||(l>ft||a<ft)&&c)&&l++,(l===_t||a<_t&&l>_t||(l>_t||a<_t)&&c)&&++l===ft&&l++,l>gt&&(l=l-gt+mt-1),String.fromCharCode(r)+String.fromCharCode(l))+_.substr(_.length-5,e)+g.substr(g.length-5,e)}(function(t){var e,i,o,n,s,a,r,l=t.lat,c=t.lon,u=6378137,h=wt(l),d=wt(c);r=Math.floor((c+180)/6)+1,180===c&&(r=60),l>=56&&l<64&&c>=3&&c<12&&(r=32),l>=72&&l<84&&(c>=0&&c<9?r=31:c>=9&&c<21?r=33:c>=21&&c<33?r=35:c>=33&&c<42&&(r=37)),a=wt(6*(r-1)-180+3),e=u/Math.sqrt(1-.00669438*Math.sin(h)*Math.sin(h)),i=Math.tan(h)*Math.tan(h),o=.006739496752268451*Math.cos(h)*Math.cos(h),n=Math.cos(h)*(d-a),s=u*(.9983242984503243*h-.002514607064228144*Math.sin(2*h)+2639046602129982e-21*Math.sin(4*h)-3.418046101696858e-9*Math.sin(6*h));var p,m,f=.9996*e*(n+(1-i+o)*n*n*n/6+(5-18*i+i*i+72*o-.39089081163157013)*n*n*n*n*n/120)+5e5,_=.9996*(s+e*Math.tan(h)*(n*n/2+(5-i+9*o+4*o*o)*n*n*n*n/24+(61-58*i+i*i+600*o-2.2240339282485886)*n*n*n*n*n*n/720));return l<0&&(_+=1e7),{northing:Math.round(_),easting:Math.round(f),zoneNumber:r,zoneLetter:(p=l,m="Z",84>=p&&p>=72?m="X":72>p&&p>=64?m="W":64>p&&p>=56?m="V":56>p&&p>=48?m="U":48>p&&p>=40?m="T":40>p&&p>=32?m="S":32>p&&p>=24?m="R":24>p&&p>=16?m="Q":16>p&&p>=8?m="P":8>p&&p>=0?m="N":0>p&&p>=-8?m="M":-8>p&&p>=-16?m="L":-16>p&&p>=-24?m="K":-24>p&&p>=-32?m="J":-32>p&&p>=-40?m="H":-40>p&&p>=-48?m="G":-48>p&&p>=-56?m="F":-56>p&&p>=-64?m="E":-64>p&&p>=-72?m="D":-72>p&&p>=-80&&(m="C"),m)}}({lat:t[1],lon:t[0]}),e)}function Pt(t){var e=Mt(Lt(t.toUpperCase()));return e.lat&&e.lon?[e.lon,e.lat]:[(e.left+e.right)/2,(e.top+e.bottom)/2]}function wt(t){return t*(Math.PI/180)}function Ct(t){return t/Math.PI*180}function Mt(t){var e=t.northing,i=t.easting,o=t.zoneLetter,n=t.zoneNumber;if(n<0||n>60)return null;var s,a,r,l,c,u,h,d,p=6378137,m=(1-Math.sqrt(.99330562))/(1+Math.sqrt(.99330562)),f=i-5e5,_=e;o<"N"&&(_-=1e7),u=6*(n-1)-180+3,d=(h=_/.9996/6367449.145945056)+(3*m/2-27*m*m*m/32)*Math.sin(2*h)+(21*m*m/16-55*m*m*m*m/32)*Math.sin(4*h)+151*m*m*m/96*Math.sin(6*h),s=p/Math.sqrt(1-.00669438*Math.sin(d)*Math.sin(d)),a=Math.tan(d)*Math.tan(d),r=.006739496752268451*Math.cos(d)*Math.cos(d),l=.99330562*p/Math.pow(1-.00669438*Math.sin(d)*Math.sin(d),1.5),c=f/(.9996*s);var g=d-s*Math.tan(d)/l*(c*c/2-(5+3*a+10*r-4*r*r-.06065547077041606)*c*c*c*c/24+(61+90*a+298*r+45*a*a-1.6983531815716497-3*r*r)*c*c*c*c*c*c/720);g=Ct(g);var v,y=(c-(1+2*a+r)*c*c*c/6+(5-2*r+28*a-3*r*r+.05391597401814761+24*a*a)*c*c*c*c*c/120)/Math.cos(d);if(y=u+Ct(y),t.accuracy){var E=Mt({northing:t.northing+t.accuracy,easting:t.easting+t.accuracy,zoneLetter:t.zoneLetter,zoneNumber:t.zoneNumber});v={top:E.lat,right:E.lon,bottom:g,left:y}}else v={lat:g,lon:y};return v}function St(t){var e=t%ht;return 0===e&&(e=ht),e}function Lt(t){if(t&&0===t.length)throw"MGRSPoint coverting from nothing";for(var e,i=t.length,o=null,n="",s=0;!/[A-Z]/.test(e=t.charAt(s));){if(s>=2)throw"MGRSPoint bad conversion from: "+t;n+=e,s++}var a=parseInt(n,10);if(0===s||s+3>i)throw"MGRSPoint bad conversion from: "+t;var r=t.charAt(s++);if(r<="A"||"B"===r||"Y"===r||r>="Z"||"I"===r||"O"===r)throw"MGRSPoint zone letter "+r+" not handled: "+t;o=t.substring(s,s+=2);for(var l=St(a),c=function(t,e){for(var i=dt.charCodeAt(e-1),o=1e5,n=!1;i!==t.charCodeAt(0);){if(++i===ft&&i++,i===_t&&i++,i>vt){if(n)throw"Bad character: "+t;i=mt,n=!0}o+=1e5}return o}(o.charAt(0),l),u=function(t,e){if(t>"V")throw"MGRSPoint given invalid Northing "+t;for(var i=pt.charCodeAt(e-1),o=0,n=!1;i!==t.charCodeAt(0);){if(++i===ft&&i++,i===_t&&i++,i>gt){if(n)throw"Bad character: "+t;i=mt,n=!0}o+=1e5}return o}(o.charAt(1),l);u<bt(r);)u+=2e6;var h=i-s;if(h%2!=0)throw"MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters"+t;var d,p,m,f=h/2,_=0,g=0;return f>0&&(d=1e5/Math.pow(10,f),p=t.substring(s,s+f),_=parseFloat(p)*d,m=t.substring(s+f),g=parseFloat(m)*d),{easting:_+c,northing:g+u,zoneLetter:r,zoneNumber:a,accuracy:d}}function bt(t){var e;switch(t){case"C":e=11e5;break;case"D":e=2e6;break;case"E":e=28e5;break;case"F":e=37e5;break;case"G":e=46e5;break;case"H":e=55e5;break;case"J":e=64e5;break;case"K":e=73e5;break;case"L":e=82e5;break;case"M":e=91e5;break;case"N":e=0;break;case"P":e=8e5;break;case"Q":e=17e5;break;case"R":e=26e5;break;case"S":e=35e5;break;case"T":e=44e5;break;case"U":e=53e5;break;case"V":e=62e5;break;case"W":e=7e6;break;case"X":e=79e5;break;default:e=-1}if(e>=0)return e;throw"Invalid zone letter: "+t}function Rt(t,e,i){if(!(this instanceof Rt))return new Rt(t,e,i);if(Array.isArray(t))this.x=t[0],this.y=t[1],this.z=t[2]||0;else if("object"==typeof t)this.x=t.x,this.y=t.y,this.z=t.z||0;else if("string"==typeof t&&void 0===e){var o=t.split(",");this.x=parseFloat(o[0],10),this.y=parseFloat(o[1],10),this.z=parseFloat(o[2],10)||0}else this.x=t,this.y=e,this.z=i||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}Rt.fromMGRS=function(t){return new Rt(Pt(t))},Rt.prototype.toMGRS=function(t){return Et([this.x,this.y],t)};var xt=.01068115234375,It=function(t){var e=[];e[0]=1-t*(.25+t*(.046875+t*(.01953125+t*xt))),e[1]=t*(.75-t*(.046875+t*(.01953125+t*xt)));var i=t*t;return e[2]=i*(.46875-t*(.013020833333333334+.007120768229166667*t)),i*=t,e[3]=i*(.3645833333333333-.005696614583333333*t),e[4]=i*t*.3076171875,e},Gt=function(t,e,i,o){return i*=e,e*=e,o[0]*t-i*(o[1]+e*(o[2]+e*(o[3]+e*o[4])))},At=function(t,e,i){for(var o=1/(1-e),n=t,s=20;s;--s){var a=Math.sin(n),r=1-e*a*a;if(n-=r=(Gt(n,a,Math.cos(n),i)-t)*(r*Math.sqrt(r))*o,Math.abs(r)<c)return n}return n},Tt={init:function(){this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.es&&(this.en=It(this.es),this.ml0=Gt(this.lat0,Math.sin(this.lat0),Math.cos(this.lat0),this.en))},forward:function(t){var e,i,o,n=t.x,s=t.y,a=j(n-this.long0),r=Math.sin(s),l=Math.cos(s);if(this.es){var u=l*a,h=Math.pow(u,2),d=this.ep2*Math.pow(l,2),p=Math.pow(d,2),m=Math.abs(l)>c?Math.tan(s):0,f=Math.pow(m,2),_=Math.pow(f,2);e=1-this.es*Math.pow(r,2),u/=Math.sqrt(e);var g=Gt(s,r,l,this.en);i=this.a*(this.k0*u*(1+h/6*(1-f+d+h/20*(5-18*f+_+14*d-58*f*d+h/42*(61+179*_-_*f-479*f)))))+this.x0,o=this.a*(this.k0*(g-this.ml0+r*a*u/2*(1+h/12*(5-f+9*d+4*p+h/30*(61+_-58*f+270*d-330*f*d+h/56*(1385+543*_-_*f-3111*f))))))+this.y0}else{var v=l*Math.sin(a);if(Math.abs(Math.abs(v)-1)<c)return 93;if(i=.5*this.a*this.k0*Math.log((1+v)/(1-v))+this.x0,o=l*Math.cos(a)/Math.sqrt(1-Math.pow(v,2)),(v=Math.abs(o))>=1){if(v-1>c)return 93;o=0}else o=Math.acos(o);s<0&&(o=-o),o=this.a*this.k0*(o-this.lat0)+this.y0}return t.x=i,t.y=o,t},inverse:function(t){var e,i,o,n,a=(t.x-this.x0)*(1/this.a),r=(t.y-this.y0)*(1/this.a);if(this.es)if(e=this.ml0+r/this.k0,i=At(e,this.es,this.en),Math.abs(i)<s){var l=Math.sin(i),u=Math.cos(i),h=Math.abs(u)>c?Math.tan(i):0,d=this.ep2*Math.pow(u,2),p=Math.pow(d,2),m=Math.pow(h,2),f=Math.pow(m,2);e=1-this.es*Math.pow(l,2);var _=a*Math.sqrt(e)/this.k0,g=Math.pow(_,2);o=i-(e*=h)*g/(1-this.es)*.5*(1-g/12*(5+3*m-9*d*m+d-4*p-g/30*(61+90*m-252*d*m+45*f+46*d-g/56*(1385+3633*m+4095*f+1574*f*m)))),n=j(this.long0+_*(1-g/6*(1+2*m+d-g/20*(5+28*m+24*f+8*d*m+6*d-g/42*(61+662*m+1320*f+720*f*m))))/u)}else o=s*U(r),n=0;else{var v=Math.exp(a/this.k0),y=.5*(v-1/v),E=this.lat0+r/this.k0,P=Math.cos(E);e=Math.sqrt((1-Math.pow(P,2))/(1+Math.pow(y,2))),o=Math.asin(e),r<0&&(o=-o),n=0===y&&0===P?0:j(Math.atan2(y,P)+this.long0)}return t.x=n,t.y=o,t},names:["Transverse_Mercator","Transverse Mercator","tmerc"]},kt=function(t){var e=Math.exp(t);return e=(e-1/e)/2},Dt=function(t,e){t=Math.abs(t),e=Math.abs(e);var i=Math.max(t,e),o=Math.min(t,e)/(i||1);return i*Math.sqrt(1+Math.pow(o,2))},Ot=function(t){var e=Math.abs(t);return e=function(t){var e=1+t,i=e-1;return 0===i?t:t*Math.log(e)/i}(e*(1+e/(Dt(1,e)+1))),t<0?-e:e},Nt=function(t,e){for(var i,o=2*Math.cos(2*e),n=t.length-1,s=t[n],a=0;--n>=0;)i=o*s-a+t[n],a=s,s=i;return e+i*Math.sin(2*e)},Ut=function(t,e){for(var i,o=2*Math.cos(e),n=t.length-1,s=t[n],a=0;--n>=0;)i=o*s-a+t[n],a=s,s=i;return Math.sin(e)*i},jt=function(t,e,i){for(var o,n,s=Math.sin(e),a=Math.cos(e),r=kt(i),l=function(t){var e=Math.exp(t);return e=(e+1/e)/2}(i),c=2*a*l,u=-2*s*r,h=t.length-1,d=t[h],p=0,m=0,f=0;--h>=0;)o=m,n=p,d=c*(m=d)-o-u*(p=f)+t[h],f=u*m-n+c*p;return[(c=s*l)*d-(u=a*r)*f,c*f+u*d]},Ft={init:function(){if(void 0===this.es||this.es<=0)throw new Error("incorrect elliptical usage");this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.cgb=[],this.cbg=[],this.utg=[],this.gtu=[];var t=this.es/(1+Math.sqrt(1-this.es)),e=t/(2-t),i=e;this.cgb[0]=e*(2+e*(-2/3+e*(e*(116/45+e*(26/45+e*(-2854/675)))-2))),this.cbg[0]=e*(e*(2/3+e*(4/3+e*(-82/45+e*(32/45+e*(4642/4725)))))-2),i*=e,this.cgb[1]=i*(7/3+e*(e*(-227/45+e*(2704/315+e*(2323/945)))-1.6)),this.cbg[1]=i*(5/3+e*(-16/15+e*(-13/9+e*(904/315+e*(-1522/945))))),i*=e,this.cgb[2]=i*(56/15+e*(-136/35+e*(-1262/105+e*(73814/2835)))),this.cbg[2]=i*(-26/15+e*(34/21+e*(1.6+e*(-12686/2835)))),i*=e,this.cgb[3]=i*(4279/630+e*(-332/35+e*(-399572/14175))),this.cbg[3]=i*(1237/630+e*(e*(-24832/14175)-2.4)),i*=e,this.cgb[4]=i*(4174/315+e*(-144838/6237)),this.cbg[4]=i*(-734/315+e*(109598/31185)),i*=e,this.cgb[5]=i*(601676/22275),this.cbg[5]=i*(444337/155925),i=Math.pow(e,2),this.Qn=this.k0/(1+e)*(1+i*(.25+i*(1/64+i/256))),this.utg[0]=e*(e*(2/3+e*(-37/96+e*(1/360+e*(81/512+e*(-96199/604800)))))-.5),this.gtu[0]=e*(.5+e*(-2/3+e*(5/16+e*(41/180+e*(-127/288+e*(7891/37800)))))),this.utg[1]=i*(-1/48+e*(-1/15+e*(437/1440+e*(-46/105+e*(1118711/3870720))))),this.gtu[1]=i*(13/48+e*(e*(557/1440+e*(281/630+e*(-1983433/1935360)))-.6)),i*=e,this.utg[2]=i*(-17/480+e*(37/840+e*(209/4480+e*(-5569/90720)))),this.gtu[2]=i*(61/240+e*(-103/140+e*(15061/26880+e*(167603/181440)))),i*=e,this.utg[3]=i*(-4397/161280+e*(11/504+e*(830251/7257600))),this.gtu[3]=i*(49561/161280+e*(-179/168+e*(6601661/7257600))),i*=e,this.utg[4]=i*(-4583/161280+e*(108847/3991680)),this.gtu[4]=i*(34729/80640+e*(-3418889/1995840)),i*=e,this.utg[5]=-.03233083094085698*i,this.gtu[5]=.6650675310896665*i;var o=Nt(this.cbg,this.lat0);this.Zb=-this.Qn*(o+Ut(this.gtu,2*o))},forward:function(t){var e=j(t.x-this.long0),i=t.y;i=Nt(this.cbg,i);var o=Math.sin(i),n=Math.cos(i),s=Math.sin(e),a=Math.cos(e);i=Math.atan2(o,a*n),e=Math.atan2(s*n,Dt(o,n*a)),e=Ot(Math.tan(e));var r,l,c=jt(this.gtu,2*i,2*e);return i+=c[0],e+=c[1],Math.abs(e)<=2.623395162778?(r=this.a*(this.Qn*e)+this.x0,l=this.a*(this.Qn*i+this.Zb)+this.y0):(r=1/0,l=1/0),t.x=r,t.y=l,t},inverse:function(t){var e,i,o=(t.x-this.x0)*(1/this.a),n=(t.y-this.y0)*(1/this.a);if(n=(n-this.Zb)/this.Qn,o/=this.Qn,Math.abs(o)<=2.623395162778){var s=jt(this.utg,2*n,2*o);n+=s[0],o+=s[1],o=Math.atan(kt(o));var a=Math.sin(n),r=Math.cos(n),l=Math.sin(o),c=Math.cos(o);n=Math.atan2(a*c,Dt(l,c*r)),o=Math.atan2(l,c*r),e=j(o+this.long0),i=Nt(this.cgb,n)}else e=1/0,i=1/0;return t.x=e,t.y=i,t},names:["Extended_Transverse_Mercator","Extended Transverse Mercator","etmerc"]},Bt=function(t,e){if(void 0===t){if((t=Math.floor(30*(j(e)+Math.PI)/Math.PI)+1)<0)return 0;if(t>60)return 60}return t},zt={init:function(){var t=Bt(this.zone,this.long0);if(void 0===t)throw new Error("unknown utm zone");this.lat0=0,this.long0=(6*Math.abs(t)-183)*u,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,Ft.init.apply(this),this.forward=Ft.forward,this.inverse=Ft.inverse},names:["Universal Transverse Mercator System","utm"],dependsOn:"etmerc"},qt=function(t,e){return Math.pow((1-t)/(1+t),e)},Ht=20,Wt={init:function(){var t=Math.sin(this.lat0),e=Math.cos(this.lat0);e*=e,this.rc=Math.sqrt(1-this.es)/(1-this.es*t*t),this.C=Math.sqrt(1+this.es*e*e/(1-this.es)),this.phic0=Math.asin(t/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+d)/(Math.pow(Math.tan(.5*this.lat0+d),this.C)*qt(this.e*t,this.ratexp))},forward:function(t){var e=t.x,i=t.y;return t.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*i+d),this.C)*qt(this.e*Math.sin(i),this.ratexp))-s,t.x=this.C*e,t},inverse:function(t){for(var e=t.x/this.C,i=t.y,o=Math.pow(Math.tan(.5*i+d)/this.K,1/this.C),n=Ht;n>0&&(i=2*Math.atan(o*qt(this.e*Math.sin(t.y),-.5*this.e))-s,!(Math.abs(i-t.y)<1e-14));--n)t.y=i;return n?(t.x=e,t.y=i,t):null},names:["gauss"]},Vt={init:function(){Wt.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},forward:function(t){var e,i,o,n;return t.x=j(t.x-this.long0),Wt.forward.apply(this,[t]),e=Math.sin(t.y),i=Math.cos(t.y),o=Math.cos(t.x),n=this.k0*this.R2/(1+this.sinc0*e+this.cosc0*i*o),t.x=n*i*Math.sin(t.x),t.y=n*(this.cosc0*e-this.sinc0*i*o),t.x=this.a*t.x+this.x0,t.y=this.a*t.y+this.y0,t},inverse:function(t){var e,i,o,n,s;if(t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,t.x/=this.k0,t.y/=this.k0,s=Math.sqrt(t.x*t.x+t.y*t.y)){var a=2*Math.atan2(s,this.R2);e=Math.sin(a),i=Math.cos(a),n=Math.asin(i*this.sinc0+t.y*e*this.cosc0/s),o=Math.atan2(t.x*e,s*this.cosc0*i-t.y*this.sinc0*e)}else n=this.phic0,o=0;return t.x=o,t.y=n,Wt.inverse.apply(this,[t]),t.x=j(t.x+this.long0),t},names:["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative","Double_Stereographic"]},Yt={init:function(){this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=c&&(this.k0=.5*(1+U(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=c&&(this.lat0>0?this.con=1:this.con=-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=c&&(this.k0=.5*this.cons*N(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/F(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=N(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-s,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},forward:function(t){var e,i,o,n,a,r,l=t.x,u=t.y,h=Math.sin(u),d=Math.cos(u),p=j(l-this.long0);return Math.abs(Math.abs(l-this.long0)-Math.PI)<=c&&Math.abs(u+this.lat0)<=c?(t.x=NaN,t.y=NaN,t):this.sphere?(e=2*this.k0/(1+this.sinlat0*h+this.coslat0*d*Math.cos(p)),t.x=this.a*e*d*Math.sin(p)+this.x0,t.y=this.a*e*(this.coslat0*h-this.sinlat0*d*Math.cos(p))+this.y0,t):(i=2*Math.atan(this.ssfn_(u,h,this.e))-s,n=Math.cos(i),o=Math.sin(i),Math.abs(this.coslat0)<=c?(a=F(this.e,u*this.con,this.con*h),r=2*this.a*this.k0*a/this.cons,t.x=this.x0+r*Math.sin(l-this.long0),t.y=this.y0-this.con*r*Math.cos(l-this.long0),t):(Math.abs(this.sinlat0)<c?(e=2*this.a*this.k0/(1+n*Math.cos(p)),t.y=e*o):(e=2*this.a*this.k0*this.ms1/(this.cosX0*(1+this.sinX0*o+this.cosX0*n*Math.cos(p))),t.y=e*(this.cosX0*o-this.sinX0*n*Math.cos(p))+this.y0),t.x=e*n*Math.sin(p)+this.x0,t))},inverse:function(t){var e,i,o,n,a;t.x-=this.x0,t.y-=this.y0;var r=Math.sqrt(t.x*t.x+t.y*t.y);if(this.sphere){var l=2*Math.atan(r/(2*this.a*this.k0));return e=this.long0,i=this.lat0,r<=c?(t.x=e,t.y=i,t):(i=Math.asin(Math.cos(l)*this.sinlat0+t.y*Math.sin(l)*this.coslat0/r),e=Math.abs(this.coslat0)<c?this.lat0>0?j(this.long0+Math.atan2(t.x,-1*t.y)):j(this.long0+Math.atan2(t.x,t.y)):j(this.long0+Math.atan2(t.x*Math.sin(l),r*this.coslat0*Math.cos(l)-t.y*this.sinlat0*Math.sin(l))),t.x=e,t.y=i,t)}if(Math.abs(this.coslat0)<=c){if(r<=c)return i=this.lat0,e=this.long0,t.x=e,t.y=i,t;t.x*=this.con,t.y*=this.con,o=r*this.cons/(2*this.a*this.k0),i=this.con*B(this.e,o),e=this.con*j(this.con*this.long0+Math.atan2(t.x,-1*t.y))}else n=2*Math.atan(r*this.cosX0/(2*this.a*this.k0*this.ms1)),e=this.long0,r<=c?a=this.X0:(a=Math.asin(Math.cos(n)*this.sinX0+t.y*Math.sin(n)*this.cosX0/r),e=j(this.long0+Math.atan2(t.x*Math.sin(n),r*this.cosX0*Math.cos(n)-t.y*this.sinX0*Math.sin(n)))),i=-1*B(this.e,Math.tan(.5*(s+a)));return t.x=e,t.y=i,t},names:["stere","Stereographic_South_Pole","Polar Stereographic (variant B)"],ssfn_:function(t,e,i){return e*=i,Math.tan(.5*(s+t))*Math.pow((1-e)/(1+e),.5*i)}},Xt={init:function(){var t=this.lat0;this.lambda0=this.long0;var e=Math.sin(t),i=this.a,o=1/this.rf,n=2*o-Math.pow(o,2),s=this.e=Math.sqrt(n);this.R=this.k0*i*Math.sqrt(1-n)/(1-n*Math.pow(e,2)),this.alpha=Math.sqrt(1+n/(1-n)*Math.pow(Math.cos(t),4)),this.b0=Math.asin(e/this.alpha);var a=Math.log(Math.tan(Math.PI/4+this.b0/2)),r=Math.log(Math.tan(Math.PI/4+t/2)),l=Math.log((1+s*e)/(1-s*e));this.K=a-this.alpha*r+this.alpha*s/2*l},forward:function(t){var e=Math.log(Math.tan(Math.PI/4-t.y/2)),i=this.e/2*Math.log((1+this.e*Math.sin(t.y))/(1-this.e*Math.sin(t.y))),o=-this.alpha*(e+i)+this.K,n=2*(Math.atan(Math.exp(o))-Math.PI/4),s=this.alpha*(t.x-this.lambda0),a=Math.atan(Math.sin(s)/(Math.sin(this.b0)*Math.tan(n)+Math.cos(this.b0)*Math.cos(s))),r=Math.asin(Math.cos(this.b0)*Math.sin(n)-Math.sin(this.b0)*Math.cos(n)*Math.cos(s));return t.y=this.R/2*Math.log((1+Math.sin(r))/(1-Math.sin(r)))+this.y0,t.x=this.R*a+this.x0,t},inverse:function(t){for(var e=t.x-this.x0,i=t.y-this.y0,o=e/this.R,n=2*(Math.atan(Math.exp(i/this.R))-Math.PI/4),s=Math.asin(Math.cos(this.b0)*Math.sin(n)+Math.sin(this.b0)*Math.cos(n)*Math.cos(o)),a=Math.atan(Math.sin(o)/(Math.cos(this.b0)*Math.cos(o)-Math.sin(this.b0)*Math.tan(n))),r=this.lambda0+a/this.alpha,l=0,c=s,u=-1e3,h=0;Math.abs(c-u)>1e-7;){if(++h>20)return;l=1/this.alpha*(Math.log(Math.tan(Math.PI/4+s/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(c))/2)),u=c,c=2*Math.atan(Math.exp(l))-Math.PI/2}return t.x=r,t.y=c,t},names:["somerc"]},Kt={init:function(){this.no_off=this.no_off||!1,this.no_rot=this.no_rot||!1,isNaN(this.k0)&&(this.k0=1);var t=Math.sin(this.lat0),e=Math.cos(this.lat0),i=this.e*t;this.bl=Math.sqrt(1+this.es/(1-this.es)*Math.pow(e,4)),this.al=this.a*this.bl*this.k0*Math.sqrt(1-this.es)/(1-i*i);var o,n,s=F(this.e,this.lat0,t),a=this.bl/e*Math.sqrt((1-this.es)/(1-i*i));if(a*a<1&&(a=1),isNaN(this.longc)){var r=F(this.e,this.lat1,Math.sin(this.lat1)),l=F(this.e,this.lat2,Math.sin(this.lat2));this.lat0>=0?this.el=(a+Math.sqrt(a*a-1))*Math.pow(s,this.bl):this.el=(a-Math.sqrt(a*a-1))*Math.pow(s,this.bl);var c=Math.pow(r,this.bl),u=Math.pow(l,this.bl);n=.5*((o=this.el/c)-1/o);var h=(this.el*this.el-u*c)/(this.el*this.el+u*c),d=(u-c)/(u+c),p=j(this.long1-this.long2);this.long0=.5*(this.long1+this.long2)-Math.atan(h*Math.tan(.5*this.bl*p)/d)/this.bl,this.long0=j(this.long0);var m=j(this.long1-this.long0);this.gamma0=Math.atan(Math.sin(this.bl*m)/n),this.alpha=Math.asin(a*Math.sin(this.gamma0))}else o=this.lat0>=0?a+Math.sqrt(a*a-1):a-Math.sqrt(a*a-1),this.el=o*Math.pow(s,this.bl),n=.5*(o-1/o),this.gamma0=Math.asin(Math.sin(this.alpha)/a),this.long0=this.longc-Math.asin(n*Math.tan(this.gamma0))/this.bl;this.no_off?this.uc=0:this.lat0>=0?this.uc=this.al/this.bl*Math.atan2(Math.sqrt(a*a-1),Math.cos(this.alpha)):this.uc=-1*this.al/this.bl*Math.atan2(Math.sqrt(a*a-1),Math.cos(this.alpha))},forward:function(t){var e,i,o,n=t.x,a=t.y,r=j(n-this.long0);if(Math.abs(Math.abs(a)-s)<=c)o=a>0?-1:1,i=this.al/this.bl*Math.log(Math.tan(d+o*this.gamma0*.5)),e=-1*o*s*this.al/this.bl;else{var l=F(this.e,a,Math.sin(a)),u=this.el/Math.pow(l,this.bl),h=.5*(u-1/u),p=.5*(u+1/u),m=Math.sin(this.bl*r),f=(h*Math.sin(this.gamma0)-m*Math.cos(this.gamma0))/p;i=Math.abs(Math.abs(f)-1)<=c?Number.POSITIVE_INFINITY:.5*this.al*Math.log((1-f)/(1+f))/this.bl,e=Math.abs(Math.cos(this.bl*r))<=c?this.al*this.bl*r:this.al*Math.atan2(h*Math.cos(this.gamma0)+m*Math.sin(this.gamma0),Math.cos(this.bl*r))/this.bl}return this.no_rot?(t.x=this.x0+e,t.y=this.y0+i):(e-=this.uc,t.x=this.x0+i*Math.cos(this.alpha)+e*Math.sin(this.alpha),t.y=this.y0+e*Math.cos(this.alpha)-i*Math.sin(this.alpha)),t},inverse:function(t){var e,i;this.no_rot?(i=t.y-this.y0,e=t.x-this.x0):(i=(t.x-this.x0)*Math.cos(this.alpha)-(t.y-this.y0)*Math.sin(this.alpha),e=(t.y-this.y0)*Math.cos(this.alpha)+(t.x-this.x0)*Math.sin(this.alpha),e+=this.uc);var o=Math.exp(-1*this.bl*i/this.al),n=.5*(o-1/o),a=.5*(o+1/o),r=Math.sin(this.bl*e/this.al),l=(r*Math.cos(this.gamma0)+n*Math.sin(this.gamma0))/a,u=Math.pow(this.el/Math.sqrt((1+l)/(1-l)),1/this.bl);return Math.abs(l-1)<c?(t.x=this.long0,t.y=s):Math.abs(l+1)<c?(t.x=this.long0,t.y=-1*s):(t.y=B(this.e,u),t.x=j(this.long0-Math.atan2(n*Math.cos(this.gamma0)-r*Math.sin(this.gamma0),Math.cos(this.bl*e/this.al))/this.bl)),t},names:["Hotine_Oblique_Mercator","Hotine Oblique Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin","Hotine_Oblique_Mercator_Azimuth_Center","omerc"]},Zt={init:function(){if(this.lat2||(this.lat2=this.lat1),this.k0||(this.k0=1),this.x0=this.x0||0,this.y0=this.y0||0,!(Math.abs(this.lat1+this.lat2)<c)){var t=this.b/this.a;this.e=Math.sqrt(1-t*t);var e=Math.sin(this.lat1),i=Math.cos(this.lat1),o=N(this.e,e,i),n=F(this.e,this.lat1,e),s=Math.sin(this.lat2),a=Math.cos(this.lat2),r=N(this.e,s,a),l=F(this.e,this.lat2,s),u=F(this.e,this.lat0,Math.sin(this.lat0));Math.abs(this.lat1-this.lat2)>c?this.ns=Math.log(o/r)/Math.log(n/l):this.ns=e,isNaN(this.ns)&&(this.ns=e),this.f0=o/(this.ns*Math.pow(n,this.ns)),this.rh=this.a*this.f0*Math.pow(u,this.ns),this.title||(this.title="Lambert Conformal Conic")}},forward:function(t){var e=t.x,i=t.y;Math.abs(2*Math.abs(i)-Math.PI)<=c&&(i=U(i)*(s-2*c));var o,n,a=Math.abs(Math.abs(i)-s);if(a>c)o=F(this.e,i,Math.sin(i)),n=this.a*this.f0*Math.pow(o,this.ns);else{if((a=i*this.ns)<=0)return null;n=0}var r=this.ns*j(e-this.long0);return t.x=this.k0*(n*Math.sin(r))+this.x0,t.y=this.k0*(this.rh-n*Math.cos(r))+this.y0,t},inverse:function(t){var e,i,o,n,a,r=(t.x-this.x0)/this.k0,l=this.rh-(t.y-this.y0)/this.k0;this.ns>0?(e=Math.sqrt(r*r+l*l),i=1):(e=-Math.sqrt(r*r+l*l),i=-1);var c=0;if(0!==e&&(c=Math.atan2(i*r,i*l)),0!==e||this.ns>0){if(i=1/this.ns,o=Math.pow(e/(this.a*this.f0),i),-9999===(n=B(this.e,o)))return null}else n=-s;return a=j(c/this.ns+this.long0),t.x=a,t.y=n,t},names:["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_2SP","lcc"]},Qt={init:function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},forward:function(t){var e,i,o,n,s,a,r,l=t.x,c=t.y,u=j(l-this.long0);return e=Math.pow((1+this.e*Math.sin(c))/(1-this.e*Math.sin(c)),this.alfa*this.e/2),i=2*(Math.atan(this.k*Math.pow(Math.tan(c/2+this.s45),this.alfa)/e)-this.s45),o=-u*this.alfa,n=Math.asin(Math.cos(this.ad)*Math.sin(i)+Math.sin(this.ad)*Math.cos(i)*Math.cos(o)),s=Math.asin(Math.cos(i)*Math.sin(o)/Math.cos(n)),a=this.n*s,r=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(n/2+this.s45),this.n),t.y=r*Math.cos(a)/1,t.x=r*Math.sin(a)/1,this.czech||(t.y*=-1,t.x*=-1),t},inverse:function(t){var e,i,o,n,s,a,r,l=t.x;t.x=t.y,t.y=l,this.czech||(t.y*=-1,t.x*=-1),s=Math.sqrt(t.x*t.x+t.y*t.y),n=Math.atan2(t.y,t.x)/Math.sin(this.s0),o=2*(Math.atan(Math.pow(this.ro0/s,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),e=Math.asin(Math.cos(this.ad)*Math.sin(o)-Math.sin(this.ad)*Math.cos(o)*Math.cos(n)),i=Math.asin(Math.cos(o)*Math.sin(n)/Math.cos(e)),t.x=this.long0-i/this.alfa,a=e,r=0;var c=0;do{t.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(e/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(a))/(1-this.e*Math.sin(a)),this.e/2))-this.s45),Math.abs(a-t.y)<1e-10&&(r=1),a=t.y,c+=1}while(0===r&&c<15);return c>=15?null:t},names:["Krovak","krovak"]},Jt=function(t,e,i,o,n){return t*n-e*Math.sin(2*n)+i*Math.sin(4*n)-o*Math.sin(6*n)},$t=function(t){return 1-.25*t*(1+t/16*(3+1.25*t))},te=function(t){return.375*t*(1+.25*t*(1+.46875*t))},ee=function(t){return.05859375*t*t*(1+.75*t)},ie=function(t){return t*t*t*(35/3072)},oe=function(t,e,i){var o=e*i;return t/Math.sqrt(1-o*o)},ne=function(t){return Math.abs(t)<s?t:t-U(t)*Math.PI},se=function(t,e,i,o,n){var s,a;s=t/e;for(var r=0;r<15;r++)if(s+=a=(t-(e*s-i*Math.sin(2*s)+o*Math.sin(4*s)-n*Math.sin(6*s)))/(e-2*i*Math.cos(2*s)+4*o*Math.cos(4*s)-6*n*Math.cos(6*s)),Math.abs(a)<=1e-10)return s;return NaN},ae={init:function(){this.sphere||(this.e0=$t(this.es),this.e1=te(this.es),this.e2=ee(this.es),this.e3=ie(this.es),this.ml0=this.a*Jt(this.e0,this.e1,this.e2,this.e3,this.lat0))},forward:function(t){var e,i,o=t.x,n=t.y;if(o=j(o-this.long0),this.sphere)e=this.a*Math.asin(Math.cos(n)*Math.sin(o)),i=this.a*(Math.atan2(Math.tan(n),Math.cos(o))-this.lat0);else{var s=Math.sin(n),a=Math.cos(n),r=oe(this.a,this.e,s),l=Math.tan(n)*Math.tan(n),c=o*Math.cos(n),u=c*c,h=this.es*a*a/(1-this.es);e=r*c*(1-u*l*(1/6-(8-l+8*h)*u/120)),i=this.a*Jt(this.e0,this.e1,this.e2,this.e3,n)-this.ml0+r*s/a*u*(.5+(5-l+6*h)*u/24)}return t.x=e+this.x0,t.y=i+this.y0,t},inverse:function(t){t.x-=this.x0,t.y-=this.y0;var e,i,o=t.x/this.a,n=t.y/this.a;if(this.sphere){var a=n+this.lat0;e=Math.asin(Math.sin(a)*Math.cos(o)),i=Math.atan2(Math.tan(o),Math.cos(a))}else{var r=this.ml0/this.a+n,l=se(r,this.e0,this.e1,this.e2,this.e3);if(Math.abs(Math.abs(l)-s)<=c)return t.x=this.long0,t.y=s,n<0&&(t.y*=-1),t;var u=oe(this.a,this.e,Math.sin(l)),h=u*u*u/this.a/this.a*(1-this.es),d=Math.pow(Math.tan(l),2),p=o*this.a/u,m=p*p;e=l-u*Math.tan(l)/h*p*p*(.5-(1+3*d)*p*p/24),i=p*(1-m*(d/3+(1+3*d)*d*m/15))/Math.cos(l)}return t.x=j(i+this.long0),t.y=ne(e),t},names:["Cassini","Cassini_Soldner","cass"]},re=function(t,e){var i;return t>1e-7?(1-t*t)*(e/(1-(i=t*e)*i)-.5/t*Math.log((1-i)/(1+i))):2*e},le=.3333333333333333,ce=.17222222222222222,ue=.10257936507936508,he=.06388888888888888,de=.0664021164021164,pe=.016415012942191543,me={init:function(){var t,e=Math.abs(this.lat0);if(Math.abs(e-s)<c?this.mode=this.lat0<0?this.S_POLE:this.N_POLE:Math.abs(e)<c?this.mode=this.EQUIT:this.mode=this.OBLIQ,this.es>0)switch(this.qp=re(this.e,1),this.mmf=.5/(1-this.es),this.apa=function(t){var e,i=[];return i[0]=t*le,e=t*t,i[0]+=e*ce,i[1]=e*he,e*=t,i[0]+=e*ue,i[1]+=e*de,i[2]=e*pe,i}(this.es),this.mode){case this.N_POLE:case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),t=Math.sin(this.lat0),this.sinb1=re(this.e,t)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*t*t)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},forward:function(t){var e,i,o,n,a,r,l,u,h,p,m=t.x,f=t.y;if(m=j(m-this.long0),this.sphere){if(a=Math.sin(f),p=Math.cos(f),o=Math.cos(m),this.mode===this.OBLIQ||this.mode===this.EQUIT){if((i=this.mode===this.EQUIT?1+p*o:1+this.sinph0*a+this.cosph0*p*o)<=c)return null;e=(i=Math.sqrt(2/i))*p*Math.sin(m),i*=this.mode===this.EQUIT?a:this.cosph0*a-this.sinph0*p*o}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(o=-o),Math.abs(f+this.lat0)<c)return null;i=d-.5*f,e=(i=2*(this.mode===this.S_POLE?Math.cos(i):Math.sin(i)))*Math.sin(m),i*=o}}else{switch(l=0,u=0,h=0,o=Math.cos(m),n=Math.sin(m),a=Math.sin(f),r=re(this.e,a),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(l=r/this.qp,u=Math.sqrt(1-l*l)),this.mode){case this.OBLIQ:h=1+this.sinb1*l+this.cosb1*u*o;break;case this.EQUIT:h=1+u*o;break;case this.N_POLE:h=s+f,r=this.qp-r;break;case this.S_POLE:h=f-s,r=this.qp+r}if(Math.abs(h)<c)return null;switch(this.mode){case this.OBLIQ:case this.EQUIT:h=Math.sqrt(2/h),i=this.mode===this.OBLIQ?this.ymf*h*(this.cosb1*l-this.sinb1*u*o):(h=Math.sqrt(2/(1+u*o)))*l*this.ymf,e=this.xmf*h*u*n;break;case this.N_POLE:case this.S_POLE:r>=0?(e=(h=Math.sqrt(r))*n,i=o*(this.mode===this.S_POLE?h:-h)):e=i=0}}return t.x=this.a*e+this.x0,t.y=this.a*i+this.y0,t},inverse:function(t){t.x-=this.x0,t.y-=this.y0;var e,i,o,n,a,r,l,u,h,d,p=t.x/this.a,m=t.y/this.a;if(this.sphere){var f,_=0,g=0;if((i=.5*(f=Math.sqrt(p*p+m*m)))>1)return null;switch(i=2*Math.asin(i),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(g=Math.sin(i),_=Math.cos(i)),this.mode){case this.EQUIT:i=Math.abs(f)<=c?0:Math.asin(m*g/f),p*=g,m=_*f;break;case this.OBLIQ:i=Math.abs(f)<=c?this.lat0:Math.asin(_*this.sinph0+m*g*this.cosph0/f),p*=g*this.cosph0,m=(_-Math.sin(i)*this.sinph0)*f;break;case this.N_POLE:m=-m,i=s-i;break;case this.S_POLE:i-=s}e=0!==m||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(p,m):0}else{if(l=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(p/=this.dd,m*=this.dd,(r=Math.sqrt(p*p+m*m))<c)return t.x=this.long0,t.y=this.lat0,t;n=2*Math.asin(.5*r/this.rq),o=Math.cos(n),p*=n=Math.sin(n),this.mode===this.OBLIQ?(l=o*this.sinb1+m*n*this.cosb1/r,a=this.qp*l,m=r*this.cosb1*o-m*this.sinb1*n):(l=m*n/r,a=this.qp*l,m=r*o)}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(m=-m),!(a=p*p+m*m))return t.x=this.long0,t.y=this.lat0,t;l=1-a/this.qp,this.mode===this.S_POLE&&(l=-l)}e=Math.atan2(p,m),u=Math.asin(l),h=this.apa,d=u+u,i=u+h[0]*Math.sin(d)+h[1]*Math.sin(d+d)+h[2]*Math.sin(d+d+d)}return t.x=j(this.long0+e),t.y=i,t},names:["Lambert Azimuthal Equal Area","Lambert_Azimuthal_Equal_Area","laea"],S_POLE:1,N_POLE:2,EQUIT:3,OBLIQ:4},fe=function(t){return Math.abs(t)>1&&(t=t>1?1:-1),Math.asin(t)},_e={init:function(){Math.abs(this.lat1+this.lat2)<c||(this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e3=Math.sqrt(this.es),this.sin_po=Math.sin(this.lat1),this.cos_po=Math.cos(this.lat1),this.t1=this.sin_po,this.con=this.sin_po,this.ms1=N(this.e3,this.sin_po,this.cos_po),this.qs1=re(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat2),this.cos_po=Math.cos(this.lat2),this.t2=this.sin_po,this.ms2=N(this.e3,this.sin_po,this.cos_po),this.qs2=re(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat0),this.cos_po=Math.cos(this.lat0),this.t3=this.sin_po,this.qs0=re(this.e3,this.sin_po,this.cos_po),Math.abs(this.lat1-this.lat2)>c?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},forward:function(t){var e=t.x,i=t.y;this.sin_phi=Math.sin(i),this.cos_phi=Math.cos(i);var o=re(this.e3,this.sin_phi,this.cos_phi),n=this.a*Math.sqrt(this.c-this.ns0*o)/this.ns0,s=this.ns0*j(e-this.long0),a=n*Math.sin(s)+this.x0,r=this.rh-n*Math.cos(s)+this.y0;return t.x=a,t.y=r,t},inverse:function(t){var e,i,o,n,s,a;return t.x-=this.x0,t.y=this.rh-t.y+this.y0,this.ns0>=0?(e=Math.sqrt(t.x*t.x+t.y*t.y),o=1):(e=-Math.sqrt(t.x*t.x+t.y*t.y),o=-1),n=0,0!==e&&(n=Math.atan2(o*t.x,o*t.y)),o=e*this.ns0/this.a,this.sphere?a=Math.asin((this.c-o*o)/(2*this.ns0)):(i=(this.c-o*o)/this.ns0,a=this.phi1z(this.e3,i)),s=j(n/this.ns0+this.long0),t.x=s,t.y=a,t},names:["Albers_Conic_Equal_Area","Albers","aea"],phi1z:function(t,e){var i,o,n,s,a=fe(.5*e);if(t<c)return a;for(var r=t*t,l=1;l<=25;l++)if(a+=s=.5*(n=1-(o=t*(i=Math.sin(a)))*o)*n/Math.cos(a)*(e/(1-r)-i/n+.5/t*Math.log((1-o)/(1+o))),Math.abs(s)<=1e-7)return a;return null}},ge={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0),this.infinity_dist=1e3*this.a,this.rc=1},forward:function(t){var e,i,o,n,s,a,r,l=t.x,u=t.y;return o=j(l-this.long0),e=Math.sin(u),i=Math.cos(u),n=Math.cos(o),(s=this.sin_p14*e+this.cos_p14*i*n)>0||Math.abs(s)<=c?(a=this.x0+1*this.a*i*Math.sin(o)/s,r=this.y0+1*this.a*(this.cos_p14*e-this.sin_p14*i*n)/s):(a=this.x0+this.infinity_dist*i*Math.sin(o),r=this.y0+this.infinity_dist*(this.cos_p14*e-this.sin_p14*i*n)),t.x=a,t.y=r,t},inverse:function(t){var e,i,o,n,s,a;return t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,t.x/=this.k0,t.y/=this.k0,(e=Math.sqrt(t.x*t.x+t.y*t.y))?(n=Math.atan2(e,this.rc),i=Math.sin(n),o=Math.cos(n),a=fe(o*this.sin_p14+t.y*i*this.cos_p14/e),s=Math.atan2(t.x*i,e*this.cos_p14*o-t.y*this.sin_p14*i),s=j(this.long0+s)):(a=this.phic0,s=0),t.x=s,t.y=a,t},names:["gnom"]},ve=function(t,e){var i=1-(1-t*t)/(2*t)*Math.log((1-t)/(1+t));if(Math.abs(Math.abs(e)-i)<1e-6)return e<0?-1*s:s;for(var o,n,a,r,l=Math.asin(.5*e),c=0;c<30;c++)if(n=Math.sin(l),a=Math.cos(l),r=t*n,l+=o=Math.pow(1-r*r,2)/(2*a)*(e/(1-t*t)-n/(1-r*r)+.5/t*Math.log((1-r)/(1+r))),Math.abs(o)<=1e-10)return l;return NaN},ye={init:function(){this.sphere||(this.k0=N(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},forward:function(t){var e,i,o=t.x,n=t.y,s=j(o-this.long0);if(this.sphere)e=this.x0+this.a*s*Math.cos(this.lat_ts),i=this.y0+this.a*Math.sin(n)/Math.cos(this.lat_ts);else{var a=re(this.e,Math.sin(n));e=this.x0+this.a*this.k0*s,i=this.y0+this.a*a*.5/this.k0}return t.x=e,t.y=i,t},inverse:function(t){var e,i;return t.x-=this.x0,t.y-=this.y0,this.sphere?(e=j(this.long0+t.x/this.a/Math.cos(this.lat_ts)),i=Math.asin(t.y/this.a*Math.cos(this.lat_ts))):(i=ve(this.e,2*t.y*this.k0/this.a),e=j(this.long0+t.x/(this.a*this.k0))),t.x=e,t.y=i,t},names:["cea"]},Ee={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},forward:function(t){var e=t.x,i=t.y,o=j(e-this.long0),n=ne(i-this.lat0);return t.x=this.x0+this.a*o*this.rc,t.y=this.y0+this.a*n,t},inverse:function(t){var e=t.x,i=t.y;return t.x=j(this.long0+(e-this.x0)/(this.a*this.rc)),t.y=ne(this.lat0+(i-this.y0)/this.a),t},names:["Equirectangular","Equidistant_Cylindrical","eqc"]},Pe=20,we={init:function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=$t(this.es),this.e1=te(this.es),this.e2=ee(this.es),this.e3=ie(this.es),this.ml0=this.a*Jt(this.e0,this.e1,this.e2,this.e3,this.lat0)},forward:function(t){var e,i,o,n=t.x,s=t.y,a=j(n-this.long0);if(o=a*Math.sin(s),this.sphere)Math.abs(s)<=c?(e=this.a*a,i=-1*this.a*this.lat0):(e=this.a*Math.sin(o)/Math.tan(s),i=this.a*(ne(s-this.lat0)+(1-Math.cos(o))/Math.tan(s)));else if(Math.abs(s)<=c)e=this.a*a,i=-1*this.ml0;else{var r=oe(this.a,this.e,Math.sin(s))/Math.tan(s);e=r*Math.sin(o),i=this.a*Jt(this.e0,this.e1,this.e2,this.e3,s)-this.ml0+r*(1-Math.cos(o))}return t.x=e+this.x0,t.y=i+this.y0,t},inverse:function(t){var e,i,o,n,s,a,r,l,u;if(o=t.x-this.x0,n=t.y-this.y0,this.sphere)if(Math.abs(n+this.a*this.lat0)<=c)e=j(o/this.a+this.long0),i=0;else{var h;for(a=this.lat0+n/this.a,r=o*o/this.a/this.a+a*a,l=a,s=Pe;s;--s)if(l+=u=-1*(a*(l*(h=Math.tan(l))+1)-l-.5*(l*l+r)*h)/((l-a)/h-1),Math.abs(u)<=c){i=l;break}e=j(this.long0+Math.asin(o*Math.tan(l)/this.a)/Math.sin(i))}else if(Math.abs(n+this.ml0)<=c)i=0,e=j(this.long0+o/this.a);else{var d,p,m,f,_;for(a=(this.ml0+n)/this.a,r=o*o/this.a/this.a+a*a,l=a,s=Pe;s;--s)if(_=this.e*Math.sin(l),d=Math.sqrt(1-_*_)*Math.tan(l),p=this.a*Jt(this.e0,this.e1,this.e2,this.e3,l),m=this.e0-2*this.e1*Math.cos(2*l)+4*this.e2*Math.cos(4*l)-6*this.e3*Math.cos(6*l),l-=u=(a*(d*(f=p/this.a)+1)-f-.5*d*(f*f+r))/(this.es*Math.sin(2*l)*(f*f+r-2*a*f)/(4*d)+(a-f)*(d*m-2/Math.sin(2*l))-m),Math.abs(u)<=c){i=l;break}d=Math.sqrt(1-this.es*Math.pow(Math.sin(i),2))*Math.tan(i),e=j(this.long0+Math.asin(o*d/this.a)/Math.sin(i))}return t.x=e,t.y=i,t},names:["Polyconic","poly"]},Ce={init:function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},forward:function(t){var e,i=t.x,o=t.y-this.lat0,s=i-this.long0,a=o/n*1e-5,r=s,l=1,c=0;for(e=1;e<=10;e++)l*=a,c+=this.A[e]*l;var u,h=c,d=r,p=1,m=0,f=0,_=0;for(e=1;e<=6;e++)u=m*h+p*d,p=p*h-m*d,m=u,f=f+this.B_re[e]*p-this.B_im[e]*m,_=_+this.B_im[e]*p+this.B_re[e]*m;return t.x=_*this.a+this.x0,t.y=f*this.a+this.y0,t},inverse:function(t){var e,i,o=t.x,s=t.y,a=o-this.x0,r=(s-this.y0)/this.a,l=a/this.a,c=1,u=0,h=0,d=0;for(e=1;e<=6;e++)i=u*r+c*l,c=c*r-u*l,u=i,h=h+this.C_re[e]*c-this.C_im[e]*u,d=d+this.C_im[e]*c+this.C_re[e]*u;for(var p=0;p<this.iterations;p++){var m,f=h,_=d,g=r,v=l;for(e=2;e<=6;e++)m=_*h+f*d,f=f*h-_*d,_=m,g+=(e-1)*(this.B_re[e]*f-this.B_im[e]*_),v+=(e-1)*(this.B_im[e]*f+this.B_re[e]*_);f=1,_=0;var y=this.B_re[1],E=this.B_im[1];for(e=2;e<=6;e++)m=_*h+f*d,f=f*h-_*d,_=m,y+=e*(this.B_re[e]*f-this.B_im[e]*_),E+=e*(this.B_im[e]*f+this.B_re[e]*_);var P=y*y+E*E;h=(g*y+v*E)/P,d=(v*y-g*E)/P}var w=h,C=d,M=1,S=0;for(e=1;e<=9;e++)M*=w,S+=this.D[e]*M;var L=this.lat0+S*n*1e5,b=this.long0+C;return t.x=b,t.y=L,t},names:["New_Zealand_Map_Grid","nzmg"]},Me={init:function(){},forward:function(t){var e=t.x,i=t.y,o=j(e-this.long0),n=this.x0+this.a*o,s=this.y0+this.a*Math.log(Math.tan(Math.PI/4+i/2.5))*1.25;return t.x=n,t.y=s,t},inverse:function(t){t.x-=this.x0,t.y-=this.y0;var e=j(this.long0+t.x/this.a),i=2.5*(Math.atan(Math.exp(.8*t.y/this.a))-Math.PI/4);return t.x=e,t.y=i,t},names:["Miller_Cylindrical","mill"]},Se=20,Le={init:function(){this.sphere?(this.n=1,this.m=0,this.es=0,this.C_y=Math.sqrt((this.m+1)/this.n),this.C_x=this.C_y/(this.m+1)):this.en=It(this.es)},forward:function(t){var e,i,o=t.x,n=t.y;if(o=j(o-this.long0),this.sphere){if(this.m)for(var s=this.n*Math.sin(n),a=Se;a;--a){var r=(this.m*n+Math.sin(n)-s)/(this.m+Math.cos(n));if(n-=r,Math.abs(r)<c)break}else n=1!==this.n?Math.asin(this.n*Math.sin(n)):n;e=this.a*this.C_x*o*(this.m+Math.cos(n)),i=this.a*this.C_y*n}else{var l=Math.sin(n),u=Math.cos(n);i=this.a*Gt(n,l,u,this.en),e=this.a*o*u/Math.sqrt(1-this.es*l*l)}return t.x=e,t.y=i,t},inverse:function(t){var e,i,o,n;return t.x-=this.x0,o=t.x/this.a,t.y-=this.y0,e=t.y/this.a,this.sphere?(e/=this.C_y,o/=this.C_x*(this.m+Math.cos(e)),this.m?e=fe((this.m*e+Math.sin(e))/this.n):1!==this.n&&(e=fe(Math.sin(e)/this.n)),o=j(o+this.long0),e=ne(e)):(e=At(t.y/this.a,this.es,this.en),(n=Math.abs(e))<s?(n=Math.sin(e),i=this.long0+t.x*Math.sqrt(1-this.es*n*n)/(this.a*Math.cos(e)),o=j(i)):n-c<s&&(o=this.long0)),t.x=o,t.y=e,t},names:["Sinusoidal","sinu"]},be={init:function(){},forward:function(t){for(var e=t.x,i=t.y,o=j(e-this.long0),n=i,s=Math.PI*Math.sin(i);;){var a=-(n+Math.sin(n)-s)/(1+Math.cos(n));if(n+=a,Math.abs(a)<c)break}n/=2,Math.PI/2-Math.abs(i)<c&&(o=0);var r=.900316316158*this.a*o*Math.cos(n)+this.x0,l=1.4142135623731*this.a*Math.sin(n)+this.y0;return t.x=r,t.y=l,t},inverse:function(t){var e,i;t.x-=this.x0,t.y-=this.y0,i=t.y/(1.4142135623731*this.a),Math.abs(i)>.999999999999&&(i=.999999999999),e=Math.asin(i);var o=j(this.long0+t.x/(.900316316158*this.a*Math.cos(e)));o<-Math.PI&&(o=-Math.PI),o>Math.PI&&(o=Math.PI),i=(2*e+Math.sin(2*e))/Math.PI,Math.abs(i)>1&&(i=1);var n=Math.asin(i);return t.x=o,t.y=n,t},names:["Mollweide","moll"]},Re={init:function(){Math.abs(this.lat1+this.lat2)<c||(this.lat2=this.lat2||this.lat1,this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=$t(this.es),this.e1=te(this.es),this.e2=ee(this.es),this.e3=ie(this.es),this.sinphi=Math.sin(this.lat1),this.cosphi=Math.cos(this.lat1),this.ms1=N(this.e,this.sinphi,this.cosphi),this.ml1=Jt(this.e0,this.e1,this.e2,this.e3,this.lat1),Math.abs(this.lat1-this.lat2)<c?this.ns=this.sinphi:(this.sinphi=Math.sin(this.lat2),this.cosphi=Math.cos(this.lat2),this.ms2=N(this.e,this.sinphi,this.cosphi),this.ml2=Jt(this.e0,this.e1,this.e2,this.e3,this.lat2),this.ns=(this.ms1-this.ms2)/(this.ml2-this.ml1)),this.g=this.ml1+this.ms1/this.ns,this.ml0=Jt(this.e0,this.e1,this.e2,this.e3,this.lat0),this.rh=this.a*(this.g-this.ml0))},forward:function(t){var e,i=t.x,o=t.y;if(this.sphere)e=this.a*(this.g-o);else{var n=Jt(this.e0,this.e1,this.e2,this.e3,o);e=this.a*(this.g-n)}var s=this.ns*j(i-this.long0),a=this.x0+e*Math.sin(s),r=this.y0+this.rh-e*Math.cos(s);return t.x=a,t.y=r,t},inverse:function(t){var e,i,o,n;t.x-=this.x0,t.y=this.rh-t.y+this.y0,this.ns>=0?(i=Math.sqrt(t.x*t.x+t.y*t.y),e=1):(i=-Math.sqrt(t.x*t.x+t.y*t.y),e=-1);var s=0;if(0!==i&&(s=Math.atan2(e*t.x,e*t.y)),this.sphere)return n=j(this.long0+s/this.ns),o=ne(this.g-i/this.a),t.x=n,t.y=o,t;var a=this.g-i/this.a;return o=se(a,this.e0,this.e1,this.e2,this.e3),n=j(this.long0+s/this.ns),t.x=n,t.y=o,t},names:["Equidistant_Conic","eqdc"]},xe={init:function(){this.R=this.a},forward:function(t){var e,i,o=t.x,n=t.y,a=j(o-this.long0);Math.abs(n)<=c&&(e=this.x0+this.R*a,i=this.y0);var r=fe(2*Math.abs(n/Math.PI));(Math.abs(a)<=c||Math.abs(Math.abs(n)-s)<=c)&&(e=this.x0,i=n>=0?this.y0+Math.PI*this.R*Math.tan(.5*r):this.y0+Math.PI*this.R*-Math.tan(.5*r));var l=.5*Math.abs(Math.PI/a-a/Math.PI),u=l*l,h=Math.sin(r),d=Math.cos(r),p=d/(h+d-1),m=p*p,f=p*(2/h-1),_=f*f,g=Math.PI*this.R*(l*(p-_)+Math.sqrt(u*(p-_)*(p-_)-(_+u)*(m-_)))/(_+u);a<0&&(g=-g),e=this.x0+g;var v=u+p;return g=Math.PI*this.R*(f*v-l*Math.sqrt((_+u)*(u+1)-v*v))/(_+u),i=n>=0?this.y0+g:this.y0-g,t.x=e,t.y=i,t},inverse:function(t){var e,i,o,n,s,a,r,l,u,h,d,p;return t.x-=this.x0,t.y-=this.y0,d=Math.PI*this.R,s=(o=t.x/d)*o+(n=t.y/d)*n,d=3*(n*n/(l=-2*(a=-Math.abs(n)*(1+s))+1+2*n*n+s*s)+(2*(r=a-2*n*n+o*o)*r*r/l/l/l-9*a*r/l/l)/27)/(u=(a-r*r/3/l)/l)/(h=2*Math.sqrt(-u/3)),Math.abs(d)>1&&(d=d>=0?1:-1),p=Math.acos(d)/3,i=t.y>=0?(-h*Math.cos(p+Math.PI/3)-r/3/l)*Math.PI:-(-h*Math.cos(p+Math.PI/3)-r/3/l)*Math.PI,e=Math.abs(o)<c?this.long0:j(this.long0+Math.PI*(s-1+Math.sqrt(1+2*(o*o-n*n)+s*s))/2/o),t.x=e,t.y=i,t},names:["Van_der_Grinten_I","VanDerGrinten","vandg"]},Ie={init:function(){this.sin_p12=Math.sin(this.lat0),this.cos_p12=Math.cos(this.lat0)},forward:function(t){var e,i,o,n,a,r,l,u,h,d,p,m,f,_,g,v,y,E,P,w,C,M,S=t.x,L=t.y,b=Math.sin(t.y),R=Math.cos(t.y),x=j(S-this.long0);return this.sphere?Math.abs(this.sin_p12-1)<=c?(t.x=this.x0+this.a*(s-L)*Math.sin(x),t.y=this.y0-this.a*(s-L)*Math.cos(x),t):Math.abs(this.sin_p12+1)<=c?(t.x=this.x0+this.a*(s+L)*Math.sin(x),t.y=this.y0+this.a*(s+L)*Math.cos(x),t):(E=this.sin_p12*b+this.cos_p12*R*Math.cos(x),y=(v=Math.acos(E))?v/Math.sin(v):1,t.x=this.x0+this.a*y*R*Math.sin(x),t.y=this.y0+this.a*y*(this.cos_p12*b-this.sin_p12*R*Math.cos(x)),t):(e=$t(this.es),i=te(this.es),o=ee(this.es),n=ie(this.es),Math.abs(this.sin_p12-1)<=c?(a=this.a*Jt(e,i,o,n,s),r=this.a*Jt(e,i,o,n,L),t.x=this.x0+(a-r)*Math.sin(x),t.y=this.y0-(a-r)*Math.cos(x),t):Math.abs(this.sin_p12+1)<=c?(a=this.a*Jt(e,i,o,n,s),r=this.a*Jt(e,i,o,n,L),t.x=this.x0+(a+r)*Math.sin(x),t.y=this.y0+(a+r)*Math.cos(x),t):(l=b/R,u=oe(this.a,this.e,this.sin_p12),h=oe(this.a,this.e,b),d=Math.atan((1-this.es)*l+this.es*u*this.sin_p12/(h*R)),P=0===(p=Math.atan2(Math.sin(x),this.cos_p12*Math.tan(d)-this.sin_p12*Math.cos(x)))?Math.asin(this.cos_p12*Math.sin(d)-this.sin_p12*Math.cos(d)):Math.abs(Math.abs(p)-Math.PI)<=c?-Math.asin(this.cos_p12*Math.sin(d)-this.sin_p12*Math.cos(d)):Math.asin(Math.sin(x)*Math.cos(d)/Math.sin(p)),m=this.e*this.sin_p12/Math.sqrt(1-this.es),v=u*P*(1-(w=P*P)*(g=(f=this.e*this.cos_p12*Math.cos(p)/Math.sqrt(1-this.es))*f)*(1-g)/6+(C=w*P)/8*(_=m*f)*(1-2*g)+(M=C*P)/120*(g*(4-7*g)-3*m*m*(1-7*g))-M*P/48*_),t.x=this.x0+v*Math.sin(p),t.y=this.y0+v*Math.cos(p),t))},inverse:function(t){var e,i,o,n,a,r,l,u,h,d,p,m,f,_,g,v,y,E,P,w,C,M,S;if(t.x-=this.x0,t.y-=this.y0,this.sphere){if((e=Math.sqrt(t.x*t.x+t.y*t.y))>2*s*this.a)return;return i=e/this.a,o=Math.sin(i),n=Math.cos(i),a=this.long0,Math.abs(e)<=c?r=this.lat0:(r=fe(n*this.sin_p12+t.y*o*this.cos_p12/e),l=Math.abs(this.lat0)-s,a=Math.abs(l)<=c?this.lat0>=0?j(this.long0+Math.atan2(t.x,-t.y)):j(this.long0-Math.atan2(-t.x,t.y)):j(this.long0+Math.atan2(t.x*o,e*this.cos_p12*n-t.y*this.sin_p12*o))),t.x=a,t.y=r,t}return u=$t(this.es),h=te(this.es),d=ee(this.es),p=ie(this.es),Math.abs(this.sin_p12-1)<=c?(m=this.a*Jt(u,h,d,p,s),e=Math.sqrt(t.x*t.x+t.y*t.y),r=se((m-e)/this.a,u,h,d,p),a=j(this.long0+Math.atan2(t.x,-1*t.y)),t.x=a,t.y=r,t):Math.abs(this.sin_p12+1)<=c?(m=this.a*Jt(u,h,d,p,s),e=Math.sqrt(t.x*t.x+t.y*t.y),r=se((e-m)/this.a,u,h,d,p),a=j(this.long0+Math.atan2(t.x,t.y)),t.x=a,t.y=r,t):(e=Math.sqrt(t.x*t.x+t.y*t.y),g=Math.atan2(t.x,t.y),f=oe(this.a,this.e,this.sin_p12),v=Math.cos(g),E=-(y=this.e*this.cos_p12*v)*y/(1-this.es),P=3*this.es*(1-E)*this.sin_p12*this.cos_p12*v/(1-this.es),M=1-E*(C=(w=e/f)-E*(1+E)*Math.pow(w,3)/6-P*(1+3*E)*Math.pow(w,4)/24)*C/2-w*C*C*C/6,_=Math.asin(this.sin_p12*Math.cos(C)+this.cos_p12*Math.sin(C)*v),a=j(this.long0+Math.asin(Math.sin(g)*Math.sin(C)/Math.cos(_))),S=Math.sin(_),r=Math.atan2((S-this.es*M*this.sin_p12)*Math.tan(_),S*(1-this.es)),t.x=a,t.y=r,t)},names:["Azimuthal_Equidistant","aeqd"]},Ge={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},forward:function(t){var e,i,o,n,s,a,r,l=t.x,u=t.y;return o=j(l-this.long0),e=Math.sin(u),i=Math.cos(u),n=Math.cos(o),((s=this.sin_p14*e+this.cos_p14*i*n)>0||Math.abs(s)<=c)&&(a=1*this.a*i*Math.sin(o),r=this.y0+1*this.a*(this.cos_p14*e-this.sin_p14*i*n)),t.x=a,t.y=r,t},inverse:function(t){var e,i,o,n,a,r,l;return t.x-=this.x0,t.y-=this.y0,e=Math.sqrt(t.x*t.x+t.y*t.y),i=fe(e/this.a),o=Math.sin(i),n=Math.cos(i),r=this.long0,Math.abs(e)<=c?(l=this.lat0,t.x=r,t.y=l,t):(l=fe(n*this.sin_p14+t.y*o*this.cos_p14/e),a=Math.abs(this.lat0)-s,Math.abs(a)<=c?(r=this.lat0>=0?j(this.long0+Math.atan2(t.x,-t.y)):j(this.long0-Math.atan2(-t.x,t.y)),t.x=r,t.y=l,t):(r=j(this.long0+Math.atan2(t.x*o,e*this.cos_p14*n-t.y*this.sin_p14*o)),t.x=r,t.y=l,t))},names:["ortho"]},Ae={FRONT:1,RIGHT:2,BACK:3,LEFT:4,TOP:5,BOTTOM:6},Te={AREA_0:1,AREA_1:2,AREA_2:3,AREA_3:4};function ke(t,e,i,o){var n;return t<c?(o.value=Te.AREA_0,n=0):(n=Math.atan2(e,i),Math.abs(n)<=d?o.value=Te.AREA_0:n>d&&n<=s+d?(o.value=Te.AREA_1,n-=s):n>s+d||n<=-(s+d)?(o.value=Te.AREA_2,n=n>=0?n-m:n+m):(o.value=Te.AREA_3,n+=s)),n}function De(t,e){var i=t+e;return i<-m?i+=p:i>+m&&(i-=p),i}var Oe,Ne={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Quadrilateralized Spherical Cube",this.lat0>=s-d/2?this.face=Ae.TOP:this.lat0<=-(s-d/2)?this.face=Ae.BOTTOM:Math.abs(this.long0)<=d?this.face=Ae.FRONT:Math.abs(this.long0)<=s+d?this.face=this.long0>0?Ae.RIGHT:Ae.LEFT:this.face=Ae.BACK,0!==this.es&&(this.one_minus_f=1-(this.a-this.b)/this.a,this.one_minus_f_squared=this.one_minus_f*this.one_minus_f)},forward:function(t){var e,i,o,n,a,r,l={x:0,y:0},c={value:0};if(t.x-=this.long0,e=0!==this.es?Math.atan(this.one_minus_f_squared*Math.tan(t.y)):t.y,i=t.x,this.face===Ae.TOP)n=s-e,i>=d&&i<=s+d?(c.value=Te.AREA_0,o=i-s):i>s+d||i<=-(s+d)?(c.value=Te.AREA_1,o=i>0?i-m:i+m):i>-(s+d)&&i<=-d?(c.value=Te.AREA_2,o=i+s):(c.value=Te.AREA_3,o=i);else if(this.face===Ae.BOTTOM)n=s+e,i>=d&&i<=s+d?(c.value=Te.AREA_0,o=-i+s):i<d&&i>=-d?(c.value=Te.AREA_1,o=-i):i<-d&&i>=-(s+d)?(c.value=Te.AREA_2,o=-i-s):(c.value=Te.AREA_3,o=i>0?-i+m:-i-m);else{var u,h,p,f,_,g;this.face===Ae.RIGHT?i=De(i,+s):this.face===Ae.BACK?i=De(i,+m):this.face===Ae.LEFT&&(i=De(i,-s)),f=Math.sin(e),_=Math.cos(e),g=Math.sin(i),u=_*Math.cos(i),h=_*g,p=f,this.face===Ae.FRONT?o=ke(n=Math.acos(u),p,h,c):this.face===Ae.RIGHT?o=ke(n=Math.acos(h),p,-u,c):this.face===Ae.BACK?o=ke(n=Math.acos(-u),p,-h,c):this.face===Ae.LEFT?o=ke(n=Math.acos(-h),p,u,c):(n=o=0,c.value=Te.AREA_0)}return r=Math.atan(12/m*(o+Math.acos(Math.sin(o)*Math.cos(d))-s)),a=Math.sqrt((1-Math.cos(n))/(Math.cos(r)*Math.cos(r))/(1-Math.cos(Math.atan(1/Math.cos(o))))),c.value===Te.AREA_1?r+=s:c.value===Te.AREA_2?r+=m:c.value===Te.AREA_3&&(r+=1.5*m),l.x=a*Math.cos(r),l.y=a*Math.sin(r),l.x=l.x*this.a+this.x0,l.y=l.y*this.a+this.y0,t.x=l.x,t.y=l.y,t},inverse:function(t){var e,i,o,n,a,r,l,c,u,h,d,p,f={lam:0,phi:0},_={value:0};if(t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,i=Math.atan(Math.sqrt(t.x*t.x+t.y*t.y)),e=Math.atan2(t.y,t.x),t.x>=0&&t.x>=Math.abs(t.y)?_.value=Te.AREA_0:t.y>=0&&t.y>=Math.abs(t.x)?(_.value=Te.AREA_1,e-=s):t.x<0&&-t.x>=Math.abs(t.y)?(_.value=Te.AREA_2,e=e<0?e+m:e-m):(_.value=Te.AREA_3,e+=s),u=m/12*Math.tan(e),a=Math.sin(u)/(Math.cos(u)-1/Math.sqrt(2)),r=Math.atan(a),(l=1-(o=Math.cos(e))*o*(n=Math.tan(i))*n*(1-Math.cos(Math.atan(1/Math.cos(r)))))<-1?l=-1:l>1&&(l=1),this.face===Ae.TOP)c=Math.acos(l),f.phi=s-c,_.value===Te.AREA_0?f.lam=r+s:_.value===Te.AREA_1?f.lam=r<0?r+m:r-m:_.value===Te.AREA_2?f.lam=r-s:f.lam=r;else if(this.face===Ae.BOTTOM)c=Math.acos(l),f.phi=c-s,_.value===Te.AREA_0?f.lam=-r+s:_.value===Te.AREA_1?f.lam=-r:_.value===Te.AREA_2?f.lam=-r-s:f.lam=r<0?-r-m:-r+m;else{var g,v,y;u=(g=l)*g,v=(u+=(y=u>=1?0:Math.sqrt(1-u)*Math.sin(r))*y)>=1?0:Math.sqrt(1-u),_.value===Te.AREA_1?(u=v,v=-y,y=u):_.value===Te.AREA_2?(v=-v,y=-y):_.value===Te.AREA_3&&(u=v,v=y,y=-u),this.face===Ae.RIGHT?(u=g,g=-v,v=u):this.face===Ae.BACK?(g=-g,v=-v):this.face===Ae.LEFT&&(u=g,g=v,v=-u),f.phi=Math.acos(-y)-s,f.lam=Math.atan2(v,g),this.face===Ae.RIGHT?f.lam=De(f.lam,-s):this.face===Ae.BACK?f.lam=De(f.lam,-m):this.face===Ae.LEFT&&(f.lam=De(f.lam,+s))}return 0!==this.es&&(h=f.phi<0?1:0,d=Math.tan(f.phi),p=this.b/Math.sqrt(d*d+this.one_minus_f_squared),f.phi=Math.atan(Math.sqrt(this.a*this.a-p*p)/(this.one_minus_f*p)),h&&(f.phi=-f.phi)),f.lam+=this.long0,t.x=f.lam,t.y=f.phi,t},names:["Quadrilateralized Spherical Cube","Quadrilateralized_Spherical_Cube","qsc"]},Ue=[[1,22199e-21,-715515e-10,31103e-10],[.9986,-482243e-9,-24897e-9,-13309e-10],[.9954,-83103e-8,-448605e-10,-9.86701e-7],[.99,-.00135364,-59661e-9,36777e-10],[.9822,-.00167442,-449547e-11,-572411e-11],[.973,-.00214868,-903571e-10,1.8736e-8],[.96,-.00305085,-900761e-10,164917e-11],[.9427,-.00382792,-653386e-10,-26154e-10],[.9216,-.00467746,-10457e-8,481243e-11],[.8962,-.00536223,-323831e-10,-543432e-11],[.8679,-.00609363,-113898e-9,332484e-11],[.835,-.00698325,-640253e-10,9.34959e-7],[.7986,-.00755338,-500009e-10,9.35324e-7],[.7597,-.00798324,-35971e-9,-227626e-11],[.7186,-.00851367,-701149e-10,-86303e-10],[.6732,-.00986209,-199569e-9,191974e-10],[.6213,-.010418,883923e-10,624051e-11],[.5722,-.00906601,182e-6,624051e-11],[.5322,-.00677797,275608e-9,624051e-11]],je=[[-520417e-23,.0124,121431e-23,-845284e-16],[.062,.0124,-1.26793e-9,4.22642e-10],[.124,.0124,5.07171e-9,-1.60604e-9],[.186,.0123999,-1.90189e-8,6.00152e-9],[.248,.0124002,7.10039e-8,-2.24e-8],[.31,.0123992,-2.64997e-7,8.35986e-8],[.372,.0124029,9.88983e-7,-3.11994e-7],[.434,.0123893,-369093e-11,-4.35621e-7],[.4958,.0123198,-102252e-10,-3.45523e-7],[.5571,.0121916,-154081e-10,-5.82288e-7],[.6176,.0119938,-241424e-10,-5.25327e-7],[.6769,.011713,-320223e-10,-5.16405e-7],[.7346,.0113541,-397684e-10,-6.09052e-7],[.7903,.0109107,-489042e-10,-104739e-11],[.8435,.0103431,-64615e-9,-1.40374e-9],[.8936,.00969686,-64636e-9,-8547e-9],[.9394,.00840947,-192841e-9,-42106e-10],[.9761,.00616527,-256e-6,-42106e-10],[1,.00328947,-319159e-9,-42106e-10]],Fe=.8487,Be=1.3523,ze=h/5,qe=1/ze,He=18,We=function(t,e){return t[0]+e*(t[1]+e*(t[2]+e*t[3]))},Ve=function(t,e){return t[1]+e*(2*t[2]+3*e*t[3])},Ye={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.long0=this.long0||0,this.es=0,this.title=this.title||"Robinson"},forward:function(t){var e=j(t.x-this.long0),i=Math.abs(t.y),o=Math.floor(i*ze);o<0?o=0:o>=He&&(o=He-1),i=h*(i-qe*o);var n={x:We(Ue[o],i)*e,y:We(je[o],i)};return t.y<0&&(n.y=-n.y),n.x=n.x*this.a*Fe+this.x0,n.y=n.y*this.a*Be+this.y0,n},inverse:function(t){var e={x:(t.x-this.x0)/(this.a*Fe),y:Math.abs(t.y-this.y0)/(this.a*Be)};if(e.y>=1)e.x/=Ue[He][0],e.y=t.y<0?-s:s;else{var i=Math.floor(e.y*He);for(i<0?i=0:i>=He&&(i=He-1);;)if(je[i][0]>e.y)--i;else{if(!(je[i+1][0]<=e.y))break;++i}var o=je[i],n=5*(e.y-o[0])/(je[i+1][0]-o[0]);n=function(t,e,i,o){for(var n=e;o;--o){var s=t(n);if(n-=s,Math.abs(s)<i)break}return n}((function(t){return(We(o,t)-e.y)/Ve(o,t)}),n,c,100),e.x/=We(Ue[i],n),e.y=(5*i+n)*u,t.y<0&&(e.y=-e.y)}return e.x=j(e.x+this.long0),e},names:["Robinson","robin"]},Xe={init:function(){this.name="geocent"},forward:function(t){return J(t,this.es,this.a)},inverse:function(t){return $(t,this.es,this.a,this.b)},names:["Geocentric","geocentric","geocent","Geocent"]},Ke={N_POLE:0,S_POLE:1,EQUIT:2,OBLIQ:3},Ze={h:{def:1e5,num:!0},azi:{def:0,num:!0,degrees:!0},tilt:{def:0,num:!0,degrees:!0},long0:{def:0,num:!0},lat0:{def:0,num:!0}},Qe={init:function(){if(Object.keys(Ze).forEach(function(t){if(void 0===this[t])this[t]=Ze[t].def;else{if(Ze[t].num&&isNaN(this[t]))throw new Error("Invalid parameter value, must be numeric "+t+" = "+this[t]);Ze[t].num&&(this[t]=parseFloat(this[t]))}Ze[t].degrees&&(this[t]=this[t]*u)}.bind(this)),Math.abs(Math.abs(this.lat0)-s)<c?this.mode=this.lat0<0?Ke.S_POLE:Ke.N_POLE:Math.abs(this.lat0)<c?this.mode=Ke.EQUIT:(this.mode=Ke.OBLIQ,this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0)),this.pn1=this.h/this.a,this.pn1<=0||this.pn1>1e10)throw new Error("Invalid height");this.p=1+this.pn1,this.rp=1/this.p,this.h1=1/this.pn1,this.pfact=(this.p+1)*this.h1,this.es=0;var t=this.tilt,e=this.azi;this.cg=Math.cos(e),this.sg=Math.sin(e),this.cw=Math.cos(t),this.sw=Math.sin(t)},forward:function(t){t.x-=this.long0;var e,i,o,n,s=Math.sin(t.y),a=Math.cos(t.y),r=Math.cos(t.x);switch(this.mode){case Ke.OBLIQ:i=this.sinph0*s+this.cosph0*a*r;break;case Ke.EQUIT:i=a*r;break;case Ke.S_POLE:i=-s;break;case Ke.N_POLE:i=s}switch(e=(i=this.pn1/(this.p-i))*a*Math.sin(t.x),this.mode){case Ke.OBLIQ:i*=this.cosph0*s-this.sinph0*a*r;break;case Ke.EQUIT:i*=s;break;case Ke.N_POLE:i*=-a*r;break;case Ke.S_POLE:i*=a*r}return n=1/((o=i*this.cg+e*this.sg)*this.sw*this.h1+this.cw),e=(e*this.cg-i*this.sg)*this.cw*n,i=o*n,t.x=e*this.a,t.y=i*this.a,t},inverse:function(t){t.x/=this.a,t.y/=this.a;var e,i,o,n={x:t.x,y:t.y};o=1/(this.pn1-t.y*this.sw),e=this.pn1*t.x*o,i=this.pn1*t.y*this.cw*o,t.x=e*this.cg+i*this.sg,t.y=i*this.cg-e*this.sg;var s=Dt(t.x,t.y);if(Math.abs(s)<c)n.x=0,n.y=t.y;else{var a,r;switch(r=1-s*s*this.pfact,r=(this.p-Math.sqrt(r))/(this.pn1/s+s/this.pn1),a=Math.sqrt(1-r*r),this.mode){case Ke.OBLIQ:n.y=Math.asin(a*this.sinph0+t.y*r*this.cosph0/s),t.y=(a-this.sinph0*Math.sin(n.y))*s,t.x*=r*this.cosph0;break;case Ke.EQUIT:n.y=Math.asin(t.y*r/s),t.y=a*s,t.x*=r;break;case Ke.N_POLE:n.y=Math.asin(a),t.y=-t.y;break;case Ke.S_POLE:n.y=-Math.asin(a)}n.x=Math.atan2(t.x,t.y)}return t.x=n.x+this.long0,t.y=n.y,t},names:["Tilted_Perspective","tpers"]};return ut.defaultDatum="WGS84",ut.Proj=Q,ut.WGS84=new ut.Proj("WGS84"),ut.Point=Rt,ut.toPoint=ot,ut.defs=A,ut.transform=at,ut.mgrs=yt,ut.version="2.6.3",(Oe=ut).Proj.projections.add(Tt),Oe.Proj.projections.add(Ft),Oe.Proj.projections.add(zt),Oe.Proj.projections.add(Vt),Oe.Proj.projections.add(Yt),Oe.Proj.projections.add(Xt),Oe.Proj.projections.add(Kt),Oe.Proj.projections.add(Zt),Oe.Proj.projections.add(Qt),Oe.Proj.projections.add(ae),Oe.Proj.projections.add(me),Oe.Proj.projections.add(_e),Oe.Proj.projections.add(ge),Oe.Proj.projections.add(ye),Oe.Proj.projections.add(Ee),Oe.Proj.projections.add(we),Oe.Proj.projections.add(Ce),Oe.Proj.projections.add(Me),Oe.Proj.projections.add(Le),Oe.Proj.projections.add(be),Oe.Proj.projections.add(Re),Oe.Proj.projections.add(xe),Oe.Proj.projections.add(Ie),Oe.Proj.projections.add(Ge),Oe.Proj.projections.add(Ne),Oe.Proj.projections.add(Ye),Oe.Proj.projections.add(Xe),Oe.Proj.projections.add(Qe),ut}()},function(t,e,i){var o,n,s;n=[i(2),i(151)],void 0===(s="function"==typeof(o=function(t,e){return e.__esModule&&e.default&&(e=e.default),t.Proj={},t.Proj._isProj4Obj=function(t){return void 0!==t.inverse&&void 0!==t.forward},t.Proj.Projection=t.Class.extend({initialize:function(e,i,o){var n=t.Proj._isProj4Obj(e);this._proj=n?e:this._projFromCodeDef(e,i),this.bounds=n?i:o},project:function(e){var i=this._proj.forward([e.lng,e.lat]);return new t.Point(i[0],i[1])},unproject:function(e,i){var o=this._proj.inverse([e.x,e.y]);return new t.LatLng(o[1],o[0],i)},_projFromCodeDef:function(t,i){if(i)e.defs(t,i);else if(void 0===e.defs[t]){var o=t.split(":");if(o.length>3&&(t=o[o.length-3]+":"+o[o.length-1]),void 0===e.defs[t])throw"No projection definition for code "+t}return e(t)}}),t.Proj.CRS=t.Class.extend({includes:t.CRS,options:{transformation:new t.Transformation(1,0,-1,0)},initialize:function(e,i,o){var n,s,a,r;if(t.Proj._isProj4Obj(e)?(n=(s=e).srsCode,r=i||{},this.projection=new t.Proj.Projection(s,r.bounds)):(n=e,a=i,r=o||{},this.projection=new t.Proj.Projection(n,a,r.bounds)),t.Util.setOptions(this,r),this.code=n,this.transformation=this.options.transformation,this.options.origin&&(this.transformation=new t.Transformation(1,-this.options.origin[0],-1,this.options.origin[1])),this.options.scales)this._scales=this.options.scales;else if(this.options.resolutions){this._scales=[];for(var l=this.options.resolutions.length-1;l>=0;l--)this.options.resolutions[l]&&(this._scales[l]=1/this.options.resolutions[l])}this.infinite=!this.options.bounds},scale:function(t){var e,i=Math.floor(t);return t===i?this._scales[t]:(e=this._scales[i])+(this._scales[i+1]-e)*(t-i)},zoom:function(t){var e,i,o=this._closestElement(this._scales,t),n=this._scales.indexOf(o);return t===o?n:void 0===o?-1/0:(i=n+1,void 0===(e=this._scales[i])?1/0:(t-o)/(e-o)+n)},distance:t.CRS.Earth.distance,R:t.CRS.Earth.R,_closestElement:function(t,e){for(var i,o=t.length;o--;)t[o]<=e&&(void 0===i||i<t[o])&&(i=t[o]);return i}}),t.Proj.GeoJSON=t.GeoJSON.extend({initialize:function(e,i){this._callLevel=0,t.GeoJSON.prototype.initialize.call(this,e,i)},addData:function(e){var i;e&&(e.crs&&"name"===e.crs.type?i=new t.Proj.CRS(e.crs.properties.name):e.crs&&e.crs.type&&(i=new t.Proj.CRS(e.crs.type+":"+e.crs.properties.code)),void 0!==i&&(this.options.coordsToLatLng=function(e){var o=t.point(e[0],e[1]);return i.projection.unproject(o)})),this._callLevel++;try{t.GeoJSON.prototype.addData.call(this,e)}finally{this._callLevel--,0===this._callLevel&&delete this.options.coordsToLatLng}}}),t.Proj.geoJson=function(e,i){return new t.Proj.GeoJSON(e,i)},t.Proj.ImageOverlay=t.ImageOverlay.extend({initialize:function(e,i,o){t.ImageOverlay.prototype.initialize.call(this,e,null,o),this._projectedBounds=i},_animateZoom:function(e){var i=this._map.getZoomScale(e.zoom),o=t.point(this._projectedBounds.min.x,this._projectedBounds.max.y),n=this._projectedToNewLayerPoint(o,e.zoom,e.center);t.DomUtil.setTransform(this._image,n,i)},_reset:function(){var e=this._map.getZoom(),i=this._map.getPixelOrigin(),o=t.bounds(this._transform(this._projectedBounds.min,e)._subtract(i),this._transform(this._projectedBounds.max,e)._subtract(i)),n=o.getSize();t.DomUtil.setPosition(this._image,o.min),this._image.style.width=n.x+"px",this._image.style.height=n.y+"px"},_projectedToNewLayerPoint:function(t,e,i){var o=this._map.getSize()._divideBy(2),n=this._map.project(i,e)._subtract(o)._round().add(this._map._getMapPanePos());return this._transform(t,e)._subtract(n)},_transform:function(t,e){var i=this._map.options.crs,o=i.transformation,n=i.scale(e);return o.transform(t,n)}}),t.Proj.imageOverlay=function(e,i,o){return new t.Proj.ImageOverlay(e,i,o)},t.Proj})?o.apply(e,n):o)||(t.exports=s)},function(t,e,i){"use strict";i.r(e);var o={isLoaded:!1,get:function(t){if(""!==t&&null!=t){var e=t.split(":");if(2===e.length){var i=e[0],o=e[1];if(this.hasOwnProperty(i)&&this[i].hasOwnProperty(o))return this[i][o]}}},exist:function(t){if(""===t||null==t)return!1;var e=t.split(":");if(2!==e.length)return!1;var i=e[0],o=e[1];return!!this.hasOwnProperty(i)&&!!this[i].hasOwnProperty(o)},load:function(t){if(!this.isLoaded){for(var e=["IGNF","EPSG","CRS"],i=0;i<e.length;i++){var o=e[i],n=this[o];for(var s in n)if(n.hasOwnProperty(s)){var a=o+":"+s;t.defs(a,this.get(a))}}this.isLoaded=!0}},loadByDefault:function(t){var e={EPSG:{2154:o.EPSG[2154],27571:o.EPSG[27571],27572:o.EPSG[27572],27573:o.EPSG[27573],27574:o.EPSG[27574]},CRS:{84:o.CRS[84]},IGNF:{LAMB93:o.IGNF.LAMB93,LAMBE:o.IGNF.LAMBE,LAMB1:o.IGNF.LAMB1,LAMB2:o.IGNF.LAMB2,LAMB3:o.IGNF.LAMB3,LAMB4:o.IGNF.LAMB4,RGF93G:o.IGNF.RGF93G,WGS84G:o.IGNF.WGS84G}};for(var i in e)if(e.hasOwnProperty(i)){var n=e[i];for(var s in n)if(n.hasOwnProperty(s)){var a=i+":"+s;t.defs(a,n[s])}}},loadByName:function(t,e){if(!this.exist(e))return!1;try{t.defs(e,this.get(e))}catch(t){return!1}return!0},EPSG:{3857:"+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs",3785:"+title=WGS 84 / Pseudo-Mercator (deprecated) +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs",4149:"+title=CH1903 +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs ",4150:"+title=CH1903plus +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs ",4151:"+title=CHTRF95 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4171:"+title=RGF93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4230:"+title=ED50 +proj=longlat +ellps=intl +no_defs ",4235:"+title=Guyane Francaise +proj=longlat +ellps=intl +no_defs ",4258:"+title=ETRS89 +proj=longlat +ellps=GRS80 +no_defs ",4275:"+title=NTF +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +no_defs ",4322:"+title=WGS 72 +proj=longlat +ellps=WGS72 +no_defs ",4326:"+title=WGS 84 +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ",4467:"+proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",4470:"+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4471:"+proj=utm +zone=38 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",4474:"+proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs ",4558:"+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4559:"+proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",4621:"+title=Fort Marigot +proj=longlat +ellps=intl +towgs84=137,248,-430,0,0,0,0 +no_defs ",4622:"+title=Guadeloupe 1948 +proj=longlat +ellps=intl +no_defs ",4623:"+title=CSG67 +proj=longlat +ellps=intl +towgs84=-186,230,110,0,0,0,0 +no_defs ",4624:"+title=RGFG95 +proj=longlat +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +no_defs ",4625:"+title=Martinique 1938 +proj=longlat +ellps=intl +no_defs ",4626:"+title=Reunion 1947 +proj=longlat +ellps=intl +no_defs ",4627:"+title=RGR92 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4628:"+title=Tahiti 52 +proj=longlat +ellps=intl +towgs84=162,117,154,0,0,0,0 +no_defs ",4629:"+title=Tahaa 54 +proj=longlat +ellps=intl +no_defs ",4630:"+title=IGN72 Nuku Hiva +proj=longlat +ellps=intl +no_defs ",4632:"+title=Combani 1950 +proj=longlat +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +no_defs ",4633:"+title=IGN56 Lifou +proj=longlat +ellps=intl +no_defs ",4634:"+title=IGN72 Grand Terre +proj=longlat +ellps=intl +no_defs ",4637:"+title=Perroud 1950 +proj=longlat +ellps=intl +towgs84=325,154,172,0,0,0,0 +no_defs ",4638:"+title=Saint Pierre et Miquelon 1950 +proj=longlat +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +no_defs ",4640:"+title=RRAF 1991 +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs ",4641:"+title=IGN53 Mare +proj=longlat +ellps=intl +no_defs ",4645:"+title=RGNC 1991 +proj=longlat +ellps=intl +towgs84=0,0,0,0,0,0,0 +no_defs ",4687:"+proj=longlat +ellps=GRS80 +no_defs ",4662:"+title=IGN72 Grande Terre +proj=longlat +ellps=intl +no_defs ",4689:"+title=IGN63 Hiva Oa +proj=longlat +ellps=intl +no_defs ",4690:"+title=Tahiti 79 +proj=longlat +ellps=intl +no_defs ",4691:"+title=Moorea 87 +proj=longlat +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +no_defs ",4692:"+title=Maupiti 83 +proj=longlat +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +no_defs ",4698:"+title=IGN 1962 Kerguelen +proj=longlat +ellps=intl +towgs84=145,-187,103,0,0,0,0 +no_defs ",4749:"+title=RGNC91-93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4750:"+title=ST87 Ouvea +proj=longlat +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +no_defs ",4807:"+title=NTF (Paris) +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +no_defs ",2056:"+title=CH1903+ / LV95 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ",2154:"+title=RGF93 / Lambert-93 +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",2213:"+title=ETRS89 / TM 30 NE +proj=tmerc +lat_0=0 +lon_0=30 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs ",2969:"+title=Fort Marigot / UTM zone 20N +proj=utm +zone=20 +ellps=intl +towgs84=137,248,-430,0,0,0,0 +units=m +no_defs ",2970:"+title=Guadeloupe 1948 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs ",2971:"+title=CSG67 / UTM zone 22N +proj=utm +zone=22 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs ",2972:"+title=RGFG95 / UTM zone 22N +proj=utm +zone=22 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs ",2973:"+title=Martinique 1938 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs ",2975:"+title=RGR92 / UTM zone 40S +proj=utm +zone=40 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",2976:"+title=Tahiti 52 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=162,117,154,0,0,0,0 +units=m +no_defs ",2977:"+title=Tahaa 54 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +units=m +no_defs ",2978:"+title=IGN72 Nuku Hiva / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs ",2980:"+title=Combani 1950 / UTM zone 38S +proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs ",2981:"+title=IGN56 Lifou / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",2982:"+title=IGN72 Grand Terre / UTM zone 58S (deprecated) +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",2984:"+title=RGNC 1991 / Lambert New Caledonia (deprecated) +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=intl +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",2986:"+title=Terre Adelie 1950 +proj=stere +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +lat_ts=-67.000000000 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs",2987:"+title=Saint Pierre et Miquelon 1950 / UTM zone 21N +proj=utm +zone=21 +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +units=m +no_defs ",2989:"+title=RRAF 1991 / UTM zone 20N +proj=utm +zone=20 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",2990:"+title=Reunion 1947 / TM Reunion (deprecated) +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=50000 +y_0=160000 +ellps=intl +units=m +no_defs ",2995:"+title=IGN53 Mare / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",3038:"+proj=utm +zone=26 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3039:"+proj=utm +zone=27 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3040:"+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3041:"+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3045:"+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3046:"+proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3047:"+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3048:"+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3049:"+proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3050:"+proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3051:"+proj=utm +zone=39 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3034:"+title=ETRS89 / ETRS-LCC +proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +units=m +no_defs ",3035:"+title=ETRS89 / ETRS-LAEA +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs ",3042:"+title=ETRS89 / ETRS-TM30 +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs ",3043:"+title=ETRS89 / ETRS-TM31 +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs ",3044:"+title=ETRS89 / ETRS-TM32 +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs ",25828:"+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25829:"+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25833:"+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25834:"+proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25835:"+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25836:"+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25837:"+proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25838:"+proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3060:"+title=IGN72 Grande Terre / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",3163:"+title=RGNC91-93 / Lambert New Caledonia +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3164:"+title=ST87 Ouvea / UTM zone 58S +proj=utm +zone=58 +south +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +units=m +no_defs ",3165:"+title=NEA74 Noumea / Noumea Lambert +proj=lcc +lat_1=-22.24469175 +lat_2=-22.29469175 +lat_0=-22.26969175 +lon_0=166.44242575 +x_0=0.66 +y_0=1.02 +ellps=intl +units=m +no_defs ",3166:"+title=NEA74 Noumea / Noumea Lambert 2 +proj=lcc +lat_1=-22.24472222222222 +lat_2=-22.29472222222222 +lat_0=-22.26972222222222 +lon_0=166.4425 +x_0=8.313000000000001 +y_0=-2.354 +ellps=intl +units=m +no_defs ",3169:"+title=RGNC91-93 / UTM zone 57S +proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3170:"+title=RGNC91-93 / UTM zone 58S +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3171:"+title=RGNC91-93 / UTM zone 59S +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3172:"+title=IGN53 Mare / UTM zone 59S +proj=utm +zone=59 +south +ellps=intl +units=m +no_defs ",3296:"+title=RGPF / UTM zone 5S +proj=utm +zone=5 +south +ellps=GRS80 +units=m +no_defs ",3297:"+title=RGPF / UTM zone 6S +proj=utm +zone=6 +south +ellps=GRS80 +units=m +no_defs ",3298:"+title=RGPF / UTM zone 7S +proj=utm +zone=7 +south +ellps=GRS80 +units=m +no_defs ",3299:"+title=RGPF / UTM zone 8S +proj=utm +zone=8 +south +ellps=GRS80 +units=m +no_defs ",3302:"+title=IGN63 Hiva Oa / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs ",3303:"+title=Fatu Iva 72 / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +towgs84=347.103,1078.12,2623.92,-33.8875,70.6773,-9.3943,186.074 +units=m +no_defs ",3304:"+title=Tahiti 79 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +units=m +no_defs ",3305:"+title=Moorea 87 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +units=m +no_defs ",3306:"+title=Maupiti 83 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +units=m +no_defs ",3312:"+title=CSG67 / UTM zone 21N +proj=utm +zone=21 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs ",3313:"+title=RGFG95 / UTM zone 21N +proj=utm +zone=21 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs ",3336:"+title=IGN 1962 Kerguelen / UTM zone 42S +proj=utm +zone=42 +south +ellps=intl +towgs84=145,-187,103,0,0,0,0 +units=m +no_defs ",3395:"+title=WGS 84 / World Mercator +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",3727:"+title=Reunion 1947 / TM Reunion +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=160000 +y_0=50000 +ellps=intl +units=m +no_defs ",21781:"+title=CH1903 / LV03 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ",25830:"+title=ETRS89 / UTM zone 30N +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs ",25831:"+title=ETRS89 / UTM zone 31N +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs ",25832:"+title=ETRS89 / UTM zone 32N +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs ",27561:"+title=NTF (Paris) / Lambert Nord France +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27562:"+title=NTF (Paris) / Lambert Centre France +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27563:"+title=NTF (Paris) / Lambert Sud France +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27564:"+title=NTF (Paris) / Lambert Corse +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27571:"+title=NTF (Paris) / Lambert zone I +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27572:"+title=NTF (Paris) / Lambert zone II +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27573:"+title=NTF (Paris) / Lambert zone III +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27574:"+title=NTF (Paris) / Lambert zone IV +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27581:"+title=NTF (Paris) / France I (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27582:"+title=NTF (Paris) / France II (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27583:"+title=NTF (Paris) / France III (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27584:"+title=NTF (Paris) / France IV (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27591:"+title=NTF (Paris) / Nord France (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27592:"+title=NTF (Paris) / Centre France (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27593:"+title=NTF (Paris) / Sud France (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27594:"+title=NTF (Paris) / Corse (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",32601:"+proj=utm +zone=1 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32602:"+proj=utm +zone=2 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32603:"+proj=utm +zone=3 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32604:"+proj=utm +zone=4 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32605:"+proj=utm +zone=5 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32606:"+proj=utm +zone=6 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32607:"+proj=utm +zone=7 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32608:"+proj=utm +zone=8 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32609:"+proj=utm +zone=9 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32610:"+proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32611:"+proj=utm +zone=11 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32612:"+proj=utm +zone=12 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32613:"+proj=utm +zone=13 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32614:"+proj=utm +zone=14 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32615:"+proj=utm +zone=15 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32616:"+proj=utm +zone=16 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32617:"+proj=utm +zone=17 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32618:"+proj=utm +zone=18 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32619:"+proj=utm +zone=19 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32620:"+proj=utm +zone=20 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32621:"+proj=utm +zone=21 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32622:"+proj=utm +zone=22 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32623:"+proj=utm +zone=23 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32624:"+proj=utm +zone=24 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32625:"+proj=utm +zone=25 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32626:"+proj=utm +zone=26 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32627:"+proj=utm +zone=27 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32628:"+proj=utm +zone=28 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32629:"+proj=utm +zone=29 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32630:"+proj=utm +zone=30 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32631:"+proj=utm +zone=31 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32632:"+proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32633:"+proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32634:"+proj=utm +zone=34 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32635:"+proj=utm +zone=35 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32636:"+proj=utm +zone=36 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32637:"+proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32638:"+proj=utm +zone=38 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32639:"+proj=utm +zone=39 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32640:"+proj=utm +zone=40 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32641:"+proj=utm +zone=41 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32642:"+proj=utm +zone=42 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32643:"+proj=utm +zone=43 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32644:"+proj=utm +zone=44 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32645:"+proj=utm +zone=45 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32646:"+proj=utm +zone=46 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32647:"+proj=utm +zone=47 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32648:"+proj=utm +zone=48 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32649:"+proj=utm +zone=49 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32650:"+proj=utm +zone=50 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32651:"+proj=utm +zone=51 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32652:"+proj=utm +zone=52 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32653:"+proj=utm +zone=53 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32654:"+proj=utm +zone=54 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32655:"+proj=utm +zone=55 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32656:"+proj=utm +zone=56 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32657:"+proj=utm +zone=57 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32658:"+proj=utm +zone=58 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32659:"+proj=utm +zone=59 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32660:"+proj=utm +zone=60 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32661:"+proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32662:"+title=WGS 84 / Plate Carree +proj=eqc +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32701:"+proj=utm +zone=1 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32702:"+proj=utm +zone=2 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32703:"+proj=utm +zone=3 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32704:"+proj=utm +zone=4 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32705:"+proj=utm +zone=5 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32706:"+proj=utm +zone=6 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32707:"+proj=utm +zone=7 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32708:"+proj=utm +zone=8 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32709:"+proj=utm +zone=9 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32710:"+proj=utm +zone=10 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32711:"+proj=utm +zone=11 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32712:"+proj=utm +zone=12 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32713:"+proj=utm +zone=13 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32714:"+proj=utm +zone=14 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32715:"+proj=utm +zone=15 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32716:"+proj=utm +zone=16 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32717:"+proj=utm +zone=17 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32718:"+proj=utm +zone=18 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32719:"+proj=utm +zone=19 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32720:"+proj=utm +zone=20 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32721:"+proj=utm +zone=21 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32722:"+proj=utm +zone=22 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32723:"+proj=utm +zone=23 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32724:"+proj=utm +zone=24 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32725:"+proj=utm +zone=25 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32726:"+proj=utm +zone=26 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32727:"+proj=utm +zone=27 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32728:"+proj=utm +zone=28 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32729:"+proj=utm +zone=29 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32730:"+proj=utm +zone=30 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32731:"+proj=utm +zone=31 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32732:"+proj=utm +zone=32 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32733:"+proj=utm +zone=33 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32734:"+proj=utm +zone=34 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32735:"+proj=utm +zone=35 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32736:"+proj=utm +zone=36 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32737:"+proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32738:"+proj=utm +zone=38 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32739:"+proj=utm +zone=39 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32740:"+proj=utm +zone=40 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32741:"+proj=utm +zone=41 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32742:"+proj=utm +zone=42 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32743:"+proj=utm +zone=43 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32744:"+proj=utm +zone=44 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32745:"+proj=utm +zone=45 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32746:"+proj=utm +zone=46 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32747:"+proj=utm +zone=47 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32748:"+proj=utm +zone=48 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32749:"+proj=utm +zone=49 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32750:"+proj=utm +zone=50 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32751:"+proj=utm +zone=51 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32752:"+proj=utm +zone=52 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32753:"+proj=utm +zone=53 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32754:"+proj=utm +zone=54 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32755:"+proj=utm +zone=55 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32756:"+proj=utm +zone=56 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32757:"+proj=utm +zone=57 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32758:"+proj=utm +zone=58 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32759:"+proj=utm +zone=59 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32760:"+proj=utm +zone=60 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32761:"+proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",310024802:"+title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310915814:"+title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310486805:"+title=Geoportail - Guyane +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310700806:"+title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310702807:"+title=Geoportail - Mayotte +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310706808:"+title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310547809:"+title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642810:"+title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310032811:"+title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642812:"+title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-49.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642801:"+title=Geoportail - Crozet +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642813:"+title=Geoportail - Amsterdam et Saint-Paul +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-38.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642901:"+title=Geoportail - Monde +proj=mill +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",5489:"+title=RGAF09 geographiques (dms) +proj=longlat +nadgrids=@null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137 +rf=298.257222101 +units=m +no_defs",5490:"+title=RGAF09 UTM Nord Fuseau 20 +proj=tmerc +nadgrids=@null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137 +rf=298.257222101 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs"},CRS:{84:"+title=WGS 84 longitude-latitude +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs "},IGNF:{AMST63GEO:"+title=Amsterdam 1963 +proj=longlat +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",CROZ63GEO:"+title=Crozet 1963 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",CSG67GEO:"+title=Guyane CSG67 +proj=longlat +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",ED50G:"+title=ED50 +proj=longlat +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",GUAD48GEO:"+title=Guadeloupe Ste Anne +proj=longlat +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",GUADFM49GEO:"+title=Guadeloupe Fort Marigot +proj=longlat +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",IGN63GEO:"+title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=longlat +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",IGN72GEO:"+title=IGN 1972 Grande-Terre / Ile des Pins +proj=longlat +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",KERG62GEO:"+title=Kerguelen - K0 +proj=longlat +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MART38GEO:"+title=Martinique Fort-Desaix +proj=longlat +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MAYO50GEO:"+title=Mayotte Combani +proj=longlat +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MOOREA87GEO:"+title=Moorea 1987 +proj=longlat +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",NTFG:"+title=Nouvelle Triangulation Francaise Greenwich degres sexagesimaux +proj=longlat +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs",NTFP:"+title=Nouvelle Triangulation Francaise Paris grades +proj=longlat +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +units=m +no_defs",NUKU72GEO:"+title=IGN 1972 Nuku Hiva +proj=longlat +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",REUN47GEO:"+title=Reunion 1947 +proj=longlat +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",RGF93G:"+title=Reseau geodesique francais 1993 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGFG95GEO:"+title=Reseau geodesique francais de Guyane 1995 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGM04GEO:"+title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGNCGEO:"+title=Reseau Geodesique de Nouvelle-Caledonie +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGPFGEO:"+title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGR92GEO:"+title=Reseau geodesique de la Reunion 1992 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGSPM06GEO:"+title=Saint-Pierre-et-Miquelon (2006) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGTAAF07G:"+title=Reseau Geodesique des TAAF (2007) (dms) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",STPL69GEO:"+title=Saint-Paul 1969 +proj=longlat +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",STPM50GEO:"+title=St Pierre et Miquelon 1950  +proj=longlat +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs",TAHAAGEO:"+title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=longlat +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",TAHI79GEO:"+title=IGN79 (Tahiti) Iles de la Societe +proj=longlat +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",TERA50G:"+title=Pointe Geologie - Perroud 1950 +proj=longlat +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",WALL78GEO:"+title=Wallis - Uvea 1978 (MOP78) +proj=longlat +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",WGS72G:"+title=WGS72 +proj=longlat +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs",WGS84G:"+title=World Geodetic System 1984 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",WGS84RRAFGEO:"+title=Reseau de reference des Antilles francaises (1988-1991) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",XGEO:"+title=Systeme CIO-BIH +proj=longlat +towgs84=0.0000,0.0000,0.5000,0.0000,0.0000,0.0140,-0.100000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",AMST63UTM43S:"+title=Amsterdam 1963 UTM fuseau 43 Sud +proj=tmerc +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",CROZ63UTM39S:"+title=Crozet 1963 +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",CSG67UTM21:"+title=Guyane CSG67 UTM fuseau 21 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",CSG67UTM22:"+title=Guyane CSG67 UTM fuseau 22 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",GEOPORTALANF:"+title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALASP:"+title=Geoportail - Amsterdam et Saint-Paul +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-38.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALCRZ:"+title=Geoportail - Crozet +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALFXX:"+title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALGUF:"+title=Geoportail - Guyane +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALKER:"+title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-49.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALMYT:"+title=Geoportail - Mayotte +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALNCL:"+title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALPYF:"+title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALREU:"+title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALSPM:"+title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALWLF:"+title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GUAD48UTM20:"+title=Guadeloupe Ste Anne +proj=tmerc +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",GUADFM49U20:"+title=Guadeloupe Fort Marigot  +proj=tmerc +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",IGN63UTM7S:"+title=IGN 1963 - Hiva Oa, Tahuata, Mohotani - UTM fuseau 7 Sud +proj=tmerc +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",IGN72UTM58S:"+title=IGN 1972 - UTM fuseau 58 Sud +proj=tmerc +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",KERG62UTM42S:"+title=Kerguelen 1962 +proj=tmerc +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",LAMB1:"+title=Lambert I +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs",LAMB1C:"+title=Lambert I Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=1200000.000 +units=m +no_defs",LAMB2:"+title=Lambert II +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs",LAMB2C:"+title=Lambert II Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs",LAMB3:"+title=Lambert III +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs",LAMB3C:"+title=Lambert III Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=3200000.000 +units=m +no_defs",LAMB4:"+title=Lambert IV +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=185861.369 +units=m +no_defs",LAMB4C:"+title=Lambert IV Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=4185861.369 +units=m +no_defs",LAMB93:"+title=Lambert 93 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.500000000 +lon_0=3.000000000 +lat_1=44.000000000 +lat_2=49.000000000 +x_0=700000.000 +y_0=6600000.000 +units=m +no_defs",RGF93CC42:"+title=Lambert conique conforme Zone 1 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=42.000000000 +lon_0=3.000000000 +lat_1=41.200000000 +lat_2=42.800000000 +x_0=1700000.000 +y_0=1200000.000 +units=m +no_defs",RGF93CC43:"+title=Lambert conique conforme Zone 2 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=43.000000000 +lon_0=3.000000000 +lat_1=42.200000000 +lat_2=43.800000000 +x_0=1700000.000 +y_0=2200000.000 +units=m +no_defs",RGF93CC44:"+title=Lambert conique conforme Zone 3 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=44.000000000 +lon_0=3.000000000 +lat_1=43.200000000 +lat_2=44.800000000 +x_0=1700000.000 +y_0=3200000.000 +units=m +no_defs",RGF93CC45:"+title=Lambert conique conforme Zone 4 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=45.000000000 +lon_0=3.000000000 +lat_1=44.200000000 +lat_2=45.800000000 +x_0=1700000.000 +y_0=4200000.000 +units=m +no_defs",RGF93CC46:"+title=Lambert conique conforme Zone 5 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.000000000 +lon_0=3.000000000 +lat_1=45.200000000 +lat_2=46.800000000 +x_0=1700000.000 +y_0=5200000.000 +units=m +no_defs",RGF93CC47:"+title=Lambert conique conforme Zone 6 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=47.000000000 +lon_0=3.000000000 +lat_1=46.200000000 +lat_2=47.800000000 +x_0=1700000.000 +y_0=6200000.000 +units=m +no_defs",RGF93CC48:"+title=Lambert conique conforme Zone 7 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=48.000000000 +lon_0=3.000000000 +lat_1=47.200000000 +lat_2=48.800000000 +x_0=1700000.000 +y_0=7200000.000 +units=m +no_defs",RGF93CC49:"+title=Lambert conique conforme Zone 8 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=49.000000000 +lon_0=3.000000000 +lat_1=48.200000000 +lat_2=49.800000000 +x_0=1700000.000 +y_0=8200000.000 +units=m +no_defs",RGF93CC50:"+title=Lambert conique conforme Zone 9 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=50.000000000 +lon_0=3.000000000 +lat_1=49.200000000 +lat_2=50.800000000 +x_0=1700000.000 +y_0=9200000.000 +units=m +no_defs",LAMBE:"+title=Lambert II etendu +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs",MART38UTM20:"+title=Martinique Fort-Desaix +proj=tmerc +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",MAYO50UTM38S:"+title=Mayotte Combani +proj=tmerc +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",MILLER:"+title=Geoportail - Monde +proj=mill +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",MOOREA87U6S:"+title=Moorea 1987 - UTM fuseau 6 Sud +proj=tmerc +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",NUKU72U7S:"+title=IGN 1972 Nuku Hiva - UTM fuseau 7 Sud +proj=tmerc +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGM04UTM38S:"+title=UTM fuseau 38 Sud (Reseau Geodesique de Mayotte 2004) +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGNCUTM57S:"+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 57 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=159.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGNCUTM58S:"+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 58 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGNCUTM59S:"+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 59 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=171.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGPFUTM5S:"+title=RGPF - UTM fuseau 5 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGPFUTM6S:"+title=RGPF - UTM fuseau 6 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGPFUTM7S:"+title=RGPF - UTM fuseau 7 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGR92UTM40S:"+title=RGR92 UTM fuseau 40 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGSPM06U21:"+title=Saint-Pierre-et-Miquelon (2006) UTM Fuseau 21 Nord +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",STPL69UTM43S:"+title=Saint-Paul 1969 UTM fuseau 43 Sud +proj=tmerc +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",STPM50UTM21:"+title=St Pierre et Miquelon 1950 +proj=tmerc +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",TAHAAUTM05S:"+title=Tahaa 1951 +proj=tmerc +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",TAHI51UTM06S:"+title=Tahiti-Terme Nord UTM fuseau 6 Sud +proj=tmerc +towgs84=162.0000,117.0000,154.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",TAHI79UTM6S:"+title=Tahiti 1979 +proj=tmerc +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",TERA50STEREO:"+title=Terre Adelie 1950 +proj=stere +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +lat_ts=-67 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs",UTM01SW84:"+title=World Geodetic System 1984 UTM fuseau 01 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",UTM20W84GUAD:"+title=World Geodetic System 1984 UTM fuseau 20 Nord-Guadeloupe +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM20W84MART:"+title=World Geodetic System 1984 UTM fuseau 20 Nord-Martinique +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM22RGFG95:"+title=RGFG95 UTM fuseau 22 Nord-Guyane +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM39SW84:"+title=World Geodetic System 1984 UTM fuseau 39 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",UTM42SW84:"+title=World Geodetic System 1984 UTM fuseau 42 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",UTM43SW84:"+title=World Geodetic System 1984 UTM fuseau 43 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",WALL78UTM1S:"+title=Wallis-Uvea 1978 (MOP78) UTM 1 SUD +proj=tmerc +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",ETRS89GEO:"+title=ETRS89 geographiques (dms) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",ETRS89LAEA:"+title=ETRS89 Lambert Azimutal Equal Area +proj=laea +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=52.000000000 +lon_0=10.000000000 +x_0=4321000.000 +y_0=3210000.000 +units=m +no_defs",ETRS89LCC:"+title=ETRS89 Lambert Conformal Conic +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=52.000000000 +lon_0=9.999999995 +lat_1=35.000000000 +lat_2=65.000000000 +x_0=4000000.000 +y_0=2800000.000 +units=m +no_defs",UTM26ETRS89:"+title=Europe - de 30d a 24d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-27.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM27ETRS89:"+title=Europe - de 24d a 18d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-21.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM28ETRS89:"+title=Europe - de 18d a 12d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-15.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM29ETRS89:"+title=Europe - de 12d a 6d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-9.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM30ETRS89:"+title=Europe - de -6d a 0d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-3.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM31ETRS89:"+title=Europe - de 0d a 6d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=3.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM32ETRS89:"+title=Europe - de 6d a 12d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=9.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM33ETRS89:"+title=Europe - de 12d a 18d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=15.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM34ETRS89:"+title=Europe - de 18d a 24d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=21.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM35ETRS89:"+title=Europe - de 24d a 30d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=27.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM36ETRS89:"+title=Europe - de 30d a 36d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=33.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM37ETRS89:"+title=Europe - de 36d a 42d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=39.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM38ETRS89:"+title=Europe - de 42d a 48d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs"}};e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(2),n=i.n(o),s=i(141),a=i(154),r={instance:null,build:function(){if(!this.instance){var t=new n.a.Proj.CRS("EPSG:2154",a.default.get("EPSG:2154"),{resolutions:this._getResolutions(),origin:this._getOrigin()});this.instance=t}return this.instance},_getResolutions:function(){var t=[];s.default.isConfigLoaded()&&(t=s.default.getTileMatrix("LAMB93").nativeResolutions);return t.length?t:[104579.22454989408,52277.53235379051,26135.487078595408,13066.891381800004,6533.228604113456,3266.5595244626675,1633.2660045974187,816.6295549860224,408.31391467683596,204.15674151090204,102.07831678324082,51.0391448966112,25.519569074269395,12.759783693647506,6.379891635966491,3.18994576530532,1.5949728694977277,.7974864315474559,.398743214900604,.19937160727567999,.099685803696052,.049842901818919996]},_getOrigin:function(){return[0,12e6]}};e.default=r},function(t,e,i){"use strict";i.r(e);var o=i(2),n=i.n(o),s=i(141),a=i(154),r={instance:null,build:function(){if(!this.instance){var t=new n.a.Proj.CRS("EPSG:27572",a.default.get("EPSG:27572"),{resolutions:this._getResolutions(),origin:this._getOrigin()});this.instance=t}return this.instance},_getResolutions:function(){var t=[];if(s.default.isConfigLoaded()){var e=s.default.getTileMatrix("LAMB2E");e&&Object.keys(e)&&(t=e.nativeResolutions)}return t.length?t:[104579.22454989408,52277.53235379051,26135.487078595408,13066.891381800004,6533.228604113456,3266.5595244626675,1633.2660045974187,816.6295549860224,408.31391467683596,204.15674151090204,102.07831678324082,51.0391448966112,25.519569074269395,12.759783693647506,6.379891635966491,3.18994576530532,1.5949728694977277,.7974864315474559,.398743214900604,.19937160727567999,.099685803696052,.049842901818919996]},_getOrigin:function(){return[0,12e6]}};e.default=r},function(t,e,i){"use strict";i.r(e);var o=i(2),n=i.n(o),s=i(141),a=i(154),r={instance:null,build:function(){if(!this.instance){var t=new n.a.Proj.CRS("EPSG:4326",a.default.get("EPSG:4326"),{resolutions:this._getResolutions(),origin:[-180,90]});this.instance=t}return this.instance},_getResolutions:function(){var t=[];return s.default.isConfigLoaded()&&(t=s.default.getResolutions()),t.length?t:[1.40625,.703125,.3515625,.17578125,.087890625,.0439453125,.02197265625,.010986328125,.0054931640625,.00274658203125,.001373291015625,.0006866455078125,.00034332275390625,.000171661376953126,858306884765628e-19,429153442382813e-19,214576721191407e-19,107288360595703e-19,536441802978517e-20,268220901489259e-20,13411045074463e-19,6.70552253723145e-7,3.3527612686157e-7]},_getOrigin:function(){}};e.default=r},function(t,e,i){"use strict";i.r(e);var o=i(40),n=i(2),s=i.n(n),a=(i(159),i(34)),r=i(140),l=i(36),c=i(145),u=i(160),h=a.default.getLogger("reversegeocoding"),d=s.a.Control.extend({includes:u.default,options:{position:"bottomleft",collapsed:!0,resources:["StreetAddress","PositionOfInterest"],delimitations:["Point","Circle","Extent"],reverseGeocodeOptions:{}},initialize:function(t){s.a.Util.extend(this.options,t),this._noRightManagement=!1,this._servicesRightManagement={},this._checkRightsManagement(),this._checkInputOptions(),this._uid=l.default.generate(),this._currentGeocodingType=null,this._initGeocodingType(),this._currentGeocodingDelimitation=null,this._initGeocodingDelimitation(),this._showReverseGeocodingContainer=null,this._panelHeaderContainer=null,this._panelTitleContainer=null,this._returnPictoContainer=null,this._formContainer=null,this._resultsContainer=null,this._resultsListContainer=null,this._waitingContainer=null,this._inputFeaturesLayer=null,this._inputResultsLayer=null,this._lastIdLayer=0,this._currentIdLayer=0,this._currentFeature=null,this._requestPosition=null,this._requestCircleFilter=null,this._requestBboxFilter=null,this._waiting=!1,this._timer=null,this._reverseGeocodingLocations=[]},onAdd:function(t){var e=this._container=this._initLayout();return s.a.DomEvent.disableClickPropagation(e).disableScrollPropagation(e),t&&(this.options.collapsed||this._activateMapInteraction(t)),e},onRemove:function(t){this._clearLocations(),this._clearLocationsFeature(t),this._clearInputRequest(),this._removeMapInteraction(t)},_checkRightsManagement:function(){var t,e,i=[];t=this.options.reverseGeocodeOptions.apiKey,(i=(e=this.options.reverseGeocodeOptions.filterOptions)?e.type:[])&&0!==i.length||(i=this.options.resources),i&&0!==i.length||(i=["StreetAddress","PositionOfInterest"]);var o=r.default.check({key:t||this.options.apiKey,resources:i,services:["Geocode"]});h.log("rightManagementGeocode",o),o?(this.options.apiKey||(this.options.apiKey=o.key),o&&(this._servicesRightManagement.Geocode=o.Geocode)):this._noRightManagement=!0},_checkInputOptions:function(){var t;if(this.options.resources){var e=this.options.resources;Array.isArray(e)||(h.log("[ReverseGeocoding] 'options.resources' parameter should be an array"),e=null);var i=["StreetAddress","PositionOfInterest","CadastralParcel","Administratif"];for(t=0;t<e.length;t++)-1===i.indexOf(e[t])&&h.log("[ReverseGeocoding] options.resources : "+e[t]+" is not a resource for reverse geocode")}if(this.options.delimitations){var o=this.options.delimitations;Array.isArray(o)||(h.log("[ReverseGeocoding] 'options.delimitations' parameter should be an array"),o=null);var n=["Circle","Point","Extent"];for(t=0;t<o.length;t++)-1===n.indexOf(o[t])&&h.log("[ReverseGeocoding] options.delimitations : "+o[t]+" is not a delimitation for reverse geocode")}},_initGeocodingType:function(){this._currentGeocodingType="StreetAddress";var t=this.options.resources;if(t&&0!==t.length||(this.options.resources=["StreetAddress","PositionOfInterest","CadastralParcel"]),Array.isArray(t)&&t.length){for(var e=[],i=0;i<t.length;i++)this._servicesRightManagement.Geocode.indexOf(t[i])<0&&(e.push(i),h.log("[ReverseGeocode] no rights for options.resources : "+t[i]));if(0!==e.length)for(var o=0;o<e.length;o++)t.splice(e[o],1);"StreetAddress"!==t[0]&&"PositionOfInterest"!==t[0]&&"CadastralParcel"!==t[0]&&"Administratif"!==t[0]||(this._currentGeocodingType=t[0])}var n=this.options.reverseGeocodeOptions;n.filterOptions&&Array.isArray(n.filterOptions.type)&&0!==n.filterOptions.type.length&&(this._currentGeocodingType=n.filterOptions.type[0])},_initGeocodingDelimitation:function(){this._currentGeocodingDelimitation="Point";var t=this.options.delimitations;if(t&&0!==t.length||(this.options.delimitations=["Point","Circle","Extent"]),Array.isArray(t)&&t.length){var e=t[0].toLowerCase();"point"!==e&&"circle"!==e&&"extent"!==e||(this._currentGeocodingDelimitation=t[0])}},_initLayout:function(){var t=this._createMainContainerElement(),e=this._showReverseGeocodingContainer=this._createShowReverseGeocodingElement();t.appendChild(e),this.options.collapsed||(e.checked=!0);var i=this._createShowReverseGeocodingPictoElement();t.appendChild(i);var o=this._createReverseGeocodingPanelElement(),n=this._panelHeaderContainer=this._createReverseGeocodingPanelHeaderElement(),s=this._returnPictoContainer=this._createReverseGeocodingPanelReturnPictoElement();n.appendChild(s);var a=this._panelTitleContainer=this._createReverseGeocodingPanelTitleElement();n.appendChild(a);var r=this._createReverseGeocodingPanelCloseElement();n.appendChild(r),o.appendChild(n);var l=this._formContainer=this._createReverseGeocodingPanelFormElement();l.appendChild(this._createReverseGeocodingFormModeChoiceGeocodingTypeElement(this.options.resources)),l.appendChild(this._createReverseGeocodingFormModeChoiceGeocodingDelimitationElement(this.options.delimitations));var c=this._createReverseGeocodingSubmitFormElement();l.appendChild(c),o.appendChild(l);var u=this._waitingContainer=this._createReverseGeocodingWaitingElement();o.appendChild(u);var d=this._resultsContainer=this._createReverseGeocodingResultsPanelElement(),p=this._resultsListContainer=this._createReverseGeocodingResultsListElement();return d.appendChild(p),o.appendChild(d),t.appendChild(o),h.log(t),t},_activateMapInteraction:function(t){if(h.info("_activateMapInteraction()"),null===this._inputFeaturesLayer){this._inputFeaturesLayer=new s.a.FeatureGroup,t.addLayer(this._inputFeaturesLayer);var e=this;t.on("draw:created",(function(t){var i=t.layer,o=t.layerType;h.trace("draw:created"),e._setFeaturePosition(i,o),e._currentIdLayer=s.a.Util.stamp(i),e._setFeatureLayer(i)})),t.on("draw:drawstart",(function(){h.trace("draw:drawstart"),e._removeFeatureLayer(e._lastIdLayer),e._lastIdLayer=e._currentIdLayer})),t.on("draw:drawstop",(function(){h.trace("draw:drawstop")}))}switch(this._currentGeocodingDelimitation.toLowerCase()){case"point":this._activatePointInteraction(t);break;case"circle":this._activateCircleInteraction(t);break;case"extent":this._activateBoxInteraction(t)}},_removeMapInteraction:function(t){t&&(null!==this._inputFeaturesLayer&&(t.off("draw:created"),t.off("draw:drawstart"),t.off("draw:drawstop"),t.removeLayer(this._inputFeaturesLayer),this._inputFeaturesLayer=null),this._lastIdLayer=this._currentIdLayer=0,this._currentFeature&&this._currentFeature.disable())},_activatePointInteraction:function(t){h.info("_activatePointInteraction()"),this._currentFeature&&this._currentFeature.disable(),s.a.drawLocal.draw.handlers.marker.tooltip.start="click map to place search point";this._currentFeature=new s.a.Draw.Marker(t,{repeatMode:!0}),this._currentFeature.enable()},_activateCircleInteraction:function(t){h.info("_activateCircleInteraction()"),this._currentFeature&&this._currentFeature.disable();this._currentFeature=new s.a.Draw.Circle(t,{repeatMode:!0}),this._currentFeature.enable()},_activateBoxInteraction:function(t){h.info("_activateBoxInteraction()"),this._currentFeature&&this._currentFeature.disable();this._currentFeature=new s.a.Draw.Rectangle(t,{repeatMode:!0}),this._currentFeature.enable()},_setFeaturePosition:function(t,e){var i=null;if("marker"===e)i=t.getLatLng(),this._requestPosition={x:i.lat,y:i.lng};else if("circle"===e)i=t.getLatLng(),this._requestPosition={x:i.lat,y:i.lng},this._requestCircleFilter={x:i.lat,y:i.lng,radius:t.getRadius()};else if("rectangle"===e){var o={lng:((i=t.getBounds()).getSouthWest().lng+i.getNorthEast().lng)/2,lat:(i.getSouthWest().lat+i.getNorthEast().lat)/2};this._requestPosition={x:o.lat,y:o.lng},this._requestBboxFilter={left:i.getSouthWest().lat,right:i.getNorthEast().lat,bottom:i.getSouthWest().lng,top:i.getNorthEast().lng}}else h.warn("type gemetric not defined !?");h.log(i)},_setFeatureLayer:function(t){this._inputFeaturesLayer&&this._inputFeaturesLayer.addLayer(t)},_removeFeatureLayer:function(t){this._inputFeaturesLayer&&0!==t&&(t?this._inputFeaturesLayer.removeLayer(t):this._inputFeaturesLayer.clearLayers())},_reverseGeocodingRequest:function(t){var e=this._map;this._removeMapInteraction(e);var i={};s.a.Util.extend(i,this.options.reverseGeocodeOptions),s.a.Util.extend(i,t),s.a.Util.extend(i,{apiKey:this.options.apiKey,ssl:this.options.ssl,srs:"EPSG:4326",returnFreeForm:!1,timeOut:3e4,protocol:"XHR"});var n=i.filterOptions.type;"circle"===this._currentGeocodingDelimitation.toLowerCase()&&this._requestCircleFilter&&(this._requestCircleFilter.radius>1e3&&(h.log("INFO : initial circle radius ("+this._requestCircleFilter.radius+") limited to 1000m."),this._requestCircleFilter.radius=1e3),s.a.Util.extend(i,{filterOptions:{type:n,circle:this._requestCircleFilter}})),"extent"===this._currentGeocodingDelimitation.toLowerCase()&&this._requestBboxFilter&&s.a.Util.extend(i,{filterOptions:{type:n,bbox:this._requestBboxFilter}}),h.log("reverseGeocode request options : ",i),this._displayWaitingContainer(),o.default.Services.reverseGeocode(i)},_displayGeocodedLocations:function(t){var e=this._map;this._clearLocations(),this._clearLocationsFeature(e),this._reverseGeocodingLocations=t,t&&0!==t.length?(this._formContainer.className="GPreverseGeocodingComponentHidden",this._hideWaitingContainer(),this._panelTitleContainer.innerHTML="Résultats de la recherche",this._returnPictoContainer.className="",this._resultsContainer.className="GPpanel",this._fillGeocodedLocationListContainer(t),this._displayGeocodedLocationsOnMap(t),e.fitBounds(this._inputResultsLayer.getBounds())):this._clearInputRequest()},_fillGeocodedLocationListContainer:function(t){for(var e=0;e<t.length;e++){var i=t[e];h.log(i);var o=this._fillGeocodedLocationDescription(i);0!==o.length&&this._createReverseGeocodingResultElement(o,e)}},_fillGeocodedLocationDescription:function(t){if(t&&t.placeAttributes){var e=t.placeAttributes,i="";switch(t.type){case"StreetAddress":e.street&&(i+=e.number?e.number+" ":"",i+=e.street+", "),i+=e.postalCode+" "+e.commune;break;case"PositionOfInterest":"City"===t.matchType&&e.commune?(i+=e.commune,i+=e.postalCode?", "+e.postalCode:""):"Département"===t.matchType&&e.municipality?(i+=e.municipality,i+=e.postalCode?", "+e.postalCode:""):"Toponym"===t.matchType&&e.municipality?(i+=e.municipality,i+=e.postalCode?", "+e.postalCode:"",i+=e.commune?" "+e.commune:""):i+=e.municipality?e.municipality:"",i+=e.nature?" ("+e.nature+") ":"";break;case"CadastralParcel":i+=e.cadastralParcel?e.cadastralParcel:"",i+=e.municipality?" ("+e.municipality+")":"";break;case"Administratif":i+=e.municipality?e.municipality:"",e.inseeDepartment?i+="(Département)":e.inseeRegion&&(i+="(Région)");break;default:i+=e.municipality?e.municipality:""}return i}},_displayGeocodedLocationsOnMap:function(t){var e=this._map,i=this;function o(t){var e=t.target;e.setIcon(new c.default("red"));var o=s.a.DomUtil.get("ReverseGeocodedLocation_"+e.options.id+"-"+i._uid);s.a.DomUtil.addClass(o,"GPreverseGeocodedLocationHighlight"),o.scrollIntoView(!1)}function n(t){var e=t.target;e.setIcon(new c.default("green"));var o=s.a.DomUtil.get("ReverseGeocodedLocation_"+e.options.id+"-"+i._uid);s.a.DomUtil.removeClass(o,"GPreverseGeocodedLocationHighlight")}this._inputResultsLayer=new s.a.FeatureGroup,e.addLayer(this._inputResultsLayer);for(var a=0;a<t.length;a++){var r=t[a];if(r){var l={id:a,icon:new c.default("green"),riseOnHover:!0,draggable:!1,clickable:!0,zIndexOffset:1e3},u=s.a.marker(s.a.latLng(r.position.x,r.position.y),l),h="<ul>",d=r.placeAttributes;for(var p in d)d.hasOwnProperty(p)&&"bbox"!==p&&(h+="<li>",h+='<span class="gp-attname-others-span">'+p.toUpperCase()+" : </span>",h+=d[p],h+=" </li>");h+=" </ul>",u.bindPopup(h),u.on("mouseover",o),u.on("mouseout",n),this._inputResultsLayer.addLayer(u)}}},onShowReverseGeocodingClick:function(){var t=this._map;this._showReverseGeocodingContainer.checked?this._removeMapInteraction(t):this._waiting||this._reverseGeocodingLocations.length||this._activateMapInteraction(t)},onReverseGeocodingTypeChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;i&&(h.log(i),this._currentGeocodingType=i)},onReverseGeocodingDelimitationChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;if(i){h.log(i),this._currentGeocodingDelimitation=i,this._clearInputRequest();var o=this._map;this._removeMapInteraction(o),this._activateMapInteraction(o)}},onGPreverseGeocodingReturnPictoClick:function(){var t=this._map;this._clearLocations(),this._clearLocationsFeature(t),this._clearInputRequest(),this._activateMapInteraction(t)},onReverseGeocodingSubmit:function(){if(this._requestPosition){if(!this._noRightManagement){var t=this._map,e=this;this._reverseGeocodingRequest({position:e._requestPosition,filterOptions:{type:[e._currentGeocodingType]},onSuccess:function(t){if(h.log(t),t){var i=t.locations;e._displayGeocodedLocations(i),e._hideWaitingContainer()}},onFailure:function(i){e._hideWaitingContainer(),e._clearLocations(),e._clearLocationsFeature(t),e._clearInputRequest(),h.log(i.message)}})}}else h.log("missing position")},onReverseGeocodingResultClick:function(t){h.log("onReverseGeocodingResultClick",t)},onReverseGeocodingResultMouseOver:function(t){var e=l.default.index(t.target.id);t.target.classList&&t.target.classList.add("GPreverseGeocodedLocationHighlight"),this._inputResultsLayer&&this._inputResultsLayer.eachLayer((function(t){t.options.id===parseInt(e,10)&&t.fire("mouseover")}))},onReverseGeocodingResultMouseOut:function(t){var e=l.default.index(t.target.id);t.target.classList&&t.target.classList.remove("GPreverseGeocodedLocationHighlight"),this._inputResultsLayer&&this._inputResultsLayer.eachLayer((function(t){t.options.id===parseInt(e,10)&&t.fire("mouseout")}))},_clearLocations:function(){if(this._reverseGeocodingLocations=[],this._resultsListContainer)for(;this._resultsListContainer.firstChild;)this._resultsListContainer.removeChild(this._resultsListContainer.firstChild)},_clearLocationsFeature:function(t){null!==this._inputResultsLayer&&(t.removeLayer(this._inputResultsLayer),this._inputResultsLayer=null)},_clearInputRequest:function(){this._requestPosition=null,this._requestCircleFilter=null,this._requestBboxFilter=null},_displayWaitingContainer:function(){this._waitingContainer.className="GPreverseGeocodingCalcWaitingContainerVisible",this._waiting=!0,this._timer&&(clearTimeout(this._timer),this._timer=null);var t=this;this._timer=setTimeout((function(){!0===t._waiting?t._hideWaitingContainer():t._timer&&clearTimeout(t._timer)}),16e3)},_hideWaitingContainer:function(){this._waiting&&(this._waitingContainer.className="GPreverseGeocodingCalcWaitingContainerHidden",this._waiting=!1,clearTimeout(this._timer),this._timer=null)}});e.default=d},function(t,e){!function(t,e,i){var o;L.drawVersion="1.0.4",L.Draw={},L.drawLocal={draw:{toolbar:{actions:{title:"Cancel drawing",text:"Cancel"},finish:{title:"Finish drawing",text:"Finish"},undo:{title:"Delete last point drawn",text:"Delete last point"},buttons:{polyline:"Draw a polyline",polygon:"Draw a polygon",rectangle:"Draw a rectangle",circle:"Draw a circle",marker:"Draw a marker",circlemarker:"Draw a circlemarker"}},handlers:{circle:{tooltip:{start:"Click and drag to draw circle."},radius:"Radius"},circlemarker:{tooltip:{start:"Click map to place circle marker."}},marker:{tooltip:{start:"Click map to place marker."}},polygon:{tooltip:{start:"Click to start drawing shape.",cont:"Click to continue drawing shape.",end:"Click first point to close this shape."}},polyline:{error:"<strong>Error:</strong> shape edges cannot cross!",tooltip:{start:"Click to start drawing line.",cont:"Click to continue drawing line.",end:"Click last point to finish line."}},rectangle:{tooltip:{start:"Click and drag to draw rectangle."}},simpleshape:{tooltip:{end:"Release mouse to finish drawing."}}}},edit:{toolbar:{actions:{save:{title:"Save changes",text:"Save"},cancel:{title:"Cancel editing, discards all changes",text:"Cancel"},clearAll:{title:"Clear all layers",text:"Clear All"}},buttons:{edit:"Edit layers",editDisabled:"No layers to edit",remove:"Delete layers",removeDisabled:"No layers to delete"}},handlers:{edit:{tooltip:{text:"Drag handles or markers to edit features.",subtext:"Click cancel to undo changes."}},remove:{tooltip:{text:"Click on a feature to remove."}}}}},L.Draw.Event={},L.Draw.Event.CREATED="draw:created",L.Draw.Event.EDITED="draw:edited",L.Draw.Event.DELETED="draw:deleted",L.Draw.Event.DRAWSTART="draw:drawstart",L.Draw.Event.DRAWSTOP="draw:drawstop",L.Draw.Event.DRAWVERTEX="draw:drawvertex",L.Draw.Event.EDITSTART="draw:editstart",L.Draw.Event.EDITMOVE="draw:editmove",L.Draw.Event.EDITRESIZE="draw:editresize",L.Draw.Event.EDITVERTEX="draw:editvertex",L.Draw.Event.EDITSTOP="draw:editstop",L.Draw.Event.DELETESTART="draw:deletestart",L.Draw.Event.DELETESTOP="draw:deletestop",L.Draw.Event.TOOLBAROPENED="draw:toolbaropened",L.Draw.Event.TOOLBARCLOSED="draw:toolbarclosed",L.Draw.Event.MARKERCONTEXT="draw:markercontext",L.Draw=L.Draw||{},L.Draw.Feature=L.Handler.extend({initialize:function(t,e){this._map=t,this._container=t._container,this._overlayPane=t._panes.overlayPane,this._popupPane=t._panes.popupPane,e&&e.shapeOptions&&(e.shapeOptions=L.Util.extend({},this.options.shapeOptions,e.shapeOptions)),L.setOptions(this,e);var i=L.version.split(".");1===parseInt(i[0],10)&&parseInt(i[1],10)>=2?L.Draw.Feature.include(L.Evented.prototype):L.Draw.Feature.include(L.Mixin.Events)},enable:function(){this._enabled||(L.Handler.prototype.enable.call(this),this.fire("enabled",{handler:this.type}),this._map.fire(L.Draw.Event.DRAWSTART,{layerType:this.type}))},disable:function(){this._enabled&&(L.Handler.prototype.disable.call(this),this._map.fire(L.Draw.Event.DRAWSTOP,{layerType:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(L.DomUtil.disableTextSelection(),t.getContainer().focus(),this._tooltip=new L.Draw.Tooltip(this._map),L.DomEvent.on(this._container,"keyup",this._cancelDrawing,this))},removeHooks:function(){this._map&&(L.DomUtil.enableTextSelection(),this._tooltip.dispose(),this._tooltip=null,L.DomEvent.off(this._container,"keyup",this._cancelDrawing,this))},setOptions:function(t){L.setOptions(this,t)},_fireCreatedEvent:function(t){this._map.fire(L.Draw.Event.CREATED,{layer:t,layerType:this.type})},_cancelDrawing:function(t){27===t.keyCode&&(this._map.fire("draw:canceled",{layerType:this.type}),this.disable())}}),L.Draw.Polyline=L.Draw.Feature.extend({statics:{TYPE:"polyline"},Poly:L.Polyline,options:{allowIntersection:!0,repeatMode:!1,drawError:{color:"#b00b00",timeout:2500},icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"}),guidelineDistance:20,maxGuideLineLength:4e3,shapeOptions:{stroke:!0,color:"#3388ff",weight:4,opacity:.5,fill:!1,clickable:!0},metric:!0,feet:!0,nautic:!1,showLength:!0,zIndexOffset:2e3,factor:1,maxPoints:0},initialize:function(t,e){L.Browser.touch&&(this.options.icon=this.options.touchIcon),this.options.drawError.message=L.drawLocal.draw.handlers.polyline.error,e&&e.drawError&&(e.drawError=L.Util.extend({},this.options.drawError,e.drawError)),this.type=L.Draw.Polyline.TYPE,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._markers=[],this._markerGroup=new L.LayerGroup,this._map.addLayer(this._markerGroup),this._poly=new L.Polyline([],this.options.shapeOptions),this._tooltip.updateContent(this._getTooltipText()),this._mouseMarker||(this._mouseMarker=L.marker(this._map.getCenter(),{icon:L.divIcon({className:"leaflet-mouse-marker",iconAnchor:[20,20],iconSize:[40,40]}),opacity:0,zIndexOffset:this.options.zIndexOffset})),this._mouseMarker.on("mouseout",this._onMouseOut,this).on("mousemove",this._onMouseMove,this).on("mousedown",this._onMouseDown,this).on("mouseup",this._onMouseUp,this).addTo(this._map),this._map.on("mouseup",this._onMouseUp,this).on("mousemove",this._onMouseMove,this).on("zoomlevelschange",this._onZoomEnd,this).on("touchstart",this._onTouch,this).on("zoomend",this._onZoomEnd,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._clearHideErrorTimeout(),this._cleanUpShape(),this._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers,this._map.removeLayer(this._poly),delete this._poly,this._mouseMarker.off("mousedown",this._onMouseDown,this).off("mouseout",this._onMouseOut,this).off("mouseup",this._onMouseUp,this).off("mousemove",this._onMouseMove,this),this._map.removeLayer(this._mouseMarker),delete this._mouseMarker,this._clearGuides(),this._map.off("mouseup",this._onMouseUp,this).off("mousemove",this._onMouseMove,this).off("zoomlevelschange",this._onZoomEnd,this).off("zoomend",this._onZoomEnd,this).off("touchstart",this._onTouch,this).off("click",this._onTouch,this)},deleteLastVertex:function(){if(!(this._markers.length<=1)){var t=this._markers.pop(),e=this._poly,i=e.getLatLngs(),o=i.splice(-1,1)[0];this._poly.setLatLngs(i),this._markerGroup.removeLayer(t),e.getLatLngs().length<2&&this._map.removeLayer(e),this._vertexChanged(o,!1)}},addVertex:function(t){this._markers.length>=2&&!this.options.allowIntersection&&this._poly.newLatLngIntersects(t)?this._showErrorTooltip():(this._errorShown&&this._hideErrorTooltip(),this._markers.push(this._createMarker(t)),this._poly.addLatLng(t),2===this._poly.getLatLngs().length&&this._map.addLayer(this._poly),this._vertexChanged(t,!0))},completeShape:function(){this._markers.length<=1||!this._shapeIsValid()||(this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable())},_finishShape:function(){var t=this._poly._defaultShape?this._poly._defaultShape():this._poly.getLatLngs(),e=this._poly.newLatLngIntersects(t[t.length-1]);!this.options.allowIntersection&&e||!this._shapeIsValid()?this._showErrorTooltip():(this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable())},_shapeIsValid:function(){return!0},_onZoomEnd:function(){null!==this._markers&&this._updateGuide()},_onMouseMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent),i=this._map.layerPointToLatLng(e);this._currentLatLng=i,this._updateTooltip(i),this._updateGuide(e),this._mouseMarker.setLatLng(i),L.DomEvent.preventDefault(t.originalEvent)},_vertexChanged:function(t,e){this._map.fire(L.Draw.Event.DRAWVERTEX,{layers:this._markerGroup}),this._updateFinishHandler(),this._updateRunningMeasure(t,e),this._clearGuides(),this._updateTooltip()},_onMouseDown:function(t){if(!this._clickHandled&&!this._touchHandled&&!this._disableMarkers){this._onMouseMove(t),this._clickHandled=!0,this._disableNewMarkers();var e=t.originalEvent,i=e.clientX,o=e.clientY;this._startPoint.call(this,i,o)}},_startPoint:function(t,e){this._mouseDownOrigin=L.point(t,e)},_onMouseUp:function(t){var e=t.originalEvent,i=e.clientX,o=e.clientY;this._endPoint.call(this,i,o,t),this._clickHandled=null},_endPoint:function(e,i,o){if(this._mouseDownOrigin){var n=L.point(e,i).distanceTo(this._mouseDownOrigin),s=this._calculateFinishDistance(o.latlng);this.options.maxPoints>1&&this.options.maxPoints==this._markers.length+1?(this.addVertex(o.latlng),this._finishShape()):s<10&&L.Browser.touch?this._finishShape():Math.abs(n)<9*(t.devicePixelRatio||1)&&this.addVertex(o.latlng),this._enableNewMarkers()}this._mouseDownOrigin=null},_onTouch:function(t){var e,i,o=t.originalEvent;!o.touches||!o.touches[0]||this._clickHandled||this._touchHandled||this._disableMarkers||(e=o.touches[0].clientX,i=o.touches[0].clientY,this._disableNewMarkers(),this._touchHandled=!0,this._startPoint.call(this,e,i),this._endPoint.call(this,e,i,t),this._touchHandled=null),this._clickHandled=null},_onMouseOut:function(){this._tooltip&&this._tooltip._onMouseOut.call(this._tooltip)},_calculateFinishDistance:function(t){var e;if(this._markers.length>0){var i;if(this.type===L.Draw.Polyline.TYPE)i=this._markers[this._markers.length-1];else{if(this.type!==L.Draw.Polygon.TYPE)return 1/0;i=this._markers[0]}var o=this._map.latLngToContainerPoint(i.getLatLng()),n=new L.Marker(t,{icon:this.options.icon,zIndexOffset:2*this.options.zIndexOffset}),s=this._map.latLngToContainerPoint(n.getLatLng());e=o.distanceTo(s)}else e=1/0;return e},_updateFinishHandler:function(){var t=this._markers.length;t>1&&this._markers[t-1].on("click",this._finishShape,this),t>2&&this._markers[t-2].off("click",this._finishShape,this)},_createMarker:function(t){var e=new L.Marker(t,{icon:this.options.icon,zIndexOffset:2*this.options.zIndexOffset});return this._markerGroup.addLayer(e),e},_updateGuide:function(t){var e=this._markers?this._markers.length:0;e>0&&(t=t||this._map.latLngToLayerPoint(this._currentLatLng),this._clearGuides(),this._drawGuide(this._map.latLngToLayerPoint(this._markers[e-1].getLatLng()),t))},_updateTooltip:function(t){var e=this._getTooltipText();t&&this._tooltip.updatePosition(t),this._errorShown||this._tooltip.updateContent(e)},_drawGuide:function(t,e){var i,o,n,s=Math.floor(Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))),a=this.options.guidelineDistance,r=this.options.maxGuideLineLength,l=s>r?s-r:a;for(this._guidesContainer||(this._guidesContainer=L.DomUtil.create("div","leaflet-draw-guides",this._overlayPane));l<s;l+=this.options.guidelineDistance)i=l/s,o={x:Math.floor(t.x*(1-i)+i*e.x),y:Math.floor(t.y*(1-i)+i*e.y)},(n=L.DomUtil.create("div","leaflet-draw-guide-dash",this._guidesContainer)).style.backgroundColor=this._errorShown?this.options.drawError.color:this.options.shapeOptions.color,L.DomUtil.setPosition(n,o)},_updateGuideColor:function(t){if(this._guidesContainer)for(var e=0,i=this._guidesContainer.childNodes.length;e<i;e++)this._guidesContainer.childNodes[e].style.backgroundColor=t},_clearGuides:function(){if(this._guidesContainer)for(;this._guidesContainer.firstChild;)this._guidesContainer.removeChild(this._guidesContainer.firstChild)},_getTooltipText:function(){var t,e,i=this.options.showLength;return 0===this._markers.length?t={text:L.drawLocal.draw.handlers.polyline.tooltip.start}:(e=i?this._getMeasurementString():"",t=1===this._markers.length?{text:L.drawLocal.draw.handlers.polyline.tooltip.cont,subtext:e}:{text:L.drawLocal.draw.handlers.polyline.tooltip.end,subtext:e}),t},_updateRunningMeasure:function(t,e){var i,o,n=this._markers.length;1===this._markers.length?this._measurementRunningTotal=0:(i=n-(e?2:1),o=L.GeometryUtil.isVersion07x()?t.distanceTo(this._markers[i].getLatLng())*(this.options.factor||1):this._map.distance(t,this._markers[i].getLatLng())*(this.options.factor||1),this._measurementRunningTotal+=o*(e?1:-1))},_getMeasurementString:function(){var t,e=this._currentLatLng,i=this._markers[this._markers.length-1].getLatLng();return t=L.GeometryUtil.isVersion07x()?i&&e&&e.distanceTo?this._measurementRunningTotal+e.distanceTo(i)*(this.options.factor||1):this._measurementRunningTotal||0:i&&e?this._measurementRunningTotal+this._map.distance(e,i)*(this.options.factor||1):this._measurementRunningTotal||0,L.GeometryUtil.readableDistance(t,this.options.metric,this.options.feet,this.options.nautic,this.options.precision)},_showErrorTooltip:function(){this._errorShown=!0,this._tooltip.showAsError().updateContent({text:this.options.drawError.message}),this._updateGuideColor(this.options.drawError.color),this._poly.setStyle({color:this.options.drawError.color}),this._clearHideErrorTimeout(),this._hideErrorTimeout=setTimeout(L.Util.bind(this._hideErrorTooltip,this),this.options.drawError.timeout)},_hideErrorTooltip:function(){this._errorShown=!1,this._clearHideErrorTimeout(),this._tooltip.removeError().updateContent(this._getTooltipText()),this._updateGuideColor(this.options.shapeOptions.color),this._poly.setStyle({color:this.options.shapeOptions.color})},_clearHideErrorTimeout:function(){this._hideErrorTimeout&&(clearTimeout(this._hideErrorTimeout),this._hideErrorTimeout=null)},_disableNewMarkers:function(){this._disableMarkers=!0},_enableNewMarkers:function(){setTimeout(function(){this._disableMarkers=!1}.bind(this),50)},_cleanUpShape:function(){this._markers.length>1&&this._markers[this._markers.length-1].off("click",this._finishShape,this)},_fireCreatedEvent:function(){var t=new this.Poly(this._poly.getLatLngs(),this.options.shapeOptions);L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)}}),L.Draw.Polygon=L.Draw.Polyline.extend({statics:{TYPE:"polygon"},Poly:L.Polygon,options:{showArea:!1,showLength:!1,shapeOptions:{stroke:!0,color:"#3388ff",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},metric:!0,feet:!0,nautic:!1,precision:{}},initialize:function(t,e){L.Draw.Polyline.prototype.initialize.call(this,t,e),this.type=L.Draw.Polygon.TYPE},_updateFinishHandler:function(){var t=this._markers.length;1===t&&this._markers[0].on("click",this._finishShape,this),t>2&&(this._markers[t-1].on("dblclick",this._finishShape,this),t>3&&this._markers[t-2].off("dblclick",this._finishShape,this))},_getTooltipText:function(){var t,e;return 0===this._markers.length?t=L.drawLocal.draw.handlers.polygon.tooltip.start:this._markers.length<3?(t=L.drawLocal.draw.handlers.polygon.tooltip.cont,e=this._getMeasurementString()):(t=L.drawLocal.draw.handlers.polygon.tooltip.end,e=this._getMeasurementString()),{text:t,subtext:e}},_getMeasurementString:function(){var t=this._area,e="";return t||this.options.showLength?(this.options.showLength&&(e=L.Draw.Polyline.prototype._getMeasurementString.call(this)),t&&(e+="<br>"+L.GeometryUtil.readableArea(t,this.options.metric,this.options.precision)),e):null},_shapeIsValid:function(){return this._markers.length>=3},_vertexChanged:function(t,e){var i;!this.options.allowIntersection&&this.options.showArea&&(i=this._poly.getLatLngs(),this._area=L.GeometryUtil.geodesicArea(i)),L.Draw.Polyline.prototype._vertexChanged.call(this,t,e)},_cleanUpShape:function(){var t=this._markers.length;t>0&&(this._markers[0].off("click",this._finishShape,this),t>2&&this._markers[t-1].off("dblclick",this._finishShape,this))}}),L.SimpleShape={},L.Draw.SimpleShape=L.Draw.Feature.extend({options:{repeatMode:!1},initialize:function(t,e){this._endLabelText=L.drawLocal.draw.handlers.simpleshape.tooltip.end,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._mapDraggable=this._map.dragging.enabled(),this._mapDraggable&&this._map.dragging.disable(),this._container.style.cursor="crosshair",this._tooltip.updateContent({text:this._initialLabelText}),this._map.on("mousedown",this._onMouseDown,this).on("mousemove",this._onMouseMove,this).on("touchstart",this._onMouseDown,this).on("touchmove",this._onMouseMove,this),e.addEventListener("touchstart",L.DomEvent.preventDefault,{passive:!1}))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._map&&(this._mapDraggable&&this._map.dragging.enable(),this._container.style.cursor="",this._map.off("mousedown",this._onMouseDown,this).off("mousemove",this._onMouseMove,this).off("touchstart",this._onMouseDown,this).off("touchmove",this._onMouseMove,this),L.DomEvent.off(e,"mouseup",this._onMouseUp,this),L.DomEvent.off(e,"touchend",this._onMouseUp,this),e.removeEventListener("touchstart",L.DomEvent.preventDefault),this._shape&&(this._map.removeLayer(this._shape),delete this._shape)),this._isDrawing=!1},_getTooltipText:function(){return{text:this._endLabelText}},_onMouseDown:function(t){this._isDrawing=!0,this._startLatLng=t.latlng,L.DomEvent.on(e,"mouseup",this._onMouseUp,this).on(e,"touchend",this._onMouseUp,this).preventDefault(t.originalEvent)},_onMouseMove:function(t){var e=t.latlng;this._tooltip.updatePosition(e),this._isDrawing&&(this._tooltip.updateContent(this._getTooltipText()),this._drawShape(e))},_onMouseUp:function(){this._shape&&this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable()}}),L.Draw.Rectangle=L.Draw.SimpleShape.extend({statics:{TYPE:"rectangle"},options:{shapeOptions:{stroke:!0,color:"#3388ff",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},showArea:!0,metric:!0},initialize:function(t,e){this.type=L.Draw.Rectangle.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.rectangle.tooltip.start,L.Draw.SimpleShape.prototype.initialize.call(this,t,e)},disable:function(){this._enabled&&(this._isCurrentlyTwoClickDrawing=!1,L.Draw.SimpleShape.prototype.disable.call(this))},_onMouseUp:function(t){this._shape||this._isCurrentlyTwoClickDrawing?this._isCurrentlyTwoClickDrawing&&!function(t,e){for(;(t=t.parentElement)&&!t.classList.contains(e););return t}(t.target,"leaflet-pane")||L.Draw.SimpleShape.prototype._onMouseUp.call(this):this._isCurrentlyTwoClickDrawing=!0},_drawShape:function(t){this._shape?this._shape.setBounds(new L.LatLngBounds(this._startLatLng,t)):(this._shape=new L.Rectangle(new L.LatLngBounds(this._startLatLng,t),this.options.shapeOptions),this._map.addLayer(this._shape))},_fireCreatedEvent:function(){var t=new L.Rectangle(this._shape.getBounds(),this.options.shapeOptions);L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this,t)},_getTooltipText:function(){var t,e,i,o=L.Draw.SimpleShape.prototype._getTooltipText.call(this),n=this._shape,s=this.options.showArea;return n&&(t=this._shape._defaultShape?this._shape._defaultShape():this._shape.getLatLngs(),e=L.GeometryUtil.geodesicArea(t),i=s?L.GeometryUtil.readableArea(e,this.options.metric):""),{text:o.text,subtext:i}}}),L.Draw.Marker=L.Draw.Feature.extend({statics:{TYPE:"marker"},options:{icon:new L.Icon.Default,repeatMode:!1,zIndexOffset:2e3},initialize:function(t,e){this.type=L.Draw.Marker.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.marker.tooltip.start,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._tooltip.updateContent({text:this._initialLabelText}),this._mouseMarker||(this._mouseMarker=L.marker(this._map.getCenter(),{icon:L.divIcon({className:"leaflet-mouse-marker",iconAnchor:[20,20],iconSize:[40,40]}),opacity:0,zIndexOffset:this.options.zIndexOffset})),this._mouseMarker.on("click",this._onClick,this).addTo(this._map),this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onTouch,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._map&&(this._map.off("click",this._onClick,this).off("click",this._onTouch,this),this._marker&&(this._marker.off("click",this._onClick,this),this._map.removeLayer(this._marker),delete this._marker),this._mouseMarker.off("click",this._onClick,this),this._map.removeLayer(this._mouseMarker),delete this._mouseMarker,this._map.off("mousemove",this._onMouseMove,this))},_onMouseMove:function(t){var e=t.latlng;this._tooltip.updatePosition(e),this._mouseMarker.setLatLng(e),this._marker?(e=this._mouseMarker.getLatLng(),this._marker.setLatLng(e)):(this._marker=this._createMarker(e),this._marker.on("click",this._onClick,this),this._map.on("click",this._onClick,this).addLayer(this._marker))},_createMarker:function(t){return new L.Marker(t,{icon:this.options.icon,zIndexOffset:this.options.zIndexOffset})},_onClick:function(){this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable()},_onTouch:function(t){this._onMouseMove(t),this._onClick()},_fireCreatedEvent:function(){var t=new L.Marker.Touch(this._marker.getLatLng(),{icon:this.options.icon});L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)}}),L.Draw.CircleMarker=L.Draw.Marker.extend({statics:{TYPE:"circlemarker"},options:{stroke:!0,color:"#3388ff",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0,zIndexOffset:2e3},initialize:function(t,e){this.type=L.Draw.CircleMarker.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.circlemarker.tooltip.start,L.Draw.Feature.prototype.initialize.call(this,t,e)},_fireCreatedEvent:function(){var t=new L.CircleMarker(this._marker.getLatLng(),this.options);L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)},_createMarker:function(t){return new L.CircleMarker(t,this.options)}}),L.Draw.Circle=L.Draw.SimpleShape.extend({statics:{TYPE:"circle"},options:{shapeOptions:{stroke:!0,color:"#3388ff",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},showRadius:!0,metric:!0,feet:!0,nautic:!1},initialize:function(t,e){this.type=L.Draw.Circle.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.circle.tooltip.start,L.Draw.SimpleShape.prototype.initialize.call(this,t,e)},_drawShape:function(t){if(L.GeometryUtil.isVersion07x())var e=this._startLatLng.distanceTo(t);else e=this._map.distance(this._startLatLng,t);this._shape?this._shape.setRadius(e):(this._shape=new L.Circle(this._startLatLng,e,this.options.shapeOptions),this._map.addLayer(this._shape))},_fireCreatedEvent:function(){var t=new L.Circle(this._startLatLng,this._shape.getRadius(),this.options.shapeOptions);L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this,t)},_onMouseMove:function(t){var e,i=t.latlng,o=this.options.showRadius,n=this.options.metric;if(this._tooltip.updatePosition(i),this._isDrawing){this._drawShape(i),e=this._shape.getRadius().toFixed(1);var s="";o&&(s=L.drawLocal.draw.handlers.circle.radius+": "+L.GeometryUtil.readableDistance(e,n,this.options.feet,this.options.nautic)),this._tooltip.updateContent({text:this._endLabelText,subtext:s})}}}),L.Edit=L.Edit||{},L.Edit.Marker=L.Handler.extend({initialize:function(t,e){this._marker=t,L.setOptions(this,e)},addHooks:function(){var t=this._marker;t.dragging.enable(),t.on("dragend",this._onDragEnd,t),this._toggleMarkerHighlight()},removeHooks:function(){var t=this._marker;t.dragging.disable(),t.off("dragend",this._onDragEnd,t),this._toggleMarkerHighlight()},_onDragEnd:function(t){var e=t.target;e.edited=!0,this._map.fire(L.Draw.Event.EDITMOVE,{layer:e})},_toggleMarkerHighlight:function(){var t=this._marker._icon;t&&(t.style.display="none",L.DomUtil.hasClass(t,"leaflet-edit-marker-selected")?(L.DomUtil.removeClass(t,"leaflet-edit-marker-selected"),this._offsetMarker(t,-4)):(L.DomUtil.addClass(t,"leaflet-edit-marker-selected"),this._offsetMarker(t,4)),t.style.display="")},_offsetMarker:function(t,e){var i=parseInt(t.style.marginTop,10)-e,o=parseInt(t.style.marginLeft,10)-e;t.style.marginTop=i+"px",t.style.marginLeft=o+"px"}}),L.Marker.addInitHook((function(){L.Edit.Marker&&(this.editing=new L.Edit.Marker(this),this.options.editable&&this.editing.enable())})),L.Edit=L.Edit||{},L.Edit.Poly=L.Handler.extend({initialize:function(t){this.latlngs=[t._latlngs],t._holes&&(this.latlngs=this.latlngs.concat(t._holes)),this._poly=t,this._poly.on("revert-edited",this._updateLatLngs,this)},_defaultShape:function(){return L.Polyline._flat?L.Polyline._flat(this._poly._latlngs)?this._poly._latlngs:this._poly._latlngs[0]:this._poly._latlngs},_eachVertexHandler:function(t){for(var e=0;e<this._verticesHandlers.length;e++)t(this._verticesHandlers[e])},addHooks:function(){this._initHandlers(),this._eachVertexHandler((function(t){t.addHooks()}))},removeHooks:function(){this._eachVertexHandler((function(t){t.removeHooks()}))},updateMarkers:function(){this._eachVertexHandler((function(t){t.updateMarkers()}))},_initHandlers:function(){this._verticesHandlers=[];for(var t=0;t<this.latlngs.length;t++)this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(this._poly,this.latlngs[t],this._poly.options.poly))},_updateLatLngs:function(t){this.latlngs=[t.layer._latlngs],t.layer._holes&&(this.latlngs=this.latlngs.concat(t.layer._holes))}}),L.Edit.PolyVerticesEdit=L.Handler.extend({options:{icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"}),drawError:{color:"#b00b00",timeout:1e3}},initialize:function(t,e,i){L.Browser.touch&&(this.options.icon=this.options.touchIcon),this._poly=t,i&&i.drawError&&(i.drawError=L.Util.extend({},this.options.drawError,i.drawError)),this._latlngs=e,L.setOptions(this,i)},_defaultShape:function(){return L.Polyline._flat?L.Polyline._flat(this._latlngs)?this._latlngs:this._latlngs[0]:this._latlngs},addHooks:function(){var t=this._poly,e=t._path;t instanceof L.Polygon||(t.options.fill=!1,t.options.editing&&(t.options.editing.fill=!1)),e&&t.options.editing&&t.options.editing.className&&(t.options.original.className&&t.options.original.className.split(" ").forEach((function(t){L.DomUtil.removeClass(e,t)})),t.options.editing.className.split(" ").forEach((function(t){L.DomUtil.addClass(e,t)}))),t.setStyle(t.options.editing),this._poly._map&&(this._map=this._poly._map,this._markerGroup||this._initMarkers(),this._poly._map.addLayer(this._markerGroup))},removeHooks:function(){var t=this._poly,e=t._path;e&&t.options.editing&&t.options.editing.className&&(t.options.editing.className.split(" ").forEach((function(t){L.DomUtil.removeClass(e,t)})),t.options.original.className&&t.options.original.className.split(" ").forEach((function(t){L.DomUtil.addClass(e,t)}))),t.setStyle(t.options.original),t._map&&(t._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers)},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new L.LayerGroup),this._markers=[];var t,e,i,o,n,s,a=this._defaultShape();for(t=0,i=a.length;t<i;t++)(o=this._createMarker(a[t],t)).on("click",this._onMarkerClick,this),o.on("contextmenu",this._onContextMenu,this),this._markers.push(o);for(t=0,e=i-1;t<i;e=t++)(0!==t||L.Polygon&&this._poly instanceof L.Polygon)&&(n=this._markers[e],s=this._markers[t],this._createMiddleMarker(n,s),this._updatePrevNext(n,s))},_createMarker:function(t,e){var i=new L.Marker.Touch(t,{draggable:!0,icon:this.options.icon});return i._origLatLng=t,i._index=e,i.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._fireEdit,this).on("touchmove",this._onTouchMove,this).on("touchend",this._fireEdit,this).on("MSPointerMove",this._onTouchMove,this).on("MSPointerUp",this._fireEdit,this),this._markerGroup.addLayer(i),i},_onMarkerDragStart:function(){this._poly.fire("editstart")},_spliceLatLngs:function(){var t=this._defaultShape(),e=[].splice.apply(t,arguments);return this._poly._convertLatLngs(t,!0),this._poly.redraw(),e},_removeMarker:function(t){var e=t._index;this._markerGroup.removeLayer(t),this._markers.splice(e,1),this._spliceLatLngs(e,1),this._updateIndexes(e,-1),t.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._fireEdit,this).off("touchmove",this._onMarkerDrag,this).off("touchend",this._fireEdit,this).off("click",this._onMarkerClick,this).off("MSPointerMove",this._onTouchMove,this).off("MSPointerUp",this._fireEdit,this)},_fireEdit:function(){this._poly.edited=!0,this._poly.fire("edit"),this._poly._map.fire(L.Draw.Event.EDITVERTEX,{layers:this._markerGroup,poly:this._poly})},_onMarkerDrag:function(t){var e=t.target,i=this._poly,o=L.LatLngUtil.cloneLatLng(e._origLatLng);if(L.extend(e._origLatLng,e._latlng),i.options.poly){var n=i._map._editTooltip;if(!i.options.poly.allowIntersection&&i.intersects()){L.extend(e._origLatLng,o),e.setLatLng(o);var s=i.options.color;i.setStyle({color:this.options.drawError.color}),n&&n.updateContent({text:L.drawLocal.draw.handlers.polyline.error}),setTimeout((function(){i.setStyle({color:s}),n&&n.updateContent({text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext})}),1e3)}}e._middleLeft&&e._middleLeft.setLatLng(this._getMiddleLatLng(e._prev,e)),e._middleRight&&e._middleRight.setLatLng(this._getMiddleLatLng(e,e._next)),this._poly._bounds._southWest=L.latLng(1/0,1/0),this._poly._bounds._northEast=L.latLng(-1/0,-1/0);var a=this._poly.getLatLngs();this._poly._convertLatLngs(a,!0),this._poly.redraw(),this._poly.fire("editdrag")},_onMarkerClick:function(t){var e=L.Polygon&&this._poly instanceof L.Polygon?4:3,i=t.target;this._defaultShape().length<e||(this._removeMarker(i),this._updatePrevNext(i._prev,i._next),i._middleLeft&&this._markerGroup.removeLayer(i._middleLeft),i._middleRight&&this._markerGroup.removeLayer(i._middleRight),i._prev&&i._next?this._createMiddleMarker(i._prev,i._next):i._prev?i._next||(i._prev._middleRight=null):i._next._middleLeft=null,this._fireEdit())},_onContextMenu:function(t){var e=t.target;this._poly;this._poly._map.fire(L.Draw.Event.MARKERCONTEXT,{marker:e,layers:this._markerGroup,poly:this._poly}),L.DomEvent.stopPropagation},_onTouchMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent.touches[0]),i=this._map.layerPointToLatLng(e),o=t.target;L.extend(o._origLatLng,i),o._middleLeft&&o._middleLeft.setLatLng(this._getMiddleLatLng(o._prev,o)),o._middleRight&&o._middleRight.setLatLng(this._getMiddleLatLng(o,o._next)),this._poly.redraw(),this.updateMarkers()},_updateIndexes:function(t,e){this._markerGroup.eachLayer((function(i){i._index>t&&(i._index+=e)}))},_createMiddleMarker:function(t,e){var i,o,n,s=this._getMiddleLatLng(t,e),a=this._createMarker(s);a.setOpacity(.6),t._middleRight=e._middleLeft=a,o=function(){a.off("touchmove",o,this);var n=e._index;a._index=n,a.off("click",i,this).on("click",this._onMarkerClick,this),s.lat=a.getLatLng().lat,s.lng=a.getLatLng().lng,this._spliceLatLngs(n,0,s),this._markers.splice(n,0,a),a.setOpacity(1),this._updateIndexes(n,1),e._index++,this._updatePrevNext(t,a),this._updatePrevNext(a,e),this._poly.fire("editstart")},n=function(){a.off("dragstart",o,this),a.off("dragend",n,this),a.off("touchmove",o,this),this._createMiddleMarker(t,a),this._createMiddleMarker(a,e)},i=function(){o.call(this),n.call(this),this._fireEdit()},a.on("click",i,this).on("dragstart",o,this).on("dragend",n,this).on("touchmove",o,this),this._markerGroup.addLayer(a)},_updatePrevNext:function(t,e){t&&(t._next=e),e&&(e._prev=t)},_getMiddleLatLng:function(t,e){var i=this._poly._map,o=i.project(t.getLatLng()),n=i.project(e.getLatLng());return i.unproject(o._add(n)._divideBy(2))}}),L.Polyline.addInitHook((function(){this.editing||(L.Edit.Poly&&(this.editing=new L.Edit.Poly(this),this.options.editable&&this.editing.enable()),this.on("add",(function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()})),this.on("remove",(function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()})))})),L.Edit=L.Edit||{},L.Edit.SimpleShape=L.Handler.extend({options:{moveIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move"}),resizeIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize"}),touchMoveIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon"}),touchResizeIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon"})},initialize:function(t,e){L.Browser.touch&&(this.options.moveIcon=this.options.touchMoveIcon,this.options.resizeIcon=this.options.touchResizeIcon),this._shape=t,L.Util.setOptions(this,e)},addHooks:function(){var t=this._shape;this._shape._map&&(this._map=this._shape._map,t.setStyle(t.options.editing),t._map&&(this._map=t._map,this._markerGroup||this._initMarkers(),this._map.addLayer(this._markerGroup)))},removeHooks:function(){var t=this._shape;if(t.setStyle(t.options.original),t._map){this._unbindMarker(this._moveMarker);for(var e=0,i=this._resizeMarkers.length;e<i;e++)this._unbindMarker(this._resizeMarkers[e]);this._resizeMarkers=null,this._map.removeLayer(this._markerGroup),delete this._markerGroup}this._map=null},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new L.LayerGroup),this._createMoveMarker(),this._createResizeMarker()},_createMoveMarker:function(){},_createResizeMarker:function(){},_createMarker:function(t,e){var i=new L.Marker.Touch(t,{draggable:!0,icon:e,zIndexOffset:10});return this._bindMarker(i),this._markerGroup.addLayer(i),i},_bindMarker:function(t){t.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._onMarkerDragEnd,this).on("touchstart",this._onTouchStart,this).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onTouchEnd,this).on("MSPointerUp",this._onTouchEnd,this)},_unbindMarker:function(t){t.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._onMarkerDragEnd,this).off("touchstart",this._onTouchStart,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onTouchEnd,this).off("MSPointerUp",this._onTouchEnd,this)},_onMarkerDragStart:function(t){t.target.setOpacity(0),this._shape.fire("editstart")},_fireEdit:function(){this._shape.edited=!0,this._shape.fire("edit")},_onMarkerDrag:function(t){var e=t.target,i=e.getLatLng();e===this._moveMarker?this._move(i):this._resize(i),this._shape.redraw(),this._shape.fire("editdrag")},_onMarkerDragEnd:function(t){t.target.setOpacity(1),this._fireEdit()},_onTouchStart:function(t){if(L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,t),"function"==typeof this._getCorners){var e=this._getCorners(),i=t.target,o=i._cornerIndex;i.setOpacity(0),this._oppositeCorner=e[(o+2)%4],this._toggleCornerMarkers(0,o)}this._shape.fire("editstart")},_onTouchMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent.touches[0]),i=this._map.layerPointToLatLng(e);return t.target===this._moveMarker?this._move(i):this._resize(i),this._shape.redraw(),!1},_onTouchEnd:function(t){t.target.setOpacity(1),this.updateMarkers(),this._fireEdit()},_move:function(){},_resize:function(){}}),L.Edit=L.Edit||{},L.Edit.Rectangle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var t=this._shape.getBounds().getCenter();this._moveMarker=this._createMarker(t,this.options.moveIcon)},_createResizeMarker:function(){var t=this._getCorners();this._resizeMarkers=[];for(var e=0,i=t.length;e<i;e++)this._resizeMarkers.push(this._createMarker(t[e],this.options.resizeIcon)),this._resizeMarkers[e]._cornerIndex=e},_onMarkerDragStart:function(t){L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,t);var e=this._getCorners(),i=t.target._cornerIndex;this._oppositeCorner=e[(i+2)%4],this._toggleCornerMarkers(0,i)},_onMarkerDragEnd:function(t){var e,i=t.target;i===this._moveMarker&&(e=this._shape.getBounds().getCenter(),i.setLatLng(e)),this._toggleCornerMarkers(1),this._repositionCornerMarkers(),L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this,t)},_move:function(t){for(var e,i=this._shape._defaultShape?this._shape._defaultShape():this._shape.getLatLngs(),o=this._shape.getBounds().getCenter(),n=[],s=0,a=i.length;s<a;s++)e=[i[s].lat-o.lat,i[s].lng-o.lng],n.push([t.lat+e[0],t.lng+e[1]]);this._shape.setLatLngs(n),this._repositionCornerMarkers(),this._map.fire(L.Draw.Event.EDITMOVE,{layer:this._shape})},_resize:function(t){var e;this._shape.setBounds(L.latLngBounds(t,this._oppositeCorner)),e=this._shape.getBounds(),this._moveMarker.setLatLng(e.getCenter()),this._map.fire(L.Draw.Event.EDITRESIZE,{layer:this._shape})},_getCorners:function(){var t=this._shape.getBounds();return[t.getNorthWest(),t.getNorthEast(),t.getSouthEast(),t.getSouthWest()]},_toggleCornerMarkers:function(t){for(var e=0,i=this._resizeMarkers.length;e<i;e++)this._resizeMarkers[e].setOpacity(t)},_repositionCornerMarkers:function(){for(var t=this._getCorners(),e=0,i=this._resizeMarkers.length;e<i;e++)this._resizeMarkers[e].setLatLng(t[e])}}),L.Rectangle.addInitHook((function(){L.Edit.Rectangle&&(this.editing=new L.Edit.Rectangle(this),this.options.editable&&this.editing.enable())})),L.Edit=L.Edit||{},L.Edit.CircleMarker=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var t=this._shape.getLatLng();this._moveMarker=this._createMarker(t,this.options.moveIcon)},_createResizeMarker:function(){this._resizeMarkers=[]},_move:function(t){if(this._resizeMarkers.length){var e=this._getResizeMarkerPoint(t);this._resizeMarkers[0].setLatLng(e)}this._shape.setLatLng(t),this._map.fire(L.Draw.Event.EDITMOVE,{layer:this._shape})}}),L.CircleMarker.addInitHook((function(){L.Edit.CircleMarker&&(this.editing=new L.Edit.CircleMarker(this),this.options.editable&&this.editing.enable()),this.on("add",(function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()})),this.on("remove",(function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()}))})),L.Edit=L.Edit||{},L.Edit.Circle=L.Edit.CircleMarker.extend({_createResizeMarker:function(){var t=this._shape.getLatLng(),e=this._getResizeMarkerPoint(t);this._resizeMarkers=[],this._resizeMarkers.push(this._createMarker(e,this.options.resizeIcon))},_getResizeMarkerPoint:function(t){var e=this._shape._radius*Math.cos(Math.PI/4),i=this._map.project(t);return this._map.unproject([i.x+e,i.y-e])},_resize:function(t){var e=this._moveMarker.getLatLng();L.GeometryUtil.isVersion07x()?radius=e.distanceTo(t):radius=this._map.distance(e,t),this._shape.setRadius(radius),this._map.editTooltip&&this._map._editTooltip.updateContent({text:L.drawLocal.edit.handlers.edit.tooltip.subtext+"<br />"+L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.draw.handlers.circle.radius+": "+L.GeometryUtil.readableDistance(radius,!0,this.options.feet,this.options.nautic)}),this._shape.setRadius(radius),this._map.fire(L.Draw.Event.EDITRESIZE,{layer:this._shape})}}),L.Circle.addInitHook((function(){L.Edit.Circle&&(this.editing=new L.Edit.Circle(this),this.options.editable&&this.editing.enable())})),L.Map.mergeOptions({touchExtend:!0}),L.Map.TouchExtend=L.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){L.DomEvent.on(this._container,"touchstart",this._onTouchStart,this),L.DomEvent.on(this._container,"touchend",this._onTouchEnd,this),L.DomEvent.on(this._container,"touchmove",this._onTouchMove,this),this._detectIE()?(L.DomEvent.on(this._container,"MSPointerDown",this._onTouchStart,this),L.DomEvent.on(this._container,"MSPointerUp",this._onTouchEnd,this),L.DomEvent.on(this._container,"MSPointerMove",this._onTouchMove,this),L.DomEvent.on(this._container,"MSPointerCancel",this._onTouchCancel,this)):(L.DomEvent.on(this._container,"touchcancel",this._onTouchCancel,this),L.DomEvent.on(this._container,"touchleave",this._onTouchLeave,this))},removeHooks:function(){L.DomEvent.off(this._container,"touchstart",this._onTouchStart,this),L.DomEvent.off(this._container,"touchend",this._onTouchEnd,this),L.DomEvent.off(this._container,"touchmove",this._onTouchMove,this),this._detectIE()?(L.DomEvent.off(this._container,"MSPointerDown",this._onTouchStart,this),L.DomEvent.off(this._container,"MSPointerUp",this._onTouchEnd,this),L.DomEvent.off(this._container,"MSPointerMove",this._onTouchMove,this),L.DomEvent.off(this._container,"MSPointerCancel",this._onTouchCancel,this)):(L.DomEvent.off(this._container,"touchcancel",this._onTouchCancel,this),L.DomEvent.off(this._container,"touchleave",this._onTouchLeave,this))},_touchEvent:function(t,e){var i={};if(void 0!==t.touches){if(!t.touches.length)return;i=t.touches[0]}else{if("touch"!==t.pointerType)return;if(i=t,!this._filterClick(t))return}var o=this._map.mouseEventToContainerPoint(i),n=this._map.mouseEventToLayerPoint(i),s=this._map.layerPointToLatLng(n);this._map.fire(e,{latlng:s,layerPoint:n,containerPoint:o,pageX:i.pageX,pageY:i.pageY,originalEvent:t})},_filterClick:function(t){var e=t.timeStamp||t.originalEvent.timeStamp,i=L.DomEvent._lastClick&&e-L.DomEvent._lastClick;return i&&i>100&&i<500||t.target._simulatedClick&&!t._simulated?(L.DomEvent.stop(t),!1):(L.DomEvent._lastClick=e,!0)},_onTouchStart:function(t){if(this._map._loaded){this._touchEvent(t,"touchstart")}},_onTouchEnd:function(t){if(this._map._loaded){this._touchEvent(t,"touchend")}},_onTouchCancel:function(t){if(this._map._loaded){var e="touchcancel";this._detectIE()&&(e="pointercancel"),this._touchEvent(t,e)}},_onTouchLeave:function(t){if(this._map._loaded){this._touchEvent(t,"touchleave")}},_onTouchMove:function(t){if(this._map._loaded){this._touchEvent(t,"touchmove")}},_detectIE:function(){var e=t.navigator.userAgent,i=e.indexOf("MSIE ");if(i>0)return parseInt(e.substring(i+5,e.indexOf(".",i)),10);if(e.indexOf("Trident/")>0){var o=e.indexOf("rv:");return parseInt(e.substring(o+3,e.indexOf(".",o)),10)}var n=e.indexOf("Edge/");return n>0&&parseInt(e.substring(n+5,e.indexOf(".",n)),10)}}),L.Map.addInitHook("addHandler","touchExtend",L.Map.TouchExtend),L.Marker.Touch=L.Marker.extend({_initInteraction:function(){return this.addInteractiveTarget?L.Marker.prototype._initInteraction.apply(this):this._initInteractionLegacy()},_initInteractionLegacy:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu","touchstart","touchend","touchmove"];this._detectIE?e.concat(["MSPointerDown","MSPointerUp","MSPointerMove","MSPointerCancel"]):e.concat(["touchcancel"]),L.DomUtil.addClass(t,"leaflet-clickable"),L.DomEvent.on(t,"click",this._onMouseClick,this),L.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;i<e.length;i++)L.DomEvent.on(t,e[i],this._fireMouseEvent,this);L.Handler.MarkerDrag&&(this.dragging=new L.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_detectIE:function(){var e=t.navigator.userAgent,i=e.indexOf("MSIE ");if(i>0)return parseInt(e.substring(i+5,e.indexOf(".",i)),10);if(e.indexOf("Trident/")>0){var o=e.indexOf("rv:");return parseInt(e.substring(o+3,e.indexOf(".",o)),10)}var n=e.indexOf("Edge/");return n>0&&parseInt(e.substring(n+5,e.indexOf(".",n)),10)}}),L.LatLngUtil={cloneLatLngs:function(t){for(var e=[],i=0,o=t.length;i<o;i++)Array.isArray(t[i])?e.push(L.LatLngUtil.cloneLatLngs(t[i])):e.push(this.cloneLatLng(t[i]));return e},cloneLatLng:function(t){return L.latLng(t.lat,t.lng)}},o={km:2,ha:2,m:0,mi:2,ac:2,yd:0,ft:0,nm:2},L.GeometryUtil=L.extend(L.GeometryUtil||{},{geodesicArea:function(t){var e,i,o=t.length,n=0,s=Math.PI/180;if(o>2){for(var a=0;a<o;a++)e=t[a],n+=((i=t[(a+1)%o]).lng-e.lng)*s*(2+Math.sin(e.lat*s)+Math.sin(i.lat*s));n=6378137*n*6378137/2}return Math.abs(n)},formattedNumber:function(t,e){var i=parseFloat(t).toFixed(e),o=L.drawLocal.format&&L.drawLocal.format.numeric,n=o&&o.delimiters,s=n&&n.thousands,a=n&&n.decimal;if(s||a){var r=i.split(".");i=s?r[0].replace(/(\d)(?=(\d{3})+(?!\d))/g,"$1"+s):r[0],a=a||".",r.length>1&&(i=i+a+r[1])}return i},readableArea:function(t,e,i){var n,s;return i=L.Util.extend({},o,i),e?(s=["ha","m"],type=typeof e,"string"===type?s=[e]:"boolean"!==type&&(s=e),n=t>=1e6&&-1!==s.indexOf("km")?L.GeometryUtil.formattedNumber(1e-6*t,i.km)+" km²":t>=1e4&&-1!==s.indexOf("ha")?L.GeometryUtil.formattedNumber(1e-4*t,i.ha)+" ha":L.GeometryUtil.formattedNumber(t,i.m)+" m²"):n=(t/=.836127)>=3097600?L.GeometryUtil.formattedNumber(t/3097600,i.mi)+" mi²":t>=4840?L.GeometryUtil.formattedNumber(t/4840,i.ac)+" acres":L.GeometryUtil.formattedNumber(t,i.yd)+" yd²",n},readableDistance:function(t,e,i,n,s){var a;switch(s=L.Util.extend({},o,s),e?"string"==typeof e?e:"metric":i?"feet":n?"nauticalMile":"yards"){case"metric":a=t>1e3?L.GeometryUtil.formattedNumber(t/1e3,s.km)+" km":L.GeometryUtil.formattedNumber(t,s.m)+" m";break;case"feet":t*=3.28083,a=L.GeometryUtil.formattedNumber(t,s.ft)+" ft";break;case"nauticalMile":t*=.53996,a=L.GeometryUtil.formattedNumber(t/1e3,s.nm)+" nm";break;case"yards":default:a=(t*=1.09361)>1760?L.GeometryUtil.formattedNumber(t/1760,s.mi)+" miles":L.GeometryUtil.formattedNumber(t,s.yd)+" yd"}return a},isVersion07x:function(){var t=L.version.split(".");return 0===parseInt(t[0],10)&&7===parseInt(t[1],10)}}),L.Util.extend(L.LineUtil,{segmentsIntersect:function(t,e,i,o){return this._checkCounterclockwise(t,i,o)!==this._checkCounterclockwise(e,i,o)&&this._checkCounterclockwise(t,e,i)!==this._checkCounterclockwise(t,e,o)},_checkCounterclockwise:function(t,e,i){return(i.y-t.y)*(e.x-t.x)>(e.y-t.y)*(i.x-t.x)}}),L.Polyline.include({intersects:function(){var t,e,i,o=this._getProjectedPoints(),n=o?o.length:0;if(this._tooFewPointsForIntersection())return!1;for(t=n-1;t>=3;t--)if(e=o[t-1],i=o[t],this._lineSegmentsIntersectsRange(e,i,t-2))return!0;return!1},newLatLngIntersects:function(t,e){return!!this._map&&this.newPointIntersects(this._map.latLngToLayerPoint(t),e)},newPointIntersects:function(t,e){var i=this._getProjectedPoints(),o=i?i.length:0,n=i?i[o-1]:null,s=o-2;return!this._tooFewPointsForIntersection(1)&&this._lineSegmentsIntersectsRange(n,t,s,e?1:0)},_tooFewPointsForIntersection:function(t){var e=this._getProjectedPoints(),i=e?e.length:0;return!e||(i+=t||0)<=3},_lineSegmentsIntersectsRange:function(t,e,i,o){var n,s,a=this._getProjectedPoints();o=o||0;for(var r=i;r>o;r--)if(n=a[r-1],s=a[r],L.LineUtil.segmentsIntersect(t,e,n,s))return!0;return!1},_getProjectedPoints:function(){if(!this._defaultShape)return this._originalPoints;for(var t=[],e=this._defaultShape(),i=0;i<e.length;i++)t.push(this._map.latLngToLayerPoint(e[i]));return t}}),L.Polygon.include({intersects:function(){var t,e,i,o,n=this._getProjectedPoints();return!this._tooFewPointsForIntersection()&&(!!L.Polyline.prototype.intersects.call(this)||(t=n.length,e=n[0],i=n[t-1],o=t-2,this._lineSegmentsIntersectsRange(i,e,o,1)))}}),L.Control.Draw=L.Control.extend({options:{position:"topleft",draw:{},edit:!1},initialize:function(t){if(L.version<"0.7")throw new Error("Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/");var e;L.Control.prototype.initialize.call(this,t),this._toolbars={},L.DrawToolbar&&this.options.draw&&(e=new L.DrawToolbar(this.options.draw),this._toolbars[L.DrawToolbar.TYPE]=e,this._toolbars[L.DrawToolbar.TYPE].on("enable",this._toolbarEnabled,this)),L.EditToolbar&&this.options.edit&&(e=new L.EditToolbar(this.options.edit),this._toolbars[L.EditToolbar.TYPE]=e,this._toolbars[L.EditToolbar.TYPE].on("enable",this._toolbarEnabled,this)),L.toolbar=this},onAdd:function(t){var e,i=L.DomUtil.create("div","leaflet-draw"),o=!1;for(var n in this._toolbars)this._toolbars.hasOwnProperty(n)&&(e=this._toolbars[n].addToolbar(t))&&(o||(L.DomUtil.hasClass(e,"leaflet-draw-toolbar-top")||L.DomUtil.addClass(e.childNodes[0],"leaflet-draw-toolbar-top"),o=!0),i.appendChild(e));return i},onRemove:function(){for(var t in this._toolbars)this._toolbars.hasOwnProperty(t)&&this._toolbars[t].removeToolbar()},setDrawingOptions:function(t){for(var e in this._toolbars)this._toolbars[e]instanceof L.DrawToolbar&&this._toolbars[e].setOptions(t)},_toolbarEnabled:function(t){var e=t.target;for(var i in this._toolbars)this._toolbars[i]!==e&&this._toolbars[i].disable()}}),L.Map.mergeOptions({drawControlTooltips:!0,drawControl:!1}),L.Map.addInitHook((function(){this.options.drawControl&&(this.drawControl=new L.Control.Draw,this.addControl(this.drawControl))})),L.Toolbar=L.Class.extend({initialize:function(t){L.setOptions(this,t),this._modes={},this._actionButtons=[],this._activeMode=null;var e=L.version.split(".");1===parseInt(e[0],10)&&parseInt(e[1],10)>=2?L.Toolbar.include(L.Evented.prototype):L.Toolbar.include(L.Mixin.Events)},enabled:function(){return null!==this._activeMode},disable:function(){this.enabled()&&this._activeMode.handler.disable()},addToolbar:function(t){var e,i=L.DomUtil.create("div","leaflet-draw-section"),o=0,n=this._toolbarClass||"",s=this.getModeHandlers(t);for(this._toolbarContainer=L.DomUtil.create("div","leaflet-draw-toolbar leaflet-bar"),this._map=t,e=0;e<s.length;e++)s[e].enabled&&this._initModeHandler(s[e].handler,this._toolbarContainer,o++,n,s[e].title);if(o)return this._lastButtonIndex=--o,this._actionsContainer=L.DomUtil.create("ul","leaflet-draw-actions"),i.appendChild(this._toolbarContainer),i.appendChild(this._actionsContainer),i},removeToolbar:function(){for(var t in this._modes)this._modes.hasOwnProperty(t)&&(this._disposeButton(this._modes[t].button,this._modes[t].handler.enable,this._modes[t].handler),this._modes[t].handler.disable(),this._modes[t].handler.off("enabled",this._handlerActivated,this).off("disabled",this._handlerDeactivated,this));this._modes={};for(var e=0,i=this._actionButtons.length;e<i;e++)this._disposeButton(this._actionButtons[e].button,this._actionButtons[e].callback,this);this._actionButtons=[],this._actionsContainer=null},_initModeHandler:function(t,e,i,o,n){var s=t.type;this._modes[s]={},this._modes[s].handler=t,this._modes[s].button=this._createButton({type:s,title:n,className:o+"-"+s,container:e,callback:this._modes[s].handler.enable,context:this._modes[s].handler}),this._modes[s].buttonIndex=i,this._modes[s].handler.on("enabled",this._handlerActivated,this).on("disabled",this._handlerDeactivated,this)},_detectIOS:function(){return/iPad|iPhone|iPod/.test(navigator.userAgent)&&!t.MSStream},_createButton:function(t){var e=L.DomUtil.create("a",t.className||"",t.container),i=L.DomUtil.create("span","sr-only",t.container);e.href="#",e.appendChild(i),t.title&&(e.title=t.title,i.innerHTML=t.title),t.text&&(e.innerHTML=t.text,i.innerHTML=t.text);var o=this._detectIOS()?"touchstart":"click";return L.DomEvent.on(e,"click",L.DomEvent.stopPropagation).on(e,"mousedown",L.DomEvent.stopPropagation).on(e,"dblclick",L.DomEvent.stopPropagation).on(e,"touchstart",L.DomEvent.stopPropagation).on(e,"click",L.DomEvent.preventDefault).on(e,o,t.callback,t.context),e},_disposeButton:function(t,e){var i=this._detectIOS()?"touchstart":"click";L.DomEvent.off(t,"click",L.DomEvent.stopPropagation).off(t,"mousedown",L.DomEvent.stopPropagation).off(t,"dblclick",L.DomEvent.stopPropagation).off(t,"touchstart",L.DomEvent.stopPropagation).off(t,"click",L.DomEvent.preventDefault).off(t,i,e)},_handlerActivated:function(t){this.disable(),this._activeMode=this._modes[t.handler],L.DomUtil.addClass(this._activeMode.button,"leaflet-draw-toolbar-button-enabled"),this._showActionsToolbar(),this.fire("enable")},_handlerDeactivated:function(){this._hideActionsToolbar(),L.DomUtil.removeClass(this._activeMode.button,"leaflet-draw-toolbar-button-enabled"),this._activeMode=null,this.fire("disable")},_createActions:function(t){var e,i,o,n,s=this._actionsContainer,a=this.getActions(t),r=a.length;for(i=0,o=this._actionButtons.length;i<o;i++)this._disposeButton(this._actionButtons[i].button,this._actionButtons[i].callback);for(this._actionButtons=[];s.firstChild;)s.removeChild(s.firstChild);for(var l=0;l<r;l++)"enabled"in a[l]&&!a[l].enabled||(e=L.DomUtil.create("li","",s),n=this._createButton({title:a[l].title,text:a[l].text,container:e,callback:a[l].callback,context:a[l].context}),this._actionButtons.push({button:n,callback:a[l].callback}))},_showActionsToolbar:function(){var t=this._activeMode.buttonIndex,e=this._lastButtonIndex,i=this._activeMode.button.offsetTop-1;this._createActions(this._activeMode.handler),this._actionsContainer.style.top=i+"px",0===t&&(L.DomUtil.addClass(this._toolbarContainer,"leaflet-draw-toolbar-notop"),L.DomUtil.addClass(this._actionsContainer,"leaflet-draw-actions-top")),t===e&&(L.DomUtil.addClass(this._toolbarContainer,"leaflet-draw-toolbar-nobottom"),L.DomUtil.addClass(this._actionsContainer,"leaflet-draw-actions-bottom")),this._actionsContainer.style.display="block",this._map.fire(L.Draw.Event.TOOLBAROPENED)},_hideActionsToolbar:function(){this._actionsContainer.style.display="none",L.DomUtil.removeClass(this._toolbarContainer,"leaflet-draw-toolbar-notop"),L.DomUtil.removeClass(this._toolbarContainer,"leaflet-draw-toolbar-nobottom"),L.DomUtil.removeClass(this._actionsContainer,"leaflet-draw-actions-top"),L.DomUtil.removeClass(this._actionsContainer,"leaflet-draw-actions-bottom"),this._map.fire(L.Draw.Event.TOOLBARCLOSED)}}),L.Draw=L.Draw||{},L.Draw.Tooltip=L.Class.extend({initialize:function(t){this._map=t,this._popupPane=t._panes.popupPane,this._visible=!1,this._container=t.options.drawControlTooltips?L.DomUtil.create("div","leaflet-draw-tooltip",this._popupPane):null,this._singleLineLabel=!1,this._map.on("mouseout",this._onMouseOut,this)},dispose:function(){this._map.off("mouseout",this._onMouseOut,this),this._container&&(this._popupPane.removeChild(this._container),this._container=null)},updateContent:function(t){return this._container?(t.subtext=t.subtext||"",0!==t.subtext.length||this._singleLineLabel?t.subtext.length>0&&this._singleLineLabel&&(L.DomUtil.removeClass(this._container,"leaflet-draw-tooltip-single"),this._singleLineLabel=!1):(L.DomUtil.addClass(this._container,"leaflet-draw-tooltip-single"),this._singleLineLabel=!0),this._container.innerHTML=(t.subtext.length>0?'<span class="leaflet-draw-tooltip-subtext">'+t.subtext+"</span><br />":"")+"<span>"+t.text+"</span>",t.text||t.subtext?(this._visible=!0,this._container.style.visibility="inherit"):(this._visible=!1,this._container.style.visibility="hidden"),this):this},updatePosition:function(t){var e=this._map.latLngToLayerPoint(t),i=this._container;return this._container&&(this._visible&&(i.style.visibility="inherit"),L.DomUtil.setPosition(i,e)),this},showAsError:function(){return this._container&&L.DomUtil.addClass(this._container,"leaflet-error-draw-tooltip"),this},removeError:function(){return this._container&&L.DomUtil.removeClass(this._container,"leaflet-error-draw-tooltip"),this},_onMouseOut:function(){this._container&&(this._container.style.visibility="hidden")}}),L.DrawToolbar=L.Toolbar.extend({statics:{TYPE:"draw"},options:{polyline:{},polygon:{},rectangle:{},circle:{},marker:{},circlemarker:{}},initialize:function(t){for(var e in this.options)this.options.hasOwnProperty(e)&&t[e]&&(t[e]=L.extend({},this.options[e],t[e]));this._toolbarClass="leaflet-draw-draw",L.Toolbar.prototype.initialize.call(this,t)},getModeHandlers:function(t){return[{enabled:this.options.polyline,handler:new L.Draw.Polyline(t,this.options.polyline),title:L.drawLocal.draw.toolbar.buttons.polyline},{enabled:this.options.polygon,handler:new L.Draw.Polygon(t,this.options.polygon),title:L.drawLocal.draw.toolbar.buttons.polygon},{enabled:this.options.rectangle,handler:new L.Draw.Rectangle(t,this.options.rectangle),title:L.drawLocal.draw.toolbar.buttons.rectangle},{enabled:this.options.circle,handler:new L.Draw.Circle(t,this.options.circle),title:L.drawLocal.draw.toolbar.buttons.circle},{enabled:this.options.marker,handler:new L.Draw.Marker(t,this.options.marker),title:L.drawLocal.draw.toolbar.buttons.marker},{enabled:this.options.circlemarker,handler:new L.Draw.CircleMarker(t,this.options.circlemarker),title:L.drawLocal.draw.toolbar.buttons.circlemarker}]},getActions:function(t){return[{enabled:t.completeShape,title:L.drawLocal.draw.toolbar.finish.title,text:L.drawLocal.draw.toolbar.finish.text,callback:t.completeShape,context:t},{enabled:t.deleteLastVertex,title:L.drawLocal.draw.toolbar.undo.title,text:L.drawLocal.draw.toolbar.undo.text,callback:t.deleteLastVertex,context:t},{title:L.drawLocal.draw.toolbar.actions.title,text:L.drawLocal.draw.toolbar.actions.text,callback:this.disable,context:this}]},setOptions:function(t){for(var e in L.setOptions(this,t),this._modes)this._modes.hasOwnProperty(e)&&t.hasOwnProperty(e)&&this._modes[e].handler.setOptions(t[e])}}),L.EditToolbar=L.Toolbar.extend({statics:{TYPE:"edit"},options:{edit:{selectedPathOptions:{dashArray:"10, 10",fill:!0,fillColor:"#fe57a1",fillOpacity:.1,maintainColor:!1}},remove:{},poly:null,featureGroup:null},initialize:function(t){t.edit&&(void 0===t.edit.selectedPathOptions&&(t.edit.selectedPathOptions=this.options.edit.selectedPathOptions),t.edit.selectedPathOptions=L.extend({},this.options.edit.selectedPathOptions,t.edit.selectedPathOptions)),t.remove&&(t.remove=L.extend({},this.options.remove,t.remove)),t.poly&&(t.poly=L.extend({},this.options.poly,t.poly)),this._toolbarClass="leaflet-draw-edit",L.Toolbar.prototype.initialize.call(this,t),this._selectedFeatureCount=0},getModeHandlers:function(t){var e=this.options.featureGroup;return[{enabled:this.options.edit,handler:new L.EditToolbar.Edit(t,{featureGroup:e,selectedPathOptions:this.options.edit.selectedPathOptions,poly:this.options.poly}),title:L.drawLocal.edit.toolbar.buttons.edit},{enabled:this.options.remove,handler:new L.EditToolbar.Delete(t,{featureGroup:e}),title:L.drawLocal.edit.toolbar.buttons.remove}]},getActions:function(t){var e=[{title:L.drawLocal.edit.toolbar.actions.save.title,text:L.drawLocal.edit.toolbar.actions.save.text,callback:this._save,context:this},{title:L.drawLocal.edit.toolbar.actions.cancel.title,text:L.drawLocal.edit.toolbar.actions.cancel.text,callback:this.disable,context:this}];return t.removeAllLayers&&e.push({title:L.drawLocal.edit.toolbar.actions.clearAll.title,text:L.drawLocal.edit.toolbar.actions.clearAll.text,callback:this._clearAllLayers,context:this}),e},addToolbar:function(t){var e=L.Toolbar.prototype.addToolbar.call(this,t);return this._checkDisabled(),this.options.featureGroup.on("layeradd layerremove",this._checkDisabled,this),e},removeToolbar:function(){this.options.featureGroup.off("layeradd layerremove",this._checkDisabled,this),L.Toolbar.prototype.removeToolbar.call(this)},disable:function(){this.enabled()&&(this._activeMode.handler.revertLayers(),L.Toolbar.prototype.disable.call(this))},_save:function(){this._activeMode.handler.save(),this._activeMode&&this._activeMode.handler.disable()},_clearAllLayers:function(){this._activeMode.handler.removeAllLayers(),this._activeMode&&this._activeMode.handler.disable()},_checkDisabled:function(){var t,e=0!==this.options.featureGroup.getLayers().length;this.options.edit&&(t=this._modes[L.EditToolbar.Edit.TYPE].button,e?L.DomUtil.removeClass(t,"leaflet-disabled"):L.DomUtil.addClass(t,"leaflet-disabled"),t.setAttribute("title",e?L.drawLocal.edit.toolbar.buttons.edit:L.drawLocal.edit.toolbar.buttons.editDisabled)),this.options.remove&&(t=this._modes[L.EditToolbar.Delete.TYPE].button,e?L.DomUtil.removeClass(t,"leaflet-disabled"):L.DomUtil.addClass(t,"leaflet-disabled"),t.setAttribute("title",e?L.drawLocal.edit.toolbar.buttons.remove:L.drawLocal.edit.toolbar.buttons.removeDisabled))}}),L.EditToolbar.Edit=L.Handler.extend({statics:{TYPE:"edit"},initialize:function(t,e){if(L.Handler.prototype.initialize.call(this,t),L.setOptions(this,e),this._featureGroup=e.featureGroup,!(this._featureGroup instanceof L.FeatureGroup))throw new Error("options.featureGroup must be a L.FeatureGroup");this._uneditedLayerProps={},this.type=L.EditToolbar.Edit.TYPE;var i=L.version.split(".");1===parseInt(i[0],10)&&parseInt(i[1],10)>=2?L.EditToolbar.Edit.include(L.Evented.prototype):L.EditToolbar.Edit.include(L.Mixin.Events)},enable:function(){!this._enabled&&this._hasAvailableLayers()&&(this.fire("enabled",{handler:this.type}),this._map.fire(L.Draw.Event.EDITSTART,{handler:this.type}),L.Handler.prototype.enable.call(this),this._featureGroup.on("layeradd",this._enableLayerEdit,this).on("layerremove",this._disableLayerEdit,this))},disable:function(){this._enabled&&(this._featureGroup.off("layeradd",this._enableLayerEdit,this).off("layerremove",this._disableLayerEdit,this),L.Handler.prototype.disable.call(this),this._map.fire(L.Draw.Event.EDITSTOP,{handler:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(t.getContainer().focus(),this._featureGroup.eachLayer(this._enableLayerEdit,this),this._tooltip=new L.Draw.Tooltip(this._map),this._tooltip.updateContent({text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext}),t._editTooltip=this._tooltip,this._updateTooltip(),this._map.on("mousemove",this._onMouseMove,this).on("touchmove",this._onMouseMove,this).on("MSPointerMove",this._onMouseMove,this).on(L.Draw.Event.EDITVERTEX,this._updateTooltip,this))},removeHooks:function(){this._map&&(this._featureGroup.eachLayer(this._disableLayerEdit,this),this._uneditedLayerProps={},this._tooltip.dispose(),this._tooltip=null,this._map.off("mousemove",this._onMouseMove,this).off("touchmove",this._onMouseMove,this).off("MSPointerMove",this._onMouseMove,this).off(L.Draw.Event.EDITVERTEX,this._updateTooltip,this))},revertLayers:function(){this._featureGroup.eachLayer((function(t){this._revertLayer(t)}),this)},save:function(){var t=new L.LayerGroup;this._featureGroup.eachLayer((function(e){e.edited&&(t.addLayer(e),e.edited=!1)})),this._map.fire(L.Draw.Event.EDITED,{layers:t})},_backupLayer:function(t){var e=L.Util.stamp(t);this._uneditedLayerProps[e]||(t instanceof L.Polyline||t instanceof L.Polygon||t instanceof L.Rectangle?this._uneditedLayerProps[e]={latlngs:L.LatLngUtil.cloneLatLngs(t.getLatLngs())}:t instanceof L.Circle?this._uneditedLayerProps[e]={latlng:L.LatLngUtil.cloneLatLng(t.getLatLng()),radius:t.getRadius()}:(t instanceof L.Marker||t instanceof L.CircleMarker)&&(this._uneditedLayerProps[e]={latlng:L.LatLngUtil.cloneLatLng(t.getLatLng())}))},_getTooltipText:function(){return{text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext}},_updateTooltip:function(){this._tooltip.updateContent(this._getTooltipText())},_revertLayer:function(t){var e=L.Util.stamp(t);t.edited=!1,this._uneditedLayerProps.hasOwnProperty(e)&&(t instanceof L.Polyline||t instanceof L.Polygon||t instanceof L.Rectangle?t.setLatLngs(this._uneditedLayerProps[e].latlngs):t instanceof L.Circle?(t.setLatLng(this._uneditedLayerProps[e].latlng),t.setRadius(this._uneditedLayerProps[e].radius)):(t instanceof L.Marker||t instanceof L.CircleMarker)&&t.setLatLng(this._uneditedLayerProps[e].latlng),t.fire("revert-edited",{layer:t}))},_enableLayerEdit:function(t){var e,i,o=t.layer||t.target||t;this._backupLayer(o),this.options.poly&&(i=L.Util.extend({},this.options.poly),o.options.poly=i),this.options.selectedPathOptions&&((e=L.Util.extend({},this.options.selectedPathOptions)).maintainColor&&(e.color=o.options.color,e.fillColor=o.options.fillColor),o.options.original=L.extend({},o.options),o.options.editing=e),o instanceof L.Marker?(o.editing&&o.editing.enable(),o.dragging.enable(),o.on("dragend",this._onMarkerDragEnd).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onMarkerDragEnd,this).on("MSPointerUp",this._onMarkerDragEnd,this)):o.editing.enable()},_disableLayerEdit:function(t){var e=t.layer||t.target||t;e.edited=!1,e.editing&&e.editing.disable(),delete e.options.editing,delete e.options.original,this._selectedPathOptions&&(e instanceof L.Marker?this._toggleMarkerHighlight(e):(e.setStyle(e.options.previousOptions),delete e.options.previousOptions)),e instanceof L.Marker?(e.dragging.disable(),e.off("dragend",this._onMarkerDragEnd,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onMarkerDragEnd,this).off("MSPointerUp",this._onMarkerDragEnd,this)):e.editing.disable()},_onMouseMove:function(t){this._tooltip.updatePosition(t.latlng)},_onMarkerDragEnd:function(t){var e=t.target;e.edited=!0,this._map.fire(L.Draw.Event.EDITMOVE,{layer:e})},_onTouchMove:function(t){var e=t.originalEvent.changedTouches[0],i=this._map.mouseEventToLayerPoint(e),o=this._map.layerPointToLatLng(i);t.target.setLatLng(o)},_hasAvailableLayers:function(){return 0!==this._featureGroup.getLayers().length}}),L.EditToolbar.Delete=L.Handler.extend({statics:{TYPE:"remove"},initialize:function(t,e){if(L.Handler.prototype.initialize.call(this,t),L.Util.setOptions(this,e),this._deletableLayers=this.options.featureGroup,!(this._deletableLayers instanceof L.FeatureGroup))throw new Error("options.featureGroup must be a L.FeatureGroup");this.type=L.EditToolbar.Delete.TYPE;var i=L.version.split(".");1===parseInt(i[0],10)&&parseInt(i[1],10)>=2?L.EditToolbar.Delete.include(L.Evented.prototype):L.EditToolbar.Delete.include(L.Mixin.Events)},enable:function(){!this._enabled&&this._hasAvailableLayers()&&(this.fire("enabled",{handler:this.type}),this._map.fire(L.Draw.Event.DELETESTART,{handler:this.type}),L.Handler.prototype.enable.call(this),this._deletableLayers.on("layeradd",this._enableLayerDelete,this).on("layerremove",this._disableLayerDelete,this))},disable:function(){this._enabled&&(this._deletableLayers.off("layeradd",this._enableLayerDelete,this).off("layerremove",this._disableLayerDelete,this),L.Handler.prototype.disable.call(this),this._map.fire(L.Draw.Event.DELETESTOP,{handler:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(t.getContainer().focus(),this._deletableLayers.eachLayer(this._enableLayerDelete,this),this._deletedLayers=new L.LayerGroup,this._tooltip=new L.Draw.Tooltip(this._map),this._tooltip.updateContent({text:L.drawLocal.edit.handlers.remove.tooltip.text}),this._map.on("mousemove",this._onMouseMove,this))},removeHooks:function(){this._map&&(this._deletableLayers.eachLayer(this._disableLayerDelete,this),this._deletedLayers=null,this._tooltip.dispose(),this._tooltip=null,this._map.off("mousemove",this._onMouseMove,this))},revertLayers:function(){this._deletedLayers.eachLayer((function(t){this._deletableLayers.addLayer(t),t.fire("revert-deleted",{layer:t})}),this)},save:function(){this._map.fire(L.Draw.Event.DELETED,{layers:this._deletedLayers})},removeAllLayers:function(){this._deletableLayers.eachLayer((function(t){this._removeLayer({layer:t})}),this),this.save()},_enableLayerDelete:function(t){(t.layer||t.target||t).on("click",this._removeLayer,this)},_disableLayerDelete:function(t){var e=t.layer||t.target||t;e.off("click",this._removeLayer,this),this._deletedLayers.removeLayer(e)},_removeLayer:function(t){var e=t.layer||t.target||t;this._deletableLayers.removeLayer(e),this._deletedLayers.addLayer(e),e.fire("deleted")},_onMouseMove:function(t){this._tooltip.updatePosition(t.latlng)},_hasAvailableLayers:function(){return 0!==this._deletableLayers.getLayers().length}})}(window,document)},function(t,e,i){"use strict";i.r(e);var o={_addUID:function(t){return this._uid?t+"-"+this._uid:t},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPreverseGeocoding"),t.className="GPwidget",t},_createShowReverseGeocodingElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowReverseGeocoding"),t.type="checkbox",t},_createShowReverseGeocodingPictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowReverseGeocodingPicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowReverseGeocoding"),e.title="Ouvrir la recherche inverse",e.addEventListener?e.addEventListener("click",(function(){t.onShowReverseGeocodingClick()})):e.attachEvent&&e.attachEvent("onclick",(function(){t.onShowReverseGeocodingClick()}));var i=document.createElement("span");return i.id=this._addUID("GPshowReverseGeocodingOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createReverseGeocodingWaitingElement:function(){var t=document.createElement("div");t.id=this._addUID("GPreverseGeocodingCalcWaitingContainer"),t.className="GPreverseGeocodingCalcWaitingContainerHidden";var e=document.createElement("p");return e.className="GPreverseGeocodingCalcWaiting",e.innerHTML="Recherche en cours...",t.appendChild(e),t},_createReverseGeocodingResultsPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPreverseGeocodingResultsPanel"),t.className="GPpanel GPreverseGeocodingComponentHidden",t},_createReverseGeocodingResultsListElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPreverseGeocodingResultsList"),t},_createReverseGeocodingResultElement:function(t,e){var i=this,o=document.getElementById(this._addUID("GPreverseGeocodingResultsList")),n=document.createElement("div");n.id=this._addUID("ReverseGeocodedLocation_"+e),n.className="GPautoCompleteProposal",n.innerHTML=t,n.title=t,n.addEventListener?(n.addEventListener("mouseover",(function(t){i.onReverseGeocodingResultMouseOver(t)})),n.addEventListener("mouseout",(function(t){i.onReverseGeocodingResultMouseOut(t)})),n.addEventListener("click",(function(t){"function"==typeof i.onReverseGeocodingResultClick&&i.onReverseGeocodingResultClick(t)}))):n.attachEvent&&(n.attachEvent("onmouseover",(function(t){i.onReverseGeocodingResultMouseOver(t)})),n.attachEvent("onmouseout",(function(t){i.onReverseGeocodingResultMouseOut(t)})),n.attachEvent("onclick",(function(t){"function"==typeof i.onReverseGeocodingResultClick&&i.onReverseGeocodingResultClick(t)}))),o.appendChild(n)},_createReverseGeocodingPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPreverseGeocodingPanel"),t.className="GPpanel",t},_createReverseGeocodingPanelHeaderElement:function(){var t=document.createElement("div");return t.className="GPpanelHeader",t},_createReverseGeocodingPanelReturnPictoElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPreverseGeocodingReturnPicto"),e.title="Nouvelle recherche",e.className="GPreverseGeocodingReturnPictoHidden",e.addEventListener?e.addEventListener("click",(function(e){document.getElementById(t._addUID("GPreverseGeocodingResultsPanel")).className="GProuteComponentHidden",document.getElementById(t._addUID("GPreverseGeocodingForm")).className="",document.getElementById(t._addUID("GPreverseGeocodingHeaderTitle")).innerHTML="Recherche inverse",document.getElementById(t._addUID("GPreverseGeocodingReturnPicto")).className="GPreverseGeocodingReturnPictoHidden",t.onGPreverseGeocodingReturnPictoClick(e)})):e.attachEvent&&e.attachEvent("onclick",(function(e){document.getElementById(t._addUID("GPreverseGeocodingResultsPanel")).className="GProuteComponentHidden",document.getElementById(t._addUID("GPreverseGeocodingForm")).className="",document.getElementById(t._addUID("GPreverseGeocodingHeaderTitle")).innerHTML="Recherche inverse",document.getElementById(t._addUID("GPreverseGeocodingReturnPicto")).className="GPreverseGeocodingReturnPictoHidden",t.onGPreverseGeocodingReturnPictoClick(e)})),e},_createReverseGeocodingPanelTitleElement:function(){var t=document.createElement("div");return t.className="GPpanelTitle",t.id=this._addUID("GPreverseGeocodingHeaderTitle"),t.innerHTML="Recherche inverse",t},_createReverseGeocodingPanelCloseElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPreverseGeocodingPanelClose"),e.className="GPpanelClose",e.title="Fermer le panneau",e.addEventListener?e.addEventListener("click",(function(){document.getElementById(t._addUID("GPshowReverseGeocodingPicto")).click()}),!1):e.attachEvent&&e.attachEvent("onclick",(function(){document.getElementById(t._addUID("GPshowReverseGeocodingPicto")).click()})),e},_createReverseGeocodingPanelFormElement:function(){var t=this,e=document.createElement("form");return e.id=this._addUID("GPreverseGeocodingForm"),e.addEventListener?e.addEventListener("submit",(function(e){e.preventDefault(),t.onReverseGeocodingSubmit()})):e.attachEvent&&e.attachEvent("onsubmit",(function(e){e.preventDefault(),t.onReverseGeocodingSubmit()})),e},_createReverseGeocodingFormModeChoiceGeocodingTypeElement:function(t){var e=this,i=document.createElement("div");i.className="GPflexInput";var o=document.createElement("label");o.className="GPreverseGeocodingCodeLabel",o.innerHTML="Recherche par",o.title="Recherche par",i.appendChild(o);var n=document.createElement("select");n.className="GPreverseGeocodingCode",n.addEventListener?n.addEventListener("change",(function(t){e.onReverseGeocodingTypeChange(t)})):n.attachEvent&&n.attachEvent("onchange",(function(t){e.onReverseGeocodingTypeChange(t)})),t&&Array.isArray(t)||(t=["StreetAddress","PositionOfInterest","CadastralParcel"]);for(var s=0;s<t.length;s++)switch(t[s]){case"PositionOfInterest":var a=document.createElement("option");a.value="PositionOfInterest",a.text="Lieux/toponymes",n.appendChild(a);break;case"StreetAddress":var r=document.createElement("option");r.value="StreetAddress",r.text="Adresses",n.appendChild(r);break;case"CadastralParcel":var l=document.createElement("option");l.value="CadastralParcel",l.text="Parcelles cadastrales",n.appendChild(l);break;case"Administratif":var c=document.createElement("option");c.value="Administratif",c.text="Unités administratives",n.appendChild(c)}return i.appendChild(n),i},_createReverseGeocodingFormModeChoiceGeocodingDelimitationElement:function(t){var e=this,i=document.createElement("div");i.className="GPflexInput";var o=document.createElement("label");o.className="GPreverseGeocodingCodeLabel",o.innerHTML="Délimitation",o.title="Délimitation",i.appendChild(o);var n=document.createElement("select");n.className="GPreverseGeocodingCode",n.addEventListener?n.addEventListener("change",(function(t){e.onReverseGeocodingDelimitationChange(t)})):n.attachEvent&&n.attachEvent("onchange",(function(t){e.onReverseGeocodingDelimitationChange(t)})),t&&Array.isArray(t)||(t=["Point","Circle","Extent"]);for(var s=0;s<t.length;s++)switch(t[s].toLowerCase()){case"point":var a=document.createElement("option");a.value="point",a.text="Pointer un lieu",n.appendChild(a);break;case"circle":var r=document.createElement("option");r.value="circle",r.text="Dessiner un cercle",n.appendChild(r);break;case"extent":var l=document.createElement("option");l.value="extent",l.text="Dessiner une emprise",n.appendChild(l)}return i.appendChild(n),i},_createReverseGeocodingSubmitFormElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPreverseGeocodingSubmit"),t.className="GPinputSubmit",t.type="submit",t.value="Rechercher",t}};e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(40),n=i(2),s=i.n(n),a=i(34),r=i(140),l=i(36),c=i(142),u=i(162),h=a.default.getLogger("route(plus)"),d=s.a.Control.extend({includes:u.default,options:{position:"topleft",collapsed:!0,graphs:["Voiture","Pieton"],exclusions:{toll:!1,tunnel:!1,bridge:!1},disableReverse:!1,routeOptions:{},autocompleteOptions:{}},initialize:function(t){s.a.Util.setOptions(this,t),this._uid=l.default.generate(),this._initTransport(),this._initExclusions(),this._initComputation(),this._showRouteContainer=null,this._pictoRouteContainer=null,this._waitingContainer=null,this._formRouteContainer=null,this._resultsRouteContainer=null,this._isDesktop=this._detectSupport(),this._currentPoints=[],this._currentTransport=null,this._currentComputation=null,this._currentExclusions=[],this._geojsonRoute=null,this._geojsonSections=null,this._waiting=!1,this._timer=null,this._currentRouteInformations=null,this._resources={},this._noRightManagement=!1,this._checkRightsManagement()},onAdd:function(t){var e=this._container=this._initLayout(t);return s.a.DomEvent.disableClickPropagation(e).disableScrollPropagation(e),e},onRemove:function(){},_initTransport:function(){this._currentTransport="Voiture";var t=this.options.graphs;t&&0!==t.length||(this.options.graphs=["Voiture","Pieton"]),s.a.Util.isArray(t)&&t.length&&("Voiture"!==t[0]&&"Pieton"!==t[0]||(this._currentTransport=t[0]));var e=this.options.routeOptions;e.graph&&(this._currentTransport=e.graph)},_initComputation:function(){this._currentComputation="fastest";var t=this.options.routeOptions;t.routePreference&&(this._currentComputation=t.routePreference)},_initExclusions:function(){this._currentExclusions=[];var t=this.options.exclusions;if(t&&0!==Object.keys(t).length||(this.options.exclusions={toll:!1,tunnel:!1,bridge:!1}),t&&Object.keys(t).length)for(var e in t)t.hasOwnProperty(e)&&t.k&&this._currentExclusions.push(e);var i=this.options.routeOptions;s.a.Util.isArray(i.exclusions)&&(this._currentExclusions=i.exclusions)},_checkRightsManagement:function(){var t=null,e=[],i=null;i=this.options.routeOptions.apiKey,(e=(t=this.options.routeOptions.filterOptions)?t.type:[])&&0!==e.length||(e=["Voiture","Pieton"]);var o=r.default.check({key:i||this.options.apiKey,resources:e,services:["Itineraire"]});i=this.options.autocompleteOptions.apiKey,(e=(t=this.options.autocompleteOptions.filterOptions)?t.type:[])&&0!==e.length||(e=["StreetAddress","PositionOfInterest"]);var n=r.default.check({key:i||this.options.apiKey,resources:e,services:["AutoCompletion"]});o||n||(this._noRightManagement=!0),n&&(this._resources.AutoCompletion={},this._resources.AutoCompletion.resources=n.AutoCompletion,this._resources.AutoCompletion.key=n.key),o&&(this._resources.Itineraire={},this._resources.Itineraire.resources=o.Itineraire,this._resources.Itineraire.key=o.key)},_detectSupport:function(){var t=!0,e=window.navigator.userAgent.toLowerCase();return-1===e.indexOf("iphone")&&-1===e.indexOf("ipod")&&-1===e.indexOf("ipad")&&-1===e.indexOf("android")&&-1===e.indexOf("mobile")&&-1===e.indexOf("blackberry")&&-1===e.indexOf("tablet")&&-1===e.indexOf("phone")&&-1===e.indexOf("touch")||(t=!1),-1===e.indexOf("msie")&&-1===e.indexOf("trident")||(t=!0),t},_initLayout:function(t){var e=this._createMainContainerElement(),i=this._showRouteContainer=this._createShowRouteElement();e.appendChild(i),this.options.collapsed||(i.checked=!0);var o=this._pictoRouteContainer=this._createShowRoutePictoElement();e.appendChild(o);var n=this._createRoutePanelElement(),s=this._createRoutePanelHeaderElement();n.appendChild(s);for(var a=this._formRouteContainer=this._createRoutePanelFormElement(),r=this._createRoutePanelFormPointsElement(t),l=0;l<r.length;l++)a.appendChild(r[l]);var c=this._createRoutePanelFormModeChoiceElement();c.appendChild(this._createRoutePanelFormModeChoiceTransportElement(this.options.graphs)),c.appendChild(this._createRoutePanelFormModeChoiceComputeElement()),a.appendChild(c),a.appendChild(this._createShowRouteExclusionsElement()),a.appendChild(this._createShowRouteExclusionsPictoElement());var u=this._createRoutePanelFormExclusionsElement();u.appendChild(this._createRoutePanelFormExclusionOptionsElement(this.options.exclusions)),a.appendChild(u);var h=this._createRouteSubmitFormElement();a.appendChild(h),n.appendChild(a);var d=this._resultsRouteContainer=this._createRoutePanelResultsElement();n.appendChild(d);var p=this._waitingContainer=this._createRouteWaitingElement();return n.appendChild(p),e.appendChild(n),e},_createRoutePanelFormPointsElement:function(t){var e=[],i=1,o=new c.default({apiKey:this.options.apiKey||null,tag:{id:i,unique:this._uid,label:"Départ",color:"blue",display:!0},disableReverse:this.options.disableReverse,autocompleteOptions:this.options.autocompleteOptions||null});o.setMap(t);var n=this.options.routeOptions;for(n.startPoint&&(o._inputAutoCompleteContainer.value=n.startPoint.x+" , "+n.startPoint.y,o.setCoordinate({lng:n.startPoint.x,lat:n.startPoint.y})),e.push(o.getContainer()),this._currentPoints.push(o),i=2;i<7;i++){var s=new c.default({apiKey:this.options.apiKey||null,tag:{id:i,unique:this._uid,label:"Etape",color:"green",display:!1,removeOption:!0},disableReverse:this.options.disableReverse,autocompleteOptions:this.options.autocompleteOptions||null});s.setMap(t),e.push(s.getContainer()),this._currentPoints.push(s)}var a=new c.default({apiKey:this.options.apiKey||null,tag:{id:i,unique:this._uid,label:"Arrivée",color:"red",display:!0,addOption:!0,removeOption:!1},disableReverse:this.options.disableReverse,autocompleteOptions:this.options.autocompleteOptions||null});return a.setMap(t),n.endPoint&&(a._inputAutoCompleteContainer.value=n.endPoint.x+" , "+n.endPoint.y,a.setCoordinate({lng:n.endPoint.x,lat:n.endPoint.y})),e.push(a.getContainer()),this._currentPoints.push(a),e},onShowRoutePanelClick:function(t){h.log("onShowRoutePanelClick",t),this._geojsonSections||this._clear()},onRouteModeComputationChange:function(t){h.log("onRouteModeComputationChange",t);var e=t.target.selectedIndex,i=t.target.options[e].value;i&&(h.log(i),this._currentComputation=i)},onRouteModeComputationChangeAndRun:function(t){h.log("onRouteModeComputationChangeAndRun",t),this.onRouteModeComputationChange(t),this._clearRouteResultsDetails(),this._clearRouteResultsGeometry(),this._clearRouteResultsFeatureGeometry(),this.onRouteComputationSubmit({computation:this._currentComputation,transport:this._currentTransport,exclusions:this._currentExclusions})},onRouteModeTransportChange:function(t){h.log("onRouteModeTransportChange",t);var e=t.target.value;e&&(h.log(e),this._currentTransport=e)},onShowRouteExclusionsClick:function(t){h.log("onShowRouteExclusionsClick",t)},onRouteExclusionsChange:function(t){h.log("onRouteExclusionsChange",t);var e=t.target.value,i=t.target.checked;if(e){h.log(e,i);for(var o=!1,n=null,s=0;s<this._currentExclusions.length;s++)this._currentExclusions[s]===e&&(n=s,o=!0);!o&&i&&this._currentExclusions.push(e),o&&!i&&(this._currentExclusions[n]=null)}},onRouteComputationSubmit:function(t){h.log("onRouteComputationSubmit",t);var e=this._currentPoints,i=e[0].getCoordinate();e[0].dragging(!1),h.log("start",i);var o=e[e.length-1].getCoordinate();e[e.length-1].dragging(!1),h.log("end",o);for(var n=[],s=1;s<e.length-1;s++){var a=e[s].getCoordinate();e[s].dragging(!1),a&&(h.log("step",a),n.push(a))}if(!this._noRightManagement){this._currentTransport=t.transport,this._currentComputation=t.computation,this._currentExclusions=t.exclusions,this._displayWaitingContainer();var r=this;this._requestRouting({startPoint:i,endPoint:o,viaPoints:n,graph:this._currentTransport,routePreference:this._currentComputation,exclusions:this._currentExclusions,geometryInInstructions:!0,distanceUnit:"m",onSuccess:function(t){h.log(t),t&&r._fillRouteResultsDetails(t)},onFailure:function(t){r._hideWaitingContainer(),r._clearRouteResultsDetails(),h.log(t.message)}})}},onShowRouteResultsNewClick:function(t){h.log("onShowRouteResultsNewClick",t);for(var e=this._currentPoints,i=0;i<e.length;i++)e[i].dragging(!0);this._clearRouteResultsDetails(),this._clearRouteResultsGeometry(),this._clearRouteResultsFeatureGeometry()},onRouteResultsDetailsMouseOver:function(t){h.log("onRouteResultsDetailsMouseOver",t);var e=l.default.index(t.target.id);this._isDesktop&&this._geojsonSections&&this._geojsonSections.eachLayer((function(t){t.feature.id===parseInt(e,10)&&t.setStyle({weight:10,color:"#0F9DE8",opacity:.5})}))},onRouteResultsDetailsMouseOut:function(t){h.log("onRouteResultsDetailsMouseOut",t);var e=l.default.index(t.target.id);this._isDesktop&&this._geojsonSections&&this._geojsonSections.eachLayer((function(t){t.feature.id===parseInt(e,10)&&t.setStyle({color:"#ED7F10",weight:5,opacity:.75})}))},onRouteResultsDetailsClick:function(t){h.log("onRouteResultsDetailsClick",t);var e=l.default.index(t.target.id),i=this;if(!this._isDesktop&&this._geojsonSections){var o=t.target.title,n=t.target.innerHTML;this._geojsonSections.eachLayer((function(i){i.feature.id===parseInt(e,10)&&(t.target.innerHTML=o,i.setStyle({weight:10,color:"#0F9DE8",opacity:.5}))})),clearTimeout(1e3),setTimeout((function(){i._geojsonSections.eachLayer((function(i){i.feature.id===parseInt(e,10)&&(t.target.innerHTML=n,i.setStyle({color:"#ED7F10",weight:5,opacity:.75}))}))}),1e3)}},_requestRouting:function(t){if(t&&0!==Object.keys(t).length&&t.startPoint&&t.endPoint)if(h.log(t),this._noRightManagement)h.log("no rights for all service !?");else if(this._resources.Itineraire){var e=this._resources.Itineraire.resources;if(e&&0!==Object.keys(e).length){var i=this._resources.Itineraire.key,n={};s.a.Util.extend(n,this.options.routeOptions),s.a.Util.extend(n,t);for(var a=!1,r=0;r<e.length;r++)e[r]===n.graph&&(a=!0);a?(s.a.Util.extend(n,{apiKey:this.options.routeOptions.apiKey||this.options.apiKey||i}),s.a.Util.extend(n,{ssl:this.options.ssl}),h.log(n),o.default.Services.route(n)):h.log("no rights for this service !?")}}else h.log("no rights for this service !?")},_fillRouteResultsDetails:function(t){var e=t.totalDistance,i=t.totalTime,o=this._simplifiedInstructions(t.routeInstructions);o&&this._fillRouteResultsDetailsContainer(e,i,o);var n=t.routeGeometry;n&&this._fillRouteResultsDetailsGeometry(n);var a=0!==o[0].geometry.length;o&&a&&this._fillRouteResultsDetailsFeatureGeometry(o);var r=t.bbox;if(r){var l=this._map,c=s.a.latLngBounds([r.bottom,r.left],[r.top,r.right]);l.fitBounds(c,{padding:[1,1]})}this._currentRouteInformations=t,this._formRouteContainer.className="GProuteComponentHidden",this._hideWaitingContainer(),this._resultsRouteContainer.className=""},_fillRouteResultsDetailsContainer:function(t,e,i){this._resultsRouteValuesContainer=this._addRouteResultsValuesElement(t,e,this._convertSecondsToTime),this._resultsRouteDetailsContainer=this._addRouteResultsDetailsElement(i,this._convertSecondsToTime)},_fillRouteResultsDetailsGeometry:function(t){this._clearRouteResultsGeometry();var e=this._map;this._geojsonRoute=s.a.geoJson(t,{style:{color:"#ff7800",weight:5,opacity:.65}}).addTo(e)},_fillRouteResultsDetailsFeatureGeometry:function(t){this._clearRouteResultsFeatureGeometry();for(var e=this._map,i={type:"FeatureCollection",features:[]},o=0;o<t.length;o++){var n=t[o],a=o+1;i.features.push({id:a,type:"Feature",geometry:n.geometry,properties:{popupContent:"("+a+") distance : "+this._convertDistance(n.distance)+" / temps : "+this._convertSecondsToTime(n.duration)}})}var r=this;function l(t){var e=t.target;r._geojsonSections.resetStyle(e);var i=s.a.DomUtil.get("GProuteResultsDetailsInstruction_"+e.feature.id+"-"+r._uid);s.a.DomUtil.removeClass(i,"GProuteResultsDetailsHighlight")}function c(t){var e=t.target;h.log(e),e.setStyle({weight:10,color:"#0F9DE8",opacity:.5});var i=s.a.DomUtil.get("GProuteResultsDetailsInstruction_"+e.feature.id+"-"+r._uid);s.a.DomUtil.addClass(i,"GProuteResultsDetailsHighlight")}this._geojsonSections=s.a.geoJson(i,{style:{color:"#ED7F10",weight:5,opacity:.75},onEachFeature:function(t,e){e.on({mouseover:c,mouseout:l}),e.bindPopup(t.properties.popupContent)}}).addTo(e)},_clear:function(){this._currentTransport=null,this._currentExclusions=[],this._currentComputation=null,this._clearRouteResultsDetails(),this._clearRouteResultsGeometry(),this._clearRouteResultsFeatureGeometry();for(var t=0;t<this._currentPoints.length;t++)this._currentPoints[t].clear()},_clearRouteResultsDetails:function(){if(this._currentRouteInformations=null,this._resultsRouteDetailsContainer){var t=this._resultsRouteDetailsContainer;if(t.childElementCount)for(;t.firstChild;)t.removeChild(t.firstChild)}if(this._resultsRouteValuesContainer){var e=this._resultsRouteValuesContainer;if(e.childElementCount)for(;e.firstChild;)e.removeChild(e.firstChild)}},_clearRouteResultsGeometry:function(){var t=this._map;null!=this._geojsonRoute&&(t.removeLayer(this._geojsonRoute),this._geojsonRoute=null)},_clearRouteResultsFeatureGeometry:function(){var t=this._map;null!=this._geojsonSections&&(t.removeLayer(this._geojsonSections),this._geojsonSections=null)},_displayWaitingContainer:function(){this._waitingContainer.className="GProuteCalcWaitingContainerVisible",this._waiting=!0,this._timer&&(clearTimeout(this._timer),this._timer=null);var t=this;this._timer=setTimeout((function(){!0===t._waiting?t._hideWaitingContainer():t._timer&&clearTimeout(t._timer)}),16e3)},_hideWaitingContainer:function(){this._waiting&&(this._waitingContainer.className="GProuteCalcWaitingContainerHidden",this._waiting=!1,clearTimeout(this._timer),this._timer=null)},_simplifiedInstructions:function(t){var e=[],i=t[0];1===t.length&&e.push(i);for(var o=1;o<t.length;o++){var n=t[o];if(n.instruction===i.instruction){i.distance=(parseFloat(n.distance)+parseFloat(i.distance)).toString(),i.duration=(parseFloat(n.duration)+parseFloat(i.duration)).toString();for(var s=1;s<n.geometry.coordinates.length;s++)i.geometry.coordinates.push(n.geometry.coordinates[s]);o===t.length-1&&(e.push(i),i=null)}else e.push(i),i=n,o===t.length-1&&(e.push(n),i=null)}return h.log(e),e},_convertSecondsToTime:function(t){t=Math.round(t);var e=Math.floor(t/3600);e||(e="00");var i=t%3600,o=Math.floor(i/60);o||(o="00");var n=i%60,s=Math.ceil(n);return s||(s="00"),e+"h "+o+"m "+s+"s"},_convertDistance:function(t){var e=parseInt(t/1e3,10);return e?e+" km":parseInt(t,10)+" m"},compute:function(t,e){if(this._showRouteContainer.checked||this._pictoRouteContainer.click(),this._map){var i={computation:"fastest",transport:"Voiture",exclusions:[]};s.a.Util.extend(i,e);var o=this._currentPoints;o[0].setCoordinate(t[0]),s.a.DomUtil.get("GPlocationOrigin_1-"+this._uid).value=t[0].lng+" , "+t[0].lat;var n=t.length-1;o[6].setCoordinate(t[n]),s.a.DomUtil.get("GPlocationOrigin_7-"+this._uid).value=t[n].lng+" , "+t[n].lat;for(var a=1;a<t.length-1;a++){o[a].setCoordinate(t[a]),s.a.DomUtil.get("GPlocationOrigin_"+a+"-"+this._uid).value=t[a].lng+" , "+t[a].lat}"Voiture"===i.transport?s.a.DomUtil.get("GProuteTransportCar-"+this._uid).checked=!0:s.a.DomUtil.get("GProuteTransportPedestrian-"+this._uid).checked=!0,s.a.DomUtil.get("GProuteComputationSelect-"+this._uid).selectedIndex="fastest"===i.computation?0:1,this.onRouteComputationSubmit(i)}}});e.default=d},function(t,e,i){"use strict";i.r(e);var o=i(36),n=i(34).default.getLogger("RouteDOM"),s={_addUID:function(t){return this._uid?t+"-"+this._uid:t},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProute"),t.className="GPwidget",t},_createShowRouteElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowRoute"),t.type="checkbox",t},_createShowRoutePictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowRoutePicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowRoute"),e.title="Ouvrir le calcul d'itinéraire",e.addEventListener?e.addEventListener("click",(function(e){t.onShowRoutePanelClick(e)})):e.attachEvent&&e.attachEvent("onclick",(function(e){t.onShowRoutePanelClick(e)}));var i=document.createElement("span");return i.id=this._addUID("GPshowRouteOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createRoutePanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProutePanel"),t.className="GPpanel",t},_createRoutePanelHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Calcul d'itinéraire",e.appendChild(i);var o=document.createElement("div");return o.id=this._addUID("GProutePanelClose"),o.className="GPpanelClose",o.title="Masquer le panneau",o.addEventListener?o.addEventListener("click",(function(){document.getElementById(t._addUID("GPshowRoutePicto")).click()}),!1):o.attachEvent&&o.attachEvent("onclick",(function(){document.getElementById(t._addUID("GPshowRoutePicto")).click()})),e.appendChild(o),e},_createRoutePanelFormElement:function(){var t=this,e=document.createElement("form");return e.id=this._addUID("GProuteForm"),e.setAttribute("onkeypress","return event.keyCode != 13;"),e.addEventListener("submit",(function(e){n.log(e),e.preventDefault();var i,s=document.getElementsByClassName(t._addUID("GPlocationPoint")),a=s[0].childNodes[0].id,r=s[s.length-1].childNodes[0].id,l=o.default.index(a),c=o.default.index(r);if(""===document.getElementById(t._addUID("GPlocationOrigin_"+l)).value&&""===document.getElementById(t._addUID("GPlocationOriginCoords_"+l)).value||""===document.getElementById(t._addUID("GPlocationOrigin_"+c)).value&&""===document.getElementById(t._addUID("GPlocationOriginCoords_"+c)).value)return!1;document.getElementById(t._addUID("GProuteResultsStages")).innerHTML="";for(var u=0;u<s.length;u++){var h=s[u].childNodes[0].id;if(i=o.default.index(h),"GPflexInput GPlocationStageFlexInput"===document.getElementById(t._addUID("GPlocationPoint_"+i)).className){var d=document.createElement("div");d.className="GProuteResultsStages";var p=document.createElement("div");p.className="GProuteResultStageLabel",p.innerHTML=document.getElementById(t._addUID("GPlocationOriginLabel_"+i)).innerHTML+" :",d.appendChild(p);var m=document.createElement("div");m.className="GProuteResultStageValue";var f=document.getElementById(t._addUID("GPlocationOriginCoords_"+i)),_=f.value,g="GPlocationOriginVisible"===f.className;m.innerHTML=null!==_&&""!==_&&g?_:document.getElementById(t._addUID("GPlocationOrigin_"+i)).value,d.appendChild(m),""!==m.innerHTML&&document.getElementById(t._addUID("GProuteResultsStages")).appendChild(d)}}var v=null;if(document.getElementById(t._addUID("GProuteComputationSelect"))){var y=document.getElementById(t._addUID("GProuteResultsComputationSelect"));y.selectedIndex=document.getElementById(t._addUID("GProuteComputationSelect")).selectedIndex,v=y.options[y.selectedIndex].value}var E=null;document.getElementById(t._addUID("GProuteTransportCar"))&&document.getElementById(t._addUID("GProuteTransportCar")).checked&&(E=document.getElementById(t._addUID("GProuteTransportCar")).value),document.getElementById(t._addUID("GProuteTransportPedestrian"))&&document.getElementById(t._addUID("GProuteTransportPedestrian")).checked&&(E=document.getElementById(t._addUID("GProuteTransportPedestrian")).value);for(var P=[],w=document.getElementsByClassName("GProuteExclusionsOption"),C=0;C<w.length;C++){i=w[C].htmlFor;var M=document.getElementById(i);M.checked||P.push(M.value)}return t.onRouteComputationSubmit({computation:v,transport:E,exclusions:P}),!1})),e},_createRoutePanelResultsElement:function(){var t=document.createElement("div");t.id=this._addUID("GProuteResultsPanel"),t.className="GProuteComponentHidden",t.appendChild(this._createRouteResultsStagesElement()),t.appendChild(this._createRouteResultsElement());var e=document.createElement("div");e.className="GPfakeBorder GPfakeBorderLeft",t.appendChild(e),t.appendChild(this._createRouteShowResultsDetailsElement());var i=document.createElement("label");i.htmlFor=this._addUID("GProuteResultsShowDetails"),i.innerHTML="Afficher le détail",t.appendChild(i);var o=document.createElement("label");o.htmlFor=this._addUID("GProuteResultsShowDetails"),o.innerHTML="Masquer le détail",t.appendChild(o);var n=document.createElement("div");return n.className="GPfakeBorder",t.appendChild(n),t.appendChild(this._createRouteResultsDetailsElement()),t},_createRouteWaitingElement:function(){var t=document.createElement("div");t.id=this._addUID("GProuteCalcWaitingContainer"),t.className="GProuteCalcWaitingContainerHidden";var e=document.createElement("p");return e.className="GProuteCalcWaiting",e.innerHTML="Calcul en cours...",t.appendChild(e),t},_createRouteResultsStagesElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProuteResultsStages"),t},_createRouteResultsElement:function(){var t=this,e=document.createElement("div");e.id=this._addUID("GProuteResults");var i=document.createElement("div");i.id=this._addUID("GProuteResultsValues"),e.appendChild(i);var o=document.createElement("div");o.id=this._addUID("GProuteResultsMode");var n=document.createElement("select");n.id=this._addUID("GProuteResultsComputationSelect"),n.className="GPinputSelect",n.addEventListener("change",(function(e){t.onRouteModeComputationChangeAndRun(e)}));for(var s=[{code:"fastest",label:"Plus rapide"},{code:"shortest",label:"Plus court"}],a=0;a<s.length;a++){var r=document.createElement("option");r.value=s[a].code,r.text=s[a].label,n.appendChild(r)}o.appendChild(n),e.appendChild(o);var l=document.createElement("div");return l.id=this._addUID("GProuteResultsNew"),l.title="Modifier le calcul",l.addEventListener("click",(function(e){document.getElementById(t._addUID("GProuteResultsPanel")).className="GProuteComponentHidden",document.getElementById(t._addUID("GProuteForm")).className="",t.onShowRouteResultsNewClick(e)})),e.appendChild(l),e},_addRouteResultsValuesElement:function(t,e,i){var o=document.getElementById(this._addUID("GProuteResultsValues"));if(o.childElementCount)for(;o.firstChild;)o.removeChild(o.firstChild);var n=document.createElement("div");n.className="GProuteResultsValue";var s=document.createElement("label");s.className="GProuteResultsValueLabel",s.innerHTML="Distance :",n.appendChild(s);var a=0;if(parseInt(t/1e3,10)){var r=Math.round(t);a=(r/=1e3)+" km"}else a=Math.round(t)+" m";var l=document.createElement("div");l.id=this._addUID("GProuteResultsValueDist"),l.innerHTML=a,n.appendChild(l),o.appendChild(n);var c=document.createElement("div");c.className="GProuteResultsValue";var u=document.createElement("label");u.className="GProuteResultsValueLabel",u.innerHTML="Durée :",c.appendChild(u);var h=document.createElement("div");return h.id=this._addUID("GProuteResultsValueDist"),h.innerHTML=i(e),c.appendChild(h),o.appendChild(c),o},_createRouteShowResultsDetailsElement:function(){var t=document.createElement("input");return t.id=this._addUID("GProuteResultsShowDetails"),t.type="checkbox",t},_createRouteResultsDetailsElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProuteResultsDetails"),t},_addRouteResultsDetailsElement:function(t,e){var i=this,o=document.getElementById(this._addUID("GProuteResultsDetails"));if(o.childElementCount)for(;o.firstChild;)o.removeChild(o.firstChild);for(var n=0,s=0,a=0;a<t.length;a++){var r=a+1,l=t[a],c=document.createElement("div");c.className="GProuteResultsDetailsNumber",c.innerHTML=r+".",o.appendChild(c),s+=parseFloat(l.duration),n+=parseFloat(l.distance);var u=0;if(parseInt(n/1e3,10)){var h=Math.round(n);u=(h/=1e3)+" km"}else u=Math.round(n)+" m";var d=document.createElement("div");d.className="GProuteResultsDetailsInstruction",d.id=this._addUID("GProuteResultsDetailsInstruction_"+r),d.title="distance : "+u+" / temps : "+e(s),d.innerHTML=l.instruction,d.addEventListener("mouseover",(function(t){i.onRouteResultsDetailsMouseOver(t)})),d.addEventListener("mouseout",(function(t){i.onRouteResultsDetailsMouseOut(t)})),d.addEventListener("click",(function(t){"function"==typeof i.onRouteResultsDetailsClick&&i.onRouteResultsDetailsClick(t)})),o.appendChild(d)}return o},_createRoutePanelFormPointElement:function(t,e,i){var o=this,n=document.createElement("div");n.id="GProutePoint"+t,n.className=i?"GPflexInput GProuteStageFlexInput":"GPflexInput GProuteStageFlexInputHidden";var s=document.createElement("label");s.id="GProuteOriginLabel"+t,s.htmlFor="GProuteOrigin"+t,s.innerHTML=e,s.addEventListener("click",(function(){var t=this.id.charAt(this.id.length-1);document.getElementById("GProuteOriginCoords"+t).value="";for(var e=1;e<8;e++)document.getElementById("GProutePoint"+e).style.display="flex";document.getElementById("GProuteForm").className="",document.getElementById("GProuteOriginPointer"+t).checked=!1,document.getElementById("GProuteOrigin"+t).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+t).className="GProuteOriginHidden"})),n.appendChild(s);var a=document.createElement("input");a.id="GProuteOrigin"+t,a.className="GProuteOriginVisible",a.type="text",a.placeholder="Saisir une adresse",a.addEventListener("keyup",(function(t){var e=t.which||t.keyCode;if(13!==e&&10!==e){var i=this.id.charAt(this.id.length-1);document.getElementById("GProuteOrigin"+i).value.length>2?document.getElementById("GProuteAutoCompleteList"+i).style.display="block":document.getElementById("GProuteAutoCompleteList"+i).style.display="none",o.onAutoCompleteSearchText(t)}})),a.addEventListener("blur",(function(){var t=this.id.charAt(this.id.length-1);document.getElementById("GProuteAutoCompleteList"+t).style.display="none"})),n.appendChild(a);var r=document.createElement("input");r.id="GProuteOriginCoords"+t,r.className="GProuteOriginHidden",r.type="text",r.disabled=!0,n.appendChild(r);var l=document.createElement("input");l.id="GProuteOriginPointer"+t,l.type="checkbox",n.appendChild(l);var c=document.createElement("label");return c.id="GProuteOriginPointerImg"+t,c.htmlFor="GProuteOriginPointer"+t,c.className="GProuteOriginPointerImg",c.title="Pointer un lieu sur la carte",c.addEventListener("click",(function(t){t.preventDefault(),t.stopPropagation();var e,i=this.id.charAt(this.id.length-1);for(e=1;e<8;e++)i!==e&&(document.getElementById("GProuteOriginPointer"+e).checked=!1,"Pointer un lieu sur la carte"===document.getElementById("GProuteOriginCoords"+e).value&&(document.getElementById("GProuteOriginCoords"+e).value="",document.getElementById("GProuteOrigin"+e).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+e).className="GProuteOriginHidden"));if(document.getElementById("GProuteOriginPointer"+i).checked){for(document.getElementById("GProuteOriginCoords"+i).value="",e=1;e<8;e++)document.getElementById("GProutePoint"+e).style.display="flex";document.getElementById("GProuteForm").className="",document.getElementById("GProuteOriginPointer"+i).checked=!1,document.getElementById("GProuteOrigin"+i).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+i).className="GProuteOriginHidden"}else{for(document.getElementById("GProuteOriginCoords"+i).value="Pointer un lieu sur la carte",e=1;e<8;e++)document.getElementById("GProutePoint"+e).style.display=i===e?"flex":"none";document.getElementById("GProuteForm").className="GProuteFormMini",document.getElementById("GProuteOriginPointer"+i).checked=!0,document.getElementById("GProuteOrigin"+i).className="GProuteOriginHidden",document.getElementById("GProuteOriginCoords"+i).className="GProuteOriginVisible"}o.onRouteMapPointClick(t)})),n.appendChild(c),n},_createRoutePanelFormRemoveStageElement:function(t){var e=this,i=document.createElement("div");return i.id="GProuteStageRemove"+t,i.className="GProuteStageRemove",i.title="Supprimer l'étape",1!==t&&7!==t&&i.addEventListener("click",(function(t){var i=this.id.charAt(this.id.length-1);document.getElementById("GProutePoint"+i).className="GPflexInput GProuteStageFlexInputHidden",document.getElementById("GProuteOrigin"+i).value="",document.getElementById("GProuteOrigin"+i).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+i).value="",document.getElementById("GProuteOriginCoords"+i).className="GProuteOriginHidden",document.getElementById("GProuteStageAdd").style.display="",e.onRouteRemovePointClick(t)})),i},_createRoutePanelFormAddStageElement:function(){var t=this,e=document.createElement("div");return e.id="GProuteStageAdd",e.title="Ajouter une étape",e.addEventListener("click",(function(e){for(var i=1,o=0,n=2;n<7;n++)"GPflexInput GProuteStageFlexInputHidden"===document.getElementById("GProutePoint"+n).className?1===i&&(i=n):o++;i<7&&(document.getElementById("GProutePoint"+i).className="GPflexInput GProuteStageFlexInput"),4===o&&(document.getElementById("GProuteStageAdd").style.display="none"),t.onRouteAddPointClick(e)})),e},_createRoutePanelFormAutoCompleteListElement:function(t){var e=this,i=document.createElement("div");return i.id="GProuteAutoCompleteList"+t,i.className="GPadvancedAutoCompleteList",i.addEventListener?i.addEventListener("click",(function(i){e.onAutoCompletedResultsItemClick(i),document.getElementById("GProuteAutoCompleteList"+t).style.display="none"}),!1):i.attachEvent&&i.attachEvent("onclick",(function(i){e.onAutoCompletedResultsItemClick(i),document.getElementById("GProuteAutoCompleteList"+t).style.display="none"})),i},_createRouteAutoCompletedLocationElement:function(t,e,i){var o=document.getElementById("GProuteAutoCompleteList"+e),n=document.createElement("div");n.id="AutoCompletedLocation"+i,n.className="GPautoCompleteProposal",n.innerHTML=t.fullText,o.appendChild(n)},_createRoutePanelFormModeChoiceElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProuteModeChoice"),t},_createRoutePanelFormModeChoiceTransportElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GProuteTransportChoice");var o=document.createElement("span");o.className="GProuteModeLabel",o.innerHTML="Mode de transport",i.appendChild(o);for(var n=0;n<t.length;n++){var s=t[n];if("Voiture"===s){var a=document.createElement("input");a.id=this._addUID("GProuteTransportCar"),a.type="radio",a.name="GProuteTransport",a.value="Voiture",0===n&&(a.checked=!0),a.addEventListener?a.addEventListener("change",(function(t){e.onRouteModeTransportChange(t)})):a.attachEvent&&a.attachEvent("onchange",(function(t){e.onRouteModeTransportChange(t)})),i.appendChild(a);var r=document.createElement("label");r.className="GProuteTransportImg",r.htmlFor=this._addUID("GProuteTransportCar"),r.title="Voiture",i.appendChild(r)}if("Pieton"===s){var l=document.createElement("input");l.id=this._addUID("GProuteTransportPedestrian"),l.type="radio",l.name="GProuteTransport",l.value="Pieton",0===n&&(l.checked=!0),l.addEventListener?l.addEventListener("change",(function(t){e.onRouteModeTransportChange(t)})):l.attachEvent&&l.attachEvent("onchange",(function(t){e.onRouteModeTransportChange(t)})),i.appendChild(l);var c=document.createElement("label");c.className="GProuteTransportImg",c.htmlFor=this._addUID("GProuteTransportPedestrian"),c.title="Piéton",i.appendChild(c)}}return i},_createRoutePanelFormModeChoiceComputeElement:function(){var t=this,e=document.createElement("div");e.id=this._addUID("GProuteComputationChoice");var i=document.createElement("span");i.className="GProuteModeLabel",i.innerHTML="Mode de calcul",e.appendChild(i);var o=document.createElement("select");o.id=this._addUID("GProuteComputationSelect"),o.className="GPinputSelect",o.addEventListener("change",(function(e){t.onRouteModeComputationChange(e)}));for(var n=[{code:"fastest",label:"Plus rapide"},{code:"shortest",label:"Plus court"}],s=0;s<n.length;s++){var a=document.createElement("option");a.value=n[s].code,a.text=n[s].label,o.appendChild(a)}return e.appendChild(o),e},_createShowRouteExclusionsElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowRouteExclusions"),t.type="checkbox",t},_createShowRouteExclusionsPictoElement:function(){var t=this,e=document.createElement("label");return e.id=this._addUID("GPshowRouteExclusionsPicto"),e.className="GPshowMoreOptionsImage GPshowMoreOptions GPshowRouteExclusionsPicto",e.htmlFor=this._addUID("GPshowRouteExclusions"),e.title="Exclusions",e.addEventListener?e.addEventListener("click",(function(e){t.onShowRouteExclusionsClick(e)})):e.attachEvent&&e.attachEvent("onclick",(function(e){t.onShowRouteExclusionsClick(e)})),e},_createRoutePanelFormExclusionsElement:function(){var t=document.createElement("div");t.id=this._addUID("GProuteExclusions");var e=document.createElement("span");return e.className="GProuteExclusionsLabel",e.innerHTML="Passages autorisés",t.appendChild(e),t},_createRoutePanelFormExclusionOptionsElement:function(t){var e=this,i=document.createElement("div");for(var o in i.className="GProuteExclusionsOptions",t)if(t.hasOwnProperty(o)){var n=t[o];switch(o){case"toll":var s=document.createElement("input");s.id=this._addUID("GProuteExclusionsToll"),s.type="checkbox",s.value="Toll",s.checked=!n,s.addEventListener?s.addEventListener("change",(function(t){e.onRouteExclusionsChange(t)})):s.attachEvent&&s.attachEvent("onchange",(function(t){e.onRouteExclusionsChange(t)})),i.appendChild(s);var a=document.createElement("label");a.className="GProuteExclusionsOption",a.htmlFor=this._addUID("GProuteExclusionsToll"),a.innerHTML="Péages",i.appendChild(a);break;case"tunnel":var r=document.createElement("input");r.id=this._addUID("GProuteExclusionsTunnel"),r.type="checkbox",r.value="Tunnel",r.checked=!n,r.addEventListener?r.addEventListener("change",(function(t){e.onRouteExclusionsChange(t)})):r.attachEvent&&r.attachEvent("onchange",(function(t){e.onRouteExclusionsChange(t)})),i.appendChild(r);var l=document.createElement("label");l.className="GProuteExclusionsOption",l.htmlFor=this._addUID("GProuteExclusionsTunnel"),l.innerHTML="Tunnels",i.appendChild(l);break;case"bridge":var c=document.createElement("input");c.id=this._addUID("GProuteExclusionsBridge"),c.type="checkbox",c.value="Bridge",c.checked=!n,c.addEventListener?c.addEventListener("change",(function(t){e.onRouteExclusionsChange(t)})):c.attachEvent&&c.attachEvent("onchange",(function(t){e.onRouteExclusionsChange(t)})),i.appendChild(c);var u=document.createElement("label");u.className="GProuteExclusionsOption",u.htmlFor=this._addUID("GProuteExclusionsBridge"),u.innerHTML="Ponts",i.appendChild(u)}}return i},_createRouteSubmitFormElement:function(){var t=document.createElement("input");return t.id=this._addUID("GProuteSubmit"),t.className="GPinputSubmit",t.type="submit",t.value="Calculer",t},_createRouteFormResetElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GProuteReset"),e.title="Réinitialiser les paramètres",e.addEventListener("click",(function(e){t.onRouteResetClick(e)})),e}};e.default=s},function(t,e,i){"use strict";i.r(e);var o=i(40),n=i(2),s=i.n(n),a=i(34),r=i(140),l=i(36),c=i(164),u=i(145),h=i(165),d=a.default.getLogger("searchengine"),p=s.a.Control.extend({includes:h.default,options:{position:"topleft",collapsed:!0,displayInfo:!0,zoomTo:"",resources:[],placeholder:"Rechercher un lieu, une adresse",displayMarker:!0,markerStyle:"blue",displayAdvancedSearch:!0,advancedSearch:{},geocodeOptions:{},autocompleteOptions:{serviceOptions:{},triggerGeocode:!1,triggerDelay:1e3}},initialize:function(t){s.a.Util.setOptions(this,t),this._uid=l.default.generate(),this._showContainer=null,this._pictoContainer=null,this._inputContainer=null,this._suggestedContainer=null,this._suggestedLocations=[],this._geocodedContainer=null,this._geocodedLocations=[],this._filterContainer=null,this._currentGeocodingCode=null,this._currentGeocodingLocation=null,this._advancedSearchFilters={},this._advancedSearchCodes=[],this._marker=null,this._servicesRightManagement={},this._noRightManagement=!1,this._checkRightsManagement(),this._triggerHandler=null},onAdd:function(){this._initAdvancedSearchCodes(),this._initAdvancedSearchFilters();var t=this._initLayout();return s.a.DomEvent.disableClickPropagation(t).disableScrollPropagation(t),t},onRemove:function(t){this._clearSuggestedLocation(),this._clearGeocodedLocation(),null!=this._marker&&(t.removeLayer(this._marker),this._marker=null)},_checkRightsManagement:function(){this.options.resources&&0!==this.options.resources.length||(this.options.resources=["StreetAddress","PositionOfInterest"]);var t=null,e=[],i=null;i=this.options.geocodeOptions.apiKey,(e=(t=this.options.geocodeOptions.filterOptions)?t.type:[])&&0!==e.length||(e=this.options.resources||["StreetAddress","PositionOfInterest"]);var o=r.default.check({key:i||this.options.apiKey,resources:e,services:["Geocode"]});i=this.options.autocompleteOptions.apiKey,(e=(t=this.options.autocompleteOptions.filterOptions)?t.type:[])&&0!==e.length||(e=this.options.resources||["StreetAddress","PositionOfInterest"]);var n=r.default.check({key:i||this.options.apiKey,resources:e,services:["AutoCompletion"]});if(o||n||(this._noRightManagement=!0),n&&(this._servicesRightManagement.AutoCompletion={},this._servicesRightManagement.AutoCompletion.resources=n.AutoCompletion,this._servicesRightManagement.AutoCompletion.key=n.key),o&&(this._servicesRightManagement.Geocode={},this._servicesRightManagement.Geocode.resources=o.Geocode,this._servicesRightManagement.Geocode.key=o.key),!this.options.advancedSearch||0===Object.keys(this.options.advancedSearch).length)for(var s=this._servicesRightManagement.Geocode.resources,a=0;a<s.length;a++){var l=s[a];this.options.advancedSearch[l]=[]}},_initLayout:function(){var t=this._createMainContainerElement(),e=this._showContainer=this._createShowSearchEngineElement();t.appendChild(e),this.options.collapsed||(e.checked="true");var i=this._pictoContainer=this._createShowSearchEnginePictoElement();t.appendChild(i);var o=this._createSearchInputElement(this.options.placeholder);if(t.appendChild(o),this.options.displayAdvancedSearch){var n=this._createShowAdvancedSearchElement();t.appendChild(n);var s=this._createAdvancedSearchPanelElement(),a=this._createAdvancedSearchPanelHeaderElement(),r=this._createAdvancedSearchPanelFormElement(this._advancedSearchCodes),l=this._filterContainer=this._createAdvancedSearchFormFiltersElement();this._setFilter(this._advancedSearchCodes[0].id);var c=this._createAdvancedSearchFormInputElement();r.appendChild(l),r.appendChild(c),s.appendChild(a),s.appendChild(r),t.appendChild(s)}var u=this._createAutoCompleteElement(),h=this._suggestedContainer=this._createAutoCompleteListElement();u.appendChild(h),t.appendChild(u);var d=this._createGeocodeResultsElement(),p=this._geocodedContainer=this._createGeocodeResultsListElement();return d.appendChild(p),t.appendChild(d),t},_initAdvancedSearchCodes:function(){for(var t=[{id:"PositionOfInterest",title:"Lieux/toponymes"},{id:"StreetAddress",title:"Adresses"},{id:"CadastralParcel",title:"Parcelles cadastrales"},{id:"Administratif",title:"Administratif"}],e=Object.keys(this.options.advancedSearch),i=0;i<e.length;i++)for(var o=e[i],n=0;n<t.length;n++)t[n].id===o&&this._advancedSearchCodes.push(t[n]);0===this._advancedSearchCodes.length&&(this._advancedSearchCodes=t),d.log("advancedSearchCodes",this._advancedSearchCodes)},_initAdvancedSearchFilters:function(){var t={PositionOfInterest:[{name:"city",title:"Ville",filter:!1,sep:!0},{name:"importance",title:"Importance",filter:!0},{name:"nature",title:"Nature",filter:!0},{name:"territory",title:"Territoire",filter:!0},{name:"insee",title:"Code commune (INSEE)",filter:!0},{name:"department",title:"Département",filter:!0}],StreetAddress:[{name:"number",title:"Numéro",filter:!1,sep:!0},{name:"street",title:"Rue",filter:!1,sep:!0},{name:"postalCode",title:"Code Postal",filter:!1,sep:!0},{name:"city",title:"Ville",filter:!1,sep:!0},{name:"territory",title:"Territoire",filter:!0},{name:"insee",title:"Code commune (INSEE)",filter:!0},{name:"department",title:"Département",filter:!0}],CadastralParcel:[{name:"department",title:"Département",filter:!1,sep:!1,value:"__"},{name:"commune",title:"Commune",filter:!1,sep:!1,value:"___"},{name:"absorbedCity",title:"Commune absorbée",filter:!1,sep:!1,value:"___"},{name:"section",title:"Section",filter:!1,sep:!1,value:"__"},{name:"number",title:"Numéro",filter:!1,sep:!1,value:"____"}],Administratif:[{name:"prefecture",title:"Préfecture",filter:!0},{name:"inseeRegion",title:"Code région (INSEE)",filter:!0},{name:"inseeDepartment",title:"Code département (INSEE)",filter:!0},{name:"city",title:"Ville",filter:!1,sep:!0}]},e=this.options.advancedSearch;for(var i in e)if(e.hasOwnProperty(i)){if(!e[i]||0===e[i].length){e[i]=t[i];continue}for(var o=e[i],n=0;n<o.length;n++){var a=o[n];a.hasOwnProperty("filter")||(a.filter="municipality"!==a.name)}}s.a.Util.extend(this._advancedSearchFilters,t,e),d.log("advancedSearchFilters",this._advancedSearchFilters)},_setFilter:function(t){for(var e=this._filterContainer,i=!1,o=0;o<this._advancedSearchCodes.length;o++)if(this._advancedSearchCodes[o].id===t){i=!0;break}if(i){for(this._currentGeocodingCode=t;e.firstChild;)e.removeChild(e.firstChild);var n=this._advancedSearchFilters[t];if(n&&0!==n.length){for(var s=this._createAdvancedSearchFiltersTableElement(t,!0),a=0;a<n.length;a++){var r=this._createAdvancedSearchFiltersAttributElement(n[a]);s.appendChild(r)}return e.appendChild(s),e}}else for(;e.firstChild;)e.removeChild(e.firstChild)},_requestAutoComplete:function(t){if(t&&0!==Object.keys(t).length&&t.text)if(d.log(t),this._noRightManagement)d.log("no rights for all service !?");else if(this._servicesRightManagement.AutoCompletion){var e={};s.a.Util.extend(e,this.options.autocompleteOptions.serviceOptions),s.a.Util.extend(e,t);var i=this._servicesRightManagement.AutoCompletion.resources;if(i&&0!==Object.keys(i).length){i&&s.a.Util.isArray(i)&&!e.filterOptions&&(e.filterOptions||(e.filterOptions={}),e.filterOptions.type=i);var n=this._servicesRightManagement.AutoCompletion.key;s.a.Util.extend(e,{apiKey:e.apiKey||this.options.apiKey||n}),s.a.Util.extend(e,{ssl:this.options.ssl}),d.log(e),o.default.Services.autoComplete(e)}}else d.log("no rights for this service !?")},_fillAutoCompletedLocationListContainer:function(t){if(t&&0!==t.length){var e=this._suggestedContainer;if(e.childElementCount)for(;e.firstChild;)e.removeChild(e.firstChild);for(var i=0;i<t.length;i++)this._createAutoCompletedLocationElement(t[i],i)}},_requestGeocoding:function(t){if(t&&0!==Object.keys(t).length&&t.location)if(d.log(t),this._noRightManagement)d.log("no rights for all service !?");else if(this._servicesRightManagement.Geocode){var e={};s.a.Util.extend(e,this.options.geocodeOptions),s.a.Util.extend(e,t),e.hasOwnProperty("returnFreeForm")||s.a.Util.extend(e,{returnFreeForm:!0});var i=this._servicesRightManagement.Geocode.resources;if(i&&0!==Object.keys(i).length){i&&s.a.Util.isArray(i)&&!e.filterOptions&&(e.filterOptions||(e.filterOptions={}),e.filterOptions.type=i);var n=this._servicesRightManagement.Geocode.key;s.a.Util.extend(e,{apiKey:e.apiKey||this.options.apiKey||n}),s.a.Util.extend(e,{ssl:this.options.ssl}),d.log(e),o.default.Services.geocode(e)}}else d.log("no rights for this service !?")},_fillGeocodedLocationListContainer:function(t){if(t&&0!==t.length){var e=this._geocodedContainer;if(e.childElementCount)for(;e.firstChild;)e.removeChild(e.firstChild);for(var i=0;i<t.length;i++)d.log(t[i]),this._createGeocodedLocationElement(t[i],i);this._geocodedLocations=t}else this._clearGeocodedLocation()},_getGeocodeCoordinatesFromFullText:function(t,e){var i=t.fullText,o=this;this._requestGeocoding({location:i,onSuccess:function(t){d.log("request from Geocoding (coordinates null)",t),t.locations&&0!==t.locations.length&&t.locations[0].position&&o._suggestedLocations&&o._suggestedLocations[e]&&(o._suggestedLocations[e].position={x:t.locations[0].position.y,y:t.locations[0].position.x},o._locationsToBeDisplayed.unshift(o._suggestedLocations[e]),o._fillAutoCompletedLocationListContainer(o._locationsToBeDisplayed))},onFailure:function(){o._suggestedLocations&&o._suggestedLocations[e]&&o._createAutoCompletedLocationElement(o._suggestedLocations[e],e)}})},_setLabel:function(t){s.a.DomUtil.get("GPsearchInputText-"+this._uid).value=t||""},_setPosition:function(t,e){var i=this._map;i.setZoomAround(s.a.latLng(t.x,t.y),e,!0),i.panTo(s.a.latLng(t.x,t.y))},_getZoom:function(t){var e=this._map,i=this.options.zoomTo,o=null;if("function"==typeof i&&(d.trace("zoom function"),o=i.call(this,t)),"number"==typeof i&&(d.trace("zoom level"),o=i),"string"==typeof i)if("auto"===i)d.trace("zoom auto"),o=c.default.zoomToResultsByDefault(t);else{d.trace("zoom level parsing");var n=parseInt(i,10);isNaN(n)||(d.trace("zoom parsing"),o=n)}Number.isInteger=Number.isInteger||function(t){return"number"==typeof t&&isFinite(t)&&Math.floor(t)===t},o&&""!==o&&Number.isInteger(o)||(d.trace("zoom not found, current zoom..."),o=e.getZoom());var s=e.getMinZoom(),a=e.getMaxZoom();return o<s&&(d.trace("zoom level min..."),o=s),o>a&&(d.trace("zoom level max..."),o=a),d.trace("zoom",o),o},_setMarker:function(t,e,i,o){var n=this._map;if(null!=this._marker&&(n.removeLayer(this._marker),this._marker=null),t){var a=null;"string"==typeof o?a=new u.default(o):o instanceof s.a.Icon?a=o:(a=new u.default("blue"),d.log("Utilisation du marker par défaut !"));var r={clickable:!0,zIndexOffset:1e3,icon:a};if(this._marker=s.a.marker(s.a.latLng(t.x,t.y),r),this._marker.addTo(n),i){var l=null;if("string"!=typeof e){var c=[];if("DirectGeocodedLocation"===e.service)if(e.fields.freeform)l=e.fields.freeform;else{for(var h=this._advancedSearchFilters[e.type],p=0;p<h.length;p++){var m=h[p].name,f=e.fields[m];"string"!=typeof f&&"number"!=typeof f||c.push(f)}l=c.join(" - ")}else"SuggestedLocation"===e.service?e.fields.fullText?l=e.fields.fullText:(c.push(e.fields.street||""),c.push(e.fields.postalCode||""),c.push(e.fields.commune||""),"PositionOfInterest"===e.type&&(c.push(e.fields.poi||""),c.push(e.fields.kind||"")),l=c.join(" - ")):l="sans informations."}else l=e;this._marker.bindPopup(l)}}},_clearResults:function(){this._currentGeocodingLocation=null,this._clearSuggestedLocation(),this._clearGeocodedLocation(),this._setMarker()},_clearSuggestedLocation:function(){if(this._suggestedLocations=[],this._suggestedContainer)for(;this._suggestedContainer.firstChild;)this._suggestedContainer.removeChild(this._suggestedContainer.firstChild)},_clearGeocodedLocation:function(){if(this._geocodedLocations=[],this._geocodedContainer)for(;this._geocodedContainer.firstChild;)this._geocodedContainer.removeChild(this._geocodedContainer.firstChild)},onShowSearchEngineClick:function(){},onSearchResetClick:function(){this._clearResults()},onAutoCompleteSearchText:function(t){var e=t.target.value;if(e&&!(this._noRightManagement||(this._currentGeocodingLocation=e,e.length<3))){var i=this.options.autocompleteOptions.triggerGeocode,o=this.options.autocompleteOptions.triggerDelay,n=this;this._requestAutoComplete({text:e,onSuccess:function(t){if(d.log("request from AutoComplete",t),t){if(n._suggestedLocations=t.suggestedLocations,n._locationsToBeDisplayed=[],n._servicesRightManagement.Geocode&&n._servicesRightManagement.Geocode.key)for(var e=0;e<n._suggestedLocations.length;e++){var i=n._suggestedLocations[e];i.position&&0===i.position.x&&0===i.position.y&&i.fullText?n._getGeocodeCoordinatesFromFullText(i,e):n._locationsToBeDisplayed.push(i)}else n._locationsToBeDisplayed=n._suggestedLocations;n._fillAutoCompletedLocationListContainer(n._locationsToBeDisplayed),n._triggerHandler&&(clearTimeout(n._triggerHandler),n._triggerHandler=null,d.warn("Cancel a geocode request !"))}},onFailure:function(t){n._clearSuggestedLocation(),d.log(t.message),"No suggestion matching the search"===t.message&&i&&(n._triggerHandler&&(clearTimeout(n._triggerHandler),d.warn("Cancel the last geocode request !")),n._triggerHandler=setTimeout((function(){d.warn("Launch a geocode request (code postal) !"),n._requestGeocoding({location:e,returnFreeForm:!0,onSuccess:function(t){if(d.log("request from Geocoding",t),t){n._locationsToBeDisplayed=[];for(var e=t.locations,i=0;i<e.length;i++){var o=e[i];o.fullText=o.placeAttributes.freeform,o.position={x:o.position.y,y:o.position.x},n._locationsToBeDisplayed.push(o)}n._fillAutoCompletedLocationListContainer(e)}},onFailure:function(t){d.log(t.message)}})}),o))}})}},onAutoCompletedResultsItemClick:function(t){var e=l.default.index(t.target.id),i=t.target.innerHTML;if(d.log(e,i),d.log(this._locationsToBeDisplayed[e]),e){var o={x:this._locationsToBeDisplayed[e].position.y,y:this._locationsToBeDisplayed[e].position.x},n={service:"SuggestedLocation",type:this._locationsToBeDisplayed[e].type,fields:this._locationsToBeDisplayed[e]},s=this._getZoom(n);this._setLabel(i),this._setPosition(o,s),this.options.displayMarker&&this._setMarker(o,n,this.options.displayInfo,this.options.markerStyle)}},onGeocodingSearchSubmit:function(t){d.log(t);var e=t.target[0].value;if(e&&!this._noRightManagement){this._currentGeocodingLocation=e;var i=this;this._requestGeocoding({location:e,onSuccess:function(t){if(d.log("request from Geocoding",t),t){var e=t.locations;i._fillGeocodedLocationListContainer(e)}},onFailure:function(t){i._clearGeocodedLocation(),d.log(t.message)}})}},onGeocodedResultsItemClick:function(t){var e=l.default.index(t.target.id),i=t.target.innerHTML;if(d.log(e,i),d.log(this._geocodedLocations[e]),e){var o=this._geocodedLocations[e].position,n={service:"DirectGeocodedLocation",type:this._geocodedLocations[e].type,fields:this._geocodedLocations[e].placeAttributes},s=this._getZoom(n);this._setLabel(i),this._setPosition(o,s),this.options.displayMarker&&this._setMarker(o,n,this.options.displayInfo,this.options.markerStyle)}},onGeocodingAdvancedSearchCodeChange:function(t){d.log(t);var e=t.target.selectedIndex,i=t.target.options[e].value;i&&this._setFilter(i)},onGeocodingAdvancedSearchSubmit:function(t,e){if(d.log(e),e&&0!==e.length){var i={};i.type=[this._currentGeocodingCode];var o=this._currentGeocodingLocation||"";"CadastralParcel"===this._currentGeocodingCode&&(o="");for(var n=0;n<e.length;n++){var s=e[n];if(s.value)for(var a=this._advancedSearchFilters[this._currentGeocodingCode],r=0;r<a.length;r++){var l=a[r];if(l.name===s.key)if(l.filter)i[s.key]=s.value;else if(l.value){var c=s.value.length,u=l.value.length;if(u!==c){for(var h=u-c,p=l.value.charAt(0);p.length<h;)p+=p;var m=p.slice(0,h);s.value=s.value+m}o+=s.value}else"string"==typeof o&&(o={}),o[s.key]=s.value}}var f=this;this._requestGeocoding({location:o,filterOptions:i,onSuccess:function(t){if(d.log(t),t){var e=t.locations;f._fillGeocodedLocationListContainer(e)}},onFailure:function(t){f._clearGeocodedLocation(),d.log(t.message)}})}},setText:function(t,e,i){this._showContainer.checked||this._pictoContainer.click(),s.a.Util.extend(this.options,i);var o=s.a.DomUtil.get("GPsearchInputText-"+this._uid);(o.value=t,e)?s.a.DomUtil.get("GPsearchInput-"+this._uid).dispatchEvent(new Event("submit",{bubbles:!0,cancelable:!0})):o.dispatchEvent(new KeyboardEvent("keyup"))}});e.default=p},function(t,e,i){"use strict";i.r(e);e.default={advancedSearchFiltersByDefault:{PositionOfInterest:[{name:"importance",title:"Importance"},{name:"nature",title:"Nature"},{name:"territory",title:"Territoire"},{name:"insee",title:"Code INSEE"},{name:"municipality",title:"Ville"},{name:"department",title:"Département"}],StreetAddress:[{name:"territory",title:"Territoire"},{name:"insee",title:"Code INSEE"},{name:"municipality",title:"Ville"},{name:"department",title:"Département"}],CadastralParcel:[{name:"department",title:"Département",description:"Numéro du département (ex: 01, 94)"},{name:"commune",title:"Code commune (INSEE)",description:"Code commune (INSEE) : 3 chiffres (ex: 067)"},{name:"absorbedCity",title:"Commune absorbée",description:"Commune absorbée : 3 chiffres (ex: 000, 001)"},{name:"section",title:"Section",description:"Section : 2 caractères (ex: AA, 0D)"},{name:"number",title:"Numéro",description:"Numéro de la parcelle : 4 chiffres (ex: 0041, 0250)"}],Administratif:[{name:"prefecture",title:"Préfecture"},{name:"inseeRegion",title:"Code région (INSEE)"},{name:"inseeDepartment",title:"Code département (INSEE)"},{name:"municipality",title:"Ville"}]},zoomToResultsByDefault:function(t){var e=15,i=t.service,o=t.fields,n=t.type,s={1:11,2:12,3:13,4:14,5:15,6:16,7:17,8:17};return"SuggestedLocation"===i&&"PositionOfInterest"===n&&(e=s[o.classification]),"DirectGeocodedLocation"===i&&"PositionOfInterest"===n&&(e=s[o.importance]||14),"StreetAddress"===n&&(e=17),"CadastralParcel"===n&&(e=17),"Administratif"===n&&(e=12),e}}},function(t,e,i){"use strict";i.r(e);var o=i(36),n={_addUID:function(t){return this._uid?t+"-"+this._uid:t},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPsearchEngine"),t.className="GPwidget",t},_createShowSearchEngineElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowSearchEngine"),t.type="checkbox",t},_createShowSearchEnginePictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowSearchEnginePicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowSearchEngine"),e.title="Afficher/masquer la recherche par lieux",e.addEventListener("click",(function(){document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none";var e=document.getElementById(t._addUID("GPshowAdvancedSearch"));e&&(e.style.display=null,document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="none");var i="#GPsearchInput-"+t._uid;document.querySelector(i+" input").disabled=!1,t.onShowSearchEngineClick()}));var i=document.createElement("span");return i.id=this._addUID("GPshowSearchEngineOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createSearchInputElement:function(t){var e=this,i=document.createElement("form");i.id=this._addUID("GPsearchInput"),i.addEventListener("submit",(function(t){return t.preventDefault(),document.getElementById(e._addUID("GPgeocodeResultsList")).style.display="block",document.getElementById(e._addUID("GPautoCompleteList")).style.display="none",e.onGeocodingSearchSubmit(t),!1}));var n=document.createElement("input");n.id=this._addUID("GPsearchInputText"),n.type="text",n.placeholder=t,n.autocomplete="off",n.addEventListener("keyup",(function(t){var i=t.which||t.keyCode;13!==i&&10!==i&&38!==i&&40!==i&&(document.getElementById(e._addUID("GPgeocodeResultsList")).style.display="none",n.value.length>2?document.getElementById(e._addUID("GPautoCompleteList")).style.display="block":document.getElementById(e._addUID("GPautoCompleteList")).style.display="none",e.onAutoCompleteSearchText(t))})),n.addEventListener("keydown",(function(t){var i=t.which||t.keyCode,n=document.getElementById(e._addUID("GPautocompleteResults"));if(n){var s=n.getElementsByClassName("GPautoCompleteProposal current"),a=n.getElementsByClassName("GPautoCompleteProposal"),r=a.length;if(r){var l=null;if(!s.length)return(l=a[0]).className="GPautoCompleteProposal current",l.style.color="#000000",void(l.style["background-color"]="#CEDBEF");l=s[0];var c=parseInt(o.default.index(l.id),10),u=c===r-1?a[0]:a[c+1],h=0===c?a[r-1]:a[c-1];switch(l.style["background-color"]="",l.style.color="",h.style["background-color"]="",h.style.color="",u.style["background-color"]="",u.style.color="",i){case 38:l.className="GPautoCompleteProposal",h.className="GPautoCompleteProposal current",h.style.color="#000000",h.style["background-color"]="#CEDBEF";break;case 40:l.className="GPautoCompleteProposal",u.className="GPautoCompleteProposal current",u.style.color="#000000",u.style["background-color"]="#CEDBEF";break;case 13:t.preventDefault(),l.click(t)}l.focus()}}})),i.appendChild(n);var s=document.createElement("div");return s.id=this._addUID("GPsearchInputReset"),s.addEventListener("click",(function(){document.getElementById(e._addUID("GPsearchInputText")).value="",document.getElementById(e._addUID("GPautoCompleteList")).style.display="none",document.getElementById(e._addUID("GPgeocodeResultsList")).style.display="none",e.onSearchResetClick()})),i.appendChild(s),i},_createShowAdvancedSearchElement:function(){var t=this,e=document.createElement("div");e.id=this._addUID("GPshowAdvancedSearch"),e.className="GPshowAdvancedToolPicto",e.title="Ouvrir la recherche avancée",e.addEventListener("click",(function(){var e="#GPsearchInput-"+t._uid;document.querySelector(e+" input").disabled=!0,document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",document.getElementById(t._addUID("GPshowAdvancedSearch")).style.display="none",document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="inline-block"}));var i=document.createElement("span");return i.id=this._addUID("GPshowAdvancedSearchOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createAdvancedSearchPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPadvancedSearchPanel"),t.className="GPpanel",t.style.display="none",t},_createGeocodeResultsElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPgeocodeResultsList"),t.className="GPpanel",t.style.display="none",t.appendChild(this._createGeocodeResultsHeaderElement()),t},_createAutoCompleteElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPautoCompleteList"),t.className="GPautoCompleteList",t.style.display="none",t},_createAutoCompleteListElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPautocompleteResults"),e.addEventListener?e.addEventListener("click",(function(e){t.onAutoCompletedResultsItemClick(e),document.getElementById(t._addUID("GPautoCompleteList")).style.display="none"}),!1):e.attachEvent&&e.attachEvent("onclick",(function(e){t.onAutoCompletedResultsItemClick(e),document.getElementById(t._addUID("GPautoCompleteList")).style.display="none"})),e},_createAutoCompletedLocationElement:function(t,e){var i=document.getElementById(this._addUID("GPautocompleteResults")),o=document.createElement("div");o.id=this._addUID("AutoCompletedLocation_"+e),o.className="GPautoCompleteProposal",o.innerHTML=t.fullText,o.addEventListener?o.addEventListener("click",(function(t){i.click(t)}),!1):o.attachEvent&&o.attachEvent("onclick",(function(t){i.click(t)})),i.appendChild(o)},_createAdvancedSearchPanelHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Recherche avancée",e.appendChild(i);var o=document.createElement("div");return o.id=this._addUID("GPadvancedSearchClose"),o.className="GPpanelClose",o.title="Fermer la recherche avancée",o.addEventListener?o.addEventListener("click",(function(){var e="#GPsearchInput-"+t._uid;document.querySelector(e+" input").disabled=!1,document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",document.getElementById(t._addUID("GPshowAdvancedSearch")).style.display="inline-block",document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="none"}),!1):o.attachEvent&&o.attachEvent("onclick",(function(){var e="#GPsearchInput-"+t._uid;document.querySelector(e+" input").disabled=!1,document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",document.getElementById(t._addUID("GPshowAdvancedSearch")).style.display="inline-block",document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="none"})),e.appendChild(o),e},_createAdvancedSearchPanelFormElement:function(t){var e=this,i=document.createElement("form");i.id=this._addUID("GPadvancedSearchForm"),i.addEventListener("submit",(function(t){t.preventDefault();for(var i=[],o="#GPadvancedSearchFilters-"+e._uid,n=document.querySelectorAll(o+" > div > div > input"),s=0;s<n.length;s++){var a=n[s];i.push({key:a.name,value:a.value})}return e.onGeocodingAdvancedSearchSubmit(t,i),document.getElementById(e._addUID("GPgeocodeResultsList")).style.display="block",!1}));var o=document.createElement("div");o.className="GPflexInput";var n=document.createElement("label");n.className="GPadvancedSearchCodeLabel",n.innerHTML="Recherche par",o.appendChild(n);var s=this._createAdvancedSearchFormCodeElement(t);return o.appendChild(s),i.appendChild(o),i},_createAdvancedSearchFormCodeElement:function(t){var e=this,i=document.createElement("select");i.id=this._addUID("GPadvancedSearchCode"),i.className="GPadvancedSearchCode",i.addEventListener("change",(function(t){e.onGeocodingAdvancedSearchCodeChange(t)}),!1),t||(t=[{id:"PositionOfInterest",title:"Lieux/toponymes"},{id:"StreetAddress",title:"Adresses"},{id:"CadastralParcel",title:"Parcelles cadastrales"},{id:"Administratif",title:"Administratif"}]);for(var o=0;o<t.length;o++){var n=document.createElement("option");n.value=t[o].id,n.text=t[o].title,i.appendChild(n)}return i},_createAdvancedSearchFormInputElement:function(){var t=document.createElement("input");return t.type="submit",t.id=this._addUID("GPadvancedSearchSubmit"),t.className="GPinputSubmit",t.value="Chercher",t},_createAdvancedSearchFormFiltersElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPadvancedSearchFilters"),t},_createAdvancedSearchFiltersTableElement:function(t,e){var i=document.createElement("div");return i.id=this._addUID(t),e||(i.style.display="none"),i},_createAdvancedSearchFiltersAttributElement:function(t){var e=null,i=t.name,o=t.title,n=t.description,s=t.code,a=t.value,r=document.createElement("div");r.className="GPflexInput";var l=document.createElement("label");l.className="GPadvancedSearchFilterLabel",l.htmlFor=i,l.title=n||o,l.innerHTML=o,r.appendChild(l);var c=document.createElement("input");return c.id=i,c.className="GPadvancedSearchFilterInput",c.type="text",c.name=i,a&&(c.value=a),r.appendChild(c),(e=document.getElementById(this._addUID(s)))?e.appendChild(r):e=r,e},_createGeocodeResultsHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Résultats de la recherche",e.appendChild(i);var o=document.createElement("div");return o.id=this._addUID("GPgeocodeResultsClose"),o.className="GPpanelClose",o.title="Fermer la fenêtre de résultats",o.addEventListener?o.addEventListener("click",(function(){document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none"}),!1):o.attachEvent&&o.attachEvent("onclick",(function(){document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none"})),e.appendChild(o),e},_createGeocodeResultsListElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPgeocodeResults"),e.addEventListener?e.addEventListener("click",(function(e){e.ctrlKey||(document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none"),t.onGeocodedResultsItemClick(e)}),!1):e.attachEvent&&e.attachEvent("onclick",(function(e){e.ctrlKey||(document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none"),t.onGeocodedResultsItemClick(e)})),e},_createGeocodedLocationElement:function(t,e){var i=document.getElementById(this._addUID("GPgeocodeResults")),o=document.createElement("div");if(o.id=this._addUID("GeocodedLocation_"+e),o.className="GPautoCompleteProposal","string"==typeof t)o.innerHTML=t;else{var n=t.placeAttributes;n.freeform?o.innerHTML=n.freeform:n.postalCode?o.innerHTML=n.postalCode+" "+n.commune:n.cadastralParcel?o.innerHTML=n.cadastralParcel:o.innerHTML="..."}i.appendChild(o)}};e.default=n},function(t,e,i){"use strict";i.r(e);var o=i(40),n=i(2),s=i.n(n),a=(i(159),i(34)),r=i(140),l=i(36),c=i(144),u=i(145),h=i(167),d=i(168),p=a.default.getLogger("ElevationPath"),m=s.a.Control.extend({includes:h.default,options:{position:"topleft",active:!1,elevationPathOptions:{},stylesOptions:{},displayProfileOptions:{greaterSlope:!0,meanSlope:!0,ascendingElevation:!0,descendingElevation:!0,currentSlope:!0,apply:null,target:null}},initialize:function(t){s.a.Util.setOptions(this,t),this._uid=l.default.generate(),this._initDisplayProfileOptions(),this._showContainer=null,this._pictoContainer=null,this._panelContainer=null,this._profilContainer=null,this._waitingContainer=null,this._infoContainer=null,this._timerHdlr=null,this._reducePanel=!1,this._featuresLayer=null,this._lastIdLayer=0,this._currentIdLayer=0,this._currentFeature=null,this._profile=null,this._marker=null,this._geometry=null,this._distance=0,this._data={},this._noRightManagement=!1,this._checkRightsManagement()},onAdd:function(t){var e=this._container=this._initLayout();return t&&this.options.active&&(null===this._profile&&(this._panelContainer.style.display="none"),this._activateMapInteraction(t)),s.a.DomEvent.disableClickPropagation(e).disableScrollPropagation(e),e},onRemove:function(){},_checkRightsManagement:function(){var t=r.default.check({key:this.options.apiKey,resources:["SERVICE_CALCUL_ALTIMETRIQUE_RSC"],services:["ElevationLine"]});t||(this._noRightManagement=!0),this.options.apiKey||(this.options.apiKey=t.key)},_initDisplayProfileOptions:function(){var t=this.options.displayProfileOptions,e=t.apply;t.apply="function"==typeof e?e:m.DISPLAY_PROFILE_BY_DEFAULT;var i=t.target;t.target=void 0!==i?i:null;var o=Object.getPrototypeOf(this.options);void 0===t.meanSlope&&(t.meanSlope=o.displayProfileOptions.meanSlope),void 0===t.greaterSlope&&(t.greaterSlope=o.displayProfileOptions.greaterSlope),void 0===t.ascendingElevation&&(t.ascendingElevation=o.displayProfileOptions.ascendingElevation),void 0===t.descendingElevation&&(t.descendingElevation=o.displayProfileOptions.descendingElevation),void 0===t.currentSlope&&(t.currentSlope=o.displayProfileOptions.currentSlope)},_initLayout:function(){var t=this._createMainContainerElement(),e=this._showContainer=this._createShowElevationPathElement();t.appendChild(e),this.options.active&&(this._showContainer.checked=!0);var i=this._pictoContainer=this._createShowElevationPathPictoElement();t.appendChild(i);var o=this._panelContainer=this._createElevationPathPanelElement(),n=this._createElevationPathPanelHeaderElement();o.appendChild(n);var s=this._profilContainer=this._createElevationPathPanelProfilElement();o.appendChild(s);var a=this._waitingContainer=this._createElevationPathWaitingElement();o.appendChild(a);var r=this._infoContainer=this._createElevationPathInformationsElement();return o.appendChild(r),t.appendChild(o),t},onShowElevationPathClick:function(t){p.trace(t);var e=this._map;this._reducePanel?null!==this._profile&&(null===this.options.displayProfileOptions.target&&(this._pictoContainer.style.display="none"),this._panelContainer.style.display="block"):this._showContainer.checked?(this._pictoContainer.style.display="block",this._panelContainer.style.display="none",this._removeMapInteraction(e),this._clear()):(null===this._profile&&(this._panelContainer.style.display="none"),this._activateMapInteraction(e)),this._reducePanel=!1},onReduceElevationPathPanelClick:function(){this._reducePanel=!0,this._pictoContainer.style.display="block",this._panelContainer.style.display="none"},onOpenElevationPathInfoClick:function(){var t=this.options.displayProfileOptions.meanSlope,e=this.options.displayProfileOptions.greaterSlope,i=this.options.displayProfileOptions.ascendingElevation,o=this.options.displayProfileOptions.descendingElevation,n=this._infoContainer;if(n.childElementCount)for(;n.firstChild;)n.removeChild(n.firstChild);i&&this._addElevationPathInformationsItem("Dénivelé positif : "+this._data.ascendingElevation.toLocaleString()+" m"),o&&this._addElevationPathInformationsItem("Dénivelé négatif : "+this._data.descendingElevation.toLocaleString()+" m"),t&&this._addElevationPathInformationsItem("Pente moyenne : "+this._data.meanSlope.toLocaleString()+" %"),e&&this._addElevationPathInformationsItem("Plus forte pente : "+this._data.greaterSlope.toLocaleString()+" %"),"GPelevationPathInformationsContainerVisible"===n.className?(clearTimeout(this._timerHdlr),n.className="GPelevationPathInformationsContainerHidden"):n.className="GPelevationPathInformationsContainerVisible",this._timerHdlr=setTimeout((function(){n.className="GPelevationPathInformationsContainerHidden"}),4e3)},_activateMapInteraction:function(t){if(p.info("_activateMapInteraction()"),null===this._featuresLayer){this._featuresLayer=new s.a.FeatureGroup,t.addLayer(this._featuresLayer);var e=this;t.on("contextmenu",(function(){})),t.on("draw:created",(function(t){p.trace("draw:created"),e._currentIdLayer=s.a.Util.stamp(t.layer),e._getFeatureGeometry(t.layer),e._addFeatureLayer(t.layer)})),t.on("draw:drawstart",(function(){p.trace("draw:drawstart"),e._removeFeatureLayer(e._lastIdLayer),e._lastIdLayer=e._currentIdLayer})),t.on("draw:drawstop",(function(){p.trace("draw:drawstop"),void 0===e.options.elevationPathOptions.onSuccess&&null===e.options.displayProfileOptions.target&&(e._pictoContainer.style.display="none",e._panelContainer.style.display="block"),e._altiRequest()}))}this._activatePolyLineInteraction(t)},_removeMapInteraction:function(t){t&&(null!==this._featuresLayer&&(t.off("draw:created"),t.off("draw:drawstart"),t.off("draw:drawstop"),t.removeLayer(this._featuresLayer),this._featuresLayer=null),this._lastIdLayer=this._currentIdLayer=0,this._currentFeature&&this._currentFeature.disable())},_activatePolyLineInteraction:function(t){this._currentFeature&&this._currentFeature.disable();var e=this.options.stylesOptions||{},i=0!==Object.keys(e).length?e:{stroke:!0,color:"#C77A04",weight:4,opacity:.5,fill:!1};this._currentFeature=new s.a.Draw.Polyline(t,{shapeOptions:i}),this._currentFeature.enable()},_getFeatureGeometry:function(t){p.log(t.getLatLngs()),null!==this._geometry&&(this._geometry=null),this._geometry=[],this._distance=0;for(var e=t.getLatLngs(),i=0;i<e.length;i++){var o=e[i],n=e[i+1];this._geometry.push({lon:o.lng,lat:o.lat}),n&&(this._distance+=o.distanceTo(n))}p.log("Geometry",this._geometry),p.log("Distance",this._distance)},_addFeatureLayer:function(t){this._featuresLayer&&this._featuresLayer.addLayer(t)},_removeFeatureLayer:function(t){this._featuresLayer&&0!==t&&(t?this._featuresLayer.removeLayer(t):this._featuresLayer.clearLayers())},_altiRequest:function(){if(p.log("_altiRequest"),this._geometry){if(!this._noRightManagement){var t={};s.a.Util.extend(t,this.options.elevationPathOptions),s.a.Util.extend(t,{apiKey:t.apiKey||this.options.apiKey}),s.a.Util.extend(t,{ssl:this.options.ssl});var e=t.sampling;if(!e){var i=this._currentFeature._measurementRunningTotal;p.trace("length",i);var n=Math.floor(i)/5;e=n>=200?200:Math.floor(n)}var a=this;s.a.Util.extend(t,{sampling:e,onSuccess:this.options.elevationPathOptions.onSuccess||function(t){p.log(t),t&&(null!==a.options.displayProfileOptions.target&&(a._pictoContainer.style.display="block",a._panelContainer.style.display="block"),a._displayProfil(t.elevations),a._waitingContainer.className="GPelevationPathCalcWaitingContainerHidden",a._waiting=!1)},onFailure:this.options.elevationPathOptions.onFailure||function(t){p.log(t.message),a._pictoContainer.style.display="block",a._panelContainer.style.display="none",a._waitingContainer.className="GPelevationPathCalcWaitingContainerHidden",a._waiting=!1,a._clear()}});var r=this._geometry;s.a.Util.extend(t,{positions:r}),p.log(t),this._waitingContainer.className="GPelevationPathCalcWaitingContainerVisible",o.default.Services.getAltitude(t)}}else p.log("missing position")},_computeElevationMeasure:function(t){var e=function(t,e){var i=c.default.decimalToRadian(t[1]),o=c.default.decimalToRadian(e[1]),n=(o-i)/2,s=c.default.decimalToRadian(e[0]-t[0])/2,a=Math.sin(n)*Math.sin(n)+Math.sin(s)*Math.sin(s)*Math.cos(i)*Math.cos(o);return 12756274*Math.atan2(Math.sqrt(a),Math.sqrt(1-a))},i=t,o="km",n=1e3;this._distance<2e3&&(n=1,o="m"),i[0].dist=0,i[0].slope=0;for(var s=0,a=0,r=0,l=0,u=0,h=0,d=1;d<i.length;d++){var p=e([i[d].lon,i[d].lat],[i[d-1].lon,i[d-1].lat]),m=i[d].z,f=i[d-1].z;m<0&&(m=0),f<0&&(f=0);var _=m-f;_<0?(s+=p,l+=_):_>0&&(a+=p,r+=_),u+=p/n,i[d].dist=u,h+=_?Math.abs(Math.round(_/p*100)):0,i[d].slope=_?Math.abs(Math.round(_/p*100)):0;var g=i[d].slope;i[d].color=g>15&&g<30?"#005b4c":g>30&&g<45?"#00362d":g>45?"#00120f":"#00B798",i[d].lat=Math.round(1e4*i[d].lat)/1e4,i[d].lon=Math.round(1e4*i[d].lon)/1e4}var v=100;u>100?v=1:u>10&&(v=10),u=Math.round(u*v)/v,s=Math.round(s*v)/v,a=Math.round(a*v)/v;for(var y=i[0].z,E=i[0].z,P=i[0].slope,w=0;w<i.length;w++){var C=i[w];C.z<0&&(C.z=0),C.z>=E&&(E=C.z),C.z<=y&&(y=C.z),C.dist=Math.round(C.dist*v)/v,C.slope>P&&(P=C.slope)}return{greaterSlope:P,meanSlope:Math.round(h/i.length),distancePlus:a.toLocaleString(),distanceMinus:s.toLocaleString(),ascendingElevation:r,descendingElevation:l,altMin:y.toLocaleString(),altMax:E.toLocaleString(),distance:u.toLocaleString(),unit:o,points:i}},_displayProfil:function(t){this._map.off("contextmenu"),this._data&&(this._data={});var e=this._data=this._computeElevationMeasure(t),i=this.options.displayProfileOptions.target;i&&i.appendChild(this._panelContainer),i=this._profilContainer;var o=this.options.displayProfileOptions,n=o.apply;"undefined"!=typeof AmCharts&&"undefined"!=typeof d3&&p.trace("Aucune lib. n'est presente !"),n.call(this,e,i,this);var a=s.a.DomUtil.get("GPelevationPathPanelInfo-"+this._uid);(o.greaterSlope||o.meanSlope||o.ascendingElevation||o.descendingElevation)&&(a.style.display="block")},_clear:function(){if(this._geometry=null,this._profile=null,this._profilContainer)for(;this._profilContainer.firstChild;)this._profilContainer.removeChild(this._profilContainer.firstChild);var t=this._map;this._marker&&(t.removeLayer(this._marker),this._marker=null)}});m.__createProfileMarker=function(t,e){p.log("__createProfileMarker");var i=t,o=i._map;i._marker=s.a.marker(s.a.latLng(e),{icon:new u.default("orange"),draggable:!1,clickable:!1,zIndexOffset:1e3}),i._marker.addTo(o)},m.__updateProfileMarker=function(t,e){p.log("__updateProfileMarker");var i=t,o=i._map;i._marker?(i._marker.setLatLng(s.a.latLng(e)),i._marker.update()):(i._marker=s.a.marker(s.a.latLng(e),{icon:new u.default("orange"),draggable:!1,clickable:!1,zIndexOffset:1e3}),i._marker.addTo(o))},m.__removeProfileMarker=function(t){p.log("__removeProfileMarker");var e=t,i=e._map;e._marker&&(i.removeLayer(e._marker),e._marker=null)},m.__customRawProfileOperation=function(){p.log("__customRawProfileOperation")},m.__customRawProfileMouseOverEvent=function(t,e){p.log("__customRawProfileMouseOverEvent",t,e)},m.DISPLAY_PROFILE_BY_DEFAULT=function(t,e,i){p.trace("ElevationPath.DISPLAY_PROFILE_BY_DEFAULT");var o=d.default.displayProfileByDefault(t,e,i,m);o&&(this._profile=o)},m.DISPLAY_PROFILE_RAW=function(t,e,i){p.trace("ElevationPath.DISPLAY_PROFILE_RAW");var o=d.default.displayProfileRaw(t,e,i,m);o&&(this._profile=o)},m.DISPLAY_PROFILE_LIB_D3=function(t,e,i){if(p.trace("ElevationPath.DISPLAY_PROFILE_LIB_D3"),"undefined"!=typeof d3){var o=d.default.displayProfileLibD3(t,e,i,m);o&&(this._profile=o)}else p.log("Lib. D3 is not loaded !")},m.DISPLAY_PROFILE_LIB_AMCHARTS=function(t,e,i){if(p.trace("ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS"),"undefined"!=typeof AmCharts){var o=d.default.displayProfileLibAmCharts(t,e,i,m);o&&(this._profile=o)}else p.log("Lib. AmCharts is not loaded !")},e.default=m},function(t,e,i){"use strict";i.r(e);var o={_addUID:function(t){return this._uid?t+"-"+this._uid:t},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPelevationPath"),t.className="GPwidget",t},_createShowElevationPathElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowElevationPath"),t.type="checkbox",t},_createShowElevationPathPictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowElevationPathPicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowElevationPath"),e.title="Calculer un profil",e.addEventListener?e.addEventListener("click",(function(e){t.onShowElevationPathClick(e)})):e.attachEvent&&e.attachEvent("onclick",(function(e){t.onShowElevationPathClick(e)}));var i=document.createElement("span");return i.id=this._addUID("GPshowElevationPathOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createElevationPathPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPelevationPathPanel"),t.className="GPpanel",t},_createElevationPathPanelHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.id=this._addUID("GPelevationPathPanelInfo"),i.className="GPpanelInfo",i.title="Informations",i.addEventListener?i.addEventListener("click",(function(){t.onOpenElevationPathInfoClick()})):i.attachEvent&&i.attachEvent("onclick",(function(){t.onOpenElevationPathInfoClick()})),e.appendChild(i);var o=document.createElement("div");o.className="GPpanelTitle",o.innerHTML="Profil Altimétrique",e.appendChild(o);var n=document.createElement("div");n.id=this._addUID("GPelevationPathPanelReduce"),n.className="GPpanelReduce",n.title="Masquer le panneau",n.addEventListener?n.addEventListener("click",(function(){"function"==typeof t.onReduceElevationPathPanelClick&&(document.getElementById(t._addUID("GPshowElevationPath")).checked=!1,t.onReduceElevationPathPanelClick())}),!1):n.attachEvent&&n.attachEvent("onclick",(function(){"function"==typeof t.onReduceElevationPathPanelClick&&(document.getElementById(t._addUID("GPshowElevationPath")).checked=!1,t.onReduceElevationPathPanelClick())})),e.appendChild(n);var s=document.createElement("div");return s.id=this._addUID("GPelevationPathPanelClose"),s.className="GPpanelClose",s.title="Fermer le panneau",s.addEventListener?s.addEventListener("click",(function(){document.getElementById(t._addUID("GPshowElevationPathPicto")).click()}),!1):s.attachEvent&&s.attachEvent("onclick",(function(){document.getElementById(t._addUID("GPshowElevationPathPicto")).click()})),e.appendChild(s),e},_createElevationPathPanelProfilElement:function(){var t=document.createElement("div");return t.id="GPelevationPathProfil",t},_createElevationPathWaitingElement:function(){var t=document.createElement("div");t.id=this._addUID("GPelevationPathCalcWaitingContainer"),t.className="GPelevationPathCalcWaitingContainerHidden";var e=document.createElement("p");return e.className="GPelevationPathCalcWaiting",e.innerHTML="Calcul en cours...",t.appendChild(e),t},_createElevationPathInformationsElement:function(){var t=document.createElement("div");t.id=this._addUID("GPelevationPathInformationsContainer"),t.className="GPelevationPathInformationsContainerHidden";var e=document.createElement("p");return e.className="GPelevationPathInformations",e.innerHTML="Aucune information...",t.appendChild(e),t},_addElevationPathInformationsItem:function(t){var e=document.getElementById(this._addUID("GPelevationPathInformationsContainer"));if(e){var i=document.createElement("p");i.className="GPelevationPathInformations",i.innerHTML=t,e.appendChild(i)}return e}};e.default=o},function(t,e,i){"use strict";i.r(e);var o={displayProfileByDefault:function(t,e,i,o){var n=i;if(e)for(;e.firstChild;)e.removeChild(e.firstChild);if(t){var s=n.options.displayProfileOptions,a=t.points,r=JSON.parse(JSON.stringify(a));r.sort((function(t,e){return t.z-e.z}));var l=r[0].z,c=r[r.length-1].z,u=c-l,h=t.distance,d=t.unit,p=100/a.length,m=document.createElement("div");m.id="profileElevationByDefault",e.appendChild(m);var f=document.createElement("div");f.className="profile-box";var _=document.createElement("div");_.className="profile-z-vertical";var g=document.createElement("ul"),v=document.createElement("li");v.setAttribute("class","profile-min-z"),v.innerHTML=l+" m";var y=document.createElement("li");y.setAttribute("class","profile-max-z"),y.innerHTML=c+" m",g.appendChild(y),g.appendChild(v),_.appendChild(g),f.appendChild(_);var E=document.createElement("div");E.className="profile-content",E.addEventListener("mouseover",(function(t){var e=parseFloat(t.target.dataset.lon),i=parseFloat(t.target.dataset.lat);e&&i&&o.__createProfileMarker(n,{lat:i,lon:e})})),E.addEventListener("mousemove",(function(t){var e=parseFloat(t.target.dataset.lon),i=parseFloat(t.target.dataset.lat);e&&i&&o.__updateProfileMarker(n,{lat:i,lon:e})})),E.addEventListener("mouseout",(function(){o.__removeProfileMarker(n)}));var P=document.createElement("ul");P.id="profile-data",P.className="profile-z-axis profile-x-axis",E.appendChild(P);for(var w=0;w<a.length;w++){var C=a[w],M=document.createElement("li");M.setAttribute("data-z",C.z),M.setAttribute("data-lon",C.lon),M.setAttribute("data-lat",C.lat),M.setAttribute("data-dist",C.dist);var S=Math.floor(100*(C.z-l)/u);M.setAttribute("class","percent v"+S),M.title="Altitude : "+C.z+"m",s.currentSlope&&(M.title+=" - Pente : "+C.slope+"%"),M.title+=" (Lat : "+C.lat+" / Lon : "+C.lon+")",M.setAttribute("style","width: "+p+"%"),P.appendChild(M)}f.appendChild(E),m.appendChild(f);var L=document.createElement("div");L.className="profile-x-horizontal";var b=document.createElement("ul"),R=document.createElement("li");R.setAttribute("class","profile-min-x"),R.innerHTML="";var x=document.createElement("li");return x.setAttribute("class","profile-max-x"),x.innerHTML=h+" "+d,b.appendChild(R),b.appendChild(x),L.appendChild(b),m.appendChild(L),e}},displayProfileRaw:function(t,e,i,o){if(e)for(;e.firstChild;)e.removeChild(e.firstChild);var n=t.points,s=document.createElement("textarea");return s.id="profilElevationResults",s.rows=10,s.cols=50,s.style.width="100%",s.innerHTML=JSON.stringify(n,void 0,4),s.addEventListener("mouseover",(function(t){o.__customRawProfileMouseOverEvent(i,t)})),e.appendChild(s),e},displayProfileLibD3:function(t,e,i,o){var n=i;if(e)for(;e.firstChild;)e.removeChild(e.firstChild);var s=t.points,a=n.options.displayProfileOptions,r=20,l=20,c=30,u=40,h=e.clientWidth-u-l,d=e.clientHeight-r-c,p=d3.scale.linear().range([0,h]),m=d3.scale.linear().range([d,0]),f=d3.svg.axis().scale(p).orient("bottom").ticks(5),_=d3.svg.axis().scale(m).orient("left").ticks(5),g=d3.svg.line().interpolate("basis").x((function(t){return p(t.dist)})).y((function(t){return m(t.z)})),v=d3.svg.area().interpolate("basis").x((function(t){return p(t.dist)})).y0(d).y1((function(t){return m(t.z)})),y=d3.select(e).append("svg").attr("width",h+u+l).attr("height",d+r+c).append("g").attr("transform","translate("+u+","+r+")"),E=d3.extent(s,(function(t){return t.dist}));p.domain(E);var P=[0,d3.max(s,(function(t){return t.z}))];m.domain(P),y.append("path").datum(s).attr("class","area-d3").attr("d",v),y.append("g").attr("class","x axis-d3").attr("transform","translate(0,"+d+")").call(f).append("text").attr("y",-15).attr("dy",".71em").attr("x",h).text("Distance ("+t.unit+")"),y.append("g").attr("class","y axis-d3").call(_).append("text").attr("transform","rotate(-90)").attr("y",6).attr("dy",".71em").text("Altitude (m)"),y.append("g").attr("class","grid-d3 vertical").attr("transform","translate(0,"+d+")").call(f.orient("bottom").tickSize(-d,0,0).tickFormat("")),y.append("g").attr("class","grid-d3 horizontal").call(_.orient("left").tickSize(-h,0,0).tickFormat("")),y.append("path").datum(s).attr("class","line-d3").attr("d",g),y.selectAll("circle").data(s).enter().append("circle").attr("cx",(function(t){return p(t.dist)})).attr("cy",(function(t){return m(t.z)})).attr("r",0).attr("class","circle-d3");var w=y.append("g").style("display","none");w.append("line").attr("id","focusLineX").attr("class","focusLine-d3"),w.append("line").attr("id","focusLineY").attr("class","focusLine-d3"),w.append("circle").attr("id","focusCircle").attr("r",4).attr("class","circle-d3 focusCircle-d3");var C=d3.select(e).append("div").attr("class","tooltip-d3").style("opacity",0),M=d3.bisector((function(t){return t.dist})).left;return y.append("rect").attr("class","overlay-d3").attr("width",h).attr("height",d).on("mouseover",(function(){w.style("display",null),o.__createProfileMarker(n,s[0])})).on("mouseout",(function(){w.style("display","none"),o.__removeProfileMarker(n),C.transition().duration(500).style("opacity",0)})).on("mousemove",(function(){var t=d3.mouse(this),e=p.invert(t[0]),i=M(s,e),r=s[i-1],l=s[i],c=e-r[0]>l[0]-e?l:r,u=p(c.dist),h=m(c.z);w.select("#focusCircle").attr("cx",u).attr("cy",h),w.select("#focusLineX").attr("x1",u).attr("y1",m(P[0])).attr("x2",u).attr("y2",m(P[1])),w.select("#focusLineY").attr("x1",p(E[0])).attr("y1",h).attr("x2",p(E[1])).attr("y2",h),o.__updateProfileMarker(n,c),C.transition().duration(200).style("opacity",.9);var d="";d+=" Altitude : "+c.z+" m",a.currentSlope&&(d+="<br/> Pente : "+c.slope+" %"),d+="<br/> (Lat : "+c.lat+"/ Lon : "+c.lon+")",C.html(d).style("left",d3.event.pageX+"px").style("top",d3.event.pageY-28+"px")})),y},displayProfileLibAmCharts:function(t,e,i,o){var n=i,s=t.points,a="<span class='altiPathValue'>[[title]] : [[value]]m</span><br/>";n.options.displayProfileOptions.currentSlope&&(a+="<span class='altiPathValue'>Pente : [[slope]] %</span><br/>"),a+="<span class='altiPathCoords'>(Lat: [[lat]] / Lon:[[lon]])</span>",AmCharts.addInitHandler((function(){}));var r={type:"serial",pathToImages:"http://cdn.amcharts.com/lib/3/images/",categoryField:"dist",autoMarginOffset:0,marginRight:10,marginTop:10,startDuration:0,color:"#5E5E5E",fontSize:8,theme:"light",thousandsSeparator:"",numberFormatter:{precision:-1,decimalSeparator:",",thousandsSeparato:" "},categoryAxis:{color:"#5E5E5E",gridPosition:"start",minHorizontalGap:40,tickPosition:"start",title:"Distance ("+t.unit+")",titleColor:"#5E5E5E",labelOffset:0,startOnAxis:!0},chartCursor:{animationDuration:0,bulletsEnabled:!0,bulletSize:10,categoryBalloonEnabled:!1,cursorColor:"#F90",graphBulletAlpha:1,graphBulletSize:1,zoomable:!1},trendLines:[],graphs:[{balloonColor:"#CCCCCC",balloonText:a,bullet:"round",bulletAlpha:0,bulletBorderColor:"#FFF",bulletBorderThickness:2,bulletColor:"#F90",bulletSize:6,hidden:!1,id:"AmGraph-1",fillAlphas:.4,fillColors:"#C77A04",lineAlpha:1,lineColor:"#C77A04",lineThickness:1,title:"Altitude",valueField:"z"}],guides:[],valueAxes:[{id:"ValueAxis-1",minVerticalGap:20,title:"Altitude (m)"}],balloon:{borderColor:"#CCCCCC",borderThickness:1,fillColor:"#FFFFFF",showBullet:!0},titles:[],allLabels:[],dataProvider:s},l=AmCharts.makeChart(e,r);return l.addListener("changed",(function(t){var e=t.chart.dataProvider[t.index];o.__updateProfileMarker(n,e)})),l}};e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(2),n=i.n(o),s=n.a.Control.extend({options:{position:"topright",picto:null,url:null,text:null,size:"30px"},initialize:function(t){n.a.setOptions(this,t)},onAdd:function(){var t=null;t=n.a.DomUtil.create("div","gp-control-logo",t);var e=!(!this.options.url&&!this.options.text),i=null;e&&((i=n.a.DomUtil.create("a","",t)).target="_blank",this.options.url&&(i.href=this.options.url,this.options.text&&(i.title=this.options.text))),e&&this.options.text&&(i.text=this.options.text);var o=null;return!!this.options.picto&&((o=e?n.a.DomUtil.create("img","",i):n.a.DomUtil.create("img","",t)).src=this.options.picto,"string"==typeof this.options.size?o.style.height=o.style.width=this.options.size:(o.style.height=this.options.size.height,o.style.width=this.options.size.width)),t}});e.default=s},function(t,e,i){"use strict";i.r(e);var o=i(2),n=i.n(o),s=i(34),a=i(171),r=i(173),l=i(175),c=s.default.getLogger("layers"),u={options:{},params:{},protocol:null,serviceUrl:"http://localhost?no-rights-found-for=[{layer}]",_initOptions:function(){if(!this.options||0===Object.keys(this.options))throw new Error("PARAM_MISSING : options !");if(!this.options.layer)throw new Error("PARAM_MISSING : layer !");this.options.apiKey||c.log("PARAM_MISSING : apiKey !"),void 0===this.options.ssl&&(this.options.ssl=!0)},_initContext:function(){this.protocol=!1===this.options.ssl?"http://":"https://"},_initParams:function(t){t||(t="WMTS"),this.params=a.default.get({key:this.options.apiKey,layer:this.options.layer,service:t}),this.params&&0!==Object.keys(this.params)||(this.params={},this.options.apiKey||c.log("WARNING PARAM_MISSING : parameter 'apiKey' is mandatory if the contract key configuration has not been loaded !"))},WMS:function(t,e){var i=s.default.getLogger("layers-wms");this.options=t||{},this._initOptions(),this.settings=e||{},this._initContext(),this._initParams("WMS"),i.log(this.params);var o=null;o=this.params.key||this.options.apiKey?this.params.url||n.a.Util.template("https://wxs.ign.fr/{key}/geoportail/r/wms",{key:this.params.key||this.options.apiKey}):n.a.Util.template(this.serviceUrl,{layer:this.options.layer});var a={layers:this.options.layer,styles:this.params.styles||"normal",format:this.params.format||"image/jpeg",version:this.params.version||"1.3.0"},l={minZoom:this.params.minZoom||1,maxZoom:this.params.maxZoom||21};return n.a.Util.extend(l,this.settings),new r.default(o.replace(/(http|https):\/\//,this.protocol),{paramsNative:l,paramsWms:a,originators:this.params.originators||[],legends:this.params.legends||[],metadata:this.params.metadata||[],title:this.params.title||null,description:this.params.description||null,quicklookUrl:this.params.quicklookUrl||null})},WMTS:function(t,e){var i=s.default.getLogger("layers-wmts");this.options=t||{},this._initOptions(),this.settings=e||{},this._initContext(),this._initParams("WMTS"),i.log(this.params);var o=null;o=this.params.key||this.options.apiKey?this.params.url||n.a.Util.template("https://wxs.ign.fr/{key}/geoportail/wmts",{key:this.params.key||this.options.apiKey}):n.a.Util.template(this.serviceUrl,{layer:this.options.layer});var a={layer:this.options.layer,style:this.params.styles||"normal",format:this.params.format||"image/jpeg",version:this.params.version||"1.0.0",tilematrixset:this.params.TMSLink||"PM"},r={minZoom:this.params.minZoom||1,maxZoom:this.params.maxZoom||21};return n.a.Util.extend(r,this.settings),new l.default(o.replace(/(http|https):\/\//,this.protocol),{paramsNative:r,paramsWmts:a,originators:this.params.originators||[],legends:this.params.legends||[],metadata:this.params.metadata||[],title:this.params.title||"",description:this.params.description||"",quicklookUrl:this.params.quicklookUrl||""})}};e.default=u},function(t,e,i){"use strict";i.r(e);var o=i(34),n=i(141),s=i(172),a=o.default.getLogger("layer-config"),r={get:function(t){var e={};if(n.default.isConfigLoaded()){if((e=n.default.getLayerParams(t.layer,t.service,t.key))&&0!==Object.keys(e).length)return e.minZoom=s.default.getZoomLevelFromScaleDenominator(e.maxScale)||1,e.maxZoom=s.default.getZoomLevelFromScaleDenominator(e.minScale)||21,e;a.warn("WARNING AUTOCONF_FAILED : params not found ?!")}else a.warn("WARNING AUTOCONF_MISSING : contract key configuration has to be loaded to load Geoportal layers !")}};e.default=r},function(t,e,i){"use strict";i.r(e);var o={getZoomLevelFromScaleDenominator:function(t,e){var i={};switch(e){case"EPSG:2154":i={0:104579.224549894,1:52277.5323537905,2:26135.4870785954,3:13066.8913818,4:6533.2286041135,5:3266.5595244627,6:1633.2660045974,7:816.629554986,8:408.3139146768,9:204.1567415109,10:102.0783167832,11:51.0391448966,12:25.5195690743,13:12.7597836936,14:6.379891636,15:3.1899457653,16:1.5949728695,17:.7974864315,18:.3987432149,19:.1993716073,20:.0996858037,21:.0498429018};break;default:i={0:156543.033928041,1:78271.51696402048,2:39135.758482010235,3:19567.87924100512,4:9783.93962050256,5:4891.96981025128,6:2445.98490512564,7:1222.99245256282,8:611.49622628141,9:305.7481131407048,10:152.8740565703525,11:76.43702828517624,12:38.21851414258813,13:19.10925707129406,14:9.554628535647032,15:4.777314267823516,16:2.388657133911758,17:1.194328566955879,18:.5971642834779395,19:.2985821417389697,20:.1492910708694849,21:.0746455354347424}}var o=28e-5*t;for(var n in i)if(i.hasOwnProperty(n)&&i[n]<=o)return n=parseInt(n,10);return 0},getAttributions:function(t){var e=t.zoom,i=[];if(null!=t.originators&&t.visibility)for(var o,n=0,s=t.originators.length;n<s;n++){o=!0;for(var a=t.originators[n],r=t.originators[n].constraints||[],l=0,c=r.length;l<c;l++){var u=r[l];o=!0;var h=this.getZoomLevelFromScaleDenominator(u.maxScaleDenominator,t.crs),d=this.getZoomLevelFromScaleDenominator(u.minScaleDenominator,t.crs)||21;h&&h>e&&(o=!1),o&&null!==d&&d<e&&(o=!1);var p=u.bbox;if(o&&p){o=!1;var m=t.extent;if(m){var f=[p.top,p.left,p.bottom,p.right];if(this.intersects(m,f)){o=!0;break}}}}if(o){var _=a.logo,g=a.url,v=a.name?a.name:"",y=a.attribution,E=document.createElement("div");E.className="gp-control-attribution";var P=null;(P=document.createElement("a")).className="gp-control-attribution-link",P.target="_blank",E.appendChild(P),g&&(P.href=g);var w=null;!!_?(w=document.createElement("img"),P?(w.className="gp-control-attribution-image",P.appendChild(w)):(w.className="",E.appendChild(w)),w.src=_,w.title=y||v,w.style.height="30px",w.style.width="30px"):P.textContent=v||(y||(g||"")),i.push(E.innerHTML+" ")}}return i},intersects:function(t,e){var i=t[1]<=e[3]&&e[1]<=t[3],o=t[2]<=e[0]&&e[2]<=t[0];return i&&o}};e.default=o},function(t,e,i){"use strict";i.r(e);var o=i(40),n=i(2),s=i.n(n),a=i(34),r=i(174),l=i(1),c=a.default.getLogger("wms"),u=s.a.TileLayer.WMS.extend({includes:r.default,initialize:function(t,e){var i={};s.a.Util.extend(i,e.paramsWms,e.paramsNative),s.a.TileLayer.WMS.prototype.initialize.call(this,o.default.Helper.normalyzeUrl(t,{"gp-leaflet-ext":l.leafletExtVersion||l.version},!1),i),this._originators=e.originators,this._legends=e.legends,this._metadata=e.metadata,this._title=e.title,this._description=e.description,this._quicklookUrl=e.quicklookUrl,this._geoportal_id=0},onAdd:function(t){c.trace("onAdd layer",this._geoportal_id),this._map=t,this._geoportal_id=s.a.stamp(this),s.a.TileLayer.WMS.prototype.onAdd.call(this,t),this.setVisible(!0),this.updateAttributions(t),t.on({overlayremove:this._onRemoveLayer,overlayadd:this._onAddLayer,layerremove:this._onRemoveLayer,layeradd:this._onAddLayer,moveend:this._onMoveEndLayer},this)},onRemove:function(t){c.trace("onRemove layer",this._geoportal_id),this._map=t,s.a.TileLayer.prototype.onRemove.call(this,t),this.setVisible(!1),this.removeAttributions(t),t.off({overlayremove:this._onRemoveLayer,overlayadd:this._onAddLayer,layerremove:this._onRemoveLayer,layeradd:this._onAddLayer,moveend:this._onMoveEndLayer},this)},getTileUrl:function(t){var e=this._map,i=this.options.tileSize,o=t.multiplyBy(i),n=o.add([i,i]),a=this._crs.project(e.unproject(o,t.z)),r=this._crs.project(e.unproject(n,t.z)),l=this._wmsVersion>=1.3&&-1!==["EPSG:4326"].indexOf(this._crs.code)?[r.y,a.x,a.y,r.x].join(","):[a.x,r.y,r.x,a.y].join(","),c=s.a.Util.template(this._url,{s:this._getSubdomain(t)});return c+s.a.Util.getParamString(this.wmsParams,c,!0)+"&BBOX="+l}});e.default=u},function(t,e,i){"use strict";i.r(e);var o=i(34),n=i(172),s=o.default.getLogger("layer-event"),a={_id:null,_attributions:[],_visibility:!0,_originators:[],isEnable:function(t){return!!t.attributionControl},setVisible:function(t){s.log("visibility",t),this._visibility=t,this.fire("visibilitychange")},getVisible:function(){return this._visibility},_onRemoveLayer:function(t){s.trace("onRemove event",t),t.layer._geoportal_id===this._geoportal_id&&this.setVisible(!1)},_onAddLayer:function(t){s.trace("onAdd event",t),t.layer._geoportal_id===this._geoportal_id&&this.setVisible(!0)},_onMoveEndLayer:function(t){s.trace("moveend event",t),this.updateAttributions(this._map,this)},updateAttributions:function(t){this.isEnable(t)&&(this.removeAttributions(t),this.addAttributions(t),this.fire("attributionchange"))},removeAttributions:function(t){if(s.trace("removeAttributions...",this._geoportal_id),this.isEnable(t)){for(var e=0;e<this._attributions.length;e++)t.attributionControl.removeAttribution(this._attributions[e]);this._attributions&&(this._attributions=[])}},addAttributions:function(t){if(s.trace("addAttributions...",this._geoportal_id),this.isEnable(t)){var e=t.getBounds().getNorthWest(),i=t.getBounds().getSouthEast(),o={extent:[e.lat,e.lng,i.lat,i.lng],zoom:t.getZoom(),originators:this._originators,visibility:this._visibility};s.log(o);var a=n.default.getAttributions(o);if(s.log(a),a&&0!==a.length)for(var r=0;r<a.length;r++)this._attributions.push(a[r]),t.attributionControl.addAttribution(a[r])}}};e.default=a},function(t,e,i){"use strict";i.r(e);var o=i(40),n=i(2),s=i.n(n),a=i(34),r=i(174),l=i(1),c=a.default.getLogger("wmts"),u=s.a.TileLayer.extend({includes:r.default,defaultWmtsParams:{service:"WMTS",request:"GetTile",version:"1.0.0",layer:"",style:"",tilematrixset:"PM",format:"image/jpeg"},initialize:function(t,e){c.log("initialize"),this._wmtsParams={},s.a.Util.extend(this._wmtsParams,this.defaultWmtsParams,e.paramsWmts),s.a.TileLayer.prototype.initialize.call(this,o.default.Helper.normalyzeUrl(t,{"gp-leaflet-ext":l.leafletExtVersion||l.version},!1),e.paramsNative),this._originators=e.originators,this._legends=e.legends,this._metadata=e.metadata,this._title=e.title,this._description=e.description,this._quicklookUrl=e.quicklookUrl,this._geoportal_id=0},onAdd:function(t){c.trace("onAdd layer",this._geoportal_id),this._map=t,this._geoportal_id=s.a.stamp(this),s.a.TileLayer.prototype.onAdd.call(this,t),this.setVisible(!0),this.updateAttributions(t),t.on({overlayremove:this._onRemoveLayer,overlayadd:this._onAddLayer,layerremove:this._onRemoveLayer,layeradd:this._onAddLayer,moveend:this._onMoveEndLayer},this)},onRemove:function(t){c.trace("onRemove layer",this._geoportal_id),this._map=t,s.a.TileLayer.prototype.onRemove.call(this,t),this.setVisible(!1),this.removeAttributions(t),t.off({overlayremove:this._onRemoveLayer,overlayadd:this._onAddLayer,layerremove:this._onRemoveLayer,layeradd:this._onAddLayer,moveend:this._onMoveEndLayer},this)},getTileUrl:function(t){var e=this._getZoomForUrl(),i=s.a.Util.template(this._url,{s:this._getSubdomain(t)});return i+s.a.Util.getParamString(this._wmtsParams,i)+"&tilematrix="+e+"&tilerow="+t.y+"&tilecol="+t.x},setParams:function(t,e){return s.a.extend(this._wmtsParams,t),e||this.redraw(),this}});e.default=u},function(t,e,i){"use strict";i.r(e);var o=i(40);!function(){var t=document.getElementsByTagName("script"),e=t[t.length-1].getAttribute("data-key");if(e){var i=e.split(/;|,|\|/);if(e&&i.length>1){for(var n=[],s=0;s<i.length;s++)n.push(i[s]);e=n}}var a=t[t.length-1].getAttribute("data-url"),r=t[t.length-1].getAttribute("data-timeout");if(e||a){var l={apiKey:e,onSuccess:function(){},onFailure:function(t){throw new Error("Configuration load failed : "+t.message)}};a&&(l.serverUrl=a,l.callbackSuffix=""),r&&(l.timeOut=r),o.default.Config||o.default.Services.getConfig(l)}}()},function(t,e,i){"use strict";i.r(e);var o=i(34),n={proxifyUrl:function(t,e){var i=o.default.getLogger("proxifyUrl");if(!e||!e.hasOwnProperty("proxyUrl")||null===e.proxyUrl||0===e.proxyUrl.trim().length)return t;if(e.noProxyDomains&&Array.isArray(e.noProxyDomains)&&e.noProxyDomains.length>0)for(var n in e.noProxyDomains)if(i.trace("[ProxyUtils] proxifyUrl : analyzing "+e.noProxyDomains[n]),-1!==t.indexOf(e.noProxyDomains[n]))return i.info("[ProxyUtils] proxifyUrl : "+t+" found in noProxyDomains list ("+e.noProxyDomains[n]+")."),t;return e.proxyUrl+encodeURIComponent(t)}};e.default=n},function(t,e,i){"use strict";i.r(e);var o={rgbaToHex:function(t){function e(t){if(t>255)throw new Error("'"+t+"'' is greater than 255(0xff);");return("0"+Number(t).toString(16)).slice(-2)}var i=/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(0?.?\d+)\s*)?\)/.exec(t);if(!i)throw new Error("Invalid format: "+t);var o=i[1],n=i[2],s=i[3],a=i[4],r=[e(o),e(n),e(s)],l={};return l.hex="#"+r.join(""),a&&(l.opacity=parseFloat(a)),l},hexToRgba:function(t,e){if(!t)throw new Error("Invalid format");t=t.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,(function(t,e,i,o){return e+e+i+i+o+o}));var i=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return(i=i?{r:parseInt(i[1],16),g:parseInt(i[2],16),b:parseInt(i[3],16)}:null)?"rgba("+i.r+", "+i.g+", "+i.b+", "+e+")":null}};e.default=o}])}));
--- a/src/pyams_gis/resources/js/leaflet-gp-3.0.2.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25289 +0,0 @@
-/*!
- * @brief Geoportal Extension for Leaflet
- *
- * This software is released under the licence CeCILL-B (Free BSD compatible)
- * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
- * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
- * @see http://www.cecill.info/
- *
- * copyright CeCILL-B
- * copyright IGN
- * @author IGN
- * @version 0.8.1
- * @date 2016-12-02
- *
- */
-/*!
- * @overview es6-promise - a tiny implementation of Promises/A+.
- * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and cont  ributors (Conversion to ES6 API by Jake Archibald)
- * @license   Licensed under MIT license
- *            See https://raw.githubusercontent.com/jakearchibald/es6-promise/  master/LICENSE
- * @version   3.0.2
- */
-/*!
- * Sortable -- minimalist JavaScript library for reorderable drag-and-drop lists
- *
- * Released under MIT LICENSE
- * 
- * Copyright 2013-2016 Lebedev Konstantin <ibnRubaXa@gmail.com>
- * http://rubaxa.github.io/Sortable/
- * 
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-/*!
- * Proj4js - Javascript reprojection library. 
- * 
- * Authors:
- * 
- * - Mike Adair madairATdmsolutions.ca
- * - Richard Greenwood richATgreenwoodmap.com
- * - Didier Richard didier.richardATign.fr
- * - Stephen Irons stephen.ironsATclear.net.nz
- * - Olivier Terral oterralATgmail.com
- * - Calvin Metcalf cmetcalfATappgeo.com
- * 
- * Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons, Olivier Terral and Calvin Metcalf
- * 
- *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),
- *  to deal in the Software without restriction, including without limitation
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *  and/or sell copies of the Software, and to permit persons to whom the
- *  Software is furnished to do so, subject to the following conditions:
- * 
- *  The above copyright notice and this permission notice shall be included
- *  in all copies or substantial portions of the Software.
- * 
- *  _THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- *  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *  DEALINGS IN THE SOFTWARE._
- * 
- */
-/*!
- * Copyright 2012-2016 Jacob Toye and Leaflet
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is furnished to do
- * so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
- * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-/*!
- * Proj4Leaflet --  Smooth Proj4js integration with Leaflet
- * 
- * Copyright (c) 2012, Kartena AB
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * 
- * 1. Redistributions of source code must retain the above copyright notice, this
- *    list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-;(function(root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    define(['leaflet'], factory);
-  } else if (typeof exports === 'object') {
-    module.exports = factory(require('leaflet'));
-  } else {
-    root.Gp = factory(root.L);
-  }
-}(this, function(leaflet) {
-
-var gp, CommonUtilsAutoLoadConfig, leafletDraw, sortable, CommonControlsLayerSwitcherDOM, LeafletControlsLayerSwitcher, CommonUtilsConfig, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, CommonControlsLocationSelectorDOM, LeafletControlsUtilsPositionFormater, LeafletControlsUtilsIconDefault, LeafletControlsLocationSelector, CommonControlsIsoDOM, LeafletControlsIsocurve, CommonControlsMousePositionDOM, proj4, proj4leaflet07x, proj4leaflet10x, LeafletCRSProj4Leaflet, CommonUtilsRegister, LeafletCRSEPSG2154, LeafletCRSEPSG27572, LeafletCRSEPSG4326, LeafletCRSCRS, LeafletControlsMousePosition, CommonControlsReverseGeocodingDOM, LeafletControlsReverseGeocoding, CommonControlsRouteDOM, LeafletControlsRoute, CommonControlsSearchEngineDOM, CommonControlsSearchEngineUtils, LeafletControlsSearchEngine, CommonControlsElevationPathDOM, LeafletControlsElevationPath, LeafletControlsLogo, LeafletControlsControls, CommonUtilsLayerUtils, LeafletLayersLayerConfig, LeafletLayersLayerEvent, LeafletLayersWMS, LeafletLayersWMTS, LeafletLayersLayers, LeafletGpPluginLeaflet;
-(function (root, factory) {
-    if (true) {
-        gp = function () {
-            return typeof factory === 'function' ? factory() : factory;
-        }();
-    } else if (typeof exports === 'object') {
-        module.exports = factory();
-    } else {
-        root.Gp = factory();
-    }
-}(this, function () {
-    var log4js, loggerCfg, UtilsLoggerByDefault, UtilsHelper, promise, ProtocolsXHR, UtilsMessagesResources, ExceptionsErrorService, ProtocolsJSONP, ProtocolsProtocol, ServicesDefaultUrlService, ServicesCommonService, ServicesAltiRequestModelAltiRequest, ServicesAltiRequestModelAltiElevationRequest, ServicesAltiRequestModelAltiProfilRequest, ServicesAltiRequestAltiRequestREST, FormatsWPS, ServicesAltiRequestAltiRequestWPS, ServicesAltiRequestAltiRequestFactory, FormatsXML, ServicesAltiResponseModelAltiResponse, ServicesAltiResponseModelElevation, ServicesAltiFormatsAltiResponseReader, ServicesAltiResponseAltiResponseFactory, ServicesAltiAlti, ServicesAutoConfResponseModelAutoConfResponse, ServicesAutoConfResponseModelConstraint, ServicesAutoConfResponseModelFormat, ServicesAutoConfResponseModelLayer, ServicesAutoConfResponseModelLegend, ServicesAutoConfResponseModelMetadata, ServicesAutoConfResponseModelOriginator, ServicesAutoConfResponseModelService, ServicesAutoConfResponseModelStyle, ServicesAutoConfResponseModelTerritory, ServicesAutoConfResponseModelThematic, ServicesAutoConfResponseModelTileMatrixSet, ServicesAutoConfResponseModelTileMatrix, ServicesAutoConfResponseModelTileMatrixLimit, ServicesAutoConfFormatsAutoConfResponseReader, ServicesAutoConfResponseAutoConfResponseFactory, ServicesAutoConfAutoConf, FormatsXLSRequestHeader, FormatsXLSRequest, FormatsXLSAbstractService, FormatsXLS, FormatsXLSLocationUtilityServiceModelAddress, FormatsXLSLocationUtilityServiceGeocodeFilterExtension, FormatsXLSLocationUtilityServiceGeocodeRequest, FormatsXLSLocationUtilityServiceModelPosition, FormatsXLSLocationUtilityServiceModelPreference, FormatsXLSLocationUtilityServiceReverseGeocodeRequest, FormatsXLSLocationUtilityService, ServicesGeocodeRequestGeocodeLocation, ServicesGeocodeRequestModelStreetAddress, ServicesGeocodeRequestModelPositionOfInterest, ServicesGeocodeRequestModelCadastralParcel, ServicesGeocodeRequestModelAdministratif, ServicesGeocodeRequestDirectGeocodeRequestFactory, ServicesGeocodeResponseModelGeocodeResponse, ServicesGeocodeResponseModelGeocodedLocation, ServicesGeocodeResponseModelDirectGeocodedLocation, ServicesGeocodeFormatsDirectGeocodeResponseReader, ServicesGeocodeResponseDirectGeocodeResponseFactory, ServicesGeocodeGeocode, ServicesGeocodeRequestReverseGeocodeRequestFactory, ServicesGeocodeResponseModelReverseGeocodedLocation, ServicesGeocodeFormatsReverseGeocodeResponseReader, ServicesGeocodeResponseReverseGeocodeResponseFactory, ServicesGeocodeReverseGeocode, ServicesAutoCompleteResponseModelAutoCompleteResponse, ServicesAutoCompleteResponseModelSuggestedLocation, ServicesAutoCompleteResponseAutoCompleteResponseFactory, ServicesAutoCompleteAutoComplete, FormatsXLSRouteServiceModelRoutePlan, FormatsXLSRouteServiceDetermineRouteRequest, FormatsXLSRouteServiceRouteRequestExtension, FormatsXLSRouteService, ServicesRouteRequestRouteRequestOLS, ServicesRouteRequestModelRouteParamREST, ServicesRouteRequestRouteRequestREST, ServicesRouteRequestRouteRequestFactory, FormatsWKT, ServicesRouteResponseModelRouteResponse, ServicesRouteResponseModelRouteInstruction, ServicesRouteFormatsRouteResponseRESTReader, ServicesRouteFormatsRouteResponseOLSReader, ServicesRouteResponseRouteResponseFactory, ServicesRouteRoute, ServicesProcessIsoCurveRequestModelProcessIsoCurveParam, ServicesProcessIsoCurveRequestProcessIsoCurveRequest, ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse, ServicesProcessIsoCurveFormatsProcessIsoCurveResponseReader, ServicesProcessIsoCurveResponseProcessIsoCurveResponseFactory, ServicesProcessIsoCurveProcessIsoCurve, ServicesServices, Gp;
-    log4js = undefined;
-    loggerCfg = {
-        loggers: [{
-                root: true,
-                level: 'all',
-                appenders: [{
-                        type: 'Console',
-                        layout: {
-                            type: 'PatternLayout',
-                            pattern: '%d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n'
-                        }
-                    }]
-            }]
-    };
-    UtilsLoggerByDefault = function (Log4js, Config) {
-        var LoggerByDefault = {
-            getLogger: function (name) {
-                Log4js.load(Config, function (error) {
-                    if (error) {
-                        throw error;
-                    }
-                });
-                var logname = name || 'default';
-                return Log4js.getLogger(logname);
-            }
-        };
-        return LoggerByDefault;
-    }(log4js, loggerCfg);
-    UtilsHelper = function () {
-        var Helper = {
-            normalyzeParameters: function (params) {
-                var myParams = null;
-                if (params) {
-                    var tabParams = [];
-                    for (var key in params) {
-                        if (params.hasOwnProperty(key)) {
-                            var value = params[key];
-                            if (!value) {
-                                value = '';
-                            }
-                            tabParams.push(key + '=' + value);
-                        }
-                    }
-                    myParams = tabParams.join('&');
-                }
-                return myParams;
-            },
-            normalyzeUrl: function (url, params, encode) {
-                var myUrl = url;
-                if (url) {
-                    var k = url.indexOf('?');
-                    if (k === -1) {
-                        myUrl += '?';
-                    }
-                    if (k !== -1 && k !== url.length - 1) {
-                        myUrl += '&';
-                    }
-                }
-                if (params) {
-                    if (typeof params === 'string') {
-                        myUrl += params;
-                    } else {
-                        myUrl += this.normalyzeParameters(params);
-                    }
-                }
-                if (encode) {
-                    myUrl = encodeURIComponent(myUrl);
-                }
-                return myUrl;
-            },
-            indent: function (n, msg) {
-                var num = n || 0;
-                return new Array(num + 1).join('\t') + msg;
-            }
-        };
-        return Helper;
-    }();
-    (function () {
-        'use strict';
-        function lib$es6$promise$utils$$objectOrFunction(x) {
-            return typeof x === 'function' || typeof x === 'object' && x !== null;
-        }
-        function lib$es6$promise$utils$$isFunction(x) {
-            return typeof x === 'function';
-        }
-        function lib$es6$promise$utils$$isMaybeThenable(x) {
-            return typeof x === 'object' && x !== null;
-        }
-        var lib$es6$promise$utils$$_isArray;
-        if (!Array.isArray) {
-            lib$es6$promise$utils$$_isArray = function (x) {
-                return Object.prototype.toString.call(x) === '[object Array]';
-            };
-        } else {
-            lib$es6$promise$utils$$_isArray = Array.isArray;
-        }
-        var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray;
-        var lib$es6$promise$asap$$len = 0;
-        var lib$es6$promise$asap$$toString = {}.toString;
-        var lib$es6$promise$asap$$vertxNext;
-        var lib$es6$promise$asap$$customSchedulerFn;
-        var lib$es6$promise$asap$$asap = function asap(callback, arg) {
-            lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback;
-            lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg;
-            lib$es6$promise$asap$$len += 2;
-            if (lib$es6$promise$asap$$len === 2) {
-                if (lib$es6$promise$asap$$customSchedulerFn) {
-                    lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush);
-                } else {
-                    lib$es6$promise$asap$$scheduleFlush();
-                }
-            }
-        };
-        function lib$es6$promise$asap$$setScheduler(scheduleFn) {
-            lib$es6$promise$asap$$customSchedulerFn = scheduleFn;
-        }
-        function lib$es6$promise$asap$$setAsap(asapFn) {
-            lib$es6$promise$asap$$asap = asapFn;
-        }
-        var lib$es6$promise$asap$$browserWindow = typeof window !== 'undefined' ? window : undefined;
-        var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {};
-        var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;
-        var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
-        var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
-        function lib$es6$promise$asap$$useNextTick() {
-            return function () {
-                process.nextTick(lib$es6$promise$asap$$flush);
-            };
-        }
-        function lib$es6$promise$asap$$useVertxTimer() {
-            return function () {
-                lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush);
-            };
-        }
-        function lib$es6$promise$asap$$useMutationObserver() {
-            var iterations = 0;
-            var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush);
-            var node = document.createTextNode('');
-            observer.observe(node, { characterData: true });
-            return function () {
-                node.data = iterations = ++iterations % 2;
-            };
-        }
-        function lib$es6$promise$asap$$useMessageChannel() {
-            var channel = new MessageChannel();
-            channel.port1.onmessage = lib$es6$promise$asap$$flush;
-            return function () {
-                channel.port2.postMessage(0);
-            };
-        }
-        function lib$es6$promise$asap$$useSetTimeout() {
-            return function () {
-                setTimeout(lib$es6$promise$asap$$flush, 1);
-            };
-        }
-        var lib$es6$promise$asap$$queue = new Array(1000);
-        function lib$es6$promise$asap$$flush() {
-            for (var i = 0; i < lib$es6$promise$asap$$len; i += 2) {
-                var callback = lib$es6$promise$asap$$queue[i];
-                var arg = lib$es6$promise$asap$$queue[i + 1];
-                callback(arg);
-                lib$es6$promise$asap$$queue[i] = undefined;
-                lib$es6$promise$asap$$queue[i + 1] = undefined;
-            }
-            lib$es6$promise$asap$$len = 0;
-        }
-        function lib$es6$promise$asap$$attemptVertx() {
-            try {
-                var r = require;
-                var vertx = r('vertx');
-                lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext;
-                return lib$es6$promise$asap$$useVertxTimer();
-            } catch (e) {
-                return lib$es6$promise$asap$$useSetTimeout();
-            }
-        }
-        var lib$es6$promise$asap$$scheduleFlush;
-        if (lib$es6$promise$asap$$isNode) {
-            lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick();
-        } else if (lib$es6$promise$asap$$BrowserMutationObserver) {
-            lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver();
-        } else if (lib$es6$promise$asap$$isWorker) {
-            lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel();
-        } else if (lib$es6$promise$asap$$browserWindow === undefined && typeof require === 'function') {
-            lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertx();
-        } else {
-            lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout();
-        }
-        function lib$es6$promise$$internal$$noop() {
-        }
-        var lib$es6$promise$$internal$$PENDING = void 0;
-        var lib$es6$promise$$internal$$FULFILLED = 1;
-        var lib$es6$promise$$internal$$REJECTED = 2;
-        var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject();
-        function lib$es6$promise$$internal$$selfFulfillment() {
-            return new TypeError('You cannot resolve a promise with itself');
-        }
-        function lib$es6$promise$$internal$$cannotReturnOwn() {
-            return new TypeError('A promises callback cannot return that same promise.');
-        }
-        function lib$es6$promise$$internal$$getThen(promise) {
-            try {
-                return promise.then;
-            } catch (error) {
-                lib$es6$promise$$internal$$GET_THEN_ERROR.error = error;
-                return lib$es6$promise$$internal$$GET_THEN_ERROR;
-            }
-        }
-        function lib$es6$promise$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) {
-            try {
-                then.call(value, fulfillmentHandler, rejectionHandler);
-            } catch (e) {
-                return e;
-            }
-        }
-        function lib$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) {
-            lib$es6$promise$asap$$asap(function (promise) {
-                var sealed = false;
-                var error = lib$es6$promise$$internal$$tryThen(then, thenable, function (value) {
-                    if (sealed) {
-                        return;
-                    }
-                    sealed = true;
-                    if (thenable !== value) {
-                        lib$es6$promise$$internal$$resolve(promise, value);
-                    } else {
-                        lib$es6$promise$$internal$$fulfill(promise, value);
-                    }
-                }, function (reason) {
-                    if (sealed) {
-                        return;
-                    }
-                    sealed = true;
-                    lib$es6$promise$$internal$$reject(promise, reason);
-                }, 'Settle: ' + (promise._label || ' unknown promise'));
-                if (!sealed && error) {
-                    sealed = true;
-                    lib$es6$promise$$internal$$reject(promise, error);
-                }
-            }, promise);
-        }
-        function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) {
-            if (thenable._state === lib$es6$promise$$internal$$FULFILLED) {
-                lib$es6$promise$$internal$$fulfill(promise, thenable._result);
-            } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) {
-                lib$es6$promise$$internal$$reject(promise, thenable._result);
-            } else {
-                lib$es6$promise$$internal$$subscribe(thenable, undefined, function (value) {
-                    lib$es6$promise$$internal$$resolve(promise, value);
-                }, function (reason) {
-                    lib$es6$promise$$internal$$reject(promise, reason);
-                });
-            }
-        }
-        function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable) {
-            if (maybeThenable.constructor === promise.constructor) {
-                lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable);
-            } else {
-                var then = lib$es6$promise$$internal$$getThen(maybeThenable);
-                if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) {
-                    lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error);
-                } else if (then === undefined) {
-                    lib$es6$promise$$internal$$fulfill(promise, maybeThenable);
-                } else if (lib$es6$promise$utils$$isFunction(then)) {
-                    lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then);
-                } else {
-                    lib$es6$promise$$internal$$fulfill(promise, maybeThenable);
-                }
-            }
-        }
-        function lib$es6$promise$$internal$$resolve(promise, value) {
-            if (promise === value) {
-                lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFulfillment());
-            } else if (lib$es6$promise$utils$$objectOrFunction(value)) {
-                lib$es6$promise$$internal$$handleMaybeThenable(promise, value);
-            } else {
-                lib$es6$promise$$internal$$fulfill(promise, value);
-            }
-        }
-        function lib$es6$promise$$internal$$publishRejection(promise) {
-            if (promise._onerror) {
-                promise._onerror(promise._result);
-            }
-            lib$es6$promise$$internal$$publish(promise);
-        }
-        function lib$es6$promise$$internal$$fulfill(promise, value) {
-            if (promise._state !== lib$es6$promise$$internal$$PENDING) {
-                return;
-            }
-            promise._result = value;
-            promise._state = lib$es6$promise$$internal$$FULFILLED;
-            if (promise._subscribers.length !== 0) {
-                lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, promise);
-            }
-        }
-        function lib$es6$promise$$internal$$reject(promise, reason) {
-            if (promise._state !== lib$es6$promise$$internal$$PENDING) {
-                return;
-            }
-            promise._state = lib$es6$promise$$internal$$REJECTED;
-            promise._result = reason;
-            lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publishRejection, promise);
-        }
-        function lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection) {
-            var subscribers = parent._subscribers;
-            var length = subscribers.length;
-            parent._onerror = null;
-            subscribers[length] = child;
-            subscribers[length + lib$es6$promise$$internal$$FULFILLED] = onFulfillment;
-            subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection;
-            if (length === 0 && parent._state) {
-                lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, parent);
-            }
-        }
-        function lib$es6$promise$$internal$$publish(promise) {
-            var subscribers = promise._subscribers;
-            var settled = promise._state;
-            if (subscribers.length === 0) {
-                return;
-            }
-            var child, callback, detail = promise._result;
-            for (var i = 0; i < subscribers.length; i += 3) {
-                child = subscribers[i];
-                callback = subscribers[i + settled];
-                if (child) {
-                    lib$es6$promise$$internal$$invokeCallback(settled, child, callback, detail);
-                } else {
-                    callback(detail);
-                }
-            }
-            promise._subscribers.length = 0;
-        }
-        function lib$es6$promise$$internal$$ErrorObject() {
-            this.error = null;
-        }
-        var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject();
-        function lib$es6$promise$$internal$$tryCatch(callback, detail) {
-            try {
-                return callback(detail);
-            } catch (e) {
-                lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e;
-                return lib$es6$promise$$internal$$TRY_CATCH_ERROR;
-            }
-        }
-        function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) {
-            var hasCallback = lib$es6$promise$utils$$isFunction(callback), value, error, succeeded, failed;
-            if (hasCallback) {
-                value = lib$es6$promise$$internal$$tryCatch(callback, detail);
-                if (value === lib$es6$promise$$internal$$TRY_CATCH_ERROR) {
-                    failed = true;
-                    error = value.error;
-                    value = null;
-                } else {
-                    succeeded = true;
-                }
-                if (promise === value) {
-                    lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn());
-                    return;
-                }
-            } else {
-                value = detail;
-                succeeded = true;
-            }
-            if (promise._state !== lib$es6$promise$$internal$$PENDING) {
-            } else if (hasCallback && succeeded) {
-                lib$es6$promise$$internal$$resolve(promise, value);
-            } else if (failed) {
-                lib$es6$promise$$internal$$reject(promise, error);
-            } else if (settled === lib$es6$promise$$internal$$FULFILLED) {
-                lib$es6$promise$$internal$$fulfill(promise, value);
-            } else if (settled === lib$es6$promise$$internal$$REJECTED) {
-                lib$es6$promise$$internal$$reject(promise, value);
-            }
-        }
-        function lib$es6$promise$$internal$$initializePromise(promise, resolver) {
-            try {
-                resolver(function resolvePromise(value) {
-                    lib$es6$promise$$internal$$resolve(promise, value);
-                }, function rejectPromise(reason) {
-                    lib$es6$promise$$internal$$reject(promise, reason);
-                });
-            } catch (e) {
-                lib$es6$promise$$internal$$reject(promise, e);
-            }
-        }
-        function lib$es6$promise$enumerator$$Enumerator(Constructor, input) {
-            var enumerator = this;
-            enumerator._instanceConstructor = Constructor;
-            enumerator.promise = new Constructor(lib$es6$promise$$internal$$noop);
-            if (enumerator._validateInput(input)) {
-                enumerator._input = input;
-                enumerator.length = input.length;
-                enumerator._remaining = input.length;
-                enumerator._init();
-                if (enumerator.length === 0) {
-                    lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);
-                } else {
-                    enumerator.length = enumerator.length || 0;
-                    enumerator._enumerate();
-                    if (enumerator._remaining === 0) {
-                        lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);
-                    }
-                }
-            } else {
-                lib$es6$promise$$internal$$reject(enumerator.promise, enumerator._validationError());
-            }
-        }
-        lib$es6$promise$enumerator$$Enumerator.prototype._validateInput = function (input) {
-            return lib$es6$promise$utils$$isArray(input);
-        };
-        lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function () {
-            return new Error('Array Methods must be provided an Array');
-        };
-        lib$es6$promise$enumerator$$Enumerator.prototype._init = function () {
-            this._result = new Array(this.length);
-        };
-        var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator;
-        lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function () {
-            var enumerator = this;
-            var length = enumerator.length;
-            var promise = enumerator.promise;
-            var input = enumerator._input;
-            for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {
-                enumerator._eachEntry(input[i], i);
-            }
-        };
-        lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function (entry, i) {
-            var enumerator = this;
-            var c = enumerator._instanceConstructor;
-            if (lib$es6$promise$utils$$isMaybeThenable(entry)) {
-                if (entry.constructor === c && entry._state !== lib$es6$promise$$internal$$PENDING) {
-                    entry._onerror = null;
-                    enumerator._settledAt(entry._state, i, entry._result);
-                } else {
-                    enumerator._willSettleAt(c.resolve(entry), i);
-                }
-            } else {
-                enumerator._remaining--;
-                enumerator._result[i] = entry;
-            }
-        };
-        lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function (state, i, value) {
-            var enumerator = this;
-            var promise = enumerator.promise;
-            if (promise._state === lib$es6$promise$$internal$$PENDING) {
-                enumerator._remaining--;
-                if (state === lib$es6$promise$$internal$$REJECTED) {
-                    lib$es6$promise$$internal$$reject(promise, value);
-                } else {
-                    enumerator._result[i] = value;
-                }
-            }
-            if (enumerator._remaining === 0) {
-                lib$es6$promise$$internal$$fulfill(promise, enumerator._result);
-            }
-        };
-        lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function (promise, i) {
-            var enumerator = this;
-            lib$es6$promise$$internal$$subscribe(promise, undefined, function (value) {
-                enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value);
-            }, function (reason) {
-                enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason);
-            });
-        };
-        function lib$es6$promise$promise$all$$all(entries) {
-            return new lib$es6$promise$enumerator$$default(this, entries).promise;
-        }
-        var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all;
-        function lib$es6$promise$promise$race$$race(entries) {
-            var Constructor = this;
-            var promise = new Constructor(lib$es6$promise$$internal$$noop);
-            if (!lib$es6$promise$utils$$isArray(entries)) {
-                lib$es6$promise$$internal$$reject(promise, new TypeError('You must pass an array to race.'));
-                return promise;
-            }
-            var length = entries.length;
-            function onFulfillment(value) {
-                lib$es6$promise$$internal$$resolve(promise, value);
-            }
-            function onRejection(reason) {
-                lib$es6$promise$$internal$$reject(promise, reason);
-            }
-            for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {
-                lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);
-            }
-            return promise;
-        }
-        var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race;
-        function lib$es6$promise$promise$resolve$$resolve(object) {
-            var Constructor = this;
-            if (object && typeof object === 'object' && object.constructor === Constructor) {
-                return object;
-            }
-            var promise = new Constructor(lib$es6$promise$$internal$$noop);
-            lib$es6$promise$$internal$$resolve(promise, object);
-            return promise;
-        }
-        var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve;
-        function lib$es6$promise$promise$reject$$reject(reason) {
-            var Constructor = this;
-            var promise = new Constructor(lib$es6$promise$$internal$$noop);
-            lib$es6$promise$$internal$$reject(promise, reason);
-            return promise;
-        }
-        var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject;
-        var lib$es6$promise$promise$$counter = 0;
-        function lib$es6$promise$promise$$needsResolver() {
-            throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
-        }
-        function lib$es6$promise$promise$$needsNew() {
-            throw new TypeError('Failed to construct \'Promise\': Please use the \'new\' operator, this object constructor cannot be called as a function.');
-        }
-        var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise;
-        function lib$es6$promise$promise$$Promise(resolver) {
-            this._id = lib$es6$promise$promise$$counter++;
-            this._state = undefined;
-            this._result = undefined;
-            this._subscribers = [];
-            if (lib$es6$promise$$internal$$noop !== resolver) {
-                if (!lib$es6$promise$utils$$isFunction(resolver)) {
-                    lib$es6$promise$promise$$needsResolver();
-                }
-                if (!(this instanceof lib$es6$promise$promise$$Promise)) {
-                    lib$es6$promise$promise$$needsNew();
-                }
-                lib$es6$promise$$internal$$initializePromise(this, resolver);
-            }
-        }
-        lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default;
-        lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default;
-        lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default;
-        lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default;
-        lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler;
-        lib$es6$promise$promise$$Promise._setAsap = lib$es6$promise$asap$$setAsap;
-        lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$asap;
-        lib$es6$promise$promise$$Promise.prototype = {
-            constructor: lib$es6$promise$promise$$Promise,
-            then: function (onFulfillment, onRejection) {
-                var parent = this;
-                var state = parent._state;
-                if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) {
-                    return this;
-                }
-                var child = new this.constructor(lib$es6$promise$$internal$$noop);
-                var result = parent._result;
-                if (state) {
-                    var callback = arguments[state - 1];
-                    lib$es6$promise$asap$$asap(function () {
-                        lib$es6$promise$$internal$$invokeCallback(state, child, callback, result);
-                    });
-                } else {
-                    lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection);
-                }
-                return child;
-            },
-            'catch': function (onRejection) {
-                return this.then(null, onRejection);
-            }
-        };
-        function lib$es6$promise$polyfill$$polyfill() {
-            var local;
-            if (typeof global !== 'undefined') {
-                local = global;
-            } else if (typeof self !== 'undefined') {
-                local = self;
-            } else {
-                try {
-                    local = Function('return this')();
-                } catch (e) {
-                    throw new Error('polyfill failed because global object is unavailable in this environment');
-                }
-            }
-            var P = local.Promise;
-            if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) {
-                return;
-            }
-            local.Promise = lib$es6$promise$promise$$default;
-        }
-        var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill;
-        var lib$es6$promise$umd$$ES6Promise = {
-            'Promise': lib$es6$promise$promise$$default,
-            'polyfill': lib$es6$promise$polyfill$$default
-        };
-        if (true) {
-            promise = function () {
-                return lib$es6$promise$umd$$ES6Promise;
-            }();
-        } else if (typeof module !== 'undefined' && module['exports']) {
-            module['exports'] = lib$es6$promise$umd$$ES6Promise;
-        } else if (typeof this !== 'undefined') {
-            this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise;
-        }
-        lib$es6$promise$polyfill$$default();
-    }.call(this));
-    ProtocolsXHR = function (Logger, Helper, ES6Promise) {
-        var XHR = {
-            call: function (settings) {
-                ES6Promise.polyfill();
-                if (!settings.url) {
-                    throw new Error('missing parameter : url is not defined !');
-                }
-                if (!settings.method) {
-                    throw new Error('missing parameter : method is not defined !');
-                }
-                if (!settings.format) {
-                    settings.format = 'text';
-                }
-                var options = {};
-                options.url = settings.url;
-                options.data = settings.data ? settings.data : null;
-                options.method = settings.method;
-                options.timeOut = settings.timeOut || 0;
-                options.scope = settings.scope || this;
-                switch (settings.method) {
-                case 'DELETE':
-                case 'GET':
-                    break;
-                case 'PUT':
-                case 'POST':
-                    options.content = settings.content ? settings.content : 'application/x-www-form-urlencoded';
-                    options.headers = settings.headers ? settings.headers : { referer: 'http://localhost' };
-                    break;
-                case 'HEAD':
-                case 'OPTIONS':
-                    throw new Error('HTTP method not yet supported !');
-                default:
-                    throw new Error('HTTP method unknown !');
-                }
-                switch (settings.format) {
-                case 'text':
-                    this.__call(options).then(function (response) {
-                        settings.onResponse.call(this, response);
-                    }).catch(function (error) {
-                        settings.onFailure.call(this, error);
-                    });
-                    break;
-                case 'json':
-                    this.__callJSON(options).then(function (response) {
-                        settings.onResponse.call(this, response);
-                    }).catch(function (error) {
-                        settings.onFailure.call(this, error);
-                    });
-                    break;
-                case 'xml':
-                    this.__callXML(options).then(function (response) {
-                        settings.onResponse.call(this, response);
-                    }).catch(function (error) {
-                        settings.onFailure.call(this, error);
-                    });
-                    break;
-                default:
-                    throw new Error('This output Format is not yet supported !');
-                }
-            },
-            __call: function (options) {
-                var promise = new Promise(function (resolve, reject) {
-                    var corps = options.method === 'POST' || options.method === 'PUT' ? true : false;
-                    if (options.data && !corps) {
-                        options.url = Helper.normalyzeUrl(options.url, options.data);
-                    }
-                    var hXHR = null;
-                    if (window.XMLHttpRequest) {
-                        hXHR = new XMLHttpRequest();
-                        hXHR.open(options.method, options.url, true);
-                        hXHR.overrideMimeType = options.content;
-                        var onTimeOutTrigger = null;
-                        if (options.timeOut > 0) {
-                            onTimeOutTrigger = window.setTimeout(function () {
-                                var message = 'TimeOut Occured on Http Request with XMLHttpRequest !';
-                                reject({
-                                    message: message,
-                                    status: -1
-                                });
-                            }, options.timeOut);
-                        }
-                        if (corps) {
-                            hXHR.setRequestHeader('Content-type', options.content);
-                        }
-                        hXHR.onerror = function (e) {
-                            console.log(e);
-                            reject(new Error('Errors Occured on Http Request with XMLHttpRequest !'));
-                        };
-                        hXHR.ontimeout = function () {
-                            reject(new Error('TimeOut Occured on Http Request with XMLHttpRequest !'));
-                        };
-                        hXHR.onreadystatechange = function () {
-                            if (hXHR.readyState == 4) {
-                                if (hXHR.status == 200) {
-                                    window.clearTimeout(onTimeOutTrigger);
-                                    resolve(hXHR.response);
-                                } else {
-                                    var message = 'Errors Occured on Http Request (status : \'' + hXHR.status + '\' | response : \'' + hXHR.response + '\')';
-                                    var status = hXHR.status;
-                                    reject({
-                                        message: message,
-                                        status: status
-                                    });
-                                }
-                            }
-                        };
-                        var data4xhr = options.data && corps ? options.data : null;
-                        hXHR.send(data4xhr);
-                    } else if (window.XDomainRequest) {
-                        hXHR = new XDomainRequest();
-                        hXHR.open(options.method, options.url);
-                        hXHR.overrideMimeType = options.content;
-                        if (options.timeOut > 0) {
-                            hXHR.timeout = options.timeout;
-                        }
-                        if (corps) {
-                            hXHR.setRequestHeader('Content-type', options.content);
-                        }
-                        hXHR.onerror = function () {
-                            reject(new Error('Errors Occured on Http Request with XMLHttpRequest !'));
-                        };
-                        hXHR.ontimeout = function () {
-                            reject(new Error('TimeOut Occured on Http Request with XMLHttpRequest !'));
-                        };
-                        hXHR.onload = function () {
-                            if (hXHR.status == 200) {
-                                resolve(hXHR.responseText);
-                            } else {
-                                var message = 'Errors Occured on Http Request (status : \'' + hXHR.status + '\' | response : \'' + hXHR.responseText + '\')';
-                                var status = hXHR.status;
-                                reject({
-                                    message: message,
-                                    status: status
-                                });
-                            }
-                        };
-                        var data4xdr = options.data && corps ? options.data : null;
-                        hXHR.send(data4xdr);
-                    } else {
-                        throw new Error('CORS not supported');
-                    }
-                });
-                return promise;
-            },
-            __callJSON: function (options) {
-                return this.__call(options).then(JSON.parse).catch(function (error) {
-                    console.log('_callJSON failed on : ', options.url, error);
-                    throw error;
-                });
-            },
-            __callXML: function (options) {
-                return this.__call(options).then(function (response) {
-                    var xmlDoc;
-                    if (window.DOMParser) {
-                        var parser = new DOMParser();
-                        xmlDoc = parser.parseFromString(response, 'text/xml');
-                    } else {
-                        xmlDoc = new window.ActiveXObject('Microsoft.XMLDOM');
-                        xmlDoc.async = false;
-                        xmlDoc.loadXML(response);
-                    }
-                    return xmlDoc;
-                }).catch(function (error) {
-                    console.log('__callXML failed on : ', options.url, error);
-                    throw error;
-                });
-            }
-        };
-        return XHR;
-    }(UtilsLoggerByDefault, UtilsHelper, promise);
-    UtilsMessagesResources = function () {
-        var MessagesResources = {
-            PARAM_MISSING: 'Parameter(s) \'%var%\' missing',
-            PARAM_EMPTY: 'Parameter(s) \'%var%\' empty',
-            PARAM_TYPE: 'Wrong type(s) for parameter(s) \'%var%\'',
-            PARAM_FORMAT: 'Parameter(s) \'%var%\' not correctly formatted',
-            PARAM_NOT_SUPPORT: 'Value(s) for parameter(s) \'%var%\' not supported',
-            PARAM_UNKNOWN: 'Value(s) for parameter(s) \'%var%\' unknown',
-            SERVICE_REQUEST_BUILD: 'An error occurred during the request building of the service',
-            SERVICE_REQUEST_EMPTY: 'The request sent to the service is empty',
-            SERVICE_RESPONSE_EXCEPTION: 'The service returned an exception : \'%var%\'',
-            SERVICE_RESPONSE_EXCEPTION_2: 'The service returned an exception',
-            SERVICE_RESPONSE_ANALYSE: 'An error occurred while parsing the response \'%var%\' of the service',
-            SERVICE_RESPONSE_ANALYSE_2: 'An unknown error occurred while parsing the response',
-            SERVICE_RESPONSE_EMPTY: 'The response of the service is empty',
-            SERVICE_RESPONSE_EMPTY_2: 'The response from the service could not be analyzed or is empty',
-            SERVICE_RESPONSE_FORMAT: 'The format of the service response is not supported (handled format(s) : \'%var%\')',
-            SERVICE_RESPONSE_FORMAT_2: 'The format of the service response is not supported',
-            SERVICE_RESPONSE_FORMAT_3: 'No suggestion matching the search',
-            CLASS_CONSTRUCTOR: '\'%var%\' constructor cannot be called as a function.',
-            getMessage: function (clef, parametres) {
-                if (!arguments) {
-                    return 'Message indefined !';
-                }
-                var params = Array.prototype.slice.call(arguments);
-                var key = params.shift();
-                var args = params;
-                var message = this[key];
-                try {
-                    if (Array.isArray(args) && args.length > 0) {
-                        message = message.replace('%var%', args.join(' - '));
-                    } else {
-                        message = message.replace('%var%', '%var% (not specified)');
-                    }
-                } catch (e) {
-                }
-                return message;
-            }
-        };
-        return MessagesResources;
-    }();
-    ExceptionsErrorService = function () {
-        function ErrorService(error) {
-            if (!(this instanceof ErrorService)) {
-                throw new TypeError('ErrorService constructor cannot be called as a function.');
-            }
-            var e = error;
-            if (typeof error === 'string' || error instanceof String) {
-                this.message = error;
-                this.status = -1;
-                this.type = ErrorService.TYPE_UNKERR;
-            } else {
-                this.message = e.message || 'undefined!?';
-                this.type = e.type;
-                this.status = e.status || -1;
-            }
-            this.name = 'ErrorService';
-            this.stack = new Error().stack;
-        }
-        ErrorService.TYPE_SRVERR = 'SERVICE_ERROR';
-        ErrorService.TYPE_USEERR = 'USAGE_ERROR';
-        ErrorService.TYPE_UNKERR = 'UNKNOWN_ERROR';
-        ErrorService.prototype = Object.create(Error.prototype, {
-            constructor: {
-                value: ErrorService,
-                writable: true,
-                configurable: true
-            }
-        });
-        return ErrorService;
-    }();
-    ProtocolsJSONP = function (Logger) {
-        var JSONP = {
-            uuid: function () {
-                var id = Math.floor(Date.now());
-                return function () {
-                    return id++;
-                };
-            }(),
-            call: function (options) {
-                if (!options) {
-                    throw new Error('missing parameter : options !');
-                }
-                if (!options.url) {
-                    throw new Error('missing parameter : options.url !');
-                }
-                if (!options.timeOut) {
-                    options.timeOut = 0;
-                }
-                if (!options.onResponse) {
-                    throw new Error('missing parameter : options.onResponse !');
-                }
-                var callbackId = typeof options.callbackSuffix === 'string' ? options.callbackSuffix : this.uuid();
-                var urlHasCallbackKey = false;
-                var urlHasCallbackName = false;
-                var idx = options.url.indexOf('callback=');
-                if (idx != -1) {
-                    urlHasCallbackKey = true;
-                    var j = options.url.indexOf('&', idx);
-                    if (j === -1) {
-                        j = options.url.length;
-                    }
-                    var callbackName = options.url.substring(idx + 9, j);
-                    if (callbackName) {
-                        urlHasCallbackName = true;
-                        options.callbackName = callbackName;
-                    }
-                }
-                if (!urlHasCallbackKey) {
-                    var k = options.url.indexOf('?');
-                    if (k === -1) {
-                        options.url = options.url + '?' + 'callback=';
-                    } else if (k === options.url.length) {
-                        options.url = options.url + 'callback=';
-                    } else {
-                        options.url = options.url + '&' + 'callback=';
-                    }
-                }
-                var HasCallbackName = options.callbackName ? true : urlHasCallbackName;
-                if (!urlHasCallbackName) {
-                    if (!options.callbackName) {
-                        options.callbackName = 'callback';
-                        if (callbackId || callbackId === '') {
-                            options.callbackName += callbackId;
-                        }
-                    }
-                    options.url = options.url.replace('callback=', 'callback=' + options.callbackName);
-                }
-                if (!options.onTimeOut) {
-                    options.onTimeOut = function () {
-                        console.log('TimeOut while invoking url : ' + options.url);
-                    };
-                }
-                if (!HasCallbackName) {
-                    var self = this;
-                    var onTimeOutTrigger = null;
-                    if (options.timeOut > 0) {
-                        onTimeOutTrigger = window.setTimeout(function () {
-                            window[options.callbackName] = function () {
-                            };
-                            options.onTimeOut();
-                            self._deleteScript(callbackId);
-                        }, options.timeOut);
-                    }
-                    window[options.callbackName] = function (data) {
-                        window.clearTimeout(onTimeOutTrigger);
-                        options.onResponse(data);
-                        self._deleteScript(callbackId);
-                    };
-                }
-                this._createScript(callbackId, options.url);
-            },
-            _createScript: function (callbackId, url) {
-                var scriptu;
-                var scripto = document.getElementById('results' + callbackId);
-                scriptu = document.createElement('script');
-                scriptu.setAttribute('type', 'text/javascript');
-                scriptu.setAttribute('src', url);
-                scriptu.setAttribute('charset', 'UTF-8');
-                scriptu.setAttribute('id', 'results' + callbackId);
-                scriptu.setAttribute('async', 'true');
-                var node = document.documentElement || document.getElementsByTagName('head')[0];
-                if (scripto === null) {
-                    node.appendChild(scriptu);
-                } else {
-                    node.replaceChild(scriptu, scripto);
-                }
-            },
-            _deleteScript: function (callbackId) {
-                var script = document.getElementById('results' + callbackId);
-                if (script) {
-                    var node = script.parentNode || document.documentElement;
-                    if (!node) {
-                        return;
-                    }
-                    node.removeChild(script);
-                }
-            }
-        };
-        return JSONP;
-    }(UtilsLoggerByDefault);
-    ProtocolsProtocol = function (Helper, XHR, JSONP) {
-        var Protocol = {
-            send: function (options) {
-                var settings = options || {
-                    method: 'GET',
-                    protocol: 'JSONP',
-                    timeOut: 0,
-                    format: null,
-                    wrap: true,
-                    nocache: true,
-                    output: 'json',
-                    callback: null,
-                    callbackSuffix: null
-                };
-                if (options.protocol === 'XHR' || options.format === 'json') {
-                    settings.wrap = false;
-                } else if (options.protocol === 'JSONP' && options.format === 'xml') {
-                    settings.wrap = true;
-                }
-                settings.callback = options.protocol == 'JSONP' ? null : null;
-                settings.output = settings.wrap ? 'json' : null;
-                if (settings.wrap) {
-                    var params = {};
-                    params.output = settings.output;
-                    params.callback = settings.callback;
-                    delete params.callback;
-                    settings.url = Helper.normalyzeUrl(options.url, params);
-                }
-                switch (settings.protocol) {
-                case 'XHR':
-                    if (options.method === 'GET' && options.nocache) {
-                        settings.url = Helper.normalyzeUrl(settings.url, { t: new Date().getTime() });
-                    }
-                    XHR.call(settings);
-                    break;
-                case 'JSONP':
-                    if (settings.data) {
-                        settings.url = Helper.normalyzeUrl(settings.url, settings.data);
-                    }
-                    JSONP.call(settings);
-                    break;
-                default:
-                    throw new Error('protocol not supported (XHR|JSONP) !');
-                }
-            }
-        };
-        return Protocol;
-    }(UtilsHelper, ProtocolsXHR, ProtocolsJSONP);
-    ServicesDefaultUrlService = function () {
-        var protocol = location && location.protocol && location.protocol.indexOf('https:') === 0 ? 'https://' : 'http://';
-        var hostname = 'wxs.ign.fr';
-        var keyname = '%KEY%';
-        var url = protocol + hostname.concat('/', keyname);
-        var fkey = function (key) {
-            return this._key.replace(key ? keyname : null, key);
-        };
-        var DefaultUrlService = {
-            Alti: {
-                _key: {
-                    'elevation-json': url + '/alti/rest/elevation.json',
-                    'elevation-xml': url + '/alti/rest/elevation.xml',
-                    'profil-json': url + '/alti/rest/elevationLine.json',
-                    'profil-xml': url + '/alti/rest/elevationLine.xml',
-                    wps: url + '/alti/wps'
-                },
-                url: function (key) {
-                    return {
-                        'elevation-json': this._key['elevation-json'].replace(key ? keyname : null, key),
-                        'elevation-xml': this._key['elevation-xml'].replace(key ? keyname : null, key),
-                        'profil-json': this._key['profil-json'].replace(key ? keyname : null, key),
-                        'profil-xml': this._key['profil-xml'].replace(key ? keyname : null, key),
-                        wps: this._key.wps.replace(key ? keyname : null, key)
-                    };
-                }
-            },
-            ProcessIsoCurve: {
-                _key: {
-                    'iso-json': url + '/isochrone/isochrone.json',
-                    'iso-xml': url + '/isochrone/isochrone.xml'
-                },
-                url: function (key) {
-                    return {
-                        'iso-json': this._key['iso-json'].replace(key ? keyname : null, key),
-                        'iso-xml': this._key['iso-xml'].replace(key ? keyname : null, key)
-                    };
-                }
-            },
-            AutoComplete: {
-                _key: url + '/ols/apis/completion',
-                url: fkey
-            },
-            ReverseGeocode: {
-                _key: url + '/geoportail/ols',
-                url: fkey
-            },
-            AutoConf: {
-                _key: {
-                    apiKey: url + '/autoconf',
-                    apiKeys: url + '/autoconf?keys=%KEYS%'
-                },
-                url: function (key) {
-                    var keys = '';
-                    if (Array.isArray(key) && key.length > 0) {
-                        keys = key[0];
-                        for (var i = 1; i < key.length; i++) {
-                            keys += ',' + key[i];
-                        }
-                    }
-                    return {
-                        apiKey: this._key['apiKey'].replace(key ? keyname : null, key),
-                        apiKeys: this._key['apiKeys'].replace(keyname, key[0]).replace('%KEYS%', keys),
-                        aggregate: protocol + hostname.concat('/') + key + '/autoconf/id/'
-                    };
-                }
-            },
-            Geocode: {
-                _key: url + '/geoportail/ols',
-                url: fkey
-            },
-            Route: {
-                _key: {
-                    ols: url + '/itineraire/ols',
-                    'route-json': url + '/itineraire/rest/route.json',
-                    'route-xml': url + '/itineraire/rest/route.xml'
-                },
-                url: function (key) {
-                    return {
-                        ols: this._key.ols.replace(key ? keyname : null, key),
-                        'route-json': this._key['route-json'].replace(key ? keyname : null, key),
-                        'route-xml': this._key['route-xml'].replace(key ? keyname : null, key)
-                    };
-                }
-            }
-        };
-        return DefaultUrlService;
-    }();
-    ServicesCommonService = function (Logger, Helper, _, Protocol, ErrorService, DefaultUrlService) {
-        function CommonService(options) {
-            if (!(this instanceof CommonService)) {
-                throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR'));
-            }
-            this.options = {
-                protocol: 'JSONP',
-                proxyURL: '',
-                callbackSuffix: null,
-                httpMethod: 'GET',
-                timeOut: 0,
-                rawResponse: false,
-                scope: this,
-                onSuccess: function (response) {
-                    console.log('onSuccess - la reponse est la suivante : ', response);
-                },
-                onFailure: function (error) {
-                    if (error.status === 200 || !error.status) {
-                        console.log('onFailure : ', error.message);
-                    } else {
-                        console.log('onFailure - Erreur (', error.status, ') : ', error.message);
-                    }
-                }
-            };
-            for (var opt in options) {
-                if (options.hasOwnProperty(opt)) {
-                    this.options[opt] = options[opt];
-                }
-            }
-            if (!this.options.apiKey && !this.options.serverUrl) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'apiKey', 'serverUrl'));
-            }
-            if (this.options.rawResponse && !this.options.onSuccess) {
-                this.options.onSuccess = function (response) {
-                    console.log('onSuccess - la réponse brute du service est la suivante : ', response);
-                };
-            }
-            var bOnSuccess = this.options.onSuccess !== null && typeof this.options.onSuccess === 'function' ? true : false;
-            if (!bOnSuccess) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'onSuccess()'));
-            }
-            if (!this.options.serverUrl) {
-                var urlByDefault = DefaultUrlService[this.CLASSNAME].url(this.options.apiKey);
-                if (typeof urlByDefault === 'string') {
-                    this.options.serverUrl = urlByDefault;
-                } else {
-                }
-            }
-            if (this.options.serverUrl) {
-                var urlsource = this.options.serverUrl;
-                var urlparts = urlsource.split('?');
-                this.options.serverUrl = urlparts[0];
-            }
-            this.options.httpMethod = typeof options.httpMethod === 'string' ? options.httpMethod.toUpperCase() : 'GET';
-            switch (this.options.httpMethod) {
-            case 'POST':
-            case 'GET':
-                break;
-            case 'PUT':
-            case 'DELETE':
-            case 'HEAD':
-            case 'OPTIONS':
-                throw new Error(_.getMessage('PARAM_NOT_SUPPORT', 'httpMethod'));
-            default:
-                throw new Error(_.getMessage('PARAM_UNKNOWN', 'httpMethod'));
-            }
-            this.options.protocol = typeof options.protocol === 'string' ? options.protocol.toUpperCase() : 'JSONP';
-            switch (this.options.protocol) {
-            case 'JSONP':
-            case 'XHR':
-                break;
-            default:
-                throw new Error(_.getMessage('PARAM_UNKNOWN', 'protocol'));
-            }
-            if (this.options.protocol === 'JSONP') {
-                this.options.httpMethod = 'GET';
-            }
-            this.options.nocache = options.nocache || false;
-            this.options.outputFormat = null;
-            this.request = null;
-            this.response = null;
-        }
-        CommonService.prototype = {
-            constructor: CommonService,
-            call: function () {
-                function run() {
-                    this.buildRequest.call(this, onError, onBuildRequest);
-                }
-                run.call(this);
-                function onBuildRequest(result) {
-                    this.callService.call(this, onError, onCallService);
-                }
-                function onCallService(result) {
-                    this.analyzeResponse.call(this, onError, onAnalyzeResponse);
-                }
-                function onAnalyzeResponse(result) {
-                    if (result) {
-                        this.options.onSuccess.call(this, result);
-                    } else {
-                        return onError.call(this, new ErrorService('Analyse de la reponse en échec !?'));
-                    }
-                }
-                function onError(error) {
-                    var e = error;
-                    if (!(e instanceof ErrorService)) {
-                        e = new ErrorService(error.message);
-                    }
-                    this.options.onFailure.call(this, e);
-                }
-            },
-            buildRequest: function (error, success) {
-            },
-            callService: function (error, success) {
-                var strUrlProxified = null;
-                var strData = this.request;
-                var bUrlProxified = this.options.proxyURL && this.options.protocol === 'XHR' ? true : false;
-                this.options.serverUrl = Helper.normalyzeUrl(this.options.serverUrl, { 'gp-access-lib': '1.0.0-beta3' }, false);
-                if (bUrlProxified) {
-                    if (this.options.httpMethod === 'GET') {
-                        strUrlProxified = this.options.proxyURL + Helper.normalyzeUrl(this.options.serverUrl, this.request, true);
-                        strData = null;
-                    }
-                    if (this.options.httpMethod === 'POST') {
-                        strUrlProxified = this.options.proxyURL + Helper.normalyzeUrl(this.options.serverUrl, null, true);
-                        strData = this.request;
-                    }
-                }
-                var self = this;
-                var options = {
-                    url: strUrlProxified || this.options.serverUrl,
-                    method: this.options.httpMethod,
-                    protocol: this.options.protocol,
-                    timeOut: this.options.timeOut || 0,
-                    format: this.options.outputFormat,
-                    nocache: this.options.nocache || false,
-                    wrap: this.options.protocol === 'XHR' ? false : true,
-                    callbackSuffix: this.options.callbackSuffix,
-                    data: strData,
-                    headers: null,
-                    content: this.options.contentType || 'application/xml',
-                    scope: this.options.scope || this,
-                    onResponse: function (response) {
-                        var content = null;
-                        if (self.options.protocol == 'XHR') {
-                            content = response;
-                        }
-                        if (self.options.protocol == 'JSONP') {
-                            if (response) {
-                                if (response.http) {
-                                    if (response.http.status !== 200) {
-                                        error.call(self, new ErrorService({
-                                            status: response.http.status,
-                                            message: response.http.error,
-                                            type: ErrorService.TYPE_SRVERR
-                                        }));
-                                        return;
-                                    } else {
-                                        content = response.xml;
-                                    }
-                                } else {
-                                    content = response;
-                                }
-                            } else {
-                                error.call(self, new ErrorService('Le contenu de la reponse est vide !?'));
-                                return;
-                            }
-                        }
-                        self.response = content;
-                        success.call(self, content);
-                    },
-                    onFailure: function (e) {
-                        e.type = ErrorService.TYPE_SRVERR;
-                        error.call(self, new ErrorService(e));
-                    },
-                    onTimeOut: function () {
-                        error.call(self, new ErrorService('TimeOut!'));
-                    }
-                };
-                Protocol.send(options);
-            },
-            analyzeResponse: function (error, success) {
-            }
-        };
-        return CommonService;
-    }(UtilsLoggerByDefault, UtilsHelper, UtilsMessagesResources, ProtocolsProtocol, ExceptionsErrorService, ServicesDefaultUrlService);
-    ServicesAltiRequestModelAltiRequest = function (Logger) {
-        function AltiRequest(options) {
-            if (!(this instanceof AltiRequest)) {
-                throw new TypeError('AltiRequest constructor cannot be called as a function.');
-            }
-            this.options = options || {};
-            this.positions = this.options.positions || [];
-            this.delimiter = this.options.delimiter || '|';
-            this.indent = this.options.indent || false;
-            this.crs = this.options.crs || 'CRS:84';
-            this.format = this.options.format || 'json';
-        }
-        AltiRequest.CLASSNAME = 'AltiRequest';
-        AltiRequest.prototype = {
-            constructor: AltiRequest,
-            setPositions: function (lstPosition) {
-                var positions = [];
-                for (var i = 0; i < lstPosition.length; i++) {
-                    var o = lstPosition[i];
-                    if (o.lon && o.lat) {
-                        positions.push(o);
-                    }
-                }
-                this.positions = positions;
-            },
-            getPositions: function (pos) {
-                if (!pos) {
-                    return this.positions;
-                }
-                var index = this.positions.length - 1;
-                if (pos > index || pos < index) {
-                    return this.positions;
-                }
-                return this.positions[pos];
-            },
-            addPositions: function (lstPosition) {
-                for (var i = 0; i < lstPosition.length; i++) {
-                    var o = lstPosition[i];
-                    if (o.lon && o.lat) {
-                        this.positions.push(lstPosition[i]);
-                    }
-                }
-            },
-            getLon: function () {
-                var lstLon = [];
-                for (var i = 0; i < this.positions.length; i++) {
-                    lstLon.push(this.positions[i].lon);
-                }
-                return lstLon.join(this.delimiter);
-            },
-            getLat: function () {
-                var lstLat = [];
-                for (var i = 0; i < this.positions.length; i++) {
-                    lstLat.push(this.positions[i].lat);
-                }
-                return lstLat.join(this.delimiter);
-            }
-        };
-        AltiRequest.prototype.getData = function () {
-            var map = [];
-            map.push({
-                k: 'lon',
-                v: this.getLon()
-            });
-            map.push({
-                k: 'lat',
-                v: this.getLat()
-            });
-            map.push({
-                k: 'delimiter',
-                v: this.delimiter
-            });
-            map.push({
-                k: 'indent',
-                v: this.indent
-            });
-            map.push({
-                k: 'crs',
-                v: this.crs
-            });
-            map.push({
-                k: 'format',
-                v: this.format
-            });
-            return map;
-        };
-        return AltiRequest;
-    }(UtilsLoggerByDefault);
-    ServicesAltiRequestModelAltiElevationRequest = function (Logger, AltiRequest) {
-        function AltiElevationRequest(options) {
-            if (!(this instanceof AltiElevationRequest)) {
-                throw new TypeError('AltiElevationRequest constructor cannot be called as a function.');
-            }
-            this.CLASSNAME = 'AltiElevationRequest';
-            AltiRequest.apply(this, arguments);
-            this.zonly = this.options.zonly || false;
-        }
-        AltiElevationRequest.prototype = Object.create(AltiRequest.prototype, {
-            zonly: {
-                get: function () {
-                    return this._zonly;
-                },
-                set: function (z) {
-                    this._zonly = z;
-                }
-            }
-        });
-        AltiElevationRequest.prototype.constructor = AltiElevationRequest;
-        AltiElevationRequest.prototype.getData = function () {
-            var map = [];
-            map.push({
-                k: 'lon',
-                v: this.getLon()
-            });
-            map.push({
-                k: 'lat',
-                v: this.getLat()
-            });
-            map.push({
-                k: 'indent',
-                v: this.indent
-            });
-            map.push({
-                k: 'crs',
-                v: this.crs
-            });
-            map.push({
-                k: 'zonly',
-                v: this.zonly
-            });
-            map.push({
-                k: 'format',
-                v: this.format
-            });
-            return map;
-        };
-        return AltiElevationRequest;
-    }(UtilsLoggerByDefault, ServicesAltiRequestModelAltiRequest);
-    ServicesAltiRequestModelAltiProfilRequest = function (Logger, AltiRequest) {
-        function AltiProfilRequest(options) {
-            if (!(this instanceof AltiProfilRequest)) {
-                throw new TypeError('AltiProfilRequest constructor cannot be called as a function.');
-            }
-            this.CLASSNAME = 'AltiProfilRequest';
-            AltiRequest.apply(this, arguments);
-            this.sampling = this.options.sampling || 3;
-        }
-        AltiProfilRequest.prototype = Object.create(AltiRequest.prototype, {
-            sampling: {
-                get: function () {
-                    return this._sampling;
-                },
-                set: function (value) {
-                    this._sampling = value;
-                }
-            }
-        });
-        AltiProfilRequest.prototype.constructor = AltiProfilRequest;
-        AltiProfilRequest.prototype.getData = function () {
-            var map = [];
-            map.push({
-                k: 'lon',
-                v: this.getLon()
-            });
-            map.push({
-                k: 'lat',
-                v: this.getLat()
-            });
-            map.push({
-                k: 'indent',
-                v: this.indent
-            });
-            map.push({
-                k: 'crs',
-                v: this.crs
-            });
-            map.push({
-                k: 'sampling',
-                v: this.sampling
-            });
-            map.push({
-                k: 'format',
-                v: this.format
-            });
-            return map;
-        };
-        return AltiProfilRequest;
-    }(UtilsLoggerByDefault, ServicesAltiRequestModelAltiRequest);
-    ServicesAltiRequestAltiRequestREST = function (Logger, _, AltiElevationRequest, AltiProfilRequest) {
-        function AltiRequestREST(options) {
-            if (!(this instanceof AltiRequestREST)) {
-                throw new TypeError('AltiRequestREST constructor cannot be called as a function.');
-            }
-            this.options = options || {};
-            if (!this.options) {
-                throw new Error(_.getMessage('PARAM_EMPTY', 'options'));
-            }
-            if (!this.options.type) {
-                throw new Error(_.getMessage('PARAM_EMPTY', 'type (Elevation or Profil)'));
-            }
-            this.DataObject = null;
-            switch (this.options.type) {
-            case 'Elevation':
-                this.DataObject = new AltiElevationRequest(this.options.param);
-                break;
-            case 'Profil':
-                this.DataObject = new AltiProfilRequest(this.options.param);
-                break;
-            default:
-                throw new Error(_.getMessage('PARAM_TYPE', 'type (Elevation or Profil)'));
-            }
-            this.method = this.options.method || 'GET';
-        }
-        AltiRequestREST.prototype = {
-            requestString: null,
-            constructor: AltiRequestREST,
-            template: {
-                get: {
-                    value: 'lon=__LON__&lat=__LAT__&indent=__INDENT__&crs=\'__CRS__\'',
-                    input: {
-                        point: '&zonly=__ZONLY__',
-                        profil: '&sampling=__SAMPLING__'
-                    }
-                },
-                post: {
-                    value: 'lon=__LON__\n' + 'lat=__LAT__\n' + 'indent=__INDENT__\n' + 'crs=\'__CRS__\'\n',
-                    input: {
-                        point: 'zonly=__ZONLY__',
-                        profil: 'sampling=__SAMPLING__'
-                    }
-                }
-            },
-            processRequestString: function () {
-                var template = '';
-                if (this.method == 'POST') {
-                    template = this.template.post.value;
-                } else if (this.method == 'GET') {
-                    template = this.template.get.value;
-                }
-                template = template.replace(/__LON__/g, this.DataObject.getLon());
-                template = template.replace(/__LAT__/g, this.DataObject.getLat());
-                template = template.replace(/__INDENT__/g, this.DataObject.indent);
-                template = template.replace(/__CRS__/g, this.DataObject.crs);
-                template = template + this.__addDataInputs();
-                this.requestString = template;
-                return this.requestString;
-            },
-            __addDataInputs: function () {
-                var myTemplate;
-                if (this.method == 'POST') {
-                    myTemplate = this.template.post;
-                } else if (this.method == 'GET') {
-                    myTemplate = this.template.get;
-                } else {
-                    throw new Error('No other HTTP method supported by the service !');
-                }
-                var tmpl = null;
-                if (this.DataObject.CLASSNAME == 'AltiElevationRequest') {
-                    tmpl = myTemplate.input.point;
-                    return tmpl.replace(/__ZONLY__/g, this.DataObject.zonly);
-                } else if (this.DataObject.CLASSNAME == 'AltiProfilRequest') {
-                    tmpl = myTemplate.input.profil;
-                    return tmpl.replace(/__SAMPLING__/g, this.DataObject.sampling);
-                } else {
-                    throw new Error('No other object supported than elevation or profil !?');
-                }
-            }
-        };
-        return AltiRequestREST;
-    }(UtilsLoggerByDefault, UtilsMessagesResources, ServicesAltiRequestModelAltiElevationRequest, ServicesAltiRequestModelAltiProfilRequest);
-    FormatsWPS = function (Logger) {
-        function WPS(options) {
-            if (!(this instanceof WPS)) {
-                throw new TypeError('WPS constructor cannot be called as a function.');
-            }
-            this.options = options || {};
-            this.DataObject = this.options.data;
-            if (!this.DataObject) {
-                throw new TypeError('This data object is not defined !');
-            }
-            this.paramservice = this.options.param.service || 'WPS';
-            this.paramversion = this.options.param.version || '1.0.0';
-            this.paramidentifier = this.options.param.identifier || 'gs:WPS';
-            this.paramrawdataoutput = this.options.param.rawdataoutput || 'result';
-            this.paramrequest = this.options.param.request || 'Execute';
-            this.method = this.options.method || 'GET';
-        }
-        WPS.prototype = {
-            requestString: null,
-            constructor: WPS,
-            template: {
-                get: {
-                    value: 'service=__SERVICE__' + '&version=__VERSION__' + '&rawdataoutput=__RAWDATAOUTPUT__' + '&identifier=__IDENTIFIER__' + '&request=__REQUEST__' + '&datainputs=<!-- __DATAINPUTS__ -->',
-                    input: '__KEY__=__DATA__'
-                },
-                post: {
-                    value: '<?xml version="1.0" encoding="UTF-8"?>' + '<wps:__REQUEST__ version="__VERSION__" service="__SERVICE__" ' + '__NAMESPACE__ __SCHEMALOCATION__>' + '<ows:Identifier>__IDENTIFIER__</ows:Identifier>' + '<wps:DataInputs>' + '<!-- __DATAINPUTS__ -->' + '</wps:DataInputs>' + '<wps:ResponseForm>' + '<wps:RawDataOutput>' + '<ows:Identifier>__RAWDATAOUTPUT__</ows:Identifier>' + '</wps:RawDataOutput>' + '</wps:ResponseForm>' + '</wps:__REQUEST__>',
-                    input: '<wps:Input>' + '<ows:Identifier>__KEY__</ows:Identifier>' + '<wps:Data>' + '<wps:LiteralData>__DATA__</wps:LiteralData>' + '</wps:Data>' + '</wps:Input>'
-                }
-            },
-            namespaceByDefault: function () {
-                var ns = [
-                    'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"',
-                    'xmlns="http://www.opengis.net/wps/1.0.0"',
-                    'xmlns:wfs="http://www.opengis.net/wfs"',
-                    'xmlns:wps="http://www.opengis.net/wps/1.0.0"',
-                    'xmlns:ows="http://www.opengis.net/ows/1.1"',
-                    'xmlns:gml="http://www.opengis.net/gml"',
-                    'xmlns:ogc="http://www.opengis.net/ogc"',
-                    'xmlns:wcs="http://www.opengis.net/wcs/1.1.1"',
-                    'xmlns:xlink="http://www.w3.org/1999/xlink"'
-                ];
-                return ns.join(' ');
-            },
-            schemaLocationByDefault: function () {
-                return 'xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd"';
-            },
-            processRequestString: function () {
-                var template = '';
-                if (this.method == 'POST') {
-                    template = this.template.post.value;
-                } else if (this.method == 'GET') {
-                    template = this.template.get.value;
-                } else {
-                    return false;
-                }
-                template = template.replace(/__SERVICE__/g, this.paramservice);
-                template = template.replace(/__VERSION__/g, this.paramversion);
-                template = template.replace(/__RAWDATAOUTPUT__/g, this.paramrawdataoutput);
-                template = template.replace(/__IDENTIFIER__/g, this.paramidentifier);
-                template = template.replace(/__REQUEST__/g, this.paramrequest);
-                if (this.method == 'POST') {
-                    template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault);
-                    template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault);
-                }
-                template = template.replace(/<!-- __DATAINPUTS__ -->/g, this.__addDataInputs());
-                if (!template) {
-                    return false;
-                }
-                this.requestString = template;
-                return true;
-            },
-            __addDataInputs: function () {
-                var tmpl = this.method == 'GET' ? this.template.get.input : this.template.post.input;
-                var sep = this.method == 'GET' ? ';' : '';
-                var result = '';
-                var that = this;
-                var map = this.DataObject.getData();
-                for (var i = 0; i < map.length; i++) {
-                    (function (j) {
-                        if (sep) {
-                            sep = j == map.length - 1 ? '' : ';';
-                        }
-                        result = result.concat(that.__addDataInput(tmpl, map[j].k, map[j].v), sep);
-                    }(i));
-                }
-                return result;
-            },
-            __addDataInput: function (tmpl, key, data) {
-                var tmp = tmpl;
-                tmp = tmp.replace(/__KEY__/g, key);
-                tmp = tmp.replace(/__DATA__/g, data);
-                return tmp;
-            },
-            setMethod: function (method) {
-                if (method == 'GET' || method == 'POST') {
-                    this.method = method;
-                } else {
-                }
-            },
-            getMethod: function () {
-                return this.method;
-            }
-        };
-        return WPS;
-    }(UtilsLoggerByDefault);
-    ServicesAltiRequestAltiRequestWPS = function (Logger, _, WPS, AltiElevationRequest, AltiProfilRequest) {
-        var AltiRequestWPS = {
-            build: function (options) {
-                if (!options) {
-                    throw new Error(_.getMessage('PARAM_EMPTY', 'options'));
-                }
-                if (!options.type) {
-                    throw new Error(_.getMessage('PARAM_EMPTY', 'type (Elevation or Profil)'));
-                }
-                var DataObject = null;
-                switch (options.type) {
-                case 'Elevation':
-                    options.wps.identifier = 'gs:WPSElevation';
-                    DataObject = new AltiElevationRequest(options.param);
-                    break;
-                case 'Profil':
-                    options.wps.identifier = 'gs:WPSLineElevation';
-                    DataObject = new AltiProfilRequest(options.param);
-                    break;
-                default:
-                    throw new Error(_.getMessage('PARAM_TYPE', 'type (Elevation or Profil)'));
-                }
-                var settings = {
-                    data: DataObject,
-                    method: options.method,
-                    param: options.wps
-                };
-                var rqstWPS = new WPS(settings);
-                if (!rqstWPS.processRequestString()) {
-                    throw new Error('Enable to process request !');
-                }
-                return rqstWPS.requestString;
-            }
-        };
-        return AltiRequestWPS;
-    }(UtilsLoggerByDefault, UtilsMessagesResources, FormatsWPS, ServicesAltiRequestModelAltiElevationRequest, ServicesAltiRequestModelAltiProfilRequest);
-    ServicesAltiRequestAltiRequestFactory = function (Logger, ErrorService, AltiRequestREST, AltiRequestWPS) {
-        var AltiRequestFactory = {
-            build: function (options) {
-                var request = null;
-                var settings = {
-                    type: options.sampling ? 'Profil' : 'Elevation',
-                    method: options.httpMethod,
-                    param: {
-                        positions: null,
-                        delimiter: null,
-                        indent: null,
-                        crs: null,
-                        format: null,
-                        sampling: null,
-                        zonly: null
-                    }
-                };
-                settings.param.positions = options.positions;
-                settings.param.format = options.outputFormat;
-                settings.param.sampling = options.sampling;
-                settings.param.zonly = options.zonly;
-                var bOnError = options.onError !== null && typeof options.onError === 'function' ? true : false;
-                var bOnSuccess = options.onSuccess !== null && typeof options.onSuccess === 'function' ? true : false;
-                var message = null;
-                switch (options.api) {
-                case 'REST':
-                    var myReq = new AltiRequestREST(settings);
-                    if (!myReq.processRequestString()) {
-                        message = 'Error in process request (rest) !';
-                        if (bOnError) {
-                            options.onError.call(options.scope, new ErrorService(message));
-                            return;
-                        }
-                        throw new Error(message);
-                    }
-                    request = myReq.requestString;
-                    break;
-                case 'WPS':
-                    settings.wps = {
-                        service: null,
-                        version: null,
-                        identifier: null,
-                        rawdataoutput: null,
-                        request: null
-                    };
-                    request = AltiRequestWPS.build(settings);
-                    if (!request) {
-                        message = 'Error in process request (wps) !';
-                        if (bOnError) {
-                            options.onError.call(options.scope, new ErrorService(message));
-                            return;
-                        }
-                        throw new Error(message);
-                    }
-                    break;
-                default:
-                    message = 'Type of API is not supported by service (REST or WPS) !';
-                    if (bOnError) {
-                        options.onError.call(options.scope, new ErrorService(message));
-                        return;
-                    }
-                    throw new Error(message);
-                }
-                if (bOnSuccess) {
-                    options.onSuccess.call(options.scope, request);
-                }
-                return request;
-            }
-        };
-        return AltiRequestFactory;
-    }(UtilsLoggerByDefault, ExceptionsErrorService, ServicesAltiRequestAltiRequestREST, ServicesAltiRequestAltiRequestWPS);
-    FormatsXML = function (Logger) {
-        function XML(options) {
-            if (!(this instanceof XML)) {
-                throw new TypeError('XML constructor cannot be called as a function.');
-            }
-            this.xmlString = null;
-            this.xmlDoc = null;
-            this.reader = null;
-            if (options) {
-                if (options.xmlString && typeof options.xmlString === 'string') {
-                    this.xmlString = options.xmlString;
-                    this.xmlDoc = __getXMLDOC(options.xmlString);
-                }
-                if (options.reader) {
-                    this.setReader(options.reader);
-                }
-            }
-        }
-        XML.prototype = {
-            constructor: XML,
-            getXMLString: function () {
-                return this.xmlString;
-            },
-            setXMLString: function (xmlString) {
-                if (xmlString && typeof xmlString === 'string') {
-                    this.xmlString = xmlString;
-                    this.xmlDoc = __getXMLDOC(xmlString);
-                }
-            },
-            getReader: function () {
-                return this.reader;
-            },
-            setReader: function (reader) {
-                if (reader && reader.read && typeof reader.read === 'function') {
-                    this.reader = reader;
-                }
-            },
-            getXMLDoc: function () {
-                return this.xmlDoc;
-            },
-            setXMLDoc: function (doc) {
-                this.xmlDoc = doc;
-            },
-            parse: function () {
-                if (!this.xmlDoc && this.xmlString) {
-                    this.xmlDoc = __getXMLDOC(this.xmlString);
-                }
-                if (this.xmlDoc) {
-                    var root = __getRootNode(this.xmlDoc);
-                    if (root) {
-                        var parserOutput;
-                        if (this.reader && this.reader.read) {
-                            parserOutput = this.reader.read(root);
-                        } else {
-                            parserOutput = {};
-                            parserOutput[root.nodeName] = __readDefault(root);
-                        }
-                        return parserOutput;
-                    } else {
-                        return {};
-                    }
-                }
-            }
-        };
-        function __getXMLDOC(xmlString) {
-            if (typeof exports === 'object') {
-                var DOMParser = xmldom.DOMParser;
-                return new DOMParser().parseFromString(xmlString, 'text/xml');
-            } else {
-                var parser;
-                var xmlDoc;
-                var errorMsg = 'Erreur lors du parsing de la réponse du service : XML non conforme';
-                if (window.ActiveXObject) {
-                    xmlDoc = new window.ActiveXObject('Microsoft.XMLDOM');
-                    xmlDoc.async = false;
-                    xmlDoc.loadXML(xmlString);
-                    var parseError = xmlDoc.parseError;
-                    if (parseError.errorCode) {
-                        if (parseError.line && parseError.linepos) {
-                            errorMsg += '( ligne ' + parseError.line + ', colonne ' + parseError.linepos;
-                        }
-                        if (parseError.reason) {
-                            errorMsg += ':  ' + parseError.reason + ')';
-                        }
-                        throw new Error(errorMsg);
-                    }
-                    return xmlDoc;
-                } else if (window.DOMParser) {
-                    parser = new window.DOMParser();
-                    try {
-                        xmlDoc = parser.parseFromString(xmlString, 'text/xml');
-                    } catch (e) {
-                        if (e.message === 'SyntaxError') {
-                            throw new Error(errorMsg);
-                        } else {
-                            throw new Error('Erreur lors du parsing de la réponse du service : ' + e.message);
-                        }
-                    }
-                    if (xmlDoc.getElementsByTagName('parsererror').length > 0) {
-                        var parsererror = xmlDoc.getElementsByTagName('parsererror');
-                        for (var i = 0; i < parsererror.length; i++) {
-                            var content = parsererror[i].innerHTML;
-                            if (content.indexOf('Huge input lookup') == -1) {
-                                errorMsg += '(' + content + ')';
-                                throw new Error(errorMsg);
-                            }
-                        }
-                    } else if (!xmlDoc.documentElement) {
-                        throw new Error(errorMsg);
-                    }
-                    return xmlDoc;
-                } else {
-                    throw new Error('Incompatible DOM Parser pour ce navigateur !');
-                }
-            }
-        }
-        function __getRootNode(xmlDoc) {
-            var root;
-            if (xmlDoc.nodeType === 9) {
-                root = xmlDoc.documentElement;
-            } else if (xmlDoc.nodeType === 1) {
-                root = xmlDoc;
-            }
-            return root;
-        }
-        function __readDefault(node) {
-            var data = {};
-            if (node.attributes.length > 0) {
-                var dataAttributes = __getAttributes(node);
-                data['attributes'] = dataAttributes;
-            }
-            if (node.hasChildNodes()) {
-                var childData = {};
-                var child;
-                var children = node.childNodes;
-                for (var i = 0; i < children.length; i++) {
-                    child = children[i];
-                    if (child.nodeType === 3) {
-                        data['textContent'] = child.nodeValue;
-                    } else if (child.nodeType === 1) {
-                        childData = __readDefault(child);
-                        if (!data[child.nodeName]) {
-                            data[child.nodeName] = childData;
-                        } else {
-                            if (!Array.isArray(data[child.nodeName])) {
-                                var old = data[child.nodeName];
-                                data[child.nodeName] = [];
-                                data[child.nodeName].push(old);
-                            }
-                            data[child.nodeName].push(childData);
-                        }
-                    }
-                }
-            }
-            return data;
-        }
-        function __getAttributes(node) {
-            if (node.attributes.length > 0) {
-                var nodeAttributes = {};
-                var attributes = node.attributes;
-                for (var i = 0; i < attributes.length; i++) {
-                    var attribute = attributes[i];
-                    nodeAttributes[attribute.nodeName] = attribute.nodeValue;
-                }
-                return nodeAttributes;
-            }
-        }
-        return XML;
-    }(UtilsLoggerByDefault);
-    ServicesAltiResponseModelAltiResponse = function () {
-        function AltiResponse() {
-            if (!(this instanceof AltiResponse)) {
-                throw new TypeError('AltiResponse constructor cannot be called as a function.');
-            }
-            this.elevations = [];
-        }
-        AltiResponse.prototype = { constructor: AltiResponse };
-        return AltiResponse;
-    }();
-    ServicesAltiResponseModelElevation = function () {
-        function Elevation() {
-            if (!(this instanceof Elevation)) {
-                throw new TypeError('Elevation constructor cannot be called as a function.');
-            }
-            this.z = null;
-        }
-        Elevation.prototype = { constructor: Elevation };
-        return Elevation;
-    }();
-    ServicesAltiFormatsAltiResponseReader = function (Logger, AltiResponse, Elevation) {
-        var AltiResponseReader = {};
-        AltiResponseReader.READERS = {
-            elevations: function (root) {
-                var altiResponse = new AltiResponse();
-                if (root.hasChildNodes()) {
-                    var children = root.childNodes;
-                    var child;
-                    var elevation;
-                    for (var i = 0; i < children.length; i++) {
-                        child = children[i];
-                        if (AltiResponseReader.READERS[child.nodeName]) {
-                            elevation = AltiResponseReader.READERS[child.nodeName](child);
-                            altiResponse.elevations.push(elevation);
-                        }
-                    }
-                }
-                return altiResponse;
-            },
-            elevation: function (node) {
-                var elevation = new Elevation();
-                if (node.hasChildNodes()) {
-                    var children = node.childNodes;
-                    var child;
-                    for (var i = 0; i < children.length; i++) {
-                        child = children[i];
-                        if (AltiResponseReader.READERS[child.nodeName]) {
-                            AltiResponseReader.READERS[child.nodeName](child, elevation);
-                        }
-                    }
-                }
-                return elevation;
-            },
-            lat: function (node, elevation) {
-                var textNode = node.firstChild;
-                if (textNode && textNode.nodeType === 3) {
-                    elevation.lat = parseFloat(textNode.nodeValue);
-                } else {
-                    throw new Error('Erreur dans la lecture de la réponse du service: latitude attendue mais absente');
-                }
-            },
-            lon: function (node, elevation) {
-                var textNode = node.firstChild;
-                if (textNode && textNode.nodeType === 3) {
-                    elevation.lon = parseFloat(textNode.nodeValue);
-                } else {
-                    throw new Error('Erreur dans la lecture de la réponse du service: longitude attendue mais absente');
-                }
-            },
-            z: function (node, elevation) {
-                var textNode = node.firstChild;
-                if (textNode && textNode.nodeType === 3) {
-                    if (elevation) {
-                        elevation.z = parseFloat(textNode.nodeValue);
-                    } else {
-                        elevation = new Elevation();
-                        elevation.z = parseFloat(textNode.nodeValue);
-                        return elevation;
-                    }
-                } else {
-                    throw new Error('Erreur dans la lecture de la réponse du service: altitude attendue mais absente');
-                }
-            },
-            acc: function (node, elevation) {
-                var textNode = node.firstChild;
-                if (textNode && textNode.nodeType === 3) {
-                    elevation.acc = parseFloat(textNode.nodeValue);
-                } else {
-                    throw new Error('Erreur dans la lecture de la réponse du service: précision (acc) attendue mais absente');
-                }
-            },
-            exceptionreport: function (node) {
-                var response = {};
-                if (node.hasChildNodes()) {
-                    var children = node.childNodes;
-                    var child;
-                    for (var i = 0; i < children.length; i++) {
-                        child = children[i];
-                        if (child.nodeName === 'Exception') {
-                            response.exceptionReport = AltiResponseReader.READERS.exception(child);
-                        }
-                    }
-                }
-                return response;
-            },
-            exception: function (node) {
-                var exceptionReport = {};
-                var exceptionCode = node.getAttribute('exceptionCode');
-                if (exceptionCode) {
-                    exceptionReport.exceptionCode = exceptionCode;
-                }
-                var textNode = node.firstChild;
-                if (textNode && textNode.nodeType === 3) {
-                    exceptionReport.exception = textNode.nodeValue;
-                }
-                return exceptionReport;
-            },
-            error: function (node) {
-                var response = { error: {} };
-                if (node.hasChildNodes()) {
-                    var children = node.childNodes;
-                    var child;
-                    for (var i = 0; i < children.length; i++) {
-                        child = children[i];
-                        var textNode;
-                        if (child.nodeType === 1 && child.nodeName === 'code') {
-                            textNode = child.firstChild;
-                            if (textNode && textNode.nodeType === 3) {
-                                response.error.code = textNode.nodeValue;
-                            }
-                        }
-                        if (child.nodeType === 1 && child.nodeName === 'description') {
-                            textNode = child.firstChild;
-                            if (textNode && textNode.nodeType === 3) {
-                                response.error.description = textNode.nodeValue;
-                            }
-                        }
-                    }
-                }
-                return response;
-            }
-        };
-        AltiResponseReader.read = function (root) {
-            if (root.nodeName === 'elevations') {
-                var altiResponse = AltiResponseReader.READERS.elevations(root);
-                return altiResponse;
-            } else if (root.nodeName === 'ExceptionReport') {
-                var exceptionReport = AltiResponseReader.READERS.exceptionreport(root);
-                return exceptionReport;
-            } else if (root.nodeName === 'error') {
-                var error = AltiResponseReader.READERS.error(root);
-                return error;
-            } else {
-                throw new Error('Erreur lors de la lecture de la réponse : elle n\'est pas au format attendu.');
-            }
-        };
-        return AltiResponseReader;
-    }(UtilsLoggerByDefault, ServicesAltiResponseModelAltiResponse, ServicesAltiResponseModelElevation);
-    ServicesAltiResponseAltiResponseFactory = function (Logger, ErrorService, MRes, XML, AltiResponseReader, AltiResponse, Elevation) {
-        var AltiResponseFactory = {
-            build: function (options) {
-                var data = null;
-                if (options.response) {
-                    if (options.rawResponse) {
-                        data = options.response;
-                    } else {
-                        switch (options.outputFormat) {
-                        case 'xml':
-                            try {
-                                var p = new XML({ reader: AltiResponseReader });
-                                if (typeof options.response === 'string') {
-                                    p.setXMLString(options.response);
-                                } else {
-                                    p.setXMLDoc(options.response);
-                                }
-                                data = p.parse();
-                                if (!data) {
-                                    throw new Error(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION_2'));
-                                }
-                            } catch (e) {
-                                var message = e.message;
-                                options.onError.call(options.scope, new ErrorService({
-                                    message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', message),
-                                    status: 200,
-                                    type: ErrorService.TYPE_SRVERR
-                                }));
-                                return;
-                            }
-                            break;
-                        case 'json':
-                            var JSONResponse;
-                            if (typeof options.response === 'string') {
-                                JSONResponse = window.JSON.parse(options.response);
-                            } else {
-                                JSONResponse = options.response;
-                            }
-                            if (JSONResponse.error) {
-                                options.onError.call(options.scope, new ErrorService({
-                                    message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', JSONResponse.error.description),
-                                    status: 200,
-                                    type: ErrorService.TYPE_SRVERR
-                                }));
-                                return;
-                            }
-                            if (JSONResponse) {
-                                var elevations = JSONResponse.elevations;
-                                var altiResponse = new AltiResponse();
-                                var elevation;
-                                if (Array.isArray(elevations) && elevations.length) {
-                                    for (var i = 0; i < elevations.length; i++) {
-                                        elevation = new Elevation();
-                                        if (typeof elevations[i] === 'object') {
-                                            if (elevations[i].lon) {
-                                                elevation.lon = elevations[i].lon;
-                                            }
-                                            if (elevations[i].lat) {
-                                                elevation.lat = elevations[i].lat;
-                                            }
-                                            if (elevations[i].z) {
-                                                elevation.z = elevations[i].z;
-                                            }
-                                            if (elevations[i].acc) {
-                                                elevation.acc = elevations[i].acc;
-                                            }
-                                        } else if (typeof elevations[i] === 'number') {
-                                            elevation.z = elevations[i];
-                                        }
-                                        if (Array.isArray(altiResponse.elevations)) {
-                                            altiResponse.elevations.push(elevation);
-                                        }
-                                    }
-                                }
-                                data = altiResponse;
-                            }
-                            if (!data) {
-                                options.onError.call(options.scope, new ErrorService({
-                                    message: MRes.getMessage('SERVICE_RESPONSE_ANALYSE_2'),
-                                    type: ErrorService.TYPE_UNKERR,
-                                    status: -1
-                                }));
-                                return;
-                            }
-                            break;
-                        default:
-                            options.onError.call(options.scope, new ErrorService({
-                                message: MRes.getMessage('SERVICE_RESPONSE_FORMAT_2'),
-                                type: ErrorService.TYPE_UNKERR,
-                                status: -1
-                            }));
-                            return;
-                        }
-                        if (data.exceptionReport) {
-                            options.onError.call(options.scope, new ErrorService({
-                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport),
-                                type: ErrorService.TYPE_SRVERR,
-                                status: 200
-                            }));
-                            return;
-                        } else if (data.error) {
-                            var errorMess = data.error.description;
-                            options.onError.call(options.scope, new ErrorService({
-                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', errorMess),
-                                type: ErrorService.TYPE_SRVERR,
-                                status: 200
-                            }));
-                            return;
-                        }
-                    }
-                } else {
-                    options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY')));
-                    return;
-                }
-                options.onSuccess.call(options.scope, data);
-                return;
-            }
-        };
-        return AltiResponseFactory;
-    }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, ServicesAltiFormatsAltiResponseReader, ServicesAltiResponseModelAltiResponse, ServicesAltiResponseModelElevation);
-    ServicesAltiAlti = function (Logger, _, ErrorService, CommonService, DefaultUrlService, AltiRequestFactory, AltiResponseFactory) {
-        function Alti(options) {
-            if (!(this instanceof Alti)) {
-                throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'Alti'));
-            }
-            this.CLASSNAME = 'Alti';
-            CommonService.apply(this, arguments);
-            if (!options.positions) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'positions'));
-            }
-            if (options.positions.length === 0) {
-                throw new Error(_.getMessage('PARAM_EMPTY', 'positions'));
-            }
-            this.options.positions = options.positions;
-            this.options.outputFormat = typeof options.outputFormat === 'string' ? options.outputFormat.toLowerCase() : 'xml';
-            this.options.sampling = options.sampling || null;
-            this.options.api = typeof options.api === 'string' ? options.api.toUpperCase() : 'REST';
-            if (this.options.api === 'REST') {
-                this.options.httpMethod = 'GET';
-            }
-            this.options.zonly = options.zonly || false;
-            if (!this.options.serverUrl) {
-                var lstUrlByDefault = DefaultUrlService.Alti.url(this.options.apiKey);
-                var urlFound = null;
-                switch (this.options.api) {
-                case 'WPS':
-                    urlFound = lstUrlByDefault.wps;
-                    break;
-                case 'REST':
-                    var key = (options.sampling ? 'profil' : 'elevation') + '-' + this.options.outputFormat;
-                    urlFound = lstUrlByDefault[key];
-                    break;
-                default:
-                    throw new Error(_.getMessage('PARAM_UNKNOWN', 'api'));
-                }
-                if (!urlFound) {
-                    throw new Error('Url by default not found !');
-                }
-                this.options.serverUrl = urlFound;
-            }
-            var idx = this.options.serverUrl.lastIndexOf('.');
-            if (idx !== -1) {
-                var extension = this.options.serverUrl.substring(idx + 1);
-                if (extension && extension.length < 5) {
-                    switch (extension.toLowerCase()) {
-                    case 'json':
-                    case 'xml':
-                        this.options.outputFormat = extension.toLowerCase();
-                        break;
-                    default:
-                        throw new Error('type of service : unknown or unsupported (json or xml) !');
-                    }
-                }
-            }
-        }
-        Alti.prototype = Object.create(CommonService.prototype, {});
-        Alti.prototype.constructor = Alti;
-        Alti.prototype.buildRequest = function (error, success) {
-            var options = {
-                httpMethod: this.options.httpMethod,
-                onSuccess: function (result) {
-                    this.request = result;
-                    success.call(this, this.request);
-                },
-                onError: error,
-                scope: this,
-                positions: this.options.positions,
-                outputFormat: this.options.outputFormat,
-                sampling: this.options.sampling,
-                api: this.options.api,
-                zonly: this.options.zonly
-            };
-            AltiRequestFactory.build(options);
-        };
-        Alti.prototype.analyzeResponse = function (error, success) {
-            if (this.response) {
-                var options = {
-                    response: this.response,
-                    outputFormat: this.options.outputFormat,
-                    rawResponse: this.options.rawResponse,
-                    onError: error,
-                    onSuccess: success,
-                    scope: this
-                };
-                AltiResponseFactory.build(options);
-            } else {
-                error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY')));
-            }
-        };
-        return Alti;
-    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesDefaultUrlService, ServicesAltiRequestAltiRequestFactory, ServicesAltiResponseAltiResponseFactory);
-    ServicesAutoConfResponseModelAutoConfResponse = function () {
-        function AutoConfResponse() {
-            if (!(this instanceof AutoConfResponse)) {
-                throw new TypeError('AutoConfResponse constructor cannot be called as a function.');
-            }
-            this.generalOptions = {
-                apiKeys: {},
-                title: null,
-                defaultGMLGFIStyle: null,
-                theme: null,
-                wgs84Resolutions: []
-            };
-            this.layers = {};
-            this.territories = {};
-            this.tileMatrixSets = {};
-            this.services = {};
-        }
-        AutoConfResponse.prototype = {
-            constructor: AutoConfResponse,
-            isConfLoaded: function (apiKey) {
-                if (!apiKey) {
-                    return;
-                }
-                if (this.generalOptions.apiKeys[apiKey]) {
-                    return true;
-                }
-                return false;
-            },
-            getLayersId: function (apiKey) {
-                return this.generalOptions.apiKeys[apiKey];
-            },
-            getLayersConf: function (apiKey) {
-                var layers = {};
-                var layersIdArray = this.getLayersId(apiKey);
-                if (layersIdArray) {
-                    for (var i = 0; i < layersIdArray.length; i++) {
-                        var lyrId = layersIdArray[i];
-                        layers[lyrId] = this.layers[lyrId];
-                    }
-                }
-                return layers;
-            },
-            getLayerConf: function (layerId) {
-                if (!this.layers) {
-                    return;
-                }
-                return this.layers[layerId];
-            },
-            getTileMatrixSets: function () {
-                return this.tileMatrixSets;
-            },
-            getTMSConf: function (tmsID) {
-                if (!this.tileMatrixSets) {
-                    return;
-                }
-                return this.tileMatrixSets[tmsID];
-            },
-            getTerritories: function () {
-                return this.territories;
-            },
-            getTerritoryConf: function (territoryID) {
-                if (!this.territories) {
-                    return;
-                }
-                return this.territories[territoryID];
-            },
-            getServices: function () {
-                return this.services;
-            },
-            getServiceConf: function (serviceID) {
-                if (!this.services) {
-                    return;
-                }
-                return this.services[serviceID];
-            }
-        };
-        return AutoConfResponse;
-    }();
-    ServicesAutoConfResponseModelConstraint = function () {
-        function Constraint() {
-            if (!(this instanceof Constraint)) {
-                throw new TypeError('Constraint constructor cannot be called as a function.');
-            }
-            this.crs = null;
-            this.bbox = {
-                left: null,
-                right: null,
-                top: null,
-                bottom: null
-            };
-            this.minScaleDenominator = null;
-            this.maxScaleDenominator = null;
-            this.temporalExtent = [
-                null,
-                null
-            ];
-        }
-        Constraint.prototype = { constructor: Constraint };
-        return Constraint;
-    }();
-    ServicesAutoConfResponseModelFormat = function () {
-        function Format() {
-            if (!(this instanceof Format)) {
-                throw new TypeError('Format constructor cannot be called as a function.');
-            }
-            this.current = null;
-            this.name = null;
-        }
-        Format.prototype = { constructor: Format };
-        return Format;
-    }();
-    ServicesAutoConfResponseModelLayer = function () {
-        function Layer() {
-            if (!(this instanceof Layer)) {
-                throw new TypeError('Layer constructor cannot be called as a function.');
-            }
-        }
-        Layer.prototype = {
-            constructor: Layer,
-            getName: function () {
-                return this.name;
-            },
-            getTitle: function () {
-                return this.title;
-            },
-            getDescription: function () {
-                return this.description;
-            },
-            getLayerId: function () {
-                return this.layerId;
-            },
-            getQuicklookUrl: function () {
-                return this.quicklookUrl;
-            },
-            getDefaultProjection: function () {
-                return this.defaultProjection;
-            },
-            getProjections: function () {
-                var projections = [];
-                projections.push(this.defaultProjection);
-                var proj = projections.concat(this.additionalProjections);
-                return proj;
-            },
-            getBBOX: function () {
-                if (!this.globalConstraint) {
-                    return;
-                }
-                return this.globalConstraint.bbox;
-            },
-            getMinScaleDenominator: function () {
-                if (!this.globalConstraint) {
-                    return;
-                }
-                return this.globalConstraint.minScaleDenominator;
-            },
-            getMaxScaleDenominator: function () {
-                if (!this.globalConstraint) {
-                    return;
-                }
-                return this.globalConstraint.maxScaleDenominator;
-            },
-            getTMSID: function () {
-                if (this.wmtsOptions) {
-                    return this.wmtsOptions.tileMatrixSetLink;
-                }
-                return;
-            },
-            getServiceParams: function () {
-                return this.serviceParams;
-            },
-            getServerUrl: function (apiKey) {
-                if (!apiKey || !this.serviceParams || !this.serviceParams.serverUrl) {
-                    return;
-                }
-                return this.serviceParams.serverUrl[apiKey];
-            },
-            getLegends: function () {
-                return this.legends;
-            },
-            getMetadata: function () {
-                return this.metadata;
-            },
-            getStyles: function () {
-                return this.styles;
-            },
-            getDefaultStyle: function () {
-                if (!this.styles) {
-                    return;
-                }
-                var style;
-                var s = this.styles;
-                for (var i = 0; i < s.length; i++) {
-                    if (s[i].current === true) {
-                        style = s[i].name;
-                        break;
-                    }
-                }
-                return style;
-            },
-            getThematics: function () {
-                return this.thematics;
-            },
-            getDefaultFormat: function () {
-                if (!this.formats) {
-                    return;
-                }
-                var format;
-                var f = this.formats;
-                for (var i = 0; i < f.length; i++) {
-                    if (f[i].current === true) {
-                        format = f[i].name;
-                        break;
-                    }
-                }
-                return format;
-            },
-            getConstraints: function () {
-                return this.constraints;
-            },
-            getOriginators: function () {
-                return this.originators;
-            },
-            getDimensions: function () {
-                return this.dimensions;
-            },
-            getAggregatedLayers: function () {
-                if (this.isAggregate) {
-                    return this.aggregatedLayers;
-                } else {
-                    return;
-                }
-            }
-        };
-        return Layer;
-    }();
-    ServicesAutoConfResponseModelLegend = function () {
-        function Legend() {
-            if (!(this instanceof Legend)) {
-                throw new TypeError('Legend constructor cannot be called as a function.');
-            }
-            this.format = null;
-            this.url = null;
-            this.minScaleDenominator = null;
-        }
-        Legend.prototype = { constructor: Legend };
-        return Legend;
-    }();
-    ServicesAutoConfResponseModelMetadata = function () {
-        function Metadata() {
-            if (!(this instanceof Metadata)) {
-                throw new TypeError('Metadata constructor cannot be called as a function.');
-            }
-            this.format = null;
-            this.url = null;
-        }
-        Metadata.prototype = { constructor: Metadata };
-        return Metadata;
-    }();
-    ServicesAutoConfResponseModelOriginator = function () {
-        function Originator() {
-            if (!(this instanceof Originator)) {
-                throw new TypeError('Originator constructor cannot be called as a function.');
-            }
-            this.name = null;
-            this.attribution = null;
-            this.logo = null;
-            this.url = null;
-            this.constraints = [];
-        }
-        Originator.prototype = { constructor: Originator };
-        return Originator;
-    }();
-    ServicesAutoConfResponseModelService = function () {
-        function Service() {
-            if (!(this instanceof Service)) {
-                throw new TypeError('Service constructor cannot be called as a function.');
-            }
-            this.title = null;
-            this.serverUrl = null;
-            this.version = null;
-        }
-        Service.prototype = { constructor: Service };
-        return Service;
-    }();
-    ServicesAutoConfResponseModelStyle = function () {
-        function Style() {
-            if (!(this instanceof Style)) {
-                throw new TypeError('Style constructor cannot be called as a function.');
-            }
-            this.name = null;
-            this.title = null;
-            this.current = null;
-        }
-        Style.prototype = { constructor: Style };
-        return Style;
-    }();
-    ServicesAutoConfResponseModelTerritory = function () {
-        function Territory() {
-            if (!(this instanceof Territory)) {
-                throw new TypeError('Territory constructor cannot be called as a function.');
-            }
-            this.isDefault = null;
-            this.defaultCRS = null;
-            this.additionalCRS = [];
-            this.geoBBOX = {
-                left: null,
-                right: null,
-                top: null,
-                bottom: null
-            };
-            this.geoCenter = {
-                lon: null,
-                lat: null
-            };
-            this.defaultOptions = {
-                resolution: null,
-                minScaleDenominator: null,
-                maxScaleDenominator: null
-            };
-            this.defaultLayers = [];
-        }
-        Territory.prototype = { constructor: Territory };
-        return Territory;
-    }();
-    ServicesAutoConfResponseModelThematic = function () {
-        function Thematic() {
-            if (!(this instanceof Thematic)) {
-                throw new TypeError('Thematic constructor cannot be called as a function.');
-            }
-            this.inspire = null;
-            this.name = null;
-        }
-        Thematic.prototype = { constructor: Thematic };
-        return Thematic;
-    }();
-    ServicesAutoConfResponseModelTileMatrixSet = function () {
-        function TileMatrixSet() {
-            if (!(this instanceof TileMatrixSet)) {
-                throw new TypeError('TileMatrixSet constructor cannot be called as a function.');
-            }
-            this.projection = null;
-            this.nativeResolutions = [];
-            this.matrixIds = [];
-            this.tileMatrices = {};
-        }
-        TileMatrixSet.prototype = {
-            constructor: TileMatrixSet,
-            getResolutions: function () {
-                return this.nativeResolutions;
-            },
-            getMatrixIds: function () {
-                return this.matrixIds;
-            },
-            getProjection: function () {
-                return this.projection;
-            },
-            getTileMatrices: function () {
-                return this.tileMatrices;
-            },
-            getTopLeftCorner: function () {
-                var topLeftCorner;
-                var matrices = this.getTileMatrices();
-                if (matrices) {
-                    for (var id in matrices) {
-                        if (matrices.hasOwnProperty(id)) {
-                            topLeftCorner = matrices[id].topLeftCorner;
-                            break;
-                        }
-                    }
-                }
-                return topLeftCorner;
-            }
-        };
-        return TileMatrixSet;
-    }();
-    ServicesAutoConfResponseModelTileMatrix = function () {
-        function TileMatrix() {
-            if (!(this instanceof TileMatrix)) {
-                throw new TypeError('TileMatrix constructor cannot be called as a function.');
-            }
-            this.matrixId = null;
-            this.matrixHeight = null;
-            this.matrixWidth = null;
-            this.scaleDenominator = null;
-            this.tileHeight = null;
-            this.tileWidth = null;
-            this.topLeftCorner = null;
-        }
-        TileMatrix.prototype = {
-            constructor: TileMatrix,
-            getTopLeftCorner: function () {
-                return this.topLeftCorner;
-            },
-            getScaleDenominator: function () {
-                return this.scaleDenominator;
-            },
-            getTileHeight: function () {
-                return this.tileHeight;
-            },
-            getTileWidth: function () {
-                return this.tileWidth;
-            },
-            getMatrixHeight: function () {
-                return this.matrixHeight;
-            },
-            getMatrixWidth: function () {
-                return this.matrixWidth;
-            }
-        };
-        return TileMatrix;
-    }();
-    ServicesAutoConfResponseModelTileMatrixLimit = function () {
-        function TileMatrixLimit() {
-            if (!(this instanceof TileMatrixLimit)) {
-                throw new TypeError('TileMatrixLimit constructor cannot be called as a function.');
-            }
-            this.minTileRow = null;
-            this.maxTileRow = null;
-            this.minTileCol = null;
-            this.maxTileCol = null;
-        }
-        TileMatrixLimit.prototype = { constructor: TileMatrixLimit };
-        return TileMatrixLimit;
-    }();
-    ServicesAutoConfFormatsAutoConfResponseReader = function (Logger, AutoConfResponse, Constraint, Format, Layer, Legend, Metadata, Originator, Service, Style, Territory, Thematic, TileMatrixSet, TileMatrix, TileMatrixLimit) {
-        var AutoConfResponseReader = {};
-        AutoConfResponseReader.VERSION = '1.1.0';
-        AutoConfResponseReader.NAMESPACES = {
-            xmlns: 'http://www.opengis.net/context',
-            gpp: 'http://api.ign.fr/geoportail',
-            ows: 'http://www.opengis.net/ows/1.1',
-            sld: 'http://www.opengis.net/sld',
-            wmts: 'http://www.opengis.net/wmts/1.0',
-            xlink: 'http://www.w3.org/1999/xlink',
-            xsi: 'http://www.w3.org/2001/XMLSchema-instance'
-        };
-        AutoConfResponseReader.SCHEMALOCATION = [
-            'http://www.opengis.net/context http://gpp3-wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://wxs.ign.fr/schemas/autoconf/autoconf.xsd',
-            'http://www.opengis.net/context http://gpp3-wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://gpp3-wxs.ign.fr/schemas/autoconf.xsd'
-        ];
-        AutoConfResponseReader.DEFAULTPREFIX = 'context';
-        AutoConfResponseReader.READERS = {
-            context: {
-                ViewContext: function (viewContextNode) {
-                    __checkServiceAttributes(viewContextNode);
-                    var config = new AutoConfResponse();
-                    __getChildNodes(viewContextNode, config);
-                    return config;
-                },
-                Title: function (titleNode, data) {
-                    if (data && data.generalOptions) {
-                        data.generalOptions.title = __getChildValue(titleNode);
-                    } else if (data && data.lyr) {
-                        data.lyr.title = __getChildValue(titleNode);
-                    }
-                },
-                Abstract: function (node, data) {
-                    if (data && data.lyr) {
-                        data.lyr.description = __getChildValue(node);
-                    }
-                },
-                Server: function (node, data) {
-                    var serverId = node.getAttribute('service');
-                    var title = node.getAttribute('title');
-                    var version = node.getAttribute('version');
-                    if (serverId) {
-                        if (data && data.services && typeof data.services === 'object' && !data.services[serverId]) {
-                            var s = new Service();
-                            s.title = title;
-                            s.version = version;
-                            __getChildNodes(node, s);
-                            data.services[serverId] = s;
-                        } else if (data && data.lyr) {
-                            if (!data.lyr.serviceParams) {
-                                data.lyr.serviceParams = {};
-                            }
-                            data.lyr.serviceParams.id = serverId;
-                            data.lyr.serviceParams.version = version;
-                        }
-                    }
-                },
-                OnlineResource: function (node, service) {
-                    if (service && service.hasOwnProperty('serverUrl')) {
-                        service.serverUrl = node.getAttribute('xlink:href');
-                    }
-                },
-                LayerList: function (layerListNode, config) {
-                    __getChildNodes(layerListNode, config);
-                    if (config && config.layers && config.generalOptions && config.services) {
-                        for (var lyr in config.layers) {
-                            if (config.layers.hasOwnProperty(lyr)) {
-                                var layerConfig = config.layers[lyr];
-                                var apiKeys = layerConfig.apiKeys;
-                                if (apiKeys && Array.isArray(apiKeys)) {
-                                    for (var i = 0; i < apiKeys.length; i++) {
-                                        var key = apiKeys[i];
-                                        if (config.generalOptions.apiKeys) {
-                                            if (!config.generalOptions.apiKeys[key] || !Array.isArray(config.generalOptions.apiKeys[key])) {
-                                                config.generalOptions.apiKeys[key] = [];
-                                            }
-                                            config.generalOptions.apiKeys[key].push(lyr);
-                                        }
-                                    }
-                                }
-                                var serviceParams = layerConfig.serviceParams;
-                                if (serviceParams && serviceParams.id) {
-                                    if (!config.services[serviceParams.id]) {
-                                        var s = new Service();
-                                        if (serviceParams.serverUrl) {
-                                            s.serverUrl = serviceParams.serverUrl;
-                                        }
-                                        if (serviceParams.version) {
-                                            s.version = serviceParams.version;
-                                        }
-                                        config.services[serviceParams.id] = s;
-                                    }
-                                }
-                                if (layerConfig.wmtsOptions && layerConfig.wmtsOptions.tileMatrixSetLink && config.tileMatrixSets) {
-                                    var tmsLink = layerConfig.wmtsOptions.tileMatrixSetLink;
-                                    var tileMatrixSets = config.tileMatrixSets;
-                                    for (var tms in tileMatrixSets) {
-                                        if (tileMatrixSets.hasOwnProperty(tms) && tms === tmsLink) {
-                                            layerConfig.defaultProjection = tileMatrixSets[tms].projection;
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                },
-                Layer: function (layerNode, config) {
-                    if (config && config.layers) {
-                        var lyrData = {
-                            lyr: new Layer(),
-                            lyrId: null
-                        };
-                        var hidden = layerNode.getAttribute('hidden');
-                        if (hidden === '1') {
-                            lyrData.lyr.hidden = true;
-                        } else {
-                            lyrData.lyr.hidden = false;
-                        }
-                        var queryable = layerNode.getAttribute('queryable');
-                        if (queryable === '1') {
-                            lyrData.lyr.queryable = true;
-                        } else {
-                            lyrData.lyr.queryable = false;
-                        }
-                        __getChildNodes(layerNode, lyrData);
-                        if (lyrData.lyrId) {
-                            if (lyrData.lyr.serviceParams && lyrData.lyr.serviceParams.id) {
-                                var serviceid = lyrData.lyr.serviceParams.id;
-                                if (serviceid.toUpperCase().indexOf('OPENLS') !== -1 || serviceid.toUpperCase().indexOf('ELEVATION') !== -1) {
-                                    var resourceId = lyrData.lyrId.split('$')[0];
-                                    lyrData.lyrId = resourceId + '$' + serviceid;
-                                }
-                            }
-                            lyrData.lyr.layerId = lyrData.lyrId;
-                            config.layers[lyrData.lyrId] = lyrData.lyr;
-                        }
-                    }
-                },
-                Name: function (node, lyrData) {
-                    if (lyrData && lyrData.lyr) {
-                        lyrData.lyr.name = __getChildValue(node);
-                    }
-                },
-                SRS: function (node, lyrData) {
-                    if (lyrData && lyrData.lyr) {
-                        lyrData.lyr.defaultProjection = __getChildValue(node);
-                    }
-                },
-                Format: function (node, lyrData) {
-                    if (lyrData && lyrData.lyr) {
-                        var f = new Format();
-                        var current = node.getAttribute('current');
-                        if (current === '1') {
-                            f.current = true;
-                        } else {
-                            f.current = false;
-                        }
-                        f.name = __getChildValue(node);
-                        if (!lyrData.lyr.formats || !Array.isArray(lyrData.lyr.formats)) {
-                            lyrData.lyr.formats = [];
-                        }
-                        lyrData.lyr.formats.push(f);
-                    }
-                },
-                Style: function (node, lyrData) {
-                    if (lyrData && lyrData.lyr) {
-                        var s = new Style();
-                        var current = node.getAttribute('current');
-                        if (current === '1' || current === 1) {
-                            s.current = true;
-                        } else {
-                            s.current = false;
-                        }
-                        if (node.hasChildNodes) {
-                            var children = node.childNodes;
-                            var child;
-                            var childName;
-                            for (var i = 0; i < children.length; i++) {
-                                child = children[i];
-                                if (child.nodeType === 1) {
-                                    childName = child.localName || child.baseName || child.nodeName;
-                                    if (childName === 'Name') {
-                                        s.name = __getChildValue(child);
-                                    } else if (childName === 'Title') {
-                                        s.title = __getChildValue(child);
-                                    }
-                                }
-                            }
-                        }
-                        if (!lyrData.lyr.styles || !Array.isArray(lyrData.lyr.styles)) {
-                            lyrData.lyr.styles = [];
-                        }
-                        lyrData.lyr.styles.push(s);
-                    }
-                },
-                Dimension: function (node, lyrData) {
-                    var name = node.getAttribute('name');
-                    var dim = __getChildValue(node);
-                    if (lyrData && lyrData.lyr) {
-                        if (!lyrData.lyr.dimensions) {
-                            lyrData.lyr.dimensions = {};
-                        }
-                        if (name === 'Type') {
-                            lyrData.lyr.dimensions.type = dim;
-                        } else if (name === 'VisibilityRange') {
-                            lyrData.lyr.dimensions.visibilityRange = dim;
-                        } else if (name === 'VisibilityMode ') {
-                            lyrData.lyr.dimensions.visibilityMode = dim;
-                        } else if (name === 'GeometricType') {
-                            lyrData.lyr.dimensions.geometricType = dim;
-                        } else if (name === 'NoDataValue') {
-                            lyrData.lyr.dimensions.noDataValue = dim;
-                        }
-                    }
-                }
-            },
-            gpp: {
-                Theme: function (themeNode, config) {
-                    if (config && config.generalOptions && config.generalOptions.hasOwnProperty('theme')) {
-                        config.generalOptions.theme = __getChildValue(themeNode);
-                    }
-                },
-                defaultGMLGFIStyleUrl: function (node, config) {
-                    if (config && config.generalOptions && config.generalOptions.hasOwnProperty('defaultGMLGFIStyle')) {
-                        config.generalOptions.defaultGMLGFIStyle = __getChildValue(node);
-                    }
-                },
-                Territory: function (territoryNode, config) {
-                    var tid = territoryNode.getAttribute('id');
-                    if (tid) {
-                        var t = new Territory();
-                        var isDefault = territoryNode.getAttribute('default');
-                        if (isDefault === '1') {
-                            t.isDefault = true;
-                        } else {
-                            t.isDefault = false;
-                        }
-                        __getChildNodes(territoryNode, t);
-                        if (config && config.territories && typeof config.territories === 'object') {
-                            config.territories[tid] = t;
-                        }
-                    }
-                },
-                defaultCRS: function (node, territory) {
-                    if (territory && territory.hasOwnProperty('defaultCRS')) {
-                        territory.defaultCRS = __getChildValue(node);
-                    }
-                },
-                AdditionalCRS: function (node, data) {
-                    var addCRS = __getChildValue(node);
-                    if (addCRS && data) {
-                        if (Array.isArray(data.additionalCRS)) {
-                            data.additionalCRS.push(addCRS);
-                        } else {
-                            if (!data.additionalProjections || !Array.isArray(data.additionalProjections)) {
-                                data.additionalProjections = [];
-                            }
-                            data.additionalProjections.push(addCRS);
-                        }
-                    }
-                },
-                DefaultLayer: function (node, territory) {
-                    var lyr = node.getAttribute('layerId');
-                    if (lyr && territory && Array.isArray(territory.defaultLayers)) {
-                        territory.defaultLayers.push(lyr);
-                    }
-                },
-                BoundingBox: function (node, data) {
-                    if (data) {
-                        var values = __getChildValue(node).split(',');
-                        if (values.length === 4) {
-                            var bbox = {
-                                left: parseFloat(values[0]),
-                                right: parseFloat(values[2]),
-                                top: parseFloat(values[3]),
-                                bottom: parseFloat(values[1])
-                            };
-                            var minT = node.getAttribute('minT');
-                            var maxT = node.getAttribute('maxT');
-                            if (data.hasOwnProperty('geoBBOX')) {
-                                data.geoBBOX = bbox;
-                            } else if (data.hasOwnProperty('bbox')) {
-                                if (data.bbox.left || data.bbox.right || data.bbox.top || data.bbox.bottom) {
-                                    if (!data.multiConstraints) {
-                                        data.multiConstraints = [];
-                                    }
-                                    var newConstraint = new Constraint();
-                                    newConstraint.bbox = bbox;
-                                    newConstraint.temporalExtent = [
-                                        minT,
-                                        maxT
-                                    ];
-                                    data.multiConstraints.push(newConstraint);
-                                } else {
-                                    data.bbox = bbox;
-                                    data.temporalExtent = [
-                                        minT,
-                                        maxT
-                                    ];
-                                }
-                            } else {
-                                if (!data.globalConstraint) {
-                                    data.globalConstraint = new Constraint();
-                                }
-                                data.globalConstraint.bbox = bbox;
-                                data.globalConstraint.temporalExtent = [
-                                    minT,
-                                    maxT
-                                ];
-                            }
-                        }
-                    }
-                },
-                Resolution: function (node, territory) {
-                    var res = __getChildValue(node);
-                    if (res && territory && territory.defaultOptions && territory.defaultOptions.hasOwnProperty('resolution')) {
-                        territory.defaultOptions.resolution = parseFloat(res);
-                    }
-                },
-                x: function (node, territory) {
-                    var lon = __getChildValue(node);
-                    if (lon && territory && territory.geoCenter && territory.geoCenter.hasOwnProperty('lon')) {
-                        territory.geoCenter.lon = parseFloat(lon);
-                    }
-                },
-                y: function (node, territory) {
-                    var lat = __getChildValue(node);
-                    if (lat && territory && territory.geoCenter && territory.geoCenter.hasOwnProperty('lat')) {
-                        territory.geoCenter.lat = parseFloat(lat);
-                    }
-                },
-                Resolutions: function (resNode, config) {
-                    if (config && config.generalOptions && config.generalOptions.hasOwnProperty('wgs84Resolutions')) {
-                        config.generalOptions.wgs84Resolutions = __getChildValue(resNode).split(',');
-                    }
-                },
-                Layer: function (node, lyrData) {
-                    if (lyrData && lyrData.hasOwnProperty('lyrId') && lyrData.lyr) {
-                        lyrData.lyrId = node.getAttribute('id');
-                        var aggregate = node.getAttribute('aggregate');
-                        var more = node.getAttribute('more');
-                        if (aggregate || more) {
-                            lyrData.lyr.isAggregate = true;
-                        }
-                        __getChildNodes(node, lyrData.lyr);
-                    }
-                },
-                Constraint: function (node, data) {
-                    var c = new Constraint();
-                    __getChildNodes(node, c);
-                    if (data) {
-                        if (!data.constraints || !Array.isArray(data.constraints)) {
-                            data.constraints = [];
-                        }
-                        if (c.multiConstraints && Array.isArray(c.multiConstraints)) {
-                            var constraint = new Constraint();
-                            constraint.crs = c.crs;
-                            constraint.bbox = c.bbox;
-                            constraint.minScaleDenominator = c.minScaleDenominator;
-                            constraint.maxScaleDenominator = c.maxScaleDenominator;
-                            constraint.temporalExtent = c.temporalExtent;
-                            data.constraints.push(constraint);
-                            for (var i = 0; i < c.multiConstraints.length; i++) {
-                                constraint = new Constraint();
-                                constraint.crs = c.crs;
-                                constraint.minScaleDenominator = c.minScaleDenominator;
-                                constraint.maxScaleDenominator = c.maxScaleDenominator;
-                                constraint.bbox = c.multiConstraints[i].bbox;
-                                constraint.temporalExtent = c.multiConstraints[i].temporalExtent;
-                                data.constraints.push(constraint);
-                            }
-                        } else {
-                            data.constraints.push(c);
-                        }
-                    }
-                },
-                CRS: function (node, data) {
-                    if (data && data.hasOwnProperty('crs')) {
-                        data.crs = __getChildValue(node);
-                    }
-                },
-                Thematic: function (node, lyr) {
-                    if (lyr) {
-                        var t = new Thematic();
-                        t.inspire = false;
-                        t.name = __getChildValue(node);
-                        if (!lyr.thematics || !Array.isArray(lyr.thematics)) {
-                            lyr.thematics = [];
-                        }
-                        lyr.thematics.push(t);
-                    }
-                },
-                InspireThematic: function (node, lyr) {
-                    if (lyr) {
-                        var t = new Thematic();
-                        t.inspire = true;
-                        t.name = __getChildValue(node);
-                        if (!lyr.thematics || !Array.isArray(lyr.thematics)) {
-                            lyr.thematics = [];
-                        }
-                        lyr.thematics.push(t);
-                    }
-                },
-                Originator: function (node, lyr) {
-                    if (lyr) {
-                        var o = new Originator();
-                        o.name = node.getAttribute('name');
-                        __getChildNodes(node, o);
-                        if (!lyr.originators || !Array.isArray(lyr.originators)) {
-                            lyr.originators = [];
-                        }
-                        lyr.originators.push(o);
-                    }
-                },
-                Attribution: function (node, originator) {
-                    if (originator && originator.hasOwnProperty('attribution')) {
-                        originator.attribution = __getChildValue(node);
-                    }
-                },
-                Logo: function (node, originator) {
-                    if (originator && originator.hasOwnProperty('logo')) {
-                        originator.logo = __getChildValue(node);
-                    }
-                },
-                URL: function (node, originator) {
-                    if (originator && originator.hasOwnProperty('url')) {
-                        originator.url = __getChildValue(node);
-                    }
-                },
-                Legend: function (node, lyr) {
-                    var l = new Legend();
-                    __getChildNodes(node, l);
-                    if (lyr) {
-                        if (!lyr.legends || !Array.isArray(lyr.legends)) {
-                            lyr.legends = [];
-                        }
-                        lyr.legends.push(l);
-                    }
-                },
-                LegendURL: function (node, legend) {
-                    if (legend && legend.hasOwnProperty('format')) {
-                        legend.format = node.getAttribute('format');
-                        if (node.hasChildNodes) {
-                            var child = node.childNodes[0];
-                            var childName = child.localName || child.baseName || child.nodeName;
-                            if (childName === 'OnlineResource' && legend.hasOwnProperty('url')) {
-                                legend.url = child.getAttribute('xlink:href');
-                            }
-                        }
-                    }
-                },
-                QuickLook: function (node, lyr) {
-                    if (node.hasChildNodes) {
-                        var child = node.childNodes[0];
-                        var childName = child.localName || child.baseName || child.nodeName;
-                        if (childName === 'OnlineResource' && lyr) {
-                            lyr.quicklookUrl = child.getAttribute('xlink:href');
-                        }
-                    }
-                },
-                MetadataURL: function (node, lyr) {
-                    if (lyr) {
-                        var m = new Metadata();
-                        m.format = node.getAttribute('format');
-                        if (node.hasChildNodes) {
-                            var child = node.childNodes[0];
-                            var childName = child.localName || child.baseName || child.nodeName;
-                            if (childName === 'OnlineResource') {
-                                m.url = child.getAttribute('xlink:href');
-                            }
-                        }
-                        if (!lyr.metadata && !Array.isArray(lyr.metadata)) {
-                            lyr.metadata = [];
-                        }
-                        lyr.metadata.push(m);
-                    }
-                },
-                Key: function (node, lyr) {
-                    if (lyr) {
-                        var key = node.getAttribute('id');
-                        if (!lyr.apiKeys || !Array.isArray(lyr.apiKeys)) {
-                            lyr.apiKeys = [];
-                        }
-                        lyr.apiKeys.push(key);
-                        var serverUrl = __getChildValue(node);
-                        if (!lyr.serviceParams) {
-                            lyr.serviceParams = {};
-                        }
-                        if (!lyr.serviceParams.serverUrl) {
-                            lyr.serviceParams.serverUrl = {};
-                        }
-                        if (!lyr.serviceParams.serverUrl[key]) {
-                            lyr.serviceParams.serverUrl[key] = serverUrl;
-                        }
-                    }
-                }
-            },
-            ows: {
-                Identifier: function (node, data) {
-                    if (data && data.hasOwnProperty('TMS')) {
-                        data.identifier = __getChildValue(node);
-                    } else if (data && data.hasOwnProperty('matrixId')) {
-                        data.matrixId = __getChildValue(node);
-                    }
-                },
-                SupportedCRS: function (node, tmsData) {
-                    if (tmsData && tmsData.TMS && tmsData.TMS.hasOwnProperty('projection')) {
-                        tmsData.TMS.projection = __getChildValue(node);
-                    }
-                }
-            },
-            sld: {
-                MinScaleDenominator: function (node, data) {
-                    var minScale = __getChildValue(node);
-                    if (minScale && data) {
-                        if (data.hasOwnProperty('defaultOptions')) {
-                            data.defaultOptions.minScaleDenominator = parseFloat(minScale);
-                        } else if (data.lyr) {
-                            if (!data.lyr.globalConstraint) {
-                                data.lyr.globalConstraint = new Constraint();
-                            }
-                            data.lyr.globalConstraint.minScaleDenominator = parseFloat(minScale);
-                        } else if (data.hasOwnProperty('minScaleDenominator')) {
-                            data.minScaleDenominator = parseFloat(minScale);
-                        }
-                    }
-                },
-                MaxScaleDenominator: function (node, data) {
-                    var maxScale = __getChildValue(node);
-                    if (maxScale && data) {
-                        if (data.hasOwnProperty('defaultOptions')) {
-                            data.defaultOptions.maxScaleDenominator = parseFloat(maxScale);
-                        } else if (data.lyr) {
-                            if (!data.lyr.globalConstraint) {
-                                data.lyr.globalConstraint = new Constraint();
-                            }
-                            data.lyr.globalConstraint.maxScaleDenominator = parseFloat(maxScale);
-                        } else if (data.hasOwnProperty('maxScaleDenominator')) {
-                            data.maxScaleDenominator = parseFloat(maxScale);
-                        }
-                    }
-                }
-            },
-            wmts: {
-                TileMatrixSetLimits: function (node, lyr) {
-                    if (lyr) {
-                        var limits = {};
-                        __getChildNodes(node, limits);
-                        if (!lyr.wmtsOptions) {
-                            lyr.wmtsOptions = {};
-                        }
-                        lyr.wmtsOptions.tileMatrixSetLimits = limits;
-                    }
-                },
-                TileMatrixLimits: function (node, limits) {
-                    var limit = new TileMatrixLimit();
-                    var limitId;
-                    if (node.hasChildNodes) {
-                        var children = node.childNodes;
-                        for (var i = 0; i < children.length; i++) {
-                            var child = children[i];
-                            var childName = child.localName || child.baseName || child.nodeName;
-                            if (childName === 'TileMatrix') {
-                                limitId = __getChildValue(child);
-                            } else if (childName === 'MinTileRow') {
-                                limit.minTileRow = __getChildValue(child);
-                            } else if (childName === 'MaxTileRow') {
-                                limit.maxTileRow = __getChildValue(child);
-                            } else if (childName === 'MinTileCol') {
-                                limit.minTileCol = __getChildValue(child);
-                            } else if (childName === 'MaxTileCol') {
-                                limit.maxTileCol = __getChildValue(child);
-                            }
-                        }
-                        if (limitId && limits && !limits[limitId]) {
-                            limits[limitId] = limit;
-                        }
-                    }
-                },
-                TileMatrixSet: function (node, data) {
-                    if (data && data.tileMatrixSets) {
-                        var tmsData = {};
-                        tmsData.TMS = new TileMatrixSet();
-                        tmsData.resolutions = [];
-                        __getChildNodes(node, tmsData);
-                        var tileMatrices = tmsData.TMS.tileMatrices;
-                        for (var tm in tileMatrices) {
-                            if (tileMatrices.hasOwnProperty(tm)) {
-                                tmsData.TMS.matrixIds.push(tm);
-                            }
-                        }
-                        if (tmsData.TMS.getProjection() === 'IGNF:WGS84G' || tmsData.TMS.getProjection() === 'EPSG:4326') {
-                            if (data.generalOptions && Array.isArray(data.generalOptions.wgs84Resolutions)) {
-                                var wgs84Resolutions = data.generalOptions.wgs84Resolutions;
-                                for (var i = 0; i < wgs84Resolutions.length; i++) {
-                                    tmsData.resolutions[i] = parseFloat(wgs84Resolutions[i]);
-                                }
-                            }
-                        }
-                        if (Array.isArray(tmsData.resolutions) && tmsData.resolutions.sort !== undefined) {
-                            tmsData.resolutions.sort(function (x, y) {
-                                return y - x;
-                            });
-                        }
-                        tmsData.TMS.nativeResolutions = tmsData.resolutions;
-                        data.tileMatrixSets[tmsData.identifier] = tmsData.TMS;
-                    } else {
-                        if (data && !data.wmtsOptions) {
-                            data.wmtsOptions = {};
-                        }
-                        data.wmtsOptions.tileMatrixSetLink = __getChildValue(node);
-                    }
-                },
-                TileMatrix: function (node, tmsData) {
-                    if (tmsData) {
-                        var tileMatrix = new TileMatrix();
-                        __getChildNodes(node, tileMatrix);
-                        if (tmsData.TMS && tmsData.TMS.getProjection()) {
-                            var proj = tmsData.TMS.getProjection();
-                            if (proj === 'EPSG:3857' || proj === 'EPSG:2154') {
-                                var r = tileMatrix.scaleDenominator * 0.00028;
-                                if (tmsData.resolutions && Array.isArray(tmsData.resolutions)) {
-                                    tmsData.resolutions.push(r);
-                                }
-                            }
-                        }
-                        if (tmsData.TMS && tmsData.TMS.tileMatrices) {
-                            tmsData.TMS.tileMatrices[tileMatrix.matrixId] = tileMatrix;
-                        }
-                    }
-                },
-                ScaleDenominator: function (node, tileMatrix) {
-                    var scale = __getChildValue(node);
-                    if (scale && tileMatrix && tileMatrix.hasOwnProperty('scaleDenominator')) {
-                        tileMatrix.scaleDenominator = parseFloat(scale);
-                    }
-                },
-                TopLeftCorner: function (node, tileMatrix) {
-                    var values = __getChildValue(node).split(' ');
-                    if (values && tileMatrix) {
-                        tileMatrix.topLeftCorner = {};
-                        tileMatrix.topLeftCorner.x = parseFloat(values[0]);
-                        tileMatrix.topLeftCorner.y = parseFloat(values[1]);
-                    }
-                },
-                TileWidth: function (node, tileMatrix) {
-                    var value = __getChildValue(node);
-                    if (value && tileMatrix && tileMatrix.hasOwnProperty('tileWidth')) {
-                        tileMatrix.tileWidth = parseInt(value, 10);
-                    }
-                },
-                TileHeight: function (node, tileMatrix) {
-                    var value = __getChildValue(node);
-                    if (value && tileMatrix && tileMatrix.hasOwnProperty('tileHeight')) {
-                        tileMatrix.tileHeight = parseInt(value, 10);
-                    }
-                },
-                MatrixWidth: function (node, tileMatrix) {
-                    var value = __getChildValue(node);
-                    if (value && tileMatrix && tileMatrix.hasOwnProperty('matrixWidth')) {
-                        tileMatrix.matrixWidth = parseInt(value, 10);
-                    }
-                },
-                MatrixHeight: function (node, tileMatrix) {
-                    var value = __getChildValue(node);
-                    if (value && tileMatrix && tileMatrix.hasOwnProperty('matrixHeight')) {
-                        tileMatrix.matrixHeight = parseInt(value, 10);
-                    }
-                }
-            },
-            serviceException: function (node) {
-                var response = {};
-                if (node.hasChildNodes()) {
-                    var children = node.childNodes;
-                    var child;
-                    for (var i = 0; i < children.length; i++) {
-                        child = children[i];
-                        if (child.nodeName === 'exception') {
-                            response.exceptionReport = AutoConfResponseReader.READERS['exception'](child);
-                        }
-                    }
-                }
-                return response;
-            },
-            exception: function (node) {
-                var exceptionReport = {};
-                var exceptionCode = node.getAttribute('code');
-                if (exceptionCode) {
-                    exceptionReport.exceptionCode = exceptionCode;
-                }
-                var textNode = node.firstChild;
-                if (textNode && textNode.nodeType === 3) {
-                    exceptionReport.exception = textNode.nodeValue;
-                }
-                return exceptionReport;
-            }
-        };
-        AutoConfResponseReader.read = function (root) {
-            if (root.nodeName === 'ViewContext') {
-                var nsPrefix = root.prefix || AutoConfResponseReader.DEFAULTPREFIX;
-                var config = AutoConfResponseReader.READERS[nsPrefix][root.nodeName](root);
-                return config;
-            } else if (root.nodeName === 'serviceException') {
-                var exceptionReport = AutoConfResponseReader.READERS[root.nodeName](root);
-                return exceptionReport;
-            } else {
-                throw new Error('Erreur lors de la lecture de la réponse : elle n\'est pas au format attendu.');
-            }
-        };
-        function __getAttributes(node) {
-            if (node.attributes.length > 0) {
-                var nodeAttributes = {};
-                var attributes = node.attributes;
-                for (var i = 0; i < attributes.length; i++) {
-                    var attribute = attributes[i];
-                    nodeAttributes[attribute.nodeName] = attribute.nodeValue;
-                }
-                return nodeAttributes;
-            }
-        }
-        function __getChildNodes(node, data) {
-            if (node.hasChildNodes()) {
-                var children = node.childNodes;
-                var child;
-                var childName;
-                var childPrefix;
-                for (var i = 0; i < children.length; i++) {
-                    child = children[i];
-                    if (child.nodeType === 1) {
-                        childName = child.localName || child.baseName || child.nodeName;
-                        childPrefix = child.prefix || AutoConfResponseReader.DEFAULTPREFIX;
-                        if (AutoConfResponseReader.READERS[childPrefix][childName]) {
-                            var reader = AutoConfResponseReader.READERS[childPrefix][childName];
-                            reader(child, data);
-                        } else {
-                            __getChildNodes(child, data);
-                        }
-                    }
-                }
-            }
-        }
-        function __getChildValue(node) {
-            var textNode;
-            var value = '';
-            if (node.hasChildNodes()) {
-                textNode = node.firstChild;
-                if (textNode.nodeType === 3 || textNode.nodeType === 4) {
-                    value = textNode.nodeValue;
-                }
-            }
-            return value;
-        }
-        function __checkServiceAttributes(viewContextNode) {
-            if (viewContextNode.attributes.length > 0) {
-                var xlsAttributes = __getAttributes(viewContextNode);
-                for (var att in xlsAttributes) {
-                    if (xlsAttributes.hasOwnProperty(att)) {
-                        if (att === 'version') {
-                            if (xlsAttributes['version'] !== AutoConfResponseReader.VERSION) {
-                                console.log('[AutoConfResponseReader] autoconf version is not the expected one : there may be errors in parsing');
-                                return;
-                            }
-                        }
-                        if (att === 'xmlns') {
-                            if (xlsAttributes[att] !== AutoConfResponseReader.NAMESPACES.xmlns) {
-                                console.log('[AutoConfResponseReader] autoconf response default namespace is not the expected one');
-                                return;
-                            }
-                            continue;
-                        }
-                        var prefix = att.split(':')[0];
-                        var ns = att.split(':')[1];
-                        if (prefix === 'xmlns' && ns) {
-                            if (AutoConfResponseReader.NAMESPACES[ns]) {
-                                if (AutoConfResponseReader.NAMESPACES[ns] !== xlsAttributes[att]) {
-                                    console.log('[AutoConfResponseReader] autoconf response ' + att + ' namespace is not the expected one');
-                                    return;
-                                }
-                            }
-                        }
-                        if (ns === 'schemaLocation') {
-                            if (xlsAttributes[att] !== AutoConfResponseReader.SCHEMALOCATION[0] && xlsAttributes[att] !== AutoConfResponseReader.SCHEMALOCATION[1]) {
-                                console.log('[AutoConfResponseReader] autoconf response schema location is not the expected one');
-                                return;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return AutoConfResponseReader;
-    }(UtilsLoggerByDefault, ServicesAutoConfResponseModelAutoConfResponse, ServicesAutoConfResponseModelConstraint, ServicesAutoConfResponseModelFormat, ServicesAutoConfResponseModelLayer, ServicesAutoConfResponseModelLegend, ServicesAutoConfResponseModelMetadata, ServicesAutoConfResponseModelOriginator, ServicesAutoConfResponseModelService, ServicesAutoConfResponseModelStyle, ServicesAutoConfResponseModelTerritory, ServicesAutoConfResponseModelThematic, ServicesAutoConfResponseModelTileMatrixSet, ServicesAutoConfResponseModelTileMatrix, ServicesAutoConfResponseModelTileMatrixLimit);
-    ServicesAutoConfResponseAutoConfResponseFactory = function (Logger, ErrorService, MRes, XML, AutoConfResponseReader) {
-        var AutoConfReponseFactory = {
-            build: function (options) {
-                var data = null;
-                if (options.response) {
-                    if (options.rawResponse) {
-                        data = options.response;
-                    } else {
-                        try {
-                            var p = new XML({ reader: AutoConfResponseReader });
-                            if (typeof options.response === 'string') {
-                                p.setXMLString(options.response);
-                            } else {
-                                p.setXMLDoc(options.response);
-                            }
-                            data = p.parse();
-                        } catch (e) {
-                            var message = e.message;
-                            if (typeof options.response === 'string') {
-                                message += '\n(raw response service\'' + options.response + '\')';
-                            } else {
-                                message += '\n(raw response service\'' + options.response.documentElement.innerHTML + '\')';
-                            }
-                            options.onError.call(options.scope, new ErrorService({
-                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', message),
-                                status: 200,
-                                type: ErrorService.TYPE_SRVERR
-                            }));
-                            return;
-                        }
-                        var isEmpty = true;
-                        for (var key in data) {
-                            if (data.hasOwnProperty(key)) {
-                                isEmpty = false;
-                            }
-                        }
-                        if (isEmpty) {
-                            options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY_2')));
-                            return;
-                        }
-                        if (data.exceptionReport) {
-                            options.onError.call(options.scope, new ErrorService({
-                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport),
-                                type: ErrorService.TYPE_SRVERR,
-                                status: 200
-                            }));
-                            return;
-                        }
-                    }
-                } else {
-                    options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY')));
-                    return;
-                }
-                var scope = typeof window !== 'undefined' ? window : {};
-                if (!scope.Gp) {
-                    scope.Gp = {};
-                }
-                if (!scope.Gp.Config) {
-                    scope.Gp.Config = data;
-                } else {
-                    this.mergeConfig(scope.Gp.Config, data, options.layerId);
-                }
-                options.onSuccess.call(options.scope, scope.Gp.Config);
-                return;
-            },
-            mergeConfig: function (GpConfig, data, layerId) {
-                if (data && GpConfig) {
-                    for (var prop in data) {
-                        if (data.hasOwnProperty(prop)) {
-                            if (prop == 'generalOptions') {
-                                for (var key in data[prop].apiKeys) {
-                                    if (data[prop].apiKeys.hasOwnProperty(key) && !GpConfig.generalOptions.apiKeys[key]) {
-                                        GpConfig.generalOptions.apiKeys[key] = data[prop].apiKeys[key];
-                                    }
-                                }
-                            } else {
-                                if (GpConfig[prop]) {
-                                    for (var obj in data[prop]) {
-                                        if (data[prop].hasOwnProperty(obj) && !GpConfig[prop][obj]) {
-                                            GpConfig[prop][obj] = data[prop][obj];
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                    if (layerId) {
-                        var aggregatedLayers = [];
-                        for (var lyr in data.layers) {
-                            if (data.layers.hasOwnProperty(lyr)) {
-                                aggregatedLayers.push(lyr);
-                            }
-                        }
-                        if (GpConfig.layers[layerId]) {
-                            GpConfig.layers[layerId].aggregatedLayers = aggregatedLayers;
-                        }
-                    }
-                }
-            }
-        };
-        return AutoConfReponseFactory;
-    }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, ServicesAutoConfFormatsAutoConfResponseReader);
-    ServicesAutoConfAutoConf = function (Logger, _, ErrorService, Helper, DefaultUrlService, CommonService, AutoConfResponseFactory) {
-        function AutoConf(options) {
-            if (!(this instanceof AutoConf)) {
-                throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'AutoConf'));
-            }
-            this.CLASSNAME = 'AutoConf';
-            CommonService.apply(this, arguments);
-            if (!this.options.serverUrl) {
-                if (!this.options.serverUrl) {
-                    var lstUrlByDefault = DefaultUrlService.AutoConf.url(this.options.apiKey);
-                    if (!this.options.layerId) {
-                        if (Array.isArray(this.options.apiKey) && this.options.apiKey.length > 0) {
-                            this.options.serverUrl = lstUrlByDefault.apiKeys;
-                        } else {
-                            this.options.serverUrl = lstUrlByDefault.apiKey;
-                        }
-                    } else {
-                        this.options.serverUrl = lstUrlByDefault.aggregate + this.options.layerId;
-                    }
-                }
-            }
-            if (this.options.protocol === 'XHR' && this.options.httpMethod === 'POST') {
-                this.options.httpMethod = 'GET';
-            }
-            this.options.outputFormat = 'xml';
-        }
-        AutoConf.prototype = Object.create(CommonService.prototype, {});
-        AutoConf.prototype.constructor = AutoConf;
-        AutoConf.prototype.buildRequest = function (error, success) {
-            var scope = typeof window !== 'undefined' ? window : {};
-            if (scope.Gp && scope.Gp.Config && scope.Gp.Config.generalOptions && scope.Gp.Config.layers) {
-                if (scope.Gp.Config.generalOptions.apiKeys[this.options.apiKey]) {
-                    if (this.options.layerId) {
-                        if (scope.Gp.Config.layers[this.options.layerId] && scope.Gp.Config.layers[this.options.layerId].aggregatedLayers) {
-                            this.options.onSuccess.call(this, scope.Gp.Config);
-                            return;
-                        }
-                    } else {
-                        this.options.onSuccess.call(this, scope.Gp.Config);
-                        return;
-                    }
-                }
-            }
-            this.request = '';
-            var bLocal;
-            if (this.options.serverUrl.indexOf('http://') === -1) {
-                bLocal = true;
-            } else {
-                bLocal = false;
-            }
-            if (!bLocal && this.layerId) {
-                this.request = Helper.normalyzeParameters({ layerId: this.layerId });
-            }
-            success.call(this, this.request);
-        };
-        AutoConf.prototype.analyzeResponse = function (error, success) {
-            if (this.response) {
-                var options = {
-                    layerId: this.options.layerId,
-                    response: this.response,
-                    rawResponse: this.options.rawResponse,
-                    onSuccess: success,
-                    onError: error,
-                    scope: this
-                };
-                AutoConfResponseFactory.build(options);
-            } else {
-                error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY')));
-            }
-        };
-        return AutoConf;
-    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, UtilsHelper, ServicesDefaultUrlService, ServicesCommonService, ServicesAutoConfResponseAutoConfResponseFactory);
-    FormatsXLSRequestHeader = function (Logger) {
-        function RequestHeader(options) {
-            if (!(this instanceof RequestHeader)) {
-                throw new TypeError('RequestHeader constructor cannot be called as a function.');
-            }
-            this.options = options || { srsName: 'EPSG:4326' };
-            for (var opt in options) {
-                if (options.hasOwnProperty(opt)) {
-                    this.options[opt] = options[opt];
-                }
-            }
-        }
-        RequestHeader.prototype = {
-            requestString: null,
-            template: '<RequestHeader srsName="__SRSNAME__"/>',
-            constructor: RequestHeader,
-            toString: function () {
-                var template = null;
-                template = this.template;
-                template = template.replace(/__SRSNAME__/g, this.options.srsName);
-                this.requestString = template;
-                return this.requestString;
-            }
-        };
-        return RequestHeader;
-    }(UtilsLoggerByDefault);
-    FormatsXLSRequest = function (Logger) {
-        function Request(options) {
-            if (!(this instanceof Request)) {
-                throw new TypeError('Request constructor cannot be called as a function.');
-            }
-            this.options = options || {
-                maximumResponses: 25,
-                methodName: null,
-                version: '1.2'
-            };
-            for (var opt in options) {
-                if (options.hasOwnProperty(opt)) {
-                    this.options[opt] = options[opt];
-                }
-            }
-        }
-        Request.prototype = {
-            requestString: null,
-            template: '<Request maximumResponses="__MAXRESPONSES__" methodName="__METHODNAME__" requestID="__UUID__" version="__VERSION__">' + '<!-- __REQUESTSERVICE__ -->' + '</Request>',
-            constructor: Request,
-            guid: function () {
-                return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
-                    var r = Math.random() * 16 | 0;
-                    var v = c === 'x' ? r : r & 3 | 8;
-                    return v.toString(16);
-                });
-            },
-            toString: function () {
-                var template = null;
-                template = this.template;
-                template = template.replace(/__MAXRESPONSES__/g, this.options.maximumResponses);
-                template = template.replace(/__METHODNAME__/g, this.options.methodName);
-                template = template.replace(/__UUID__/g, this.guid());
-                template = template.replace(/__VERSION__/g, this.options.version);
-                this.requestString = template;
-                return this.requestString;
-            }
-        };
-        return Request;
-    }(UtilsLoggerByDefault);
-    FormatsXLSAbstractService = function (Logger) {
-        function AbstractService(options) {
-            if (!(this instanceof AbstractService)) {
-                throw new TypeError('AbstractService constructor cannot be called as a function.');
-            }
-            this.options = options || {};
-            for (var opt in options) {
-                if (options.hasOwnProperty(opt)) {
-                    this.options[opt] = options[opt];
-                }
-            }
-        }
-        AbstractService.prototype = {
-            strRequest: null,
-            oRequest: null,
-            oFilter: null,
-            constructor: AbstractService,
-            addRequest: function (oRequest) {
-            },
-            addFilter: function (oFilter) {
-            },
-            toString: function () {
-            }
-        };
-        return AbstractService;
-    }(UtilsLoggerByDefault);
-    FormatsXLS = function (Logger, RequestHeader, Request, AbstractService) {
-        function XLS(options) {
-            if (!(this instanceof XLS)) {
-                throw new TypeError('XLS constructor cannot be called as a function.');
-            }
-            this.options = {
-                srsName: 'EPSG:4326',
-                maximumResponses: 25
-            };
-            for (var opt in options) {
-                if (options.hasOwnProperty(opt)) {
-                    if (options[opt]) {
-                        this.options[opt] = options[opt];
-                    }
-                }
-            }
-        }
-        XLS.VERSION = '1.2';
-        XLS.prototype = {
-            requestString: null,
-            namespace: false,
-            oService: null,
-            constructor: XLS,
-            template: '<?xml version="1.0" encoding="UTF-8"?>\n' + '<XLS version="__VERSION__"\n' + '__NAMESPACE__ \n' + '__SCHEMALOCATION__>\n' + '__REQUESTHEADER__\n' + '__REQUEST__\n' + '</XLS>\n',
-            namespaceByDefault: function () {
-                var ns = [
-                    'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"',
-                    'xmlns:xls="http://www.opengis.net/xls"',
-                    'xmlns:gml="http://www.opengis.net/gml"'
-                ];
-                return ns.join(' ');
-            },
-            schemaLocationByDefault: function () {
-                return 'xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.2/olsAll.xsd"';
-            },
-            setService: function (oService) {
-                if (!oService) {
-                    return;
-                }
-                if (oService instanceof AbstractService) {
-                    this.oService = oService;
-                } else {
-                }
-            },
-            getService: function () {
-                return this.oService;
-            }
-        };
-        XLS.prototype.addNamespace = function (ns, request) {
-            var keyNS = ns.key;
-            var bFound = false;
-            var allNS = this.namespaceByDefault().split(' ');
-            for (var index = 0; index < allNS.length; index++) {
-                var element = allNS[index];
-                var map = element.split('=');
-                var key = map[0];
-                if (key === 'xmlns:' + keyNS) {
-                    bFound = true;
-                    break;
-                }
-            }
-            if (!bFound) {
-                return request;
-            }
-            var regex;
-            var subst;
-            regex = /<(\w+[\s>])/g;
-            subst = '<' + keyNS + ':$1';
-            request = request.replace(regex, subst);
-            regex = /<\/(\w+[\s>])/g;
-            subst = '</' + keyNS + ':$1';
-            request = request.replace(regex, subst);
-            return request;
-        };
-        XLS.prototype.build = function () {
-            var bService = this.getService() ? true : false;
-            var template = '';
-            template = this.template;
-            template = template.replace(/__VERSION__/g, XLS.VERSION);
-            template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault);
-            template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault);
-            var oHeader = new RequestHeader({ srsName: this.options.srsName });
-            template = template.replace(/__REQUESTHEADER__/g, oHeader.toString());
-            var oRequest = new Request({
-                maximumResponses: this.options.maximumResponses,
-                version: XLS.VERSION,
-                methodName: bService ? this.getService().CLASSTYPE : null
-            });
-            template = template.replace(/__REQUEST__/g, oRequest.toString());
-            if (bService) {
-                template = template.replace(/<!-- __REQUESTSERVICE__ -->/g, this.getService().toString());
-            }
-            if (!template) {
-                return;
-            }
-            if (this.namespace) {
-                template = this.addNamespace({
-                    key: 'xls',
-                    url: 'http://www.opengis.net/xls'
-                }, template);
-            }
-            this.requestString = template;
-            return this.requestString;
-        };
-        return XLS;
-    }(UtilsLoggerByDefault, FormatsXLSRequestHeader, FormatsXLSRequest, FormatsXLSAbstractService);
-    FormatsXLSLocationUtilityServiceModelAddress = function (Gp, Logger) {
-        function Address(options) {
-            if (!(this instanceof Address)) {
-                throw new TypeError('Address constructor cannot be called as a function.');
-            }
-            this.options = options || {
-                location: {},
-                type: ['StreetAddress'],
-                filter: {}
-            };
-            if (!options.location) {
-                throw new Error('l\'option \'location\' n\'est pas renseignée !');
-            }
-            for (var opt in options) {
-                if (options.hasOwnProperty(opt)) {
-                    this.options[opt] = options[opt];
-                }
-            }
-        }
-        Address.prototype = {
-            constructor: Address,
-            requestString: null,
-            template: {
-                address: '<Address countryCode="__COUNTRYCODE__">' + '__LOCATION__' + '__PLACE__' + '__POSTALCODE__' + '__ENVELOPE__' + '</Address>',
-                location: {
-                    freeFormAddress: '<freeFormAddress>__FREEFORMADDRESSVALUE__</freeFormAddress>',
-                    streetAddress: {
-                        container: '<StreetAddress>' + '__STREET__' + '__BUILDING__' + '</StreetAddress>',
-                        building: '<Building number="__BUILDINGVALUE__"/>',
-                        street: '<Street>__STREETVALUE__</Street>'
-                    }
-                },
-                place: '<Place type="__PLACETYPE__">__PLACEVALUE__</Place>',
-                postalCode: '<PostalCode>__POSTALCODEVALUE__</PostalCode>',
-                envelope: '<gml:Envelope>' + '<gml:lowerCorner>__LEFT__ __BOTTOM__</gml:lowerCorner>' + '<gml:upperCorner>__RIGHT__ __TOP__</gml:upperCorner>' + '</gml:Envelope>'
-            }
-        };
-        Address.prototype.toString = function () {
-            var template = null;
-            template = this.template.address;
-            template = template.replace(/__COUNTRYCODE__/g, this.options.type);
-            if (typeof this.options.location === 'string') {
-                var tmplFreeFormAddress = this.template.location.freeFormAddress;
-                tmplFreeFormAddress = tmplFreeFormAddress.replace(/__FREEFORMADDRESSVALUE__/g, this.options.location);
-                template = template.replace(/__LOCATION__/g, tmplFreeFormAddress);
-            } else {
-                var tmplBuilding = '';
-                var tmplStreet = '';
-                if (this.options.location.number) {
-                    tmplBuilding = this.template.location.streetAddress.building;
-                    tmplBuilding = tmplBuilding.replace(/__BUILDINGVALUE__/g, this.options.location.number);
-                }
-                if (this.options.location.street) {
-                    tmplStreet = this.template.location.streetAddress.street;
-                    tmplStreet = tmplStreet.replace(/__STREETVALUE__/g, this.options.location.street);
-                }
-                var tmplStreetAddress = this.template.location.streetAddress.container;
-                tmplStreetAddress = tmplStreetAddress.replace(/__STREET__/g, tmplStreet);
-                tmplStreetAddress = tmplStreetAddress.replace(/__BUILDING__/g, tmplBuilding);
-                template = template.replace(/__LOCATION__/g, tmplStreetAddress);
-            }
-            var tmplPostalCode = '';
-            if (this.options.location.postalCode) {
-                tmplPostalCode = this.template.postalCode;
-                tmplPostalCode = tmplPostalCode.replace(/__POSTALCODEVALUE__/g, this.options.location.postalCode);
-            }
-            var tmplEnvelope = '';
-            if (this.options.filter) {
-                var bbox = this.options.filter.bbox;
-                if (bbox) {
-                    tmplEnvelope = this.template.envelope;
-                    tmplEnvelope = tmplEnvelope.replace(/__LEFT__/g, bbox.left);
-                    tmplEnvelope = tmplEnvelope.replace(/__BOTTOM__/g, bbox.bottom);
-                    tmplEnvelope = tmplEnvelope.replace(/__RIGHT__/g, bbox.right);
-                    tmplEnvelope = tmplEnvelope.replace(/__TOP__/g, bbox.top);
-                }
-            }
-            var Places = [];
-            var tmplPlace = '';
-            if (this.options.filter) {
-                var filters = this.options.filter;
-                for (var filter in filters) {
-                    if (filter === 'bbox') {
-                        continue;
-                    }
-                    tmplPlace = this.template.place;
-                    tmplPlace = tmplPlace.replace(/__PLACETYPE__/g, filter);
-                    tmplPlace = tmplPlace.replace(/__PLACEVALUE__/g, filters[filter]);
-                    Places.push(tmplPlace);
-                }
-            }
-            var tmplPlaceCity = '';
-            if (this.options.location.city) {
-                tmplPlaceCity = this.template.place;
-                tmplPlaceCity = tmplPlaceCity.replace(/__PLACETYPE__/g, 'Municipality');
-                tmplPlaceCity = tmplPlaceCity.replace(/__PLACEVALUE__/g, this.options.location.city);
-                Places.push(tmplPlaceCity);
-            }
-            template = template.replace(/__POSTALCODE__/g, tmplPostalCode);
-            template = template.replace(/__PLACE__/g, Places.join('\n'));
-            template = template.replace(/__ENVELOPE__/g, tmplEnvelope);
-            this.requestString = template;
-            return this.requestString;
-        };
-        return Address;
-    }(Gp, UtilsLoggerByDefault);
-    FormatsXLSLocationUtilityServiceGeocodeFilterExtension = function (Logger) {
-        function GeocodeFilterExtension() {
-            if (!(this instanceof GeocodeFilterExtension)) {
-                throw new TypeError('GeocodeFilterExtension constructor cannot be called as a function.');
-            }
-            this.filters = [];
-        }
-        GeocodeFilterExtension.prototype = {
-            constructor: GeocodeFilterExtension,
-            addFilterExtensions: function (oGeocodeLocation) {
-                if (oGeocodeLocation) {
-                    this.filters.push(oGeocodeLocation);
-                }
-            },
-            getNames: function () {
-                var names = [];
-                for (var idx in this.filters) {
-                    names.push(this.filters[idx].CLASSNAME);
-                }
-                return names;
-            },
-            getFilter: function (name) {
-                var filter = null;
-                for (var idx in this.filters) {
-                    if (this.filters[idx].CLASSNAME == name) {
-                        filter = this.filters[idx];
-                    }
-                }
-                return filter;
-            },
-            getFilters: function () {
-                return this.filters;
-            },
-            getAttributs: function (name) {
-                var attributs = [];
-                for (var idx in this.filters) {
-                    if (this.filters[idx].CLASSNAME == name) {
-                        attributs = this.filters[idx].attributesList;
-                    }
-                }
-                return attributs;
-            },
-            setPlaceAttributs: function (name, options) {
-                var filter = this.getFilter(name);
-                var attributs = this.getAttributs(name);
-                for (var idx in attributs) {
-                    var value = attributs[idx];
-                    if (options[value]) {
-                        filter.placeAttributes[value] = options[value];
-                    }
-                }
-            },
-            getPlaceAttributs: function (name) {
-                var places = {};
-                for (var idx in this.filters) {
-                    if (this.filters[idx].CLASSNAME == name) {
-                        places = this.filters[idx].placeAttributes;
-                    }
-                }
-                return places;
-            }
-        };
-        return GeocodeFilterExtension;
-    }(UtilsLoggerByDefault);
-    FormatsXLSLocationUtilityServiceGeocodeRequest = function (Logger, Address, GeocodeFilterExtension) {
-        function GeocodeRequest(options) {
-            if (!(this instanceof GeocodeRequest)) {
-                throw new TypeError('GeocodeRequest constructor cannot be called as a function.');
-            }
-            this.options = options || {};
-            for (var opt in options) {
-                if (options.hasOwnProperty(opt)) {
-                    this.options[opt] = options[opt];
-                }
-            }
-            this.CLASSNAME = 'GeocodeRequest';
-        }
-        GeocodeRequest.prototype = {
-            strRequest: null,
-            oAddress: null,
-            oFilter: null,
-            template: '<GeocodeRequest returnFreeForm="__RETURNFREEFORM__">' + '__ADDRESS__' + '</GeocodeRequest>',
-            addAddress: function (oAddress) {
-                if (oAddress instanceof Address) {
-                    this.oAddress = oAddress;
-                }
-            },
-            addFilter: function (oFilter) {
-                if (oFilter instanceof GeocodeFilterExtension) {
-                    this.oFilter = oFilter;
-                }
-            },
-            constructor: GeocodeRequest,
-            toString: function () {
-                var template = '';
-                template = this.template;
-                if (!this.oAddress) {
-                    var settings = {};
-                    settings.location = this.options.location;
-                    settings.type = this.options.filterOptions.type || ['StreetAddress'];
-                    settings.filter = this.options.filterOptions;
-                    delete settings.filter.type;
-                    if (this.oFilter) {
-                        settings.filter = {};
-                        for (var idx in settings.type) {
-                            var filter = settings.type[idx];
-                            var oFilter = this.oFilter.getFilter(filter);
-                            if (!oFilter) {
-                                continue;
-                            }
-                            var mFilter = this.options.filterOptions;
-                            var attributs = oFilter.attributesList;
-                            for (var idxe = 0; idxe < attributs.length; idxe++) {
-                                var key = attributs[idxe];
-                                if (mFilter[key]) {
-                                    var matchingKey = oFilter.serviceAttributes[idxe];
-                                    oFilter.placeAttributes[matchingKey] = mFilter[key];
-                                }
-                            }
-                            var places = oFilter.placeAttributes;
-                            for (var kplace in places) {
-                                if (places.hasOwnProperty(kplace)) {
-                                    settings.filter[kplace] = places[kplace];
-                                }
-                            }
-                        }
-                    }
-                    this.oAddress = new Address(settings);
-                    if (!this.oAddress) {
-                        throw new Error('La construction de l\'adresse n\'est pas correctement definie !?');
-                    }
-                }
-                template = template.replace(/__ADDRESS__/g, this.oAddress.toString());
-                template = template.replace(/__RETURNFREEFORM__/g, this.options.returnFreeForm ? 'true' : 'false');
-                this.strRequest = template;
-                return this.strRequest;
-            }
-        };
-        return GeocodeRequest;
-    }(UtilsLoggerByDefault, FormatsXLSLocationUtilityServiceModelAddress, FormatsXLSLocationUtilityServiceGeocodeFilterExtension);
-    FormatsXLSLocationUtilityServiceModelPosition = function (Logger) {
-        function Position(options) {
-            if (!(this instanceof Position)) {
-                throw new TypeError('Position constructor cannot be called as a function.');
-            }
-            this.options = options || {};
-            if (!options.position) {
-                throw new Error('l\'option \'position\' n\'est pas renseignée !');
-            }
-            for (var opt in options) {
-                if (options.hasOwnProperty(opt)) {
-                    this.options[opt] = options[opt];
-                }
-            }
-        }
-        Position.prototype = {
-            constructor: Position,
-            requestString: null,
-            template: {
-                position: '<Position>' + '__GMLPOINT__' + '__GMLFILTER__' + '</Position>',
-                gml: {
-                    point: '<gml:Point xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos></gml:Point>',
-                    pos: null,
-                    filter: {
-                        bbox: '<gml:Envelope xmlns:gml="http://www.opengis.net/gml">' + '<gml:lowerCorner>__LEFT__ __BOTTOM__</gml:lowerCorner>' + '<gml:upperCorner>__RIGHT__ __TOP__</gml:upperCorner>' + '</gml:Envelope>',
-                        circle: '<gml:CircleByCenterPoint xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos><gml:radius>__RADIUS__</gml:radius></gml:CircleByCenterPoint>',
-                        polygon: '<gml:Polygon xmlns:gml="http://www.opengis.net/gml"><gml:exterior><gml:LinearRing><gml:posList>__XY__</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>',
-                        multipolygon: null
-                    }
-                }
-            }
-        };
-        Position.prototype.toString = function () {
-            var template = this.template.position;
-            var tmplGmlPoint = this.template.gml.point;
-            tmplGmlPoint = tmplGmlPoint.replace(/__X__/g, this.options.position.x);
-            tmplGmlPoint = tmplGmlPoint.replace(/__Y__/g, this.options.position.y);
-            var tmplGmlFilter = '';
-            if (this.options.filter) {
-                var filter = this.options.filter;
-                for (var name in filter) {
-                    switch (name) {
-                    case 'circle':
-                        tmplGmlFilter = this.template.gml.filter[name];
-                        tmplGmlFilter = tmplGmlFilter.replace(/__X__/g, filter[name].x);
-                        tmplGmlFilter = tmplGmlFilter.replace(/__Y__/g, filter[name].y);
-                        tmplGmlFilter = tmplGmlFilter.replace(/__RADIUS__/g, filter[name].radius);
-                        break;
-                    case 'bbox':
-                        tmplGmlFilter = this.template.gml.filter[name];
-                        tmplGmlFilter = tmplGmlFilter.replace(/__LEFT__/g, filter[name].left);
-                        tmplGmlFilter = tmplGmlFilter.replace(/__BOTTOM__/g, filter[name].bottom);
-                        tmplGmlFilter = tmplGmlFilter.replace(/__RIGHT__/g, filter[name].right);
-                        tmplGmlFilter = tmplGmlFilter.replace(/__TOP__/g, filter[name].top);
-                        break;
-                    case 'polygon':
-                        tmplGmlFilter = this.template.gml.filter[name];
-                        var strPoints = '';
-                        var lstPoints = filter[name];
-                        for (var i = 0; i < lstPoints.length; i++) {
-                            var coord = lstPoints[i];
-                            if (Array.isArray(coord)) {
-                                break;
-                            }
-                            if (coord.x && coord.y || (coord.x === 0 || coord.y === 0)) {
-                                strPoints += coord.x + ' ' + coord.y;
-                            }
-                            if (lstPoints.length !== i + 1) {
-                                strPoints += ' ';
-                            }
-                        }
-                        tmplGmlFilter = tmplGmlFilter.replace(/__XY__/g, strPoints);
-                        break;
-                    case 'multipolygon':
-                        break;
-                    default:
-                    }
-                }
-            }
-            template = template.replace(/__GMLPOINT__/g, tmplGmlPoint);
-            template = template.replace(/__GMLFILTER__/g, tmplGmlFilter);
-            this.requestString = template;
-            return this.requestString;
-        };
-        return Position;
-    }(UtilsLoggerByDefault);
-    FormatsXLSLocationUtilityServiceModelPreference = function (Logger) {
-        function Preference(type) {
-            if (!(this instanceof Preference)) {
-                throw new TypeError('Preference constructor cannot be called as a function.');
-            }
-            this.type = type;
-        }
-        Preference.prototype = {
-            constructor: Preference,
-            requestString: null,
-            template: '<ReverseGeocodePreference>__TYPE__</ReverseGeocodePreference>'
-        };
-        Preference.prototype.toString = function () {
-            var Preferences = [];
-            var tmplPreference = '';
-            for (var idx = 0; idx < this.type.length; idx++) {
-                tmplPreference = this.template;
-                tmplPreference = tmplPreference.replace(/__TYPE__/g, this.type[idx]);
-                Preferences.push(tmplPreference);
-            }
-            this.strRequest = Preferences.join('\n');
-            return this.strRequest;
-        };
-        return Preference;
-    }(UtilsLoggerByDefault);
-    FormatsXLSLocationUtilityServiceReverseGeocodeRequest = function (Logger, Position, Preference) {
-        function ReverseGeocodeRequest(options) {
-            if (!(this instanceof ReverseGeocodeRequest)) {
-                throw new TypeError('ReverseGeocodeRequest constructor cannot be called as a function.');
-            }
-            this.options = options || {};
-            for (var opt in options) {
-                if (options.hasOwnProperty(opt)) {
-                    this.options[opt] = options[opt];
-                }
-            }
-            this.CLASSNAME = 'ReverseGeocodeRequest';
-        }
-        ReverseGeocodeRequest.prototype = {
-            strRequest: null,
-            oPosition: null,
-            oPreference: null,
-            constructor: ReverseGeocodeRequest,
-            template: '<ReverseGeocodeRequest returnFreeForm="__RETURNFREEFORM__">' + '__POSITION__' + '__PREFERENCE__' + '</ReverseGeocodeRequest>',
-            addPosition: function (oPosition) {
-                if (oPosition instanceof Position) {
-                    this.oPosition = oPosition;
-                }
-            },
-            addPreferences: function (oPreference) {
-                if (oPreference instanceof Preference) {
-                    this.oPreference = oPreference;
-                }
-            },
-            toString: function () {
-                var template = '';
-                template = this.template;
-                if (!this.oPreference) {
-                    this.oPreference = new Preference(this.options.filterOptions.type || ['StreetAddress']);
-                    if (!this.oPreference) {
-                        throw new Error('Les preferences ne sont pas definies !?');
-                    }
-                }
-                template = template.replace(/__PREFERENCE__/g, this.oPreference.toString());
-                if (!this.oPosition) {
-                    var settings = {
-                        position: this.options.position,
-                        filter: {}
-                    };
-                    if (this.options.filterOptions) {
-                        settings.filter = this.options.filterOptions;
-                        delete settings.filter.type;
-                    }
-                    this.oPosition = new Position(settings);
-                    if (!this.oPosition) {
-                        throw new Error('La position et ses filtres ne sont pas definis !?');
-                    }
-                }
-                template = template.replace(/__POSITION__/g, this.oPosition.toString());
-                template = template.replace(/__RETURNFREEFORM__/g, this.options.returnFreeForm ? 'true' : 'false');
-                this.strRequest = template;
-                return this.strRequest;
-            }
-        };
-        return ReverseGeocodeRequest;
-    }(UtilsLoggerByDefault, FormatsXLSLocationUtilityServiceModelPosition, FormatsXLSLocationUtilityServiceModelPreference);
-    FormatsXLSLocationUtilityService = function (Logger, AbstractService, GeocodeRequest, ReverseGeocodeRequest, GeocodeFilterExtension) {
-        function LocationUtilityService(options) {
-            if (!(this instanceof LocationUtilityService)) {
-                throw new TypeError('LocationUtilityService constructor cannot be called as a function.');
-            }
-            this.CLASSNAME = 'LocationUtilityService';
-            this.CLASSTYPE = null;
-            AbstractService.apply(this, arguments);
-            if (this.options) {
-                this.CLASSTYPE = this.options.location ? 'GeocodeRequest' : this.options.position ? 'ReverseGeocodeRequest' : null;
-            }
-        }
-        LocationUtilityService.prototype = Object.create(AbstractService.prototype, {});
-        LocationUtilityService.prototype.constructor = LocationUtilityService;
-        LocationUtilityService.prototype.addRequest = function (oLUSRequest) {
-            this.CLASSTYPE = oLUSRequest.CLASSNAME;
-            switch (this.CLASSTYPE) {
-            case 'GeocodeRequest':
-            case 'ReverseGeocodeRequest':
-                this.oRequest = oLUSRequest;
-                break;
-            default:
-                throw new Error('Ce n\'est pas un objet de type \'LUS Request\' !?');
-            }
-        };
-        LocationUtilityService.prototype.addFilter = function (oFilter) {
-            if (oFilter instanceof GeocodeFilterExtension) {
-                this.oFilter = oFilter;
-            }
-        };
-        LocationUtilityService.prototype.toString = function () {
-            if (!this.oRequest) {
-                if (!this.options) {
-                    throw new Error('Les options ne sont pas renseignées, impossible de construire la requête !');
-                }
-                if (this.CLASSTYPE === 'GeocodeRequest') {
-                    var settingsDirect = {
-                        location: this.options.location,
-                        returnFreeForm: this.options.returnFreeForm,
-                        filterOptions: this.options.filterOptions || {}
-                    };
-                    this.oRequest = new GeocodeRequest(settingsDirect);
-                    if (this.oFilter) {
-                        this.oRequest.addFilter(this.oFilter);
-                    }
-                } else if (this.CLASSTYPE === 'ReverseGeocodeRequest') {
-                    var settingsInv = {
-                        position: this.options.position,
-                        returnFreeForm: this.options.returnFreeForm,
-                        filterOptions: this.options.filterOptions || {}
-                    };
-                    this.oRequest = new ReverseGeocodeRequest(settingsInv);
-                } else {
-                }
-            }
-            if (!this.oRequest) {
-                throw new Error('Type de Geocodage indefini !');
-            }
-            this.strRequest = this.oRequest.toString();
-            return this.strRequest;
-        };
-        return LocationUtilityService;
-    }(UtilsLoggerByDefault, FormatsXLSAbstractService, FormatsXLSLocationUtilityServiceGeocodeRequest, FormatsXLSLocationUtilityServiceReverseGeocodeRequest, FormatsXLSLocationUtilityServiceGeocodeFilterExtension);
-    ServicesGeocodeRequestGeocodeLocation = function () {
-        function GeocodeLocation() {
-            if (!(this instanceof GeocodeLocation)) {
-                throw new TypeError('GeocodeLocation constructor cannot be called as a function.');
-            }
-            this.placeAttributes = {};
-            this.attributesList = [];
-            this.serviceAttributes = [];
-        }
-        GeocodeLocation.prototype = { constructor: GeocodeLocation };
-        return GeocodeLocation;
-    }();
-    ServicesGeocodeRequestModelStreetAddress = function (GeocodeLocation) {
-        function StreetAddress() {
-            if (!(this instanceof StreetAddress)) {
-                throw new TypeError('StreetAddress constructor cannot be called as a function.');
-            }
-            GeocodeLocation.apply(this, arguments);
-            this.CLASSNAME = 'StreetAddress';
-            this.attributesList = [
-                'bbox',
-                'ID',
-                'IDTR',
-                'quality',
-                'territory',
-                'commune',
-                'department',
-                'insee',
-                'municipality'
-            ];
-            this.serviceAttributes = [
-                'bbox',
-                'ID',
-                'IDTR',
-                'Qualite',
-                'Territoire',
-                'Commune',
-                'Departement',
-                'INSEE',
-                'Municipality'
-            ];
-        }
-        StreetAddress.prototype = Object.create(GeocodeLocation.prototype);
-        StreetAddress.prototype.constructor = StreetAddress;
-        return StreetAddress;
-    }(ServicesGeocodeRequestGeocodeLocation);
-    ServicesGeocodeRequestModelPositionOfInterest = function (GeocodeLocation) {
-        function PositionOfInterest() {
-            if (!(this instanceof PositionOfInterest)) {
-                throw new TypeError('PositionOfInterest constructor cannot be called as a function.');
-            }
-            GeocodeLocation.apply(this, arguments);
-            this.CLASSNAME = 'PositionOfInterest';
-            this.attributesList = [
-                'bbox',
-                'importance',
-                'nature',
-                'territory',
-                'commune',
-                'department',
-                'insee',
-                'municipality'
-            ];
-            this.serviceAttributes = [
-                'bbox',
-                'Importance',
-                'Nature',
-                'Territoire',
-                'Commune',
-                'Departement',
-                'INSEE',
-                'Municipality'
-            ];
-        }
-        PositionOfInterest.prototype = Object.create(GeocodeLocation.prototype);
-        PositionOfInterest.prototype.constructor = PositionOfInterest;
-        return PositionOfInterest;
-    }(ServicesGeocodeRequestGeocodeLocation);
-    ServicesGeocodeRequestModelCadastralParcel = function (GeocodeLocation) {
-        function CadastralParcel() {
-            if (!(this instanceof CadastralParcel)) {
-                throw new TypeError('CadastralParcel constructor cannot be called as a function.');
-            }
-            GeocodeLocation.apply(this, arguments);
-            this.CLASSNAME = 'CadastralParcel';
-            this.attributesList = [
-                'absorbedCity',
-                'sheet',
-                'number',
-                'section',
-                'commune',
-                'department',
-                'insee',
-                'municipality',
-                'origin'
-            ];
-            this.serviceAttributes = [
-                'CommuneAbsorbee',
-                'Feuille',
-                'Numero',
-                'Section',
-                'Commune',
-                'Departement',
-                'INSEE',
-                'Municipality',
-                'Type'
-            ];
-        }
-        CadastralParcel.prototype = Object.create(GeocodeLocation.prototype);
-        CadastralParcel.prototype.constructor = CadastralParcel;
-        return CadastralParcel;
-    }(ServicesGeocodeRequestGeocodeLocation);
-    ServicesGeocodeRequestModelAdministratif = function (GeocodeLocation) {
-        function Administratif() {
-            if (!(this instanceof Administratif)) {
-                throw new TypeError('Administratif constructor cannot be called as a function.');
-            }
-            GeocodeLocation.apply(this, arguments);
-            this.CLASSNAME = 'Administratif';
-            this.attributesList = [
-                'bbox',
-                'prefecture',
-                'inseeRegion',
-                'inseeDepartment',
-                'municipality'
-            ];
-            this.serviceAttributes = [
-                'bbox',
-                'Prefecture',
-                'InseeRegion',
-                'InseeDepartement',
-                'Municipality'
-            ];
-        }
-        Administratif.prototype = Object.create(GeocodeLocation.prototype);
-        Administratif.prototype.constructor = Administratif;
-        return Administratif;
-    }(ServicesGeocodeRequestGeocodeLocation);
-    ServicesGeocodeRequestDirectGeocodeRequestFactory = function (Logger, XLS, LocationUtilityService, GeocodeFilterExtension, StreetAddress, PositionOfInterest, CadastralParcel, Administratif) {
-        var DirectGeocodeRequestFactory = {
-            build: function (options) {
-                var request = null;
-                var oFilter = new GeocodeFilterExtension();
-                oFilter.addFilterExtensions(new Administratif());
-                oFilter.addFilterExtensions(new StreetAddress());
-                oFilter.addFilterExtensions(new PositionOfInterest());
-                oFilter.addFilterExtensions(new CadastralParcel());
-                var oLUS = new LocationUtilityService({
-                    location: options.location,
-                    returnFreeForm: options.returnFreeForm,
-                    filterOptions: options.filterOptions
-                });
-                oLUS.addFilter(oFilter);
-                var oXLS = new XLS({
-                    srsName: options.srs,
-                    maximumResponses: options.maximumResponses
-                });
-                oXLS.namespace = true;
-                oXLS.setService(oLUS);
-                request = oXLS.build();
-                if (options.httpMethod == 'GET') {
-                    var myRequest = 'qxml=' + encodeURIComponent(request).replace(/\-/g, '%2D').replace(/\_/g, '%5F').replace(/\./g, '%2E').replace(/\!/g, '%21').replace(/\~/g, '%7E').replace(/\*/g, '%2A').replace(/\'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29');
-                    request = myRequest;
-                }
-                return request;
-            }
-        };
-        return DirectGeocodeRequestFactory;
-    }(UtilsLoggerByDefault, FormatsXLS, FormatsXLSLocationUtilityService, FormatsXLSLocationUtilityServiceGeocodeFilterExtension, ServicesGeocodeRequestModelStreetAddress, ServicesGeocodeRequestModelPositionOfInterest, ServicesGeocodeRequestModelCadastralParcel, ServicesGeocodeRequestModelAdministratif);
-    ServicesGeocodeResponseModelGeocodeResponse = function () {
-        function GeocodeResponse() {
-            if (!(this instanceof GeocodeResponse)) {
-                throw new TypeError('GeocodeResponse constructor cannot be called as a function.');
-            }
-            this.locations = [];
-        }
-        GeocodeResponse.prototype = { constructor: GeocodeResponse };
-        return GeocodeResponse;
-    }();
-    ServicesGeocodeResponseModelGeocodedLocation = function () {
-        function GeocodedLocation() {
-            if (!(this instanceof GeocodedLocation)) {
-                throw new TypeError('GeocodedLocation constructor cannot be called as a function.');
-            }
-            this.position = {
-                x: null,
-                y: null
-            };
-            this.matchType = null;
-            this.placeAttributes = {};
-            this.type = null;
-        }
-        GeocodedLocation.prototype = { constructor: GeocodedLocation };
-        return GeocodedLocation;
-    }();
-    ServicesGeocodeResponseModelDirectGeocodedLocation = function (GeocodedLocation) {
-        function DirectGeocodedLocation() {
-            if (!(this instanceof DirectGeocodedLocation)) {
-                throw new TypeError('DirectGeocodedLocation constructor cannot be called as a function.');
-            }
-            GeocodedLocation.apply(this, arguments);
-            this.CLASSNAME = 'DirectGeocodedLocation';
-            this.accuracy = null;
-        }
-        DirectGeocodedLocation.prototype = Object.create(GeocodedLocation.prototype);
-        DirectGeocodedLocation.prototype.constructor = DirectGeocodedLocation;
-        return DirectGeocodedLocation;
-    }(ServicesGeocodeResponseModelGeocodedLocation);
-    ServicesGeocodeFormatsDirectGeocodeResponseReader = function (Logger, MR, ErrSrv, GeocodeResponse, DirectGeocodedLocation) {
-        var DirectGeocodeResponseReader = {};
-        DirectGeocodeResponseReader.VERSION = '1.2';
-        DirectGeocodeResponseReader.NAMESPACES = {
-            xmlns: 'http://www.opengis.net/xls',
-            gml: 'http://www.opengis.net/gml',
-            xls: 'http://www.opengis.net/xls',
-            xlsext: 'http://www.opengis.net/xlsext',
-            xsi: 'http://www.w3.org/2001/XMLSchema-instance'
-        };
-        DirectGeocodeResponseReader.SCHEMALOCATION = 'http://wxs.ign.fr/schemas/olsAll.xsd';
-        DirectGeocodeResponseReader.DEFAULTPREFIX = 'xls';
-        DirectGeocodeResponseReader.READERS = {
-            xls: {
-                XLS: function (root) {
-                    var geocodeResponse = new GeocodeResponse();
-                    __checkServiceAttributes(root);
-                    __getChildNodes(root, geocodeResponse);
-                    return geocodeResponse;
-                },
-                GeocodedAddress: function (node, geocodeResponse) {
-                    var geocodedLocation = new DirectGeocodedLocation();
-                    __getChildNodes(node, geocodedLocation);
-                    if (geocodeResponse && Array.isArray(geocodeResponse.locations)) {
-                        geocodeResponse.locations.push(geocodedLocation);
-                    }
-                },
-                GeocodeMatchCode: function (node, geocodedLocation) {
-                    var acc = node.getAttribute('accuracy');
-                    if (acc && geocodedLocation) {
-                        geocodedLocation.accuracy = parseFloat(acc);
-                    }
-                    var matchType = node.getAttribute('matchType');
-                    if (matchType && geocodedLocation) {
-                        geocodedLocation.matchType = matchType;
-                    }
-                },
-                Address: function (node, geocodedLocation) {
-                    var countrycode = node.getAttribute('countryCode');
-                    if (geocodedLocation && countrycode) {
-                        geocodedLocation.type = countrycode;
-                    }
-                    __getChildNodes(node, geocodedLocation);
-                },
-                freeFormAddress: function (node, geocodedLocation) {
-                    if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) {
-                        geocodedLocation.placeAttributes.freeform = __getChildValue(node);
-                    }
-                },
-                Building: function (node, geocodedLocation) {
-                    var num = node.getAttribute('number');
-                    if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) {
-                        if (num) {
-                            geocodedLocation.placeAttributes.number = num;
-                        } else if (node.getAttribute('buildingName')) {
-                            geocodedLocation.placeAttributes.number = node.getAttribute('buildingName');
-                        } else if (node.getAttribute('subdivision')) {
-                            geocodedLocation.placeAttributes.number = node.getAttribute('subdivision');
-                        }
-                    }
-                },
-                Street: function (node, geocodedLocation) {
-                    if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) {
-                        if (geocodedLocation.type === 'StreetAddress') {
-                            geocodedLocation.placeAttributes.street = __getChildValue(node);
-                        } else if (geocodedLocation.type === 'CadastralParcel') {
-                            geocodedLocation.placeAttributes.cadastralParcel = __getChildValue(node);
-                        }
-                    }
-                },
-                Place: function (node, geocodedLocation) {
-                    var placeType = node.getAttribute('type');
-                    var placeName = __getChildValue(node);
-                    if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) {
-                        if (placeType === 'Municipality') {
-                            geocodedLocation.placeAttributes.municipality = placeName;
-                        } else if (placeType === 'Bbox') {
-                            var values = placeName.split(';');
-                            if (values.length === 4) {
-                                geocodedLocation.placeAttributes.bbox = {
-                                    left: parseFloat(values[0]),
-                                    right: parseFloat(values[2]),
-                                    top: parseFloat(values[1]),
-                                    bottom: parseFloat(values[3])
-                                };
-                            }
-                        } else if (placeType === 'Commune') {
-                            geocodedLocation.placeAttributes.commune = placeName;
-                        } else if (placeType === 'Departement') {
-                            geocodedLocation.placeAttributes.department = placeName;
-                        } else if (placeType === 'INSEE') {
-                            geocodedLocation.placeAttributes.insee = placeName;
-                        } else if (placeType === 'Qualite') {
-                            geocodedLocation.placeAttributes.quality = placeName;
-                        } else if (placeType === 'Territoire') {
-                            geocodedLocation.placeAttributes.territory = placeName;
-                        } else if (placeType === 'ID') {
-                            geocodedLocation.placeAttributes.ID = placeName;
-                        } else if (placeType === 'ID_TR') {
-                            geocodedLocation.placeAttributes.IDTR = placeName;
-                        } else if (placeType === 'Importance') {
-                            geocodedLocation.placeAttributes.importance = parseInt(placeName, 10);
-                        } else if (placeType === 'Nature') {
-                            geocodedLocation.placeAttributes.nature = placeName;
-                        } else if (placeType === 'Numero') {
-                            geocodedLocation.placeAttributes.number = placeName;
-                        } else if (placeType === 'Feuille') {
-                            geocodedLocation.placeAttributes.sheet = placeName;
-                        } else if (placeType === 'Section') {
-                            geocodedLocation.placeAttributes.section = placeName;
-                        } else if (placeType === 'CommuneAbsorbee') {
-                            geocodedLocation.placeAttributes.absorbedCity = placeName;
-                        } else if (placeType === 'Arrondissement') {
-                            if (placeName) {
-                                geocodedLocation.placeAttributes.arrondissement = placeName;
-                            }
-                        } else if (placeType === 'Type') {
-                            geocodedLocation.placeAttributes.origin = placeName;
-                        } else if (placeType === 'Prefecture') {
-                            geocodedLocation.placeAttributes.prefecture = placeName;
-                        } else if (placeType === 'InseeRegion') {
-                            geocodedLocation.placeAttributes.inseeRegion = placeName;
-                        } else if (placeType === 'InseeDepartment') {
-                            geocodedLocation.placeAttributes.inseeDepartment = placeName;
-                        }
-                    }
-                },
-                PostalCode: function (node, geocodedLocation) {
-                    if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) {
-                        geocodedLocation.placeAttributes.postalCode = __getChildValue(node);
-                    }
-                },
-                Error: function (node) {
-                    var srvMess = node.getAttribute('message');
-                    var errorCode = node.getAttribute('errorCode');
-                    var message = MR.getMessage('SERVICE_RESPONSE_EXCEPTION', '(' + errorCode + ') : ' + srvMess);
-                    throw new ErrSrv({
-                        message: message,
-                        type: ErrSrv.TYPE_SRVERR
-                    });
-                }
-            },
-            gml: {
-                pos: function (node, geocodedLocation) {
-                    var pos = __getChildValue(node);
-                    if (geocodedLocation && pos) {
-                        geocodedLocation.position = {
-                            x: parseFloat(pos.split(' ')[0]),
-                            y: parseFloat(pos.split(' ')[1])
-                        };
-                    }
-                }
-            },
-            ExceptionReport: function (node) {
-                var response = {};
-                if (node.hasChildNodes()) {
-                    var children = node.childNodes;
-                    var child;
-                    for (var i = 0; i < children.length; i++) {
-                        child = children[i];
-                        if (child.nodeName === 'Exception') {
-                            response.exceptionReport = DirectGeocodeResponseReader.READERS['Exception'](child);
-                        }
-                    }
-                }
-                return response;
-            },
-            Exception: function (node) {
-                var exceptionReport = {};
-                var exceptionCode = node.getAttribute('exceptionCode');
-                if (exceptionCode) {
-                    exceptionReport.exceptionCode = exceptionCode;
-                }
-                var textNode = node.firstChild;
-                if (textNode && textNode.nodeType === 3) {
-                    exceptionReport.exception = textNode.nodeValue;
-                }
-                return exceptionReport;
-            }
-        };
-        DirectGeocodeResponseReader.read = function (root) {
-            if (root.nodeName === 'XLS') {
-                var nsPrefix = root.prefix;
-                if (!nsPrefix) {
-                    nsPrefix = DirectGeocodeResponseReader.DEFAULTPREFIX;
-                }
-                var geocodeResponse = DirectGeocodeResponseReader.READERS[nsPrefix][root.nodeName](root);
-                return geocodeResponse;
-            } else if (root.nodeName === 'ExceptionReport') {
-                var exceptionReport = DirectGeocodeResponseReader.READERS[root.nodeName](root);
-                return exceptionReport;
-            } else {
-                var mess = MR.getMessage('SERVICE_RESPONSE_ANALYSE', root.nodeName);
-                throw new ErrSrv({
-                    message: mess,
-                    type: ErrSrv.TYPE_UNKERR,
-                    status: 200
-                });
-            }
-        };
-        function __getAttributes(node) {
-            if (node.attributes.length > 0) {
-                var nodeAttributes = {};
-                var attributes = node.attributes;
-                for (var i = 0; i < attributes.length; i++) {
-                    var attribute = attributes[i];
-                    nodeAttributes[attribute.nodeName] = attribute.nodeValue;
-                }
-                return nodeAttributes;
-            }
-        }
-        function __getChildNodes(node, data) {
-            if (node.hasChildNodes()) {
-                var children = node.childNodes;
-                var child;
-                var childName;
-                var childPrefix;
-                for (var i = 0; i < children.length; i++) {
-                    child = children[i];
-                    if (child.nodeType === 1) {
-                        childName = child.localName || child.baseName || child.nodeName;
-                        childPrefix = child.prefix || DirectGeocodeResponseReader.DEFAULTPREFIX;
-                        if (DirectGeocodeResponseReader.READERS[childPrefix][childName]) {
-                            var reader = DirectGeocodeResponseReader.READERS[childPrefix][childName];
-                            reader(child, data);
-                        } else {
-                            __getChildNodes(child, data);
-                        }
-                    }
-                }
-            }
-        }
-        function __getChildValue(node) {
-            var textNode;
-            var value = '';
-            if (node.hasChildNodes()) {
-                textNode = node.firstChild;
-                if (textNode.nodeType === 3) {
-                    value = textNode.nodeValue;
-                }
-            }
-            return value;
-        }
-        function __checkServiceAttributes(XLSNode) {
-            if (XLSNode.attributes.length > 0) {
-                var xlsAttributes = __getAttributes(XLSNode);
-                for (var att in xlsAttributes) {
-                    if (xlsAttributes.hasOwnProperty(att)) {
-                        if (att === 'version') {
-                            if (xlsAttributes['version'] !== DirectGeocodeResponseReader.VERSION) {
-                                console.log('[DirectGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing');
-                                return;
-                            }
-                        }
-                        if (att === 'xmlns') {
-                            if (xlsAttributes[att] !== DirectGeocodeResponseReader.NAMESPACES[DirectGeocodeResponseReader.DEFAULTPREFIX]) {
-                                console.log('[DirectGeocodeResponseReader] geocode response default namespace is not the expected one');
-                                return;
-                            }
-                            continue;
-                        }
-                        var prefix = att.split(':')[0];
-                        var ns = att.split(':')[1];
-                        if (prefix === 'xmlns' && ns) {
-                            if (DirectGeocodeResponseReader.NAMESPACES[ns]) {
-                                if (DirectGeocodeResponseReader.NAMESPACES[ns] !== xlsAttributes[att]) {
-                                    console.log('[DirectGeocodeResponseReader] geocode response ' + att + ' namespace is not the expected one');
-                                    return;
-                                }
-                            }
-                        }
-                        if (ns === 'schemaLocation') {
-                            if (DirectGeocodeResponseReader.SCHEMALOCATION !== xlsAttributes[att]) {
-                                console.log('[DirectGeocodeResponseReader] geocode response schema location is not the expected one');
-                                return;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return DirectGeocodeResponseReader;
-    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesGeocodeResponseModelGeocodeResponse, ServicesGeocodeResponseModelDirectGeocodedLocation);
-    ServicesGeocodeResponseDirectGeocodeResponseFactory = function (Logger, ErrorService, MRes, XML, DirectGeocodeResponseReader) {
-        var DirectGeocodeReponseFactory = {
-            build: function (options) {
-                var data = null;
-                if (options.response) {
-                    if (options.rawResponse) {
-                        data = options.response;
-                    } else {
-                        try {
-                            var p = new XML({ reader: DirectGeocodeResponseReader });
-                            if (typeof options.response === 'string') {
-                                p.setXMLString(options.response);
-                            } else {
-                                p.setXMLDoc(options.response);
-                            }
-                            data = p.parse();
-                            if (!data) {
-                                throw new Error('L\'analyse de la réponse du service !?');
-                            }
-                        } catch (e) {
-                            var message = e.message;
-                            if (typeof options.response === 'string') {
-                                message += '(\'' + options.response + '\')';
-                            } else {
-                                message += '(\'' + options.response.documentElement.innerHTML + '\')';
-                            }
-                            options.onError.call(options.scope, new ErrorService({
-                                message: MRes.getMessage('SERVICE_RESPONSE_ANALYSE', message),
-                                type: ErrorService.TYPE_UNKERR,
-                                status: -1
-                            }));
-                            return;
-                        }
-                        if (data.exceptionReport) {
-                            options.onError.call(options.scope, new ErrorService({
-                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport),
-                                type: ErrorService.TYPE_SRVERR,
-                                status: 200
-                            }));
-                            return;
-                        }
-                    }
-                } else {
-                    options.onError.call(options.scope, new ErrorService({
-                        message: MRes.getMessage('SERVICE_RESPONSE_EMPTY'),
-                        type: ErrorService.TYPE_SRVERR,
-                        status: -1
-                    }));
-                    return;
-                }
-                options.onSuccess.call(options.scope, data);
-                return;
-            }
-        };
-        return DirectGeocodeReponseFactory;
-    }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, ServicesGeocodeFormatsDirectGeocodeResponseReader);
-    ServicesGeocodeGeocode = function (Logger, _, ErrorService, CommonService, DirectGeocodeRequestFactory, DirectGeocodeResponseFactory) {
-        function Geocode(options) {
-            if (!(this instanceof Geocode)) {
-                throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'Geocode'));
-            }
-            this.CLASSNAME = 'Geocode';
-            CommonService.apply(this, arguments);
-            if (!options.location) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'location'));
-            }
-            if (typeof options.location === 'object' && Object.keys(options.location).length === 0) {
-                throw new Error(_.getMessage('PARAM_EMPTY', 'location'));
-            } else if (typeof options.location === 'string' && options.location.length === 0) {
-                throw new Error(_.getMessage('PARAM_EMPTY', 'location'));
-            }
-            this.options.location = options.location;
-            if (!options.filterOptions || typeof options.filterOptions !== 'object') {
-                this.options.filterOptions = options.filterOptions = { type: ['StreetAddress'] };
-            }
-            if (Object.keys(options.filterOptions).length === 0) {
-                this.options.filterOptions = { type: ['StreetAddress'] };
-            }
-            var filter = Object.keys(options.filterOptions);
-            for (var i = 0; i < filter.length; i++) {
-                var key = filter[i];
-                var filtersCouldBeNumberList = [
-                    'department',
-                    'number',
-                    'postalCode',
-                    'insee',
-                    'importance',
-                    'ID',
-                    'IDTR',
-                    'absorbedCity',
-                    'sheet',
-                    'section',
-                    'inseeRegion',
-                    'inseeDepartment'
-                ];
-                if (filtersCouldBeNumberList.indexOf(key) !== -1 && typeof options.filterOptions[key] !== 'string') {
-                    options.filterOptions[key] = options.filterOptions[key].toString();
-                }
-                if (!options.filterOptions[key]) {
-                    delete this.options.filterOptions[key];
-                }
-            }
-            this.options.filterOptions.type = options.filterOptions.type || ['StreetAddress'];
-            this.options.maximumResponses = options.maximumResponses || 25;
-            this.options.returnFreeForm = options.returnFreeForm || false;
-            this.options.srs = options.srs || 'EPSG:4326';
-            this.options.outputFormat = 'xml';
-        }
-        Geocode.prototype = Object.create(CommonService.prototype, {});
-        Geocode.prototype.constructor = Geocode;
-        Geocode.prototype.buildRequest = function (error, success) {
-            var options = {
-                httpMethod: this.options.httpMethod,
-                location: this.options.location,
-                returnFreeForm: this.options.returnFreeForm,
-                filterOptions: this.options.filterOptions,
-                srs: this.options.srs,
-                maximumResponses: this.options.maximumResponses
-            };
-            this.request = DirectGeocodeRequestFactory.build(options);
-            if (!this.request) {
-                error.call(this, new ErrorService(_.getMessage('SERVICE_REQUEST_BUILD')));
-            } else {
-                success.call(this, this.request);
-            }
-        };
-        Geocode.prototype.analyzeResponse = function (error, success) {
-            if (this.response) {
-                var options = {
-                    response: this.response,
-                    rawResponse: this.options.rawResponse,
-                    onError: error,
-                    onSuccess: success,
-                    scope: this
-                };
-                DirectGeocodeResponseFactory.build(options);
-            } else {
-                error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY')));
-            }
-        };
-        return Geocode;
-    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesGeocodeRequestDirectGeocodeRequestFactory, ServicesGeocodeResponseDirectGeocodeResponseFactory);
-    ServicesGeocodeRequestReverseGeocodeRequestFactory = function (Logger, XLS, LocationUtilityService) {
-        var ReverseGeocodeRequestFactory = {
-            build: function (options) {
-                var settings = options || {};
-                var request = null;
-                var oLUS = new LocationUtilityService({
-                    position: settings.position,
-                    returnFreeForm: settings.returnFreeForm,
-                    filterOptions: settings.filterOptions
-                });
-                var oXLS = new XLS({
-                    srsName: settings.srs,
-                    maximumResponses: settings.maximumResponses
-                });
-                oXLS.namespace = true;
-                oXLS.setService(oLUS);
-                request = oXLS.build();
-                if (settings.httpMethod == 'GET') {
-                    var myRequest = 'qxml=' + encodeURIComponent(request).replace(/\-/g, '%2D').replace(/\_/g, '%5F').replace(/\./g, '%2E').replace(/\!/g, '%21').replace(/\~/g, '%7E').replace(/\*/g, '%2A').replace(/\'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29');
-                    request = myRequest;
-                }
-                return request;
-            }
-        };
-        return ReverseGeocodeRequestFactory;
-    }(UtilsLoggerByDefault, FormatsXLS, FormatsXLSLocationUtilityService);
-    ServicesGeocodeResponseModelReverseGeocodedLocation = function (GeocodedLocation) {
-        function ReverseGeocodedLocation() {
-            if (!(this instanceof ReverseGeocodedLocation)) {
-                throw new TypeError('ReverseGeocodedLocation constructor cannot be called as a function.');
-            }
-            GeocodedLocation.apply(this, arguments);
-            this.CLASSNAME = 'ReverseGeocodedLocation';
-            this.searchCenterDistance = null;
-        }
-        ReverseGeocodedLocation.prototype = Object.create(GeocodedLocation.prototype);
-        ReverseGeocodedLocation.prototype.constructor = ReverseGeocodedLocation;
-        return ReverseGeocodedLocation;
-    }(ServicesGeocodeResponseModelGeocodedLocation);
-    ServicesGeocodeFormatsReverseGeocodeResponseReader = function (Logger, MR, ErrSrv, ReverseGeocodeResponse, ReverseGeocodedLocation) {
-        var ReverseGeocodeResponseReader = {};
-        ReverseGeocodeResponseReader.VERSION = '1.2';
-        ReverseGeocodeResponseReader.NAMESPACES = {
-            xmlns: 'http://www.opengis.net/xls',
-            gml: 'http://www.opengis.net/gml',
-            xls: 'http://www.opengis.net/xls',
-            xlsext: 'http://www.opengis.net/xlsext',
-            xsi: 'http://www.w3.org/2001/XMLSchema-instance'
-        };
-        ReverseGeocodeResponseReader.SCHEMALOCATION = 'http://wxs.ign.fr/schemas/olsAll.xsd';
-        ReverseGeocodeResponseReader.DEFAULTPREFIX = 'xls';
-        ReverseGeocodeResponseReader.READERS = {
-            xls: {
-                XLS: function (root) {
-                    var reverseGeocodeResponse = new ReverseGeocodeResponse();
-                    __checkServiceAttributes(root);
-                    __getChildNodes(root, reverseGeocodeResponse);
-                    return reverseGeocodeResponse;
-                },
-                ReverseGeocodedLocation: function (node, reverseGeocodeResponse) {
-                    var reverseGeocodedLocation = new ReverseGeocodedLocation();
-                    __getChildNodes(node, reverseGeocodedLocation);
-                    if (reverseGeocodeResponse && Array.isArray(reverseGeocodeResponse.locations)) {
-                        reverseGeocodeResponse.locations.push(reverseGeocodedLocation);
-                    }
-                },
-                Address: function (node, reverseGeocodedLocation) {
-                    var countrycode = node.getAttribute('countryCode');
-                    if (reverseGeocodedLocation && countrycode) {
-                        reverseGeocodedLocation.type = countrycode;
-                    }
-                    __getChildNodes(node, reverseGeocodedLocation);
-                },
-                Building: function (node, reverseGeocodedLocation) {
-                    var num = node.getAttribute('number');
-                    if (reverseGeocodedLocation && reverseGeocodedLocation.hasOwnProperty('placeAttributes')) {
-                        if (num) {
-                            reverseGeocodedLocation.placeAttributes.number = num;
-                        } else if (node.getAttribute('buildingName')) {
-                            reverseGeocodedLocation.placeAttributes.number = node.getAttribute('buildingName');
-                        } else if (node.getAttribute('subdivision')) {
-                            reverseGeocodedLocation.placeAttributes.number = node.getAttribute('subdivision');
-                        }
-                    }
-                },
-                Street: function (node, reverseGeocodedLocation) {
-                    if (reverseGeocodedLocation.type === 'StreetAddress') {
-                        reverseGeocodedLocation.placeAttributes.street = __getChildValue(node);
-                    } else if (reverseGeocodedLocation.type === 'CadastralParcel') {
-                        reverseGeocodedLocation.placeAttributes.cadastralParcel = __getChildValue(node);
-                    }
-                },
-                Place: function (node, reverseGeocodedLocation) {
-                    var placeType = node.getAttribute('type');
-                    var placeName = __getChildValue(node);
-                    if (reverseGeocodedLocation && reverseGeocodedLocation.hasOwnProperty('placeAttributes')) {
-                        if (placeType === 'Municipality') {
-                            reverseGeocodedLocation.placeAttributes.municipality = placeName;
-                        } else if (placeType === 'Bbox') {
-                            var values = placeName.split(';');
-                            if (values.length === 4) {
-                                reverseGeocodedLocation.placeAttributes.bbox = {
-                                    left: parseFloat(values[0]),
-                                    right: parseFloat(values[2]),
-                                    top: parseFloat(values[1]),
-                                    bottom: parseFloat(values[3])
-                                };
-                            }
-                        } else if (placeType === 'Commune') {
-                            reverseGeocodedLocation.placeAttributes.commune = placeName;
-                        } else if (placeType === 'Departement') {
-                            reverseGeocodedLocation.placeAttributes.department = placeName;
-                        } else if (placeType === 'INSEE') {
-                            reverseGeocodedLocation.placeAttributes.insee = placeName;
-                        } else if (placeType === 'Qualite') {
-                            reverseGeocodedLocation.placeAttributes.quality = placeName;
-                        } else if (placeType === 'Territoire') {
-                            reverseGeocodedLocation.placeAttributes.territory = placeName;
-                        } else if (placeType === 'ID') {
-                            reverseGeocodedLocation.placeAttributes.ID = placeName;
-                        } else if (placeType === 'ID_TR') {
-                            reverseGeocodedLocation.placeAttributes.IDTR = placeName;
-                        } else if (placeType === 'Importance') {
-                            reverseGeocodedLocation.placeAttributes.importance = parseInt(placeName, 10);
-                        } else if (placeType === 'Nature') {
-                            reverseGeocodedLocation.placeAttributes.nature = placeName;
-                        } else if (placeType === 'Numero') {
-                            reverseGeocodedLocation.placeAttributes.number = placeName;
-                        } else if (placeType === 'Feuille') {
-                            reverseGeocodedLocation.placeAttributes.sheet = placeName;
-                        } else if (placeType === 'Section') {
-                            reverseGeocodedLocation.placeAttributes.section = placeName;
-                        } else if (placeType === 'CommuneAbsorbee') {
-                            reverseGeocodedLocation.placeAttributes.absorbedCity = placeName;
-                        } else if (placeType === 'Arrondissement') {
-                            if (placeName) {
-                                reverseGeocodedLocation.placeAttributes.arrondissement = placeName;
-                            }
-                        } else if (placeType === 'Type') {
-                            reverseGeocodedLocation.placeAttributes.origin = placeName;
-                        } else if (placeType === 'Prefecture') {
-                            reverseGeocodedLocation.placeAttributes.prefecture = placeName;
-                        } else if (placeType === 'InseeRegion') {
-                            reverseGeocodedLocation.placeAttributes.inseeRegion = placeName;
-                        } else if (placeType === 'InseeDepartment') {
-                            reverseGeocodedLocation.placeAttributes.inseeDepartment = placeName;
-                        }
-                    }
-                },
-                PostalCode: function (node, reverseGeocodedLocation) {
-                    if (reverseGeocodedLocation && reverseGeocodedLocation.hasOwnProperty('placeAttributes')) {
-                        reverseGeocodedLocation.placeAttributes.postalCode = __getChildValue(node);
-                    }
-                },
-                SearchCentreDistance: function (node, reverseGeocodedLocation) {
-                    if (reverseGeocodedLocation) {
-                        reverseGeocodedLocation.searchCenterDistance = parseFloat(node.getAttribute('value'));
-                    }
-                },
-                Error: function (node) {
-                    var srvMess = node.getAttribute('message');
-                    var errorCode = node.getAttribute('errorCode');
-                    var message = MR.getMessage('SERVICE_RESPONSE_EXCEPTION', '(' + errorCode + ') : ' + srvMess);
-                    throw new ErrSrv({
-                        message: message,
-                        type: ErrSrv.TYPE_SRVERR
-                    });
-                }
-            },
-            gml: {
-                pos: function (node, reverseGeocodedLocation) {
-                    var pos = __getChildValue(node);
-                    if (reverseGeocodedLocation && pos) {
-                        reverseGeocodedLocation.position = {
-                            x: parseFloat(pos.split(' ')[0]),
-                            y: parseFloat(pos.split(' ')[1])
-                        };
-                    }
-                }
-            },
-            xlsext: {
-                ExtendedGeocodeMatchCode: function (node, reverseGeocodedLocation) {
-                    if (reverseGeocodedLocation) {
-                        reverseGeocodedLocation.matchType = __getChildValue(node);
-                    }
-                }
-            },
-            ExceptionReport: function (node) {
-                var response = {};
-                if (node.hasChildNodes()) {
-                    var children = node.childNodes;
-                    var child;
-                    for (var i = 0; i < children.length; i++) {
-                        child = children[i];
-                        if (child.nodeName === 'Exception') {
-                            response.exceptionReport = ReverseGeocodeResponseReader.READERS['Exception'](child);
-                        }
-                    }
-                }
-                return response;
-            },
-            Exception: function (node) {
-                var exceptionReport = {};
-                var exceptionCode = node.getAttribute('exceptionCode');
-                if (exceptionCode) {
-                    exceptionReport.exceptionCode = exceptionCode;
-                }
-                var textNode = node.firstChild;
-                if (textNode && textNode.nodeType === 3) {
-                    exceptionReport.exception = textNode.nodeValue;
-                }
-                return exceptionReport;
-            }
-        };
-        ReverseGeocodeResponseReader.read = function (root) {
-            if (root.nodeName === 'XLS') {
-                var nsPrefix = root.prefix;
-                if (!nsPrefix) {
-                    nsPrefix = ReverseGeocodeResponseReader.DEFAULTPREFIX;
-                }
-                var geocodeResponse = ReverseGeocodeResponseReader.READERS[nsPrefix][root.nodeName](root);
-                return geocodeResponse;
-            } else if (root.nodeName === 'ExceptionReport') {
-                var exceptionReport = ReverseGeocodeResponseReader.READERS[root.nodeName](root);
-                return exceptionReport;
-            } else {
-                throw new Error('Erreur lors de la lecture de la réponse : elle n\'est pas au format attendu.');
-            }
-        };
-        function __getAttributes(node) {
-            if (node.attributes.length > 0) {
-                var nodeAttributes = {};
-                var attributes = node.attributes;
-                for (var i = 0; i < attributes.length; i++) {
-                    var attribute = attributes[i];
-                    nodeAttributes[attribute.nodeName] = attribute.nodeValue;
-                }
-                return nodeAttributes;
-            }
-        }
-        function __getChildNodes(node, data) {
-            if (node.hasChildNodes()) {
-                var children = node.childNodes;
-                var child;
-                var childName;
-                var childPrefix;
-                for (var i = 0; i < children.length; i++) {
-                    child = children[i];
-                    if (child.nodeType === 1) {
-                        childName = child.localName || child.baseName || child.nodeName;
-                        childPrefix = child.prefix || ReverseGeocodeResponseReader.DEFAULTPREFIX;
-                        if (ReverseGeocodeResponseReader.READERS[childPrefix][childName]) {
-                            var reader = ReverseGeocodeResponseReader.READERS[childPrefix][childName];
-                            reader(child, data);
-                        } else {
-                            __getChildNodes(child, data);
-                        }
-                    }
-                }
-            }
-        }
-        function __getChildValue(node) {
-            var textNode;
-            var value = '';
-            if (node.hasChildNodes()) {
-                textNode = node.firstChild;
-                if (textNode.nodeType === 3) {
-                    value = textNode.nodeValue;
-                }
-            }
-            return value;
-        }
-        function __checkServiceAttributes(XLSNode) {
-            if (XLSNode.attributes.length > 0) {
-                var xlsAttributes = __getAttributes(XLSNode);
-                for (var att in xlsAttributes) {
-                    if (xlsAttributes.hasOwnProperty(att)) {
-                        if (att === 'version') {
-                            if (xlsAttributes['version'] !== ReverseGeocodeResponseReader.VERSION) {
-                                console.log('[ReverseGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing');
-                                return;
-                            }
-                        }
-                        if (att === 'xmlns') {
-                            if (xlsAttributes[att] !== ReverseGeocodeResponseReader.NAMESPACES[ReverseGeocodeResponseReader.DEFAULTPREFIX]) {
-                                console.log('[ReverseGeocodeResponseReader] geocode response default namespace is not the expected one');
-                                return;
-                            }
-                            continue;
-                        }
-                        var prefix = att.split(':')[0];
-                        var ns = att.split(':')[1];
-                        if (prefix === 'xmlns' && ns) {
-                            if (ReverseGeocodeResponseReader.NAMESPACES[ns]) {
-                                if (ReverseGeocodeResponseReader.NAMESPACES[ns] !== xlsAttributes[att]) {
-                                    console.log('[ReverseGeocodeResponseReader] geocode response ' + att + ' namespace is not the expected one');
-                                    return;
-                                }
-                            }
-                        }
-                        if (ns === 'schemaLocation') {
-                            if (ReverseGeocodeResponseReader.SCHEMALOCATION !== xlsAttributes[att]) {
-                                console.log('[ReverseGeocodeResponseReader] geocode response schema location is not the expected one');
-                                return;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return ReverseGeocodeResponseReader;
-    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesGeocodeResponseModelGeocodeResponse, ServicesGeocodeResponseModelReverseGeocodedLocation);
-    ServicesGeocodeResponseReverseGeocodeResponseFactory = function (Logger, MRes, ErrorService, XML, ReverseGeocodeResponseReader) {
-        var ReverseGeocodeReponseFactory = {
-            build: function (options) {
-                var data = null;
-                if (options.response) {
-                    if (options.rawResponse) {
-                        data = options.response;
-                    } else {
-                        try {
-                            var p = new XML({ reader: ReverseGeocodeResponseReader });
-                            if (typeof options.response === 'string') {
-                                p.setXMLString(options.response);
-                            } else {
-                                p.setXMLDoc(options.response);
-                            }
-                            data = p.parse();
-                            if (!data) {
-                                throw new Error('L\'analyse de la réponse du service !?');
-                            }
-                        } catch (e) {
-                            e.status = 200;
-                            options.onError.call(options.scope, e);
-                            return;
-                        }
-                        if (data.exceptionReport) {
-                            options.onError.call(options.scope, new ErrorService({
-                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport),
-                                type: ErrorService.TYPE_SRVERR,
-                                status: 200
-                            }));
-                            return;
-                        }
-                        if (options.scope && options.scope.options && options.scope.options.srs && options.scope.options.srs !== 'EPSG:4326') {
-                            var location;
-                            var pos;
-                            if (data || data.locations || data.locations.length) {
-                                for (var i = 0; i < data.locations.length; i++) {
-                                    location = data.locations[i];
-                                    if (location) {
-                                        pos = location.position;
-                                        if (pos) {
-                                            location.position = {
-                                                x: pos.y,
-                                                y: pos.x
-                                            };
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                } else {
-                    options.onError.call(options.scope, new ErrorService({
-                        message: MRes.getMessage('SERVICE_RESPONSE_EMPTY'),
-                        type: ErrorService.TYPE_SRVERR,
-                        status: -1
-                    }));
-                    return;
-                }
-                options.onSuccess.call(options.scope, data);
-                return;
-            }
-        };
-        return ReverseGeocodeReponseFactory;
-    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, FormatsXML, ServicesGeocodeFormatsReverseGeocodeResponseReader);
-    ServicesGeocodeReverseGeocode = function (Logger, _, ErrorService, CommonService, ReverseGeocodeRequestFactory, ReverseGeocodeResponseFactory) {
-        function ReverseGeocode(options) {
-            if (!(this instanceof ReverseGeocode)) {
-                throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'ReverseGeocode'));
-            }
-            this.CLASSNAME = 'ReverseGeocode';
-            CommonService.apply(this, arguments);
-            if (!options.position) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'position'));
-            }
-            if (options.position.x == null) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'position.x'));
-            }
-            if (options.position.y == null) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'position.y'));
-            }
-            this.options.position = options.position;
-            if (!options.filterOptions || typeof options.filterOptions !== 'object') {
-                this.options.filterOptions = options.filterOptions = { type: ['StreetAddress'] };
-            }
-            if (Object.keys(options.filterOptions).length === 0) {
-                this.options.filterOptions = { type: ['StreetAddress'] };
-            }
-            var filter = Object.keys(options.filterOptions);
-            for (var i = 0; i < filter.length; i++) {
-                var key = filter[i];
-                if (!options.filterOptions[key] || Object.keys(options.filterOptions[key]).length === 0) {
-                    delete this.options.filterOptions[key];
-                }
-            }
-            this.options.filterOptions.type = options.filterOptions.type || ['StreetAddress'];
-            if (!Array.isArray(this.options.filterOptions.type)) {
-                throw new Error(_.getMessage('PARAM_TYPE', 'filterOptions.type'));
-            }
-            this.options.maximumResponses = options.maximumResponses || 25;
-            this.options.returnFreeForm = options.returnFreeForm || false;
-            this.options.srs = options.srs || 'CRS:84';
-            if (ReverseGeocode.geoEPSG.indexOf(this.options.srs) === -1) {
-                this.options.position = {
-                    x: this.options.position.y,
-                    y: this.options.position.x
-                };
-                if (this.options.filterOptions && this.options.filterOptions.circle) {
-                    var circle = this.options.filterOptions.circle;
-                    this.options.filterOptions.circle = {
-                        x: circle.y,
-                        y: circle.x,
-                        radius: circle.radius
-                    };
-                }
-                if (this.options.filterOptions && this.options.filterOptions.polygon) {
-                    var polygon = this.options.filterOptions.polygon;
-                    for (i = 0; i < polygon.length; i++) {
-                        var coords = polygon[i];
-                        this.options.filterOptions.polygon[i] = {
-                            x: coords.y,
-                            y: coords.x
-                        };
-                    }
-                }
-            }
-            this.options.outputFormat = 'xml';
-        }
-        ReverseGeocode.prototype = Object.create(CommonService.prototype, {});
-        ReverseGeocode.prototype.constructor = ReverseGeocode;
-        ReverseGeocode.prototype.buildRequest = function (error, success) {
-            var options = {
-                httpMethod: this.options.httpMethod,
-                position: this.options.position,
-                returnFreeForm: this.options.returnFreeForm,
-                filterOptions: this.options.filterOptions,
-                srs: 'EPSG:4326',
-                maximumResponses: this.options.maximumResponses
-            };
-            this.request = ReverseGeocodeRequestFactory.build(options);
-            if (!this.request) {
-                error.call(this, new ErrorService(_.getMessage('SERVICE_REQUEST_BUILD')));
-            } else {
-                success.call(this, this.request);
-            }
-        };
-        ReverseGeocode.prototype.analyzeResponse = function (error, success) {
-            if (this.response) {
-                var options = {
-                    response: this.response,
-                    rawResponse: this.options.rawResponse,
-                    onError: error,
-                    onSuccess: success,
-                    scope: this
-                };
-                ReverseGeocodeResponseFactory.build(options);
-            } else {
-                error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY')));
-            }
-        };
-        ReverseGeocode.geoEPSG = ['EPSG:4326'];
-        return ReverseGeocode;
-    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesGeocodeRequestReverseGeocodeRequestFactory, ServicesGeocodeResponseReverseGeocodeResponseFactory);
-    ServicesAutoCompleteResponseModelAutoCompleteResponse = function () {
-        function AutoCompleteResponse() {
-            if (!(this instanceof AutoCompleteResponse)) {
-                throw new TypeError('AutoCompleteResponse constructor cannot be called as a function.');
-            }
-            this.suggestedLocations = [];
-        }
-        AutoCompleteResponse.prototype = { constructor: AutoCompleteResponse };
-        return AutoCompleteResponse;
-    }();
-    ServicesAutoCompleteResponseModelSuggestedLocation = function () {
-        function SuggestedLocation() {
-            if (!(this instanceof SuggestedLocation)) {
-                throw new TypeError('SuggestedLocation constructor cannot be called as a function.');
-            }
-            this.type = null;
-            this.position = {
-                x: null,
-                y: null
-            };
-            this.commune = null;
-            this.fullText = null;
-            this.postalCode = null;
-            this.classification = null;
-            this.street = null;
-            this.poi = null;
-            this.kind = null;
-        }
-        SuggestedLocation.prototype = { constructor: SuggestedLocation };
-        return SuggestedLocation;
-    }();
-    ServicesAutoCompleteResponseAutoCompleteResponseFactory = function (Logger, ErrorService, MRes, XML, AutoCompleteResponse, SuggestedLocation) {
-        var AutoCompleteResponseFactory = {
-            build: function (options) {
-                var data = null;
-                if (options.response) {
-                    if (options.rawResponse) {
-                        data = options.response;
-                    } else {
-                        var JSONResponse;
-                        if (typeof options.response === 'string') {
-                            JSONResponse = window.JSON.parse(options.response);
-                        } else {
-                            JSONResponse = options.response;
-                        }
-                        if (JSONResponse) {
-                            if (JSONResponse.error) {
-                                options.onError.call(options.scope, new ErrorService({
-                                    message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', JSONResponse.error.description),
-                                    status: JSONResponse.error.code,
-                                    type: ErrorService.TYPE_SRVERR
-                                }));
-                                return;
-                            }
-                            data = new AutoCompleteResponse();
-                            if (JSONResponse.results && Array.isArray(JSONResponse.results)) {
-                                var suggestedLocation;
-                                for (var i = 0; i < JSONResponse.results.length; i++) {
-                                    var result = JSONResponse.results[i];
-                                    suggestedLocation = new SuggestedLocation();
-                                    if (suggestedLocation) {
-                                        if (result && result.country === 'StreetAddress') {
-                                            suggestedLocation.street = result.street;
-                                            suggestedLocation.type = 'StreetAddress';
-                                        } else if (result && result.country === 'PositionOfInterest') {
-                                            suggestedLocation.poi = result.street;
-                                            suggestedLocation.kind = result.kind;
-                                            suggestedLocation.type = 'PositionOfInterest';
-                                        }
-                                        if (suggestedLocation.position) {
-                                            suggestedLocation.position.x = result.x;
-                                            suggestedLocation.position.y = result.y;
-                                        }
-                                        suggestedLocation.commune = result.city;
-                                        suggestedLocation.fullText = result.fulltext;
-                                        suggestedLocation.postalCode = result.zipcode;
-                                        suggestedLocation.classification = result.classification;
-                                    }
-                                    data.suggestedLocations.push(suggestedLocation);
-                                }
-                            } else {
-                                options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT_3')));
-                                return;
-                            }
-                            if (!data.suggestedLocations.length) {
-                                options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT_3')));
-                                return;
-                            }
-                        }
-                        if (!data) {
-                            options.onError.call(options.scope, new ErrorService({
-                                message: MRes.getMessage('SERVICE_RESPONSE_ANALYSE_2'),
-                                type: ErrorService.TYPE_UNKERR,
-                                status: -1
-                            }));
-                            return;
-                        }
-                        if (data.exceptionReport) {
-                            options.onError.call(options.scope, new ErrorService({
-                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport),
-                                type: ErrorService.TYPE_SRVERR,
-                                status: 200
-                            }));
-                            return;
-                        }
-                    }
-                } else {
-                    options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY')));
-                    return;
-                }
-                options.onSuccess.call(options.scope, data);
-                return;
-            }
-        };
-        return AutoCompleteResponseFactory;
-    }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, ServicesAutoCompleteResponseModelAutoCompleteResponse, ServicesAutoCompleteResponseModelSuggestedLocation);
-    ServicesAutoCompleteAutoComplete = function (CommonService, AutoCompleteResponseFactory, Logger, MR, ErrorService, Helper) {
-        function AutoComplete(options) {
-            if (!(this instanceof AutoComplete)) {
-                throw new TypeError(MR.getMessage('CLASS_CONSTRUCTOR', 'AutoComplete'));
-            }
-            this.CLASSNAME = 'AutoComplete';
-            CommonService.apply(this, arguments);
-            if (!options.text) {
-                throw new Error(MR.getMessage('PARAM_MISSING', 'text'));
-            }
-            this.options.text = options.text;
-            if (!options.filterOptions || typeof options.filterOptions !== 'object') {
-                this.options.filterOptions = options.filterOptions = {
-                    territory: [],
-                    type: ['StreetAddress']
-                };
-            }
-            if (Object.keys(options.filterOptions).length === 0) {
-                this.options.filterOptions = {
-                    territory: [],
-                    type: ['StreetAddress']
-                };
-            }
-            this.options.filterOptions.type = options.filterOptions.type || ['StreetAddress'];
-            this.options.filterOptions.territory = options.filterOptions.territory || [];
-            this.options.maximumResponses = options.maximumResponses || 10;
-            if (this.options.protocol === 'XHR' && this.options.httpMethod === 'POST') {
-                this.options.httpMethod = 'GET';
-            }
-            this.options.outputFormat = 'json';
-        }
-        AutoComplete.prototype = Object.create(CommonService.prototype, {});
-        AutoComplete.prototype.constructor = AutoComplete;
-        AutoComplete.prototype.buildRequest = function (error, success) {
-            var territories = '';
-            if (this.options.filterOptions.territory) {
-                territories = this.options.filterOptions.territory.join(';');
-            }
-            var types = '';
-            if (this.options.filterOptions.type) {
-                types = this.options.filterOptions.type.join(',');
-            }
-            this.request = Helper.normalyzeParameters({
-                text: encodeURIComponent(this.options.text),
-                type: types,
-                terr: territories,
-                maximumResponses: this.options.maximumResponses
-            });
-            success.call(this, this.request);
-        };
-        AutoComplete.prototype.analyzeResponse = function (error, success) {
-            if (this.response) {
-                var options = {
-                    response: this.response,
-                    rawResponse: this.options.rawResponse,
-                    onSuccess: success,
-                    onError: error,
-                    scope: this
-                };
-                AutoCompleteResponseFactory.build(options);
-            } else {
-                error.call(this, new ErrorService(MR.getMessage('SERVICE_RESPONSE_EMPTY')));
-            }
-        };
-        return AutoComplete;
-    }(ServicesCommonService, ServicesAutoCompleteResponseAutoCompleteResponseFactory, UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, UtilsHelper);
-    FormatsXLSRouteServiceModelRoutePlan = function (Logger) {
-        function RoutePlan(options) {
-            if (!(this instanceof RoutePlan)) {
-                throw new TypeError('RoutePlan constructor cannot be called as a function.');
-            }
-            this.options = options || {};
-            if (!options.startPoint) {
-                throw new Error('l\'option \'startPoint\' n\'est pas renseignée !');
-            }
-            if (!options.endPoint) {
-                throw new Error('l\'option \'endPoint\' n\'est pas renseignée !');
-            }
-            for (var opt in options) {
-                if (options.hasOwnProperty(opt)) {
-                    this.options[opt] = options[opt];
-                }
-            }
-        }
-        RoutePlan.prototype = {
-            constructor: RoutePlan,
-            requestString: null,
-            template: {
-                routePlan: '<RoutePlan>' + '__ROUTEPREFERENCE__' + '__GRAPH__' + '__WAYPOINTLIST__' + '__AVOIDLIST__' + '</RoutePlan>',
-                routePreference: '<RoutePreference>__VALUEROUTEPREFERENCE__</RoutePreference>',
-                graph: '<xlsext:graphName xmlns:xlsext="http://www.opengis.net/xlsext" name="__VALUEGRAPH__"/>',
-                wayPointList: {
-                    container: '<WayPointList>' + '__STARTPOINT__' + '__VIAPOINT__' + '__ENDPOINT__' + '</WayPointList>',
-                    point: '<Position><gml:Point xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos></gml:Point></Position>',
-                    startPoint: '<StartPoint>' + '__POINT__' + '</StartPoint>',
-                    endPoint: '<EndPoint>' + '__POINT__' + '</EndPoint>',
-                    viaPoint: '<ViaPoint>' + '__POINT__' + '</ViaPoint>'
-                },
-                avoidList: {
-                    container: '<AvoidList>' + '__AVOIDFEATURE__' + '</AvoidList>',
-                    avoidFeature: '<AvoidFeature>__VALUEAVOIDFEATURE__</AvoidFeature>'
-                }
-            },
-            toString: function () {
-                var template = '';
-                template = this.template.routePlan;
-                if (this.options.routePreference) {
-                    var tmplPreference = this.template.routePreference;
-                    tmplPreference = tmplPreference.replace(/__VALUEROUTEPREFERENCE__/, this.options.routePreference);
-                    template = template.replace(/__ROUTEPREFERENCE__/g, tmplPreference);
-                }
-                template = template.replace(/__ROUTEPREFERENCE__/g, '');
-                if (this.options.avoidFeature) {
-                    var tmplAvoidList = this.template.avoidList.container;
-                    var avoidFeatures = [];
-                    for (var i = 0; i < this.options.avoidFeature.length; i++) {
-                        var tmplAvoidFeature = this.template.avoidList.avoidFeature;
-                        tmplAvoidFeature = tmplAvoidFeature.replace(/__VALUEAVOIDFEATURE__/, this.options.avoidFeature[i]);
-                        avoidFeatures.push(tmplAvoidFeature);
-                    }
-                    tmplAvoidList = tmplAvoidList.replace(/__AVOIDFEATURE__/, avoidFeatures.join('\n'));
-                    template = template.replace(/__AVOIDLIST__/g, tmplAvoidList);
-                }
-                template = template.replace(/__AVOIDLIST__/g, '');
-                if (this.options.graph) {
-                    var tmplVehicle = this.template.graph;
-                    tmplVehicle = tmplVehicle.replace(/__VALUEGRAPH__/, this.options.graph);
-                    template = template.replace(/__GRAPH__/g, tmplVehicle);
-                }
-                template = template.replace(/__GRAPH__/g, '');
-                var tmplWayPointList = this.template.wayPointList.container;
-                var tmplPoint = '';
-                tmplPoint = this.template.wayPointList.point;
-                tmplPoint = tmplPoint.replace(/__X__/, this.options.startPoint.x);
-                tmplPoint = tmplPoint.replace(/__Y__/, this.options.startPoint.y);
-                tmplWayPointList = tmplWayPointList.replace(/__STARTPOINT__/, this.template.wayPointList.startPoint.replace(/__POINT__/, tmplPoint));
-                tmplPoint = this.template.wayPointList.point;
-                tmplPoint = tmplPoint.replace(/__X__/, this.options.endPoint.x);
-                tmplPoint = tmplPoint.replace(/__Y__/, this.options.endPoint.y);
-                tmplWayPointList = tmplWayPointList.replace(/__ENDPOINT__/, this.template.wayPointList.endPoint.replace(/__POINT__/, tmplPoint));
-                if (this.options.viaPoint) {
-                    var points = [];
-                    for (var j = 0; j < this.options.viaPoint.length; j++) {
-                        var p = this.options.viaPoint[j];
-                        tmplPoint = this.template.wayPointList.point;
-                        tmplPoint = tmplPoint.replace(/__X__/, p.x);
-                        tmplPoint = tmplPoint.replace(/__Y__/, p.y);
-                        points.push(tmplPoint);
-                    }
-                    tmplWayPointList = tmplWayPointList.replace(/__VIAPOINT__/, this.template.wayPointList.viaPoint.replace(/__POINT__/, points.join('\n')));
-                } else {
-                    tmplWayPointList = tmplWayPointList.replace(/__VIAPOINT__/, '');
-                }
-                template = template.replace(/__WAYPOINTLIST__/g, tmplWayPointList);
-                this.requestString = template;
-                return this.requestString;
-            }
-        };
-        return RoutePlan;
-    }(UtilsLoggerByDefault);
-    FormatsXLSRouteServiceDetermineRouteRequest = function (Logger, RoutePlan) {
-        function DetermineRouteRequest(options) {
-            if (!(this instanceof DetermineRouteRequest)) {
-                throw new TypeError('DetermineRouteRequest constructor cannot be called as a function.');
-            }
-            this.options = options || {};
-            for (var opt in options) {
-                if (options.hasOwnProperty(opt)) {
-                    this.options[opt] = options[opt];
-                }
-            }
-            this.CLASSNAME = 'DetermineRouteRequest';
-        }
-        DetermineRouteRequest.prototype = {
-            strRequest: null,
-            oRoutePlan: null,
-            template: {
-                determineRouteRequest: '<DetermineRouteRequest distanceUnit="__DISTANCEUNIT__">' + '__ROUTEPLAN__' + '__ROUTEINSTRUCTIONREQUEST__' + '__ROUTEGEOMETRYREQUEST__' + '__ROUTEMAPREQUEST__' + '</DetermineRouteRequest>',
-                routeInstructionRequest: '<RouteInstructionsRequest ' + 'provideGeometry="__PROVIDEGEOMETRY__" ' + 'provideBoundingBox="__PROVIDEBBOX__" />',
-                routeGeometryRequest: '<RouteGeometryRequest />',
-                routeMapRequest: ''
-            },
-            addRoute: function (oRoutePlan) {
-                if (oRoutePlan instanceof RoutePlan) {
-                    this.oRoutePlan = oRoutePlan;
-                }
-            },
-            constructor: DetermineRouteRequest,
-            toString: function () {
-                var template = '';
-                template = this.template.determineRouteRequest;
-                template = template.replace(/__DISTANCEUNIT__/g, this.options.distanceUnit || 'KM');
-                if (!this.oRoutePlan) {
-                    var settings = this.options.route;
-                    this.oRoutePlan = new RoutePlan(settings);
-                    if (!this.oRoutePlan) {
-                        throw new Error('La construction du calcul d\'initineraire n\'est pas correctement definie !?');
-                    }
-                }
-                template = template.replace(/__ROUTEPLAN__/g, this.oRoutePlan.toString());
-                var tmplInstruction = this.template.routeInstructionRequest;
-                tmplInstruction = tmplInstruction.replace(/__PROVIDEGEOMETRY__/g, this.options.provideGeometry || false);
-                tmplInstruction = tmplInstruction.replace(/__PROVIDEBBOX__/g, this.options.provideBoundingBox || false);
-                template = template.replace(/__ROUTEINSTRUCTIONREQUEST__/g, tmplInstruction);
-                var tmplGeometry = this.template.routeGeometryRequest;
-                template = template.replace(/__ROUTEGEOMETRYREQUEST__/g, tmplGeometry);
-                var tmplMap = this.template.routeMapRequest;
-                template = template.replace(/__ROUTEMAPREQUEST__/g, tmplMap);
-                this.strRequest = template;
-                return this.strRequest;
-            }
-        };
-        return DetermineRouteRequest;
-    }(UtilsLoggerByDefault, FormatsXLSRouteServiceModelRoutePlan);
-    FormatsXLSRouteServiceRouteRequestExtension = undefined;
-    FormatsXLSRouteService = function (Logger, AbstractService, DetermineRouteRequest, RouteRequestExtension) {
-        function RouteService(options) {
-            if (!(this instanceof RouteService)) {
-                throw new TypeError('RouteService constructor cannot be called as a function.');
-            }
-            this.CLASSNAME = 'RouteService';
-            this.CLASSTYPE = 'RouteRequest';
-            AbstractService.apply(this, arguments);
-        }
-        RouteService.prototype = Object.create(AbstractService.prototype, {});
-        RouteService.prototype.constructor = RouteService;
-        RouteService.prototype.addRequest = function (oRequest) {
-            if (oRequest.CLASSNAME === 'DetermineRouteRequest') {
-                this.oRequest = oRequest;
-            } else {
-                throw new Error('Ce n\'est pas un objet de type \'Route Request\' !?');
-            }
-        };
-        RouteService.prototype.addFilter = function (oFilter) {
-            if (oFilter instanceof RouteRequestExtension) {
-                this.oFilter = oFilter;
-            }
-        };
-        RouteService.prototype.toString = function () {
-            if (!this.oRequest) {
-                if (!this.options) {
-                    throw new Error('Les options ne sont pas renseignées, impossible de construire la requête !');
-                }
-                if (this.CLASSTYPE === 'RouteRequest') {
-                    var settings = {
-                        distanceUnit: this.options.distanceUnit || null,
-                        provideGeometry: this.options.provideGeometry || null,
-                        provideBoundingBox: this.options.provideBoundingBox || null,
-                        route: {
-                            routePreference: this.options.routePreference || null,
-                            startPoint: this.options.startPoint,
-                            viaPoint: this.options.viaPoint || null,
-                            endPoint: this.options.endPoint,
-                            avoidFeature: this.options.avoidFeature || null,
-                            graph: this.options.graph || null,
-                            expectedStartTime: this.options.expectedStartTime || null
-                        }
-                    };
-                    this.oRequest = new DetermineRouteRequest(settings);
-                    if (this.oFilter) {
-                        this.oRequest.addFilter(this.oFilter);
-                    }
-                }
-            }
-            if (!this.oRequest) {
-                throw new Error('Type de requête indefini !');
-            }
-            this.strRequest = this.oRequest.toString();
-            return this.strRequest;
-        };
-        return RouteService;
-    }(UtilsLoggerByDefault, FormatsXLSAbstractService, FormatsXLSRouteServiceDetermineRouteRequest, FormatsXLSRouteServiceRouteRequestExtension);
-    ServicesRouteRequestRouteRequestOLS = function (Logger, XLS, RouteService) {
-        var RouteRequestOLS = {
-            build: function (options) {
-                var request = null;
-                var settings = {
-                    startPoint: options.startPoint,
-                    endPoint: options.endPoint,
-                    viaPoint: options.viaPoints,
-                    provideBoundingBox: options.provideBbox,
-                    avoidFeature: options.exclusions,
-                    expectedStartTime: options.expectedStartTime,
-                    distanceUnit: options.distanceUnit,
-                    graph: options.graph,
-                    provideGeometry: options.geometryInInstructions,
-                    routePreference: options.routePreference
-                };
-                var oRS = new RouteService(settings);
-                var oXLS = new XLS({
-                    srsName: options.srs,
-                    maximumResponses: options.maximumResponses
-                });
-                oXLS.namespace = true;
-                oXLS.setService(oRS);
-                request = oXLS.build();
-                if (options.httpMethod == 'GET') {
-                    var myRequest = 'qxml=' + encodeURIComponent(request).replace(/\-/g, '%2D').replace(/\_/g, '%5F').replace(/\./g, '%2E').replace(/\!/g, '%21').replace(/\~/g, '%7E').replace(/\*/g, '%2A').replace(/\'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29');
-                    request = myRequest;
-                }
-                return request;
-            }
-        };
-        return RouteRequestOLS;
-    }(UtilsLoggerByDefault, FormatsXLS, FormatsXLSRouteService);
-    ServicesRouteRequestModelRouteParamREST = function (Logger) {
-        function RouteParamREST(options) {
-            if (!(this instanceof RouteParamREST)) {
-                throw new TypeError('RouteParamREST constructor cannot be called as a function.');
-            }
-            this.options = options || {};
-            this.origin = this.options.startPoint.x + ',' + this.options.startPoint.y;
-            this.destination = this.options.endPoint.x + ',' + this.options.endPoint.y;
-            this.waypoints = this.options.viaPoints || null;
-            this.startDateTime = this.options.expectedStartTime || null;
-            this.graphName = this.options.graph;
-            this.srs = this.options.srs;
-            this.exclusions = this.options.exclusions;
-            this.method = 'TIME';
-            if (this.options.routePreference) {
-                var value = this.options.routePreference;
-                switch (value) {
-                case 'fastest':
-                    this.method = 'TIME';
-                    break;
-                case 'shortest':
-                    this.method = 'DISTANCE';
-                    break;
-                default:
-                    this.method = 'TIME';
-                }
-            }
-            this.format = this.options.geometryInInstructions ? 'STANDARDEXT' : 'STANDARD';
-            this.tolerance = 10;
-            this.profileId = null;
-            this.profileName = null;
-        }
-        RouteParamREST.CLASSNAME = 'RouteParamREST';
-        RouteParamREST.prototype = {
-            constructor: RouteParamREST,
-            getWaypoints: function () {
-                if (!this.waypoints) {
-                    return;
-                }
-                var array = [];
-                for (var i = 0; i < this.waypoints.length; i++) {
-                    var obj = this.waypoints[i];
-                    array.push(obj.x + ',' + obj.y);
-                }
-                return array.join(';');
-            },
-            getExclusions: function () {
-                return this.exclusions.join(';');
-            }
-        };
-        RouteParamREST.prototype.getParams = function () {
-            var map = [];
-            map.push({
-                k: 'origin',
-                v: this.origin
-            });
-            map.push({
-                k: 'destination',
-                v: this.destination
-            });
-            map.push({
-                k: 'method',
-                v: this.method
-            });
-            if (this.waypoints) {
-                map.push({
-                    k: 'waypoints',
-                    v: this.getWaypoints()
-                });
-            }
-            if (this.startDateTime) {
-                map.push({
-                    k: 'startDateTime',
-                    v: this.startDateTime
-                });
-            }
-            if (this.graphName) {
-                map.push({
-                    k: 'graphName',
-                    v: this.graphName
-                });
-            }
-            if (this.exclusions) {
-                map.push({
-                    k: 'exclusions',
-                    v: this.getExclusions()
-                });
-            }
-            if (this.srs) {
-                map.push({
-                    k: 'srs',
-                    v: this.srs
-                });
-            }
-            if (this.format) {
-                map.push({
-                    k: 'format',
-                    v: this.format
-                });
-            }
-            return map;
-        };
-        return RouteParamREST;
-    }(UtilsLoggerByDefault);
-    ServicesRouteRequestRouteRequestREST = function (Logger, _, RouteParamREST) {
-        function RouteRequestREST(options) {
-            if (!(this instanceof RouteRequestREST)) {
-                throw new TypeError('RouteRequestREST constructor cannot be called as a function.');
-            }
-            if (!options) {
-                throw new Error(_.getMessage('PARAM_EMPTY', 'options'));
-            }
-            this.settings = options;
-        }
-        RouteRequestREST.prototype = {
-            requestString: null,
-            constructor: RouteRequestREST,
-            processRequestString: function () {
-                var oParams = new RouteParamREST(this.settings);
-                var params = oParams.getParams();
-                var request = '';
-                for (var i = 0; i < params.length; i++) {
-                    var o = params[i];
-                    if (request) {
-                        request += '&';
-                    }
-                    request += o.k + '=' + o.v;
-                }
-                this.requestString = request;
-                return this.requestString;
-            }
-        };
-        return RouteRequestREST;
-    }(UtilsLoggerByDefault, UtilsMessagesResources, ServicesRouteRequestModelRouteParamREST);
-    ServicesRouteRequestRouteRequestFactory = function (Logger, ErrorService, RouteRequestOLS, RouteRequestREST) {
-        var RouteRequestFactory = {
-            build: function (options) {
-                var request = null;
-                var settings = options || {};
-                var bOnError = options.onError !== null && typeof options.onError === 'function' ? true : false;
-                var message = null;
-                switch (options.api) {
-                case 'REST':
-                    var myReq = new RouteRequestREST(settings);
-                    if (!myReq.processRequestString()) {
-                        message = 'Error process request (rest) !';
-                        if (bOnError) {
-                            options.onError.call(options.scope, new ErrorService(message));
-                            return;
-                        }
-                        throw new Error(message);
-                    }
-                    request = myReq.requestString;
-                    break;
-                case 'OLS':
-                    request = RouteRequestOLS.build(settings);
-                    if (!request) {
-                        message = 'Error process request (ols) !';
-                        if (bOnError) {
-                            options.onError.call(options.scope, new ErrorService(message));
-                            return;
-                        }
-                        throw new Error(message);
-                    }
-                    break;
-                default:
-                    message = 'Type of API is not supported by service (REST or OLS) !';
-                    if (bOnError) {
-                        options.onError.call(options.scope, new ErrorService(message));
-                        return;
-                    }
-                    throw new Error(message);
-                }
-                return request;
-            }
-        };
-        return RouteRequestFactory;
-    }(UtilsLoggerByDefault, ExceptionsErrorService, ServicesRouteRequestRouteRequestOLS, ServicesRouteRequestRouteRequestREST);
-    FormatsWKT = function (Logger) {
-        var WKT = {
-            toJson: function (strWkt, success, error) {
-                var json = null;
-                try {
-                    if (!strWkt) {
-                        throw new Error('La chaine WKT n\'est pas renseignée !');
-                    }
-                    if (!success) {
-                        success = function (json) {
-                            console.log(json);
-                        };
-                    }
-                    if (!error) {
-                        error = function (e) {
-                            console.log(e);
-                        };
-                    }
-                    var regex;
-                    var subst;
-                    var result;
-                    regex = /(-?\d+\.?[0-9]*)\s(-?\d+\.?[0-9]+)/g;
-                    subst = '[$1,$2]';
-                    strWkt = strWkt.replace(regex, subst);
-                    regex = /^(\w+)/;
-                    result = regex.exec(strWkt);
-                    if (RegExp.$1 === 'POLYGON') {
-                        subst = '{"type" : "Polygon",';
-                        strWkt = strWkt.replace(RegExp.$1, subst);
-                        regex = /(\({2}?)/;
-                        subst = '"coordinates" : [[';
-                        strWkt = strWkt.replace(regex, subst);
-                        regex = /(\){2}?)/;
-                        subst = ']]}';
-                        strWkt = strWkt.replace(regex, subst);
-                        regex = /(\()/g;
-                        subst = '[';
-                        strWkt = strWkt.replace(regex, subst);
-                        regex = /(\))/g;
-                        subst = ']';
-                        strWkt = strWkt.replace(regex, subst);
-                    } else if (RegExp.$1 === 'LINESTRING') {
-                        subst = '{"type" : "LineString",';
-                        strWkt = strWkt.replace(RegExp.$1, subst);
-                        regex = /(\(\(?)/;
-                        subst = '"coordinates" : [';
-                        strWkt = strWkt.replace(regex, subst);
-                        regex = /(\)\)?)/;
-                        subst = ']}';
-                        strWkt = strWkt.replace(regex, subst);
-                    }
-                    json = JSON.parse(strWkt);
-                    if (!json) {
-                        throw new Error('Le JSON est vide !');
-                    }
-                    if (!json.type) {
-                        throw new Error('Le type de geometrie n\'est pas connu !');
-                    }
-                    if (!json.coordinates) {
-                        throw new Error('La liste des points est vide !');
-                    }
-                    success.call(this, json);
-                } catch (e) {
-                    if (e.name === 'SyntaxError') {
-                        error.call(this, 'Erreur de parsing JSON !');
-                        return;
-                    }
-                    error.call(this, e);
-                }
-            }
-        };
-        return WKT;
-    }(UtilsLoggerByDefault);
-    ServicesRouteResponseModelRouteResponse = function () {
-        function RouteResponse() {
-            if (!(this instanceof RouteResponse)) {
-                throw new TypeError('RouteResponse constructor cannot be called as a function.');
-            }
-            this.totalTime = null;
-            this.totalDistance = null;
-            this.bbox = {
-                left: null,
-                right: null,
-                top: null,
-                bottom: null
-            };
-            this.routeGeometry = null;
-            this.routeInstructions = [];
-        }
-        RouteResponse.prototype = { constructor: RouteResponse };
-        return RouteResponse;
-    }();
-    ServicesRouteResponseModelRouteInstruction = function () {
-        function RouteInstruction() {
-            if (!(this instanceof RouteInstruction)) {
-                throw new TypeError('RouteInstruction constructor cannot be called as a function.');
-            }
-            this.duration = null;
-            this.distance = null;
-            this.code = null;
-            this.instruction = null;
-            this.geometry = null;
-        }
-        RouteInstruction.prototype = { constructor: RouteInstruction };
-        return RouteInstruction;
-    }();
-    ServicesRouteFormatsRouteResponseRESTReader = function (Logger, WKT, MessagesResources, ErrSrv, RouteResponse, RouteInstruction) {
-        var RouteResponseRESTReader = {};
-        RouteResponseRESTReader.READERS = {
-            routeResult: function (node) {
-                var response = new RouteResponse();
-                __getChildNodes(node, response);
-                if (response.status === 'error') {
-                    var message = MessagesResources.getMessage('SERVICE_RESPONSE_EXCEPTION', response.message);
-                    throw new ErrSrv({
-                        message: message,
-                        type: ErrSrv.TYPE_SRVERR
-                    });
-                }
-                return response;
-            },
-            status: function (node, response) {
-                var status = __getChildValue(node);
-                if (status === 'ERROR' || status === 'error') {
-                    if (response) {
-                        response.status = 'error';
-                    }
-                }
-            },
-            message: function (node, response) {
-                if (response) {
-                    response.message = __getChildValue(node);
-                }
-            },
-            distance: function (node, response) {
-                if (response) {
-                    response.totalDistance = __getChildValue(node);
-                }
-            },
-            durationSeconds: function (node, response) {
-                if (response) {
-                    response.totalTime = parseFloat(__getChildValue(node));
-                }
-            },
-            bounds: function (node, response) {
-                if (response && response.bbox) {
-                    var coords = __getChildValue(node).split(/[,;]/);
-                    response.bbox.left = parseFloat(coords[0]);
-                    response.bbox.bottom = parseFloat(coords[1]);
-                    response.bbox.right = parseFloat(coords[2]);
-                    response.bbox.top = parseFloat(coords[3]);
-                }
-            },
-            geometryWkt: function (node, response) {
-                if (response) {
-                    var geomWkt = node.innerHTML;
-                    var onWKTSuccess = function (json) {
-                        response.routeGeometry = json;
-                    };
-                    var onWKTError = function () {
-                        var msg = MessagesResources.getMessage('PARAM_FORMAT', ['geometryWkt']);
-                        throw new Error(msg);
-                    };
-                    WKT.toJson(geomWkt, onWKTSuccess, onWKTError);
-                }
-            },
-            step: function (node, response) {
-                var routeInstruction = new RouteInstruction();
-                var name;
-                if (node.hasChildNodes) {
-                    var children = node.childNodes;
-                    var child;
-                    var childName;
-                    for (var i = 0; i < children.length; i++) {
-                        child = children[i];
-                        if (child.nodeType === 1) {
-                            childName = child.localName || child.baseName || child.nodeName;
-                            if (childName === 'durationSeconds') {
-                                routeInstruction.duration = __getChildValue(child);
-                            } else if (childName === 'distance') {
-                                routeInstruction.distance = __getChildValue(child);
-                            } else if (childName === 'navInstruction') {
-                                routeInstruction.code = __getChildValue(child);
-                            } else if (childName === 'name') {
-                                name = __getChildValue(child);
-                            }
-                        }
-                    }
-                }
-                if (routeInstruction.code) {
-                    switch (routeInstruction.code) {
-                    case 'F':
-                        if (name != 'Valeur non renseignée') {
-                            routeInstruction.instruction = 'Tout droit ' + name;
-                        } else {
-                            routeInstruction.instruction = 'Continuer tout droit ';
-                        }
-                        break;
-                    case 'B':
-                        routeInstruction.instruction = 'Demi-tour ' + name;
-                        break;
-                    case 'L':
-                        routeInstruction.instruction = 'Tourner à gauche ' + name;
-                        break;
-                    case 'R':
-                        routeInstruction.instruction = 'Tourner à droite ' + name;
-                        break;
-                    case 'BL':
-                        routeInstruction.instruction = 'Tourner très à gauche ' + name;
-                        break;
-                    case 'BR':
-                        routeInstruction.instruction = 'Tourner très à droite ' + name;
-                        break;
-                    case 'FL':
-                        routeInstruction.instruction = 'Tourner légèrement à gauche ' + name;
-                        break;
-                    case 'FR':
-                        routeInstruction.instruction = 'Tourner légèrement à droite ' + name;
-                        break;
-                    case 'round_about_entry':
-                        routeInstruction.instruction = 'Entrée rond-point ' + name;
-                        break;
-                    case 'round_about_exit':
-                        routeInstruction.instruction = 'Sortie rond-point ' + name;
-                        break;
-                    case null:
-                        routeInstruction.instruction = 'Prendre ' + name;
-                        break;
-                    default:
-                        routeInstruction.instruction = '?' + routeInstruction.code + '? ' + name;
-                        break;
-                    }
-                }
-                if (Array.isArray(response.routeInstructions)) {
-                    response.routeInstructions.push(routeInstruction);
-                }
-            }
-        };
-        RouteResponseRESTReader.read = function (root) {
-            var response;
-            if (root.nodeName === 'routeResult') {
-                response = RouteResponseRESTReader.READERS['routeResult'](root);
-                return response;
-            } else {
-                throw new Error('Erreur lors de la lecture de la réponse : elle n\'est pas au format attendu.');
-            }
-        };
-        function __getChildValue(node) {
-            var textNode;
-            var value = '';
-            if (node.hasChildNodes()) {
-                textNode = node.firstChild;
-                if (textNode && textNode.nodeType === 3) {
-                    value = textNode.nodeValue;
-                }
-            }
-            return value;
-        }
-        function __getChildNodes(node, data) {
-            if (node.hasChildNodes()) {
-                var children = node.childNodes;
-                var child;
-                var childName;
-                for (var i = 0; i < children.length; i++) {
-                    child = children[i];
-                    if (child.nodeType === 1) {
-                        childName = child.localName || child.baseName || child.nodeName;
-                        if (RouteResponseRESTReader.READERS[childName]) {
-                            var reader = RouteResponseRESTReader.READERS[childName];
-                            reader(child, data);
-                        } else {
-                            __getChildNodes(child, data);
-                        }
-                    }
-                }
-            }
-        }
-        return RouteResponseRESTReader;
-    }(UtilsLoggerByDefault, FormatsWKT, UtilsMessagesResources, ExceptionsErrorService, ServicesRouteResponseModelRouteResponse, ServicesRouteResponseModelRouteInstruction);
-    ServicesRouteFormatsRouteResponseOLSReader = function (Logger) {
-        var RouteResponseOLSReader = {};
-        RouteResponseOLSReader.READERS = {};
-        RouteResponseOLSReader.read = function (root) {
-        };
-        return RouteResponseOLSReader;
-    }(UtilsLoggerByDefault);
-    ServicesRouteResponseRouteResponseFactory = function (Logger, ErrorService, XML, WKT, MRes, RouteResponseRESTReader, RouteResponseOLSReader, RouteResponse, RouteInstruction) {
-        var RouteResponseFactory = {
-            build: function (options) {
-                var data = null;
-                if (options.response) {
-                    if (options.rawResponse) {
-                        data = options.response;
-                    } else {
-                        switch (options.outputFormat) {
-                        case 'xml':
-                            var routeReader = options.api === 'REST' ? RouteResponseRESTReader : RouteResponseOLSReader;
-                            try {
-                                var p = new XML({ reader: routeReader });
-                                if (typeof options.response === 'string') {
-                                    p.setXMLString(options.response);
-                                } else {
-                                    p.setXMLDoc(options.response);
-                                }
-                                data = p.parse();
-                                if (!data) {
-                                    throw new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT', 'xml'));
-                                }
-                            } catch (e) {
-                                options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_ANALYSE', options.response)));
-                                return;
-                            }
-                            break;
-                        case 'json':
-                            var JSONResponse;
-                            if (typeof options.response === 'string') {
-                                JSONResponse = window.JSON.parse(options.response);
-                            } else {
-                                JSONResponse = options.response;
-                            }
-                            if (JSONResponse.message) {
-                                options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', JSONResponse.message)));
-                                return;
-                            }
-                            if (JSONResponse) {
-                                var legs = [];
-                                var legSteps = [];
-                                var steps = [];
-                                data = new RouteResponse();
-                                if (data.hasOwnProperty('totalTime')) {
-                                    data.totalTime = parseFloat(JSONResponse.durationSeconds);
-                                }
-                                if (data.hasOwnProperty('totalDistance')) {
-                                    data.totalDistance = options.distanceUnit === 'm' ? JSONResponse.distanceMeters : JSONResponse.distance;
-                                }
-                                if (data.hasOwnProperty('bbox')) {
-                                    var coords = JSONResponse.bounds.split(/[,;]/);
-                                    data.bbox.left = parseFloat(coords[0]);
-                                    data.bbox.bottom = parseFloat(coords[1]);
-                                    data.bbox.right = parseFloat(coords[2]);
-                                    data.bbox.top = parseFloat(coords[3]);
-                                }
-                                var onWKTSuccess = function (json) {
-                                    data.routeGeometry = json;
-                                };
-                                var onWKTError = function (e) {
-                                    console.log(e);
-                                    options.onError.call(options.scope, new ErrorService(MRes.getMessage('PARAM_FORMAT', ['geometryWkt'])));
-                                };
-                                if (data.hasOwnProperty('routeGeometry')) {
-                                    var geometry = JSONResponse.geometryWkt || JSONResponse.simplifiedWkt;
-                                    if (geometry) {
-                                        WKT.toJson(geometry, onWKTSuccess, onWKTError);
-                                        if (!data.routeGeometry) {
-                                            return;
-                                        }
-                                    }
-                                }
-                                if (data.hasOwnProperty('routeInstructions')) {
-                                    var legList = JSONResponse.legs;
-                                    var i;
-                                    if (Array.isArray(legList) && legList.length) {
-                                        for (i = 0; i < legList.length; i++) {
-                                            legs.push(legList[i]);
-                                        }
-                                    }
-                                    if (Array.isArray(legs) && legs.length) {
-                                        for (i = 0; i < legs.length; i++) {
-                                            legSteps.push(legs[i].steps);
-                                        }
-                                    }
-                                    if (Array.isArray(legSteps) && legSteps.length) {
-                                        for (i = 0; i < legSteps.length; i++) {
-                                            steps = steps.concat(legSteps[i]);
-                                        }
-                                    }
-                                    steps.forEach(function (step) {
-                                        data.routeInstructions.push(new RouteInstruction());
-                                        data.routeInstructions[data.routeInstructions.length - 1].duration = step.durationSeconds;
-                                        data.routeInstructions[data.routeInstructions.length - 1].distance = options.distanceUnit === 'm' ? step.distanceMeters : step.distance;
-                                        data.routeInstructions[data.routeInstructions.length - 1].code = step.navInstruction;
-                                        var points = [];
-                                        for (var i = 0; i < step.points.length; i++) {
-                                            var point = step.points[i].split(',');
-                                            if (point) {
-                                                points.push(point);
-                                            }
-                                        }
-                                        if (points && points.length !== 0) {
-                                            data.routeInstructions[data.routeInstructions.length - 1].geometry = {
-                                                coordinates: points,
-                                                type: 'LineString'
-                                            };
-                                        } else {
-                                            data.routeInstructions[data.routeInstructions.length - 1].geometry = null;
-                                        }
-                                        if (step.name == 'Valeur non renseignée') {
-                                            step.name = '';
-                                        }
-                                        switch (step.navInstruction) {
-                                        case 'F':
-                                            if (step.name) {
-                                                data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tout droit ' + step.name;
-                                            } else {
-                                                data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Continuer tout droit ';
-                                            }
-                                            break;
-                                        case 'B':
-                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Demi-tour ' + step.name;
-                                            break;
-                                        case 'L':
-                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner à gauche ' + step.name;
-                                            break;
-                                        case 'R':
-                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner à droite ' + step.name;
-                                            break;
-                                        case 'BL':
-                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner très à gauche ' + step.name;
-                                            break;
-                                        case 'BR':
-                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner très à droite ' + step.name;
-                                            break;
-                                        case 'FL':
-                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner légèrement à gauche ' + step.name;
-                                            break;
-                                        case 'FR':
-                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner légèrement à droite ' + step.name;
-                                            break;
-                                        case 'round_about_entry':
-                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Entrée rond-point ' + step.name;
-                                            break;
-                                        case 'round_about_exit':
-                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Sortie rond-point ' + step.name;
-                                            break;
-                                        case null:
-                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Prendre tout droit ' + step.name;
-                                            break;
-                                        default:
-                                            data.routeInstructions[data.routeInstructions.length - 1].instruction = '?' + step.navInstruction + '? ' + step.name;
-                                            break;
-                                        }
-                                    });
-                                }
-                            }
-                            if (!data) {
-                                options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_ANALYSE', 'json')));
-                                return;
-                            }
-                            break;
-                        default:
-                            options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT', 'json', 'xml')));
-                            return;
-                        }
-                        if (data && data.exceptionReport) {
-                            options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION_2')));
-                            return;
-                        }
-                    }
-                } else {
-                    options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY')));
-                    return;
-                }
-                options.onSuccess.call(options.scope, data);
-                return;
-            }
-        };
-        return RouteResponseFactory;
-    }(UtilsLoggerByDefault, ExceptionsErrorService, FormatsXML, FormatsWKT, UtilsMessagesResources, ServicesRouteFormatsRouteResponseRESTReader, ServicesRouteFormatsRouteResponseOLSReader, ServicesRouteResponseModelRouteResponse, ServicesRouteResponseModelRouteInstruction);
-    ServicesRouteRoute = function (Logger, _, ErrorService, CommonService, DefaultUrlService, RouteRequestFactory, RouteResponseFactory) {
-        function Route(options) {
-            if (!(this instanceof Route)) {
-                throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'Route'));
-            }
-            this.CLASSNAME = 'Route';
-            CommonService.apply(this, arguments);
-            if (!options.startPoint) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'startPoint'));
-            }
-            if (options.startPoint.x == null) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'startPoint.x'));
-            }
-            if (options.startPoint.y == null) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'startPoint.y'));
-            }
-            if (!options.endPoint) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'endPoint'));
-            }
-            if (options.endPoint.x == null) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'endPoint.x'));
-            }
-            if (options.endPoint.y == null) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'endPoint.y'));
-            }
-            this.options.api = typeof options.api == 'string' ? options.api.toUpperCase() : 'REST';
-            this.options.outputFormat = typeof options.outputFormat == 'string' ? options.outputFormat.toLowerCase() : 'json';
-            this.options.startPoint = options.startPoint;
-            this.options.endPoint = options.endPoint;
-            this.options.viaPoints = options.viaPoints || null;
-            this.options.exclusions = options.exclusions || null;
-            this.options.routePreference = options.routePreference || 'fastest';
-            this.options.graph = options.graph || 'Voiture';
-            this.options.geometryInInstructions = options.geometryInInstructions || false;
-            this.options.provideBbox = options.provideBbox || true;
-            this.options.distanceUnit = options.distanceUnit || 'km';
-            this.options.expectedStartTime = null;
-            this.options.srs = options.srs || 'EPSG:4326';
-            this.options.api = 'REST';
-            if (this.options.protocol === 'XHR') {
-                this.options.httpMethod = 'GET';
-            }
-            if (!this.options.serverUrl) {
-                var lstUrlByDefault = DefaultUrlService.Route.url(this.options.apiKey);
-                var urlFound = null;
-                switch (this.options.api) {
-                case 'OLS':
-                    urlFound = lstUrlByDefault.ols;
-                    break;
-                case 'REST':
-                    var key = 'route' + '-' + this.options.outputFormat;
-                    urlFound = lstUrlByDefault[key];
-                    break;
-                default:
-                    throw new Error(_.getMessage('PARAM_UNKNOWN', 'api'));
-                }
-                if (!urlFound) {
-                    throw new Error('Url by default not found !');
-                }
-                this.options.serverUrl = urlFound;
-            }
-            var idx = this.options.serverUrl.lastIndexOf('.');
-            if (idx !== -1) {
-                var extension = this.options.serverUrl.substring(idx + 1);
-                if (extension && extension.length < 5) {
-                    switch (extension.toLowerCase()) {
-                    case 'json':
-                    case 'xml':
-                        this.options.outputFormat = extension.toLowerCase();
-                        break;
-                    default:
-                        throw new Error('type of service : unknown or unsupported (json or xml) !');
-                    }
-                }
-            }
-        }
-        Route.prototype = Object.create(CommonService.prototype, {});
-        Route.prototype.constructor = Route;
-        Route.prototype.buildRequest = function (error, success) {
-            var options = {
-                api: this.options.api,
-                startPoint: this.options.startPoint,
-                endPoint: this.options.endPoint,
-                viaPoints: this.options.viaPoints,
-                provideBbox: this.options.provideBbox,
-                exclusions: this.options.exclusions,
-                distanceUnit: this.options.distanceUnit,
-                graph: this.options.graph,
-                geometryInInstructions: this.options.geometryInInstructions,
-                routePreference: this.options.routePreference,
-                srs: this.options.srs
-            };
-            this.request = RouteRequestFactory.build(options);
-            if (!this.request) {
-                error.call(this, new ErrorService(_.getMessage('SERVICE_REQUEST_BUILD')));
-            } else {
-                success.call(this, this.request);
-            }
-        };
-        Route.prototype.analyzeResponse = function (error, success) {
-            if (this.response) {
-                var options = {
-                    distanceUnit: this.options.distanceUnit,
-                    response: this.response,
-                    outputFormat: this.options.outputFormat,
-                    api: this.options.api,
-                    rawResponse: this.options.rawResponse,
-                    onError: error,
-                    onSuccess: success,
-                    scope: this
-                };
-                RouteResponseFactory.build(options);
-            } else {
-                error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY')));
-            }
-        };
-        return Route;
-    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesDefaultUrlService, ServicesRouteRequestRouteRequestFactory, ServicesRouteResponseRouteResponseFactory);
-    ServicesProcessIsoCurveRequestModelProcessIsoCurveParam = function (Logger) {
-        function ProcessIsoCurveParam(options) {
-            if (!(this instanceof ProcessIsoCurveParam)) {
-                throw new TypeError('ProcessIsoCurveParam constructor cannot be called as a function.');
-            }
-            this.options = options || {};
-            this.id = this.options.id;
-            this.location = this.options.position;
-            this.srs = this.options.srs;
-            this.graphName = this.options.graph;
-            this.profileId = this.options.profileId || null;
-            this.profileName = this.options.profileName || null;
-            this.exclusions = this.options.exclusions;
-            this.reverse = this.options.reverse;
-            this.smoothing = this.options.smoothing;
-            this.holes = this.options.holes;
-            var value = this.options.method;
-            switch (value) {
-            case 'time':
-                this.method = 'time';
-                this.time = this.options.time;
-                break;
-            case 'distance':
-                this.method = 'distance';
-                this.distance = this.options.distance;
-                break;
-            default:
-                this.method = 'time';
-            }
-        }
-        ProcessIsoCurveParam.CLASSNAME = 'ProcessIsoCurveParam';
-        ProcessIsoCurveParam.prototype = {
-            constructor: ProcessIsoCurveParam,
-            getLocation: function () {
-                return this.location.x + ',' + this.location.y;
-            },
-            getExclusions: function () {
-                return this.exclusions.join(';');
-            }
-        };
-        ProcessIsoCurveParam.prototype.getParams = function () {
-            var map = [];
-            map.push({
-                k: 'location',
-                v: this.getLocation()
-            });
-            map.push({
-                k: 'smoothing',
-                v: this.smoothing
-            });
-            map.push({
-                k: 'holes',
-                v: this.holes
-            });
-            map.push({
-                k: 'reverse',
-                v: this.reverse
-            });
-            map.push({
-                k: 'method',
-                v: this.method
-            });
-            if (this.time) {
-                map.push({
-                    k: 'time',
-                    v: this.time
-                });
-            }
-            if (this.distance) {
-                map.push({
-                    k: 'distance',
-                    v: this.distance
-                });
-            }
-            map.push({
-                k: 'graphName',
-                v: this.graphName
-            });
-            if (this.exclusions) {
-                map.push({
-                    k: 'exclusions',
-                    v: this.getExclusions()
-                });
-            }
-            if (this.srs) {
-                map.push({
-                    k: 'srs',
-                    v: this.srs
-                });
-            }
-            return map;
-        };
-        return ProcessIsoCurveParam;
-    }(UtilsLoggerByDefault);
-    ServicesProcessIsoCurveRequestProcessIsoCurveRequest = function (Logger, _, ProcessIsoCurveParam) {
-        function ProcessIsoCurveRequest(options) {
-            if (!(this instanceof ProcessIsoCurveRequest)) {
-                throw new TypeError('ProcessIsoCurveRequest constructor cannot be called as a function.');
-            }
-            if (!options) {
-                throw new Error(_.getMessage('PARAM_EMPTY', 'options'));
-            }
-            this.settings = options;
-            this.mode = this.settings.httpMethod || 'GET';
-        }
-        ProcessIsoCurveRequest.prototype = {
-            requestString: null,
-            constructor: ProcessIsoCurveRequest,
-            template: {
-                container: '<?xml version="1.0" encoding="UTF-8"?>\n' + '<isochroneRequest>\n' + '__ID__' + '\t<location>\n' + '\t\t<x>__X__</x>\n' + '\t\t<y>__Y__</y>\n' + '\t</location>\n' + '\t<srs>__SRS__</srs>\n' + '\t<graphName>__GRAPHNAME__</graphName>\n' + '__PROFIL__' + '__EXCLUSIONS__' + '\t<method>__METHOD__</method>\n' + '__TIME__' + '__DISTANCE__' + '\t<reverse>__REVERSE__</reverse>\n' + '\t<smoothing>__SMOOTHING__</smoothing>\n' + '\t<holes>__HOLES__</holes>\n' + '</isochroneRequest>',
-                id: '\t<id>__IDVALUE__</id>\n',
-                profil: '\t<profileId>__PROFILID__</profileId>\n' + '\t<profileName>__PROFILNAME__</profileName>\n',
-                exclusions: {
-                    container: '\t<exclusions>\n' + '__EXCLUSIONFEATURE__\n' + '\t</exclusions>\n',
-                    feature: '\t\t<exclusion>__EXCLUSIONVALUE__</exclusion>'
-                },
-                time: '\t<time>__TIMEVALUE__</time>\n',
-                distance: '\t<distance>__DISTANCEVALUE__</distance>\n'
-            },
-            processRequestString: function () {
-                var request = '';
-                var i = 0;
-                switch (this.mode) {
-                case 'GET':
-                    var oParams = new ProcessIsoCurveParam(this.settings);
-                    var params = oParams.getParams();
-                    for (i = 0; i < params.length; i++) {
-                        var o = params[i];
-                        if (request) {
-                            request += '&';
-                        }
-                        request += o.k + '=' + o.v;
-                    }
-                    break;
-                case 'POST':
-                    request = this.template.container;
-                    request = request.replace(/__ID__/g, '');
-                    request = request.replace(/__PROFIL__/g, '');
-                    request = request.replace(/__X__/g, this.settings.position.x);
-                    request = request.replace(/__Y__/g, this.settings.position.y);
-                    request = request.replace(/__GRAPHNAME__/g, this.settings.graph);
-                    request = request.replace(/__SRS__/g, this.settings.srs);
-                    request = request.replace(/__SMOOTHING__/g, this.settings.smoothing);
-                    request = request.replace(/__HOLES__/g, this.settings.holes);
-                    request = request.replace(/__REVERSE__/g, this.settings.reverse);
-                    if (this.settings.exclusions) {
-                        var tmplExclusions = this.template.exclusions.container;
-                        var exclusions = [];
-                        for (i = 0; i < this.settings.exclusions.length; i++) {
-                            var tmplFeature = this.template.exclusions.feature;
-                            tmplFeature = tmplFeature.replace(/__EXCLUSIONVALUE__/, this.settings.exclusions[i]);
-                            exclusions.push(tmplFeature);
-                        }
-                        tmplExclusions = tmplExclusions.replace(/__EXCLUSIONFEATURE__/, exclusions.join('\n'));
-                        request = request.replace(/__EXCLUSIONS__/g, tmplExclusions);
-                    }
-                    request = request.replace(/__EXCLUSIONS__/g, '');
-                    if (this.settings.distance) {
-                        var tmplDistance = this.template.distance;
-                        tmplDistance = tmplDistance.replace(/__DISTANCEVALUE__/g, this.settings.distance);
-                        request = request.replace(/__DISTANCE__/g, tmplDistance);
-                        request = request.replace(/__METHOD__/g, 'distance');
-                    }
-                    request = request.replace(/__DISTANCE__/g, '');
-                    if (this.settings.time) {
-                        var tmplTime = this.template.time;
-                        tmplTime = tmplTime.replace(/__TIMEVALUE__/g, this.settings.time);
-                        request = request.replace(/__TIME__/g, tmplTime);
-                        request = request.replace(/__METHOD__/g, 'time');
-                    }
-                    request = request.replace(/__TIME__/g, '');
-                    break;
-                default:
-                }
-                this.requestString = request;
-                return this.requestString;
-            }
-        };
-        return ProcessIsoCurveRequest;
-    }(UtilsLoggerByDefault, UtilsMessagesResources, ServicesProcessIsoCurveRequestModelProcessIsoCurveParam);
-    ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse = function () {
-        function ProcessIsoCurveResponse() {
-            if (!(this instanceof ProcessIsoCurveResponse)) {
-                throw new TypeError('ProcessIsoCurveResponse constructor cannot be called as a function.');
-            }
-            this.message = null;
-            this.id = null;
-            this.location = {};
-            this.location.x = null;
-            this.location.y = null;
-            this.srs = null;
-            this.geometry = null;
-            this.time = null;
-            this.distance = null;
-        }
-        ProcessIsoCurveResponse.prototype = { constructor: ProcessIsoCurveResponse };
-        return ProcessIsoCurveResponse;
-    }();
-    ServicesProcessIsoCurveFormatsProcessIsoCurveResponseReader = function (Logger, WKT, ErrSrv, MessagesResources, ProcessIsoCurveResponse) {
-        var ProcessIsoCurveResponseReader = {};
-        ProcessIsoCurveResponseReader.READERS = {
-            isochronResult: function (root) {
-                var response = new ProcessIsoCurveResponse();
-                if (root.hasChildNodes()) {
-                    var children = root.childNodes;
-                    var child;
-                    for (var i = 0; i < children.length; i++) {
-                        child = children[i];
-                        if (ProcessIsoCurveResponseReader.READERS[child.nodeName]) {
-                            ProcessIsoCurveResponseReader.READERS[child.nodeName](child, response);
-                        }
-                    }
-                }
-                if (response.status === 'error') {
-                    var message = MessagesResources.getMessage('SERVICE_RESPONSE_EXCEPTION', response.message);
-                    throw new ErrSrv({
-                        message: message,
-                        type: ErrSrv.TYPE_SRVERR
-                    });
-                }
-                return response;
-            },
-            message: function (node, response) {
-                if (response) {
-                    response.message = __getChildValue(node);
-                }
-            },
-            status: function (node, response) {
-                var status = __getChildValue(node);
-                if (status === 'ERROR' || status === 'error') {
-                    if (response) {
-                        response.status = 'error';
-                    }
-                }
-            },
-            id: function (node, response) {
-                if (response) {
-                    response.id = __getChildValue(node);
-                }
-            },
-            location: function (node, response) {
-                var coords = __getChildValue(node);
-                if (response && response.location) {
-                    response.location.x = parseFloat(coords.split(',')[0]);
-                    response.location.y = parseFloat(coords.split(',')[1]);
-                }
-            },
-            srs: function (node, response) {
-                if (response) {
-                    response.srs = __getChildValue(node);
-                }
-            },
-            distance: function (node, response) {
-                if (response) {
-                    response.distance = parseFloat(__getChildValue(node));
-                }
-            },
-            time: function (node, response) {
-                if (response) {
-                    response.time = parseFloat(__getChildValue(node));
-                }
-            },
-            wktGeometry: function (node, response) {
-                if (response) {
-                    var wktGeometry = node.innerHTML;
-                    var onWKTSuccess = function (json) {
-                        response.geometry = json;
-                    };
-                    var onWKTError = function () {
-                        var msg = MessagesResources.getMessage('PARAM_FORMAT', ['wktGeometry']);
-                        throw new Error(msg);
-                    };
-                    if (response.hasOwnProperty('geometry')) {
-                        WKT.toJson(wktGeometry, onWKTSuccess, onWKTError);
-                    }
-                }
-            },
-            serviceResult: function (node) {
-                var response = {};
-                if (node.hasChildNodes()) {
-                    var children = node.childNodes;
-                    var child;
-                    for (var i = 0; i < children.length; i++) {
-                        child = children[i];
-                        if (ProcessIsoCurveResponseReader.READERS[child.nodeName]) {
-                            ProcessIsoCurveResponseReader.READERS[child.nodeName](child, response);
-                        }
-                    }
-                }
-                return response;
-            },
-            ExceptionReport: function (node) {
-                var response = {};
-                if (node.hasChildNodes()) {
-                    var children = node.childNodes;
-                    var child;
-                    for (var i = 0; i < children.length; i++) {
-                        child = children[i];
-                        if (child.nodeName === 'Exception') {
-                            response.exceptionReport = ProcessIsoCurveResponseReader.READERS['Exception'](child);
-                        }
-                    }
-                }
-                return response;
-            },
-            Exception: function (node) {
-                var exceptionReport = {};
-                var exceptionCode = node.getAttribute('exceptionCode');
-                if (exceptionCode) {
-                    exceptionReport.exceptionCode = exceptionCode;
-                }
-                var textNode = node.firstChild;
-                if (textNode && textNode.nodeType === 3) {
-                    exceptionReport.exception = textNode.nodeValue;
-                }
-                return exceptionReport;
-            }
-        };
-        ProcessIsoCurveResponseReader.read = function (root) {
-            var response;
-            if (root.nodeName === 'isochronResult' || root.nodeName === 'isochroneResult' || root.nodeName === 'IsochroneResult') {
-                response = ProcessIsoCurveResponseReader.READERS['isochronResult'](root);
-                return response;
-            } else if (root.nodeName === 'ExceptionReport') {
-                response = ProcessIsoCurveResponseReader.READERS[root.nodeName](root);
-                return response;
-            } else if (ProcessIsoCurveResponseReader.READERS[root.nodeName]) {
-                response = ProcessIsoCurveResponseReader.READERS[root.nodeName](root);
-                if (response.status === 'error') {
-                    var errMsg = MessagesResources.getMessage('SERVICE_RESPONSE_EXCEPTION', response.message);
-                    throw new ErrSrv({
-                        message: errMsg,
-                        type: ErrSrv.TYPE_SRVERR
-                    });
-                }
-                return response;
-            } else {
-                throw new ErrSrv({
-                    message: MessagesResources.getMessage('SERVICE_RESPONSE_ANALYSE', root.nodeName),
-                    type: ErrSrv.TYPE_UNKERR
-                });
-            }
-        };
-        function __getChildValue(node) {
-            var textNode;
-            var value = '';
-            if (node.hasChildNodes()) {
-                textNode = node.firstChild;
-                if (textNode && textNode.nodeType === 3) {
-                    value = textNode.nodeValue;
-                }
-            }
-            return value;
-        }
-        return ProcessIsoCurveResponseReader;
-    }(UtilsLoggerByDefault, FormatsWKT, ExceptionsErrorService, UtilsMessagesResources, ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse);
-    ServicesProcessIsoCurveResponseProcessIsoCurveResponseFactory = function (Logger, ErrorService, MRes, XML, WKT, ProcessIsoCurveResponseReader, ProcessIsoCurveResponse) {
-        var ProcessIsoCurveResponseFactory = {
-            build: function (options) {
-                var data = null;
-                if (options.response) {
-                    if (options.rawResponse) {
-                        data = options.response;
-                    } else {
-                        switch (options.outputFormat) {
-                        case 'xml':
-                            try {
-                                var p = new XML({ reader: ProcessIsoCurveResponseReader });
-                                if (typeof options.response === 'string') {
-                                    p.setXMLString(options.response);
-                                } else {
-                                    p.setXMLDoc(options.response);
-                                }
-                                data = p.parse();
-                                if (!data) {
-                                    throw new Error(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION_2'));
-                                }
-                            } catch (e) {
-                                var message = e.message;
-                                message += '\n(raw response service : \'' + options.response + '\')';
-                                options.onError.call(options.scope, new ErrorService({
-                                    message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', message),
-                                    status: 200,
-                                    type: ErrorService.TYPE_SRVERR
-                                }));
-                                return;
-                            }
-                            break;
-                        case 'json':
-                            var JSONResponse;
-                            if (typeof options.response === 'string') {
-                                JSONResponse = window.JSON.parse(options.response);
-                            } else {
-                                JSONResponse = options.response;
-                            }
-                            if (JSONResponse.status === 'OK' || JSONResponse.status === 'ok') {
-                                data = new ProcessIsoCurveResponse();
-                                if (data) {
-                                    data.time = JSONResponse.time;
-                                    data.distance = JSONResponse.distance;
-                                    data.message = JSONResponse.message;
-                                    data.id = JSONResponse.id;
-                                    data.srs = JSONResponse.srs;
-                                    var onWKTSuccess = function (json) {
-                                        data.geometry = json;
-                                    };
-                                    var onWKTError = function () {
-                                        options.onError.call(options.scope, new ErrorService({ message: MRes.getMessage('PARAM_FORMAT', 'wktGeometry') }));
-                                    };
-                                    if (data.hasOwnProperty('geometry')) {
-                                        WKT.toJson(JSONResponse.wktGeometry, onWKTSuccess, onWKTError);
-                                        if (!data.geometry) {
-                                            return;
-                                        }
-                                    }
-                                    var coords = JSONResponse.location.split(',');
-                                    if (data.location) {
-                                        data.location.x = coords[0];
-                                        data.location.y = coords[1];
-                                    }
-                                } else {
-                                    options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_ANALYSE', options.response)));
-                                    return;
-                                }
-                            } else if (JSONResponse.status === 'ERROR' || JSONResponse.status === 'error') {
-                                var mess = JSONResponse.message;
-                                mess += '\n(raw response service : \'' + JSONResponse + '\')';
-                                options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', mess)));
-                                return;
-                            }
-                            break;
-                        default:
-                            options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT', 'json', 'xml')));
-                            return;
-                        }
-                        if (data && data.exceptionReport) {
-                            options.onError.call(options.scope, new ErrorService({
-                                message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport),
-                                type: ErrorService.TYPE_SRVERR,
-                                status: 200
-                            }));
-                            return;
-                        }
-                    }
-                } else {
-                    options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY')));
-                    return;
-                }
-                options.onSuccess.call(options.scope, data);
-                return;
-            }
-        };
-        return ProcessIsoCurveResponseFactory;
-    }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, FormatsWKT, ServicesProcessIsoCurveFormatsProcessIsoCurveResponseReader, ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse);
-    ServicesProcessIsoCurveProcessIsoCurve = function (Logger, _, ErrorService, CommonService, DefaultUrlService, ProcessIsoCurveRequest, ProcessIsoCurveResponseFactory) {
-        function ProcessIsoCurve(options) {
-            if (!(this instanceof ProcessIsoCurve)) {
-                throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'ProcessIsoCurve'));
-            }
-            this.CLASSNAME = 'ProcessIsoCurve';
-            CommonService.apply(this, arguments);
-            if (!options.position) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'position'));
-            }
-            if (options.position.x == null) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'position.x'));
-            }
-            if (options.position.y == null) {
-                throw new Error(_.getMessage('PARAM_MISSING', 'position.y'));
-            }
-            if (!options.time && !options.distance) {
-                throw new Error('Parameter(s) \'distance\' missing. Parameter time to calculate an isochrone, parameter distance for an isodistance');
-            }
-            if (!options.time && options.distance) {
-                this.options.method = 'distance';
-                if (this.options.time) {
-                    delete this.options.time;
-                }
-            }
-            if (options.time && !options.distance) {
-                this.options.method = 'time';
-                if (this.options.distance) {
-                    delete this.options.distance;
-                }
-            }
-            this.options.method = this.options.method || 'time';
-            this.options.exclusions = options.exclusions || null;
-            this.options.graph = options.graph || 'Voiture';
-            this.options.reverse = options.reverse || false;
-            this.options.smoothing = options.smoothing || false;
-            this.options.holes = options.holes || false;
-            this.options.srs = options.srs || 'EPSG:4326';
-            this.options.outputFormat = typeof options.outputFormat == 'string' ? options.outputFormat.toLowerCase() : 'json';
-            if (!this.options.serverUrl) {
-                var lstUrlByDefault = DefaultUrlService.ProcessIsoCurve.url(this.options.apiKey);
-                var urlFound = lstUrlByDefault['iso' + '-' + this.options.outputFormat];
-                if (!urlFound) {
-                    throw new Error('Url by default not found !');
-                }
-                this.options.serverUrl = urlFound;
-            }
-            var idx = this.options.serverUrl.lastIndexOf('.');
-            if (idx !== -1) {
-                var extension = this.options.serverUrl.substring(idx + 1);
-                if (extension && extension.length < 5) {
-                    switch (extension.toLowerCase()) {
-                    case 'json':
-                    case 'xml':
-                        this.options.outputFormat = extension.toLowerCase();
-                        break;
-                    default:
-                        throw new Error('type of service : unknown or unsupported (json or xml) !');
-                    }
-                }
-            }
-        }
-        ProcessIsoCurve.prototype = Object.create(CommonService.prototype, {});
-        ProcessIsoCurve.prototype.constructor = ProcessIsoCurve;
-        ProcessIsoCurve.prototype.buildRequest = function (error, success) {
-            try {
-                var oIsoCurve = new ProcessIsoCurveRequest(this.options);
-                if (!oIsoCurve.processRequestString()) {
-                    throw new Error(_.getMessage('SERVICE_REQUEST_BUILD'));
-                }
-                this.request = oIsoCurve.requestString;
-            } catch (e) {
-                error.call(this, new ErrorService(e.message));
-                return;
-            }
-            success.call(this, this.request);
-        };
-        ProcessIsoCurve.prototype.analyzeResponse = function (onError, onSuccess) {
-            if (this.response) {
-                var options = {
-                    response: this.response,
-                    outputFormat: this.options.outputFormat,
-                    rawResponse: this.options.rawResponse,
-                    onSuccess: onSuccess,
-                    onError: onError,
-                    scope: this
-                };
-                ProcessIsoCurveResponseFactory.build(options);
-            } else {
-                onError.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY')));
-            }
-        };
-        return ProcessIsoCurve;
-    }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesDefaultUrlService, ServicesProcessIsoCurveRequestProcessIsoCurveRequest, ServicesProcessIsoCurveResponseProcessIsoCurveResponseFactory);
-    ServicesServices = function (Alti, AutoConf, Geocode, ReverseGeocode, AutoComplete, Route, ProcessIsoCurve) {
-        var Services = {
-            getConfig: function (options) {
-                var autoconfService = new AutoConf(options);
-                autoconfService.call();
-            },
-            getAltitude: function (options) {
-                var altiService = new Alti(options);
-                altiService.call();
-            },
-            geocode: function (options) {
-                var geocodeService = new Geocode(options);
-                geocodeService.call();
-            },
-            reverseGeocode: function (options) {
-                var reverseGeocodeService = new ReverseGeocode(options);
-                reverseGeocodeService.call();
-            },
-            autoComplete: function (options) {
-                var autoCompleteService = new AutoComplete(options);
-                autoCompleteService.call();
-            },
-            route: function (options) {
-                var routeService = new Route(options);
-                routeService.call();
-            },
-            isoCurve: function (options) {
-                var processIsoCurveService = new ProcessIsoCurve(options);
-                processIsoCurveService.call();
-            }
-        };
-        var point = {};
-        var circle = {};
-        var bbox = {};
-        return Services;
-    }(ServicesAltiAlti, ServicesAutoConfAutoConf, ServicesGeocodeGeocode, ServicesGeocodeReverseGeocode, ServicesAutoCompleteAutoComplete, ServicesRouteRoute, ServicesProcessIsoCurveProcessIsoCurve);
-    Gp = function (XHR, Services, AltiResponse, Elevation, AutoCompleteResponse, SuggestedLocation, GetConfigResponse, Constraint, Format, Layer, Legend, Metadata, Originator, Service, Style, Territory, Thematic, TM, TMLimit, TMS, GeocodeResponse, GeocodedLocation, DirectGeocodedLocation, ReverseGeocodedLocation, IsoCurveResponse, RouteResponse, RouteInstruction, Error, Helper) {
-        var scope = typeof window !== 'undefined' ? window : {};
-        var Gp = scope.Gp || {
-            servicesVersion: '1.0.0-beta3',
-            servicesDate: '2016-12-01',
-            extend: function (strNS, value) {
-                var parts = strNS.split('.');
-                var parent = this;
-                var pl;
-                pl = parts.length;
-                for (var i = 0; i < pl; i++) {
-                    if (typeof parent[parts[i]] === 'undefined') {
-                        parent[parts[i]] = {};
-                    }
-                    var n = pl - 1;
-                    if (i === n) {
-                        parent[parts[i]] = value;
-                    }
-                    parent = parent[parts[i]];
-                }
-                return this;
-            }
-        };
-        Gp.extend('Protocols', {});
-        Gp.extend('Protocols.XHR', XHR);
-        Gp.extend('Services', Services);
-        Gp.extend('Services.AltiResponse', AltiResponse);
-        Gp.extend('Services.Alti.Elevation', Elevation);
-        Gp.extend('Services.AutoCompleteResponse', AutoCompleteResponse);
-        Gp.extend('Services.AutoComplete.SuggestedLocation', SuggestedLocation);
-        Gp.extend('Services.GetConfigResponse', GetConfigResponse);
-        Gp.extend('Services.Config.Constraint', Constraint);
-        Gp.extend('Services.Config.Format', Format);
-        Gp.extend('Services.Config.Layer', Layer);
-        Gp.extend('Services.Config.Legend', Legend);
-        Gp.extend('Services.Config.Metadata', Metadata);
-        Gp.extend('Services.Config.Originator', Originator);
-        Gp.extend('Services.Config.Service', Service);
-        Gp.extend('Services.Config.Style', Style);
-        Gp.extend('Services.Config.Territory', Territory);
-        Gp.extend('Services.Config.Thematic', SuggestedLocation);
-        Gp.extend('Services.Config.TileMatrix', TM);
-        Gp.extend('Services.Config.TileMatrixLimit', TMLimit);
-        Gp.extend('Services.Config.TileMatrixSet', TMS);
-        Gp.extend('Services.GeocodeResponse', GeocodeResponse);
-        Gp.extend('Services.Geocode.GeocodedLocation', GeocodedLocation);
-        Gp.extend('Services.Geocode.DirectGeocodedLocation', DirectGeocodedLocation);
-        Gp.extend('Services.Geocode.ReverseGeocodedLocation', ReverseGeocodedLocation);
-        Gp.extend('Services.IsoCurveResponse', IsoCurveResponse);
-        Gp.extend('Services.RouteResponse', RouteResponse);
-        Gp.extend('Services.Route.RouteInstruction', RouteInstruction);
-        Gp.extend('Error', Error);
-        Gp.extend('Helper', Helper);
-        scope.Gp = Gp;
-        return scope.Gp;
-    }(ProtocolsXHR, ServicesServices, ServicesAltiResponseModelAltiResponse, ServicesAltiResponseModelElevation, ServicesAutoCompleteResponseModelAutoCompleteResponse, ServicesAutoCompleteResponseModelSuggestedLocation, ServicesAutoConfResponseModelAutoConfResponse, ServicesAutoConfResponseModelConstraint, ServicesAutoConfResponseModelFormat, ServicesAutoConfResponseModelLayer, ServicesAutoConfResponseModelLegend, ServicesAutoConfResponseModelMetadata, ServicesAutoConfResponseModelOriginator, ServicesAutoConfResponseModelService, ServicesAutoConfResponseModelStyle, ServicesAutoConfResponseModelTerritory, ServicesAutoConfResponseModelThematic, ServicesAutoConfResponseModelTileMatrix, ServicesAutoConfResponseModelTileMatrixLimit, ServicesAutoConfResponseModelTileMatrixSet, ServicesGeocodeResponseModelGeocodeResponse, ServicesGeocodeResponseModelGeocodedLocation, ServicesGeocodeResponseModelDirectGeocodedLocation, ServicesGeocodeResponseModelReverseGeocodedLocation, ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse, ServicesRouteResponseModelRouteResponse, ServicesRouteResponseModelRouteInstruction, ExceptionsErrorService, UtilsHelper);
-    return Gp;
-}));
-CommonUtilsAutoLoadConfig = function (Gp) {
-    (function () {
-        var scripts = document.getElementsByTagName('script');
-        var key = scripts[scripts.length - 1].getAttribute('data-key');
-        if (key) {
-            var splitKeys = key.split(/;|,|\|/);
-            if (key && splitKeys.length > 1) {
-                var keys = [];
-                for (var i = 0; i < splitKeys.length; i++) {
-                    keys.push(splitKeys[i]);
-                }
-                key = keys;
-            }
-        }
-        var url = scripts[scripts.length - 1].getAttribute('data-url');
-        var timeout = scripts[scripts.length - 1].getAttribute('data-timeout');
-        var success = function () {
-        };
-        var error = function (e) {
-            throw new Error('Configuration load failed : ' + e.message);
-        };
-        if (!key && !url) {
-            return;
-        }
-        var options = {
-            apiKey: key,
-            onSuccess: success,
-            onFailure: error
-        };
-        if (url) {
-            options.serverUrl = url;
-            options.callbackSuffix = '';
-        }
-        if (timeout) {
-            options.timeOut = timeout;
-        }
-        if (!Gp.Config) {
-            Gp.Services.getConfig(options);
-        }
-    }());
-}(gp);
-(function (window, document, undefined) {
-    L.drawVersion = '0.3.0-dev';
-    L.drawLocal = {
-        draw: {
-            toolbar: {
-                actions: {
-                    title: 'Cancel drawing',
-                    text: 'Cancel'
-                },
-                finish: {
-                    title: 'Finish drawing',
-                    text: 'Finish'
-                },
-                undo: {
-                    title: 'Delete last point drawn',
-                    text: 'Delete last point'
-                },
-                buttons: {
-                    polyline: 'Draw a polyline',
-                    polygon: 'Draw a polygon',
-                    rectangle: 'Draw a rectangle',
-                    circle: 'Draw a circle',
-                    marker: 'Draw a marker'
-                }
-            },
-            handlers: {
-                circle: {
-                    tooltip: { start: 'Click and drag to draw circle.' },
-                    radius: 'Radius'
-                },
-                marker: { tooltip: { start: 'Click map to place marker.' } },
-                polygon: {
-                    tooltip: {
-                        start: 'Click to start drawing shape.',
-                        cont: 'Click to continue drawing shape.',
-                        end: 'Click first point to close this shape.'
-                    }
-                },
-                polyline: {
-                    error: '<strong>Error:</strong> shape edges cannot cross!',
-                    tooltip: {
-                        start: 'Click to start drawing line.',
-                        cont: 'Click to continue drawing line.',
-                        end: 'Click last point to finish line.'
-                    }
-                },
-                rectangle: { tooltip: { start: 'Click and drag to draw rectangle.' } },
-                simpleshape: { tooltip: { end: 'Release mouse to finish drawing.' } }
-            }
-        },
-        edit: {
-            toolbar: {
-                actions: {
-                    save: {
-                        title: 'Save changes.',
-                        text: 'Save'
-                    },
-                    cancel: {
-                        title: 'Cancel editing, discards all changes.',
-                        text: 'Cancel'
-                    }
-                },
-                buttons: {
-                    edit: 'Edit layers.',
-                    editDisabled: 'No layers to edit.',
-                    remove: 'Delete layers.',
-                    removeDisabled: 'No layers to delete.'
-                }
-            },
-            handlers: {
-                edit: {
-                    tooltip: {
-                        text: 'Drag handles, or marker to edit feature.',
-                        subtext: 'Click cancel to undo changes.'
-                    }
-                },
-                remove: { tooltip: { text: 'Click on a feature to remove' } }
-            }
-        }
-    };
-    L.Draw = {};
-    L.Draw.Feature = L.Handler.extend({
-        includes: L.Mixin.Events,
-        initialize: function (map, options) {
-            this._map = map;
-            this._container = map._container;
-            this._overlayPane = map._panes.overlayPane;
-            this._popupPane = map._panes.popupPane;
-            if (options && options.shapeOptions) {
-                options.shapeOptions = L.Util.extend({}, this.options.shapeOptions, options.shapeOptions);
-            }
-            L.setOptions(this, options);
-        },
-        enable: function () {
-            if (this._enabled) {
-                return;
-            }
-            L.Handler.prototype.enable.call(this);
-            this.fire('enabled', { handler: this.type });
-            this._map.fire('draw:drawstart', { layerType: this.type });
-        },
-        disable: function () {
-            if (!this._enabled) {
-                return;
-            }
-            L.Handler.prototype.disable.call(this);
-            this._map.fire('draw:drawstop', { layerType: this.type });
-            this.fire('disabled', { handler: this.type });
-        },
-        addHooks: function () {
-            var map = this._map;
-            if (map) {
-                L.DomUtil.disableTextSelection();
-                map.getContainer().focus();
-                this._tooltip = new L.Tooltip(this._map);
-                L.DomEvent.on(this._container, 'keyup', this._cancelDrawing, this);
-            }
-        },
-        removeHooks: function () {
-            if (this._map) {
-                L.DomUtil.enableTextSelection();
-                this._tooltip.dispose();
-                this._tooltip = null;
-                L.DomEvent.off(this._container, 'keyup', this._cancelDrawing, this);
-            }
-        },
-        setOptions: function (options) {
-            L.setOptions(this, options);
-        },
-        _fireCreatedEvent: function (layer) {
-            this._map.fire('draw:created', {
-                layer: layer,
-                layerType: this.type
-            });
-        },
-        _cancelDrawing: function (e) {
-            if (e.keyCode === 27) {
-                this.disable();
-            }
-        }
-    });
-    L.Draw.Polyline = L.Draw.Feature.extend({
-        statics: { TYPE: 'polyline' },
-        Poly: L.Polyline,
-        options: {
-            allowIntersection: true,
-            repeatMode: false,
-            drawError: {
-                color: '#b00b00',
-                timeout: 2500
-            },
-            icon: new L.DivIcon({
-                iconSize: new L.Point(8, 8),
-                className: 'leaflet-div-icon leaflet-editing-icon'
-            }),
-            touchIcon: new L.DivIcon({
-                iconSize: new L.Point(20, 20),
-                className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
-            }),
-            guidelineDistance: 20,
-            maxGuideLineLength: 4000,
-            shapeOptions: {
-                stroke: true,
-                color: '#f06eaa',
-                weight: 4,
-                opacity: 0.5,
-                fill: false,
-                clickable: true
-            },
-            metric: true,
-            feet: true,
-            showLength: true,
-            zIndexOffset: 2000
-        },
-        initialize: function (map, options) {
-            if (L.Browser.touch) {
-                this.options.icon = this.options.touchIcon;
-            }
-            this.options.drawError.message = L.drawLocal.draw.handlers.polyline.error;
-            if (options && options.drawError) {
-                options.drawError = L.Util.extend({}, this.options.drawError, options.drawError);
-            }
-            this.type = L.Draw.Polyline.TYPE;
-            L.Draw.Feature.prototype.initialize.call(this, map, options);
-        },
-        addHooks: function () {
-            L.Draw.Feature.prototype.addHooks.call(this);
-            if (this._map) {
-                this._markers = [];
-                this._markerGroup = new L.LayerGroup();
-                this._map.addLayer(this._markerGroup);
-                this._poly = new L.Polyline([], this.options.shapeOptions);
-                this._tooltip.updateContent(this._getTooltipText());
-                if (!this._mouseMarker) {
-                    this._mouseMarker = L.marker(this._map.getCenter(), {
-                        icon: L.divIcon({
-                            className: 'leaflet-mouse-marker',
-                            iconAnchor: [
-                                20,
-                                20
-                            ],
-                            iconSize: [
-                                40,
-                                40
-                            ]
-                        }),
-                        opacity: 0,
-                        zIndexOffset: this.options.zIndexOffset
-                    });
-                }
-                this._mouseMarker.on('mousedown', this._onMouseDown, this).on('mouseout', this._onMouseOut, this).on('mouseup', this._onMouseUp, this).on('mousemove', this._onMouseMove, this).addTo(this._map);
-                this._map.on('mouseup', this._onMouseUp, this).on('mousemove', this._onMouseMove, this).on('zoomlevelschange', this._onZoomEnd, this).on('click', this._onTouch, this).on('zoomend', this._onZoomEnd, this);
-            }
-        },
-        removeHooks: function () {
-            L.Draw.Feature.prototype.removeHooks.call(this);
-            this._clearHideErrorTimeout();
-            this._cleanUpShape();
-            this._map.removeLayer(this._markerGroup);
-            delete this._markerGroup;
-            delete this._markers;
-            this._map.removeLayer(this._poly);
-            delete this._poly;
-            this._mouseMarker.off('mousedown', this._onMouseDown, this).off('mouseout', this._onMouseOut, this).off('mouseup', this._onMouseUp, this).off('mousemove', this._onMouseMove, this);
-            this._map.removeLayer(this._mouseMarker);
-            delete this._mouseMarker;
-            this._clearGuides();
-            this._map.off('mouseup', this._onMouseUp, this).off('mousemove', this._onMouseMove, this).off('mouseup', this._onMouseUp, this).off('zoomend', this._onZoomEnd, this).off('click', this._onTouch, this);
-        },
-        deleteLastVertex: function () {
-            if (this._markers.length <= 1) {
-                return;
-            }
-            var lastMarker = this._markers.pop(), poly = this._poly, latlng = this._poly.spliceLatLngs(poly.getLatLngs().length - 1, 1)[0];
-            this._markerGroup.removeLayer(lastMarker);
-            if (poly.getLatLngs().length < 2) {
-                this._map.removeLayer(poly);
-            }
-            this._vertexChanged(latlng, false);
-        },
-        addVertex: function (latlng) {
-            var markersLength = this._markers.length;
-            if (markersLength > 0 && !this.options.allowIntersection && this._poly.newLatLngIntersects(latlng)) {
-                this._showErrorTooltip();
-                return;
-            } else if (this._errorShown) {
-                this._hideErrorTooltip();
-            }
-            this._markers.push(this._createMarker(latlng));
-            this._poly.addLatLng(latlng);
-            if (this._poly.getLatLngs().length === 2) {
-                this._map.addLayer(this._poly);
-            }
-            this._vertexChanged(latlng, true);
-        },
-        completeShape: function () {
-            if (this._markers.length <= 1) {
-                return;
-            }
-            this._fireCreatedEvent();
-            this.disable();
-            if (this.options.repeatMode) {
-                this.enable();
-            }
-        },
-        _finishShape: function () {
-            var intersects = this._poly.newLatLngIntersects(this._poly.getLatLngs()[0], true);
-            if (!this.options.allowIntersection && intersects || !this._shapeIsValid()) {
-                this._showErrorTooltip();
-                return;
-            }
-            this._fireCreatedEvent();
-            this.disable();
-            if (this.options.repeatMode) {
-                this.enable();
-            }
-        },
-        _shapeIsValid: function () {
-            return true;
-        },
-        _onZoomEnd: function () {
-            this._updateGuide();
-        },
-        _onMouseMove: function (e) {
-            var newPos = this._map.mouseEventToLayerPoint(e.originalEvent);
-            var latlng = this._map.layerPointToLatLng(newPos);
-            this._currentLatLng = latlng;
-            this._updateTooltip(latlng);
-            this._updateGuide(newPos);
-            this._mouseMarker.setLatLng(latlng);
-            L.DomEvent.preventDefault(e.originalEvent);
-        },
-        _vertexChanged: function (latlng, added) {
-            this._map.fire('draw:drawvertex', { layers: this._markerGroup });
-            this._updateFinishHandler();
-            this._updateRunningMeasure(latlng, added);
-            this._clearGuides();
-            this._updateTooltip();
-        },
-        _onMouseDown: function (e) {
-            var originalEvent = e.originalEvent;
-            this._mouseDownOrigin = L.point(originalEvent.clientX, originalEvent.clientY);
-        },
-        _onMouseUp: function (e) {
-            if (this._mouseDownOrigin) {
-                var distance = L.point(e.originalEvent.clientX, e.originalEvent.clientY).distanceTo(this._mouseDownOrigin);
-                if (Math.abs(distance) < 9 * (window.devicePixelRatio || 1)) {
-                    this.addVertex(e.latlng);
-                }
-            }
-            this._mouseDownOrigin = null;
-        },
-        _onTouch: function (e) {
-            if (L.Browser.touch) {
-                this._onMouseDown(e);
-                this._onMouseUp(e);
-            }
-        },
-        _onMouseOut: function () {
-            if (this._tooltip) {
-                this._tooltip._onMouseOut.call(this._tooltip);
-            }
-        },
-        _updateFinishHandler: function () {
-            var markerCount = this._markers.length;
-            if (markerCount > 1) {
-                this._markers[markerCount - 1].on('click', this._finishShape, this);
-            }
-            if (markerCount > 2) {
-                this._markers[markerCount - 2].off('click', this._finishShape, this);
-            }
-        },
-        _createMarker: function (latlng) {
-            var marker = new L.Marker(latlng, {
-                icon: this.options.icon,
-                zIndexOffset: this.options.zIndexOffset * 2
-            });
-            this._markerGroup.addLayer(marker);
-            return marker;
-        },
-        _updateGuide: function (newPos) {
-            var markerCount = this._markers.length;
-            if (markerCount > 0) {
-                newPos = newPos || this._map.latLngToLayerPoint(this._currentLatLng);
-                this._clearGuides();
-                this._drawGuide(this._map.latLngToLayerPoint(this._markers[markerCount - 1].getLatLng()), newPos);
-            }
-        },
-        _updateTooltip: function (latLng) {
-            var text = this._getTooltipText();
-            if (latLng) {
-                this._tooltip.updatePosition(latLng);
-            }
-            if (!this._errorShown) {
-                this._tooltip.updateContent(text);
-            }
-        },
-        _drawGuide: function (pointA, pointB) {
-            var length = Math.floor(Math.sqrt(Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2))), guidelineDistance = this.options.guidelineDistance, maxGuideLineLength = this.options.maxGuideLineLength, i = length > maxGuideLineLength ? length - maxGuideLineLength : guidelineDistance, fraction, dashPoint, dash;
-            if (!this._guidesContainer) {
-                this._guidesContainer = L.DomUtil.create('div', 'leaflet-draw-guides', this._overlayPane);
-            }
-            for (; i < length; i += this.options.guidelineDistance) {
-                fraction = i / length;
-                dashPoint = {
-                    x: Math.floor(pointA.x * (1 - fraction) + fraction * pointB.x),
-                    y: Math.floor(pointA.y * (1 - fraction) + fraction * pointB.y)
-                };
-                dash = L.DomUtil.create('div', 'leaflet-draw-guide-dash', this._guidesContainer);
-                dash.style.backgroundColor = !this._errorShown ? this.options.shapeOptions.color : this.options.drawError.color;
-                L.DomUtil.setPosition(dash, dashPoint);
-            }
-        },
-        _updateGuideColor: function (color) {
-            if (this._guidesContainer) {
-                for (var i = 0, l = this._guidesContainer.childNodes.length; i < l; i++) {
-                    this._guidesContainer.childNodes[i].style.backgroundColor = color;
-                }
-            }
-        },
-        _clearGuides: function () {
-            if (this._guidesContainer) {
-                while (this._guidesContainer.firstChild) {
-                    this._guidesContainer.removeChild(this._guidesContainer.firstChild);
-                }
-            }
-        },
-        _getTooltipText: function () {
-            var showLength = this.options.showLength, labelText, distanceStr;
-            if (this._markers.length === 0) {
-                labelText = { text: L.drawLocal.draw.handlers.polyline.tooltip.start };
-            } else {
-                distanceStr = showLength ? this._getMeasurementString() : '';
-                if (this._markers.length === 1) {
-                    labelText = {
-                        text: L.drawLocal.draw.handlers.polyline.tooltip.cont,
-                        subtext: distanceStr
-                    };
-                } else {
-                    labelText = {
-                        text: L.drawLocal.draw.handlers.polyline.tooltip.end,
-                        subtext: distanceStr
-                    };
-                }
-            }
-            return labelText;
-        },
-        _updateRunningMeasure: function (latlng, added) {
-            var markersLength = this._markers.length, previousMarkerIndex, distance;
-            if (this._markers.length === 1) {
-                this._measurementRunningTotal = 0;
-            } else {
-                previousMarkerIndex = markersLength - (added ? 2 : 1);
-                distance = latlng.distanceTo(this._markers[previousMarkerIndex].getLatLng());
-                this._measurementRunningTotal += distance * (added ? 1 : -1);
-            }
-        },
-        _getMeasurementString: function () {
-            var currentLatLng = this._currentLatLng, previousLatLng = this._markers[this._markers.length - 1].getLatLng(), distance;
-            distance = this._measurementRunningTotal + currentLatLng.distanceTo(previousLatLng);
-            return L.GeometryUtil.readableDistance(distance, this.options.metric, this.options.feet);
-        },
-        _showErrorTooltip: function () {
-            this._errorShown = true;
-            this._tooltip.showAsError().updateContent({ text: this.options.drawError.message });
-            this._updateGuideColor(this.options.drawError.color);
-            this._poly.setStyle({ color: this.options.drawError.color });
-            this._clearHideErrorTimeout();
-            this._hideErrorTimeout = setTimeout(L.Util.bind(this._hideErrorTooltip, this), this.options.drawError.timeout);
-        },
-        _hideErrorTooltip: function () {
-            this._errorShown = false;
-            this._clearHideErrorTimeout();
-            this._tooltip.removeError().updateContent(this._getTooltipText());
-            this._updateGuideColor(this.options.shapeOptions.color);
-            this._poly.setStyle({ color: this.options.shapeOptions.color });
-        },
-        _clearHideErrorTimeout: function () {
-            if (this._hideErrorTimeout) {
-                clearTimeout(this._hideErrorTimeout);
-                this._hideErrorTimeout = null;
-            }
-        },
-        _cleanUpShape: function () {
-            if (this._markers.length > 1) {
-                this._markers[this._markers.length - 1].off('click', this._finishShape, this);
-            }
-        },
-        _fireCreatedEvent: function () {
-            var poly = new this.Poly(this._poly.getLatLngs(), this.options.shapeOptions);
-            L.Draw.Feature.prototype._fireCreatedEvent.call(this, poly);
-        }
-    });
-    L.Draw.Polygon = L.Draw.Polyline.extend({
-        statics: { TYPE: 'polygon' },
-        Poly: L.Polygon,
-        options: {
-            showArea: false,
-            shapeOptions: {
-                stroke: true,
-                color: '#f06eaa',
-                weight: 4,
-                opacity: 0.5,
-                fill: true,
-                fillColor: null,
-                fillOpacity: 0.2,
-                clickable: true
-            }
-        },
-        initialize: function (map, options) {
-            L.Draw.Polyline.prototype.initialize.call(this, map, options);
-            this.type = L.Draw.Polygon.TYPE;
-        },
-        _updateFinishHandler: function () {
-            var markerCount = this._markers.length;
-            if (markerCount === 1) {
-                this._markers[0].on('click', this._finishShape, this);
-            }
-            if (markerCount > 2) {
-                this._markers[markerCount - 1].on('dblclick', this._finishShape, this);
-                if (markerCount > 3) {
-                    this._markers[markerCount - 2].off('dblclick', this._finishShape, this);
-                }
-            }
-        },
-        _getTooltipText: function () {
-            var text, subtext;
-            if (this._markers.length === 0) {
-                text = L.drawLocal.draw.handlers.polygon.tooltip.start;
-            } else if (this._markers.length < 3) {
-                text = L.drawLocal.draw.handlers.polygon.tooltip.cont;
-            } else {
-                text = L.drawLocal.draw.handlers.polygon.tooltip.end;
-                subtext = this._getMeasurementString();
-            }
-            return {
-                text: text,
-                subtext: subtext
-            };
-        },
-        _getMeasurementString: function () {
-            var area = this._area;
-            if (!area) {
-                return null;
-            }
-            return L.GeometryUtil.readableArea(area, this.options.metric);
-        },
-        _shapeIsValid: function () {
-            return this._markers.length >= 3;
-        },
-        _vertexChanged: function (latlng, added) {
-            var latLngs;
-            if (!this.options.allowIntersection && this.options.showArea) {
-                latLngs = this._poly.getLatLngs();
-                this._area = L.GeometryUtil.geodesicArea(latLngs);
-            }
-            L.Draw.Polyline.prototype._vertexChanged.call(this, latlng, added);
-        },
-        _cleanUpShape: function () {
-            var markerCount = this._markers.length;
-            if (markerCount > 0) {
-                this._markers[0].off('click', this._finishShape, this);
-                if (markerCount > 2) {
-                    this._markers[markerCount - 1].off('dblclick', this._finishShape, this);
-                }
-            }
-        }
-    });
-    L.SimpleShape = {};
-    L.Draw.SimpleShape = L.Draw.Feature.extend({
-        options: { repeatMode: false },
-        initialize: function (map, options) {
-            this._endLabelText = L.drawLocal.draw.handlers.simpleshape.tooltip.end;
-            L.Draw.Feature.prototype.initialize.call(this, map, options);
-        },
-        addHooks: function () {
-            L.Draw.Feature.prototype.addHooks.call(this);
-            if (this._map) {
-                this._mapDraggable = this._map.dragging.enabled();
-                if (this._mapDraggable) {
-                    this._map.dragging.disable();
-                }
-                this._container.style.cursor = 'crosshair';
-                this._tooltip.updateContent({ text: this._initialLabelText });
-                this._map.on('mousedown', this._onMouseDown, this).on('mousemove', this._onMouseMove, this).on('touchstart', this._onMouseDown, this).on('touchmove', this._onMouseMove, this);
-            }
-        },
-        removeHooks: function () {
-            L.Draw.Feature.prototype.removeHooks.call(this);
-            if (this._map) {
-                if (this._mapDraggable) {
-                    this._map.dragging.enable();
-                }
-                this._container.style.cursor = '';
-                this._map.off('mousedown', this._onMouseDown, this).off('mousemove', this._onMouseMove, this).off('touchstart', this._onMouseDown, this).off('touchmove', this._onMouseMove, this);
-                L.DomEvent.off(document, 'mouseup', this._onMouseUp, this);
-                L.DomEvent.off(document, 'touchend', this._onMouseUp, this);
-                if (this._shape) {
-                    this._map.removeLayer(this._shape);
-                    delete this._shape;
-                }
-            }
-            this._isDrawing = false;
-        },
-        _getTooltipText: function () {
-            return { text: this._endLabelText };
-        },
-        _onMouseDown: function (e) {
-            this._isDrawing = true;
-            this._startLatLng = e.latlng;
-            L.DomEvent.on(document, 'mouseup', this._onMouseUp, this).on(document, 'touchend', this._onMouseUp, this).preventDefault(e.originalEvent);
-        },
-        _onMouseMove: function (e) {
-            var latlng = e.latlng;
-            this._tooltip.updatePosition(latlng);
-            if (this._isDrawing) {
-                this._tooltip.updateContent(this._getTooltipText());
-                this._drawShape(latlng);
-            }
-        },
-        _onMouseUp: function () {
-            if (this._shape) {
-                this._fireCreatedEvent();
-            }
-            this.disable();
-            if (this.options.repeatMode) {
-                this.enable();
-            }
-        }
-    });
-    L.Draw.Rectangle = L.Draw.SimpleShape.extend({
-        statics: { TYPE: 'rectangle' },
-        options: {
-            shapeOptions: {
-                stroke: true,
-                color: '#f06eaa',
-                weight: 4,
-                opacity: 0.5,
-                fill: true,
-                fillColor: null,
-                fillOpacity: 0.2,
-                clickable: true
-            },
-            metric: true
-        },
-        initialize: function (map, options) {
-            this.type = L.Draw.Rectangle.TYPE;
-            this._initialLabelText = L.drawLocal.draw.handlers.rectangle.tooltip.start;
-            L.Draw.SimpleShape.prototype.initialize.call(this, map, options);
-        },
-        _drawShape: function (latlng) {
-            if (!this._shape) {
-                this._shape = new L.Rectangle(new L.LatLngBounds(this._startLatLng, latlng), this.options.shapeOptions);
-                this._map.addLayer(this._shape);
-            } else {
-                this._shape.setBounds(new L.LatLngBounds(this._startLatLng, latlng));
-            }
-        },
-        _fireCreatedEvent: function () {
-            var rectangle = new L.Rectangle(this._shape.getBounds(), this.options.shapeOptions);
-            L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, rectangle);
-        },
-        _getTooltipText: function () {
-            var tooltipText = L.Draw.SimpleShape.prototype._getTooltipText.call(this), shape = this._shape, latLngs, area, subtext;
-            if (shape) {
-                latLngs = this._shape.getLatLngs();
-                area = L.GeometryUtil.geodesicArea(latLngs);
-                subtext = L.GeometryUtil.readableArea(area, this.options.metric);
-            }
-            return {
-                text: tooltipText.text,
-                subtext: subtext
-            };
-        }
-    });
-    L.Draw.Circle = L.Draw.SimpleShape.extend({
-        statics: { TYPE: 'circle' },
-        options: {
-            shapeOptions: {
-                stroke: true,
-                color: '#f06eaa',
-                weight: 4,
-                opacity: 0.5,
-                fill: true,
-                fillColor: null,
-                fillOpacity: 0.2,
-                clickable: true
-            },
-            showRadius: true,
-            metric: true,
-            feet: true
-        },
-        initialize: function (map, options) {
-            this.type = L.Draw.Circle.TYPE;
-            this._initialLabelText = L.drawLocal.draw.handlers.circle.tooltip.start;
-            L.Draw.SimpleShape.prototype.initialize.call(this, map, options);
-        },
-        _drawShape: function (latlng) {
-            if (!this._shape) {
-                this._shape = new L.Circle(this._startLatLng, this._startLatLng.distanceTo(latlng), this.options.shapeOptions);
-                this._map.addLayer(this._shape);
-            } else {
-                this._shape.setRadius(this._startLatLng.distanceTo(latlng));
-            }
-        },
-        _fireCreatedEvent: function () {
-            var circle = new L.Circle(this._startLatLng, this._shape.getRadius(), this.options.shapeOptions);
-            L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, circle);
-        },
-        _onMouseMove: function (e) {
-            var latlng = e.latlng, showRadius = this.options.showRadius, useMetric = this.options.metric, radius;
-            this._tooltip.updatePosition(latlng);
-            if (this._isDrawing) {
-                this._drawShape(latlng);
-                radius = this._shape.getRadius().toFixed(1);
-                this._tooltip.updateContent({
-                    text: this._endLabelText,
-                    subtext: showRadius ? L.drawLocal.draw.handlers.circle.radius + ': ' + L.GeometryUtil.readableDistance(radius, useMetric, this.options.feet) : ''
-                });
-            }
-        }
-    });
-    L.Draw.Marker = L.Draw.Feature.extend({
-        statics: { TYPE: 'marker' },
-        options: {
-            icon: new L.Icon.Default(),
-            repeatMode: false,
-            zIndexOffset: 2000
-        },
-        initialize: function (map, options) {
-            this.type = L.Draw.Marker.TYPE;
-            L.Draw.Feature.prototype.initialize.call(this, map, options);
-        },
-        addHooks: function () {
-            L.Draw.Feature.prototype.addHooks.call(this);
-            if (this._map) {
-                this._tooltip.updateContent({ text: L.drawLocal.draw.handlers.marker.tooltip.start });
-                if (!this._mouseMarker) {
-                    this._mouseMarker = L.marker(this._map.getCenter(), {
-                        icon: L.divIcon({
-                            className: 'leaflet-mouse-marker',
-                            iconAnchor: [
-                                20,
-                                20
-                            ],
-                            iconSize: [
-                                40,
-                                40
-                            ]
-                        }),
-                        opacity: 0,
-                        zIndexOffset: this.options.zIndexOffset
-                    });
-                }
-                this._mouseMarker.on('click', this._onClick, this).addTo(this._map);
-                this._map.on('mousemove', this._onMouseMove, this);
-                this._map.on('click', this._onTouch, this);
-            }
-        },
-        removeHooks: function () {
-            L.Draw.Feature.prototype.removeHooks.call(this);
-            if (this._map) {
-                if (this._marker) {
-                    this._marker.off('click', this._onClick, this);
-                    this._map.off('click', this._onClick, this).off('click', this._onTouch, this).removeLayer(this._marker);
-                    delete this._marker;
-                }
-                this._mouseMarker.off('click', this._onClick, this);
-                this._map.removeLayer(this._mouseMarker);
-                delete this._mouseMarker;
-                this._map.off('mousemove', this._onMouseMove, this);
-            }
-        },
-        _onMouseMove: function (e) {
-            var latlng = e.latlng;
-            this._tooltip.updatePosition(latlng);
-            this._mouseMarker.setLatLng(latlng);
-            if (!this._marker) {
-                this._marker = new L.Marker(latlng, {
-                    icon: this.options.icon,
-                    zIndexOffset: this.options.zIndexOffset
-                });
-                this._marker.on('click', this._onClick, this);
-                this._map.on('click', this._onClick, this).addLayer(this._marker);
-            } else {
-                latlng = this._mouseMarker.getLatLng();
-                this._marker.setLatLng(latlng);
-            }
-        },
-        _onClick: function () {
-            this._fireCreatedEvent();
-            this.disable();
-            if (this.options.repeatMode) {
-                this.enable();
-            }
-        },
-        _onTouch: function (e) {
-            this._onMouseMove(e);
-            this._onClick();
-        },
-        _fireCreatedEvent: function () {
-            var marker = new L.Marker.Touch(this._marker.getLatLng(), { icon: this.options.icon });
-            L.Draw.Feature.prototype._fireCreatedEvent.call(this, marker);
-        }
-    });
-    L.Edit = L.Edit || {};
-    L.Edit.Marker = L.Handler.extend({
-        initialize: function (marker, options) {
-            this._marker = marker;
-            L.setOptions(this, options);
-        },
-        addHooks: function () {
-            var marker = this._marker;
-            marker.dragging.enable();
-            marker.on('dragend', this._onDragEnd, marker);
-            this._toggleMarkerHighlight();
-        },
-        removeHooks: function () {
-            var marker = this._marker;
-            marker.dragging.disable();
-            marker.off('dragend', this._onDragEnd, marker);
-            this._toggleMarkerHighlight();
-        },
-        _onDragEnd: function (e) {
-            var layer = e.target;
-            layer.edited = true;
-        },
-        _toggleMarkerHighlight: function () {
-            var icon = this._marker._icon;
-            if (!icon) {
-                return;
-            }
-            icon.style.display = 'none';
-            if (L.DomUtil.hasClass(icon, 'leaflet-edit-marker-selected')) {
-                L.DomUtil.removeClass(icon, 'leaflet-edit-marker-selected');
-                this._offsetMarker(icon, -4);
-            } else {
-                L.DomUtil.addClass(icon, 'leaflet-edit-marker-selected');
-                this._offsetMarker(icon, 4);
-            }
-            icon.style.display = '';
-        },
-        _offsetMarker: function (icon, offset) {
-            var iconMarginTop = parseInt(icon.style.marginTop, 10) - offset, iconMarginLeft = parseInt(icon.style.marginLeft, 10) - offset;
-            icon.style.marginTop = iconMarginTop + 'px';
-            icon.style.marginLeft = iconMarginLeft + 'px';
-        }
-    });
-    L.Marker.addInitHook(function () {
-        if (L.Edit.Marker) {
-            this.editing = new L.Edit.Marker(this);
-            if (this.options.editable) {
-                this.editing.enable();
-            }
-        }
-    });
-    L.Edit = L.Edit || {};
-    L.Edit.Poly = L.Handler.extend({
-        options: {},
-        initialize: function (poly, options) {
-            this.latlngs = [poly._latlngs];
-            if (poly._holes) {
-                this.latlngs = this.latlngs.concat(poly._holes);
-            }
-            this._verticesHandlers = [];
-            for (var i = 0; i < this.latlngs.length; i++) {
-                this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(poly, this.latlngs[i], options));
-            }
-            this._poly = poly;
-            L.setOptions(this, options);
-        },
-        _eachVertexHandler: function (callback) {
-            for (var i = 0; i < this._verticesHandlers.length; i++) {
-                callback(this._verticesHandlers[i]);
-            }
-        },
-        addHooks: function () {
-            this._eachVertexHandler(function (handler) {
-                handler.addHooks();
-            });
-        },
-        removeHooks: function () {
-            this._eachVertexHandler(function (handler) {
-                handler.removeHooks();
-            });
-        },
-        updateMarkers: function () {
-            this._eachVertexHandler(function (handler) {
-                handler.updateMarkers();
-            });
-        }
-    });
-    L.Edit.PolyVerticesEdit = L.Handler.extend({
-        options: {
-            icon: new L.DivIcon({
-                iconSize: new L.Point(8, 8),
-                className: 'leaflet-div-icon leaflet-editing-icon'
-            }),
-            touchIcon: new L.DivIcon({
-                iconSize: new L.Point(20, 20),
-                className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon'
-            })
-        },
-        initialize: function (poly, latlngs, options) {
-            if (L.Browser.touch) {
-                this.options.icon = this.options.touchIcon;
-            }
-            this._poly = poly;
-            this._latlngs = latlngs;
-            L.setOptions(this, options);
-        },
-        addHooks: function () {
-            var poly = this._poly;
-            if (!(poly instanceof L.Polygon)) {
-                poly.options.editing.fill = false;
-            }
-            poly.setStyle(poly.options.editing);
-            if (this._poly._map) {
-                this._map = this._poly._map;
-                if (!this._markerGroup) {
-                    this._initMarkers();
-                }
-                this._poly._map.addLayer(this._markerGroup);
-            }
-        },
-        removeHooks: function () {
-            var poly = this._poly;
-            poly.setStyle(poly.options.original);
-            if (poly._map) {
-                poly._map.removeLayer(this._markerGroup);
-                delete this._markerGroup;
-                delete this._markers;
-            }
-        },
-        updateMarkers: function () {
-            this._markerGroup.clearLayers();
-            this._initMarkers();
-        },
-        _initMarkers: function () {
-            if (!this._markerGroup) {
-                this._markerGroup = new L.LayerGroup();
-            }
-            this._markers = [];
-            var latlngs = this._latlngs, i, j, len, marker;
-            for (i = 0, len = latlngs.length; i < len; i++) {
-                marker = this._createMarker(latlngs[i], i);
-                marker.on('click', this._onMarkerClick, this);
-                this._markers.push(marker);
-            }
-            var markerLeft, markerRight;
-            for (i = 0, j = len - 1; i < len; j = i++) {
-                if (i === 0 && !(L.Polygon && this._poly instanceof L.Polygon)) {
-                    continue;
-                }
-                markerLeft = this._markers[j];
-                markerRight = this._markers[i];
-                this._createMiddleMarker(markerLeft, markerRight);
-                this._updatePrevNext(markerLeft, markerRight);
-            }
-        },
-        _createMarker: function (latlng, index) {
-            var marker = new L.Marker.Touch(latlng, {
-                draggable: true,
-                icon: this.options.icon
-            });
-            marker._origLatLng = latlng;
-            marker._index = index;
-            marker.on('dragstart', this._onMarkerDragStart, this).on('drag', this._onMarkerDrag, this).on('dragend', this._fireEdit, this).on('touchmove', this._onTouchMove, this).on('MSPointerMove', this._onTouchMove, this).on('touchend', this._fireEdit, this).on('MSPointerUp', this._fireEdit, this);
-            this._markerGroup.addLayer(marker);
-            return marker;
-        },
-        _onMarkerDragStart: function () {
-            this._poly.fire('editstart');
-        },
-        _spliceLatLngs: function () {
-            var removed = [].splice.apply(this._latlngs, arguments);
-            this._poly._convertLatLngs(this._latlngs, true);
-            this._poly.redraw();
-            return removed;
-        },
-        _removeMarker: function (marker) {
-            var i = marker._index;
-            this._markerGroup.removeLayer(marker);
-            this._markers.splice(i, 1);
-            this._spliceLatLngs(i, 1);
-            this._updateIndexes(i, -1);
-            marker.off('dragstart', this._onMarkerDragStart, this).off('drag', this._onMarkerDrag, this).off('dragend', this._fireEdit, this).off('touchmove', this._onMarkerDrag, this).off('touchend', this._fireEdit, this).off('click', this._onMarkerClick, this);
-        },
-        _fireEdit: function () {
-            this._poly.edited = true;
-            this._poly.fire('edit');
-            this._poly._map.fire('draw:editvertex', { layers: this._markerGroup });
-        },
-        _onMarkerDrag: function (e) {
-            var marker = e.target;
-            L.extend(marker._origLatLng, marker._latlng);
-            if (marker._middleLeft) {
-                marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
-            }
-            if (marker._middleRight) {
-                marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
-            }
-            this._poly.redraw();
-            this._poly.fire('editdrag');
-        },
-        _onMarkerClick: function (e) {
-            var minPoints = L.Polygon && this._poly instanceof L.Polygon ? 4 : 3, marker = e.target;
-            if (this._latlngs.length < minPoints) {
-                return;
-            }
-            this._removeMarker(marker);
-            this._updatePrevNext(marker._prev, marker._next);
-            if (marker._middleLeft) {
-                this._markerGroup.removeLayer(marker._middleLeft);
-            }
-            if (marker._middleRight) {
-                this._markerGroup.removeLayer(marker._middleRight);
-            }
-            if (marker._prev && marker._next) {
-                this._createMiddleMarker(marker._prev, marker._next);
-            } else if (!marker._prev) {
-                marker._next._middleLeft = null;
-            } else if (!marker._next) {
-                marker._prev._middleRight = null;
-            }
-            this._fireEdit();
-        },
-        _onTouchMove: function (e) {
-            var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]), latlng = this._map.layerPointToLatLng(layerPoint), marker = e.target;
-            L.extend(marker._origLatLng, latlng);
-            if (marker._middleLeft) {
-                marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker));
-            }
-            if (marker._middleRight) {
-                marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next));
-            }
-            this._poly.redraw();
-            this.updateMarkers();
-        },
-        _updateIndexes: function (index, delta) {
-            this._markerGroup.eachLayer(function (marker) {
-                if (marker._index > index) {
-                    marker._index += delta;
-                }
-            });
-        },
-        _createMiddleMarker: function (marker1, marker2) {
-            var latlng = this._getMiddleLatLng(marker1, marker2), marker = this._createMarker(latlng), onClick, onDragStart, onDragEnd;
-            marker.setOpacity(0.6);
-            marker1._middleRight = marker2._middleLeft = marker;
-            onDragStart = function () {
-                var i = marker2._index;
-                marker._index = i;
-                marker.off('click', onClick, this).on('click', this._onMarkerClick, this);
-                latlng.lat = marker.getLatLng().lat;
-                latlng.lng = marker.getLatLng().lng;
-                this._spliceLatLngs(i, 0, latlng);
-                this._markers.splice(i, 0, marker);
-                marker.setOpacity(1);
-                this._updateIndexes(i, 1);
-                marker2._index++;
-                this._updatePrevNext(marker1, marker);
-                this._updatePrevNext(marker, marker2);
-                this._poly.fire('editstart');
-            };
-            onDragEnd = function () {
-                marker.off('dragstart', onDragStart, this);
-                marker.off('dragend', onDragEnd, this);
-                marker.off('touchmove', onDragStart, this);
-                this._createMiddleMarker(marker1, marker);
-                this._createMiddleMarker(marker, marker2);
-            };
-            onClick = function () {
-                onDragStart.call(this);
-                onDragEnd.call(this);
-                this._fireEdit();
-            };
-            marker.on('click', onClick, this).on('dragstart', onDragStart, this).on('dragend', onDragEnd, this).on('touchmove', onDragStart, this);
-            this._markerGroup.addLayer(marker);
-        },
-        _updatePrevNext: function (marker1, marker2) {
-            if (marker1) {
-                marker1._next = marker2;
-            }
-            if (marker2) {
-                marker2._prev = marker1;
-            }
-        },
-        _getMiddleLatLng: function (marker1, marker2) {
-            var map = this._poly._map, p1 = map.project(marker1.getLatLng()), p2 = map.project(marker2.getLatLng());
-            return map.unproject(p1._add(p2)._divideBy(2));
-        }
-    });
-    L.Polyline.addInitHook(function () {
-        if (this.editing) {
-            return;
-        }
-        if (L.Edit.Poly) {
-            this.editing = new L.Edit.Poly(this);
-            if (this.options.editable) {
-                this.editing.enable();
-            }
-        }
-        this.on('add', function () {
-            if (this.editing && this.editing.enabled()) {
-                this.editing.addHooks();
-            }
-        });
-        this.on('remove', function () {
-            if (this.editing && this.editing.enabled()) {
-                this.editing.removeHooks();
-            }
-        });
-    });
-    L.Edit = L.Edit || {};
-    L.Edit.SimpleShape = L.Handler.extend({
-        options: {
-            moveIcon: new L.DivIcon({
-                iconSize: new L.Point(8, 8),
-                className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move'
-            }),
-            resizeIcon: new L.DivIcon({
-                iconSize: new L.Point(8, 8),
-                className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize'
-            }),
-            touchMoveIcon: new L.DivIcon({
-                iconSize: new L.Point(20, 20),
-                className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon'
-            }),
-            touchResizeIcon: new L.DivIcon({
-                iconSize: new L.Point(20, 20),
-                className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon'
-            })
-        },
-        initialize: function (shape, options) {
-            if (L.Browser.touch) {
-                this.options.moveIcon = this.options.touchMoveIcon;
-                this.options.resizeIcon = this.options.touchResizeIcon;
-            }
-            this._shape = shape;
-            L.Util.setOptions(this, options);
-        },
-        addHooks: function () {
-            var shape = this._shape;
-            if (this._shape._map) {
-                this._map = this._shape._map;
-                shape.setStyle(shape.options.editing);
-                if (shape._map) {
-                    this._map = shape._map;
-                    if (!this._markerGroup) {
-                        this._initMarkers();
-                    }
-                    this._map.addLayer(this._markerGroup);
-                }
-            }
-        },
-        removeHooks: function () {
-            var shape = this._shape;
-            shape.setStyle(shape.options.original);
-            if (shape._map) {
-                this._unbindMarker(this._moveMarker);
-                for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
-                    this._unbindMarker(this._resizeMarkers[i]);
-                }
-                this._resizeMarkers = null;
-                this._map.removeLayer(this._markerGroup);
-                delete this._markerGroup;
-            }
-            this._map = null;
-        },
-        updateMarkers: function () {
-            this._markerGroup.clearLayers();
-            this._initMarkers();
-        },
-        _initMarkers: function () {
-            if (!this._markerGroup) {
-                this._markerGroup = new L.LayerGroup();
-            }
-            this._createMoveMarker();
-            this._createResizeMarker();
-        },
-        _createMoveMarker: function () {
-        },
-        _createResizeMarker: function () {
-        },
-        _createMarker: function (latlng, icon) {
-            var marker = new L.Marker.Touch(latlng, {
-                draggable: true,
-                icon: icon,
-                zIndexOffset: 10
-            });
-            this._bindMarker(marker);
-            this._markerGroup.addLayer(marker);
-            return marker;
-        },
-        _bindMarker: function (marker) {
-            marker.on('dragstart', this._onMarkerDragStart, this).on('drag', this._onMarkerDrag, this).on('dragend', this._onMarkerDragEnd, this).on('touchstart', this._onTouchStart, this).on('touchmove', this._onTouchMove, this).on('MSPointerMove', this._onTouchMove, this).on('touchend', this._onTouchEnd, this).on('MSPointerUp', this._onTouchEnd, this);
-        },
-        _unbindMarker: function (marker) {
-            marker.off('dragstart', this._onMarkerDragStart, this).off('drag', this._onMarkerDrag, this).off('dragend', this._onMarkerDragEnd, this).off('touchstart', this._onTouchStart, this).off('touchmove', this._onTouchMove, this).off('MSPointerMove', this._onTouchMove, this).off('touchend', this._onTouchEnd, this).off('MSPointerUp', this._onTouchEnd, this);
-        },
-        _onMarkerDragStart: function (e) {
-            var marker = e.target;
-            marker.setOpacity(0);
-            this._shape.fire('editstart');
-        },
-        _fireEdit: function () {
-            this._shape.edited = true;
-            this._shape.fire('edit');
-        },
-        _onMarkerDrag: function (e) {
-            var marker = e.target, latlng = marker.getLatLng();
-            if (marker === this._moveMarker) {
-                this._move(latlng);
-            } else {
-                this._resize(latlng);
-            }
-            this._shape.redraw();
-            this._shape.fire('editdrag');
-        },
-        _onMarkerDragEnd: function (e) {
-            var marker = e.target;
-            marker.setOpacity(1);
-            this._fireEdit();
-        },
-        _onTouchStart: function (e) {
-            L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e);
-            if (typeof this._getCorners === 'function') {
-                var corners = this._getCorners(), marker = e.target, currentCornerIndex = marker._cornerIndex;
-                marker.setOpacity(0);
-                this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];
-                this._toggleCornerMarkers(0, currentCornerIndex);
-            }
-            this._shape.fire('editstart');
-        },
-        _onTouchMove: function (e) {
-            var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]), latlng = this._map.layerPointToLatLng(layerPoint), marker = e.target;
-            if (marker === this._moveMarker) {
-                this._move(latlng);
-            } else {
-                this._resize(latlng);
-            }
-            this._shape.redraw();
-            return false;
-        },
-        _onTouchEnd: function (e) {
-            var marker = e.target;
-            marker.setOpacity(1);
-            this.updateMarkers();
-            this._fireEdit();
-        },
-        _move: function () {
-        },
-        _resize: function () {
-        }
-    });
-    L.Edit = L.Edit || {};
-    L.Edit.Rectangle = L.Edit.SimpleShape.extend({
-        _createMoveMarker: function () {
-            var bounds = this._shape.getBounds(), center = bounds.getCenter();
-            this._moveMarker = this._createMarker(center, this.options.moveIcon);
-        },
-        _createResizeMarker: function () {
-            var corners = this._getCorners();
-            this._resizeMarkers = [];
-            for (var i = 0, l = corners.length; i < l; i++) {
-                this._resizeMarkers.push(this._createMarker(corners[i], this.options.resizeIcon));
-                this._resizeMarkers[i]._cornerIndex = i;
-            }
-        },
-        _onMarkerDragStart: function (e) {
-            L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e);
-            var corners = this._getCorners(), marker = e.target, currentCornerIndex = marker._cornerIndex;
-            this._oppositeCorner = corners[(currentCornerIndex + 2) % 4];
-            this._toggleCornerMarkers(0, currentCornerIndex);
-        },
-        _onMarkerDragEnd: function (e) {
-            var marker = e.target, bounds, center;
-            if (marker === this._moveMarker) {
-                bounds = this._shape.getBounds();
-                center = bounds.getCenter();
-                marker.setLatLng(center);
-            }
-            this._toggleCornerMarkers(1);
-            this._repositionCornerMarkers();
-            L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this, e);
-        },
-        _move: function (newCenter) {
-            var latlngs = this._shape.getLatLngs(), bounds = this._shape.getBounds(), center = bounds.getCenter(), offset, newLatLngs = [];
-            for (var i = 0, l = latlngs.length; i < l; i++) {
-                offset = [
-                    latlngs[i].lat - center.lat,
-                    latlngs[i].lng - center.lng
-                ];
-                newLatLngs.push([
-                    newCenter.lat + offset[0],
-                    newCenter.lng + offset[1]
-                ]);
-            }
-            this._shape.setLatLngs(newLatLngs);
-            this._repositionCornerMarkers();
-        },
-        _resize: function (latlng) {
-            var bounds;
-            this._shape.setBounds(L.latLngBounds(latlng, this._oppositeCorner));
-            bounds = this._shape.getBounds();
-            this._moveMarker.setLatLng(bounds.getCenter());
-        },
-        _getCorners: function () {
-            var bounds = this._shape.getBounds(), nw = bounds.getNorthWest(), ne = bounds.getNorthEast(), se = bounds.getSouthEast(), sw = bounds.getSouthWest();
-            return [
-                nw,
-                ne,
-                se,
-                sw
-            ];
-        },
-        _toggleCornerMarkers: function (opacity) {
-            for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
-                this._resizeMarkers[i].setOpacity(opacity);
-            }
-        },
-        _repositionCornerMarkers: function () {
-            var corners = this._getCorners();
-            for (var i = 0, l = this._resizeMarkers.length; i < l; i++) {
-                this._resizeMarkers[i].setLatLng(corners[i]);
-            }
-        }
-    });
-    L.Rectangle.addInitHook(function () {
-        if (L.Edit.Rectangle) {
-            this.editing = new L.Edit.Rectangle(this);
-            if (this.options.editable) {
-                this.editing.enable();
-            }
-        }
-    });
-    L.Edit = L.Edit || {};
-    L.Edit.Circle = L.Edit.SimpleShape.extend({
-        _createMoveMarker: function () {
-            var center = this._shape.getLatLng();
-            this._moveMarker = this._createMarker(center, this.options.moveIcon);
-        },
-        _createResizeMarker: function () {
-            var center = this._shape.getLatLng(), resizemarkerPoint = this._getResizeMarkerPoint(center);
-            this._resizeMarkers = [];
-            this._resizeMarkers.push(this._createMarker(resizemarkerPoint, this.options.resizeIcon));
-        },
-        _getResizeMarkerPoint: function (latlng) {
-            var delta = this._shape._radius * Math.cos(Math.PI / 4), point = this._map.project(latlng);
-            return this._map.unproject([
-                point.x + delta,
-                point.y - delta
-            ]);
-        },
-        _move: function (latlng) {
-            var resizemarkerPoint = this._getResizeMarkerPoint(latlng);
-            this._resizeMarkers[0].setLatLng(resizemarkerPoint);
-            this._shape.setLatLng(latlng);
-        },
-        _resize: function (latlng) {
-            var moveLatLng = this._moveMarker.getLatLng(), radius = moveLatLng.distanceTo(latlng);
-            this._shape.setRadius(radius);
-        }
-    });
-    L.Circle.addInitHook(function () {
-        if (L.Edit.Circle) {
-            this.editing = new L.Edit.Circle(this);
-            if (this.options.editable) {
-                this.editing.enable();
-            }
-        }
-        this.on('add', function () {
-            if (this.editing && this.editing.enabled()) {
-                this.editing.addHooks();
-            }
-        });
-        this.on('remove', function () {
-            if (this.editing && this.editing.enabled()) {
-                this.editing.removeHooks();
-            }
-        });
-    });
-    L.Map.mergeOptions({ touchExtend: true });
-    L.Map.TouchExtend = L.Handler.extend({
-        initialize: function (map) {
-            this._map = map;
-            this._container = map._container;
-            this._pane = map._panes.overlayPane;
-        },
-        addHooks: function () {
-            L.DomEvent.on(this._container, 'touchstart', this._onTouchStart, this);
-            L.DomEvent.on(this._container, 'touchend', this._onTouchEnd, this);
-            L.DomEvent.on(this._container, 'touchmove', this._onTouchMove, this);
-            if (this._detectIE()) {
-                L.DomEvent.on(this._container, 'MSPointerDown', this._onTouchStart, this);
-                L.DomEvent.on(this._container, 'MSPointerUp', this._onTouchEnd, this);
-                L.DomEvent.on(this._container, 'MSPointerMove', this._onTouchMove, this);
-                L.DomEvent.on(this._container, 'MSPointerCancel', this._onTouchCancel, this);
-            } else {
-                L.DomEvent.on(this._container, 'touchcancel', this._onTouchCancel, this);
-                L.DomEvent.on(this._container, 'touchleave', this._onTouchLeave, this);
-            }
-        },
-        removeHooks: function () {
-            L.DomEvent.off(this._container, 'touchstart', this._onTouchStart);
-            L.DomEvent.off(this._container, 'touchend', this._onTouchEnd);
-            L.DomEvent.off(this._container, 'touchmove', this._onTouchMove);
-            if (this._detectIE()) {
-                L.DomEvent.off(this._container, 'MSPointerDowm', this._onTouchStart);
-                L.DomEvent.off(this._container, 'MSPointerUp', this._onTouchEnd);
-                L.DomEvent.off(this._container, 'MSPointerMove', this._onTouchMove);
-                L.DomEvent.off(this._container, 'MSPointerCancel', this._onTouchCancel);
-            } else {
-                L.DomEvent.off(this._container, 'touchcancel', this._onTouchCancel);
-                L.DomEvent.off(this._container, 'touchleave', this._onTouchLeave);
-            }
-        },
-        _touchEvent: function (e, type) {
-            var touchEvent = {};
-            if (typeof e.touches !== 'undefined') {
-                if (!e.touches.length) {
-                    return;
-                }
-                touchEvent = e.touches[0];
-            } else if (e.pointerType === 'touch') {
-                touchEvent = e;
-                if (!this._filterClick(e)) {
-                    return;
-                }
-            } else {
-                return;
-            }
-            var containerPoint = this._map.mouseEventToContainerPoint(touchEvent), layerPoint = this._map.mouseEventToLayerPoint(touchEvent), latlng = this._map.layerPointToLatLng(layerPoint);
-            this._map.fire(type, {
-                latlng: latlng,
-                layerPoint: layerPoint,
-                containerPoint: containerPoint,
-                pageX: touchEvent.pageX,
-                pageY: touchEvent.pageY,
-                originalEvent: e
-            });
-        },
-        _filterClick: function (e) {
-            var timeStamp = e.timeStamp || e.originalEvent.timeStamp, elapsed = L.DomEvent._lastClick && timeStamp - L.DomEvent._lastClick;
-            if (elapsed && elapsed > 100 && elapsed < 500 || e.target._simulatedClick && !e._simulated) {
-                L.DomEvent.stop(e);
-                return false;
-            }
-            L.DomEvent._lastClick = timeStamp;
-            return true;
-        },
-        _onTouchStart: function (e) {
-            if (!this._map._loaded) {
-                return;
-            }
-            var type = 'touchstart';
-            this._touchEvent(e, type);
-        },
-        _onTouchEnd: function (e) {
-            if (!this._map._loaded) {
-                return;
-            }
-            var type = 'touchend';
-            this._touchEvent(e, type);
-        },
-        _onTouchCancel: function (e) {
-            if (!this._map._loaded) {
-                return;
-            }
-            var type = 'touchcancel';
-            if (this._detectIE()) {
-                type = 'pointercancel';
-            }
-            this._touchEvent(e, type);
-        },
-        _onTouchLeave: function (e) {
-            if (!this._map._loaded) {
-                return;
-            }
-            var type = 'touchleave';
-            this._touchEvent(e, type);
-        },
-        _onTouchMove: function (e) {
-            if (!this._map._loaded) {
-                return;
-            }
-            var type = 'touchmove';
-            this._touchEvent(e, type);
-        },
-        _detectIE: function () {
-            var ua = window.navigator.userAgent;
-            var msie = ua.indexOf('MSIE ');
-            if (msie > 0) {
-                return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
-            }
-            var trident = ua.indexOf('Trident/');
-            if (trident > 0) {
-                var rv = ua.indexOf('rv:');
-                return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
-            }
-            var edge = ua.indexOf('Edge/');
-            if (edge > 0) {
-                return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
-            }
-            return false;
-        }
-    });
-    L.Map.addInitHook('addHandler', 'touchExtend', L.Map.TouchExtend);
-    L.Marker.Touch = L.Marker.extend({
-        _initInteraction: function () {
-            if (!this.options.clickable) {
-                return;
-            }
-            var icon = this._icon, events = [
-                    'dblclick',
-                    'mousedown',
-                    'mouseover',
-                    'mouseout',
-                    'contextmenu',
-                    'touchstart',
-                    'touchend',
-                    'touchmove'
-                ];
-            if (this._detectIE) {
-                events.concat([
-                    'MSPointerDown',
-                    'MSPointerUp',
-                    'MSPointerMove',
-                    'MSPointerCancel'
-                ]);
-            } else {
-                events.concat(['touchcancel']);
-            }
-            L.DomUtil.addClass(icon, 'leaflet-clickable');
-            L.DomEvent.on(icon, 'click', this._onMouseClick, this);
-            L.DomEvent.on(icon, 'keypress', this._onKeyPress, this);
-            for (var i = 0; i < events.length; i++) {
-                L.DomEvent.on(icon, events[i], this._fireMouseEvent, this);
-            }
-            if (L.Handler.MarkerDrag) {
-                this.dragging = new L.Handler.MarkerDrag(this);
-                if (this.options.draggable) {
-                    this.dragging.enable();
-                }
-            }
-        },
-        _detectIE: function () {
-            var ua = window.navigator.userAgent;
-            var msie = ua.indexOf('MSIE ');
-            if (msie > 0) {
-                return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
-            }
-            var trident = ua.indexOf('Trident/');
-            if (trident > 0) {
-                var rv = ua.indexOf('rv:');
-                return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
-            }
-            var edge = ua.indexOf('Edge/');
-            if (edge > 0) {
-                return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
-            }
-            return false;
-        }
-    });
-    L.LatLngUtil = {
-        cloneLatLngs: function (latlngs) {
-            var clone = [];
-            for (var i = 0, l = latlngs.length; i < l; i++) {
-                clone.push(this.cloneLatLng(latlngs[i]));
-            }
-            return clone;
-        },
-        cloneLatLng: function (latlng) {
-            return L.latLng(latlng.lat, latlng.lng);
-        }
-    };
-    L.GeometryUtil = L.extend(L.GeometryUtil || {}, {
-        geodesicArea: function (latLngs) {
-            var pointsCount = latLngs.length, area = 0, d2r = L.LatLng.DEG_TO_RAD, p1, p2;
-            if (pointsCount > 2) {
-                for (var i = 0; i < pointsCount; i++) {
-                    p1 = latLngs[i];
-                    p2 = latLngs[(i + 1) % pointsCount];
-                    area += (p2.lng - p1.lng) * d2r * (2 + Math.sin(p1.lat * d2r) + Math.sin(p2.lat * d2r));
-                }
-                area = area * 6378137 * 6378137 / 2;
-            }
-            return Math.abs(area);
-        },
-        readableArea: function (area, isMetric) {
-            var areaStr;
-            if (isMetric) {
-                if (area >= 10000) {
-                    areaStr = (area * 0.0001).toFixed(2) + ' ha';
-                } else {
-                    areaStr = area.toFixed(2) + ' m&sup2;';
-                }
-            } else {
-                area /= 0.836127;
-                if (area >= 3097600) {
-                    areaStr = (area / 3097600).toFixed(2) + ' mi&sup2;';
-                } else if (area >= 4840) {
-                    areaStr = (area / 4840).toFixed(2) + ' acres';
-                } else {
-                    areaStr = Math.ceil(area) + ' yd&sup2;';
-                }
-            }
-            return areaStr;
-        },
-        readableDistance: function (distance, isMetric, useFeet) {
-            var distanceStr;
-            if (isMetric) {
-                if (distance > 1000) {
-                    distanceStr = (distance / 1000).toFixed(2) + ' km';
-                } else {
-                    distanceStr = Math.ceil(distance) + ' m';
-                }
-            } else {
-                distance *= 1.09361;
-                if (distance > 1760) {
-                    distanceStr = (distance / 1760).toFixed(2) + ' miles';
-                } else {
-                    var suffix = ' yd';
-                    if (useFeet) {
-                        distance = distance * 3;
-                        suffix = ' ft';
-                    }
-                    distanceStr = Math.ceil(distance) + suffix;
-                }
-            }
-            return distanceStr;
-        }
-    });
-    L.Util.extend(L.LineUtil, {
-        segmentsIntersect: function (p, p1, p2, p3) {
-            return this._checkCounterclockwise(p, p2, p3) !== this._checkCounterclockwise(p1, p2, p3) && this._checkCounterclockwise(p, p1, p2) !== this._checkCounterclockwise(p, p1, p3);
-        },
-        _checkCounterclockwise: function (p, p1, p2) {
-            return (p2.y - p.y) * (p1.x - p.x) > (p1.y - p.y) * (p2.x - p.x);
-        }
-    });
-    L.Polyline.include({
-        intersects: function () {
-            var points = this._originalPoints, len = points ? points.length : 0, i, p, p1;
-            if (this._tooFewPointsForIntersection()) {
-                return false;
-            }
-            for (i = len - 1; i >= 3; i--) {
-                p = points[i - 1];
-                p1 = points[i];
-                if (this._lineSegmentsIntersectsRange(p, p1, i - 2)) {
-                    return true;
-                }
-            }
-            return false;
-        },
-        newLatLngIntersects: function (latlng, skipFirst) {
-            if (!this._map) {
-                return false;
-            }
-            return this.newPointIntersects(this._map.latLngToLayerPoint(latlng), skipFirst);
-        },
-        newPointIntersects: function (newPoint, skipFirst) {
-            var points = this._originalPoints, len = points ? points.length : 0, lastPoint = points ? points[len - 1] : null, maxIndex = len - 2;
-            if (this._tooFewPointsForIntersection(1)) {
-                return false;
-            }
-            return this._lineSegmentsIntersectsRange(lastPoint, newPoint, maxIndex, skipFirst ? 1 : 0);
-        },
-        _tooFewPointsForIntersection: function (extraPoints) {
-            var points = this._originalPoints, len = points ? points.length : 0;
-            len += extraPoints || 0;
-            return !this._originalPoints || len <= 3;
-        },
-        _lineSegmentsIntersectsRange: function (p, p1, maxIndex, minIndex) {
-            var points = this._originalPoints, p2, p3;
-            minIndex = minIndex || 0;
-            for (var j = maxIndex; j > minIndex; j--) {
-                p2 = points[j - 1];
-                p3 = points[j];
-                if (L.LineUtil.segmentsIntersect(p, p1, p2, p3)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-    });
-    L.Polygon.include({
-        intersects: function () {
-            var polylineIntersects, points = this._originalPoints, len, firstPoint, lastPoint, maxIndex;
-            if (this._tooFewPointsForIntersection()) {
-                return false;
-            }
-            polylineIntersects = L.Polyline.prototype.intersects.call(this);
-            if (polylineIntersects) {
-                return true;
-            }
-            len = points.length;
-            firstPoint = points[0];
-            lastPoint = points[len - 1];
-            maxIndex = len - 2;
-            return this._lineSegmentsIntersectsRange(lastPoint, firstPoint, maxIndex, 1);
-        }
-    });
-    L.Control.Draw = L.Control.extend({
-        options: {
-            position: 'topleft',
-            draw: {},
-            edit: false
-        },
-        initialize: function (options) {
-            if (L.version < '0.7') {
-                throw new Error('Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/');
-            }
-            L.Control.prototype.initialize.call(this, options);
-            var toolbar;
-            this._toolbars = {};
-            if (L.DrawToolbar && this.options.draw) {
-                toolbar = new L.DrawToolbar(this.options.draw);
-                this._toolbars[L.DrawToolbar.TYPE] = toolbar;
-                this._toolbars[L.DrawToolbar.TYPE].on('enable', this._toolbarEnabled, this);
-            }
-            if (L.EditToolbar && this.options.edit) {
-                toolbar = new L.EditToolbar(this.options.edit);
-                this._toolbars[L.EditToolbar.TYPE] = toolbar;
-                this._toolbars[L.EditToolbar.TYPE].on('enable', this._toolbarEnabled, this);
-            }
-            L.toolbar = this;
-        },
-        onAdd: function (map) {
-            var container = L.DomUtil.create('div', 'leaflet-draw'), addedTopClass = false, topClassName = 'leaflet-draw-toolbar-top', toolbarContainer;
-            for (var toolbarId in this._toolbars) {
-                if (this._toolbars.hasOwnProperty(toolbarId)) {
-                    toolbarContainer = this._toolbars[toolbarId].addToolbar(map);
-                    if (toolbarContainer) {
-                        if (!addedTopClass) {
-                            if (!L.DomUtil.hasClass(toolbarContainer, topClassName)) {
-                                L.DomUtil.addClass(toolbarContainer.childNodes[0], topClassName);
-                            }
-                            addedTopClass = true;
-                        }
-                        container.appendChild(toolbarContainer);
-                    }
-                }
-            }
-            return container;
-        },
-        onRemove: function () {
-            for (var toolbarId in this._toolbars) {
-                if (this._toolbars.hasOwnProperty(toolbarId)) {
-                    this._toolbars[toolbarId].removeToolbar();
-                }
-            }
-        },
-        setDrawingOptions: function (options) {
-            for (var toolbarId in this._toolbars) {
-                if (this._toolbars[toolbarId] instanceof L.DrawToolbar) {
-                    this._toolbars[toolbarId].setOptions(options);
-                }
-            }
-        },
-        _toolbarEnabled: function (e) {
-            var enabledToolbar = e.target;
-            for (var toolbarId in this._toolbars) {
-                if (this._toolbars[toolbarId] !== enabledToolbar) {
-                    this._toolbars[toolbarId].disable();
-                }
-            }
-        }
-    });
-    L.Map.mergeOptions({
-        drawControlTooltips: true,
-        drawControl: false
-    });
-    L.Map.addInitHook(function () {
-        if (this.options.drawControl) {
-            this.drawControl = new L.Control.Draw();
-            this.addControl(this.drawControl);
-        }
-    });
-    L.Toolbar = L.Class.extend({
-        includes: [L.Mixin.Events],
-        initialize: function (options) {
-            L.setOptions(this, options);
-            this._modes = {};
-            this._actionButtons = [];
-            this._activeMode = null;
-        },
-        enabled: function () {
-            return this._activeMode !== null;
-        },
-        disable: function () {
-            if (!this.enabled()) {
-                return;
-            }
-            this._activeMode.handler.disable();
-        },
-        addToolbar: function (map) {
-            var container = L.DomUtil.create('div', 'leaflet-draw-section'), buttonIndex = 0, buttonClassPrefix = this._toolbarClass || '', modeHandlers = this.getModeHandlers(map), i;
-            this._toolbarContainer = L.DomUtil.create('div', 'leaflet-draw-toolbar leaflet-bar');
-            this._map = map;
-            for (i = 0; i < modeHandlers.length; i++) {
-                if (modeHandlers[i].enabled) {
-                    this._initModeHandler(modeHandlers[i].handler, this._toolbarContainer, buttonIndex++, buttonClassPrefix, modeHandlers[i].title);
-                }
-            }
-            if (!buttonIndex) {
-                return;
-            }
-            this._lastButtonIndex = --buttonIndex;
-            this._actionsContainer = L.DomUtil.create('ul', 'leaflet-draw-actions');
-            container.appendChild(this._toolbarContainer);
-            container.appendChild(this._actionsContainer);
-            return container;
-        },
-        removeToolbar: function () {
-            for (var handlerId in this._modes) {
-                if (this._modes.hasOwnProperty(handlerId)) {
-                    this._disposeButton(this._modes[handlerId].button, this._modes[handlerId].handler.enable, this._modes[handlerId].handler);
-                    this._modes[handlerId].handler.disable();
-                    this._modes[handlerId].handler.off('enabled', this._handlerActivated, this).off('disabled', this._handlerDeactivated, this);
-                }
-            }
-            this._modes = {};
-            for (var i = 0, l = this._actionButtons.length; i < l; i++) {
-                this._disposeButton(this._actionButtons[i].button, this._actionButtons[i].callback, this);
-            }
-            this._actionButtons = [];
-            this._actionsContainer = null;
-        },
-        _initModeHandler: function (handler, container, buttonIndex, classNamePredix, buttonTitle) {
-            var type = handler.type;
-            this._modes[type] = {};
-            this._modes[type].handler = handler;
-            this._modes[type].button = this._createButton({
-                type: type,
-                title: buttonTitle,
-                className: classNamePredix + '-' + type,
-                container: container,
-                callback: this._modes[type].handler.enable,
-                context: this._modes[type].handler
-            });
-            this._modes[type].buttonIndex = buttonIndex;
-            this._modes[type].handler.on('enabled', this._handlerActivated, this).on('disabled', this._handlerDeactivated, this);
-        },
-        _createButton: function (options) {
-            var link = L.DomUtil.create('a', options.className || '', options.container);
-            link.href = '#';
-            if (options.text) {
-                link.innerHTML = options.text;
-            }
-            if (options.title) {
-                link.title = options.title;
-            }
-            L.DomEvent.on(link, 'click', L.DomEvent.stopPropagation).on(link, 'mousedown', L.DomEvent.stopPropagation).on(link, 'dblclick', L.DomEvent.stopPropagation).on(link, 'click', L.DomEvent.preventDefault).on(link, 'click', options.callback, options.context);
-            return link;
-        },
-        _disposeButton: function (button, callback) {
-            L.DomEvent.off(button, 'click', L.DomEvent.stopPropagation).off(button, 'mousedown', L.DomEvent.stopPropagation).off(button, 'dblclick', L.DomEvent.stopPropagation).off(button, 'click', L.DomEvent.preventDefault).off(button, 'click', callback);
-        },
-        _handlerActivated: function (e) {
-            this.disable();
-            this._activeMode = this._modes[e.handler];
-            L.DomUtil.addClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled');
-            this._showActionsToolbar();
-            this.fire('enable');
-        },
-        _handlerDeactivated: function () {
-            this._hideActionsToolbar();
-            L.DomUtil.removeClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled');
-            this._activeMode = null;
-            this.fire('disable');
-        },
-        _createActions: function (handler) {
-            var container = this._actionsContainer, buttons = this.getActions(handler), l = buttons.length, li, di, dl, button;
-            for (di = 0, dl = this._actionButtons.length; di < dl; di++) {
-                this._disposeButton(this._actionButtons[di].button, this._actionButtons[di].callback);
-            }
-            this._actionButtons = [];
-            while (container.firstChild) {
-                container.removeChild(container.firstChild);
-            }
-            for (var i = 0; i < l; i++) {
-                if ('enabled' in buttons[i] && !buttons[i].enabled) {
-                    continue;
-                }
-                li = L.DomUtil.create('li', '', container);
-                button = this._createButton({
-                    title: buttons[i].title,
-                    text: buttons[i].text,
-                    container: li,
-                    callback: buttons[i].callback,
-                    context: buttons[i].context
-                });
-                this._actionButtons.push({
-                    button: button,
-                    callback: buttons[i].callback
-                });
-            }
-        },
-        _showActionsToolbar: function () {
-            var buttonIndex = this._activeMode.buttonIndex, lastButtonIndex = this._lastButtonIndex, toolbarPosition = this._activeMode.button.offsetTop - 1;
-            this._createActions(this._activeMode.handler);
-            this._actionsContainer.style.top = toolbarPosition + 'px';
-            if (buttonIndex === 0) {
-                L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop');
-                L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-top');
-            }
-            if (buttonIndex === lastButtonIndex) {
-                L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom');
-                L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-bottom');
-            }
-            this._actionsContainer.style.display = 'block';
-        },
-        _hideActionsToolbar: function () {
-            this._actionsContainer.style.display = 'none';
-            L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop');
-            L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom');
-            L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-top');
-            L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-bottom');
-        }
-    });
-    L.Tooltip = L.Class.extend({
-        initialize: function (map) {
-            this._map = map;
-            this._popupPane = map._panes.popupPane;
-            this._container = map.options.drawControlTooltips ? L.DomUtil.create('div', 'leaflet-draw-tooltip', this._popupPane) : null;
-            this._singleLineLabel = false;
-            this._map.on('mouseout', this._onMouseOut, this);
-        },
-        dispose: function () {
-            this._map.off('mouseout', this._onMouseOut, this);
-            if (this._container) {
-                this._popupPane.removeChild(this._container);
-                this._container = null;
-            }
-        },
-        updateContent: function (labelText) {
-            if (!this._container) {
-                return this;
-            }
-            labelText.subtext = labelText.subtext || '';
-            if (labelText.subtext.length === 0 && !this._singleLineLabel) {
-                L.DomUtil.addClass(this._container, 'leaflet-draw-tooltip-single');
-                this._singleLineLabel = true;
-            } else if (labelText.subtext.length > 0 && this._singleLineLabel) {
-                L.DomUtil.removeClass(this._container, 'leaflet-draw-tooltip-single');
-                this._singleLineLabel = false;
-            }
-            this._container.innerHTML = (labelText.subtext.length > 0 ? '<span class="leaflet-draw-tooltip-subtext">' + labelText.subtext + '</span>' + '<br />' : '') + '<span>' + labelText.text + '</span>';
-            return this;
-        },
-        updatePosition: function (latlng) {
-            var pos = this._map.latLngToLayerPoint(latlng), tooltipContainer = this._container;
-            if (this._container) {
-                tooltipContainer.style.visibility = 'inherit';
-                L.DomUtil.setPosition(tooltipContainer, pos);
-            }
-            return this;
-        },
-        showAsError: function () {
-            if (this._container) {
-                L.DomUtil.addClass(this._container, 'leaflet-error-draw-tooltip');
-            }
-            return this;
-        },
-        removeError: function () {
-            if (this._container) {
-                L.DomUtil.removeClass(this._container, 'leaflet-error-draw-tooltip');
-            }
-            return this;
-        },
-        _onMouseOut: function () {
-            if (this._container) {
-                this._container.style.visibility = 'hidden';
-            }
-        }
-    });
-    L.DrawToolbar = L.Toolbar.extend({
-        statics: { TYPE: 'draw' },
-        options: {
-            polyline: {},
-            polygon: {},
-            rectangle: {},
-            circle: {},
-            marker: {}
-        },
-        initialize: function (options) {
-            for (var type in this.options) {
-                if (this.options.hasOwnProperty(type)) {
-                    if (options[type]) {
-                        options[type] = L.extend({}, this.options[type], options[type]);
-                    }
-                }
-            }
-            this._toolbarClass = 'leaflet-draw-draw';
-            L.Toolbar.prototype.initialize.call(this, options);
-        },
-        getModeHandlers: function (map) {
-            return [
-                {
-                    enabled: this.options.polyline,
-                    handler: new L.Draw.Polyline(map, this.options.polyline),
-                    title: L.drawLocal.draw.toolbar.buttons.polyline
-                },
-                {
-                    enabled: this.options.polygon,
-                    handler: new L.Draw.Polygon(map, this.options.polygon),
-                    title: L.drawLocal.draw.toolbar.buttons.polygon
-                },
-                {
-                    enabled: this.options.rectangle,
-                    handler: new L.Draw.Rectangle(map, this.options.rectangle),
-                    title: L.drawLocal.draw.toolbar.buttons.rectangle
-                },
-                {
-                    enabled: this.options.circle,
-                    handler: new L.Draw.Circle(map, this.options.circle),
-                    title: L.drawLocal.draw.toolbar.buttons.circle
-                },
-                {
-                    enabled: this.options.marker,
-                    handler: new L.Draw.Marker(map, this.options.marker),
-                    title: L.drawLocal.draw.toolbar.buttons.marker
-                }
-            ];
-        },
-        getActions: function (handler) {
-            return [
-                {
-                    enabled: handler.completeShape,
-                    title: L.drawLocal.draw.toolbar.finish.title,
-                    text: L.drawLocal.draw.toolbar.finish.text,
-                    callback: handler.completeShape,
-                    context: handler
-                },
-                {
-                    enabled: handler.deleteLastVertex,
-                    title: L.drawLocal.draw.toolbar.undo.title,
-                    text: L.drawLocal.draw.toolbar.undo.text,
-                    callback: handler.deleteLastVertex,
-                    context: handler
-                },
-                {
-                    title: L.drawLocal.draw.toolbar.actions.title,
-                    text: L.drawLocal.draw.toolbar.actions.text,
-                    callback: this.disable,
-                    context: this
-                }
-            ];
-        },
-        setOptions: function (options) {
-            L.setOptions(this, options);
-            for (var type in this._modes) {
-                if (this._modes.hasOwnProperty(type) && options.hasOwnProperty(type)) {
-                    this._modes[type].handler.setOptions(options[type]);
-                }
-            }
-        }
-    });
-    L.EditToolbar = L.Toolbar.extend({
-        statics: { TYPE: 'edit' },
-        options: {
-            edit: {
-                selectedPathOptions: {
-                    dashArray: '10, 10',
-                    fill: true,
-                    fillColor: '#fe57a1',
-                    fillOpacity: 0.1,
-                    maintainColor: false
-                }
-            },
-            remove: {},
-            featureGroup: null
-        },
-        initialize: function (options) {
-            if (options.edit) {
-                if (typeof options.edit.selectedPathOptions === 'undefined') {
-                    options.edit.selectedPathOptions = this.options.edit.selectedPathOptions;
-                }
-                options.edit.selectedPathOptions = L.extend({}, this.options.edit.selectedPathOptions, options.edit.selectedPathOptions);
-            }
-            if (options.remove) {
-                options.remove = L.extend({}, this.options.remove, options.remove);
-            }
-            this._toolbarClass = 'leaflet-draw-edit';
-            L.Toolbar.prototype.initialize.call(this, options);
-            this._selectedFeatureCount = 0;
-        },
-        getModeHandlers: function (map) {
-            var featureGroup = this.options.featureGroup;
-            return [
-                {
-                    enabled: this.options.edit,
-                    handler: new L.EditToolbar.Edit(map, {
-                        featureGroup: featureGroup,
-                        selectedPathOptions: this.options.edit.selectedPathOptions
-                    }),
-                    title: L.drawLocal.edit.toolbar.buttons.edit
-                },
-                {
-                    enabled: this.options.remove,
-                    handler: new L.EditToolbar.Delete(map, { featureGroup: featureGroup }),
-                    title: L.drawLocal.edit.toolbar.buttons.remove
-                }
-            ];
-        },
-        getActions: function () {
-            return [
-                {
-                    title: L.drawLocal.edit.toolbar.actions.save.title,
-                    text: L.drawLocal.edit.toolbar.actions.save.text,
-                    callback: this._save,
-                    context: this
-                },
-                {
-                    title: L.drawLocal.edit.toolbar.actions.cancel.title,
-                    text: L.drawLocal.edit.toolbar.actions.cancel.text,
-                    callback: this.disable,
-                    context: this
-                }
-            ];
-        },
-        addToolbar: function (map) {
-            var container = L.Toolbar.prototype.addToolbar.call(this, map);
-            this._checkDisabled();
-            this.options.featureGroup.on('layeradd layerremove', this._checkDisabled, this);
-            return container;
-        },
-        removeToolbar: function () {
-            this.options.featureGroup.off('layeradd layerremove', this._checkDisabled, this);
-            L.Toolbar.prototype.removeToolbar.call(this);
-        },
-        disable: function () {
-            if (!this.enabled()) {
-                return;
-            }
-            this._activeMode.handler.revertLayers();
-            L.Toolbar.prototype.disable.call(this);
-        },
-        _save: function () {
-            this._activeMode.handler.save();
-            this._activeMode.handler.disable();
-        },
-        _checkDisabled: function () {
-            var featureGroup = this.options.featureGroup, hasLayers = featureGroup.getLayers().length !== 0, button;
-            if (this.options.edit) {
-                button = this._modes[L.EditToolbar.Edit.TYPE].button;
-                if (hasLayers) {
-                    L.DomUtil.removeClass(button, 'leaflet-disabled');
-                } else {
-                    L.DomUtil.addClass(button, 'leaflet-disabled');
-                }
-                button.setAttribute('title', hasLayers ? L.drawLocal.edit.toolbar.buttons.edit : L.drawLocal.edit.toolbar.buttons.editDisabled);
-            }
-            if (this.options.remove) {
-                button = this._modes[L.EditToolbar.Delete.TYPE].button;
-                if (hasLayers) {
-                    L.DomUtil.removeClass(button, 'leaflet-disabled');
-                } else {
-                    L.DomUtil.addClass(button, 'leaflet-disabled');
-                }
-                button.setAttribute('title', hasLayers ? L.drawLocal.edit.toolbar.buttons.remove : L.drawLocal.edit.toolbar.buttons.removeDisabled);
-            }
-        }
-    });
-    L.EditToolbar.Edit = L.Handler.extend({
-        statics: { TYPE: 'edit' },
-        includes: L.Mixin.Events,
-        initialize: function (map, options) {
-            L.Handler.prototype.initialize.call(this, map);
-            L.setOptions(this, options);
-            this._featureGroup = options.featureGroup;
-            if (!(this._featureGroup instanceof L.FeatureGroup)) {
-                throw new Error('options.featureGroup must be a L.FeatureGroup');
-            }
-            this._uneditedLayerProps = {};
-            this.type = L.EditToolbar.Edit.TYPE;
-        },
-        enable: function () {
-            if (this._enabled || !this._hasAvailableLayers()) {
-                return;
-            }
-            this.fire('enabled', { handler: this.type });
-            this._map.fire('draw:editstart', { handler: this.type });
-            L.Handler.prototype.enable.call(this);
-            this._featureGroup.on('layeradd', this._enableLayerEdit, this).on('layerremove', this._disableLayerEdit, this);
-        },
-        disable: function () {
-            if (!this._enabled) {
-                return;
-            }
-            this._featureGroup.off('layeradd', this._enableLayerEdit, this).off('layerremove', this._disableLayerEdit, this);
-            L.Handler.prototype.disable.call(this);
-            this._map.fire('draw:editstop', { handler: this.type });
-            this.fire('disabled', { handler: this.type });
-        },
-        addHooks: function () {
-            var map = this._map;
-            if (map) {
-                map.getContainer().focus();
-                this._featureGroup.eachLayer(this._enableLayerEdit, this);
-                this._tooltip = new L.Tooltip(this._map);
-                this._updateTooltip();
-                this._map.on('mousemove', this._onMouseMove, this).on('touchmove', this._onMouseMove, this).on('MSPointerMove', this._onMouseMove, this).on('click', this._editStyle, this).on('draw:editvertex', this._updateTooltip, this);
-            }
-        },
-        removeHooks: function () {
-            if (this._map) {
-                this._featureGroup.eachLayer(this._disableLayerEdit, this);
-                this._uneditedLayerProps = {};
-                this._tooltip.dispose();
-                this._tooltip = null;
-                this._map.off('mousemove', this._onMouseMove, this).off('touchmove', this._onMouseMove, this).off('MSPointerMove', this._onMouseMove, this);
-            }
-        },
-        revertLayers: function () {
-            this._featureGroup.eachLayer(function (layer) {
-                this._revertLayer(layer);
-            }, this);
-        },
-        save: function () {
-            var editedLayers = new L.LayerGroup();
-            this._featureGroup.eachLayer(function (layer) {
-                if (layer.edited) {
-                    editedLayers.addLayer(layer);
-                    layer.edited = false;
-                }
-            });
-            this._map.fire('draw:edited', { layers: editedLayers });
-        },
-        _backupLayer: function (layer) {
-            var id = L.Util.stamp(layer);
-            if (!this._uneditedLayerProps[id]) {
-                if (layer instanceof L.Polyline || layer instanceof L.Polygon || layer instanceof L.Rectangle) {
-                    this._uneditedLayerProps[id] = { latlngs: L.LatLngUtil.cloneLatLngs(layer.getLatLngs()) };
-                } else if (layer instanceof L.Circle) {
-                    this._uneditedLayerProps[id] = {
-                        latlng: L.LatLngUtil.cloneLatLng(layer.getLatLng()),
-                        radius: layer.getRadius()
-                    };
-                } else if (layer instanceof L.Marker) {
-                    this._uneditedLayerProps[id] = { latlng: L.LatLngUtil.cloneLatLng(layer.getLatLng()) };
-                }
-            }
-        },
-        _getTooltipText: function () {
-            return {
-                text: L.drawLocal.edit.handlers.edit.tooltip.text,
-                subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext
-            };
-        },
-        _updateTooltip: function () {
-            this._tooltip.updateContent(this._getTooltipText());
-        },
-        _revertLayer: function (layer) {
-            var id = L.Util.stamp(layer);
-            layer.edited = false;
-            if (this._uneditedLayerProps.hasOwnProperty(id)) {
-                if (layer instanceof L.Polyline || layer instanceof L.Polygon || layer instanceof L.Rectangle) {
-                    layer.setLatLngs(this._uneditedLayerProps[id].latlngs);
-                } else if (layer instanceof L.Circle) {
-                    layer.setLatLng(this._uneditedLayerProps[id].latlng);
-                    layer.setRadius(this._uneditedLayerProps[id].radius);
-                } else if (layer instanceof L.Marker) {
-                    layer.setLatLng(this._uneditedLayerProps[id].latlng);
-                }
-                layer.fire('revert-edited', { layer: layer });
-            }
-        },
-        _enableLayerEdit: function (e) {
-            var layer = e.layer || e.target || e, pathOptions;
-            this._backupLayer(layer);
-            if (this.options.selectedPathOptions) {
-                pathOptions = L.Util.extend({}, this.options.selectedPathOptions);
-                if (pathOptions.maintainColor) {
-                    pathOptions.color = layer.options.color;
-                    pathOptions.fillColor = layer.options.fillColor;
-                }
-                layer.options.original = L.extend({}, layer.options);
-                layer.options.editing = pathOptions;
-            }
-            if (this.isMarker) {
-                layer.dragging.enable();
-                layer.on('dragend', this._onMarkerDragEnd).on('touchmove', this._onTouchMove, this).on('MSPointerMove', this._onTouchMove, this).on('touchend', this._onMarkerDragEnd, this).on('MSPointerUp', this._onMarkerDragEnd, this);
-            } else {
-                layer.editing.enable();
-            }
-        },
-        _disableLayerEdit: function (e) {
-            var layer = e.layer || e.target || e;
-            layer.edited = false;
-            layer.editing.disable();
-            delete layer.options.editing;
-            delete layer.options.original;
-            if (this._selectedPathOptions) {
-                if (layer instanceof L.Marker) {
-                    this._toggleMarkerHighlight(layer);
-                } else {
-                    layer.setStyle(layer.options.previousOptions);
-                    delete layer.options.previousOptions;
-                }
-            }
-            if (layer instanceof L.Marker) {
-                layer.dragging.disable();
-                layer.off('dragend', this._onMarkerDragEnd, this).off('touchmove', this._onTouchMove, this).off('MSPointerMove', this._onTouchMove, this).off('touchend', this._onMarkerDragEnd, this).off('MSPointerUp', this._onMarkerDragEnd, this);
-            } else {
-                layer.editing.disable();
-            }
-        },
-        _onMouseMove: function (e) {
-            this._tooltip.updatePosition(e.latlng);
-        },
-        _onTouchMove: function (e) {
-            var touchEvent = e.originalEvent.changedTouches[0], layerPoint = this._map.mouseEventToLayerPoint(touchEvent), latlng = this._map.layerPointToLatLng(layerPoint);
-            e.target.setLatLng(latlng);
-        },
-        _hasAvailableLayers: function () {
-            return this._featureGroup.getLayers().length !== 0;
-        }
-    });
-    L.EditToolbar.Delete = L.Handler.extend({
-        statics: { TYPE: 'remove' },
-        includes: L.Mixin.Events,
-        initialize: function (map, options) {
-            L.Handler.prototype.initialize.call(this, map);
-            L.Util.setOptions(this, options);
-            this._deletableLayers = this.options.featureGroup;
-            if (!(this._deletableLayers instanceof L.FeatureGroup)) {
-                throw new Error('options.featureGroup must be a L.FeatureGroup');
-            }
-            this.type = L.EditToolbar.Delete.TYPE;
-        },
-        enable: function () {
-            if (this._enabled || !this._hasAvailableLayers()) {
-                return;
-            }
-            this.fire('enabled', { handler: this.type });
-            this._map.fire('draw:deletestart', { handler: this.type });
-            L.Handler.prototype.enable.call(this);
-            this._deletableLayers.on('layeradd', this._enableLayerDelete, this).on('layerremove', this._disableLayerDelete, this);
-        },
-        disable: function () {
-            if (!this._enabled) {
-                return;
-            }
-            this._deletableLayers.off('layeradd', this._enableLayerDelete, this).off('layerremove', this._disableLayerDelete, this);
-            L.Handler.prototype.disable.call(this);
-            this._map.fire('draw:deletestop', { handler: this.type });
-            this.fire('disabled', { handler: this.type });
-        },
-        addHooks: function () {
-            var map = this._map;
-            if (map) {
-                map.getContainer().focus();
-                this._deletableLayers.eachLayer(this._enableLayerDelete, this);
-                this._deletedLayers = new L.LayerGroup();
-                this._tooltip = new L.Tooltip(this._map);
-                this._tooltip.updateContent({ text: L.drawLocal.edit.handlers.remove.tooltip.text });
-                this._map.on('mousemove', this._onMouseMove, this);
-            }
-        },
-        removeHooks: function () {
-            if (this._map) {
-                this._deletableLayers.eachLayer(this._disableLayerDelete, this);
-                this._deletedLayers = null;
-                this._tooltip.dispose();
-                this._tooltip = null;
-                this._map.off('mousemove', this._onMouseMove, this);
-            }
-        },
-        revertLayers: function () {
-            this._deletedLayers.eachLayer(function (layer) {
-                this._deletableLayers.addLayer(layer);
-                layer.fire('revert-deleted', { layer: layer });
-            }, this);
-        },
-        save: function () {
-            this._map.fire('draw:deleted', { layers: this._deletedLayers });
-        },
-        _enableLayerDelete: function (e) {
-            var layer = e.layer || e.target || e;
-            layer.on('click', this._removeLayer, this);
-        },
-        _disableLayerDelete: function (e) {
-            var layer = e.layer || e.target || e;
-            layer.off('click', this._removeLayer, this);
-            this._deletedLayers.removeLayer(layer);
-        },
-        _removeLayer: function (e) {
-            var layer = e.layer || e.target || e;
-            this._deletableLayers.removeLayer(layer);
-            this._deletedLayers.addLayer(layer);
-            layer.fire('deleted');
-        },
-        _onMouseMove: function (e) {
-            this._tooltip.updatePosition(e.latlng);
-        },
-        _hasAvailableLayers: function () {
-            return this._deletableLayers.getLayers().length !== 0;
-        }
-    });
-}(window, document));
-leafletDraw = undefined;
-(function (factory) {
-    'use strict';
-    if (true) {
-        sortable = function () {
-            return typeof factory === 'function' ? factory() : factory;
-        }();
-    } else if (typeof module != 'undefined' && typeof module.exports != 'undefined') {
-        module.exports = factory();
-    } else if (typeof Package !== 'undefined') {
-        Sortable = factory();
-    } else {
-        window['Sortable'] = factory();
-    }
-}(function () {
-    'use strict';
-    if (typeof window == 'undefined' || typeof window.document == 'undefined') {
-        return function () {
-            throw new Error('Sortable.js requires a window with a document');
-        };
-    }
-    var dragEl, parentEl, ghostEl, cloneEl, rootEl, nextEl, scrollEl, scrollParentEl, lastEl, lastCSS, lastParentCSS, oldIndex, newIndex, activeGroup, autoScroll = {}, tapEvt, touchEvt, moved, RSPACE = /\s+/g, expando = 'Sortable' + new Date().getTime(), win = window, document = win.document, parseInt = win.parseInt, supportDraggable = !!('draggable' in document.createElement('div')), supportCssPointerEvents = function (el) {
-            el = document.createElement('x');
-            el.style.cssText = 'pointer-events:auto';
-            return el.style.pointerEvents === 'auto';
-        }(), _silent = false, abs = Math.abs, slice = [].slice, touchDragOverListeners = [], _autoScroll = _throttle(function (evt, options, rootEl) {
-            if (rootEl && options.scroll) {
-                var el, rect, sens = options.scrollSensitivity, speed = options.scrollSpeed, x = evt.clientX, y = evt.clientY, winWidth = window.innerWidth, winHeight = window.innerHeight, vx, vy;
-                if (scrollParentEl !== rootEl) {
-                    scrollEl = options.scroll;
-                    scrollParentEl = rootEl;
-                    if (scrollEl === true) {
-                        scrollEl = rootEl;
-                        do {
-                            if (scrollEl.offsetWidth < scrollEl.scrollWidth || scrollEl.offsetHeight < scrollEl.scrollHeight) {
-                                break;
-                            }
-                        } while (scrollEl = scrollEl.parentNode);
-                    }
-                }
-                if (scrollEl) {
-                    el = scrollEl;
-                    rect = scrollEl.getBoundingClientRect();
-                    vx = (abs(rect.right - x) <= sens) - (abs(rect.left - x) <= sens);
-                    vy = (abs(rect.bottom - y) <= sens) - (abs(rect.top - y) <= sens);
-                }
-                if (!(vx || vy)) {
-                    vx = (winWidth - x <= sens) - (x <= sens);
-                    vy = (winHeight - y <= sens) - (y <= sens);
-                    (vx || vy) && (el = win);
-                }
-                if (autoScroll.vx !== vx || autoScroll.vy !== vy || autoScroll.el !== el) {
-                    autoScroll.el = el;
-                    autoScroll.vx = vx;
-                    autoScroll.vy = vy;
-                    clearInterval(autoScroll.pid);
-                    if (el) {
-                        autoScroll.pid = setInterval(function () {
-                            if (el === win) {
-                                win.scrollTo(win.pageXOffset + vx * speed, win.pageYOffset + vy * speed);
-                            } else {
-                                vy && (el.scrollTop += vy * speed);
-                                vx && (el.scrollLeft += vx * speed);
-                            }
-                        }, 24);
-                    }
-                }
-            }
-        }, 30), _prepareGroup = function (options) {
-            var group = options.group;
-            if (!group || typeof group != 'object') {
-                group = options.group = { name: group };
-            }
-            [
-                'pull',
-                'put'
-            ].forEach(function (key) {
-                if (!(key in group)) {
-                    group[key] = true;
-                }
-            });
-            options.groups = ' ' + group.name + (group.put.join ? ' ' + group.put.join(' ') : '') + ' ';
-        };
-    function Sortable(el, options) {
-        if (!(el && el.nodeType && el.nodeType === 1)) {
-            throw 'Sortable: `el` must be HTMLElement, and not ' + {}.toString.call(el);
-        }
-        this.el = el;
-        this.options = options = _extend({}, options);
-        el[expando] = this;
-        var defaults = {
-            group: Math.random(),
-            sort: true,
-            disabled: false,
-            store: null,
-            handle: null,
-            scroll: true,
-            scrollSensitivity: 30,
-            scrollSpeed: 10,
-            draggable: /[uo]l/i.test(el.nodeName) ? 'li' : '>*',
-            ghostClass: 'sortable-ghost',
-            chosenClass: 'sortable-chosen',
-            ignore: 'a, img',
-            filter: null,
-            animation: 0,
-            setData: function (dataTransfer, dragEl) {
-                dataTransfer.setData('Text', dragEl.textContent);
-            },
-            dropBubble: false,
-            dragoverBubble: false,
-            dataIdAttr: 'data-id',
-            delay: 0,
-            forceFallback: false,
-            fallbackClass: 'sortable-fallback',
-            fallbackOnBody: false
-        };
-        for (var name in defaults) {
-            !(name in options) && (options[name] = defaults[name]);
-        }
-        _prepareGroup(options);
-        for (var fn in this) {
-            if (fn.charAt(0) === '_') {
-                this[fn] = this[fn].bind(this);
-            }
-        }
-        this.nativeDraggable = options.forceFallback ? false : supportDraggable;
-        _on(el, 'mousedown', this._onTapStart);
-        _on(el, 'touchstart', this._onTapStart);
-        if (this.nativeDraggable) {
-            _on(el, 'dragover', this);
-            _on(el, 'dragenter', this);
-        }
-        touchDragOverListeners.push(this._onDragOver);
-        options.store && this.sort(options.store.get(this));
-    }
-    Sortable.prototype = {
-        constructor: Sortable,
-        _onTapStart: function (evt) {
-            var _this = this, el = this.el, options = this.options, type = evt.type, touch = evt.touches && evt.touches[0], target = (touch || evt).target, originalTarget = target, filter = options.filter;
-            if (type === 'mousedown' && evt.button !== 0 || options.disabled) {
-                return;
-            }
-            target = _closest(target, options.draggable, el);
-            if (!target) {
-                return;
-            }
-            oldIndex = _index(target, options.draggable);
-            if (typeof filter === 'function') {
-                if (filter.call(this, evt, target, this)) {
-                    _dispatchEvent(_this, originalTarget, 'filter', target, el, oldIndex);
-                    evt.preventDefault();
-                    return;
-                }
-            } else if (filter) {
-                filter = filter.split(',').some(function (criteria) {
-                    criteria = _closest(originalTarget, criteria.trim(), el);
-                    if (criteria) {
-                        _dispatchEvent(_this, criteria, 'filter', target, el, oldIndex);
-                        return true;
-                    }
-                });
-                if (filter) {
-                    evt.preventDefault();
-                    return;
-                }
-            }
-            if (options.handle && !_closest(originalTarget, options.handle, el)) {
-                return;
-            }
-            this._prepareDragStart(evt, touch, target);
-        },
-        _prepareDragStart: function (evt, touch, target) {
-            var _this = this, el = _this.el, options = _this.options, ownerDocument = el.ownerDocument, dragStartFn;
-            if (target && !dragEl && target.parentNode === el) {
-                tapEvt = evt;
-                rootEl = el;
-                dragEl = target;
-                parentEl = dragEl.parentNode;
-                nextEl = dragEl.nextSibling;
-                activeGroup = options.group;
-                dragStartFn = function () {
-                    _this._disableDelayedDrag();
-                    dragEl.draggable = true;
-                    _toggleClass(dragEl, _this.options.chosenClass, true);
-                    _this._triggerDragStart(touch);
-                };
-                options.ignore.split(',').forEach(function (criteria) {
-                    _find(dragEl, criteria.trim(), _disableDraggable);
-                });
-                _on(ownerDocument, 'mouseup', _this._onDrop);
-                _on(ownerDocument, 'touchend', _this._onDrop);
-                _on(ownerDocument, 'touchcancel', _this._onDrop);
-                if (options.delay) {
-                    _on(ownerDocument, 'mouseup', _this._disableDelayedDrag);
-                    _on(ownerDocument, 'touchend', _this._disableDelayedDrag);
-                    _on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);
-                    _on(ownerDocument, 'mousemove', _this._disableDelayedDrag);
-                    _on(ownerDocument, 'touchmove', _this._disableDelayedDrag);
-                    _this._dragStartTimer = setTimeout(dragStartFn, options.delay);
-                } else {
-                    dragStartFn();
-                }
-            }
-        },
-        _disableDelayedDrag: function () {
-            var ownerDocument = this.el.ownerDocument;
-            clearTimeout(this._dragStartTimer);
-            _off(ownerDocument, 'mouseup', this._disableDelayedDrag);
-            _off(ownerDocument, 'touchend', this._disableDelayedDrag);
-            _off(ownerDocument, 'touchcancel', this._disableDelayedDrag);
-            _off(ownerDocument, 'mousemove', this._disableDelayedDrag);
-            _off(ownerDocument, 'touchmove', this._disableDelayedDrag);
-        },
-        _triggerDragStart: function (touch) {
-            if (touch) {
-                tapEvt = {
-                    target: dragEl,
-                    clientX: touch.clientX,
-                    clientY: touch.clientY
-                };
-                this._onDragStart(tapEvt, 'touch');
-            } else if (!this.nativeDraggable) {
-                this._onDragStart(tapEvt, true);
-            } else {
-                _on(dragEl, 'dragend', this);
-                _on(rootEl, 'dragstart', this._onDragStart);
-            }
-            try {
-                if (document.selection) {
-                    document.selection.empty();
-                } else {
-                    window.getSelection().removeAllRanges();
-                }
-            } catch (err) {
-            }
-        },
-        _dragStarted: function () {
-            if (rootEl && dragEl) {
-                _toggleClass(dragEl, this.options.ghostClass, true);
-                Sortable.active = this;
-                _dispatchEvent(this, rootEl, 'start', dragEl, rootEl, oldIndex);
-            }
-        },
-        _emulateDragOver: function () {
-            if (touchEvt) {
-                if (this._lastX === touchEvt.clientX && this._lastY === touchEvt.clientY) {
-                    return;
-                }
-                this._lastX = touchEvt.clientX;
-                this._lastY = touchEvt.clientY;
-                if (!supportCssPointerEvents) {
-                    _css(ghostEl, 'display', 'none');
-                }
-                var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY), parent = target, groupName = ' ' + this.options.group.name + '', i = touchDragOverListeners.length;
-                if (parent) {
-                    do {
-                        if (parent[expando] && parent[expando].options.groups.indexOf(groupName) > -1) {
-                            while (i--) {
-                                touchDragOverListeners[i]({
-                                    clientX: touchEvt.clientX,
-                                    clientY: touchEvt.clientY,
-                                    target: target,
-                                    rootEl: parent
-                                });
-                            }
-                            break;
-                        }
-                        target = parent;
-                    } while (parent = parent.parentNode);
-                }
-                if (!supportCssPointerEvents) {
-                    _css(ghostEl, 'display', '');
-                }
-            }
-        },
-        _onTouchMove: function (evt) {
-            if (tapEvt) {
-                if (!Sortable.active) {
-                    this._dragStarted();
-                }
-                this._appendGhost();
-                var touch = evt.touches ? evt.touches[0] : evt, dx = touch.clientX - tapEvt.clientX, dy = touch.clientY - tapEvt.clientY, translate3d = evt.touches ? 'translate3d(' + dx + 'px,' + dy + 'px,0)' : 'translate(' + dx + 'px,' + dy + 'px)';
-                moved = true;
-                touchEvt = touch;
-                _css(ghostEl, 'webkitTransform', translate3d);
-                _css(ghostEl, 'mozTransform', translate3d);
-                _css(ghostEl, 'msTransform', translate3d);
-                _css(ghostEl, 'transform', translate3d);
-                evt.preventDefault();
-            }
-        },
-        _appendGhost: function () {
-            if (!ghostEl) {
-                var rect = dragEl.getBoundingClientRect(), css = _css(dragEl), options = this.options, ghostRect;
-                ghostEl = dragEl.cloneNode(true);
-                _toggleClass(ghostEl, options.ghostClass, false);
-                _toggleClass(ghostEl, options.fallbackClass, true);
-                _css(ghostEl, 'top', rect.top - parseInt(css.marginTop, 10));
-                _css(ghostEl, 'left', rect.left - parseInt(css.marginLeft, 10));
-                _css(ghostEl, 'width', rect.width);
-                _css(ghostEl, 'height', rect.height);
-                _css(ghostEl, 'opacity', '0.8');
-                _css(ghostEl, 'position', 'fixed');
-                _css(ghostEl, 'zIndex', '100000');
-                _css(ghostEl, 'pointerEvents', 'none');
-                options.fallbackOnBody && document.body.appendChild(ghostEl) || rootEl.appendChild(ghostEl);
-                ghostRect = ghostEl.getBoundingClientRect();
-                _css(ghostEl, 'width', rect.width * 2 - ghostRect.width);
-                _css(ghostEl, 'height', rect.height * 2 - ghostRect.height);
-            }
-        },
-        _onDragStart: function (evt, useFallback) {
-            var dataTransfer = evt.dataTransfer, options = this.options;
-            this._offUpEvents();
-            if (activeGroup.pull == 'clone') {
-                cloneEl = dragEl.cloneNode(true);
-                _css(cloneEl, 'display', 'none');
-                rootEl.insertBefore(cloneEl, dragEl);
-            }
-            if (useFallback) {
-                if (useFallback === 'touch') {
-                    _on(document, 'touchmove', this._onTouchMove);
-                    _on(document, 'touchend', this._onDrop);
-                    _on(document, 'touchcancel', this._onDrop);
-                } else {
-                    _on(document, 'mousemove', this._onTouchMove);
-                    _on(document, 'mouseup', this._onDrop);
-                }
-                this._loopId = setInterval(this._emulateDragOver, 50);
-            } else {
-                if (dataTransfer) {
-                    dataTransfer.effectAllowed = 'move';
-                    options.setData && options.setData.call(this, dataTransfer, dragEl);
-                }
-                _on(document, 'drop', this);
-                setTimeout(this._dragStarted, 0);
-            }
-        },
-        _onDragOver: function (evt) {
-            var el = this.el, target, dragRect, revert, options = this.options, group = options.group, groupPut = group.put, isOwner = activeGroup === group, canSort = options.sort;
-            if (evt.preventDefault !== void 0) {
-                evt.preventDefault();
-                !options.dragoverBubble && evt.stopPropagation();
-            }
-            moved = true;
-            if (activeGroup && !options.disabled && (isOwner ? canSort || (revert = !rootEl.contains(dragEl)) : activeGroup.pull && groupPut && (activeGroup.name === group.name || groupPut.indexOf && ~groupPut.indexOf(activeGroup.name))) && (evt.rootEl === void 0 || evt.rootEl === this.el)) {
-                _autoScroll(evt, options, this.el);
-                if (_silent) {
-                    return;
-                }
-                target = _closest(evt.target, options.draggable, el);
-                dragRect = dragEl.getBoundingClientRect();
-                if (revert) {
-                    _cloneHide(true);
-                    if (cloneEl || nextEl) {
-                        rootEl.insertBefore(dragEl, cloneEl || nextEl);
-                    } else if (!canSort) {
-                        rootEl.appendChild(dragEl);
-                    }
-                    return;
-                }
-                if (el.children.length === 0 || el.children[0] === ghostEl || el === evt.target && (target = _ghostIsLast(el, evt))) {
-                    if (target) {
-                        if (target.animated) {
-                            return;
-                        }
-                        targetRect = target.getBoundingClientRect();
-                    }
-                    _cloneHide(isOwner);
-                    if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect) !== false) {
-                        if (!dragEl.contains(el)) {
-                            el.appendChild(dragEl);
-                            parentEl = el;
-                        }
-                        this._animate(dragRect, dragEl);
-                        target && this._animate(targetRect, target);
-                    }
-                } else if (target && !target.animated && target !== dragEl && target.parentNode[expando] !== void 0) {
-                    if (lastEl !== target) {
-                        lastEl = target;
-                        lastCSS = _css(target);
-                        lastParentCSS = _css(target.parentNode);
-                    }
-                    var targetRect = target.getBoundingClientRect(), width = targetRect.right - targetRect.left, height = targetRect.bottom - targetRect.top, floating = /left|right|inline/.test(lastCSS.cssFloat + lastCSS.display) || lastParentCSS.display == 'flex' && lastParentCSS['flex-direction'].indexOf('row') === 0, isWide = target.offsetWidth > dragEl.offsetWidth, isLong = target.offsetHeight > dragEl.offsetHeight, halfway = (floating ? (evt.clientX - targetRect.left) / width : (evt.clientY - targetRect.top) / height) > 0.5, nextSibling = target.nextElementSibling, moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect), after;
-                    if (moveVector !== false) {
-                        _silent = true;
-                        setTimeout(_unsilent, 30);
-                        _cloneHide(isOwner);
-                        if (moveVector === 1 || moveVector === -1) {
-                            after = moveVector === 1;
-                        } else if (floating) {
-                            var elTop = dragEl.offsetTop, tgTop = target.offsetTop;
-                            if (elTop === tgTop) {
-                                after = target.previousElementSibling === dragEl && !isWide || halfway && isWide;
-                            } else {
-                                after = tgTop > elTop;
-                            }
-                        } else {
-                            after = nextSibling !== dragEl && !isLong || halfway && isLong;
-                        }
-                        if (!dragEl.contains(el)) {
-                            if (after && !nextSibling) {
-                                el.appendChild(dragEl);
-                            } else {
-                                target.parentNode.insertBefore(dragEl, after ? nextSibling : target);
-                            }
-                        }
-                        parentEl = dragEl.parentNode;
-                        this._animate(dragRect, dragEl);
-                        this._animate(targetRect, target);
-                    }
-                }
-            }
-        },
-        _animate: function (prevRect, target) {
-            var ms = this.options.animation;
-            if (ms) {
-                var currentRect = target.getBoundingClientRect();
-                _css(target, 'transition', 'none');
-                _css(target, 'transform', 'translate3d(' + (prevRect.left - currentRect.left) + 'px,' + (prevRect.top - currentRect.top) + 'px,0)');
-                target.offsetWidth;
-                _css(target, 'transition', 'all ' + ms + 'ms');
-                _css(target, 'transform', 'translate3d(0,0,0)');
-                clearTimeout(target.animated);
-                target.animated = setTimeout(function () {
-                    _css(target, 'transition', '');
-                    _css(target, 'transform', '');
-                    target.animated = false;
-                }, ms);
-            }
-        },
-        _offUpEvents: function () {
-            var ownerDocument = this.el.ownerDocument;
-            _off(document, 'touchmove', this._onTouchMove);
-            _off(ownerDocument, 'mouseup', this._onDrop);
-            _off(ownerDocument, 'touchend', this._onDrop);
-            _off(ownerDocument, 'touchcancel', this._onDrop);
-        },
-        _onDrop: function (evt) {
-            var el = this.el, options = this.options;
-            clearInterval(this._loopId);
-            clearInterval(autoScroll.pid);
-            clearTimeout(this._dragStartTimer);
-            _off(document, 'mousemove', this._onTouchMove);
-            if (this.nativeDraggable) {
-                _off(document, 'drop', this);
-                _off(el, 'dragstart', this._onDragStart);
-            }
-            this._offUpEvents();
-            if (evt) {
-                if (moved) {
-                    evt.preventDefault();
-                    !options.dropBubble && evt.stopPropagation();
-                }
-                ghostEl && ghostEl.parentNode.removeChild(ghostEl);
-                if (dragEl) {
-                    if (this.nativeDraggable) {
-                        _off(dragEl, 'dragend', this);
-                    }
-                    _disableDraggable(dragEl);
-                    _toggleClass(dragEl, this.options.ghostClass, false);
-                    _toggleClass(dragEl, this.options.chosenClass, false);
-                    if (rootEl !== parentEl) {
-                        newIndex = _index(dragEl, options.draggable);
-                        if (newIndex >= 0) {
-                            _dispatchEvent(null, parentEl, 'sort', dragEl, rootEl, oldIndex, newIndex);
-                            _dispatchEvent(this, rootEl, 'sort', dragEl, rootEl, oldIndex, newIndex);
-                            _dispatchEvent(null, parentEl, 'add', dragEl, rootEl, oldIndex, newIndex);
-                            _dispatchEvent(this, rootEl, 'remove', dragEl, rootEl, oldIndex, newIndex);
-                        }
-                    } else {
-                        cloneEl && cloneEl.parentNode.removeChild(cloneEl);
-                        if (dragEl.nextSibling !== nextEl) {
-                            newIndex = _index(dragEl, options.draggable);
-                            if (newIndex >= 0) {
-                                _dispatchEvent(this, rootEl, 'update', dragEl, rootEl, oldIndex, newIndex);
-                                _dispatchEvent(this, rootEl, 'sort', dragEl, rootEl, oldIndex, newIndex);
-                            }
-                        }
-                    }
-                    if (Sortable.active) {
-                        if (newIndex === null || newIndex === -1) {
-                            newIndex = oldIndex;
-                        }
-                        _dispatchEvent(this, rootEl, 'end', dragEl, rootEl, oldIndex, newIndex);
-                        this.save();
-                    }
-                }
-            }
-            this._nulling();
-        },
-        _nulling: function () {
-            rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = scrollEl = scrollParentEl = tapEvt = touchEvt = moved = newIndex = lastEl = lastCSS = activeGroup = Sortable.active = null;
-        },
-        handleEvent: function (evt) {
-            var type = evt.type;
-            if (type === 'dragover' || type === 'dragenter') {
-                if (dragEl) {
-                    this._onDragOver(evt);
-                    _globalDragOver(evt);
-                }
-            } else if (type === 'drop' || type === 'dragend') {
-                this._onDrop(evt);
-            }
-        },
-        toArray: function () {
-            var order = [], el, children = this.el.children, i = 0, n = children.length, options = this.options;
-            for (; i < n; i++) {
-                el = children[i];
-                if (_closest(el, options.draggable, this.el)) {
-                    order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));
-                }
-            }
-            return order;
-        },
-        sort: function (order) {
-            var items = {}, rootEl = this.el;
-            this.toArray().forEach(function (id, i) {
-                var el = rootEl.children[i];
-                if (_closest(el, this.options.draggable, rootEl)) {
-                    items[id] = el;
-                }
-            }, this);
-            order.forEach(function (id) {
-                if (items[id]) {
-                    rootEl.removeChild(items[id]);
-                    rootEl.appendChild(items[id]);
-                }
-            });
-        },
-        save: function () {
-            var store = this.options.store;
-            store && store.set(this);
-        },
-        closest: function (el, selector) {
-            return _closest(el, selector || this.options.draggable, this.el);
-        },
-        option: function (name, value) {
-            var options = this.options;
-            if (value === void 0) {
-                return options[name];
-            } else {
-                options[name] = value;
-                if (name === 'group') {
-                    _prepareGroup(options);
-                }
-            }
-        },
-        destroy: function () {
-            var el = this.el;
-            el[expando] = null;
-            _off(el, 'mousedown', this._onTapStart);
-            _off(el, 'touchstart', this._onTapStart);
-            if (this.nativeDraggable) {
-                _off(el, 'dragover', this);
-                _off(el, 'dragenter', this);
-            }
-            Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {
-                el.removeAttribute('draggable');
-            });
-            touchDragOverListeners.splice(touchDragOverListeners.indexOf(this._onDragOver), 1);
-            this._onDrop();
-            this.el = el = null;
-        }
-    };
-    function _cloneHide(state) {
-        if (cloneEl && cloneEl.state !== state) {
-            _css(cloneEl, 'display', state ? 'none' : '');
-            !state && cloneEl.state && rootEl.insertBefore(cloneEl, dragEl);
-            cloneEl.state = state;
-        }
-    }
-    function _closest(el, selector, ctx) {
-        if (el) {
-            ctx = ctx || document;
-            do {
-                if (selector === '>*' && el.parentNode === ctx || _matches(el, selector)) {
-                    return el;
-                }
-            } while (el !== ctx && (el = el.parentNode));
-        }
-        return null;
-    }
-    function _globalDragOver(evt) {
-        if (evt.dataTransfer) {
-            evt.dataTransfer.dropEffect = 'move';
-        }
-        evt.preventDefault();
-    }
-    function _on(el, event, fn) {
-        el.addEventListener(event, fn, false);
-    }
-    function _off(el, event, fn) {
-        el.removeEventListener(event, fn, false);
-    }
-    function _toggleClass(el, name, state) {
-        if (el) {
-            if (el.classList) {
-                el.classList[state ? 'add' : 'remove'](name);
-            } else {
-                var className = (' ' + el.className + ' ').replace(RSPACE, ' ').replace(' ' + name + ' ', ' ');
-                el.className = (className + (state ? ' ' + name : '')).replace(RSPACE, ' ');
-            }
-        }
-    }
-    function _css(el, prop, val) {
-        var style = el && el.style;
-        if (style) {
-            if (val === void 0) {
-                if (document.defaultView && document.defaultView.getComputedStyle) {
-                    val = document.defaultView.getComputedStyle(el, '');
-                } else if (el.currentStyle) {
-                    val = el.currentStyle;
-                }
-                return prop === void 0 ? val : val[prop];
-            } else {
-                if (!(prop in style)) {
-                    prop = '-webkit-' + prop;
-                }
-                style[prop] = val + (typeof val === 'string' ? '' : 'px');
-            }
-        }
-    }
-    function _find(ctx, tagName, iterator) {
-        if (ctx) {
-            var list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;
-            if (iterator) {
-                for (; i < n; i++) {
-                    iterator(list[i], i);
-                }
-            }
-            return list;
-        }
-        return [];
-    }
-    function _dispatchEvent(sortable, rootEl, name, targetEl, fromEl, startIndex, newIndex) {
-        var evt = document.createEvent('Event'), options = (sortable || rootEl[expando]).options, onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);
-        evt.initEvent(name, true, true);
-        evt.to = rootEl;
-        evt.from = fromEl || rootEl;
-        evt.item = targetEl || rootEl;
-        evt.clone = cloneEl;
-        evt.oldIndex = startIndex;
-        evt.newIndex = newIndex;
-        rootEl.dispatchEvent(evt);
-        if (options[onName]) {
-            options[onName].call(sortable, evt);
-        }
-    }
-    function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect) {
-        var evt, sortable = fromEl[expando], onMoveFn = sortable.options.onMove, retVal;
-        evt = document.createEvent('Event');
-        evt.initEvent('move', true, true);
-        evt.to = toEl;
-        evt.from = fromEl;
-        evt.dragged = dragEl;
-        evt.draggedRect = dragRect;
-        evt.related = targetEl || toEl;
-        evt.relatedRect = targetRect || toEl.getBoundingClientRect();
-        fromEl.dispatchEvent(evt);
-        if (onMoveFn) {
-            retVal = onMoveFn.call(sortable, evt);
-        }
-        return retVal;
-    }
-    function _disableDraggable(el) {
-        el.draggable = false;
-    }
-    function _unsilent() {
-        _silent = false;
-    }
-    function _ghostIsLast(el, evt) {
-        var lastEl = el.lastElementChild, rect = lastEl.getBoundingClientRect();
-        return (evt.clientY - (rect.top + rect.height) > 5 || evt.clientX - (rect.right + rect.width) > 5) && lastEl;
-    }
-    function _generateId(el) {
-        var str = el.tagName + el.className + el.src + el.href + el.textContent, i = str.length, sum = 0;
-        while (i--) {
-            sum += str.charCodeAt(i);
-        }
-        return sum.toString(36);
-    }
-    function _index(el, selector) {
-        var index = 0;
-        if (!el || !el.parentNode) {
-            return -1;
-        }
-        while (el && (el = el.previousElementSibling)) {
-            if (el.nodeName.toUpperCase() !== 'TEMPLATE' && _matches(el, selector)) {
-                index++;
-            }
-        }
-        return index;
-    }
-    function _matches(el, selector) {
-        if (el) {
-            selector = selector.split('.');
-            var tag = selector.shift().toUpperCase(), re = new RegExp('\\s(' + selector.join('|') + ')(?=\\s)', 'g');
-            return (tag === '' || el.nodeName.toUpperCase() == tag) && (!selector.length || ((' ' + el.className + ' ').match(re) || []).length == selector.length);
-        }
-        return false;
-    }
-    function _throttle(callback, ms) {
-        var args, _this;
-        return function () {
-            if (args === void 0) {
-                args = arguments;
-                _this = this;
-                setTimeout(function () {
-                    if (args.length === 1) {
-                        callback.call(_this, args[0]);
-                    } else {
-                        callback.apply(_this, args);
-                    }
-                    args = void 0;
-                }, ms);
-            }
-        };
-    }
-    function _extend(dst, src) {
-        if (dst && src) {
-            for (var key in src) {
-                if (src.hasOwnProperty(key)) {
-                    dst[key] = src[key];
-                }
-            }
-        }
-        return dst;
-    }
-    Sortable.utils = {
-        on: _on,
-        off: _off,
-        css: _css,
-        find: _find,
-        is: function (el, selector) {
-            return !!_closest(el, selector, el);
-        },
-        extend: _extend,
-        throttle: _throttle,
-        closest: _closest,
-        toggleClass: _toggleClass,
-        index: _index
-    };
-    Sortable.create = function (el, options) {
-        return new Sortable(el, options);
-    };
-    Sortable.version = '1.4.2';
-    return Sortable;
-}));
-CommonControlsLayerSwitcherDOM = function (Sortable) {
-    var LayerSwitcherDOM = {
-        _createDraggableElement: function (elementDraggable, context) {
-            Sortable.create(elementDraggable, {
-                handle: '.GPlayerName',
-                draggable: '.draggable-layer',
-                ghostClass: 'GPghostLayer',
-                animation: 200,
-                onEnd: function (e) {
-                    context._onDragAndDropLayerClick(e);
-                }
-            });
-        },
-        _addUID: function (id) {
-            var uid = this._uid ? id + '-' + this._uid : id;
-            return uid;
-        },
-        _createMainContainerElement: function () {
-            var container = document.createElement('div');
-            container.id = this._addUID('GPlayerSwitcher');
-            container.className = 'GPwidget';
-            return container;
-        },
-        _createMainLayersShowElement: function () {
-            var input = document.createElement('input');
-            input.id = this._addUID('GPshowLayersList');
-            input.type = 'checkbox';
-            return input;
-        },
-        _createMainLayersElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPlayersList');
-            div.className = 'GPpanel';
-            return div;
-        },
-        _createMainPictoElement: function () {
-            var self = this;
-            var label = document.createElement('label');
-            label.id = this._addUID('GPshowLayersListPicto');
-            label.className = 'GPshowAdvancedToolPicto';
-            label.htmlFor = this._addUID('GPshowLayersList');
-            label.title = 'Afficher/masquer le gestionnaire de couches';
-            var spanOpen = document.createElement('span');
-            spanOpen.id = this._addUID('GPshowLayersListOpen');
-            spanOpen.className = 'GPshowAdvancedToolOpen';
-            spanOpen.addEventListener('click', function () {
-                if (document.getElementById(self._addUID('GPshowLayersList')).checked) {
-                    var layers = document.getElementsByClassName('GPlayerInfoOpened');
-                    for (var i = 0; i < layers.length; i++) {
-                        layers[i].className = 'GPlayerInfo';
-                    }
-                    document.getElementById(self._addUID('GPlayerInfoPanel')).className = 'GPlayerInfoPanelClosed';
-                }
-            });
-            label.appendChild(spanOpen);
-            var spanClose = document.createElement('span');
-            spanClose.addEventListener('click', function () {
-                if (document.getElementById(self._addUID('GPshowLayersList')).checked) {
-                    var layers = document.getElementsByClassName('GPlayerInfoOpened');
-                    for (var i = 0; i < layers.length; i++) {
-                        layers[i].className = 'GPlayerInfo';
-                    }
-                    document.getElementById(self._addUID('GPlayerInfoPanel')).className = 'GPlayerInfoPanelClosed';
-                }
-            });
-            spanClose.id = self._addUID('GPshowLayersListClose');
-            label.appendChild(spanClose);
-            return label;
-        },
-        _createMainInfoElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPlayerInfoPanel');
-            div.className = 'GPpanel GPlayerInfoPanelClosed';
-            return div;
-        },
-        _createContainerLayerElement: function (obj) {
-            var container = document.createElement('div');
-            container.id = 'GPlayerSwitcher_ID' + obj.id;
-            container.className = 'GPlayerSwitcher_layer draggable-layer';
-            container.appendChild(this._createBasicToolElement(obj));
-            var array = this._createAdvancedToolShowElement(obj);
-            for (var i = 0; i < array.length; i++) {
-                container.appendChild(array[i]);
-            }
-            container.appendChild(this._createAdvancedToolElement(obj));
-            return container;
-        },
-        _createBasicToolElement: function (obj) {
-            var div = document.createElement('div');
-            div.id = 'GPbasicTools_IDLayer' + obj.id;
-            div.className = 'GPlayerBasicTools';
-            div.appendChild(this._createBasicToolNameElement(obj));
-            var array = this._createBasicToolVisibilityElement(obj);
-            for (var i = 0; i < array.length; i++) {
-                div.appendChild(array[i]);
-            }
-            return div;
-        },
-        _createBasicToolNameElement: function (obj) {
-            var span = document.createElement('span');
-            span.id = 'GPname_ID' + obj.id;
-            span.className = 'GPlayerName';
-            span.title = obj.description || obj.title;
-            span.innerHTML = obj.title;
-            return span;
-        },
-        _createBasicToolVisibilityElement: function (obj) {
-            var list = [];
-            var checked = obj.visibility;
-            var id = 'GPvisibility_ID' + obj.id;
-            var input = document.createElement('input');
-            input.id = id;
-            input.type = 'checkbox';
-            input.checked = checked;
-            var label = document.createElement('label');
-            label.htmlFor = id;
-            label.id = 'GPvisibilityPicto_ID' + obj.id;
-            label.className = 'GPlayerVisibility';
-            label.title = 'Afficher/masquer la couche';
-            var context = this;
-            if (input.addEventListener) {
-                input.addEventListener('click', function (e) {
-                    context._onVisibilityLayerClick.call(context, e);
-                });
-            } else if (input.attachEvent) {
-                input.attachEvent('onclick', function (e) {
-                    context._onVisibilityLayerClick.call(context, e);
-                });
-            }
-            list.push(input);
-            list.push(label);
-            return list;
-        },
-        _createAdvancedToolShowElement: function (obj) {
-            var list = [];
-            var label = document.createElement('label');
-            label.id = 'GPshowAdvancedToolsPicto_ID' + obj.id;
-            label.htmlFor = 'GPshowAdvancedTools_ID' + obj.id;
-            label.title = 'Plus d\'outils';
-            label.className = 'GPshowMoreOptions GPshowLayerAdvancedTools';
-            var input = document.createElement('input');
-            input.type = 'checkbox';
-            input.id = 'GPshowAdvancedTools_ID' + obj.id;
-            list.push(input);
-            list.push(label);
-            return list;
-        },
-        _createAdvancedToolElement: function (obj) {
-            var container = document.createElement('div');
-            container.id = 'GPadvancedTools_ID' + obj.id;
-            container.className = 'GPlayerAdvancedTools';
-            container.appendChild(this._createAdvancedToolDeleteElement(obj));
-            if (obj.title && obj.description) {
-                container.appendChild(this._createAdvancedToolInformationElement(obj));
-            }
-            if (obj.type !== 'feature') {
-                var array = this._createAdvancedToolOpacityElement(obj);
-                for (var i = 0; i < array.length; i++) {
-                    container.appendChild(array[i]);
-                }
-            }
-            return container;
-        },
-        _createAdvancedToolDeleteElement: function (obj) {
-            var div = document.createElement('div');
-            div.id = 'GPremove_ID' + obj.id;
-            div.className = 'GPlayerRemove';
-            div.title = 'Supprimer la couche';
-            div.layerId = obj.id;
-            var context = this;
-            if (div.addEventListener) {
-                div.addEventListener('click', function (e) {
-                    context._onDropLayerClick.call(context, e);
-                });
-            } else if (div.attachEvent) {
-                div.attachEvent('onclick', function (e) {
-                    context._onDropLayerClick.call(context, e);
-                });
-            }
-            return div;
-        },
-        _createAdvancedToolInformationElement: function (obj) {
-            var div = document.createElement('div');
-            div.id = 'GPinfo_ID' + obj.id;
-            div.className = 'GPlayerInfo';
-            div.title = 'Informations/légende';
-            div.layerId = obj.id;
-            var context = this;
-            if (div.addEventListener) {
-                div.addEventListener('click', function (e) {
-                    context._onOpenLayerInfoClick.call(context, e);
-                });
-            } else if (div.attachEvent) {
-                div.attachEvent('onclick', function (e) {
-                    context._onOpenLayerInfoClick.call(context, e);
-                });
-            }
-            return div;
-        },
-        _createAdvancedToolOpacityElement: function (obj) {
-            var list = [];
-            var divO = document.createElement('div');
-            divO.id = 'GPopacity_ID' + obj.id;
-            divO.className = 'GPlayerOpacity';
-            divO.title = 'Opacité';
-            var opacity = Math.round(obj.opacity * 100);
-            var input = document.createElement('input');
-            input.id = 'GPopacityValueDiv_ID' + obj.id;
-            input.type = 'range';
-            input.value = opacity;
-            var context = this;
-            if (input.addEventListener) {
-                input.addEventListener('change', function (e) {
-                    context._onChangeLayerOpacity.call(context, e);
-                });
-            } else if (input.attachEvent) {
-                input.attachEvent('onchange', function (e) {
-                    context._onChangeLayerOpacity.call(context, e);
-                });
-            }
-            if (input.addEventListener) {
-                input.addEventListener('input', function (e) {
-                    context._onChangeLayerOpacity.call(context, e);
-                });
-            } else if (input.attachEvent) {
-                input.attachEvent('oninput', function (e) {
-                    context._onChangeLayerOpacity.call(context, e);
-                });
-            }
-            divO.appendChild(input);
-            var divC = document.createElement('div');
-            divC.id = 'GPopacityValueDiv_ID' + obj.id;
-            divC.className = 'GPlayerOpacityValue';
-            var span = document.createElement('span');
-            span.id = 'GPopacityValue_ID' + obj.id;
-            span.innerHTML = opacity + '%';
-            divC.appendChild(span);
-            list.push(divO);
-            list.push(divC);
-            return list;
-        },
-        _createContainerLayerInfoElement: function (obj) {
-            var container = document.createElement('div');
-            container.id = 'GPlayerInfoContent';
-            var title = document.createElement('div');
-            title.id = 'GPlayerInfoTitle';
-            title.innerHTML = obj.title;
-            container.appendChild(title);
-            if (obj.quicklookUrl) {
-                var quick = document.createElement('div');
-                quick.id = 'GPlayerInfoQuicklook';
-                quick.title = 'Afficher un aperçu de la couche';
-                var refquick = document.createElement('a');
-                refquick.href = obj.quicklookUrl;
-                refquick.appendChild(quick);
-                container.appendChild(refquick);
-            }
-            var close = document.createElement('div');
-            close.id = 'GPlayerInfoClose';
-            close.title = 'Fermer la fenêtre';
-            var onCloseClick = function () {
-                document.getElementById('GPlayerInfoPanel').className = 'GPlayerInfoPanelClosed';
-                var layers = document.getElementsByClassName('GPlayerInfoOpened');
-                for (var i = 0; i < layers.length; i++) {
-                    layers[i].className = 'GPlayerInfo';
-                }
-            };
-            if (close.addEventListener) {
-                close.addEventListener('click', onCloseClick);
-            } else if (close.attachEvent) {
-                close.attachEvent('onclick', onCloseClick);
-            }
-            container.appendChild(close);
-            var desc = document.createElement('div');
-            desc.id = 'GPlayerInfoDescription';
-            desc.innerHTML = obj.description;
-            container.appendChild(desc);
-            if (obj.metadata) {
-                var mtd = document.createElement('div');
-                mtd.id = 'GPlayerInfoMetadata';
-                var mtdtitle = document.createElement('div');
-                mtdtitle.className = 'GPlayerInfoSubtitle';
-                mtdtitle.innerHTML = 'Métadonnées';
-                mtd.appendChild(mtdtitle);
-                for (var i = 0; i < obj.metadata.length; i++) {
-                    var urlmtd = obj.metadata[i].url;
-                    var mtdlink = document.createElement('div');
-                    mtdlink.className = 'GPlayerInfoLink';
-                    var refmtd = document.createElement('a');
-                    refmtd.href = urlmtd;
-                    refmtd.innerHTML = urlmtd;
-                    mtdlink.appendChild(refmtd);
-                    mtd.appendChild(mtdlink);
-                }
-                if (obj.metadata.length !== 0) {
-                    container.appendChild(mtd);
-                }
-            }
-            if (obj.legends) {
-                var lgd = document.createElement('div');
-                lgd.id = 'GPlayerInfoLegend';
-                var lgdtitle = document.createElement('div');
-                lgdtitle.className = 'GPlayerInfoSubtitle';
-                lgdtitle.innerHTML = 'Légende';
-                lgd.appendChild(lgdtitle);
-                var legends = {};
-                var maxScale = obj.maxScaleDenominator || 560000000;
-                for (var k = 0; k < obj.legends.length; k++) {
-                    var minScale = obj.legends[k].minScaleDenominator;
-                    if (minScale) {
-                        var s = minScale.toString();
-                        minScale = Math.round(parseInt(s.substring(0, 3), 10) / 10) * Math.pow(10, s.length - 2);
-                    } else {
-                        minScale = 270;
-                    }
-                    legends[minScale] = obj.legends[k];
-                }
-                for (var scale in legends) {
-                    if (legends.hasOwnProperty(scale)) {
-                        var urllgd = legends[scale].url;
-                        if (typeof urllgd === 'string' && urllgd.toLowerCase().indexOf('nolegend.jpg') == -1) {
-                            var lgdlink = document.createElement('div');
-                            lgdlink.className = 'GPlayerInfoLink';
-                            maxScale = legends[scale].maxScaleDenominator || maxScale;
-                            var reflgd = document.createElement('a');
-                            reflgd.href = urllgd;
-                            reflgd.innerHTML = 'Du 1/' + scale + ' au 1/' + maxScale;
-                            lgdlink.appendChild(reflgd);
-                            lgd.appendChild(lgdlink);
-                        } else {
-                            delete legends[scale];
-                        }
-                    }
-                }
-                if (Object.keys(legends).length !== 0) {
-                    container.appendChild(lgd);
-                }
-            }
-            return container;
-        }
-    };
-    return LayerSwitcherDOM;
-}(sortable);
-LeafletControlsLayerSwitcher = function (L, woodman, LayerSwitcherDOM) {
-    var LayerSwitcher = L.Control.Layers.extend({
-        includes: LayerSwitcherDOM,
-        options: {
-            collapsed: true,
-            position: 'topright',
-            autoZIndex: true,
-            layers: []
-        },
-        initialize: function (options) {
-            L.Util.setOptions(this, options);
-            this._hasLayersConfig = !this.options.layers || Object.keys(this.options.layers).length === 0 ? false : true;
-            this._layersConfig = this._hasLayersConfig ? this.options.layers : [];
-            this._layers = {};
-            this._lastZIndex = 0;
-            if (this._hasLayersConfig) {
-                for (var i = 0; i < this._layersConfig.length; i++) {
-                    var obj = this._layersConfig[i];
-                    this._addLayer(obj.layer, null, true);
-                }
-            }
-        },
-        onAdd: function (map) {
-            var layersMap = map._layers;
-            if (Object.keys(layersMap).length !== 0) {
-                var layersKeys = Object.keys(layersMap);
-                this._lastZIndex = 0;
-                for (var i = 0; i < layersKeys.length; i++) {
-                    var layerId = layersKeys[i];
-                    if (this.options.autoZIndex && layersMap[layerId].setZIndex) {
-                        this._lastZIndex++;
-                        layersMap[layerId].setZIndex(this._lastZIndex);
-                    }
-                    if (this._hasLayersConfig) {
-                        if (this._layers[layerId]) {
-                            continue;
-                        }
-                    }
-                    this.addOverlay(layersMap[layerId]);
-                }
-            }
-            if (Object.keys(layersMap).length === 0) {
-                var config = this._layersConfig;
-                this._lastZIndex = 0;
-                for (var j = 0; j < config.length; j++) {
-                    var layer = config[j].layer;
-                    if (!map.hasLayer(layer)) {
-                        map.addLayer(layer);
-                        this.addOverlay(layer, null);
-                        if (this.options.autoZIndex && layer.setZIndex) {
-                            this._lastZIndex++;
-                            layer.setZIndex(this._lastZIndex);
-                        }
-                    }
-                }
-            }
-            for (var k in this._layers) {
-                if (this._layers.hasOwnProperty(k)) {
-                    var obj = this._layers[k];
-                    if (!obj.visibility) {
-                        this._visibilityLayer(!obj.visibility, obj.layer);
-                    }
-                }
-            }
-            this._initLayout();
-            this._update();
-            map.on('layeradd', this._onLayerChange, this);
-            map.on('layerremove', this._onLayerChange, this);
-            return this._container;
-        },
-        _addLayer: function (layer, name, overlay) {
-            var id = layer._geoportal_id ? layer._geoportal_id : layer._leaflet_id;
-            if (!id) {
-                return;
-            }
-            var layerConfig = {};
-            for (var i in this._layersConfig) {
-                if (this._layersConfig.hasOwnProperty(i)) {
-                    if (id === L.stamp(this._layersConfig[i].layer)) {
-                        layerConfig = this._layersConfig[i].config;
-                        var display = typeof this._layersConfig[i].display != 'undefined' ? this._layersConfig[i].display : true;
-                        if (!display) {
-                            return;
-                        }
-                        break;
-                    }
-                }
-            }
-            this._layers[id] = {
-                layer: layer,
-                id: id,
-                overlay: overlay,
-                title: layer._geoportal_id && layer._title ? layer._title : name ? name : id,
-                description: layer._geoportal_id && layer._description ? layer._description : name ? name : id,
-                visibility: layer._geoportal_id ? layer.getVisible() : true,
-                legends: layer._geoportal_id ? layer._legends : null,
-                metadata: layer._geoportal_id ? layer._metadata : null,
-                quicklookUrl: layer._geoportal_id ? layer._quicklookUrl : null
-            };
-            if (layerConfig && Object.keys(layerConfig)) {
-                L.Util.extend(this._layers[id], layerConfig);
-            }
-            layer._geoportal_id ? layer.setVisible(this._layers[id].visibility) : null;
-        },
-        _initLayout: function () {
-            var container = this._container = this._createMainContainerElement();
-            var input = this._createMainLayersShowElement();
-            container.appendChild(input);
-            if (!this.options.collapsed) {
-                input.checked = 'checked';
-            }
-            var divL = this._overlaysList = this._createMainLayersElement();
-            container.appendChild(divL);
-            var picto = this._createMainPictoElement();
-            container.appendChild(picto);
-            var divI = this._createMainInfoElement();
-            container.appendChild(divI);
-            this._createDraggableElement(this._overlaysList, this);
-            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
-            this._map.on('moveend', this._onOutOfRangeLayerZoom, this);
-            switch (this.getPosition()) {
-            case 'topright':
-                container.style.position = 'relative';
-                container.style.top = '0';
-                container.style.right = '0';
-                break;
-            case 'topleft':
-                container.style.position = 'relative';
-                container.style.top = '0';
-                container.style.right = 'initial';
-                picto.style.float = 'left';
-                divL.style.borderBottomRightRadius = '5px';
-                divL.style.borderBottomLeftRadius = '0';
-                divI.style.right = 'initial';
-                divI.style.left = '190px';
-                break;
-            case 'bottomleft':
-                container.style.position = 'relative';
-                container.style.top = '0';
-                container.style.right = 'initial';
-                picto.style.float = 'left';
-                divL.style.borderBottomRightRadius = '5px';
-                divL.style.borderBottomLeftRadius = '0';
-                divI.style.right = 'initial';
-                divI.style.left = '190px';
-                break;
-            case 'bottomright':
-                container.style.position = 'relative';
-                container.style.top = '0';
-                container.style.right = '0';
-                break;
-            default:
-                container.style.position = 'relative';
-                container.style.top = '0';
-                container.style.right = '0';
-            }
-        },
-        _update: function () {
-            if (!this._container) {
-                return;
-            }
-            this._overlaysList.innerHTML = '';
-            var layersId = [];
-            for (var i in this._layers) {
-                if (this._layers.hasOwnProperty(i)) {
-                    layersId.push(i);
-                }
-            }
-            var layers = layersId.sort(function (a, b) {
-                var ia = parseInt(a, 10);
-                var ib = parseInt(b, 10);
-                return ia - ib;
-            }).reverse();
-            for (var j = 0; j < layers.length; j++) {
-                var id = layers[j];
-                var obj = this._layers[id];
-                this._addItem(obj);
-            }
-        },
-        _addItem: function (obj) {
-            obj.opacity = obj.layer.options.opacity;
-            var container = this._createContainerLayerElement(obj);
-            obj.layer.options.minZoom > this._map.getZoom() || obj.layer.options.maxZoom < this._map.getZoom() ? L.DomUtil.addClass(container, 'outOfRange') : L.DomUtil.removeClass(container, 'outOfRange');
-            this._overlaysList.appendChild(container);
-            return container;
-        },
-        _onLayerChange: function (e) {
-            var obj = this._layers[L.stamp(e.layer)];
-            if (!obj) {
-                return;
-            }
-            if (!this._handlingClick) {
-                this._update();
-            }
-            var type = e.type === 'layeradd' ? 'overlayadd' : 'overlayremove';
-            if (type) {
-                this._map.fire(type, obj);
-            }
-        },
-        removeLayer: function (layer) {
-            var id = L.stamp(layer);
-            delete this._layers[id];
-            this._update();
-            return this;
-        },
-        _visibilityLayer: function (checked, layer) {
-            this._handlingClick = true;
-            if (layer._geoportal_id) {
-                var value = !layer.getVisible();
-                layer.setVisible(value);
-            }
-            if (checked && this._map.hasLayer(layer)) {
-                this._map.removeLayer(layer);
-            } else if (!checked && !this._map.hasLayer(layer)) {
-                this._map.addLayer(layer);
-            } else {
-            }
-            this._handlingClick = false;
-            this._refocusOnMap();
-        },
-        _onOutOfRangeLayerZoom: function () {
-            var map = this._map;
-            var layers = this._layers;
-            for (var i in layers) {
-                if (layers.hasOwnProperty(i)) {
-                    var layer = layers[i].layer;
-                    var id = layers[i].id;
-                    var div = L.DomUtil.get('GPlayerSwitcher_ID' + id);
-                    if (layer.options.minZoom > map.getZoom() || layer.options.maxZoom < map.getZoom()) {
-                        L.DomUtil.addClass(div, 'outOfRange');
-                    } else {
-                        L.DomUtil.removeClass(div, 'outOfRange');
-                    }
-                }
-            }
-        },
-        _onVisibilityLayerClick: function (e) {
-            var layerId = e.target.id;
-            var layerIdx = layerId.substring(layerId.indexOf('_') + 3);
-            var input = L.DomUtil.get(layerId);
-            this._layers[layerIdx].visibility = input.checked;
-            this._visibilityLayer(!input.checked, this._layers[layerIdx].layer);
-        },
-        _onDropLayerClick: function (e) {
-            var layerId = e.target.id;
-            var layerIdx = layerId.substring(layerId.indexOf('_') + 3);
-            var layer = this._layers[layerIdx].layer;
-            this.removeLayer(layer);
-            if (this._map.hasLayer(layer)) {
-                this._map.removeLayer(layer);
-            }
-        },
-        _onChangeLayerOpacity: function (e) {
-            var layerId = e.target.id;
-            var layerIdx = layerId.substring(layerId.indexOf('_') + 3);
-            var layer = this._layers[layerIdx].layer;
-            var opacityValue = e.target.value;
-            var opacityId = L.DomUtil.get('GPopacityValue_ID' + layerIdx);
-            opacityId.innerHTML = opacityValue + '%';
-            if (this._map.hasLayer(layer)) {
-                layer.setOpacity(opacityValue / 100);
-            }
-        },
-        _onOpenLayerInfoClick: function (e) {
-            var layerId = e.target.id;
-            var layerIdx = layerId.substring(layerId.indexOf('_') + 3);
-            var layer = this._layers[layerIdx];
-            var divId = L.DomUtil.get(e.target.id);
-            var panel = null;
-            var info = null;
-            if (divId.className === 'GPlayerInfoOpened') {
-                L.DomUtil.removeClass(divId, 'GPlayerInfoOpened');
-                L.DomUtil.addClass(divId, 'GPlayerInfo');
-                panel = L.DomUtil.get('GPlayerInfoPanel');
-                L.DomUtil.removeClass(panel, 'GPpanel');
-                L.DomUtil.removeClass(panel, 'GPlayerInfoPanelOpened');
-                L.DomUtil.addClass(panel, 'GPlayerInfoPanelClosed');
-                info = L.DomUtil.get('GPlayerInfoContent');
-                panel.removeChild(info);
-                return;
-            }
-            var layers = document.getElementsByClassName('GPlayerInfoOpened');
-            for (var i = 0; i < layers.length; i++) {
-                layers[i].className = 'GPlayerInfo';
-            }
-            L.DomUtil.removeClass(divId, 'GPlayerInfo');
-            L.DomUtil.addClass(divId, 'GPlayerInfoOpened');
-            panel = L.DomUtil.get('GPlayerInfoPanel');
-            L.DomUtil.addClass(panel, 'GPpanel');
-            L.DomUtil.removeClass(panel, 'GPlayerInfoPanelClosed');
-            L.DomUtil.addClass(panel, 'GPlayerInfoPanelOpened');
-            info = L.DomUtil.get('GPlayerInfoContent');
-            if (info) {
-                panel.removeChild(info);
-            }
-            var infoLayer = this._createContainerLayerInfoElement(layer);
-            panel.appendChild(infoLayer);
-        },
-        _onDragAndDropLayerClick: function (e) {
-            var layerId = e.item.id;
-            var layerIdx = layerId.substring(layerId.indexOf('_') + 3);
-            var layer = this._layers[layerIdx].layer;
-            var matchesLayers = document.querySelectorAll('div.GPlayerSwitcher_layer');
-            this._lastZIndex = matchesLayers.length;
-            for (var i = 0; i < matchesLayers.length; i++) {
-                var tag = matchesLayers[i].id;
-                var id = tag.substring(tag.indexOf('_') + 3);
-                var _layer = this._layers[id].layer;
-                if (this.options.autoZIndex && _layer.setZIndex) {
-                    this._lastZIndex--;
-                    _layer.setZIndex(this._lastZIndex);
-                }
-            }
-        },
-        addLayer: function (layer, config) {
-            var map = this._map;
-            var cfg = this._layersConfig;
-            if (!layer) {
-                console.log('[ERROR] LayerSwitcher:addLayer - missing layer parameter !');
-                return;
-            }
-            if (!map.hasLayer(layer)) {
-                console.log('[WARN] LayerSwitcher:addLayer - layer has not been added on map !');
-            }
-            var id = L.stamp(layer);
-            for (var i in cfg) {
-                if (cfg.hasOwnProperty(i)) {
-                    if (id === L.stamp(cfg[i].layer)) {
-                        delete cfg[i];
-                        break;
-                    }
-                }
-            }
-            var _config = config || {};
-            L.Util.extend(_config, { layer: layer });
-            cfg.push(_config);
-            layer.setZIndex(this._lastZIndex++);
-            this.addOverlay(layer);
-            this._update();
-        }
-    });
-    return LayerSwitcher;
-}(leaflet, {}, CommonControlsLayerSwitcherDOM);
-CommonUtilsConfig = function () {
-    var Config = {
-        configuration: null,
-        isConfigLoaded: function () {
-            var scope = typeof window !== 'undefined' ? window : {};
-            if (scope.Gp && scope.Gp.Config && Object.keys(scope.Gp.Config).length !== 0) {
-                this.configuration = scope.Gp.Config;
-                return true;
-            }
-            return false;
-        },
-        getLayerId: function (layerName, service) {
-            var layerId = null;
-            if (this.configuration) {
-                var layers = this.configuration['layers'];
-                for (var key in layers) {
-                    if (layers.hasOwnProperty(key)) {
-                        var parts = key.split('$');
-                        if (layerName === parts[0]) {
-                            if (parts[1]) {
-                                var servicePartsLayer = parts[1].split(':');
-                                var servicePartsService = parts[1].split(';');
-                                if (servicePartsService[1] === service) {
-                                    layerId = key;
-                                    break;
-                                }
-                                if (servicePartsLayer[2] === service) {
-                                    layerId = key;
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            if (!layerId) {
-                console.log('ERROR layer id (' + layerName + ' / ' + service + ') was not found !?');
-            }
-            return layerId;
-        },
-        getLayerParams: function (layerName, service, apiKey) {
-            var params = {};
-            if (this.configuration) {
-                var layerId = this.getLayerId(layerName, service);
-                if (layerId) {
-                    var layerConf = this.configuration.layers[layerId];
-                    var key = layerConf.apiKeys[0];
-                    if (apiKey) {
-                        if (apiKey !== key) {
-                            console.log('ERROR different keys (' + apiKey + ' !== ' + key + ') !?');
-                            return;
-                        }
-                    }
-                    apiKey = apiKey || key;
-                    params.key = apiKey;
-                    params.url = layerConf.getServerUrl(apiKey);
-                    params.version = layerConf.getServiceParams().version;
-                    params.styles = layerConf.getDefaultStyle();
-                    params.format = layerConf.getDefaultFormat();
-                    params.projection = layerConf.getDefaultProjection();
-                    params.minScale = layerConf.getMinScaleDenominator();
-                    params.maxScale = layerConf.getMaxScaleDenominator();
-                    params.extent = layerConf.getBBOX();
-                    params.legends = layerConf.getLegends();
-                    params.metadata = layerConf.getMetadata();
-                    params.originators = layerConf.getOriginators();
-                    params.title = layerConf.getTitle();
-                    params.description = layerConf.getDescription();
-                    params.quicklookUrl = layerConf.getQuicklookUrl();
-                    if (layerConf.wmtsOptions) {
-                        params.tileMatrixSetLimits = layerConf.wmtsOptions.tileMatrixSetLimits;
-                    }
-                    var TMSLink = layerConf.getTMSID();
-                    if (TMSLink) {
-                        params.TMSLink = TMSLink;
-                        var tmsConf = this.configuration.getTMSConf(TMSLink);
-                        params.matrixOrigin = tmsConf.getTopLeftCorner();
-                        params.nativeResolutions = tmsConf.nativeResolutions;
-                        params.matrixIds = tmsConf.matrixIds;
-                        params.tileMatrices = tmsConf.tileMatrices;
-                    }
-                }
-            }
-            return params;
-        },
-        getServiceParams: function (resource, service, apiKey) {
-            var params = {};
-            if (this.configuration) {
-                var layerId = this.getLayerId(resource, service);
-                if (layerId) {
-                    var layerConf = this.configuration.layers[layerId];
-                    var key = layerConf.apiKeys[0];
-                    if (apiKey) {
-                        if (apiKey !== key) {
-                            return;
-                        }
-                    }
-                    apiKey = apiKey || key;
-                    params.key = apiKey;
-                    params.url = layerConf.getServerUrl(apiKey);
-                    params.version = layerConf.getServiceParams().version;
-                    params.extent = layerConf.getBBOX();
-                    params.title = layerConf.getTitle();
-                    params.description = layerConf.getDescription();
-                }
-            }
-            return params;
-        },
-        getResolutions: function () {
-            var resolutions = [];
-            if (this.configuration) {
-                resolutions = this.configuration['generalOptions']['wgs84Resolutions'];
-            }
-            return resolutions;
-        },
-        getTileMatrix: function (tmsName) {
-            var tms = {};
-            if (this.configuration) {
-                if (tmsName) {
-                    tms = this.configuration['tileMatrixSets'][tmsName.toUpperCase()];
-                }
-            }
-            return tms;
-        },
-        getGlobalConstraints: function (layerId) {
-            var params = {};
-            if (layerId) {
-                var layerConf = this.configuration.layers[layerId];
-                params.projection = layerConf.getDefaultProjection();
-                params.minScale = layerConf.getMinScaleDenominator();
-                params.maxScale = layerConf.getMaxScaleDenominator();
-                params.extent = layerConf.getBBOX();
-            }
-            return params;
-        }
-    };
-    return Config;
-}();
-CommonUtilsCheckRightManagement = function (woodman, Config) {
-    return {
-        check: function (options) {
-            if (!options) {
-                return;
-            }
-            var _key = options.key;
-            var _resources = options.resources || [];
-            var _services = options.services || [];
-            if (!_resources || _resources.length === 0) {
-                return;
-            }
-            if (!_services || _services.length === 0) {
-                return;
-            }
-            var _rightManagement = {};
-            if (!_key) {
-                if (!Config.isConfigLoaded()) {
-                    console.log('WARNING : ' + 'parameter \'apiKey\' has not been parametered, ' + 'and the contract key configuration has not been loaded, ' + 'so impossible to check yours rights !');
-                    return;
-                } else {
-                    _key = Object.keys(Config.configuration.generalOptions.apiKeys)[0];
-                }
-            }
-            if (_key) {
-                if (!Config.isConfigLoaded()) {
-                    console.log('WARNING : ' + 'the contract key configuration has not been loaded, ' + 'so be carefull !');
-                    var _noRightManagement = {};
-                    for (var i = 0; i < _services.length; i++) {
-                        var service = _services[i];
-                        _noRightManagement[service] = [];
-                        for (var j = 0; j < _resources.length; j++) {
-                            var resource = _resources[j];
-                            _noRightManagement[service].push(resource);
-                        }
-                    }
-                    _noRightManagement.key = _key;
-                    return _noRightManagement;
-                } else {
-                    for (var k = 0; k < _resources.length; k++) {
-                        var _resource = _resources[k];
-                        for (var l = 0; l < _services.length; l++) {
-                            var _service = _services[l];
-                            var params = Config.getServiceParams(_resource, _service, _key);
-                            if (!params || Object.keys(params).length === 0) {
-                                console.log('WARNING : ' + 'contract key configuration has no rights to load this geoportal ' + 'resource (' + _resource + ') ' + 'for this service (' + _service + ') ');
-                                continue;
-                            }
-                            if (!_rightManagement[_service]) {
-                                _rightManagement[_service] = [];
-                            }
-                            _rightManagement[_service].push(_resource);
-                        }
-                    }
-                    if (!_rightManagement || Object.keys(_rightManagement).length === 0) {
-                        console.log('WARNING : ' + 'the contract key configuration has been loaded, ' + 'and the parameter \'apiKey\' has been parametered, ' + 'but, there is a problem on the mapping between the contract and the key !');
-                        return;
-                    }
-                    _rightManagement.key = _key;
-                    return _rightManagement;
-                }
-            }
-        }
-    };
-}({}, CommonUtilsConfig);
-CommonUtilsSelectorID = function () {
-    var SelectorID = {
-        generate: function () {
-            var timestamp = Math.floor(Date.now());
-            return function () {
-                return timestamp++;
-            };
-        }(),
-        name: function (id) {
-            var name = null;
-            var i = id.indexOf('-');
-            if (i === -1) {
-                name = id;
-            } else {
-                name = id.substring(0, i);
-            }
-            return name;
-        },
-        index: function (id) {
-            var index = null;
-            var name = this.name(id);
-            if (name !== id) {
-                var i = name.indexOf('_');
-                if (i !== -1) {
-                    index = name.substring(i + 1);
-                }
-            }
-            return index;
-        },
-        uuid: function (id) {
-            var uuid = null;
-            var i = id.indexOf('-');
-            if (i !== -1) {
-                uuid = parseInt(id.substring(i + 1), 10);
-            }
-            return uuid;
-        }
-    };
-    return SelectorID;
-}();
-CommonControlsLocationSelectorDOM = function (ID) {
-    var LocationSelectorDOM = {
-        _addUID: function (id) {
-            return id + '-' + this._uid;
-        },
-        _createMainContainerElement: function () {
-            var container = document.createElement('div');
-            container.className = this._addUID('GPlocationPoint');
-            container.className += ' GPwidget';
-            return container;
-        },
-        _createLocationPointElement: function (id, display) {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPlocationPoint_' + id);
-            div.className = display ? 'GPflexInput GPlocationStageFlexInput' : 'GPflexInput GPlocationStageFlexInputHidden';
-            div.style.cssText = '';
-            return div;
-        },
-        _createLocationPointLabelElement: function (id, text) {
-            var self = this;
-            var labelOrigin = document.createElement('label');
-            labelOrigin.id = this._addUID('GPlocationOriginLabel_' + id);
-            labelOrigin.htmlFor = 'GPlocationOrigin_' + id;
-            labelOrigin.innerHTML = text;
-            labelOrigin.addEventListener('click', function (e) {
-                var i = ID.index(this.id);
-                var points = document.getElementsByClassName(self._addUID('GPlocationPoint'));
-                for (var j = 0; j < points.length; j++) {
-                    var tag = points[j].childNodes[0].id;
-                    var id = ID.index(tag);
-                    document.getElementById(self._addUID('GPlocationPoint_' + id)).style.cssText = '';
-                }
-                document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).value = '';
-                document.getElementById(self._addUID('GPlocationOrigin_' + i)).value = '';
-                document.getElementById(self._addUID('GPlocationPoint_' + i)).style.cssText = '';
-                document.getElementById(self._addUID('GPlocationOriginPointer_' + i)).checked = false;
-                document.getElementById(self._addUID('GPlocationOrigin_' + i)).className = 'GPlocationOriginVisible';
-                document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).className = 'GPlocationOriginHidden';
-                if (document.getElementById(self._addUID('GPlocationStageRemove_' + i))) {
-                    document.getElementById(self._addUID('GPlocationStageRemove_' + i)).className = 'GPlocationStageRemove';
-                }
-                if (document.getElementById(self._addUID('GPlocationStageAdd'))) {
-                    document.getElementById(self._addUID('GPlocationStageAdd')).className = '';
-                }
-                self.onLocationClearPointClick(e);
-            });
-            return labelOrigin;
-        },
-        _createLocationAutoCompleteteInputElement: function (id) {
-            var self = this;
-            var inputOrigin = document.createElement('input');
-            inputOrigin.id = this._addUID('GPlocationOrigin_' + id);
-            inputOrigin.className = 'GPlocationOriginVisible';
-            inputOrigin.type = 'text';
-            inputOrigin.placeholder = 'Saisir une adresse';
-            inputOrigin.autocomplete = 'off';
-            inputOrigin.addEventListener('keyup', function (e) {
-                var charCode = e.which || e.keyCode;
-                if (charCode === 13 || charCode === 10 || charCode === 38 || charCode === 40) {
-                    return;
-                }
-                var i = ID.index(this.id);
-                if (document.getElementById(self._addUID('GPlocationOrigin_' + i)).value.length > 2) {
-                    document.getElementById(self._addUID('GPlocationAutoCompleteList_' + i)).style.display = 'block';
-                } else {
-                    document.getElementById(self._addUID('GPlocationAutoCompleteList_' + i)).style.display = 'none';
-                }
-                self.onAutoCompleteSearchText(e);
-            });
-            inputOrigin.addEventListener('keydown', function (e) {
-                var charCode = e.which || e.keyCode;
-                var container = document.getElementById(self._addUID('GPlocationAutoCompleteList_' + id));
-                if (!container) {
-                    return;
-                }
-                var curr = container.getElementsByClassName('GPautoCompleteProposal current');
-                var list = container.getElementsByClassName('GPautoCompleteProposal');
-                var length = list.length;
-                if (!length) {
-                    return;
-                }
-                var current = null;
-                if (!curr.length) {
-                    current = list[0];
-                    current.className = 'GPautoCompleteProposal current';
-                    current.style.color = '#000000';
-                    current.style['background-color'] = '#CEDBEF';
-                    return;
-                } else {
-                    current = curr[0];
-                }
-                var index = parseInt(ID.index(current.id), 10);
-                var next = index === length - 1 ? list[0] : list[index + 1];
-                var prev = index === 0 ? list[length - 1] : list[index - 1];
-                current.style['background-color'] = '';
-                current.style.color = '';
-                prev.style['background-color'] = '';
-                prev.style.color = '';
-                next.style['background-color'] = '';
-                next.style.color = '';
-                switch (charCode) {
-                case 38:
-                    console.log('arrow up');
-                    current.className = 'GPautoCompleteProposal';
-                    prev.className = 'GPautoCompleteProposal current';
-                    prev.style.color = '#000000';
-                    prev.style['background-color'] = '#CEDBEF';
-                    break;
-                case 40:
-                    console.log('arrow down');
-                    current.className = 'GPautoCompleteProposal';
-                    next.className = 'GPautoCompleteProposal current';
-                    next.style.color = '#000000';
-                    next.style['background-color'] = '#CEDBEF';
-                    break;
-                case 13:
-                    console.log('enter');
-                    current.click(e);
-                    break;
-                }
-                current.focus();
-            });
-            return inputOrigin;
-        },
-        _createLocationCoordinateInputElement: function (id) {
-            var self = this;
-            var inputOriginCoord = document.createElement('input');
-            inputOriginCoord.id = this._addUID('GPlocationOriginCoords_' + id);
-            inputOriginCoord.className = 'GPlocationOriginHidden';
-            inputOriginCoord.type = 'text';
-            inputOriginCoord.disabled = false;
-            inputOriginCoord.addEventListener('click', function () {
-                var i = ID.index(this.id);
-                document.getElementById(self._addUID('GPlocationOriginLabel_' + i)).click();
-            });
-            return inputOriginCoord;
-        },
-        _createLocationPointerShowInputElement: function (id) {
-            var inputOriginPointer = document.createElement('input');
-            inputOriginPointer.id = this._addUID('GPlocationOriginPointer_' + id);
-            inputOriginPointer.type = 'checkbox';
-            return inputOriginPointer;
-        },
-        _createLocationPointerInputElement: function (id) {
-            var self = this;
-            var labelOriginPointer = document.createElement('label');
-            labelOriginPointer.id = this._addUID('GPlocationOriginPointerImg_' + id);
-            labelOriginPointer.htmlFor = 'GPlocationOriginPointer_' + id;
-            labelOriginPointer.className = 'GPlocationOriginPointerImg';
-            labelOriginPointer.title = 'Pointer un lieu sur la carte';
-            labelOriginPointer.addEventListener('click', function (e) {
-                e.preventDefault();
-                e.stopPropagation();
-                var i = ID.index(this.id);
-                var points = document.getElementsByClassName(self._addUID('GPlocationPoint'));
-                var j;
-                var tag;
-                var id;
-                for (j = 0; j < points.length; j++) {
-                    tag = points[j].childNodes[0].id;
-                    id = ID.index(tag);
-                    if (i != id) {
-                        document.getElementById(self._addUID('GPlocationOriginPointer_' + id)).checked = false;
-                        if (document.getElementById(self._addUID('GPlocationOriginCoords_' + id)).value == 'Pointer un lieu sur la carte') {
-                            document.getElementById(self._addUID('GPlocationOriginCoords_' + id)).value = '';
-                            document.getElementById(self._addUID('GPlocationOrigin_' + id)).className = 'GPlocationOriginVisible';
-                            document.getElementById(self._addUID('GPlocationOriginCoords_' + id)).className = 'GPlocationOriginHidden';
-                        }
-                    }
-                }
-                if (document.getElementById(self._addUID('GPlocationOriginPointer_' + i)).checked) {
-                    document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).value = '';
-                    for (j = 0; j < points.length; j++) {
-                        tag = points[j].childNodes[0].id;
-                        id = ID.index(tag);
-                        document.getElementById(self._addUID('GPlocationPoint_' + id)).style.cssText = '';
-                    }
-                    if (document.getElementById(self._addUID('GPlocationStageRemove_' + i))) {
-                        document.getElementById(self._addUID('GPlocationStageRemove_' + i)).className = 'GPlocationStageRemove';
-                    }
-                    if (document.getElementById(self._addUID('GPlocationStageAdd'))) {
-                        document.getElementById(self._addUID('GPlocationStageAdd')).className = '';
-                    }
-                    document.getElementById(self._addUID('GPlocationOriginPointer_' + i)).checked = false;
-                    document.getElementById(self._addUID('GPlocationOrigin_' + i)).className = 'GPlocationOriginVisible';
-                    document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).className = 'GPlocationOriginHidden';
-                } else {
-                    document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).value = 'Pointer un lieu sur la carte';
-                    for (j = 0; j < points.length; j++) {
-                        tag = points[j].childNodes[0].id;
-                        id = ID.index(tag);
-                        if (i == id) {
-                            document.getElementById(self._addUID('GPlocationPoint_' + id)).style.cssText = '';
-                        } else {
-                            document.getElementById(self._addUID('GPlocationPoint_' + id)).style.display = 'none';
-                        }
-                    }
-                    if (document.getElementById(self._addUID('GPlocationStageRemove_' + i))) {
-                        document.getElementById(self._addUID('GPlocationStageRemove_' + i)).className = 'GPlocationOriginHidden';
-                    }
-                    if (document.getElementById(self._addUID('GPlocationStageAdd'))) {
-                        document.getElementById(self._addUID('GPlocationStageAdd')).className = 'GPlocationOriginHidden';
-                    }
-                    document.getElementById(self._addUID('GPlocationOriginPointer_' + i)).checked = true;
-                    document.getElementById(self._addUID('GPlocationOrigin_' + i)).className = 'GPlocationOriginHidden';
-                    document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).className = 'GPlocationOriginVisible';
-                    document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).disabled = true;
-                }
-                self.onActivateMapPointClick(e);
-            });
-            return labelOriginPointer;
-        },
-        _createLocationRemovePointElement: function (id) {
-            var self = this;
-            var divRm = document.createElement('div');
-            divRm.id = this._addUID('GPlocationStageRemove_' + id);
-            divRm.className = 'GPlocationStageRemove';
-            divRm.title = 'Supprimer l\'étape';
-            divRm.addEventListener('click', function (e) {
-                var points = document.getElementsByClassName(self._addUID('GPlocationPoint'));
-                var last = points.length - 1;
-                var start = points[0].childNodes[0].id;
-                var end = points[last].childNodes[0].id;
-                var startID = ID.index(start);
-                var endID = ID.index(end);
-                if (id != startID && id != endID) {
-                    var i = ID.index(this.id);
-                    document.getElementById(self._addUID('GPlocationPoint_' + i)).className = 'GPflexInput GPlocationStageFlexInputHidden';
-                    document.getElementById(self._addUID('GPlocationOrigin_' + i)).value = '';
-                    document.getElementById(self._addUID('GPlocationOrigin_' + i)).className = 'GPlocationOriginVisible';
-                    document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).value = '';
-                    document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).className = 'GPlocationOriginHidden';
-                    document.getElementById(self._addUID('GPlocationStageAdd')).style.display = '';
-                    self.onLocationRemovePointClick(e);
-                }
-            });
-            return divRm;
-        },
-        _createLocationAddPointElement: function () {
-            var self = this;
-            var divAdd = document.createElement('div');
-            divAdd.id = this._addUID('GPlocationStageAdd');
-            divAdd.title = 'Ajouter une étape';
-            divAdd.addEventListener('click', function (e) {
-                var lastStage = 1;
-                var nbStages = 0;
-                var points = document.getElementsByClassName(self._addUID('GPlocationPoint'));
-                for (var i = 1; i < points.length - 1; i++) {
-                    var tag = points[i].childNodes[0].id;
-                    var id = ID.index(tag);
-                    if (document.getElementById(self._addUID('GPlocationPoint_' + id))) {
-                        if (document.getElementById(self._addUID('GPlocationPoint_' + id)).className == 'GPflexInput GPlocationStageFlexInputHidden') {
-                            if (lastStage == 1) {
-                                lastStage = id;
-                            }
-                        } else {
-                            nbStages++;
-                        }
-                    }
-                }
-                if (lastStage < points.length) {
-                    document.getElementById(self._addUID('GPlocationPoint_' + lastStage)).className = 'GPflexInput GPlocationStageFlexInput';
-                }
-                if (nbStages == 4) {
-                    document.getElementById(self._addUID('GPlocationStageAdd')).style.display = 'none';
-                }
-                self.onLocationAddPointClick(e);
-            });
-            return divAdd;
-        },
-        _createLocationAutoCompleteResultElement: function (id) {
-            var self = this;
-            var div = document.createElement('div');
-            div.id = this._addUID('GPlocationAutoCompleteList_' + id);
-            div.className = 'GPadvancedAutoCompleteList';
-            if (div.addEventListener) {
-                div.addEventListener('click', function (e) {
-                    self.onAutoCompletedResultsItemClick(e);
-                    document.getElementById(self._addUID('GPlocationAutoCompleteList_' + id)).style.display = 'none';
-                }, false);
-            } else if (div.attachEvent) {
-                div.attachEvent('onclick', function (e) {
-                    self.onAutoCompletedResultsItemClick(e);
-                    document.getElementById(self._addUID('GPlocationAutoCompleteList_' + id)).style.display = 'none';
-                });
-            }
-            return div;
-        },
-        _createLocationAutoCompletedLocationElement: function (id, location, n) {
-            var container = document.getElementById(this._addUID('GPlocationAutoCompleteList_' + id));
-            var div = document.createElement('div');
-            div.id = this._addUID('AutoCompletedLocation_' + n);
-            div.className = 'GPautoCompleteProposal';
-            div.innerHTML = location.fullText;
-            container.appendChild(div);
-        },
-        GPdisplayCoordinate: function (value) {
-            var points = document.getElementsByClassName(this._addUID('GPlocationPoint'));
-            for (var i = 0; i < points.length; i++) {
-                var tag = points[i].childNodes[0].id;
-                var id1 = ID.index(tag);
-                if (document.getElementById(this._addUID('GPlocationOriginPointer_' + id1)).checked) {
-                    document.getElementById(this._addUID('GPlocationOriginCoords_' + id1)).value = value;
-                    document.getElementById(this._addUID('GPlocationOriginCoords_' + id1)).disabled = false;
-                    for (var j = 0; j < points.length; j++) {
-                        tag = points[j].childNodes[0].id;
-                        var id2 = ID.index(tag);
-                        document.getElementById(this._addUID('GPlocationPoint_' + id2)).style.cssText = '';
-                        if (document.getElementById(this._addUID('GPlocationStageRemove_' + id2))) {
-                            document.getElementById(this._addUID('GPlocationStageRemove_' + id2)).className = 'GPlocationStageRemove';
-                        }
-                    }
-                    document.getElementById(this._addUID('GPlocationOriginPointer_' + id1)).checked = false;
-                    if (document.getElementById(this._addUID('GPlocationStageAdd'))) {
-                        document.getElementById(this._addUID('GPlocationStageAdd')).className = '';
-                    }
-                    return;
-                }
-            }
-        }
-    };
-    return LocationSelectorDOM;
-}(CommonUtilsSelectorID);
-LeafletControlsUtilsPositionFormater = function () {
-    var PositionFormater = {
-        NORTH: 'N',
-        SOUTH: 'S',
-        EAST: 'E',
-        WEST: 'W',
-        digitSecond: 2,
-        digitDecimal: 5,
-        digitRadian: 8,
-        roundToDecimal: function (inputNum, numPoints) {
-            var multiplier = Math.pow(10, numPoints);
-            return Math.round(inputNum * multiplier) / multiplier;
-        },
-        decimalToRadian: function (location) {
-            var d = 0.017453292519943295;
-            return this.roundToDecimal(location * d, this.digitRadian);
-        },
-        decimalToGrade: function (location) {
-            var d = 1.1111111111111112;
-            return this.roundToDecimal(location * d, this.digitRadian);
-        },
-        decimalToDMS: function (location, hemisphere) {
-            if (location < 0) {
-                location *= -1;
-            }
-            var degrees = Math.floor(location);
-            var minutesFromRemainder = (location - degrees) * 60;
-            var minutes = Math.floor(minutesFromRemainder);
-            var secondsFromRemainder = (minutesFromRemainder - minutes) * 60;
-            var seconds = this.roundToDecimal(secondsFromRemainder, this.digitSecond);
-            var dms = degrees + '\xB0 ' + minutes + '\' ' + seconds + '" ';
-            if (hemisphere) {
-                dms += hemisphere;
-            }
-            return dms;
-        },
-        decimalLatToDMS: function (location) {
-            var hemisphere = location < 0 ? this.SOUTH : this.NORTH;
-            return this.decimalToDMS(location, hemisphere);
-        },
-        decimalLongToDMS: function (location) {
-            var hemisphere = location < 0 ? this.WEST : this.EAST;
-            return this.decimalToDMS(location, hemisphere);
-        },
-        DMSToDecimal: function (degrees, minutes, seconds, hemisphere) {
-            var ddVal = degrees + minutes / 60 + seconds / 3600;
-            ddVal = hemisphere == this.SOUTH || hemisphere == this.WEST ? ddVal * -1 : ddVal;
-            var decimal = this.roundToDecimal(ddVal, this.digitDecimal);
-            return decimal;
-        }
-    };
-    return PositionFormater;
-}();
-LeafletControlsUtilsIconDefault = function (L) {
-    var IconDefault = L.Icon.Default.extend({
-        images: {
-            shadow: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=',
-            color: {
-                blue: 'data:image/png;base64,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',
-                orange: 'data:image/png;base64,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',
-                red: 'data:image/png;base64,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',
-                green: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wJCgoDDgqHD/MAAAZVSURBVFjDpZZtiFxXGcd/c+69M7PzurvdTTZNGvxQTCJqFSok+MmFQPSDUlsQhBaxWNhorQlWPxSKTYqsFLYGA8VCISDESIpCILYQW4xJNtHGGBooZtl16UrKNrMvM7N3Xu6555zHD7OZ7OzsW/Be/nBnznnO/zzP83/OcxKPv/IOW32KXzj2KFBc/nm7cuvl8IOXD21ql3j8lT9vsOjxfuB7wCHgoAoUCV8BYJsWRGaBc8DpvzwxfnF9kl90kxQ+f9wDXgReyg9kc8VkH4Wg2DUvdpqyXqRcKxOH5l3gZ+89OX5rDZLzqwhe7QfOZAcyB4fSO0h6KbSNqNt6F0lSJcn4WQA+bcyycHehATzz3pPjb6+cp0SEe8jvOdYvsRvPDmQOPpLZjRXLYjRPzYSIuC5EtsliNE9ZL7ItvY2dD+/sSRaDs8Nn9o90kLQ92HvcA87mduT27Mw8QiWuUDMhVuymMC5mPpoj42UYyu0A+M3wmf3D90lEQATgxfT29PDDPTup6jKx08gar6+CNf8XhEW9QEqlGNw16AFnhs/s72+FC6Gw79V+4KXtPUPUbZ3IRR07DVSSQlCkEBRRCdX+zvn5Lq/mohKFoEh2KDO4LB4ULUe+mxpI5RSKMA5xIm0Ug16SKsknjTtMfTxFGIdMfTzFzOIMoVmiGPQCdNjUTY3B9HZEeO5rv9/v+YggwncK6QKxxB3qyQU5aibk7iclvv3YUzz91WfJ+wUALsy+w+sf/opGusFgahuLerFt17BN0l4PQc7v10vmgJ/f98sccCDjZ5mP5jpIvITHYljm+QNH+NaupzrGDg59nc/m9/KDC08TD8UEyqdhG+1xh8PP+eglc0jhZLeXUp4V2yFPPxFQNzWymWwXAYAg7M5+hm/s+yZzzRIpL91hXzc1kioAJ59TQH9C3WOXNlJeitCEfLH3S2sSAFgxPNb7ZXQl7rJ3IiRaCxd9caLFgXUGcdJeyDiDiKBdtC6BE6FhGygv0WUvnsOKRZw0FHDHRg6HdCzWtHXyQZ4bn17HrBKEFdNaAMel0l/xcz5WbOd5hcI4A3BHiWPWaReKuNYOjEOMw2hDggQudpyceL3DC9cqXsZLl7g+9Q8KQYEls9S2FePwEgrbsIhjxuvb+2tJDYx/RXJuXzbI0dRR+xBwypDtyXLrvx9yLbzC9vR2HkoO8J9wkrMzp/nt+Bv0DKbwVUCj0VxxeEAQJKneDRErz/siAk5ONueiJzI7MrAirroe4zJC70NFphem+PnkUWzkUH6CZG9A364iXsKjulTprK98nqV6Fde0F/72/Q8+8hGh8u+fvl/Y89rVWn/tQDaXI6wu3e8ZYYzxLflsjlymU2UN2yAO4zUbVXNeIyLHAHzuJ/w1XY7/mN7mWKUBJHZUy9UttehsMUtYD7EN8/6lZ69fBmiFCxDLuWhBT0b90aN+zm9r/0EfEdfywjLaddRXJ45aYCxa0PjKp53FB0CqN0mzGWFC88/Lz12/sKIzrpjn5FRzLioZZ/B6fMTxQFAkiBY04mS0szOuYKlOHG0g8mazFOGlFGJly0jmfXQ9Rpf1bUT+tG6PX87PiWg+aiDgpbyWpLeARKCIyjHA6JWRG3ZVjxdWojJxpAT8rjkX4We9LSU7KATYhiWu6Bng9OpxtVYCxTHWLEX2XmE6tzGUnyAqx4hj7MrIDd1FsjpcIkJl4oXbYuW8rhqSfUkkduvCSymsdkRzUUmsvLWWp2o9OYqTsWhRb6pcP+ujyzHi5OTVH/8rXJNkLU9EhOrUCxdNzVw1NUN6ILlmsv2MhxhHcy4KgRPr5awr8Z3ghC7r5Uru3oif8YgWNMAb135ys7I+yYbx4O24aiZt5Ej2JjsvGSkPBKJ5rRHGNlLfuuESESqTP7IiLW+UrxBLG0E+aFW3cOrakZuzG5JsHC4BOKUrpuRM64ojTlB+AhGhOa8tMLpZHanN1FOZ/GEIvBlXYvweBSIk+wJ0q7r/8PejN6c3JdnSCevkZLSgtdhWLsSBLmtYdRD+H+ESKlOHZ8XJqbgaExQC4iWD0+58Zerwra2RbM7B8qX8hK7EiBN0WSPC6OoOun5O2NpbnT78kdXunKlbbOQuVqcPX5YtsqgH636M6bIGYbTj/rN5Trb+VKdHLtqme6s6PfLug9j9D/FCc1g2qf7VAAAAAElFTkSuQmCC'
-            }
-        },
-        initialize: function (color, options) {
-            L.Util.extend(this.options, options);
-            switch (color) {
-            case 'red':
-                this.options.iconUrl = this.images.color.red;
-                break;
-            case 'green':
-                this.options.iconUrl = this.images.color.green;
-                break;
-            case 'orange':
-                this.options.iconUrl = this.images.color.orange;
-                break;
-            case 'blue':
-                this.options.iconUrl = this.images.color.blue;
-                break;
-            default:
-                this.options.iconUrl = this.images.color.blue;
-            }
-            this.options.shadowUrl = this.images.shadow;
-        }
-    });
-    return IconDefault;
-}(leaflet);
-LeafletControlsLocationSelector = function (L, woodman, Gp, RightManagement, ID, LocationSelectorDOM, PositionFormater, IconDefault) {
-    var LocationSelector = L.Control.extend({
-        includes: LocationSelectorDOM,
-        options: {
-            position: 'topleft',
-            tag: {
-                id: 0,
-                unique: null,
-                label: '>',
-                color: 'blue',
-                display: true,
-                addOption: false,
-                removeOption: false
-            },
-            disableReverse: false,
-            displayInfo: true,
-            autocompleteOptions: {},
-            reverseGeocodeOptions: {}
-        },
-        initialize: function (options) {
-            L.Util.setOptions(this, options);
-            this._uid = this.options.tag.unique || null;
-            this._activeDragAndDrop = false;
-            this._pressedKeyOnDragAndDrop = false;
-            this._map = null;
-            this._inputsContainer = null;
-            this._inputLabelContainer = null;
-            this._inputAutoCompleteContainer = null;
-            this._inputShowPointerContainer = null;
-            this._inputCoordinateContainer = null;
-            this._coordinate = null;
-            this._suggestedContainer = null;
-            this._suggestedLocations = [];
-            this._currentLocation = null;
-            this._marker = null;
-            this._resources = {};
-            this._noRightManagement = false;
-            this._checkRightsManagement();
-            this._container = this._uid ? this._initLayout() : null;
-        },
-        onAdd: function () {
-            this._uid = ID.generate();
-            var container = this._initLayout();
-            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
-            return container;
-        },
-        onRemove: function () {
-        },
-        getCoordinate: function () {
-            return this._coordinate;
-        },
-        getCoordinateInverse: function () {
-            if (!this._coordinate) {
-                return;
-            }
-            var coordinateInv = {
-                x: this._coordinate.y,
-                y: this._coordinate.x
-            };
-            return coordinateInv;
-        },
-        setMap: function (map) {
-            if (!this._map) {
-                this._map = map;
-            }
-        },
-        clear: function () {
-            this._setCursor();
-            this._setMarker();
-            this._clearResults();
-            this._inputLabelContainer.click();
-        },
-        dragging: function (active) {
-            if (this._marker) {
-                if (active) {
-                    this._marker.dragging.enable();
-                } else {
-                    this._marker.dragging.disable();
-                }
-            }
-        },
-        _initLayout: function () {
-            var id = this.options.tag.id;
-            var container = this._createMainContainerElement();
-            var inputs = this._inputsContainer = this._createLocationPointElement(id, this.options.tag.display);
-            container.appendChild(inputs);
-            var _inputLabel = this._inputLabelContainer = this._createLocationPointLabelElement(id, this.options.tag.label);
-            inputs.appendChild(_inputLabel);
-            var _inputAutoComplete = this._inputAutoCompleteContainer = this._createLocationAutoCompleteteInputElement(id);
-            inputs.appendChild(_inputAutoComplete);
-            var _inputCoordinate = this._inputCoordinateContainer = this._createLocationCoordinateInputElement(id);
-            inputs.appendChild(_inputCoordinate);
-            var _inputShowPointer = this._inputShowPointerContainer = this._createLocationPointerShowInputElement(id);
-            inputs.appendChild(_inputShowPointer);
-            var _inputPointer = this._createLocationPointerInputElement(id);
-            inputs.appendChild(_inputPointer);
-            if (this.options.tag.addOption) {
-                var _inputAddStage = this._createLocationAddPointElement();
-                inputs.appendChild(_inputAddStage);
-            }
-            if (this.options.tag.removeOption) {
-                var _inputRemoveStage = this._createLocationRemovePointElement(id);
-                inputs.appendChild(_inputRemoveStage);
-            }
-            var results = this._suggestedContainer = this._createLocationAutoCompleteResultElement(id);
-            container.appendChild(results);
-            return container;
-        },
-        _checkRightsManagement: function () {
-            var _opts = null;
-            var _res = [];
-            var _key = null;
-            _key = this.options.reverseGeocodeOptions.apiKey;
-            _opts = this.options.reverseGeocodeOptions.filterOptions;
-            _res = _opts ? _opts.type : [];
-            if (!_res || _res.length === 0) {
-                _res = [
-                    'PositionOfInterest',
-                    'StreetAddress'
-                ];
-            }
-            var rightManagementRerverse = RightManagement.check({
-                key: _key || this.options.apiKey,
-                resources: _res,
-                services: ['ReverseGeocode']
-            });
-            _key = this.options.autocompleteOptions.apiKey;
-            _opts = this.options.autocompleteOptions.filterOptions;
-            _res = _opts ? _opts.type : [];
-            if (!_res || _res.length === 0) {
-                _res = [
-                    'PositionOfInterest',
-                    'StreetAddress'
-                ];
-            }
-            var rightManagementAutoComplete = RightManagement.check({
-                key: _key || this.options.apiKey,
-                resources: _res,
-                services: ['AutoCompletion']
-            });
-            if (!rightManagementRerverse && !rightManagementAutoComplete) {
-                this._noRightManagement = true;
-            }
-            if (rightManagementAutoComplete) {
-                this._resources['AutoCompletion'] = {};
-                this._resources['AutoCompletion']['resources'] = rightManagementAutoComplete['AutoCompletion'];
-                this._resources['AutoCompletion']['key'] = rightManagementAutoComplete['key'];
-            }
-            if (rightManagementRerverse) {
-                this._resources['ReverseGeocode'] = {};
-                this._resources['ReverseGeocode']['resources'] = rightManagementRerverse['ReverseGeocode'];
-                this._resources['ReverseGeocode']['key'] = rightManagementRerverse['key'];
-            }
-        },
-        _setLabel: function (label) {
-            this._inputAutoCompleteContainer.value = label || '';
-        },
-        _setCoordinate: function (oLatLng) {
-            this._coordinate = {
-                x: oLatLng.lng,
-                y: oLatLng.lat
-            };
-            var lat = null;
-            var lng = null;
-            if (false) {
-                lat = PositionFormater.decimalLatToDMS(oLatLng.lat);
-                lng = PositionFormater.decimalLongToDMS(oLatLng.lng);
-            } else {
-                lat = PositionFormater.roundToDecimal(oLatLng.lat, 4);
-                lng = PositionFormater.roundToDecimal(oLatLng.lng, 4);
-            }
-            var value = lng + ' , ' + lat;
-            this.GPdisplayCoordinate(value);
-        },
-        _setPosition: function (position) {
-            var map = this._map;
-            map.panTo(L.latLng(position.y, position.x));
-        },
-        _setMarker: function (position, information, display) {
-            if (this._activeDragAndDrop) {
-                return;
-            }
-            var map = this._map;
-            if (this._marker != null) {
-                this._marker.off('mousedown', this.onMouseDownMarker, this);
-                this._marker.off('dragstart', this.onStartDragMarker, this);
-                this._marker.off('drag', this.onDragMarker, this);
-                this._marker.off('dragend', this.onEndDragMarker, this);
-                map.removeLayer(this._marker);
-                this._marker = null;
-            }
-            if (position) {
-                var options = {
-                    icon: new IconDefault(this.options.tag.color),
-                    draggable: true,
-                    clickable: true,
-                    zIndexOffset: 1000
-                };
-                this._marker = L.marker(L.latLng(position.y, position.x), options);
-                this._marker.on('mousedown', this.onMouseDownMarker, this);
-                this._marker.on('dragstart', this.onStartDragMarker, this);
-                this._marker.on('drag', this.onDragMarker, this);
-                this._marker.on('dragend', this.onEndDragMarker, this);
-                this._marker.addTo(map);
-                if (display) {
-                    var popupContent = null;
-                    if (typeof information !== 'string') {
-                        if (information.fields.fullText) {
-                            popupContent = information.fields.fullText;
-                        } else {
-                            var values = [];
-                            values.push(information.fields.street || '');
-                            values.push(information.fields.postalCode || '');
-                            values.push(information.fields.commune || '');
-                            if (information.type === 'PositionOfInterest') {
-                                values.push(information.fields.poi || '');
-                                values.push(information.fields.kind || '');
-                            }
-                            popupContent = values.join(' - ');
-                        }
-                    } else {
-                        popupContent = information;
-                    }
-                    this._marker.bindPopup(popupContent);
-                }
-            }
-        },
-        _setCursor: function (cursor) {
-            var div = this._map.getContainer();
-            if (cursor) {
-                div.style.cursor = cursor;
-            } else {
-                div.style.cursor = null;
-            }
-        },
-        _clearResults: function () {
-            this._currentLocation = null;
-            this._coordinate = null;
-            this._clearSuggestedLocation();
-        },
-        _clearSuggestedLocation: function () {
-            this._suggestedLocations = [];
-            if (this._suggestedContainer) {
-                while (this._suggestedContainer.firstChild) {
-                    this._suggestedContainer.removeChild(this._suggestedContainer.firstChild);
-                }
-            }
-        },
-        _requestAutoComplete: function (settings) {
-            if (!settings || Object.keys(settings).length === 0) {
-                return;
-            }
-            if (!settings.text) {
-                return;
-            }
-            if (this._noRightManagement) {
-                console.log('no rights for all service !?');
-                return;
-            }
-            if (!this._resources['AutoCompletion']) {
-                console.log('no rights for this service !?');
-                return;
-            }
-            var resources = this._resources['AutoCompletion'].resources;
-            if (!resources || Object.keys(resources).length === 0) {
-                return;
-            }
-            var key = this._resources['AutoCompletion']['key'];
-            var options = {};
-            L.Util.extend(options, this.options.autocompleteOptions);
-            L.Util.extend(options, settings);
-            L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey || key });
-            Gp.Services.autoComplete(options);
-        },
-        _fillAutoCompletedLocationListContainer: function (locations) {
-            if (!locations || locations.length === 0) {
-                return;
-            }
-            var element = this._suggestedContainer;
-            if (element.childElementCount) {
-                while (element.firstChild) {
-                    element.removeChild(element.firstChild);
-                }
-            }
-            for (var i = 0; i < locations.length; i++) {
-                this._createLocationAutoCompletedLocationElement(this.options.tag.id, locations[i], i);
-            }
-            this._suggestedLocations = locations;
-        },
-        _requestReverseGeocode: function (settings) {
-            if (!settings || Object.keys(settings).length === 0) {
-                return;
-            }
-            if (!settings.position || Object.keys(settings.position).length === 0) {
-                return;
-            }
-            if (this._noRightManagement) {
-                console.log('no rights for all service !?');
-                return;
-            }
-            if (!this._resources['ReverseGeocode']) {
-                console.log('no rights for this service !?');
-                return;
-            }
-            var resources = this._resources['ReverseGeocode'].resources;
-            if (!resources || Object.keys(resources).length === 0) {
-                return;
-            }
-            var key = this._resources['ReverseGeocode']['key'];
-            var options = {};
-            L.Util.extend(options, this.options.reverseGeocodeOptions);
-            L.Util.extend(options, settings);
-            L.Util.extend(options, {
-                returnFreeForm: true,
-                filterOptions: { type: ['StreetAddress'] }
-            });
-            L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey || key });
-            Gp.Services.reverseGeocode(options);
-        },
-        _displayResultOfCoordinate: function (oLatLng) {
-            this._setCoordinate(oLatLng);
-            this._setMarker({
-                x: oLatLng.lng,
-                y: oLatLng.lat
-            }, null, false);
-            this.onActivateMapPointClick();
-        },
-        _displayResultOfLabel: function (oLocation) {
-            var places = oLocation.placeAttributes;
-            var label = places.number + ' ' + places.street + ', ' + places.postalCode + ' ' + places.commune;
-            this._setCoordinate({
-                lat: oLocation.position.x,
-                lng: oLocation.position.y
-            });
-            this._setLabel(label);
-            this._setMarker({
-                x: oLocation.position.y,
-                y: oLocation.position.x
-            }, null, false);
-            this._inputShowPointerContainer.checked = false;
-            this._inputAutoCompleteContainer.className = 'GPlocationOriginVisible';
-            this._inputCoordinateContainer.className = 'GPlocationOriginHidden';
-            this.onActivateMapPointClick();
-        },
-        onAutoCompleteSearchText: function (e) {
-            var value = e.target.value;
-            if (!value) {
-                return;
-            }
-            if (this._noRightManagement) {
-                console.log('no rights for this service !?');
-                return;
-            }
-            this._currentLocation = value;
-            if (value.length < 3) {
-                return;
-            }
-            var context = this;
-            this._requestAutoComplete({
-                text: value,
-                maximumResponses: 5,
-                onSuccess: function (results) {
-                    if (results) {
-                        var locations = results.suggestedLocations;
-                        context._fillAutoCompletedLocationListContainer(locations);
-                    }
-                },
-                onFailure: function (error) {
-                    context._clearSuggestedLocation();
-                }
-            });
-        },
-        onAutoCompletedResultsItemClick: function (e) {
-            var idx = ID.index(e.target.id);
-            if (!idx) {
-                return;
-            }
-            var position = {
-                x: this._suggestedLocations[idx].position.x,
-                y: this._suggestedLocations[idx].position.y
-            };
-            var info = {
-                type: this._suggestedLocations[idx].type,
-                fields: this._suggestedLocations[idx]
-            };
-            var label = this._suggestedLocations[idx].fullText;
-            this._setLabel(label);
-            this._setPosition(position);
-            this._setMarker(position, info, this.options.displayInfo);
-            this._coordinate = position;
-        },
-        onActivateMapPointClick: function (e) {
-            var map = this._map;
-            if (this._inputShowPointerContainer.checked) {
-                if (!this._activeDragAndDrop) {
-                    map.on('click', this.onMouseMapClick, this);
-                    this._setCursor('crosshair');
-                    this._setMarker();
-                    this._clearResults();
-                }
-            } else {
-                if (!this._activeDragAndDrop) {
-                    map.off('click', this.onMouseMapClick, this);
-                    this._setCursor();
-                }
-            }
-        },
-        onLocationClearPointClick: function (e) {
-            this._setCursor();
-            this._setMarker();
-            this._clearResults();
-            this._inputAutoCompleteContainer.focus();
-        },
-        onLocationRemovePointClick: function (e) {
-            this._setCursor();
-            this._setMarker();
-            this._clearResults();
-        },
-        onLocationAddPointClick: function (e) {
-        },
-        onMouseMapClick: function (e) {
-            var oLatLng = e.latlng;
-            if (this.options.disableReverse || this._noRightManagement) {
-                this._displayResultOfCoordinate(oLatLng);
-            } else {
-                var self = this;
-                this._requestReverseGeocode({
-                    position: {
-                        x: oLatLng.lat,
-                        y: oLatLng.lng
-                    },
-                    srs: 'EPSG:4326',
-                    onSuccess: function (results) {
-                        if (results.locations.length !== 0) {
-                            var oLocation = results.locations[0];
-                            self._displayResultOfLabel(oLocation);
-                        } else {
-                            self._displayResultOfCoordinate(oLatLng);
-                        }
-                    },
-                    onFailure: function (error) {
-                        self._displayResultOfCoordinate(oLatLng);
-                    }
-                });
-            }
-        },
-        onStartDragMarker: function () {
-            if (!this._marker) {
-                return;
-            }
-            this._activeDragAndDrop = true;
-            this._inputShowPointerContainer.checked = true;
-            this._inputAutoCompleteContainer.className = 'GPlocationOriginHidden';
-            this._inputCoordinateContainer.className = 'GPlocationOriginVisible';
-            this._marker.unbindPopup();
-            this._setLabel();
-            this._clearResults();
-        },
-        onDragMarker: function () {
-            if (!this._marker) {
-                return;
-            }
-            this._activeDragAndDrop = false;
-            this._inputShowPointerContainer.checked = true;
-            var oLatLng = this._marker.getLatLng();
-            this._setCoordinate(oLatLng);
-        },
-        onEndDragMarker: function () {
-            if (!this._marker) {
-                return;
-            }
-            this._inputShowPointerContainer.checked = true;
-            var oLatLng = this._marker.getLatLng();
-            if (this._pressedKeyOnDragAndDrop) {
-                this._setCoordinate(oLatLng);
-            } else {
-                this.onMouseMapClick({ latlng: oLatLng });
-            }
-            this._activeDragAndDrop = false;
-            this._pressedKeyOnDragAndDrop = false;
-        },
-        onMouseDownMarker: function (e) {
-            if (!this._marker) {
-                return;
-            }
-            this._pressedKeyOnDragAndDrop = e.originalEvent.ctrlKey;
-        }
-    });
-    return LocationSelector;
-}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, CommonControlsLocationSelectorDOM, LeafletControlsUtilsPositionFormater, LeafletControlsUtilsIconDefault);
-CommonControlsIsoDOM = function () {
-    var IsoDOM = {
-        _addUID: function (id) {
-            return id + '-' + this._uid;
-        },
-        _createMainContainerElement: function () {
-            var container = document.createElement('div');
-            container.id = this._addUID('GPisochron');
-            container.className = 'GPwidget';
-            return container;
-        },
-        _createShowIsoElement: function () {
-            var input = document.createElement('input');
-            input.id = this._addUID('GPshowIsochron');
-            input.type = 'checkbox';
-            return input;
-        },
-        _createShowIsoPictoElement: function () {
-            var context = this;
-            var label = document.createElement('label');
-            label.id = this._addUID('GPshowIsochronPicto');
-            label.className = 'GPshowAdvancedToolPicto';
-            label.htmlFor = this._addUID('GPshowIsochron');
-            label.title = 'Calculer une isochrone';
-            if (label.addEventListener) {
-                label.addEventListener('click', function (e) {
-                    context.onShowIsoPanelClick(e);
-                });
-            } else if (label.attachEvent) {
-                label.attachEvent('onclick', function (e) {
-                    context.onShowIsoPanelClick(e);
-                });
-            }
-            var spanOpen = document.createElement('span');
-            spanOpen.id = this._addUID('GPshowIsochronOpen');
-            spanOpen.className = 'GPshowAdvancedToolOpen';
-            label.appendChild(spanOpen);
-            return label;
-        },
-        _createIsoPanelElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPisochronPanel');
-            div.className = 'GPpanel';
-            return div;
-        },
-        _createIsoPanelHeaderElement: function () {
-            var self = this;
-            var container = document.createElement('div');
-            container.className = 'GPpanelHeader';
-            var div = document.createElement('div');
-            div.className = 'GPpanelTitle';
-            div.innerHTML = 'Calcul d\'isochrone';
-            container.appendChild(div);
-            var divClose = document.createElement('div');
-            divClose.id = this._addUID('GPisochronPanelClose');
-            divClose.className = 'GPpanelClose';
-            divClose.title = 'Fermer le panneau';
-            if (divClose.addEventListener) {
-                divClose.addEventListener('click', function () {
-                    document.getElementById(self._addUID('GPshowIsochronPicto')).click();
-                }, false);
-            } else if (divClose.attachEvent) {
-                divClose.attachEvent('onclick', function () {
-                    document.getElementById(self._addUID('GPshowIsochronPicto')).click();
-                });
-            }
-            container.appendChild(divClose);
-            return container;
-        },
-        _createIsoPanelFormElement: function () {
-            var self = this;
-            var form = document.createElement('form');
-            form.id = this._addUID('GPisochronForm');
-            form.addEventListener('submit', function (e) {
-                e.preventDefault();
-                self.onIsoComputationSubmit(e);
-                return false;
-            });
-            return form;
-        },
-        _createIsoWaitingElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPisochronCalcWaitingContainer');
-            div.className = 'GPisochronCalcWaitingContainerHidden';
-            var p = document.createElement('p');
-            p.className = 'GPisochronCalcWaiting';
-            p.innerHTML = 'Calcul en cours...';
-            div.appendChild(p);
-            return div;
-        },
-        _createIsoPanelFormTypeChoiceElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPisochronChoice');
-            return div;
-        },
-        _createIsoPanelFormTypeChoiceChronElement: function (checked) {
-            var self = this;
-            var div = document.createElement('div');
-            div.className = 'GPisochronChoiceAlt';
-            var input = document.createElement('input');
-            input.id = this._addUID('GPisochronChoiceAltChron');
-            input.name = 'GPisochronChoiceMode';
-            input.type = 'radio';
-            input.checked = checked ? true : false;
-            if (input.addEventListener) {
-                input.addEventListener('change', function (e) {
-                    document.getElementById(self._addUID('GPisochronValueChron')).className = 'GPflexInput';
-                    document.getElementById(self._addUID('GPisochronValueDist')).className = 'GPisochronValueHidden';
-                    self.onIsoTypeChoiceChange(e);
-                }, false);
-            } else if (input.attachEvent) {
-                input.attachEvent('onchange', function () {
-                    document.getElementById(self._addUID('GPisochronValueChron')).className = 'GPflexInput';
-                    document.getElementById(self._addUID('GPisochronValueDist')).className = 'GPisochronValueHidden';
-                    self.onIsoTypeChoiceChange();
-                });
-            }
-            input.value = 'isochron';
-            div.appendChild(input);
-            var label = document.createElement('label');
-            label.className = 'GPisochronChoiceAltImg';
-            label.htmlFor = this._addUID('GPisochronChoiceAltChron');
-            div.appendChild(label);
-            var span = document.createElement('span');
-            span.id = this._addUID('GPisochronChoiceAltChronTxt');
-            span.innerHTML = 'isochrone';
-            if (span.addEventListener) {
-                span.addEventListener('click', function () {
-                    document.getElementById(self._addUID('GPisochronChoiceAltChron')).click();
-                }, false);
-            } else if (span.attachEvent) {
-                span.attachEvent('onclick', function () {
-                    document.getElementById(self._addUID('GPisochronChoiceAltChron')).click();
-                });
-            }
-            div.appendChild(span);
-            return div;
-        },
-        _createIsoPanelFormTypeChoiceDistElement: function (checked) {
-            var self = this;
-            var div = document.createElement('div');
-            div.className = 'GPisochronChoiceAlt';
-            var input = document.createElement('input');
-            input.id = this._addUID('GPisochronChoiceAltDist');
-            input.name = 'GPisochronChoiceMode';
-            input.type = 'radio';
-            input.checked = checked ? true : false;
-            if (input.addEventListener) {
-                input.addEventListener('change', function (e) {
-                    document.getElementById(self._addUID('GPisochronValueDist')).className = 'GPflexInput';
-                    document.getElementById(self._addUID('GPisochronValueChron')).className = 'GPisochronValueHidden';
-                    self.onIsoTypeChoiceChange(e);
-                }, false);
-            } else if (input.attachEvent) {
-                input.attachEvent('onchange', function () {
-                    document.getElementById(self._addUID('GPisochronValueDist')).className = 'GPflexInput';
-                    document.getElementById(self._addUID('GPisochronValueChron')).className = 'GPisochronValueHidden';
-                    self.onIsoTypeChoiceChange();
-                });
-            }
-            input.value = 'isodistance';
-            div.appendChild(input);
-            var label = document.createElement('label');
-            label.className = 'GPisochronChoiceAltImg';
-            label.htmlFor = this._addUID('GPisochronChoiceAltDist');
-            div.appendChild(label);
-            var span = document.createElement('span');
-            span.id = this._addUID('GPisochronChoiceAltDistTxt');
-            span.innerHTML = 'isodistance';
-            if (span.addEventListener) {
-                span.addEventListener('click', function () {
-                    document.getElementById(self._addUID('GPisochronChoiceAltDist')).click();
-                }, false);
-            } else if (span.attachEvent) {
-                span.attachEvent('onclick', function () {
-                    document.getElementById(self._addUID('GPisochronChoiceAltDist')).click();
-                });
-            }
-            div.appendChild(span);
-            return div;
-        },
-        _createIsoPanelFormValueIsochronElement: function (checked) {
-            var context = this;
-            var div = document.createElement('div');
-            div.id = this._addUID('GPisochronValueChron');
-            div.className = checked ? 'GPflexInput' : 'GPisochronValueHidden';
-            var label = document.createElement('label');
-            label.id = this._addUID('GPisochronValueChronLabel');
-            label.htmlFor = this._addUID('GPisochronValueChronInput');
-            label.innerHTML = 'Temps';
-            div.appendChild(label);
-            var input1 = document.createElement('input');
-            input1.id = this._addUID('GPisochronValueChronInput1');
-            input1.min = '0';
-            input1.step = '1';
-            input1.value = '0';
-            input1.type = 'number';
-            if (input1.addEventListener) {
-                input1.addEventListener('change', function (e) {
-                    if (typeof context.onIsoValueChronTimeMinuteChange === 'function') {
-                        context.onIsoValueChronTimeHourChange(e);
-                    }
-                });
-            } else if (input1.attachEvent) {
-                input1.attachEvent('onchange', function (e) {
-                    if (typeof context.onIsoValueChronTimeMinuteChange === 'function') {
-                        context.onIsoValueChronTimeHourChange(e);
-                    }
-                });
-            }
-            div.appendChild(input1);
-            var label1 = document.createElement('label');
-            label1.innerHTML = 'h';
-            div.appendChild(label1);
-            var input2 = document.createElement('input');
-            input2.id = this._addUID('GPisochronValueChronInput2');
-            input2.min = '0';
-            input2.max = '59';
-            input2.step = '1';
-            input2.value = '0';
-            input2.type = 'number';
-            if (input2.addEventListener) {
-                input2.addEventListener('change', function (e) {
-                    if (typeof context.onIsoValueChronTimeMinuteChange === 'function') {
-                        context.onIsoValueChronTimeMinuteChange(e);
-                    }
-                });
-            } else if (input2.attachEvent) {
-                input2.attachEvent('onchange', function (e) {
-                    if (typeof context.onIsoValueChronTimeMinuteChange === 'function') {
-                        context.onIsoValueChronTimeMinuteChange(e);
-                    }
-                });
-            }
-            div.appendChild(input2);
-            var label2 = document.createElement('label');
-            label2.innerHTML = 'min';
-            div.appendChild(label2);
-            return div;
-        },
-        _createIsoPanelFormValueIsodistanceElement: function (checked) {
-            var context = this;
-            var div = document.createElement('div');
-            div.id = this._addUID('GPisochronValueDist');
-            div.className = checked ? 'GPflexInput' : 'GPisochronValueHidden';
-            var label = document.createElement('label');
-            label.id = this._addUID('GPisochronValueDistLabel');
-            label.htmlFor = this._addUID('GPisochronValueDistInput');
-            label.innerHTML = 'Distance';
-            div.appendChild(label);
-            var input1 = document.createElement('input');
-            input1.id = this._addUID('GPisochronValueDistInput');
-            input1.min = '0';
-            input1.step = 'any';
-            input1.value = '0';
-            input1.type = 'number';
-            if (input1.addEventListener) {
-                input1.addEventListener('change', function (e) {
-                    if (typeof context.onIsoValueDistChange === 'function') {
-                        context.onIsoValueDistChange(e);
-                    }
-                });
-            } else if (input1.attachEvent) {
-                input1.attachEvent('onchange', function (e) {
-                    if (typeof context.onIsoValueDistChange === 'function') {
-                        context.onIsoValueDistChange(e);
-                    }
-                });
-            }
-            div.appendChild(input1);
-            var label1 = document.createElement('label');
-            label1.innerHTML = 'km';
-            div.appendChild(label1);
-            return div;
-        },
-        _createIsoPanelFormModeChoiceElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPisochronModeChoice');
-            return div;
-        },
-        _createIsoPanelFormModeChoiceTransportElement: function (transports) {
-            var context = this;
-            var div = document.createElement('div');
-            div.id = this._addUID('GPisochronTransportChoice');
-            var span = document.createElement('span');
-            span.className = 'GPisochronModeLabel';
-            span.innerHTML = 'Mode de transport';
-            div.appendChild(span);
-            for (var i = 0; i < transports.length; i++) {
-                var transport = transports[i];
-                if (transport === 'Voiture') {
-                    var inputCar = document.createElement('input');
-                    inputCar.id = this._addUID('GPisochronTransportCar');
-                    inputCar.type = 'radio';
-                    inputCar.name = 'GPisochronTransport';
-                    if (i === 0) {
-                        inputCar.checked = true;
-                    }
-                    if (inputCar.addEventListener) {
-                        inputCar.addEventListener('change', function (e) {
-                            context.onIsoModeTransportChange(e);
-                        });
-                    } else if (inputCar.attachEvent) {
-                        inputCar.attachEvent('onchange', function (e) {
-                            context.onIsoModeTransportChange(e);
-                        });
-                    }
-                    inputCar.value = 'Voiture';
-                    div.appendChild(inputCar);
-                    var labelCar = document.createElement('label');
-                    labelCar.className = 'GPisochronTransportImg';
-                    labelCar.htmlFor = this._addUID('GPisochronTransportCar');
-                    labelCar.title = 'Voiture';
-                    div.appendChild(labelCar);
-                }
-                if (transport === 'Pieton') {
-                    var inputPedestrian = document.createElement('input');
-                    inputPedestrian.id = this._addUID('GPisochronTransportPedestrian');
-                    inputPedestrian.type = 'radio';
-                    inputPedestrian.name = 'GPisochronTransport';
-                    if (i === 0) {
-                        inputPedestrian.checked = true;
-                    }
-                    if (inputPedestrian.addEventListener) {
-                        inputPedestrian.addEventListener('change', function (e) {
-                            context.onIsoModeTransportChange(e);
-                        });
-                    } else if (inputPedestrian.attachEvent) {
-                        inputPedestrian.attachEvent('onchange', function (e) {
-                            context.onIsoModeTransportChange(e);
-                        });
-                    }
-                    inputPedestrian.value = 'Pieton';
-                    div.appendChild(inputPedestrian);
-                    var labelPedestrian = document.createElement('label');
-                    labelPedestrian.className = 'GPisochronTransportImg';
-                    labelPedestrian.htmlFor = this._addUID('GPisochronTransportPedestrian');
-                    labelPedestrian.title = 'Piéton';
-                    div.appendChild(labelPedestrian);
-                }
-            }
-            return div;
-        },
-        _createIsoPanelFormModeChoiceDirectionElement: function (directions) {
-            var self = this;
-            var div = document.createElement('div');
-            div.id = this._addUID('GPisochronDirectionChoice');
-            var span = document.createElement('span');
-            span.className = 'GPisochronModeLabel';
-            span.innerHTML = 'Sens de parcours';
-            div.appendChild(span);
-            var select = document.createElement('select');
-            select.id = this._addUID('GPisochronDirectionSelect');
-            select.className = 'GPinputSelect';
-            select.addEventListener('change', function (e) {
-                self.onIsoModeDirectionChange(e);
-            });
-            for (var i = 0; i < directions.length; i++) {
-                var direction = directions[i];
-                if (direction.toLowerCase() === 'departure') {
-                    var departureOption = document.createElement('option');
-                    if (i === 0) {
-                        departureOption.selected = 'selected';
-                    }
-                    departureOption.value = 'departure';
-                    departureOption.text = 'Départ';
-                    select.appendChild(departureOption);
-                }
-                if (direction.toLowerCase() === 'arrival') {
-                    var arrivalOption = document.createElement('option');
-                    if (i === 0) {
-                        arrivalOption.selected = 'selected';
-                    }
-                    arrivalOption.value = 'arrival';
-                    arrivalOption.text = 'Arrivée';
-                    select.appendChild(arrivalOption);
-                }
-            }
-            div.appendChild(select);
-            return div;
-        },
-        _createShowIsoExclusionsElement: function () {
-            var input = document.createElement('input');
-            input.id = this._addUID('GPshowIsoExclusions');
-            input.type = 'checkbox';
-            return input;
-        },
-        _createShowIsoExclusionsPictoElement: function () {
-            var label = document.createElement('label');
-            label.id = this._addUID('GPshowIsoExclusionsPicto');
-            label.className = 'GPshowMoreOptions GPshowIsoExclusionsPicto';
-            label.htmlFor = this._addUID('GPshowIsoExclusions');
-            label.title = 'Exclusions';
-            label.style.top = '240px';
-            return label;
-        },
-        _createIsoPanelFormExclusionsElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPisoExclusions');
-            var span = document.createElement('span');
-            span.className = 'GPisoExclusionsLabel';
-            span.innerHTML = 'Passages autorisés';
-            div.appendChild(span);
-            return div;
-        },
-        _createIsoPanelFormExclusionOptionsElement: function (exclusions) {
-            var context = this;
-            var div = document.createElement('div');
-            div.className = 'GPisoExclusionsOptions';
-            for (var value in exclusions) {
-                if (exclusions.hasOwnProperty(value)) {
-                    var status = exclusions[value];
-                    switch (value) {
-                    case 'toll':
-                        var inputToll = document.createElement('input');
-                        inputToll.id = this._addUID('GPisoExclusionsToll');
-                        inputToll.type = 'checkbox';
-                        inputToll.checked = !status;
-                        if (inputToll.addEventListener) {
-                            inputToll.addEventListener('change', function (e) {
-                                context.onIsoExclusionsChange(e);
-                            });
-                        } else if (inputToll.attachEvent) {
-                            inputToll.attachEvent('onchange', function (e) {
-                                context.onIsoExclusionsChange(e);
-                            });
-                        }
-                        inputToll.value = 'Toll';
-                        div.appendChild(inputToll);
-                        var labelToll = document.createElement('label');
-                        labelToll.className = 'GPisoExclusionsOption';
-                        labelToll.htmlFor = this._addUID('GPisoExclusionsToll');
-                        labelToll.innerHTML = 'Péages';
-                        div.appendChild(labelToll);
-                        break;
-                    case 'tunnel':
-                        var inputTunnel = document.createElement('input');
-                        inputTunnel.id = this._addUID('GPisoExclusionsTunnel');
-                        inputTunnel.type = 'checkbox';
-                        inputTunnel.checked = !status;
-                        if (inputTunnel.addEventListener) {
-                            inputTunnel.addEventListener('change', function (e) {
-                                context.onIsoExclusionsChange(e);
-                            });
-                        } else if (inputTunnel.attachEvent) {
-                            inputTunnel.attachEvent('onchange', function (e) {
-                                context.onIsoExclusionsChange(e);
-                            });
-                        }
-                        inputTunnel.value = 'Tunnel';
-                        div.appendChild(inputTunnel);
-                        var labelTunnel = document.createElement('label');
-                        labelTunnel.className = 'GPisoExclusionsOption';
-                        labelTunnel.htmlFor = this._addUID('GPisoExclusionsTunnel');
-                        labelTunnel.innerHTML = 'Tunnels';
-                        div.appendChild(labelTunnel);
-                        break;
-                    case 'bridge':
-                        var inputBridge = document.createElement('input');
-                        inputBridge.id = this._addUID('GPisoExclusionsBridge');
-                        inputBridge.type = 'checkbox';
-                        inputBridge.checked = !status;
-                        if (inputBridge.addEventListener) {
-                            inputBridge.addEventListener('change', function (e) {
-                                context.onIsoExclusionsChange(e);
-                            });
-                        } else if (inputBridge.attachEvent) {
-                            inputBridge.attachEvent('onchange', function (e) {
-                                context.onIsoExclusionsChange(e);
-                            });
-                        }
-                        inputBridge.value = 'Bridge';
-                        div.appendChild(inputBridge);
-                        var labelBridge = document.createElement('label');
-                        labelBridge.className = 'GPisoExclusionsOption';
-                        labelBridge.htmlFor = this._addUID('GPisoExclusionsBridge');
-                        labelBridge.innerHTML = 'Ponts';
-                        div.appendChild(labelBridge);
-                        break;
-                    }
-                }
-            }
-            return div;
-        },
-        _createIsoSubmitFormElement: function () {
-            var input = document.createElement('input');
-            input.id = this._addUID('GPisochronSubmit');
-            input.className = 'GPinputSubmit';
-            input.type = 'submit';
-            input.value = 'Calculer';
-            return input;
-        },
-        _createIsoFormResetElement: function () {
-            var self = this;
-            var divReset = document.createElement('div');
-            divReset.id = this._addUID('GPisochronReset');
-            divReset.title = 'Réinitialiser les paramètres';
-            divReset.addEventListener('click', function (e) {
-                self.onIsoResetClick(e);
-            });
-            return divReset;
-        }
-    };
-    return IsoDOM;
-}();
-LeafletControlsIsocurve = function (L, woodman, Gp, RightManagement, ID, LocationSelector, IsoDOM) {
-    var Isocurve = L.Control.extend({
-        includes: IsoDOM,
-        options: {
-            position: 'topleft',
-            collapsed: true,
-            methods: [
-                'time',
-                'distance'
-            ],
-            graphs: [
-                'Voiture',
-                'Pieton'
-            ],
-            exclusions: {
-                toll: false,
-                tunnel: false,
-                bridge: false
-            },
-            directions: [
-                'departure',
-                'arrival'
-            ],
-            disableReverse: false,
-            isocurveOptions: {},
-            autocompleteOptions: {}
-        },
-        initialize: function (options) {
-            L.Util.setOptions(this, options);
-            this._uid = ID.generate();
-            this._isDesktop = this._detectSupport();
-            this._waitingContainer = null;
-            this._showContainer = null;
-            this._formContainer = null;
-            this._submitContainer = null;
-            this._currentTransport = null;
-            this._currentDirection = null;
-            this._currentComputation = null;
-            this._currentTimeHour = 0;
-            this._currentTimeMinute = 0;
-            this._currentDistance = 0;
-            this._currentExclusions = [];
-            this._initTransport();
-            this._initComputation();
-            this._initDirection();
-            this._initExclusions();
-            this._currentPoint = null;
-            this._geojsonIso = null;
-            this._waiting = false;
-            this._timer = null;
-            this._currentIsoResults = null;
-            this._resources = {};
-            this._noRightManagement = false;
-            this._checkRightsManagement();
-        },
-        onAdd: function (map) {
-            var container = this._container = this._initLayout(map);
-            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
-            return container;
-        },
-        onRemove: function () {
-        },
-        _initTransport: function () {
-            this._currentTransport = 'Voiture';
-            var transport = this.options.graphs;
-            if (!transport || transport.length === 0) {
-                this.options.graphs = [
-                    'Voiture',
-                    'Pieton'
-                ];
-            }
-            if (L.Util.isArray(transport) && transport.length) {
-                if (transport[0] === 'Voiture' || transport[0] === 'Pieton') {
-                    this._currentTransport = transport[0];
-                }
-            }
-            var serviceOptions = this.options.isocurveOptions;
-            if (serviceOptions.graph) {
-                this._currentTransport = serviceOptions.graph;
-            }
-        },
-        _initDirection: function () {
-            this._currentDirection = 'departure';
-            var directions = this.options.directions;
-            if (!directions || directions.length === 0) {
-                this.options.directions = [
-                    'departure',
-                    'arrival'
-                ];
-            }
-            if (L.Util.isArray(directions) && directions.length) {
-                if (directions[0] === 'departure' || directions[0] === 'arrival') {
-                    this._currentDirection = directions[0];
-                }
-            }
-            var serviceOptions = this.options.isocurveOptions;
-            if (!serviceOptions.reverse) {
-                this._currentDirection = 'departure';
-            }
-            if (serviceOptions.reverse === true) {
-                this._currentDirection = 'arrival';
-                this.options.directions = [
-                    'arrival',
-                    'departure'
-                ];
-            }
-        },
-        _initComputation: function () {
-            this._currentComputation = 'time';
-            var methods = this.options.methods;
-            if (!methods || methods.length === 0) {
-                this.options.methods = [
-                    'time',
-                    'distance'
-                ];
-            }
-            if (L.Util.isArray(methods) && methods.length) {
-                if (methods[0] === 'time' || methods[0] === 'distance') {
-                    this._currentComputation = methods[0];
-                }
-            }
-            var serviceOptions = this.options.isocurveOptions;
-            if (serviceOptions.method) {
-                this._currentComputation = serviceOptions.method;
-            }
-            if (serviceOptions.time) {
-                this._currentComputation = 'time';
-            }
-            if (serviceOptions.distance) {
-                this._currentComputation = 'distance';
-            }
-        },
-        _initExclusions: function () {
-            this._currentExclusions = [];
-            var exclusion = this.options.exclusions;
-            if (!exclusion || typeof exclusion === 'object' && Object.keys(exclusion).length === 0) {
-                this.options.exclusions = {
-                    toll: false,
-                    tunnel: false,
-                    bridge: false
-                };
-            }
-            if (exclusion && typeof exclusion === 'object' && Object.keys(exclusion).length) {
-                for (var k in exclusion) {
-                    if (exclusion.hasOwnProperty(k)) {
-                        if (exclusion.k) {
-                            this._currentExclusions.push(k);
-                        }
-                    }
-                }
-            }
-            var serviceOptions = this.options.isocurveOptions;
-            if (Array.isArray(serviceOptions.exclusions)) {
-                this._currentExclusions = serviceOptions.exclusions;
-            }
-        },
-        _checkRightsManagement: function () {
-            var _opts = null;
-            var _res = [];
-            var _key = null;
-            _key = this.options.isocurveOptions.apiKey;
-            _opts = this.options.isocurveOptions.filterOptions;
-            _res = _opts ? _opts.type : [];
-            if (!_res || _res.length === 0) {
-                _res = [
-                    'Voiture',
-                    'Pieton'
-                ];
-            }
-            var rightManagementIsochrone = RightManagement.check({
-                key: _key || this.options.apiKey,
-                resources: _res,
-                services: ['Isochrone']
-            });
-            _key = this.options.autocompleteOptions.apiKey;
-            _opts = this.options.autocompleteOptions.filterOptions;
-            _res = _opts ? _opts.type : [];
-            if (!_res || _res.length === 0) {
-                _res = [
-                    'PositionOfInterest',
-                    'StreetAddress'
-                ];
-            }
-            var rightManagementAutoComplete = RightManagement.check({
-                key: _key || this.options.apiKey,
-                resources: _res,
-                services: ['AutoCompletion']
-            });
-            if (!rightManagementIsochrone && !rightManagementAutoComplete) {
-                this._noRightManagement = true;
-            }
-            if (rightManagementAutoComplete) {
-                this._resources['AutoCompletion'] = {};
-                this._resources['AutoCompletion']['resources'] = rightManagementAutoComplete['AutoCompletion'];
-                this._resources['AutoCompletion']['key'] = rightManagementAutoComplete['key'];
-            }
-            if (rightManagementIsochrone) {
-                this._resources['Isochrone'] = {};
-                this._resources['Isochrone']['resources'] = rightManagementIsochrone['Isochrone'];
-                this._resources['Isochrone']['key'] = rightManagementIsochrone['key'];
-            }
-        },
-        _detectSupport: function () {
-            var isDesktop = true;
-            var userAgent = window.navigator.userAgent.toLowerCase();
-            if (userAgent.indexOf('iphone') !== -1 || userAgent.indexOf('ipod') !== -1 || userAgent.indexOf('ipad') !== -1 || userAgent.indexOf('android') !== -1 || userAgent.indexOf('mobile') !== -1 || userAgent.indexOf('blackberry') !== -1 || userAgent.indexOf('tablet') !== -1 || userAgent.indexOf('phone') !== -1 || userAgent.indexOf('touch') !== -1) {
-                isDesktop = false;
-            }
-            if (userAgent.indexOf('msie') !== -1 || userAgent.indexOf('trident') !== -1) {
-                isDesktop = true;
-            }
-            return isDesktop;
-        },
-        _initLayout: function (map) {
-            var container = this._createMainContainerElement();
-            var inputShow = this._showContainer = this._createShowIsoElement();
-            container.appendChild(inputShow);
-            if (!this.options.collapsed) {
-                inputShow.checked = true;
-            }
-            var picto = this._createShowIsoPictoElement();
-            container.appendChild(picto);
-            var panel = this._createIsoPanelElement();
-            var header = this._createIsoPanelHeaderElement();
-            panel.appendChild(header);
-            var form = this._formContainer = this._createIsoPanelFormElement();
-            var point = this._createIsoPanelFormPointElement(map);
-            form.appendChild(point);
-            var isoChronChecked = false;
-            var isoDistChecked = false;
-            var typeChoice = this._createIsoPanelFormTypeChoiceElement();
-            for (var i = 0; i < this.options.methods.length; i++) {
-                if (this.options.methods[i] === 'time') {
-                    isoChronChecked = i === 0 ? true : false;
-                    typeChoice.appendChild(this._createIsoPanelFormTypeChoiceChronElement(isoChronChecked));
-                }
-                if (this.options.methods[i] === 'distance') {
-                    isoDistChecked = i === 0 ? true : false;
-                    typeChoice.appendChild(this._createIsoPanelFormTypeChoiceDistElement(isoDistChecked));
-                }
-            }
-            form.appendChild(typeChoice);
-            form.appendChild(this._createIsoPanelFormValueIsochronElement(isoChronChecked));
-            form.appendChild(this._createIsoPanelFormValueIsodistanceElement(isoDistChecked));
-            var modeChoice = this._createIsoPanelFormModeChoiceElement();
-            modeChoice.appendChild(this._createIsoPanelFormModeChoiceTransportElement(this.options.graphs));
-            modeChoice.appendChild(this._createIsoPanelFormModeChoiceDirectionElement(this.options.directions));
-            form.appendChild(modeChoice);
-            if (this.options.exclusions && typeof this.options.exclusions === 'object' && Object.keys(this.options.exclusions).length !== 0) {
-                form.appendChild(this._createShowIsoExclusionsElement());
-                form.appendChild(this._createShowIsoExclusionsPictoElement());
-                var exclusion = this._createIsoPanelFormExclusionsElement();
-                exclusion.appendChild(this._createIsoPanelFormExclusionOptionsElement(this.options.exclusions));
-                form.appendChild(exclusion);
-            }
-            var divReset = this._createIsoFormResetElement();
-            form.appendChild(divReset);
-            var submit = this._submitContainer = this._createIsoSubmitFormElement();
-            form.appendChild(submit);
-            panel.appendChild(form);
-            var waiting = this._waitingContainer = this._createIsoWaitingElement();
-            panel.appendChild(waiting);
-            container.appendChild(panel);
-            return container;
-        },
-        _createIsoPanelFormPointElement: function (map) {
-            this._currentPoint = new LocationSelector({
-                apiKey: this.options.apiKey || null,
-                tag: {
-                    id: 0,
-                    unique: this._uid,
-                    label: 'Départ',
-                    color: 'red',
-                    display: true
-                },
-                displayInfo: true,
-                disableReverse: this.options.disableReverse,
-                autocompleteOptions: this.options.autocompleteOptions || null
-            });
-            this._currentPoint.setMap(map);
-            return this._currentPoint.getContainer();
-        },
-        onShowIsoPanelClick: function (e) {
-        },
-        onIsoResetClick: function (e) {
-            this._clear();
-        },
-        onIsoTypeChoiceChange: function (e) {
-            var value = e.target.value;
-            if (!value) {
-                return;
-            }
-            if (value === 'isodistance') {
-                this._currentComputation = 'distance';
-            }
-            if (value === 'isochron') {
-                this._currentComputation = 'time';
-            }
-        },
-        onIsoModeTransportChange: function (e) {
-            var value = e.target.value;
-            if (!value) {
-                return;
-            }
-            this._currentTransport = value;
-        },
-        onIsoModeDirectionChange: function (e) {
-            var value = e.target.value;
-            if (!value) {
-                return;
-            }
-            this._currentDirection = value;
-        },
-        onIsoValueChronTimeHourChange: function (e) {
-            var value = e.target.value;
-            this._timeHourContainer = e.target;
-            if (!value) {
-                return;
-            }
-            this._currentTimeHour = value;
-        },
-        onIsoValueChronTimeMinuteChange: function (e) {
-            var value = e.target.value;
-            this._timeMinuteContainer = e.target;
-            if (!value) {
-                return;
-            }
-            this._currentTimeMinute = value;
-        },
-        onIsoValueDistChange: function (e) {
-            var value = e.target.value;
-            this._distanceContainer = e.target;
-            if (!value) {
-                return;
-            }
-            this._currentDistance = value;
-        },
-        onIsoExclusionsChange: function (e) {
-            var value = e.target.value;
-            var checked = e.target.checked;
-            if (!value) {
-                return;
-            }
-            var bFound = false;
-            var iFound = null;
-            for (var i = 0; i < this._currentExclusions.length; i++) {
-                if (this._currentExclusions[i] === value) {
-                    iFound = i;
-                    bFound = true;
-                }
-            }
-            if (!bFound && !checked) {
-                this._currentExclusions.push(value);
-            }
-            if (bFound && checked) {
-                this._currentExclusions.splice(iFound, 1);
-            }
-        },
-        onIsoComputationSubmit: function () {
-            if (!this._currentPoint || !this._currentPoint.getCoordinate || !this._currentPoint.getCoordinate()) {
-                return;
-            }
-            var time;
-            if (this._currentComputation.toLowerCase() === 'time') {
-                time = this._currentTimeHour * 3600 + this._currentTimeMinute * 60;
-            }
-            var distance;
-            if (this._currentComputation.toLowerCase() === 'distance') {
-                distance = this._currentDistance * 1000;
-            }
-            if (!time && !distance) {
-                return;
-            }
-            if (this._noRightManagement) {
-                return;
-            }
-            this._displayWaitingContainer();
-            var self = this;
-            this._requestIsoCurve({
-                position: self._currentPoint.getCoordinate(),
-                graph: self._currentTransport,
-                exclusions: self._currentExclusions,
-                method: self._currentComputation,
-                reverse: self._currentDirection.toLowerCase() === 'arrival' ? true : false,
-                time: time,
-                distance: distance,
-                smoothing: true,
-                timeout: 7000,
-                protocol: 'XHR',
-                onSuccess: function (results) {
-                    if (results) {
-                        self._drawIsoResults(results);
-                    }
-                },
-                onFailure: function (error) {
-                    self._hideWaitingContainer();
-                    self._clearIsoResultsGeometry();
-                }
-            });
-        },
-        _requestIsoCurve: function (settings) {
-            if (!settings || typeof settings === 'object' && Object.keys(settings).length === 0) {
-                return;
-            }
-            if (!settings.position) {
-                return;
-            }
-            if (this._noRightManagement) {
-                return;
-            }
-            var services = this._resources['Isochrone'];
-            if (!services) {
-                return;
-            }
-            var resources = services.resources;
-            if (!resources || typeof resources === 'object' && Object.keys(resources).length === 0) {
-                return;
-            }
-            var options = {};
-            L.Util.extend(options, settings);
-            L.Util.extend(options, this.options.isocurveOptions);
-            var bFound = false;
-            for (var i = 0; i < resources.length; i++) {
-                if (resources[i] === options.graph) {
-                    bFound = true;
-                }
-            }
-            if (!bFound) {
-                console.log('no rights for this service !?');
-                return;
-            }
-            var key = this._resources['Isochrone']['key'];
-            options.apiKey = this.options.isocurveOptions.apiKey || this.options.apiKey || key;
-            Gp.Services.isoCurve(options);
-        },
-        _drawIsoResults: function (results) {
-            this._clearIsoResultsGeometry();
-            this._currentIsoResults = results;
-            if (!results.geometry) {
-                this._hideWaitingContainer();
-                return;
-            }
-            var map = this._map;
-            var _geometry = results.geometry;
-            var _style = {
-                color: '#ff7800',
-                weight: 5,
-                opacity: 0.65
-            };
-            this._geojsonIso = L.geoJson(_geometry, { style: _style }).addTo(map);
-            this._hideWaitingContainer();
-            this._formContainer.className = 'GPisochroComponentHidden';
-        },
-        _clear: function () {
-            this._initTransport();
-            this._initExclusions();
-            this._initComputation();
-            this._initDirection();
-            this._currentIsoResults = null;
-            this._clearIsoResultsGeometry();
-            this._currentPoint.clear();
-            if (this._timeHourContainer) {
-                this._timeHourContainer.value = 0;
-            }
-            if (this._timeMinuteContainer) {
-                this._timeMinuteContainer.value = 0;
-            }
-            if (this._distanceContainer) {
-                this._distanceContainer.value = 0;
-            }
-        },
-        _clearIsoResultsGeometry: function () {
-            var map = this._map;
-            if (this._geojsonIso != null) {
-                map.removeLayer(this._geojsonIso);
-                this._geojsonIso = null;
-            }
-        },
-        _displayWaitingContainer: function () {
-            this._waitingContainer.className = 'GPisochronCalcWaitingContainerVisible';
-            this._waiting = true;
-            if (this._timer) {
-                clearTimeout(this._timer);
-                this._timer = null;
-            }
-            var context = this;
-            this._timer = setTimeout(function () {
-                if (context._waiting === true) {
-                    context._hideWaitingContainer();
-                } else {
-                    if (context._timer) {
-                        clearTimeout(context._timer);
-                    }
-                }
-            }, 16000);
-        },
-        _hideWaitingContainer: function () {
-            if (this._waiting) {
-                this._waitingContainer.className = 'GPisochronCalcWaitingContainerHidden';
-                this._waiting = false;
-                clearTimeout(this._timer);
-                this._timer = null;
-            }
-        }
-    });
-    return Isocurve;
-}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, LeafletControlsLocationSelector, CommonControlsIsoDOM);
-CommonControlsMousePositionDOM = function () {
-    var MousePositionDOM = {
-        _addUID: function (id) {
-            var uid = this._uid ? id + '-' + this._uid : id;
-            return uid;
-        },
-        _createMainContainerElement: function () {
-            var container = document.createElement('div');
-            container.id = this._addUID('GPmousePosition');
-            container.className = 'GPwidget';
-            return container;
-        },
-        _createShowMousePositionElement: function () {
-            var input = document.createElement('input');
-            input.id = this._addUID('GPshowMousePosition');
-            input.type = 'checkbox';
-            return input;
-        },
-        _createShowMousePositionPictoElement: function (isDesktop) {
-            var self = this;
-            var label = document.createElement('label');
-            label.id = this._addUID('GPshowMousePositionPicto');
-            label.className = 'GPshowAdvancedToolPicto';
-            label.htmlFor = this._addUID('GPshowMousePosition');
-            label.title = 'Afficher les coordonnées du curseur';
-            label.addEventListener('click', function (e) {
-                var mapCenterClass = '';
-                if (!document.getElementById(self._addUID('GPshowMousePosition')).checked && !isDesktop) {
-                    mapCenterClass = 'GPmapCenterVisible';
-                }
-                document.getElementById('GPmapCenter').className = mapCenterClass;
-                self.onShowMousePositionClick(e);
-            });
-            var spanOpen = document.createElement('span');
-            spanOpen.id = this._addUID('GPshowMousePositionOpen');
-            spanOpen.className = 'GPshowAdvancedToolOpen';
-            label.appendChild(spanOpen);
-            return label;
-        },
-        _createMousePositionPanelElement: function (displayAltitude, displayCoordinates) {
-            displayAltitude = displayAltitude ? true : typeof displayAltitude === 'undefined' ? true : false;
-            displayCoordinates = displayCoordinates ? true : typeof displayCoordinates === 'undefined' ? true : false;
-            var div = document.createElement('div');
-            div.id = this._addUID('GPmousePositionPanel');
-            div.className = 'GPpanel';
-            div.appendChild(this._createMousePositionPanelHeaderElement());
-            div.appendChild(this._createMousePositionPanelBasicElement(displayAltitude, displayCoordinates));
-            var arraySettings = this._createShowMousePositionSettingsElement(displayCoordinates);
-            for (var j = 0; j < arraySettings.length; j++) {
-                div.appendChild(arraySettings[j]);
-            }
-            return div;
-        },
-        _createMapCenter: function () {
-            var div = document.createElement('div');
-            div.id = 'GPmapCenter';
-            div.className = '';
-            return div;
-        },
-        _createMousePositionPanelHeaderElement: function () {
-            var container = document.createElement('div');
-            container.className = 'GPpanelHeader';
-            var divTitle = document.createElement('div');
-            divTitle.className = 'GPpanelTitle';
-            divTitle.innerHTML = 'Coordonnées';
-            container.appendChild(divTitle);
-            var divClose = document.createElement('div');
-            divClose.id = 'GPmousePositionPanelClose';
-            divClose.className = 'GPpanelClose';
-            divClose.title = 'Fermer le panneau';
-            var self = this;
-            if (divClose.addEventListener) {
-                divClose.addEventListener('click', function () {
-                    document.getElementById(self._addUID('GPshowMousePositionPicto')).click();
-                }, false);
-            } else if (divClose.attachEvent) {
-                divClose.attachEvent('onclick', function () {
-                    document.getElementById(self._addUID('GPshowMousePositionPicto')).click();
-                });
-            }
-            container.appendChild(divClose);
-            return container;
-        },
-        _createMousePositionPanelBasicElement: function (displayAltitude, displayCoordinates) {
-            var container = document.createElement('div');
-            container.id = this._addUID('GPmousePositionBasicPanel');
-            container.appendChild(this._createMousePositionPanelBasicCoordinateElement(displayCoordinates));
-            container.appendChild(this._createMousePositionPanelBasicAltitudeElement(displayAltitude));
-            return container;
-        },
-        _createMousePositionPanelBasicCoordinateElement: function (display) {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPmousePositionCoordinate');
-            div.style.display = display ? 'block' : 'none';
-            var spanLat = document.createElement('span');
-            spanLat.className = 'GPmousePositionLabel';
-            spanLat.id = this._addUID('GPmousePositionLatLabel');
-            spanLat.innerHTML = 'Latitude : ';
-            div.appendChild(spanLat);
-            var spanCLat = document.createElement('span');
-            spanCLat.className = 'GPmousePositionCoords';
-            spanCLat.id = this._addUID('GPmousePositionLat');
-            spanCLat.innerHTML = '';
-            div.appendChild(spanCLat);
-            var spanLon = document.createElement('span');
-            spanLon.className = 'GPmousePositionLabel';
-            spanLon.id = this._addUID('GPmousePositionLonLabel');
-            spanLon.innerHTML = 'Longitude : ';
-            div.appendChild(spanLon);
-            var spanCLon = document.createElement('span');
-            spanCLon.className = 'GPmousePositionCoords';
-            spanCLon.id = this._addUID('GPmousePositionLon');
-            spanCLon.innerHTML = '';
-            div.appendChild(spanCLon);
-            return div;
-        },
-        _createMousePositionPanelBasicAltitudeElement: function (display) {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPmousePositionAltitude');
-            div.style.display = display ? 'block' : 'none';
-            var spanLabel = document.createElement('span');
-            spanLabel.className = 'GPmousePositionLabel';
-            spanLabel.innerHTML = 'Altitude : ';
-            div.appendChild(spanLabel);
-            var spanAlt = document.createElement('span');
-            spanAlt.className = 'GPmousePositionCoords';
-            spanAlt.id = this._addUID('GPmousePositionAlt');
-            spanAlt.innerHTML = '';
-            div.appendChild(spanAlt);
-            return div;
-        },
-        _createShowMousePositionSettingsElement: function (display) {
-            var list = [];
-            var input = document.createElement('input');
-            input.type = 'checkbox';
-            input.id = this._addUID('GPshowMousePositionSettings');
-            var label = document.createElement('label');
-            label.id = this._addUID('GPshowMousePositionSettingsPicto');
-            label.htmlFor = this._addUID('GPshowMousePositionSettings');
-            label.title = 'Réglages';
-            label.className = 'GPshowMoreOptions GPshowMousePositionSettingsPicto';
-            label.style.display = display ? 'block' : 'none';
-            list.push(input);
-            list.push(label);
-            return list;
-        },
-        _createMousePositionSettingsElement: function () {
-            var container = document.createElement('div');
-            container.id = this._addUID('GPmousePositionSettings');
-            var span = document.createElement('span');
-            span.className = 'GPmousePositionSettingsLabel';
-            span.innerHTML = 'Système de référence';
-            container.appendChild(span);
-            return container;
-        },
-        _createMousePositionSettingsSystemsElement: function (systems) {
-            var context = this;
-            var selectSystem = document.createElement('select');
-            selectSystem.id = this._addUID('GPmousePositionProjectionSystem');
-            selectSystem.className = 'GPinputSelect GPmousePositionSettingsSelect';
-            selectSystem.addEventListener('change', function (e) {
-                context.onMousePositionProjectionSystemChange(e);
-            });
-            selectSystem.addEventListener('mouseover', function (e) {
-                context.onMousePositionProjectionSystemMouseOver(e);
-            });
-            for (var i = 0; i < systems.length; i++) {
-                var obj = systems[i];
-                var option = document.createElement('option');
-                option.value = obj.code;
-                option.text = obj.label || i;
-                selectSystem.appendChild(option);
-            }
-            return selectSystem;
-        },
-        _createMousePositionSettingsUnitsElement: function (units) {
-            var context = this;
-            var selectUnits = document.createElement('select');
-            selectUnits.id = this._addUID('GPmousePositionProjectionUnits');
-            selectUnits.className = 'GPinputSelect GPmousePositionSettingsSelect';
-            selectUnits.addEventListener('change', function (e) {
-                context.onMousePositionProjectionUnitsChange(e);
-            });
-            for (var j = 0; j < units.length; j++) {
-                var obj = units[j];
-                var option = document.createElement('option');
-                option.value = obj.code ? obj.code : j;
-                option.text = obj.label || j;
-                selectUnits.appendChild(option);
-            }
-            return selectUnits;
-        },
-        GPdisplayCoords: function (coordinate) {
-            if (coordinate && coordinate != null) {
-                var labelLon = document.getElementById(this._addUID('GPmousePositionLonLabel'));
-                var labelLat = document.getElementById(this._addUID('GPmousePositionLatLabel'));
-                if (coordinate.x || coordinate.y) {
-                    labelLat.innerHTML = 'X : ';
-                    labelLon.innerHTML = 'Y : ';
-                } else if (coordinate.e || coordinate.n) {
-                    labelLat.innerHTML = 'E : ';
-                    labelLon.innerHTML = 'N : ';
-                } else {
-                    labelLat.innerHTML = 'Latitude : ';
-                    labelLon.innerHTML = 'Longitude : ';
-                }
-                var elLat = document.getElementById(this._addUID('GPmousePositionLat'));
-                var elLon = document.getElementById(this._addUID('GPmousePositionLon'));
-                elLat.innerHTML = coordinate.x || coordinate.lat || coordinate.e || '0';
-                if (coordinate.unit) {
-                    elLat.innerHTML += ' ';
-                    elLat.innerHTML += coordinate.unit;
-                }
-                elLon.innerHTML = coordinate.y || coordinate.lng || coordinate.lon || coordinate.n || '0';
-                if (coordinate.unit) {
-                    elLon.innerHTML += ' ';
-                    elLon.innerHTML += coordinate.unit;
-                }
-            }
-        },
-        GPdisplayElevation: function (coordinate, altitudeTimeoutDelay, noDataValue, noDataValueTolerance) {
-            var self = this;
-            var altitudeTimeout;
-            if (!altitudeTimeoutDelay) {
-                altitudeTimeoutDelay = 500;
-            }
-            clearTimeout(altitudeTimeout);
-            document.getElementById(this._addUID('GPmousePositionAlt')).innerHTML = '...';
-            if (noDataValue == null) {
-                noDataValue = -99999;
-            }
-            if (noDataValueTolerance == null) {
-                noDataValueTolerance = 99980;
-            }
-            var maxThreshold = noDataValue + noDataValueTolerance;
-            var minThreshold = noDataValue - noDataValueTolerance;
-            if (coordinate && coordinate != null) {
-                if (document.getElementById(this._addUID('GPmousePositionAltitude'))) {
-                    altitudeTimeout = setTimeout(function () {
-                        self.onRequestAltitude(coordinate, function (z) {
-                            if (minThreshold < z && z < maxThreshold) {
-                                document.getElementById(self._addUID('GPmousePositionAlt')).innerHTML = '--- m';
-                            } else {
-                                document.getElementById(self._addUID('GPmousePositionAlt')).innerHTML = z + ' m';
-                            }
-                        });
-                    }, altitudeTimeoutDelay);
-                }
-            }
-        }
-    };
-    return MousePositionDOM;
-}();
-!function (e) {
-    if ('object' == typeof exports)
-        module.exports = e();
-    else if (true)
-        proj4 = function () {
-            return typeof e === 'function' ? e() : e;
-        }();
-    else {
-        var f;
-        'undefined' != typeof window ? f = window : 'undefined' != typeof global ? f = global : 'undefined' != typeof self && (f = self), f.proj4 = e();
-    }
-}(function () {
-    var define, 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 (_dereq_, module, exports) {
-                var mgrs = _dereq_('mgrs');
-                function Point(x, y, z) {
-                    if (!(this instanceof Point)) {
-                        return new Point(x, y, z);
-                    }
-                    if (Array.isArray(x)) {
-                        this.x = x[0];
-                        this.y = x[1];
-                        this.z = x[2] || 0;
-                    } else if (typeof x === 'object') {
-                        this.x = x.x;
-                        this.y = x.y;
-                        this.z = x.z || 0;
-                    } else if (typeof x === 'string' && typeof y === 'undefined') {
-                        var coords = x.split(',');
-                        this.x = parseFloat(coords[0], 10);
-                        this.y = parseFloat(coords[1], 10);
-                        this.z = parseFloat(coords[2], 10) || 0;
-                    } else {
-                        this.x = x;
-                        this.y = y;
-                        this.z = z || 0;
-                    }
-                    console.warn('proj4.Point will be removed in version 3, use proj4.toPoint');
-                }
-                Point.fromMGRS = function (mgrsStr) {
-                    return new Point(mgrs.toPoint(mgrsStr));
-                };
-                Point.prototype.toMGRS = function (accuracy) {
-                    return mgrs.forward([
-                        this.x,
-                        this.y
-                    ], accuracy);
-                };
-                module.exports = Point;
-                return exports;
-            },
-            { 'mgrs': 66 }
-        ],
-        2: [
-            function (_dereq_, module, exports) {
-                var parseCode = _dereq_('./parseCode');
-                var extend = _dereq_('./extend');
-                var projections = _dereq_('./projections');
-                var deriveConstants = _dereq_('./deriveConstants');
-                function Projection(srsCode, callback) {
-                    if (!(this instanceof Projection)) {
-                        return new Projection(srsCode);
-                    }
-                    callback = callback || function (error) {
-                        if (error) {
-                            throw error;
-                        }
-                    };
-                    var json = parseCode(srsCode);
-                    if (typeof json !== 'object') {
-                        callback(srsCode);
-                        return;
-                    }
-                    var modifiedJSON = deriveConstants(json);
-                    var ourProj = Projection.projections.get(modifiedJSON.projName);
-                    if (ourProj) {
-                        extend(this, modifiedJSON);
-                        extend(this, ourProj);
-                        this.init();
-                        callback(null, this);
-                    } else {
-                        callback(srsCode);
-                    }
-                }
-                Projection.projections = projections;
-                Projection.projections.start();
-                module.exports = Projection;
-                return exports;
-            },
-            {
-                './deriveConstants': 32,
-                './extend': 33,
-                './parseCode': 36,
-                './projections': 38
-            }
-        ],
-        3: [
-            function (_dereq_, module, exports) {
-                module.exports = function (crs, denorm, point) {
-                    var xin = point.x, yin = point.y, zin = point.z || 0;
-                    var v, t, i;
-                    for (i = 0; i < 3; i++) {
-                        if (denorm && i === 2 && point.z === undefined) {
-                            continue;
-                        }
-                        if (i === 0) {
-                            v = xin;
-                            t = 'x';
-                        } else if (i === 1) {
-                            v = yin;
-                            t = 'y';
-                        } else {
-                            v = zin;
-                            t = 'z';
-                        }
-                        switch (crs.axis[i]) {
-                        case 'e':
-                            point[t] = v;
-                            break;
-                        case 'w':
-                            point[t] = -v;
-                            break;
-                        case 'n':
-                            point[t] = v;
-                            break;
-                        case 's':
-                            point[t] = -v;
-                            break;
-                        case 'u':
-                            if (point[t] !== undefined) {
-                                point.z = v;
-                            }
-                            break;
-                        case 'd':
-                            if (point[t] !== undefined) {
-                                point.z = -v;
-                            }
-                            break;
-                        default:
-                            return null;
-                        }
-                    }
-                    return point;
-                };
-                return exports;
-            },
-            {}
-        ],
-        4: [
-            function (_dereq_, module, exports) {
-                var HALF_PI = Math.PI / 2;
-                var sign = _dereq_('./sign');
-                module.exports = function (x) {
-                    return Math.abs(x) < HALF_PI ? x : x - sign(x) * Math.PI;
-                };
-                return exports;
-            },
-            { './sign': 21 }
-        ],
-        5: [
-            function (_dereq_, module, exports) {
-                var TWO_PI = Math.PI * 2;
-                var sign = _dereq_('./sign');
-                module.exports = function (x) {
-                    return Math.abs(x) < Math.PI ? x : x - sign(x) * TWO_PI;
-                };
-                return exports;
-            },
-            { './sign': 21 }
-        ],
-        6: [
-            function (_dereq_, module, exports) {
-                module.exports = function (x) {
-                    if (Math.abs(x) > 1) {
-                        x = x > 1 ? 1 : -1;
-                    }
-                    return Math.asin(x);
-                };
-                return exports;
-            },
-            {}
-        ],
-        7: [
-            function (_dereq_, module, exports) {
-                module.exports = function (x) {
-                    return 1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x));
-                };
-                return exports;
-            },
-            {}
-        ],
-        8: [
-            function (_dereq_, module, exports) {
-                module.exports = function (x) {
-                    return 0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x));
-                };
-                return exports;
-            },
-            {}
-        ],
-        9: [
-            function (_dereq_, module, exports) {
-                module.exports = function (x) {
-                    return 0.05859375 * x * x * (1 + 0.75 * x);
-                };
-                return exports;
-            },
-            {}
-        ],
-        10: [
-            function (_dereq_, module, exports) {
-                module.exports = function (x) {
-                    return x * x * x * (35 / 3072);
-                };
-                return exports;
-            },
-            {}
-        ],
-        11: [
-            function (_dereq_, module, exports) {
-                module.exports = function (a, e, sinphi) {
-                    var temp = e * sinphi;
-                    return a / Math.sqrt(1 - temp * temp);
-                };
-                return exports;
-            },
-            {}
-        ],
-        12: [
-            function (_dereq_, module, exports) {
-                module.exports = function (ml, e0, e1, e2, e3) {
-                    var phi;
-                    var dphi;
-                    phi = ml / e0;
-                    for (var i = 0; i < 15; i++) {
-                        dphi = (ml - (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi))) / (e0 - 2 * e1 * Math.cos(2 * phi) + 4 * e2 * Math.cos(4 * phi) - 6 * e3 * Math.cos(6 * phi));
-                        phi += dphi;
-                        if (Math.abs(dphi) <= 1e-10) {
-                            return phi;
-                        }
-                    }
-                    return NaN;
-                };
-                return exports;
-            },
-            {}
-        ],
-        13: [
-            function (_dereq_, module, exports) {
-                var HALF_PI = Math.PI / 2;
-                module.exports = function (eccent, q) {
-                    var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent));
-                    if (Math.abs(Math.abs(q) - temp) < 0.000001) {
-                        if (q < 0) {
-                            return -1 * HALF_PI;
-                        } else {
-                            return HALF_PI;
-                        }
-                    }
-                    var phi = Math.asin(0.5 * q);
-                    var dphi;
-                    var sin_phi;
-                    var cos_phi;
-                    var con;
-                    for (var i = 0; i < 30; i++) {
-                        sin_phi = Math.sin(phi);
-                        cos_phi = Math.cos(phi);
-                        con = eccent * sin_phi;
-                        dphi = Math.pow(1 - con * con, 2) / (2 * cos_phi) * (q / (1 - eccent * eccent) - sin_phi / (1 - con * con) + 0.5 / eccent * Math.log((1 - con) / (1 + con)));
-                        phi += dphi;
-                        if (Math.abs(dphi) <= 1e-10) {
-                            return phi;
-                        }
-                    }
-                    return NaN;
-                };
-                return exports;
-            },
-            {}
-        ],
-        14: [
-            function (_dereq_, module, exports) {
-                module.exports = function (e0, e1, e2, e3, phi) {
-                    return e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi);
-                };
-                return exports;
-            },
-            {}
-        ],
-        15: [
-            function (_dereq_, module, exports) {
-                module.exports = function (eccent, sinphi, cosphi) {
-                    var con = eccent * sinphi;
-                    return cosphi / Math.sqrt(1 - con * con);
-                };
-                return exports;
-            },
-            {}
-        ],
-        16: [
-            function (_dereq_, module, exports) {
-                var HALF_PI = Math.PI / 2;
-                module.exports = function (eccent, ts) {
-                    var eccnth = 0.5 * eccent;
-                    var con, dphi;
-                    var phi = HALF_PI - 2 * Math.atan(ts);
-                    for (var i = 0; i <= 15; i++) {
-                        con = eccent * Math.sin(phi);
-                        dphi = HALF_PI - 2 * Math.atan(ts * Math.pow((1 - con) / (1 + con), eccnth)) - phi;
-                        phi += dphi;
-                        if (Math.abs(dphi) <= 1e-10) {
-                            return phi;
-                        }
-                    }
-                    return -9999;
-                };
-                return exports;
-            },
-            {}
-        ],
-        17: [
-            function (_dereq_, module, exports) {
-                var C00 = 1;
-                var C02 = 0.25;
-                var C04 = 0.046875;
-                var C06 = 0.01953125;
-                var C08 = 0.01068115234375;
-                var C22 = 0.75;
-                var C44 = 0.46875;
-                var C46 = 0.013020833333333334;
-                var C48 = 0.007120768229166667;
-                var C66 = 0.3645833333333333;
-                var C68 = 0.005696614583333333;
-                var C88 = 0.3076171875;
-                module.exports = function (es) {
-                    var en = [];
-                    en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08)));
-                    en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08)));
-                    var t = es * es;
-                    en[2] = t * (C44 - es * (C46 + es * C48));
-                    t *= es;
-                    en[3] = t * (C66 - es * C68);
-                    en[4] = t * es * C88;
-                    return en;
-                };
-                return exports;
-            },
-            {}
-        ],
-        18: [
-            function (_dereq_, module, exports) {
-                var pj_mlfn = _dereq_('./pj_mlfn');
-                var EPSLN = 1e-10;
-                var MAX_ITER = 20;
-                module.exports = function (arg, es, en) {
-                    var k = 1 / (1 - es);
-                    var phi = arg;
-                    for (var i = MAX_ITER; i; --i) {
-                        var s = Math.sin(phi);
-                        var t = 1 - es * s * s;
-                        t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k;
-                        phi -= t;
-                        if (Math.abs(t) < EPSLN) {
-                            return phi;
-                        }
-                    }
-                    return phi;
-                };
-                return exports;
-            },
-            { './pj_mlfn': 19 }
-        ],
-        19: [
-            function (_dereq_, module, exports) {
-                module.exports = function (phi, sphi, cphi, en) {
-                    cphi *= sphi;
-                    sphi *= sphi;
-                    return en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4])));
-                };
-                return exports;
-            },
-            {}
-        ],
-        20: [
-            function (_dereq_, module, exports) {
-                module.exports = function (eccent, sinphi) {
-                    var con;
-                    if (eccent > 1e-7) {
-                        con = eccent * sinphi;
-                        return (1 - eccent * eccent) * (sinphi / (1 - con * con) - 0.5 / eccent * Math.log((1 - con) / (1 + con)));
-                    } else {
-                        return 2 * sinphi;
-                    }
-                };
-                return exports;
-            },
-            {}
-        ],
-        21: [
-            function (_dereq_, module, exports) {
-                module.exports = function (x) {
-                    return x < 0 ? -1 : 1;
-                };
-                return exports;
-            },
-            {}
-        ],
-        22: [
-            function (_dereq_, module, exports) {
-                module.exports = function (esinp, exp) {
-                    return Math.pow((1 - esinp) / (1 + esinp), exp);
-                };
-                return exports;
-            },
-            {}
-        ],
-        23: [
-            function (_dereq_, module, exports) {
-                module.exports = function (array) {
-                    var out = {
-                        x: array[0],
-                        y: array[1]
-                    };
-                    if (array.length > 2) {
-                        out.z = array[2];
-                    }
-                    if (array.length > 3) {
-                        out.m = array[3];
-                    }
-                    return out;
-                };
-                return exports;
-            },
-            {}
-        ],
-        24: [
-            function (_dereq_, module, exports) {
-                var HALF_PI = Math.PI / 2;
-                module.exports = function (eccent, phi, sinphi) {
-                    var con = eccent * sinphi;
-                    var com = 0.5 * eccent;
-                    con = Math.pow((1 - con) / (1 + con), com);
-                    return Math.tan(0.5 * (HALF_PI - phi)) / con;
-                };
-                return exports;
-            },
-            {}
-        ],
-        25: [
-            function (_dereq_, module, exports) {
-                exports.wgs84 = {
-                    towgs84: '0,0,0',
-                    ellipse: 'WGS84',
-                    datumName: 'WGS84'
-                };
-                exports.ch1903 = {
-                    towgs84: '674.374,15.056,405.346',
-                    ellipse: 'bessel',
-                    datumName: 'swiss'
-                };
-                exports.ggrs87 = {
-                    towgs84: '-199.87,74.79,246.62',
-                    ellipse: 'GRS80',
-                    datumName: 'Greek_Geodetic_Reference_System_1987'
-                };
-                exports.nad83 = {
-                    towgs84: '0,0,0',
-                    ellipse: 'GRS80',
-                    datumName: 'North_American_Datum_1983'
-                };
-                exports.nad27 = {
-                    nadgrids: '@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat',
-                    ellipse: 'clrk66',
-                    datumName: 'North_American_Datum_1927'
-                };
-                exports.potsdam = {
-                    towgs84: '606.0,23.0,413.0',
-                    ellipse: 'bessel',
-                    datumName: 'Potsdam Rauenberg 1950 DHDN'
-                };
-                exports.carthage = {
-                    towgs84: '-263.0,6.0,431.0',
-                    ellipse: 'clark80',
-                    datumName: 'Carthage 1934 Tunisia'
-                };
-                exports.hermannskogel = {
-                    towgs84: '653.0,-212.0,449.0',
-                    ellipse: 'bessel',
-                    datumName: 'Hermannskogel'
-                };
-                exports.ire65 = {
-                    towgs84: '482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15',
-                    ellipse: 'mod_airy',
-                    datumName: 'Ireland 1965'
-                };
-                exports.rassadiran = {
-                    towgs84: '-133.63,-157.5,-158.62',
-                    ellipse: 'intl',
-                    datumName: 'Rassadiran'
-                };
-                exports.nzgd49 = {
-                    towgs84: '59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993',
-                    ellipse: 'intl',
-                    datumName: 'New Zealand Geodetic Datum 1949'
-                };
-                exports.osgb36 = {
-                    towgs84: '446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894',
-                    ellipse: 'airy',
-                    datumName: 'Airy 1830'
-                };
-                exports.s_jtsk = {
-                    towgs84: '589,76,480',
-                    ellipse: 'bessel',
-                    datumName: 'S-JTSK (Ferro)'
-                };
-                exports.beduaram = {
-                    towgs84: '-106,-87,188',
-                    ellipse: 'clrk80',
-                    datumName: 'Beduaram'
-                };
-                exports.gunung_segara = {
-                    towgs84: '-403,684,41',
-                    ellipse: 'bessel',
-                    datumName: 'Gunung Segara Jakarta'
-                };
-                exports.rnb72 = {
-                    towgs84: '106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1',
-                    ellipse: 'intl',
-                    datumName: 'Reseau National Belge 1972'
-                };
-                return exports;
-            },
-            {}
-        ],
-        26: [
-            function (_dereq_, module, exports) {
-                exports.MERIT = {
-                    a: 6378137,
-                    rf: 298.257,
-                    ellipseName: 'MERIT 1983'
-                };
-                exports.SGS85 = {
-                    a: 6378136,
-                    rf: 298.257,
-                    ellipseName: 'Soviet Geodetic System 85'
-                };
-                exports.GRS80 = {
-                    a: 6378137,
-                    rf: 298.257222101,
-                    ellipseName: 'GRS 1980(IUGG, 1980)'
-                };
-                exports.IAU76 = {
-                    a: 6378140,
-                    rf: 298.257,
-                    ellipseName: 'IAU 1976'
-                };
-                exports.airy = {
-                    a: 6377563.396,
-                    b: 6356256.91,
-                    ellipseName: 'Airy 1830'
-                };
-                exports.APL4 = {
-                    a: 6378137,
-                    rf: 298.25,
-                    ellipseName: 'Appl. Physics. 1965'
-                };
-                exports.NWL9D = {
-                    a: 6378145,
-                    rf: 298.25,
-                    ellipseName: 'Naval Weapons Lab., 1965'
-                };
-                exports.mod_airy = {
-                    a: 6377340.189,
-                    b: 6356034.446,
-                    ellipseName: 'Modified Airy'
-                };
-                exports.andrae = {
-                    a: 6377104.43,
-                    rf: 300,
-                    ellipseName: 'Andrae 1876 (Den., Iclnd.)'
-                };
-                exports.aust_SA = {
-                    a: 6378160,
-                    rf: 298.25,
-                    ellipseName: 'Australian Natl & S. Amer. 1969'
-                };
-                exports.GRS67 = {
-                    a: 6378160,
-                    rf: 298.247167427,
-                    ellipseName: 'GRS 67(IUGG 1967)'
-                };
-                exports.bessel = {
-                    a: 6377397.155,
-                    rf: 299.1528128,
-                    ellipseName: 'Bessel 1841'
-                };
-                exports.bess_nam = {
-                    a: 6377483.865,
-                    rf: 299.1528128,
-                    ellipseName: 'Bessel 1841 (Namibia)'
-                };
-                exports.clrk66 = {
-                    a: 6378206.4,
-                    b: 6356583.8,
-                    ellipseName: 'Clarke 1866'
-                };
-                exports.clrk80 = {
-                    a: 6378249.145,
-                    rf: 293.4663,
-                    ellipseName: 'Clarke 1880 mod.'
-                };
-                exports.clrk58 = {
-                    a: 6378293.645208759,
-                    rf: 294.2606763692654,
-                    ellipseName: 'Clarke 1858'
-                };
-                exports.CPM = {
-                    a: 6375738.7,
-                    rf: 334.29,
-                    ellipseName: 'Comm. des Poids et Mesures 1799'
-                };
-                exports.delmbr = {
-                    a: 6376428,
-                    rf: 311.5,
-                    ellipseName: 'Delambre 1810 (Belgium)'
-                };
-                exports.engelis = {
-                    a: 6378136.05,
-                    rf: 298.2566,
-                    ellipseName: 'Engelis 1985'
-                };
-                exports.evrst30 = {
-                    a: 6377276.345,
-                    rf: 300.8017,
-                    ellipseName: 'Everest 1830'
-                };
-                exports.evrst48 = {
-                    a: 6377304.063,
-                    rf: 300.8017,
-                    ellipseName: 'Everest 1948'
-                };
-                exports.evrst56 = {
-                    a: 6377301.243,
-                    rf: 300.8017,
-                    ellipseName: 'Everest 1956'
-                };
-                exports.evrst69 = {
-                    a: 6377295.664,
-                    rf: 300.8017,
-                    ellipseName: 'Everest 1969'
-                };
-                exports.evrstSS = {
-                    a: 6377298.556,
-                    rf: 300.8017,
-                    ellipseName: 'Everest (Sabah & Sarawak)'
-                };
-                exports.fschr60 = {
-                    a: 6378166,
-                    rf: 298.3,
-                    ellipseName: 'Fischer (Mercury Datum) 1960'
-                };
-                exports.fschr60m = {
-                    a: 6378155,
-                    rf: 298.3,
-                    ellipseName: 'Fischer 1960'
-                };
-                exports.fschr68 = {
-                    a: 6378150,
-                    rf: 298.3,
-                    ellipseName: 'Fischer 1968'
-                };
-                exports.helmert = {
-                    a: 6378200,
-                    rf: 298.3,
-                    ellipseName: 'Helmert 1906'
-                };
-                exports.hough = {
-                    a: 6378270,
-                    rf: 297,
-                    ellipseName: 'Hough'
-                };
-                exports.intl = {
-                    a: 6378388,
-                    rf: 297,
-                    ellipseName: 'International 1909 (Hayford)'
-                };
-                exports.kaula = {
-                    a: 6378163,
-                    rf: 298.24,
-                    ellipseName: 'Kaula 1961'
-                };
-                exports.lerch = {
-                    a: 6378139,
-                    rf: 298.257,
-                    ellipseName: 'Lerch 1979'
-                };
-                exports.mprts = {
-                    a: 6397300,
-                    rf: 191,
-                    ellipseName: 'Maupertius 1738'
-                };
-                exports.new_intl = {
-                    a: 6378157.5,
-                    b: 6356772.2,
-                    ellipseName: 'New International 1967'
-                };
-                exports.plessis = {
-                    a: 6376523,
-                    rf: 6355863,
-                    ellipseName: 'Plessis 1817 (France)'
-                };
-                exports.krass = {
-                    a: 6378245,
-                    rf: 298.3,
-                    ellipseName: 'Krassovsky, 1942'
-                };
-                exports.SEasia = {
-                    a: 6378155,
-                    b: 6356773.3205,
-                    ellipseName: 'Southeast Asia'
-                };
-                exports.walbeck = {
-                    a: 6376896,
-                    b: 6355834.8467,
-                    ellipseName: 'Walbeck'
-                };
-                exports.WGS60 = {
-                    a: 6378165,
-                    rf: 298.3,
-                    ellipseName: 'WGS 60'
-                };
-                exports.WGS66 = {
-                    a: 6378145,
-                    rf: 298.25,
-                    ellipseName: 'WGS 66'
-                };
-                exports.WGS7 = {
-                    a: 6378135,
-                    rf: 298.26,
-                    ellipseName: 'WGS 72'
-                };
-                exports.WGS84 = {
-                    a: 6378137,
-                    rf: 298.257223563,
-                    ellipseName: 'WGS 84'
-                };
-                exports.sphere = {
-                    a: 6370997,
-                    b: 6370997,
-                    ellipseName: 'Normal Sphere (r=6370997)'
-                };
-                return exports;
-            },
-            {}
-        ],
-        27: [
-            function (_dereq_, module, exports) {
-                exports.greenwich = 0;
-                exports.lisbon = -9.131906111111;
-                exports.paris = 2.337229166667;
-                exports.bogota = -74.080916666667;
-                exports.madrid = -3.687938888889;
-                exports.rome = 12.452333333333;
-                exports.bern = 7.439583333333;
-                exports.jakarta = 106.807719444444;
-                exports.ferro = -17.666666666667;
-                exports.brussels = 4.367975;
-                exports.stockholm = 18.058277777778;
-                exports.athens = 23.7163375;
-                exports.oslo = 10.722916666667;
-                return exports;
-            },
-            {}
-        ],
-        28: [
-            function (_dereq_, module, exports) {
-                var proj = _dereq_('./Proj');
-                var transform = _dereq_('./transform');
-                var wgs84 = proj('WGS84');
-                function transformer(from, to, coords) {
-                    var transformedArray;
-                    if (Array.isArray(coords)) {
-                        transformedArray = transform(from, to, coords);
-                        if (coords.length === 3) {
-                            return [
-                                transformedArray.x,
-                                transformedArray.y,
-                                transformedArray.z
-                            ];
-                        } else {
-                            return [
-                                transformedArray.x,
-                                transformedArray.y
-                            ];
-                        }
-                    } else {
-                        return transform(from, to, coords);
-                    }
-                }
-                function checkProj(item) {
-                    if (item instanceof proj) {
-                        return item;
-                    }
-                    if (item.oProj) {
-                        return item.oProj;
-                    }
-                    return proj(item);
-                }
-                function proj4(fromProj, toProj, coord) {
-                    fromProj = checkProj(fromProj);
-                    var single = false;
-                    var obj;
-                    if (typeof toProj === 'undefined') {
-                        toProj = fromProj;
-                        fromProj = wgs84;
-                        single = true;
-                    } else if (typeof toProj.x !== 'undefined' || Array.isArray(toProj)) {
-                        coord = toProj;
-                        toProj = fromProj;
-                        fromProj = wgs84;
-                        single = true;
-                    }
-                    toProj = checkProj(toProj);
-                    if (coord) {
-                        return transformer(fromProj, toProj, coord);
-                    } else {
-                        obj = {
-                            forward: function (coords) {
-                                return transformer(fromProj, toProj, coords);
-                            },
-                            inverse: function (coords) {
-                                return transformer(toProj, fromProj, coords);
-                            }
-                        };
-                        if (single) {
-                            obj.oProj = toProj;
-                        }
-                        return obj;
-                    }
-                }
-                module.exports = proj4;
-                return exports;
-            },
-            {
-                './Proj': 2,
-                './transform': 64
-            }
-        ],
-        29: [
-            function (_dereq_, module, exports) {
-                var HALF_PI = Math.PI / 2;
-                var PJD_3PARAM = 1;
-                var PJD_7PARAM = 2;
-                var PJD_GRIDSHIFT = 3;
-                var PJD_WGS84 = 4;
-                var PJD_NODATUM = 5;
-                var SEC_TO_RAD = 0.00000484813681109536;
-                var AD_C = 1.0026;
-                var COS_67P5 = 0.3826834323650898;
-                var datum = function (proj) {
-                    if (!(this instanceof datum)) {
-                        return new datum(proj);
-                    }
-                    this.datum_type = PJD_WGS84;
-                    if (!proj) {
-                        return;
-                    }
-                    if (proj.datumCode && proj.datumCode === 'none') {
-                        this.datum_type = PJD_NODATUM;
-                    }
-                    if (proj.datum_params) {
-                        for (var i = 0; i < proj.datum_params.length; i++) {
-                            proj.datum_params[i] = parseFloat(proj.datum_params[i]);
-                        }
-                        if (proj.datum_params[0] !== 0 || proj.datum_params[1] !== 0 || proj.datum_params[2] !== 0) {
-                            this.datum_type = PJD_3PARAM;
-                        }
-                        if (proj.datum_params.length > 3) {
-                            if (proj.datum_params[3] !== 0 || proj.datum_params[4] !== 0 || proj.datum_params[5] !== 0 || proj.datum_params[6] !== 0) {
-                                this.datum_type = PJD_7PARAM;
-                                proj.datum_params[3] *= SEC_TO_RAD;
-                                proj.datum_params[4] *= SEC_TO_RAD;
-                                proj.datum_params[5] *= SEC_TO_RAD;
-                                proj.datum_params[6] = proj.datum_params[6] / 1000000 + 1;
-                            }
-                        }
-                    }
-                    this.datum_type = proj.grids ? PJD_GRIDSHIFT : this.datum_type;
-                    this.a = proj.a;
-                    this.b = proj.b;
-                    this.es = proj.es;
-                    this.ep2 = proj.ep2;
-                    this.datum_params = proj.datum_params;
-                    if (this.datum_type === PJD_GRIDSHIFT) {
-                        this.grids = proj.grids;
-                    }
-                };
-                datum.prototype = {
-                    compare_datums: function (dest) {
-                        if (this.datum_type !== dest.datum_type) {
-                            return false;
-                        } else if (this.a !== dest.a || Math.abs(this.es - dest.es) > 5e-11) {
-                            return false;
-                        } else if (this.datum_type === PJD_3PARAM) {
-                            return this.datum_params[0] === dest.datum_params[0] && this.datum_params[1] === dest.datum_params[1] && this.datum_params[2] === dest.datum_params[2];
-                        } else if (this.datum_type === PJD_7PARAM) {
-                            return this.datum_params[0] === dest.datum_params[0] && this.datum_params[1] === dest.datum_params[1] && this.datum_params[2] === dest.datum_params[2] && this.datum_params[3] === dest.datum_params[3] && this.datum_params[4] === dest.datum_params[4] && this.datum_params[5] === dest.datum_params[5] && this.datum_params[6] === dest.datum_params[6];
-                        } else if (this.datum_type === PJD_GRIDSHIFT || dest.datum_type === PJD_GRIDSHIFT) {
-                            return this.nadgrids === dest.nadgrids;
-                        } else {
-                            return true;
-                        }
-                    },
-                    geodetic_to_geocentric: function (p) {
-                        var Longitude = p.x;
-                        var Latitude = p.y;
-                        var Height = p.z ? p.z : 0;
-                        var X;
-                        var Y;
-                        var Z;
-                        var Error_Code = 0;
-                        var Rn;
-                        var Sin_Lat;
-                        var Sin2_Lat;
-                        var Cos_Lat;
-                        if (Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI) {
-                            Latitude = -HALF_PI;
-                        } else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) {
-                            Latitude = HALF_PI;
-                        } else if (Latitude < -HALF_PI || Latitude > HALF_PI) {
-                            return null;
-                        }
-                        if (Longitude > Math.PI) {
-                            Longitude -= 2 * Math.PI;
-                        }
-                        Sin_Lat = Math.sin(Latitude);
-                        Cos_Lat = Math.cos(Latitude);
-                        Sin2_Lat = Sin_Lat * Sin_Lat;
-                        Rn = this.a / Math.sqrt(1 - this.es * Sin2_Lat);
-                        X = (Rn + Height) * Cos_Lat * Math.cos(Longitude);
-                        Y = (Rn + Height) * Cos_Lat * Math.sin(Longitude);
-                        Z = (Rn * (1 - this.es) + Height) * Sin_Lat;
-                        p.x = X;
-                        p.y = Y;
-                        p.z = Z;
-                        return Error_Code;
-                    },
-                    geocentric_to_geodetic: function (p) {
-                        var genau = 1e-12;
-                        var genau2 = genau * genau;
-                        var maxiter = 30;
-                        var P;
-                        var RR;
-                        var CT;
-                        var ST;
-                        var RX;
-                        var RK;
-                        var RN;
-                        var CPHI0;
-                        var SPHI0;
-                        var CPHI;
-                        var SPHI;
-                        var SDPHI;
-                        var At_Pole;
-                        var iter;
-                        var X = p.x;
-                        var Y = p.y;
-                        var Z = p.z ? p.z : 0;
-                        var Longitude;
-                        var Latitude;
-                        var Height;
-                        At_Pole = false;
-                        P = Math.sqrt(X * X + Y * Y);
-                        RR = Math.sqrt(X * X + Y * Y + Z * Z);
-                        if (P / this.a < genau) {
-                            At_Pole = true;
-                            Longitude = 0;
-                            if (RR / this.a < genau) {
-                                Latitude = HALF_PI;
-                                Height = -this.b;
-                                return;
-                            }
-                        } else {
-                            Longitude = Math.atan2(Y, X);
-                        }
-                        CT = Z / RR;
-                        ST = P / RR;
-                        RX = 1 / Math.sqrt(1 - this.es * (2 - this.es) * ST * ST);
-                        CPHI0 = ST * (1 - this.es) * RX;
-                        SPHI0 = CT * RX;
-                        iter = 0;
-                        do {
-                            iter++;
-                            RN = this.a / Math.sqrt(1 - this.es * SPHI0 * SPHI0);
-                            Height = P * CPHI0 + Z * SPHI0 - RN * (1 - this.es * SPHI0 * SPHI0);
-                            RK = this.es * RN / (RN + Height);
-                            RX = 1 / Math.sqrt(1 - RK * (2 - RK) * ST * ST);
-                            CPHI = ST * (1 - RK) * RX;
-                            SPHI = CT * RX;
-                            SDPHI = SPHI * CPHI0 - CPHI * SPHI0;
-                            CPHI0 = CPHI;
-                            SPHI0 = SPHI;
-                        } while (SDPHI * SDPHI > genau2 && iter < maxiter);
-                        Latitude = Math.atan(SPHI / Math.abs(CPHI));
-                        p.x = Longitude;
-                        p.y = Latitude;
-                        p.z = Height;
-                        return p;
-                    },
-                    geocentric_to_geodetic_noniter: function (p) {
-                        var X = p.x;
-                        var Y = p.y;
-                        var Z = p.z ? p.z : 0;
-                        var Longitude;
-                        var Latitude;
-                        var Height;
-                        var W;
-                        var W2;
-                        var T0;
-                        var T1;
-                        var S0;
-                        var S1;
-                        var Sin_B0;
-                        var Sin3_B0;
-                        var Cos_B0;
-                        var Sin_p1;
-                        var Cos_p1;
-                        var Rn;
-                        var Sum;
-                        var At_Pole;
-                        X = parseFloat(X);
-                        Y = parseFloat(Y);
-                        Z = parseFloat(Z);
-                        At_Pole = false;
-                        if (X !== 0) {
-                            Longitude = Math.atan2(Y, X);
-                        } else {
-                            if (Y > 0) {
-                                Longitude = HALF_PI;
-                            } else if (Y < 0) {
-                                Longitude = -HALF_PI;
-                            } else {
-                                At_Pole = true;
-                                Longitude = 0;
-                                if (Z > 0) {
-                                    Latitude = HALF_PI;
-                                } else if (Z < 0) {
-                                    Latitude = -HALF_PI;
-                                } else {
-                                    Latitude = HALF_PI;
-                                    Height = -this.b;
-                                    return;
-                                }
-                            }
-                        }
-                        W2 = X * X + Y * Y;
-                        W = Math.sqrt(W2);
-                        T0 = Z * AD_C;
-                        S0 = Math.sqrt(T0 * T0 + W2);
-                        Sin_B0 = T0 / S0;
-                        Cos_B0 = W / S0;
-                        Sin3_B0 = Sin_B0 * Sin_B0 * Sin_B0;
-                        T1 = Z + this.b * this.ep2 * Sin3_B0;
-                        Sum = W - this.a * this.es * Cos_B0 * Cos_B0 * Cos_B0;
-                        S1 = Math.sqrt(T1 * T1 + Sum * Sum);
-                        Sin_p1 = T1 / S1;
-                        Cos_p1 = Sum / S1;
-                        Rn = this.a / Math.sqrt(1 - this.es * Sin_p1 * Sin_p1);
-                        if (Cos_p1 >= COS_67P5) {
-                            Height = W / Cos_p1 - Rn;
-                        } else if (Cos_p1 <= -COS_67P5) {
-                            Height = W / -Cos_p1 - Rn;
-                        } else {
-                            Height = Z / Sin_p1 + Rn * (this.es - 1);
-                        }
-                        if (At_Pole === false) {
-                            Latitude = Math.atan(Sin_p1 / Cos_p1);
-                        }
-                        p.x = Longitude;
-                        p.y = Latitude;
-                        p.z = Height;
-                        return p;
-                    },
-                    geocentric_to_wgs84: function (p) {
-                        if (this.datum_type === PJD_3PARAM) {
-                            p.x += this.datum_params[0];
-                            p.y += this.datum_params[1];
-                            p.z += this.datum_params[2];
-                        } else if (this.datum_type === PJD_7PARAM) {
-                            var Dx_BF = this.datum_params[0];
-                            var Dy_BF = this.datum_params[1];
-                            var Dz_BF = this.datum_params[2];
-                            var Rx_BF = this.datum_params[3];
-                            var Ry_BF = this.datum_params[4];
-                            var Rz_BF = this.datum_params[5];
-                            var M_BF = this.datum_params[6];
-                            var x_out = M_BF * (p.x - Rz_BF * p.y + Ry_BF * p.z) + Dx_BF;
-                            var y_out = M_BF * (Rz_BF * p.x + p.y - Rx_BF * p.z) + Dy_BF;
-                            var z_out = M_BF * (-Ry_BF * p.x + Rx_BF * p.y + p.z) + Dz_BF;
-                            p.x = x_out;
-                            p.y = y_out;
-                            p.z = z_out;
-                        }
-                    },
-                    geocentric_from_wgs84: function (p) {
-                        if (this.datum_type === PJD_3PARAM) {
-                            p.x -= this.datum_params[0];
-                            p.y -= this.datum_params[1];
-                            p.z -= this.datum_params[2];
-                        } else if (this.datum_type === PJD_7PARAM) {
-                            var Dx_BF = this.datum_params[0];
-                            var Dy_BF = this.datum_params[1];
-                            var Dz_BF = this.datum_params[2];
-                            var Rx_BF = this.datum_params[3];
-                            var Ry_BF = this.datum_params[4];
-                            var Rz_BF = this.datum_params[5];
-                            var M_BF = this.datum_params[6];
-                            var x_tmp = (p.x - Dx_BF) / M_BF;
-                            var y_tmp = (p.y - Dy_BF) / M_BF;
-                            var z_tmp = (p.z - Dz_BF) / M_BF;
-                            p.x = x_tmp + Rz_BF * y_tmp - Ry_BF * z_tmp;
-                            p.y = -Rz_BF * x_tmp + y_tmp + Rx_BF * z_tmp;
-                            p.z = Ry_BF * x_tmp - Rx_BF * y_tmp + z_tmp;
-                        }
-                    }
-                };
-                module.exports = datum;
-                return exports;
-            },
-            {}
-        ],
-        30: [
-            function (_dereq_, module, exports) {
-                var PJD_3PARAM = 1;
-                var PJD_7PARAM = 2;
-                var PJD_GRIDSHIFT = 3;
-                var PJD_NODATUM = 5;
-                var SRS_WGS84_SEMIMAJOR = 6378137;
-                var SRS_WGS84_ESQUARED = 0.006694379990141316;
-                module.exports = function (source, dest, point) {
-                    var wp, i, l;
-                    function checkParams(fallback) {
-                        return fallback === PJD_3PARAM || fallback === PJD_7PARAM;
-                    }
-                    if (source.compare_datums(dest)) {
-                        return point;
-                    }
-                    if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) {
-                        return point;
-                    }
-                    var src_a = source.a;
-                    var src_es = source.es;
-                    var dst_a = dest.a;
-                    var dst_es = dest.es;
-                    var fallback = source.datum_type;
-                    if (fallback === PJD_GRIDSHIFT) {
-                        if (this.apply_gridshift(source, 0, point) === 0) {
-                            source.a = SRS_WGS84_SEMIMAJOR;
-                            source.es = SRS_WGS84_ESQUARED;
-                        } else {
-                            if (!source.datum_params) {
-                                source.a = src_a;
-                                source.es = source.es;
-                                return point;
-                            }
-                            wp = 1;
-                            for (i = 0, l = source.datum_params.length; i < l; i++) {
-                                wp *= source.datum_params[i];
-                            }
-                            if (wp === 0) {
-                                source.a = src_a;
-                                source.es = source.es;
-                                return point;
-                            }
-                            if (source.datum_params.length > 3) {
-                                fallback = PJD_7PARAM;
-                            } else {
-                                fallback = PJD_3PARAM;
-                            }
-                        }
-                    }
-                    if (dest.datum_type === PJD_GRIDSHIFT) {
-                        dest.a = SRS_WGS84_SEMIMAJOR;
-                        dest.es = SRS_WGS84_ESQUARED;
-                    }
-                    if (source.es !== dest.es || source.a !== dest.a || checkParams(fallback) || checkParams(dest.datum_type)) {
-                        source.geodetic_to_geocentric(point);
-                        if (checkParams(source.datum_type)) {
-                            source.geocentric_to_wgs84(point);
-                        }
-                        if (checkParams(dest.datum_type)) {
-                            dest.geocentric_from_wgs84(point);
-                        }
-                        dest.geocentric_to_geodetic(point);
-                    }
-                    if (dest.datum_type === PJD_GRIDSHIFT) {
-                        this.apply_gridshift(dest, 1, point);
-                    }
-                    source.a = src_a;
-                    source.es = src_es;
-                    dest.a = dst_a;
-                    dest.es = dst_es;
-                    return point;
-                };
-                return exports;
-            },
-            {}
-        ],
-        31: [
-            function (_dereq_, module, exports) {
-                var globals = _dereq_('./global');
-                var parseProj = _dereq_('./projString');
-                var wkt = _dereq_('./wkt');
-                function defs(name) {
-                    var that = this;
-                    if (arguments.length === 2) {
-                        var def = arguments[1];
-                        if (typeof def === 'string') {
-                            if (def[0] === '+') {
-                                defs[name] = parseProj(arguments[1]);
-                            } else {
-                                defs[name] = wkt(arguments[1]);
-                            }
-                        } else {
-                            defs[name] = def;
-                        }
-                    } else if (arguments.length === 1) {
-                        if (Array.isArray(name)) {
-                            return name.map(function (v) {
-                                if (Array.isArray(v)) {
-                                    defs.apply(that, v);
-                                } else {
-                                    defs(v);
-                                }
-                            });
-                        } else if (typeof name === 'string') {
-                            if (name in defs) {
-                                return defs[name];
-                            }
-                        } else if ('EPSG' in name) {
-                            defs['EPSG:' + name.EPSG] = name;
-                        } else if ('ESRI' in name) {
-                            defs['ESRI:' + name.ESRI] = name;
-                        } else if ('IAU2000' in name) {
-                            defs['IAU2000:' + name.IAU2000] = name;
-                        } else {
-                            console.log(name);
-                        }
-                        return;
-                    }
-                }
-                globals(defs);
-                module.exports = defs;
-                return exports;
-            },
-            {
-                './global': 34,
-                './projString': 37,
-                './wkt': 65
-            }
-        ],
-        32: [
-            function (_dereq_, module, exports) {
-                var Datum = _dereq_('./constants/Datum');
-                var Ellipsoid = _dereq_('./constants/Ellipsoid');
-                var extend = _dereq_('./extend');
-                var datum = _dereq_('./datum');
-                var EPSLN = 1e-10;
-                var SIXTH = 0.16666666666666666;
-                var RA4 = 0.04722222222222222;
-                var RA6 = 0.022156084656084655;
-                module.exports = function (json) {
-                    if (json.datumCode && json.datumCode !== 'none') {
-                        var datumDef = Datum[json.datumCode];
-                        if (datumDef) {
-                            json.datum_params = datumDef.towgs84 ? datumDef.towgs84.split(',') : null;
-                            json.ellps = datumDef.ellipse;
-                            json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode;
-                        }
-                    }
-                    if (!json.a) {
-                        var ellipse = Ellipsoid[json.ellps] ? Ellipsoid[json.ellps] : Ellipsoid.WGS84;
-                        extend(json, ellipse);
-                    }
-                    if (json.rf && !json.b) {
-                        json.b = (1 - 1 / json.rf) * json.a;
-                    }
-                    if (json.rf === 0 || Math.abs(json.a - json.b) < EPSLN) {
-                        json.sphere = true;
-                        json.b = json.a;
-                    }
-                    json.a2 = json.a * json.a;
-                    json.b2 = json.b * json.b;
-                    json.es = (json.a2 - json.b2) / json.a2;
-                    json.e = Math.sqrt(json.es);
-                    if (json.R_A) {
-                        json.a *= 1 - json.es * (SIXTH + json.es * (RA4 + json.es * RA6));
-                        json.a2 = json.a * json.a;
-                        json.b2 = json.b * json.b;
-                        json.es = 0;
-                    }
-                    json.ep2 = (json.a2 - json.b2) / json.b2;
-                    if (!json.k0) {
-                        json.k0 = 1;
-                    }
-                    if (!json.axis) {
-                        json.axis = 'enu';
-                    }
-                    json.datum = datum(json);
-                    return json;
-                };
-                return exports;
-            },
-            {
-                './constants/Datum': 25,
-                './constants/Ellipsoid': 26,
-                './datum': 29,
-                './extend': 33
-            }
-        ],
-        33: [
-            function (_dereq_, module, exports) {
-                module.exports = function (destination, source) {
-                    destination = destination || {};
-                    var value, property;
-                    if (!source) {
-                        return destination;
-                    }
-                    for (property in source) {
-                        value = source[property];
-                        if (value !== undefined) {
-                            destination[property] = value;
-                        }
-                    }
-                    return destination;
-                };
-                return exports;
-            },
-            {}
-        ],
-        34: [
-            function (_dereq_, module, exports) {
-                module.exports = function (defs) {
-                    defs('EPSG:4326', '+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees');
-                    defs('EPSG:4269', '+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees');
-                    defs('EPSG:3857', '+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs');
-                    defs.WGS84 = defs['EPSG:4326'];
-                    defs['EPSG:3785'] = defs['EPSG:3857'];
-                    defs.GOOGLE = defs['EPSG:3857'];
-                    defs['EPSG:900913'] = defs['EPSG:3857'];
-                    defs['EPSG:102113'] = defs['EPSG:3857'];
-                };
-                return exports;
-            },
-            {}
-        ],
-        35: [
-            function (_dereq_, module, exports) {
-                var proj4 = _dereq_('./core');
-                proj4.defaultDatum = 'WGS84';
-                proj4.Proj = _dereq_('./Proj');
-                proj4.WGS84 = new proj4.Proj('WGS84');
-                proj4.Point = _dereq_('./Point');
-                proj4.toPoint = _dereq_('./common/toPoint');
-                proj4.defs = _dereq_('./defs');
-                proj4.transform = _dereq_('./transform');
-                proj4.mgrs = _dereq_('mgrs');
-                proj4.version = _dereq_('../package.json').version;
-                _dereq_('./includedProjections')(proj4);
-                module.exports = proj4;
-                return exports;
-            },
-            {
-                '../package.json': 67,
-                './Point': 1,
-                './Proj': 2,
-                './common/toPoint': 23,
-                './core': 28,
-                './defs': 31,
-                './includedProjections': 'gWUPNW',
-                './transform': 64,
-                'mgrs': 66
-            }
-        ],
-        36: [
-            function (_dereq_, module, exports) {
-                var defs = _dereq_('./defs');
-                var wkt = _dereq_('./wkt');
-                var projStr = _dereq_('./projString');
-                function testObj(code) {
-                    return typeof code === 'string';
-                }
-                function testDef(code) {
-                    return code in defs;
-                }
-                function testWKT(code) {
-                    var codeWords = [
-                        'GEOGCS',
-                        'GEOCCS',
-                        'PROJCS',
-                        'LOCAL_CS'
-                    ];
-                    return codeWords.reduce(function (a, b) {
-                        return a + 1 + code.indexOf(b);
-                    }, 0);
-                }
-                function testProj(code) {
-                    return code[0] === '+';
-                }
-                function parse(code) {
-                    if (testObj(code)) {
-                        if (testDef(code)) {
-                            return defs[code];
-                        } else if (testWKT(code)) {
-                            return wkt(code);
-                        } else if (testProj(code)) {
-                            return projStr(code);
-                        }
-                    } else {
-                        return code;
-                    }
-                }
-                module.exports = parse;
-                return exports;
-            },
-            {
-                './defs': 31,
-                './projString': 37,
-                './wkt': 65
-            }
-        ],
-        37: [
-            function (_dereq_, module, exports) {
-                var D2R = 0.017453292519943295;
-                var PrimeMeridian = _dereq_('./constants/PrimeMeridian');
-                module.exports = function (defData) {
-                    var self = {};
-                    var paramObj = {};
-                    defData.split('+').map(function (v) {
-                        return v.trim();
-                    }).filter(function (a) {
-                        return a;
-                    }).forEach(function (a) {
-                        var split = a.split('=');
-                        split.push(true);
-                        paramObj[split[0].toLowerCase()] = split[1];
-                    });
-                    var paramName, paramVal, paramOutname;
-                    var params = {
-                        proj: 'projName',
-                        datum: 'datumCode',
-                        rf: function (v) {
-                            self.rf = parseFloat(v, 10);
-                        },
-                        lat_0: function (v) {
-                            self.lat0 = v * D2R;
-                        },
-                        lat_1: function (v) {
-                            self.lat1 = v * D2R;
-                        },
-                        lat_2: function (v) {
-                            self.lat2 = v * D2R;
-                        },
-                        lat_ts: function (v) {
-                            self.lat_ts = v * D2R;
-                        },
-                        lon_0: function (v) {
-                            self.long0 = v * D2R;
-                        },
-                        lon_1: function (v) {
-                            self.long1 = v * D2R;
-                        },
-                        lon_2: function (v) {
-                            self.long2 = v * D2R;
-                        },
-                        alpha: function (v) {
-                            self.alpha = parseFloat(v) * D2R;
-                        },
-                        lonc: function (v) {
-                            self.longc = v * D2R;
-                        },
-                        x_0: function (v) {
-                            self.x0 = parseFloat(v, 10);
-                        },
-                        y_0: function (v) {
-                            self.y0 = parseFloat(v, 10);
-                        },
-                        k_0: function (v) {
-                            self.k0 = parseFloat(v, 10);
-                        },
-                        k: function (v) {
-                            self.k0 = parseFloat(v, 10);
-                        },
-                        r_a: function () {
-                            self.R_A = true;
-                        },
-                        zone: function (v) {
-                            self.zone = parseInt(v, 10);
-                        },
-                        south: function () {
-                            self.utmSouth = true;
-                        },
-                        towgs84: function (v) {
-                            self.datum_params = v.split(',').map(function (a) {
-                                return parseFloat(a, 10);
-                            });
-                        },
-                        to_meter: function (v) {
-                            self.to_meter = parseFloat(v, 10);
-                        },
-                        from_greenwich: function (v) {
-                            self.from_greenwich = v * D2R;
-                        },
-                        pm: function (v) {
-                            self.from_greenwich = (PrimeMeridian[v] ? PrimeMeridian[v] : parseFloat(v, 10)) * D2R;
-                        },
-                        nadgrids: function (v) {
-                            if (v === '@null') {
-                                self.datumCode = 'none';
-                            } else {
-                                self.nadgrids = v;
-                            }
-                        },
-                        axis: function (v) {
-                            var legalAxis = 'ewnsud';
-                            if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) {
-                                self.axis = v;
-                            }
-                        }
-                    };
-                    for (paramName in paramObj) {
-                        paramVal = paramObj[paramName];
-                        if (paramName in params) {
-                            paramOutname = params[paramName];
-                            if (typeof paramOutname === 'function') {
-                                paramOutname(paramVal);
-                            } else {
-                                self[paramOutname] = paramVal;
-                            }
-                        } else {
-                            self[paramName] = paramVal;
-                        }
-                    }
-                    if (typeof self.datumCode === 'string' && self.datumCode !== 'WGS84') {
-                        self.datumCode = self.datumCode.toLowerCase();
-                    }
-                    return self;
-                };
-                return exports;
-            },
-            { './constants/PrimeMeridian': 27 }
-        ],
-        38: [
-            function (_dereq_, module, exports) {
-                var projs = [
-                    _dereq_('./projections/merc'),
-                    _dereq_('./projections/longlat')
-                ];
-                var names = {};
-                var projStore = [];
-                function add(proj, i) {
-                    var len = projStore.length;
-                    if (!proj.names) {
-                        console.log(i);
-                        return true;
-                    }
-                    projStore[len] = proj;
-                    proj.names.forEach(function (n) {
-                        names[n.toLowerCase()] = len;
-                    });
-                    return this;
-                }
-                exports.add = add;
-                exports.get = function (name) {
-                    if (!name) {
-                        return false;
-                    }
-                    var n = name.toLowerCase();
-                    if (typeof names[n] !== 'undefined' && projStore[names[n]]) {
-                        return projStore[names[n]];
-                    }
-                };
-                exports.start = function () {
-                    projs.forEach(add);
-                };
-                return exports;
-            },
-            {
-                './projections/longlat': 50,
-                './projections/merc': 51
-            }
-        ],
-        39: [
-            function (_dereq_, module, exports) {
-                var EPSLN = 1e-10;
-                var msfnz = _dereq_('../common/msfnz');
-                var qsfnz = _dereq_('../common/qsfnz');
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var asinz = _dereq_('../common/asinz');
-                exports.init = function () {
-                    if (Math.abs(this.lat1 + this.lat2) < EPSLN) {
-                        return;
-                    }
-                    this.temp = this.b / this.a;
-                    this.es = 1 - Math.pow(this.temp, 2);
-                    this.e3 = Math.sqrt(this.es);
-                    this.sin_po = Math.sin(this.lat1);
-                    this.cos_po = Math.cos(this.lat1);
-                    this.t1 = this.sin_po;
-                    this.con = this.sin_po;
-                    this.ms1 = msfnz(this.e3, this.sin_po, this.cos_po);
-                    this.qs1 = qsfnz(this.e3, this.sin_po, this.cos_po);
-                    this.sin_po = Math.sin(this.lat2);
-                    this.cos_po = Math.cos(this.lat2);
-                    this.t2 = this.sin_po;
-                    this.ms2 = msfnz(this.e3, this.sin_po, this.cos_po);
-                    this.qs2 = qsfnz(this.e3, this.sin_po, this.cos_po);
-                    this.sin_po = Math.sin(this.lat0);
-                    this.cos_po = Math.cos(this.lat0);
-                    this.t3 = this.sin_po;
-                    this.qs0 = qsfnz(this.e3, this.sin_po, this.cos_po);
-                    if (Math.abs(this.lat1 - this.lat2) > EPSLN) {
-                        this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1);
-                    } else {
-                        this.ns0 = this.con;
-                    }
-                    this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1;
-                    this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0) / this.ns0;
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    this.sin_phi = Math.sin(lat);
-                    this.cos_phi = Math.cos(lat);
-                    var qs = qsfnz(this.e3, this.sin_phi, this.cos_phi);
-                    var rh1 = this.a * Math.sqrt(this.c - this.ns0 * qs) / this.ns0;
-                    var theta = this.ns0 * adjust_lon(lon - this.long0);
-                    var x = rh1 * Math.sin(theta) + this.x0;
-                    var y = this.rh - rh1 * Math.cos(theta) + this.y0;
-                    p.x = x;
-                    p.y = y;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var rh1, qs, con, theta, lon, lat;
-                    p.x -= this.x0;
-                    p.y = this.rh - p.y + this.y0;
-                    if (this.ns0 >= 0) {
-                        rh1 = Math.sqrt(p.x * p.x + p.y * p.y);
-                        con = 1;
-                    } else {
-                        rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);
-                        con = -1;
-                    }
-                    theta = 0;
-                    if (rh1 !== 0) {
-                        theta = Math.atan2(con * p.x, con * p.y);
-                    }
-                    con = rh1 * this.ns0 / this.a;
-                    if (this.sphere) {
-                        lat = Math.asin((this.c - con * con) / (2 * this.ns0));
-                    } else {
-                        qs = (this.c - con * con) / this.ns0;
-                        lat = this.phi1z(this.e3, qs);
-                    }
-                    lon = adjust_lon(theta / this.ns0 + this.long0);
-                    p.x = lon;
-                    p.y = lat;
-                    return p;
-                };
-                exports.phi1z = function (eccent, qs) {
-                    var sinphi, cosphi, con, com, dphi;
-                    var phi = asinz(0.5 * qs);
-                    if (eccent < EPSLN) {
-                        return phi;
-                    }
-                    var eccnts = eccent * eccent;
-                    for (var i = 1; i <= 25; i++) {
-                        sinphi = Math.sin(phi);
-                        cosphi = Math.cos(phi);
-                        con = eccent * sinphi;
-                        com = 1 - con * con;
-                        dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con)));
-                        phi = phi + dphi;
-                        if (Math.abs(dphi) <= 1e-7) {
-                            return phi;
-                        }
-                    }
-                    return null;
-                };
-                exports.names = [
-                    'Albers_Conic_Equal_Area',
-                    'Albers',
-                    'aea'
-                ];
-                return exports;
-            },
-            {
-                '../common/adjust_lon': 5,
-                '../common/asinz': 6,
-                '../common/msfnz': 15,
-                '../common/qsfnz': 20
-            }
-        ],
-        40: [
-            function (_dereq_, module, exports) {
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var HALF_PI = Math.PI / 2;
-                var EPSLN = 1e-10;
-                var mlfn = _dereq_('../common/mlfn');
-                var e0fn = _dereq_('../common/e0fn');
-                var e1fn = _dereq_('../common/e1fn');
-                var e2fn = _dereq_('../common/e2fn');
-                var e3fn = _dereq_('../common/e3fn');
-                var gN = _dereq_('../common/gN');
-                var asinz = _dereq_('../common/asinz');
-                var imlfn = _dereq_('../common/imlfn');
-                exports.init = function () {
-                    this.sin_p12 = Math.sin(this.lat0);
-                    this.cos_p12 = Math.cos(this.lat0);
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    var sinphi = Math.sin(p.y);
-                    var cosphi = Math.cos(p.y);
-                    var dlon = adjust_lon(lon - this.long0);
-                    var e0, e1, e2, e3, Mlp, Ml, tanphi, Nl1, Nl, psi, Az, G, H, GH, Hs, c, kp, cos_c, s, s2, s3, s4, s5;
-                    if (this.sphere) {
-                        if (Math.abs(this.sin_p12 - 1) <= EPSLN) {
-                            p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon);
-                            p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon);
-                            return p;
-                        } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {
-                            p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon);
-                            p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon);
-                            return p;
-                        } else {
-                            cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon);
-                            c = Math.acos(cos_c);
-                            kp = c / Math.sin(c);
-                            p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon);
-                            p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon));
-                            return p;
-                        }
-                    } else {
-                        e0 = e0fn(this.es);
-                        e1 = e1fn(this.es);
-                        e2 = e2fn(this.es);
-                        e3 = e3fn(this.es);
-                        if (Math.abs(this.sin_p12 - 1) <= EPSLN) {
-                            Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);
-                            Ml = this.a * mlfn(e0, e1, e2, e3, lat);
-                            p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon);
-                            p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon);
-                            return p;
-                        } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {
-                            Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);
-                            Ml = this.a * mlfn(e0, e1, e2, e3, lat);
-                            p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon);
-                            p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon);
-                            return p;
-                        } else {
-                            tanphi = sinphi / cosphi;
-                            Nl1 = gN(this.a, this.e, this.sin_p12);
-                            Nl = gN(this.a, this.e, sinphi);
-                            psi = Math.atan((1 - this.es) * tanphi + this.es * Nl1 * this.sin_p12 / (Nl * cosphi));
-                            Az = Math.atan2(Math.sin(dlon), this.cos_p12 * Math.tan(psi) - this.sin_p12 * Math.cos(dlon));
-                            if (Az === 0) {
-                                s = Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi));
-                            } else if (Math.abs(Math.abs(Az) - Math.PI) <= EPSLN) {
-                                s = -Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi));
-                            } else {
-                                s = Math.asin(Math.sin(dlon) * Math.cos(psi) / Math.sin(Az));
-                            }
-                            G = this.e * this.sin_p12 / Math.sqrt(1 - this.es);
-                            H = this.e * this.cos_p12 * Math.cos(Az) / Math.sqrt(1 - this.es);
-                            GH = G * H;
-                            Hs = H * H;
-                            s2 = s * s;
-                            s3 = s2 * s;
-                            s4 = s3 * s;
-                            s5 = s4 * s;
-                            c = Nl1 * s * (1 - s2 * Hs * (1 - Hs) / 6 + s3 / 8 * GH * (1 - 2 * Hs) + s4 / 120 * (Hs * (4 - 7 * Hs) - 3 * G * G * (1 - 7 * Hs)) - s5 / 48 * GH);
-                            p.x = this.x0 + c * Math.sin(Az);
-                            p.y = this.y0 + c * Math.cos(Az);
-                            return p;
-                        }
-                    }
-                };
-                exports.inverse = function (p) {
-                    p.x -= this.x0;
-                    p.y -= this.y0;
-                    var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, N1, psi, Az, cosAz, tmp, A, B, D, Ee, F;
-                    if (this.sphere) {
-                        rh = Math.sqrt(p.x * p.x + p.y * p.y);
-                        if (rh > 2 * HALF_PI * this.a) {
-                            return;
-                        }
-                        z = rh / this.a;
-                        sinz = Math.sin(z);
-                        cosz = Math.cos(z);
-                        lon = this.long0;
-                        if (Math.abs(rh) <= EPSLN) {
-                            lat = this.lat0;
-                        } else {
-                            lat = asinz(cosz * this.sin_p12 + p.y * sinz * this.cos_p12 / rh);
-                            con = Math.abs(this.lat0) - HALF_PI;
-                            if (Math.abs(con) <= EPSLN) {
-                                if (this.lat0 >= 0) {
-                                    lon = adjust_lon(this.long0 + Math.atan2(p.x, -p.y));
-                                } else {
-                                    lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y));
-                                }
-                            } else {
-                                lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz));
-                            }
-                        }
-                        p.x = lon;
-                        p.y = lat;
-                        return p;
-                    } else {
-                        e0 = e0fn(this.es);
-                        e1 = e1fn(this.es);
-                        e2 = e2fn(this.es);
-                        e3 = e3fn(this.es);
-                        if (Math.abs(this.sin_p12 - 1) <= EPSLN) {
-                            Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);
-                            rh = Math.sqrt(p.x * p.x + p.y * p.y);
-                            M = Mlp - rh;
-                            lat = imlfn(M / this.a, e0, e1, e2, e3);
-                            lon = adjust_lon(this.long0 + Math.atan2(p.x, -1 * p.y));
-                            p.x = lon;
-                            p.y = lat;
-                            return p;
-                        } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {
-                            Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);
-                            rh = Math.sqrt(p.x * p.x + p.y * p.y);
-                            M = rh - Mlp;
-                            lat = imlfn(M / this.a, e0, e1, e2, e3);
-                            lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y));
-                            p.x = lon;
-                            p.y = lat;
-                            return p;
-                        } else {
-                            rh = Math.sqrt(p.x * p.x + p.y * p.y);
-                            Az = Math.atan2(p.x, p.y);
-                            N1 = gN(this.a, this.e, this.sin_p12);
-                            cosAz = Math.cos(Az);
-                            tmp = this.e * this.cos_p12 * cosAz;
-                            A = -tmp * tmp / (1 - this.es);
-                            B = 3 * this.es * (1 - A) * this.sin_p12 * this.cos_p12 * cosAz / (1 - this.es);
-                            D = rh / N1;
-                            Ee = D - A * (1 + A) * Math.pow(D, 3) / 6 - B * (1 + 3 * A) * Math.pow(D, 4) / 24;
-                            F = 1 - A * Ee * Ee / 2 - D * Ee * Ee * Ee / 6;
-                            psi = Math.asin(this.sin_p12 * Math.cos(Ee) + this.cos_p12 * Math.sin(Ee) * cosAz);
-                            lon = adjust_lon(this.long0 + Math.asin(Math.sin(Az) * Math.sin(Ee) / Math.cos(psi)));
-                            lat = Math.atan((1 - this.es * F * this.sin_p12 / Math.sin(psi)) * Math.tan(psi) / (1 - this.es));
-                            p.x = lon;
-                            p.y = lat;
-                            return p;
-                        }
-                    }
-                };
-                exports.names = [
-                    'Azimuthal_Equidistant',
-                    'aeqd'
-                ];
-                return exports;
-            },
-            {
-                '../common/adjust_lon': 5,
-                '../common/asinz': 6,
-                '../common/e0fn': 7,
-                '../common/e1fn': 8,
-                '../common/e2fn': 9,
-                '../common/e3fn': 10,
-                '../common/gN': 11,
-                '../common/imlfn': 12,
-                '../common/mlfn': 14
-            }
-        ],
-        41: [
-            function (_dereq_, module, exports) {
-                var mlfn = _dereq_('../common/mlfn');
-                var e0fn = _dereq_('../common/e0fn');
-                var e1fn = _dereq_('../common/e1fn');
-                var e2fn = _dereq_('../common/e2fn');
-                var e3fn = _dereq_('../common/e3fn');
-                var gN = _dereq_('../common/gN');
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var adjust_lat = _dereq_('../common/adjust_lat');
-                var imlfn = _dereq_('../common/imlfn');
-                var HALF_PI = Math.PI / 2;
-                var EPSLN = 1e-10;
-                exports.init = function () {
-                    if (!this.sphere) {
-                        this.e0 = e0fn(this.es);
-                        this.e1 = e1fn(this.es);
-                        this.e2 = e2fn(this.es);
-                        this.e3 = e3fn(this.es);
-                        this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);
-                    }
-                };
-                exports.forward = function (p) {
-                    var x, y;
-                    var lam = p.x;
-                    var phi = p.y;
-                    lam = adjust_lon(lam - this.long0);
-                    if (this.sphere) {
-                        x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam));
-                        y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0);
-                    } else {
-                        var sinphi = Math.sin(phi);
-                        var cosphi = Math.cos(phi);
-                        var nl = gN(this.a, this.e, sinphi);
-                        var tl = Math.tan(phi) * Math.tan(phi);
-                        var al = lam * Math.cos(phi);
-                        var asq = al * al;
-                        var cl = this.es * cosphi * cosphi / (1 - this.es);
-                        var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);
-                        x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120));
-                        y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24);
-                    }
-                    p.x = x + this.x0;
-                    p.y = y + this.y0;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    p.x -= this.x0;
-                    p.y -= this.y0;
-                    var x = p.x / this.a;
-                    var y = p.y / this.a;
-                    var phi, lam;
-                    if (this.sphere) {
-                        var dd = y + this.lat0;
-                        phi = Math.asin(Math.sin(dd) * Math.cos(x));
-                        lam = Math.atan2(Math.tan(x), Math.cos(dd));
-                    } else {
-                        var ml1 = this.ml0 / this.a + y;
-                        var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3);
-                        if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) {
-                            p.x = this.long0;
-                            p.y = HALF_PI;
-                            if (y < 0) {
-                                p.y *= -1;
-                            }
-                            return p;
-                        }
-                        var nl1 = gN(this.a, this.e, Math.sin(phi1));
-                        var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es);
-                        var tl1 = Math.pow(Math.tan(phi1), 2);
-                        var dl = x * this.a / nl1;
-                        var dsq = dl * dl;
-                        phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24);
-                        lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1);
-                    }
-                    p.x = adjust_lon(lam + this.long0);
-                    p.y = adjust_lat(phi);
-                    return p;
-                };
-                exports.names = [
-                    'Cassini',
-                    'Cassini_Soldner',
-                    'cass'
-                ];
-                return exports;
-            },
-            {
-                '../common/adjust_lat': 4,
-                '../common/adjust_lon': 5,
-                '../common/e0fn': 7,
-                '../common/e1fn': 8,
-                '../common/e2fn': 9,
-                '../common/e3fn': 10,
-                '../common/gN': 11,
-                '../common/imlfn': 12,
-                '../common/mlfn': 14
-            }
-        ],
-        42: [
-            function (_dereq_, module, exports) {
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var qsfnz = _dereq_('../common/qsfnz');
-                var msfnz = _dereq_('../common/msfnz');
-                var iqsfnz = _dereq_('../common/iqsfnz');
-                exports.init = function () {
-                    if (!this.sphere) {
-                        this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));
-                    }
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    var x, y;
-                    var dlon = adjust_lon(lon - this.long0);
-                    if (this.sphere) {
-                        x = this.x0 + this.a * dlon * Math.cos(this.lat_ts);
-                        y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts);
-                    } else {
-                        var qs = qsfnz(this.e, Math.sin(lat));
-                        x = this.x0 + this.a * this.k0 * dlon;
-                        y = this.y0 + this.a * qs * 0.5 / this.k0;
-                    }
-                    p.x = x;
-                    p.y = y;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    p.x -= this.x0;
-                    p.y -= this.y0;
-                    var lon, lat;
-                    if (this.sphere) {
-                        lon = adjust_lon(this.long0 + p.x / this.a / Math.cos(this.lat_ts));
-                        lat = Math.asin(p.y / this.a * Math.cos(this.lat_ts));
-                    } else {
-                        lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a);
-                        lon = adjust_lon(this.long0 + p.x / (this.a * this.k0));
-                    }
-                    p.x = lon;
-                    p.y = lat;
-                    return p;
-                };
-                exports.names = ['cea'];
-                return exports;
-            },
-            {
-                '../common/adjust_lon': 5,
-                '../common/iqsfnz': 13,
-                '../common/msfnz': 15,
-                '../common/qsfnz': 20
-            }
-        ],
-        43: [
-            function (_dereq_, module, exports) {
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var adjust_lat = _dereq_('../common/adjust_lat');
-                exports.init = function () {
-                    this.x0 = this.x0 || 0;
-                    this.y0 = this.y0 || 0;
-                    this.lat0 = this.lat0 || 0;
-                    this.long0 = this.long0 || 0;
-                    this.lat_ts = this.lat_ts || 0;
-                    this.title = this.title || 'Equidistant Cylindrical (Plate Carre)';
-                    this.rc = Math.cos(this.lat_ts);
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    var dlon = adjust_lon(lon - this.long0);
-                    var dlat = adjust_lat(lat - this.lat0);
-                    p.x = this.x0 + this.a * dlon * this.rc;
-                    p.y = this.y0 + this.a * dlat;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var x = p.x;
-                    var y = p.y;
-                    p.x = adjust_lon(this.long0 + (x - this.x0) / (this.a * this.rc));
-                    p.y = adjust_lat(this.lat0 + (y - this.y0) / this.a);
-                    return p;
-                };
-                exports.names = [
-                    'Equirectangular',
-                    'Equidistant_Cylindrical',
-                    'eqc'
-                ];
-                return exports;
-            },
-            {
-                '../common/adjust_lat': 4,
-                '../common/adjust_lon': 5
-            }
-        ],
-        44: [
-            function (_dereq_, module, exports) {
-                var e0fn = _dereq_('../common/e0fn');
-                var e1fn = _dereq_('../common/e1fn');
-                var e2fn = _dereq_('../common/e2fn');
-                var e3fn = _dereq_('../common/e3fn');
-                var msfnz = _dereq_('../common/msfnz');
-                var mlfn = _dereq_('../common/mlfn');
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var adjust_lat = _dereq_('../common/adjust_lat');
-                var imlfn = _dereq_('../common/imlfn');
-                var EPSLN = 1e-10;
-                exports.init = function () {
-                    if (Math.abs(this.lat1 + this.lat2) < EPSLN) {
-                        return;
-                    }
-                    this.lat2 = this.lat2 || this.lat1;
-                    this.temp = this.b / this.a;
-                    this.es = 1 - Math.pow(this.temp, 2);
-                    this.e = Math.sqrt(this.es);
-                    this.e0 = e0fn(this.es);
-                    this.e1 = e1fn(this.es);
-                    this.e2 = e2fn(this.es);
-                    this.e3 = e3fn(this.es);
-                    this.sinphi = Math.sin(this.lat1);
-                    this.cosphi = Math.cos(this.lat1);
-                    this.ms1 = msfnz(this.e, this.sinphi, this.cosphi);
-                    this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1);
-                    if (Math.abs(this.lat1 - this.lat2) < EPSLN) {
-                        this.ns = this.sinphi;
-                    } else {
-                        this.sinphi = Math.sin(this.lat2);
-                        this.cosphi = Math.cos(this.lat2);
-                        this.ms2 = msfnz(this.e, this.sinphi, this.cosphi);
-                        this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2);
-                        this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1);
-                    }
-                    this.g = this.ml1 + this.ms1 / this.ns;
-                    this.ml0 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);
-                    this.rh = this.a * (this.g - this.ml0);
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    var rh1;
-                    if (this.sphere) {
-                        rh1 = this.a * (this.g - lat);
-                    } else {
-                        var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat);
-                        rh1 = this.a * (this.g - ml);
-                    }
-                    var theta = this.ns * adjust_lon(lon - this.long0);
-                    var x = this.x0 + rh1 * Math.sin(theta);
-                    var y = this.y0 + this.rh - rh1 * Math.cos(theta);
-                    p.x = x;
-                    p.y = y;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    p.x -= this.x0;
-                    p.y = this.rh - p.y + this.y0;
-                    var con, rh1, lat, lon;
-                    if (this.ns >= 0) {
-                        rh1 = Math.sqrt(p.x * p.x + p.y * p.y);
-                        con = 1;
-                    } else {
-                        rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);
-                        con = -1;
-                    }
-                    var theta = 0;
-                    if (rh1 !== 0) {
-                        theta = Math.atan2(con * p.x, con * p.y);
-                    }
-                    if (this.sphere) {
-                        lon = adjust_lon(this.long0 + theta / this.ns);
-                        lat = adjust_lat(this.g - rh1 / this.a);
-                        p.x = lon;
-                        p.y = lat;
-                        return p;
-                    } else {
-                        var ml = this.g - rh1 / this.a;
-                        lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3);
-                        lon = adjust_lon(this.long0 + theta / this.ns);
-                        p.x = lon;
-                        p.y = lat;
-                        return p;
-                    }
-                };
-                exports.names = [
-                    'Equidistant_Conic',
-                    'eqdc'
-                ];
-                return exports;
-            },
-            {
-                '../common/adjust_lat': 4,
-                '../common/adjust_lon': 5,
-                '../common/e0fn': 7,
-                '../common/e1fn': 8,
-                '../common/e2fn': 9,
-                '../common/e3fn': 10,
-                '../common/imlfn': 12,
-                '../common/mlfn': 14,
-                '../common/msfnz': 15
-            }
-        ],
-        45: [
-            function (_dereq_, module, exports) {
-                var FORTPI = Math.PI / 4;
-                var srat = _dereq_('../common/srat');
-                var HALF_PI = Math.PI / 2;
-                var MAX_ITER = 20;
-                exports.init = function () {
-                    var sphi = Math.sin(this.lat0);
-                    var cphi = Math.cos(this.lat0);
-                    cphi *= cphi;
-                    this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi);
-                    this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es));
-                    this.phic0 = Math.asin(sphi / this.C);
-                    this.ratexp = 0.5 * this.C * this.e;
-                    this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp));
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI;
-                    p.x = this.C * lon;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var DEL_TOL = 1e-14;
-                    var lon = p.x / this.C;
-                    var lat = p.y;
-                    var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C);
-                    for (var i = MAX_ITER; i > 0; --i) {
-                        lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), -0.5 * this.e)) - HALF_PI;
-                        if (Math.abs(lat - p.y) < DEL_TOL) {
-                            break;
-                        }
-                        p.y = lat;
-                    }
-                    if (!i) {
-                        return null;
-                    }
-                    p.x = lon;
-                    p.y = lat;
-                    return p;
-                };
-                exports.names = ['gauss'];
-                return exports;
-            },
-            { '../common/srat': 22 }
-        ],
-        46: [
-            function (_dereq_, module, exports) {
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var EPSLN = 1e-10;
-                var asinz = _dereq_('../common/asinz');
-                exports.init = function () {
-                    this.sin_p14 = Math.sin(this.lat0);
-                    this.cos_p14 = Math.cos(this.lat0);
-                    this.infinity_dist = 1000 * this.a;
-                    this.rc = 1;
-                };
-                exports.forward = function (p) {
-                    var sinphi, cosphi;
-                    var dlon;
-                    var coslon;
-                    var ksp;
-                    var g;
-                    var x, y;
-                    var lon = p.x;
-                    var lat = p.y;
-                    dlon = adjust_lon(lon - this.long0);
-                    sinphi = Math.sin(lat);
-                    cosphi = Math.cos(lat);
-                    coslon = Math.cos(dlon);
-                    g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;
-                    ksp = 1;
-                    if (g > 0 || Math.abs(g) <= EPSLN) {
-                        x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g;
-                        y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g;
-                    } else {
-                        x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon);
-                        y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);
-                    }
-                    p.x = x;
-                    p.y = y;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var rh;
-                    var sinc, cosc;
-                    var c;
-                    var lon, lat;
-                    p.x = (p.x - this.x0) / this.a;
-                    p.y = (p.y - this.y0) / this.a;
-                    p.x /= this.k0;
-                    p.y /= this.k0;
-                    if (rh = Math.sqrt(p.x * p.x + p.y * p.y)) {
-                        c = Math.atan2(rh, this.rc);
-                        sinc = Math.sin(c);
-                        cosc = Math.cos(c);
-                        lat = asinz(cosc * this.sin_p14 + p.y * sinc * this.cos_p14 / rh);
-                        lon = Math.atan2(p.x * sinc, rh * this.cos_p14 * cosc - p.y * this.sin_p14 * sinc);
-                        lon = adjust_lon(this.long0 + lon);
-                    } else {
-                        lat = this.phic0;
-                        lon = 0;
-                    }
-                    p.x = lon;
-                    p.y = lat;
-                    return p;
-                };
-                exports.names = ['gnom'];
-                return exports;
-            },
-            {
-                '../common/adjust_lon': 5,
-                '../common/asinz': 6
-            }
-        ],
-        47: [
-            function (_dereq_, module, exports) {
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                exports.init = function () {
-                    this.a = 6377397.155;
-                    this.es = 0.006674372230614;
-                    this.e = Math.sqrt(this.es);
-                    if (!this.lat0) {
-                        this.lat0 = 0.863937979737193;
-                    }
-                    if (!this.long0) {
-                        this.long0 = 0.7417649320975901 - 0.308341501185665;
-                    }
-                    if (!this.k0) {
-                        this.k0 = 0.9999;
-                    }
-                    this.s45 = 0.785398163397448;
-                    this.s90 = 2 * this.s45;
-                    this.fi0 = this.lat0;
-                    this.e2 = this.es;
-                    this.e = Math.sqrt(this.e2);
-                    this.alfa = Math.sqrt(1 + this.e2 * Math.pow(Math.cos(this.fi0), 4) / (1 - this.e2));
-                    this.uq = 1.04216856380474;
-                    this.u0 = Math.asin(Math.sin(this.fi0) / this.alfa);
-                    this.g = Math.pow((1 + this.e * Math.sin(this.fi0)) / (1 - this.e * Math.sin(this.fi0)), this.alfa * this.e / 2);
-                    this.k = Math.tan(this.u0 / 2 + this.s45) / Math.pow(Math.tan(this.fi0 / 2 + this.s45), this.alfa) * this.g;
-                    this.k1 = this.k0;
-                    this.n0 = this.a * Math.sqrt(1 - this.e2) / (1 - this.e2 * Math.pow(Math.sin(this.fi0), 2));
-                    this.s0 = 1.37008346281555;
-                    this.n = Math.sin(this.s0);
-                    this.ro0 = this.k1 * this.n0 / Math.tan(this.s0);
-                    this.ad = this.s90 - this.uq;
-                };
-                exports.forward = function (p) {
-                    var gfi, u, deltav, s, d, eps, ro;
-                    var lon = p.x;
-                    var lat = p.y;
-                    var delta_lon = adjust_lon(lon - this.long0);
-                    gfi = Math.pow((1 + this.e * Math.sin(lat)) / (1 - this.e * Math.sin(lat)), this.alfa * this.e / 2);
-                    u = 2 * (Math.atan(this.k * Math.pow(Math.tan(lat / 2 + this.s45), this.alfa) / gfi) - this.s45);
-                    deltav = -delta_lon * this.alfa;
-                    s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav));
-                    d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s));
-                    eps = this.n * d;
-                    ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(s / 2 + this.s45), this.n);
-                    p.y = ro * Math.cos(eps) / 1;
-                    p.x = ro * Math.sin(eps) / 1;
-                    if (!this.czech) {
-                        p.y *= -1;
-                        p.x *= -1;
-                    }
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var u, deltav, s, d, eps, ro, fi1;
-                    var ok;
-                    var tmp = p.x;
-                    p.x = p.y;
-                    p.y = tmp;
-                    if (!this.czech) {
-                        p.y *= -1;
-                        p.x *= -1;
-                    }
-                    ro = Math.sqrt(p.x * p.x + p.y * p.y);
-                    eps = Math.atan2(p.y, p.x);
-                    d = eps / Math.sin(this.s0);
-                    s = 2 * (Math.atan(Math.pow(this.ro0 / ro, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45);
-                    u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d));
-                    deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u));
-                    p.x = this.long0 - deltav / this.alfa;
-                    fi1 = u;
-                    ok = 0;
-                    var iter = 0;
-                    do {
-                        p.y = 2 * (Math.atan(Math.pow(this.k, -1 / this.alfa) * Math.pow(Math.tan(u / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(fi1)) / (1 - this.e * Math.sin(fi1)), this.e / 2)) - this.s45);
-                        if (Math.abs(fi1 - p.y) < 1e-10) {
-                            ok = 1;
-                        }
-                        fi1 = p.y;
-                        iter += 1;
-                    } while (ok === 0 && iter < 15);
-                    if (iter >= 15) {
-                        return null;
-                    }
-                    return p;
-                };
-                exports.names = [
-                    'Krovak',
-                    'krovak'
-                ];
-                return exports;
-            },
-            { '../common/adjust_lon': 5 }
-        ],
-        48: [
-            function (_dereq_, module, exports) {
-                var HALF_PI = Math.PI / 2;
-                var FORTPI = Math.PI / 4;
-                var EPSLN = 1e-10;
-                var qsfnz = _dereq_('../common/qsfnz');
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                exports.S_POLE = 1;
-                exports.N_POLE = 2;
-                exports.EQUIT = 3;
-                exports.OBLIQ = 4;
-                exports.init = function () {
-                    var t = Math.abs(this.lat0);
-                    if (Math.abs(t - HALF_PI) < EPSLN) {
-                        this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE;
-                    } else if (Math.abs(t) < EPSLN) {
-                        this.mode = this.EQUIT;
-                    } else {
-                        this.mode = this.OBLIQ;
-                    }
-                    if (this.es > 0) {
-                        var sinphi;
-                        this.qp = qsfnz(this.e, 1);
-                        this.mmf = 0.5 / (1 - this.es);
-                        this.apa = this.authset(this.es);
-                        switch (this.mode) {
-                        case this.N_POLE:
-                            this.dd = 1;
-                            break;
-                        case this.S_POLE:
-                            this.dd = 1;
-                            break;
-                        case this.EQUIT:
-                            this.rq = Math.sqrt(0.5 * this.qp);
-                            this.dd = 1 / this.rq;
-                            this.xmf = 1;
-                            this.ymf = 0.5 * this.qp;
-                            break;
-                        case this.OBLIQ:
-                            this.rq = Math.sqrt(0.5 * this.qp);
-                            sinphi = Math.sin(this.lat0);
-                            this.sinb1 = qsfnz(this.e, sinphi) / this.qp;
-                            this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1);
-                            this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * sinphi * sinphi) * this.rq * this.cosb1);
-                            this.ymf = (this.xmf = this.rq) / this.dd;
-                            this.xmf *= this.dd;
-                            break;
-                        }
-                    } else {
-                        if (this.mode === this.OBLIQ) {
-                            this.sinph0 = Math.sin(this.lat0);
-                            this.cosph0 = Math.cos(this.lat0);
-                        }
-                    }
-                };
-                exports.forward = function (p) {
-                    var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi;
-                    var lam = p.x;
-                    var phi = p.y;
-                    lam = adjust_lon(lam - this.long0);
-                    if (this.sphere) {
-                        sinphi = Math.sin(phi);
-                        cosphi = Math.cos(phi);
-                        coslam = Math.cos(lam);
-                        if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {
-                            y = this.mode === this.EQUIT ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam;
-                            if (y <= EPSLN) {
-                                return null;
-                            }
-                            y = Math.sqrt(2 / y);
-                            x = y * cosphi * Math.sin(lam);
-                            y *= this.mode === this.EQUIT ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam;
-                        } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {
-                            if (this.mode === this.N_POLE) {
-                                coslam = -coslam;
-                            }
-                            if (Math.abs(phi + this.phi0) < EPSLN) {
-                                return null;
-                            }
-                            y = FORTPI - phi * 0.5;
-                            y = 2 * (this.mode === this.S_POLE ? Math.cos(y) : Math.sin(y));
-                            x = y * Math.sin(lam);
-                            y *= coslam;
-                        }
-                    } else {
-                        sinb = 0;
-                        cosb = 0;
-                        b = 0;
-                        coslam = Math.cos(lam);
-                        sinlam = Math.sin(lam);
-                        sinphi = Math.sin(phi);
-                        q = qsfnz(this.e, sinphi);
-                        if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {
-                            sinb = q / this.qp;
-                            cosb = Math.sqrt(1 - sinb * sinb);
-                        }
-                        switch (this.mode) {
-                        case this.OBLIQ:
-                            b = 1 + this.sinb1 * sinb + this.cosb1 * cosb * coslam;
-                            break;
-                        case this.EQUIT:
-                            b = 1 + cosb * coslam;
-                            break;
-                        case this.N_POLE:
-                            b = HALF_PI + phi;
-                            q = this.qp - q;
-                            break;
-                        case this.S_POLE:
-                            b = phi - HALF_PI;
-                            q = this.qp + q;
-                            break;
-                        }
-                        if (Math.abs(b) < EPSLN) {
-                            return null;
-                        }
-                        switch (this.mode) {
-                        case this.OBLIQ:
-                        case this.EQUIT:
-                            b = Math.sqrt(2 / b);
-                            if (this.mode === this.OBLIQ) {
-                                y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam);
-                            } else {
-                                y = (b = Math.sqrt(2 / (1 + cosb * coslam))) * sinb * this.ymf;
-                            }
-                            x = this.xmf * b * cosb * sinlam;
-                            break;
-                        case this.N_POLE:
-                        case this.S_POLE:
-                            if (q >= 0) {
-                                x = (b = Math.sqrt(q)) * sinlam;
-                                y = coslam * (this.mode === this.S_POLE ? b : -b);
-                            } else {
-                                x = y = 0;
-                            }
-                            break;
-                        }
-                    }
-                    p.x = this.a * x + this.x0;
-                    p.y = this.a * y + this.y0;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    p.x -= this.x0;
-                    p.y -= this.y0;
-                    var x = p.x / this.a;
-                    var y = p.y / this.a;
-                    var lam, phi, cCe, sCe, q, rho, ab;
-                    if (this.sphere) {
-                        var cosz = 0, rh, sinz = 0;
-                        rh = Math.sqrt(x * x + y * y);
-                        phi = rh * 0.5;
-                        if (phi > 1) {
-                            return null;
-                        }
-                        phi = 2 * Math.asin(phi);
-                        if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {
-                            sinz = Math.sin(phi);
-                            cosz = Math.cos(phi);
-                        }
-                        switch (this.mode) {
-                        case this.EQUIT:
-                            phi = Math.abs(rh) <= EPSLN ? 0 : Math.asin(y * sinz / rh);
-                            x *= sinz;
-                            y = cosz * rh;
-                            break;
-                        case this.OBLIQ:
-                            phi = Math.abs(rh) <= EPSLN ? this.phi0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh);
-                            x *= sinz * this.cosph0;
-                            y = (cosz - Math.sin(phi) * this.sinph0) * rh;
-                            break;
-                        case this.N_POLE:
-                            y = -y;
-                            phi = HALF_PI - phi;
-                            break;
-                        case this.S_POLE:
-                            phi -= HALF_PI;
-                            break;
-                        }
-                        lam = y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ) ? 0 : Math.atan2(x, y);
-                    } else {
-                        ab = 0;
-                        if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {
-                            x /= this.dd;
-                            y *= this.dd;
-                            rho = Math.sqrt(x * x + y * y);
-                            if (rho < EPSLN) {
-                                p.x = 0;
-                                p.y = this.phi0;
-                                return p;
-                            }
-                            sCe = 2 * Math.asin(0.5 * rho / this.rq);
-                            cCe = Math.cos(sCe);
-                            x *= sCe = Math.sin(sCe);
-                            if (this.mode === this.OBLIQ) {
-                                ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho;
-                                q = this.qp * ab;
-                                y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe;
-                            } else {
-                                ab = y * sCe / rho;
-                                q = this.qp * ab;
-                                y = rho * cCe;
-                            }
-                        } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {
-                            if (this.mode === this.N_POLE) {
-                                y = -y;
-                            }
-                            q = x * x + y * y;
-                            if (!q) {
-                                p.x = 0;
-                                p.y = this.phi0;
-                                return p;
-                            }
-                            ab = 1 - q / this.qp;
-                            if (this.mode === this.S_POLE) {
-                                ab = -ab;
-                            }
-                        }
-                        lam = Math.atan2(x, y);
-                        phi = this.authlat(Math.asin(ab), this.apa);
-                    }
-                    p.x = adjust_lon(this.long0 + lam);
-                    p.y = phi;
-                    return p;
-                };
-                exports.P00 = 0.3333333333333333;
-                exports.P01 = 0.17222222222222222;
-                exports.P02 = 0.10257936507936508;
-                exports.P10 = 0.06388888888888888;
-                exports.P11 = 0.0664021164021164;
-                exports.P20 = 0.016415012942191543;
-                exports.authset = function (es) {
-                    var t;
-                    var APA = [];
-                    APA[0] = es * this.P00;
-                    t = es * es;
-                    APA[0] += t * this.P01;
-                    APA[1] = t * this.P10;
-                    t *= es;
-                    APA[0] += t * this.P02;
-                    APA[1] += t * this.P11;
-                    APA[2] = t * this.P20;
-                    return APA;
-                };
-                exports.authlat = function (beta, APA) {
-                    var t = beta + beta;
-                    return beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t);
-                };
-                exports.names = [
-                    'Lambert Azimuthal Equal Area',
-                    'Lambert_Azimuthal_Equal_Area',
-                    'laea'
-                ];
-                return exports;
-            },
-            {
-                '../common/adjust_lon': 5,
-                '../common/qsfnz': 20
-            }
-        ],
-        49: [
-            function (_dereq_, module, exports) {
-                var EPSLN = 1e-10;
-                var msfnz = _dereq_('../common/msfnz');
-                var tsfnz = _dereq_('../common/tsfnz');
-                var HALF_PI = Math.PI / 2;
-                var sign = _dereq_('../common/sign');
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var phi2z = _dereq_('../common/phi2z');
-                exports.init = function () {
-                    if (!this.lat2) {
-                        this.lat2 = this.lat1;
-                    }
-                    if (!this.k0) {
-                        this.k0 = 1;
-                    }
-                    this.x0 = this.x0 || 0;
-                    this.y0 = this.y0 || 0;
-                    if (Math.abs(this.lat1 + this.lat2) < EPSLN) {
-                        return;
-                    }
-                    var temp = this.b / this.a;
-                    this.e = Math.sqrt(1 - temp * temp);
-                    var sin1 = Math.sin(this.lat1);
-                    var cos1 = Math.cos(this.lat1);
-                    var ms1 = msfnz(this.e, sin1, cos1);
-                    var ts1 = tsfnz(this.e, this.lat1, sin1);
-                    var sin2 = Math.sin(this.lat2);
-                    var cos2 = Math.cos(this.lat2);
-                    var ms2 = msfnz(this.e, sin2, cos2);
-                    var ts2 = tsfnz(this.e, this.lat2, sin2);
-                    var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0));
-                    if (Math.abs(this.lat1 - this.lat2) > EPSLN) {
-                        this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2);
-                    } else {
-                        this.ns = sin1;
-                    }
-                    if (isNaN(this.ns)) {
-                        this.ns = sin1;
-                    }
-                    this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns));
-                    this.rh = this.a * this.f0 * Math.pow(ts0, this.ns);
-                    if (!this.title) {
-                        this.title = 'Lambert Conformal Conic';
-                    }
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) {
-                        lat = sign(lat) * (HALF_PI - 2 * EPSLN);
-                    }
-                    var con = Math.abs(Math.abs(lat) - HALF_PI);
-                    var ts, rh1;
-                    if (con > EPSLN) {
-                        ts = tsfnz(this.e, lat, Math.sin(lat));
-                        rh1 = this.a * this.f0 * Math.pow(ts, this.ns);
-                    } else {
-                        con = lat * this.ns;
-                        if (con <= 0) {
-                            return null;
-                        }
-                        rh1 = 0;
-                    }
-                    var theta = this.ns * adjust_lon(lon - this.long0);
-                    p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0;
-                    p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var rh1, con, ts;
-                    var lat, lon;
-                    var x = (p.x - this.x0) / this.k0;
-                    var y = this.rh - (p.y - this.y0) / this.k0;
-                    if (this.ns > 0) {
-                        rh1 = Math.sqrt(x * x + y * y);
-                        con = 1;
-                    } else {
-                        rh1 = -Math.sqrt(x * x + y * y);
-                        con = -1;
-                    }
-                    var theta = 0;
-                    if (rh1 !== 0) {
-                        theta = Math.atan2(con * x, con * y);
-                    }
-                    if (rh1 !== 0 || this.ns > 0) {
-                        con = 1 / this.ns;
-                        ts = Math.pow(rh1 / (this.a * this.f0), con);
-                        lat = phi2z(this.e, ts);
-                        if (lat === -9999) {
-                            return null;
-                        }
-                    } else {
-                        lat = -HALF_PI;
-                    }
-                    lon = adjust_lon(theta / this.ns + this.long0);
-                    p.x = lon;
-                    p.y = lat;
-                    return p;
-                };
-                exports.names = [
-                    'Lambert Tangential Conformal Conic Projection',
-                    'Lambert_Conformal_Conic',
-                    'Lambert_Conformal_Conic_2SP',
-                    'lcc'
-                ];
-                return exports;
-            },
-            {
-                '../common/adjust_lon': 5,
-                '../common/msfnz': 15,
-                '../common/phi2z': 16,
-                '../common/sign': 21,
-                '../common/tsfnz': 24
-            }
-        ],
-        50: [
-            function (_dereq_, module, exports) {
-                exports.init = function () {
-                };
-                function identity(pt) {
-                    return pt;
-                }
-                exports.forward = identity;
-                exports.inverse = identity;
-                exports.names = [
-                    'longlat',
-                    'identity'
-                ];
-                return exports;
-            },
-            {}
-        ],
-        51: [
-            function (_dereq_, module, exports) {
-                var msfnz = _dereq_('../common/msfnz');
-                var HALF_PI = Math.PI / 2;
-                var EPSLN = 1e-10;
-                var R2D = 57.29577951308232;
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var FORTPI = Math.PI / 4;
-                var tsfnz = _dereq_('../common/tsfnz');
-                var phi2z = _dereq_('../common/phi2z');
-                exports.init = function () {
-                    var con = this.b / this.a;
-                    this.es = 1 - con * con;
-                    if (!('x0' in this)) {
-                        this.x0 = 0;
-                    }
-                    if (!('y0' in this)) {
-                        this.y0 = 0;
-                    }
-                    this.e = Math.sqrt(this.es);
-                    if (this.lat_ts) {
-                        if (this.sphere) {
-                            this.k0 = Math.cos(this.lat_ts);
-                        } else {
-                            this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));
-                        }
-                    } else {
-                        if (!this.k0) {
-                            if (this.k) {
-                                this.k0 = this.k;
-                            } else {
-                                this.k0 = 1;
-                            }
-                        }
-                    }
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) {
-                        return null;
-                    }
-                    var x, y;
-                    if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {
-                        return null;
-                    } else {
-                        if (this.sphere) {
-                            x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0);
-                            y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat));
-                        } else {
-                            var sinphi = Math.sin(lat);
-                            var ts = tsfnz(this.e, lat, sinphi);
-                            x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0);
-                            y = this.y0 - this.a * this.k0 * Math.log(ts);
-                        }
-                        p.x = x;
-                        p.y = y;
-                        return p;
-                    }
-                };
-                exports.inverse = function (p) {
-                    var x = p.x - this.x0;
-                    var y = p.y - this.y0;
-                    var lon, lat;
-                    if (this.sphere) {
-                        lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0)));
-                    } else {
-                        var ts = Math.exp(-y / (this.a * this.k0));
-                        lat = phi2z(this.e, ts);
-                        if (lat === -9999) {
-                            return null;
-                        }
-                    }
-                    lon = adjust_lon(this.long0 + x / (this.a * this.k0));
-                    p.x = lon;
-                    p.y = lat;
-                    return p;
-                };
-                exports.names = [
-                    'Mercator',
-                    'Popular Visualisation Pseudo Mercator',
-                    'Mercator_1SP',
-                    'Mercator_Auxiliary_Sphere',
-                    'merc'
-                ];
-                return exports;
-            },
-            {
-                '../common/adjust_lon': 5,
-                '../common/msfnz': 15,
-                '../common/phi2z': 16,
-                '../common/tsfnz': 24
-            }
-        ],
-        52: [
-            function (_dereq_, module, exports) {
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                exports.init = function () {
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    var dlon = adjust_lon(lon - this.long0);
-                    var x = this.x0 + this.a * dlon;
-                    var y = this.y0 + this.a * Math.log(Math.tan(Math.PI / 4 + lat / 2.5)) * 1.25;
-                    p.x = x;
-                    p.y = y;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    p.x -= this.x0;
-                    p.y -= this.y0;
-                    var lon = adjust_lon(this.long0 + p.x / this.a);
-                    var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4);
-                    p.x = lon;
-                    p.y = lat;
-                    return p;
-                };
-                exports.names = [
-                    'Miller_Cylindrical',
-                    'mill'
-                ];
-                return exports;
-            },
-            { '../common/adjust_lon': 5 }
-        ],
-        53: [
-            function (_dereq_, module, exports) {
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var EPSLN = 1e-10;
-                exports.init = function () {
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    var delta_lon = adjust_lon(lon - this.long0);
-                    var theta = lat;
-                    var con = Math.PI * Math.sin(lat);
-                    for (var i = 0; true; i++) {
-                        var delta_theta = -(theta + Math.sin(theta) - con) / (1 + Math.cos(theta));
-                        theta += delta_theta;
-                        if (Math.abs(delta_theta) < EPSLN) {
-                            break;
-                        }
-                    }
-                    theta /= 2;
-                    if (Math.PI / 2 - Math.abs(lat) < EPSLN) {
-                        delta_lon = 0;
-                    }
-                    var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0;
-                    var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0;
-                    p.x = x;
-                    p.y = y;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var theta;
-                    var arg;
-                    p.x -= this.x0;
-                    p.y -= this.y0;
-                    arg = p.y / (1.4142135623731 * this.a);
-                    if (Math.abs(arg) > 0.999999999999) {
-                        arg = 0.999999999999;
-                    }
-                    theta = Math.asin(arg);
-                    var lon = adjust_lon(this.long0 + p.x / (0.900316316158 * this.a * Math.cos(theta)));
-                    if (lon < -Math.PI) {
-                        lon = -Math.PI;
-                    }
-                    if (lon > Math.PI) {
-                        lon = Math.PI;
-                    }
-                    arg = (2 * theta + Math.sin(2 * theta)) / Math.PI;
-                    if (Math.abs(arg) > 1) {
-                        arg = 1;
-                    }
-                    var lat = Math.asin(arg);
-                    p.x = lon;
-                    p.y = lat;
-                    return p;
-                };
-                exports.names = [
-                    'Mollweide',
-                    'moll'
-                ];
-                return exports;
-            },
-            { '../common/adjust_lon': 5 }
-        ],
-        54: [
-            function (_dereq_, module, exports) {
-                var SEC_TO_RAD = 0.00000484813681109536;
-                exports.iterations = 1;
-                exports.init = function () {
-                    this.A = [];
-                    this.A[1] = 0.6399175073;
-                    this.A[2] = -0.1358797613;
-                    this.A[3] = 0.063294409;
-                    this.A[4] = -0.02526853;
-                    this.A[5] = 0.0117879;
-                    this.A[6] = -0.0055161;
-                    this.A[7] = 0.0026906;
-                    this.A[8] = -0.001333;
-                    this.A[9] = 0.00067;
-                    this.A[10] = -0.00034;
-                    this.B_re = [];
-                    this.B_im = [];
-                    this.B_re[1] = 0.7557853228;
-                    this.B_im[1] = 0;
-                    this.B_re[2] = 0.249204646;
-                    this.B_im[2] = 0.003371507;
-                    this.B_re[3] = -0.001541739;
-                    this.B_im[3] = 0.04105856;
-                    this.B_re[4] = -0.10162907;
-                    this.B_im[4] = 0.01727609;
-                    this.B_re[5] = -0.26623489;
-                    this.B_im[5] = -0.36249218;
-                    this.B_re[6] = -0.6870983;
-                    this.B_im[6] = -1.1651967;
-                    this.C_re = [];
-                    this.C_im = [];
-                    this.C_re[1] = 1.3231270439;
-                    this.C_im[1] = 0;
-                    this.C_re[2] = -0.577245789;
-                    this.C_im[2] = -0.007809598;
-                    this.C_re[3] = 0.508307513;
-                    this.C_im[3] = -0.112208952;
-                    this.C_re[4] = -0.15094762;
-                    this.C_im[4] = 0.18200602;
-                    this.C_re[5] = 1.01418179;
-                    this.C_im[5] = 1.64497696;
-                    this.C_re[6] = 1.9660549;
-                    this.C_im[6] = 2.5127645;
-                    this.D = [];
-                    this.D[1] = 1.5627014243;
-                    this.D[2] = 0.5185406398;
-                    this.D[3] = -0.03333098;
-                    this.D[4] = -0.1052906;
-                    this.D[5] = -0.0368594;
-                    this.D[6] = 0.007317;
-                    this.D[7] = 0.0122;
-                    this.D[8] = 0.00394;
-                    this.D[9] = -0.0013;
-                };
-                exports.forward = function (p) {
-                    var n;
-                    var lon = p.x;
-                    var lat = p.y;
-                    var delta_lat = lat - this.lat0;
-                    var delta_lon = lon - this.long0;
-                    var d_phi = delta_lat / SEC_TO_RAD * 0.00001;
-                    var d_lambda = delta_lon;
-                    var d_phi_n = 1;
-                    var d_psi = 0;
-                    for (n = 1; n <= 10; n++) {
-                        d_phi_n = d_phi_n * d_phi;
-                        d_psi = d_psi + this.A[n] * d_phi_n;
-                    }
-                    var th_re = d_psi;
-                    var th_im = d_lambda;
-                    var th_n_re = 1;
-                    var th_n_im = 0;
-                    var th_n_re1;
-                    var th_n_im1;
-                    var z_re = 0;
-                    var z_im = 0;
-                    for (n = 1; n <= 6; n++) {
-                        th_n_re1 = th_n_re * th_re - th_n_im * th_im;
-                        th_n_im1 = th_n_im * th_re + th_n_re * th_im;
-                        th_n_re = th_n_re1;
-                        th_n_im = th_n_im1;
-                        z_re = z_re + this.B_re[n] * th_n_re - this.B_im[n] * th_n_im;
-                        z_im = z_im + this.B_im[n] * th_n_re + this.B_re[n] * th_n_im;
-                    }
-                    p.x = z_im * this.a + this.x0;
-                    p.y = z_re * this.a + this.y0;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var n;
-                    var x = p.x;
-                    var y = p.y;
-                    var delta_x = x - this.x0;
-                    var delta_y = y - this.y0;
-                    var z_re = delta_y / this.a;
-                    var z_im = delta_x / this.a;
-                    var z_n_re = 1;
-                    var z_n_im = 0;
-                    var z_n_re1;
-                    var z_n_im1;
-                    var th_re = 0;
-                    var th_im = 0;
-                    for (n = 1; n <= 6; n++) {
-                        z_n_re1 = z_n_re * z_re - z_n_im * z_im;
-                        z_n_im1 = z_n_im * z_re + z_n_re * z_im;
-                        z_n_re = z_n_re1;
-                        z_n_im = z_n_im1;
-                        th_re = th_re + this.C_re[n] * z_n_re - this.C_im[n] * z_n_im;
-                        th_im = th_im + this.C_im[n] * z_n_re + this.C_re[n] * z_n_im;
-                    }
-                    for (var i = 0; i < this.iterations; i++) {
-                        var th_n_re = th_re;
-                        var th_n_im = th_im;
-                        var th_n_re1;
-                        var th_n_im1;
-                        var num_re = z_re;
-                        var num_im = z_im;
-                        for (n = 2; n <= 6; n++) {
-                            th_n_re1 = th_n_re * th_re - th_n_im * th_im;
-                            th_n_im1 = th_n_im * th_re + th_n_re * th_im;
-                            th_n_re = th_n_re1;
-                            th_n_im = th_n_im1;
-                            num_re = num_re + (n - 1) * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);
-                            num_im = num_im + (n - 1) * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);
-                        }
-                        th_n_re = 1;
-                        th_n_im = 0;
-                        var den_re = this.B_re[1];
-                        var den_im = this.B_im[1];
-                        for (n = 2; n <= 6; n++) {
-                            th_n_re1 = th_n_re * th_re - th_n_im * th_im;
-                            th_n_im1 = th_n_im * th_re + th_n_re * th_im;
-                            th_n_re = th_n_re1;
-                            th_n_im = th_n_im1;
-                            den_re = den_re + n * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);
-                            den_im = den_im + n * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);
-                        }
-                        var den2 = den_re * den_re + den_im * den_im;
-                        th_re = (num_re * den_re + num_im * den_im) / den2;
-                        th_im = (num_im * den_re - num_re * den_im) / den2;
-                    }
-                    var d_psi = th_re;
-                    var d_lambda = th_im;
-                    var d_psi_n = 1;
-                    var d_phi = 0;
-                    for (n = 1; n <= 9; n++) {
-                        d_psi_n = d_psi_n * d_psi;
-                        d_phi = d_phi + this.D[n] * d_psi_n;
-                    }
-                    var lat = this.lat0 + d_phi * SEC_TO_RAD * 100000;
-                    var lon = this.long0 + d_lambda;
-                    p.x = lon;
-                    p.y = lat;
-                    return p;
-                };
-                exports.names = [
-                    'New_Zealand_Map_Grid',
-                    'nzmg'
-                ];
-                return exports;
-            },
-            {}
-        ],
-        55: [
-            function (_dereq_, module, exports) {
-                var tsfnz = _dereq_('../common/tsfnz');
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var phi2z = _dereq_('../common/phi2z');
-                var HALF_PI = Math.PI / 2;
-                var FORTPI = Math.PI / 4;
-                var EPSLN = 1e-10;
-                exports.init = function () {
-                    this.no_off = this.no_off || false;
-                    this.no_rot = this.no_rot || false;
-                    if (isNaN(this.k0)) {
-                        this.k0 = 1;
-                    }
-                    var sinlat = Math.sin(this.lat0);
-                    var coslat = Math.cos(this.lat0);
-                    var con = this.e * sinlat;
-                    this.bl = Math.sqrt(1 + this.es / (1 - this.es) * Math.pow(coslat, 4));
-                    this.al = this.a * this.bl * this.k0 * Math.sqrt(1 - this.es) / (1 - con * con);
-                    var t0 = tsfnz(this.e, this.lat0, sinlat);
-                    var dl = this.bl / coslat * Math.sqrt((1 - this.es) / (1 - con * con));
-                    if (dl * dl < 1) {
-                        dl = 1;
-                    }
-                    var fl;
-                    var gl;
-                    if (!isNaN(this.longc)) {
-                        if (this.lat0 >= 0) {
-                            fl = dl + Math.sqrt(dl * dl - 1);
-                        } else {
-                            fl = dl - Math.sqrt(dl * dl - 1);
-                        }
-                        this.el = fl * Math.pow(t0, this.bl);
-                        gl = 0.5 * (fl - 1 / fl);
-                        this.gamma0 = Math.asin(Math.sin(this.alpha) / dl);
-                        this.long0 = this.longc - Math.asin(gl * Math.tan(this.gamma0)) / this.bl;
-                    } else {
-                        var t1 = tsfnz(this.e, this.lat1, Math.sin(this.lat1));
-                        var t2 = tsfnz(this.e, this.lat2, Math.sin(this.lat2));
-                        if (this.lat0 >= 0) {
-                            this.el = (dl + Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl);
-                        } else {
-                            this.el = (dl - Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl);
-                        }
-                        var hl = Math.pow(t1, this.bl);
-                        var ll = Math.pow(t2, this.bl);
-                        fl = this.el / hl;
-                        gl = 0.5 * (fl - 1 / fl);
-                        var jl = (this.el * this.el - ll * hl) / (this.el * this.el + ll * hl);
-                        var pl = (ll - hl) / (ll + hl);
-                        var dlon12 = adjust_lon(this.long1 - this.long2);
-                        this.long0 = 0.5 * (this.long1 + this.long2) - Math.atan(jl * Math.tan(0.5 * this.bl * dlon12) / pl) / this.bl;
-                        this.long0 = adjust_lon(this.long0);
-                        var dlon10 = adjust_lon(this.long1 - this.long0);
-                        this.gamma0 = Math.atan(Math.sin(this.bl * dlon10) / gl);
-                        this.alpha = Math.asin(dl * Math.sin(this.gamma0));
-                    }
-                    if (this.no_off) {
-                        this.uc = 0;
-                    } else {
-                        if (this.lat0 >= 0) {
-                            this.uc = this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha));
-                        } else {
-                            this.uc = -1 * this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha));
-                        }
-                    }
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    var dlon = adjust_lon(lon - this.long0);
-                    var us, vs;
-                    var con;
-                    if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {
-                        if (lat > 0) {
-                            con = -1;
-                        } else {
-                            con = 1;
-                        }
-                        vs = this.al / this.bl * Math.log(Math.tan(FORTPI + con * this.gamma0 * 0.5));
-                        us = -1 * con * HALF_PI * this.al / this.bl;
-                    } else {
-                        var t = tsfnz(this.e, lat, Math.sin(lat));
-                        var ql = this.el / Math.pow(t, this.bl);
-                        var sl = 0.5 * (ql - 1 / ql);
-                        var tl = 0.5 * (ql + 1 / ql);
-                        var vl = Math.sin(this.bl * dlon);
-                        var ul = (sl * Math.sin(this.gamma0) - vl * Math.cos(this.gamma0)) / tl;
-                        if (Math.abs(Math.abs(ul) - 1) <= EPSLN) {
-                            vs = Number.POSITIVE_INFINITY;
-                        } else {
-                            vs = 0.5 * this.al * Math.log((1 - ul) / (1 + ul)) / this.bl;
-                        }
-                        if (Math.abs(Math.cos(this.bl * dlon)) <= EPSLN) {
-                            us = this.al * this.bl * dlon;
-                        } else {
-                            us = this.al * Math.atan2(sl * Math.cos(this.gamma0) + vl * Math.sin(this.gamma0), Math.cos(this.bl * dlon)) / this.bl;
-                        }
-                    }
-                    if (this.no_rot) {
-                        p.x = this.x0 + us;
-                        p.y = this.y0 + vs;
-                    } else {
-                        us -= this.uc;
-                        p.x = this.x0 + vs * Math.cos(this.alpha) + us * Math.sin(this.alpha);
-                        p.y = this.y0 + us * Math.cos(this.alpha) - vs * Math.sin(this.alpha);
-                    }
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var us, vs;
-                    if (this.no_rot) {
-                        vs = p.y - this.y0;
-                        us = p.x - this.x0;
-                    } else {
-                        vs = (p.x - this.x0) * Math.cos(this.alpha) - (p.y - this.y0) * Math.sin(this.alpha);
-                        us = (p.y - this.y0) * Math.cos(this.alpha) + (p.x - this.x0) * Math.sin(this.alpha);
-                        us += this.uc;
-                    }
-                    var qp = Math.exp(-1 * this.bl * vs / this.al);
-                    var sp = 0.5 * (qp - 1 / qp);
-                    var tp = 0.5 * (qp + 1 / qp);
-                    var vp = Math.sin(this.bl * us / this.al);
-                    var up = (vp * Math.cos(this.gamma0) + sp * Math.sin(this.gamma0)) / tp;
-                    var ts = Math.pow(this.el / Math.sqrt((1 + up) / (1 - up)), 1 / this.bl);
-                    if (Math.abs(up - 1) < EPSLN) {
-                        p.x = this.long0;
-                        p.y = HALF_PI;
-                    } else if (Math.abs(up + 1) < EPSLN) {
-                        p.x = this.long0;
-                        p.y = -1 * HALF_PI;
-                    } else {
-                        p.y = phi2z(this.e, ts);
-                        p.x = adjust_lon(this.long0 - Math.atan2(sp * Math.cos(this.gamma0) - vp * Math.sin(this.gamma0), Math.cos(this.bl * us / this.al)) / this.bl);
-                    }
-                    return p;
-                };
-                exports.names = [
-                    'Hotine_Oblique_Mercator',
-                    'Hotine Oblique Mercator',
-                    'Hotine_Oblique_Mercator_Azimuth_Natural_Origin',
-                    'Hotine_Oblique_Mercator_Azimuth_Center',
-                    'omerc'
-                ];
-                return exports;
-            },
-            {
-                '../common/adjust_lon': 5,
-                '../common/phi2z': 16,
-                '../common/tsfnz': 24
-            }
-        ],
-        56: [
-            function (_dereq_, module, exports) {
-                var e0fn = _dereq_('../common/e0fn');
-                var e1fn = _dereq_('../common/e1fn');
-                var e2fn = _dereq_('../common/e2fn');
-                var e3fn = _dereq_('../common/e3fn');
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var adjust_lat = _dereq_('../common/adjust_lat');
-                var mlfn = _dereq_('../common/mlfn');
-                var EPSLN = 1e-10;
-                var gN = _dereq_('../common/gN');
-                var MAX_ITER = 20;
-                exports.init = function () {
-                    this.temp = this.b / this.a;
-                    this.es = 1 - Math.pow(this.temp, 2);
-                    this.e = Math.sqrt(this.es);
-                    this.e0 = e0fn(this.es);
-                    this.e1 = e1fn(this.es);
-                    this.e2 = e2fn(this.es);
-                    this.e3 = e3fn(this.es);
-                    this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    var x, y, el;
-                    var dlon = adjust_lon(lon - this.long0);
-                    el = dlon * Math.sin(lat);
-                    if (this.sphere) {
-                        if (Math.abs(lat) <= EPSLN) {
-                            x = this.a * dlon;
-                            y = -1 * this.a * this.lat0;
-                        } else {
-                            x = this.a * Math.sin(el) / Math.tan(lat);
-                            y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat));
-                        }
-                    } else {
-                        if (Math.abs(lat) <= EPSLN) {
-                            x = this.a * dlon;
-                            y = -1 * this.ml0;
-                        } else {
-                            var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat);
-                            x = nl * Math.sin(el);
-                            y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el));
-                        }
-                    }
-                    p.x = x + this.x0;
-                    p.y = y + this.y0;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var lon, lat, x, y, i;
-                    var al, bl;
-                    var phi, dphi;
-                    x = p.x - this.x0;
-                    y = p.y - this.y0;
-                    if (this.sphere) {
-                        if (Math.abs(y + this.a * this.lat0) <= EPSLN) {
-                            lon = adjust_lon(x / this.a + this.long0);
-                            lat = 0;
-                        } else {
-                            al = this.lat0 + y / this.a;
-                            bl = x * x / this.a / this.a + al * al;
-                            phi = al;
-                            var tanphi;
-                            for (i = MAX_ITER; i; --i) {
-                                tanphi = Math.tan(phi);
-                                dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1);
-                                phi += dphi;
-                                if (Math.abs(dphi) <= EPSLN) {
-                                    lat = phi;
-                                    break;
-                                }
-                            }
-                            lon = adjust_lon(this.long0 + Math.asin(x * Math.tan(phi) / this.a) / Math.sin(lat));
-                        }
-                    } else {
-                        if (Math.abs(y + this.ml0) <= EPSLN) {
-                            lat = 0;
-                            lon = adjust_lon(this.long0 + x / this.a);
-                        } else {
-                            al = (this.ml0 + y) / this.a;
-                            bl = x * x / this.a / this.a + al * al;
-                            phi = al;
-                            var cl, mln, mlnp, ma;
-                            var con;
-                            for (i = MAX_ITER; i; --i) {
-                                con = this.e * Math.sin(phi);
-                                cl = Math.sqrt(1 - con * con) * Math.tan(phi);
-                                mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);
-                                mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi);
-                                ma = mln / this.a;
-                                dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp);
-                                phi -= dphi;
-                                if (Math.abs(dphi) <= EPSLN) {
-                                    lat = phi;
-                                    break;
-                                }
-                            }
-                            cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat);
-                            lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat));
-                        }
-                    }
-                    p.x = lon;
-                    p.y = lat;
-                    return p;
-                };
-                exports.names = [
-                    'Polyconic',
-                    'poly'
-                ];
-                return exports;
-            },
-            {
-                '../common/adjust_lat': 4,
-                '../common/adjust_lon': 5,
-                '../common/e0fn': 7,
-                '../common/e1fn': 8,
-                '../common/e2fn': 9,
-                '../common/e3fn': 10,
-                '../common/gN': 11,
-                '../common/mlfn': 14
-            }
-        ],
-        57: [
-            function (_dereq_, module, exports) {
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var adjust_lat = _dereq_('../common/adjust_lat');
-                var pj_enfn = _dereq_('../common/pj_enfn');
-                var MAX_ITER = 20;
-                var pj_mlfn = _dereq_('../common/pj_mlfn');
-                var pj_inv_mlfn = _dereq_('../common/pj_inv_mlfn');
-                var HALF_PI = Math.PI / 2;
-                var EPSLN = 1e-10;
-                var asinz = _dereq_('../common/asinz');
-                exports.init = function () {
-                    if (!this.sphere) {
-                        this.en = pj_enfn(this.es);
-                    } else {
-                        this.n = 1;
-                        this.m = 0;
-                        this.es = 0;
-                        this.C_y = Math.sqrt((this.m + 1) / this.n);
-                        this.C_x = this.C_y / (this.m + 1);
-                    }
-                };
-                exports.forward = function (p) {
-                    var x, y;
-                    var lon = p.x;
-                    var lat = p.y;
-                    lon = adjust_lon(lon - this.long0);
-                    if (this.sphere) {
-                        if (!this.m) {
-                            lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat;
-                        } else {
-                            var k = this.n * Math.sin(lat);
-                            for (var i = MAX_ITER; i; --i) {
-                                var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat));
-                                lat -= V;
-                                if (Math.abs(V) < EPSLN) {
-                                    break;
-                                }
-                            }
-                        }
-                        x = this.a * this.C_x * lon * (this.m + Math.cos(lat));
-                        y = this.a * this.C_y * lat;
-                    } else {
-                        var s = Math.sin(lat);
-                        var c = Math.cos(lat);
-                        y = this.a * pj_mlfn(lat, s, c, this.en);
-                        x = this.a * lon * c / Math.sqrt(1 - this.es * s * s);
-                    }
-                    p.x = x;
-                    p.y = y;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var lat, temp, lon, s;
-                    p.x -= this.x0;
-                    lon = p.x / this.a;
-                    p.y -= this.y0;
-                    lat = p.y / this.a;
-                    if (this.sphere) {
-                        lat /= this.C_y;
-                        lon = lon / (this.C_x * (this.m + Math.cos(lat)));
-                        if (this.m) {
-                            lat = asinz((this.m * lat + Math.sin(lat)) / this.n);
-                        } else if (this.n !== 1) {
-                            lat = asinz(Math.sin(lat) / this.n);
-                        }
-                        lon = adjust_lon(lon + this.long0);
-                        lat = adjust_lat(lat);
-                    } else {
-                        lat = pj_inv_mlfn(p.y / this.a, this.es, this.en);
-                        s = Math.abs(lat);
-                        if (s < HALF_PI) {
-                            s = Math.sin(lat);
-                            temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat));
-                            lon = adjust_lon(temp);
-                        } else if (s - EPSLN < HALF_PI) {
-                            lon = this.long0;
-                        }
-                    }
-                    p.x = lon;
-                    p.y = lat;
-                    return p;
-                };
-                exports.names = [
-                    'Sinusoidal',
-                    'sinu'
-                ];
-                return exports;
-            },
-            {
-                '../common/adjust_lat': 4,
-                '../common/adjust_lon': 5,
-                '../common/asinz': 6,
-                '../common/pj_enfn': 17,
-                '../common/pj_inv_mlfn': 18,
-                '../common/pj_mlfn': 19
-            }
-        ],
-        58: [
-            function (_dereq_, module, exports) {
-                exports.init = function () {
-                    var phy0 = this.lat0;
-                    this.lambda0 = this.long0;
-                    var sinPhy0 = Math.sin(phy0);
-                    var semiMajorAxis = this.a;
-                    var invF = this.rf;
-                    var flattening = 1 / invF;
-                    var e2 = 2 * flattening - Math.pow(flattening, 2);
-                    var e = this.e = Math.sqrt(e2);
-                    this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2));
-                    this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4));
-                    this.b0 = Math.asin(sinPhy0 / this.alpha);
-                    var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2));
-                    var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2));
-                    var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0));
-                    this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3;
-                };
-                exports.forward = function (p) {
-                    var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2));
-                    var Sa2 = this.e / 2 * Math.log((1 + this.e * Math.sin(p.y)) / (1 - this.e * Math.sin(p.y)));
-                    var S = -this.alpha * (Sa1 + Sa2) + this.K;
-                    var b = 2 * (Math.atan(Math.exp(S)) - Math.PI / 4);
-                    var I = this.alpha * (p.x - this.lambda0);
-                    var rotI = Math.atan(Math.sin(I) / (Math.sin(this.b0) * Math.tan(b) + Math.cos(this.b0) * Math.cos(I)));
-                    var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - Math.sin(this.b0) * Math.cos(b) * Math.cos(I));
-                    p.y = this.R / 2 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0;
-                    p.x = this.R * rotI + this.x0;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var Y = p.x - this.x0;
-                    var X = p.y - this.y0;
-                    var rotI = Y / this.R;
-                    var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4);
-                    var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI));
-                    var I = Math.atan(Math.sin(rotI) / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) * Math.tan(rotB)));
-                    var lambda = this.lambda0 + I / this.alpha;
-                    var S = 0;
-                    var phy = b;
-                    var prevPhy = -1000;
-                    var iteration = 0;
-                    while (Math.abs(phy - prevPhy) > 1e-7) {
-                        if (++iteration > 20) {
-                            return;
-                        }
-                        S = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + b / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(phy)) / 2));
-                        prevPhy = phy;
-                        phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2;
-                    }
-                    p.x = lambda;
-                    p.y = phy;
-                    return p;
-                };
-                exports.names = ['somerc'];
-                return exports;
-            },
-            {}
-        ],
-        59: [
-            function (_dereq_, module, exports) {
-                var HALF_PI = Math.PI / 2;
-                var EPSLN = 1e-10;
-                var sign = _dereq_('../common/sign');
-                var msfnz = _dereq_('../common/msfnz');
-                var tsfnz = _dereq_('../common/tsfnz');
-                var phi2z = _dereq_('../common/phi2z');
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                exports.ssfn_ = function (phit, sinphi, eccen) {
-                    sinphi *= eccen;
-                    return Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen);
-                };
-                exports.init = function () {
-                    this.coslat0 = Math.cos(this.lat0);
-                    this.sinlat0 = Math.sin(this.lat0);
-                    if (this.sphere) {
-                        if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {
-                            this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts));
-                        }
-                    } else {
-                        if (Math.abs(this.coslat0) <= EPSLN) {
-                            if (this.lat0 > 0) {
-                                this.con = 1;
-                            } else {
-                                this.con = -1;
-                            }
-                        }
-                        this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e));
-                        if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {
-                            this.k0 = 0.5 * this.cons * msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / tsfnz(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts));
-                        }
-                        this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0);
-                        this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI;
-                        this.cosX0 = Math.cos(this.X0);
-                        this.sinX0 = Math.sin(this.X0);
-                    }
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    var sinlat = Math.sin(lat);
-                    var coslat = Math.cos(lat);
-                    var A, X, sinX, cosX, ts, rh;
-                    var dlon = adjust_lon(lon - this.long0);
-                    if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) {
-                        p.x = NaN;
-                        p.y = NaN;
-                        return p;
-                    }
-                    if (this.sphere) {
-                        A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon));
-                        p.x = this.a * A * coslat * Math.sin(dlon) + this.x0;
-                        p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0;
-                        return p;
-                    } else {
-                        X = 2 * Math.atan(this.ssfn_(lat, sinlat, this.e)) - HALF_PI;
-                        cosX = Math.cos(X);
-                        sinX = Math.sin(X);
-                        if (Math.abs(this.coslat0) <= EPSLN) {
-                            ts = tsfnz(this.e, lat * this.con, this.con * sinlat);
-                            rh = 2 * this.a * this.k0 * ts / this.cons;
-                            p.x = this.x0 + rh * Math.sin(lon - this.long0);
-                            p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0);
-                            return p;
-                        } else if (Math.abs(this.sinlat0) < EPSLN) {
-                            A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon));
-                            p.y = A * sinX;
-                        } else {
-                            A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon)));
-                            p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0;
-                        }
-                        p.x = A * cosX * Math.sin(dlon) + this.x0;
-                    }
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    p.x -= this.x0;
-                    p.y -= this.y0;
-                    var lon, lat, ts, ce, Chi;
-                    var rh = Math.sqrt(p.x * p.x + p.y * p.y);
-                    if (this.sphere) {
-                        var c = 2 * Math.atan(rh / (0.5 * this.a * this.k0));
-                        lon = this.long0;
-                        lat = this.lat0;
-                        if (rh <= EPSLN) {
-                            p.x = lon;
-                            p.y = lat;
-                            return p;
-                        }
-                        lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh);
-                        if (Math.abs(this.coslat0) < EPSLN) {
-                            if (this.lat0 > 0) {
-                                lon = adjust_lon(this.long0 + Math.atan2(p.x, -1 * p.y));
-                            } else {
-                                lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y));
-                            }
-                        } else {
-                            lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(c), rh * this.coslat0 * Math.cos(c) - p.y * this.sinlat0 * Math.sin(c)));
-                        }
-                        p.x = lon;
-                        p.y = lat;
-                        return p;
-                    } else {
-                        if (Math.abs(this.coslat0) <= EPSLN) {
-                            if (rh <= EPSLN) {
-                                lat = this.lat0;
-                                lon = this.long0;
-                                p.x = lon;
-                                p.y = lat;
-                                return p;
-                            }
-                            p.x *= this.con;
-                            p.y *= this.con;
-                            ts = rh * this.cons / (2 * this.a * this.k0);
-                            lat = this.con * phi2z(this.e, ts);
-                            lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, -1 * p.y));
-                        } else {
-                            ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1));
-                            lon = this.long0;
-                            if (rh <= EPSLN) {
-                                Chi = this.X0;
-                            } else {
-                                Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh);
-                                lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(ce), rh * this.cosX0 * Math.cos(ce) - p.y * this.sinX0 * Math.sin(ce)));
-                            }
-                            lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi)));
-                        }
-                    }
-                    p.x = lon;
-                    p.y = lat;
-                    return p;
-                };
-                exports.names = ['stere'];
-                return exports;
-            },
-            {
-                '../common/adjust_lon': 5,
-                '../common/msfnz': 15,
-                '../common/phi2z': 16,
-                '../common/sign': 21,
-                '../common/tsfnz': 24
-            }
-        ],
-        60: [
-            function (_dereq_, module, exports) {
-                var gauss = _dereq_('./gauss');
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                exports.init = function () {
-                    gauss.init.apply(this);
-                    if (!this.rc) {
-                        return;
-                    }
-                    this.sinc0 = Math.sin(this.phic0);
-                    this.cosc0 = Math.cos(this.phic0);
-                    this.R2 = 2 * this.rc;
-                    if (!this.title) {
-                        this.title = 'Oblique Stereographic Alternative';
-                    }
-                };
-                exports.forward = function (p) {
-                    var sinc, cosc, cosl, k;
-                    p.x = adjust_lon(p.x - this.long0);
-                    gauss.forward.apply(this, [p]);
-                    sinc = Math.sin(p.y);
-                    cosc = Math.cos(p.y);
-                    cosl = Math.cos(p.x);
-                    k = this.k0 * this.R2 / (1 + this.sinc0 * sinc + this.cosc0 * cosc * cosl);
-                    p.x = k * cosc * Math.sin(p.x);
-                    p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl);
-                    p.x = this.a * p.x + this.x0;
-                    p.y = this.a * p.y + this.y0;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var sinc, cosc, lon, lat, rho;
-                    p.x = (p.x - this.x0) / this.a;
-                    p.y = (p.y - this.y0) / this.a;
-                    p.x /= this.k0;
-                    p.y /= this.k0;
-                    if (rho = Math.sqrt(p.x * p.x + p.y * p.y)) {
-                        var c = 2 * Math.atan2(rho, this.R2);
-                        sinc = Math.sin(c);
-                        cosc = Math.cos(c);
-                        lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho);
-                        lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc);
-                    } else {
-                        lat = this.phic0;
-                        lon = 0;
-                    }
-                    p.x = lon;
-                    p.y = lat;
-                    gauss.inverse.apply(this, [p]);
-                    p.x = adjust_lon(p.x + this.long0);
-                    return p;
-                };
-                exports.names = [
-                    'Stereographic_North_Pole',
-                    'Oblique_Stereographic',
-                    'Polar_Stereographic',
-                    'sterea',
-                    'Oblique Stereographic Alternative'
-                ];
-                return exports;
-            },
-            {
-                '../common/adjust_lon': 5,
-                './gauss': 45
-            }
-        ],
-        61: [
-            function (_dereq_, module, exports) {
-                var e0fn = _dereq_('../common/e0fn');
-                var e1fn = _dereq_('../common/e1fn');
-                var e2fn = _dereq_('../common/e2fn');
-                var e3fn = _dereq_('../common/e3fn');
-                var mlfn = _dereq_('../common/mlfn');
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var HALF_PI = Math.PI / 2;
-                var EPSLN = 1e-10;
-                var sign = _dereq_('../common/sign');
-                var asinz = _dereq_('../common/asinz');
-                exports.init = function () {
-                    this.e0 = e0fn(this.es);
-                    this.e1 = e1fn(this.es);
-                    this.e2 = e2fn(this.es);
-                    this.e3 = e3fn(this.es);
-                    this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    var delta_lon = adjust_lon(lon - this.long0);
-                    var con;
-                    var x, y;
-                    var sin_phi = Math.sin(lat);
-                    var cos_phi = Math.cos(lat);
-                    if (this.sphere) {
-                        var b = cos_phi * Math.sin(delta_lon);
-                        if (Math.abs(Math.abs(b) - 1) < 1e-10) {
-                            return 93;
-                        } else {
-                            x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b));
-                            con = Math.acos(cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - b * b));
-                            if (lat < 0) {
-                                con = -con;
-                            }
-                            y = this.a * this.k0 * (con - this.lat0);
-                        }
-                    } else {
-                        var al = cos_phi * delta_lon;
-                        var als = Math.pow(al, 2);
-                        var c = this.ep2 * Math.pow(cos_phi, 2);
-                        var tq = Math.tan(lat);
-                        var t = Math.pow(tq, 2);
-                        con = 1 - this.es * Math.pow(sin_phi, 2);
-                        var n = this.a / Math.sqrt(con);
-                        var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat);
-                        x = this.k0 * n * al * (1 + als / 6 * (1 - t + c + als / 20 * (5 - 18 * t + Math.pow(t, 2) + 72 * c - 58 * this.ep2))) + this.x0;
-                        y = this.k0 * (ml - this.ml0 + n * tq * (als * (0.5 + als / 24 * (5 - t + 9 * c + 4 * Math.pow(c, 2) + als / 30 * (61 - 58 * t + Math.pow(t, 2) + 600 * c - 330 * this.ep2))))) + this.y0;
-                    }
-                    p.x = x;
-                    p.y = y;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var con, phi;
-                    var delta_phi;
-                    var i;
-                    var max_iter = 6;
-                    var lat, lon;
-                    if (this.sphere) {
-                        var f = Math.exp(p.x / (this.a * this.k0));
-                        var g = 0.5 * (f - 1 / f);
-                        var temp = this.lat0 + p.y / (this.a * this.k0);
-                        var h = Math.cos(temp);
-                        con = Math.sqrt((1 - h * h) / (1 + g * g));
-                        lat = asinz(con);
-                        if (temp < 0) {
-                            lat = -lat;
-                        }
-                        if (g === 0 && h === 0) {
-                            lon = this.long0;
-                        } else {
-                            lon = adjust_lon(Math.atan2(g, h) + this.long0);
-                        }
-                    } else {
-                        var x = p.x - this.x0;
-                        var y = p.y - this.y0;
-                        con = (this.ml0 + y / this.k0) / this.a;
-                        phi = con;
-                        for (i = 0; true; i++) {
-                            delta_phi = (con + this.e1 * Math.sin(2 * phi) - this.e2 * Math.sin(4 * phi) + this.e3 * Math.sin(6 * phi)) / this.e0 - phi;
-                            phi += delta_phi;
-                            if (Math.abs(delta_phi) <= EPSLN) {
-                                break;
-                            }
-                            if (i >= max_iter) {
-                                return 95;
-                            }
-                        }
-                        if (Math.abs(phi) < HALF_PI) {
-                            var sin_phi = Math.sin(phi);
-                            var cos_phi = Math.cos(phi);
-                            var tan_phi = Math.tan(phi);
-                            var c = this.ep2 * Math.pow(cos_phi, 2);
-                            var cs = Math.pow(c, 2);
-                            var t = Math.pow(tan_phi, 2);
-                            var ts = Math.pow(t, 2);
-                            con = 1 - this.es * Math.pow(sin_phi, 2);
-                            var n = this.a / Math.sqrt(con);
-                            var r = n * (1 - this.es) / con;
-                            var d = x / (n * this.k0);
-                            var ds = Math.pow(d, 2);
-                            lat = phi - n * tan_phi * ds / r * (0.5 - ds / 24 * (5 + 3 * t + 10 * c - 4 * cs - 9 * this.ep2 - ds / 30 * (61 + 90 * t + 298 * c + 45 * ts - 252 * this.ep2 - 3 * cs)));
-                            lon = adjust_lon(this.long0 + d * (1 - ds / 6 * (1 + 2 * t + c - ds / 20 * (5 - 2 * c + 28 * t - 3 * cs + 8 * this.ep2 + 24 * ts))) / cos_phi);
-                        } else {
-                            lat = HALF_PI * sign(y);
-                            lon = this.long0;
-                        }
-                    }
-                    p.x = lon;
-                    p.y = lat;
-                    return p;
-                };
-                exports.names = [
-                    'Transverse_Mercator',
-                    'Transverse Mercator',
-                    'tmerc'
-                ];
-                return exports;
-            },
-            {
-                '../common/adjust_lon': 5,
-                '../common/asinz': 6,
-                '../common/e0fn': 7,
-                '../common/e1fn': 8,
-                '../common/e2fn': 9,
-                '../common/e3fn': 10,
-                '../common/mlfn': 14,
-                '../common/sign': 21
-            }
-        ],
-        62: [
-            function (_dereq_, module, exports) {
-                var D2R = 0.017453292519943295;
-                var tmerc = _dereq_('./tmerc');
-                exports.dependsOn = 'tmerc';
-                exports.init = function () {
-                    if (!this.zone) {
-                        return;
-                    }
-                    this.lat0 = 0;
-                    this.long0 = (6 * Math.abs(this.zone) - 183) * D2R;
-                    this.x0 = 500000;
-                    this.y0 = this.utmSouth ? 10000000 : 0;
-                    this.k0 = 0.9996;
-                    tmerc.init.apply(this);
-                    this.forward = tmerc.forward;
-                    this.inverse = tmerc.inverse;
-                };
-                exports.names = [
-                    'Universal Transverse Mercator System',
-                    'utm'
-                ];
-                return exports;
-            },
-            { './tmerc': 61 }
-        ],
-        63: [
-            function (_dereq_, module, exports) {
-                var adjust_lon = _dereq_('../common/adjust_lon');
-                var HALF_PI = Math.PI / 2;
-                var EPSLN = 1e-10;
-                var asinz = _dereq_('../common/asinz');
-                exports.init = function () {
-                    this.R = this.a;
-                };
-                exports.forward = function (p) {
-                    var lon = p.x;
-                    var lat = p.y;
-                    var dlon = adjust_lon(lon - this.long0);
-                    var x, y;
-                    if (Math.abs(lat) <= EPSLN) {
-                        x = this.x0 + this.R * dlon;
-                        y = this.y0;
-                    }
-                    var theta = asinz(2 * Math.abs(lat / Math.PI));
-                    if (Math.abs(dlon) <= EPSLN || Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {
-                        x = this.x0;
-                        if (lat >= 0) {
-                            y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta);
-                        } else {
-                            y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta);
-                        }
-                    }
-                    var al = 0.5 * Math.abs(Math.PI / dlon - dlon / Math.PI);
-                    var asq = al * al;
-                    var sinth = Math.sin(theta);
-                    var costh = Math.cos(theta);
-                    var g = costh / (sinth + costh - 1);
-                    var gsq = g * g;
-                    var m = g * (2 / sinth - 1);
-                    var msq = m * m;
-                    var con = Math.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq);
-                    if (dlon < 0) {
-                        con = -con;
-                    }
-                    x = this.x0 + con;
-                    var q = asq + g;
-                    con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq);
-                    if (lat >= 0) {
-                        y = this.y0 + con;
-                    } else {
-                        y = this.y0 - con;
-                    }
-                    p.x = x;
-                    p.y = y;
-                    return p;
-                };
-                exports.inverse = function (p) {
-                    var lon, lat;
-                    var xx, yy, xys, c1, c2, c3;
-                    var a1;
-                    var m1;
-                    var con;
-                    var th1;
-                    var d;
-                    p.x -= this.x0;
-                    p.y -= this.y0;
-                    con = Math.PI * this.R;
-                    xx = p.x / con;
-                    yy = p.y / con;
-                    xys = xx * xx + yy * yy;
-                    c1 = -Math.abs(yy) * (1 + xys);
-                    c2 = c1 - 2 * yy * yy + xx * xx;
-                    c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys;
-                    d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27;
-                    a1 = (c1 - c2 * c2 / 3 / c3) / c3;
-                    m1 = 2 * Math.sqrt(-a1 / 3);
-                    con = 3 * d / a1 / m1;
-                    if (Math.abs(con) > 1) {
-                        if (con >= 0) {
-                            con = 1;
-                        } else {
-                            con = -1;
-                        }
-                    }
-                    th1 = Math.acos(con) / 3;
-                    if (p.y >= 0) {
-                        lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;
-                    } else {
-                        lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;
-                    }
-                    if (Math.abs(xx) < EPSLN) {
-                        lon = this.long0;
-                    } else {
-                        lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx);
-                    }
-                    p.x = lon;
-                    p.y = lat;
-                    return p;
-                };
-                exports.names = [
-                    'Van_der_Grinten_I',
-                    'VanDerGrinten',
-                    'vandg'
-                ];
-                return exports;
-            },
-            {
-                '../common/adjust_lon': 5,
-                '../common/asinz': 6
-            }
-        ],
-        64: [
-            function (_dereq_, module, exports) {
-                var D2R = 0.017453292519943295;
-                var R2D = 57.29577951308232;
-                var PJD_3PARAM = 1;
-                var PJD_7PARAM = 2;
-                var datum_transform = _dereq_('./datum_transform');
-                var adjust_axis = _dereq_('./adjust_axis');
-                var proj = _dereq_('./Proj');
-                var toPoint = _dereq_('./common/toPoint');
-                module.exports = function transform(source, dest, point) {
-                    var wgs84;
-                    if (Array.isArray(point)) {
-                        point = toPoint(point);
-                    }
-                    function checkNotWGS(source, dest) {
-                        return (source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM) && dest.datumCode !== 'WGS84';
-                    }
-                    if (source.datum && dest.datum && (checkNotWGS(source, dest) || checkNotWGS(dest, source))) {
-                        wgs84 = new proj('WGS84');
-                        transform(source, wgs84, point);
-                        source = wgs84;
-                    }
-                    if (source.axis !== 'enu') {
-                        adjust_axis(source, false, point);
-                    }
-                    if (source.projName === 'longlat') {
-                        point.x *= D2R;
-                        point.y *= D2R;
-                    } else {
-                        if (source.to_meter) {
-                            point.x *= source.to_meter;
-                            point.y *= source.to_meter;
-                        }
-                        source.inverse(point);
-                    }
-                    if (source.from_greenwich) {
-                        point.x += source.from_greenwich;
-                    }
-                    point = datum_transform(source.datum, dest.datum, point);
-                    if (dest.from_greenwich) {
-                        point.x -= dest.from_greenwich;
-                    }
-                    if (dest.projName === 'longlat') {
-                        point.x *= R2D;
-                        point.y *= R2D;
-                    } else {
-                        dest.forward(point);
-                        if (dest.to_meter) {
-                            point.x /= dest.to_meter;
-                            point.y /= dest.to_meter;
-                        }
-                    }
-                    if (dest.axis !== 'enu') {
-                        adjust_axis(dest, true, point);
-                    }
-                    return point;
-                };
-                return exports;
-            },
-            {
-                './Proj': 2,
-                './adjust_axis': 3,
-                './common/toPoint': 23,
-                './datum_transform': 30
-            }
-        ],
-        65: [
-            function (_dereq_, module, exports) {
-                var D2R = 0.017453292519943295;
-                var extend = _dereq_('./extend');
-                function mapit(obj, key, v) {
-                    obj[key] = v.map(function (aa) {
-                        var o = {};
-                        sExpr(aa, o);
-                        return o;
-                    }).reduce(function (a, b) {
-                        return extend(a, b);
-                    }, {});
-                }
-                function sExpr(v, obj) {
-                    var key;
-                    if (!Array.isArray(v)) {
-                        obj[v] = true;
-                        return;
-                    } else {
-                        key = v.shift();
-                        if (key === 'PARAMETER') {
-                            key = v.shift();
-                        }
-                        if (v.length === 1) {
-                            if (Array.isArray(v[0])) {
-                                obj[key] = {};
-                                sExpr(v[0], obj[key]);
-                            } else {
-                                obj[key] = v[0];
-                            }
-                        } else if (!v.length) {
-                            obj[key] = true;
-                        } else if (key === 'TOWGS84') {
-                            obj[key] = v;
-                        } else {
-                            obj[key] = {};
-                            if ([
-                                    'UNIT',
-                                    'PRIMEM',
-                                    'VERT_DATUM'
-                                ].indexOf(key) > -1) {
-                                obj[key] = {
-                                    name: v[0].toLowerCase(),
-                                    convert: v[1]
-                                };
-                                if (v.length === 3) {
-                                    obj[key].auth = v[2];
-                                }
-                            } else if (key === 'SPHEROID') {
-                                obj[key] = {
-                                    name: v[0],
-                                    a: v[1],
-                                    rf: v[2]
-                                };
-                                if (v.length === 4) {
-                                    obj[key].auth = v[3];
-                                }
-                            } else if ([
-                                    'GEOGCS',
-                                    'GEOCCS',
-                                    'DATUM',
-                                    'VERT_CS',
-                                    'COMPD_CS',
-                                    'LOCAL_CS',
-                                    'FITTED_CS',
-                                    'LOCAL_DATUM'
-                                ].indexOf(key) > -1) {
-                                v[0] = [
-                                    'name',
-                                    v[0]
-                                ];
-                                mapit(obj, key, v);
-                            } else if (v.every(function (aa) {
-                                    return Array.isArray(aa);
-                                })) {
-                                mapit(obj, key, v);
-                            } else {
-                                sExpr(v, obj[key]);
-                            }
-                        }
-                    }
-                }
-                function rename(obj, params) {
-                    var outName = params[0];
-                    var inName = params[1];
-                    if (!(outName in obj) && inName in obj) {
-                        obj[outName] = obj[inName];
-                        if (params.length === 3) {
-                            obj[outName] = params[2](obj[outName]);
-                        }
-                    }
-                }
-                function d2r(input) {
-                    return input * D2R;
-                }
-                function cleanWKT(wkt) {
-                    if (wkt.type === 'GEOGCS') {
-                        wkt.projName = 'longlat';
-                    } else if (wkt.type === 'LOCAL_CS') {
-                        wkt.projName = 'identity';
-                        wkt.local = true;
-                    } else {
-                        if (typeof wkt.PROJECTION === 'object') {
-                            wkt.projName = Object.keys(wkt.PROJECTION)[0];
-                        } else {
-                            wkt.projName = wkt.PROJECTION;
-                        }
-                    }
-                    if (wkt.UNIT) {
-                        wkt.units = wkt.UNIT.name.toLowerCase();
-                        if (wkt.units === 'metre') {
-                            wkt.units = 'meter';
-                        }
-                        if (wkt.UNIT.convert) {
-                            wkt.to_meter = parseFloat(wkt.UNIT.convert, 10);
-                        }
-                    }
-                    if (wkt.GEOGCS) {
-                        if (wkt.GEOGCS.DATUM) {
-                            wkt.datumCode = wkt.GEOGCS.DATUM.name.toLowerCase();
-                        } else {
-                            wkt.datumCode = wkt.GEOGCS.name.toLowerCase();
-                        }
-                        if (wkt.datumCode.slice(0, 2) === 'd_') {
-                            wkt.datumCode = wkt.datumCode.slice(2);
-                        }
-                        if (wkt.datumCode === 'new_zealand_geodetic_datum_1949' || wkt.datumCode === 'new_zealand_1949') {
-                            wkt.datumCode = 'nzgd49';
-                        }
-                        if (wkt.datumCode === 'wgs_1984') {
-                            if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') {
-                                wkt.sphere = true;
-                            }
-                            wkt.datumCode = 'wgs84';
-                        }
-                        if (wkt.datumCode.slice(-6) === '_ferro') {
-                            wkt.datumCode = wkt.datumCode.slice(0, -6);
-                        }
-                        if (wkt.datumCode.slice(-8) === '_jakarta') {
-                            wkt.datumCode = wkt.datumCode.slice(0, -8);
-                        }
-                        if (~wkt.datumCode.indexOf('belge')) {
-                            wkt.datumCode = 'rnb72';
-                        }
-                        if (wkt.GEOGCS.DATUM && wkt.GEOGCS.DATUM.SPHEROID) {
-                            wkt.ellps = wkt.GEOGCS.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\_18/, 'clrk');
-                            if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') {
-                                wkt.ellps = 'intl';
-                            }
-                            wkt.a = wkt.GEOGCS.DATUM.SPHEROID.a;
-                            wkt.rf = parseFloat(wkt.GEOGCS.DATUM.SPHEROID.rf, 10);
-                        }
-                        if (~wkt.datumCode.indexOf('osgb_1936')) {
-                            wkt.datumCode = 'osgb36';
-                        }
-                    }
-                    if (wkt.b && !isFinite(wkt.b)) {
-                        wkt.b = wkt.a;
-                    }
-                    function toMeter(input) {
-                        var ratio = wkt.to_meter || 1;
-                        return parseFloat(input, 10) * ratio;
-                    }
-                    var renamer = function (a) {
-                        return rename(wkt, a);
-                    };
-                    var list = [
-                        [
-                            'standard_parallel_1',
-                            'Standard_Parallel_1'
-                        ],
-                        [
-                            'standard_parallel_2',
-                            'Standard_Parallel_2'
-                        ],
-                        [
-                            'false_easting',
-                            'False_Easting'
-                        ],
-                        [
-                            'false_northing',
-                            'False_Northing'
-                        ],
-                        [
-                            'central_meridian',
-                            'Central_Meridian'
-                        ],
-                        [
-                            'latitude_of_origin',
-                            'Latitude_Of_Origin'
-                        ],
-                        [
-                            'scale_factor',
-                            'Scale_Factor'
-                        ],
-                        [
-                            'k0',
-                            'scale_factor'
-                        ],
-                        [
-                            'latitude_of_center',
-                            'Latitude_of_center'
-                        ],
-                        [
-                            'lat0',
-                            'latitude_of_center',
-                            d2r
-                        ],
-                        [
-                            'longitude_of_center',
-                            'Longitude_Of_Center'
-                        ],
-                        [
-                            'longc',
-                            'longitude_of_center',
-                            d2r
-                        ],
-                        [
-                            'x0',
-                            'false_easting',
-                            toMeter
-                        ],
-                        [
-                            'y0',
-                            'false_northing',
-                            toMeter
-                        ],
-                        [
-                            'long0',
-                            'central_meridian',
-                            d2r
-                        ],
-                        [
-                            'lat0',
-                            'latitude_of_origin',
-                            d2r
-                        ],
-                        [
-                            'lat0',
-                            'standard_parallel_1',
-                            d2r
-                        ],
-                        [
-                            'lat1',
-                            'standard_parallel_1',
-                            d2r
-                        ],
-                        [
-                            'lat2',
-                            'standard_parallel_2',
-                            d2r
-                        ],
-                        [
-                            'alpha',
-                            'azimuth',
-                            d2r
-                        ],
-                        [
-                            'srsCode',
-                            'name'
-                        ]
-                    ];
-                    list.forEach(renamer);
-                    if (!wkt.long0 && wkt.longc && (wkt.PROJECTION === 'Albers_Conic_Equal_Area' || wkt.PROJECTION === 'Lambert_Azimuthal_Equal_Area')) {
-                        wkt.long0 = wkt.longc;
-                    }
-                }
-                module.exports = function (wkt, self) {
-                    var lisp = JSON.parse((',' + wkt).replace(/\s*\,\s*([A-Z_0-9]+?)(\[)/g, ',["$1",').slice(1).replace(/\s*\,\s*([A-Z_0-9]+?)\]/g, ',"$1"]'));
-                    var type = lisp.shift();
-                    var name = lisp.shift();
-                    lisp.unshift([
-                        'name',
-                        name
-                    ]);
-                    lisp.unshift([
-                        'type',
-                        type
-                    ]);
-                    lisp.unshift('output');
-                    var obj = {};
-                    sExpr(lisp, obj);
-                    cleanWKT(obj.output);
-                    return extend(self, obj.output);
-                };
-                return exports;
-            },
-            { './extend': 33 }
-        ],
-        66: [
-            function (_dereq_, module, exports) {
-                var NUM_100K_SETS = 6;
-                var SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS';
-                var SET_ORIGIN_ROW_LETTERS = 'AFAFAF';
-                var A = 65;
-                var I = 73;
-                var O = 79;
-                var V = 86;
-                var Z = 90;
-                exports.forward = function (ll, accuracy) {
-                    accuracy = accuracy || 5;
-                    return encode(LLtoUTM({
-                        lat: ll[1],
-                        lon: ll[0]
-                    }), accuracy);
-                };
-                exports.inverse = function (mgrs) {
-                    var bbox = UTMtoLL(decode(mgrs.toUpperCase()));
-                    return [
-                        bbox.left,
-                        bbox.bottom,
-                        bbox.right,
-                        bbox.top
-                    ];
-                };
-                exports.toPoint = function (mgrsStr) {
-                    var llbbox = exports.inverse(mgrsStr);
-                    return [
-                        (llbbox[2] + llbbox[0]) / 2,
-                        (llbbox[3] + llbbox[1]) / 2
-                    ];
-                };
-                function degToRad(deg) {
-                    return deg * (Math.PI / 180);
-                }
-                function radToDeg(rad) {
-                    return 180 * (rad / Math.PI);
-                }
-                function LLtoUTM(ll) {
-                    var Lat = ll.lat;
-                    var Long = ll.lon;
-                    var a = 6378137;
-                    var eccSquared = 0.00669438;
-                    var k0 = 0.9996;
-                    var LongOrigin;
-                    var eccPrimeSquared;
-                    var N, T, C, A, M;
-                    var LatRad = degToRad(Lat);
-                    var LongRad = degToRad(Long);
-                    var LongOriginRad;
-                    var ZoneNumber;
-                    ZoneNumber = Math.floor((Long + 180) / 6) + 1;
-                    if (Long === 180) {
-                        ZoneNumber = 60;
-                    }
-                    if (Lat >= 56 && Lat < 64 && Long >= 3 && Long < 12) {
-                        ZoneNumber = 32;
-                    }
-                    if (Lat >= 72 && Lat < 84) {
-                        if (Long >= 0 && Long < 9) {
-                            ZoneNumber = 31;
-                        } else if (Long >= 9 && Long < 21) {
-                            ZoneNumber = 33;
-                        } else if (Long >= 21 && Long < 33) {
-                            ZoneNumber = 35;
-                        } else if (Long >= 33 && Long < 42) {
-                            ZoneNumber = 37;
-                        }
-                    }
-                    LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3;
-                    LongOriginRad = degToRad(LongOrigin);
-                    eccPrimeSquared = eccSquared / (1 - eccSquared);
-                    N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad));
-                    T = Math.tan(LatRad) * Math.tan(LatRad);
-                    C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad);
-                    A = Math.cos(LatRad) * (LongRad - LongOriginRad);
-                    M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - 35 * eccSquared * eccSquared * eccSquared / 3072 * Math.sin(6 * LatRad));
-                    var UTMEasting = k0 * N * (A + (1 - T + C) * A * A * A / 6 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120) + 500000;
-                    var UTMNorthing = k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720));
-                    if (Lat < 0) {
-                        UTMNorthing += 10000000;
-                    }
-                    return {
-                        northing: Math.round(UTMNorthing),
-                        easting: Math.round(UTMEasting),
-                        zoneNumber: ZoneNumber,
-                        zoneLetter: getLetterDesignator(Lat)
-                    };
-                }
-                function UTMtoLL(utm) {
-                    var UTMNorthing = utm.northing;
-                    var UTMEasting = utm.easting;
-                    var zoneLetter = utm.zoneLetter;
-                    var zoneNumber = utm.zoneNumber;
-                    if (zoneNumber < 0 || zoneNumber > 60) {
-                        return null;
-                    }
-                    var k0 = 0.9996;
-                    var a = 6378137;
-                    var eccSquared = 0.00669438;
-                    var eccPrimeSquared;
-                    var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared));
-                    var N1, T1, C1, R1, D, M;
-                    var LongOrigin;
-                    var mu, phi1Rad;
-                    var x = UTMEasting - 500000;
-                    var y = UTMNorthing;
-                    if (zoneLetter < 'N') {
-                        y -= 10000000;
-                    }
-                    LongOrigin = (zoneNumber - 1) * 6 - 180 + 3;
-                    eccPrimeSquared = eccSquared / (1 - eccSquared);
-                    M = y / k0;
-                    mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256));
-                    phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + 151 * e1 * e1 * e1 / 96 * Math.sin(6 * mu);
-                    N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad));
-                    T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad);
-                    C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad);
-                    R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5);
-                    D = x / (N1 * k0);
-                    var lat = phi1Rad - N1 * Math.tan(phi1Rad) / R1 * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720);
-                    lat = radToDeg(lat);
-                    var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad);
-                    lon = LongOrigin + radToDeg(lon);
-                    var result;
-                    if (utm.accuracy) {
-                        var topRight = UTMtoLL({
-                            northing: utm.northing + utm.accuracy,
-                            easting: utm.easting + utm.accuracy,
-                            zoneLetter: utm.zoneLetter,
-                            zoneNumber: utm.zoneNumber
-                        });
-                        result = {
-                            top: topRight.lat,
-                            right: topRight.lon,
-                            bottom: lat,
-                            left: lon
-                        };
-                    } else {
-                        result = {
-                            lat: lat,
-                            lon: lon
-                        };
-                    }
-                    return result;
-                }
-                function getLetterDesignator(lat) {
-                    var LetterDesignator = 'Z';
-                    if (84 >= lat && lat >= 72) {
-                        LetterDesignator = 'X';
-                    } else if (72 > lat && lat >= 64) {
-                        LetterDesignator = 'W';
-                    } else if (64 > lat && lat >= 56) {
-                        LetterDesignator = 'V';
-                    } else if (56 > lat && lat >= 48) {
-                        LetterDesignator = 'U';
-                    } else if (48 > lat && lat >= 40) {
-                        LetterDesignator = 'T';
-                    } else if (40 > lat && lat >= 32) {
-                        LetterDesignator = 'S';
-                    } else if (32 > lat && lat >= 24) {
-                        LetterDesignator = 'R';
-                    } else if (24 > lat && lat >= 16) {
-                        LetterDesignator = 'Q';
-                    } else if (16 > lat && lat >= 8) {
-                        LetterDesignator = 'P';
-                    } else if (8 > lat && lat >= 0) {
-                        LetterDesignator = 'N';
-                    } else if (0 > lat && lat >= -8) {
-                        LetterDesignator = 'M';
-                    } else if (-8 > lat && lat >= -16) {
-                        LetterDesignator = 'L';
-                    } else if (-16 > lat && lat >= -24) {
-                        LetterDesignator = 'K';
-                    } else if (-24 > lat && lat >= -32) {
-                        LetterDesignator = 'J';
-                    } else if (-32 > lat && lat >= -40) {
-                        LetterDesignator = 'H';
-                    } else if (-40 > lat && lat >= -48) {
-                        LetterDesignator = 'G';
-                    } else if (-48 > lat && lat >= -56) {
-                        LetterDesignator = 'F';
-                    } else if (-56 > lat && lat >= -64) {
-                        LetterDesignator = 'E';
-                    } else if (-64 > lat && lat >= -72) {
-                        LetterDesignator = 'D';
-                    } else if (-72 > lat && lat >= -80) {
-                        LetterDesignator = 'C';
-                    }
-                    return LetterDesignator;
-                }
-                function encode(utm, accuracy) {
-                    var seasting = '' + utm.easting, snorthing = '' + utm.northing;
-                    return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy);
-                }
-                function get100kID(easting, northing, zoneNumber) {
-                    var setParm = get100kSetForZone(zoneNumber);
-                    var setColumn = Math.floor(easting / 100000);
-                    var setRow = Math.floor(northing / 100000) % 20;
-                    return getLetter100kID(setColumn, setRow, setParm);
-                }
-                function get100kSetForZone(i) {
-                    var setParm = i % NUM_100K_SETS;
-                    if (setParm === 0) {
-                        setParm = NUM_100K_SETS;
-                    }
-                    return setParm;
-                }
-                function getLetter100kID(column, row, parm) {
-                    var index = parm - 1;
-                    var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index);
-                    var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index);
-                    var colInt = colOrigin + column - 1;
-                    var rowInt = rowOrigin + row;
-                    var rollover = false;
-                    if (colInt > Z) {
-                        colInt = colInt - Z + A - 1;
-                        rollover = true;
-                    }
-                    if (colInt === I || colOrigin < I && colInt > I || (colInt > I || colOrigin < I) && rollover) {
-                        colInt++;
-                    }
-                    if (colInt === O || colOrigin < O && colInt > O || (colInt > O || colOrigin < O) && rollover) {
-                        colInt++;
-                        if (colInt === I) {
-                            colInt++;
-                        }
-                    }
-                    if (colInt > Z) {
-                        colInt = colInt - Z + A - 1;
-                    }
-                    if (rowInt > V) {
-                        rowInt = rowInt - V + A - 1;
-                        rollover = true;
-                    } else {
-                        rollover = false;
-                    }
-                    if (rowInt === I || rowOrigin < I && rowInt > I || (rowInt > I || rowOrigin < I) && rollover) {
-                        rowInt++;
-                    }
-                    if (rowInt === O || rowOrigin < O && rowInt > O || (rowInt > O || rowOrigin < O) && rollover) {
-                        rowInt++;
-                        if (rowInt === I) {
-                            rowInt++;
-                        }
-                    }
-                    if (rowInt > V) {
-                        rowInt = rowInt - V + A - 1;
-                    }
-                    var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt);
-                    return twoLetter;
-                }
-                function decode(mgrsString) {
-                    if (mgrsString && mgrsString.length === 0) {
-                        throw 'MGRSPoint coverting from nothing';
-                    }
-                    var length = mgrsString.length;
-                    var hunK = null;
-                    var sb = '';
-                    var testChar;
-                    var i = 0;
-                    while (!/[A-Z]/.test(testChar = mgrsString.charAt(i))) {
-                        if (i >= 2) {
-                            throw 'MGRSPoint bad conversion from: ' + mgrsString;
-                        }
-                        sb += testChar;
-                        i++;
-                    }
-                    var zoneNumber = parseInt(sb, 10);
-                    if (i === 0 || i + 3 > length) {
-                        throw 'MGRSPoint bad conversion from: ' + mgrsString;
-                    }
-                    var zoneLetter = mgrsString.charAt(i++);
-                    if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') {
-                        throw 'MGRSPoint zone letter ' + zoneLetter + ' not handled: ' + mgrsString;
-                    }
-                    hunK = mgrsString.substring(i, i += 2);
-                    var set = get100kSetForZone(zoneNumber);
-                    var east100k = getEastingFromChar(hunK.charAt(0), set);
-                    var north100k = getNorthingFromChar(hunK.charAt(1), set);
-                    while (north100k < getMinNorthing(zoneLetter)) {
-                        north100k += 2000000;
-                    }
-                    var remainder = length - i;
-                    if (remainder % 2 !== 0) {
-                        throw 'MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters' + mgrsString;
-                    }
-                    var sep = remainder / 2;
-                    var sepEasting = 0;
-                    var sepNorthing = 0;
-                    var accuracyBonus, sepEastingString, sepNorthingString, easting, northing;
-                    if (sep > 0) {
-                        accuracyBonus = 100000 / Math.pow(10, sep);
-                        sepEastingString = mgrsString.substring(i, i + sep);
-                        sepEasting = parseFloat(sepEastingString) * accuracyBonus;
-                        sepNorthingString = mgrsString.substring(i + sep);
-                        sepNorthing = parseFloat(sepNorthingString) * accuracyBonus;
-                    }
-                    easting = sepEasting + east100k;
-                    northing = sepNorthing + north100k;
-                    return {
-                        easting: easting,
-                        northing: northing,
-                        zoneLetter: zoneLetter,
-                        zoneNumber: zoneNumber,
-                        accuracy: accuracyBonus
-                    };
-                }
-                function getEastingFromChar(e, set) {
-                    var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1);
-                    var eastingValue = 100000;
-                    var rewindMarker = false;
-                    while (curCol !== e.charCodeAt(0)) {
-                        curCol++;
-                        if (curCol === I) {
-                            curCol++;
-                        }
-                        if (curCol === O) {
-                            curCol++;
-                        }
-                        if (curCol > Z) {
-                            if (rewindMarker) {
-                                throw 'Bad character: ' + e;
-                            }
-                            curCol = A;
-                            rewindMarker = true;
-                        }
-                        eastingValue += 100000;
-                    }
-                    return eastingValue;
-                }
-                function getNorthingFromChar(n, set) {
-                    if (n > 'V') {
-                        throw 'MGRSPoint given invalid Northing ' + n;
-                    }
-                    var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1);
-                    var northingValue = 0;
-                    var rewindMarker = false;
-                    while (curRow !== n.charCodeAt(0)) {
-                        curRow++;
-                        if (curRow === I) {
-                            curRow++;
-                        }
-                        if (curRow === O) {
-                            curRow++;
-                        }
-                        if (curRow > V) {
-                            if (rewindMarker) {
-                                throw 'Bad character: ' + n;
-                            }
-                            curRow = A;
-                            rewindMarker = true;
-                        }
-                        northingValue += 100000;
-                    }
-                    return northingValue;
-                }
-                function getMinNorthing(zoneLetter) {
-                    var northing;
-                    switch (zoneLetter) {
-                    case 'C':
-                        northing = 1100000;
-                        break;
-                    case 'D':
-                        northing = 2000000;
-                        break;
-                    case 'E':
-                        northing = 2800000;
-                        break;
-                    case 'F':
-                        northing = 3700000;
-                        break;
-                    case 'G':
-                        northing = 4600000;
-                        break;
-                    case 'H':
-                        northing = 5500000;
-                        break;
-                    case 'J':
-                        northing = 6400000;
-                        break;
-                    case 'K':
-                        northing = 7300000;
-                        break;
-                    case 'L':
-                        northing = 8200000;
-                        break;
-                    case 'M':
-                        northing = 9100000;
-                        break;
-                    case 'N':
-                        northing = 0;
-                        break;
-                    case 'P':
-                        northing = 800000;
-                        break;
-                    case 'Q':
-                        northing = 1700000;
-                        break;
-                    case 'R':
-                        northing = 2600000;
-                        break;
-                    case 'S':
-                        northing = 3500000;
-                        break;
-                    case 'T':
-                        northing = 4400000;
-                        break;
-                    case 'U':
-                        northing = 5300000;
-                        break;
-                    case 'V':
-                        northing = 6200000;
-                        break;
-                    case 'W':
-                        northing = 7000000;
-                        break;
-                    case 'X':
-                        northing = 7900000;
-                        break;
-                    default:
-                        northing = -1;
-                    }
-                    if (northing >= 0) {
-                        return northing;
-                    } else {
-                        throw 'Invalid zone letter: ' + zoneLetter;
-                    }
-                }
-                return exports;
-            },
-            {}
-        ],
-        67: [
-            function (_dereq_, module, exports) {
-                module.exports = {
-                    'name': 'proj4',
-                    'version': '2.2.1',
-                    'description': 'Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.',
-                    'main': 'lib/index.js',
-                    'directories': {
-                        'test': 'test',
-                        'doc': 'docs'
-                    },
-                    'scripts': { 'test': './node_modules/istanbul/lib/cli.js test ./node_modules/mocha/bin/_mocha test/test.js' },
-                    'repository': {
-                        'type': 'git',
-                        'url': 'git://github.com/proj4js/proj4js.git'
-                    },
-                    'author': '',
-                    'license': 'MIT',
-                    'jam': {
-                        'main': 'dist/proj4.js',
-                        'include': [
-                            'dist/proj4.js',
-                            'README.md',
-                            'AUTHORS',
-                            'LICENSE.md'
-                        ]
-                    },
-                    'devDependencies': {
-                        'grunt-cli': '~0.1.13',
-                        'grunt': '~0.4.2',
-                        'grunt-contrib-connect': '~0.6.0',
-                        'grunt-contrib-jshint': '~0.8.0',
-                        'chai': '~1.8.1',
-                        'mocha': '~1.17.1',
-                        'grunt-mocha-phantomjs': '~0.4.0',
-                        'browserify': '~3.24.5',
-                        'grunt-browserify': '~1.3.0',
-                        'grunt-contrib-uglify': '~0.3.2',
-                        'curl': 'git://github.com/cujojs/curl.git',
-                        'istanbul': '~0.2.4',
-                        'tin': '~0.4.0'
-                    },
-                    'dependencies': { 'mgrs': '0.0.0' }
-                };
-                return exports;
-            },
-            {}
-        ],
-        './includedProjections': [
-            function (_dereq_, module, exports) {
-                module.exports = _dereq_('gWUPNW');
-                return exports;
-            },
-            {}
-        ],
-        'gWUPNW': [
-            function (_dereq_, module, exports) {
-                var projs = [
-                    _dereq_('./lib/projections/tmerc'),
-                    _dereq_('./lib/projections/utm'),
-                    _dereq_('./lib/projections/sterea'),
-                    _dereq_('./lib/projections/stere'),
-                    _dereq_('./lib/projections/somerc'),
-                    _dereq_('./lib/projections/omerc'),
-                    _dereq_('./lib/projections/lcc'),
-                    _dereq_('./lib/projections/krovak'),
-                    _dereq_('./lib/projections/cass'),
-                    _dereq_('./lib/projections/laea'),
-                    _dereq_('./lib/projections/aea'),
-                    _dereq_('./lib/projections/gnom'),
-                    _dereq_('./lib/projections/cea'),
-                    _dereq_('./lib/projections/eqc'),
-                    _dereq_('./lib/projections/poly'),
-                    _dereq_('./lib/projections/nzmg'),
-                    _dereq_('./lib/projections/mill'),
-                    _dereq_('./lib/projections/sinu'),
-                    _dereq_('./lib/projections/moll'),
-                    _dereq_('./lib/projections/eqdc'),
-                    _dereq_('./lib/projections/vandg'),
-                    _dereq_('./lib/projections/aeqd')
-                ];
-                module.exports = function (proj4) {
-                    projs.forEach(function (proj) {
-                        proj4.Proj.projections.add(proj);
-                    });
-                };
-                return exports;
-            },
-            {
-                './lib/projections/aea': 39,
-                './lib/projections/aeqd': 40,
-                './lib/projections/cass': 41,
-                './lib/projections/cea': 42,
-                './lib/projections/eqc': 43,
-                './lib/projections/eqdc': 44,
-                './lib/projections/gnom': 46,
-                './lib/projections/krovak': 47,
-                './lib/projections/laea': 48,
-                './lib/projections/lcc': 49,
-                './lib/projections/mill': 52,
-                './lib/projections/moll': 53,
-                './lib/projections/nzmg': 54,
-                './lib/projections/omerc': 55,
-                './lib/projections/poly': 56,
-                './lib/projections/sinu': 57,
-                './lib/projections/somerc': 58,
-                './lib/projections/stere': 59,
-                './lib/projections/sterea': 60,
-                './lib/projections/tmerc': 61,
-                './lib/projections/utm': 62,
-                './lib/projections/vandg': 63
-            }
-        ]
-    }, {}, [35])(35);
-});
-!function (root, factory) {
-    if (true) {
-        proj4leaflet07x = function (leaflet, proj4) {
-            return typeof factory === 'function' ? factory(leaflet, proj4) : factory;
-        }(leaflet, proj4);
-    } else if (typeof module === 'object' && typeof module.exports === 'object') {
-        L = leaflet;
-        proj4 = proj4;
-        module.exports = factory(L, proj4);
-    } else {
-        if (typeof root.L === 'undefined' || typeof root.proj4 === 'undefined')
-            throw 'Leaflet and proj4 must be loaded first';
-        factory(root.L, root.proj4);
-    }
-}(this, function (L, proj4) {
-    L.Proj = {};
-    L.Proj._isProj4Obj = function (a) {
-        return typeof a.inverse !== 'undefined' && typeof a.forward !== 'undefined';
-    };
-    L.Proj.ScaleDependantTransformation = function (scaleTransforms) {
-        this.scaleTransforms = scaleTransforms;
-    };
-    L.Proj.ScaleDependantTransformation.prototype.transform = function (point, scale) {
-        return this.scaleTransforms[scale].transform(point, scale);
-    };
-    L.Proj.ScaleDependantTransformation.prototype.untransform = function (point, scale) {
-        return this.scaleTransforms[scale].untransform(point, scale);
-    };
-    L.Proj.Projection = L.Class.extend({
-        initialize: function (a, def) {
-            if (L.Proj._isProj4Obj(a)) {
-                this._proj = a;
-            } else {
-                var code = a;
-                if (def) {
-                    proj4.defs(code, def);
-                } else if (proj4.defs[code] === undefined) {
-                    var urn = code.split(':');
-                    if (urn.length > 3) {
-                        code = urn[urn.length - 3] + ':' + urn[urn.length - 1];
-                    }
-                    if (proj4.defs[code] === undefined) {
-                        throw 'No projection definition for code ' + code;
-                    }
-                }
-                this._proj = proj4(code);
-            }
-        },
-        project: function (latlng) {
-            var point = this._proj.forward([
-                latlng.lng,
-                latlng.lat
-            ]);
-            return new L.Point(point[0], point[1]);
-        },
-        unproject: function (point, unbounded) {
-            var point2 = this._proj.inverse([
-                point.x,
-                point.y
-            ]);
-            return new L.LatLng(point2[1], point2[0], unbounded);
-        }
-    });
-    L.Proj.CRS = L.Class.extend({
-        includes: L.CRS,
-        options: { transformation: new L.Transformation(1, 0, -1, 0) },
-        initialize: function (a, b, c) {
-            var code, proj, def, options;
-            if (L.Proj._isProj4Obj(a)) {
-                proj = a;
-                code = proj.srsCode;
-                options = b || {};
-                this.projection = new L.Proj.Projection(proj);
-            } else {
-                code = a;
-                def = b;
-                options = c || {};
-                this.projection = new L.Proj.Projection(code, def);
-            }
-            L.Util.setOptions(this, options);
-            this.code = code;
-            this.transformation = this.options.transformation;
-            if (this.options.origin) {
-                this.transformation = new L.Transformation(1, -this.options.origin[0], -1, this.options.origin[1]);
-            }
-            if (this.options.scales) {
-                this._scales = this.options.scales;
-            } else if (this.options.resolutions) {
-                this._scales = [];
-                for (var i = this.options.resolutions.length - 1; i >= 0; i--) {
-                    if (this.options.resolutions[i]) {
-                        this._scales[i] = 1 / this.options.resolutions[i];
-                    }
-                }
-            }
-        },
-        scale: function (zoom) {
-            var iZoom = Math.floor(zoom), baseScale, nextScale, scaleDiff, zDiff;
-            if (zoom === iZoom) {
-                return this._scales[zoom];
-            } else {
-                baseScale = this._scales[iZoom];
-                nextScale = this._scales[iZoom + 1];
-                scaleDiff = nextScale - baseScale;
-                zDiff = zoom - iZoom;
-                return baseScale + scaleDiff * zDiff;
-            }
-        },
-        getSize: function (zoom) {
-            var b = this.options.bounds, s, min, max;
-            if (b) {
-                s = this.scale(zoom);
-                min = this.transformation.transform(b.min, s);
-                max = this.transformation.transform(b.max, s);
-                return L.point(Math.abs(max.x - min.x), Math.abs(max.y - min.y));
-            } else {
-                s = 256 * Math.pow(2, zoom);
-                return L.point(s, s);
-            }
-        }
-    });
-    L.Proj.CRS.TMS = L.Proj.CRS.extend({
-        options: { tileSize: 256 },
-        initialize: function (a, b, c, d) {
-            var code, def, proj, projectedBounds, options;
-            if (L.Proj._isProj4Obj(a)) {
-                proj = a;
-                projectedBounds = b;
-                options = c || {};
-                options.origin = [
-                    projectedBounds[0],
-                    projectedBounds[3]
-                ];
-                L.Proj.CRS.prototype.initialize.call(this, proj, options);
-            } else {
-                code = a;
-                def = b;
-                projectedBounds = c;
-                options = d || {};
-                options.origin = [
-                    projectedBounds[0],
-                    projectedBounds[3]
-                ];
-                L.Proj.CRS.prototype.initialize.call(this, code, def, options);
-            }
-            this.projectedBounds = projectedBounds;
-            this._sizes = this._calculateSizes();
-        },
-        _calculateSizes: function () {
-            var sizes = [], crsBounds = this.projectedBounds, projectedTileSize, i, x, y;
-            for (i = this._scales.length - 1; i >= 0; i--) {
-                if (this._scales[i]) {
-                    projectedTileSize = this.options.tileSize / this._scales[i];
-                    x = Math.ceil(parseFloat((crsBounds[2] - crsBounds[0]) / projectedTileSize).toPrecision(3)) * projectedTileSize * this._scales[i];
-                    y = Math.ceil(parseFloat((crsBounds[3] - crsBounds[1]) / projectedTileSize).toPrecision(3)) * projectedTileSize * this._scales[i];
-                    sizes[i] = L.point(x, y);
-                }
-            }
-            return sizes;
-        },
-        getSize: function (zoom) {
-            return this._sizes[zoom];
-        }
-    });
-    L.Proj.TileLayer = {};
-    L.Proj.TileLayer.TMS = L.TileLayer.extend({
-        options: { continuousWorld: true },
-        initialize: function (urlTemplate, crs, options) {
-            var boundsMatchesGrid = true, scaleTransforms, upperY, crsBounds, i;
-            if (!(crs instanceof L.Proj.CRS.TMS)) {
-                throw 'CRS is not L.Proj.CRS.TMS.';
-            }
-            L.TileLayer.prototype.initialize.call(this, urlTemplate, options);
-            this.options.tms = false;
-            this.crs = crs;
-            crsBounds = this.crs.projectedBounds;
-            for (i = this.options.minZoom; i < this.options.maxZoom && boundsMatchesGrid; i++) {
-                var gridHeight = (crsBounds[3] - crsBounds[1]) / this._projectedTileSize(i);
-                boundsMatchesGrid = Math.abs(gridHeight - Math.round(gridHeight)) > 0.001;
-            }
-            if (!boundsMatchesGrid) {
-                scaleTransforms = {};
-                for (i = this.options.minZoom; i < this.options.maxZoom; i++) {
-                    upperY = crsBounds[1] + Math.ceil((crsBounds[3] - crsBounds[1]) / this._projectedTileSize(i)) * this._projectedTileSize(i);
-                    scaleTransforms[this.crs.scale(i)] = new L.Transformation(1, -crsBounds[0], -1, upperY);
-                }
-                this.crs = new L.Proj.CRS.TMS(this.crs.projection._proj, crsBounds, this.crs.options);
-                this.crs.transformation = new L.Proj.ScaleDependantTransformation(scaleTransforms);
-            }
-        },
-        getTileUrl: function (tilePoint) {
-            var zoom = this._map.getZoom(), gridHeight = Math.ceil((this.crs.projectedBounds[3] - this.crs.projectedBounds[1]) / this._projectedTileSize(zoom));
-            return L.Util.template(this._url, L.Util.extend({
-                s: this._getSubdomain(tilePoint),
-                z: this._getZoomForUrl(),
-                x: tilePoint.x,
-                y: gridHeight - tilePoint.y - 1
-            }, this.options));
-        },
-        _projectedTileSize: function (zoom) {
-            return this.options.tileSize / this.crs.scale(zoom);
-        }
-    });
-    L.Proj.GeoJSON = L.GeoJSON.extend({
-        initialize: function (geojson, options) {
-            this._callLevel = 0;
-            L.GeoJSON.prototype.initialize.call(this, null, options);
-            if (geojson) {
-                this.addData(geojson);
-            }
-        },
-        addData: function (geojson) {
-            var crs;
-            if (geojson) {
-                if (geojson.crs && geojson.crs.type === 'name') {
-                    crs = new L.Proj.CRS(geojson.crs.properties.name);
-                } else if (geojson.crs && geojson.crs.type) {
-                    crs = new L.Proj.CRS(geojson.crs.type + ':' + geojson.crs.properties.code);
-                }
-                if (crs !== undefined) {
-                    this.options.coordsToLatLng = function (coords) {
-                        var point = L.point(coords[0], coords[1]);
-                        return crs.projection.unproject(point);
-                    };
-                }
-            }
-            this._callLevel++;
-            try {
-                L.GeoJSON.prototype.addData.call(this, geojson);
-            } finally {
-                this._callLevel--;
-                if (this._callLevel === 0) {
-                    delete this.options.coordsToLatLng;
-                }
-            }
-        }
-    });
-    L.Proj.geoJson = function (geojson, options) {
-        return new L.Proj.GeoJSON(geojson, options);
-    };
-    L.Proj.ImageOverlay = L.ImageOverlay.extend({
-        initialize: function (url, bounds, options) {
-            L.ImageOverlay.prototype.initialize.call(this, url, null, options);
-            this._projBounds = bounds;
-        },
-        _animateZoom: function (e) {
-            var northwest = L.point(this._projBounds.min.x, this._projBounds.max.y), southeast = L.point(this._projBounds.max.x, this._projBounds.min.y), topLeft = this._projectedToNewLayerPoint(northwest, e.zoom, e.center), size = this._projectedToNewLayerPoint(southeast, e.zoom, e.center).subtract(topLeft), origin = topLeft.add(size._multiplyBy((1 - 1 / e.scale) / 2));
-            this._image.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(origin) + ' scale(' + this._map.getZoomScale(e.zoom) + ') ';
-        },
-        _reset: function () {
-            var zoom = this._map.getZoom(), pixelOrigin = this._map.getPixelOrigin(), bounds = L.bounds(this._transform(this._projBounds.min, zoom)._subtract(pixelOrigin), this._transform(this._projBounds.max, zoom)._subtract(pixelOrigin)), size = bounds.getSize(), image = this._image;
-            L.DomUtil.setPosition(image, bounds.min);
-            image.style.width = size.x + 'px';
-            image.style.height = size.y + 'px';
-        },
-        _projectedToNewLayerPoint: function (point, newZoom, newCenter) {
-            var topLeft = this._map._getNewTopLeftPoint(newCenter, newZoom).add(this._map._getMapPanePos());
-            return this._transform(point, newZoom)._subtract(topLeft);
-        },
-        _transform: function (p, zoom) {
-            var crs = this._map.options.crs, transformation = crs.transformation, scale = crs.scale(zoom);
-            return transformation.transform(p, scale);
-        }
-    });
-    L.Proj.imageOverlay = function (url, bounds, options) {
-        return new L.Proj.ImageOverlay(url, bounds, options);
-    };
-    if (typeof L.CRS !== 'undefined') {
-        L.CRS.proj4js = function () {
-            return function (code, def, transformation, options) {
-                options = options || {};
-                if (transformation) {
-                    options.transformation = transformation;
-                }
-                return new L.Proj.CRS(code, def, options);
-            };
-        }();
-    }
-    return L.Proj;
-});
-!function (root, factory) {
-    if (true) {
-        proj4leaflet10x = function (leaflet, proj4) {
-            return typeof factory === 'function' ? factory(leaflet, proj4) : factory;
-        }(leaflet, proj4);
-    } else if (typeof module === 'object' && typeof module.exports === 'object') {
-        L = leaflet;
-        proj4 = proj4;
-        module.exports = factory(L, proj4);
-    } else {
-        if (typeof root.L === 'undefined' || typeof root.proj4 === 'undefined')
-            throw 'Leaflet and proj4 must be loaded first';
-        factory(root.L, root.proj4);
-    }
-}(this, function (L, proj4) {
-    L.Proj = {};
-    L.Proj._isProj4Obj = function (a) {
-        return typeof a.inverse !== 'undefined' && typeof a.forward !== 'undefined';
-    };
-    L.Proj.Projection = L.Class.extend({
-        initialize: function (code, def, bounds) {
-            var isP4 = L.Proj._isProj4Obj(code);
-            this._proj = isP4 ? code : this._projFromCodeDef(code, def);
-            this.bounds = isP4 ? def : bounds;
-        },
-        project: function (latlng) {
-            var point = this._proj.forward([
-                latlng.lng,
-                latlng.lat
-            ]);
-            return new L.Point(point[0], point[1]);
-        },
-        unproject: function (point, unbounded) {
-            var point2 = this._proj.inverse([
-                point.x,
-                point.y
-            ]);
-            return new L.LatLng(point2[1], point2[0], unbounded);
-        },
-        _projFromCodeDef: function (code, def) {
-            if (def) {
-                proj4.defs(code, def);
-            } else if (proj4.defs[code] === undefined) {
-                var urn = code.split(':');
-                if (urn.length > 3) {
-                    code = urn[urn.length - 3] + ':' + urn[urn.length - 1];
-                }
-                if (proj4.defs[code] === undefined) {
-                    throw 'No projection definition for code ' + code;
-                }
-            }
-            return proj4(code);
-        }
-    });
-    L.Proj.CRS = L.Class.extend({
-        includes: L.CRS,
-        options: { transformation: new L.Transformation(1, 0, -1, 0) },
-        initialize: function (a, b, c) {
-            var code, proj, def, options;
-            if (L.Proj._isProj4Obj(a)) {
-                proj = a;
-                code = proj.srsCode;
-                options = b || {};
-                this.projection = new L.Proj.Projection(proj, options.bounds);
-            } else {
-                code = a;
-                def = b;
-                options = c || {};
-                this.projection = new L.Proj.Projection(code, def, options.bounds);
-            }
-            L.Util.setOptions(this, options);
-            this.code = code;
-            this.transformation = this.options.transformation;
-            if (this.options.origin) {
-                this.transformation = new L.Transformation(1, -this.options.origin[0], -1, this.options.origin[1]);
-            }
-            if (this.options.scales) {
-                this._scales = this.options.scales;
-            } else if (this.options.resolutions) {
-                this._scales = [];
-                for (var i = this.options.resolutions.length - 1; i >= 0; i--) {
-                    if (this.options.resolutions[i]) {
-                        this._scales[i] = 1 / this.options.resolutions[i];
-                    }
-                }
-            }
-            this.infinite = !this.options.bounds;
-        },
-        scale: function (zoom) {
-            var iZoom = Math.floor(zoom), baseScale, nextScale, scaleDiff, zDiff;
-            if (zoom === iZoom) {
-                return this._scales[zoom];
-            } else {
-                baseScale = this._scales[iZoom];
-                nextScale = this._scales[iZoom + 1];
-                scaleDiff = nextScale - baseScale;
-                zDiff = zoom - iZoom;
-                return baseScale + scaleDiff * zDiff;
-            }
-        },
-        zoom: function (scale) {
-            var downScale = this._closestElement(this._scales, scale), downZoom = this._scales.indexOf(downScale), nextZoom, scaleDiff;
-            if (scale === downScale) {
-                return downZoom;
-            }
-            nextZoom = downZoom + 1;
-            scaleDiff = this._scales[nextZoom] - downScale;
-            return (scale - downScale) / scaleDiff + downZoom;
-        },
-        _closestElement: function (array, element) {
-            var low;
-            for (var i = array.length; i--;) {
-                if (array[i] <= element && (low === undefined || low < array[i])) {
-                    low = array[i];
-                }
-            }
-            return low;
-        }
-    });
-    L.Proj.GeoJSON = L.GeoJSON.extend({
-        initialize: function (geojson, options) {
-            if (geojson.crs && geojson.crs.type === 'name') {
-                var crs = new L.Proj.CRS(geojson.crs.properties.name);
-                options = options || {};
-                options.coordsToLatLng = function (coords) {
-                    var point = L.point(coords[0], coords[1]);
-                    return crs.projection.unproject(point);
-                };
-            }
-            L.GeoJSON.prototype.initialize.call(this, geojson, options);
-        }
-    });
-    L.Proj.geoJson = function (geojson, options) {
-        return new L.Proj.GeoJSON(geojson, options);
-    };
-    return L.Proj;
-});
-LeafletCRSProj4Leaflet = function (require, L, proj4) {
-    return {
-        load: function () {
-            console.log('loading lib proj4leaflet ...');
-            var proj4leaflet = null;
-            if (L.version.lastIndexOf('0.7', 0) === 0) {
-                proj4leaflet = proj4leaflet07x;
-                console.log('loaded version for leaflet 0.7.7 ...');
-            } else if (L.version.lastIndexOf('1.0', 0) === 0) {
-                proj4leaflet = proj4leaflet10x;
-                console.log('loaded version for leaflet 1.0.0 ...');
-            } else {
-                console.log('version leaflet incompatible !');
-                return;
-            }
-            L.Proj = proj4leaflet;
-            return L.Proj;
-        }
-    };
-}({}, leaflet, proj4);
-CommonUtilsRegister = function (proj4) {
-    var Register = {
-        isLoaded: false,
-        get: function (name) {
-            if (name === '' || name === null || typeof name === 'undefined') {
-                return;
-            }
-            var s = name.split(':');
-            if (s.length !== 2) {
-                return;
-            }
-            var register = s[0];
-            var code = s[1];
-            if (!this.hasOwnProperty(register)) {
-                return;
-            }
-            if (!this[register].hasOwnProperty(code)) {
-                return;
-            }
-            return this[register][code];
-        },
-        load: function () {
-            if (!this.isLoaded) {
-                var registers = [
-                    'IGNF',
-                    'EPSG',
-                    'CRS'
-                ];
-                for (var i = 0; i < registers.length; i++) {
-                    var register = registers[i];
-                    var codes = this[register];
-                    for (var code in codes) {
-                        if (codes.hasOwnProperty(code)) {
-                            var name = register + ':' + code;
-                            proj4.defs(name, this.get(name));
-                        }
-                    }
-                }
-                this.isLoaded = true;
-            }
-        },
-        EPSG: {
-            4149: '+title=CH1903 +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs ',
-            4150: '+title=CH1903plus +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs ',
-            4151: '+title=CHTRF95 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ',
-            4171: '+title=RGF93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ',
-            4230: '+title=ED50 +proj=longlat +ellps=intl +no_defs ',
-            4235: '+title=Guyane Francaise +proj=longlat +ellps=intl +no_defs ',
-            4258: '+title=ETRS89 +proj=longlat +ellps=GRS80 +no_defs ',
-            4275: '+title=NTF +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +no_defs ',
-            4322: '+title=WGS 72 +proj=longlat +ellps=WGS72 +no_defs ',
-            4326: '+title=WGS 84 +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ',
-            4467: '+proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            4470: '+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ',
-            4471: '+proj=utm +zone=38 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            4474: '+proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs ',
-            4558: '+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ',
-            4559: '+proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            4621: '+title=Fort Marigot +proj=longlat +ellps=intl +towgs84=137,248,-430,0,0,0,0 +no_defs ',
-            4622: '+title=Guadeloupe 1948 +proj=longlat +ellps=intl +no_defs ',
-            4623: '+title=CSG67 +proj=longlat +ellps=intl +towgs84=-186,230,110,0,0,0,0 +no_defs ',
-            4624: '+title=RGFG95 +proj=longlat +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +no_defs ',
-            4625: '+title=Martinique 1938 +proj=longlat +ellps=intl +no_defs ',
-            4626: '+title=Reunion 1947 +proj=longlat +ellps=intl +no_defs ',
-            4627: '+title=RGR92 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ',
-            4628: '+title=Tahiti 52 +proj=longlat +ellps=intl +towgs84=162,117,154,0,0,0,0 +no_defs ',
-            4629: '+title=Tahaa 54 +proj=longlat +ellps=intl +no_defs ',
-            4630: '+title=IGN72 Nuku Hiva +proj=longlat +ellps=intl +no_defs ',
-            4632: '+title=Combani 1950 +proj=longlat +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +no_defs ',
-            4633: '+title=IGN56 Lifou +proj=longlat +ellps=intl +no_defs ',
-            4634: '+title=IGN72 Grand Terre +proj=longlat +ellps=intl +no_defs ',
-            4637: '+title=Perroud 1950 +proj=longlat +ellps=intl +towgs84=325,154,172,0,0,0,0 +no_defs ',
-            4638: '+title=Saint Pierre et Miquelon 1950 +proj=longlat +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +no_defs ',
-            4640: '+title=RRAF 1991 +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs ',
-            4641: '+title=IGN53 Mare +proj=longlat +ellps=intl +no_defs ',
-            4645: '+title=RGNC 1991 +proj=longlat +ellps=intl +towgs84=0,0,0,0,0,0,0 +no_defs ',
-            4687: '+proj=longlat +ellps=GRS80 +no_defs ',
-            4662: '+title=IGN72 Grande Terre +proj=longlat +ellps=intl +no_defs ',
-            4689: '+title=IGN63 Hiva Oa +proj=longlat +ellps=intl +no_defs ',
-            4690: '+title=Tahiti 79 +proj=longlat +ellps=intl +no_defs ',
-            4691: '+title=Moorea 87 +proj=longlat +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +no_defs ',
-            4692: '+title=Maupiti 83 +proj=longlat +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +no_defs ',
-            4698: '+title=IGN 1962 Kerguelen +proj=longlat +ellps=intl +towgs84=145,-187,103,0,0,0,0 +no_defs ',
-            4749: '+title=RGNC91-93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ',
-            4750: '+title=ST87 Ouvea +proj=longlat +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +no_defs ',
-            4807: '+title=NTF (Paris) +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +no_defs ',
-            2056: '+title=CH1903+ / LV95 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ',
-            2154: '+title=RGF93 / Lambert-93 +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            2213: '+title=ETRS89 / TM 30 NE +proj=tmerc +lat_0=0 +lon_0=30 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs ',
-            2969: '+title=Fort Marigot / UTM zone 20N +proj=utm +zone=20 +ellps=intl +towgs84=137,248,-430,0,0,0,0 +units=m +no_defs ',
-            2970: '+title=Guadeloupe 1948 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs ',
-            2971: '+title=CSG67 / UTM zone 22N +proj=utm +zone=22 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs ',
-            2972: '+title=RGFG95 / UTM zone 22N +proj=utm +zone=22 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs ',
-            2973: '+title=Martinique 1938 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs ',
-            2975: '+title=RGR92 / UTM zone 40S +proj=utm +zone=40 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            2976: '+title=Tahiti 52 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=162,117,154,0,0,0,0 +units=m +no_defs ',
-            2977: '+title=Tahaa 54 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +units=m +no_defs ',
-            2978: '+title=IGN72 Nuku Hiva / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs ',
-            2980: '+title=Combani 1950 / UTM zone 38S +proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs ',
-            2981: '+title=IGN56 Lifou / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ',
-            2982: '+title=IGN72 Grand Terre / UTM zone 58S (deprecated) +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ',
-            2984: '+title=RGNC 1991 / Lambert New Caledonia (deprecated) +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=intl +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            2986: '+title=Terre Adelie 1950 +proj=stere +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +lat_ts=-67.000000000 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs',
-            2987: '+title=Saint Pierre et Miquelon 1950 / UTM zone 21N +proj=utm +zone=21 +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +units=m +no_defs ',
-            2989: '+title=RRAF 1991 / UTM zone 20N +proj=utm +zone=20 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            2990: '+title=Reunion 1947 / TM Reunion (deprecated) +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=50000 +y_0=160000 +ellps=intl +units=m +no_defs ',
-            2995: '+title=IGN53 Mare / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ',
-            3038: '+proj=utm +zone=26 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3039: '+proj=utm +zone=27 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3040: '+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3041: '+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3045: '+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3046: '+proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3047: '+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3048: '+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3049: '+proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3050: '+proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3051: '+proj=utm +zone=39 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3034: '+title=ETRS89 / ETRS-LCC +proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +units=m +no_defs ',
-            3035: '+title=ETRS89 / ETRS-LAEA +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs ',
-            3042: '+title=ETRS89 / ETRS-TM30 +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs ',
-            3043: '+title=ETRS89 / ETRS-TM31 +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs ',
-            3044: '+title=ETRS89 / ETRS-TM32 +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs ',
-            25828: '+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            25829: '+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            25833: '+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            25834: '+proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            25835: '+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            25836: '+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            25837: '+proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            25838: '+proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3060: '+title=IGN72 Grande Terre / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ',
-            3163: '+title=RGNC91-93 / Lambert New Caledonia +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3164: '+title=ST87 Ouvea / UTM zone 58S +proj=utm +zone=58 +south +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +units=m +no_defs ',
-            3165: '+title=NEA74 Noumea / Noumea Lambert +proj=lcc +lat_1=-22.24469175 +lat_2=-22.29469175 +lat_0=-22.26969175 +lon_0=166.44242575 +x_0=0.66 +y_0=1.02 +ellps=intl +units=m +no_defs ',
-            3166: '+title=NEA74 Noumea / Noumea Lambert 2 +proj=lcc +lat_1=-22.24472222222222 +lat_2=-22.29472222222222 +lat_0=-22.26972222222222 +lon_0=166.4425 +x_0=8.313000000000001 +y_0=-2.354 +ellps=intl +units=m +no_defs ',
-            3169: '+title=RGNC91-93 / UTM zone 57S +proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3170: '+title=RGNC91-93 / UTM zone 58S +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3171: '+title=RGNC91-93 / UTM zone 59S +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ',
-            3172: '+title=IGN53 Mare / UTM zone 59S +proj=utm +zone=59 +south +ellps=intl +units=m +no_defs ',
-            3296: '+title=RGPF / UTM zone 5S +proj=utm +zone=5 +south +ellps=GRS80 +units=m +no_defs ',
-            3297: '+title=RGPF / UTM zone 6S +proj=utm +zone=6 +south +ellps=GRS80 +units=m +no_defs ',
-            3298: '+title=RGPF / UTM zone 7S +proj=utm +zone=7 +south +ellps=GRS80 +units=m +no_defs ',
-            3299: '+title=RGPF / UTM zone 8S +proj=utm +zone=8 +south +ellps=GRS80 +units=m +no_defs ',
-            3302: '+title=IGN63 Hiva Oa / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs ',
-            3303: '+title=Fatu Iva 72 / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +towgs84=347.103,1078.12,2623.92,-33.8875,70.6773,-9.3943,186.074 +units=m +no_defs ',
-            3304: '+title=Tahiti 79 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +units=m +no_defs ',
-            3305: '+title=Moorea 87 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +units=m +no_defs ',
-            3306: '+title=Maupiti 83 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +units=m +no_defs ',
-            3312: '+title=CSG67 / UTM zone 21N +proj=utm +zone=21 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs ',
-            3313: '+title=RGFG95 / UTM zone 21N +proj=utm +zone=21 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs ',
-            3336: '+title=IGN 1962 Kerguelen / UTM zone 42S +proj=utm +zone=42 +south +ellps=intl +towgs84=145,-187,103,0,0,0,0 +units=m +no_defs ',
-            3395: '+title=WGS 84 / World Mercator +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            3727: '+title=Reunion 1947 / TM Reunion +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=160000 +y_0=50000 +ellps=intl +units=m +no_defs ',
-            21781: '+title=CH1903 / LV03 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ',
-            25830: '+title=ETRS89 / UTM zone 30N +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs ',
-            25831: '+title=ETRS89 / UTM zone 31N +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs ',
-            25832: '+title=ETRS89 / UTM zone 32N +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs ',
-            27561: '+title=NTF (Paris) / Lambert Nord France +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27562: '+title=NTF (Paris) / Lambert Centre France +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27563: '+title=NTF (Paris) / Lambert Sud France +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27564: '+title=NTF (Paris) / Lambert Corse +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27571: '+title=NTF (Paris) / Lambert zone I +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27572: '+title=NTF (Paris) / Lambert zone II +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27573: '+title=NTF (Paris) / Lambert zone III +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27574: '+title=NTF (Paris) / Lambert zone IV +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27581: '+title=NTF (Paris) / France I (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27582: '+title=NTF (Paris) / France II (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27583: '+title=NTF (Paris) / France III (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27584: '+title=NTF (Paris) / France IV (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27591: '+title=NTF (Paris) / Nord France (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27592: '+title=NTF (Paris) / Centre France (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27593: '+title=NTF (Paris) / Sud France (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            27594: '+title=NTF (Paris) / Corse (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ',
-            32601: '+proj=utm +zone=1 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32602: '+proj=utm +zone=2 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32603: '+proj=utm +zone=3 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32604: '+proj=utm +zone=4 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32605: '+proj=utm +zone=5 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32606: '+proj=utm +zone=6 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32607: '+proj=utm +zone=7 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32608: '+proj=utm +zone=8 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32609: '+proj=utm +zone=9 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32610: '+proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32611: '+proj=utm +zone=11 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32612: '+proj=utm +zone=12 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32613: '+proj=utm +zone=13 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32614: '+proj=utm +zone=14 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32615: '+proj=utm +zone=15 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32616: '+proj=utm +zone=16 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32617: '+proj=utm +zone=17 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32618: '+proj=utm +zone=18 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32619: '+proj=utm +zone=19 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32620: '+proj=utm +zone=20 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32621: '+proj=utm +zone=21 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32622: '+proj=utm +zone=22 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32623: '+proj=utm +zone=23 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32624: '+proj=utm +zone=24 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32625: '+proj=utm +zone=25 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32626: '+proj=utm +zone=26 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32627: '+proj=utm +zone=27 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32628: '+proj=utm +zone=28 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32629: '+proj=utm +zone=29 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32630: '+proj=utm +zone=30 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32631: '+proj=utm +zone=31 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32632: '+proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32633: '+proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32634: '+proj=utm +zone=34 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32635: '+proj=utm +zone=35 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32636: '+proj=utm +zone=36 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32637: '+proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32638: '+proj=utm +zone=38 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32639: '+proj=utm +zone=39 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32640: '+proj=utm +zone=40 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32641: '+proj=utm +zone=41 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32642: '+proj=utm +zone=42 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32643: '+proj=utm +zone=43 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32644: '+proj=utm +zone=44 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32645: '+proj=utm +zone=45 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32646: '+proj=utm +zone=46 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32647: '+proj=utm +zone=47 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32648: '+proj=utm +zone=48 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32649: '+proj=utm +zone=49 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32650: '+proj=utm +zone=50 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32651: '+proj=utm +zone=51 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32652: '+proj=utm +zone=52 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32653: '+proj=utm +zone=53 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32654: '+proj=utm +zone=54 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32655: '+proj=utm +zone=55 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32656: '+proj=utm +zone=56 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32657: '+proj=utm +zone=57 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32658: '+proj=utm +zone=58 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32659: '+proj=utm +zone=59 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32660: '+proj=utm +zone=60 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32661: '+proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32662: '+title=WGS 84 / Plate Carree +proj=eqc +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32701: '+proj=utm +zone=1 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32702: '+proj=utm +zone=2 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32703: '+proj=utm +zone=3 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32704: '+proj=utm +zone=4 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32705: '+proj=utm +zone=5 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32706: '+proj=utm +zone=6 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32707: '+proj=utm +zone=7 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32708: '+proj=utm +zone=8 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32709: '+proj=utm +zone=9 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32710: '+proj=utm +zone=10 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32711: '+proj=utm +zone=11 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32712: '+proj=utm +zone=12 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32713: '+proj=utm +zone=13 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32714: '+proj=utm +zone=14 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32715: '+proj=utm +zone=15 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32716: '+proj=utm +zone=16 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32717: '+proj=utm +zone=17 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32718: '+proj=utm +zone=18 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32719: '+proj=utm +zone=19 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32720: '+proj=utm +zone=20 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32721: '+proj=utm +zone=21 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32722: '+proj=utm +zone=22 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32723: '+proj=utm +zone=23 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32724: '+proj=utm +zone=24 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32725: '+proj=utm +zone=25 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32726: '+proj=utm +zone=26 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32727: '+proj=utm +zone=27 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32728: '+proj=utm +zone=28 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32729: '+proj=utm +zone=29 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32730: '+proj=utm +zone=30 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32731: '+proj=utm +zone=31 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32732: '+proj=utm +zone=32 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32733: '+proj=utm +zone=33 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32734: '+proj=utm +zone=34 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32735: '+proj=utm +zone=35 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32736: '+proj=utm +zone=36 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32737: '+proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32738: '+proj=utm +zone=38 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32739: '+proj=utm +zone=39 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32740: '+proj=utm +zone=40 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32741: '+proj=utm +zone=41 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32742: '+proj=utm +zone=42 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32743: '+proj=utm +zone=43 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32744: '+proj=utm +zone=44 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32745: '+proj=utm +zone=45 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32746: '+proj=utm +zone=46 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32747: '+proj=utm +zone=47 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32748: '+proj=utm +zone=48 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32749: '+proj=utm +zone=49 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32750: '+proj=utm +zone=50 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32751: '+proj=utm +zone=51 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32752: '+proj=utm +zone=52 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32753: '+proj=utm +zone=53 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32754: '+proj=utm +zone=54 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32755: '+proj=utm +zone=55 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32756: '+proj=utm +zone=56 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32757: '+proj=utm +zone=57 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32758: '+proj=utm +zone=58 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32759: '+proj=utm +zone=59 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32760: '+proj=utm +zone=60 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            32761: '+proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ',
-            310024802: '+title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            310915814: '+title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            310486805: '+title=Geoportail - Guyane +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            310700806: '+title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            310702807: '+title=Geoportail - Mayotte +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            310706808: '+title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            310547809: '+title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            310642810: '+title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            310032811: '+title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            310642812: '+title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-49.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            310642801: '+title=Geoportail - Crozet +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            310642813: '+title=Geoportail - Amsterdam et Saint-Paul +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-38.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            310642901: '+title=Geoportail - Monde +proj=mill +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            5489: '+title=RGAF09 geographiques (dms) +proj=longlat +nadgrids=@null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137 +rf=298.257222101 +units=m +no_defs',
-            5490: '+title=RGAF09 UTM Nord Fuseau 20 +proj=tmerc +nadgrids=@null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137 +rf=298.257222101 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs'
-        },
-        CRS: { 84: '+title=WGS 84 longitude-latitude +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ' },
-        IGNF: {
-            AMST63: '+title=Amsterdam 1963 +proj=geocent +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            CROZ63: '+title=Crozet 1963 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            CSG67: '+title=Guyane CSG67 +proj=geocent +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            ED50: '+title=ED50 +proj=geocent +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            ETRS89: '+title=Systeme de reference terrestre Europeen (1989) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            GUAD48: '+title=Guadeloupe Ste Anne +proj=geocent +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            GUADFM49: '+title=Guadeloupe Fort Marigot +proj=geocent +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            IGN63: '+title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=geocent +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            IGN72: '+title=IGN 1972 Grande-Terre / Ile des Pins +proj=geocent +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            KERG62CAR: '+title=Kerguelen - K0 +proj=geocent +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            MART38: '+title=Martinique Fort-Desaix +proj=geocent +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            MAYO50: '+title=Mayotte Combani +proj=geocent +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            MOOREA87: '+title=Moorea 1987 +proj=geocent +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            NTF: '+title=Nouvelle Triangulation Francaise +proj=geocent +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs',
-            NUKU72: '+title=IGN 1972 Nuku Hiva +proj=geocent +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            REUN47: '+title=Reunion 1947 +proj=geocent +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            RGF93: '+title=Reseau geodesique francais 1993 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RGFG95: '+title=Reseau geodesique francais de Guyane 1995 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RGM04: '+title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RGNC: '+title=Reseau Geodesique de Nouvelle-Caledonie +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RGPF: '+title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RGR92: '+title=Reseau geodesique Reunion 1992 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RGSPM06: '+title=Reseau Geodesique Saint-Pierre-et-Miquelon (2006) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RGTAAF07: '+title=Reseau Geodesique des TAAF (2007) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RRAF91: '+title=RRAF 1991 (Reseau de Reference des Antilles Francaises) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            STPL69: '+title=Saint-Paul 1969 +proj=geocent +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            STPM50: '+title=St Pierre et Miquelon 1950 +proj=geocent +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs',
-            TAHAA: '+title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=geocent +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            TAHI79: '+title=IGN79 (Tahiti) Iles de la Societe +proj=geocent +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            TERA50: '+title=Pointe Geologie - Perroud 1950 +proj=geocent +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            WALL78: '+title=Wallis-Uvea 1978 (MOP78) +proj=geocent +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            WGS72: '+title=World Geodetic System 1972 +proj=geocent +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs',
-            WGS84: '+title=World Geodetic System 1984 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            AMST63GEO: '+title=Amsterdam 1963 +proj=longlat +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            CROZ63GEO: '+title=Crozet 1963 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            CSG67GEO: '+title=Guyane CSG67 +proj=longlat +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            ED50G: '+title=ED50 +proj=longlat +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            GUAD48GEO: '+title=Guadeloupe Ste Anne +proj=longlat +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            GUADFM49GEO: '+title=Guadeloupe Fort Marigot +proj=longlat +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            IGN63GEO: '+title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=longlat +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            IGN72GEO: '+title=IGN 1972 Grande-Terre / Ile des Pins +proj=longlat +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            KERG62GEO: '+title=Kerguelen - K0 +proj=longlat +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            MART38GEO: '+title=Martinique Fort-Desaix +proj=longlat +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            MAYO50GEO: '+title=Mayotte Combani +proj=longlat +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            MOOREA87GEO: '+title=Moorea 1987 +proj=longlat +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            NTFG: '+title=Nouvelle Triangulation Francaise Greenwich degres sexagesimaux +proj=longlat +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs',
-            NTFP: '+title=Nouvelle Triangulation Francaise Paris grades +proj=longlat +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +units=m +no_defs',
-            NUKU72GEO: '+title=IGN 1972 Nuku Hiva +proj=longlat +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            REUN47GEO: '+title=Reunion 1947 +proj=longlat +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            RGF93G: '+title=Reseau geodesique francais 1993 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RGFG95GEO: '+title=Reseau geodesique francais de Guyane 1995 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RGM04GEO: '+title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RGNCGEO: '+title=Reseau Geodesique de Nouvelle-Caledonie +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RGPFGEO: '+title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RGR92GEO: '+title=Reseau geodesique de la Reunion 1992 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RGSPM06GEO: '+title=Saint-Pierre-et-Miquelon (2006) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            RGTAAF07G: '+title=Reseau Geodesique des TAAF (2007) (dms) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            STPL69GEO: '+title=Saint-Paul 1969 +proj=longlat +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            STPM50GEO: '+title=St Pierre et Miquelon 1950  +proj=longlat +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs',
-            TAHAAGEO: '+title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=longlat +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            TAHI79GEO: '+title=IGN79 (Tahiti) Iles de la Societe +proj=longlat +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            TERA50G: '+title=Pointe Geologie - Perroud 1950 +proj=longlat +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            WALL78GEO: '+title=Wallis - Uvea 1978 (MOP78) +proj=longlat +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs',
-            WGS72G: '+title=WGS72 +proj=longlat +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs',
-            WGS84G: '+title=World Geodetic System 1984 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            WGS84RRAFGEO: '+title=Reseau de reference des Antilles francaises (1988-1991) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            XGEO: '+title=Systeme CIO-BIH +proj=longlat +towgs84=0.0000,0.0000,0.5000,0.0000,0.0000,0.0140,-0.100000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            AMST63UTM43S: '+title=Amsterdam 1963 UTM fuseau 43 Sud +proj=tmerc +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            CROZ63UTM39S: '+title=Crozet 1963 +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            CSG67UTM21: '+title=Guyane CSG67 UTM fuseau 21 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            CSG67UTM22: '+title=Guyane CSG67 UTM fuseau 22 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            GEOPORTALANF: '+title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            GEOPORTALASP: '+title=Geoportail - Amsterdam et Saint-Paul +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-38.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            GEOPORTALCRZ: '+title=Geoportail - Crozet +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            GEOPORTALFXX: '+title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            GEOPORTALGUF: '+title=Geoportail - Guyane +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            GEOPORTALKER: '+title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-49.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            GEOPORTALMYT: '+title=Geoportail - Mayotte +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            GEOPORTALNCL: '+title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            GEOPORTALPYF: '+title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            GEOPORTALREU: '+title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            GEOPORTALSPM: '+title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            GEOPORTALWLF: '+title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            GUAD48UTM20: '+title=Guadeloupe Ste Anne +proj=tmerc +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            GUADFM49U20: '+title=Guadeloupe Fort Marigot  +proj=tmerc +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            IGN63UTM7S: '+title=IGN 1963 - Hiva Oa, Tahuata, Mohotani - UTM fuseau 7 Sud +proj=tmerc +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            IGN72UTM58S: '+title=IGN 1972 - UTM fuseau 58 Sud +proj=tmerc +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            KERG62UTM42S: '+title=Kerguelen 1962 +proj=tmerc +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            LAMB1: '+title=Lambert I +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs',
-            LAMB1C: '+title=Lambert I Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=1200000.000 +units=m +no_defs',
-            LAMB2: '+title=Lambert II +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs',
-            LAMB2C: '+title=Lambert II Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs',
-            LAMB3: '+title=Lambert III +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs',
-            LAMB3C: '+title=Lambert III Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=3200000.000 +units=m +no_defs',
-            LAMB4: '+title=Lambert IV +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=185861.369 +units=m +no_defs',
-            LAMB4C: '+title=Lambert IV Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=4185861.369 +units=m +no_defs',
-            LAMB93: '+title=Lambert 93 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.500000000 +lon_0=3.000000000 +lat_1=44.000000000 +lat_2=49.000000000 +x_0=700000.000 +y_0=6600000.000 +units=m +no_defs',
-            RGF93CC42: '+title=Lambert conique conforme Zone 1 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=42.000000000 +lon_0=3.000000000 +lat_1=41.200000000 +lat_2=42.800000000 +x_0=1700000.000 +y_0=1200000.000 +units=m +no_defs',
-            RGF93CC43: '+title=Lambert conique conforme Zone 2 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=43.000000000 +lon_0=3.000000000 +lat_1=42.200000000 +lat_2=43.800000000 +x_0=1700000.000 +y_0=2200000.000 +units=m +no_defs',
-            RGF93CC44: '+title=Lambert conique conforme Zone 3 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=44.000000000 +lon_0=3.000000000 +lat_1=43.200000000 +lat_2=44.800000000 +x_0=1700000.000 +y_0=3200000.000 +units=m +no_defs',
-            RGF93CC45: '+title=Lambert conique conforme Zone 4 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=45.000000000 +lon_0=3.000000000 +lat_1=44.200000000 +lat_2=45.800000000 +x_0=1700000.000 +y_0=4200000.000 +units=m +no_defs',
-            RGF93CC46: '+title=Lambert conique conforme Zone 5 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.000000000 +lon_0=3.000000000 +lat_1=45.200000000 +lat_2=46.800000000 +x_0=1700000.000 +y_0=5200000.000 +units=m +no_defs',
-            RGF93CC47: '+title=Lambert conique conforme Zone 6 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=47.000000000 +lon_0=3.000000000 +lat_1=46.200000000 +lat_2=47.800000000 +x_0=1700000.000 +y_0=6200000.000 +units=m +no_defs',
-            RGF93CC48: '+title=Lambert conique conforme Zone 7 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=48.000000000 +lon_0=3.000000000 +lat_1=47.200000000 +lat_2=48.800000000 +x_0=1700000.000 +y_0=7200000.000 +units=m +no_defs',
-            RGF93CC49: '+title=Lambert conique conforme Zone 8 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=49.000000000 +lon_0=3.000000000 +lat_1=48.200000000 +lat_2=49.800000000 +x_0=1700000.000 +y_0=8200000.000 +units=m +no_defs',
-            RGF93CC50: '+title=Lambert conique conforme Zone 9 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=50.000000000 +lon_0=3.000000000 +lat_1=49.200000000 +lat_2=50.800000000 +x_0=1700000.000 +y_0=9200000.000 +units=m +no_defs',
-            LAMBE: '+title=Lambert II etendu +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs',
-            MART38UTM20: '+title=Martinique Fort-Desaix +proj=tmerc +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            MAYO50UTM38S: '+title=Mayotte Combani +proj=tmerc +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            MILLER: '+title=Geoportail - Monde +proj=mill +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs',
-            MOOREA87U6S: '+title=Moorea 1987 - UTM fuseau 6 Sud +proj=tmerc +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            NUKU72U7S: '+title=IGN 1972 Nuku Hiva - UTM fuseau 7 Sud +proj=tmerc +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            REUN47GAUSSL: '+title=Reunion Gauss Laborde +proj=gstmerc +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-21.116666667 +lon_0=55.533333333 +k_0=1.00000000 +x_0=160000.000 +y_0=50000.000 +units=m +no_defs',
-            RGM04UTM38S: '+title=UTM fuseau 38 Sud (Reseau Geodesique de Mayotte 2004) +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            RGNCUTM57S: '+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 57 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=159.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            RGNCUTM58S: '+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 58 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            RGNCUTM59S: '+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 59 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=171.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            RGPFUTM5S: '+title=RGPF - UTM fuseau 5 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            RGPFUTM6S: '+title=RGPF - UTM fuseau 6 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            RGPFUTM7S: '+title=RGPF - UTM fuseau 7 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            RGR92UTM40S: '+title=RGR92 UTM fuseau 40 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            RGSPM06U21: '+title=Saint-Pierre-et-Miquelon (2006) UTM Fuseau 21 Nord +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            STPL69UTM43S: '+title=Saint-Paul 1969 UTM fuseau 43 Sud +proj=tmerc +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            STPM50UTM21: '+title=St Pierre et Miquelon 1950 +proj=tmerc +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            TAHAAUTM05S: '+title=Tahaa 1951 +proj=tmerc +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            TAHI51UTM06S: '+title=Tahiti-Terme Nord UTM fuseau 6 Sud +proj=tmerc +towgs84=162.0000,117.0000,154.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            TAHI79UTM6S: '+title=Tahiti 1979 +proj=tmerc +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            TERA50STEREO: '+title=Terre Adelie 1950 +proj=stere +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +lat_ts=-67 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs',
-            UTM01SW84: '+title=World Geodetic System 1984 UTM fuseau 01 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            UTM20W84GUAD: '+title=World Geodetic System 1984 UTM fuseau 20 Nord-Guadeloupe +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM20W84MART: '+title=World Geodetic System 1984 UTM fuseau 20 Nord-Martinique +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM22RGFG95: '+title=RGFG95 UTM fuseau 22 Nord-Guyane +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM39SW84: '+title=World Geodetic System 1984 UTM fuseau 39 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            UTM42SW84: '+title=World Geodetic System 1984 UTM fuseau 42 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            UTM43SW84: '+title=World Geodetic System 1984 UTM fuseau 43 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            WALL78UTM1S: '+title=Wallis-Uvea 1978 (MOP78) UTM 1 SUD +proj=tmerc +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs',
-            ETRS89GEO: '+title=ETRS89 geographiques (dms) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs',
-            ETRS89LAEA: '+title=ETRS89 Lambert Azimutal Equal Area +proj=laea +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=52.000000000 +lon_0=10.000000000 +x_0=4321000.000 +y_0=3210000.000 +units=m +no_defs',
-            ETRS89LCC: '+title=ETRS89 Lambert Conformal Conic +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=52.000000000 +lon_0=9.999999995 +lat_1=35.000000000 +lat_2=65.000000000 +x_0=4000000.000 +y_0=2800000.000 +units=m +no_defs',
-            UTM26ETRS89: '+title=Europe - de 30d a 24d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-27.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM27ETRS89: '+title=Europe - de 24d a 18d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-21.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM28ETRS89: '+title=Europe - de 18d a 12d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-15.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM29ETRS89: '+title=Europe - de 12d a 6d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-9.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM30ETRS89: '+title=Europe - de -6d a 0d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-3.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM31ETRS89: '+title=Europe - de 0d a 6d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=3.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM32ETRS89: '+title=Europe - de 6d a 12d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=9.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM33ETRS89: '+title=Europe - de 12d a 18d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=15.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM34ETRS89: '+title=Europe - de 18d a 24d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=21.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM35ETRS89: '+title=Europe - de 24d a 30d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=27.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM36ETRS89: '+title=Europe - de 30d a 36d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=33.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM37ETRS89: '+title=Europe - de 36d a 42d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=39.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs',
-            UTM38ETRS89: '+title=Europe - de 42d a 48d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs'
-        }
-    };
-    return Register;
-}(proj4);
-LeafletCRSEPSG2154 = function (Config, Register, L) {
-    var EPSG2154 = {
-        instance: null,
-        build: function () {
-            if (!this.instance) {
-                var crs = new L.Proj.CRS('EPSG:2154', Register.get('EPSG:2154'), {
-                    resolutions: this._getResolutions(),
-                    origin: this._getOrigin()
-                });
-                this.instance = crs;
-            }
-            return this.instance;
-        },
-        _getResolutions: function () {
-            var resolutions = [];
-            if (Config.isConfigLoaded()) {
-                var o = Config.getTileMatrix('LAMB93');
-                resolutions = o.nativeResolutions;
-            }
-            if (resolutions.length) {
-                return resolutions;
-            }
-            return [
-                104579.22454989408,
-                52277.53235379051,
-                26135.487078595408,
-                13066.891381800004,
-                6533.228604113456,
-                3266.5595244626675,
-                1633.2660045974187,
-                816.6295549860224,
-                408.31391467683596,
-                204.15674151090204,
-                102.07831678324082,
-                51.0391448966112,
-                25.519569074269395,
-                12.759783693647506,
-                6.379891635966491,
-                3.18994576530532,
-                1.5949728694977277,
-                0.7974864315474559,
-                0.398743214900604,
-                0.19937160727567999,
-                0.099685803696052,
-                0.049842901818919996
-            ];
-        },
-        _getOrigin: function () {
-            return [
-                0,
-                12000000
-            ];
-        }
-    };
-    return EPSG2154;
-}(CommonUtilsConfig, CommonUtilsRegister, leaflet);
-LeafletCRSEPSG27572 = function (Config, Register, L) {
-    var EPSG27572 = {
-        instance: null,
-        build: function () {
-            if (!this.instance) {
-                var crs = new L.Proj.CRS('EPSG:27572', Register.get('EPSG:27572'), {
-                    resolutions: this._getResolutions(),
-                    origin: this._getOrigin()
-                });
-                this.instance = crs;
-            }
-            return this.instance;
-        },
-        _getResolutions: function () {
-            var resolutions = [];
-            if (Config.isConfigLoaded()) {
-                var o = Config.getTileMatrix('LAMB2E');
-                if (o && Object.keys(o)) {
-                    resolutions = o.nativeResolutions;
-                }
-            }
-            if (resolutions.length) {
-                return resolutions;
-            }
-            return [
-                104579.22454989408,
-                52277.53235379051,
-                26135.487078595408,
-                13066.891381800004,
-                6533.228604113456,
-                3266.5595244626675,
-                1633.2660045974187,
-                816.6295549860224,
-                408.31391467683596,
-                204.15674151090204,
-                102.07831678324082,
-                51.0391448966112,
-                25.519569074269395,
-                12.759783693647506,
-                6.379891635966491,
-                3.18994576530532,
-                1.5949728694977277,
-                0.7974864315474559,
-                0.398743214900604,
-                0.19937160727567999,
-                0.099685803696052,
-                0.049842901818919996
-            ];
-        },
-        _getOrigin: function () {
-            return [
-                0,
-                12000000
-            ];
-        }
-    };
-    return EPSG27572;
-}(CommonUtilsConfig, CommonUtilsRegister, leaflet);
-LeafletCRSEPSG4326 = function (Config, Register, L) {
-    var EPSG4326 = {
-        instance: null,
-        build: function () {
-            if (!this.instance) {
-                var crs = new L.Proj.CRS('EPSG:4326', Register.get('EPSG:4326'), {
-                    resolutions: this._getResolutions(),
-                    origin: [
-                        -180,
-                        90
-                    ]
-                });
-                this.instance = crs;
-            }
-            return this.instance;
-        },
-        _getResolutions: function () {
-            var resolutions = [];
-            if (Config.isConfigLoaded()) {
-                resolutions = Config.getResolutions();
-            }
-            if (resolutions.length) {
-                return resolutions;
-            }
-            return [
-                1.40625,
-                0.703125,
-                0.3515625,
-                0.17578125,
-                0.087890625,
-                0.0439453125,
-                0.02197265625,
-                0.010986328125,
-                0.0054931640625,
-                0.00274658203125,
-                0.001373291015625,
-                0.0006866455078125,
-                0.00034332275390625,
-                0.000171661376953126,
-                0.0000858306884765628,
-                0.0000429153442382813,
-                0.0000214576721191407,
-                0.0000107288360595703,
-                0.00000536441802978517,
-                0.00000268220901489259,
-                0.0000013411045074463,
-                6.70552253723145e-7,
-                3.3527612686157e-7
-            ];
-        },
-        _getOrigin: function () {
-        }
-    };
-    return EPSG4326;
-}(CommonUtilsConfig, CommonUtilsRegister, leaflet);
-LeafletCRSCRS = function (Proj4, Register, Epsg2154, Epsg27572, Epsg4326) {
-    (function () {
-        Proj4.load();
-        Register.load();
-    }());
-    var CRS = {
-        EPSG2154: function () {
-            return Epsg2154.build();
-        },
-        EPSG27572: function () {
-            return Epsg27572.build();
-        },
-        EPSG4326: function () {
-            return Epsg4326.build();
-        }
-    };
-    return CRS;
-}(LeafletCRSProj4Leaflet, CommonUtilsRegister, LeafletCRSEPSG2154, LeafletCRSEPSG27572, LeafletCRSEPSG4326);
-LeafletControlsMousePosition = function (L, woodman, Gp, RightManagement, ID, MousePositionDOM, PositionFormater, CRS) {
-    var MousePosition = L.Control.extend({
-        includes: MousePositionDOM,
-        options: {
-            position: 'bottomleft',
-            collapsed: true,
-            units: [],
-            systems: [],
-            displayAltitude: true,
-            displayCoordinates: true,
-            altitude: {
-                triggerDelay: 200,
-                responseDelay: 500,
-                noDataValue: -99999,
-                noDataValueTolerance: 90000,
-                serviceOptions: {}
-            }
-        },
-        initialize: function (options) {
-            L.Util.extend(this.options, options);
-            this._uid = ID.generate();
-            this._projectionSystems = [];
-            this._initProjectionSystems();
-            this._projectionUnits = {};
-            this._initProjectionUnits();
-            this._isDesktop = this._detectSupport();
-            if (this.options.altitude.triggerDelay < 100) {
-                this.options.altitude.triggerDelay = 100;
-            }
-            this._timer = this.options.altitude.triggerDelay;
-            this._currentProjectionSystems = this._projectionSystems[0];
-            this._projectionSystemsContainer = null;
-            this._currentProjectionType = this._projectionSystems[0].type;
-            this._currentProjectionUnits = this._projectionUnits[this._currentProjectionType][0].code;
-            this._projectionUnitsContainer = null;
-            this._showMousePositionContainer = null;
-            if (!this.options.displayAltitude && !this.options.displayCoordinates) {
-                this.options.displayCoordinates = true;
-            }
-            this._noRightManagement = false;
-            if (this.options.displayAltitude) {
-                this._checkRightsManagement();
-            }
-            L.Util.setOptions(this, this.options);
-        },
-        onAdd: function (map) {
-            var container = this._container = this._initLayout();
-            if (!this.options.collapsed) {
-                if (this._isDesktop) {
-                    map.on('mousemove', this.onMouseMove, this);
-                } else {
-                    map.on('move', this.onMapMove, this);
-                }
-            }
-            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
-            L.DomEvent.addListener(container, 'mousemove', L.DomEvent.stopPropagation).addListener(container, 'mousemove', L.DomEvent.preventDefault);
-            return container;
-        },
-        onRemove: function (map) {
-            map.off('mousemove', this.onMouseMove);
-        },
-        _initProjectionSystems: function () {
-            var projectionSystemsByDefault = [
-                {
-                    label: 'Géographique',
-                    crs: L.CRS.Simple,
-                    type: 'Geographical'
-                },
-                {
-                    label: 'Web Mercator',
-                    crs: L.CRS.EPSG3395,
-                    type: 'Metric'
-                },
-                {
-                    label: 'Lambert 93',
-                    crs: CRS.EPSG2154,
-                    type: 'Metric',
-                    geoBBox: {
-                        left: -9.86,
-                        bottom: 41.15,
-                        right: 10.38,
-                        top: 51.56
-                    }
-                },
-                {
-                    label: 'Lambert II étendu',
-                    crs: CRS.EPSG27572,
-                    type: 'Metric',
-                    geoBBox: {
-                        left: -4.87,
-                        bottom: 42.33,
-                        right: 8.23,
-                        top: 51.14
-                    }
-                }
-            ];
-            var systems = this.options.systems;
-            for (var i = 0; i < systems.length; i++) {
-                var sys = systems[i];
-                if (!sys.label) {
-                    continue;
-                }
-                if (!sys.crs) {
-                    continue;
-                }
-                if (!sys.type) {
-                    sys.type = 'Metric';
-                }
-                this._projectionSystems.push(systems[i]);
-                var found = false;
-                for (var j = 0; j < projectionSystemsByDefault.length; j++) {
-                    var obj = projectionSystemsByDefault[j];
-                    if (sys.crs === obj.crs) {
-                        found = true;
-                    }
-                }
-                if (!found) {
-                }
-            }
-            if (this._projectionSystems.length === 0) {
-                this._projectionSystems = projectionSystemsByDefault;
-            }
-            for (var k = 0; k < this._projectionSystems.length; ++k) {
-                this._projectionSystems[k].code = k;
-            }
-        },
-        _initProjectionUnits: function () {
-            var projectionUnitsByDefault = {
-                Geographical: [
-                    {
-                        code: 'DEC',
-                        label: 'degrés décimaux',
-                        convert: this._displayDEC
-                    },
-                    {
-                        code: 'DMS',
-                        label: 'degrés sexagésimaux',
-                        convert: this._displayDMS
-                    },
-                    {
-                        code: 'RAD',
-                        label: 'radians',
-                        convert: this._displayRAD
-                    },
-                    {
-                        code: 'GON',
-                        label: 'grades',
-                        convert: this._displayGON
-                    }
-                ],
-                Metric: [
-                    {
-                        code: 'M',
-                        label: 'mètres',
-                        convert: this._displayMeter
-                    },
-                    {
-                        code: 'KM',
-                        label: 'kilomètres',
-                        convert: this._displayKMeter
-                    }
-                ]
-            };
-            var units = this.options.units;
-            for (var type in projectionUnitsByDefault) {
-                if (projectionUnitsByDefault.hasOwnProperty(type)) {
-                    var found = false;
-                    for (var j = 0; j < projectionUnitsByDefault[type].length; j++) {
-                        var obj = projectionUnitsByDefault[type][j];
-                        for (var i = 0; i < units.length; i++) {
-                            var unit = units[i];
-                            if (obj.code === unit) {
-                                found = true;
-                                if (!this._projectionUnits[type]) {
-                                    this._projectionUnits[type] = [];
-                                }
-                                this._projectionUnits[type].push(obj);
-                            }
-                        }
-                    }
-                    if (!found) {
-                        this._projectionUnits[type] = projectionUnitsByDefault[type];
-                    }
-                }
-            }
-            if (Object.keys(this._projectionUnits).length === 0) {
-                this._projectionUnits = projectionUnitsByDefault;
-            }
-        },
-        _checkRightsManagement: function () {
-            var rightManagement = RightManagement.check({
-                key: this.options.apiKey,
-                resources: ['SERVICE_CALCUL_ALTIMETRIQUE_RSC'],
-                services: ['Elevation']
-            });
-            if (!rightManagement) {
-                this._noRightManagement = true;
-            }
-            if (!this.options.apiKey) {
-                this.options.apiKey = rightManagement.key;
-            }
-        },
-        _detectSupport: function () {
-            var isDesktop = true;
-            var userAgent = window.navigator.userAgent.toLowerCase();
-            if (userAgent.indexOf('iphone') !== -1 || userAgent.indexOf('ipod') !== -1 || userAgent.indexOf('ipad') !== -1 || userAgent.indexOf('android') !== -1 || userAgent.indexOf('mobile') !== -1 || userAgent.indexOf('blackberry') !== -1 || userAgent.indexOf('tablet') !== -1 || userAgent.indexOf('phone') !== -1 || userAgent.indexOf('touch') !== -1) {
-                isDesktop = false;
-            }
-            if (userAgent.indexOf('msie') !== -1 || userAgent.indexOf('trident') !== -1) {
-                isDesktop = true;
-            }
-            return isDesktop;
-        },
-        _initLayout: function () {
-            var container = this._createMainContainerElement();
-            var inputShow = this._showMousePositionContainer = this._createShowMousePositionElement();
-            container.appendChild(inputShow);
-            if (!this.options.collapsed) {
-                inputShow.checked = true;
-            }
-            var picto = this._createShowMousePositionPictoElement(this._isDesktop);
-            container.appendChild(picto);
-            var panel = this._createMousePositionPanelElement(this.options.displayAltitude, this.options.displayCoordinates);
-            var settings = this._createMousePositionSettingsElement();
-            var systems = this._projectionSystemsContainer = this._createMousePositionSettingsSystemsElement(this._projectionSystems);
-            var units = this._projectionUnitsContainer = this._createMousePositionSettingsUnitsElement(this._projectionUnits[this._currentProjectionType]);
-            settings.appendChild(systems);
-            settings.appendChild(units);
-            panel.appendChild(settings);
-            container.appendChild(panel);
-            var center = this._createMapCenter();
-            var map = this._map;
-            map.getContainer().appendChild(center);
-            return container;
-        },
-        _setElevationPanel: function (active) {
-            var div = null;
-            if (!active) {
-                div = L.DomUtil.get(this._addUID('GPmousePositionAltitude'));
-                div.style.display = 'none';
-            }
-            if (active && this._noRightManagement) {
-                div = L.DomUtil.get(this._addUID('GPmousePositionAlt'));
-                div.innerHTML = 'no right !';
-            }
-        },
-        _setCoordinatePanel: function (active) {
-            if (!active) {
-                var div = L.DomUtil.get(this._addUID('GPmousePositionCoordinate'));
-                div.style.display = 'none';
-            }
-        },
-        _setSettingsPanel: function (active) {
-            if (!active) {
-                var divPicto = L.DomUtil.get('GPshowMousePositionSettingsPicto');
-                var divPanel = L.DomUtil.get(this._addUID('GPmousePositionSettings'));
-                divPicto.style.display = 'none';
-                divPanel.style.display = 'none';
-            }
-        },
-        _setTypeUnitsPanel: function (type) {
-            var container = this._projectionUnitsContainer;
-            while (container.firstChild) {
-                container.removeChild(container.firstChild);
-            }
-            var units = this._projectionUnits[type];
-            for (var j = 0; j < units.length; j++) {
-                var obj = units[j];
-                var option = document.createElement('option');
-                option.value = obj.code ? obj.code : j;
-                option.text = obj.label || j;
-                container.appendChild(option);
-            }
-            this._currentProjectionType = type;
-            this._currentProjectionUnits = this._projectionUnits[type][0].code;
-        },
-        _displayDEC: function (oLatLng) {
-            var coordinate = {};
-            coordinate.lat = PositionFormater.roundToDecimal(oLatLng.lat, 6);
-            coordinate.lng = PositionFormater.roundToDecimal(oLatLng.lng, 6);
-            return coordinate;
-        },
-        _displayDMS: function (oLatLng) {
-            var coordinate = {};
-            coordinate.lat = PositionFormater.decimalLatToDMS(oLatLng.lat);
-            coordinate.lng = PositionFormater.decimalLongToDMS(oLatLng.lng);
-            return coordinate;
-        },
-        _displayRAD: function (oLatLng) {
-            var coordinate = {};
-            coordinate.lat = PositionFormater.decimalToRadian(oLatLng.lat);
-            coordinate.lng = PositionFormater.decimalToRadian(oLatLng.lng);
-            return coordinate;
-        },
-        _displayGON: function (oLatLng) {
-            var coordinate = {};
-            coordinate.lat = PositionFormater.decimalToGrade(oLatLng.lat);
-            coordinate.lng = PositionFormater.decimalToGrade(oLatLng.lng);
-            return coordinate;
-        },
-        _displayMeter: function (oXY) {
-            var coordinate = {};
-            coordinate.x = L.Util.formatNum(oXY.x, 2);
-            coordinate.y = L.Util.formatNum(oXY.y, 2);
-            coordinate.unit = 'm';
-            return coordinate;
-        },
-        _displayKMeter: function (oXY) {
-            var coordinate = {};
-            coordinate.x = L.Util.formatNum(oXY.x / 1000, 2);
-            coordinate.y = L.Util.formatNum(oXY.y / 1000, 2);
-            coordinate.unit = 'km';
-            return coordinate;
-        },
-        _project: function (oLatLng, crs) {
-            if (typeof crs === 'function') {
-                crs = crs();
-            }
-            if (typeof crs !== 'object') {
-                return;
-            }
-            if (crs === L.CRS.Simple) {
-                return oLatLng;
-            }
-            if (!crs.projection || typeof crs.projection !== 'object') {
-                return;
-            }
-            var oPoint = crs.projection.project(oLatLng);
-            if (this._currentProjectionType === 'Geographical') {
-                oPoint.lat = oPoint.y;
-                oPoint.lng = oPoint.x;
-            }
-            if (!oPoint || Object.keys(oPoint).length === 0) {
-            }
-            return oPoint;
-        },
-        _setCoordinate: function (oLatLng) {
-            var type = this._currentProjectionSystems.type;
-            var convert = null;
-            var units = this._projectionUnits[type];
-            for (var i = 0; i < units.length; i++) {
-                if (units[i].code === this._currentProjectionUnits) {
-                    convert = units[i].convert;
-                    break;
-                }
-            }
-            var coordinate = {};
-            var oSrs = this._currentProjectionSystems.crs;
-            if (!oSrs) {
-                return;
-            }
-            coordinate = convert(this._project(oLatLng, oSrs));
-            if (!coordinate || Object.keys(coordinate).lenght === 0) {
-                return;
-            }
-            this.GPdisplayCoords(coordinate);
-        },
-        _setElevation: function (oLatLng) {
-            var delay = this.options.altitude.responseDelay;
-            var noDataValue = this.options.altitude.noDataValue;
-            var noDataValueTolerance = this.options.altitude.noDataValueTolerance;
-            this.GPdisplayElevation(oLatLng, delay, noDataValue, noDataValueTolerance);
-        },
-        onMoveStopped: function (oLatLng) {
-            if (this._noRightManagement) {
-                return;
-            }
-            this._setElevation(oLatLng);
-        },
-        onMouseMove: function (e) {
-            var self = this;
-            var oLatLng = e.latlng;
-            this._setCoordinate(oLatLng);
-            clearTimeout(this._timer);
-            this._timer = setTimeout(function () {
-                self.onMoveStopped(oLatLng);
-            }, this.options.altitude.triggerDelay);
-        },
-        onMapMove: function () {
-            var self = this;
-            var map = this._map;
-            var oLatLng = map.getCenter();
-            this._setCoordinate(oLatLng);
-            clearTimeout(this._timer);
-            this._timer = setTimeout(function () {
-                self.onMoveStopped(oLatLng);
-            }, this.options.altitude.triggerDelay);
-        },
-        onRequestAltitude: function (coordinate, callback) {
-            if (!coordinate || Object.keys(coordinate).length === 0) {
-                return;
-            }
-            if (!this.options.displayAltitude) {
-                return;
-            }
-            if (this._noRightManagement) {
-                return;
-            }
-            var options = {};
-            L.Util.extend(options, this.options.altitude.serviceOptions);
-            L.Util.extend(options, {
-                zonly: true,
-                positions: [{
-                        lon: coordinate.lon || coordinate.lng,
-                        lat: coordinate.lat
-                    }]
-            });
-            L.Util.extend(options, {
-                scope: this,
-                onSuccess: function (results) {
-                    if (results && Object.keys(results)) {
-                        callback.call(this, results.elevations[0].z);
-                    }
-                },
-                onFailure: function (error) {
-                }
-            });
-            L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey });
-            Gp.Services.getAltitude(options);
-        },
-        onShowMousePositionClick: function (e) {
-            var map = this._map;
-            if (this._showMousePositionContainer.checked) {
-                this._isDesktop ? map.off('mousemove', this.onMouseMove, this) : map.off('move', this.onMapMove, this);
-            } else {
-                this._isDesktop ? map.on('mousemove', this.onMouseMove, this) : map.on('move', this.onMapMove, this);
-            }
-            this._setElevationPanel(this.options.displayAltitude);
-            this._setCoordinatePanel(this.options.displayCoordinates);
-            if (!this.options.displayCoordinates) {
-                this._setSettingsPanel(false);
-            }
-        },
-        onMousePositionProjectionSystemChange: function (e) {
-            var idx = e.target.selectedIndex;
-            var value = e.target.options[idx].value;
-            var label = e.target.options[idx].label;
-            this._setCurrentSystem(value);
-        },
-        _setCurrentSystem: function (systemCode) {
-            var type = null;
-            for (var i = 0; i < this._projectionSystems.length; ++i) {
-                if (this._projectionSystems[i].code == systemCode) {
-                    type = this._projectionSystems[i].type;
-                    break;
-                }
-            }
-            if (!type) {
-                return;
-            }
-            if (type !== this._currentProjectionType) {
-                this._setTypeUnitsPanel(type);
-            }
-            this._currentProjectionSystems = this._projectionSystems[Number(systemCode)];
-            if (!this._isDesktop) {
-                this.onMapMove();
-            }
-        },
-        onMousePositionProjectionSystemMouseOver: function (e) {
-            var map = this._map;
-            if (!map) {
-                return;
-            }
-            var systemList = document.getElementById(this._addUID('GPmousePositionProjectionSystem'));
-            systemList.innerHTML = '';
-            for (var j = 0; j < this._projectionSystems.length; j++) {
-                var proj = this._projectionSystems[j];
-                if (proj.geoBBox) {
-                    if (map.getBounds()._southWest.lng > proj.geoBBox.right || map.getBounds()._southWest.lat > proj.geoBBox.top || map.getBounds()._northEast.lng < proj.geoBBox.left || map.getBounds()._northEast.lat < proj.geoBBox.bottom) {
-                        if (proj === this._currentProjectionSystems) {
-                            var option = document.createElement('option');
-                            option.value = proj.code;
-                            option.text = proj.label || j;
-                            option.setAttribute('selected', 'selected');
-                            option.setAttribute('disabled', 'disabled');
-                            systemList.appendChild(option);
-                        }
-                        continue;
-                    }
-                }
-                var option = document.createElement('option');
-                option.value = proj.code;
-                option.text = proj.label || j;
-                if (proj === this._currentProjectionSystems) {
-                    option.setAttribute('selected', 'selected');
-                }
-                systemList.appendChild(option);
-            }
-        },
-        onMousePositionProjectionUnitsChange: function (e) {
-            var idx = e.target.selectedIndex;
-            var value = e.target.options[idx].value;
-            var label = e.target.options[idx].label;
-            this._currentProjectionUnits = value;
-            if (!this._isDesktop) {
-                this.onMapMove();
-            }
-        }
-    });
-    return MousePosition;
-}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, CommonControlsMousePositionDOM, LeafletControlsUtilsPositionFormater, LeafletCRSCRS);
-CommonControlsReverseGeocodingDOM = function () {
-    var ReverseGeocodingDOM = {
-        _addUID: function (id) {
-            return id + '-' + this._uid;
-        },
-        _createMainContainerElement: function () {
-            var container = document.createElement('div');
-            container.id = this._addUID('GPreverseGeocoding');
-            container.className = 'GPwidget';
-            return container;
-        },
-        _createShowReverseGeocodingElement: function () {
-            var input = document.createElement('input');
-            input.id = this._addUID('GPshowReverseGeocoding');
-            input.type = 'checkbox';
-            return input;
-        },
-        _createShowReverseGeocodingPictoElement: function () {
-            var self = this;
-            var label = document.createElement('label');
-            label.id = this._addUID('GPshowReverseGeocodingPicto');
-            label.className = 'GPshowAdvancedToolPicto';
-            label.htmlFor = this._addUID('GPshowReverseGeocoding');
-            label.title = 'Ouvrir la recherche inverse';
-            if (label.addEventListener) {
-                label.addEventListener('click', function () {
-                    self.onShowReverseGeocodingClick();
-                });
-            } else if (label.attachEvent) {
-                label.attachEvent('onclick', function () {
-                    self.onShowReverseGeocodingClick();
-                });
-            }
-            var spanOpen = document.createElement('span');
-            spanOpen.id = this._addUID('GPshowReverseGeocodingOpen');
-            spanOpen.className = 'GPshowAdvancedToolOpen';
-            label.appendChild(spanOpen);
-            return label;
-        },
-        _createReverseGeocodingWaitingElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPreverseGeocodingCalcWaitingContainer');
-            div.className = 'GPreverseGeocodingCalcWaitingContainerHidden';
-            var p = document.createElement('p');
-            p.className = 'GPreverseGeocodingCalcWaiting';
-            p.innerHTML = 'Recherche en cours...';
-            div.appendChild(p);
-            return div;
-        },
-        _createReverseGeocodingResultsPanelElement: function () {
-            var resultsPanelDiv = document.createElement('div');
-            resultsPanelDiv.id = this._addUID('GPreverseGeocodingResultsPanel');
-            resultsPanelDiv.className = 'GPpanel GPreverseGeocodingComponentHidden';
-            return resultsPanelDiv;
-        },
-        _createReverseGeocodingResultsListElement: function () {
-            var container = document.createElement('div');
-            container.id = this._addUID('GPreverseGeocodingResultsList');
-            return container;
-        },
-        _createReverseGeocodingResultElement: function (locationDescription, id) {
-            var context = this;
-            var container = document.getElementById(this._addUID('GPreverseGeocodingResultsList'));
-            var div = document.createElement('div');
-            div.id = this._addUID('ReverseGeocodedLocation_' + id);
-            div.className = 'GPautoCompleteProposal';
-            div.innerHTML = locationDescription;
-            div.title = locationDescription;
-            if (div.addEventListener) {
-                div.addEventListener('mouseover', function (e) {
-                    context.onReverseGeocodingResultMouseOver(e);
-                });
-                div.addEventListener('mouseout', function (e) {
-                    context.onReverseGeocodingResultMouseOut(e);
-                });
-                div.addEventListener('click', function (e) {
-                    if (typeof context.onReverseGeocodingResultClick === 'function') {
-                        context.onReverseGeocodingResultClick(e);
-                    }
-                });
-            } else if (div.attachEvent) {
-                div.attachEvent('onmouseover', function (e) {
-                    context.onReverseGeocodingResultMouseOver(e);
-                });
-                div.attachEvent('onmouseout', function (e) {
-                    context.onReverseGeocodingResultMouseOut(e);
-                });
-                div.attachEvent('onclick', function (e) {
-                    if (typeof context.onReverseGeocodingResultClick === 'function') {
-                        context.onReverseGeocodingResultClick(e);
-                    }
-                });
-            }
-            container.appendChild(div);
-        },
-        _createReverseGeocodingPanelElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPreverseGeocodingPanel');
-            div.className = 'GPpanel';
-            return div;
-        },
-        _createReverseGeocodingPanelHeaderElement: function () {
-            var container = document.createElement('div');
-            container.className = 'GPpanelHeader';
-            return container;
-        },
-        _createReverseGeocodingPanelReturnPictoElement: function () {
-            var self = this;
-            var divNew = document.createElement('div');
-            divNew.id = this._addUID('GPreverseGeocodingReturnPicto');
-            divNew.title = 'Nouvelle recherche';
-            divNew.className = 'GPreverseGeocodingReturnPictoHidden';
-            if (divNew.addEventListener) {
-                divNew.addEventListener('click', function (e) {
-                    document.getElementById(self._addUID('GPreverseGeocodingResultsPanel')).className = 'GProuteComponentHidden';
-                    document.getElementById(self._addUID('GPreverseGeocodingForm')).className = '';
-                    document.getElementById(self._addUID('GPreverseGeocodingHeaderTitle')).innerHTML = 'Recherche inverse';
-                    document.getElementById(self._addUID('GPreverseGeocodingReturnPicto')).className = 'GPreverseGeocodingReturnPictoHidden';
-                    self.onGPreverseGeocodingReturnPictoClick(e);
-                });
-            } else if (divNew.attachEvent) {
-                divNew.attachEvent('onclick', function (e) {
-                    document.getElementById(self._addUID('GPreverseGeocodingResultsPanel')).className = 'GProuteComponentHidden';
-                    document.getElementById(self._addUID('GPreverseGeocodingForm')).className = '';
-                    document.getElementById(self._addUID('GPreverseGeocodingHeaderTitle')).innerHTML = 'Recherche inverse';
-                    document.getElementById(self._addUID('GPreverseGeocodingReturnPicto')).className = 'GPreverseGeocodingReturnPictoHidden';
-                    self.onGPreverseGeocodingReturnPictoClick(e);
-                });
-            }
-            return divNew;
-        },
-        _createReverseGeocodingPanelTitleElement: function () {
-            var div = document.createElement('div');
-            div.className = 'GPpanelTitle';
-            div.id = this._addUID('GPreverseGeocodingHeaderTitle');
-            div.innerHTML = 'Recherche inverse';
-            return div;
-        },
-        _createReverseGeocodingPanelCloseElement: function () {
-            var self = this;
-            var divClose = document.createElement('div');
-            divClose.id = this._addUID('GPreverseGeocodingPanelClose');
-            divClose.className = 'GPpanelClose';
-            divClose.title = 'Fermer le panneau';
-            if (divClose.addEventListener) {
-                divClose.addEventListener('click', function () {
-                    document.getElementById(self._addUID('GPshowReverseGeocodingPicto')).click();
-                }, false);
-            } else if (divClose.attachEvent) {
-                divClose.attachEvent('onclick', function () {
-                    document.getElementById(self._addUID('GPshowReverseGeocodingPicto')).click();
-                });
-            }
-            return divClose;
-        },
-        _createReverseGeocodingPanelFormElement: function () {
-            var self = this;
-            var form = document.createElement('form');
-            form.id = this._addUID('GPreverseGeocodingForm');
-            if (form.addEventListener) {
-                form.addEventListener('submit', function (e) {
-                    e.preventDefault();
-                    self.onReverseGeocodingSubmit();
-                });
-            } else if (form.attachEvent) {
-                form.attachEvent('onsubmit', function (e) {
-                    e.preventDefault();
-                    self.onReverseGeocodingSubmit();
-                });
-            }
-            return form;
-        },
-        _createReverseGeocodingFormModeChoiceGeocodingTypeElement: function (resources) {
-            var context = this;
-            var div = document.createElement('div');
-            div.className = 'GPflexInput';
-            var label = document.createElement('label');
-            label.className = 'GPreverseGeocodingCodeLabel';
-            label.innerHTML = 'Recherche par';
-            label.title = 'Recherche par';
-            div.appendChild(label);
-            var select = document.createElement('select');
-            select.className = 'GPreverseGeocodingCode';
-            if (select.addEventListener) {
-                select.addEventListener('change', function (e) {
-                    context.onReverseGeocodingTypeChange(e);
-                });
-            } else if (select.attachEvent) {
-                select.attachEvent('onchange', function (e) {
-                    context.onReverseGeocodingTypeChange(e);
-                });
-            }
-            if (!resources || !Array.isArray(resources)) {
-                resources = [
-                    'StreetAddress',
-                    'PositionOfInterest',
-                    'CadastralParcel'
-                ];
-            }
-            for (var i = 0; i < resources.length; i++) {
-                switch (resources[i]) {
-                case 'PositionOfInterest':
-                    var POIOption = document.createElement('option');
-                    POIOption.value = 'PositionOfInterest';
-                    POIOption.text = 'Lieux/toponymes';
-                    select.appendChild(POIOption);
-                    break;
-                case 'StreetAddress':
-                    var SAOption = document.createElement('option');
-                    SAOption.value = 'StreetAddress';
-                    SAOption.text = 'Adresses';
-                    select.appendChild(SAOption);
-                    break;
-                case 'CadastralParcel':
-                    var CPOption = document.createElement('option');
-                    CPOption.value = 'CadastralParcel';
-                    CPOption.text = 'Parcelles cadastrales';
-                    select.appendChild(CPOption);
-                    break;
-                case 'Administratif':
-                    var adminOption = document.createElement('option');
-                    adminOption.value = 'Administratif';
-                    adminOption.text = 'Unités administratives';
-                    select.appendChild(adminOption);
-                    break;
-                default:
-                    break;
-                }
-            }
-            div.appendChild(select);
-            return div;
-        },
-        _createReverseGeocodingFormModeChoiceGeocodingDelimitationElement: function (delimitations) {
-            var context = this;
-            var div = document.createElement('div');
-            div.className = 'GPflexInput';
-            var label = document.createElement('label');
-            label.className = 'GPreverseGeocodingCodeLabel';
-            label.innerHTML = 'Délimitation';
-            label.title = 'Délimitation';
-            div.appendChild(label);
-            var select = document.createElement('select');
-            select.className = 'GPreverseGeocodingCode';
-            if (select.addEventListener) {
-                select.addEventListener('change', function (e) {
-                    context.onReverseGeocodingDelimitationChange(e);
-                });
-            } else if (select.attachEvent) {
-                select.attachEvent('onchange', function (e) {
-                    context.onReverseGeocodingDelimitationChange(e);
-                });
-            }
-            if (!delimitations || !Array.isArray(delimitations)) {
-                delimitations = [
-                    'Point',
-                    'Circle',
-                    'Extent'
-                ];
-            }
-            for (var i = 0; i < delimitations.length; i++) {
-                switch (delimitations[i].toLowerCase()) {
-                case 'point':
-                    var pointOption = document.createElement('option');
-                    pointOption.value = 'point';
-                    pointOption.text = 'Pointer un lieu';
-                    select.appendChild(pointOption);
-                    break;
-                case 'circle':
-                    var circleOption = document.createElement('option');
-                    circleOption.value = 'circle';
-                    circleOption.text = 'Dessiner un cercle';
-                    select.appendChild(circleOption);
-                    break;
-                case 'extent':
-                    var extentOption = document.createElement('option');
-                    extentOption.value = 'extent';
-                    extentOption.text = 'Dessiner une emprise';
-                    select.appendChild(extentOption);
-                    break;
-                default:
-                    break;
-                }
-            }
-            div.appendChild(select);
-            return div;
-        },
-        _createReverseGeocodingSubmitFormElement: function () {
-            var input = document.createElement('input');
-            input.id = this._addUID('GPreverseGeocodingSubmit');
-            input.className = 'GPinputSubmit';
-            input.type = 'submit';
-            input.value = 'Rechercher';
-            return input;
-        }
-    };
-    return ReverseGeocodingDOM;
-}();
-LeafletControlsReverseGeocoding = function (L, P, woodman, Gp, RightManagement, ID, IconDefault, ReverseGeocodingDOM) {
-    var ReverseGeocoding = L.Control.extend({
-        includes: ReverseGeocodingDOM,
-        options: {
-            position: 'bottomleft',
-            collapsed: true,
-            resources: [
-                'StreetAddress',
-                'PositionOfInterest'
-            ],
-            delimitations: [
-                'Point',
-                'Circle',
-                'Extent'
-            ],
-            reverseGeocodeOptions: {}
-        },
-        initialize: function (options) {
-            L.Util.extend(this.options, options);
-            this._noRightManagement = false;
-            this._servicesRightManagement = {};
-            this._checkRightsManagement();
-            this._checkInputOptions();
-            this._uid = ID.generate();
-            this._currentGeocodingType = null;
-            this._initGeocodingType();
-            this._currentGeocodingDelimitation = null;
-            this._initGeocodingDelimitation();
-            this._showReverseGeocodingContainer = null;
-            this._panelHeaderContainer = null;
-            this._panelTitleContainer = null;
-            this._returnPictoContainer = null;
-            this._formContainer = null;
-            this._resultsContainer = null;
-            this._resultsListContainer = null;
-            this._waitingContainer = null;
-            this._inputFeaturesLayer = null;
-            this._inputResultsLayer = null;
-            this._lastIdLayer = 0;
-            this._currentIdLayer = 0;
-            this._currentFeature = null;
-            this._requestPosition = null;
-            this._requestCircleFilter = null;
-            this._requestBboxFilter = null;
-            this._waiting = false;
-            this._timer = null;
-            this._reverseGeocodingLocations = [];
-        },
-        onAdd: function (map) {
-            var container = this._container = this._initLayout();
-            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
-            if (map) {
-                if (!this.options.collapsed) {
-                    this._activateMapInteraction(map);
-                }
-            }
-            return container;
-        },
-        onRemove: function () {
-        },
-        _checkRightsManagement: function () {
-            var _resources = [];
-            var _key;
-            var _opts = null;
-            _key = this.options.reverseGeocodeOptions.apiKey;
-            _opts = this.options.reverseGeocodeOptions.filterOptions;
-            _resources = _opts ? _opts.type : [];
-            if (!_resources || _resources.length === 0) {
-                _resources = this.options.resources;
-            }
-            if (!_resources || _resources.length === 0) {
-                _resources = [
-                    'StreetAddress',
-                    'PositionOfInterest'
-                ];
-            }
-            var rightManagementGeocode = RightManagement.check({
-                key: _key || this.options.apiKey,
-                resources: _resources,
-                services: ['Geocode']
-            });
-            if (!rightManagementGeocode) {
-                this._noRightManagement = true;
-                return;
-            }
-            if (!this.options.apiKey) {
-                this.options.apiKey = rightManagementGeocode.key;
-            }
-            if (rightManagementGeocode) {
-                this._servicesRightManagement['Geocode'] = rightManagementGeocode['Geocode'];
-            }
-        },
-        _checkInputOptions: function () {
-            var i;
-            if (this.options.resources) {
-                var resources = this.options.resources;
-                if (!Array.isArray(resources)) {
-                    console.log('[ReverseGeocoding] \'options.resources\' parameter should be an array');
-                    resources = null;
-                }
-                var resourcesList = [
-                    'StreetAddress',
-                    'PositionOfInterest',
-                    'CadastralParcel',
-                    'Administratif'
-                ];
-                for (i = 0; i < resources.length; i++) {
-                    if (resourcesList.indexOf(resources[i]) === -1) {
-                        console.log('[ReverseGeocoding] options.resources : ' + resources[i] + ' is not a resource for reverse geocode');
-                    }
-                }
-            }
-            if (this.options.delimitations) {
-                var delimitations = this.options.delimitations;
-                if (!Array.isArray(delimitations)) {
-                    console.log('[ReverseGeocoding] \'options.delimitations\' parameter should be an array');
-                    delimitations = null;
-                }
-                var delimitationsList = [
-                    'Circle',
-                    'Point',
-                    'Extent'
-                ];
-                for (i = 0; i < delimitations.length; i++) {
-                    if (delimitationsList.indexOf(delimitations[i]) === -1) {
-                        console.log('[ReverseGeocoding] options.delimitations : ' + delimitations[i] + ' is not a delimitation for reverse geocode');
-                    }
-                }
-            }
-        },
-        _initGeocodingType: function () {
-            this._currentGeocodingType = 'StreetAddress';
-            var resources = this.options.resources;
-            if (!resources || resources.length === 0) {
-                this.options.resources = [
-                    'StreetAddress',
-                    'PositionOfInterest',
-                    'CadastralParcel'
-                ];
-            }
-            if (Array.isArray(resources) && resources.length) {
-                var noRightsIndexes = [];
-                for (var i = 0; i < resources.length; i++) {
-                    if (this._servicesRightManagement['Geocode'].indexOf(resources[i]) < 0) {
-                        noRightsIndexes.push(i);
-                        console.log('[ReverseGeocode] no rights for options.resources : ' + resources[i]);
-                    }
-                }
-                if (noRightsIndexes.length !== 0) {
-                    for (var j = 0; j < noRightsIndexes.length; j++) {
-                        resources.splice(noRightsIndexes[j], 1);
-                    }
-                }
-                if (resources[0] === 'StreetAddress' || resources[0] === 'PositionOfInterest' || resources[0] === 'CadastralParcel' || resources[0] === 'Administratif') {
-                    this._currentGeocodingType = resources[0];
-                }
-            }
-            var serviceOptions = this.options.reverseGeocodeOptions;
-            if (serviceOptions.filterOptions && Array.isArray(serviceOptions.filterOptions.type) && serviceOptions.filterOptions.type.length !== 0) {
-                this._currentGeocodingType = serviceOptions.filterOptions.type[0];
-            }
-        },
-        _initGeocodingDelimitation: function () {
-            this._currentGeocodingDelimitation = 'Point';
-            var delimitations = this.options.delimitations;
-            if (!delimitations || delimitations.length === 0) {
-                this.options.delimitations = [
-                    'Point',
-                    'Circle',
-                    'Extent'
-                ];
-            }
-            if (Array.isArray(delimitations) && delimitations.length) {
-                var d = delimitations[0].toLowerCase();
-                if (d === 'point' || d === 'circle' || d === 'extent') {
-                    this._currentGeocodingDelimitation = delimitations[0];
-                }
-            }
-        },
-        _initLayout: function () {
-            var container = this._createMainContainerElement();
-            var inputShow = this._showReverseGeocodingContainer = this._createShowReverseGeocodingElement();
-            container.appendChild(inputShow);
-            if (!this.options.collapsed) {
-                inputShow.checked = true;
-            }
-            var picto = this._createShowReverseGeocodingPictoElement();
-            container.appendChild(picto);
-            var reverseGeocodingPanel = this._createReverseGeocodingPanelElement();
-            var panelHeader = this._panelHeaderContainer = this._createReverseGeocodingPanelHeaderElement();
-            var returnPicto = this._returnPictoContainer = this._createReverseGeocodingPanelReturnPictoElement();
-            panelHeader.appendChild(returnPicto);
-            var panelTitle = this._panelTitleContainer = this._createReverseGeocodingPanelTitleElement();
-            panelHeader.appendChild(panelTitle);
-            var closeDiv = this._createReverseGeocodingPanelCloseElement();
-            panelHeader.appendChild(closeDiv);
-            reverseGeocodingPanel.appendChild(panelHeader);
-            var reverseGeocodingForm = this._formContainer = this._createReverseGeocodingPanelFormElement();
-            reverseGeocodingForm.appendChild(this._createReverseGeocodingFormModeChoiceGeocodingTypeElement(this.options.resources));
-            reverseGeocodingForm.appendChild(this._createReverseGeocodingFormModeChoiceGeocodingDelimitationElement(this.options.delimitations));
-            var submit = this._createReverseGeocodingSubmitFormElement();
-            reverseGeocodingForm.appendChild(submit);
-            reverseGeocodingPanel.appendChild(reverseGeocodingForm);
-            var waiting = this._waitingContainer = this._createReverseGeocodingWaitingElement();
-            reverseGeocodingPanel.appendChild(waiting);
-            var resultsPanel = this._resultsContainer = this._createReverseGeocodingResultsPanelElement();
-            var reverseGeocodingResultsList = this._resultsListContainer = this._createReverseGeocodingResultsListElement();
-            resultsPanel.appendChild(reverseGeocodingResultsList);
-            reverseGeocodingPanel.appendChild(resultsPanel);
-            container.appendChild(reverseGeocodingPanel);
-            return container;
-        },
-        _activateMapInteraction: function (map) {
-            if (this._inputFeaturesLayer === null) {
-                this._inputFeaturesLayer = new L.FeatureGroup();
-                map.addLayer(this._inputFeaturesLayer);
-                var self = this;
-                map.on('draw:created', function (e) {
-                    var layer = e.layer;
-                    var type = e.layerType;
-                    self._setFeaturePosition(layer, type);
-                    self._currentIdLayer = L.Util.stamp(layer);
-                    self._setFeatureLayer(layer);
-                });
-                map.on('draw:drawstart', function () {
-                    self._removeFeatureLayer(self._lastIdLayer);
-                    self._lastIdLayer = self._currentIdLayer;
-                });
-                map.on('draw:drawstop', function () {
-                });
-            }
-            var delimitation = this._currentGeocodingDelimitation.toLowerCase();
-            switch (delimitation) {
-            case 'point':
-                this._activatePointInteraction(map);
-                break;
-            case 'circle':
-                this._activateCircleInteraction(map);
-                break;
-            case 'extent':
-                this._activateBoxInteraction(map);
-                break;
-            default:
-                break;
-            }
-        },
-        _removeMapInteraction: function (map) {
-            if (!map) {
-                return;
-            }
-            if (this._inputFeaturesLayer !== null) {
-                map.off('draw:created');
-                map.off('draw:drawstart');
-                map.off('draw:drawstop');
-                map.removeLayer(this._inputFeaturesLayer);
-                this._inputFeaturesLayer = null;
-            }
-            this._lastIdLayer = this._currentIdLayer = 0;
-            if (this._currentFeature) {
-                this._currentFeature.disable();
-            }
-        },
-        _activatePointInteraction: function (map) {
-            if (this._currentFeature) {
-                this._currentFeature.disable();
-            }
-            L.drawLocal.draw.handlers.marker.tooltip.start = 'click map to place search point';
-            var markerOptions = { repeatMode: true };
-            this._currentFeature = new L.Draw.Marker(map, markerOptions);
-            this._currentFeature.enable();
-        },
-        _activateCircleInteraction: function (map) {
-            if (this._currentFeature) {
-                this._currentFeature.disable();
-            }
-            var circleOptions = { repeatMode: true };
-            this._currentFeature = new L.Draw.Circle(map, circleOptions);
-            this._currentFeature.enable();
-        },
-        _activateBoxInteraction: function (map) {
-            if (this._currentFeature) {
-                this._currentFeature.disable();
-            }
-            var rectangleOptions = { repeatMode: true };
-            this._currentFeature = new L.Draw.Rectangle(map, rectangleOptions);
-            this._currentFeature.enable();
-        },
-        _setFeaturePosition: function (layer, type) {
-            var oLatLng = null;
-            if (type === 'marker') {
-                oLatLng = layer.getLatLng();
-                this._requestPosition = {
-                    x: oLatLng.lat,
-                    y: oLatLng.lng
-                };
-            } else if (type === 'circle') {
-                oLatLng = layer.getLatLng();
-                this._requestPosition = {
-                    x: oLatLng.lat,
-                    y: oLatLng.lng
-                };
-                this._requestCircleFilter = {
-                    x: oLatLng.lat,
-                    y: oLatLng.lng,
-                    radius: layer.getRadius()
-                };
-            } else if (type === 'rectangle') {
-                oLatLng = layer.getBounds();
-                var center = {
-                    lng: (oLatLng.getSouthWest().lng + oLatLng.getNorthEast().lng) / 2,
-                    lat: (oLatLng.getSouthWest().lat + oLatLng.getNorthEast().lat) / 2
-                };
-                this._requestPosition = {
-                    x: center.lat,
-                    y: center.lng
-                };
-                this._requestBboxFilter = {
-                    left: oLatLng.getSouthWest().lat,
-                    right: oLatLng.getNorthEast().lat,
-                    bottom: oLatLng.getSouthWest().lng,
-                    top: oLatLng.getNorthEast().lng
-                };
-            } else {
-            }
-        },
-        _setFeatureLayer: function (layer) {
-            if (!this._inputFeaturesLayer) {
-                return;
-            }
-            this._inputFeaturesLayer.addLayer(layer);
-        },
-        _removeFeatureLayer: function (id) {
-            if (!this._inputFeaturesLayer) {
-                return;
-            }
-            if (id === 0) {
-                return;
-            }
-            if (!id) {
-                this._inputFeaturesLayer.clearLayers();
-            } else {
-                this._inputFeaturesLayer.removeLayer(id);
-            }
-        },
-        _reverseGeocodingRequest: function (settings) {
-            var map = this._map;
-            this._removeMapInteraction(map);
-            var options = {};
-            L.Util.extend(options, this.options.reverseGeocodeOptions);
-            L.Util.extend(options, settings);
-            L.Util.extend(options, {
-                apiKey: this.options.apiKey,
-                srs: 'EPSG:4326',
-                returnFreeForm: false,
-                timeOut: 30000,
-                protocol: 'XHR'
-            });
-            var _type = options.filterOptions.type;
-            if (this._currentGeocodingDelimitation.toLowerCase() === 'circle' && this._requestCircleFilter) {
-                if (this._requestCircleFilter.radius > 1000) {
-                    this._requestCircleFilter.radius = 1000;
-                }
-                L.Util.extend(options, {
-                    filterOptions: {
-                        type: _type,
-                        circle: this._requestCircleFilter
-                    }
-                });
-            }
-            if (this._currentGeocodingDelimitation.toLowerCase() === 'extent' && this._requestBboxFilter) {
-                L.Util.extend(options, {
-                    filterOptions: {
-                        type: _type,
-                        bbox: this._requestBboxFilter
-                    }
-                });
-            }
-            this._displayWaitingContainer();
-            Gp.Services.reverseGeocode(options);
-        },
-        _displayGeocodedLocations: function (locations) {
-            this._clearLocations();
-            this._clearLocationsFeature();
-            this._reverseGeocodingLocations = locations;
-            if (!locations || locations.length === 0) {
-                this._clearInputRequest();
-                return;
-            }
-            this._formContainer.className = 'GPreverseGeocodingComponentHidden';
-            this._hideWaitingContainer();
-            this._panelTitleContainer.innerHTML = 'Résultats de la recherche';
-            this._returnPictoContainer.className = '';
-            this._resultsContainer.className = 'GPpanel';
-            this._fillGeocodedLocationListContainer(locations);
-            this._displayGeocodedLocationsOnMap(locations);
-            var map = this._map;
-            map.fitBounds(this._inputResultsLayer.getBounds());
-        },
-        _fillGeocodedLocationListContainer: function (locations) {
-            for (var i = 0; i < locations.length; i++) {
-                var location = locations[i];
-                var locationDescription = this._fillGeocodedLocationDescription(location);
-                if (locationDescription.length !== 0) {
-                    this._createReverseGeocodingResultElement(locationDescription, i);
-                }
-            }
-        },
-        _fillGeocodedLocationDescription: function (location) {
-            if (!location || !location.placeAttributes) {
-                return;
-            }
-            var attr = location.placeAttributes;
-            var locationDescription = '';
-            switch (location.type) {
-            case 'StreetAddress':
-                if (attr.street) {
-                    locationDescription += attr.number ? attr.number + ' ' : '';
-                    locationDescription += attr.street + ', ';
-                }
-                locationDescription += attr.postalCode + ' ' + attr.commune;
-                break;
-            case 'PositionOfInterest':
-                if (location.matchType === 'City' && attr.commune) {
-                    locationDescription += attr.commune;
-                    locationDescription += attr.postalCode ? ', ' + attr.postalCode : '';
-                } else if (location.matchType === 'Département' && attr.municipality) {
-                    locationDescription += attr.municipality;
-                    locationDescription += attr.postalCode ? ', ' + attr.postalCode : '';
-                } else if (location.matchType === 'Toponym' && attr.municipality) {
-                    locationDescription += attr.municipality;
-                    locationDescription += attr.postalCode ? ', ' + attr.postalCode : '';
-                    locationDescription += attr.commune ? ' ' + attr.commune : '';
-                } else {
-                    locationDescription += attr.municipality ? attr.municipality : '';
-                }
-                locationDescription += attr.nature ? ' (' + attr.nature + ') ' : '';
-                break;
-            case 'CadastralParcel':
-                locationDescription += attr.cadastralParcel ? attr.cadastralParcel : '';
-                locationDescription += attr.municipality ? ' (' + attr.municipality + ')' : '';
-                break;
-            case 'Administratif':
-                locationDescription += attr.municipality ? attr.municipality : '';
-                if (attr.inseeDepartment) {
-                    locationDescription += '(Département)';
-                } else if (attr.inseeRegion) {
-                    locationDescription += '(Région)';
-                }
-                break;
-            default:
-                locationDescription += attr.municipality ? attr.municipality : '';
-                break;
-            }
-            return locationDescription;
-        },
-        _displayGeocodedLocationsOnMap: function (locations) {
-            var map = this._map;
-            var self = this;
-            function _setHighLight(e) {
-                var layer = e.target;
-                layer.setIcon(new IconDefault('red'));
-                var div = L.DomUtil.get('ReverseGeocodedLocation_' + layer.options.id + '-' + self._uid);
-                L.DomUtil.addClass(div, 'GPreverseGeocodedLocationHighlight');
-                div.scrollIntoView(false);
-            }
-            function _resetHighLight(e) {
-                var layer = e.target;
-                layer.setIcon(new IconDefault('green'));
-                var div = L.DomUtil.get('ReverseGeocodedLocation_' + layer.options.id + '-' + self._uid);
-                L.DomUtil.removeClass(div, 'GPreverseGeocodedLocationHighlight');
-            }
-            this._inputResultsLayer = new L.FeatureGroup();
-            map.addLayer(this._inputResultsLayer);
-            for (var i = 0; i < locations.length; i++) {
-                var location = locations[i];
-                if (!location) {
-                    continue;
-                }
-                var options = {
-                    id: i,
-                    icon: new IconDefault('green'),
-                    riseOnHover: true,
-                    draggable: false,
-                    clickable: true,
-                    zIndexOffset: 1000
-                };
-                var _marker = L.marker(L.latLng(location.position.x, location.position.y), options);
-                var popupContent = '<ul>';
-                var attributes = location.placeAttributes;
-                for (var attr in attributes) {
-                    if (attributes.hasOwnProperty(attr)) {
-                        if (attr !== 'bbox') {
-                            popupContent += '<li>';
-                            popupContent += '<span class="gp-attname-others-span">' + attr.toUpperCase() + ' : </span>';
-                            popupContent += attributes[attr];
-                            popupContent += ' </li>';
-                        }
-                    }
-                }
-                popupContent += ' </ul>';
-                _marker.bindPopup(popupContent);
-                _marker.on('mouseover', _setHighLight);
-                _marker.on('mouseout', _resetHighLight);
-                this._inputResultsLayer.addLayer(_marker);
-            }
-        },
-        onShowReverseGeocodingClick: function () {
-            var map = this._map;
-            if (this._showReverseGeocodingContainer.checked) {
-                this._removeMapInteraction(map);
-            } else {
-                if (!this._waiting && !this._reverseGeocodingLocations.length) {
-                    this._activateMapInteraction(map);
-                }
-            }
-        },
-        onReverseGeocodingTypeChange: function (e) {
-            var idx = e.target.selectedIndex;
-            var value = e.target.options[idx].value;
-            if (!value) {
-                return;
-            }
-            this._currentGeocodingType = value;
-        },
-        onReverseGeocodingDelimitationChange: function (e) {
-            var idx = e.target.selectedIndex;
-            var value = e.target.options[idx].value;
-            if (!value) {
-                return;
-            }
-            this._currentGeocodingDelimitation = value;
-            this._clearInputRequest();
-            var map = this._map;
-            this._removeMapInteraction(map);
-            this._activateMapInteraction(map);
-        },
-        onGPreverseGeocodingReturnPictoClick: function () {
-            this._clearLocations();
-            this._clearLocationsFeature();
-            this._clearInputRequest();
-            this._activateMapInteraction(this._map);
-        },
-        onReverseGeocodingSubmit: function () {
-            if (!this._requestPosition) {
-                return;
-            }
-            if (this._noRightManagement) {
-                return;
-            }
-            var self = this;
-            this._reverseGeocodingRequest({
-                position: self._requestPosition,
-                filterOptions: { type: [self._currentGeocodingType] },
-                onSuccess: function (results) {
-                    if (results) {
-                        var locations = results.locations;
-                        self._displayGeocodedLocations(locations);
-                        self._hideWaitingContainer();
-                    }
-                },
-                onFailure: function (error) {
-                    self._hideWaitingContainer();
-                    self._clearLocations();
-                    self._clearLocationsFeature();
-                    self._clearInputRequest();
-                }
-            });
-        },
-        onReverseGeocodingResultClick: function (e) {
-        },
-        onReverseGeocodingResultMouseOver: function (e) {
-            var idx = ID.index(e.target.id);
-            if (e.target.classList) {
-                e.target.classList.add('GPreverseGeocodedLocationHighlight');
-            }
-            if (!this._inputResultsLayer) {
-                return;
-            }
-            this._inputResultsLayer.eachLayer(function (layer) {
-                if (layer.options.id === parseInt(idx, 10)) {
-                    layer.fire('mouseover');
-                }
-            });
-        },
-        onReverseGeocodingResultMouseOut: function (e) {
-            var idx = ID.index(e.target.id);
-            if (e.target.classList) {
-                e.target.classList.remove('GPreverseGeocodedLocationHighlight');
-            }
-            if (!this._inputResultsLayer) {
-                return;
-            }
-            this._inputResultsLayer.eachLayer(function (layer) {
-                if (layer.options.id === parseInt(idx, 10)) {
-                    layer.fire('mouseout');
-                }
-            });
-        },
-        _clearLocations: function () {
-            this._reverseGeocodingLocations = [];
-            if (this._resultsListContainer) {
-                while (this._resultsListContainer.firstChild) {
-                    this._resultsListContainer.removeChild(this._resultsListContainer.firstChild);
-                }
-            }
-        },
-        _clearLocationsFeature: function () {
-            var map = this._map;
-            if (this._inputResultsLayer !== null) {
-                map.removeLayer(this._inputResultsLayer);
-                this._inputResultsLayer = null;
-            }
-        },
-        _clearInputRequest: function () {
-            this._requestPosition = null;
-            this._requestCircleFilter = null;
-            this._requestBboxFilter = null;
-        },
-        _displayWaitingContainer: function () {
-            this._waitingContainer.className = 'GPreverseGeocodingCalcWaitingContainerVisible';
-            this._waiting = true;
-            if (this._timer) {
-                clearTimeout(this._timer);
-                this._timer = null;
-            }
-            var context = this;
-            this._timer = setTimeout(function () {
-                if (context._waiting === true) {
-                    context._hideWaitingContainer();
-                } else {
-                    if (context._timer) {
-                        clearTimeout(context._timer);
-                    }
-                }
-            }, 16000);
-        },
-        _hideWaitingContainer: function () {
-            if (this._waiting) {
-                this._waitingContainer.className = 'GPreverseGeocodingCalcWaitingContainerHidden';
-                this._waiting = false;
-                clearTimeout(this._timer);
-                this._timer = null;
-            }
-        }
-    });
-    return ReverseGeocoding;
-}(leaflet, leafletDraw, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, LeafletControlsUtilsIconDefault, CommonControlsReverseGeocodingDOM);
-CommonControlsRouteDOM = function (ID) {
-    var RouteDOM = {
-        _addUID: function (id) {
-            return id + '-' + this._uid;
-        },
-        _createMainContainerElement: function () {
-            var container = document.createElement('div');
-            container.id = this._addUID('GProute');
-            container.className = 'GPwidget';
-            return container;
-        },
-        _createShowRouteElement: function () {
-            var input = document.createElement('input');
-            input.id = this._addUID('GPshowRoute');
-            input.type = 'checkbox';
-            return input;
-        },
-        _createShowRoutePictoElement: function () {
-            var context = this;
-            var label = document.createElement('label');
-            label.id = this._addUID('GPshowRoutePicto');
-            label.className = 'GPshowAdvancedToolPicto';
-            label.htmlFor = this._addUID('GPshowRoute');
-            label.title = 'Ouvrir le calcul d\'itinéraire';
-            if (label.addEventListener) {
-                label.addEventListener('click', function (e) {
-                    context.onShowRoutePanelClick(e);
-                });
-            } else if (label.attachEvent) {
-                label.attachEvent('onclick', function (e) {
-                    context.onShowRoutePanelClick(e);
-                });
-            }
-            var spanOpen = document.createElement('span');
-            spanOpen.id = this._addUID('GPshowRouteOpen');
-            spanOpen.className = 'GPshowAdvancedToolOpen';
-            label.appendChild(spanOpen);
-            return label;
-        },
-        _createRoutePanelElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GProutePanel');
-            div.className = 'GPpanel';
-            return div;
-        },
-        _createRoutePanelHeaderElement: function () {
-            var self = this;
-            var container = document.createElement('div');
-            container.className = 'GPpanelHeader';
-            var div = document.createElement('div');
-            div.className = 'GPpanelTitle';
-            div.innerHTML = 'Calcul d\'itinéraire';
-            container.appendChild(div);
-            var divClose = document.createElement('div');
-            divClose.id = this._addUID('GProutePanelClose');
-            divClose.className = 'GPpanelClose';
-            divClose.title = 'Masquer le panneau';
-            if (divClose.addEventListener) {
-                divClose.addEventListener('click', function () {
-                    document.getElementById(self._addUID('GPshowRoutePicto')).click();
-                }, false);
-            } else if (divClose.attachEvent) {
-                divClose.attachEvent('onclick', function () {
-                    document.getElementById(self._addUID('GPshowRoutePicto')).click();
-                });
-            }
-            container.appendChild(divClose);
-            return container;
-        },
-        _createRoutePanelFormElement: function () {
-            var self = this;
-            var form = document.createElement('form');
-            form.id = this._addUID('GProuteForm');
-            form.setAttribute('onkeypress', 'return event.keyCode != 13;');
-            form.addEventListener('submit', function (e) {
-                console.log(e);
-                e.preventDefault();
-                var points = document.getElementsByClassName(self._addUID('GPlocationPoint'));
-                var start = points[0].childNodes[0].id;
-                var end = points[points.length - 1].childNodes[0].id;
-                var startID = ID.index(start);
-                var endID = ID.index(end);
-                if (document.getElementById(self._addUID('GPlocationOrigin_' + startID)).value == '' && document.getElementById(self._addUID('GPlocationOriginCoords_' + startID)).value == '' || document.getElementById(self._addUID('GPlocationOrigin_' + endID)).value == '' && document.getElementById(self._addUID('GPlocationOriginCoords_' + endID)).value == '') {
-                    return false;
-                }
-                var id;
-                document.getElementById(self._addUID('GProuteResultsStages')).innerHTML = '';
-                for (var i = 0; i < points.length; i++) {
-                    var tag = points[i].childNodes[0].id;
-                    id = ID.index(tag);
-                    if (document.getElementById(self._addUID('GPlocationPoint_' + id)).className == 'GPflexInput GPlocationStageFlexInput') {
-                        var resultStage = document.createElement('div');
-                        resultStage.className = 'GProuteResultsStages';
-                        var resultStageLabel = document.createElement('div');
-                        resultStageLabel.className = 'GProuteResultStageLabel';
-                        resultStageLabel.innerHTML = document.getElementById(self._addUID('GPlocationOriginLabel_' + id)).innerHTML + ' :';
-                        resultStage.appendChild(resultStageLabel);
-                        var resultStageValue = document.createElement('div');
-                        resultStageValue.className = 'GProuteResultStageValue';
-                        var elementCoords = document.getElementById(self._addUID('GPlocationOriginCoords_' + id));
-                        var stageCoords = elementCoords.value;
-                        var visible = elementCoords.className === 'GPlocationOriginVisible' ? true : false;
-                        if (stageCoords != null && stageCoords != '' && visible) {
-                            resultStageValue.innerHTML = stageCoords;
-                        } else {
-                            resultStageValue.innerHTML = document.getElementById(self._addUID('GPlocationOrigin_' + id)).value;
-                        }
-                        resultStage.appendChild(resultStageValue);
-                        if (resultStageValue.innerHTML != '') {
-                            document.getElementById(self._addUID('GProuteResultsStages')).appendChild(resultStage);
-                        }
-                    }
-                }
-                var modeComputation = null;
-                if (document.getElementById(self._addUID('GProuteComputationSelect'))) {
-                    var select = document.getElementById(self._addUID('GProuteResultsComputationSelect'));
-                    select.selectedIndex = document.getElementById(self._addUID('GProuteComputationSelect')).selectedIndex;
-                    modeComputation = select.options[select.selectedIndex].value;
-                }
-                var modeTransport = null;
-                if (document.getElementById(self._addUID('GProuteTransportCar'))) {
-                    if (document.getElementById(self._addUID('GProuteTransportCar')).checked) {
-                        modeTransport = document.getElementById(self._addUID('GProuteTransportCar')).value;
-                    }
-                }
-                if (document.getElementById(self._addUID('GProuteTransportPedestrian'))) {
-                    if (document.getElementById(self._addUID('GProuteTransportPedestrian')).checked) {
-                        modeTransport = document.getElementById(self._addUID('GProuteTransportPedestrian')).value;
-                    }
-                }
-                var exclusions = [];
-                var exclusionsElement = document.getElementsByClassName('GProuteExclusionsOption');
-                for (var j = 0; j < exclusionsElement.length; j++) {
-                    id = exclusionsElement[j].htmlFor;
-                    var el = document.getElementById(id);
-                    if (!el.checked) {
-                        exclusions.push(el.value);
-                    }
-                }
-                self.onRouteComputationSubmit({
-                    computation: modeComputation,
-                    transport: modeTransport,
-                    exclusions: exclusions
-                });
-                return false;
-            });
-            return form;
-        },
-        _createRoutePanelResultsElement: function () {
-            var container = document.createElement('div');
-            container.id = this._addUID('GProuteResultsPanel');
-            container.className = 'GProuteComponentHidden';
-            container.appendChild(this._createRouteResultsStagesElement());
-            container.appendChild(this._createRouteResultsElement());
-            var divBorderUp = document.createElement('div');
-            divBorderUp.className = 'GPfakeBorder GPfakeBorderLeft';
-            container.appendChild(divBorderUp);
-            container.appendChild(this._createRouteShowResultsDetailsElement());
-            var labelShow = document.createElement('label');
-            labelShow.htmlFor = this._addUID('GProuteResultsShowDetails');
-            labelShow.innerHTML = 'Afficher le détail';
-            container.appendChild(labelShow);
-            var labelHide = document.createElement('label');
-            labelHide.htmlFor = this._addUID('GProuteResultsShowDetails');
-            labelHide.innerHTML = 'Masquer le détail';
-            container.appendChild(labelHide);
-            var divBorderDown = document.createElement('div');
-            divBorderDown.className = 'GPfakeBorder';
-            container.appendChild(divBorderDown);
-            container.appendChild(this._createRouteResultsDetailsElement());
-            return container;
-        },
-        _createRouteWaitingElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GProuteCalcWaitingContainer');
-            div.className = 'GProuteCalcWaitingContainerHidden';
-            var p = document.createElement('p');
-            p.className = 'GProuteCalcWaiting';
-            p.innerHTML = 'Calcul en cours...';
-            div.appendChild(p);
-            return div;
-        },
-        _createRouteResultsStagesElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GProuteResultsStages');
-            return div;
-        },
-        _createRouteResultsElement: function () {
-            var self = this;
-            var container = document.createElement('div');
-            container.id = this._addUID('GProuteResults');
-            var divValue = document.createElement('div');
-            divValue.id = this._addUID('GProuteResultsValues');
-            container.appendChild(divValue);
-            var divMode = document.createElement('div');
-            divMode.id = this._addUID('GProuteResultsMode');
-            var select = document.createElement('select');
-            select.id = this._addUID('GProuteResultsComputationSelect');
-            select.className = 'GPinputSelect';
-            select.addEventListener('change', function (e) {
-                self.onRouteModeComputationChangeAndRun(e);
-            });
-            var computes = [
-                {
-                    code: 'fastest',
-                    label: 'Plus rapide'
-                },
-                {
-                    code: 'shortest',
-                    label: 'Plus court'
-                }
-            ];
-            for (var i = 0; i < computes.length; i++) {
-                var option = document.createElement('option');
-                option.value = computes[i].code;
-                option.text = computes[i].label;
-                select.appendChild(option);
-            }
-            divMode.appendChild(select);
-            container.appendChild(divMode);
-            var divNew = document.createElement('div');
-            divNew.id = this._addUID('GProuteResultsNew');
-            divNew.title = 'Modifier le calcul';
-            divNew.addEventListener('click', function (e) {
-                document.getElementById(self._addUID('GProuteResultsPanel')).className = 'GProuteComponentHidden';
-                document.getElementById(self._addUID('GProuteForm')).className = '';
-                self.onShowRouteResultsNewClick(e);
-            });
-            container.appendChild(divNew);
-            return container;
-        },
-        _addRouteResultsValuesElement: function (distance, duration, fconvert) {
-            var div = document.getElementById(this._addUID('GProuteResultsValues'));
-            if (div.childElementCount) {
-                while (div.firstChild) {
-                    div.removeChild(div.firstChild);
-                }
-            }
-            var containerDistance = document.createElement('div');
-            containerDistance.className = 'GProuteResultsValue';
-            var labelDistance = document.createElement('label');
-            labelDistance.className = 'GProuteResultsValueLabel';
-            labelDistance.innerHTML = 'Distance :';
-            containerDistance.appendChild(labelDistance);
-            var distanceLabel = 0;
-            var isKm = parseInt(distance / 1000, 10);
-            if (!isKm) {
-                distanceLabel = Math.round(distance) + ' m';
-            } else {
-                var distanceArrondi = Math.round(distance);
-                distanceArrondi = distanceArrondi / 1000;
-                distanceLabel = distanceArrondi + ' km';
-            }
-            var divDistance = document.createElement('div');
-            divDistance.id = this._addUID('GProuteResultsValueDist');
-            divDistance.innerHTML = distanceLabel;
-            containerDistance.appendChild(divDistance);
-            div.appendChild(containerDistance);
-            var containerDuration = document.createElement('div');
-            containerDuration.className = 'GProuteResultsValue';
-            var labelDuration = document.createElement('label');
-            labelDuration.className = 'GProuteResultsValueLabel';
-            labelDuration.innerHTML = 'Durée :';
-            containerDuration.appendChild(labelDuration);
-            var divDuration = document.createElement('div');
-            divDuration.id = this._addUID('GProuteResultsValueDist');
-            divDuration.innerHTML = fconvert(duration);
-            containerDuration.appendChild(divDuration);
-            div.appendChild(containerDuration);
-            return div;
-        },
-        _createRouteShowResultsDetailsElement: function () {
-            var input = document.createElement('input');
-            input.id = this._addUID('GProuteResultsShowDetails');
-            input.type = 'checkbox';
-            return input;
-        },
-        _createRouteResultsDetailsElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GProuteResultsDetails');
-            return div;
-        },
-        _addRouteResultsDetailsElement: function (instructions, fconvert) {
-            var context = this;
-            var div = document.getElementById(this._addUID('GProuteResultsDetails'));
-            if (div.childElementCount) {
-                while (div.firstChild) {
-                    div.removeChild(div.firstChild);
-                }
-            }
-            var distanceCumul = 0;
-            var durationCumul = 0;
-            for (var i = 0; i < instructions.length; i++) {
-                var id = i + 1;
-                var o = instructions[i];
-                var divNum = document.createElement('div');
-                divNum.className = 'GProuteResultsDetailsNumber';
-                divNum.innerHTML = id + '.';
-                div.appendChild(divNum);
-                durationCumul += parseFloat(o.duration);
-                distanceCumul += parseFloat(o.distance);
-                var distance = 0;
-                var isCumulKm = parseInt(distanceCumul / 1000, 10);
-                if (!isCumulKm) {
-                    distance = Math.round(distanceCumul) + ' m';
-                } else {
-                    var distanceArrondi = Math.round(distanceCumul);
-                    distanceArrondi = distanceArrondi / 1000;
-                    distance = distanceArrondi + ' km';
-                }
-                var divIns = document.createElement('div');
-                divIns.className = 'GProuteResultsDetailsInstruction';
-                divIns.id = this._addUID('GProuteResultsDetailsInstruction_' + id);
-                divIns.title = 'distance : ' + distance + ' / ' + 'temps : ' + fconvert(durationCumul);
-                divIns.innerHTML = o.instruction;
-                divIns.addEventListener('mouseover', function (e) {
-                    context.onRouteResultsDetailsMouseOver(e);
-                });
-                divIns.addEventListener('mouseout', function (e) {
-                    context.onRouteResultsDetailsMouseOut(e);
-                });
-                divIns.addEventListener('click', function (e) {
-                    if (typeof context.onRouteResultsDetailsClick === 'function') {
-                        context.onRouteResultsDetailsClick(e);
-                    }
-                });
-                div.appendChild(divIns);
-            }
-            return div;
-        },
-        _createRoutePanelFormPointElement: function (n, text, visibility) {
-            var context = this;
-            var div = document.createElement('div');
-            div.id = 'GProutePoint' + n;
-            div.className = visibility ? 'GPflexInput GProuteStageFlexInput' : 'GPflexInput GProuteStageFlexInputHidden';
-            var labelOrigin = document.createElement('label');
-            labelOrigin.id = 'GProuteOriginLabel' + n;
-            labelOrigin.htmlFor = 'GProuteOrigin' + n;
-            labelOrigin.innerHTML = text;
-            labelOrigin.addEventListener('click', function () {
-                var i = this.id.charAt(this.id.length - 1);
-                document.getElementById('GProuteOriginCoords' + i).value = '';
-                for (var j = 1; j < 8; j++) {
-                    document.getElementById('GProutePoint' + j).style.display = 'flex';
-                }
-                document.getElementById('GProuteForm').className = '';
-                document.getElementById('GProuteOriginPointer' + i).checked = false;
-                document.getElementById('GProuteOrigin' + i).className = 'GProuteOriginVisible';
-                document.getElementById('GProuteOriginCoords' + i).className = 'GProuteOriginHidden';
-            });
-            div.appendChild(labelOrigin);
-            var inputOrigin = document.createElement('input');
-            inputOrigin.id = 'GProuteOrigin' + n;
-            inputOrigin.className = 'GProuteOriginVisible';
-            inputOrigin.type = 'text';
-            inputOrigin.placeholder = 'Saisir une adresse';
-            inputOrigin.addEventListener('keyup', function (e) {
-                var charCode = e.which || e.keyCode;
-                if (charCode === 13 || charCode === 10) {
-                    return;
-                }
-                var i = this.id.charAt(this.id.length - 1);
-                if (document.getElementById('GProuteOrigin' + i).value.length > 2) {
-                    document.getElementById('GProuteAutoCompleteList' + i).style.display = 'block';
-                } else {
-                    document.getElementById('GProuteAutoCompleteList' + i).style.display = 'none';
-                }
-                context.onAutoCompleteSearchText(e);
-            });
-            inputOrigin.addEventListener('blur', function () {
-                var i = this.id.charAt(this.id.length - 1);
-                document.getElementById('GProuteAutoCompleteList' + i).style.display = 'none';
-            });
-            div.appendChild(inputOrigin);
-            var inputOriginCoord = document.createElement('input');
-            inputOriginCoord.id = 'GProuteOriginCoords' + n;
-            inputOriginCoord.className = 'GProuteOriginHidden';
-            inputOriginCoord.type = 'text';
-            inputOriginCoord.disabled = true;
-            div.appendChild(inputOriginCoord);
-            var inputOriginPointer = document.createElement('input');
-            inputOriginPointer.id = 'GProuteOriginPointer' + n;
-            inputOriginPointer.type = 'checkbox';
-            div.appendChild(inputOriginPointer);
-            var labelOriginPointer = document.createElement('label');
-            labelOriginPointer.id = 'GProuteOriginPointerImg' + n;
-            labelOriginPointer.htmlFor = 'GProuteOriginPointer' + n;
-            labelOriginPointer.className = 'GProuteOriginPointerImg';
-            labelOriginPointer.title = 'Pointer un lieu sur la carte';
-            labelOriginPointer.addEventListener('click', function (evt) {
-                evt.preventDefault();
-                evt.stopPropagation();
-                var i = this.id.charAt(this.id.length - 1);
-                var j;
-                for (j = 1; j < 8; j++) {
-                    if (i != j) {
-                        document.getElementById('GProuteOriginPointer' + j).checked = false;
-                        if (document.getElementById('GProuteOriginCoords' + j).value == 'Pointer un lieu sur la carte') {
-                            document.getElementById('GProuteOriginCoords' + j).value = '';
-                            document.getElementById('GProuteOrigin' + j).className = 'GProuteOriginVisible';
-                            document.getElementById('GProuteOriginCoords' + j).className = 'GProuteOriginHidden';
-                        }
-                    }
-                }
-                if (document.getElementById('GProuteOriginPointer' + i).checked) {
-                    document.getElementById('GProuteOriginCoords' + i).value = '';
-                    for (j = 1; j < 8; j++) {
-                        document.getElementById('GProutePoint' + j).style.display = 'flex';
-                    }
-                    document.getElementById('GProuteForm').className = '';
-                    document.getElementById('GProuteOriginPointer' + i).checked = false;
-                    document.getElementById('GProuteOrigin' + i).className = 'GProuteOriginVisible';
-                    document.getElementById('GProuteOriginCoords' + i).className = 'GProuteOriginHidden';
-                } else {
-                    document.getElementById('GProuteOriginCoords' + i).value = 'Pointer un lieu sur la carte';
-                    for (j = 1; j < 8; j++) {
-                        if (i == j) {
-                            document.getElementById('GProutePoint' + j).style.display = 'flex';
-                        } else {
-                            document.getElementById('GProutePoint' + j).style.display = 'none';
-                        }
-                    }
-                    document.getElementById('GProuteForm').className = 'GProuteFormMini';
-                    document.getElementById('GProuteOriginPointer' + i).checked = true;
-                    document.getElementById('GProuteOrigin' + i).className = 'GProuteOriginHidden';
-                    document.getElementById('GProuteOriginCoords' + i).className = 'GProuteOriginVisible';
-                }
-                context.onRouteMapPointClick(evt);
-            });
-            div.appendChild(labelOriginPointer);
-            return div;
-        },
-        _createRoutePanelFormRemoveStageElement: function (n) {
-            var context = this;
-            var divRm = document.createElement('div');
-            divRm.id = 'GProuteStageRemove' + n;
-            divRm.className = 'GProuteStageRemove';
-            divRm.title = 'Supprimer l\'étape';
-            if (n != 1 && n != 7) {
-                divRm.addEventListener('click', function (e) {
-                    var i = this.id.charAt(this.id.length - 1);
-                    document.getElementById('GProutePoint' + i).className = 'GPflexInput GProuteStageFlexInputHidden';
-                    document.getElementById('GProuteOrigin' + i).value = '';
-                    document.getElementById('GProuteOrigin' + i).className = 'GProuteOriginVisible';
-                    document.getElementById('GProuteOriginCoords' + i).value = '';
-                    document.getElementById('GProuteOriginCoords' + i).className = 'GProuteOriginHidden';
-                    document.getElementById('GProuteStageAdd').style.display = '';
-                    var exclusionsPictoTop = document.getElementById('GPshowRouteExclusionsPicto').style.top;
-                    document.getElementById('GPshowRouteExclusionsPicto').style.top = (parseInt(exclusionsPictoTop, 10) - 33).toString() + 'px';
-                    context.onRouteRemovePointClick(e);
-                });
-            }
-            return divRm;
-        },
-        _createRoutePanelFormAddStageElement: function () {
-            var context = this;
-            var divAdd = document.createElement('div');
-            divAdd.id = 'GProuteStageAdd';
-            divAdd.title = 'Ajouter une étape';
-            divAdd.addEventListener('click', function (e) {
-                var lastStage = 1;
-                var nbStages = 0;
-                for (var i = 2; i < 7; i++) {
-                    if (document.getElementById('GProutePoint' + i).className == 'GPflexInput GProuteStageFlexInputHidden') {
-                        if (lastStage == 1) {
-                            lastStage = i;
-                        }
-                    } else {
-                        nbStages++;
-                    }
-                }
-                if (lastStage < 7) {
-                    document.getElementById('GProutePoint' + lastStage).className = 'GPflexInput GProuteStageFlexInput';
-                    var exclusionsPictoTop = document.getElementById('GPshowRouteExclusionsPicto').style.top;
-                    document.getElementById('GPshowRouteExclusionsPicto').style.top = (parseInt(exclusionsPictoTop, 10) + 33).toString() + 'px';
-                }
-                if (nbStages == 4) {
-                    document.getElementById('GProuteStageAdd').style.display = 'none';
-                }
-                context.onRouteAddPointClick(e);
-            });
-            return divAdd;
-        },
-        _createRoutePanelFormAutoCompleteListElement: function (n) {
-            var context = this;
-            var div = document.createElement('div');
-            div.id = 'GProuteAutoCompleteList' + n;
-            div.className = 'GPadvancedAutoCompleteList';
-            if (div.addEventListener) {
-                div.addEventListener('click', function (e) {
-                    context.onAutoCompletedResultsItemClick(e);
-                    document.getElementById('GProuteAutoCompleteList' + n).style.display = 'none';
-                }, false);
-            } else if (div.attachEvent) {
-                div.attachEvent('onclick', function (e) {
-                    context.onAutoCompletedResultsItemClick(e);
-                    document.getElementById('GProuteAutoCompleteList' + n).style.display = 'none';
-                });
-            }
-            return div;
-        },
-        _createRouteAutoCompletedLocationElement: function (location, n, id) {
-            var container = document.getElementById('GProuteAutoCompleteList' + n);
-            var div = document.createElement('div');
-            div.id = 'AutoCompletedLocation' + id;
-            div.className = 'GPautoCompleteProposal';
-            div.innerHTML = location.fullText;
-            container.appendChild(div);
-        },
-        _createRoutePanelFormModeChoiceElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GProuteModeChoice');
-            return div;
-        },
-        _createRoutePanelFormModeChoiceTransportElement: function (transports) {
-            var context = this;
-            var div = document.createElement('div');
-            div.id = this._addUID('GProuteTransportChoice');
-            var span = document.createElement('span');
-            span.className = 'GProuteModeLabel';
-            span.innerHTML = 'Mode de transport';
-            div.appendChild(span);
-            for (var i = 0; i < transports.length; i++) {
-                var transport = transports[i];
-                if (transport === 'Voiture') {
-                    var inputCar = document.createElement('input');
-                    inputCar.id = this._addUID('GProuteTransportCar');
-                    inputCar.type = 'radio';
-                    inputCar.name = 'GProuteTransport';
-                    inputCar.value = 'Voiture';
-                    if (i === 0) {
-                        inputCar.checked = true;
-                    }
-                    if (inputCar.addEventListener) {
-                        inputCar.addEventListener('change', function (e) {
-                            context.onRouteModeTransportChange(e);
-                        });
-                    } else if (inputCar.attachEvent) {
-                        inputCar.attachEvent('onchange', function (e) {
-                            context.onRouteModeTransportChange(e);
-                        });
-                    }
-                    div.appendChild(inputCar);
-                    var labelCar = document.createElement('label');
-                    labelCar.className = 'GProuteTransportImg';
-                    labelCar.htmlFor = this._addUID('GProuteTransportCar');
-                    labelCar.title = 'Voiture';
-                    div.appendChild(labelCar);
-                }
-                if (transport === 'Pieton') {
-                    var inputPedestrian = document.createElement('input');
-                    inputPedestrian.id = this._addUID('GProuteTransportPedestrian');
-                    inputPedestrian.type = 'radio';
-                    inputPedestrian.name = 'GProuteTransport';
-                    inputPedestrian.value = 'Pieton';
-                    if (i === 0) {
-                        inputPedestrian.checked = true;
-                    }
-                    if (inputPedestrian.addEventListener) {
-                        inputPedestrian.addEventListener('change', function (e) {
-                            context.onRouteModeTransportChange(e);
-                        });
-                    } else if (inputPedestrian.attachEvent) {
-                        inputPedestrian.attachEvent('onchange', function (e) {
-                            context.onRouteModeTransportChange(e);
-                        });
-                    }
-                    div.appendChild(inputPedestrian);
-                    var labelPedestrian = document.createElement('label');
-                    labelPedestrian.className = 'GProuteTransportImg';
-                    labelPedestrian.htmlFor = this._addUID('GProuteTransportPedestrian');
-                    labelPedestrian.title = 'Piéton';
-                    div.appendChild(labelPedestrian);
-                }
-            }
-            return div;
-        },
-        _createRoutePanelFormModeChoiceComputeElement: function () {
-            var context = this;
-            var div = document.createElement('div');
-            div.id = this._addUID('GProuteComputationChoice');
-            var span = document.createElement('span');
-            span.className = 'GProuteModeLabel';
-            span.innerHTML = 'Mode de calcul';
-            div.appendChild(span);
-            var select = document.createElement('select');
-            select.id = this._addUID('GProuteComputationSelect');
-            select.className = 'GPinputSelect';
-            select.addEventListener('change', function (e) {
-                context.onRouteModeComputationChange(e);
-            });
-            var computes = [
-                {
-                    code: 'fastest',
-                    label: 'Plus rapide'
-                },
-                {
-                    code: 'shortest',
-                    label: 'Plus court'
-                }
-            ];
-            for (var i = 0; i < computes.length; i++) {
-                var option = document.createElement('option');
-                option.value = computes[i].code;
-                option.text = computes[i].label;
-                select.appendChild(option);
-            }
-            div.appendChild(select);
-            return div;
-        },
-        _createShowRouteExclusionsElement: function () {
-            var input = document.createElement('input');
-            input.id = this._addUID('GPshowRouteExclusions');
-            input.type = 'checkbox';
-            return input;
-        },
-        _createShowRouteExclusionsPictoElement: function () {
-            var context = this;
-            var label = document.createElement('label');
-            label.id = this._addUID('GPshowRouteExclusionsPicto');
-            label.className = 'GPshowMoreOptions GPshowRouteExclusionsPicto';
-            label.htmlFor = this._addUID('GPshowRouteExclusions');
-            label.title = 'Exclusions';
-            label.style.top = '185px';
-            if (label.addEventListener) {
-                label.addEventListener('click', function (e) {
-                    context.onShowRouteExclusionsClick(e);
-                });
-            } else if (label.attachEvent) {
-                label.attachEvent('onclick', function (e) {
-                    context.onShowRouteExclusionsClick(e);
-                });
-            }
-            return label;
-        },
-        _createRoutePanelFormExclusionsElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GProuteExclusions');
-            var span = document.createElement('span');
-            span.className = 'GProuteExclusionsLabel';
-            span.innerHTML = 'Passages autorisés';
-            div.appendChild(span);
-            return div;
-        },
-        _createRoutePanelFormExclusionOptionsElement: function (exclusions) {
-            var context = this;
-            var div = document.createElement('div');
-            div.className = 'GProuteExclusionsOptions';
-            for (var value in exclusions) {
-                if (exclusions.hasOwnProperty(value)) {
-                    var status = exclusions[value];
-                    switch (value) {
-                    case 'toll':
-                        var inputToll = document.createElement('input');
-                        inputToll.id = this._addUID('GProuteExclusionsToll');
-                        inputToll.type = 'checkbox';
-                        inputToll.value = 'Toll';
-                        inputToll.checked = !status;
-                        if (inputToll.addEventListener) {
-                            inputToll.addEventListener('change', function (e) {
-                                context.onRouteExclusionsChange(e);
-                            });
-                        } else if (inputToll.attachEvent) {
-                            inputToll.attachEvent('onchange', function (e) {
-                                context.onRouteExclusionsChange(e);
-                            });
-                        }
-                        div.appendChild(inputToll);
-                        var labelToll = document.createElement('label');
-                        labelToll.className = 'GProuteExclusionsOption';
-                        labelToll.htmlFor = this._addUID('GProuteExclusionsToll');
-                        labelToll.innerHTML = 'Péages';
-                        div.appendChild(labelToll);
-                        break;
-                    case 'tunnel':
-                        var inputTunnel = document.createElement('input');
-                        inputTunnel.id = this._addUID('GProuteExclusionsTunnel');
-                        inputTunnel.type = 'checkbox';
-                        inputTunnel.value = 'Tunnel';
-                        inputTunnel.checked = !status;
-                        if (inputTunnel.addEventListener) {
-                            inputTunnel.addEventListener('change', function (e) {
-                                context.onRouteExclusionsChange(e);
-                            });
-                        } else if (inputTunnel.attachEvent) {
-                            inputTunnel.attachEvent('onchange', function (e) {
-                                context.onRouteExclusionsChange(e);
-                            });
-                        }
-                        div.appendChild(inputTunnel);
-                        var labelTunnel = document.createElement('label');
-                        labelTunnel.className = 'GProuteExclusionsOption';
-                        labelTunnel.htmlFor = this._addUID('GProuteExclusionsTunnel');
-                        labelTunnel.innerHTML = 'Tunnels';
-                        div.appendChild(labelTunnel);
-                        break;
-                    case 'bridge':
-                        var inputBridge = document.createElement('input');
-                        inputBridge.id = this._addUID('GProuteExclusionsBridge');
-                        inputBridge.type = 'checkbox';
-                        inputBridge.value = 'Bridge';
-                        inputBridge.checked = !status;
-                        if (inputBridge.addEventListener) {
-                            inputBridge.addEventListener('change', function (e) {
-                                context.onRouteExclusionsChange(e);
-                            });
-                        } else if (inputBridge.attachEvent) {
-                            inputBridge.attachEvent('onchange', function (e) {
-                                context.onRouteExclusionsChange(e);
-                            });
-                        }
-                        div.appendChild(inputBridge);
-                        var labelBridge = document.createElement('label');
-                        labelBridge.className = 'GProuteExclusionsOption';
-                        labelBridge.htmlFor = this._addUID('GProuteExclusionsBridge');
-                        labelBridge.innerHTML = 'Ponts';
-                        div.appendChild(labelBridge);
-                        break;
-                    }
-                }
-            }
-            return div;
-        },
-        _createRouteSubmitFormElement: function () {
-            var input = document.createElement('input');
-            input.id = this._addUID('GProuteSubmit');
-            input.className = 'GPinputSubmit';
-            input.type = 'submit';
-            input.value = 'Calculer';
-            return input;
-        },
-        _createRouteFormResetElement: function () {
-            var self = this;
-            var divReset = document.createElement('div');
-            divReset.id = this._addUID('GProuteReset');
-            divReset.title = 'Réinitialiser les paramètres';
-            divReset.addEventListener('click', function (e) {
-                self.onRouteResetClick(e);
-            });
-            return divReset;
-        }
-    };
-    return RouteDOM;
-}(CommonUtilsSelectorID);
-LeafletControlsRoute = function (L, woodman, Gp, RightManagement, ID, LocationSelector, RouteDOM) {
-    var Route = L.Control.extend({
-        includes: RouteDOM,
-        options: {
-            position: 'topleft',
-            collapsed: true,
-            graphs: [
-                'Voiture',
-                'Pieton'
-            ],
-            exclusions: {
-                toll: false,
-                tunnel: false,
-                bridge: false
-            },
-            disableReverse: false,
-            routeOptions: {},
-            autocompleteOptions: {}
-        },
-        initialize: function (options) {
-            L.Util.setOptions(this, options);
-            this._uid = ID.generate();
-            this._initTransport();
-            this._initExclusions();
-            this._initComputation();
-            this._waitingContainer = null;
-            this._formRouteContainer = null;
-            this._resultsRouteContainer = null;
-            this._isDesktop = this._detectSupport();
-            this._currentPoints = [];
-            this._currentTransport = null;
-            this._currentComputation = null;
-            this._currentExclusions = [];
-            this._geojsonRoute = null;
-            this._geojsonSections = null;
-            this._waiting = false;
-            this._timer = null;
-            this._currentRouteInformations = null;
-            this._resources = {};
-            this._noRightManagement = false;
-            this._checkRightsManagement();
-        },
-        onAdd: function (map) {
-            var container = this._container = this._initLayout(map);
-            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
-            return container;
-        },
-        onRemove: function () {
-        },
-        _initTransport: function () {
-            this._currentTransport = 'Voiture';
-            var transport = this.options.graphs;
-            if (!transport || transport.length === 0) {
-                this.options.graphs = [
-                    'Voiture',
-                    'Pieton'
-                ];
-            }
-            if (L.Util.isArray(transport) && transport.length) {
-                if (transport[0] === 'Voiture' || transport[0] === 'Pieton') {
-                    this._currentTransport = transport[0];
-                }
-            }
-            var serviceOptions = this.options.routeOptions;
-            if (serviceOptions.graph) {
-                this._currentTransport = serviceOptions.graph;
-            }
-        },
-        _initComputation: function () {
-            this._currentComputation = 'fastest';
-            var serviceOptions = this.options.routeOptions;
-            if (serviceOptions.routePreference) {
-                this._currentComputation = serviceOptions.routePreference;
-            }
-        },
-        _initExclusions: function () {
-            this._currentExclusions = [];
-            var exclusion = this.options.exclusions;
-            if (!exclusion || Object.keys(exclusion).length === 0) {
-                this.options.exclusions = {
-                    toll: false,
-                    tunnel: false,
-                    bridge: false
-                };
-            }
-            if (exclusion && Object.keys(exclusion).length) {
-                for (var k in exclusion) {
-                    if (exclusion.hasOwnProperty(k)) {
-                        if (exclusion.k) {
-                            this._currentExclusions.push(k);
-                        }
-                    }
-                }
-            }
-            var serviceOptions = this.options.routeOptions;
-            if (L.Util.isArray(serviceOptions.exclusions)) {
-                this._currentExclusions = serviceOptions.exclusions;
-            }
-        },
-        _checkRightsManagement: function () {
-            var _opts = null;
-            var _res = [];
-            var _key = null;
-            _key = this.options.routeOptions.apiKey;
-            _opts = this.options.routeOptions.filterOptions;
-            _res = _opts ? _opts.type : [];
-            if (!_res || _res.length === 0) {
-                _res = [
-                    'Voiture',
-                    'Pieton'
-                ];
-            }
-            var rightManagementRoute = RightManagement.check({
-                key: _key || this.options.apiKey,
-                resources: _res,
-                services: ['Itineraire']
-            });
-            _key = this.options.autocompleteOptions.apiKey;
-            _opts = this.options.autocompleteOptions.filterOptions;
-            _res = _opts ? _opts.type : [];
-            if (!_res || _res.length === 0) {
-                _res = [
-                    'StreetAddress',
-                    'PositionOfInterest'
-                ];
-            }
-            var rightManagementAutoComplete = RightManagement.check({
-                key: _key || this.options.apiKey,
-                resources: _res,
-                services: ['AutoCompletion']
-            });
-            if (!rightManagementRoute && !rightManagementAutoComplete) {
-                this._noRightManagement = true;
-            }
-            if (rightManagementAutoComplete) {
-                this._resources['AutoCompletion'] = {};
-                this._resources['AutoCompletion']['resources'] = rightManagementAutoComplete['AutoCompletion'];
-                this._resources['AutoCompletion']['key'] = rightManagementAutoComplete['key'];
-            }
-            if (rightManagementRoute) {
-                this._resources['Itineraire'] = {};
-                this._resources['Itineraire']['resources'] = rightManagementRoute['Itineraire'];
-                this._resources['Itineraire']['key'] = rightManagementRoute['key'];
-            }
-        },
-        _detectSupport: function () {
-            var isDesktop = true;
-            var userAgent = window.navigator.userAgent.toLowerCase();
-            if (userAgent.indexOf('iphone') !== -1 || userAgent.indexOf('ipod') !== -1 || userAgent.indexOf('ipad') !== -1 || userAgent.indexOf('android') !== -1 || userAgent.indexOf('mobile') !== -1 || userAgent.indexOf('blackberry') !== -1 || userAgent.indexOf('tablet') !== -1 || userAgent.indexOf('phone') !== -1 || userAgent.indexOf('touch') !== -1) {
-                isDesktop = false;
-            }
-            if (userAgent.indexOf('msie') !== -1 || userAgent.indexOf('trident') !== -1) {
-                isDesktop = true;
-            }
-            return isDesktop;
-        },
-        _initLayout: function (map) {
-            var container = this._createMainContainerElement();
-            var inputShow = this._showRouteContainer = this._createShowRouteElement();
-            container.appendChild(inputShow);
-            if (!this.options.collapsed) {
-                inputShow.checked = true;
-            }
-            var picto = this._createShowRoutePictoElement();
-            container.appendChild(picto);
-            var routePanel = this._createRoutePanelElement();
-            var routeHeader = this._createRoutePanelHeaderElement();
-            routePanel.appendChild(routeHeader);
-            var routeForm = this._formRouteContainer = this._createRoutePanelFormElement();
-            var points = this._createRoutePanelFormPointsElement(map);
-            for (var i = 0; i < points.length; i++) {
-                routeForm.appendChild(points[i]);
-            }
-            var choice = this._createRoutePanelFormModeChoiceElement();
-            choice.appendChild(this._createRoutePanelFormModeChoiceTransportElement(this.options.graphs));
-            choice.appendChild(this._createRoutePanelFormModeChoiceComputeElement());
-            routeForm.appendChild(choice);
-            routeForm.appendChild(this._createShowRouteExclusionsElement());
-            routeForm.appendChild(this._createShowRouteExclusionsPictoElement());
-            var exclusion = this._createRoutePanelFormExclusionsElement();
-            exclusion.appendChild(this._createRoutePanelFormExclusionOptionsElement(this.options.exclusions));
-            routeForm.appendChild(exclusion);
-            var submit = this._createRouteSubmitFormElement();
-            routeForm.appendChild(submit);
-            routePanel.appendChild(routeForm);
-            var routeResults = this._resultsRouteContainer = this._createRoutePanelResultsElement();
-            routePanel.appendChild(routeResults);
-            var waiting = this._waitingContainer = this._createRouteWaitingElement();
-            routePanel.appendChild(waiting);
-            container.appendChild(routePanel);
-            return container;
-        },
-        _createRoutePanelFormPointsElement: function (map) {
-            var points = [];
-            var count = 1;
-            var start = new LocationSelector({
-                apiKey: this.options.apiKey || null,
-                tag: {
-                    id: count,
-                    unique: this._uid,
-                    label: 'Départ',
-                    color: 'blue',
-                    display: true
-                },
-                disableReverse: this.options.disableReverse,
-                autocompleteOptions: this.options.autocompleteOptions || null
-            });
-            start.setMap(map);
-            points.push(start.getContainer());
-            this._currentPoints.push(start);
-            for (count = 2; count < 7; count++) {
-                var step = new LocationSelector({
-                    apiKey: this.options.apiKey || null,
-                    tag: {
-                        id: count,
-                        unique: this._uid,
-                        label: 'Etape',
-                        color: 'green',
-                        display: false,
-                        removeOption: true
-                    },
-                    disableReverse: this.options.disableReverse,
-                    autocompleteOptions: this.options.autocompleteOptions || null
-                });
-                step.setMap(map);
-                points.push(step.getContainer());
-                this._currentPoints.push(step);
-            }
-            var end = new LocationSelector({
-                apiKey: this.options.apiKey || null,
-                tag: {
-                    id: count,
-                    unique: this._uid,
-                    label: 'Arrivée',
-                    color: 'red',
-                    display: true,
-                    addOption: true,
-                    removeOption: false
-                },
-                disableReverse: this.options.disableReverse,
-                autocompleteOptions: this.options.autocompleteOptions || null
-            });
-            end.setMap(map);
-            points.push(end.getContainer());
-            this._currentPoints.push(end);
-            return points;
-        },
-        onShowRoutePanelClick: function (e) {
-            if (!this._geojsonSections) {
-                this._clear();
-            }
-        },
-        onRouteModeComputationChange: function (e) {
-            var idx = e.target.selectedIndex;
-            var value = e.target.options[idx].value;
-            if (!value) {
-                return;
-            }
-            this._currentComputation = value;
-        },
-        onRouteModeComputationChangeAndRun: function (e) {
-            this.onRouteModeComputationChange(e);
-            this._clearRouteResultsDetails();
-            this._clearRouteResultsGeometry();
-            this._clearRouteResultsFeatureGeometry();
-            this.onRouteComputationSubmit({
-                computation: this._currentComputation,
-                transport: this._currentTransport,
-                exclusions: this._currentExclusions
-            });
-        },
-        onRouteModeTransportChange: function (e) {
-            var value = e.target.value;
-            if (!value) {
-                return;
-            }
-            this._currentTransport = value;
-        },
-        onShowRouteExclusionsClick: function (e) {
-        },
-        onRouteExclusionsChange: function (e) {
-            var value = e.target.value;
-            var checked = e.target.checked;
-            if (!value) {
-                return;
-            }
-            var bFound = false;
-            var iFound = null;
-            for (var i = 0; i < this._currentExclusions.length; i++) {
-                if (this._currentExclusions[i] === value) {
-                    iFound = i;
-                    bFound = true;
-                }
-            }
-            if (!bFound && checked) {
-                this._currentExclusions.push(value);
-            }
-            if (bFound && !checked) {
-                this._currentExclusions[iFound] = null;
-            }
-        },
-        onRouteComputationSubmit: function (options) {
-            var points = this._currentPoints;
-            var start = points[0].getCoordinate();
-            points[0].dragging(false);
-            var end = points[points.length - 1].getCoordinate();
-            points[points.length - 1].dragging(false);
-            var step = [];
-            for (var i = 1; i < points.length - 1; i++) {
-                var coordinate = points[i].getCoordinate();
-                points[i].dragging(false);
-                if (coordinate) {
-                    step.push(coordinate);
-                }
-            }
-            if (this._noRightManagement) {
-                return;
-            }
-            this._currentTransport = options.transport;
-            this._currentComputation = options.computation;
-            this._currentExclusions = options.exclusions;
-            this._displayWaitingContainer();
-            var context = this;
-            this._requestRouting({
-                startPoint: start,
-                endPoint: end,
-                viaPoints: step,
-                graph: this._currentTransport,
-                routePreference: this._currentComputation,
-                exclusions: this._currentExclusions,
-                geometryInInstructions: true,
-                distanceUnit: 'm',
-                onSuccess: function (results) {
-                    if (results) {
-                        context._fillRouteResultsDetails(results);
-                    }
-                },
-                onFailure: function (error) {
-                    context._hideWaitingContainer();
-                    context._clearRouteResultsDetails();
-                }
-            });
-        },
-        onShowRouteResultsNewClick: function (e) {
-            var points = this._currentPoints;
-            for (var i = 0; i < points.length; i++) {
-                points[i].dragging(true);
-            }
-            this._clearRouteResultsDetails();
-            this._clearRouteResultsGeometry();
-            this._clearRouteResultsFeatureGeometry();
-        },
-        onRouteResultsDetailsMouseOver: function (e) {
-            var idx = ID.index(e.target.id);
-            if (!this._isDesktop) {
-                return;
-            }
-            if (!this._geojsonSections) {
-                return;
-            }
-            this._geojsonSections.eachLayer(function (layer) {
-                if (layer.feature.id === parseInt(idx, 10)) {
-                    layer.setStyle({
-                        weight: 10,
-                        color: '#0F9DE8',
-                        opacity: 0.5
-                    });
-                }
-            });
-        },
-        onRouteResultsDetailsMouseOut: function (e) {
-            var idx = ID.index(e.target.id);
-            if (!this._isDesktop) {
-                return;
-            }
-            if (!this._geojsonSections) {
-                return;
-            }
-            this._geojsonSections.eachLayer(function (layer) {
-                if (layer.feature.id === parseInt(idx, 10)) {
-                    layer.setStyle({
-                        color: '#ED7F10',
-                        weight: 5,
-                        opacity: 0.75
-                    });
-                }
-            });
-        },
-        onRouteResultsDetailsClick: function (e) {
-            var idx = ID.index(e.target.id);
-            var self = this;
-            if (this._isDesktop) {
-                return;
-            }
-            if (!this._geojsonSections) {
-                return;
-            }
-            var newInstruction = e.target.title;
-            var oldInstruction = e.target.innerHTML;
-            this._geojsonSections.eachLayer(function (layer) {
-                if (layer.feature.id === parseInt(idx, 10)) {
-                    e.target.innerHTML = newInstruction;
-                    layer.setStyle({
-                        weight: 10,
-                        color: '#0F9DE8',
-                        opacity: 0.5
-                    });
-                }
-            });
-            clearTimeout(1000);
-            setTimeout(function () {
-                self._geojsonSections.eachLayer(function (layer) {
-                    if (layer.feature.id === parseInt(idx, 10)) {
-                        e.target.innerHTML = oldInstruction;
-                        layer.setStyle({
-                            color: '#ED7F10',
-                            weight: 5,
-                            opacity: 0.75
-                        });
-                    }
-                });
-            }, 1000);
-        },
-        _requestRouting: function (settings) {
-            if (!settings || Object.keys(settings).length === 0) {
-                return;
-            }
-            if (!settings.startPoint) {
-                return;
-            }
-            if (!settings.endPoint) {
-                return;
-            }
-            if (this._noRightManagement) {
-                console.log('no rights for all service !?');
-                return;
-            }
-            if (!this._resources['Itineraire']) {
-                console.log('no rights for this service !?');
-                return;
-            }
-            var resources = this._resources['Itineraire'].resources;
-            if (!resources || Object.keys(resources).length === 0) {
-                return;
-            }
-            var key = this._resources['Itineraire']['key'];
-            var options = {};
-            L.Util.extend(options, this.options.routeOptions);
-            L.Util.extend(options, settings);
-            var bFound = false;
-            for (var i = 0; i < resources.length; i++) {
-                if (resources[i] === options.graph) {
-                    bFound = true;
-                }
-            }
-            if (!bFound) {
-                console.log('no rights for this service !?');
-                return;
-            }
-            L.Util.extend(options, { apiKey: this.options.routeOptions.apiKey || this.options.apiKey || key });
-            Gp.Services.route(options);
-        },
-        _fillRouteResultsDetails: function (results) {
-            var distance = results.totalDistance;
-            var duration = results.totalTime;
-            var instructions = this._simplifiedInstructions(results.routeInstructions);
-            if (instructions) {
-                this._fillRouteResultsDetailsContainer(distance, duration, instructions);
-            }
-            var geometry = results.routeGeometry;
-            if (geometry) {
-                this._fillRouteResultsDetailsGeometry(geometry);
-            }
-            var bGeometryInstructions = instructions[0].geometry.length !== 0 ? true : false;
-            if (instructions && bGeometryInstructions) {
-                this._fillRouteResultsDetailsFeatureGeometry(instructions);
-            }
-            var bbox = results.bbox;
-            if (bbox) {
-                var map = this._map;
-                var bounds = L.latLngBounds([
-                    bbox.bottom,
-                    bbox.left
-                ], [
-                    bbox.top,
-                    bbox.right
-                ]);
-                map.fitBounds(bounds, {
-                    padding: [
-                        1,
-                        1
-                    ]
-                });
-            }
-            this._currentRouteInformations = results;
-            this._formRouteContainer.className = 'GProuteComponentHidden';
-            this._hideWaitingContainer();
-            this._resultsRouteContainer.className = '';
-        },
-        _fillRouteResultsDetailsContainer: function (distance, duration, instructions) {
-            this._resultsRouteValuesContainer = this._addRouteResultsValuesElement(distance, duration, this._convertSecondsToTime);
-            this._resultsRouteDetailsContainer = this._addRouteResultsDetailsElement(instructions, this._convertSecondsToTime);
-        },
-        _fillRouteResultsDetailsGeometry: function (geometry) {
-            this._clearRouteResultsGeometry();
-            var map = this._map;
-            var _style = {
-                color: '#ff7800',
-                weight: 5,
-                opacity: 0.65
-            };
-            this._geojsonRoute = L.geoJson(geometry, { style: _style }).addTo(map);
-        },
-        _fillRouteResultsDetailsFeatureGeometry: function (instructions) {
-            this._clearRouteResultsFeatureGeometry();
-            var map = this._map;
-            var _style = {
-                color: '#ED7F10',
-                weight: 5,
-                opacity: 0.75
-            };
-            var _geometry = {
-                type: 'FeatureCollection',
-                features: []
-            };
-            for (var i = 0; i < instructions.length; i++) {
-                var o = instructions[i];
-                var id = i + 1;
-                _geometry.features.push({
-                    id: id,
-                    type: 'Feature',
-                    geometry: o.geometry,
-                    properties: { popupContent: '(' + id + ') distance : ' + this._convertDistance(o.distance) + ' / temps : ' + this._convertSecondsToTime(o.duration) }
-                });
-            }
-            var self = this;
-            function resetHighlight(e) {
-                var layer = e.target;
-                self._geojsonSections.resetStyle(layer);
-                var div = L.DomUtil.get('GProuteResultsDetailsInstruction_' + layer.feature.id + '-' + self._uid);
-                L.DomUtil.removeClass(div, 'GProuteResultsDetailsHighlight');
-            }
-            function highlightFeature(e) {
-                var layer = e.target;
-                layer.setStyle({
-                    weight: 10,
-                    color: '#0F9DE8',
-                    opacity: 0.5
-                });
-                var div = L.DomUtil.get('GProuteResultsDetailsInstruction_' + layer.feature.id + '-' + self._uid);
-                L.DomUtil.addClass(div, 'GProuteResultsDetailsHighlight');
-            }
-            this._geojsonSections = L.geoJson(_geometry, {
-                style: _style,
-                onEachFeature: function (feature, layer) {
-                    layer.on({
-                        mouseover: highlightFeature,
-                        mouseout: resetHighlight
-                    });
-                    layer.bindPopup(feature.properties.popupContent);
-                }
-            }).addTo(map);
-        },
-        _clear: function () {
-            this._currentTransport = null;
-            this._currentExclusions = [];
-            this._currentComputation = null;
-            this._clearRouteResultsDetails();
-            this._clearRouteResultsGeometry();
-            this._clearRouteResultsFeatureGeometry();
-            for (var i = 0; i < this._currentPoints.length; i++) {
-                this._currentPoints[i].clear();
-            }
-        },
-        _clearRouteResultsDetails: function () {
-            this._currentRouteInformations = null;
-            if (this._resultsRouteDetailsContainer) {
-                var divD = this._resultsRouteDetailsContainer;
-                if (divD.childElementCount) {
-                    while (divD.firstChild) {
-                        divD.removeChild(divD.firstChild);
-                    }
-                }
-            }
-            if (this._resultsRouteValuesContainer) {
-                var divV = this._resultsRouteValuesContainer;
-                if (divV.childElementCount) {
-                    while (divV.firstChild) {
-                        divV.removeChild(divV.firstChild);
-                    }
-                }
-            }
-        },
-        _clearRouteResultsGeometry: function () {
-            var map = this._map;
-            if (this._geojsonRoute != null) {
-                map.removeLayer(this._geojsonRoute);
-                this._geojsonRoute = null;
-            }
-        },
-        _clearRouteResultsFeatureGeometry: function () {
-            var map = this._map;
-            if (this._geojsonSections != null) {
-                map.removeLayer(this._geojsonSections);
-                this._geojsonSections = null;
-            }
-        },
-        _displayWaitingContainer: function () {
-            this._waitingContainer.className = 'GProuteCalcWaitingContainerVisible';
-            this._waiting = true;
-            if (this._timer) {
-                clearTimeout(this._timer);
-                this._timer = null;
-            }
-            var context = this;
-            this._timer = setTimeout(function () {
-                if (context._waiting === true) {
-                    context._hideWaitingContainer();
-                } else {
-                    if (context._timer) {
-                        clearTimeout(context._timer);
-                    }
-                }
-            }, 16000);
-        },
-        _hideWaitingContainer: function () {
-            if (this._waiting) {
-                this._waitingContainer.className = 'GProuteCalcWaitingContainerHidden';
-                this._waiting = false;
-                clearTimeout(this._timer);
-                this._timer = null;
-            }
-        },
-        _simplifiedInstructions: function (instructions) {
-            var newInstructions = [];
-            var current = instructions[0];
-            if (instructions.length === 1) {
-                newInstructions.push(current);
-            }
-            for (var i = 1; i < instructions.length; i++) {
-                var o = instructions[i];
-                if (o.instruction === current.instruction) {
-                    current.distance = (parseFloat(o.distance) + parseFloat(current.distance)).toString();
-                    current.duration = (parseFloat(o.duration) + parseFloat(current.duration)).toString();
-                    for (var j = 1; j < o.geometry.coordinates.length; j++) {
-                        current.geometry.coordinates.push(o.geometry.coordinates[j]);
-                    }
-                    if (i === instructions.length - 1) {
-                        newInstructions.push(current);
-                        current = null;
-                    }
-                } else {
-                    newInstructions.push(current);
-                    current = o;
-                    if (i === instructions.length - 1) {
-                        newInstructions.push(o);
-                        current = null;
-                    }
-                }
-            }
-            return newInstructions;
-        },
-        _convertSecondsToTime: function (duration) {
-            var time = '';
-            duration = Math.round(duration);
-            var hours = Math.floor(duration / (60 * 60));
-            if (!hours) {
-                hours = '00';
-            }
-            var divisor4minutes = duration % (60 * 60);
-            var minutes = Math.floor(divisor4minutes / 60);
-            if (!minutes) {
-                minutes = '00';
-            }
-            var divisor4seconds = divisor4minutes % 60;
-            var seconds = Math.ceil(divisor4seconds);
-            if (!seconds) {
-                seconds = '00';
-            }
-            time = hours + 'h ' + minutes + 'm ' + seconds + 's';
-            return time;
-        },
-        _convertDistance: function (distance) {
-            var d = '';
-            var distanceKm = parseInt(distance / 1000, 10);
-            if (!distanceKm) {
-                d = parseInt(distance, 10) + ' m';
-            } else {
-                d = distanceKm + ' km';
-            }
-            return d;
-        }
-    });
-    return Route;
-}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, LeafletControlsLocationSelector, CommonControlsRouteDOM);
-CommonControlsSearchEngineDOM = function (ID) {
-    var SearchEngineDOM = {
-        _addUID: function (id) {
-            return id + '-' + this._uid;
-        },
-        _createMainContainerElement: function () {
-            var container = document.createElement('div');
-            container.id = this._addUID('GPsearchEngine');
-            container.className = 'GPwidget';
-            return container;
-        },
-        _createShowSearchEngineElement: function () {
-            var input = document.createElement('input');
-            input.id = this._addUID('GPshowSearchEngine');
-            input.type = 'checkbox';
-            return input;
-        },
-        _createShowSearchEnginePictoElement: function () {
-            var self = this;
-            var label = document.createElement('label');
-            label.id = this._addUID('GPshowSearchEnginePicto');
-            label.className = 'GPshowAdvancedToolPicto';
-            label.htmlFor = this._addUID('GPshowSearchEngine');
-            label.title = 'Afficher/masquer la recherche par lieux';
-            label.addEventListener('click', function () {
-                document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none';
-                document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
-                var showAdvancedSearch = document.getElementById(self._addUID('GPshowAdvancedSearch'));
-                if (showAdvancedSearch) {
-                    showAdvancedSearch.style.display = null;
-                    document.getElementById(self._addUID('GPadvancedSearchPanel')).style.display = 'none';
-                }
-                var id = '#GPsearchInput-' + self._uid;
-                document.querySelector(id + ' input').disabled = false;
-                self.onShowSearchEngineClick();
-            });
-            var spanOpen = document.createElement('span');
-            spanOpen.id = this._addUID('GPshowSearchEngineOpen');
-            spanOpen.className = 'GPshowAdvancedToolOpen';
-            label.appendChild(spanOpen);
-            return label;
-        },
-        _createSearchInputElement: function () {
-            var self = this;
-            var form = document.createElement('form');
-            form.id = this._addUID('GPsearchInput');
-            form.addEventListener('submit', function (e) {
-                e.preventDefault();
-                document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'block';
-                document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none';
-                self.onGeocodingSearchSubmit(e);
-                return false;
-            });
-            var input = document.createElement('input');
-            input.id = this._addUID('GPsearchInputText');
-            input.type = 'text';
-            input.placeholder = 'Rechercher un lieu, une adresse';
-            input.autocomplete = 'off';
-            input.addEventListener('keyup', function (e) {
-                var charCode = e.which || e.keyCode;
-                if (charCode === 13 || charCode === 10 || charCode === 38 || charCode === 40) {
-                    return;
-                }
-                document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
-                if (input.value.length > 2) {
-                    document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'block';
-                } else {
-                    document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none';
-                }
-                self.onAutoCompleteSearchText(e);
-            });
-            input.addEventListener('keydown', function (e) {
-                if (true) {
-                    return;
-                }
-                var charCode = e.which || e.keyCode;
-                var container = document.getElementById(self._addUID('GPautocompleteResults'));
-                if (!container) {
-                    return;
-                }
-                var curr = container.getElementsByClassName('GPautoCompleteProposal current');
-                var list = container.getElementsByClassName('GPautoCompleteProposal');
-                var length = list.length;
-                if (!length) {
-                    return;
-                }
-                var current = null;
-                if (!curr.length) {
-                    current = list[0];
-                    current.className = 'GPautoCompleteProposal current';
-                    current.style.color = '#000000';
-                    current.style['background-color'] = '#CEDBEF';
-                    return;
-                } else {
-                    current = curr[0];
-                }
-                var index = parseInt(ID.index(current.id), 10);
-                var next = index === length - 1 ? list[0] : list[index + 1];
-                var prev = index === 0 ? list[length - 1] : list[index - 1];
-                current.style['background-color'] = '';
-                current.style.color = '';
-                prev.style['background-color'] = '';
-                prev.style.color = '';
-                next.style['background-color'] = '';
-                next.style.color = '';
-                switch (charCode) {
-                case 38:
-                    current.className = 'GPautoCompleteProposal';
-                    prev.className = 'GPautoCompleteProposal current';
-                    prev.style.color = '#000000';
-                    prev.style['background-color'] = '#CEDBEF';
-                    break;
-                case 40:
-                    current.className = 'GPautoCompleteProposal';
-                    next.className = 'GPautoCompleteProposal current';
-                    next.style.color = '#000000';
-                    next.style['background-color'] = '#CEDBEF';
-                    break;
-                case 13:
-                    current.click(e);
-                    break;
-                }
-                current.focus();
-            });
-            form.appendChild(input);
-            var div = document.createElement('div');
-            div.id = this._addUID('GPsearchInputReset');
-            div.addEventListener('click', function () {
-                document.getElementById(self._addUID('GPsearchInputText')).value = '';
-                document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none';
-                document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
-                self.onSearchResetClick();
-            });
-            form.appendChild(div);
-            return form;
-        },
-        _createShowAdvancedSearchElement: function () {
-            var self = this;
-            var div = document.createElement('div');
-            div.id = this._addUID('GPshowAdvancedSearch');
-            div.className = 'GPshowAdvancedToolPicto';
-            div.title = 'Ouvrir la recherche avancée';
-            div.addEventListener('click', function () {
-                var id = '#GPsearchInput-' + self._uid;
-                document.querySelector(id + ' input').disabled = true;
-                document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none';
-                document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
-                document.getElementById(self._addUID('GPshowAdvancedSearch')).style.display = 'none';
-                document.getElementById(self._addUID('GPadvancedSearchPanel')).style.display = 'inline-block';
-            });
-            var span = document.createElement('span');
-            span.id = this._addUID('GPshowAdvancedSearchOpen');
-            span.className = 'GPshowAdvancedToolOpen';
-            div.appendChild(span);
-            return div;
-        },
-        _createAdvancedSearchPanelElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPadvancedSearchPanel');
-            div.className = 'GPpanel';
-            div.style.display = 'none';
-            return div;
-        },
-        _createGeocodeResultsElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPgeocodeResultsList');
-            div.className = 'GPpanel';
-            div.style.display = 'none';
-            div.appendChild(this._createGeocodeResultsHeaderElement());
-            return div;
-        },
-        _createAutoCompleteElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPautoCompleteList');
-            div.className = 'GPautoCompleteList';
-            div.style.display = 'none';
-            return div;
-        },
-        _createAutoCompleteListElement: function () {
-            var self = this;
-            var container = document.createElement('div');
-            container.id = this._addUID('GPautocompleteResults');
-            if (container.addEventListener) {
-                container.addEventListener('click', function (e) {
-                    self.onAutoCompletedResultsItemClick(e);
-                    document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none';
-                }, false);
-            } else if (container.attachEvent) {
-                container.attachEvent('onclick', function (e) {
-                    self.onAutoCompletedResultsItemClick(e);
-                    document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none';
-                });
-            }
-            return container;
-        },
-        _createAutoCompletedLocationElement: function (location, id) {
-            var container = document.getElementById(this._addUID('GPautocompleteResults'));
-            var div = document.createElement('div');
-            div.id = this._addUID('AutoCompletedLocation_' + id);
-            div.className = 'GPautoCompleteProposal';
-            div.innerHTML = location.fullText;
-            if (div.addEventListener) {
-                div.addEventListener('click', function (e) {
-                    container.click(e);
-                }, false);
-            } else if (div.attachEvent) {
-                div.attachEvent('onclick', function (e) {
-                    container.click(e);
-                });
-            }
-            container.appendChild(div);
-        },
-        _createAdvancedSearchPanelHeaderElement: function () {
-            var self = this;
-            var container = document.createElement('div');
-            container.className = 'GPpanelHeader';
-            var divTitle = document.createElement('div');
-            divTitle.className = 'GPpanelTitle';
-            divTitle.innerHTML = 'Recherche avancée';
-            container.appendChild(divTitle);
-            var divClose = document.createElement('div');
-            divClose.id = this._addUID('GPadvancedSearchClose');
-            divClose.className = 'GPpanelClose';
-            divClose.title = 'Fermer la recherche avancée';
-            if (divClose.addEventListener) {
-                divClose.addEventListener('click', function () {
-                    var id = '#GPsearchInput-' + self._uid;
-                    document.querySelector(id + ' input').disabled = false;
-                    document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
-                    document.getElementById(self._addUID('GPshowAdvancedSearch')).style.display = 'inline-block';
-                    document.getElementById(self._addUID('GPadvancedSearchPanel')).style.display = 'none';
-                }, false);
-            } else if (divClose.attachEvent) {
-                divClose.attachEvent('onclick', function () {
-                    var id = '#GPsearchInput-' + self._uid;
-                    document.querySelector(id + ' input').disabled = false;
-                    document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
-                    document.getElementById(self._addUID('GPshowAdvancedSearch')).style.display = 'inline-block';
-                    document.getElementById(self._addUID('GPadvancedSearchPanel')).style.display = 'none';
-                });
-            }
-            container.appendChild(divClose);
-            return container;
-        },
-        _createAdvancedSearchPanelFormElement: function (advancedSearchCodes) {
-            var self = this;
-            var form = document.createElement('form');
-            form.id = this._addUID('GPadvancedSearchForm');
-            form.addEventListener('submit', function (e) {
-                e.preventDefault();
-                var data = [];
-                var id = '#GPadvancedSearchFilters-' + self._uid;
-                var matchesFilters = document.querySelectorAll(id + ' > div > div > input');
-                for (var i = 0; i < matchesFilters.length; i++) {
-                    var element = matchesFilters[i];
-                    data.push({
-                        key: element.name,
-                        value: element.value
-                    });
-                }
-                self.onGeocodingAdvancedSearchSubmit(e, data);
-                document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'block';
-                return false;
-            });
-            var div = document.createElement('div');
-            div.className = 'GPflexInput';
-            var label = document.createElement('label');
-            label.className = 'GPadvancedSearchCodeLabel';
-            label.innerHTML = 'Recherche par';
-            div.appendChild(label);
-            var select = this._createAdvancedSearchFormCodeElement(advancedSearchCodes);
-            div.appendChild(select);
-            form.appendChild(div);
-            return form;
-        },
-        _createAdvancedSearchFormCodeElement: function (codes) {
-            var self = this;
-            var select = document.createElement('select');
-            select.id = this._addUID('GPadvancedSearchCode');
-            select.className = 'GPadvancedSearchCode';
-            select.addEventListener('change', function (e) {
-                self.onGeocodingAdvancedSearchCodeChange(e);
-            }, false);
-            if (!codes) {
-                codes = [
-                    {
-                        id: 'PositionOfInterest',
-                        title: 'Lieux/toponymes'
-                    },
-                    {
-                        id: 'StreetAddress',
-                        title: 'Adresses'
-                    },
-                    {
-                        id: 'CadastralParcel',
-                        title: 'Parcelles cadastrales'
-                    },
-                    {
-                        id: 'Administratif',
-                        title: 'Administratif'
-                    }
-                ];
-            }
-            for (var i = 0; i < codes.length; i++) {
-                var option = document.createElement('option');
-                option.value = codes[i].id;
-                option.text = codes[i].title;
-                select.appendChild(option);
-            }
-            return select;
-        },
-        _createAdvancedSearchFormInputElement: function () {
-            var input = document.createElement('input');
-            input.type = 'submit';
-            input.id = this._addUID('GPadvancedSearchSubmit');
-            input.className = 'GPinputSubmit';
-            input.value = 'Chercher';
-            return input;
-        },
-        _createAdvancedSearchFormFiltersElement: function () {
-            var container = document.createElement('div');
-            container.id = this._addUID('GPadvancedSearchFilters');
-            return container;
-        },
-        _createAdvancedSearchFiltersTableElement: function (code, display) {
-            var container = document.createElement('div');
-            container.id = this._addUID(code);
-            if (!display) {
-                container.style.display = 'none';
-            }
-            return container;
-        },
-        _createAdvancedSearchFiltersAttributElement: function (filterAttributes) {
-            var container = null;
-            var name = filterAttributes.name;
-            var title = filterAttributes.title;
-            var description = filterAttributes.description;
-            var code = filterAttributes.code;
-            var value = filterAttributes.value;
-            var div = document.createElement('div');
-            div.className = 'GPflexInput';
-            var label = document.createElement('label');
-            label.className = 'GPadvancedSearchFilterLabel';
-            label.htmlFor = name;
-            label.title = description || title;
-            label.innerHTML = title;
-            div.appendChild(label);
-            var input = document.createElement('input');
-            input.id = name;
-            input.className = 'GPadvancedSearchFilterInput';
-            input.type = 'text';
-            input.name = name;
-            if (value) {
-                input.value = value;
-            }
-            div.appendChild(input);
-            container = document.getElementById(this._addUID(code));
-            if (container) {
-                container.appendChild(div);
-            } else {
-                container = div;
-            }
-            return container;
-        },
-        _createGeocodeResultsHeaderElement: function () {
-            var self = this;
-            var container = document.createElement('div');
-            container.className = 'GPpanelHeader';
-            var divTitle = document.createElement('div');
-            divTitle.className = 'GPpanelTitle';
-            divTitle.innerHTML = 'Résultats de la recherche';
-            container.appendChild(divTitle);
-            var divClose = document.createElement('div');
-            divClose.id = this._addUID('GPgeocodeResultsClose');
-            divClose.className = 'GPpanelClose';
-            divClose.title = 'Fermer la fenêtre de résultats';
-            if (divClose.addEventListener) {
-                divClose.addEventListener('click', function () {
-                    document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
-                }, false);
-            } else if (divClose.attachEvent) {
-                divClose.attachEvent('onclick', function () {
-                    document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
-                });
-            }
-            container.appendChild(divClose);
-            return container;
-        },
-        _createGeocodeResultsListElement: function () {
-            var self = this;
-            var container = document.createElement('div');
-            container.id = this._addUID('GPgeocodeResults');
-            if (container.addEventListener) {
-                container.addEventListener('click', function (e) {
-                    if (!e.ctrlKey) {
-                        document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
-                    }
-                    self.onGeocodedResultsItemClick(e);
-                }, false);
-            } else if (container.attachEvent) {
-                container.attachEvent('onclick', function (e) {
-                    if (!e.ctrlKey) {
-                        document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none';
-                    }
-                    self.onGeocodedResultsItemClick(e);
-                });
-            }
-            return container;
-        },
-        _createGeocodedLocationElement: function (location, id) {
-            var container = document.getElementById(this._addUID('GPgeocodeResults'));
-            var div = document.createElement('div');
-            div.id = this._addUID('GeocodedLocation_' + id);
-            div.className = 'GPautoCompleteProposal';
-            if (typeof location === 'string') {
-                div.innerHTML = location;
-            } else {
-                var places = location.placeAttributes;
-                if (places.freeform) {
-                    div.innerHTML = places.freeform;
-                } else if (places.postalCode) {
-                    div.innerHTML = places.postalCode + ' ' + places.commune;
-                } else if (places.cadastralParcel) {
-                    div.innerHTML = places.cadastralParcel;
-                } else {
-                    div.innerHTML = '...';
-                }
-            }
-            container.appendChild(div);
-        }
-    };
-    return SearchEngineDOM;
-}(CommonUtilsSelectorID);
-CommonControlsSearchEngineUtils = function () {
-    var SearchEngineUtils = {
-        advancedSearchFiltersByDefault: {
-            PositionOfInterest: [
-                {
-                    name: 'importance',
-                    title: 'Importance'
-                },
-                {
-                    name: 'nature',
-                    title: 'Nature'
-                },
-                {
-                    name: 'territory',
-                    title: 'Territoire'
-                },
-                {
-                    name: 'insee',
-                    title: 'Code INSEE'
-                },
-                {
-                    name: 'municipality',
-                    title: 'Ville'
-                },
-                {
-                    name: 'department',
-                    title: 'Département'
-                }
-            ],
-            StreetAddress: [
-                {
-                    name: 'territory',
-                    title: 'Territoire'
-                },
-                {
-                    name: 'insee',
-                    title: 'Code INSEE'
-                },
-                {
-                    name: 'municipality',
-                    title: 'Ville'
-                },
-                {
-                    name: 'department',
-                    title: 'Département'
-                }
-            ],
-            CadastralParcel: [
-                {
-                    name: 'department',
-                    title: 'Département',
-                    description: 'Numéro du département (ex: 01, 94)'
-                },
-                {
-                    name: 'commune',
-                    title: 'Code commune (INSEE)',
-                    description: 'Code commune (INSEE) : 3 chiffres (ex: 067)'
-                },
-                {
-                    name: 'absorbedCity',
-                    title: 'Commune absorbée',
-                    description: 'Commune absorbée : 3 chiffres (ex: 000, 001)'
-                },
-                {
-                    name: 'section',
-                    title: 'Section',
-                    description: 'Section : 2 caractères (ex: AA, 0D)'
-                },
-                {
-                    name: 'number',
-                    title: 'Numéro',
-                    description: 'Numéro de la parcelle : 4 chiffres (ex: 0041, 0250)'
-                }
-            ],
-            Administratif: [
-                {
-                    name: 'prefecture',
-                    title: 'Préfecture'
-                },
-                {
-                    name: 'inseeRegion',
-                    title: 'Code région (INSEE)'
-                },
-                {
-                    name: 'inseeDepartment',
-                    title: 'Code département (INSEE)'
-                },
-                {
-                    name: 'municipality',
-                    title: 'Ville'
-                }
-            ]
-        },
-        zoomToResultsByDefault: function (info) {
-            var zoom = 15;
-            var service = info.service;
-            var fields = info.fields;
-            var type = info.type;
-            var importance = {
-                1: 11,
-                2: 12,
-                3: 13,
-                4: 14,
-                5: 15,
-                6: 16,
-                7: 17,
-                8: 17
-            };
-            if (service === 'SuggestedLocation') {
-                if (type === 'PositionOfInterest') {
-                    zoom = importance[fields.classification];
-                }
-            }
-            if (service === 'DirectGeocodedLocation') {
-                if (type === 'PositionOfInterest') {
-                    zoom = importance[fields.importance] || 14;
-                }
-            }
-            if (type === 'StreetAddress') {
-                zoom = 17;
-            }
-            if (type === 'CadastralParcel') {
-                zoom = 17;
-            }
-            if (type === 'Administratif') {
-                zoom = 12;
-            }
-            return zoom;
-        }
-    };
-    return SearchEngineUtils;
-}();
-LeafletControlsSearchEngine = function (L, woodman, Gp, RightManagement, ID, SearchEngineDOM, SearchEngineUtils) {
-    var SearchEngine = L.Control.extend({
-        includes: SearchEngineDOM,
-        options: {
-            position: 'topleft',
-            collapsed: true,
-            displayInfo: true,
-            zoomTo: '',
-            resources: [],
-            displayAdvancedSearch: true,
-            advancedSearch: {},
-            geocodeOptions: {},
-            autocompleteOptions: {}
-        },
-        initialize: function (options) {
-            L.Util.setOptions(this, options);
-            this._uid = ID.generate();
-            this._inputContainer = null;
-            this._suggestedContainer = null;
-            this._suggestedLocations = [];
-            this._geocodedContainer = null;
-            this._geocodedLocations = [];
-            this._filterContainer = null;
-            this._currentGeocodingCode = null;
-            this._currentGeocodingLocation = null;
-            this._advancedSearchFilters = {};
-            this._advancedSearchCodes = [];
-            this._marker = null;
-            this._servicesRightManagement = {};
-            this._noRightManagement = false;
-            this._checkRightsManagement();
-        },
-        onAdd: function () {
-            this._initAdvancedSearchCodes();
-            this._initAdvancedSearchFilters();
-            var container = this._initLayout();
-            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
-            return container;
-        },
-        onRemove: function () {
-        },
-        _checkRightsManagement: function () {
-            if (!this.options.resources || this.options.resources.length === 0) {
-                this.options.resources = [
-                    'StreetAddress',
-                    'PositionOfInterest'
-                ];
-            }
-            var _opts = null;
-            var _res = [];
-            var _key = null;
-            _key = this.options.geocodeOptions.apiKey;
-            _opts = this.options.geocodeOptions.filterOptions;
-            _res = _opts ? _opts.type : [];
-            if (!_res || _res.length === 0) {
-                _res = this.options.resources || [
-                    'StreetAddress',
-                    'PositionOfInterest'
-                ];
-            }
-            var rightManagementGeocode = RightManagement.check({
-                key: _key || this.options.apiKey,
-                resources: _res,
-                services: ['Geocode']
-            });
-            _key = this.options.autocompleteOptions.apiKey;
-            _opts = this.options.autocompleteOptions.filterOptions;
-            _res = _opts ? _opts.type : [];
-            if (!_res || _res.length === 0) {
-                _res = this.options.resources || [
-                    'StreetAddress',
-                    'PositionOfInterest'
-                ];
-            }
-            var rightManagementAutoComplete = RightManagement.check({
-                key: _key || this.options.apiKey,
-                resources: _res,
-                services: ['AutoCompletion']
-            });
-            if (!rightManagementGeocode && !rightManagementAutoComplete) {
-                this._noRightManagement = true;
-            }
-            if (rightManagementAutoComplete) {
-                this._servicesRightManagement['AutoCompletion'] = {};
-                this._servicesRightManagement['AutoCompletion']['resources'] = rightManagementAutoComplete['AutoCompletion'];
-                this._servicesRightManagement['AutoCompletion']['key'] = rightManagementAutoComplete['key'];
-            }
-            if (rightManagementGeocode) {
-                this._servicesRightManagement['Geocode'] = {};
-                this._servicesRightManagement['Geocode']['resources'] = rightManagementGeocode['Geocode'];
-                this._servicesRightManagement['Geocode']['key'] = rightManagementGeocode['key'];
-            }
-            if (!this.options.advancedSearch || Object.keys(this.options.advancedSearch).length === 0) {
-                var r = this._servicesRightManagement['Geocode']['resources'];
-                for (var i = 0; i < r.length; i++) {
-                    var code = r[i];
-                    this.options.advancedSearch[code] = [];
-                }
-            }
-        },
-        _initLayout: function () {
-            var container = this._createMainContainerElement();
-            var inputShow = this._createShowSearchEngineElement();
-            container.appendChild(inputShow);
-            if (!this.options.collapsed) {
-                inputShow.checked = 'true';
-            }
-            var picto = this._createShowSearchEnginePictoElement();
-            container.appendChild(picto);
-            var search = this._createSearchInputElement();
-            container.appendChild(search);
-            if (this.options.displayAdvancedSearch) {
-                var advancedShow = this._createShowAdvancedSearchElement();
-                container.appendChild(advancedShow);
-                var advancedPanel = this._createAdvancedSearchPanelElement();
-                var advancedHeader = this._createAdvancedSearchPanelHeaderElement();
-                var advancedForm = this._createAdvancedSearchPanelFormElement(this._advancedSearchCodes);
-                var advancedFormFilters = this._filterContainer = this._createAdvancedSearchFormFiltersElement();
-                this._setFilter(this._advancedSearchCodes[0].id);
-                var advancedFormInput = this._createAdvancedSearchFormInputElement();
-                advancedForm.appendChild(advancedFormFilters);
-                advancedForm.appendChild(advancedFormInput);
-                advancedPanel.appendChild(advancedHeader);
-                advancedPanel.appendChild(advancedForm);
-                container.appendChild(advancedPanel);
-            }
-            var autocomplete = this._createAutoCompleteElement();
-            var autocompleteList = this._suggestedContainer = this._createAutoCompleteListElement();
-            autocomplete.appendChild(autocompleteList);
-            container.appendChild(autocomplete);
-            var geocode = this._createGeocodeResultsElement();
-            var geocodeList = this._geocodedContainer = this._createGeocodeResultsListElement();
-            geocode.appendChild(geocodeList);
-            container.appendChild(geocode);
-            return container;
-        },
-        _initAdvancedSearchCodes: function () {
-            var advancedSearchCodesByDefault = [
-                {
-                    id: 'PositionOfInterest',
-                    title: 'Lieux/toponymes'
-                },
-                {
-                    id: 'StreetAddress',
-                    title: 'Adresses'
-                },
-                {
-                    id: 'CadastralParcel',
-                    title: 'Parcelles cadastrales'
-                },
-                {
-                    id: 'Administratif',
-                    title: 'Administratif'
-                }
-            ];
-            var _resources = Object.keys(this.options.advancedSearch);
-            for (var i = 0; i < _resources.length; i++) {
-                var id = _resources[i];
-                for (var j = 0; j < advancedSearchCodesByDefault.length; j++) {
-                    if (advancedSearchCodesByDefault[j].id === id) {
-                        this._advancedSearchCodes.push(advancedSearchCodesByDefault[j]);
-                    }
-                }
-            }
-            if (this._advancedSearchCodes.length === 0) {
-                this._advancedSearchCodes = advancedSearchCodesByDefault;
-            }
-        },
-        _initAdvancedSearchFilters: function () {
-            var advancedSearchFiltersByDefault = {
-                PositionOfInterest: [
-                    {
-                        name: 'city',
-                        title: 'Ville',
-                        filter: false,
-                        sep: true
-                    },
-                    {
-                        name: 'importance',
-                        title: 'Importance',
-                        filter: true
-                    },
-                    {
-                        name: 'nature',
-                        title: 'Nature',
-                        filter: true
-                    },
-                    {
-                        name: 'territory',
-                        title: 'Territoire',
-                        filter: true
-                    },
-                    {
-                        name: 'insee',
-                        title: 'Code commune (INSEE)',
-                        filter: true
-                    },
-                    {
-                        name: 'department',
-                        title: 'Département',
-                        filter: true
-                    }
-                ],
-                StreetAddress: [
-                    {
-                        name: 'number',
-                        title: 'Numéro',
-                        filter: false,
-                        sep: true
-                    },
-                    {
-                        name: 'street',
-                        title: 'Rue',
-                        filter: false,
-                        sep: true
-                    },
-                    {
-                        name: 'postalCode',
-                        title: 'Code Postal',
-                        filter: false,
-                        sep: true
-                    },
-                    {
-                        name: 'city',
-                        title: 'Ville',
-                        filter: false,
-                        sep: true
-                    },
-                    {
-                        name: 'territory',
-                        title: 'Territoire',
-                        filter: true
-                    },
-                    {
-                        name: 'insee',
-                        title: 'Code commune (INSEE)',
-                        filter: true
-                    },
-                    {
-                        name: 'department',
-                        title: 'Département',
-                        filter: true
-                    }
-                ],
-                CadastralParcel: [
-                    {
-                        name: 'department',
-                        title: 'Département',
-                        filter: false,
-                        sep: false,
-                        value: '__'
-                    },
-                    {
-                        name: 'commune',
-                        title: 'Commune',
-                        filter: false,
-                        sep: false,
-                        value: '___'
-                    },
-                    {
-                        name: 'absorbedCity',
-                        title: 'Commune absorbée',
-                        filter: false,
-                        sep: false,
-                        value: '___'
-                    },
-                    {
-                        name: 'section',
-                        title: 'Section',
-                        filter: false,
-                        sep: false,
-                        value: '__'
-                    },
-                    {
-                        name: 'number',
-                        title: 'Numéro',
-                        filter: false,
-                        sep: false,
-                        value: '____'
-                    }
-                ],
-                Administratif: [
-                    {
-                        name: 'prefecture',
-                        title: 'Préfecture',
-                        filter: true
-                    },
-                    {
-                        name: 'inseeRegion',
-                        title: 'Code région (INSEE)',
-                        filter: true
-                    },
-                    {
-                        name: 'inseeDepartment',
-                        title: 'Code département (INSEE)',
-                        filter: true
-                    },
-                    {
-                        name: 'city',
-                        title: 'Ville',
-                        filter: false,
-                        sep: true
-                    }
-                ]
-            };
-            var advancedSearchFiltersCustom = this.options.advancedSearch;
-            for (var code in advancedSearchFiltersCustom) {
-                if (advancedSearchFiltersCustom.hasOwnProperty(code)) {
-                    if (!advancedSearchFiltersCustom[code] || advancedSearchFiltersCustom[code].length === 0) {
-                        advancedSearchFiltersCustom[code] = advancedSearchFiltersByDefault[code];
-                        continue;
-                    }
-                    var filters = advancedSearchFiltersCustom[code];
-                    for (var i = 0; i < filters.length; i++) {
-                        var o = filters[i];
-                        if (!o.hasOwnProperty('filter')) {
-                            o.filter = o.name === 'municipality' ? false : true;
-                        }
-                    }
-                }
-            }
-            L.Util.extend(this._advancedSearchFilters, advancedSearchFiltersByDefault, advancedSearchFiltersCustom);
-        },
-        _setFilter: function (code) {
-            var container = this._filterContainer;
-            var codeFound = false;
-            for (var i = 0; i < this._advancedSearchCodes.length; i++) {
-                if (this._advancedSearchCodes[i].id === code) {
-                    codeFound = true;
-                    break;
-                }
-            }
-            if (!codeFound) {
-                while (container.firstChild) {
-                    container.removeChild(container.firstChild);
-                }
-                return;
-            }
-            this._currentGeocodingCode = code;
-            while (container.firstChild) {
-                container.removeChild(container.firstChild);
-            }
-            var lstAttributs = this._advancedSearchFilters[code];
-            if (!lstAttributs || lstAttributs.length === 0) {
-                return;
-            }
-            var divTable = this._createAdvancedSearchFiltersTableElement(code, true);
-            for (var j = 0; j < lstAttributs.length; j++) {
-                var divFilter = this._createAdvancedSearchFiltersAttributElement(lstAttributs[j]);
-                divTable.appendChild(divFilter);
-            }
-            container.appendChild(divTable);
-            return container;
-        },
-        _requestAutoComplete: function (settings) {
-            if (!settings || Object.keys(settings).length === 0) {
-                return;
-            }
-            if (!settings.text) {
-                return;
-            }
-            if (this._noRightManagement) {
-                console.log('no rights for all service !?');
-                return;
-            }
-            if (!this._servicesRightManagement['AutoCompletion']) {
-                console.log('no rights for this service !?');
-                return;
-            }
-            var options = {};
-            L.Util.extend(options, this.options.autocompleteOptions);
-            L.Util.extend(options, settings);
-            var resources = this._servicesRightManagement['AutoCompletion'].resources;
-            if (!resources || Object.keys(resources).length === 0) {
-                return;
-            }
-            if (resources && L.Util.isArray(resources) && !options.filterOptions) {
-                if (!options.filterOptions) {
-                    options.filterOptions = {};
-                }
-                options.filterOptions.type = resources;
-            }
-            var key = this._servicesRightManagement['AutoCompletion']['key'];
-            L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey || key });
-            Gp.Services.autoComplete(options);
-        },
-        _fillAutoCompletedLocationListContainer: function (locations) {
-            if (!locations || locations.length === 0) {
-                return;
-            }
-            var element = this._suggestedContainer;
-            if (element.childElementCount) {
-                while (element.firstChild) {
-                    element.removeChild(element.firstChild);
-                }
-            }
-            for (var i = 0; i < locations.length; i++) {
-                this._createAutoCompletedLocationElement(locations[i], i);
-            }
-            this._suggestedLocations = locations;
-        },
-        _requestGeocoding: function (settings) {
-            if (!settings || Object.keys(settings).length === 0) {
-                return;
-            }
-            if (!settings.location) {
-                return;
-            }
-            if (this._noRightManagement) {
-                console.log('no rights for all service !?');
-                return;
-            }
-            if (!this._servicesRightManagement['Geocode']) {
-                console.log('no rights for this service !?');
-                return;
-            }
-            var options = {};
-            L.Util.extend(options, this.options.geocodeOptions);
-            L.Util.extend(options, settings);
-            if (!options.hasOwnProperty('returnFreeForm')) {
-                L.Util.extend(options, { returnFreeForm: false });
-            }
-            var resources = this._servicesRightManagement['Geocode'].resources;
-            if (!resources || Object.keys(resources).length === 0) {
-                return;
-            }
-            if (resources && L.Util.isArray(resources) && !options.filterOptions) {
-                if (!options.filterOptions) {
-                    options.filterOptions = {};
-                }
-                options.filterOptions.type = resources;
-            }
-            var key = this._servicesRightManagement['Geocode']['key'];
-            L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey || key });
-            Gp.Services.geocode(options);
-        },
-        _fillGeocodedLocationListContainer: function (locations) {
-            if (!locations || locations.length === 0) {
-                this._clearGeocodedLocation();
-                return;
-            }
-            var element = this._geocodedContainer;
-            if (element.childElementCount) {
-                while (element.firstChild) {
-                    element.removeChild(element.firstChild);
-                }
-            }
-            for (var i = 0; i < locations.length; i++) {
-                this._createGeocodedLocationElement(locations[i], i);
-            }
-            this._geocodedLocations = locations;
-        },
-        _setLabel: function (label) {
-            var element = L.DomUtil.get('GPsearchInputText-' + this._uid);
-            element.value = label || '';
-        },
-        _setPosition: function (position, zoom) {
-            var map = this._map;
-            map.setZoomAround(L.latLng(position.x, position.y), zoom, true);
-            map.panTo(L.latLng(position.x, position.y));
-        },
-        _getZoom: function (info) {
-            var map = this._map;
-            var key = this.options.zoomTo;
-            var zoom = null;
-            if (typeof key === 'function') {
-                zoom = key.call(this, info);
-            }
-            if (typeof key === 'number') {
-                zoom = key;
-            }
-            if (typeof key === 'string') {
-                if (key === 'auto') {
-                    zoom = SearchEngineUtils.zoomToResultsByDefault(info);
-                } else {
-                    var value = parseInt(key, 10);
-                    if (!isNaN(value)) {
-                        zoom = value;
-                    }
-                }
-            }
-            Number.isInteger = Number.isInteger || function (value) {
-                return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
-            };
-            if (!zoom || zoom === '' || !Number.isInteger(zoom)) {
-                zoom = map.getZoom();
-            }
-            var min = map.getMinZoom();
-            var max = map.getMaxZoom();
-            if (zoom < min) {
-                zoom = min;
-            }
-            if (zoom > max) {
-                zoom = max;
-            }
-            return zoom;
-        },
-        _setMarker: function (position, information, display) {
-            var map = this._map;
-            if (this._marker != null) {
-                map.removeLayer(this._marker);
-                this._marker = null;
-            }
-            if (position) {
-                var options = {
-                    clickable: true,
-                    zIndexOffset: 1000
-                };
-                this._marker = L.marker(L.latLng(position.x, position.y), options);
-                this._marker.addTo(map);
-                if (display) {
-                    var popupContent = null;
-                    if (typeof information !== 'string') {
-                        var values = [];
-                        if (information.service === 'DirectGeocodedLocation') {
-                            if (information.fields.freeform) {
-                                popupContent = information.fields.freeform;
-                            } else {
-                                var attributs = this._advancedSearchFilters[information.type];
-                                for (var i = 0; i < attributs.length; i++) {
-                                    var key = attributs[i].name;
-                                    var value = information.fields[key];
-                                    if (typeof value === 'string' || typeof value === 'number') {
-                                        values.push(value);
-                                    }
-                                }
-                                popupContent = values.join(' - ');
-                            }
-                        } else if (information.service === 'SuggestedLocation') {
-                            if (information.fields.fullText) {
-                                popupContent = information.fields.fullText;
-                            } else {
-                                values.push(information.fields.street || '');
-                                values.push(information.fields.postalCode || '');
-                                values.push(information.fields.commune || '');
-                                if (information.type === 'PositionOfInterest') {
-                                    values.push(information.fields.poi || '');
-                                    values.push(information.fields.kind || '');
-                                }
-                                popupContent = values.join(' - ');
-                            }
-                        } else {
-                            popupContent = 'sans informations.';
-                        }
-                    } else {
-                        popupContent = information;
-                    }
-                    this._marker.bindPopup(popupContent);
-                }
-            }
-        },
-        _clearResults: function () {
-            this._currentGeocodingLocation = null;
-            this._clearSuggestedLocation();
-            this._clearGeocodedLocation();
-            this._setMarker();
-        },
-        _clearSuggestedLocation: function () {
-            this._suggestedLocations = [];
-            if (this._suggestedContainer) {
-                while (this._suggestedContainer.firstChild) {
-                    this._suggestedContainer.removeChild(this._suggestedContainer.firstChild);
-                }
-            }
-        },
-        _clearGeocodedLocation: function () {
-            this._geocodedLocations = [];
-            if (this._geocodedContainer) {
-                while (this._geocodedContainer.firstChild) {
-                    this._geocodedContainer.removeChild(this._geocodedContainer.firstChild);
-                }
-            }
-        },
-        onShowSearchEngineClick: function () {
-        },
-        onSearchResetClick: function () {
-            this._clearResults();
-        },
-        onAutoCompleteSearchText: function (e) {
-            var value = e.target.value;
-            if (!value) {
-                return;
-            }
-            if (this._noRightManagement) {
-                return;
-            }
-            this._currentGeocodingLocation = value;
-            if (value.length < 3) {
-                return;
-            }
-            var context = this;
-            this._requestAutoComplete({
-                text: value,
-                onSuccess: function (results) {
-                    if (results) {
-                        var locations = results.suggestedLocations;
-                        context._fillAutoCompletedLocationListContainer(locations);
-                    }
-                },
-                onFailure: function (error) {
-                    context._clearSuggestedLocation();
-                }
-            });
-        },
-        onAutoCompletedResultsItemClick: function (e) {
-            var idx = ID.index(e.target.id);
-            var label = e.target.innerHTML;
-            if (!idx) {
-                return;
-            }
-            var position = {
-                x: this._suggestedLocations[idx].position.y,
-                y: this._suggestedLocations[idx].position.x
-            };
-            var info = {
-                service: 'SuggestedLocation',
-                type: this._suggestedLocations[idx].type,
-                fields: this._suggestedLocations[idx]
-            };
-            var zoom = this._getZoom(info);
-            this._setLabel(label);
-            this._setPosition(position, zoom);
-            this._setMarker(position, info, this.options.displayInfo);
-        },
-        onGeocodingSearchSubmit: function (e) {
-            var value = e.target[0].value;
-            if (!value) {
-                return;
-            }
-            if (this._noRightManagement) {
-                return;
-            }
-            this._currentGeocodingLocation = value;
-            var context = this;
-            this._requestGeocoding({
-                location: value,
-                onSuccess: function (results) {
-                    if (results) {
-                        var locations = results.locations;
-                        context._fillGeocodedLocationListContainer(locations);
-                    }
-                },
-                onFailure: function (error) {
-                    context._clearGeocodedLocation();
-                }
-            });
-        },
-        onGeocodedResultsItemClick: function (e) {
-            var idx = ID.index(e.target.id);
-            var label = e.target.innerHTML;
-            if (!idx) {
-                return;
-            }
-            var position = this._geocodedLocations[idx].position;
-            var info = {
-                service: 'DirectGeocodedLocation',
-                type: this._geocodedLocations[idx].type,
-                fields: this._geocodedLocations[idx].placeAttributes
-            };
-            var zoom = this._getZoom(info);
-            this._setLabel(label);
-            this._setPosition(position, zoom);
-            this._setMarker(position, info, this.options.displayInfo);
-        },
-        onGeocodingAdvancedSearchCodeChange: function (e) {
-            var idx = e.target.selectedIndex;
-            var value = e.target.options[idx].value;
-            if (!value) {
-                return;
-            }
-            this._setFilter(value);
-        },
-        onGeocodingAdvancedSearchSubmit: function (e, data) {
-            if (!data || data.length === 0) {
-                return;
-            }
-            var _filterOptions = {};
-            _filterOptions['type'] = [this._currentGeocodingCode];
-            var _location = this._currentGeocodingLocation || '';
-            if (this._currentGeocodingCode === 'CadastralParcel') {
-                _location = '';
-            }
-            for (var i = 0; i < data.length; i++) {
-                var filter = data[i];
-                if (!filter.value) {
-                    continue;
-                }
-                var filters = this._advancedSearchFilters[this._currentGeocodingCode];
-                for (var j = 0; j < filters.length; j++) {
-                    var o = filters[j];
-                    if (o.name === filter.key) {
-                        if (o.filter) {
-                            _filterOptions[filter.key] = filter.value;
-                        } else {
-                            if (o.value) {
-                                var cur = filter.value.length;
-                                var max = o.value.length;
-                                if (max !== cur) {
-                                    var masked = max - cur;
-                                    var filler = o.value.charAt(0);
-                                    while (filler.length < masked) {
-                                        filler += filler;
-                                    }
-                                    var fillerSlice = filler.slice(0, masked);
-                                    filter.value = filter.value + fillerSlice;
-                                }
-                                _location += filter.value;
-                            } else {
-                                if (typeof _location === 'string') {
-                                    _location = {};
-                                }
-                                _location[filter.key] = filter.value;
-                            }
-                        }
-                    }
-                }
-            }
-            var context = this;
-            this._requestGeocoding({
-                location: _location,
-                filterOptions: _filterOptions,
-                onSuccess: function (results) {
-                    if (results) {
-                        var locations = results.locations;
-                        context._fillGeocodedLocationListContainer(locations);
-                    }
-                },
-                onFailure: function (error) {
-                    context._clearGeocodedLocation();
-                }
-            });
-        }
-    });
-    return SearchEngine;
-}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, CommonControlsSearchEngineDOM, CommonControlsSearchEngineUtils);
-CommonControlsElevationPathDOM = function () {
-    var ElevationPathDOM = {
-        _addUID: function (id) {
-            return id + '-' + this._uid;
-        },
-        _createMainContainerElement: function () {
-            var container = document.createElement('div');
-            container.id = this._addUID('GPelevationPath');
-            container.className = 'GPwidget';
-            return container;
-        },
-        _createShowElevationPathElement: function () {
-            var input = document.createElement('input');
-            input.id = this._addUID('GPshowElevationPath');
-            input.type = 'checkbox';
-            return input;
-        },
-        _createShowElevationPathPictoElement: function () {
-            var context = this;
-            var label = document.createElement('label');
-            label.id = this._addUID('GPshowElevationPathPicto');
-            label.className = 'GPshowAdvancedToolPicto';
-            label.htmlFor = this._addUID('GPshowElevationPath');
-            label.title = 'Calculer un profil';
-            if (label.addEventListener) {
-                label.addEventListener('click', function (e) {
-                    context.onShowElevationPathClick(e);
-                });
-            } else if (label.attachEvent) {
-                label.attachEvent('onclick', function (e) {
-                    context.onShowElevationPathClick(e);
-                });
-            }
-            var spanOpen = document.createElement('span');
-            spanOpen.id = this._addUID('GPshowElevationPathOpen');
-            spanOpen.className = 'GPshowAdvancedToolOpen';
-            label.appendChild(spanOpen);
-            return label;
-        },
-        _createElevationPathPanelElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPelevationPathPanel');
-            div.className = 'GPpanel';
-            return div;
-        },
-        _createElevationPathPanelHeaderElement: function () {
-            var self = this;
-            var container = document.createElement('div');
-            container.className = 'GPpanelHeader';
-            var div = document.createElement('div');
-            div.className = 'GPpanelTitle';
-            div.innerHTML = 'Profil Altimétrique';
-            container.appendChild(div);
-            var divReduce = document.createElement('div');
-            divReduce.id = this._addUID('GPelevationPathPanelReduce');
-            divReduce.className = 'GPpanelReduce';
-            divReduce.title = 'Masquer le panneau';
-            if (divReduce.addEventListener) {
-                divReduce.addEventListener('click', function () {
-                    if (typeof self.onReduceElevationPathPanelClick === 'function') {
-                        document.getElementById(self._addUID('GPshowElevationPath')).checked = false;
-                        self.onReduceElevationPathPanelClick();
-                    }
-                }, false);
-            } else if (divReduce.attachEvent) {
-                divReduce.attachEvent('onclick', function () {
-                    if (typeof self.onReduceElevationPathPanelClick === 'function') {
-                        document.getElementById(self._addUID('GPshowElevationPath')).checked = false;
-                        self.onReduceElevationPathPanelClick();
-                    }
-                });
-            }
-            container.appendChild(divReduce);
-            var divClose = document.createElement('div');
-            divClose.id = this._addUID('GPelevationPathPanelClose');
-            divClose.className = 'GPpanelClose';
-            divClose.title = 'Fermer le panneau';
-            if (divClose.addEventListener) {
-                divClose.addEventListener('click', function () {
-                    document.getElementById(self._addUID('GPshowElevationPathPicto')).click();
-                }, false);
-            } else if (divClose.attachEvent) {
-                divClose.attachEvent('onclick', function () {
-                    document.getElementById(self._addUID('GPshowElevationPathPicto')).click();
-                });
-            }
-            container.appendChild(divClose);
-            return container;
-        },
-        _createElevationPathPanelProfilElement: function () {
-            var div = document.createElement('div');
-            div.id = 'GPelevationPathProfil';
-            return div;
-        },
-        _createElevationPathWaitingElement: function () {
-            var div = document.createElement('div');
-            div.id = this._addUID('GPelevationPathCalcWaitingContainer');
-            div.className = 'GPelevationPathCalcWaitingContainerHidden';
-            var p = document.createElement('p');
-            p.className = 'GPelevationPathCalcWaiting';
-            p.innerHTML = 'Calcul en cours...';
-            div.appendChild(p);
-            return div;
-        }
-    };
-    return ElevationPathDOM;
-}();
-LeafletControlsElevationPath = function (L, P, woodman, Gp, RightManagement, ID, LocationSelector, PositionFormater, IconDefault, ElevationPathDOM) {
-    var ElevationPath = L.Control.extend({
-        includes: ElevationPathDOM,
-        options: {
-            position: 'topleft',
-            active: false,
-            elevationPathOptions: {},
-            stylesOptions: {},
-            displayProfileOptions: {
-                apply: null,
-                target: null
-            }
-        },
-        initialize: function (options) {
-            L.Util.setOptions(this, options);
-            this._uid = ID.generate();
-            this._initDisplayProfileOptions();
-            this._showContainer = null;
-            this._pictoContainer = null;
-            this._panelContainer = null;
-            this._profilContainer = null;
-            this._waitingContainer = null;
-            this._reducePanel = false;
-            this._featuresLayer = null;
-            this._lastIdLayer = 0;
-            this._currentIdLayer = 0;
-            this._currentFeature = null;
-            this._profile = null;
-            this._marker = null;
-            this._geometry = null;
-            this._noRightManagement = false;
-            this._checkRightsManagement();
-        },
-        onAdd: function (map) {
-            var container = this._container = this._initLayout();
-            if (map) {
-                if (this.options.active) {
-                    if (this._profile === null) {
-                        this._panelContainer.style.display = 'none';
-                    }
-                    this._activateMapInteraction(map);
-                }
-            }
-            L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container);
-            return container;
-        },
-        onRemove: function () {
-        },
-        _checkRightsManagement: function () {
-            var rightManagement = RightManagement.check({
-                key: this.options.apiKey,
-                resources: ['SERVICE_CALCUL_ALTIMETRIQUE_RSC'],
-                services: ['ElevationLine']
-            });
-            if (!rightManagement) {
-                this._noRightManagement = true;
-            }
-            if (!this.options.apiKey) {
-                this.options.apiKey = rightManagement.key;
-            }
-        },
-        _initDisplayProfileOptions: function () {
-            var profil = this.options.displayProfileOptions || {};
-            if (typeof profil === 'undefined' || Object.keys(profil).length === 0) {
-                this.options.displayProfileOptions = {
-                    apply: ElevationPath.DISPLAY_PROFILE_BY_DEFAULT,
-                    target: null
-                };
-            } else {
-                this.options.displayProfileOptions = {};
-            }
-            var displayFunction = profil.apply || this.options.displayProfileOptions.apply;
-            this.options.displayProfileOptions.apply = typeof displayFunction === 'function' ? displayFunction : ElevationPath.DISPLAY_PROFILE_BY_DEFAULT;
-            var displayContainer = profil.target || this.options.displayProfileOptions.target;
-            this.options.displayProfileOptions.target = typeof displayContainer === 'undefined' ? null : displayContainer;
-        },
-        _initLayout: function () {
-            var container = this._createMainContainerElement();
-            var inputShow = this._showContainer = this._createShowElevationPathElement();
-            container.appendChild(inputShow);
-            if (this.options.active) {
-                this._showContainer.checked = true;
-            }
-            var picto = this._pictoContainer = this._createShowElevationPathPictoElement();
-            container.appendChild(picto);
-            var panel = this._panelContainer = this._createElevationPathPanelElement();
-            var header = this._createElevationPathPanelHeaderElement();
-            panel.appendChild(header);
-            var profil = this._profilContainer = this._createElevationPathPanelProfilElement();
-            panel.appendChild(profil);
-            var waiting = this._waitingContainer = this._createElevationPathWaitingElement();
-            panel.appendChild(waiting);
-            container.appendChild(panel);
-            return container;
-        },
-        onShowElevationPathClick: function (e) {
-            var map = this._map;
-            if (!this._reducePanel) {
-                if (this._showContainer.checked) {
-                    this._pictoContainer.style.display = 'block';
-                    this._panelContainer.style.display = 'none';
-                    this._removeMapInteraction(map);
-                    this._clear();
-                } else {
-                    if (this._profile === null) {
-                        this._panelContainer.style.display = 'none';
-                    }
-                    this._activateMapInteraction(map);
-                }
-            } else {
-                if (this._profile !== null) {
-                    if (this.options.displayProfileOptions.target === null) {
-                        this._pictoContainer.style.display = 'none';
-                    }
-                    this._panelContainer.style.display = 'block';
-                }
-            }
-            this._reducePanel = false;
-        },
-        onReduceElevationPathPanelClick: function () {
-            this._reducePanel = true;
-            this._pictoContainer.style.display = 'block';
-            this._panelContainer.style.display = 'none';
-        },
-        _activateMapInteraction: function (map) {
-            if (this._featuresLayer === null) {
-                this._featuresLayer = new L.FeatureGroup();
-                map.addLayer(this._featuresLayer);
-                var self = this;
-                map.on('draw:created', function (e) {
-                    self._currentIdLayer = L.Util.stamp(e.layer);
-                    self._getFeatureGeometry(e.layer);
-                    self._addFeatureLayer(e.layer);
-                });
-                map.on('draw:drawstart', function () {
-                    self._removeFeatureLayer(self._lastIdLayer);
-                    self._lastIdLayer = self._currentIdLayer;
-                });
-                map.on('draw:drawstop', function () {
-                    if (typeof self.options.elevationPathOptions.onSuccess === 'undefined' && self.options.displayProfileOptions.target === null) {
-                        self._pictoContainer.style.display = 'none';
-                        self._panelContainer.style.display = 'block';
-                    }
-                    self._altiRequest();
-                });
-            }
-            this._activatePolyLineInteraction(map);
-        },
-        _removeMapInteraction: function (map) {
-            if (!map) {
-                return;
-            }
-            if (this._featuresLayer !== null) {
-                map.off('draw:created');
-                map.off('draw:drawstart');
-                map.off('draw:drawstop');
-                map.removeLayer(this._featuresLayer);
-                this._featuresLayer = null;
-            }
-            this._lastIdLayer = this._currentIdLayer = 0;
-            if (this._currentFeature) {
-                this._currentFeature.disable();
-            }
-        },
-        _activatePolyLineInteraction: function (map) {
-            if (this._currentFeature) {
-                this._currentFeature.disable();
-            }
-            var styles = this.options.stylesOptions || {};
-            var _shapeOptions = Object.keys(styles).length !== 0 ? styles : {
-                stroke: true,
-                color: '#C77A04',
-                weight: 4,
-                opacity: 0.5,
-                fill: false
-            };
-            this._currentFeature = new L.Draw.Polyline(map, { shapeOptions: _shapeOptions });
-            this._currentFeature.enable();
-        },
-        _getFeatureGeometry: function (layer) {
-            if (this._geometry !== null) {
-                this._geometry = null;
-            }
-            this._geometry = [];
-            var geometry = layer.getLatLngs();
-            for (var i = 0; i < geometry.length; i++) {
-                var LatLng = geometry[i];
-                this._geometry.push({
-                    lon: LatLng.lng,
-                    lat: LatLng.lat
-                });
-            }
-        },
-        _addFeatureLayer: function (layer) {
-            if (!this._featuresLayer) {
-                return;
-            }
-            this._featuresLayer.addLayer(layer);
-        },
-        _removeFeatureLayer: function (id) {
-            if (!this._featuresLayer) {
-                return;
-            }
-            if (id === 0) {
-                return;
-            }
-            if (!id) {
-                this._featuresLayer.clearLayers();
-            } else {
-                this._featuresLayer.removeLayer(id);
-            }
-        },
-        _altiRequest: function () {
-            if (!this._geometry) {
-                return;
-            }
-            if (this._noRightManagement) {
-                return;
-            }
-            var options = {};
-            L.Util.extend(options, this.options.elevationPathOptions);
-            L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey });
-            var self = this;
-            L.Util.extend(options, {
-                sampling: options.sampling || 200,
-                onSuccess: this.options.elevationPathOptions.onSuccess || function (result) {
-                    if (result) {
-                        if (self.options.displayProfileOptions.target !== null) {
-                            self._pictoContainer.style.display = 'block';
-                            self._panelContainer.style.display = 'block';
-                        }
-                        self._displayProfil(result.elevations);
-                        self._waitingContainer.className = 'GPelevationPathCalcWaitingContainerHidden';
-                        self._waiting = false;
-                    }
-                },
-                onFailure: this.options.elevationPathOptions.onFailure || function (error) {
-                    self._pictoContainer.style.display = 'block';
-                    self._panelContainer.style.display = 'none';
-                    self._waitingContainer.className = 'GPelevationPathCalcWaitingContainerHidden';
-                    self._waiting = false;
-                    self._clear();
-                }
-            });
-            var positions = this._geometry;
-            L.Util.extend(options, { positions: positions });
-            this._waitingContainer.className = 'GPelevationPathCalcWaitingContainerVisible';
-            Gp.Services.getAltitude(options);
-        },
-        _computeElevationMeasure: function (elevations) {
-            var _haversineDistance = function (c1, c2) {
-                var lat1 = PositionFormater.decimalToRadian(c1[1]);
-                var lat2 = PositionFormater.decimalToRadian(c2[1]);
-                var deltaLatBy2 = (lat2 - lat1) / 2;
-                var deltaLonBy2 = PositionFormater.decimalToRadian(c2[0] - c1[0]) / 2;
-                var a = Math.sin(deltaLatBy2) * Math.sin(deltaLatBy2) + Math.sin(deltaLonBy2) * Math.sin(deltaLonBy2) * Math.cos(lat1) * Math.cos(lat2);
-                return 2 * 6378137 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
-            };
-            elevations[0].dist = 0;
-            var distance = 0;
-            for (var i = 1; i < elevations.length; i++) {
-                distance += _haversineDistance([
-                    elevations[i].lon,
-                    elevations[i].lat
-                ], [
-                    elevations[i - 1].lon,
-                    elevations[i - 1].lat
-                ]) / 1000;
-                elevations[i].dist = distance;
-                elevations[i].lat = Math.round(elevations[i].lat * 10000) / 10000;
-                elevations[i].lon = Math.round(elevations[i].lon * 10000) / 10000;
-            }
-            var coeffArrond = 100;
-            if (distance > 100) {
-                coeffArrond = 1;
-            } else if (distance > 10) {
-                coeffArrond = 10;
-            }
-            for (var j = 0; j < elevations.length; j++) {
-                var data = elevations[j];
-                if (data.z < 0) {
-                    data.z = 0;
-                }
-                data.dist = Math.round(data.dist * coeffArrond) / coeffArrond;
-            }
-            return elevations;
-        },
-        _displayProfil: function (elevations) {
-            var data = this._computeElevationMeasure(elevations);
-            var container = this.options.displayProfileOptions.target;
-            if (container) {
-                container.appendChild(this._panelContainer);
-            }
-            container = this._profilContainer;
-            var context = this;
-            var displayFunction = this.options.displayProfileOptions.apply;
-            if (typeof AmCharts !== 'undefined' && typeof d3 !== 'undefined') {
-            }
-            displayFunction.call(this, data, container, context);
-        },
-        _activateProfilEvent: function (position) {
-            if (this._profile === null) {
-                return;
-            }
-            var map = this._map;
-            var self = this;
-            if (self._marker) {
-                map.removeLayer(self._marker);
-                self._marker = null;
-            }
-            self._marker = L.marker(L.latLng(position.lat, position.lon), {
-                icon: new IconDefault('orange'),
-                draggable: false,
-                clickable: false,
-                zIndexOffset: 1000
-            });
-            self._marker.addTo(map);
-            var changed = function (e) {
-                var obj = e.chart.dataProvider[e.index];
-                self._marker.setLatLng(L.latLng(obj.lat, obj.lon));
-                self._marker.update();
-            };
-            self._profile.removeListener('changed', changed);
-            self._profile.addListener('changed', changed);
-            var mouseover = function (e) {
-                if (self._profile === null) {
-                    return;
-                }
-                self._marker = L.marker(L.latLng(position.lat, position.lon), {
-                    icon: new IconDefault('orange'),
-                    draggable: false,
-                    clickable: false,
-                    zIndexOffset: 1000
-                });
-                self._marker.addTo(map);
-            };
-            var mouseout = function (e) {
-                if (self._profile === null) {
-                    return;
-                }
-                if (self._marker) {
-                    map.removeLayer(self._marker);
-                    self._marker = null;
-                }
-            };
-            var mousemove = function (e) {
-                if (self._profile === null) {
-                    return;
-                }
-                if (self._marker) {
-                    self._marker.setLatLng(L.latLng(e.lat, e.lon));
-                    self._marker.update();
-                }
-            };
-        },
-        _clear: function () {
-            this._geometry = null;
-            this._profile = null;
-            if (this._profilContainer) {
-                while (this._profilContainer.firstChild) {
-                    this._profilContainer.removeChild(this._profilContainer.firstChild);
-                }
-            }
-            var map = this._map;
-            if (this._marker) {
-                map.removeLayer(this._marker);
-                this._marker = null;
-            }
-        }
-    });
-    ElevationPath.DISPLAY_PROFILE_BY_DEFAULT = function (data, container, context) {
-        if (container) {
-            while (container.firstChild) {
-                container.removeChild(container.firstChild);
-            }
-        }
-        if (!data) {
-            return;
-        }
-        var sortedElev = JSON.parse(JSON.stringify(data));
-        sortedElev.sort(function (e1, e2) {
-            return e1.z - e2.z;
-        });
-        var minZ = sortedElev[0].z;
-        var maxZ = sortedElev[sortedElev.length - 1].z;
-        var diff = maxZ - minZ;
-        var dist = data[data.length - 1].dist;
-        var barwidth = 100 / data.length;
-        var self = this;
-        var map = context._map;
-        var div = document.createElement('div');
-        div.id = 'profileElevationByDefault';
-        div.addEventListener('mouseover', function (e) {
-            var _lon = parseFloat(e.target.dataset['lon']);
-            var _lat = parseFloat(e.target.dataset['lat']);
-            if (_lon && _lat) {
-                self._marker = L.marker(L.latLng(_lat, _lon), {
-                    icon: new IconDefault('orange'),
-                    draggable: false,
-                    clickable: false,
-                    zIndexOffset: 1000
-                });
-                self._marker.addTo(map);
-            }
-        });
-        div.addEventListener('mousemove', function () {
-        });
-        div.addEventListener('mouseout', function () {
-            if (self._marker) {
-                map.removeLayer(self._marker);
-                self._marker = null;
-            }
-        });
-        container.appendChild(div);
-        var divZ = document.createElement('div');
-        divZ.className = 'z-title-vertical';
-        divZ.innerHTML = minZ + ' / ' + maxZ + ' m';
-        div.appendChild(divZ);
-        var ul = document.createElement('ul');
-        ul.id = 'data-default';
-        ul.className = 'z-axis x-axis';
-        div.appendChild(ul);
-        for (var i = 0; i < data.length; i++) {
-            var d = data[i];
-            var li = document.createElement('li');
-            li.setAttribute('data-z', d.z);
-            li.setAttribute('data-lon', d.lon);
-            li.setAttribute('data-lat', d.lat);
-            li.setAttribute('data-dist', d.dist);
-            var pct = Math.floor((d.z - minZ) * 100 / diff);
-            li.setAttribute('class', 'percent v' + pct);
-            li.title = 'altitude : ' + d.z + 'm';
-            li.setAttribute('style', 'width: ' + barwidth + '%');
-            ul.appendChild(li);
-        }
-        var divX = document.createElement('div');
-        divX.className = 'x-title-horizontal';
-        divX.innerHTML = dist + ' km';
-        div.appendChild(divX);
-        context._profile = container;
-    };
-    ElevationPath.DISPLAY_PROFILE_RAW = function (data, container, context) {
-        if (container) {
-            while (container.firstChild) {
-                container.removeChild(container.firstChild);
-            }
-        }
-        var div = document.createElement('textarea');
-        div.id = 'profilElevationResults';
-        div.rows = 10;
-        div.cols = 50;
-        div.style.width = '100%';
-        div.innerHTML = JSON.stringify(data, undefined, 4);
-        container.appendChild(div);
-        context._profile = container;
-    };
-    ElevationPath.DISPLAY_PROFILE_LIB_D3 = function (data, container, context) {
-        if (typeof d3 === 'undefined') {
-            console.log('Lib. D3 is not loaded !');
-            return;
-        }
-        if (container) {
-            while (container.firstChild) {
-                container.removeChild(container.firstChild);
-            }
-        }
-        var margin = {
-            top: 20,
-            right: 20,
-            bottom: 30,
-            left: 40
-        };
-        var width = container.clientWidth - margin.left - margin.right;
-        var height = container.clientHeight - margin.top - margin.bottom;
-        var x = d3.scale.linear().range([
-            0,
-            width
-        ]);
-        var y = d3.scale.linear().range([
-            height,
-            0
-        ]);
-        var xAxis = d3.svg.axis().scale(x).orient('bottom').ticks(5);
-        var yAxis = d3.svg.axis().scale(y).orient('left').ticks(5);
-        var line = d3.svg.line().interpolate('basis').x(function (d) {
-            return x(d.dist);
-        }).y(function (d) {
-            return y(d.z);
-        });
-        var area = d3.svg.area().interpolate('basis').x(function (d) {
-            return x(d.dist);
-        }).y0(height).y1(function (d) {
-            return y(d.z);
-        });
-        var svg = d3.select(container).append('svg').attr('width', width + margin.left + margin.right).attr('height', height + margin.top + margin.bottom).append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
-        var xDomain = d3.extent(data, function (d) {
-            return d.dist;
-        });
-        x.domain(xDomain);
-        var yDomain = [
-            0,
-            d3.max(data, function (d) {
-                return d.z;
-            })
-        ];
-        y.domain(yDomain);
-        svg.append('path').datum(data).attr('class', 'area-d3').attr('d', area);
-        svg.append('g').attr('class', 'x axis-d3').attr('transform', 'translate(0,' + height + ')').call(xAxis).append('text').attr('y', -15).attr('dy', '.71em').attr('x', width).text('Distance (km)');
-        svg.append('g').attr('class', 'y axis-d3').call(yAxis).append('text').attr('transform', 'rotate(-90)').attr('y', 6).attr('dy', '.71em').text('Altitude (m)');
-        svg.append('g').attr('class', 'grid-d3 vertical').attr('transform', 'translate(0,' + height + ')').call(xAxis.orient('bottom').tickSize(-height, 0, 0).tickFormat(''));
-        svg.append('g').attr('class', 'grid-d3 horizontal').call(yAxis.orient('left').tickSize(-width, 0, 0).tickFormat(''));
-        svg.append('path').datum(data).attr('class', 'line-d3').attr('d', line);
-        svg.selectAll('circle').data(data).enter().append('circle').attr('cx', function (d) {
-            return x(d.dist);
-        }).attr('cy', function (d) {
-            return y(d.z);
-        }).attr('r', 0).attr('class', 'circle-d3');
-        var focus = svg.append('g').style('display', 'none');
-        focus.append('line').attr('id', 'focusLineX').attr('class', 'focusLine-d3');
-        focus.append('line').attr('id', 'focusLineY').attr('class', 'focusLine-d3');
-        focus.append('circle').attr('id', 'focusCircle').attr('r', 4).attr('class', 'circle-d3 focusCircle-d3');
-        var div = d3.select(container).append('div').attr('class', 'tooltip-d3').style('opacity', 0);
-        var bisectDist = d3.bisector(function (d) {
-            return d.dist;
-        }).left;
-        var self = this;
-        var map = context._map;
-        svg.append('rect').attr('class', 'overlay-d3').attr('width', width).attr('height', height).on('mouseover', function () {
-            focus.style('display', null);
-            self._marker = L.marker(L.latLng(data[0].lat, data[0].lon), {
-                icon: new IconDefault('orange'),
-                draggable: false,
-                clickable: false,
-                zIndexOffset: 1000
-            });
-            self._marker.addTo(map);
-        }).on('mouseout', function () {
-            focus.style('display', 'none');
-            if (self._marker) {
-                map.removeLayer(self._marker);
-                self._marker = null;
-            }
-            div.transition().duration(500).style('opacity', 0);
-        }).on('mousemove', function () {
-            var m = d3.mouse(this);
-            var distance = x.invert(m[0]);
-            var i = bisectDist(data, distance);
-            var d0 = data[i - 1];
-            var d1 = data[i];
-            var d = distance - d0[0] > d1[0] - distance ? d1 : d0;
-            var xc = x(d.dist);
-            var yc = y(d.z);
-            focus.select('#focusCircle').attr('cx', xc).attr('cy', yc);
-            focus.select('#focusLineX').attr('x1', xc).attr('y1', y(yDomain[0])).attr('x2', xc).attr('y2', y(yDomain[1]));
-            focus.select('#focusLineY').attr('x1', x(xDomain[0])).attr('y1', yc).attr('x2', x(xDomain[1])).attr('y2', yc);
-            self._marker.setLatLng(L.latLng(d.lat, d.lon));
-            self._marker.update();
-            div.transition().duration(200).style('opacity', 0.9);
-            div.html('Alt : ' + d.z + ' m <br/>' + 'Lon : ' + d.lon + ' <br/>' + 'Lat : ' + d.lat).style('left', d3.event.pageX + 'px').style('top', d3.event.pageY - 28 + 'px');
-        });
-        context._profile = d3.selectAll('rect.overlay')[0][0];
-    };
-    ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS = function (data, container, context) {
-        if (typeof AmCharts === 'undefined') {
-            console.log('Lib. AmCharts is not loaded !');
-            return;
-        }
-        AmCharts.addInitHandler(function () {
-        });
-        context._profile = AmCharts.makeChart(container, {
-            type: 'serial',
-            pathToImages: 'http://cdn.amcharts.com/lib/3/images/',
-            categoryField: 'dist',
-            autoMarginOffset: 0,
-            marginRight: 10,
-            marginTop: 10,
-            startDuration: 0,
-            color: '#5E5E5E',
-            fontSize: 10,
-            theme: 'light',
-            thousandsSeparator: '',
-            categoryAxis: {
-                color: '#5E5E5E',
-                gridPosition: 'start',
-                minHorizontalGap: 40,
-                tickPosition: 'start',
-                title: 'Distance (km)',
-                titleColor: '#5E5E5E',
-                startOnAxis: true
-            },
-            chartCursor: {
-                animationDuration: 0,
-                bulletsEnabled: true,
-                bulletSize: 10,
-                categoryBalloonEnabled: false,
-                cursorColor: '#F90',
-                graphBulletAlpha: 1,
-                graphBulletSize: 1,
-                zoomable: false
-            },
-            trendLines: [],
-            graphs: [{
-                    balloonColor: '#CCCCCC',
-                    balloonText: '<span class=\'altiPathValue\'>[[title]] : [[value]]m</span><br/><span class=\'altiPathCoords\'>(lat: [[lat]] / lon:[[lon]])</span>',
-                    bullet: 'round',
-                    bulletAlpha: 0,
-                    bulletBorderColor: '#FFF',
-                    bulletBorderThickness: 2,
-                    bulletColor: '#F90',
-                    bulletSize: 6,
-                    hidden: false,
-                    id: 'AmGraph-1',
-                    fillAlphas: 0.4,
-                    fillColors: '#C77A04',
-                    lineAlpha: 1,
-                    lineColor: '#C77A04',
-                    lineThickness: 1,
-                    title: 'Altitude',
-                    valueField: 'z'
-                }],
-            guides: [],
-            valueAxes: [{
-                    id: 'ValueAxis-1',
-                    minVerticalGap: 20,
-                    title: 'Altitude (m)'
-                }],
-            allLabel: [],
-            balloon: {
-                borderColor: '#CCCCCC',
-                borderThickness: 1,
-                fillColor: '#FFFFFF',
-                showBullet: true
-            },
-            titles: [],
-            dataProvider: data
-        });
-        var _initPosition = data[0];
-        context._activateProfilEvent(_initPosition);
-    };
-    return ElevationPath;
-}(leaflet, leafletDraw, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, LeafletControlsLocationSelector, LeafletControlsUtilsPositionFormater, LeafletControlsUtilsIconDefault, CommonControlsElevationPathDOM);
-LeafletControlsLogo = function (L) {
-    var Logo = L.Control.extend({
-        options: {
-            position: 'topright',
-            picto: null,
-            url: null,
-            text: null,
-            size: '30px'
-        },
-        initialize: function (options) {
-            L.setOptions(this, options);
-        },
-        onAdd: function () {
-            var container = L.DomUtil.create('div', 'gp-control-logo', container);
-            var bLink = this.options.url || this.options.text ? true : false;
-            var link = null;
-            if (bLink) {
-                link = L.DomUtil.create('a', '', container);
-                link.target = '_blank';
-                if (this.options.url) {
-                    link.href = this.options.url;
-                    this.options.text ? link.title = this.options.text : null;
-                }
-            }
-            if (bLink && this.options.text) {
-                link.text = this.options.text;
-            }
-            var bImage = this.options.picto ? true : false;
-            var image = null;
-            if (bImage) {
-                if (bLink) {
-                    image = L.DomUtil.create('img', '', link);
-                } else {
-                    image = L.DomUtil.create('img', '', container);
-                }
-                image.src = this.options.picto;
-                if (typeof this.options.size === 'string') {
-                    image.style.height = image.style.width = this.options.size;
-                } else {
-                    image.style.height = this.options.size.height;
-                    image.style.width = this.options.size.width;
-                }
-            }
-            return container;
-        }
-    });
-    return Logo;
-}(leaflet);
-LeafletControlsControls = function (LayerSwitcher, Isocurve, MousePosition, ReverseGeocoding, Route, SearchEngine, ElevationPath, Logo) {
-    var Controls = {
-        LayerSwitcher: function (options) {
-            return new LayerSwitcher(options);
-        },
-        Isocurve: function (options) {
-            return new Isocurve(options);
-        },
-        MousePosition: function (options) {
-            return new MousePosition(options);
-        },
-        ReverseGeocode: function (options) {
-            return new ReverseGeocoding(options);
-        },
-        Route: function (options) {
-            return new Route(options);
-        },
-        SearchEngine: function (options) {
-            return new SearchEngine(options);
-        },
-        ElevationPath: function (options) {
-            return new ElevationPath(options);
-        },
-        Logo: function (options) {
-            return new Logo(options);
-        }
-    };
-    return Controls;
-}(LeafletControlsLayerSwitcher, LeafletControlsIsocurve, LeafletControlsMousePosition, LeafletControlsReverseGeocoding, LeafletControlsRoute, LeafletControlsSearchEngine, LeafletControlsElevationPath, LeafletControlsLogo);
-CommonUtilsLayerUtils = function () {
-    var LayerUtils = {
-        getZoomLevelFromScaleDenominator: function (scaleDenominator, crs) {
-            var resolutionsNatives = {};
-            switch (crs) {
-            case 'EPSG:2154':
-                resolutionsNatives = {
-                    0: 104579.224549894,
-                    1: 52277.5323537905,
-                    2: 26135.4870785954,
-                    3: 13066.8913818,
-                    4: 6533.2286041135,
-                    5: 3266.5595244627,
-                    6: 1633.2660045974,
-                    7: 816.629554986,
-                    8: 408.3139146768,
-                    9: 204.1567415109,
-                    10: 102.0783167832,
-                    11: 51.0391448966,
-                    12: 25.5195690743,
-                    13: 12.7597836936,
-                    14: 6.379891636,
-                    15: 3.1899457653,
-                    16: 1.5949728695,
-                    17: 0.7974864315,
-                    18: 0.3987432149,
-                    19: 0.1993716073,
-                    20: 0.0996858037,
-                    21: 0.0498429018
-                };
-                break;
-            default:
-                resolutionsNatives = {
-                    0: 156543.033928041,
-                    1: 78271.51696402048,
-                    2: 39135.758482010235,
-                    3: 19567.87924100512,
-                    4: 9783.93962050256,
-                    5: 4891.96981025128,
-                    6: 2445.98490512564,
-                    7: 1222.99245256282,
-                    8: 611.49622628141,
-                    9: 305.7481131407048,
-                    10: 152.8740565703525,
-                    11: 76.43702828517624,
-                    12: 38.21851414258813,
-                    13: 19.10925707129406,
-                    14: 9.554628535647032,
-                    15: 4.777314267823516,
-                    16: 2.388657133911758,
-                    17: 1.194328566955879,
-                    18: 0.5971642834779395,
-                    19: 0.2985821417389697,
-                    20: 0.1492910708694849,
-                    21: 0.0746455354347424
-                };
-                break;
-            }
-            var resolution = scaleDenominator * 0.00028;
-            for (var index in resolutionsNatives) {
-                if (resolutionsNatives.hasOwnProperty(index)) {
-                    if (resolutionsNatives[index] <= resolution) {
-                        return index;
-                    }
-                }
-            }
-            return 0;
-        },
-        getAttributions: function (params) {
-            var zoom = params.zoom;
-            var attributions = [];
-            if (params.originators != null && params.visibility) {
-                var drawLogo;
-                for (var j = 0, jl = params.originators.length; j < jl; j++) {
-                    drawLogo = true;
-                    var originator = params.originators[j];
-                    var constraints = params.originators[j].constraints || [];
-                    for (var k = 0, kl = constraints.length; k < kl; k++) {
-                        var constraint = constraints[k];
-                        drawLogo = true;
-                        var minZoomLevel = this.getZoomLevelFromScaleDenominator(constraint.maxScaleDenominator, params.crs);
-                        var maxZoomLevel = this.getZoomLevelFromScaleDenominator(constraint.minScaleDenominator, params.crs);
-                        if (minZoomLevel && minZoomLevel > zoom) {
-                            drawLogo = false;
-                        }
-                        if (drawLogo && maxZoomLevel && maxZoomLevel < zoom) {
-                            drawLogo = false;
-                        }
-                        var bbox = constraint.bbox;
-                        if (drawLogo && bbox) {
-                            drawLogo = false;
-                            var viewExtent = params.extent;
-                            if (viewExtent) {
-                                var bounds = [
-                                    bbox.top,
-                                    bbox.left,
-                                    bbox.bottom,
-                                    bbox.right
-                                ];
-                                if (this.intersects(viewExtent, bounds)) {
-                                    drawLogo = true;
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                    if (drawLogo) {
-                        var logo = originator.logo;
-                        var url = originator.url;
-                        var name = originator.name ? originator.name : '';
-                        var text = originator.attribution;
-                        var container = document.createElement('div');
-                        container.className = 'gp-control-attribution';
-                        var link = null;
-                        link = document.createElement('a');
-                        link.className = 'gp-control-attribution-link';
-                        link.target = '_blank';
-                        container.appendChild(link);
-                        if (url) {
-                            link.href = url;
-                        }
-                        var bImage = logo ? true : false;
-                        var image = null;
-                        if (bImage) {
-                            image = document.createElement('img');
-                            if (link) {
-                                image.className = 'gp-control-attribution-image';
-                                link.appendChild(image);
-                            } else {
-                                image.className = '';
-                                container.appendChild(image);
-                            }
-                            image.src = logo;
-                            image.title = text || name;
-                            image.style.height = '30px';
-                            image.style.width = '30px';
-                        } else {
-                            if (name) {
-                                link.textContent = name;
-                            } else if (text) {
-                                link.textContent = text;
-                            } else if (url) {
-                                link.textContent = url;
-                            } else {
-                                link.textContent = '';
-                            }
-                        }
-                        attributions.push(container.innerHTML + ' ');
-                    }
-                }
-            }
-            return attributions;
-        },
-        intersects: function (extent1, extent2) {
-            var intersectsX = extent1[1] <= extent2[3] && extent2[1] <= extent1[3];
-            var intersectsY = extent1[2] <= extent2[0] && extent2[2] <= extent1[0];
-            return intersectsX && intersectsY;
-        }
-    };
-    return LayerUtils;
-}();
-LeafletLayersLayerConfig = function (woodman, Config, Util) {
-    var LayerConfig = {
-        get: function (options) {
-            var params = {};
-            if (!Config.isConfigLoaded()) {
-                return;
-            }
-            params = Config.getLayerParams(options.layer, options.service, options.key);
-            if (!params) {
-                return;
-            }
-            params.minZoom = Util.getZoomLevelFromScaleDenominator(params.maxScale) || 1;
-            params.maxZoom = Util.getZoomLevelFromScaleDenominator(params.minScale) || 21;
-            return params;
-        }
-    };
-    return LayerConfig;
-}({}, CommonUtilsConfig, CommonUtilsLayerUtils);
-LeafletLayersLayerEvent = function (woodman, LayerUtil) {
-    var LayerEvent = {
-        _id: null,
-        _attributions: [],
-        _visibility: true,
-        _originators: [],
-        isEnable: function (map) {
-            if (!map.attributionControl) {
-                return false;
-            }
-            return true;
-        },
-        setVisible: function (visibility) {
-            this._visibility = visibility;
-        },
-        getVisible: function () {
-            return this._visibility;
-        },
-        _onRemoveLayer: function (e) {
-            if (e.layer._geoportal_id != this._geoportal_id) {
-                return;
-            }
-            this.setVisible(false);
-        },
-        _onAddLayer: function (e) {
-            if (e.layer._geoportal_id != this._geoportal_id) {
-                return;
-            }
-            this.setVisible(true);
-        },
-        _onMoveEndLayer: function (e) {
-            this.updateAttributions(this._map, this);
-        },
-        updateAttributions: function (map) {
-            if (!this.isEnable(map)) {
-                return;
-            }
-            this.removeAttributions(map);
-            this.addAttributions(map);
-        },
-        removeAttributions: function (map) {
-            if (!this.isEnable(map)) {
-                return;
-            }
-            for (var i = 0; i < this._attributions.length; i++) {
-                map.attributionControl.removeAttribution(this._attributions[i]);
-            }
-            if (this._attributions) {
-                this._attributions = [];
-            }
-        },
-        addAttributions: function (map) {
-            if (!this.isEnable(map)) {
-                return;
-            }
-            var topLeft = map.getBounds().getNorthWest();
-            var bottomRight = map.getBounds().getSouthEast();
-            var arrayBounds = [
-                topLeft.lat,
-                topLeft.lng,
-                bottomRight.lat,
-                bottomRight.lng
-            ];
-            var params = {
-                extent: arrayBounds,
-                zoom: map.getZoom(),
-                originators: this._originators,
-                visibility: this._visibility
-            };
-            var attributionsOriginators = LayerUtil.getAttributions(params);
-            if (attributionsOriginators && attributionsOriginators.length !== 0) {
-                for (var i = 0; i < attributionsOriginators.length; i++) {
-                    this._attributions.push(attributionsOriginators[i]);
-                    map.attributionControl.addAttribution(attributionsOriginators[i]);
-                }
-            }
-        }
-    };
-    return LayerEvent;
-}({}, CommonUtilsLayerUtils);
-LeafletLayersWMS = function (L, Gp, woodman, LayerEvent) {
-    var WMS = L.TileLayer.WMS.extend({
-        includes: LayerEvent,
-        initialize: function (url, options) {
-            var settings = {};
-            L.Util.extend(settings, options.paramsWms, options.paramsNative);
-            L.TileLayer.WMS.prototype.initialize.call(this, Gp.Helper.normalyzeUrl(url, { 'gp-leaflet-ext': '0.8.1' }, false), settings);
-            this._originators = options.originators;
-            this._legends = options.legends;
-            this._metadata = options.metadata;
-            this._title = options.title;
-            this._description = options.description;
-            this._quicklookUrl = options.quicklookUrl;
-            this._geoportal_id = 0;
-        },
-        onAdd: function (map) {
-            this._map = map;
-            this._geoportal_id = L.stamp(this);
-            L.TileLayer.WMS.prototype.onAdd.call(this, map);
-            this.setVisible(true);
-            this.updateAttributions(map);
-            map.on({
-                overlayremove: this._onRemoveLayer,
-                overlayadd: this._onAddLayer,
-                layerremove: this._onRemoveLayer,
-                layeradd: this._onAddLayer,
-                moveend: this._onMoveEndLayer
-            }, this);
-        },
-        onRemove: function (map) {
-            this._map = map;
-            L.TileLayer.prototype.onRemove.call(this, map);
-            this.setVisible(false);
-            this.removeAttributions(map);
-            map.off({
-                overlayremove: this._onRemoveLayer,
-                overlayadd: this._onAddLayer,
-                layerremove: this._onRemoveLayer,
-                layeradd: this._onAddLayer,
-                moveend: this._onMoveEndLayer
-            }, this);
-        },
-        getTileUrl: function (tilePoint) {
-            var lstProjEpsgGeographic = ['EPSG:4326'];
-            var map = this._map;
-            var tileSize = this.options.tileSize;
-            var nwPoint = tilePoint.multiplyBy(tileSize);
-            var sePoint = nwPoint.add([
-                tileSize,
-                tileSize
-            ]);
-            var nw = this._crs.project(map.unproject(nwPoint, tilePoint.z));
-            var se = this._crs.project(map.unproject(sePoint, tilePoint.z));
-            var bbox = this._wmsVersion >= 1.3 && lstProjEpsgGeographic.indexOf(this._crs.code) !== -1 ? [
-                se.y,
-                nw.x,
-                nw.y,
-                se.x
-            ].join(',') : [
-                nw.x,
-                se.y,
-                se.x,
-                nw.y
-            ].join(',');
-            var url = L.Util.template(this._url, { s: this._getSubdomain(tilePoint) });
-            return url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox;
-        }
-    });
-    return WMS;
-}(leaflet, gp, {}, LeafletLayersLayerEvent);
-LeafletLayersWMTS = function (L, Gp, woodman, LayerEvent) {
-    var WMTS = L.TileLayer.extend({
-        includes: LayerEvent,
-        defaultWmtsParams: {
-            service: 'WMTS',
-            request: 'GetTile',
-            version: '1.0.0',
-            layer: '',
-            style: '',
-            tilematrixset: 'PM',
-            format: 'image/jpeg'
-        },
-        initialize: function (url, options) {
-            this._wmtsParams = {};
-            L.Util.extend(this._wmtsParams, this.defaultWmtsParams, options.paramsWmts);
-            L.TileLayer.prototype.initialize.call(this, Gp.Helper.normalyzeUrl(url, { 'gp-leaflet-ext': '0.8.1' }, false), options.paramsNative);
-            this._originators = options.originators;
-            this._legends = options.legends;
-            this._metadata = options.metadata;
-            this._title = options.title;
-            this._description = options.description;
-            this._quicklookUrl = options.quicklookUrl;
-            this._geoportal_id = 0;
-        },
-        onAdd: function (map) {
-            this._map = map;
-            this._geoportal_id = L.stamp(this);
-            L.TileLayer.prototype.onAdd.call(this, map);
-            this.setVisible(true);
-            this.updateAttributions(map);
-            map.on({
-                overlayremove: this._onRemoveLayer,
-                overlayadd: this._onAddLayer,
-                layerremove: this._onRemoveLayer,
-                layeradd: this._onAddLayer,
-                moveend: this._onMoveEndLayer
-            }, this);
-        },
-        onRemove: function (map) {
-            this._map = map;
-            L.TileLayer.prototype.onRemove.call(this, map);
-            this.setVisible(false);
-            this.removeAttributions(map);
-            map.off({
-                overlayremove: this._onRemoveLayer,
-                overlayadd: this._onAddLayer,
-                layerremove: this._onRemoveLayer,
-                layeradd: this._onAddLayer,
-                moveend: this._onMoveEndLayer
-            }, this);
-        },
-        getTileUrl: function (tilePoint) {
-            var zoom = this._getZoomForUrl();
-            var url = L.Util.template(this._url, { s: this._getSubdomain(tilePoint) });
-            return url + L.Util.getParamString(this._wmtsParams, url) + '&tilematrix=' + zoom + '&tilerow=' + tilePoint.y + '&tilecol=' + tilePoint.x;
-        },
-        setParams: function (params, noRedraw) {
-            L.extend(this._wmtsParams, params);
-            if (!noRedraw) {
-                this.redraw();
-            }
-            return this;
-        }
-    });
-    return WMTS;
-}(leaflet, gp, {}, LeafletLayersLayerEvent);
-LeafletLayersLayers = function (L, woodman, LayerConfig, WMS, WMTS) {
-    var Layers = {
-        options: {},
-        params: {},
-        serviceUrl: 'http://localhost?no-rights-found-for=[{layer}]',
-        _initLogger: function () {
-        },
-        _initOptions: function () {
-            if (!this.options || Object.keys(this.options) === 0) {
-                throw new Error('PARAM_MISSING : options !');
-            }
-            if (!this.options.layer) {
-                throw new Error('PARAM_MISSING : layer !');
-            }
-            if (!this.options.apiKey) {
-                console.log('PARAM_MISSING : apiKey !');
-            }
-        },
-        _initParams: function (service) {
-            if (!service) {
-                service = 'WMTS';
-            }
-            this.params = LayerConfig.get({
-                key: this.options.apiKey,
-                layer: this.options.layer,
-                service: service
-            });
-            if (!this.params || Object.keys(this.params) === 0) {
-                this.params = {};
-                if (!this.options.apiKey) {
-                    console.log('WARNING PARAM_MISSING : parameter \'apiKey\' is mandatory if the contract key configuration has not been loaded !');
-                }
-            }
-        },
-        WMS: function (options, settings) {
-            this._initLogger();
-            this.options = options || {};
-            this._initOptions();
-            this.settings = settings || {};
-            this._initParams('WMS');
-            var serviceUrl = null;
-            if (this.params.key || this.options.apiKey) {
-                serviceUrl = this.params.url || L.Util.template('http://wxs.ign.fr/{key}/geoportail/r/wms', { key: this.params.key || this.options.apiKey });
-            } else {
-                serviceUrl = L.Util.template(this.serviceUrl, { layer: this.options.layer });
-            }
-            var paramsWms = {
-                layers: this.options.layer,
-                styles: this.params.styles || 'normal',
-                format: this.params.format || 'image/jpeg',
-                version: this.params.version || '1.3.0'
-            };
-            var paramsNative = {
-                minZoom: this.params.minZoom || 1,
-                maxZoom: this.params.maxZoom || 21
-            };
-            L.Util.extend(paramsNative, this.settings);
-            return new WMS(serviceUrl, {
-                paramsNative: paramsNative,
-                paramsWms: paramsWms,
-                originators: this.params.originators || [],
-                legends: this.params.legends || [],
-                metadata: this.params.metadata || [],
-                title: this.params.title || null,
-                description: this.params.description || null,
-                quicklookUrl: this.params.quicklookUrl || null
-            });
-        },
-        WMTS: function (options, settings) {
-            this._initLogger();
-            this.options = options || {};
-            this._initOptions();
-            this.settings = settings || {};
-            this._initParams('WMTS');
-            var serviceUrl = null;
-            if (this.params.key || this.options.apiKey) {
-                serviceUrl = this.params.url || L.Util.template('http://wxs.ign.fr/{key}/geoportail/wmts', { key: this.params.key || this.options.apiKey });
-            } else {
-                serviceUrl = L.Util.template(this.serviceUrl, { layer: this.options.layer });
-            }
-            var paramsWmts = {
-                layer: this.options.layer,
-                style: this.params.styles || 'normal',
-                format: this.params.format || 'image/jpeg',
-                version: this.params.version || '1.0.0',
-                tilematrixset: this.params.TMSLink || 'PM'
-            };
-            var paramsNative = {
-                minZoom: this.params.minZoom || 1,
-                maxZoom: this.params.maxZoom || 21
-            };
-            L.Util.extend(paramsNative, this.settings);
-            return new WMTS(serviceUrl, {
-                paramsNative: paramsNative,
-                paramsWmts: paramsWmts,
-                originators: this.params.originators || [],
-                legends: this.params.legends || [],
-                metadata: this.params.metadata || [],
-                title: this.params.title || '',
-                description: this.params.description || '',
-                quicklookUrl: this.params.quicklookUrl || ''
-            });
-        }
-    };
-    return Layers;
-}(leaflet, {}, LeafletLayersLayerConfig, LeafletLayersWMS, LeafletLayersWMTS);
-LeafletGpPluginLeaflet = function (L, P, Gp, Controls, ElevationPath, Layers, CRS, Register) {
-    Gp.leafletExtVersion = '0.8.1';
-    Gp.leafletExtDate = '2016-12-02';
-    Gp.Register = Register;
-    L.geoportalLayer = Layers;
-    L.geoportalControl = Controls;
-    L.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_D3 = ElevationPath.DISPLAY_PROFILE_LIB_D3;
-    L.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS = ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS;
-    L.geoportalControl.ElevationPath.DISPLAY_PROFILE_RAW = ElevationPath.DISPLAY_PROFILE_RAW;
-    L.geoportalControl.ElevationPath.DISPLAY_PROFILE_BY_DEFAULT = ElevationPath.DISPLAY_PROFILE_BY_DEFAULT;
-    L.geoportalCRS = CRS;
-    L.geoportalCRS.EPSG2154 = CRS.EPSG2154();
-    L.geoportalCRS.EPSG27572 = CRS.EPSG27572();
-    L.geoportalCRS.EPSG4326 = CRS.EPSG4326();
-    return Gp;
-}(leaflet, leafletDraw, gp, LeafletControlsControls, LeafletControlsElevationPath, LeafletLayersLayers, LeafletCRSCRS, CommonUtilsRegister);
-window.proj4 = proj4;
-
-return Gp;
-}));
--- a/src/pyams_gis/resources/js/leaflet-gp-3.0.2.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,157 +0,0 @@
-/*!
- * @brief Geoportal Extension for Leaflet
- *
- * This software is released under the licence CeCILL-B (Free BSD compatible)
- * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
- * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
- * @see http://www.cecill.info/
- *
- * copyright CeCILL-B
- * copyright IGN
- * @author IGN
- * @version 0.9.0
- * @date 2016-12-04
- *
- */
-/*!
- * @overview es6-promise - a tiny implementation of Promises/A+.
- * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and cont  ributors (Conversion to ES6 API by Jake Archibald)
- * @license   Licensed under MIT license
- *            See https://raw.githubusercontent.com/jakearchibald/es6-promise/  master/LICENSE
- * @version   3.0.2
- */
-/*!
- * Sortable -- minimalist JavaScript library for reorderable drag-and-drop lists
- *
- * Released under MIT LICENSE
- * 
- * Copyright 2013-2016 Lebedev Konstantin <ibnRubaXa@gmail.com>
- * http://rubaxa.github.io/Sortable/
- * 
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-/*!
- * Proj4js - Javascript reprojection library. 
- * 
- * Authors:
- * 
- * - Mike Adair madairATdmsolutions.ca
- * - Richard Greenwood richATgreenwoodmap.com
- * - Didier Richard didier.richardATign.fr
- * - Stephen Irons stephen.ironsATclear.net.nz
- * - Olivier Terral oterralATgmail.com
- * - Calvin Metcalf cmetcalfATappgeo.com
- * 
- * Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons, Olivier Terral and Calvin Metcalf
- * 
- *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),
- *  to deal in the Software without restriction, including without limitation
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *  and/or sell copies of the Software, and to permit persons to whom the
- *  Software is furnished to do so, subject to the following conditions:
- * 
- *  The above copyright notice and this permission notice shall be included
- *  in all copies or substantial portions of the Software.
- * 
- *  _THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- *  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *  DEALINGS IN THE SOFTWARE._
- * 
- */
-/*!
- * Copyright 2012-2016 Jacob Toye and Leaflet
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is furnished to do
- * so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
- * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-/*!
- * Proj4Leaflet --  Smooth Proj4js integration with Leaflet
- * 
- * Copyright (c) 2012, Kartena AB
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * 
- * 1. Redistributions of source code must retain the above copyright notice, this
- *    list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-;(function(root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    define(['leaflet'], factory);
-  } else if (typeof exports === 'object') {
-    module.exports = factory(require('leaflet'));
-  } else {
-    root.Gp = factory(root.L);
-  }
-}(this, function(leaflet) {
-var gp,CommonUtilsAutoLoadConfig,leafletDraw,sortable,CommonControlsLayerSwitcherDOM,LeafletControlsLayerSwitcher,CommonUtilsConfig,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,CommonControlsLocationSelectorDOM,LeafletControlsUtilsPositionFormater,LeafletControlsUtilsIconDefault,LeafletControlsLocationSelector,CommonControlsIsoDOM,LeafletControlsIsocurve,CommonControlsMousePositionDOM,proj4,proj4leaflet07x,proj4leaflet10x,LeafletCRSProj4Leaflet,CommonUtilsRegister,LeafletCRSEPSG2154,LeafletCRSEPSG27572,LeafletCRSEPSG4326,LeafletCRSCRS,LeafletControlsMousePosition,CommonControlsReverseGeocodingDOM,LeafletControlsReverseGeocoding,CommonControlsRouteDOM,LeafletControlsRoute,CommonControlsSearchEngineDOM,CommonControlsSearchEngineUtils,LeafletControlsSearchEngine,CommonControlsElevationPathDOM,LeafletControlsElevationPath,LeafletControlsLogo,LeafletControlsControls,CommonUtilsLayerUtils,LeafletLayersLayerConfig,LeafletLayersLayerEvent,LeafletLayersWMS,LeafletLayersWMTS,LeafletLayersLayers,LeafletGpPluginLeaflet;!function(t,e){gp=function(){return"function"==typeof e?e():e}()}(this,function(){var t,e,i,n,o,s,r,a,l,c,h,u,d,p,m,f,_,g,v,y,E,P,C,S,M,w,L,R,b,x,G,I,A,T,k,O,D,N,U,j,F,z,B,q,W,H,V,Y,K,X,Z,Q,J,$,tt,et,it,nt,ot,st,rt,at,lt,ct,ht,ut,dt,pt,mt,ft,_t,gt,vt,yt,Et,Pt,Ct,St,Mt,wt,Lt,Rt,bt,xt,Gt,It,At,Tt,kt,Ot,Dt,Nt,Ut,jt,Ft,zt,Bt;return t=void 0,e={loggers:[{root:!0,level:"all",appenders:[{type:"Console",layout:{type:"PatternLayout",pattern:"%d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n"}}]}]},i=function(t,e){var i={getLogger:function(i){t.load(e,function(t){if(t)throw t});var n=i||"default";return t.getLogger(n)}};return i}(t,e),n=function(){var t={normalyzeParameters:function(t){var e=null;if(t){var i=[];for(var n in t)if(t.hasOwnProperty(n)){var o=t[n];o||(o=""),i.push(n+"="+o)}e=i.join("&")}return e},normalyzeUrl:function(t,e,i){var n=t;if(t){var o=t.indexOf("?");o===-1&&(n+="?"),o!==-1&&o!==t.length-1&&(n+="&")}return e&&(n+="string"==typeof e?e:this.normalyzeParameters(e)),i&&(n=encodeURIComponent(n)),n},indent:function(t,e){var i=t||0;return new Array(i+1).join("\t")+e}};return t}(),function(){"use strict";function t(t){return"function"==typeof t||"object"==typeof t&&null!==t}function e(t){return"function"==typeof t}function i(t){return"object"==typeof t&&null!==t}function n(t){B=t}function s(t){V=t}function r(){return function(){process.nextTick(u)}}function a(){return function(){z(u)}}function l(){var t=0,e=new X(u),i=document.createTextNode("");return e.observe(i,{characterData:!0}),function(){i.data=t=++t%2}}function c(){var t=new MessageChannel;return t.port1.onmessage=u,function(){t.port2.postMessage(0)}}function h(){return function(){setTimeout(u,1)}}function u(){for(var t=0;t<H;t+=2){var e=J[t],i=J[t+1];e(i),J[t]=void 0,J[t+1]=void 0}H=0}function d(){try{var t=require,e=t("vertx");return z=e.runOnLoop||e.runOnContext,a()}catch(t){return h()}}function p(){}function m(){return new TypeError("You cannot resolve a promise with itself")}function f(){return new TypeError("A promises callback cannot return that same promise.")}function _(t){try{return t.then}catch(t){return it.error=t,it}}function g(t,e,i,n){try{t.call(e,i,n)}catch(t){return t}}function v(t,e,i){V(function(t){var n=!1,o=g(i,e,function(i){n||(n=!0,e!==i?P(t,i):S(t,i))},function(e){n||(n=!0,M(t,e))},"Settle: "+(t._label||" unknown promise"));!n&&o&&(n=!0,M(t,o))},t)}function y(t,e){e._state===tt?S(t,e._result):e._state===et?M(t,e._result):w(e,void 0,function(e){P(t,e)},function(e){M(t,e)})}function E(t,i){if(i.constructor===t.constructor)y(t,i);else{var n=_(i);n===it?M(t,it.error):void 0===n?S(t,i):e(n)?v(t,i,n):S(t,i)}}function P(e,i){e===i?M(e,m()):t(i)?E(e,i):S(e,i)}function C(t){t._onerror&&t._onerror(t._result),L(t)}function S(t,e){t._state===$&&(t._result=e,t._state=tt,0!==t._subscribers.length&&V(L,t))}function M(t,e){t._state===$&&(t._state=et,t._result=e,V(C,t))}function w(t,e,i,n){var o=t._subscribers,s=o.length;t._onerror=null,o[s]=e,o[s+tt]=i,o[s+et]=n,0===s&&t._state&&V(L,t)}function L(t){var e=t._subscribers,i=t._state;if(0!==e.length){for(var n,o,s=t._result,r=0;r<e.length;r+=3)n=e[r],o=e[r+i],n?x(i,n,o,s):o(s);t._subscribers.length=0}}function R(){this.error=null}function b(t,e){try{return t(e)}catch(t){return nt.error=t,nt}}function x(t,i,n,o){var s,r,a,l,c=e(n);if(c){if(s=b(n,o),s===nt?(l=!0,r=s.error,s=null):a=!0,i===s)return void M(i,f())}else s=o,a=!0;i._state!==$||(c&&a?P(i,s):l?M(i,r):t===tt?S(i,s):t===et&&M(i,s))}function G(t,e){try{e(function(e){P(t,e)},function(e){M(t,e)})}catch(e){M(t,e)}}function I(t,e){var i=this;i._instanceConstructor=t,i.promise=new t(p),i._validateInput(e)?(i._input=e,i.length=e.length,i._remaining=e.length,i._init(),0===i.length?S(i.promise,i._result):(i.length=i.length||0,i._enumerate(),0===i._remaining&&S(i.promise,i._result))):M(i.promise,i._validationError())}function A(t){return new ot(this,t).promise}function T(t){function e(t){P(o,t)}function i(t){M(o,t)}var n=this,o=new n(p);if(!W(t))return M(o,new TypeError("You must pass an array to race.")),o;for(var s=t.length,r=0;o._state===$&&r<s;r++)w(n.resolve(t[r]),void 0,e,i);return o}function k(t){var e=this;if(t&&"object"==typeof t&&t.constructor===e)return t;var i=new e(p);return P(i,t),i}function O(t){var e=this,i=new e(p);return M(i,t),i}function D(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function N(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function U(t){this._id=ct++,this._state=void 0,this._result=void 0,this._subscribers=[],p!==t&&(e(t)||D(),this instanceof U||N(),G(this,t))}function j(){var t;if("undefined"!=typeof global)t=global;else if("undefined"!=typeof self)t=self;else try{t=Function("return this")()}catch(t){throw new Error("polyfill failed because global object is unavailable in this environment")}var e=t.Promise;e&&"[object Promise]"===Object.prototype.toString.call(e.resolve())&&!e.cast||(t.Promise=ht)}var F;F=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};var z,B,q,W=F,H=0,V=({}.toString,function(t,e){J[H]=t,J[H+1]=e,H+=2,2===H&&(B?B(u):q())}),Y="undefined"!=typeof window?window:void 0,K=Y||{},X=K.MutationObserver||K.WebKitMutationObserver,Z="undefined"!=typeof process&&"[object process]"==={}.toString.call(process),Q="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,J=new Array(1e3);q=Z?r():X?l():Q?c():void 0===Y&&"function"==typeof require?d():h();var $=void 0,tt=1,et=2,it=new R,nt=new R;I.prototype._validateInput=function(t){return W(t)},I.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},I.prototype._init=function(){this._result=new Array(this.length)};var ot=I;I.prototype._enumerate=function(){for(var t=this,e=t.length,i=t.promise,n=t._input,o=0;i._state===$&&o<e;o++)t._eachEntry(n[o],o)},I.prototype._eachEntry=function(t,e){var n=this,o=n._instanceConstructor;i(t)?t.constructor===o&&t._state!==$?(t._onerror=null,n._settledAt(t._state,e,t._result)):n._willSettleAt(o.resolve(t),e):(n._remaining--,n._result[e]=t)},I.prototype._settledAt=function(t,e,i){var n=this,o=n.promise;o._state===$&&(n._remaining--,t===et?M(o,i):n._result[e]=i),0===n._remaining&&S(o,n._result)},I.prototype._willSettleAt=function(t,e){var i=this;w(t,void 0,function(t){i._settledAt(tt,e,t)},function(t){i._settledAt(et,e,t)})};var st=A,rt=T,at=k,lt=O,ct=0,ht=U;U.all=st,U.race=rt,U.resolve=at,U.reject=lt,U._setScheduler=n,U._setAsap=s,U._asap=V,U.prototype={constructor:U,then:function(t,e){var i=this,n=i._state;if(n===tt&&!t||n===et&&!e)return this;var o=new this.constructor(p),s=i._result;if(n){var r=arguments[n-1];V(function(){x(n,o,r,s)})}else w(i,o,t,e);return o},catch:function(t){return this.then(null,t)}};var ut=j,dt={Promise:ht,polyfill:ut};o=function(){return dt}(),ut()}.call(this),s=function(t,e,i){var n={call:function(t){if(i.polyfill(),!t.url)throw new Error("missing parameter : url is not defined !");if(!t.method)throw new Error("missing parameter : method is not defined !");t.format||(t.format="text");var e={};switch(e.url=t.url,e.data=t.data?t.data:null,e.method=t.method,e.timeOut=t.timeOut||0,e.scope=t.scope||this,t.method){case"DELETE":case"GET":break;case"PUT":case"POST":e.content=t.content?t.content:"application/x-www-form-urlencoded",e.headers=t.headers?t.headers:{referer:"http://localhost"};break;case"HEAD":case"OPTIONS":throw new Error("HTTP method not yet supported !");default:throw new Error("HTTP method unknown !")}switch(t.format){case"text":this.__call(e).then(function(e){t.onResponse.call(this,e)}).catch(function(e){t.onFailure.call(this,e)});break;case"json":this.__callJSON(e).then(function(e){t.onResponse.call(this,e)}).catch(function(e){t.onFailure.call(this,e)});break;case"xml":this.__callXML(e).then(function(e){t.onResponse.call(this,e)}).catch(function(e){t.onFailure.call(this,e)});break;default:throw new Error("This output Format is not yet supported !")}},__call:function(t){var i=new Promise(function(i,n){var o="POST"===t.method||"PUT"===t.method;t.data&&!o&&(t.url=e.normalyzeUrl(t.url,t.data));var s=null;if(window.XMLHttpRequest){s=new XMLHttpRequest,s.open(t.method,t.url,!0),s.overrideMimeType=t.content;var r=null;t.timeOut>0&&(r=window.setTimeout(function(){var t="TimeOut Occured on Http Request with XMLHttpRequest !";n({message:t,status:-1})},t.timeOut)),o&&s.setRequestHeader("Content-type",t.content),s.onerror=function(t){console.log(t),n(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},s.ontimeout=function(){n(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)window.clearTimeout(r),i(s.response);else{var t="Errors Occured on Http Request (status : '"+s.status+"' | response : '"+s.response+"')",e=s.status;n({message:t,status:e})}};var a=t.data&&o?t.data:null;s.send(a)}else{if(!window.XDomainRequest)throw new Error("CORS not supported");s=new XDomainRequest,s.open(t.method,t.url),s.overrideMimeType=t.content,t.timeOut>0&&(s.timeout=t.timeout),o&&s.setRequestHeader("Content-type",t.content),s.onerror=function(){n(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},s.ontimeout=function(){n(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},s.onload=function(){if(200==s.status)i(s.responseText);else{var t="Errors Occured on Http Request (status : '"+s.status+"' | response : '"+s.responseText+"')",e=s.status;n({message:t,status:e})}};var l=t.data&&o?t.data:null;s.send(l)}});return i},__callJSON:function(t){return this.__call(t).then(JSON.parse).catch(function(e){throw console.log("_callJSON failed on : ",t.url,e),e})},__callXML:function(t){return this.__call(t).then(function(t){var e;if(window.DOMParser){var i=new DOMParser;e=i.parseFromString(t,"text/xml")}else e=new window.ActiveXObject("Microsoft.XMLDOM"),e.async=!1,e.loadXML(t);return e}).catch(function(e){throw console.log("__callXML failed on : ",t.url,e),e})}};return n}(i,n,o),r=function(){var t={PARAM_MISSING:"Parameter(s) '%var%' missing",PARAM_EMPTY:"Parameter(s) '%var%' empty",PARAM_TYPE:"Wrong type(s) for parameter(s) '%var%'",PARAM_FORMAT:"Parameter(s) '%var%' not correctly formatted",PARAM_NOT_SUPPORT:"Value(s) for parameter(s) '%var%' not supported",PARAM_UNKNOWN:"Value(s) for parameter(s) '%var%' unknown",SERVICE_REQUEST_BUILD:"An error occurred during the request building of the service",SERVICE_REQUEST_EMPTY:"The request sent to the service is empty",SERVICE_RESPONSE_EXCEPTION:"The service returned an exception : '%var%'",SERVICE_RESPONSE_EXCEPTION_2:"The service returned an exception",SERVICE_RESPONSE_ANALYSE:"An error occurred while parsing the response '%var%' of the service",SERVICE_RESPONSE_ANALYSE_2:"An unknown error occurred while parsing the response",SERVICE_RESPONSE_EMPTY:"The response of the service is empty",SERVICE_RESPONSE_EMPTY_2:"The response from the service could not be analyzed or is empty",SERVICE_RESPONSE_FORMAT:"The format of the service response is not supported (handled format(s) : '%var%')",SERVICE_RESPONSE_FORMAT_2:"The format of the service response is not supported",SERVICE_RESPONSE_FORMAT_3:"No suggestion matching the search",CLASS_CONSTRUCTOR:"'%var%' constructor cannot be called as a function.",getMessage:function(t,e){if(!arguments)return"Message indefined !";var i=Array.prototype.slice.call(arguments),n=i.shift(),o=i,s=this[n];try{s=Array.isArray(o)&&o.length>0?s.replace("%var%",o.join(" - ")):s.replace("%var%","%var% (not specified)")}catch(t){}return s}};return t}(),a=function(){function t(e){if(!(this instanceof t))throw new TypeError("ErrorService constructor cannot be called as a function.");var i=e;"string"==typeof e||e instanceof String?(this.message=e,this.status=-1,this.type=t.TYPE_UNKERR):(this.message=i.message||"undefined!?",this.type=i.type,this.status=i.status||-1),this.name="ErrorService",this.stack=(new Error).stack}return t.TYPE_SRVERR="SERVICE_ERROR",t.TYPE_USEERR="USAGE_ERROR",t.TYPE_UNKERR="UNKNOWN_ERROR",t.prototype=Object.create(Error.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),t}(),l=function(t){var e={uuid:function(){var t=Math.floor(Date.now());return function(){return t++}}(),call:function(t){if(!t)throw new Error("missing parameter : options !");if(!t.url)throw new Error("missing parameter : options.url !");if(t.timeOut||(t.timeOut=0),!t.onResponse)throw new Error("missing parameter : options.onResponse !");var e="string"==typeof t.callbackSuffix?t.callbackSuffix:this.uuid(),i=!1,n=!1,o=t.url.indexOf("callback=");if(o!=-1){i=!0;var s=t.url.indexOf("&",o);s===-1&&(s=t.url.length);var r=t.url.substring(o+9,s);r&&(n=!0,t.callbackName=r)}if(!i){var a=t.url.indexOf("?");a===-1?t.url=t.url+"?callback=":a===t.url.length?t.url=t.url+"callback=":t.url=t.url+"&callback="}var l=!!t.callbackName||n;if(n||(t.callbackName||(t.callbackName="callback",(e||""===e)&&(t.callbackName+=e)),t.url=t.url.replace("callback=","callback="+t.callbackName)),t.onTimeOut||(t.onTimeOut=function(){console.log("TimeOut while invoking url : "+t.url)}),!l){var c=this,h=null;t.timeOut>0&&(h=window.setTimeout(function(){window[t.callbackName]=function(){},t.onTimeOut(),c._deleteScript(e)},t.timeOut)),window[t.callbackName]=function(i){window.clearTimeout(h),t.onResponse(i),c._deleteScript(e)}}this._createScript(e,t.url)},_createScript:function(t,e){var i,n=document.getElementById("results"+t);i=document.createElement("script"),i.setAttribute("type","text/javascript"),i.setAttribute("src",e),i.setAttribute("charset","UTF-8"),i.setAttribute("id","results"+t),i.setAttribute("async","true");var o=document.documentElement||document.getElementsByTagName("head")[0];null===n?o.appendChild(i):o.replaceChild(i,n)},_deleteScript:function(t){var e=document.getElementById("results"+t);if(e){var i=e.parentNode||document.documentElement;if(!i)return;i.removeChild(e)}}};return e}(i),c=function(t,e,i){var n={send:function(n){var o=n||{method:"GET",protocol:"JSONP",timeOut:0,format:null,wrap:!0,nocache:!0,output:"json",callback:null,callbackSuffix:null};if("XHR"===n.protocol||"json"===n.format?o.wrap=!1:"JSONP"===n.protocol&&"xml"===n.format&&(o.wrap=!0),o.callback=("JSONP"==n.protocol,null),o.output=o.wrap?"json":null,o.wrap){var s={};s.output=o.output,s.callback=o.callback,delete s.callback,o.url=t.normalyzeUrl(n.url,s)}switch(o.protocol){case"XHR":"GET"===n.method&&n.nocache&&(o.url=t.normalyzeUrl(o.url,{t:(new Date).getTime()})),e.call(o);break;case"JSONP":o.data&&(o.url=t.normalyzeUrl(o.url,o.data)),i.call(o);break;default:throw new Error("protocol not supported (XHR|JSONP) !")}}};return n}(n,s,l),h=function(){var t=location&&location.protocol&&0===location.protocol.indexOf("https:")?"https://":"http://",e="wxs.ign.fr",i="%KEY%",n=t+e.concat("/",i),o=function(t){return this._key.replace(t?i:null,t)},s={Alti:{_key:{"elevation-json":n+"/alti/rest/elevation.json","elevation-xml":n+"/alti/rest/elevation.xml","profil-json":n+"/alti/rest/elevationLine.json","profil-xml":n+"/alti/rest/elevationLine.xml",wps:n+"/alti/wps"},url:function(t){return{"elevation-json":this._key["elevation-json"].replace(t?i:null,t),"elevation-xml":this._key["elevation-xml"].replace(t?i:null,t),"profil-json":this._key["profil-json"].replace(t?i:null,t),"profil-xml":this._key["profil-xml"].replace(t?i:null,t),wps:this._key.wps.replace(t?i:null,t)}}},ProcessIsoCurve:{_key:{"iso-json":n+"/isochrone/isochrone.json","iso-xml":n+"/isochrone/isochrone.xml"},url:function(t){return{"iso-json":this._key["iso-json"].replace(t?i:null,t),"iso-xml":this._key["iso-xml"].replace(t?i:null,t)}}},AutoComplete:{_key:n+"/ols/apis/completion",url:o},ReverseGeocode:{_key:n+"/geoportail/ols",url:o},AutoConf:{_key:{apiKey:n+"/autoconf",apiKeys:n+"/autoconf?keys=%KEYS%"},url:function(n){var o="";if(Array.isArray(n)&&n.length>0){o=n[0];for(var s=1;s<n.length;s++)o+=","+n[s]}return{apiKey:this._key.apiKey.replace(n?i:null,n),apiKeys:this._key.apiKeys.replace(i,n[0]).replace("%KEYS%",o),aggregate:t+e.concat("/")+n+"/autoconf/id/"}}},Geocode:{_key:n+"/geoportail/ols",url:o},Route:{_key:{ols:n+"/itineraire/ols","route-json":n+"/itineraire/rest/route.json","route-xml":n+"/itineraire/rest/route.xml"},url:function(t){return{ols:this._key.ols.replace(t?i:null,t),"route-json":this._key["route-json"].replace(t?i:null,t),"route-xml":this._key["route-xml"].replace(t?i:null,t)}}}};return s}(),u=function(t,e,i,n,o,s){function r(t){if(!(this instanceof r))throw new TypeError(i.getMessage("CLASS_CONSTRUCTOR"));this.options={protocol:"JSONP",proxyURL:"",callbackSuffix:null,httpMethod:"GET",timeOut:0,rawResponse:!1,scope:this,onSuccess:function(t){console.log("onSuccess - la reponse est la suivante : ",t)},onFailure:function(t){200!==t.status&&t.status?console.log("onFailure - Erreur (",t.status,") : ",t.message):console.log("onFailure : ",t.message)}};for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);if(!this.options.apiKey&&!this.options.serverUrl)throw new Error(i.getMessage("PARAM_MISSING","apiKey","serverUrl"));this.options.rawResponse&&!this.options.onSuccess&&(this.options.onSuccess=function(t){console.log("onSuccess - la réponse brute du service est la suivante : ",t)});var n=null!==this.options.onSuccess&&"function"==typeof this.options.onSuccess;if(!n)throw new Error(i.getMessage("PARAM_MISSING","onSuccess()"));if(!this.options.serverUrl){var o=s[this.CLASSNAME].url(this.options.apiKey);"string"==typeof o&&(this.options.serverUrl=o)}if(this.options.serverUrl){var a=this.options.serverUrl,l=a.split("?");this.options.serverUrl=l[0]}switch(this.options.httpMethod="string"==typeof t.httpMethod?t.httpMethod.toUpperCase():"GET",this.options.httpMethod){case"POST":case"GET":break;case"PUT":case"DELETE":case"HEAD":case"OPTIONS":throw new Error(i.getMessage("PARAM_NOT_SUPPORT","httpMethod"));default:throw new Error(i.getMessage("PARAM_UNKNOWN","httpMethod"))}switch(this.options.protocol="string"==typeof t.protocol?t.protocol.toUpperCase():"JSONP",this.options.protocol){case"JSONP":case"XHR":break;default:throw new Error(i.getMessage("PARAM_UNKNOWN","protocol"))}"JSONP"===this.options.protocol&&(this.options.httpMethod="GET"),this.options.nocache=t.nocache||!1,this.options.outputFormat=null,this.request=null,this.response=null}return r.prototype={constructor:r,call:function(){function t(){this.buildRequest.call(this,s,e)}function e(t){this.callService.call(this,s,i)}function i(t){this.analyzeResponse.call(this,s,n)}function n(t){return t?void this.options.onSuccess.call(this,t):s.call(this,new o("Analyse de la reponse en échec !?"))}function s(t){var e=t;e instanceof o||(e=new o(t.message)),this.options.onFailure.call(this,e)}t.call(this)},buildRequest:function(t,e){},callService:function(t,i){var s=null,r=this.request,a=!(!this.options.proxyURL||"XHR"!==this.options.protocol);this.options.serverUrl=e.normalyzeUrl(this.options.serverUrl,{"gp-access-lib":"1.0.0-beta3"},!1),a&&("GET"===this.options.httpMethod&&(s=this.options.proxyURL+e.normalyzeUrl(this.options.serverUrl,this.request,!0),r=null),"POST"===this.options.httpMethod&&(s=this.options.proxyURL+e.normalyzeUrl(this.options.serverUrl,null,!0),r=this.request));var l=this,c={url:s||this.options.serverUrl,method:this.options.httpMethod,protocol:this.options.protocol,timeOut:this.options.timeOut||0,format:this.options.outputFormat,nocache:this.options.nocache||!1,wrap:"XHR"!==this.options.protocol,callbackSuffix:this.options.callbackSuffix,data:r,headers:null,content:this.options.contentType||"application/xml",scope:this.options.scope||this,onResponse:function(e){var n=null;if("XHR"==l.options.protocol&&(n=e),"JSONP"==l.options.protocol){if(!e)return void t.call(l,new o("Le contenu de la reponse est vide !?"));if(e.http){if(200!==e.http.status)return void t.call(l,new o({status:e.http.status,message:e.http.error,type:o.TYPE_SRVERR}));n=e.xml}else n=e}l.response=n,i.call(l,n)},onFailure:function(e){e.type=o.TYPE_SRVERR,t.call(l,new o(e))},onTimeOut:function(){t.call(l,new o("TimeOut!"))}};n.send(c)},analyzeResponse:function(t,e){}},r}(i,n,r,c,a,h),d=function(t){function e(t){if(!(this instanceof e))throw new TypeError("AltiRequest constructor cannot be called as a function.");this.options=t||{},this.positions=this.options.positions||[],this.delimiter=this.options.delimiter||"|",this.indent=this.options.indent||!1,this.crs=this.options.crs||"CRS:84",this.format=this.options.format||"json"}return e.CLASSNAME="AltiRequest",e.prototype={constructor:e,setPositions:function(t){for(var e=[],i=0;i<t.length;i++){var n=t[i];n.lon&&n.lat&&e.push(n)}this.positions=e},getPositions:function(t){if(!t)return this.positions;var e=this.positions.length-1;return t>e||t<e?this.positions:this.positions[t]},addPositions:function(t){for(var e=0;e<t.length;e++){var i=t[e];i.lon&&i.lat&&this.positions.push(t[e])}},getLon:function(){for(var t=[],e=0;e<this.positions.length;e++)t.push(this.positions[e].lon);return t.join(this.delimiter)},getLat:function(){for(var t=[],e=0;e<this.positions.length;e++)t.push(this.positions[e].lat);return t.join(this.delimiter)}},e.prototype.getData=function(){var t=[];return t.push({k:"lon",v:this.getLon()}),t.push({k:"lat",v:this.getLat()}),t.push({k:"delimiter",v:this.delimiter}),t.push({k:"indent",v:this.indent}),t.push({k:"crs",v:this.crs}),t.push({k:"format",v:this.format}),t},e}(i),p=function(t,e){function i(t){if(!(this instanceof i))throw new TypeError("AltiElevationRequest constructor cannot be called as a function.");this.CLASSNAME="AltiElevationRequest",e.apply(this,arguments),this.zonly=this.options.zonly||!1}return i.prototype=Object.create(e.prototype,{zonly:{get:function(){return this._zonly},set:function(t){this._zonly=t}}}),i.prototype.constructor=i,i.prototype.getData=function(){var t=[];return t.push({k:"lon",v:this.getLon()}),t.push({k:"lat",v:this.getLat()}),t.push({k:"indent",v:this.indent}),t.push({k:"crs",v:this.crs}),t.push({k:"zonly",v:this.zonly}),t.push({k:"format",v:this.format}),t},i}(i,d),m=function(t,e){function i(t){if(!(this instanceof i))throw new TypeError("AltiProfilRequest constructor cannot be called as a function.");this.CLASSNAME="AltiProfilRequest",e.apply(this,arguments),this.sampling=this.options.sampling||3}return i.prototype=Object.create(e.prototype,{sampling:{get:function(){return this._sampling},set:function(t){this._sampling=t}}}),i.prototype.constructor=i,i.prototype.getData=function(){var t=[];return t.push({k:"lon",v:this.getLon()}),t.push({k:"lat",v:this.getLat()}),t.push({k:"indent",v:this.indent}),t.push({k:"crs",v:this.crs}),t.push({k:"sampling",v:this.sampling}),t.push({k:"format",v:this.format}),t},i}(i,d),f=function(t,e,i,n){function o(t){if(!(this instanceof o))throw new TypeError("AltiRequestREST constructor cannot be called as a function.");if(this.options=t||{},!this.options)throw new Error(e.getMessage("PARAM_EMPTY","options"));if(!this.options.type)throw new Error(e.getMessage("PARAM_EMPTY","type (Elevation or Profil)"));switch(this.DataObject=null,this.options.type){case"Elevation":this.DataObject=new i(this.options.param);break;case"Profil":this.DataObject=new n(this.options.param);break;default:throw new Error(e.getMessage("PARAM_TYPE","type (Elevation or Profil)"))}this.method=this.options.method||"GET"}return o.prototype={requestString:null,constructor:o,template:{get:{value:"lon=__LON__&lat=__LAT__&indent=__INDENT__&crs='__CRS__'",input:{point:"&zonly=__ZONLY__",profil:"&sampling=__SAMPLING__"}},post:{value:"lon=__LON__\nlat=__LAT__\nindent=__INDENT__\ncrs='__CRS__'\n",input:{point:"zonly=__ZONLY__",profil:"sampling=__SAMPLING__"}}},processRequestString:function(){var t="";return"POST"==this.method?t=this.template.post.value:"GET"==this.method&&(t=this.template.get.value),t=t.replace(/__LON__/g,this.DataObject.getLon()),t=t.replace(/__LAT__/g,this.DataObject.getLat()),t=t.replace(/__INDENT__/g,this.DataObject.indent),t=t.replace(/__CRS__/g,this.DataObject.crs),t+=this.__addDataInputs(),this.requestString=t,this.requestString},__addDataInputs:function(){var t;if("POST"==this.method)t=this.template.post;else{if("GET"!=this.method)throw new Error("No other HTTP method supported by the service !");t=this.template.get}var e=null;if("AltiElevationRequest"==this.DataObject.CLASSNAME)return e=t.input.point,e.replace(/__ZONLY__/g,this.DataObject.zonly);if("AltiProfilRequest"==this.DataObject.CLASSNAME)return e=t.input.profil,e.replace(/__SAMPLING__/g,this.DataObject.sampling);throw new Error("No other object supported than elevation or profil !?")}},o}(i,r,p,m),_=function(t){function e(t){if(!(this instanceof e))throw new TypeError("WPS constructor cannot be called as a function.");if(this.options=t||{},this.DataObject=this.options.data,!this.DataObject)throw new TypeError("This data object is not defined !");this.paramservice=this.options.param.service||"WPS",this.paramversion=this.options.param.version||"1.0.0",this.paramidentifier=this.options.param.identifier||"gs:WPS",this.paramrawdataoutput=this.options.param.rawdataoutput||"result",this.paramrequest=this.options.param.request||"Execute",this.method=this.options.method||"GET"}return e.prototype={requestString:null,constructor:e,template:{get:{value:"service=__SERVICE__&version=__VERSION__&rawdataoutput=__RAWDATAOUTPUT__&identifier=__IDENTIFIER__&request=__REQUEST__&datainputs=<!-- __DATAINPUTS__ -->",input:"__KEY__=__DATA__"},post:{value:'<?xml version="1.0" encoding="UTF-8"?><wps:__REQUEST__ version="__VERSION__" service="__SERVICE__" __NAMESPACE__ __SCHEMALOCATION__><ows:Identifier>__IDENTIFIER__</ows:Identifier><wps:DataInputs><!-- __DATAINPUTS__ --></wps:DataInputs><wps:ResponseForm><wps:RawDataOutput><ows:Identifier>__RAWDATAOUTPUT__</ows:Identifier></wps:RawDataOutput></wps:ResponseForm></wps:__REQUEST__>',input:"<wps:Input><ows:Identifier>__KEY__</ows:Identifier><wps:Data><wps:LiteralData>__DATA__</wps:LiteralData></wps:Data></wps:Input>"}},namespaceByDefault:function(){var t=['xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"','xmlns="http://www.opengis.net/wps/1.0.0"','xmlns:wfs="http://www.opengis.net/wfs"','xmlns:wps="http://www.opengis.net/wps/1.0.0"','xmlns:ows="http://www.opengis.net/ows/1.1"','xmlns:gml="http://www.opengis.net/gml"','xmlns:ogc="http://www.opengis.net/ogc"','xmlns:wcs="http://www.opengis.net/wcs/1.1.1"','xmlns:xlink="http://www.w3.org/1999/xlink"'];return t.join(" ")},schemaLocationByDefault:function(){return'xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd"'},processRequestString:function(){var t="";if("POST"==this.method)t=this.template.post.value;else{if("GET"!=this.method)return!1;t=this.template.get.value}return t=t.replace(/__SERVICE__/g,this.paramservice),t=t.replace(/__VERSION__/g,this.paramversion),t=t.replace(/__RAWDATAOUTPUT__/g,this.paramrawdataoutput),t=t.replace(/__IDENTIFIER__/g,this.paramidentifier),t=t.replace(/__REQUEST__/g,this.paramrequest),"POST"==this.method&&(t=t.replace(/__NAMESPACE__/g,this.namespaceByDefault),t=t.replace(/__SCHEMALOCATION__/g,this.schemaLocationByDefault)),!!(t=t.replace(/<!-- __DATAINPUTS__ -->/g,this.__addDataInputs()))&&(this.requestString=t,!0)},__addDataInputs:function(){for(var t="GET"==this.method?this.template.get.input:this.template.post.input,e="GET"==this.method?";":"",i="",n=this,o=this.DataObject.getData(),s=0;s<o.length;s++)!function(s){e&&(e=s==o.length-1?"":";"),i=i.concat(n.__addDataInput(t,o[s].k,o[s].v),e)}(s);return i},__addDataInput:function(t,e,i){var n=t;return n=n.replace(/__KEY__/g,e),n=n.replace(/__DATA__/g,i)},setMethod:function(t){"GET"!=t&&"POST"!=t||(this.method=t)},getMethod:function(){return this.method}},e}(i),g=function(t,e,i,n,o){var s={build:function(t){if(!t)throw new Error(e.getMessage("PARAM_EMPTY","options"));if(!t.type)throw new Error(e.getMessage("PARAM_EMPTY","type (Elevation or Profil)"));var s=null;switch(t.type){case"Elevation":t.wps.identifier="gs:WPSElevation",s=new n(t.param);break;case"Profil":t.wps.identifier="gs:WPSLineElevation",s=new o(t.param);break;default:throw new Error(e.getMessage("PARAM_TYPE","type (Elevation or Profil)"))}var r={data:s,method:t.method,param:t.wps},a=new i(r);if(!a.processRequestString())throw new Error("Enable to process request !");return a.requestString}};return s}(i,r,_,p,m),v=function(t,e,i,n){var o={build:function(t){var o=null,s={type:t.sampling?"Profil":"Elevation",method:t.httpMethod,param:{positions:null,delimiter:null,indent:null,crs:null,format:null,sampling:null,zonly:null}};s.param.positions=t.positions,s.param.format=t.outputFormat,s.param.sampling=t.sampling,s.param.zonly=t.zonly;var r=null!==t.onError&&"function"==typeof t.onError,a=null!==t.onSuccess&&"function"==typeof t.onSuccess,l=null;switch(t.api){case"REST":var c=new i(s);if(!c.processRequestString()){if(l="Error in process request (rest) !",r)return void t.onError.call(t.scope,new e(l));throw new Error(l)}o=c.requestString;break;case"WPS":if(s.wps={service:null,version:null,identifier:null,rawdataoutput:null,request:null},o=n.build(s),!o){if(l="Error in process request (wps) !",r)return void t.onError.call(t.scope,new e(l));throw new Error(l)}break;default:if(l="Type of API is not supported by service (REST or WPS) !",r)return void t.onError.call(t.scope,new e(l));throw new Error(l)}return a&&t.onSuccess.call(t.scope,o),o}};return o}(i,a,f,g),y=function(t){function e(t){if(!(this instanceof e))throw new TypeError("XML constructor cannot be called as a function.");this.xmlString=null,this.xmlDoc=null,this.reader=null,t&&(t.xmlString&&"string"==typeof t.xmlString&&(this.xmlString=t.xmlString,this.xmlDoc=i(t.xmlString)),t.reader&&this.setReader(t.reader))}function i(t){if("object"==typeof exports){var e=xmldom.DOMParser;return(new e).parseFromString(t,"text/xml")}var i,n,o="Erreur lors du parsing de la réponse du service : XML non conforme";if(window.ActiveXObject){n=new window.ActiveXObject("Microsoft.XMLDOM"),n.async=!1,n.loadXML(t);var s=n.parseError;if(s.errorCode)throw s.line&&s.linepos&&(o+="( ligne "+s.line+", colonne "+s.linepos),s.reason&&(o+=":  "+s.reason+")"),new Error(o);return n}if(window.DOMParser){i=new window.DOMParser;try{n=i.parseFromString(t,"text/xml")}catch(t){throw"SyntaxError"===t.message?new Error(o):new Error("Erreur lors du parsing de la réponse du service : "+t.message)}if(n.getElementsByTagName("parsererror").length>0)for(var r=n.getElementsByTagName("parsererror"),a=0;a<r.length;a++){var l=r[a].innerHTML;if(l.indexOf("Huge input lookup")==-1)throw o+="("+l+")",new Error(o)}else if(!n.documentElement)throw new Error(o);return n}throw new Error("Incompatible DOM Parser pour ce navigateur !")}function n(t){var e;return 9===t.nodeType?e=t.documentElement:1===t.nodeType&&(e=t),e}function o(t){var e={};if(t.attributes.length>0){
-var i=s(t);e.attributes=i}if(t.hasChildNodes())for(var n,r={},a=t.childNodes,l=0;l<a.length;l++)if(n=a[l],3===n.nodeType)e.textContent=n.nodeValue;else if(1===n.nodeType)if(r=o(n),e[n.nodeName]){if(!Array.isArray(e[n.nodeName])){var c=e[n.nodeName];e[n.nodeName]=[],e[n.nodeName].push(c)}e[n.nodeName].push(r)}else e[n.nodeName]=r;return e}function s(t){if(t.attributes.length>0){for(var e={},i=t.attributes,n=0;n<i.length;n++){var o=i[n];e[o.nodeName]=o.nodeValue}return e}}return e.prototype={constructor:e,getXMLString:function(){return this.xmlString},setXMLString:function(t){t&&"string"==typeof t&&(this.xmlString=t,this.xmlDoc=i(t))},getReader:function(){return this.reader},setReader:function(t){t&&t.read&&"function"==typeof t.read&&(this.reader=t)},getXMLDoc:function(){return this.xmlDoc},setXMLDoc:function(t){this.xmlDoc=t},parse:function(){if(!this.xmlDoc&&this.xmlString&&(this.xmlDoc=i(this.xmlString)),this.xmlDoc){var t=n(this.xmlDoc);if(t){var e;return this.reader&&this.reader.read?e=this.reader.read(t):(e={},e[t.nodeName]=o(t)),e}return{}}}},e}(i),E=function(){function t(){if(!(this instanceof t))throw new TypeError("AltiResponse constructor cannot be called as a function.");this.elevations=[]}return t.prototype={constructor:t},t}(),P=function(){function t(){if(!(this instanceof t))throw new TypeError("Elevation constructor cannot be called as a function.");this.z=null}return t.prototype={constructor:t},t}(),C=function(t,e,i){var n={};return n.READERS={elevations:function(t){var i=new e;if(t.hasChildNodes())for(var o,s,r=t.childNodes,a=0;a<r.length;a++)o=r[a],n.READERS[o.nodeName]&&(s=n.READERS[o.nodeName](o),i.elevations.push(s));return i},elevation:function(t){var e=new i;if(t.hasChildNodes())for(var o,s=t.childNodes,r=0;r<s.length;r++)o=s[r],n.READERS[o.nodeName]&&n.READERS[o.nodeName](o,e);return e},lat:function(t,e){var i=t.firstChild;if(!i||3!==i.nodeType)throw new Error("Erreur dans la lecture de la réponse du service: latitude attendue mais absente");e.lat=parseFloat(i.nodeValue)},lon:function(t,e){var i=t.firstChild;if(!i||3!==i.nodeType)throw new Error("Erreur dans la lecture de la réponse du service: longitude attendue mais absente");e.lon=parseFloat(i.nodeValue)},z:function(t,e){var n=t.firstChild;if(!n||3!==n.nodeType)throw new Error("Erreur dans la lecture de la réponse du service: altitude attendue mais absente");return e?void(e.z=parseFloat(n.nodeValue)):(e=new i,e.z=parseFloat(n.nodeValue),e)},acc:function(t,e){var i=t.firstChild;if(!i||3!==i.nodeType)throw new Error("Erreur dans la lecture de la réponse du service: précision (acc) attendue mais absente");e.acc=parseFloat(i.nodeValue)},exceptionreport:function(t){var e={};if(t.hasChildNodes())for(var i,o=t.childNodes,s=0;s<o.length;s++)i=o[s],"Exception"===i.nodeName&&(e.exceptionReport=n.READERS.exception(i));return e},exception:function(t){var e={},i=t.getAttribute("exceptionCode");i&&(e.exceptionCode=i);var n=t.firstChild;return n&&3===n.nodeType&&(e.exception=n.nodeValue),e},error:function(t){var e={error:{}};if(t.hasChildNodes())for(var i,n=t.childNodes,o=0;o<n.length;o++){i=n[o];var s;1===i.nodeType&&"code"===i.nodeName&&(s=i.firstChild,s&&3===s.nodeType&&(e.error.code=s.nodeValue)),1===i.nodeType&&"description"===i.nodeName&&(s=i.firstChild,s&&3===s.nodeType&&(e.error.description=s.nodeValue))}return e}},n.read=function(t){if("elevations"===t.nodeName){var e=n.READERS.elevations(t);return e}if("ExceptionReport"===t.nodeName){var i=n.READERS.exceptionreport(t);return i}if("error"===t.nodeName){var o=n.READERS.error(t);return o}throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.")},n}(i,E,P),S=function(t,e,i,n,o,s,r){var a={build:function(t){var a=null;if(!t.response)return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_EMPTY")));if(t.rawResponse)a=t.response;else{switch(t.outputFormat){case"xml":try{var l=new n({reader:o});if("string"==typeof t.response?l.setXMLString(t.response):l.setXMLDoc(t.response),a=l.parse(),!a)throw new Error(i.getMessage("SERVICE_RESPONSE_EXCEPTION_2"))}catch(n){var c=n.message;return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",c),status:200,type:e.TYPE_SRVERR}))}break;case"json":var h;if(h="string"==typeof t.response?window.JSON.parse(t.response):t.response,h.error)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",h.error.description),status:200,type:e.TYPE_SRVERR}));if(h){var u,d=h.elevations,p=new s;if(Array.isArray(d)&&d.length)for(var m=0;m<d.length;m++)u=new r,"object"==typeof d[m]?(d[m].lon&&(u.lon=d[m].lon),d[m].lat&&(u.lat=d[m].lat),d[m].z&&(u.z=d[m].z),d[m].acc&&(u.acc=d[m].acc)):"number"==typeof d[m]&&(u.z=d[m]),Array.isArray(p.elevations)&&p.elevations.push(u);a=p}if(!a)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_ANALYSE_2"),type:e.TYPE_UNKERR,status:-1}));break;default:return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_FORMAT_2"),type:e.TYPE_UNKERR,status:-1}))}if(a.exceptionReport)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",a.exceptionReport),type:e.TYPE_SRVERR,status:200}));if(a.error){var f=a.error.description;return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",f),type:e.TYPE_SRVERR,status:200}))}}t.onSuccess.call(t.scope,a)}};return a}(i,a,r,y,C,E,P),M=function(t,e,i,n,o,s,r){function a(t){if(!(this instanceof a))throw new TypeError(e.getMessage("CLASS_CONSTRUCTOR","Alti"));if(this.CLASSNAME="Alti",n.apply(this,arguments),!t.positions)throw new Error(e.getMessage("PARAM_MISSING","positions"));if(0===t.positions.length)throw new Error(e.getMessage("PARAM_EMPTY","positions"));if(this.options.positions=t.positions,this.options.outputFormat="string"==typeof t.outputFormat?t.outputFormat.toLowerCase():"xml",this.options.sampling=t.sampling||null,this.options.api="string"==typeof t.api?t.api.toUpperCase():"REST","REST"===this.options.api&&(this.options.httpMethod="GET"),this.options.zonly=t.zonly||!1,!this.options.serverUrl){var i=o.Alti.url(this.options.apiKey),s=null;switch(this.options.api){case"WPS":s=i.wps;break;case"REST":var r=(t.sampling?"profil":"elevation")+"-"+this.options.outputFormat;s=i[r];break;default:throw new Error(e.getMessage("PARAM_UNKNOWN","api"))}if(!s)throw new Error("Url by default not found !");this.options.serverUrl=s}var l=this.options.serverUrl.lastIndexOf(".");if(l!==-1){var c=this.options.serverUrl.substring(l+1);if(c&&c.length<5)switch(c.toLowerCase()){case"json":case"xml":this.options.outputFormat=c.toLowerCase();break;default:throw new Error("type of service : unknown or unsupported (json or xml) !")}}}return a.prototype=Object.create(n.prototype,{}),a.prototype.constructor=a,a.prototype.buildRequest=function(t,e){var i={httpMethod:this.options.httpMethod,onSuccess:function(t){this.request=t,e.call(this,this.request)},onError:t,scope:this,positions:this.options.positions,outputFormat:this.options.outputFormat,sampling:this.options.sampling,api:this.options.api,zonly:this.options.zonly};s.build(i)},a.prototype.analyzeResponse=function(t,n){if(this.response){var o={response:this.response,outputFormat:this.options.outputFormat,rawResponse:this.options.rawResponse,onError:t,onSuccess:n,scope:this};r.build(o)}else t.call(this,new i(e.getMessage("SERVICE_RESPONSE_EMPTY")))},a}(i,r,a,u,h,v,S),w=function(){function t(){if(!(this instanceof t))throw new TypeError("AutoConfResponse constructor cannot be called as a function.");this.generalOptions={apiKeys:{},title:null,defaultGMLGFIStyle:null,theme:null,wgs84Resolutions:[]},this.layers={},this.territories={},this.tileMatrixSets={},this.services={}}return t.prototype={constructor:t,isConfLoaded:function(t){if(t)return!!this.generalOptions.apiKeys[t]},getLayersId:function(t){return this.generalOptions.apiKeys[t]},getLayersConf:function(t){var e={},i=this.getLayersId(t);if(i)for(var n=0;n<i.length;n++){var o=i[n];e[o]=this.layers[o]}return e},getLayerConf:function(t){if(this.layers)return this.layers[t]},getTileMatrixSets:function(){return this.tileMatrixSets},getTMSConf:function(t){if(this.tileMatrixSets)return this.tileMatrixSets[t]},getTerritories:function(){return this.territories},getTerritoryConf:function(t){if(this.territories)return this.territories[t]},getServices:function(){return this.services},getServiceConf:function(t){if(this.services)return this.services[t]}},t}(),L=function(){function t(){if(!(this instanceof t))throw new TypeError("Constraint constructor cannot be called as a function.");this.crs=null,this.bbox={left:null,right:null,top:null,bottom:null},this.minScaleDenominator=null,this.maxScaleDenominator=null,this.temporalExtent=[null,null]}return t.prototype={constructor:t},t}(),R=function(){function t(){if(!(this instanceof t))throw new TypeError("Format constructor cannot be called as a function.");this.current=null,this.name=null}return t.prototype={constructor:t},t}(),b=function(){function t(){if(!(this instanceof t))throw new TypeError("Layer constructor cannot be called as a function.")}return t.prototype={constructor:t,getName:function(){return this.name},getTitle:function(){return this.title},getDescription:function(){return this.description},getLayerId:function(){return this.layerId},getQuicklookUrl:function(){return this.quicklookUrl},getDefaultProjection:function(){return this.defaultProjection},getProjections:function(){var t=[];t.push(this.defaultProjection);var e=t.concat(this.additionalProjections);return e},getBBOX:function(){if(this.globalConstraint)return this.globalConstraint.bbox},getMinScaleDenominator:function(){if(this.globalConstraint)return this.globalConstraint.minScaleDenominator},getMaxScaleDenominator:function(){if(this.globalConstraint)return this.globalConstraint.maxScaleDenominator},getTMSID:function(){if(this.wmtsOptions)return this.wmtsOptions.tileMatrixSetLink},getServiceParams:function(){return this.serviceParams},getServerUrl:function(t){if(t&&this.serviceParams&&this.serviceParams.serverUrl)return this.serviceParams.serverUrl[t]},getLegends:function(){return this.legends},getMetadata:function(){return this.metadata},getStyles:function(){return this.styles},getDefaultStyle:function(){if(this.styles){for(var t,e=this.styles,i=0;i<e.length;i++)if(e[i].current===!0){t=e[i].name;break}return t}},getThematics:function(){return this.thematics},getDefaultFormat:function(){if(this.formats){for(var t,e=this.formats,i=0;i<e.length;i++)if(e[i].current===!0){t=e[i].name;break}return t}},getConstraints:function(){return this.constraints},getOriginators:function(){return this.originators},getDimensions:function(){return this.dimensions},getAggregatedLayers:function(){return this.isAggregate?this.aggregatedLayers:void 0}},t}(),x=function(){function t(){if(!(this instanceof t))throw new TypeError("Legend constructor cannot be called as a function.");this.format=null,this.url=null,this.minScaleDenominator=null}return t.prototype={constructor:t},t}(),G=function(){function t(){if(!(this instanceof t))throw new TypeError("Metadata constructor cannot be called as a function.");this.format=null,this.url=null}return t.prototype={constructor:t},t}(),I=function(){function t(){if(!(this instanceof t))throw new TypeError("Originator constructor cannot be called as a function.");this.name=null,this.attribution=null,this.logo=null,this.url=null,this.constraints=[]}return t.prototype={constructor:t},t}(),A=function(){function t(){if(!(this instanceof t))throw new TypeError("Service constructor cannot be called as a function.");this.title=null,this.serverUrl=null,this.version=null}return t.prototype={constructor:t},t}(),T=function(){function t(){if(!(this instanceof t))throw new TypeError("Style constructor cannot be called as a function.");this.name=null,this.title=null,this.current=null}return t.prototype={constructor:t},t}(),k=function(){function t(){if(!(this instanceof t))throw new TypeError("Territory constructor cannot be called as a function.");this.isDefault=null,this.defaultCRS=null,this.additionalCRS=[],this.geoBBOX={left:null,right:null,top:null,bottom:null},this.geoCenter={lon:null,lat:null},this.defaultOptions={resolution:null,minScaleDenominator:null,maxScaleDenominator:null},this.defaultLayers=[]}return t.prototype={constructor:t},t}(),O=function(){function t(){if(!(this instanceof t))throw new TypeError("Thematic constructor cannot be called as a function.");this.inspire=null,this.name=null}return t.prototype={constructor:t},t}(),D=function(){function t(){if(!(this instanceof t))throw new TypeError("TileMatrixSet constructor cannot be called as a function.");this.projection=null,this.nativeResolutions=[],this.matrixIds=[],this.tileMatrices={}}return t.prototype={constructor:t,getResolutions:function(){return this.nativeResolutions},getMatrixIds:function(){return this.matrixIds},getProjection:function(){return this.projection},getTileMatrices:function(){return this.tileMatrices},getTopLeftCorner:function(){var t,e=this.getTileMatrices();if(e)for(var i in e)if(e.hasOwnProperty(i)){t=e[i].topLeftCorner;break}return t}},t}(),N=function(){function t(){if(!(this instanceof t))throw new TypeError("TileMatrix constructor cannot be called as a function.");this.matrixId=null,this.matrixHeight=null,this.matrixWidth=null,this.scaleDenominator=null,this.tileHeight=null,this.tileWidth=null,this.topLeftCorner=null}return t.prototype={constructor:t,getTopLeftCorner:function(){return this.topLeftCorner},getScaleDenominator:function(){return this.scaleDenominator},getTileHeight:function(){return this.tileHeight},getTileWidth:function(){return this.tileWidth},getMatrixHeight:function(){return this.matrixHeight},getMatrixWidth:function(){return this.matrixWidth}},t}(),U=function(){function t(){if(!(this instanceof t))throw new TypeError("TileMatrixLimit constructor cannot be called as a function.");this.minTileRow=null,this.maxTileRow=null,this.minTileCol=null,this.maxTileCol=null}return t.prototype={constructor:t},t}(),j=function(t,e,i,n,o,s,r,a,l,c,h,u,d,p,m){function f(t){if(t.attributes.length>0){for(var e={},i=t.attributes,n=0;n<i.length;n++){var o=i[n];e[o.nodeName]=o.nodeValue}return e}}function _(t,e){if(t.hasChildNodes())for(var i,n,o,s=t.childNodes,r=0;r<s.length;r++)if(i=s[r],1===i.nodeType)if(n=i.localName||i.baseName||i.nodeName,o=i.prefix||y.DEFAULTPREFIX,y.READERS[o][n]){var a=y.READERS[o][n];a(i,e)}else _(i,e)}function g(t){var e,i="";return t.hasChildNodes()&&(e=t.firstChild,3!==e.nodeType&&4!==e.nodeType||(i=e.nodeValue)),i}function v(t){if(t.attributes.length>0){var e=f(t);for(var i in e)if(e.hasOwnProperty(i)){if("version"===i&&e.version!==y.VERSION)return void console.log("[AutoConfResponseReader] autoconf version is not the expected one : there may be errors in parsing");if("xmlns"===i){if(e[i]!==y.NAMESPACES.xmlns)return void console.log("[AutoConfResponseReader] autoconf response default namespace is not the expected one");continue}var n=i.split(":")[0],o=i.split(":")[1];if("xmlns"===n&&o&&y.NAMESPACES[o]&&y.NAMESPACES[o]!==e[i])return void console.log("[AutoConfResponseReader] autoconf response "+i+" namespace is not the expected one");if("schemaLocation"===o&&e[i]!==y.SCHEMALOCATION[0]&&e[i]!==y.SCHEMALOCATION[1])return void console.log("[AutoConfResponseReader] autoconf response schema location is not the expected one")}}}var y={};return y.VERSION="1.1.0",y.NAMESPACES={xmlns:"http://www.opengis.net/context",gpp:"http://api.ign.fr/geoportail",ows:"http://www.opengis.net/ows/1.1",sld:"http://www.opengis.net/sld",wmts:"http://www.opengis.net/wmts/1.0",xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance"},y.SCHEMALOCATION=["http://www.opengis.net/context http://gpp3-wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://wxs.ign.fr/schemas/autoconf/autoconf.xsd","http://www.opengis.net/context http://gpp3-wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://gpp3-wxs.ign.fr/schemas/autoconf.xsd"],y.DEFAULTPREFIX="context",y.READERS={context:{ViewContext:function(t){v(t);var i=new e;return _(t,i),i},Title:function(t,e){e&&e.generalOptions?e.generalOptions.title=g(t):e&&e.lyr&&(e.lyr.title=g(t))},Abstract:function(t,e){e&&e.lyr&&(e.lyr.description=g(t))},Server:function(t,e){var i=t.getAttribute("service"),n=t.getAttribute("title"),o=t.getAttribute("version");if(i)if(e&&e.services&&"object"==typeof e.services&&!e.services[i]){var s=new l;s.title=n,s.version=o,_(t,s),e.services[i]=s}else e&&e.lyr&&(e.lyr.serviceParams||(e.lyr.serviceParams={}),e.lyr.serviceParams.id=i,e.lyr.serviceParams.version=o)},OnlineResource:function(t,e){e&&e.hasOwnProperty("serverUrl")&&(e.serverUrl=t.getAttribute("xlink:href"))},LayerList:function(t,e){if(_(t,e),e&&e.layers&&e.generalOptions&&e.services)for(var i in e.layers)if(e.layers.hasOwnProperty(i)){var n=e.layers[i],o=n.apiKeys;if(o&&Array.isArray(o))for(var s=0;s<o.length;s++){var r=o[s];e.generalOptions.apiKeys&&(e.generalOptions.apiKeys[r]&&Array.isArray(e.generalOptions.apiKeys[r])||(e.generalOptions.apiKeys[r]=[]),e.generalOptions.apiKeys[r].push(i))}var a=n.serviceParams;if(a&&a.id&&!e.services[a.id]){var c=new l;a.serverUrl&&(c.serverUrl=a.serverUrl),a.version&&(c.version=a.version),e.services[a.id]=c}if(n.wmtsOptions&&n.wmtsOptions.tileMatrixSetLink&&e.tileMatrixSets){var h=n.wmtsOptions.tileMatrixSetLink,u=e.tileMatrixSets;for(var d in u)u.hasOwnProperty(d)&&d===h&&(n.defaultProjection=u[d].projection)}}},Layer:function(t,e){if(e&&e.layers){var i={lyr:new o,lyrId:null},n=t.getAttribute("hidden");"1"===n?i.lyr.hidden=!0:i.lyr.hidden=!1;var s=t.getAttribute("queryable");if("1"===s?i.lyr.queryable=!0:i.lyr.queryable=!1,_(t,i),i.lyrId){if(i.lyr.serviceParams&&i.lyr.serviceParams.id){var r=i.lyr.serviceParams.id;if(r.toUpperCase().indexOf("OPENLS")!==-1||r.toUpperCase().indexOf("ELEVATION")!==-1){var a=i.lyrId.split("$")[0];i.lyrId=a+"$"+r}}i.lyr.layerId=i.lyrId,e.layers[i.lyrId]=i.lyr}}},Name:function(t,e){e&&e.lyr&&(e.lyr.name=g(t))},SRS:function(t,e){e&&e.lyr&&(e.lyr.defaultProjection=g(t))},Format:function(t,e){if(e&&e.lyr){var i=new n,o=t.getAttribute("current");"1"===o?i.current=!0:i.current=!1,i.name=g(t),e.lyr.formats&&Array.isArray(e.lyr.formats)||(e.lyr.formats=[]),e.lyr.formats.push(i)}},Style:function(t,e){if(e&&e.lyr){var i=new c,n=t.getAttribute("current");if("1"===n||1===n?i.current=!0:i.current=!1,t.hasChildNodes)for(var o,s,r=t.childNodes,a=0;a<r.length;a++)o=r[a],1===o.nodeType&&(s=o.localName||o.baseName||o.nodeName,"Name"===s?i.name=g(o):"Title"===s&&(i.title=g(o)));e.lyr.styles&&Array.isArray(e.lyr.styles)||(e.lyr.styles=[]),e.lyr.styles.push(i)}},Dimension:function(t,e){var i=t.getAttribute("name"),n=g(t);e&&e.lyr&&(e.lyr.dimensions||(e.lyr.dimensions={}),"Type"===i?e.lyr.dimensions.type=n:"VisibilityRange"===i?e.lyr.dimensions.visibilityRange=n:"VisibilityMode "===i?e.lyr.dimensions.visibilityMode=n:"GeometricType"===i?e.lyr.dimensions.geometricType=n:"NoDataValue"===i&&(e.lyr.dimensions.noDataValue=n))}},gpp:{Theme:function(t,e){e&&e.generalOptions&&e.generalOptions.hasOwnProperty("theme")&&(e.generalOptions.theme=g(t))},defaultGMLGFIStyleUrl:function(t,e){e&&e.generalOptions&&e.generalOptions.hasOwnProperty("defaultGMLGFIStyle")&&(e.generalOptions.defaultGMLGFIStyle=g(t))},Territory:function(t,e){var i=t.getAttribute("id");if(i){var n=new h,o=t.getAttribute("default");"1"===o?n.isDefault=!0:n.isDefault=!1,_(t,n),e&&e.territories&&"object"==typeof e.territories&&(e.territories[i]=n)}},defaultCRS:function(t,e){e&&e.hasOwnProperty("defaultCRS")&&(e.defaultCRS=g(t))},AdditionalCRS:function(t,e){var i=g(t);i&&e&&(Array.isArray(e.additionalCRS)?e.additionalCRS.push(i):(e.additionalProjections&&Array.isArray(e.additionalProjections)||(e.additionalProjections=[]),e.additionalProjections.push(i)))},DefaultLayer:function(t,e){var i=t.getAttribute("layerId");i&&e&&Array.isArray(e.defaultLayers)&&e.defaultLayers.push(i)},BoundingBox:function(t,e){if(e){var n=g(t).split(",");if(4===n.length){var o={left:parseFloat(n[0]),right:parseFloat(n[2]),top:parseFloat(n[3]),bottom:parseFloat(n[1])},s=t.getAttribute("minT"),r=t.getAttribute("maxT");if(e.hasOwnProperty("geoBBOX"))e.geoBBOX=o;else if(e.hasOwnProperty("bbox"))if(e.bbox.left||e.bbox.right||e.bbox.top||e.bbox.bottom){e.multiConstraints||(e.multiConstraints=[]);var a=new i;a.bbox=o,a.temporalExtent=[s,r],e.multiConstraints.push(a)}else e.bbox=o,e.temporalExtent=[s,r];else e.globalConstraint||(e.globalConstraint=new i),e.globalConstraint.bbox=o,e.globalConstraint.temporalExtent=[s,r]}}},Resolution:function(t,e){var i=g(t);i&&e&&e.defaultOptions&&e.defaultOptions.hasOwnProperty("resolution")&&(e.defaultOptions.resolution=parseFloat(i))},x:function(t,e){var i=g(t);i&&e&&e.geoCenter&&e.geoCenter.hasOwnProperty("lon")&&(e.geoCenter.lon=parseFloat(i))},y:function(t,e){var i=g(t);i&&e&&e.geoCenter&&e.geoCenter.hasOwnProperty("lat")&&(e.geoCenter.lat=parseFloat(i))},Resolutions:function(t,e){e&&e.generalOptions&&e.generalOptions.hasOwnProperty("wgs84Resolutions")&&(e.generalOptions.wgs84Resolutions=g(t).split(","))},Layer:function(t,e){if(e&&e.hasOwnProperty("lyrId")&&e.lyr){e.lyrId=t.getAttribute("id");var i=t.getAttribute("aggregate"),n=t.getAttribute("more");(i||n)&&(e.lyr.isAggregate=!0),_(t,e.lyr)}},Constraint:function(t,e){var n=new i;if(_(t,n),e)if(e.constraints&&Array.isArray(e.constraints)||(e.constraints=[]),n.multiConstraints&&Array.isArray(n.multiConstraints)){var o=new i;o.crs=n.crs,o.bbox=n.bbox,o.minScaleDenominator=n.minScaleDenominator,o.maxScaleDenominator=n.maxScaleDenominator,o.temporalExtent=n.temporalExtent,e.constraints.push(o);for(var s=0;s<n.multiConstraints.length;s++)o=new i,o.crs=n.crs,o.minScaleDenominator=n.minScaleDenominator,o.maxScaleDenominator=n.maxScaleDenominator,o.bbox=n.multiConstraints[s].bbox,o.temporalExtent=n.multiConstraints[s].temporalExtent,e.constraints.push(o)}else e.constraints.push(n)},CRS:function(t,e){e&&e.hasOwnProperty("crs")&&(e.crs=g(t))},Thematic:function(t,e){if(e){var i=new u;i.inspire=!1,i.name=g(t),e.thematics&&Array.isArray(e.thematics)||(e.thematics=[]),e.thematics.push(i)}},InspireThematic:function(t,e){if(e){var i=new u;i.inspire=!0,i.name=g(t),e.thematics&&Array.isArray(e.thematics)||(e.thematics=[]),e.thematics.push(i)}},Originator:function(t,e){if(e){var i=new a;i.name=t.getAttribute("name"),_(t,i),e.originators&&Array.isArray(e.originators)||(e.originators=[]),e.originators.push(i)}},Attribution:function(t,e){e&&e.hasOwnProperty("attribution")&&(e.attribution=g(t))},Logo:function(t,e){e&&e.hasOwnProperty("logo")&&(e.logo=g(t))},URL:function(t,e){e&&e.hasOwnProperty("url")&&(e.url=g(t))},Legend:function(t,e){var i=new s;_(t,i),e&&(e.legends&&Array.isArray(e.legends)||(e.legends=[]),e.legends.push(i))},LegendURL:function(t,e){if(e&&e.hasOwnProperty("format")&&(e.format=t.getAttribute("format"),t.hasChildNodes)){var i=t.childNodes[0],n=i.localName||i.baseName||i.nodeName;"OnlineResource"===n&&e.hasOwnProperty("url")&&(e.url=i.getAttribute("xlink:href"))}},QuickLook:function(t,e){if(t.hasChildNodes){var i=t.childNodes[0],n=i.localName||i.baseName||i.nodeName;"OnlineResource"===n&&e&&(e.quicklookUrl=i.getAttribute("xlink:href"))}},MetadataURL:function(t,e){if(e){var i=new r;if(i.format=t.getAttribute("format"),t.hasChildNodes){var n=t.childNodes[0],o=n.localName||n.baseName||n.nodeName;"OnlineResource"===o&&(i.url=n.getAttribute("xlink:href"))}e.metadata||Array.isArray(e.metadata)||(e.metadata=[]),e.metadata.push(i)}},Key:function(t,e){if(e){var i=t.getAttribute("id");e.apiKeys&&Array.isArray(e.apiKeys)||(e.apiKeys=[]),e.apiKeys.push(i);var n=g(t);e.serviceParams||(e.serviceParams={}),e.serviceParams.serverUrl||(e.serviceParams.serverUrl={}),e.serviceParams.serverUrl[i]||(e.serviceParams.serverUrl[i]=n)}}},ows:{Identifier:function(t,e){e&&e.hasOwnProperty("TMS")?e.identifier=g(t):e&&e.hasOwnProperty("matrixId")&&(e.matrixId=g(t))},SupportedCRS:function(t,e){e&&e.TMS&&e.TMS.hasOwnProperty("projection")&&(e.TMS.projection=g(t))}},sld:{MinScaleDenominator:function(t,e){var n=g(t);n&&e&&(e.hasOwnProperty("defaultOptions")?e.defaultOptions.minScaleDenominator=parseFloat(n):e.lyr?(e.lyr.globalConstraint||(e.lyr.globalConstraint=new i),e.lyr.globalConstraint.minScaleDenominator=parseFloat(n)):e.hasOwnProperty("minScaleDenominator")&&(e.minScaleDenominator=parseFloat(n)))},MaxScaleDenominator:function(t,e){var n=g(t);n&&e&&(e.hasOwnProperty("defaultOptions")?e.defaultOptions.maxScaleDenominator=parseFloat(n):e.lyr?(e.lyr.globalConstraint||(e.lyr.globalConstraint=new i),e.lyr.globalConstraint.maxScaleDenominator=parseFloat(n)):e.hasOwnProperty("maxScaleDenominator")&&(e.maxScaleDenominator=parseFloat(n)))}},wmts:{TileMatrixSetLimits:function(t,e){if(e){var i={};_(t,i),e.wmtsOptions||(e.wmtsOptions={}),e.wmtsOptions.tileMatrixSetLimits=i}},TileMatrixLimits:function(t,e){var i,n=new m;if(t.hasChildNodes){for(var o=t.childNodes,s=0;s<o.length;s++){var r=o[s],a=r.localName||r.baseName||r.nodeName;"TileMatrix"===a?i=g(r):"MinTileRow"===a?n.minTileRow=g(r):"MaxTileRow"===a?n.maxTileRow=g(r):"MinTileCol"===a?n.minTileCol=g(r):"MaxTileCol"===a&&(n.maxTileCol=g(r))}i&&e&&!e[i]&&(e[i]=n)}},TileMatrixSet:function(t,e){if(e&&e.tileMatrixSets){var i={};i.TMS=new d,i.resolutions=[],_(t,i);var n=i.TMS.tileMatrices;for(var o in n)n.hasOwnProperty(o)&&i.TMS.matrixIds.push(o);if(("IGNF:WGS84G"===i.TMS.getProjection()||"EPSG:4326"===i.TMS.getProjection())&&e.generalOptions&&Array.isArray(e.generalOptions.wgs84Resolutions))for(var s=e.generalOptions.wgs84Resolutions,r=0;r<s.length;r++)i.resolutions[r]=parseFloat(s[r]);Array.isArray(i.resolutions)&&void 0!==i.resolutions.sort&&i.resolutions.sort(function(t,e){return e-t}),i.TMS.nativeResolutions=i.resolutions,e.tileMatrixSets[i.identifier]=i.TMS}else e&&!e.wmtsOptions&&(e.wmtsOptions={}),e.wmtsOptions.tileMatrixSetLink=g(t)},TileMatrix:function(t,e){if(e){var i=new p;if(_(t,i),e.TMS&&e.TMS.getProjection()){var n=e.TMS.getProjection();if("EPSG:3857"===n||"EPSG:2154"===n){var o=28e-5*i.scaleDenominator;e.resolutions&&Array.isArray(e.resolutions)&&e.resolutions.push(o)}}e.TMS&&e.TMS.tileMatrices&&(e.TMS.tileMatrices[i.matrixId]=i)}},ScaleDenominator:function(t,e){var i=g(t);i&&e&&e.hasOwnProperty("scaleDenominator")&&(e.scaleDenominator=parseFloat(i))},TopLeftCorner:function(t,e){var i=g(t).split(" ");i&&e&&(e.topLeftCorner={},e.topLeftCorner.x=parseFloat(i[0]),e.topLeftCorner.y=parseFloat(i[1]))},TileWidth:function(t,e){var i=g(t);i&&e&&e.hasOwnProperty("tileWidth")&&(e.tileWidth=parseInt(i,10))},TileHeight:function(t,e){var i=g(t);i&&e&&e.hasOwnProperty("tileHeight")&&(e.tileHeight=parseInt(i,10))},MatrixWidth:function(t,e){var i=g(t);i&&e&&e.hasOwnProperty("matrixWidth")&&(e.matrixWidth=parseInt(i,10))},MatrixHeight:function(t,e){var i=g(t);i&&e&&e.hasOwnProperty("matrixHeight")&&(e.matrixHeight=parseInt(i,10))}},serviceException:function(t){var e={};if(t.hasChildNodes())for(var i,n=t.childNodes,o=0;o<n.length;o++)i=n[o],"exception"===i.nodeName&&(e.exceptionReport=y.READERS.exception(i));return e},exception:function(t){var e={},i=t.getAttribute("code");i&&(e.exceptionCode=i);var n=t.firstChild;return n&&3===n.nodeType&&(e.exception=n.nodeValue),e}},y.read=function(t){if("ViewContext"===t.nodeName){var e=t.prefix||y.DEFAULTPREFIX,i=y.READERS[e][t.nodeName](t);return i}if("serviceException"===t.nodeName){var n=y.READERS[t.nodeName](t);return n}throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.")},y}(i,w,L,R,b,x,G,I,A,T,k,O,D,N,U),F=function(t,e,i,n,o){var s={build:function(t){var s=null;if(!t.response)return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_EMPTY")));if(t.rawResponse)s=t.response;else{try{var r=new n({reader:o});"string"==typeof t.response?r.setXMLString(t.response):r.setXMLDoc(t.response),s=r.parse()}catch(n){var a=n.message;return a+="string"==typeof t.response?"\n(raw response service'"+t.response+"')":"\n(raw response service'"+t.response.documentElement.innerHTML+"')",void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",a),status:200,type:e.TYPE_SRVERR}))}var l=!0;for(var c in s)s.hasOwnProperty(c)&&(l=!1);if(l)return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_EMPTY_2")));if(s.exceptionReport)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",s.exceptionReport),type:e.TYPE_SRVERR,status:200}))}var h="undefined"!=typeof window?window:{};h.Gp||(h.Gp={}),h.Gp.Config?this.mergeConfig(h.Gp.Config,s,t.layerId):h.Gp.Config=s,t.onSuccess.call(t.scope,h.Gp.Config)},mergeConfig:function(t,e,i){if(e&&t){for(var n in e)if(e.hasOwnProperty(n))if("generalOptions"==n)for(var o in e[n].apiKeys)e[n].apiKeys.hasOwnProperty(o)&&!t.generalOptions.apiKeys[o]&&(t.generalOptions.apiKeys[o]=e[n].apiKeys[o]);else if(t[n])for(var s in e[n])e[n].hasOwnProperty(s)&&!t[n][s]&&(t[n][s]=e[n][s]);if(i){var r=[];for(var a in e.layers)e.layers.hasOwnProperty(a)&&r.push(a);t.layers[i]&&(t.layers[i].aggregatedLayers=r)}}}};return s}(i,a,r,y,j),z=function(t,e,i,n,o,s,r){function a(t){if(!(this instanceof a))throw new TypeError(e.getMessage("CLASS_CONSTRUCTOR","AutoConf"));if(this.CLASSNAME="AutoConf",s.apply(this,arguments),!this.options.serverUrl&&!this.options.serverUrl){var i=o.AutoConf.url(this.options.apiKey);this.options.layerId?this.options.serverUrl=i.aggregate+this.options.layerId:Array.isArray(this.options.apiKey)&&this.options.apiKey.length>0?this.options.serverUrl=i.apiKeys:this.options.serverUrl=i.apiKey}"XHR"===this.options.protocol&&"POST"===this.options.httpMethod&&(this.options.httpMethod="GET"),this.options.outputFormat="xml"}return a.prototype=Object.create(s.prototype,{}),a.prototype.constructor=a,a.prototype.buildRequest=function(t,e){var i="undefined"!=typeof window?window:{};if(i.Gp&&i.Gp.Config&&i.Gp.Config.generalOptions&&i.Gp.Config.layers&&i.Gp.Config.generalOptions.apiKeys[this.options.apiKey]){if(!this.options.layerId)return void this.options.onSuccess.call(this,i.Gp.Config);if(i.Gp.Config.layers[this.options.layerId]&&i.Gp.Config.layers[this.options.layerId].aggregatedLayers)return void this.options.onSuccess.call(this,i.Gp.Config)}this.request="";var o;o=this.options.serverUrl.indexOf("http://")===-1,!o&&this.layerId&&(this.request=n.normalyzeParameters({layerId:this.layerId})),e.call(this,this.request)},a.prototype.analyzeResponse=function(t,n){if(this.response){var o={layerId:this.options.layerId,response:this.response,rawResponse:this.options.rawResponse,onSuccess:n,onError:t,scope:this};r.build(o)}else t.call(this,new i(e.getMessage("SERVICE_RESPONSE_EMPTY")))},a}(i,r,a,n,h,u,F),B=function(t){function e(t){if(!(this instanceof e))throw new TypeError("RequestHeader constructor cannot be called as a function.");this.options=t||{srsName:"EPSG:4326"};for(var i in t)t.hasOwnProperty(i)&&(this.options[i]=t[i])}return e.prototype={requestString:null,template:'<RequestHeader srsName="__SRSNAME__"/>',constructor:e,toString:function(){var t=null;return t=this.template,t=t.replace(/__SRSNAME__/g,this.options.srsName),this.requestString=t,this.requestString}},e}(i),q=function(t){function e(t){if(!(this instanceof e))throw new TypeError("Request constructor cannot be called as a function.");this.options=t||{maximumResponses:25,methodName:null,version:"1.2"};for(var i in t)t.hasOwnProperty(i)&&(this.options[i]=t[i])}return e.prototype={requestString:null,template:'<Request maximumResponses="__MAXRESPONSES__" methodName="__METHODNAME__" requestID="__UUID__" version="__VERSION__"><!-- __REQUESTSERVICE__ --></Request>',constructor:e,guid:function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(t){var e=16*Math.random()|0,i="x"===t?e:3&e|8;return i.toString(16)})},toString:function(){var t=null;return t=this.template,t=t.replace(/__MAXRESPONSES__/g,this.options.maximumResponses),
-t=t.replace(/__METHODNAME__/g,this.options.methodName),t=t.replace(/__UUID__/g,this.guid()),t=t.replace(/__VERSION__/g,this.options.version),this.requestString=t,this.requestString}},e}(i),W=function(t){function e(t){if(!(this instanceof e))throw new TypeError("AbstractService constructor cannot be called as a function.");this.options=t||{};for(var i in t)t.hasOwnProperty(i)&&(this.options[i]=t[i])}return e.prototype={strRequest:null,oRequest:null,oFilter:null,constructor:e,addRequest:function(t){},addFilter:function(t){},toString:function(){}},e}(i),H=function(t,e,i,n){function o(t){if(!(this instanceof o))throw new TypeError("XLS constructor cannot be called as a function.");this.options={srsName:"EPSG:4326",maximumResponses:25};for(var e in t)t.hasOwnProperty(e)&&t[e]&&(this.options[e]=t[e])}return o.VERSION="1.2",o.prototype={requestString:null,namespace:!1,oService:null,constructor:o,template:'<?xml version="1.0" encoding="UTF-8"?>\n<XLS version="__VERSION__"\n__NAMESPACE__ \n__SCHEMALOCATION__>\n__REQUESTHEADER__\n__REQUEST__\n</XLS>\n',namespaceByDefault:function(){var t=['xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"','xmlns:xls="http://www.opengis.net/xls"','xmlns:gml="http://www.opengis.net/gml"'];return t.join(" ")},schemaLocationByDefault:function(){return'xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.2/olsAll.xsd"'},setService:function(t){t&&t instanceof n&&(this.oService=t)},getService:function(){return this.oService}},o.prototype.addNamespace=function(t,e){for(var i=t.key,n=!1,o=this.namespaceByDefault().split(" "),s=0;s<o.length;s++){var r=o[s],a=r.split("="),l=a[0];if(l==="xmlns:"+i){n=!0;break}}if(!n)return e;var c,h;return c=/<(\w+[\s>])/g,h="<"+i+":$1",e=e.replace(c,h),c=/<\/(\w+[\s>])/g,h="</"+i+":$1",e=e.replace(c,h)},o.prototype.build=function(){var t=!!this.getService(),n="";n=this.template,n=n.replace(/__VERSION__/g,o.VERSION),n=n.replace(/__NAMESPACE__/g,this.namespaceByDefault),n=n.replace(/__SCHEMALOCATION__/g,this.schemaLocationByDefault);var s=new e({srsName:this.options.srsName});n=n.replace(/__REQUESTHEADER__/g,s.toString());var r=new i({maximumResponses:this.options.maximumResponses,version:o.VERSION,methodName:t?this.getService().CLASSTYPE:null});if(n=n.replace(/__REQUEST__/g,r.toString()),t&&(n=n.replace(/<!-- __REQUESTSERVICE__ -->/g,this.getService().toString())),n)return this.namespace&&(n=this.addNamespace({key:"xls",url:"http://www.opengis.net/xls"},n)),this.requestString=n,this.requestString},o}(i,B,q,W),V=function(t,e){function i(t){if(!(this instanceof i))throw new TypeError("Address constructor cannot be called as a function.");if(this.options=t||{location:{},type:["StreetAddress"],filter:{}},!t.location)throw new Error("l'option 'location' n'est pas renseignée !");for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e])}return i.prototype={constructor:i,requestString:null,template:{address:'<Address countryCode="__COUNTRYCODE__">__LOCATION____PLACE____POSTALCODE____ENVELOPE__</Address>',location:{freeFormAddress:"<freeFormAddress>__FREEFORMADDRESSVALUE__</freeFormAddress>",streetAddress:{container:"<StreetAddress>__STREET____BUILDING__</StreetAddress>",building:'<Building number="__BUILDINGVALUE__"/>',street:"<Street>__STREETVALUE__</Street>"}},place:'<Place type="__PLACETYPE__">__PLACEVALUE__</Place>',postalCode:"<PostalCode>__POSTALCODEVALUE__</PostalCode>",envelope:"<gml:Envelope><gml:lowerCorner>__LEFT__ __BOTTOM__</gml:lowerCorner><gml:upperCorner>__RIGHT__ __TOP__</gml:upperCorner></gml:Envelope>"}},i.prototype.toString=function(){var t=null;if(t=this.template.address,t=t.replace(/__COUNTRYCODE__/g,this.options.type),"string"==typeof this.options.location){var e=this.template.location.freeFormAddress;e=e.replace(/__FREEFORMADDRESSVALUE__/g,this.options.location),t=t.replace(/__LOCATION__/g,e)}else{var i="",n="";this.options.location.number&&(i=this.template.location.streetAddress.building,i=i.replace(/__BUILDINGVALUE__/g,this.options.location.number)),this.options.location.street&&(n=this.template.location.streetAddress.street,n=n.replace(/__STREETVALUE__/g,this.options.location.street));var o=this.template.location.streetAddress.container;o=o.replace(/__STREET__/g,n),o=o.replace(/__BUILDING__/g,i),t=t.replace(/__LOCATION__/g,o)}var s="";this.options.location.postalCode&&(s=this.template.postalCode,s=s.replace(/__POSTALCODEVALUE__/g,this.options.location.postalCode));var r="";if(this.options.filter){var a=this.options.filter.bbox;a&&(r=this.template.envelope,r=r.replace(/__LEFT__/g,a.left),r=r.replace(/__BOTTOM__/g,a.bottom),r=r.replace(/__RIGHT__/g,a.right),r=r.replace(/__TOP__/g,a.top))}var l=[],c="";if(this.options.filter){var h=this.options.filter;for(var u in h)"bbox"!==u&&(c=this.template.place,c=c.replace(/__PLACETYPE__/g,u),c=c.replace(/__PLACEVALUE__/g,h[u]),l.push(c))}var d="";return this.options.location.city&&(d=this.template.place,d=d.replace(/__PLACETYPE__/g,"Municipality"),d=d.replace(/__PLACEVALUE__/g,this.options.location.city),l.push(d)),t=t.replace(/__POSTALCODE__/g,s),t=t.replace(/__PLACE__/g,l.join("\n")),t=t.replace(/__ENVELOPE__/g,r),this.requestString=t,this.requestString},i}(Bt,i),Y=function(t){function e(){if(!(this instanceof e))throw new TypeError("GeocodeFilterExtension constructor cannot be called as a function.");this.filters=[]}return e.prototype={constructor:e,addFilterExtensions:function(t){t&&this.filters.push(t)},getNames:function(){var t=[];for(var e in this.filters)t.push(this.filters[e].CLASSNAME);return t},getFilter:function(t){var e=null;for(var i in this.filters)this.filters[i].CLASSNAME==t&&(e=this.filters[i]);return e},getFilters:function(){return this.filters},getAttributs:function(t){var e=[];for(var i in this.filters)this.filters[i].CLASSNAME==t&&(e=this.filters[i].attributesList);return e},setPlaceAttributs:function(t,e){var i=this.getFilter(t),n=this.getAttributs(t);for(var o in n){var s=n[o];e[s]&&(i.placeAttributes[s]=e[s])}},getPlaceAttributs:function(t){var e={};for(var i in this.filters)this.filters[i].CLASSNAME==t&&(e=this.filters[i].placeAttributes);return e}},e}(i),K=function(t,e,i){function n(t){if(!(this instanceof n))throw new TypeError("GeocodeRequest constructor cannot be called as a function.");this.options=t||{};for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);this.CLASSNAME="GeocodeRequest"}return n.prototype={strRequest:null,oAddress:null,oFilter:null,template:'<GeocodeRequest returnFreeForm="__RETURNFREEFORM__">__ADDRESS__</GeocodeRequest>',addAddress:function(t){t instanceof e&&(this.oAddress=t)},addFilter:function(t){t instanceof i&&(this.oFilter=t)},constructor:n,toString:function(){var t="";if(t=this.template,!this.oAddress){var i={};if(i.location=this.options.location,i.type=this.options.filterOptions.type||["StreetAddress"],i.filter=this.options.filterOptions,delete i.filter.type,this.oFilter){i.filter={};for(var n in i.type){var o=i.type[n],s=this.oFilter.getFilter(o);if(s){for(var r=this.options.filterOptions,a=s.attributesList,l=0;l<a.length;l++){var c=a[l];if(r[c]){var h=s.serviceAttributes[l];s.placeAttributes[h]=r[c]}}var u=s.placeAttributes;for(var d in u)u.hasOwnProperty(d)&&(i.filter[d]=u[d])}}}if(this.oAddress=new e(i),!this.oAddress)throw new Error("La construction de l'adresse n'est pas correctement definie !?")}return t=t.replace(/__ADDRESS__/g,this.oAddress.toString()),t=t.replace(/__RETURNFREEFORM__/g,this.options.returnFreeForm?"true":"false"),this.strRequest=t,this.strRequest}},n}(i,V,Y),X=function(t){function e(t){if(!(this instanceof e))throw new TypeError("Position constructor cannot be called as a function.");if(this.options=t||{},!t.position)throw new Error("l'option 'position' n'est pas renseignée !");for(var i in t)t.hasOwnProperty(i)&&(this.options[i]=t[i])}return e.prototype={constructor:e,requestString:null,template:{position:"<Position>__GMLPOINT____GMLFILTER__</Position>",gml:{point:'<gml:Point xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos></gml:Point>',pos:null,filter:{bbox:'<gml:Envelope xmlns:gml="http://www.opengis.net/gml"><gml:lowerCorner>__LEFT__ __BOTTOM__</gml:lowerCorner><gml:upperCorner>__RIGHT__ __TOP__</gml:upperCorner></gml:Envelope>',circle:'<gml:CircleByCenterPoint xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos><gml:radius>__RADIUS__</gml:radius></gml:CircleByCenterPoint>',polygon:'<gml:Polygon xmlns:gml="http://www.opengis.net/gml"><gml:exterior><gml:LinearRing><gml:posList>__XY__</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>',multipolygon:null}}}},e.prototype.toString=function(){var t=this.template.position,e=this.template.gml.point;e=e.replace(/__X__/g,this.options.position.x),e=e.replace(/__Y__/g,this.options.position.y);var i="";if(this.options.filter){var n=this.options.filter;for(var o in n)switch(o){case"circle":i=this.template.gml.filter[o],i=i.replace(/__X__/g,n[o].x),i=i.replace(/__Y__/g,n[o].y),i=i.replace(/__RADIUS__/g,n[o].radius);break;case"bbox":i=this.template.gml.filter[o],i=i.replace(/__LEFT__/g,n[o].left),i=i.replace(/__BOTTOM__/g,n[o].bottom),i=i.replace(/__RIGHT__/g,n[o].right),i=i.replace(/__TOP__/g,n[o].top);break;case"polygon":i=this.template.gml.filter[o];for(var s="",r=n[o],a=0;a<r.length;a++){var l=r[a];if(Array.isArray(l))break;(l.x&&l.y||0===l.x||0===l.y)&&(s+=l.x+" "+l.y),r.length!==a+1&&(s+=" ")}i=i.replace(/__XY__/g,s);break;case"multipolygon":}}return t=t.replace(/__GMLPOINT__/g,e),t=t.replace(/__GMLFILTER__/g,i),this.requestString=t,this.requestString},e}(i),Z=function(t){function e(t){if(!(this instanceof e))throw new TypeError("Preference constructor cannot be called as a function.");this.type=t}return e.prototype={constructor:e,requestString:null,template:"<ReverseGeocodePreference>__TYPE__</ReverseGeocodePreference>"},e.prototype.toString=function(){for(var t=[],e="",i=0;i<this.type.length;i++)e=this.template,e=e.replace(/__TYPE__/g,this.type[i]),t.push(e);return this.strRequest=t.join("\n"),this.strRequest},e}(i),Q=function(t,e,i){function n(t){if(!(this instanceof n))throw new TypeError("ReverseGeocodeRequest constructor cannot be called as a function.");this.options=t||{};for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);this.CLASSNAME="ReverseGeocodeRequest"}return n.prototype={strRequest:null,oPosition:null,oPreference:null,constructor:n,template:'<ReverseGeocodeRequest returnFreeForm="__RETURNFREEFORM__">__POSITION____PREFERENCE__</ReverseGeocodeRequest>',addPosition:function(t){t instanceof e&&(this.oPosition=t)},addPreferences:function(t){t instanceof i&&(this.oPreference=t)},toString:function(){var t="";if(t=this.template,!this.oPreference&&(this.oPreference=new i(this.options.filterOptions.type||["StreetAddress"]),!this.oPreference))throw new Error("Les preferences ne sont pas definies !?");if(t=t.replace(/__PREFERENCE__/g,this.oPreference.toString()),!this.oPosition){var n={position:this.options.position,filter:{}};if(this.options.filterOptions&&(n.filter=this.options.filterOptions,delete n.filter.type),this.oPosition=new e(n),!this.oPosition)throw new Error("La position et ses filtres ne sont pas definis !?")}return t=t.replace(/__POSITION__/g,this.oPosition.toString()),t=t.replace(/__RETURNFREEFORM__/g,this.options.returnFreeForm?"true":"false"),this.strRequest=t,this.strRequest}},n}(i,X,Z),J=function(t,e,i,n,o){function s(t){if(!(this instanceof s))throw new TypeError("LocationUtilityService constructor cannot be called as a function.");this.CLASSNAME="LocationUtilityService",this.CLASSTYPE=null,e.apply(this,arguments),this.options&&(this.CLASSTYPE=this.options.location?"GeocodeRequest":this.options.position?"ReverseGeocodeRequest":null)}return s.prototype=Object.create(e.prototype,{}),s.prototype.constructor=s,s.prototype.addRequest=function(t){switch(this.CLASSTYPE=t.CLASSNAME,this.CLASSTYPE){case"GeocodeRequest":case"ReverseGeocodeRequest":this.oRequest=t;break;default:throw new Error("Ce n'est pas un objet de type 'LUS Request' !?")}},s.prototype.addFilter=function(t){t instanceof o&&(this.oFilter=t)},s.prototype.toString=function(){if(!this.oRequest){if(!this.options)throw new Error("Les options ne sont pas renseignées, impossible de construire la requête !");if("GeocodeRequest"===this.CLASSTYPE){var t={location:this.options.location,returnFreeForm:this.options.returnFreeForm,filterOptions:this.options.filterOptions||{}};this.oRequest=new i(t),this.oFilter&&this.oRequest.addFilter(this.oFilter)}else if("ReverseGeocodeRequest"===this.CLASSTYPE){var e={position:this.options.position,returnFreeForm:this.options.returnFreeForm,filterOptions:this.options.filterOptions||{}};this.oRequest=new n(e)}}if(!this.oRequest)throw new Error("Type de Geocodage indefini !");return this.strRequest=this.oRequest.toString(),this.strRequest},s}(i,W,K,Q,Y),$=function(){function t(){if(!(this instanceof t))throw new TypeError("GeocodeLocation constructor cannot be called as a function.");this.placeAttributes={},this.attributesList=[],this.serviceAttributes=[]}return t.prototype={constructor:t},t}(),tt=function(t){function e(){if(!(this instanceof e))throw new TypeError("StreetAddress constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="StreetAddress",this.attributesList=["bbox","ID","IDTR","quality","territory","commune","department","insee","municipality"],this.serviceAttributes=["bbox","ID","IDTR","Qualite","Territoire","Commune","Departement","INSEE","Municipality"]}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}($),et=function(t){function e(){if(!(this instanceof e))throw new TypeError("PositionOfInterest constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="PositionOfInterest",this.attributesList=["bbox","importance","nature","territory","commune","department","insee","municipality"],this.serviceAttributes=["bbox","Importance","Nature","Territoire","Commune","Departement","INSEE","Municipality"]}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}($),it=function(t){function e(){if(!(this instanceof e))throw new TypeError("CadastralParcel constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="CadastralParcel",this.attributesList=["absorbedCity","sheet","number","section","commune","department","insee","municipality","origin"],this.serviceAttributes=["CommuneAbsorbee","Feuille","Numero","Section","Commune","Departement","INSEE","Municipality","Type"]}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}($),nt=function(t){function e(){if(!(this instanceof e))throw new TypeError("Administratif constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="Administratif",this.attributesList=["bbox","prefecture","inseeRegion","inseeDepartment","municipality"],this.serviceAttributes=["bbox","Prefecture","InseeRegion","InseeDepartement","Municipality"]}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}($),ot=function(t,e,i,n,o,s,r,a){var l={build:function(t){var l=null,c=new n;c.addFilterExtensions(new a),c.addFilterExtensions(new o),c.addFilterExtensions(new s),c.addFilterExtensions(new r);var h=new i({location:t.location,returnFreeForm:t.returnFreeForm,filterOptions:t.filterOptions});h.addFilter(c);var u=new e({srsName:t.srs,maximumResponses:t.maximumResponses});if(u.namespace=!0,u.setService(h),l=u.build(),"GET"==t.httpMethod){var d="qxml="+encodeURIComponent(l).replace(/\-/g,"%2D").replace(/\_/g,"%5F").replace(/\./g,"%2E").replace(/\!/g,"%21").replace(/\~/g,"%7E").replace(/\*/g,"%2A").replace(/\'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29");l=d}return l}};return l}(i,H,J,Y,tt,et,it,nt),st=function(){function t(){if(!(this instanceof t))throw new TypeError("GeocodeResponse constructor cannot be called as a function.");this.locations=[]}return t.prototype={constructor:t},t}(),rt=function(){function t(){if(!(this instanceof t))throw new TypeError("GeocodedLocation constructor cannot be called as a function.");this.position={x:null,y:null},this.matchType=null,this.placeAttributes={},this.type=null}return t.prototype={constructor:t},t}(),at=function(t){function e(){if(!(this instanceof e))throw new TypeError("DirectGeocodedLocation constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="DirectGeocodedLocation",this.accuracy=null}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}(rt),lt=function(t,e,i,n,o){function s(t){if(t.attributes.length>0){for(var e={},i=t.attributes,n=0;n<i.length;n++){var o=i[n];e[o.nodeName]=o.nodeValue}return e}}function r(t,e){if(t.hasChildNodes())for(var i,n,o,s=t.childNodes,a=0;a<s.length;a++)if(i=s[a],1===i.nodeType)if(n=i.localName||i.baseName||i.nodeName,o=i.prefix||c.DEFAULTPREFIX,c.READERS[o][n]){var l=c.READERS[o][n];l(i,e)}else r(i,e)}function a(t){var e,i="";return t.hasChildNodes()&&(e=t.firstChild,3===e.nodeType&&(i=e.nodeValue)),i}function l(t){if(t.attributes.length>0){var e=s(t);for(var i in e)if(e.hasOwnProperty(i)){if("version"===i&&e.version!==c.VERSION)return void console.log("[DirectGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing");if("xmlns"===i){if(e[i]!==c.NAMESPACES[c.DEFAULTPREFIX])return void console.log("[DirectGeocodeResponseReader] geocode response default namespace is not the expected one");continue}var n=i.split(":")[0],o=i.split(":")[1];if("xmlns"===n&&o&&c.NAMESPACES[o]&&c.NAMESPACES[o]!==e[i])return void console.log("[DirectGeocodeResponseReader] geocode response "+i+" namespace is not the expected one");if("schemaLocation"===o&&c.SCHEMALOCATION!==e[i])return void console.log("[DirectGeocodeResponseReader] geocode response schema location is not the expected one")}}}var c={};return c.VERSION="1.2",c.NAMESPACES={xmlns:"http://www.opengis.net/xls",gml:"http://www.opengis.net/gml",xls:"http://www.opengis.net/xls",xlsext:"http://www.opengis.net/xlsext",xsi:"http://www.w3.org/2001/XMLSchema-instance"},c.SCHEMALOCATION="http://wxs.ign.fr/schemas/olsAll.xsd",c.DEFAULTPREFIX="xls",c.READERS={xls:{XLS:function(t){var e=new n;return l(t),r(t,e),e},GeocodedAddress:function(t,e){var i=new o;r(t,i),e&&Array.isArray(e.locations)&&e.locations.push(i)},GeocodeMatchCode:function(t,e){var i=t.getAttribute("accuracy");i&&e&&(e.accuracy=parseFloat(i));var n=t.getAttribute("matchType");n&&e&&(e.matchType=n)},Address:function(t,e){var i=t.getAttribute("countryCode");e&&i&&(e.type=i),r(t,e)},freeFormAddress:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&(e.placeAttributes.freeform=a(t))},Building:function(t,e){var i=t.getAttribute("number");e&&e.hasOwnProperty("placeAttributes")&&(i?e.placeAttributes.number=i:t.getAttribute("buildingName")?e.placeAttributes.number=t.getAttribute("buildingName"):t.getAttribute("subdivision")&&(e.placeAttributes.number=t.getAttribute("subdivision")))},Street:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&("StreetAddress"===e.type?e.placeAttributes.street=a(t):"CadastralParcel"===e.type&&(e.placeAttributes.cadastralParcel=a(t)))},Place:function(t,e){var i=t.getAttribute("type"),n=a(t);if(e&&e.hasOwnProperty("placeAttributes"))if("Municipality"===i)e.placeAttributes.municipality=n;else if("Bbox"===i){var o=n.split(";");4===o.length&&(e.placeAttributes.bbox={left:parseFloat(o[0]),right:parseFloat(o[2]),top:parseFloat(o[1]),bottom:parseFloat(o[3])})}else"Commune"===i?e.placeAttributes.commune=n:"Departement"===i?e.placeAttributes.department=n:"INSEE"===i?e.placeAttributes.insee=n:"Qualite"===i?e.placeAttributes.quality=n:"Territoire"===i?e.placeAttributes.territory=n:"ID"===i?e.placeAttributes.ID=n:"ID_TR"===i?e.placeAttributes.IDTR=n:"Importance"===i?e.placeAttributes.importance=parseInt(n,10):"Nature"===i?e.placeAttributes.nature=n:"Numero"===i?e.placeAttributes.number=n:"Feuille"===i?e.placeAttributes.sheet=n:"Section"===i?e.placeAttributes.section=n:"CommuneAbsorbee"===i?e.placeAttributes.absorbedCity=n:"Arrondissement"===i?n&&(e.placeAttributes.arrondissement=n):"Type"===i?e.placeAttributes.origin=n:"Prefecture"===i?e.placeAttributes.prefecture=n:"InseeRegion"===i?e.placeAttributes.inseeRegion=n:"InseeDepartment"===i&&(e.placeAttributes.inseeDepartment=n)},PostalCode:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&(e.placeAttributes.postalCode=a(t))},Error:function(t){var n=t.getAttribute("message"),o=t.getAttribute("errorCode"),s=e.getMessage("SERVICE_RESPONSE_EXCEPTION","("+o+") : "+n);throw new i({message:s,type:i.TYPE_SRVERR})}},gml:{pos:function(t,e){var i=a(t);e&&i&&(e.position={x:parseFloat(i.split(" ")[0]),y:parseFloat(i.split(" ")[1])})}},ExceptionReport:function(t){var e={};if(t.hasChildNodes())for(var i,n=t.childNodes,o=0;o<n.length;o++)i=n[o],"Exception"===i.nodeName&&(e.exceptionReport=c.READERS.Exception(i));return e},Exception:function(t){var e={},i=t.getAttribute("exceptionCode");i&&(e.exceptionCode=i);var n=t.firstChild;return n&&3===n.nodeType&&(e.exception=n.nodeValue),e}},c.read=function(t){if("XLS"===t.nodeName){var n=t.prefix;n||(n=c.DEFAULTPREFIX);var o=c.READERS[n][t.nodeName](t);return o}if("ExceptionReport"===t.nodeName){var s=c.READERS[t.nodeName](t);return s}var r=e.getMessage("SERVICE_RESPONSE_ANALYSE",t.nodeName);throw new i({message:r,type:i.TYPE_UNKERR,status:200})},c}(i,r,a,st,at),ct=function(t,e,i,n,o){var s={build:function(t){var s=null;if(!t.response)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EMPTY"),type:e.TYPE_SRVERR,status:-1}));if(t.rawResponse)s=t.response;else{try{var r=new n({reader:o});if("string"==typeof t.response?r.setXMLString(t.response):r.setXMLDoc(t.response),s=r.parse(),!s)throw new Error("L'analyse de la réponse du service !?")}catch(n){var a=n.message;return a+="string"==typeof t.response?"('"+t.response+"')":"('"+t.response.documentElement.innerHTML+"')",void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_ANALYSE",a),type:e.TYPE_UNKERR,status:-1}))}if(s.exceptionReport)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",s.exceptionReport),type:e.TYPE_SRVERR,status:200}))}t.onSuccess.call(t.scope,s)}};return s}(i,a,r,y,lt),ht=function(t,e,i,n,o,s){function r(t){if(!(this instanceof r))throw new TypeError(e.getMessage("CLASS_CONSTRUCTOR","Geocode"));if(this.CLASSNAME="Geocode",n.apply(this,arguments),!t.location)throw new Error(e.getMessage("PARAM_MISSING","location"));if("object"==typeof t.location&&0===Object.keys(t.location).length)throw new Error(e.getMessage("PARAM_EMPTY","location"));if("string"==typeof t.location&&0===t.location.length)throw new Error(e.getMessage("PARAM_EMPTY","location"));this.options.location=t.location,t.filterOptions&&"object"==typeof t.filterOptions||(this.options.filterOptions=t.filterOptions={type:["StreetAddress"]}),0===Object.keys(t.filterOptions).length&&(this.options.filterOptions={type:["StreetAddress"]});for(var i=Object.keys(t.filterOptions),o=0;o<i.length;o++){var s=i[o],a=["department","number","postalCode","insee","importance","ID","IDTR","absorbedCity","sheet","section","inseeRegion","inseeDepartment"];a.indexOf(s)!==-1&&"string"!=typeof t.filterOptions[s]&&(t.filterOptions[s]=t.filterOptions[s].toString()),t.filterOptions[s]||delete this.options.filterOptions[s]}this.options.filterOptions.type=t.filterOptions.type||["StreetAddress"],this.options.maximumResponses=t.maximumResponses||25,this.options.returnFreeForm=t.returnFreeForm||!1,this.options.srs=t.srs||"EPSG:4326",this.options.outputFormat="xml"}return r.prototype=Object.create(n.prototype,{}),r.prototype.constructor=r,r.prototype.buildRequest=function(t,n){var s={httpMethod:this.options.httpMethod,location:this.options.location,returnFreeForm:this.options.returnFreeForm,filterOptions:this.options.filterOptions,srs:this.options.srs,maximumResponses:this.options.maximumResponses};this.request=o.build(s),this.request?n.call(this,this.request):t.call(this,new i(e.getMessage("SERVICE_REQUEST_BUILD")))},r.prototype.analyzeResponse=function(t,n){if(this.response){var o={response:this.response,rawResponse:this.options.rawResponse,onError:t,onSuccess:n,scope:this};s.build(o)}else t.call(this,new i(e.getMessage("SERVICE_RESPONSE_EMPTY")))},r}(i,r,a,u,ot,ct),ut=function(t,e,i){var n={build:function(t){var n=t||{},o=null,s=new i({position:n.position,returnFreeForm:n.returnFreeForm,filterOptions:n.filterOptions}),r=new e({srsName:n.srs,maximumResponses:n.maximumResponses});if(r.namespace=!0,r.setService(s),o=r.build(),"GET"==n.httpMethod){var a="qxml="+encodeURIComponent(o).replace(/\-/g,"%2D").replace(/\_/g,"%5F").replace(/\./g,"%2E").replace(/\!/g,"%21").replace(/\~/g,"%7E").replace(/\*/g,"%2A").replace(/\'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29");o=a}return o}};return n}(i,H,J),dt=function(t){function e(){if(!(this instanceof e))throw new TypeError("ReverseGeocodedLocation constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="ReverseGeocodedLocation",this.searchCenterDistance=null}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}(rt),pt=function(t,e,i,n,o){function s(t){if(t.attributes.length>0){for(var e={},i=t.attributes,n=0;n<i.length;n++){var o=i[n];e[o.nodeName]=o.nodeValue}return e}}function r(t,e){if(t.hasChildNodes())for(var i,n,o,s=t.childNodes,a=0;a<s.length;a++)if(i=s[a],1===i.nodeType)if(n=i.localName||i.baseName||i.nodeName,o=i.prefix||c.DEFAULTPREFIX,c.READERS[o][n]){var l=c.READERS[o][n];l(i,e)}else r(i,e)}function a(t){var e,i="";return t.hasChildNodes()&&(e=t.firstChild,3===e.nodeType&&(i=e.nodeValue)),i}function l(t){if(t.attributes.length>0){var e=s(t);for(var i in e)if(e.hasOwnProperty(i)){if("version"===i&&e.version!==c.VERSION)return void console.log("[ReverseGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing");if("xmlns"===i){if(e[i]!==c.NAMESPACES[c.DEFAULTPREFIX])return void console.log("[ReverseGeocodeResponseReader] geocode response default namespace is not the expected one");continue}var n=i.split(":")[0],o=i.split(":")[1];if("xmlns"===n&&o&&c.NAMESPACES[o]&&c.NAMESPACES[o]!==e[i])return void console.log("[ReverseGeocodeResponseReader] geocode response "+i+" namespace is not the expected one");if("schemaLocation"===o&&c.SCHEMALOCATION!==e[i])return void console.log("[ReverseGeocodeResponseReader] geocode response schema location is not the expected one")}}}var c={};return c.VERSION="1.2",c.NAMESPACES={xmlns:"http://www.opengis.net/xls",gml:"http://www.opengis.net/gml",xls:"http://www.opengis.net/xls",xlsext:"http://www.opengis.net/xlsext",xsi:"http://www.w3.org/2001/XMLSchema-instance"},c.SCHEMALOCATION="http://wxs.ign.fr/schemas/olsAll.xsd",c.DEFAULTPREFIX="xls",c.READERS={xls:{XLS:function(t){var e=new n;return l(t),r(t,e),e},ReverseGeocodedLocation:function(t,e){var i=new o;r(t,i),e&&Array.isArray(e.locations)&&e.locations.push(i)},Address:function(t,e){var i=t.getAttribute("countryCode");e&&i&&(e.type=i),r(t,e)},Building:function(t,e){var i=t.getAttribute("number");e&&e.hasOwnProperty("placeAttributes")&&(i?e.placeAttributes.number=i:t.getAttribute("buildingName")?e.placeAttributes.number=t.getAttribute("buildingName"):t.getAttribute("subdivision")&&(e.placeAttributes.number=t.getAttribute("subdivision")))},Street:function(t,e){"StreetAddress"===e.type?e.placeAttributes.street=a(t):"CadastralParcel"===e.type&&(e.placeAttributes.cadastralParcel=a(t))},Place:function(t,e){var i=t.getAttribute("type"),n=a(t);if(e&&e.hasOwnProperty("placeAttributes"))if("Municipality"===i)e.placeAttributes.municipality=n;else if("Bbox"===i){var o=n.split(";");4===o.length&&(e.placeAttributes.bbox={left:parseFloat(o[0]),right:parseFloat(o[2]),top:parseFloat(o[1]),bottom:parseFloat(o[3])})}else"Commune"===i?e.placeAttributes.commune=n:"Departement"===i?e.placeAttributes.department=n:"INSEE"===i?e.placeAttributes.insee=n:"Qualite"===i?e.placeAttributes.quality=n:"Territoire"===i?e.placeAttributes.territory=n:"ID"===i?e.placeAttributes.ID=n:"ID_TR"===i?e.placeAttributes.IDTR=n:"Importance"===i?e.placeAttributes.importance=parseInt(n,10):"Nature"===i?e.placeAttributes.nature=n:"Numero"===i?e.placeAttributes.number=n:"Feuille"===i?e.placeAttributes.sheet=n:"Section"===i?e.placeAttributes.section=n:"CommuneAbsorbee"===i?e.placeAttributes.absorbedCity=n:"Arrondissement"===i?n&&(e.placeAttributes.arrondissement=n):"Type"===i?e.placeAttributes.origin=n:"Prefecture"===i?e.placeAttributes.prefecture=n:"InseeRegion"===i?e.placeAttributes.inseeRegion=n:"InseeDepartment"===i&&(e.placeAttributes.inseeDepartment=n)},PostalCode:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&(e.placeAttributes.postalCode=a(t))},SearchCentreDistance:function(t,e){e&&(e.searchCenterDistance=parseFloat(t.getAttribute("value")))},Error:function(t){var n=t.getAttribute("message"),o=t.getAttribute("errorCode"),s=e.getMessage("SERVICE_RESPONSE_EXCEPTION","("+o+") : "+n);throw new i({message:s,type:i.TYPE_SRVERR})}},gml:{pos:function(t,e){var i=a(t);e&&i&&(e.position={x:parseFloat(i.split(" ")[0]),y:parseFloat(i.split(" ")[1])})}},xlsext:{ExtendedGeocodeMatchCode:function(t,e){e&&(e.matchType=a(t))}},ExceptionReport:function(t){var e={};if(t.hasChildNodes())for(var i,n=t.childNodes,o=0;o<n.length;o++)i=n[o],"Exception"===i.nodeName&&(e.exceptionReport=c.READERS.Exception(i));return e},Exception:function(t){var e={},i=t.getAttribute("exceptionCode");i&&(e.exceptionCode=i);var n=t.firstChild;return n&&3===n.nodeType&&(e.exception=n.nodeValue),e}},c.read=function(t){if("XLS"===t.nodeName){var e=t.prefix;e||(e=c.DEFAULTPREFIX);var i=c.READERS[e][t.nodeName](t);return i}if("ExceptionReport"===t.nodeName){var n=c.READERS[t.nodeName](t);return n}throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.")},c}(i,r,a,st,dt),mt=function(t,e,i,n,o){var s={build:function(t){var s=null;if(!t.response)return void t.onError.call(t.scope,new i({message:e.getMessage("SERVICE_RESPONSE_EMPTY"),type:i.TYPE_SRVERR,status:-1}));if(t.rawResponse)s=t.response;else{try{var r=new n({reader:o});if("string"==typeof t.response?r.setXMLString(t.response):r.setXMLDoc(t.response),s=r.parse(),!s)throw new Error("L'analyse de la réponse du service !?")}catch(e){return e.status=200,void t.onError.call(t.scope,e)}if(s.exceptionReport)return void t.onError.call(t.scope,new i({message:e.getMessage("SERVICE_RESPONSE_EXCEPTION",s.exceptionReport),type:i.TYPE_SRVERR,status:200}));if(t.scope&&t.scope.options&&t.scope.options.srs&&"EPSG:4326"!==t.scope.options.srs){var a,l;if(s||s.locations||s.locations.length)for(var c=0;c<s.locations.length;c++)a=s.locations[c],a&&(l=a.position,l&&(a.position={x:l.y,y:l.x}))}}t.onSuccess.call(t.scope,s)}};return s}(i,r,a,y,pt),ft=function(t,e,i,n,o,s){function r(t){if(!(this instanceof r))throw new TypeError(e.getMessage("CLASS_CONSTRUCTOR","ReverseGeocode"));if(this.CLASSNAME="ReverseGeocode",n.apply(this,arguments),!t.position)throw new Error(e.getMessage("PARAM_MISSING","position"));if(null==t.position.x)throw new Error(e.getMessage("PARAM_MISSING","position.x"));if(null==t.position.y)throw new Error(e.getMessage("PARAM_MISSING","position.y"));this.options.position=t.position,t.filterOptions&&"object"==typeof t.filterOptions||(this.options.filterOptions=t.filterOptions={type:["StreetAddress"]}),0===Object.keys(t.filterOptions).length&&(this.options.filterOptions={type:["StreetAddress"]});for(var i=Object.keys(t.filterOptions),o=0;o<i.length;o++){var s=i[o];t.filterOptions[s]&&0!==Object.keys(t.filterOptions[s]).length||delete this.options.filterOptions[s]}if(this.options.filterOptions.type=t.filterOptions.type||["StreetAddress"],!Array.isArray(this.options.filterOptions.type))throw new Error(e.getMessage("PARAM_TYPE","filterOptions.type"));if(this.options.maximumResponses=t.maximumResponses||25,this.options.returnFreeForm=t.returnFreeForm||!1,this.options.srs=t.srs||"CRS:84",r.geoEPSG.indexOf(this.options.srs)===-1){
-if(this.options.position={x:this.options.position.y,y:this.options.position.x},this.options.filterOptions&&this.options.filterOptions.circle){var a=this.options.filterOptions.circle;this.options.filterOptions.circle={x:a.y,y:a.x,radius:a.radius}}if(this.options.filterOptions&&this.options.filterOptions.polygon){var l=this.options.filterOptions.polygon;for(o=0;o<l.length;o++){var c=l[o];this.options.filterOptions.polygon[o]={x:c.y,y:c.x}}}}this.options.outputFormat="xml"}return r.prototype=Object.create(n.prototype,{}),r.prototype.constructor=r,r.prototype.buildRequest=function(t,n){var s={httpMethod:this.options.httpMethod,position:this.options.position,returnFreeForm:this.options.returnFreeForm,filterOptions:this.options.filterOptions,srs:"EPSG:4326",maximumResponses:this.options.maximumResponses};this.request=o.build(s),this.request?n.call(this,this.request):t.call(this,new i(e.getMessage("SERVICE_REQUEST_BUILD")))},r.prototype.analyzeResponse=function(t,n){if(this.response){var o={response:this.response,rawResponse:this.options.rawResponse,onError:t,onSuccess:n,scope:this};s.build(o)}else t.call(this,new i(e.getMessage("SERVICE_RESPONSE_EMPTY")))},r.geoEPSG=["EPSG:4326"],r}(i,r,a,u,ut,mt),_t=function(){function t(){if(!(this instanceof t))throw new TypeError("AutoCompleteResponse constructor cannot be called as a function.");this.suggestedLocations=[]}return t.prototype={constructor:t},t}(),gt=function(){function t(){if(!(this instanceof t))throw new TypeError("SuggestedLocation constructor cannot be called as a function.");this.type=null,this.position={x:null,y:null},this.commune=null,this.fullText=null,this.postalCode=null,this.classification=null,this.street=null,this.poi=null,this.kind=null}return t.prototype={constructor:t},t}(),vt=function(t,e,i,n,o,s){var r={build:function(t){var n=null;if(!t.response)return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_EMPTY")));if(t.rawResponse)n=t.response;else{var r;if(r="string"==typeof t.response?window.JSON.parse(t.response):t.response){if(r.error)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",r.error.description),status:r.error.code,type:e.TYPE_SRVERR}));if(n=new o,!r.results||!Array.isArray(r.results))return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_FORMAT_3")));for(var a,l=0;l<r.results.length;l++){var c=r.results[l];a=new s,a&&(c&&"StreetAddress"===c.country?(a.street=c.street,a.type="StreetAddress"):c&&"PositionOfInterest"===c.country&&(a.poi=c.street,a.kind=c.kind,a.type="PositionOfInterest"),a.position&&(a.position.x=c.x,a.position.y=c.y),a.commune=c.city,a.fullText=c.fulltext,a.postalCode=c.zipcode,a.classification=c.classification),n.suggestedLocations.push(a)}if(!n.suggestedLocations.length)return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_FORMAT_3")))}if(!n)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_ANALYSE_2"),type:e.TYPE_UNKERR,status:-1}));if(n.exceptionReport)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",n.exceptionReport),type:e.TYPE_SRVERR,status:200}))}t.onSuccess.call(t.scope,n)}};return r}(i,a,r,y,_t,gt),yt=function(t,e,i,n,o,s){function r(e){if(!(this instanceof r))throw new TypeError(n.getMessage("CLASS_CONSTRUCTOR","AutoComplete"));if(this.CLASSNAME="AutoComplete",t.apply(this,arguments),!e.text)throw new Error(n.getMessage("PARAM_MISSING","text"));this.options.text=e.text,e.filterOptions&&"object"==typeof e.filterOptions||(this.options.filterOptions=e.filterOptions={territory:[],type:["StreetAddress"]}),0===Object.keys(e.filterOptions).length&&(this.options.filterOptions={territory:[],type:["StreetAddress"]}),this.options.filterOptions.type=e.filterOptions.type||["StreetAddress"],this.options.filterOptions.territory=e.filterOptions.territory||[],this.options.maximumResponses=e.maximumResponses||10,"XHR"===this.options.protocol&&"POST"===this.options.httpMethod&&(this.options.httpMethod="GET"),this.options.outputFormat="json"}return r.prototype=Object.create(t.prototype,{}),r.prototype.constructor=r,r.prototype.buildRequest=function(t,e){var i="";this.options.filterOptions.territory&&(i=this.options.filterOptions.territory.join(";"));var n="";this.options.filterOptions.type&&(n=this.options.filterOptions.type.join(",")),this.request=s.normalyzeParameters({text:encodeURIComponent(this.options.text),type:n,terr:i,maximumResponses:this.options.maximumResponses}),e.call(this,this.request)},r.prototype.analyzeResponse=function(t,i){if(this.response){var s={response:this.response,rawResponse:this.options.rawResponse,onSuccess:i,onError:t,scope:this};e.build(s)}else t.call(this,new o(n.getMessage("SERVICE_RESPONSE_EMPTY")))},r}(u,vt,i,r,a,n),Et=function(t){function e(t){if(!(this instanceof e))throw new TypeError("RoutePlan constructor cannot be called as a function.");if(this.options=t||{},!t.startPoint)throw new Error("l'option 'startPoint' n'est pas renseignée !");if(!t.endPoint)throw new Error("l'option 'endPoint' n'est pas renseignée !");for(var i in t)t.hasOwnProperty(i)&&(this.options[i]=t[i])}return e.prototype={constructor:e,requestString:null,template:{routePlan:"<RoutePlan>__ROUTEPREFERENCE____GRAPH____WAYPOINTLIST____AVOIDLIST__</RoutePlan>",routePreference:"<RoutePreference>__VALUEROUTEPREFERENCE__</RoutePreference>",graph:'<xlsext:graphName xmlns:xlsext="http://www.opengis.net/xlsext" name="__VALUEGRAPH__"/>',wayPointList:{container:"<WayPointList>__STARTPOINT____VIAPOINT____ENDPOINT__</WayPointList>",point:'<Position><gml:Point xmlns:gml="http://www.opengis.net/gml"><gml:pos>__X__ __Y__</gml:pos></gml:Point></Position>',startPoint:"<StartPoint>__POINT__</StartPoint>",endPoint:"<EndPoint>__POINT__</EndPoint>",viaPoint:"<ViaPoint>__POINT__</ViaPoint>"},avoidList:{container:"<AvoidList>__AVOIDFEATURE__</AvoidList>",avoidFeature:"<AvoidFeature>__VALUEAVOIDFEATURE__</AvoidFeature>"}},toString:function(){var t="";if(t=this.template.routePlan,this.options.routePreference){var e=this.template.routePreference;e=e.replace(/__VALUEROUTEPREFERENCE__/,this.options.routePreference),t=t.replace(/__ROUTEPREFERENCE__/g,e)}if(t=t.replace(/__ROUTEPREFERENCE__/g,""),this.options.avoidFeature){for(var i=this.template.avoidList.container,n=[],o=0;o<this.options.avoidFeature.length;o++){var s=this.template.avoidList.avoidFeature;s=s.replace(/__VALUEAVOIDFEATURE__/,this.options.avoidFeature[o]),n.push(s)}i=i.replace(/__AVOIDFEATURE__/,n.join("\n")),t=t.replace(/__AVOIDLIST__/g,i)}if(t=t.replace(/__AVOIDLIST__/g,""),this.options.graph){var r=this.template.graph;r=r.replace(/__VALUEGRAPH__/,this.options.graph),t=t.replace(/__GRAPH__/g,r)}t=t.replace(/__GRAPH__/g,"");var a=this.template.wayPointList.container,l="";if(l=this.template.wayPointList.point,l=l.replace(/__X__/,this.options.startPoint.x),l=l.replace(/__Y__/,this.options.startPoint.y),a=a.replace(/__STARTPOINT__/,this.template.wayPointList.startPoint.replace(/__POINT__/,l)),l=this.template.wayPointList.point,l=l.replace(/__X__/,this.options.endPoint.x),l=l.replace(/__Y__/,this.options.endPoint.y),a=a.replace(/__ENDPOINT__/,this.template.wayPointList.endPoint.replace(/__POINT__/,l)),this.options.viaPoint){for(var c=[],h=0;h<this.options.viaPoint.length;h++){var u=this.options.viaPoint[h];l=this.template.wayPointList.point,l=l.replace(/__X__/,u.x),l=l.replace(/__Y__/,u.y),c.push(l)}a=a.replace(/__VIAPOINT__/,this.template.wayPointList.viaPoint.replace(/__POINT__/,c.join("\n")))}else a=a.replace(/__VIAPOINT__/,"");return t=t.replace(/__WAYPOINTLIST__/g,a),this.requestString=t,this.requestString}},e}(i),Pt=function(t,e){function i(t){if(!(this instanceof i))throw new TypeError("DetermineRouteRequest constructor cannot be called as a function.");this.options=t||{};for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);this.CLASSNAME="DetermineRouteRequest"}return i.prototype={strRequest:null,oRoutePlan:null,template:{determineRouteRequest:'<DetermineRouteRequest distanceUnit="__DISTANCEUNIT__">__ROUTEPLAN____ROUTEINSTRUCTIONREQUEST____ROUTEGEOMETRYREQUEST____ROUTEMAPREQUEST__</DetermineRouteRequest>',routeInstructionRequest:'<RouteInstructionsRequest provideGeometry="__PROVIDEGEOMETRY__" provideBoundingBox="__PROVIDEBBOX__" />',routeGeometryRequest:"<RouteGeometryRequest />",routeMapRequest:""},addRoute:function(t){t instanceof e&&(this.oRoutePlan=t)},constructor:i,toString:function(){var t="";if(t=this.template.determineRouteRequest,t=t.replace(/__DISTANCEUNIT__/g,this.options.distanceUnit||"KM"),!this.oRoutePlan){var i=this.options.route;if(this.oRoutePlan=new e(i),!this.oRoutePlan)throw new Error("La construction du calcul d'initineraire n'est pas correctement definie !?")}t=t.replace(/__ROUTEPLAN__/g,this.oRoutePlan.toString());var n=this.template.routeInstructionRequest;n=n.replace(/__PROVIDEGEOMETRY__/g,this.options.provideGeometry||!1),n=n.replace(/__PROVIDEBBOX__/g,this.options.provideBoundingBox||!1),t=t.replace(/__ROUTEINSTRUCTIONREQUEST__/g,n);var o=this.template.routeGeometryRequest;t=t.replace(/__ROUTEGEOMETRYREQUEST__/g,o);var s=this.template.routeMapRequest;return t=t.replace(/__ROUTEMAPREQUEST__/g,s),this.strRequest=t,this.strRequest}},i}(i,Et),Ct=void 0,St=function(t,e,i,n){function o(t){if(!(this instanceof o))throw new TypeError("RouteService constructor cannot be called as a function.");this.CLASSNAME="RouteService",this.CLASSTYPE="RouteRequest",e.apply(this,arguments)}return o.prototype=Object.create(e.prototype,{}),o.prototype.constructor=o,o.prototype.addRequest=function(t){if("DetermineRouteRequest"!==t.CLASSNAME)throw new Error("Ce n'est pas un objet de type 'Route Request' !?");this.oRequest=t},o.prototype.addFilter=function(t){t instanceof n&&(this.oFilter=t)},o.prototype.toString=function(){if(!this.oRequest){if(!this.options)throw new Error("Les options ne sont pas renseignées, impossible de construire la requête !");if("RouteRequest"===this.CLASSTYPE){var t={distanceUnit:this.options.distanceUnit||null,provideGeometry:this.options.provideGeometry||null,provideBoundingBox:this.options.provideBoundingBox||null,route:{routePreference:this.options.routePreference||null,startPoint:this.options.startPoint,viaPoint:this.options.viaPoint||null,endPoint:this.options.endPoint,avoidFeature:this.options.avoidFeature||null,graph:this.options.graph||null,expectedStartTime:this.options.expectedStartTime||null}};this.oRequest=new i(t),this.oFilter&&this.oRequest.addFilter(this.oFilter)}}if(!this.oRequest)throw new Error("Type de requête indefini !");return this.strRequest=this.oRequest.toString(),this.strRequest},o}(i,W,Pt,Ct),Mt=function(t,e,i){var n={build:function(t){var n=null,o={startPoint:t.startPoint,endPoint:t.endPoint,viaPoint:t.viaPoints,provideBoundingBox:t.provideBbox,avoidFeature:t.exclusions,expectedStartTime:t.expectedStartTime,distanceUnit:t.distanceUnit,graph:t.graph,provideGeometry:t.geometryInInstructions,routePreference:t.routePreference},s=new i(o),r=new e({srsName:t.srs,maximumResponses:t.maximumResponses});if(r.namespace=!0,r.setService(s),n=r.build(),"GET"==t.httpMethod){var a="qxml="+encodeURIComponent(n).replace(/\-/g,"%2D").replace(/\_/g,"%5F").replace(/\./g,"%2E").replace(/\!/g,"%21").replace(/\~/g,"%7E").replace(/\*/g,"%2A").replace(/\'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29");n=a}return n}};return n}(i,H,St),wt=function(t){function e(t){if(!(this instanceof e))throw new TypeError("RouteParamREST constructor cannot be called as a function.");if(this.options=t||{},this.origin=this.options.startPoint.x+","+this.options.startPoint.y,this.destination=this.options.endPoint.x+","+this.options.endPoint.y,this.waypoints=this.options.viaPoints||null,this.startDateTime=this.options.expectedStartTime||null,this.graphName=this.options.graph,this.srs=this.options.srs,this.exclusions=this.options.exclusions,this.method="TIME",this.options.routePreference){var i=this.options.routePreference;switch(i){case"fastest":this.method="TIME";break;case"shortest":this.method="DISTANCE";break;default:this.method="TIME"}}this.format=this.options.geometryInInstructions?"STANDARDEXT":"STANDARD",this.tolerance=10,this.profileId=null,this.profileName=null}return e.CLASSNAME="RouteParamREST",e.prototype={constructor:e,getWaypoints:function(){if(this.waypoints){for(var t=[],e=0;e<this.waypoints.length;e++){var i=this.waypoints[e];t.push(i.x+","+i.y)}return t.join(";")}},getExclusions:function(){return this.exclusions.join(";")}},e.prototype.getParams=function(){var t=[];return t.push({k:"origin",v:this.origin}),t.push({k:"destination",v:this.destination}),t.push({k:"method",v:this.method}),this.waypoints&&t.push({k:"waypoints",v:this.getWaypoints()}),this.startDateTime&&t.push({k:"startDateTime",v:this.startDateTime}),this.graphName&&t.push({k:"graphName",v:this.graphName}),this.exclusions&&t.push({k:"exclusions",v:this.getExclusions()}),this.srs&&t.push({k:"srs",v:this.srs}),this.format&&t.push({k:"format",v:this.format}),t},e}(i),Lt=function(t,e,i){function n(t){if(!(this instanceof n))throw new TypeError("RouteRequestREST constructor cannot be called as a function.");if(!t)throw new Error(e.getMessage("PARAM_EMPTY","options"));this.settings=t}return n.prototype={requestString:null,constructor:n,processRequestString:function(){for(var t=new i(this.settings),e=t.getParams(),n="",o=0;o<e.length;o++){var s=e[o];n&&(n+="&"),n+=s.k+"="+s.v}return this.requestString=n,this.requestString}},n}(i,r,wt),Rt=function(t,e,i,n){var o={build:function(t){var o=null,s=t||{},r=null!==t.onError&&"function"==typeof t.onError,a=null;switch(t.api){case"REST":var l=new n(s);if(!l.processRequestString()){if(a="Error process request (rest) !",r)return void t.onError.call(t.scope,new e(a));throw new Error(a)}o=l.requestString;break;case"OLS":if(o=i.build(s),!o){if(a="Error process request (ols) !",r)return void t.onError.call(t.scope,new e(a));throw new Error(a)}break;default:if(a="Type of API is not supported by service (REST or OLS) !",r)return void t.onError.call(t.scope,new e(a));throw new Error(a)}return o}};return o}(i,a,Mt,Lt),bt=function(t){var e={toJson:function(t,e,i){var n=null;try{if(!t)throw new Error("La chaine WKT n'est pas renseignée !");e||(e=function(t){console.log(t)}),i||(i=function(t){console.log(t)});var o,s,r;if(o=/(-?\d+\.?[0-9]*)\s(-?\d+\.?[0-9]+)/g,s="[$1,$2]",t=t.replace(o,s),o=/^(\w+)/,r=o.exec(t),"POLYGON"===RegExp.$1?(s='{"type" : "Polygon",',t=t.replace(RegExp.$1,s),o=/(\({2}?)/,s='"coordinates" : [[',t=t.replace(o,s),o=/(\){2}?)/,s="]]}",t=t.replace(o,s),o=/(\()/g,s="[",t=t.replace(o,s),o=/(\))/g,s="]",t=t.replace(o,s)):"LINESTRING"===RegExp.$1&&(s='{"type" : "LineString",',t=t.replace(RegExp.$1,s),o=/(\(\(?)/,s='"coordinates" : [',t=t.replace(o,s),o=/(\)\)?)/,s="]}",t=t.replace(o,s)),n=JSON.parse(t),!n)throw new Error("Le JSON est vide !");if(!n.type)throw new Error("Le type de geometrie n'est pas connu !");if(!n.coordinates)throw new Error("La liste des points est vide !");e.call(this,n)}catch(t){if("SyntaxError"===t.name)return void i.call(this,"Erreur de parsing JSON !");i.call(this,t)}}};return e}(i),xt=function(){function t(){if(!(this instanceof t))throw new TypeError("RouteResponse constructor cannot be called as a function.");this.totalTime=null,this.totalDistance=null,this.bbox={left:null,right:null,top:null,bottom:null},this.routeGeometry=null,this.routeInstructions=[]}return t.prototype={constructor:t},t}(),Gt=function(){function t(){if(!(this instanceof t))throw new TypeError("RouteInstruction constructor cannot be called as a function.");this.duration=null,this.distance=null,this.code=null,this.instruction=null,this.geometry=null}return t.prototype={constructor:t},t}(),It=function(t,e,i,n,o,s){function r(t){var e,i="";return t.hasChildNodes()&&(e=t.firstChild,e&&3===e.nodeType&&(i=e.nodeValue)),i}function a(t,e){if(t.hasChildNodes())for(var i,n,o=t.childNodes,s=0;s<o.length;s++)if(i=o[s],1===i.nodeType)if(n=i.localName||i.baseName||i.nodeName,l.READERS[n]){var r=l.READERS[n];r(i,e)}else a(i,e)}var l={};return l.READERS={routeResult:function(t){var e=new o;if(a(t,e),"error"===e.status){var s=i.getMessage("SERVICE_RESPONSE_EXCEPTION",e.message);throw new n({message:s,type:n.TYPE_SRVERR})}return e},status:function(t,e){var i=r(t);"ERROR"!==i&&"error"!==i||e&&(e.status="error")},message:function(t,e){e&&(e.message=r(t))},distance:function(t,e){e&&(e.totalDistance=r(t))},durationSeconds:function(t,e){e&&(e.totalTime=parseFloat(r(t)))},bounds:function(t,e){if(e&&e.bbox){var i=r(t).split(/[,;]/);e.bbox.left=parseFloat(i[0]),e.bbox.bottom=parseFloat(i[1]),e.bbox.right=parseFloat(i[2]),e.bbox.top=parseFloat(i[3])}},geometryWkt:function(t,n){if(n){var o=t.innerHTML,s=function(t){n.routeGeometry=t},r=function(){var t=i.getMessage("PARAM_FORMAT",["geometryWkt"]);throw new Error(t)};e.toJson(o,s,r)}},step:function(t,e){var i,n=new s;if(t.hasChildNodes)for(var o,a,l=t.childNodes,c=0;c<l.length;c++)o=l[c],1===o.nodeType&&(a=o.localName||o.baseName||o.nodeName,"durationSeconds"===a?n.duration=r(o):"distance"===a?n.distance=r(o):"navInstruction"===a?n.code=r(o):"name"===a&&(i=r(o)));if(n.code)switch(n.code){case"F":"Valeur non renseignée"!=i?n.instruction="Tout droit "+i:n.instruction="Continuer tout droit ";break;case"B":n.instruction="Demi-tour "+i;break;case"L":n.instruction="Tourner à gauche "+i;break;case"R":n.instruction="Tourner à droite "+i;break;case"BL":n.instruction="Tourner très à gauche "+i;break;case"BR":n.instruction="Tourner très à droite "+i;break;case"FL":n.instruction="Tourner légèrement à gauche "+i;break;case"FR":n.instruction="Tourner légèrement à droite "+i;break;case"round_about_entry":n.instruction="Entrée rond-point "+i;break;case"round_about_exit":n.instruction="Sortie rond-point "+i;break;case null:n.instruction="Prendre "+i;break;default:n.instruction="?"+n.code+"? "+i}Array.isArray(e.routeInstructions)&&e.routeInstructions.push(n)}},l.read=function(t){var e;if("routeResult"===t.nodeName)return e=l.READERS.routeResult(t);throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.")},l}(i,bt,r,a,xt,Gt),At=function(t){var e={};return e.READERS={},e.read=function(t){},e}(i),Tt=function(t,e,i,n,o,s,r,a,l){var c={build:function(t){var c=null;if(!t.response)return void t.onError.call(t.scope,new e(o.getMessage("SERVICE_RESPONSE_EMPTY")));if(t.rawResponse)c=t.response;else{switch(t.outputFormat){case"xml":var h="REST"===t.api?s:r;try{var u=new i({reader:h});if("string"==typeof t.response?u.setXMLString(t.response):u.setXMLDoc(t.response),c=u.parse(),!c)throw new e(o.getMessage("SERVICE_RESPONSE_FORMAT","xml"))}catch(i){return void t.onError.call(t.scope,new e(o.getMessage("SERVICE_RESPONSE_ANALYSE",t.response)))}break;case"json":var d;if(d="string"==typeof t.response?window.JSON.parse(t.response):t.response,d.message)return void t.onError.call(t.scope,new e(o.getMessage("SERVICE_RESPONSE_EXCEPTION",d.message)));if(d){var p=[],m=[],f=[];if(c=new a,c.hasOwnProperty("totalTime")&&(c.totalTime=parseFloat(d.durationSeconds)),c.hasOwnProperty("totalDistance")&&(c.totalDistance="m"===t.distanceUnit?d.distanceMeters:d.distance),c.hasOwnProperty("bbox")){var _=d.bounds.split(/[,;]/);c.bbox.left=parseFloat(_[0]),c.bbox.bottom=parseFloat(_[1]),c.bbox.right=parseFloat(_[2]),c.bbox.top=parseFloat(_[3])}var g=function(t){c.routeGeometry=t},v=function(i){console.log(i),t.onError.call(t.scope,new e(o.getMessage("PARAM_FORMAT",["geometryWkt"])))};if(c.hasOwnProperty("routeGeometry")){var y=d.geometryWkt||d.simplifiedWkt;if(y&&(n.toJson(y,g,v),!c.routeGeometry))return}if(c.hasOwnProperty("routeInstructions")){var E,P=d.legs;if(Array.isArray(P)&&P.length)for(E=0;E<P.length;E++)p.push(P[E]);if(Array.isArray(p)&&p.length)for(E=0;E<p.length;E++)m.push(p[E].steps);if(Array.isArray(m)&&m.length)for(E=0;E<m.length;E++)f=f.concat(m[E]);f.forEach(function(e){c.routeInstructions.push(new l),c.routeInstructions[c.routeInstructions.length-1].duration=e.durationSeconds,c.routeInstructions[c.routeInstructions.length-1].distance="m"===t.distanceUnit?e.distanceMeters:e.distance,c.routeInstructions[c.routeInstructions.length-1].code=e.navInstruction;for(var i=[],n=0;n<e.points.length;n++){var o=e.points[n].split(",");o&&i.push(o)}switch(i&&0!==i.length?c.routeInstructions[c.routeInstructions.length-1].geometry={coordinates:i,type:"LineString"}:c.routeInstructions[c.routeInstructions.length-1].geometry=null,"Valeur non renseignée"==e.name&&(e.name=""),e.navInstruction){case"F":e.name?c.routeInstructions[c.routeInstructions.length-1].instruction="Tout droit "+e.name:c.routeInstructions[c.routeInstructions.length-1].instruction="Continuer tout droit ";break;case"B":c.routeInstructions[c.routeInstructions.length-1].instruction="Demi-tour "+e.name;break;case"L":c.routeInstructions[c.routeInstructions.length-1].instruction="Tourner à gauche "+e.name;break;case"R":c.routeInstructions[c.routeInstructions.length-1].instruction="Tourner à droite "+e.name;break;case"BL":c.routeInstructions[c.routeInstructions.length-1].instruction="Tourner très à gauche "+e.name;break;case"BR":c.routeInstructions[c.routeInstructions.length-1].instruction="Tourner très à droite "+e.name;break;case"FL":c.routeInstructions[c.routeInstructions.length-1].instruction="Tourner légèrement à gauche "+e.name;break;case"FR":c.routeInstructions[c.routeInstructions.length-1].instruction="Tourner légèrement à droite "+e.name;break;case"round_about_entry":c.routeInstructions[c.routeInstructions.length-1].instruction="Entrée rond-point "+e.name;break;case"round_about_exit":c.routeInstructions[c.routeInstructions.length-1].instruction="Sortie rond-point "+e.name;break;case null:c.routeInstructions[c.routeInstructions.length-1].instruction="Prendre tout droit "+e.name;break;default:c.routeInstructions[c.routeInstructions.length-1].instruction="?"+e.navInstruction+"? "+e.name}})}}if(!c)return void t.onError.call(t.scope,new e(o.getMessage("SERVICE_RESPONSE_ANALYSE","json")));break;default:return void t.onError.call(t.scope,new e(o.getMessage("SERVICE_RESPONSE_FORMAT","json","xml")))}if(c&&c.exceptionReport)return void t.onError.call(t.scope,new e(o.getMessage("SERVICE_RESPONSE_EXCEPTION_2")))}t.onSuccess.call(t.scope,c)}};return c}(i,a,y,bt,r,It,At,xt,Gt),kt=function(t,e,i,n,o,s,r){function a(t){if(!(this instanceof a))throw new TypeError(e.getMessage("CLASS_CONSTRUCTOR","Route"));if(this.CLASSNAME="Route",n.apply(this,arguments),!t.startPoint)throw new Error(e.getMessage("PARAM_MISSING","startPoint"));if(null==t.startPoint.x)throw new Error(e.getMessage("PARAM_MISSING","startPoint.x"));if(null==t.startPoint.y)throw new Error(e.getMessage("PARAM_MISSING","startPoint.y"));if(!t.endPoint)throw new Error(e.getMessage("PARAM_MISSING","endPoint"));if(null==t.endPoint.x)throw new Error(e.getMessage("PARAM_MISSING","endPoint.x"));if(null==t.endPoint.y)throw new Error(e.getMessage("PARAM_MISSING","endPoint.y"));if(this.options.api="string"==typeof t.api?t.api.toUpperCase():"REST",this.options.outputFormat="string"==typeof t.outputFormat?t.outputFormat.toLowerCase():"json",this.options.startPoint=t.startPoint,this.options.endPoint=t.endPoint,this.options.viaPoints=t.viaPoints||null,this.options.exclusions=t.exclusions||null,this.options.routePreference=t.routePreference||"fastest",this.options.graph=t.graph||"Voiture",this.options.geometryInInstructions=t.geometryInInstructions||!1,this.options.provideBbox=t.provideBbox||!0,this.options.distanceUnit=t.distanceUnit||"km",this.options.expectedStartTime=null,this.options.srs=t.srs||"EPSG:4326",this.options.api="REST","XHR"===this.options.protocol&&(this.options.httpMethod="GET"),!this.options.serverUrl){var i=o.Route.url(this.options.apiKey),s=null;switch(this.options.api){case"OLS":s=i.ols;break;case"REST":var r="route-"+this.options.outputFormat;s=i[r];break;default:throw new Error(e.getMessage("PARAM_UNKNOWN","api"))}if(!s)throw new Error("Url by default not found !");this.options.serverUrl=s}var l=this.options.serverUrl.lastIndexOf(".");if(l!==-1){var c=this.options.serverUrl.substring(l+1);if(c&&c.length<5)switch(c.toLowerCase()){case"json":case"xml":this.options.outputFormat=c.toLowerCase();break;default:throw new Error("type of service : unknown or unsupported (json or xml) !")}}}return a.prototype=Object.create(n.prototype,{}),a.prototype.constructor=a,a.prototype.buildRequest=function(t,n){var o={api:this.options.api,startPoint:this.options.startPoint,endPoint:this.options.endPoint,viaPoints:this.options.viaPoints,provideBbox:this.options.provideBbox,exclusions:this.options.exclusions,distanceUnit:this.options.distanceUnit,graph:this.options.graph,geometryInInstructions:this.options.geometryInInstructions,routePreference:this.options.routePreference,srs:this.options.srs};this.request=s.build(o),this.request?n.call(this,this.request):t.call(this,new i(e.getMessage("SERVICE_REQUEST_BUILD")))},a.prototype.analyzeResponse=function(t,n){if(this.response){var o={distanceUnit:this.options.distanceUnit,response:this.response,outputFormat:this.options.outputFormat,api:this.options.api,rawResponse:this.options.rawResponse,onError:t,onSuccess:n,scope:this};r.build(o)}else t.call(this,new i(e.getMessage("SERVICE_RESPONSE_EMPTY")))},a}(i,r,a,u,h,Rt,Tt),Ot=function(t){function e(t){if(!(this instanceof e))throw new TypeError("ProcessIsoCurveParam constructor cannot be called as a function.");this.options=t||{},this.id=this.options.id,this.location=this.options.position,this.srs=this.options.srs,this.graphName=this.options.graph,this.profileId=this.options.profileId||null,this.profileName=this.options.profileName||null,this.exclusions=this.options.exclusions,this.reverse=this.options.reverse,this.smoothing=this.options.smoothing,this.holes=this.options.holes;var i=this.options.method;switch(i){case"time":this.method="time",this.time=this.options.time;break;case"distance":this.method="distance",this.distance=this.options.distance;break;default:this.method="time"}}return e.CLASSNAME="ProcessIsoCurveParam",e.prototype={constructor:e,getLocation:function(){return this.location.x+","+this.location.y},getExclusions:function(){return this.exclusions.join(";")}},e.prototype.getParams=function(){var t=[];return t.push({k:"location",v:this.getLocation()}),t.push({k:"smoothing",v:this.smoothing}),t.push({k:"holes",v:this.holes}),t.push({k:"reverse",v:this.reverse}),t.push({k:"method",v:this.method}),this.time&&t.push({k:"time",v:this.time}),this.distance&&t.push({k:"distance",v:this.distance}),t.push({k:"graphName",v:this.graphName}),this.exclusions&&t.push({k:"exclusions",v:this.getExclusions()}),this.srs&&t.push({k:"srs",v:this.srs}),t},e}(i),Dt=function(t,e,i){function n(t){if(!(this instanceof n))throw new TypeError("ProcessIsoCurveRequest constructor cannot be called as a function.");if(!t)throw new Error(e.getMessage("PARAM_EMPTY","options"));this.settings=t,this.mode=this.settings.httpMethod||"GET"}return n.prototype={requestString:null,constructor:n,template:{container:'<?xml version="1.0" encoding="UTF-8"?>\n<isochroneRequest>\n__ID__\t<location>\n\t\t<x>__X__</x>\n\t\t<y>__Y__</y>\n\t</location>\n\t<srs>__SRS__</srs>\n\t<graphName>__GRAPHNAME__</graphName>\n__PROFIL____EXCLUSIONS__\t<method>__METHOD__</method>\n__TIME____DISTANCE__\t<reverse>__REVERSE__</reverse>\n\t<smoothing>__SMOOTHING__</smoothing>\n\t<holes>__HOLES__</holes>\n</isochroneRequest>',id:"\t<id>__IDVALUE__</id>\n",profil:"\t<profileId>__PROFILID__</profileId>\n\t<profileName>__PROFILNAME__</profileName>\n",exclusions:{container:"\t<exclusions>\n__EXCLUSIONFEATURE__\n\t</exclusions>\n",feature:"\t\t<exclusion>__EXCLUSIONVALUE__</exclusion>"},time:"\t<time>__TIMEVALUE__</time>\n",distance:"\t<distance>__DISTANCEVALUE__</distance>\n"},processRequestString:function(){var t="",e=0;switch(this.mode){case"GET":var n=new i(this.settings),o=n.getParams();for(e=0;e<o.length;e++){var s=o[e];t&&(t+="&"),t+=s.k+"="+s.v}break;case"POST":if(t=this.template.container,t=t.replace(/__ID__/g,""),t=t.replace(/__PROFIL__/g,""),t=t.replace(/__X__/g,this.settings.position.x),t=t.replace(/__Y__/g,this.settings.position.y),t=t.replace(/__GRAPHNAME__/g,this.settings.graph),t=t.replace(/__SRS__/g,this.settings.srs),t=t.replace(/__SMOOTHING__/g,this.settings.smoothing),t=t.replace(/__HOLES__/g,this.settings.holes),t=t.replace(/__REVERSE__/g,this.settings.reverse),this.settings.exclusions){var r=this.template.exclusions.container,a=[];for(e=0;e<this.settings.exclusions.length;e++){var l=this.template.exclusions.feature;l=l.replace(/__EXCLUSIONVALUE__/,this.settings.exclusions[e]),a.push(l)}r=r.replace(/__EXCLUSIONFEATURE__/,a.join("\n")),t=t.replace(/__EXCLUSIONS__/g,r)}if(t=t.replace(/__EXCLUSIONS__/g,""),this.settings.distance){var c=this.template.distance;c=c.replace(/__DISTANCEVALUE__/g,this.settings.distance),t=t.replace(/__DISTANCE__/g,c),t=t.replace(/__METHOD__/g,"distance")}if(t=t.replace(/__DISTANCE__/g,""),this.settings.time){var h=this.template.time;h=h.replace(/__TIMEVALUE__/g,this.settings.time),t=t.replace(/__TIME__/g,h),t=t.replace(/__METHOD__/g,"time")}t=t.replace(/__TIME__/g,"")}return this.requestString=t,this.requestString}},n}(i,r,Ot),Nt=function(){function t(){if(!(this instanceof t))throw new TypeError("ProcessIsoCurveResponse constructor cannot be called as a function.");this.message=null,this.id=null,this.location={},this.location.x=null,this.location.y=null,this.srs=null,this.geometry=null,this.time=null,this.distance=null}return t.prototype={constructor:t},t}(),Ut=function(t,e,i,n,o){function s(t){var e,i="";return t.hasChildNodes()&&(e=t.firstChild,e&&3===e.nodeType&&(i=e.nodeValue)),i}var r={};return r.READERS={isochronResult:function(t){var e=new o;if(t.hasChildNodes())for(var s,a=t.childNodes,l=0;l<a.length;l++)s=a[l],r.READERS[s.nodeName]&&r.READERS[s.nodeName](s,e);if("error"===e.status){var c=n.getMessage("SERVICE_RESPONSE_EXCEPTION",e.message);throw new i({message:c,type:i.TYPE_SRVERR})}return e},message:function(t,e){e&&(e.message=s(t))},status:function(t,e){var i=s(t);"ERROR"!==i&&"error"!==i||e&&(e.status="error")},id:function(t,e){e&&(e.id=s(t))},location:function(t,e){var i=s(t);e&&e.location&&(e.location.x=parseFloat(i.split(",")[0]),e.location.y=parseFloat(i.split(",")[1]))},srs:function(t,e){e&&(e.srs=s(t))},distance:function(t,e){e&&(e.distance=parseFloat(s(t)))},time:function(t,e){e&&(e.time=parseFloat(s(t)))},wktGeometry:function(t,i){if(i){var o=t.innerHTML,s=function(t){i.geometry=t},r=function(){var t=n.getMessage("PARAM_FORMAT",["wktGeometry"]);throw new Error(t)};i.hasOwnProperty("geometry")&&e.toJson(o,s,r)}},serviceResult:function(t){var e={};if(t.hasChildNodes())for(var i,n=t.childNodes,o=0;o<n.length;o++)i=n[o],r.READERS[i.nodeName]&&r.READERS[i.nodeName](i,e);return e},ExceptionReport:function(t){var e={};if(t.hasChildNodes())for(var i,n=t.childNodes,o=0;o<n.length;o++)i=n[o],"Exception"===i.nodeName&&(e.exceptionReport=r.READERS.Exception(i));return e},Exception:function(t){var e={},i=t.getAttribute("exceptionCode");i&&(e.exceptionCode=i);var n=t.firstChild;return n&&3===n.nodeType&&(e.exception=n.nodeValue),e}},r.read=function(t){var e;if("isochronResult"===t.nodeName||"isochroneResult"===t.nodeName||"IsochroneResult"===t.nodeName)return e=r.READERS.isochronResult(t);if("ExceptionReport"===t.nodeName)return e=r.READERS[t.nodeName](t);if(r.READERS[t.nodeName]){if(e=r.READERS[t.nodeName](t),"error"===e.status){var o=n.getMessage("SERVICE_RESPONSE_EXCEPTION",e.message);throw new i({message:o,type:i.TYPE_SRVERR})}return e}throw new i({message:n.getMessage("SERVICE_RESPONSE_ANALYSE",t.nodeName),type:i.TYPE_UNKERR})},r}(i,bt,a,r,Nt),jt=function(t,e,i,n,o,s,r){var a={build:function(t){var a=null;if(!t.response)return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_EMPTY")));if(t.rawResponse)a=t.response;else{switch(t.outputFormat){case"xml":try{var l=new n({reader:s});if("string"==typeof t.response?l.setXMLString(t.response):l.setXMLDoc(t.response),
-a=l.parse(),!a)throw new Error(i.getMessage("SERVICE_RESPONSE_EXCEPTION_2"))}catch(n){var c=n.message;return c+="\n(raw response service : '"+t.response+"')",void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",c),status:200,type:e.TYPE_SRVERR}))}break;case"json":var h;if(h="string"==typeof t.response?window.JSON.parse(t.response):t.response,"OK"===h.status||"ok"===h.status){if(a=new r,!a)return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_ANALYSE",t.response)));a.time=h.time,a.distance=h.distance,a.message=h.message,a.id=h.id,a.srs=h.srs;var u=function(t){a.geometry=t},d=function(){t.onError.call(t.scope,new e({message:i.getMessage("PARAM_FORMAT","wktGeometry")}))};if(a.hasOwnProperty("geometry")&&(o.toJson(h.wktGeometry,u,d),!a.geometry))return;var p=h.location.split(",");a.location&&(a.location.x=p[0],a.location.y=p[1])}else if("ERROR"===h.status||"error"===h.status){var m=h.message;return m+="\n(raw response service : '"+h+"')",void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_EXCEPTION",m)))}break;default:return void t.onError.call(t.scope,new e(i.getMessage("SERVICE_RESPONSE_FORMAT","json","xml")))}if(a&&a.exceptionReport)return void t.onError.call(t.scope,new e({message:i.getMessage("SERVICE_RESPONSE_EXCEPTION",a.exceptionReport),type:e.TYPE_SRVERR,status:200}))}t.onSuccess.call(t.scope,a)}};return a}(i,a,r,y,bt,Ut,Nt),Ft=function(t,e,i,n,o,s,r){function a(t){if(!(this instanceof a))throw new TypeError(e.getMessage("CLASS_CONSTRUCTOR","ProcessIsoCurve"));if(this.CLASSNAME="ProcessIsoCurve",n.apply(this,arguments),!t.position)throw new Error(e.getMessage("PARAM_MISSING","position"));if(null==t.position.x)throw new Error(e.getMessage("PARAM_MISSING","position.x"));if(null==t.position.y)throw new Error(e.getMessage("PARAM_MISSING","position.y"));if(!t.time&&!t.distance)throw new Error("Parameter(s) 'distance' missing. Parameter time to calculate an isochrone, parameter distance for an isodistance");if(!t.time&&t.distance&&(this.options.method="distance",this.options.time&&delete this.options.time),t.time&&!t.distance&&(this.options.method="time",this.options.distance&&delete this.options.distance),this.options.method=this.options.method||"time",this.options.exclusions=t.exclusions||null,this.options.graph=t.graph||"Voiture",this.options.reverse=t.reverse||!1,this.options.smoothing=t.smoothing||!1,this.options.holes=t.holes||!1,this.options.srs=t.srs||"EPSG:4326",this.options.outputFormat="string"==typeof t.outputFormat?t.outputFormat.toLowerCase():"json",!this.options.serverUrl){var i=o.ProcessIsoCurve.url(this.options.apiKey),s=i["iso-"+this.options.outputFormat];if(!s)throw new Error("Url by default not found !");this.options.serverUrl=s}var r=this.options.serverUrl.lastIndexOf(".");if(r!==-1){var l=this.options.serverUrl.substring(r+1);if(l&&l.length<5)switch(l.toLowerCase()){case"json":case"xml":this.options.outputFormat=l.toLowerCase();break;default:throw new Error("type of service : unknown or unsupported (json or xml) !")}}}return a.prototype=Object.create(n.prototype,{}),a.prototype.constructor=a,a.prototype.buildRequest=function(t,n){try{var o=new s(this.options);if(!o.processRequestString())throw new Error(e.getMessage("SERVICE_REQUEST_BUILD"));this.request=o.requestString}catch(e){return void t.call(this,new i(e.message))}n.call(this,this.request)},a.prototype.analyzeResponse=function(t,n){if(this.response){var o={response:this.response,outputFormat:this.options.outputFormat,rawResponse:this.options.rawResponse,onSuccess:n,onError:t,scope:this};r.build(o)}else t.call(this,new i(e.getMessage("SERVICE_RESPONSE_EMPTY")))},a}(i,r,a,u,h,Dt,jt),zt=function(t,e,i,n,o,s,r){var a={getConfig:function(t){var i=new e(t);i.call()},getAltitude:function(e){var i=new t(e);i.call()},geocode:function(t){var e=new i(t);e.call()},reverseGeocode:function(t){var e=new n(t);e.call()},autoComplete:function(t){var e=new o(t);e.call()},route:function(t){var e=new s(t);e.call()},isoCurve:function(t){var e=new r(t);e.call()}};return a}(M,z,ht,ft,yt,kt,Ft),Bt=function(t,e,i,n,o,s,r,a,l,c,h,u,d,p,m,f,_,g,v,y,E,P,C,S,M,w,L,R,b){var x="undefined"!=typeof window?window:{},G=x.Gp||{servicesVersion:"1.0.0-beta3",servicesDate:"2016-12-01",extend:function(t,e){var i,n=t.split("."),o=this;i=n.length;for(var s=0;s<i;s++){"undefined"==typeof o[n[s]]&&(o[n[s]]={});var r=i-1;s===r&&(o[n[s]]=e),o=o[n[s]]}return this}};return G.extend("Protocols",{}),G.extend("Protocols.XHR",t),G.extend("Services",e),G.extend("Services.AltiResponse",i),G.extend("Services.Alti.Elevation",n),G.extend("Services.AutoCompleteResponse",o),G.extend("Services.AutoComplete.SuggestedLocation",s),G.extend("Services.GetConfigResponse",r),G.extend("Services.Config.Constraint",a),G.extend("Services.Config.Format",l),G.extend("Services.Config.Layer",c),G.extend("Services.Config.Legend",h),G.extend("Services.Config.Metadata",u),G.extend("Services.Config.Originator",d),G.extend("Services.Config.Service",p),G.extend("Services.Config.Style",m),G.extend("Services.Config.Territory",f),G.extend("Services.Config.Thematic",s),G.extend("Services.Config.TileMatrix",g),G.extend("Services.Config.TileMatrixLimit",v),G.extend("Services.Config.TileMatrixSet",y),G.extend("Services.GeocodeResponse",E),G.extend("Services.Geocode.GeocodedLocation",P),G.extend("Services.Geocode.DirectGeocodedLocation",C),G.extend("Services.Geocode.ReverseGeocodedLocation",S),G.extend("Services.IsoCurveResponse",M),G.extend("Services.RouteResponse",w),G.extend("Services.Route.RouteInstruction",L),G.extend("Error",R),G.extend("Helper",b),x.Gp=G,x.Gp}(s,zt,E,P,_t,gt,w,L,R,b,x,G,I,A,T,k,O,N,U,D,st,rt,at,dt,Nt,xt,Gt,a,n)}),CommonUtilsAutoLoadConfig=function(t){!function(){var e=document.getElementsByTagName("script"),i=e[e.length-1].getAttribute("data-key");if(i){var n=i.split(/;|,|\|/);if(i&&n.length>1){for(var o=[],s=0;s<n.length;s++)o.push(n[s]);i=o}}var r=e[e.length-1].getAttribute("data-url"),a=e[e.length-1].getAttribute("data-timeout"),l=function(){},c=function(t){throw new Error("Configuration load failed : "+t.message)};if(i||r){var h={apiKey:i,onSuccess:l,onFailure:c};r&&(h.serverUrl=r,h.callbackSuffix=""),a&&(h.timeOut=a),t.Config||t.Services.getConfig(h)}}()}(gp),!function(t,e,i){L.drawVersion="0.3.0-dev",L.drawLocal={draw:{toolbar:{actions:{title:"Cancel drawing",text:"Cancel"},finish:{title:"Finish drawing",text:"Finish"},undo:{title:"Delete last point drawn",text:"Delete last point"},buttons:{polyline:"Draw a polyline",polygon:"Draw a polygon",rectangle:"Draw a rectangle",circle:"Draw a circle",marker:"Draw a marker"}},handlers:{circle:{tooltip:{start:"Click and drag to draw circle."},radius:"Radius"},marker:{tooltip:{start:"Click map to place marker."}},polygon:{tooltip:{start:"Click to start drawing shape.",cont:"Click to continue drawing shape.",end:"Click first point to close this shape."}},polyline:{error:"<strong>Error:</strong> shape edges cannot cross!",tooltip:{start:"Click to start drawing line.",cont:"Click to continue drawing line.",end:"Click last point to finish line."}},rectangle:{tooltip:{start:"Click and drag to draw rectangle."}},simpleshape:{tooltip:{end:"Release mouse to finish drawing."}}}},edit:{toolbar:{actions:{save:{title:"Save changes.",text:"Save"},cancel:{title:"Cancel editing, discards all changes.",text:"Cancel"}},buttons:{edit:"Edit layers.",editDisabled:"No layers to edit.",remove:"Delete layers.",removeDisabled:"No layers to delete."}},handlers:{edit:{tooltip:{text:"Drag handles, or marker to edit feature.",subtext:"Click cancel to undo changes."}},remove:{tooltip:{text:"Click on a feature to remove"}}}}},L.Draw={},L.Draw.Feature=L.Handler.extend({includes:L.Mixin.Events,initialize:function(t,e){this._map=t,this._container=t._container,this._overlayPane=t._panes.overlayPane,this._popupPane=t._panes.popupPane,e&&e.shapeOptions&&(e.shapeOptions=L.Util.extend({},this.options.shapeOptions,e.shapeOptions)),L.setOptions(this,e)},enable:function(){this._enabled||(L.Handler.prototype.enable.call(this),this.fire("enabled",{handler:this.type}),this._map.fire("draw:drawstart",{layerType:this.type}))},disable:function(){this._enabled&&(L.Handler.prototype.disable.call(this),this._map.fire("draw:drawstop",{layerType:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(L.DomUtil.disableTextSelection(),t.getContainer().focus(),this._tooltip=new L.Tooltip(this._map),L.DomEvent.on(this._container,"keyup",this._cancelDrawing,this))},removeHooks:function(){this._map&&(L.DomUtil.enableTextSelection(),this._tooltip.dispose(),this._tooltip=null,L.DomEvent.off(this._container,"keyup",this._cancelDrawing,this))},setOptions:function(t){L.setOptions(this,t)},_fireCreatedEvent:function(t){this._map.fire("draw:created",{layer:t,layerType:this.type})},_cancelDrawing:function(t){27===t.keyCode&&this.disable()}}),L.Draw.Polyline=L.Draw.Feature.extend({statics:{TYPE:"polyline"},Poly:L.Polyline,options:{allowIntersection:!0,repeatMode:!1,drawError:{color:"#b00b00",timeout:2500},icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"}),guidelineDistance:20,maxGuideLineLength:4e3,shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!1,clickable:!0},metric:!0,feet:!0,showLength:!0,zIndexOffset:2e3},initialize:function(t,e){L.Browser.touch&&(this.options.icon=this.options.touchIcon),this.options.drawError.message=L.drawLocal.draw.handlers.polyline.error,e&&e.drawError&&(e.drawError=L.Util.extend({},this.options.drawError,e.drawError)),this.type=L.Draw.Polyline.TYPE,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._markers=[],this._markerGroup=new L.LayerGroup,this._map.addLayer(this._markerGroup),this._poly=new L.Polyline([],this.options.shapeOptions),this._tooltip.updateContent(this._getTooltipText()),this._mouseMarker||(this._mouseMarker=L.marker(this._map.getCenter(),{icon:L.divIcon({className:"leaflet-mouse-marker",iconAnchor:[20,20],iconSize:[40,40]}),opacity:0,zIndexOffset:this.options.zIndexOffset})),this._mouseMarker.on("mousedown",this._onMouseDown,this).on("mouseout",this._onMouseOut,this).on("mouseup",this._onMouseUp,this).on("mousemove",this._onMouseMove,this).addTo(this._map),this._map.on("mouseup",this._onMouseUp,this).on("mousemove",this._onMouseMove,this).on("zoomlevelschange",this._onZoomEnd,this).on("click",this._onTouch,this).on("zoomend",this._onZoomEnd,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._clearHideErrorTimeout(),this._cleanUpShape(),this._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers,this._map.removeLayer(this._poly),delete this._poly,this._mouseMarker.off("mousedown",this._onMouseDown,this).off("mouseout",this._onMouseOut,this).off("mouseup",this._onMouseUp,this).off("mousemove",this._onMouseMove,this),this._map.removeLayer(this._mouseMarker),delete this._mouseMarker,this._clearGuides(),this._map.off("mouseup",this._onMouseUp,this).off("mousemove",this._onMouseMove,this).off("mouseup",this._onMouseUp,this).off("zoomend",this._onZoomEnd,this).off("click",this._onTouch,this)},deleteLastVertex:function(){if(!(this._markers.length<=1)){var t=this._markers.pop(),e=this._poly,i=this._poly.spliceLatLngs(e.getLatLngs().length-1,1)[0];this._markerGroup.removeLayer(t),e.getLatLngs().length<2&&this._map.removeLayer(e),this._vertexChanged(i,!1)}},addVertex:function(t){var e=this._markers.length;return e>0&&!this.options.allowIntersection&&this._poly.newLatLngIntersects(t)?void this._showErrorTooltip():(this._errorShown&&this._hideErrorTooltip(),this._markers.push(this._createMarker(t)),this._poly.addLatLng(t),2===this._poly.getLatLngs().length&&this._map.addLayer(this._poly),void this._vertexChanged(t,!0))},completeShape:function(){this._markers.length<=1||(this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable())},_finishShape:function(){var t=this._poly.newLatLngIntersects(this._poly.getLatLngs()[0],!0);return!this.options.allowIntersection&&t||!this._shapeIsValid()?void this._showErrorTooltip():(this._fireCreatedEvent(),this.disable(),void(this.options.repeatMode&&this.enable()))},_shapeIsValid:function(){return!0},_onZoomEnd:function(){this._updateGuide()},_onMouseMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent),i=this._map.layerPointToLatLng(e);this._currentLatLng=i,this._updateTooltip(i),this._updateGuide(e),this._mouseMarker.setLatLng(i),L.DomEvent.preventDefault(t.originalEvent)},_vertexChanged:function(t,e){this._map.fire("draw:drawvertex",{layers:this._markerGroup}),this._updateFinishHandler(),this._updateRunningMeasure(t,e),this._clearGuides(),this._updateTooltip()},_onMouseDown:function(t){var e=t.originalEvent;this._mouseDownOrigin=L.point(e.clientX,e.clientY)},_onMouseUp:function(e){if(this._mouseDownOrigin){var i=L.point(e.originalEvent.clientX,e.originalEvent.clientY).distanceTo(this._mouseDownOrigin);Math.abs(i)<9*(t.devicePixelRatio||1)&&this.addVertex(e.latlng)}this._mouseDownOrigin=null},_onTouch:function(t){L.Browser.touch&&(this._onMouseDown(t),this._onMouseUp(t))},_onMouseOut:function(){this._tooltip&&this._tooltip._onMouseOut.call(this._tooltip)},_updateFinishHandler:function(){var t=this._markers.length;t>1&&this._markers[t-1].on("click",this._finishShape,this),t>2&&this._markers[t-2].off("click",this._finishShape,this)},_createMarker:function(t){var e=new L.Marker(t,{icon:this.options.icon,zIndexOffset:2*this.options.zIndexOffset});return this._markerGroup.addLayer(e),e},_updateGuide:function(t){var e=this._markers.length;e>0&&(t=t||this._map.latLngToLayerPoint(this._currentLatLng),this._clearGuides(),this._drawGuide(this._map.latLngToLayerPoint(this._markers[e-1].getLatLng()),t))},_updateTooltip:function(t){var e=this._getTooltipText();t&&this._tooltip.updatePosition(t),this._errorShown||this._tooltip.updateContent(e)},_drawGuide:function(t,e){var i,n,o,s=Math.floor(Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))),r=this.options.guidelineDistance,a=this.options.maxGuideLineLength,l=s>a?s-a:r;for(this._guidesContainer||(this._guidesContainer=L.DomUtil.create("div","leaflet-draw-guides",this._overlayPane));s>l;l+=this.options.guidelineDistance)i=l/s,n={x:Math.floor(t.x*(1-i)+i*e.x),y:Math.floor(t.y*(1-i)+i*e.y)},o=L.DomUtil.create("div","leaflet-draw-guide-dash",this._guidesContainer),o.style.backgroundColor=this._errorShown?this.options.drawError.color:this.options.shapeOptions.color,L.DomUtil.setPosition(o,n)},_updateGuideColor:function(t){if(this._guidesContainer)for(var e=0,i=this._guidesContainer.childNodes.length;i>e;e++)this._guidesContainer.childNodes[e].style.backgroundColor=t},_clearGuides:function(){if(this._guidesContainer)for(;this._guidesContainer.firstChild;)this._guidesContainer.removeChild(this._guidesContainer.firstChild)},_getTooltipText:function(){var t,e,i=this.options.showLength;return 0===this._markers.length?t={text:L.drawLocal.draw.handlers.polyline.tooltip.start}:(e=i?this._getMeasurementString():"",t=1===this._markers.length?{text:L.drawLocal.draw.handlers.polyline.tooltip.cont,subtext:e}:{text:L.drawLocal.draw.handlers.polyline.tooltip.end,subtext:e}),t},_updateRunningMeasure:function(t,e){var i,n,o=this._markers.length;1===this._markers.length?this._measurementRunningTotal=0:(i=o-(e?2:1),n=t.distanceTo(this._markers[i].getLatLng()),this._measurementRunningTotal+=n*(e?1:-1))},_getMeasurementString:function(){var t,e=this._currentLatLng,i=this._markers[this._markers.length-1].getLatLng();return t=this._measurementRunningTotal+e.distanceTo(i),L.GeometryUtil.readableDistance(t,this.options.metric,this.options.feet)},_showErrorTooltip:function(){this._errorShown=!0,this._tooltip.showAsError().updateContent({text:this.options.drawError.message}),this._updateGuideColor(this.options.drawError.color),this._poly.setStyle({color:this.options.drawError.color}),this._clearHideErrorTimeout(),this._hideErrorTimeout=setTimeout(L.Util.bind(this._hideErrorTooltip,this),this.options.drawError.timeout)},_hideErrorTooltip:function(){this._errorShown=!1,this._clearHideErrorTimeout(),this._tooltip.removeError().updateContent(this._getTooltipText()),this._updateGuideColor(this.options.shapeOptions.color),this._poly.setStyle({color:this.options.shapeOptions.color})},_clearHideErrorTimeout:function(){this._hideErrorTimeout&&(clearTimeout(this._hideErrorTimeout),this._hideErrorTimeout=null)},_cleanUpShape:function(){this._markers.length>1&&this._markers[this._markers.length-1].off("click",this._finishShape,this)},_fireCreatedEvent:function(){var t=new this.Poly(this._poly.getLatLngs(),this.options.shapeOptions);L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)}}),L.Draw.Polygon=L.Draw.Polyline.extend({statics:{TYPE:"polygon"},Poly:L.Polygon,options:{showArea:!1,shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0}},initialize:function(t,e){L.Draw.Polyline.prototype.initialize.call(this,t,e),this.type=L.Draw.Polygon.TYPE},_updateFinishHandler:function(){var t=this._markers.length;1===t&&this._markers[0].on("click",this._finishShape,this),t>2&&(this._markers[t-1].on("dblclick",this._finishShape,this),t>3&&this._markers[t-2].off("dblclick",this._finishShape,this))},_getTooltipText:function(){var t,e;return 0===this._markers.length?t=L.drawLocal.draw.handlers.polygon.tooltip.start:this._markers.length<3?t=L.drawLocal.draw.handlers.polygon.tooltip.cont:(t=L.drawLocal.draw.handlers.polygon.tooltip.end,e=this._getMeasurementString()),{text:t,subtext:e}},_getMeasurementString:function(){var t=this._area;return t?L.GeometryUtil.readableArea(t,this.options.metric):null},_shapeIsValid:function(){return this._markers.length>=3},_vertexChanged:function(t,e){var i;!this.options.allowIntersection&&this.options.showArea&&(i=this._poly.getLatLngs(),this._area=L.GeometryUtil.geodesicArea(i)),L.Draw.Polyline.prototype._vertexChanged.call(this,t,e)},_cleanUpShape:function(){var t=this._markers.length;t>0&&(this._markers[0].off("click",this._finishShape,this),t>2&&this._markers[t-1].off("dblclick",this._finishShape,this))}}),L.SimpleShape={},L.Draw.SimpleShape=L.Draw.Feature.extend({options:{repeatMode:!1},initialize:function(t,e){this._endLabelText=L.drawLocal.draw.handlers.simpleshape.tooltip.end,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._mapDraggable=this._map.dragging.enabled(),this._mapDraggable&&this._map.dragging.disable(),this._container.style.cursor="crosshair",this._tooltip.updateContent({text:this._initialLabelText}),this._map.on("mousedown",this._onMouseDown,this).on("mousemove",this._onMouseMove,this).on("touchstart",this._onMouseDown,this).on("touchmove",this._onMouseMove,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._map&&(this._mapDraggable&&this._map.dragging.enable(),this._container.style.cursor="",this._map.off("mousedown",this._onMouseDown,this).off("mousemove",this._onMouseMove,this).off("touchstart",this._onMouseDown,this).off("touchmove",this._onMouseMove,this),L.DomEvent.off(e,"mouseup",this._onMouseUp,this),L.DomEvent.off(e,"touchend",this._onMouseUp,this),this._shape&&(this._map.removeLayer(this._shape),delete this._shape)),this._isDrawing=!1},_getTooltipText:function(){return{text:this._endLabelText}},_onMouseDown:function(t){this._isDrawing=!0,this._startLatLng=t.latlng,L.DomEvent.on(e,"mouseup",this._onMouseUp,this).on(e,"touchend",this._onMouseUp,this).preventDefault(t.originalEvent)},_onMouseMove:function(t){var e=t.latlng;this._tooltip.updatePosition(e),this._isDrawing&&(this._tooltip.updateContent(this._getTooltipText()),this._drawShape(e))},_onMouseUp:function(){this._shape&&this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable()}}),L.Draw.Rectangle=L.Draw.SimpleShape.extend({statics:{TYPE:"rectangle"},options:{shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},metric:!0},initialize:function(t,e){this.type=L.Draw.Rectangle.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.rectangle.tooltip.start,L.Draw.SimpleShape.prototype.initialize.call(this,t,e)},_drawShape:function(t){this._shape?this._shape.setBounds(new L.LatLngBounds(this._startLatLng,t)):(this._shape=new L.Rectangle(new L.LatLngBounds(this._startLatLng,t),this.options.shapeOptions),this._map.addLayer(this._shape))},_fireCreatedEvent:function(){var t=new L.Rectangle(this._shape.getBounds(),this.options.shapeOptions);L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this,t)},_getTooltipText:function(){var t,e,i,n=L.Draw.SimpleShape.prototype._getTooltipText.call(this),o=this._shape;return o&&(t=this._shape.getLatLngs(),e=L.GeometryUtil.geodesicArea(t),i=L.GeometryUtil.readableArea(e,this.options.metric)),{text:n.text,subtext:i}}}),L.Draw.Circle=L.Draw.SimpleShape.extend({statics:{TYPE:"circle"},options:{shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},showRadius:!0,metric:!0,feet:!0},initialize:function(t,e){this.type=L.Draw.Circle.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.circle.tooltip.start,L.Draw.SimpleShape.prototype.initialize.call(this,t,e)},_drawShape:function(t){this._shape?this._shape.setRadius(this._startLatLng.distanceTo(t)):(this._shape=new L.Circle(this._startLatLng,this._startLatLng.distanceTo(t),this.options.shapeOptions),this._map.addLayer(this._shape))},_fireCreatedEvent:function(){var t=new L.Circle(this._startLatLng,this._shape.getRadius(),this.options.shapeOptions);L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this,t)},_onMouseMove:function(t){var e,i=t.latlng,n=this.options.showRadius,o=this.options.metric;this._tooltip.updatePosition(i),this._isDrawing&&(this._drawShape(i),e=this._shape.getRadius().toFixed(1),this._tooltip.updateContent({text:this._endLabelText,subtext:n?L.drawLocal.draw.handlers.circle.radius+": "+L.GeometryUtil.readableDistance(e,o,this.options.feet):""}))}}),L.Draw.Marker=L.Draw.Feature.extend({statics:{TYPE:"marker"},options:{icon:new L.Icon.Default,repeatMode:!1,zIndexOffset:2e3},initialize:function(t,e){this.type=L.Draw.Marker.TYPE,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._tooltip.updateContent({text:L.drawLocal.draw.handlers.marker.tooltip.start}),this._mouseMarker||(this._mouseMarker=L.marker(this._map.getCenter(),{icon:L.divIcon({className:"leaflet-mouse-marker",iconAnchor:[20,20],iconSize:[40,40]}),opacity:0,zIndexOffset:this.options.zIndexOffset})),this._mouseMarker.on("click",this._onClick,this).addTo(this._map),this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onTouch,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._map&&(this._marker&&(this._marker.off("click",this._onClick,this),this._map.off("click",this._onClick,this).off("click",this._onTouch,this).removeLayer(this._marker),delete this._marker),this._mouseMarker.off("click",this._onClick,this),this._map.removeLayer(this._mouseMarker),delete this._mouseMarker,this._map.off("mousemove",this._onMouseMove,this))},_onMouseMove:function(t){var e=t.latlng;this._tooltip.updatePosition(e),this._mouseMarker.setLatLng(e),this._marker?(e=this._mouseMarker.getLatLng(),this._marker.setLatLng(e)):(this._marker=new L.Marker(e,{icon:this.options.icon,zIndexOffset:this.options.zIndexOffset}),this._marker.on("click",this._onClick,this),this._map.on("click",this._onClick,this).addLayer(this._marker))},_onClick:function(){this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable()},_onTouch:function(t){this._onMouseMove(t),this._onClick()},_fireCreatedEvent:function(){var t=new L.Marker.Touch(this._marker.getLatLng(),{icon:this.options.icon});L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)}}),L.Edit=L.Edit||{},L.Edit.Marker=L.Handler.extend({initialize:function(t,e){this._marker=t,L.setOptions(this,e)},addHooks:function(){var t=this._marker;t.dragging.enable(),t.on("dragend",this._onDragEnd,t),this._toggleMarkerHighlight()},removeHooks:function(){var t=this._marker;t.dragging.disable(),t.off("dragend",this._onDragEnd,t),this._toggleMarkerHighlight()},_onDragEnd:function(t){var e=t.target;e.edited=!0},_toggleMarkerHighlight:function(){var t=this._marker._icon;t&&(t.style.display="none",L.DomUtil.hasClass(t,"leaflet-edit-marker-selected")?(L.DomUtil.removeClass(t,"leaflet-edit-marker-selected"),this._offsetMarker(t,-4)):(L.DomUtil.addClass(t,"leaflet-edit-marker-selected"),this._offsetMarker(t,4)),t.style.display="")},_offsetMarker:function(t,e){var i=parseInt(t.style.marginTop,10)-e,n=parseInt(t.style.marginLeft,10)-e;t.style.marginTop=i+"px",t.style.marginLeft=n+"px"}}),L.Marker.addInitHook(function(){L.Edit.Marker&&(this.editing=new L.Edit.Marker(this),this.options.editable&&this.editing.enable())}),L.Edit=L.Edit||{},L.Edit.Poly=L.Handler.extend({options:{},initialize:function(t,e){this.latlngs=[t._latlngs],t._holes&&(this.latlngs=this.latlngs.concat(t._holes)),this._verticesHandlers=[];for(var i=0;i<this.latlngs.length;i++)this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(t,this.latlngs[i],e));this._poly=t,L.setOptions(this,e)},_eachVertexHandler:function(t){for(var e=0;e<this._verticesHandlers.length;e++)t(this._verticesHandlers[e])},addHooks:function(){this._eachVertexHandler(function(t){t.addHooks()})},removeHooks:function(){this._eachVertexHandler(function(t){t.removeHooks()})},updateMarkers:function(){this._eachVertexHandler(function(t){t.updateMarkers()})}}),L.Edit.PolyVerticesEdit=L.Handler.extend({options:{icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"})},initialize:function(t,e,i){L.Browser.touch&&(this.options.icon=this.options.touchIcon),this._poly=t,this._latlngs=e,L.setOptions(this,i)},addHooks:function(){var t=this._poly;t instanceof L.Polygon||(t.options.editing.fill=!1),t.setStyle(t.options.editing),this._poly._map&&(this._map=this._poly._map,this._markerGroup||this._initMarkers(),this._poly._map.addLayer(this._markerGroup))},removeHooks:function(){var t=this._poly;t.setStyle(t.options.original),t._map&&(t._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers)},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new L.LayerGroup),this._markers=[];var t,e,i,n,o=this._latlngs;for(t=0,i=o.length;i>t;t++)n=this._createMarker(o[t],t),n.on("click",this._onMarkerClick,this),this._markers.push(n);var s,r;for(t=0,e=i-1;i>t;e=t++)(0!==t||L.Polygon&&this._poly instanceof L.Polygon)&&(s=this._markers[e],r=this._markers[t],this._createMiddleMarker(s,r),this._updatePrevNext(s,r))},_createMarker:function(t,e){var i=new L.Marker.Touch(t,{draggable:!0,icon:this.options.icon});return i._origLatLng=t,i._index=e,i.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._fireEdit,this).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._fireEdit,this).on("MSPointerUp",this._fireEdit,this),this._markerGroup.addLayer(i),i},_onMarkerDragStart:function(){this._poly.fire("editstart")},_spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._poly._convertLatLngs(this._latlngs,!0),this._poly.redraw(),t},_removeMarker:function(t){var e=t._index;this._markerGroup.removeLayer(t),this._markers.splice(e,1),this._spliceLatLngs(e,1),this._updateIndexes(e,-1),t.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._fireEdit,this).off("touchmove",this._onMarkerDrag,this).off("touchend",this._fireEdit,this).off("click",this._onMarkerClick,this)},_fireEdit:function(){this._poly.edited=!0,this._poly.fire("edit"),this._poly._map.fire("draw:editvertex",{layers:this._markerGroup})},_onMarkerDrag:function(t){var e=t.target;L.extend(e._origLatLng,e._latlng),e._middleLeft&&e._middleLeft.setLatLng(this._getMiddleLatLng(e._prev,e)),e._middleRight&&e._middleRight.setLatLng(this._getMiddleLatLng(e,e._next)),this._poly.redraw(),this._poly.fire("editdrag")},_onMarkerClick:function(t){var e=L.Polygon&&this._poly instanceof L.Polygon?4:3,i=t.target;this._latlngs.length<e||(this._removeMarker(i),this._updatePrevNext(i._prev,i._next),i._middleLeft&&this._markerGroup.removeLayer(i._middleLeft),i._middleRight&&this._markerGroup.removeLayer(i._middleRight),i._prev&&i._next?this._createMiddleMarker(i._prev,i._next):i._prev?i._next||(i._prev._middleRight=null):i._next._middleLeft=null,this._fireEdit())},_onTouchMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent.touches[0]),i=this._map.layerPointToLatLng(e),n=t.target;L.extend(n._origLatLng,i),n._middleLeft&&n._middleLeft.setLatLng(this._getMiddleLatLng(n._prev,n)),n._middleRight&&n._middleRight.setLatLng(this._getMiddleLatLng(n,n._next)),this._poly.redraw(),this.updateMarkers()},_updateIndexes:function(t,e){this._markerGroup.eachLayer(function(i){i._index>t&&(i._index+=e)})},_createMiddleMarker:function(t,e){var i,n,o,s=this._getMiddleLatLng(t,e),r=this._createMarker(s);r.setOpacity(.6),t._middleRight=e._middleLeft=r,n=function(){var n=e._index;r._index=n,r.off("click",i,this).on("click",this._onMarkerClick,this),s.lat=r.getLatLng().lat,s.lng=r.getLatLng().lng,this._spliceLatLngs(n,0,s),this._markers.splice(n,0,r),r.setOpacity(1),this._updateIndexes(n,1),e._index++,this._updatePrevNext(t,r),this._updatePrevNext(r,e),this._poly.fire("editstart")},o=function(){r.off("dragstart",n,this),r.off("dragend",o,this),r.off("touchmove",n,this),this._createMiddleMarker(t,r),this._createMiddleMarker(r,e)},i=function(){n.call(this),o.call(this),this._fireEdit()},r.on("click",i,this).on("dragstart",n,this).on("dragend",o,this).on("touchmove",n,this),this._markerGroup.addLayer(r)},_updatePrevNext:function(t,e){t&&(t._next=e),e&&(e._prev=t)},_getMiddleLatLng:function(t,e){var i=this._poly._map,n=i.project(t.getLatLng()),o=i.project(e.getLatLng());return i.unproject(n._add(o)._divideBy(2))}}),L.Polyline.addInitHook(function(){this.editing||(L.Edit.Poly&&(this.editing=new L.Edit.Poly(this),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()}))}),L.Edit=L.Edit||{},L.Edit.SimpleShape=L.Handler.extend({options:{moveIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move"}),resizeIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize"}),touchMoveIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon"}),touchResizeIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon"})},initialize:function(t,e){L.Browser.touch&&(this.options.moveIcon=this.options.touchMoveIcon,this.options.resizeIcon=this.options.touchResizeIcon),this._shape=t,L.Util.setOptions(this,e)},addHooks:function(){var t=this._shape;this._shape._map&&(this._map=this._shape._map,t.setStyle(t.options.editing),t._map&&(this._map=t._map,this._markerGroup||this._initMarkers(),this._map.addLayer(this._markerGroup)))},removeHooks:function(){var t=this._shape;if(t.setStyle(t.options.original),t._map){
-this._unbindMarker(this._moveMarker);for(var e=0,i=this._resizeMarkers.length;i>e;e++)this._unbindMarker(this._resizeMarkers[e]);this._resizeMarkers=null,this._map.removeLayer(this._markerGroup),delete this._markerGroup}this._map=null},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new L.LayerGroup),this._createMoveMarker(),this._createResizeMarker()},_createMoveMarker:function(){},_createResizeMarker:function(){},_createMarker:function(t,e){var i=new L.Marker.Touch(t,{draggable:!0,icon:e,zIndexOffset:10});return this._bindMarker(i),this._markerGroup.addLayer(i),i},_bindMarker:function(t){t.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._onMarkerDragEnd,this).on("touchstart",this._onTouchStart,this).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onTouchEnd,this).on("MSPointerUp",this._onTouchEnd,this)},_unbindMarker:function(t){t.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._onMarkerDragEnd,this).off("touchstart",this._onTouchStart,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onTouchEnd,this).off("MSPointerUp",this._onTouchEnd,this)},_onMarkerDragStart:function(t){var e=t.target;e.setOpacity(0),this._shape.fire("editstart")},_fireEdit:function(){this._shape.edited=!0,this._shape.fire("edit")},_onMarkerDrag:function(t){var e=t.target,i=e.getLatLng();e===this._moveMarker?this._move(i):this._resize(i),this._shape.redraw(),this._shape.fire("editdrag")},_onMarkerDragEnd:function(t){var e=t.target;e.setOpacity(1),this._fireEdit()},_onTouchStart:function(t){if(L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,t),"function"==typeof this._getCorners){var e=this._getCorners(),i=t.target,n=i._cornerIndex;i.setOpacity(0),this._oppositeCorner=e[(n+2)%4],this._toggleCornerMarkers(0,n)}this._shape.fire("editstart")},_onTouchMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent.touches[0]),i=this._map.layerPointToLatLng(e),n=t.target;return n===this._moveMarker?this._move(i):this._resize(i),this._shape.redraw(),!1},_onTouchEnd:function(t){var e=t.target;e.setOpacity(1),this.updateMarkers(),this._fireEdit()},_move:function(){},_resize:function(){}}),L.Edit=L.Edit||{},L.Edit.Rectangle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var t=this._shape.getBounds(),e=t.getCenter();this._moveMarker=this._createMarker(e,this.options.moveIcon)},_createResizeMarker:function(){var t=this._getCorners();this._resizeMarkers=[];for(var e=0,i=t.length;i>e;e++)this._resizeMarkers.push(this._createMarker(t[e],this.options.resizeIcon)),this._resizeMarkers[e]._cornerIndex=e},_onMarkerDragStart:function(t){L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,t);var e=this._getCorners(),i=t.target,n=i._cornerIndex;this._oppositeCorner=e[(n+2)%4],this._toggleCornerMarkers(0,n)},_onMarkerDragEnd:function(t){var e,i,n=t.target;n===this._moveMarker&&(e=this._shape.getBounds(),i=e.getCenter(),n.setLatLng(i)),this._toggleCornerMarkers(1),this._repositionCornerMarkers(),L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this,t)},_move:function(t){for(var e,i=this._shape.getLatLngs(),n=this._shape.getBounds(),o=n.getCenter(),s=[],r=0,a=i.length;a>r;r++)e=[i[r].lat-o.lat,i[r].lng-o.lng],s.push([t.lat+e[0],t.lng+e[1]]);this._shape.setLatLngs(s),this._repositionCornerMarkers()},_resize:function(t){var e;this._shape.setBounds(L.latLngBounds(t,this._oppositeCorner)),e=this._shape.getBounds(),this._moveMarker.setLatLng(e.getCenter())},_getCorners:function(){var t=this._shape.getBounds(),e=t.getNorthWest(),i=t.getNorthEast(),n=t.getSouthEast(),o=t.getSouthWest();return[e,i,n,o]},_toggleCornerMarkers:function(t){for(var e=0,i=this._resizeMarkers.length;i>e;e++)this._resizeMarkers[e].setOpacity(t)},_repositionCornerMarkers:function(){for(var t=this._getCorners(),e=0,i=this._resizeMarkers.length;i>e;e++)this._resizeMarkers[e].setLatLng(t[e])}}),L.Rectangle.addInitHook(function(){L.Edit.Rectangle&&(this.editing=new L.Edit.Rectangle(this),this.options.editable&&this.editing.enable())}),L.Edit=L.Edit||{},L.Edit.Circle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var t=this._shape.getLatLng();this._moveMarker=this._createMarker(t,this.options.moveIcon)},_createResizeMarker:function(){var t=this._shape.getLatLng(),e=this._getResizeMarkerPoint(t);this._resizeMarkers=[],this._resizeMarkers.push(this._createMarker(e,this.options.resizeIcon))},_getResizeMarkerPoint:function(t){var e=this._shape._radius*Math.cos(Math.PI/4),i=this._map.project(t);return this._map.unproject([i.x+e,i.y-e])},_move:function(t){var e=this._getResizeMarkerPoint(t);this._resizeMarkers[0].setLatLng(e),this._shape.setLatLng(t)},_resize:function(t){var e=this._moveMarker.getLatLng(),i=e.distanceTo(t);this._shape.setRadius(i)}}),L.Circle.addInitHook(function(){L.Edit.Circle&&(this.editing=new L.Edit.Circle(this),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()})}),L.Map.mergeOptions({touchExtend:!0}),L.Map.TouchExtend=L.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){L.DomEvent.on(this._container,"touchstart",this._onTouchStart,this),L.DomEvent.on(this._container,"touchend",this._onTouchEnd,this),L.DomEvent.on(this._container,"touchmove",this._onTouchMove,this),this._detectIE()?(L.DomEvent.on(this._container,"MSPointerDown",this._onTouchStart,this),L.DomEvent.on(this._container,"MSPointerUp",this._onTouchEnd,this),L.DomEvent.on(this._container,"MSPointerMove",this._onTouchMove,this),L.DomEvent.on(this._container,"MSPointerCancel",this._onTouchCancel,this)):(L.DomEvent.on(this._container,"touchcancel",this._onTouchCancel,this),L.DomEvent.on(this._container,"touchleave",this._onTouchLeave,this))},removeHooks:function(){L.DomEvent.off(this._container,"touchstart",this._onTouchStart),L.DomEvent.off(this._container,"touchend",this._onTouchEnd),L.DomEvent.off(this._container,"touchmove",this._onTouchMove),this._detectIE()?(L.DomEvent.off(this._container,"MSPointerDowm",this._onTouchStart),L.DomEvent.off(this._container,"MSPointerUp",this._onTouchEnd),L.DomEvent.off(this._container,"MSPointerMove",this._onTouchMove),L.DomEvent.off(this._container,"MSPointerCancel",this._onTouchCancel)):(L.DomEvent.off(this._container,"touchcancel",this._onTouchCancel),L.DomEvent.off(this._container,"touchleave",this._onTouchLeave))},_touchEvent:function(t,e){var i={};if("undefined"!=typeof t.touches){if(!t.touches.length)return;i=t.touches[0]}else{if("touch"!==t.pointerType)return;if(i=t,!this._filterClick(t))return}var n=this._map.mouseEventToContainerPoint(i),o=this._map.mouseEventToLayerPoint(i),s=this._map.layerPointToLatLng(o);this._map.fire(e,{latlng:s,layerPoint:o,containerPoint:n,pageX:i.pageX,pageY:i.pageY,originalEvent:t})},_filterClick:function(t){var e=t.timeStamp||t.originalEvent.timeStamp,i=L.DomEvent._lastClick&&e-L.DomEvent._lastClick;return i&&i>100&&500>i||t.target._simulatedClick&&!t._simulated?(L.DomEvent.stop(t),!1):(L.DomEvent._lastClick=e,!0)},_onTouchStart:function(t){if(this._map._loaded){var e="touchstart";this._touchEvent(t,e)}},_onTouchEnd:function(t){if(this._map._loaded){var e="touchend";this._touchEvent(t,e)}},_onTouchCancel:function(t){if(this._map._loaded){var e="touchcancel";this._detectIE()&&(e="pointercancel"),this._touchEvent(t,e)}},_onTouchLeave:function(t){if(this._map._loaded){var e="touchleave";this._touchEvent(t,e)}},_onTouchMove:function(t){if(this._map._loaded){var e="touchmove";this._touchEvent(t,e)}},_detectIE:function(){var e=t.navigator.userAgent,i=e.indexOf("MSIE ");if(i>0)return parseInt(e.substring(i+5,e.indexOf(".",i)),10);var n=e.indexOf("Trident/");if(n>0){var o=e.indexOf("rv:");return parseInt(e.substring(o+3,e.indexOf(".",o)),10)}var s=e.indexOf("Edge/");return s>0&&parseInt(e.substring(s+5,e.indexOf(".",s)),10)}}),L.Map.addInitHook("addHandler","touchExtend",L.Map.TouchExtend),L.Marker.Touch=L.Marker.extend({_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu","touchstart","touchend","touchmove"];this._detectIE?e.concat(["MSPointerDown","MSPointerUp","MSPointerMove","MSPointerCancel"]):e.concat(["touchcancel"]),L.DomUtil.addClass(t,"leaflet-clickable"),L.DomEvent.on(t,"click",this._onMouseClick,this),L.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;i<e.length;i++)L.DomEvent.on(t,e[i],this._fireMouseEvent,this);L.Handler.MarkerDrag&&(this.dragging=new L.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_detectIE:function(){var e=t.navigator.userAgent,i=e.indexOf("MSIE ");if(i>0)return parseInt(e.substring(i+5,e.indexOf(".",i)),10);var n=e.indexOf("Trident/");if(n>0){var o=e.indexOf("rv:");return parseInt(e.substring(o+3,e.indexOf(".",o)),10)}var s=e.indexOf("Edge/");return s>0&&parseInt(e.substring(s+5,e.indexOf(".",s)),10)}}),L.LatLngUtil={cloneLatLngs:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(this.cloneLatLng(t[i]));return e},cloneLatLng:function(t){return L.latLng(t.lat,t.lng)}},L.GeometryUtil=L.extend(L.GeometryUtil||{},{geodesicArea:function(t){var e,i,n=t.length,o=0,s=L.LatLng.DEG_TO_RAD;if(n>2){for(var r=0;n>r;r++)e=t[r],i=t[(r+1)%n],o+=(i.lng-e.lng)*s*(2+Math.sin(e.lat*s)+Math.sin(i.lat*s));o=6378137*o*6378137/2}return Math.abs(o)},readableArea:function(t,e){var i;return e?i=t>=1e4?(1e-4*t).toFixed(2)+" ha":t.toFixed(2)+" m&sup2;":(t/=.836127,i=t>=3097600?(t/3097600).toFixed(2)+" mi&sup2;":t>=4840?(t/4840).toFixed(2)+" acres":Math.ceil(t)+" yd&sup2;"),i},readableDistance:function(t,e,i){var n;if(e)n=t>1e3?(t/1e3).toFixed(2)+" km":Math.ceil(t)+" m";else if(t*=1.09361,t>1760)n=(t/1760).toFixed(2)+" miles";else{var o=" yd";i&&(t=3*t,o=" ft"),n=Math.ceil(t)+o}return n}}),L.Util.extend(L.LineUtil,{segmentsIntersect:function(t,e,i,n){return this._checkCounterclockwise(t,i,n)!==this._checkCounterclockwise(e,i,n)&&this._checkCounterclockwise(t,e,i)!==this._checkCounterclockwise(t,e,n)},_checkCounterclockwise:function(t,e,i){return(i.y-t.y)*(e.x-t.x)>(e.y-t.y)*(i.x-t.x)}}),L.Polyline.include({intersects:function(){var t,e,i,n=this._originalPoints,o=n?n.length:0;if(this._tooFewPointsForIntersection())return!1;for(t=o-1;t>=3;t--)if(e=n[t-1],i=n[t],this._lineSegmentsIntersectsRange(e,i,t-2))return!0;return!1},newLatLngIntersects:function(t,e){return!!this._map&&this.newPointIntersects(this._map.latLngToLayerPoint(t),e)},newPointIntersects:function(t,e){var i=this._originalPoints,n=i?i.length:0,o=i?i[n-1]:null,s=n-2;return!this._tooFewPointsForIntersection(1)&&this._lineSegmentsIntersectsRange(o,t,s,e?1:0)},_tooFewPointsForIntersection:function(t){var e=this._originalPoints,i=e?e.length:0;return i+=t||0,!this._originalPoints||3>=i},_lineSegmentsIntersectsRange:function(t,e,i,n){var o,s,r=this._originalPoints;n=n||0;for(var a=i;a>n;a--)if(o=r[a-1],s=r[a],L.LineUtil.segmentsIntersect(t,e,o,s))return!0;return!1}}),L.Polygon.include({intersects:function(){var t,e,i,n,o,s=this._originalPoints;return!this._tooFewPointsForIntersection()&&(!!(t=L.Polyline.prototype.intersects.call(this))||(e=s.length,i=s[0],n=s[e-1],o=e-2,this._lineSegmentsIntersectsRange(n,i,o,1)))}}),L.Control.Draw=L.Control.extend({options:{position:"topleft",draw:{},edit:!1},initialize:function(t){if(L.version<"0.7")throw new Error("Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/");L.Control.prototype.initialize.call(this,t);var e;this._toolbars={},L.DrawToolbar&&this.options.draw&&(e=new L.DrawToolbar(this.options.draw),this._toolbars[L.DrawToolbar.TYPE]=e,this._toolbars[L.DrawToolbar.TYPE].on("enable",this._toolbarEnabled,this)),L.EditToolbar&&this.options.edit&&(e=new L.EditToolbar(this.options.edit),this._toolbars[L.EditToolbar.TYPE]=e,this._toolbars[L.EditToolbar.TYPE].on("enable",this._toolbarEnabled,this)),L.toolbar=this},onAdd:function(t){var e,i=L.DomUtil.create("div","leaflet-draw"),n=!1,o="leaflet-draw-toolbar-top";for(var s in this._toolbars)this._toolbars.hasOwnProperty(s)&&(e=this._toolbars[s].addToolbar(t),e&&(n||(L.DomUtil.hasClass(e,o)||L.DomUtil.addClass(e.childNodes[0],o),n=!0),i.appendChild(e)));return i},onRemove:function(){for(var t in this._toolbars)this._toolbars.hasOwnProperty(t)&&this._toolbars[t].removeToolbar()},setDrawingOptions:function(t){for(var e in this._toolbars)this._toolbars[e]instanceof L.DrawToolbar&&this._toolbars[e].setOptions(t)},_toolbarEnabled:function(t){var e=t.target;for(var i in this._toolbars)this._toolbars[i]!==e&&this._toolbars[i].disable()}}),L.Map.mergeOptions({drawControlTooltips:!0,drawControl:!1}),L.Map.addInitHook(function(){this.options.drawControl&&(this.drawControl=new L.Control.Draw,this.addControl(this.drawControl))}),L.Toolbar=L.Class.extend({includes:[L.Mixin.Events],initialize:function(t){L.setOptions(this,t),this._modes={},this._actionButtons=[],this._activeMode=null},enabled:function(){return null!==this._activeMode},disable:function(){this.enabled()&&this._activeMode.handler.disable()},addToolbar:function(t){var e,i=L.DomUtil.create("div","leaflet-draw-section"),n=0,o=this._toolbarClass||"",s=this.getModeHandlers(t);for(this._toolbarContainer=L.DomUtil.create("div","leaflet-draw-toolbar leaflet-bar"),this._map=t,e=0;e<s.length;e++)s[e].enabled&&this._initModeHandler(s[e].handler,this._toolbarContainer,n++,o,s[e].title);return n?(this._lastButtonIndex=--n,this._actionsContainer=L.DomUtil.create("ul","leaflet-draw-actions"),i.appendChild(this._toolbarContainer),i.appendChild(this._actionsContainer),i):void 0},removeToolbar:function(){for(var t in this._modes)this._modes.hasOwnProperty(t)&&(this._disposeButton(this._modes[t].button,this._modes[t].handler.enable,this._modes[t].handler),this._modes[t].handler.disable(),this._modes[t].handler.off("enabled",this._handlerActivated,this).off("disabled",this._handlerDeactivated,this));this._modes={};for(var e=0,i=this._actionButtons.length;i>e;e++)this._disposeButton(this._actionButtons[e].button,this._actionButtons[e].callback,this);this._actionButtons=[],this._actionsContainer=null},_initModeHandler:function(t,e,i,n,o){var s=t.type;this._modes[s]={},this._modes[s].handler=t,this._modes[s].button=this._createButton({type:s,title:o,className:n+"-"+s,container:e,callback:this._modes[s].handler.enable,context:this._modes[s].handler}),this._modes[s].buttonIndex=i,this._modes[s].handler.on("enabled",this._handlerActivated,this).on("disabled",this._handlerDeactivated,this)},_createButton:function(t){var e=L.DomUtil.create("a",t.className||"",t.container);return e.href="#",t.text&&(e.innerHTML=t.text),t.title&&(e.title=t.title),L.DomEvent.on(e,"click",L.DomEvent.stopPropagation).on(e,"mousedown",L.DomEvent.stopPropagation).on(e,"dblclick",L.DomEvent.stopPropagation).on(e,"click",L.DomEvent.preventDefault).on(e,"click",t.callback,t.context),e},_disposeButton:function(t,e){L.DomEvent.off(t,"click",L.DomEvent.stopPropagation).off(t,"mousedown",L.DomEvent.stopPropagation).off(t,"dblclick",L.DomEvent.stopPropagation).off(t,"click",L.DomEvent.preventDefault).off(t,"click",e)},_handlerActivated:function(t){this.disable(),this._activeMode=this._modes[t.handler],L.DomUtil.addClass(this._activeMode.button,"leaflet-draw-toolbar-button-enabled"),this._showActionsToolbar(),this.fire("enable")},_handlerDeactivated:function(){this._hideActionsToolbar(),L.DomUtil.removeClass(this._activeMode.button,"leaflet-draw-toolbar-button-enabled"),this._activeMode=null,this.fire("disable")},_createActions:function(t){var e,i,n,o,s=this._actionsContainer,r=this.getActions(t),a=r.length;for(i=0,n=this._actionButtons.length;n>i;i++)this._disposeButton(this._actionButtons[i].button,this._actionButtons[i].callback);for(this._actionButtons=[];s.firstChild;)s.removeChild(s.firstChild);for(var l=0;a>l;l++)"enabled"in r[l]&&!r[l].enabled||(e=L.DomUtil.create("li","",s),o=this._createButton({title:r[l].title,text:r[l].text,container:e,callback:r[l].callback,context:r[l].context}),this._actionButtons.push({button:o,callback:r[l].callback}))},_showActionsToolbar:function(){var t=this._activeMode.buttonIndex,e=this._lastButtonIndex,i=this._activeMode.button.offsetTop-1;this._createActions(this._activeMode.handler),this._actionsContainer.style.top=i+"px",0===t&&(L.DomUtil.addClass(this._toolbarContainer,"leaflet-draw-toolbar-notop"),L.DomUtil.addClass(this._actionsContainer,"leaflet-draw-actions-top")),t===e&&(L.DomUtil.addClass(this._toolbarContainer,"leaflet-draw-toolbar-nobottom"),L.DomUtil.addClass(this._actionsContainer,"leaflet-draw-actions-bottom")),this._actionsContainer.style.display="block"},_hideActionsToolbar:function(){this._actionsContainer.style.display="none",L.DomUtil.removeClass(this._toolbarContainer,"leaflet-draw-toolbar-notop"),L.DomUtil.removeClass(this._toolbarContainer,"leaflet-draw-toolbar-nobottom"),L.DomUtil.removeClass(this._actionsContainer,"leaflet-draw-actions-top"),L.DomUtil.removeClass(this._actionsContainer,"leaflet-draw-actions-bottom")}}),L.Tooltip=L.Class.extend({initialize:function(t){this._map=t,this._popupPane=t._panes.popupPane,this._container=t.options.drawControlTooltips?L.DomUtil.create("div","leaflet-draw-tooltip",this._popupPane):null,this._singleLineLabel=!1,this._map.on("mouseout",this._onMouseOut,this)},dispose:function(){this._map.off("mouseout",this._onMouseOut,this),this._container&&(this._popupPane.removeChild(this._container),this._container=null)},updateContent:function(t){return this._container?(t.subtext=t.subtext||"",0!==t.subtext.length||this._singleLineLabel?t.subtext.length>0&&this._singleLineLabel&&(L.DomUtil.removeClass(this._container,"leaflet-draw-tooltip-single"),this._singleLineLabel=!1):(L.DomUtil.addClass(this._container,"leaflet-draw-tooltip-single"),this._singleLineLabel=!0),this._container.innerHTML=(t.subtext.length>0?'<span class="leaflet-draw-tooltip-subtext">'+t.subtext+"</span><br />":"")+"<span>"+t.text+"</span>",this):this},updatePosition:function(t){var e=this._map.latLngToLayerPoint(t),i=this._container;return this._container&&(i.style.visibility="inherit",L.DomUtil.setPosition(i,e)),this},showAsError:function(){return this._container&&L.DomUtil.addClass(this._container,"leaflet-error-draw-tooltip"),this},removeError:function(){return this._container&&L.DomUtil.removeClass(this._container,"leaflet-error-draw-tooltip"),this},_onMouseOut:function(){this._container&&(this._container.style.visibility="hidden")}}),L.DrawToolbar=L.Toolbar.extend({statics:{TYPE:"draw"},options:{polyline:{},polygon:{},rectangle:{},circle:{},marker:{}},initialize:function(t){for(var e in this.options)this.options.hasOwnProperty(e)&&t[e]&&(t[e]=L.extend({},this.options[e],t[e]));this._toolbarClass="leaflet-draw-draw",L.Toolbar.prototype.initialize.call(this,t)},getModeHandlers:function(t){return[{enabled:this.options.polyline,handler:new L.Draw.Polyline(t,this.options.polyline),title:L.drawLocal.draw.toolbar.buttons.polyline},{enabled:this.options.polygon,handler:new L.Draw.Polygon(t,this.options.polygon),title:L.drawLocal.draw.toolbar.buttons.polygon},{enabled:this.options.rectangle,handler:new L.Draw.Rectangle(t,this.options.rectangle),title:L.drawLocal.draw.toolbar.buttons.rectangle},{enabled:this.options.circle,handler:new L.Draw.Circle(t,this.options.circle),title:L.drawLocal.draw.toolbar.buttons.circle},{enabled:this.options.marker,handler:new L.Draw.Marker(t,this.options.marker),title:L.drawLocal.draw.toolbar.buttons.marker}]},getActions:function(t){return[{enabled:t.completeShape,title:L.drawLocal.draw.toolbar.finish.title,text:L.drawLocal.draw.toolbar.finish.text,callback:t.completeShape,context:t},{enabled:t.deleteLastVertex,title:L.drawLocal.draw.toolbar.undo.title,text:L.drawLocal.draw.toolbar.undo.text,callback:t.deleteLastVertex,context:t},{title:L.drawLocal.draw.toolbar.actions.title,text:L.drawLocal.draw.toolbar.actions.text,callback:this.disable,context:this}]},setOptions:function(t){L.setOptions(this,t);for(var e in this._modes)this._modes.hasOwnProperty(e)&&t.hasOwnProperty(e)&&this._modes[e].handler.setOptions(t[e])}}),L.EditToolbar=L.Toolbar.extend({statics:{TYPE:"edit"},options:{edit:{selectedPathOptions:{dashArray:"10, 10",fill:!0,fillColor:"#fe57a1",fillOpacity:.1,maintainColor:!1}},remove:{},featureGroup:null},initialize:function(t){t.edit&&("undefined"==typeof t.edit.selectedPathOptions&&(t.edit.selectedPathOptions=this.options.edit.selectedPathOptions),t.edit.selectedPathOptions=L.extend({},this.options.edit.selectedPathOptions,t.edit.selectedPathOptions)),t.remove&&(t.remove=L.extend({},this.options.remove,t.remove)),this._toolbarClass="leaflet-draw-edit",L.Toolbar.prototype.initialize.call(this,t),this._selectedFeatureCount=0},getModeHandlers:function(t){var e=this.options.featureGroup;return[{enabled:this.options.edit,handler:new L.EditToolbar.Edit(t,{featureGroup:e,selectedPathOptions:this.options.edit.selectedPathOptions}),title:L.drawLocal.edit.toolbar.buttons.edit},{enabled:this.options.remove,handler:new L.EditToolbar.Delete(t,{featureGroup:e}),title:L.drawLocal.edit.toolbar.buttons.remove}]},getActions:function(){return[{title:L.drawLocal.edit.toolbar.actions.save.title,text:L.drawLocal.edit.toolbar.actions.save.text,callback:this._save,context:this},{title:L.drawLocal.edit.toolbar.actions.cancel.title,text:L.drawLocal.edit.toolbar.actions.cancel.text,callback:this.disable,context:this}]},addToolbar:function(t){var e=L.Toolbar.prototype.addToolbar.call(this,t);return this._checkDisabled(),this.options.featureGroup.on("layeradd layerremove",this._checkDisabled,this),e},removeToolbar:function(){this.options.featureGroup.off("layeradd layerremove",this._checkDisabled,this),L.Toolbar.prototype.removeToolbar.call(this)},disable:function(){this.enabled()&&(this._activeMode.handler.revertLayers(),L.Toolbar.prototype.disable.call(this))},_save:function(){this._activeMode.handler.save(),this._activeMode.handler.disable()},_checkDisabled:function(){var t,e=this.options.featureGroup,i=0!==e.getLayers().length;this.options.edit&&(t=this._modes[L.EditToolbar.Edit.TYPE].button,i?L.DomUtil.removeClass(t,"leaflet-disabled"):L.DomUtil.addClass(t,"leaflet-disabled"),t.setAttribute("title",i?L.drawLocal.edit.toolbar.buttons.edit:L.drawLocal.edit.toolbar.buttons.editDisabled)),this.options.remove&&(t=this._modes[L.EditToolbar.Delete.TYPE].button,i?L.DomUtil.removeClass(t,"leaflet-disabled"):L.DomUtil.addClass(t,"leaflet-disabled"),t.setAttribute("title",i?L.drawLocal.edit.toolbar.buttons.remove:L.drawLocal.edit.toolbar.buttons.removeDisabled))}}),L.EditToolbar.Edit=L.Handler.extend({statics:{TYPE:"edit"},includes:L.Mixin.Events,initialize:function(t,e){if(L.Handler.prototype.initialize.call(this,t),L.setOptions(this,e),this._featureGroup=e.featureGroup,!(this._featureGroup instanceof L.FeatureGroup))throw new Error("options.featureGroup must be a L.FeatureGroup");this._uneditedLayerProps={},this.type=L.EditToolbar.Edit.TYPE},enable:function(){!this._enabled&&this._hasAvailableLayers()&&(this.fire("enabled",{handler:this.type}),this._map.fire("draw:editstart",{handler:this.type}),L.Handler.prototype.enable.call(this),this._featureGroup.on("layeradd",this._enableLayerEdit,this).on("layerremove",this._disableLayerEdit,this))},disable:function(){this._enabled&&(this._featureGroup.off("layeradd",this._enableLayerEdit,this).off("layerremove",this._disableLayerEdit,this),L.Handler.prototype.disable.call(this),this._map.fire("draw:editstop",{handler:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(t.getContainer().focus(),this._featureGroup.eachLayer(this._enableLayerEdit,this),this._tooltip=new L.Tooltip(this._map),this._updateTooltip(),this._map.on("mousemove",this._onMouseMove,this).on("touchmove",this._onMouseMove,this).on("MSPointerMove",this._onMouseMove,this).on("click",this._editStyle,this).on("draw:editvertex",this._updateTooltip,this))},removeHooks:function(){this._map&&(this._featureGroup.eachLayer(this._disableLayerEdit,this),this._uneditedLayerProps={},this._tooltip.dispose(),this._tooltip=null,this._map.off("mousemove",this._onMouseMove,this).off("touchmove",this._onMouseMove,this).off("MSPointerMove",this._onMouseMove,this))},revertLayers:function(){this._featureGroup.eachLayer(function(t){this._revertLayer(t)},this)},save:function(){var t=new L.LayerGroup;this._featureGroup.eachLayer(function(e){e.edited&&(t.addLayer(e),e.edited=!1)}),this._map.fire("draw:edited",{layers:t})},_backupLayer:function(t){var e=L.Util.stamp(t);this._uneditedLayerProps[e]||(t instanceof L.Polyline||t instanceof L.Polygon||t instanceof L.Rectangle?this._uneditedLayerProps[e]={latlngs:L.LatLngUtil.cloneLatLngs(t.getLatLngs())}:t instanceof L.Circle?this._uneditedLayerProps[e]={latlng:L.LatLngUtil.cloneLatLng(t.getLatLng()),radius:t.getRadius()}:t instanceof L.Marker&&(this._uneditedLayerProps[e]={latlng:L.LatLngUtil.cloneLatLng(t.getLatLng())}))},_getTooltipText:function(){return{text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext}},_updateTooltip:function(){this._tooltip.updateContent(this._getTooltipText())},_revertLayer:function(t){var e=L.Util.stamp(t);t.edited=!1,this._uneditedLayerProps.hasOwnProperty(e)&&(t instanceof L.Polyline||t instanceof L.Polygon||t instanceof L.Rectangle?t.setLatLngs(this._uneditedLayerProps[e].latlngs):t instanceof L.Circle?(t.setLatLng(this._uneditedLayerProps[e].latlng),t.setRadius(this._uneditedLayerProps[e].radius)):t instanceof L.Marker&&t.setLatLng(this._uneditedLayerProps[e].latlng),t.fire("revert-edited",{layer:t}))},_enableLayerEdit:function(t){var e,i=t.layer||t.target||t;this._backupLayer(i),this.options.selectedPathOptions&&(e=L.Util.extend({},this.options.selectedPathOptions),e.maintainColor&&(e.color=i.options.color,e.fillColor=i.options.fillColor),i.options.original=L.extend({},i.options),i.options.editing=e),this.isMarker?(i.dragging.enable(),i.on("dragend",this._onMarkerDragEnd).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onMarkerDragEnd,this).on("MSPointerUp",this._onMarkerDragEnd,this)):i.editing.enable()},_disableLayerEdit:function(t){var e=t.layer||t.target||t;e.edited=!1,e.editing.disable(),delete e.options.editing,delete e.options.original,this._selectedPathOptions&&(e instanceof L.Marker?this._toggleMarkerHighlight(e):(e.setStyle(e.options.previousOptions),delete e.options.previousOptions)),e instanceof L.Marker?(e.dragging.disable(),e.off("dragend",this._onMarkerDragEnd,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onMarkerDragEnd,this).off("MSPointerUp",this._onMarkerDragEnd,this)):e.editing.disable()},_onMouseMove:function(t){this._tooltip.updatePosition(t.latlng)},_onTouchMove:function(t){var e=t.originalEvent.changedTouches[0],i=this._map.mouseEventToLayerPoint(e),n=this._map.layerPointToLatLng(i);t.target.setLatLng(n)},_hasAvailableLayers:function(){return 0!==this._featureGroup.getLayers().length}}),L.EditToolbar.Delete=L.Handler.extend({statics:{TYPE:"remove"},includes:L.Mixin.Events,initialize:function(t,e){if(L.Handler.prototype.initialize.call(this,t),L.Util.setOptions(this,e),this._deletableLayers=this.options.featureGroup,!(this._deletableLayers instanceof L.FeatureGroup))throw new Error("options.featureGroup must be a L.FeatureGroup");this.type=L.EditToolbar.Delete.TYPE},enable:function(){!this._enabled&&this._hasAvailableLayers()&&(this.fire("enabled",{handler:this.type}),this._map.fire("draw:deletestart",{handler:this.type}),L.Handler.prototype.enable.call(this),this._deletableLayers.on("layeradd",this._enableLayerDelete,this).on("layerremove",this._disableLayerDelete,this))},disable:function(){this._enabled&&(this._deletableLayers.off("layeradd",this._enableLayerDelete,this).off("layerremove",this._disableLayerDelete,this),L.Handler.prototype.disable.call(this),this._map.fire("draw:deletestop",{handler:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(t.getContainer().focus(),this._deletableLayers.eachLayer(this._enableLayerDelete,this),this._deletedLayers=new L.LayerGroup,this._tooltip=new L.Tooltip(this._map),this._tooltip.updateContent({text:L.drawLocal.edit.handlers.remove.tooltip.text}),this._map.on("mousemove",this._onMouseMove,this))},removeHooks:function(){this._map&&(this._deletableLayers.eachLayer(this._disableLayerDelete,this),this._deletedLayers=null,this._tooltip.dispose(),this._tooltip=null,this._map.off("mousemove",this._onMouseMove,this))},revertLayers:function(){this._deletedLayers.eachLayer(function(t){this._deletableLayers.addLayer(t),t.fire("revert-deleted",{layer:t})},this)},save:function(){this._map.fire("draw:deleted",{layers:this._deletedLayers})},_enableLayerDelete:function(t){var e=t.layer||t.target||t;e.on("click",this._removeLayer,this)},_disableLayerDelete:function(t){var e=t.layer||t.target||t;e.off("click",this._removeLayer,this),this._deletedLayers.removeLayer(e)},_removeLayer:function(t){var e=t.layer||t.target||t;this._deletableLayers.removeLayer(e),this._deletedLayers.addLayer(e),e.fire("deleted")},_onMouseMove:function(t){this._tooltip.updatePosition(t.latlng)},_hasAvailableLayers:function(){return 0!==this._deletableLayers.getLayers().length}})}(window,document),leafletDraw=void 0,function(t){"use strict";sortable=function(){return"function"==typeof t?t():t}()}(function(){"use strict";function t(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be HTMLElement, and not "+{}.toString.call(t);this.el=t,this.options=e=v({},e),t[U]=this;var i={group:Math.random(),sort:!0,disabled:!1,store:null,handle:null,scroll:!0,scrollSensitivity:30,scrollSpeed:10,draggable:/[uo]l/i.test(t.nodeName)?"li":">*",ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",ignore:"a, img",filter:null,animation:0,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1};for(var n in i)!(n in e)&&(e[n]=i[n]);K(e);for(var s in this)"_"===s.charAt(0)&&(this[s]=this[s].bind(this));this.nativeDraggable=!e.forceFallback&&B,o(t,"mousedown",this._onTapStart),o(t,"touchstart",this._onTapStart),this.nativeDraggable&&(o(t,"dragover",this),o(t,"dragenter",this)),V.push(this._onDragOver),e.store&&this.sort(e.store.get(this))}function e(t){C&&C.state!==t&&(a(C,"display",t?"none":""),!t&&C.state&&S.insertBefore(C,y),C.state=t)}function i(t,e,i){if(t){i=i||F;do if(">*"===e&&t.parentNode===i||_(t,e))return t;while(t!==i&&(t=t.parentNode))}return null}function n(t){t.dataTransfer&&(t.dataTransfer.dropEffect="move"),t.preventDefault()}function o(t,e,i){t.addEventListener(e,i,!1)}function s(t,e,i){t.removeEventListener(e,i,!1)}function r(t,e,i){if(t)if(t.classList)t.classList[i?"add":"remove"](e);else{var n=(" "+t.className+" ").replace(N," ").replace(" "+e+" "," ");t.className=(n+(i?" "+e:"")).replace(N," ")}}function a(t,e,i){var n=t&&t.style;if(n){if(void 0===i)return F.defaultView&&F.defaultView.getComputedStyle?i=F.defaultView.getComputedStyle(t,""):t.currentStyle&&(i=t.currentStyle),void 0===e?i:i[e];e in n||(e="-webkit-"+e),n[e]=i+("string"==typeof i?"":"px")}}function l(t,e,i){if(t){var n=t.getElementsByTagName(e),o=0,s=n.length;if(i)for(;o<s;o++)i(n[o],o);return n}return[]}function c(t,e,i,n,o,s,r){var a=F.createEvent("Event"),l=(t||e[U]).options,c="on"+i.charAt(0).toUpperCase()+i.substr(1);a.initEvent(i,!0,!0),a.to=e,a.from=o||e,a.item=n||e,a.clone=C,a.oldIndex=s,a.newIndex=r,e.dispatchEvent(a),
-l[c]&&l[c].call(t,a)}function h(t,e,i,n,o,s){var r,a,l=t[U],c=l.options.onMove;return r=F.createEvent("Event"),r.initEvent("move",!0,!0),r.to=e,r.from=t,r.dragged=i,r.draggedRect=n,r.related=o||e,r.relatedRect=s||e.getBoundingClientRect(),t.dispatchEvent(r),c&&(a=c.call(l,r)),a}function u(t){t.draggable=!1}function d(){W=!1}function p(t,e){var i=t.lastElementChild,n=i.getBoundingClientRect();return(e.clientY-(n.top+n.height)>5||e.clientX-(n.right+n.width)>5)&&i}function m(t){for(var e=t.tagName+t.className+t.src+t.href+t.textContent,i=e.length,n=0;i--;)n+=e.charCodeAt(i);return n.toString(36)}function f(t,e){var i=0;if(!t||!t.parentNode)return-1;for(;t&&(t=t.previousElementSibling);)"TEMPLATE"!==t.nodeName.toUpperCase()&&_(t,e)&&i++;return i}function _(t,e){if(t){e=e.split(".");var i=e.shift().toUpperCase(),n=new RegExp("\\s("+e.join("|")+")(?=\\s)","g");return!(""!==i&&t.nodeName.toUpperCase()!=i||e.length&&((" "+t.className+" ").match(n)||[]).length!=e.length)}return!1}function g(t,e){var i,n;return function(){void 0===i&&(i=arguments,n=this,setTimeout(function(){1===i.length?t.call(n,i[0]):t.apply(n,i),i=void 0},e))}}function v(t,e){if(t&&e)for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}if("undefined"==typeof window||"undefined"==typeof window.document)return function(){throw new Error("Sortable.js requires a window with a document")};var y,E,P,C,S,M,w,L,R,b,x,G,I,A,T,k,O,D={},N=/\s+/g,U="Sortable"+(new Date).getTime(),j=window,F=j.document,z=j.parseInt,B=!!("draggable"in F.createElement("div")),q=function(t){return t=F.createElement("x"),t.style.cssText="pointer-events:auto","auto"===t.style.pointerEvents}(),W=!1,H=Math.abs,V=([].slice,[]),Y=g(function(t,e,i){if(i&&e.scroll){var n,o,s,r,a=e.scrollSensitivity,l=e.scrollSpeed,c=t.clientX,h=t.clientY,u=window.innerWidth,d=window.innerHeight;if(L!==i&&(w=e.scroll,L=i,w===!0)){w=i;do if(w.offsetWidth<w.scrollWidth||w.offsetHeight<w.scrollHeight)break;while(w=w.parentNode)}w&&(n=w,o=w.getBoundingClientRect(),s=(H(o.right-c)<=a)-(H(o.left-c)<=a),r=(H(o.bottom-h)<=a)-(H(o.top-h)<=a)),s||r||(s=(u-c<=a)-(c<=a),r=(d-h<=a)-(h<=a),(s||r)&&(n=j)),D.vx===s&&D.vy===r&&D.el===n||(D.el=n,D.vx=s,D.vy=r,clearInterval(D.pid),n&&(D.pid=setInterval(function(){n===j?j.scrollTo(j.pageXOffset+s*l,j.pageYOffset+r*l):(r&&(n.scrollTop+=r*l),s&&(n.scrollLeft+=s*l))},24)))}},30),K=function(t){var e=t.group;e&&"object"==typeof e||(e=t.group={name:e}),["pull","put"].forEach(function(t){t in e||(e[t]=!0)}),t.groups=" "+e.name+(e.put.join?" "+e.put.join(" "):"")+" "};return t.prototype={constructor:t,_onTapStart:function(t){var e=this,n=this.el,o=this.options,s=t.type,r=t.touches&&t.touches[0],a=(r||t).target,l=a,h=o.filter;if(!("mousedown"===s&&0!==t.button||o.disabled)&&(a=i(a,o.draggable,n))){if(G=f(a,o.draggable),"function"==typeof h){if(h.call(this,t,a,this))return c(e,l,"filter",a,n,G),void t.preventDefault()}else if(h&&(h=h.split(",").some(function(t){if(t=i(l,t.trim(),n))return c(e,t,"filter",a,n,G),!0})))return void t.preventDefault();o.handle&&!i(l,o.handle,n)||this._prepareDragStart(t,r,a)}},_prepareDragStart:function(t,e,i){var n,s=this,a=s.el,c=s.options,h=a.ownerDocument;i&&!y&&i.parentNode===a&&(T=t,S=a,y=i,E=y.parentNode,M=y.nextSibling,A=c.group,n=function(){s._disableDelayedDrag(),y.draggable=!0,r(y,s.options.chosenClass,!0),s._triggerDragStart(e)},c.ignore.split(",").forEach(function(t){l(y,t.trim(),u)}),o(h,"mouseup",s._onDrop),o(h,"touchend",s._onDrop),o(h,"touchcancel",s._onDrop),c.delay?(o(h,"mouseup",s._disableDelayedDrag),o(h,"touchend",s._disableDelayedDrag),o(h,"touchcancel",s._disableDelayedDrag),o(h,"mousemove",s._disableDelayedDrag),o(h,"touchmove",s._disableDelayedDrag),s._dragStartTimer=setTimeout(n,c.delay)):n())},_disableDelayedDrag:function(){var t=this.el.ownerDocument;clearTimeout(this._dragStartTimer),s(t,"mouseup",this._disableDelayedDrag),s(t,"touchend",this._disableDelayedDrag),s(t,"touchcancel",this._disableDelayedDrag),s(t,"mousemove",this._disableDelayedDrag),s(t,"touchmove",this._disableDelayedDrag)},_triggerDragStart:function(t){t?(T={target:y,clientX:t.clientX,clientY:t.clientY},this._onDragStart(T,"touch")):this.nativeDraggable?(o(y,"dragend",this),o(S,"dragstart",this._onDragStart)):this._onDragStart(T,!0);try{F.selection?F.selection.empty():window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(){S&&y&&(r(y,this.options.ghostClass,!0),t.active=this,c(this,S,"start",y,S,G))},_emulateDragOver:function(){if(k){if(this._lastX===k.clientX&&this._lastY===k.clientY)return;this._lastX=k.clientX,this._lastY=k.clientY,q||a(P,"display","none");var t=F.elementFromPoint(k.clientX,k.clientY),e=t,i=" "+this.options.group.name,n=V.length;if(e)do{if(e[U]&&e[U].options.groups.indexOf(i)>-1){for(;n--;)V[n]({clientX:k.clientX,clientY:k.clientY,target:t,rootEl:e});break}t=e}while(e=e.parentNode);q||a(P,"display","")}},_onTouchMove:function(e){if(T){t.active||this._dragStarted(),this._appendGhost();var i=e.touches?e.touches[0]:e,n=i.clientX-T.clientX,o=i.clientY-T.clientY,s=e.touches?"translate3d("+n+"px,"+o+"px,0)":"translate("+n+"px,"+o+"px)";O=!0,k=i,a(P,"webkitTransform",s),a(P,"mozTransform",s),a(P,"msTransform",s),a(P,"transform",s),e.preventDefault()}},_appendGhost:function(){if(!P){var t,e=y.getBoundingClientRect(),i=a(y),n=this.options;P=y.cloneNode(!0),r(P,n.ghostClass,!1),r(P,n.fallbackClass,!0),a(P,"top",e.top-z(i.marginTop,10)),a(P,"left",e.left-z(i.marginLeft,10)),a(P,"width",e.width),a(P,"height",e.height),a(P,"opacity","0.8"),a(P,"position","fixed"),a(P,"zIndex","100000"),a(P,"pointerEvents","none"),n.fallbackOnBody&&F.body.appendChild(P)||S.appendChild(P),t=P.getBoundingClientRect(),a(P,"width",2*e.width-t.width),a(P,"height",2*e.height-t.height)}},_onDragStart:function(t,e){var i=t.dataTransfer,n=this.options;this._offUpEvents(),"clone"==A.pull&&(C=y.cloneNode(!0),a(C,"display","none"),S.insertBefore(C,y)),e?("touch"===e?(o(F,"touchmove",this._onTouchMove),o(F,"touchend",this._onDrop),o(F,"touchcancel",this._onDrop)):(o(F,"mousemove",this._onTouchMove),o(F,"mouseup",this._onDrop)),this._loopId=setInterval(this._emulateDragOver,50)):(i&&(i.effectAllowed="move",n.setData&&n.setData.call(this,i,y)),o(F,"drop",this),setTimeout(this._dragStarted,0))},_onDragOver:function(t){var n,o,s,r=this.el,l=this.options,c=l.group,u=c.put,m=A===c,f=l.sort;if(void 0!==t.preventDefault&&(t.preventDefault(),!l.dragoverBubble&&t.stopPropagation()),O=!0,A&&!l.disabled&&(m?f||(s=!S.contains(y)):A.pull&&u&&(A.name===c.name||u.indexOf&&~u.indexOf(A.name)))&&(void 0===t.rootEl||t.rootEl===this.el)){if(Y(t,l,this.el),W)return;if(n=i(t.target,l.draggable,r),o=y.getBoundingClientRect(),s)return e(!0),void(C||M?S.insertBefore(y,C||M):f||S.appendChild(y));if(0===r.children.length||r.children[0]===P||r===t.target&&(n=p(r,t))){if(n){if(n.animated)return;g=n.getBoundingClientRect()}e(m),h(S,r,y,o,n,g)!==!1&&(y.contains(r)||(r.appendChild(y),E=r),this._animate(o,y),n&&this._animate(g,n))}else if(n&&!n.animated&&n!==y&&void 0!==n.parentNode[U]){R!==n&&(R=n,b=a(n),x=a(n.parentNode));var _,g=n.getBoundingClientRect(),v=g.right-g.left,w=g.bottom-g.top,L=/left|right|inline/.test(b.cssFloat+b.display)||"flex"==x.display&&0===x["flex-direction"].indexOf("row"),G=n.offsetWidth>y.offsetWidth,I=n.offsetHeight>y.offsetHeight,T=(L?(t.clientX-g.left)/v:(t.clientY-g.top)/w)>.5,k=n.nextElementSibling,D=h(S,r,y,o,n,g);if(D!==!1){if(W=!0,setTimeout(d,30),e(m),1===D||D===-1)_=1===D;else if(L){var N=y.offsetTop,j=n.offsetTop;_=N===j?n.previousElementSibling===y&&!G||T&&G:j>N}else _=k!==y&&!I||T&&I;y.contains(r)||(_&&!k?r.appendChild(y):n.parentNode.insertBefore(y,_?k:n)),E=y.parentNode,this._animate(o,y),this._animate(g,n)}}}},_animate:function(t,e){var i=this.options.animation;if(i){var n=e.getBoundingClientRect();a(e,"transition","none"),a(e,"transform","translate3d("+(t.left-n.left)+"px,"+(t.top-n.top)+"px,0)"),e.offsetWidth,a(e,"transition","all "+i+"ms"),a(e,"transform","translate3d(0,0,0)"),clearTimeout(e.animated),e.animated=setTimeout(function(){a(e,"transition",""),a(e,"transform",""),e.animated=!1},i)}},_offUpEvents:function(){var t=this.el.ownerDocument;s(F,"touchmove",this._onTouchMove),s(t,"mouseup",this._onDrop),s(t,"touchend",this._onDrop),s(t,"touchcancel",this._onDrop)},_onDrop:function(e){var i=this.el,n=this.options;clearInterval(this._loopId),clearInterval(D.pid),clearTimeout(this._dragStartTimer),s(F,"mousemove",this._onTouchMove),this.nativeDraggable&&(s(F,"drop",this),s(i,"dragstart",this._onDragStart)),this._offUpEvents(),e&&(O&&(e.preventDefault(),!n.dropBubble&&e.stopPropagation()),P&&P.parentNode.removeChild(P),y&&(this.nativeDraggable&&s(y,"dragend",this),u(y),r(y,this.options.ghostClass,!1),r(y,this.options.chosenClass,!1),S!==E?(I=f(y,n.draggable),I>=0&&(c(null,E,"sort",y,S,G,I),c(this,S,"sort",y,S,G,I),c(null,E,"add",y,S,G,I),c(this,S,"remove",y,S,G,I))):(C&&C.parentNode.removeChild(C),y.nextSibling!==M&&(I=f(y,n.draggable),I>=0&&(c(this,S,"update",y,S,G,I),c(this,S,"sort",y,S,G,I)))),t.active&&(null!==I&&I!==-1||(I=G),c(this,S,"end",y,S,G,I),this.save()))),this._nulling()},_nulling:function(){S=y=E=P=M=C=w=L=T=k=O=I=R=b=A=t.active=null},handleEvent:function(t){var e=t.type;"dragover"===e||"dragenter"===e?y&&(this._onDragOver(t),n(t)):"drop"!==e&&"dragend"!==e||this._onDrop(t)},toArray:function(){for(var t,e=[],n=this.el.children,o=0,s=n.length,r=this.options;o<s;o++)t=n[o],i(t,r.draggable,this.el)&&e.push(t.getAttribute(r.dataIdAttr)||m(t));return e},sort:function(t){var e={},n=this.el;this.toArray().forEach(function(t,o){var s=n.children[o];i(s,this.options.draggable,n)&&(e[t]=s)},this),t.forEach(function(t){e[t]&&(n.removeChild(e[t]),n.appendChild(e[t]))})},save:function(){var t=this.options.store;t&&t.set(this)},closest:function(t,e){return i(t,e||this.options.draggable,this.el)},option:function(t,e){var i=this.options;return void 0===e?i[t]:(i[t]=e,void("group"===t&&K(i)))},destroy:function(){var t=this.el;t[U]=null,s(t,"mousedown",this._onTapStart),s(t,"touchstart",this._onTapStart),this.nativeDraggable&&(s(t,"dragover",this),s(t,"dragenter",this)),Array.prototype.forEach.call(t.querySelectorAll("[draggable]"),function(t){t.removeAttribute("draggable")}),V.splice(V.indexOf(this._onDragOver),1),this._onDrop(),this.el=t=null}},t.utils={on:o,off:s,css:a,find:l,is:function(t,e){return!!i(t,e,t)},extend:v,throttle:g,closest:i,toggleClass:r,index:f},t.create=function(e,i){return new t(e,i)},t.version="1.4.2",t}),CommonControlsLayerSwitcherDOM=function(t){var e={_createDraggableElement:function(e,i){t.create(e,{handle:".GPlayerName",draggable:".draggable-layer",ghostClass:"GPghostLayer",animation:200,onEnd:function(t){i._onDragAndDropLayerClick(t)}})},_addUID:function(t){var e=this._uid?t+"-"+this._uid:t;return e},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPlayerSwitcher"),t.className="GPwidget",t},_createMainLayersShowElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowLayersList"),t.type="checkbox",t},_createMainLayersElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPlayersList"),t.className="GPpanel",t},_createMainPictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowLayersListPicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowLayersList"),e.title="Afficher/masquer le gestionnaire de couches";var i=document.createElement("span");i.id=this._addUID("GPshowLayersListOpen"),i.className="GPshowAdvancedToolOpen",i.addEventListener("click",function(){if(document.getElementById(t._addUID("GPshowLayersList")).checked){for(var e=document.getElementsByClassName("GPlayerInfoOpened"),i=0;i<e.length;i++)e[i].className="GPlayerInfo";document.getElementById(t._addUID("GPlayerInfoPanel")).className="GPlayerInfoPanelClosed"}}),e.appendChild(i);var n=document.createElement("span");return n.addEventListener("click",function(){if(document.getElementById(t._addUID("GPshowLayersList")).checked){for(var e=document.getElementsByClassName("GPlayerInfoOpened"),i=0;i<e.length;i++)e[i].className="GPlayerInfo";document.getElementById(t._addUID("GPlayerInfoPanel")).className="GPlayerInfoPanelClosed"}}),n.id=t._addUID("GPshowLayersListClose"),e.appendChild(n),e},_createMainInfoElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPlayerInfoPanel"),t.className="GPpanel GPlayerInfoPanelClosed",t},_createContainerLayerElement:function(t){var e=document.createElement("div");e.id="GPlayerSwitcher_ID"+t.id,e.className="GPlayerSwitcher_layer draggable-layer",e.appendChild(this._createBasicToolElement(t));for(var i=this._createAdvancedToolShowElement(t),n=0;n<i.length;n++)e.appendChild(i[n]);return e.appendChild(this._createAdvancedToolElement(t)),e},_createBasicToolElement:function(t){var e=document.createElement("div");e.id="GPbasicTools_IDLayer"+t.id,e.className="GPlayerBasicTools",e.appendChild(this._createBasicToolNameElement(t));for(var i=this._createBasicToolVisibilityElement(t),n=0;n<i.length;n++)e.appendChild(i[n]);return e},_createBasicToolNameElement:function(t){var e=document.createElement("span");return e.id="GPname_ID"+t.id,e.className="GPlayerName",e.title=t.description||t.title,e.innerHTML=t.title,e},_createBasicToolVisibilityElement:function(t){var e=[],i=t.visibility,n="GPvisibility_ID"+t.id,o=document.createElement("input");o.id=n,o.type="checkbox",o.checked=i;var s=document.createElement("label");s.htmlFor=n,s.id="GPvisibilityPicto_ID"+t.id,s.className="GPlayerVisibility",s.title="Afficher/masquer la couche";var r=this;return o.addEventListener?o.addEventListener("click",function(t){r._onVisibilityLayerClick.call(r,t)}):o.attachEvent&&o.attachEvent("onclick",function(t){r._onVisibilityLayerClick.call(r,t)}),e.push(o),e.push(s),e},_createAdvancedToolShowElement:function(t){var e=[],i=document.createElement("label");i.id="GPshowAdvancedToolsPicto_ID"+t.id,i.htmlFor="GPshowAdvancedTools_ID"+t.id,i.title="Plus d'outils",i.className="GPshowMoreOptions GPshowLayerAdvancedTools";var n=document.createElement("input");return n.type="checkbox",n.id="GPshowAdvancedTools_ID"+t.id,e.push(n),e.push(i),e},_createAdvancedToolElement:function(t){var e=document.createElement("div");if(e.id="GPadvancedTools_ID"+t.id,e.className="GPlayerAdvancedTools",e.appendChild(this._createAdvancedToolDeleteElement(t)),t.title&&t.description&&e.appendChild(this._createAdvancedToolInformationElement(t)),"feature"!==t.type)for(var i=this._createAdvancedToolOpacityElement(t),n=0;n<i.length;n++)e.appendChild(i[n]);return e},_createAdvancedToolDeleteElement:function(t){var e=document.createElement("div");e.id="GPremove_ID"+t.id,e.className="GPlayerRemove",e.title="Supprimer la couche",e.layerId=t.id;var i=this;return e.addEventListener?e.addEventListener("click",function(t){i._onDropLayerClick.call(i,t)}):e.attachEvent&&e.attachEvent("onclick",function(t){i._onDropLayerClick.call(i,t)}),e},_createAdvancedToolInformationElement:function(t){var e=document.createElement("div");e.id="GPinfo_ID"+t.id,e.className="GPlayerInfo",e.title="Informations/légende",e.layerId=t.id;var i=this;return e.addEventListener?e.addEventListener("click",function(t){i._onOpenLayerInfoClick.call(i,t)}):e.attachEvent&&e.attachEvent("onclick",function(t){i._onOpenLayerInfoClick.call(i,t)}),e},_createAdvancedToolOpacityElement:function(t){var e=[],i=document.createElement("div");i.id="GPopacity_ID"+t.id,i.className="GPlayerOpacity",i.title="Opacité";var n=Math.round(100*t.opacity),o=document.createElement("input");o.id="GPopacityValueDiv_ID"+t.id,o.type="range",o.value=n;var s=this;o.addEventListener?o.addEventListener("change",function(t){s._onChangeLayerOpacity.call(s,t)}):o.attachEvent&&o.attachEvent("onchange",function(t){s._onChangeLayerOpacity.call(s,t)}),o.addEventListener?o.addEventListener("input",function(t){s._onChangeLayerOpacity.call(s,t)}):o.attachEvent&&o.attachEvent("oninput",function(t){s._onChangeLayerOpacity.call(s,t)}),i.appendChild(o);var r=document.createElement("div");r.id="GPopacityValueDiv_ID"+t.id,r.className="GPlayerOpacityValue";var a=document.createElement("span");return a.id="GPopacityValue_ID"+t.id,a.innerHTML=n+"%",r.appendChild(a),e.push(i),e.push(r),e},_createContainerLayerInfoElement:function(t){var e=document.createElement("div");e.id="GPlayerInfoContent";var i=document.createElement("div");if(i.id="GPlayerInfoTitle",i.innerHTML=t.title,e.appendChild(i),t.quicklookUrl){var n=document.createElement("div");n.id="GPlayerInfoQuicklook",n.title="Afficher un aperçu de la couche";var o=document.createElement("a");o.href=t.quicklookUrl,o.appendChild(n),e.appendChild(o)}var s=document.createElement("div");s.id="GPlayerInfoClose",s.title="Fermer la fenêtre";var r=function(){document.getElementById("GPlayerInfoPanel").className="GPlayerInfoPanelClosed";for(var t=document.getElementsByClassName("GPlayerInfoOpened"),e=0;e<t.length;e++)t[e].className="GPlayerInfo"};s.addEventListener?s.addEventListener("click",r):s.attachEvent&&s.attachEvent("onclick",r),e.appendChild(s);var a=document.createElement("div");if(a.id="GPlayerInfoDescription",a.innerHTML=t.description,e.appendChild(a),t.metadata){var l=document.createElement("div");l.id="GPlayerInfoMetadata";var c=document.createElement("div");c.className="GPlayerInfoSubtitle",c.innerHTML="Métadonnées",l.appendChild(c);for(var h=0;h<t.metadata.length;h++){var u=t.metadata[h].url,d=document.createElement("div");d.className="GPlayerInfoLink";var p=document.createElement("a");p.href=u,p.innerHTML=u,d.appendChild(p),l.appendChild(d)}0!==t.metadata.length&&e.appendChild(l)}if(t.legends){var m=document.createElement("div");m.id="GPlayerInfoLegend";var f=document.createElement("div");f.className="GPlayerInfoSubtitle",f.innerHTML="Légende",m.appendChild(f);for(var _={},g=t.maxScaleDenominator||56e7,v=0;v<t.legends.length;v++){var y=t.legends[v].minScaleDenominator;if(y){var E=y.toString();y=Math.round(parseInt(E.substring(0,3),10)/10)*Math.pow(10,E.length-2)}else y=270;_[y]=t.legends[v]}for(var P in _)if(_.hasOwnProperty(P)){var C=_[P].url;if("string"==typeof C&&C.toLowerCase().indexOf("nolegend.jpg")==-1){var S=document.createElement("div");S.className="GPlayerInfoLink",g=_[P].maxScaleDenominator||g;var M=document.createElement("a");M.href=C,M.innerHTML="Du 1/"+P+" au 1/"+g,S.appendChild(M),m.appendChild(S)}else delete _[P]}0!==Object.keys(_).length&&e.appendChild(m)}return e}};return e}(sortable),LeafletControlsLayerSwitcher=function(t,e,i){var n=t.Control.Layers.extend({includes:i,options:{collapsed:!0,position:"topright",autoZIndex:!0,layers:[]},initialize:function(e){if(t.Util.setOptions(this,e),this._hasLayersConfig=!(!this.options.layers||0===Object.keys(this.options.layers).length),this._layersConfig=this._hasLayersConfig?this.options.layers:[],this._layers={},this._lastZIndex=0,this._hasLayersConfig)for(var i=0;i<this._layersConfig.length;i++){var n=this._layersConfig[i];this._addLayer(n.layer,null,!0)}},onAdd:function(t){var e=t._layers;if(0!==Object.keys(e).length){var i=Object.keys(e);this._lastZIndex=0;for(var n=0;n<i.length;n++){var o=i[n];this.options.autoZIndex&&e[o].setZIndex&&(this._lastZIndex++,e[o].setZIndex(this._lastZIndex)),this._hasLayersConfig&&this._layers[o]||this.addOverlay(e[o])}}if(0===Object.keys(e).length){var s=this._layersConfig;this._lastZIndex=0;for(var r=0;r<s.length;r++){var a=s[r].layer;t.hasLayer(a)||(t.addLayer(a),this.addOverlay(a,null),this.options.autoZIndex&&a.setZIndex&&(this._lastZIndex++,a.setZIndex(this._lastZIndex)))}}for(var l in this._layers)if(this._layers.hasOwnProperty(l)){var c=this._layers[l];c.visibility||this._visibilityLayer(!c.visibility,c.layer)}return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this),t.on("layerremove",this._onLayerChange,this),this._container},_addLayer:function(e,i,n){var o=e._geoportal_id?e._geoportal_id:e._leaflet_id;if(o){var s={};for(var r in this._layersConfig)if(this._layersConfig.hasOwnProperty(r)&&o===t.stamp(this._layersConfig[r].layer)){s=this._layersConfig[r].config;var a="undefined"==typeof this._layersConfig[r].display||this._layersConfig[r].display;if(!a)return;break}this._layers[o]={layer:e,id:o,overlay:n,title:e._geoportal_id&&e._title?e._title:i?i:o,description:e._geoportal_id&&e._description?e._description:i?i:o,visibility:!e._geoportal_id||e.getVisible(),legends:e._geoportal_id?e._legends:null,metadata:e._geoportal_id?e._metadata:null,quicklookUrl:e._geoportal_id?e._quicklookUrl:null},s&&Object.keys(s)&&t.Util.extend(this._layers[o],s),e._geoportal_id?e.setVisible(this._layers[o].visibility):null}},_initLayout:function(){var e=this._container=this._createMainContainerElement(),i=this._createMainLayersShowElement();e.appendChild(i),this.options.collapsed||(i.checked="checked");var n=this._overlaysList=this._createMainLayersElement();e.appendChild(n);var o=this._createMainPictoElement();e.appendChild(o);var s=this._createMainInfoElement();switch(e.appendChild(s),this._createDraggableElement(this._overlaysList,this),t.DomEvent.disableClickPropagation(e).disableScrollPropagation(e),this._map.on("moveend",this._onOutOfRangeLayerZoom,this),this.getPosition()){case"topright":e.style.position="relative",e.style.top="0",e.style.right="0";break;case"topleft":e.style.position="relative",e.style.top="0",e.style.right="initial",o.style.float="left",n.style.borderBottomRightRadius="5px",n.style.borderBottomLeftRadius="0",s.style.right="initial",s.style.left="190px";break;case"bottomleft":e.style.position="relative",e.style.top="0",e.style.right="initial",o.style.float="left",n.style.borderBottomRightRadius="5px",n.style.borderBottomLeftRadius="0",s.style.right="initial",s.style.left="190px";break;case"bottomright":e.style.position="relative",e.style.top="0",e.style.right="0";break;default:e.style.position="relative",e.style.top="0",e.style.right="0"}},_update:function(){if(this._container){this._overlaysList.innerHTML="";var t=[];for(var e in this._layers)this._layers.hasOwnProperty(e)&&t.push(e);for(var i=t.sort(function(t,e){var i=parseInt(t,10),n=parseInt(e,10);return i-n}).reverse(),n=0;n<i.length;n++){var o=i[n],s=this._layers[o];this._addItem(s)}}},_addItem:function(e){e.opacity=e.layer.options.opacity;var i=this._createContainerLayerElement(e);return e.layer.options.minZoom>this._map.getZoom()||e.layer.options.maxZoom<this._map.getZoom()?t.DomUtil.addClass(i,"outOfRange"):t.DomUtil.removeClass(i,"outOfRange"),this._overlaysList.appendChild(i),i},_onLayerChange:function(e){var i=this._layers[t.stamp(e.layer)];if(i){this._handlingClick||this._update();var n="layeradd"===e.type?"overlayadd":"overlayremove";n&&this._map.fire(n,i)}},removeLayer:function(e){var i=t.stamp(e);return delete this._layers[i],this._update(),this},_visibilityLayer:function(t,e){if(this._handlingClick=!0,e._geoportal_id){var i=!e.getVisible();e.setVisible(i)}t&&this._map.hasLayer(e)?this._map.removeLayer(e):t||this._map.hasLayer(e)||this._map.addLayer(e),this._handlingClick=!1,this._refocusOnMap()},_onOutOfRangeLayerZoom:function(){var e=this._map,i=this._layers;for(var n in i)if(i.hasOwnProperty(n)){var o=i[n].layer,s=i[n].id,r=t.DomUtil.get("GPlayerSwitcher_ID"+s);o.options.minZoom>e.getZoom()||o.options.maxZoom<e.getZoom()?t.DomUtil.addClass(r,"outOfRange"):t.DomUtil.removeClass(r,"outOfRange")}},_onVisibilityLayerClick:function(e){var i=e.target.id,n=i.substring(i.indexOf("_")+3),o=t.DomUtil.get(i);this._layers[n].visibility=o.checked,this._visibilityLayer(!o.checked,this._layers[n].layer)},_onDropLayerClick:function(t){var e=t.target.id,i=e.substring(e.indexOf("_")+3),n=this._layers[i].layer;this.removeLayer(n),this._map.hasLayer(n)&&this._map.removeLayer(n)},_onChangeLayerOpacity:function(e){var i=e.target.id,n=i.substring(i.indexOf("_")+3),o=this._layers[n].layer,s=e.target.value,r=t.DomUtil.get("GPopacityValue_ID"+n);r.innerHTML=s+"%",this._map.hasLayer(o)&&o.setOpacity(s/100)},_onOpenLayerInfoClick:function(e){var i=e.target.id,n=i.substring(i.indexOf("_")+3),o=this._layers[n],s=t.DomUtil.get(e.target.id),r=null,a=null;if("GPlayerInfoOpened"===s.className)return t.DomUtil.removeClass(s,"GPlayerInfoOpened"),t.DomUtil.addClass(s,"GPlayerInfo"),r=t.DomUtil.get("GPlayerInfoPanel"),t.DomUtil.removeClass(r,"GPpanel"),t.DomUtil.removeClass(r,"GPlayerInfoPanelOpened"),t.DomUtil.addClass(r,"GPlayerInfoPanelClosed"),a=t.DomUtil.get("GPlayerInfoContent"),void r.removeChild(a);for(var l=document.getElementsByClassName("GPlayerInfoOpened"),c=0;c<l.length;c++)l[c].className="GPlayerInfo";t.DomUtil.removeClass(s,"GPlayerInfo"),t.DomUtil.addClass(s,"GPlayerInfoOpened"),r=t.DomUtil.get("GPlayerInfoPanel"),t.DomUtil.addClass(r,"GPpanel"),t.DomUtil.removeClass(r,"GPlayerInfoPanelClosed"),t.DomUtil.addClass(r,"GPlayerInfoPanelOpened"),a=t.DomUtil.get("GPlayerInfoContent"),a&&r.removeChild(a);var h=this._createContainerLayerInfoElement(o);r.appendChild(h)},_onDragAndDropLayerClick:function(t){var e=t.item.id,i=e.substring(e.indexOf("_")+3),n=(this._layers[i].layer,document.querySelectorAll("div.GPlayerSwitcher_layer"));this._lastZIndex=n.length;for(var o=0;o<n.length;o++){var s=n[o].id,r=s.substring(s.indexOf("_")+3),a=this._layers[r].layer;this.options.autoZIndex&&a.setZIndex&&(this._lastZIndex--,a.setZIndex(this._lastZIndex))}},addLayer:function(e,i){var n=this._map,o=this._layersConfig;if(!e)return void console.log("[ERROR] LayerSwitcher:addLayer - missing layer parameter !");n.hasLayer(e)||console.log("[WARN] LayerSwitcher:addLayer - layer has not been added on map !");var s=t.stamp(e);for(var r in o)if(o.hasOwnProperty(r)&&s===t.stamp(o[r].layer)){delete o[r];break}var a=i||{};t.Util.extend(a,{layer:e}),o.push(a),e.setZIndex(this._lastZIndex++),this.addOverlay(e),this._update()}});return n}(leaflet,{},CommonControlsLayerSwitcherDOM),CommonUtilsConfig=function(){var t={configuration:null,isConfigLoaded:function(){var t="undefined"!=typeof window?window:{};return!(!t.Gp||!t.Gp.Config||0===Object.keys(t.Gp.Config).length)&&(this.configuration=t.Gp.Config,!0)},getLayerId:function(t,e){var i=null;if(this.configuration){var n=this.configuration.layers;for(var o in n)if(n.hasOwnProperty(o)){var s=o.split("$");if(t===s[0]&&s[1]){var r=s[1].split(":"),a=s[1].split(";");if(a[1]===e){i=o;break}if(r[2]===e){i=o;break}}}}return i||console.log("ERROR layer id ("+t+" / "+e+") was not found !?"),i},getLayerParams:function(t,e,i){var n={};if(this.configuration){var o=this.getLayerId(t,e);if(o){var s=this.configuration.layers[o],r=s.apiKeys[0];if(i&&i!==r)return void console.log("ERROR different keys ("+i+" !== "+r+") !?");i=i||r,n.key=i,n.url=s.getServerUrl(i),n.version=s.getServiceParams().version,n.styles=s.getDefaultStyle(),n.format=s.getDefaultFormat(),n.projection=s.getDefaultProjection(),n.minScale=s.getMinScaleDenominator(),n.maxScale=s.getMaxScaleDenominator(),n.extent=s.getBBOX(),n.legends=s.getLegends(),n.metadata=s.getMetadata(),n.originators=s.getOriginators(),n.title=s.getTitle(),n.description=s.getDescription(),n.quicklookUrl=s.getQuicklookUrl(),s.wmtsOptions&&(n.tileMatrixSetLimits=s.wmtsOptions.tileMatrixSetLimits);var a=s.getTMSID();if(a){n.TMSLink=a;var l=this.configuration.getTMSConf(a);n.matrixOrigin=l.getTopLeftCorner(),n.nativeResolutions=l.nativeResolutions,n.matrixIds=l.matrixIds,n.tileMatrices=l.tileMatrices}}}return n},getServiceParams:function(t,e,i){var n={};if(this.configuration){var o=this.getLayerId(t,e);if(o){var s=this.configuration.layers[o],r=s.apiKeys[0];if(i&&i!==r)return;i=i||r,n.key=i,n.url=s.getServerUrl(i),n.version=s.getServiceParams().version,n.extent=s.getBBOX(),n.title=s.getTitle(),n.description=s.getDescription()}}return n},getResolutions:function(){var t=[];return this.configuration&&(t=this.configuration.generalOptions.wgs84Resolutions),t},getTileMatrix:function(t){var e={};return this.configuration&&t&&(e=this.configuration.tileMatrixSets[t.toUpperCase()]),e},getGlobalConstraints:function(t){var e={};if(t){var i=this.configuration.layers[t];e.projection=i.getDefaultProjection(),e.minScale=i.getMinScaleDenominator(),e.maxScale=i.getMaxScaleDenominator(),e.extent=i.getBBOX()}return e}};return t}(),CommonUtilsCheckRightManagement=function(t,e){return{check:function(t){if(t){var i=t.key,n=t.resources||[],o=t.services||[];if(n&&0!==n.length&&o&&0!==o.length){var s={};if(!i){if(!e.isConfigLoaded())return void console.log("WARNING : parameter 'apiKey' has not been parametered, and the contract key configuration has not been loaded, so impossible to check yours rights !");i=Object.keys(e.configuration.generalOptions.apiKeys)[0]}if(i){if(e.isConfigLoaded()){for(var r=0;r<n.length;r++)for(var a=n[r],l=0;l<o.length;l++){var c=o[l],h=e.getServiceParams(a,c,i);h&&0!==Object.keys(h).length?(s[c]||(s[c]=[]),s[c].push(a)):console.log("WARNING : contract key configuration has no rights to load this geoportal resource ("+a+") for this service ("+c+") ")}return s&&0!==Object.keys(s).length?(s.key=i,s):void console.log("WARNING : the contract key configuration has been loaded, and the parameter 'apiKey' has been parametered, but, there is a problem on the mapping between the contract and the key !")}console.log("WARNING : the contract key configuration has not been loaded, so be carefull !");for(var u={},d=0;d<o.length;d++){var p=o[d];u[p]=[];for(var m=0;m<n.length;m++){var f=n[m];u[p].push(f)}}return u.key=i,u}}}}}}({},CommonUtilsConfig),CommonUtilsSelectorID=function(){var t={generate:function(){var t=Math.floor(Date.now());return function(){return t++}}(),name:function(t){var e=null,i=t.indexOf("-");return e=i===-1?t:t.substring(0,i)},index:function(t){var e=null,i=this.name(t);if(i!==t){var n=i.indexOf("_");n!==-1&&(e=i.substring(n+1))}return e},uuid:function(t){var e=null,i=t.indexOf("-");return i!==-1&&(e=parseInt(t.substring(i+1),10)),e}};return t}(),CommonControlsLocationSelectorDOM=function(t){var e={_addUID:function(t){return t+"-"+this._uid},_createMainContainerElement:function(){var t=document.createElement("div");return t.className=this._addUID("GPlocationPoint"),t.className+=" GPwidget",t},_createLocationPointElement:function(t,e){var i=document.createElement("div");return i.id=this._addUID("GPlocationPoint_"+t),i.className=e?"GPflexInput GPlocationStageFlexInput":"GPflexInput GPlocationStageFlexInputHidden",i.style.cssText="",i},_createLocationPointLabelElement:function(e,i){var n=this,o=document.createElement("label");return o.id=this._addUID("GPlocationOriginLabel_"+e),o.htmlFor="GPlocationOrigin_"+e,o.innerHTML=i,o.addEventListener("click",function(e){for(var i=t.index(this.id),o=document.getElementsByClassName(n._addUID("GPlocationPoint")),s=0;s<o.length;s++){var r=o[s].childNodes[0].id,a=t.index(r);document.getElementById(n._addUID("GPlocationPoint_"+a)).style.cssText=""}document.getElementById(n._addUID("GPlocationOriginCoords_"+i)).value="",document.getElementById(n._addUID("GPlocationOrigin_"+i)).value="",document.getElementById(n._addUID("GPlocationPoint_"+i)).style.cssText="",document.getElementById(n._addUID("GPlocationOriginPointer_"+i)).checked=!1,document.getElementById(n._addUID("GPlocationOrigin_"+i)).className="GPlocationOriginVisible",document.getElementById(n._addUID("GPlocationOriginCoords_"+i)).className="GPlocationOriginHidden",document.getElementById(n._addUID("GPlocationStageRemove_"+i))&&(document.getElementById(n._addUID("GPlocationStageRemove_"+i)).className="GPlocationStageRemove"),document.getElementById(n._addUID("GPlocationStageAdd"))&&(document.getElementById(n._addUID("GPlocationStageAdd")).className=""),n.onLocationClearPointClick(e)}),o},_createLocationAutoCompleteteInputElement:function(e){var i=this,n=document.createElement("input");return n.id=this._addUID("GPlocationOrigin_"+e),n.className="GPlocationOriginVisible",n.type="text",n.placeholder="Saisir une adresse",n.autocomplete="off",n.addEventListener("keyup",function(e){var n=e.which||e.keyCode;if(13!==n&&10!==n&&38!==n&&40!==n){
-var o=t.index(this.id);document.getElementById(i._addUID("GPlocationOrigin_"+o)).value.length>2?document.getElementById(i._addUID("GPlocationAutoCompleteList_"+o)).style.display="block":document.getElementById(i._addUID("GPlocationAutoCompleteList_"+o)).style.display="none",i.onAutoCompleteSearchText(e)}}),n.addEventListener("keydown",function(n){var o=n.which||n.keyCode,s=document.getElementById(i._addUID("GPlocationAutoCompleteList_"+e));if(s){var r=s.getElementsByClassName("GPautoCompleteProposal current"),a=s.getElementsByClassName("GPautoCompleteProposal"),l=a.length;if(l){var c=null;if(!r.length)return c=a[0],c.className="GPautoCompleteProposal current",c.style.color="#000000",void(c.style["background-color"]="#CEDBEF");c=r[0];var h=parseInt(t.index(c.id),10),u=h===l-1?a[0]:a[h+1],d=0===h?a[l-1]:a[h-1];switch(c.style["background-color"]="",c.style.color="",d.style["background-color"]="",d.style.color="",u.style["background-color"]="",u.style.color="",o){case 38:console.log("arrow up"),c.className="GPautoCompleteProposal",d.className="GPautoCompleteProposal current",d.style.color="#000000",d.style["background-color"]="#CEDBEF";break;case 40:console.log("arrow down"),c.className="GPautoCompleteProposal",u.className="GPautoCompleteProposal current",u.style.color="#000000",u.style["background-color"]="#CEDBEF";break;case 13:console.log("enter"),c.click(n)}c.focus()}}}),n},_createLocationCoordinateInputElement:function(e){var i=this,n=document.createElement("input");return n.id=this._addUID("GPlocationOriginCoords_"+e),n.className="GPlocationOriginHidden",n.type="text",n.disabled=!1,n.addEventListener("click",function(){var e=t.index(this.id);document.getElementById(i._addUID("GPlocationOriginLabel_"+e)).click()}),n},_createLocationPointerShowInputElement:function(t){var e=document.createElement("input");return e.id=this._addUID("GPlocationOriginPointer_"+t),e.type="checkbox",e},_createLocationPointerInputElement:function(e){var i=this,n=document.createElement("label");return n.id=this._addUID("GPlocationOriginPointerImg_"+e),n.htmlFor="GPlocationOriginPointer_"+e,n.className="GPlocationOriginPointerImg",n.title="Pointer un lieu sur la carte",n.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation();var n,o,s,r=t.index(this.id),a=document.getElementsByClassName(i._addUID("GPlocationPoint"));for(n=0;n<a.length;n++)o=a[n].childNodes[0].id,s=t.index(o),r!=s&&(document.getElementById(i._addUID("GPlocationOriginPointer_"+s)).checked=!1,"Pointer un lieu sur la carte"==document.getElementById(i._addUID("GPlocationOriginCoords_"+s)).value&&(document.getElementById(i._addUID("GPlocationOriginCoords_"+s)).value="",document.getElementById(i._addUID("GPlocationOrigin_"+s)).className="GPlocationOriginVisible",document.getElementById(i._addUID("GPlocationOriginCoords_"+s)).className="GPlocationOriginHidden"));if(document.getElementById(i._addUID("GPlocationOriginPointer_"+r)).checked){for(document.getElementById(i._addUID("GPlocationOriginCoords_"+r)).value="",n=0;n<a.length;n++)o=a[n].childNodes[0].id,s=t.index(o),document.getElementById(i._addUID("GPlocationPoint_"+s)).style.cssText="";document.getElementById(i._addUID("GPlocationStageRemove_"+r))&&(document.getElementById(i._addUID("GPlocationStageRemove_"+r)).className="GPlocationStageRemove"),document.getElementById(i._addUID("GPlocationStageAdd"))&&(document.getElementById(i._addUID("GPlocationStageAdd")).className=""),document.getElementById(i._addUID("GPlocationOriginPointer_"+r)).checked=!1,document.getElementById(i._addUID("GPlocationOrigin_"+r)).className="GPlocationOriginVisible",document.getElementById(i._addUID("GPlocationOriginCoords_"+r)).className="GPlocationOriginHidden"}else{for(document.getElementById(i._addUID("GPlocationOriginCoords_"+r)).value="Pointer un lieu sur la carte",n=0;n<a.length;n++)o=a[n].childNodes[0].id,s=t.index(o),r==s?document.getElementById(i._addUID("GPlocationPoint_"+s)).style.cssText="":document.getElementById(i._addUID("GPlocationPoint_"+s)).style.display="none";document.getElementById(i._addUID("GPlocationStageRemove_"+r))&&(document.getElementById(i._addUID("GPlocationStageRemove_"+r)).className="GPlocationOriginHidden"),document.getElementById(i._addUID("GPlocationStageAdd"))&&(document.getElementById(i._addUID("GPlocationStageAdd")).className="GPlocationOriginHidden"),document.getElementById(i._addUID("GPlocationOriginPointer_"+r)).checked=!0,document.getElementById(i._addUID("GPlocationOrigin_"+r)).className="GPlocationOriginHidden",document.getElementById(i._addUID("GPlocationOriginCoords_"+r)).className="GPlocationOriginVisible",document.getElementById(i._addUID("GPlocationOriginCoords_"+r)).disabled=!0}i.onActivateMapPointClick(e)}),n},_createLocationRemovePointElement:function(e){var i=this,n=document.createElement("div");return n.id=this._addUID("GPlocationStageRemove_"+e),n.className="GPlocationStageRemove",n.title="Supprimer l'étape",n.addEventListener("click",function(n){var o=document.getElementsByClassName(i._addUID("GPlocationPoint")),s=o.length-1,r=o[0].childNodes[0].id,a=o[s].childNodes[0].id,l=t.index(r),c=t.index(a);if(e!=l&&e!=c){var h=t.index(this.id);document.getElementById(i._addUID("GPlocationPoint_"+h)).className="GPflexInput GPlocationStageFlexInputHidden",document.getElementById(i._addUID("GPlocationOrigin_"+h)).value="",document.getElementById(i._addUID("GPlocationOrigin_"+h)).className="GPlocationOriginVisible",document.getElementById(i._addUID("GPlocationOriginCoords_"+h)).value="",document.getElementById(i._addUID("GPlocationOriginCoords_"+h)).className="GPlocationOriginHidden",document.getElementById(i._addUID("GPlocationStageAdd")).style.display="",i.onLocationRemovePointClick(n)}}),n},_createLocationAddPointElement:function(){var e=this,i=document.createElement("div");return i.id=this._addUID("GPlocationStageAdd"),i.title="Ajouter une étape",i.addEventListener("click",function(i){for(var n=1,o=0,s=document.getElementsByClassName(e._addUID("GPlocationPoint")),r=1;r<s.length-1;r++){var a=s[r].childNodes[0].id,l=t.index(a);document.getElementById(e._addUID("GPlocationPoint_"+l))&&("GPflexInput GPlocationStageFlexInputHidden"==document.getElementById(e._addUID("GPlocationPoint_"+l)).className?1==n&&(n=l):o++)}n<s.length&&(document.getElementById(e._addUID("GPlocationPoint_"+n)).className="GPflexInput GPlocationStageFlexInput"),4==o&&(document.getElementById(e._addUID("GPlocationStageAdd")).style.display="none"),e.onLocationAddPointClick(i)}),i},_createLocationAutoCompleteResultElement:function(t){var e=this,i=document.createElement("div");return i.id=this._addUID("GPlocationAutoCompleteList_"+t),i.className="GPadvancedAutoCompleteList",i.addEventListener?i.addEventListener("click",function(i){e.onAutoCompletedResultsItemClick(i),document.getElementById(e._addUID("GPlocationAutoCompleteList_"+t)).style.display="none"},!1):i.attachEvent&&i.attachEvent("onclick",function(i){e.onAutoCompletedResultsItemClick(i),document.getElementById(e._addUID("GPlocationAutoCompleteList_"+t)).style.display="none"}),i},_createLocationAutoCompletedLocationElement:function(t,e,i){var n=document.getElementById(this._addUID("GPlocationAutoCompleteList_"+t)),o=document.createElement("div");o.id=this._addUID("AutoCompletedLocation_"+i),o.className="GPautoCompleteProposal",o.innerHTML=e.fullText,n.appendChild(o)},GPdisplayCoordinate:function(e){for(var i=document.getElementsByClassName(this._addUID("GPlocationPoint")),n=0;n<i.length;n++){var o=i[n].childNodes[0].id,s=t.index(o);if(document.getElementById(this._addUID("GPlocationOriginPointer_"+s)).checked){document.getElementById(this._addUID("GPlocationOriginCoords_"+s)).value=e,document.getElementById(this._addUID("GPlocationOriginCoords_"+s)).disabled=!1;for(var r=0;r<i.length;r++){o=i[r].childNodes[0].id;var a=t.index(o);document.getElementById(this._addUID("GPlocationPoint_"+a)).style.cssText="",document.getElementById(this._addUID("GPlocationStageRemove_"+a))&&(document.getElementById(this._addUID("GPlocationStageRemove_"+a)).className="GPlocationStageRemove")}return document.getElementById(this._addUID("GPlocationOriginPointer_"+s)).checked=!1,void(document.getElementById(this._addUID("GPlocationStageAdd"))&&(document.getElementById(this._addUID("GPlocationStageAdd")).className=""))}}}};return e}(CommonUtilsSelectorID),LeafletControlsUtilsPositionFormater=function(){var t={NORTH:"N",SOUTH:"S",EAST:"E",WEST:"W",digitSecond:2,digitDecimal:5,digitRadian:8,roundToDecimal:function(t,e){var i=Math.pow(10,e);return Math.round(t*i)/i},decimalToRadian:function(t){var e=.017453292519943295;return this.roundToDecimal(t*e,this.digitRadian)},decimalToGrade:function(t){var e=1.1111111111111112;return this.roundToDecimal(t*e,this.digitRadian)},decimalToDMS:function(t,e){t<0&&(t*=-1);var i=Math.floor(t),n=60*(t-i),o=Math.floor(n),s=60*(n-o),r=this.roundToDecimal(s,this.digitSecond),a=i+"° "+o+"' "+r+'" ';return e&&(a+=e),a},decimalLatToDMS:function(t){var e=t<0?this.SOUTH:this.NORTH;return this.decimalToDMS(t,e)},decimalLongToDMS:function(t){var e=t<0?this.WEST:this.EAST;return this.decimalToDMS(t,e)},DMSToDecimal:function(t,e,i,n){var o=t+e/60+i/3600;o=n==this.SOUTH||n==this.WEST?o*-1:o;var s=this.roundToDecimal(o,this.digitDecimal);return s}};return t}(),LeafletControlsUtilsIconDefault=function(t){var e=t.Icon.Default.extend({images:{shadow:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=",color:{blue:"data:image/png;base64,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",orange:"data:image/png;base64,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",red:"data:image/png;base64,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",green:"data:image/png;base64,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"}},initialize:function(e,i){switch(t.Util.extend(this.options,i),e){case"red":this.options.iconUrl=this.images.color.red;break;case"green":this.options.iconUrl=this.images.color.green;break;case"orange":this.options.iconUrl=this.images.color.orange;break;case"blue":this.options.iconUrl=this.images.color.blue;break;default:this.options.iconUrl=this.images.color.blue}this.options.shadowUrl=this.images.shadow}});return e}(leaflet),LeafletControlsLocationSelector=function(t,e,i,n,o,s,r,a){var l=t.Control.extend({includes:s,options:{position:"topleft",tag:{id:0,unique:null,label:">",color:"blue",display:!0,addOption:!1,removeOption:!1},disableReverse:!1,displayInfo:!0,autocompleteOptions:{},reverseGeocodeOptions:{}},initialize:function(e){t.Util.setOptions(this,e),this._uid=this.options.tag.unique||null,this._activeDragAndDrop=!1,this._pressedKeyOnDragAndDrop=!1,this._map=null,this._inputsContainer=null,this._inputLabelContainer=null,this._inputAutoCompleteContainer=null,this._inputShowPointerContainer=null,this._inputCoordinateContainer=null,this._coordinate=null,this._suggestedContainer=null,this._suggestedLocations=[],this._currentLocation=null,this._marker=null,this._resources={},this._noRightManagement=!1,this._checkRightsManagement(),this._container=this._uid?this._initLayout():null},onAdd:function(){this._uid=o.generate();var e=this._initLayout();return t.DomEvent.disableClickPropagation(e).disableScrollPropagation(e),e},onRemove:function(){},getCoordinate:function(){return this._coordinate},getCoordinateInverse:function(){if(this._coordinate){var t={x:this._coordinate.y,y:this._coordinate.x};return t}},setMap:function(t){this._map||(this._map=t)},clear:function(){this._setCursor(),this._setMarker(),this._clearResults(),this._inputLabelContainer.click()},dragging:function(t){this._marker&&(t?this._marker.dragging.enable():this._marker.dragging.disable())},_initLayout:function(){var t=this.options.tag.id,e=this._createMainContainerElement(),i=this._inputsContainer=this._createLocationPointElement(t,this.options.tag.display);e.appendChild(i);var n=this._inputLabelContainer=this._createLocationPointLabelElement(t,this.options.tag.label);i.appendChild(n);var o=this._inputAutoCompleteContainer=this._createLocationAutoCompleteteInputElement(t);i.appendChild(o);var s=this._inputCoordinateContainer=this._createLocationCoordinateInputElement(t);i.appendChild(s);var r=this._inputShowPointerContainer=this._createLocationPointerShowInputElement(t);i.appendChild(r);var a=this._createLocationPointerInputElement(t);if(i.appendChild(a),this.options.tag.addOption){var l=this._createLocationAddPointElement();i.appendChild(l)}if(this.options.tag.removeOption){var c=this._createLocationRemovePointElement(t);i.appendChild(c)}var h=this._suggestedContainer=this._createLocationAutoCompleteResultElement(t);return e.appendChild(h),e},_checkRightsManagement:function(){var t=null,e=[],i=null;i=this.options.reverseGeocodeOptions.apiKey,t=this.options.reverseGeocodeOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=["PositionOfInterest","StreetAddress"]);var o=n.check({key:i||this.options.apiKey,resources:e,services:["ReverseGeocode"]});i=this.options.autocompleteOptions.apiKey,t=this.options.autocompleteOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=["PositionOfInterest","StreetAddress"]);var s=n.check({key:i||this.options.apiKey,resources:e,services:["AutoCompletion"]});o||s||(this._noRightManagement=!0),s&&(this._resources.AutoCompletion={},this._resources.AutoCompletion.resources=s.AutoCompletion,this._resources.AutoCompletion.key=s.key),o&&(this._resources.ReverseGeocode={},this._resources.ReverseGeocode.resources=o.ReverseGeocode,this._resources.ReverseGeocode.key=o.key)},_setLabel:function(t){this._inputAutoCompleteContainer.value=t||""},_setCoordinate:function(t){this._coordinate={x:t.lng,y:t.lat};var e=null,i=null;e=r.roundToDecimal(t.lat,4),i=r.roundToDecimal(t.lng,4);var n=i+" , "+e;this.GPdisplayCoordinate(n)},_setPosition:function(e){var i=this._map;i.panTo(t.latLng(e.y,e.x))},_setMarker:function(e,i,n){if(!this._activeDragAndDrop){var o=this._map;if(null!=this._marker&&(this._marker.off("mousedown",this.onMouseDownMarker,this),this._marker.off("dragstart",this.onStartDragMarker,this),this._marker.off("drag",this.onDragMarker,this),this._marker.off("dragend",this.onEndDragMarker,this),o.removeLayer(this._marker),this._marker=null),e){var s={icon:new a(this.options.tag.color),draggable:!0,clickable:!0,zIndexOffset:1e3};if(this._marker=t.marker(t.latLng(e.y,e.x),s),this._marker.on("mousedown",this.onMouseDownMarker,this),this._marker.on("dragstart",this.onStartDragMarker,this),this._marker.on("drag",this.onDragMarker,this),this._marker.on("dragend",this.onEndDragMarker,this),this._marker.addTo(o),n){var r=null;if("string"!=typeof i)if(i.fields.fullText)r=i.fields.fullText;else{var l=[];l.push(i.fields.street||""),l.push(i.fields.postalCode||""),l.push(i.fields.commune||""),"PositionOfInterest"===i.type&&(l.push(i.fields.poi||""),l.push(i.fields.kind||"")),r=l.join(" - ")}else r=i;this._marker.bindPopup(r)}}}},_setCursor:function(t){var e=this._map.getContainer();t?e.style.cursor=t:e.style.cursor=null},_clearResults:function(){this._currentLocation=null,this._coordinate=null,this._clearSuggestedLocation()},_clearSuggestedLocation:function(){if(this._suggestedLocations=[],this._suggestedContainer)for(;this._suggestedContainer.firstChild;)this._suggestedContainer.removeChild(this._suggestedContainer.firstChild)},_requestAutoComplete:function(e){if(e&&0!==Object.keys(e).length&&e.text){if(this._noRightManagement)return void console.log("no rights for all service !?");if(!this._resources.AutoCompletion)return void console.log("no rights for this service !?");var n=this._resources.AutoCompletion.resources;if(n&&0!==Object.keys(n).length){var o=this._resources.AutoCompletion.key,s={};t.Util.extend(s,this.options.autocompleteOptions),t.Util.extend(s,e),t.Util.extend(s,{apiKey:s.apiKey||this.options.apiKey||o}),i.Services.autoComplete(s)}}},_fillAutoCompletedLocationListContainer:function(t){if(t&&0!==t.length){var e=this._suggestedContainer;if(e.childElementCount)for(;e.firstChild;)e.removeChild(e.firstChild);for(var i=0;i<t.length;i++)this._createLocationAutoCompletedLocationElement(this.options.tag.id,t[i],i);this._suggestedLocations=t}},_requestReverseGeocode:function(e){if(e&&0!==Object.keys(e).length&&e.position&&0!==Object.keys(e.position).length){if(this._noRightManagement)return void console.log("no rights for all service !?");if(!this._resources.ReverseGeocode)return void console.log("no rights for this service !?");var n=this._resources.ReverseGeocode.resources;if(n&&0!==Object.keys(n).length){var o=this._resources.ReverseGeocode.key,s={};t.Util.extend(s,this.options.reverseGeocodeOptions),t.Util.extend(s,e),t.Util.extend(s,{returnFreeForm:!0,filterOptions:{type:["StreetAddress"]}}),t.Util.extend(s,{apiKey:s.apiKey||this.options.apiKey||o}),i.Services.reverseGeocode(s)}}},_displayResultOfCoordinate:function(t){this._setCoordinate(t),this._setMarker({x:t.lng,y:t.lat},null,!1),this.onActivateMapPointClick()},_displayResultOfLabel:function(t){var e=t.placeAttributes,i=e.number+" "+e.street+", "+e.postalCode+" "+e.commune;this._setCoordinate({lat:t.position.x,lng:t.position.y}),this._setLabel(i),this._setMarker({x:t.position.y,y:t.position.x},null,!1),this._inputShowPointerContainer.checked=!1,this._inputAutoCompleteContainer.className="GPlocationOriginVisible",this._inputCoordinateContainer.className="GPlocationOriginHidden",this.onActivateMapPointClick()},onAutoCompleteSearchText:function(t){var e=t.target.value;if(e){if(this._noRightManagement)return void console.log("no rights for this service !?");if(this._currentLocation=e,!(e.length<3)){var i=this;this._requestAutoComplete({text:e,maximumResponses:5,onSuccess:function(t){if(t){var e=t.suggestedLocations;i._fillAutoCompletedLocationListContainer(e)}},onFailure:function(t){i._clearSuggestedLocation()}})}}},onAutoCompletedResultsItemClick:function(t){var e=o.index(t.target.id);if(e){var i={x:this._suggestedLocations[e].position.x,y:this._suggestedLocations[e].position.y},n={type:this._suggestedLocations[e].type,fields:this._suggestedLocations[e]},s=this._suggestedLocations[e].fullText;this._setLabel(s),this._setPosition(i),this._setMarker(i,n,this.options.displayInfo),this._coordinate=i}},onActivateMapPointClick:function(t){var e=this._map;this._inputShowPointerContainer.checked?this._activeDragAndDrop||(e.on("click",this.onMouseMapClick,this),this._setCursor("crosshair"),this._setMarker(),this._clearResults()):this._activeDragAndDrop||(e.off("click",this.onMouseMapClick,this),this._setCursor())},onLocationClearPointClick:function(t){this._setCursor(),this._setMarker(),this._clearResults(),this._inputAutoCompleteContainer.focus()},onLocationRemovePointClick:function(t){this._setCursor(),this._setMarker(),this._clearResults()},onLocationAddPointClick:function(t){},onMouseMapClick:function(t){var e=t.latlng;if(this.options.disableReverse||this._noRightManagement)this._displayResultOfCoordinate(e);else{var i=this;this._requestReverseGeocode({position:{x:e.lat,y:e.lng},srs:"EPSG:4326",onSuccess:function(t){if(0!==t.locations.length){var n=t.locations[0];i._displayResultOfLabel(n)}else i._displayResultOfCoordinate(e)},onFailure:function(t){i._displayResultOfCoordinate(e)}})}},onStartDragMarker:function(){this._marker&&(this._activeDragAndDrop=!0,this._inputShowPointerContainer.checked=!0,this._inputAutoCompleteContainer.className="GPlocationOriginHidden",this._inputCoordinateContainer.className="GPlocationOriginVisible",this._marker.unbindPopup(),this._setLabel(),this._clearResults())},onDragMarker:function(){if(this._marker){this._activeDragAndDrop=!1,this._inputShowPointerContainer.checked=!0;var t=this._marker.getLatLng();this._setCoordinate(t)}},onEndDragMarker:function(){if(this._marker){this._inputShowPointerContainer.checked=!0;var t=this._marker.getLatLng();this._pressedKeyOnDragAndDrop?this._setCoordinate(t):this.onMouseMapClick({latlng:t}),this._activeDragAndDrop=!1,this._pressedKeyOnDragAndDrop=!1}},onMouseDownMarker:function(t){this._marker&&(this._pressedKeyOnDragAndDrop=t.originalEvent.ctrlKey)}});return l}(leaflet,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,CommonControlsLocationSelectorDOM,LeafletControlsUtilsPositionFormater,LeafletControlsUtilsIconDefault),CommonControlsIsoDOM=function(){var t={_addUID:function(t){return t+"-"+this._uid},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPisochron"),t.className="GPwidget",t},_createShowIsoElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowIsochron"),t.type="checkbox",t},_createShowIsoPictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowIsochronPicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowIsochron"),e.title="Calculer une isochrone",e.addEventListener?e.addEventListener("click",function(e){t.onShowIsoPanelClick(e)}):e.attachEvent&&e.attachEvent("onclick",function(e){t.onShowIsoPanelClick(e)});var i=document.createElement("span");return i.id=this._addUID("GPshowIsochronOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createIsoPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPisochronPanel"),t.className="GPpanel",t},_createIsoPanelHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Calcul d'isochrone",e.appendChild(i);var n=document.createElement("div");return n.id=this._addUID("GPisochronPanelClose"),n.className="GPpanelClose",n.title="Fermer le panneau",n.addEventListener?n.addEventListener("click",function(){
-document.getElementById(t._addUID("GPshowIsochronPicto")).click()},!1):n.attachEvent&&n.attachEvent("onclick",function(){document.getElementById(t._addUID("GPshowIsochronPicto")).click()}),e.appendChild(n),e},_createIsoPanelFormElement:function(){var t=this,e=document.createElement("form");return e.id=this._addUID("GPisochronForm"),e.addEventListener("submit",function(e){return e.preventDefault(),t.onIsoComputationSubmit(e),!1}),e},_createIsoWaitingElement:function(){var t=document.createElement("div");t.id=this._addUID("GPisochronCalcWaitingContainer"),t.className="GPisochronCalcWaitingContainerHidden";var e=document.createElement("p");return e.className="GPisochronCalcWaiting",e.innerHTML="Calcul en cours...",t.appendChild(e),t},_createIsoPanelFormTypeChoiceElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPisochronChoice"),t},_createIsoPanelFormTypeChoiceChronElement:function(t){var e=this,i=document.createElement("div");i.className="GPisochronChoiceAlt";var n=document.createElement("input");n.id=this._addUID("GPisochronChoiceAltChron"),n.name="GPisochronChoiceMode",n.type="radio",n.checked=!!t,n.addEventListener?n.addEventListener("change",function(t){document.getElementById(e._addUID("GPisochronValueChron")).className="GPflexInput",document.getElementById(e._addUID("GPisochronValueDist")).className="GPisochronValueHidden",e.onIsoTypeChoiceChange(t)},!1):n.attachEvent&&n.attachEvent("onchange",function(){document.getElementById(e._addUID("GPisochronValueChron")).className="GPflexInput",document.getElementById(e._addUID("GPisochronValueDist")).className="GPisochronValueHidden",e.onIsoTypeChoiceChange()}),n.value="isochron",i.appendChild(n);var o=document.createElement("label");o.className="GPisochronChoiceAltImg",o.htmlFor=this._addUID("GPisochronChoiceAltChron"),i.appendChild(o);var s=document.createElement("span");return s.id=this._addUID("GPisochronChoiceAltChronTxt"),s.innerHTML="isochrone",s.addEventListener?s.addEventListener("click",function(){document.getElementById(e._addUID("GPisochronChoiceAltChron")).click()},!1):s.attachEvent&&s.attachEvent("onclick",function(){document.getElementById(e._addUID("GPisochronChoiceAltChron")).click()}),i.appendChild(s),i},_createIsoPanelFormTypeChoiceDistElement:function(t){var e=this,i=document.createElement("div");i.className="GPisochronChoiceAlt";var n=document.createElement("input");n.id=this._addUID("GPisochronChoiceAltDist"),n.name="GPisochronChoiceMode",n.type="radio",n.checked=!!t,n.addEventListener?n.addEventListener("change",function(t){document.getElementById(e._addUID("GPisochronValueDist")).className="GPflexInput",document.getElementById(e._addUID("GPisochronValueChron")).className="GPisochronValueHidden",e.onIsoTypeChoiceChange(t)},!1):n.attachEvent&&n.attachEvent("onchange",function(){document.getElementById(e._addUID("GPisochronValueDist")).className="GPflexInput",document.getElementById(e._addUID("GPisochronValueChron")).className="GPisochronValueHidden",e.onIsoTypeChoiceChange()}),n.value="isodistance",i.appendChild(n);var o=document.createElement("label");o.className="GPisochronChoiceAltImg",o.htmlFor=this._addUID("GPisochronChoiceAltDist"),i.appendChild(o);var s=document.createElement("span");return s.id=this._addUID("GPisochronChoiceAltDistTxt"),s.innerHTML="isodistance",s.addEventListener?s.addEventListener("click",function(){document.getElementById(e._addUID("GPisochronChoiceAltDist")).click()},!1):s.attachEvent&&s.attachEvent("onclick",function(){document.getElementById(e._addUID("GPisochronChoiceAltDist")).click()}),i.appendChild(s),i},_createIsoPanelFormValueIsochronElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GPisochronValueChron"),i.className=t?"GPflexInput":"GPisochronValueHidden";var n=document.createElement("label");n.id=this._addUID("GPisochronValueChronLabel"),n.htmlFor=this._addUID("GPisochronValueChronInput"),n.innerHTML="Temps",i.appendChild(n);var o=document.createElement("input");o.id=this._addUID("GPisochronValueChronInput1"),o.min="0",o.step="1",o.value="0",o.type="number",o.addEventListener?o.addEventListener("change",function(t){"function"==typeof e.onIsoValueChronTimeMinuteChange&&e.onIsoValueChronTimeHourChange(t)}):o.attachEvent&&o.attachEvent("onchange",function(t){"function"==typeof e.onIsoValueChronTimeMinuteChange&&e.onIsoValueChronTimeHourChange(t)}),i.appendChild(o);var s=document.createElement("label");s.innerHTML="h",i.appendChild(s);var r=document.createElement("input");r.id=this._addUID("GPisochronValueChronInput2"),r.min="0",r.max="59",r.step="1",r.value="0",r.type="number",r.addEventListener?r.addEventListener("change",function(t){"function"==typeof e.onIsoValueChronTimeMinuteChange&&e.onIsoValueChronTimeMinuteChange(t)}):r.attachEvent&&r.attachEvent("onchange",function(t){"function"==typeof e.onIsoValueChronTimeMinuteChange&&e.onIsoValueChronTimeMinuteChange(t)}),i.appendChild(r);var a=document.createElement("label");return a.innerHTML="min",i.appendChild(a),i},_createIsoPanelFormValueIsodistanceElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GPisochronValueDist"),i.className=t?"GPflexInput":"GPisochronValueHidden";var n=document.createElement("label");n.id=this._addUID("GPisochronValueDistLabel"),n.htmlFor=this._addUID("GPisochronValueDistInput"),n.innerHTML="Distance",i.appendChild(n);var o=document.createElement("input");o.id=this._addUID("GPisochronValueDistInput"),o.min="0",o.step="any",o.value="0",o.type="number",o.addEventListener?o.addEventListener("change",function(t){"function"==typeof e.onIsoValueDistChange&&e.onIsoValueDistChange(t)}):o.attachEvent&&o.attachEvent("onchange",function(t){"function"==typeof e.onIsoValueDistChange&&e.onIsoValueDistChange(t)}),i.appendChild(o);var s=document.createElement("label");return s.innerHTML="km",i.appendChild(s),i},_createIsoPanelFormModeChoiceElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPisochronModeChoice"),t},_createIsoPanelFormModeChoiceTransportElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GPisochronTransportChoice");var n=document.createElement("span");n.className="GPisochronModeLabel",n.innerHTML="Mode de transport",i.appendChild(n);for(var o=0;o<t.length;o++){var s=t[o];if("Voiture"===s){var r=document.createElement("input");r.id=this._addUID("GPisochronTransportCar"),r.type="radio",r.name="GPisochronTransport",0===o&&(r.checked=!0),r.addEventListener?r.addEventListener("change",function(t){e.onIsoModeTransportChange(t)}):r.attachEvent&&r.attachEvent("onchange",function(t){e.onIsoModeTransportChange(t)}),r.value="Voiture",i.appendChild(r);var a=document.createElement("label");a.className="GPisochronTransportImg",a.htmlFor=this._addUID("GPisochronTransportCar"),a.title="Voiture",i.appendChild(a)}if("Pieton"===s){var l=document.createElement("input");l.id=this._addUID("GPisochronTransportPedestrian"),l.type="radio",l.name="GPisochronTransport",0===o&&(l.checked=!0),l.addEventListener?l.addEventListener("change",function(t){e.onIsoModeTransportChange(t)}):l.attachEvent&&l.attachEvent("onchange",function(t){e.onIsoModeTransportChange(t)}),l.value="Pieton",i.appendChild(l);var c=document.createElement("label");c.className="GPisochronTransportImg",c.htmlFor=this._addUID("GPisochronTransportPedestrian"),c.title="Piéton",i.appendChild(c)}}return i},_createIsoPanelFormModeChoiceDirectionElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GPisochronDirectionChoice");var n=document.createElement("span");n.className="GPisochronModeLabel",n.innerHTML="Sens de parcours",i.appendChild(n);var o=document.createElement("select");o.id=this._addUID("GPisochronDirectionSelect"),o.className="GPinputSelect",o.addEventListener("change",function(t){e.onIsoModeDirectionChange(t)});for(var s=0;s<t.length;s++){var r=t[s];if("departure"===r.toLowerCase()){var a=document.createElement("option");0===s&&(a.selected="selected"),a.value="departure",a.text="Départ",o.appendChild(a)}if("arrival"===r.toLowerCase()){var l=document.createElement("option");0===s&&(l.selected="selected"),l.value="arrival",l.text="Arrivée",o.appendChild(l)}}return i.appendChild(o),i},_createShowIsoExclusionsElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowIsoExclusions"),t.type="checkbox",t},_createShowIsoExclusionsPictoElement:function(){var t=document.createElement("label");return t.id=this._addUID("GPshowIsoExclusionsPicto"),t.className="GPshowMoreOptions GPshowIsoExclusionsPicto",t.htmlFor=this._addUID("GPshowIsoExclusions"),t.title="Exclusions",t.style.top="240px",t},_createIsoPanelFormExclusionsElement:function(){var t=document.createElement("div");t.id=this._addUID("GPisoExclusions");var e=document.createElement("span");return e.className="GPisoExclusionsLabel",e.innerHTML="Passages autorisés",t.appendChild(e),t},_createIsoPanelFormExclusionOptionsElement:function(t){var e=this,i=document.createElement("div");i.className="GPisoExclusionsOptions";for(var n in t)if(t.hasOwnProperty(n)){var o=t[n];switch(n){case"toll":var s=document.createElement("input");s.id=this._addUID("GPisoExclusionsToll"),s.type="checkbox",s.checked=!o,s.addEventListener?s.addEventListener("change",function(t){e.onIsoExclusionsChange(t)}):s.attachEvent&&s.attachEvent("onchange",function(t){e.onIsoExclusionsChange(t)}),s.value="Toll",i.appendChild(s);var r=document.createElement("label");r.className="GPisoExclusionsOption",r.htmlFor=this._addUID("GPisoExclusionsToll"),r.innerHTML="Péages",i.appendChild(r);break;case"tunnel":var a=document.createElement("input");a.id=this._addUID("GPisoExclusionsTunnel"),a.type="checkbox",a.checked=!o,a.addEventListener?a.addEventListener("change",function(t){e.onIsoExclusionsChange(t)}):a.attachEvent&&a.attachEvent("onchange",function(t){e.onIsoExclusionsChange(t)}),a.value="Tunnel",i.appendChild(a);var l=document.createElement("label");l.className="GPisoExclusionsOption",l.htmlFor=this._addUID("GPisoExclusionsTunnel"),l.innerHTML="Tunnels",i.appendChild(l);break;case"bridge":var c=document.createElement("input");c.id=this._addUID("GPisoExclusionsBridge"),c.type="checkbox",c.checked=!o,c.addEventListener?c.addEventListener("change",function(t){e.onIsoExclusionsChange(t)}):c.attachEvent&&c.attachEvent("onchange",function(t){e.onIsoExclusionsChange(t)}),c.value="Bridge",i.appendChild(c);var h=document.createElement("label");h.className="GPisoExclusionsOption",h.htmlFor=this._addUID("GPisoExclusionsBridge"),h.innerHTML="Ponts",i.appendChild(h)}}return i},_createIsoSubmitFormElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPisochronSubmit"),t.className="GPinputSubmit",t.type="submit",t.value="Calculer",t},_createIsoFormResetElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPisochronReset"),e.title="Réinitialiser les paramètres",e.addEventListener("click",function(e){t.onIsoResetClick(e)}),e}};return t}(),LeafletControlsIsocurve=function(t,e,i,n,o,s,r){var a=t.Control.extend({includes:r,options:{position:"topleft",collapsed:!0,methods:["time","distance"],graphs:["Voiture","Pieton"],exclusions:{toll:!1,tunnel:!1,bridge:!1},directions:["departure","arrival"],disableReverse:!1,isocurveOptions:{},autocompleteOptions:{}},initialize:function(e){t.Util.setOptions(this,e),this._uid=o.generate(),this._isDesktop=this._detectSupport(),this._waitingContainer=null,this._showContainer=null,this._formContainer=null,this._submitContainer=null,this._currentTransport=null,this._currentDirection=null,this._currentComputation=null,this._currentTimeHour=0,this._currentTimeMinute=0,this._currentDistance=0,this._currentExclusions=[],this._initTransport(),this._initComputation(),this._initDirection(),this._initExclusions(),this._currentPoint=null,this._geojsonIso=null,this._waiting=!1,this._timer=null,this._currentIsoResults=null,this._resources={},this._noRightManagement=!1,this._checkRightsManagement()},onAdd:function(e){var i=this._container=this._initLayout(e);return t.DomEvent.disableClickPropagation(i).disableScrollPropagation(i),i},onRemove:function(){},_initTransport:function(){this._currentTransport="Voiture";var e=this.options.graphs;e&&0!==e.length||(this.options.graphs=["Voiture","Pieton"]),t.Util.isArray(e)&&e.length&&("Voiture"!==e[0]&&"Pieton"!==e[0]||(this._currentTransport=e[0]));var i=this.options.isocurveOptions;i.graph&&(this._currentTransport=i.graph)},_initDirection:function(){this._currentDirection="departure";var e=this.options.directions;e&&0!==e.length||(this.options.directions=["departure","arrival"]),t.Util.isArray(e)&&e.length&&("departure"!==e[0]&&"arrival"!==e[0]||(this._currentDirection=e[0]));var i=this.options.isocurveOptions;i.reverse||(this._currentDirection="departure"),i.reverse===!0&&(this._currentDirection="arrival",this.options.directions=["arrival","departure"])},_initComputation:function(){this._currentComputation="time";var e=this.options.methods;e&&0!==e.length||(this.options.methods=["time","distance"]),t.Util.isArray(e)&&e.length&&("time"!==e[0]&&"distance"!==e[0]||(this._currentComputation=e[0]));var i=this.options.isocurveOptions;i.method&&(this._currentComputation=i.method),i.time&&(this._currentComputation="time"),i.distance&&(this._currentComputation="distance")},_initExclusions:function(){this._currentExclusions=[];var t=this.options.exclusions;if((!t||"object"==typeof t&&0===Object.keys(t).length)&&(this.options.exclusions={toll:!1,tunnel:!1,bridge:!1}),t&&"object"==typeof t&&Object.keys(t).length)for(var e in t)t.hasOwnProperty(e)&&t.k&&this._currentExclusions.push(e);var i=this.options.isocurveOptions;Array.isArray(i.exclusions)&&(this._currentExclusions=i.exclusions)},_checkRightsManagement:function(){var t=null,e=[],i=null;i=this.options.isocurveOptions.apiKey,t=this.options.isocurveOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=["Voiture","Pieton"]);var o=n.check({key:i||this.options.apiKey,resources:e,services:["Isochrone"]});i=this.options.autocompleteOptions.apiKey,t=this.options.autocompleteOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=["PositionOfInterest","StreetAddress"]);var s=n.check({key:i||this.options.apiKey,resources:e,services:["AutoCompletion"]});o||s||(this._noRightManagement=!0),s&&(this._resources.AutoCompletion={},this._resources.AutoCompletion.resources=s.AutoCompletion,this._resources.AutoCompletion.key=s.key),o&&(this._resources.Isochrone={},this._resources.Isochrone.resources=o.Isochrone,this._resources.Isochrone.key=o.key)},_detectSupport:function(){var t=!0,e=window.navigator.userAgent.toLowerCase();return e.indexOf("iphone")===-1&&e.indexOf("ipod")===-1&&e.indexOf("ipad")===-1&&e.indexOf("android")===-1&&e.indexOf("mobile")===-1&&e.indexOf("blackberry")===-1&&e.indexOf("tablet")===-1&&e.indexOf("phone")===-1&&e.indexOf("touch")===-1||(t=!1),e.indexOf("msie")===-1&&e.indexOf("trident")===-1||(t=!0),t},_initLayout:function(t){var e=this._createMainContainerElement(),i=this._showContainer=this._createShowIsoElement();e.appendChild(i),this.options.collapsed||(i.checked=!0);var n=this._createShowIsoPictoElement();e.appendChild(n);var o=this._createIsoPanelElement(),s=this._createIsoPanelHeaderElement();o.appendChild(s);var r=this._formContainer=this._createIsoPanelFormElement(),a=this._createIsoPanelFormPointElement(t);r.appendChild(a);for(var l=!1,c=!1,h=this._createIsoPanelFormTypeChoiceElement(),u=0;u<this.options.methods.length;u++)"time"===this.options.methods[u]&&(l=0===u,h.appendChild(this._createIsoPanelFormTypeChoiceChronElement(l))),"distance"===this.options.methods[u]&&(c=0===u,h.appendChild(this._createIsoPanelFormTypeChoiceDistElement(c)));r.appendChild(h),r.appendChild(this._createIsoPanelFormValueIsochronElement(l)),r.appendChild(this._createIsoPanelFormValueIsodistanceElement(c));var d=this._createIsoPanelFormModeChoiceElement();if(d.appendChild(this._createIsoPanelFormModeChoiceTransportElement(this.options.graphs)),d.appendChild(this._createIsoPanelFormModeChoiceDirectionElement(this.options.directions)),r.appendChild(d),this.options.exclusions&&"object"==typeof this.options.exclusions&&0!==Object.keys(this.options.exclusions).length){r.appendChild(this._createShowIsoExclusionsElement()),r.appendChild(this._createShowIsoExclusionsPictoElement());var p=this._createIsoPanelFormExclusionsElement();p.appendChild(this._createIsoPanelFormExclusionOptionsElement(this.options.exclusions)),r.appendChild(p)}var m=this._createIsoFormResetElement();r.appendChild(m);var f=this._submitContainer=this._createIsoSubmitFormElement();r.appendChild(f),o.appendChild(r);var _=this._waitingContainer=this._createIsoWaitingElement();return o.appendChild(_),e.appendChild(o),e},_createIsoPanelFormPointElement:function(t){return this._currentPoint=new s({apiKey:this.options.apiKey||null,tag:{id:0,unique:this._uid,label:"Départ",color:"red",display:!0},displayInfo:!0,disableReverse:this.options.disableReverse,autocompleteOptions:this.options.autocompleteOptions||null}),this._currentPoint.setMap(t),this._currentPoint.getContainer()},onShowIsoPanelClick:function(t){},onIsoResetClick:function(t){this._clear()},onIsoTypeChoiceChange:function(t){var e=t.target.value;e&&("isodistance"===e&&(this._currentComputation="distance"),"isochron"===e&&(this._currentComputation="time"))},onIsoModeTransportChange:function(t){var e=t.target.value;e&&(this._currentTransport=e)},onIsoModeDirectionChange:function(t){var e=t.target.value;e&&(this._currentDirection=e)},onIsoValueChronTimeHourChange:function(t){var e=t.target.value;this._timeHourContainer=t.target,e&&(this._currentTimeHour=e)},onIsoValueChronTimeMinuteChange:function(t){var e=t.target.value;this._timeMinuteContainer=t.target,e&&(this._currentTimeMinute=e)},onIsoValueDistChange:function(t){var e=t.target.value;this._distanceContainer=t.target,e&&(this._currentDistance=e)},onIsoExclusionsChange:function(t){var e=t.target.value,i=t.target.checked;if(e){for(var n=!1,o=null,s=0;s<this._currentExclusions.length;s++)this._currentExclusions[s]===e&&(o=s,n=!0);n||i||this._currentExclusions.push(e),n&&i&&this._currentExclusions.splice(o,1)}},onIsoComputationSubmit:function(){if(this._currentPoint&&this._currentPoint.getCoordinate&&this._currentPoint.getCoordinate()){var t;"time"===this._currentComputation.toLowerCase()&&(t=3600*this._currentTimeHour+60*this._currentTimeMinute);var e;if("distance"===this._currentComputation.toLowerCase()&&(e=1e3*this._currentDistance),(t||e)&&!this._noRightManagement){this._displayWaitingContainer();var i=this;this._requestIsoCurve({position:i._currentPoint.getCoordinate(),graph:i._currentTransport,exclusions:i._currentExclusions,method:i._currentComputation,reverse:"arrival"===i._currentDirection.toLowerCase(),time:t,distance:e,smoothing:!0,timeout:7e3,protocol:"XHR",onSuccess:function(t){t&&i._drawIsoResults(t)},onFailure:function(t){i._hideWaitingContainer(),i._clearIsoResultsGeometry()}})}}},_requestIsoCurve:function(e){if(e&&("object"!=typeof e||0!==Object.keys(e).length)&&e.position&&!this._noRightManagement){var n=this._resources.Isochrone;if(n){var o=n.resources;if(o&&("object"!=typeof o||0!==Object.keys(o).length)){var s={};t.Util.extend(s,e),t.Util.extend(s,this.options.isocurveOptions);for(var r=!1,a=0;a<o.length;a++)o[a]===s.graph&&(r=!0);if(!r)return void console.log("no rights for this service !?");var l=this._resources.Isochrone.key;s.apiKey=this.options.isocurveOptions.apiKey||this.options.apiKey||l,i.Services.isoCurve(s)}}}},_drawIsoResults:function(e){if(this._clearIsoResultsGeometry(),this._currentIsoResults=e,!e.geometry)return void this._hideWaitingContainer();var i=this._map,n=e.geometry,o={color:"#ff7800",weight:5,opacity:.65};this._geojsonIso=t.geoJson(n,{style:o}).addTo(i),this._hideWaitingContainer(),this._formContainer.className="GPisochroComponentHidden"},_clear:function(){this._initTransport(),this._initExclusions(),this._initComputation(),this._initDirection(),this._currentIsoResults=null,this._clearIsoResultsGeometry(),this._currentPoint.clear(),this._timeHourContainer&&(this._timeHourContainer.value=0),this._timeMinuteContainer&&(this._timeMinuteContainer.value=0),this._distanceContainer&&(this._distanceContainer.value=0)},_clearIsoResultsGeometry:function(){var t=this._map;null!=this._geojsonIso&&(t.removeLayer(this._geojsonIso),this._geojsonIso=null)},_displayWaitingContainer:function(){this._waitingContainer.className="GPisochronCalcWaitingContainerVisible",this._waiting=!0,this._timer&&(clearTimeout(this._timer),this._timer=null);var t=this;this._timer=setTimeout(function(){t._waiting===!0?t._hideWaitingContainer():t._timer&&clearTimeout(t._timer)},16e3)},_hideWaitingContainer:function(){this._waiting&&(this._waitingContainer.className="GPisochronCalcWaitingContainerHidden",this._waiting=!1,clearTimeout(this._timer),this._timer=null)}});return a}(leaflet,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,LeafletControlsLocationSelector,CommonControlsIsoDOM),CommonControlsMousePositionDOM=function(){var t={_addUID:function(t){var e=this._uid?t+"-"+this._uid:t;return e},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPmousePosition"),t.className="GPwidget",t},_createShowMousePositionElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowMousePosition"),t.type="checkbox",t},_createShowMousePositionPictoElement:function(t){var e=this,i=document.createElement("label");i.id=this._addUID("GPshowMousePositionPicto"),i.className="GPshowAdvancedToolPicto",i.htmlFor=this._addUID("GPshowMousePosition"),i.title="Afficher les coordonnées du curseur",i.addEventListener("click",function(i){var n="";document.getElementById(e._addUID("GPshowMousePosition")).checked||t||(n="GPmapCenterVisible"),document.getElementById("GPmapCenter").className=n,e.onShowMousePositionClick(i)});var n=document.createElement("span");return n.id=this._addUID("GPshowMousePositionOpen"),n.className="GPshowAdvancedToolOpen",i.appendChild(n),i},_createMousePositionPanelElement:function(t,e){t=!!t||"undefined"==typeof t,e=!!e||"undefined"==typeof e;var i=document.createElement("div");i.id=this._addUID("GPmousePositionPanel"),i.className="GPpanel",i.appendChild(this._createMousePositionPanelHeaderElement()),i.appendChild(this._createMousePositionPanelBasicElement(t,e));for(var n=this._createShowMousePositionSettingsElement(e),o=0;o<n.length;o++)i.appendChild(n[o]);return i},_createMapCenter:function(){var t=document.createElement("div");return t.id="GPmapCenter",t.className="",t},_createMousePositionPanelHeaderElement:function(){var t=document.createElement("div");t.className="GPpanelHeader";var e=document.createElement("div");e.className="GPpanelTitle",e.innerHTML="Coordonnées",t.appendChild(e);var i=document.createElement("div");i.id="GPmousePositionPanelClose",i.className="GPpanelClose",i.title="Fermer le panneau";var n=this;return i.addEventListener?i.addEventListener("click",function(){document.getElementById(n._addUID("GPshowMousePositionPicto")).click()},!1):i.attachEvent&&i.attachEvent("onclick",function(){document.getElementById(n._addUID("GPshowMousePositionPicto")).click()}),t.appendChild(i),t},_createMousePositionPanelBasicElement:function(t,e){var i=document.createElement("div");return i.id=this._addUID("GPmousePositionBasicPanel"),i.appendChild(this._createMousePositionPanelBasicCoordinateElement(e)),i.appendChild(this._createMousePositionPanelBasicAltitudeElement(t)),i},_createMousePositionPanelBasicCoordinateElement:function(t){var e=document.createElement("div");e.id=this._addUID("GPmousePositionCoordinate"),e.style.display=t?"block":"none";var i=document.createElement("span");i.className="GPmousePositionLabel",i.id=this._addUID("GPmousePositionLatLabel"),i.innerHTML="Latitude : ",e.appendChild(i);var n=document.createElement("span");n.className="GPmousePositionCoords",n.id=this._addUID("GPmousePositionLat"),n.innerHTML="",e.appendChild(n);var o=document.createElement("span");o.className="GPmousePositionLabel",o.id=this._addUID("GPmousePositionLonLabel"),o.innerHTML="Longitude : ",e.appendChild(o);var s=document.createElement("span");return s.className="GPmousePositionCoords",s.id=this._addUID("GPmousePositionLon"),s.innerHTML="",e.appendChild(s),e},_createMousePositionPanelBasicAltitudeElement:function(t){var e=document.createElement("div");e.id=this._addUID("GPmousePositionAltitude"),e.style.display=t?"block":"none";var i=document.createElement("span");i.className="GPmousePositionLabel",i.innerHTML="Altitude : ",e.appendChild(i);var n=document.createElement("span");return n.className="GPmousePositionCoords",n.id=this._addUID("GPmousePositionAlt"),n.innerHTML="",e.appendChild(n),e},_createShowMousePositionSettingsElement:function(t){var e=[],i=document.createElement("input");i.type="checkbox",i.id=this._addUID("GPshowMousePositionSettings");var n=document.createElement("label");return n.id=this._addUID("GPshowMousePositionSettingsPicto"),n.htmlFor=this._addUID("GPshowMousePositionSettings"),n.title="Réglages",n.className="GPshowMoreOptions GPshowMousePositionSettingsPicto",n.style.display=t?"block":"none",e.push(i),e.push(n),e},_createMousePositionSettingsElement:function(){var t=document.createElement("div");t.id=this._addUID("GPmousePositionSettings");var e=document.createElement("span");return e.className="GPmousePositionSettingsLabel",e.innerHTML="Système de référence",t.appendChild(e),t},_createMousePositionSettingsSystemsElement:function(t){var e=this,i=document.createElement("select");i.id=this._addUID("GPmousePositionProjectionSystem"),i.className="GPinputSelect GPmousePositionSettingsSelect",i.addEventListener("change",function(t){e.onMousePositionProjectionSystemChange(t)}),i.addEventListener("mouseover",function(t){e.onMousePositionProjectionSystemMouseOver(t)});for(var n=0;n<t.length;n++){var o=t[n],s=document.createElement("option");s.value=o.code,s.text=o.label||n,i.appendChild(s)}return i},_createMousePositionSettingsUnitsElement:function(t){var e=this,i=document.createElement("select");i.id=this._addUID("GPmousePositionProjectionUnits"),i.className="GPinputSelect GPmousePositionSettingsSelect",i.addEventListener("change",function(t){e.onMousePositionProjectionUnitsChange(t)});for(var n=0;n<t.length;n++){var o=t[n],s=document.createElement("option");s.value=o.code?o.code:n,s.text=o.label||n,i.appendChild(s)}return i},GPdisplayCoords:function(t){if(t&&null!=t){var e=document.getElementById(this._addUID("GPmousePositionLonLabel")),i=document.getElementById(this._addUID("GPmousePositionLatLabel"));t.x||t.y?(i.innerHTML="X : ",e.innerHTML="Y : "):t.e||t.n?(i.innerHTML="E : ",e.innerHTML="N : "):(i.innerHTML="Latitude : ",e.innerHTML="Longitude : ");var n=document.getElementById(this._addUID("GPmousePositionLat")),o=document.getElementById(this._addUID("GPmousePositionLon"));n.innerHTML=t.x||t.lat||t.e||"0",t.unit&&(n.innerHTML+=" ",n.innerHTML+=t.unit),o.innerHTML=t.y||t.lng||t.lon||t.n||"0",t.unit&&(o.innerHTML+=" ",o.innerHTML+=t.unit)}},GPdisplayElevation:function(t,e,i,n){var o,s=this;e||(e=500),clearTimeout(o),document.getElementById(this._addUID("GPmousePositionAlt")).innerHTML="...",null==i&&(i=-99999),null==n&&(n=99980);var r=i+n,a=i-n;t&&null!=t&&document.getElementById(this._addUID("GPmousePositionAltitude"))&&(o=setTimeout(function(){s.onRequestAltitude(t,function(t){a<t&&t<r?document.getElementById(s._addUID("GPmousePositionAlt")).innerHTML="--- m":document.getElementById(s._addUID("GPmousePositionAlt")).innerHTML=t+" m"})},e))}};return t}(),!function(t){if("object"==typeof exports)module.exports=t();else{proj4=function(){return"function"==typeof t?t():t}()}}(function(){return function t(e,i,n){function o(r,a){if(!i[r]){if(!e[r]){var l="function"==typeof require&&require;if(!a&&l)return l(r,!0);if(s)return s(r,!0);throw new Error("Cannot find module '"+r+"'")}var c=i[r]={exports:{}};e[r][0].call(c.exports,function(t){var i=e[r][1][t];return o(i?i:t)},c,c.exports,t,e,i,n)}return i[r].exports}for(var s="function"==typeof require&&require,r=0;r<n.length;r++)o(n[r]);return o}({1:[function(t,e){function i(t,e,n){if(!(this instanceof i))return new i(t,e,n);if(Array.isArray(t))this.x=t[0],this.y=t[1],this.z=t[2]||0;else if("object"==typeof t)this.x=t.x,this.y=t.y,this.z=t.z||0;else if("string"==typeof t&&"undefined"==typeof e){var o=t.split(",");this.x=parseFloat(o[0],10),this.y=parseFloat(o[1],10),this.z=parseFloat(o[2],10)||0}else this.x=t,this.y=e,this.z=n||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}var n=t("mgrs");i.fromMGRS=function(t){return new i(n.toPoint(t))},i.prototype.toMGRS=function(t){return n.forward([this.x,this.y],t)},e.exports=i},{mgrs:66}],2:[function(t,e){function i(t,e){if(!(this instanceof i))return new i(t);e=e||function(t){if(t)throw t};var s=n(t);if("object"!=typeof s)return void e(t);var a=r(s),l=i.projections.get(a.projName);l?(o(this,a),o(this,l),this.init(),e(null,this)):e(t)}var n=t("./parseCode"),o=t("./extend"),s=t("./projections"),r=t("./deriveConstants");i.projections=s,i.projections.start(),e.exports=i},{"./deriveConstants":32,"./extend":33,"./parseCode":36,"./projections":38}],3:[function(t,e){e.exports=function(t,e,i){var n,o,s,r=i.x,a=i.y,l=i.z||0;for(s=0;3>s;s++)if(!e||2!==s||void 0!==i.z)switch(0===s?(n=r,o="x"):1===s?(n=a,o="y"):(n=l,o="z"),t.axis[s]){case"e":i[o]=n;break;case"w":i[o]=-n;break;case"n":i[o]=n;break;case"s":i[o]=-n;break;case"u":void 0!==i[o]&&(i.z=n);break;case"d":void 0!==i[o]&&(i.z=-n);break;default:return null}return i}},{}],4:[function(t,e){var i=Math.PI/2,n=t("./sign");e.exports=function(t){return Math.abs(t)<i?t:t-n(t)*Math.PI}},{"./sign":21}],5:[function(t,e){var i=2*Math.PI,n=t("./sign");e.exports=function(t){return Math.abs(t)<Math.PI?t:t-n(t)*i}},{"./sign":21}],6:[function(t,e){e.exports=function(t){return Math.abs(t)>1&&(t=t>1?1:-1),Math.asin(t)}},{}],7:[function(t,e){e.exports=function(t){return 1-.25*t*(1+t/16*(3+1.25*t))}},{}],8:[function(t,e){e.exports=function(t){return.375*t*(1+.25*t*(1+.46875*t))}},{}],9:[function(t,e){e.exports=function(t){return.05859375*t*t*(1+.75*t)}},{}],10:[function(t,e){e.exports=function(t){return t*t*t*(35/3072)}},{}],11:[function(t,e){e.exports=function(t,e,i){var n=e*i;return t/Math.sqrt(1-n*n)}},{}],12:[function(t,e){e.exports=function(t,e,i,n,o){var s,r;s=t/e;for(var a=0;15>a;a++)if(r=(t-(e*s-i*Math.sin(2*s)+n*Math.sin(4*s)-o*Math.sin(6*s)))/(e-2*i*Math.cos(2*s)+4*n*Math.cos(4*s)-6*o*Math.cos(6*s)),s+=r,Math.abs(r)<=1e-10)return s;return NaN}},{}],13:[function(t,e){var i=Math.PI/2;e.exports=function(t,e){var n=1-(1-t*t)/(2*t)*Math.log((1-t)/(1+t));if(Math.abs(Math.abs(e)-n)<1e-6)return 0>e?-1*i:i;for(var o,s,r,a,l=Math.asin(.5*e),c=0;30>c;c++)if(s=Math.sin(l),r=Math.cos(l),a=t*s,o=Math.pow(1-a*a,2)/(2*r)*(e/(1-t*t)-s/(1-a*a)+.5/t*Math.log((1-a)/(1+a))),l+=o,Math.abs(o)<=1e-10)return l;return NaN}},{}],14:[function(t,e){e.exports=function(t,e,i,n,o){return t*o-e*Math.sin(2*o)+i*Math.sin(4*o)-n*Math.sin(6*o)}},{}],15:[function(t,e){e.exports=function(t,e,i){var n=t*e;return i/Math.sqrt(1-n*n)}},{}],16:[function(t,e){var i=Math.PI/2;e.exports=function(t,e){for(var n,o,s=.5*t,r=i-2*Math.atan(e),a=0;15>=a;a++)if(n=t*Math.sin(r),o=i-2*Math.atan(e*Math.pow((1-n)/(1+n),s))-r,r+=o,Math.abs(o)<=1e-10)return r;return-9999}},{}],17:[function(t,e){var i=1,n=.25,o=.046875,s=.01953125,r=.01068115234375,a=.75,l=.46875,c=.013020833333333334,h=.007120768229166667,u=.3645833333333333,d=.005696614583333333,p=.3076171875;e.exports=function(t){var e=[];e[0]=i-t*(n+t*(o+t*(s+t*r))),e[1]=t*(a-t*(o+t*(s+t*r)));var m=t*t;return e[2]=m*(l-t*(c+t*h)),m*=t,e[3]=m*(u-t*d),e[4]=m*t*p,e}},{}],18:[function(t,e){var i=t("./pj_mlfn"),n=1e-10,o=20;e.exports=function(t,e,s){for(var r=1/(1-e),a=t,l=o;l;--l){var c=Math.sin(a),h=1-e*c*c;if(h=(i(a,c,Math.cos(a),s)-t)*h*Math.sqrt(h)*r,a-=h,Math.abs(h)<n)return a}return a;
-}},{"./pj_mlfn":19}],19:[function(t,e){e.exports=function(t,e,i,n){return i*=e,e*=e,n[0]*t-i*(n[1]+e*(n[2]+e*(n[3]+e*n[4])))}},{}],20:[function(t,e){e.exports=function(t,e){var i;return t>1e-7?(i=t*e,(1-t*t)*(e/(1-i*i)-.5/t*Math.log((1-i)/(1+i)))):2*e}},{}],21:[function(t,e){e.exports=function(t){return 0>t?-1:1}},{}],22:[function(t,e){e.exports=function(t,e){return Math.pow((1-t)/(1+t),e)}},{}],23:[function(t,e){e.exports=function(t){var e={x:t[0],y:t[1]};return t.length>2&&(e.z=t[2]),t.length>3&&(e.m=t[3]),e}},{}],24:[function(t,e){var i=Math.PI/2;e.exports=function(t,e,n){var o=t*n,s=.5*t;return o=Math.pow((1-o)/(1+o),s),Math.tan(.5*(i-e))/o}},{}],25:[function(t,e,i){i.wgs84={towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},i.ch1903={towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},i.ggrs87={towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},i.nad83={towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},i.nad27={nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},i.potsdam={towgs84:"606.0,23.0,413.0",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},i.carthage={towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},i.hermannskogel={towgs84:"653.0,-212.0,449.0",ellipse:"bessel",datumName:"Hermannskogel"},i.ire65={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},i.rassadiran={towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},i.nzgd49={towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},i.osgb36={towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},i.s_jtsk={towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},i.beduaram={towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},i.gunung_segara={towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},i.rnb72={towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"}},{}],26:[function(t,e,i){i.MERIT={a:6378137,rf:298.257,ellipseName:"MERIT 1983"},i.SGS85={a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},i.GRS80={a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},i.IAU76={a:6378140,rf:298.257,ellipseName:"IAU 1976"},i.airy={a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},i.APL4={a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},i.NWL9D={a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},i.mod_airy={a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},i.andrae={a:6377104.43,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},i.aust_SA={a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},i.GRS67={a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},i.bessel={a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},i.bess_nam={a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},i.clrk66={a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},i.clrk80={a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},i.clrk58={a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},i.CPM={a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},i.delmbr={a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},i.engelis={a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},i.evrst30={a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},i.evrst48={a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},i.evrst56={a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},i.evrst69={a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},i.evrstSS={a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},i.fschr60={a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},i.fschr60m={a:6378155,rf:298.3,ellipseName:"Fischer 1960"},i.fschr68={a:6378150,rf:298.3,ellipseName:"Fischer 1968"},i.helmert={a:6378200,rf:298.3,ellipseName:"Helmert 1906"},i.hough={a:6378270,rf:297,ellipseName:"Hough"},i.intl={a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},i.kaula={a:6378163,rf:298.24,ellipseName:"Kaula 1961"},i.lerch={a:6378139,rf:298.257,ellipseName:"Lerch 1979"},i.mprts={a:6397300,rf:191,ellipseName:"Maupertius 1738"},i.new_intl={a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},i.plessis={a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},i.krass={a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},i.SEasia={a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},i.walbeck={a:6376896,b:6355834.8467,ellipseName:"Walbeck"},i.WGS60={a:6378165,rf:298.3,ellipseName:"WGS 60"},i.WGS66={a:6378145,rf:298.25,ellipseName:"WGS 66"},i.WGS7={a:6378135,rf:298.26,ellipseName:"WGS 72"},i.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"},i.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"}},{}],27:[function(t,e,i){i.greenwich=0,i.lisbon=-9.131906111111,i.paris=2.337229166667,i.bogota=-74.080916666667,i.madrid=-3.687938888889,i.rome=12.452333333333,i.bern=7.439583333333,i.jakarta=106.807719444444,i.ferro=-17.666666666667,i.brussels=4.367975,i.stockholm=18.058277777778,i.athens=23.7163375,i.oslo=10.722916666667},{}],28:[function(t,e){function i(t,e,i){var n;return Array.isArray(i)?(n=r(t,e,i),3===i.length?[n.x,n.y,n.z]:[n.x,n.y]):r(t,e,i)}function n(t){return t instanceof s?t:t.oProj?t.oProj:s(t)}function o(t,e,o){t=n(t);var s,r=!1;return"undefined"==typeof e?(e=t,t=a,r=!0):("undefined"!=typeof e.x||Array.isArray(e))&&(o=e,e=t,t=a,r=!0),e=n(e),o?i(t,e,o):(s={forward:function(n){return i(t,e,n)},inverse:function(n){return i(e,t,n)}},r&&(s.oProj=e),s)}var s=t("./Proj"),r=t("./transform"),a=s("WGS84");e.exports=o},{"./Proj":2,"./transform":64}],29:[function(t,e){var i=Math.PI/2,n=1,o=2,s=3,r=4,a=5,l=484813681109536e-20,c=1.0026,h=.3826834323650898,u=function(t){if(!(this instanceof u))return new u(t);if(this.datum_type=r,t){if(t.datumCode&&"none"===t.datumCode&&(this.datum_type=a),t.datum_params){for(var e=0;e<t.datum_params.length;e++)t.datum_params[e]=parseFloat(t.datum_params[e]);(0!==t.datum_params[0]||0!==t.datum_params[1]||0!==t.datum_params[2])&&(this.datum_type=n),t.datum_params.length>3&&(0!==t.datum_params[3]||0!==t.datum_params[4]||0!==t.datum_params[5]||0!==t.datum_params[6])&&(this.datum_type=o,t.datum_params[3]*=l,t.datum_params[4]*=l,t.datum_params[5]*=l,t.datum_params[6]=t.datum_params[6]/1e6+1)}this.datum_type=t.grids?s:this.datum_type,this.a=t.a,this.b=t.b,this.es=t.es,this.ep2=t.ep2,this.datum_params=t.datum_params,this.datum_type===s&&(this.grids=t.grids)}};u.prototype={compare_datums:function(t){return this.datum_type===t.datum_type&&(!(this.a!==t.a||Math.abs(this.es-t.es)>5e-11)&&(this.datum_type===n?this.datum_params[0]===t.datum_params[0]&&this.datum_params[1]===t.datum_params[1]&&this.datum_params[2]===t.datum_params[2]:this.datum_type===o?this.datum_params[0]===t.datum_params[0]&&this.datum_params[1]===t.datum_params[1]&&this.datum_params[2]===t.datum_params[2]&&this.datum_params[3]===t.datum_params[3]&&this.datum_params[4]===t.datum_params[4]&&this.datum_params[5]===t.datum_params[5]&&this.datum_params[6]===t.datum_params[6]:this.datum_type!==s&&t.datum_type!==s||this.nadgrids===t.nadgrids))},geodetic_to_geocentric:function(t){var e,n,o,s,r,a,l,c=t.x,h=t.y,u=t.z?t.z:0,d=0;if(-i>h&&h>-1.001*i)h=-i;else if(h>i&&1.001*i>h)h=i;else if(-i>h||h>i)return null;return c>Math.PI&&(c-=2*Math.PI),r=Math.sin(h),l=Math.cos(h),a=r*r,s=this.a/Math.sqrt(1-this.es*a),e=(s+u)*l*Math.cos(c),n=(s+u)*l*Math.sin(c),o=(s*(1-this.es)+u)*r,t.x=e,t.y=n,t.z=o,d},geocentric_to_geodetic:function(t){var e,n,o,s,r,a,l,c,h,u,d,p,m,f,_,g,v,y=1e-12,E=y*y,P=30,C=t.x,S=t.y,M=t.z?t.z:0;if(m=!1,e=Math.sqrt(C*C+S*S),n=Math.sqrt(C*C+S*S+M*M),e/this.a<y){if(m=!0,_=0,n/this.a<y)return g=i,void(v=-this.b)}else _=Math.atan2(S,C);o=M/n,s=e/n,r=1/Math.sqrt(1-this.es*(2-this.es)*s*s),c=s*(1-this.es)*r,h=o*r,f=0;do f++,l=this.a/Math.sqrt(1-this.es*h*h),v=e*c+M*h-l*(1-this.es*h*h),a=this.es*l/(l+v),r=1/Math.sqrt(1-a*(2-a)*s*s),u=s*(1-a)*r,d=o*r,p=d*c-u*h,c=u,h=d;while(p*p>E&&P>f);return g=Math.atan(d/Math.abs(u)),t.x=_,t.y=g,t.z=v,t},geocentric_to_geodetic_noniter:function(t){var e,n,o,s,r,a,l,u,d,p,m,f,_,g,v,y,E,P=t.x,C=t.y,S=t.z?t.z:0;if(P=parseFloat(P),C=parseFloat(C),S=parseFloat(S),E=!1,0!==P)e=Math.atan2(C,P);else if(C>0)e=i;else if(0>C)e=-i;else if(E=!0,e=0,S>0)n=i;else{if(!(0>S))return n=i,void(o=-this.b);n=-i}return r=P*P+C*C,s=Math.sqrt(r),a=S*c,u=Math.sqrt(a*a+r),p=a/u,f=s/u,m=p*p*p,l=S+this.b*this.ep2*m,y=s-this.a*this.es*f*f*f,d=Math.sqrt(l*l+y*y),_=l/d,g=y/d,v=this.a/Math.sqrt(1-this.es*_*_),o=g>=h?s/g-v:-h>=g?s/-g-v:S/_+v*(this.es-1),E===!1&&(n=Math.atan(_/g)),t.x=e,t.y=n,t.z=o,t},geocentric_to_wgs84:function(t){if(this.datum_type===n)t.x+=this.datum_params[0],t.y+=this.datum_params[1],t.z+=this.datum_params[2];else if(this.datum_type===o){var e=this.datum_params[0],i=this.datum_params[1],s=this.datum_params[2],r=this.datum_params[3],a=this.datum_params[4],l=this.datum_params[5],c=this.datum_params[6],h=c*(t.x-l*t.y+a*t.z)+e,u=c*(l*t.x+t.y-r*t.z)+i,d=c*(-a*t.x+r*t.y+t.z)+s;t.x=h,t.y=u,t.z=d}},geocentric_from_wgs84:function(t){if(this.datum_type===n)t.x-=this.datum_params[0],t.y-=this.datum_params[1],t.z-=this.datum_params[2];else if(this.datum_type===o){var e=this.datum_params[0],i=this.datum_params[1],s=this.datum_params[2],r=this.datum_params[3],a=this.datum_params[4],l=this.datum_params[5],c=this.datum_params[6],h=(t.x-e)/c,u=(t.y-i)/c,d=(t.z-s)/c;t.x=h+l*u-a*d,t.y=-l*h+u+r*d,t.z=a*h-r*u+d}}},e.exports=u},{}],30:[function(t,e){var i=1,n=2,o=3,s=5,r=6378137,a=.006694379990141316;e.exports=function(t,e,l){function c(t){return t===i||t===n}var h,u,d;if(t.compare_datums(e))return l;if(t.datum_type===s||e.datum_type===s)return l;var p=t.a,m=t.es,f=e.a,_=e.es,g=t.datum_type;if(g===o)if(0===this.apply_gridshift(t,0,l))t.a=r,t.es=a;else{if(!t.datum_params)return t.a=p,t.es=t.es,l;for(h=1,u=0,d=t.datum_params.length;d>u;u++)h*=t.datum_params[u];if(0===h)return t.a=p,t.es=t.es,l;g=t.datum_params.length>3?n:i}return e.datum_type===o&&(e.a=r,e.es=a),(t.es!==e.es||t.a!==e.a||c(g)||c(e.datum_type))&&(t.geodetic_to_geocentric(l),c(t.datum_type)&&t.geocentric_to_wgs84(l),c(e.datum_type)&&e.geocentric_from_wgs84(l),e.geocentric_to_geodetic(l)),e.datum_type===o&&this.apply_gridshift(e,1,l),t.a=p,t.es=m,e.a=f,e.es=_,l}},{}],31:[function(t,e){function i(t){var e=this;if(2===arguments.length){var n=arguments[1];i[t]="string"==typeof n?"+"===n[0]?o(arguments[1]):s(arguments[1]):n}else if(1===arguments.length){if(Array.isArray(t))return t.map(function(t){Array.isArray(t)?i.apply(e,t):i(t)});if("string"==typeof t){if(t in i)return i[t]}else"EPSG"in t?i["EPSG:"+t.EPSG]=t:"ESRI"in t?i["ESRI:"+t.ESRI]=t:"IAU2000"in t?i["IAU2000:"+t.IAU2000]=t:console.log(t);return}}var n=t("./global"),o=t("./projString"),s=t("./wkt");n(i),e.exports=i},{"./global":34,"./projString":37,"./wkt":65}],32:[function(t,e){var i=t("./constants/Datum"),n=t("./constants/Ellipsoid"),o=t("./extend"),s=t("./datum"),r=1e-10,a=.16666666666666666,l=.04722222222222222,c=.022156084656084655;e.exports=function(t){if(t.datumCode&&"none"!==t.datumCode){var e=i[t.datumCode];e&&(t.datum_params=e.towgs84?e.towgs84.split(","):null,t.ellps=e.ellipse,t.datumName=e.datumName?e.datumName:t.datumCode)}if(!t.a){var h=n[t.ellps]?n[t.ellps]:n.WGS84;o(t,h)}return t.rf&&!t.b&&(t.b=(1-1/t.rf)*t.a),(0===t.rf||Math.abs(t.a-t.b)<r)&&(t.sphere=!0,t.b=t.a),t.a2=t.a*t.a,t.b2=t.b*t.b,t.es=(t.a2-t.b2)/t.a2,t.e=Math.sqrt(t.es),t.R_A&&(t.a*=1-t.es*(a+t.es*(l+t.es*c)),t.a2=t.a*t.a,t.b2=t.b*t.b,t.es=0),t.ep2=(t.a2-t.b2)/t.b2,t.k0||(t.k0=1),t.axis||(t.axis="enu"),t.datum=s(t),t}},{"./constants/Datum":25,"./constants/Ellipsoid":26,"./datum":29,"./extend":33}],33:[function(t,e){e.exports=function(t,e){t=t||{};var i,n;if(!e)return t;for(n in e)i=e[n],void 0!==i&&(t[n]=i);return t}},{}],34:[function(t,e){e.exports=function(t){t("EPSG:4326","+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"),t("EPSG:4269","+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"),t("EPSG:3857","+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"),t.WGS84=t["EPSG:4326"],t["EPSG:3785"]=t["EPSG:3857"],t.GOOGLE=t["EPSG:3857"],t["EPSG:900913"]=t["EPSG:3857"],t["EPSG:102113"]=t["EPSG:3857"]}},{}],35:[function(t,e){var i=t("./core");i.defaultDatum="WGS84",i.Proj=t("./Proj"),i.WGS84=new i.Proj("WGS84"),i.Point=t("./Point"),i.toPoint=t("./common/toPoint"),i.defs=t("./defs"),i.transform=t("./transform"),i.mgrs=t("mgrs"),i.version=t("../package.json").version,t("./includedProjections")(i),e.exports=i},{"../package.json":67,"./Point":1,"./Proj":2,"./common/toPoint":23,"./core":28,"./defs":31,"./includedProjections":"gWUPNW","./transform":64,mgrs:66}],36:[function(t,e){function i(t){return"string"==typeof t}function n(t){return t in a}function o(t){var e=["GEOGCS","GEOCCS","PROJCS","LOCAL_CS"];return e.reduce(function(e,i){return e+1+t.indexOf(i)},0)}function s(t){return"+"===t[0]}function r(t){return i(t)?n(t)?a[t]:o(t)?l(t):s(t)?c(t):void 0:t}var a=t("./defs"),l=t("./wkt"),c=t("./projString");e.exports=r},{"./defs":31,"./projString":37,"./wkt":65}],37:[function(t,e){var i=.017453292519943295,n=t("./constants/PrimeMeridian");e.exports=function(t){var e={},o={};t.split("+").map(function(t){return t.trim()}).filter(function(t){return t}).forEach(function(t){var e=t.split("=");e.push(!0),o[e[0].toLowerCase()]=e[1]});var s,r,a,l={proj:"projName",datum:"datumCode",rf:function(t){e.rf=parseFloat(t,10)},lat_0:function(t){e.lat0=t*i},lat_1:function(t){e.lat1=t*i},lat_2:function(t){e.lat2=t*i},lat_ts:function(t){e.lat_ts=t*i},lon_0:function(t){e.long0=t*i},lon_1:function(t){e.long1=t*i},lon_2:function(t){e.long2=t*i},alpha:function(t){e.alpha=parseFloat(t)*i},lonc:function(t){e.longc=t*i},x_0:function(t){e.x0=parseFloat(t,10)},y_0:function(t){e.y0=parseFloat(t,10)},k_0:function(t){e.k0=parseFloat(t,10)},k:function(t){e.k0=parseFloat(t,10)},r_a:function(){e.R_A=!0},zone:function(t){e.zone=parseInt(t,10)},south:function(){e.utmSouth=!0},towgs84:function(t){e.datum_params=t.split(",").map(function(t){return parseFloat(t,10)})},to_meter:function(t){e.to_meter=parseFloat(t,10)},from_greenwich:function(t){e.from_greenwich=t*i},pm:function(t){e.from_greenwich=(n[t]?n[t]:parseFloat(t,10))*i},nadgrids:function(t){"@null"===t?e.datumCode="none":e.nadgrids=t},axis:function(t){var i="ewnsud";3===t.length&&-1!==i.indexOf(t.substr(0,1))&&-1!==i.indexOf(t.substr(1,1))&&-1!==i.indexOf(t.substr(2,1))&&(e.axis=t)}};for(s in o)r=o[s],s in l?(a=l[s],"function"==typeof a?a(r):e[a]=r):e[s]=r;return"string"==typeof e.datumCode&&"WGS84"!==e.datumCode&&(e.datumCode=e.datumCode.toLowerCase()),e}},{"./constants/PrimeMeridian":27}],38:[function(t,e,i){function n(t,e){var i=r.length;return t.names?(r[i]=t,t.names.forEach(function(t){s[t.toLowerCase()]=i}),this):(console.log(e),!0)}var o=[t("./projections/merc"),t("./projections/longlat")],s={},r=[];i.add=n,i.get=function(t){if(!t)return!1;var e=t.toLowerCase();return"undefined"!=typeof s[e]&&r[s[e]]?r[s[e]]:void 0},i.start=function(){o.forEach(n)}},{"./projections/longlat":50,"./projections/merc":51}],39:[function(t,e,i){var n=1e-10,o=t("../common/msfnz"),s=t("../common/qsfnz"),r=t("../common/adjust_lon"),a=t("../common/asinz");i.init=function(){Math.abs(this.lat1+this.lat2)<n||(this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e3=Math.sqrt(this.es),this.sin_po=Math.sin(this.lat1),this.cos_po=Math.cos(this.lat1),this.t1=this.sin_po,this.con=this.sin_po,this.ms1=o(this.e3,this.sin_po,this.cos_po),this.qs1=s(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat2),this.cos_po=Math.cos(this.lat2),this.t2=this.sin_po,this.ms2=o(this.e3,this.sin_po,this.cos_po),this.qs2=s(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat0),this.cos_po=Math.cos(this.lat0),this.t3=this.sin_po,this.qs0=s(this.e3,this.sin_po,this.cos_po),this.ns0=Math.abs(this.lat1-this.lat2)>n?(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},i.forward=function(t){var e=t.x,i=t.y;this.sin_phi=Math.sin(i),this.cos_phi=Math.cos(i);var n=s(this.e3,this.sin_phi,this.cos_phi),o=this.a*Math.sqrt(this.c-this.ns0*n)/this.ns0,a=this.ns0*r(e-this.long0),l=o*Math.sin(a)+this.x0,c=this.rh-o*Math.cos(a)+this.y0;return t.x=l,t.y=c,t},i.inverse=function(t){var e,i,n,o,s,a;return t.x-=this.x0,t.y=this.rh-t.y+this.y0,this.ns0>=0?(e=Math.sqrt(t.x*t.x+t.y*t.y),n=1):(e=-Math.sqrt(t.x*t.x+t.y*t.y),n=-1),o=0,0!==e&&(o=Math.atan2(n*t.x,n*t.y)),n=e*this.ns0/this.a,this.sphere?a=Math.asin((this.c-n*n)/(2*this.ns0)):(i=(this.c-n*n)/this.ns0,a=this.phi1z(this.e3,i)),s=r(o/this.ns0+this.long0),t.x=s,t.y=a,t},i.phi1z=function(t,e){var i,o,s,r,l,c=a(.5*e);if(n>t)return c;for(var h=t*t,u=1;25>=u;u++)if(i=Math.sin(c),o=Math.cos(c),s=t*i,r=1-s*s,l=.5*r*r/o*(e/(1-h)-i/r+.5/t*Math.log((1-s)/(1+s))),c+=l,Math.abs(l)<=1e-7)return c;return null},i.names=["Albers_Conic_Equal_Area","Albers","aea"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/msfnz":15,"../common/qsfnz":20}],40:[function(t,e,i){var n=t("../common/adjust_lon"),o=Math.PI/2,s=1e-10,r=t("../common/mlfn"),a=t("../common/e0fn"),l=t("../common/e1fn"),c=t("../common/e2fn"),h=t("../common/e3fn"),u=t("../common/gN"),d=t("../common/asinz"),p=t("../common/imlfn");i.init=function(){this.sin_p12=Math.sin(this.lat0),this.cos_p12=Math.cos(this.lat0)},i.forward=function(t){var e,i,d,p,m,f,_,g,v,y,E,P,C,S,M,w,L,R,b,x,G,I,A,T=t.x,k=t.y,O=Math.sin(t.y),D=Math.cos(t.y),N=n(T-this.long0);return this.sphere?Math.abs(this.sin_p12-1)<=s?(t.x=this.x0+this.a*(o-k)*Math.sin(N),t.y=this.y0-this.a*(o-k)*Math.cos(N),t):Math.abs(this.sin_p12+1)<=s?(t.x=this.x0+this.a*(o+k)*Math.sin(N),t.y=this.y0+this.a*(o+k)*Math.cos(N),t):(R=this.sin_p12*O+this.cos_p12*D*Math.cos(N),w=Math.acos(R),L=w/Math.sin(w),t.x=this.x0+this.a*L*D*Math.sin(N),t.y=this.y0+this.a*L*(this.cos_p12*O-this.sin_p12*D*Math.cos(N)),t):(e=a(this.es),i=l(this.es),d=c(this.es),p=h(this.es),Math.abs(this.sin_p12-1)<=s?(m=this.a*r(e,i,d,p,o),f=this.a*r(e,i,d,p,k),t.x=this.x0+(m-f)*Math.sin(N),t.y=this.y0-(m-f)*Math.cos(N),t):Math.abs(this.sin_p12+1)<=s?(m=this.a*r(e,i,d,p,o),f=this.a*r(e,i,d,p,k),t.x=this.x0+(m+f)*Math.sin(N),t.y=this.y0+(m+f)*Math.cos(N),t):(_=O/D,g=u(this.a,this.e,this.sin_p12),v=u(this.a,this.e,O),y=Math.atan((1-this.es)*_+this.es*g*this.sin_p12/(v*D)),E=Math.atan2(Math.sin(N),this.cos_p12*Math.tan(y)-this.sin_p12*Math.cos(N)),b=0===E?Math.asin(this.cos_p12*Math.sin(y)-this.sin_p12*Math.cos(y)):Math.abs(Math.abs(E)-Math.PI)<=s?-Math.asin(this.cos_p12*Math.sin(y)-this.sin_p12*Math.cos(y)):Math.asin(Math.sin(N)*Math.cos(y)/Math.sin(E)),P=this.e*this.sin_p12/Math.sqrt(1-this.es),C=this.e*this.cos_p12*Math.cos(E)/Math.sqrt(1-this.es),S=P*C,M=C*C,x=b*b,G=x*b,I=G*b,A=I*b,w=g*b*(1-x*M*(1-M)/6+G/8*S*(1-2*M)+I/120*(M*(4-7*M)-3*P*P*(1-7*M))-A/48*S),t.x=this.x0+w*Math.sin(E),t.y=this.y0+w*Math.cos(E),t))},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e,i,m,f,_,g,v,y,E,P,C,S,M,w,L,R,b,x,G,I,A,T,k;if(this.sphere){if(e=Math.sqrt(t.x*t.x+t.y*t.y),e>2*o*this.a)return;return i=e/this.a,m=Math.sin(i),f=Math.cos(i),_=this.long0,Math.abs(e)<=s?g=this.lat0:(g=d(f*this.sin_p12+t.y*m*this.cos_p12/e),v=Math.abs(this.lat0)-o,_=n(Math.abs(v)<=s?this.lat0>=0?this.long0+Math.atan2(t.x,-t.y):this.long0-Math.atan2(-t.x,t.y):this.long0+Math.atan2(t.x*m,e*this.cos_p12*f-t.y*this.sin_p12*m))),t.x=_,t.y=g,t}return y=a(this.es),E=l(this.es),P=c(this.es),C=h(this.es),Math.abs(this.sin_p12-1)<=s?(S=this.a*r(y,E,P,C,o),e=Math.sqrt(t.x*t.x+t.y*t.y),M=S-e,g=p(M/this.a,y,E,P,C),_=n(this.long0+Math.atan2(t.x,-1*t.y)),t.x=_,t.y=g,t):Math.abs(this.sin_p12+1)<=s?(S=this.a*r(y,E,P,C,o),e=Math.sqrt(t.x*t.x+t.y*t.y),M=e-S,g=p(M/this.a,y,E,P,C),_=n(this.long0+Math.atan2(t.x,t.y)),t.x=_,t.y=g,t):(e=Math.sqrt(t.x*t.x+t.y*t.y),R=Math.atan2(t.x,t.y),w=u(this.a,this.e,this.sin_p12),b=Math.cos(R),x=this.e*this.cos_p12*b,G=-x*x/(1-this.es),I=3*this.es*(1-G)*this.sin_p12*this.cos_p12*b/(1-this.es),A=e/w,T=A-G*(1+G)*Math.pow(A,3)/6-I*(1+3*G)*Math.pow(A,4)/24,k=1-G*T*T/2-A*T*T*T/6,L=Math.asin(this.sin_p12*Math.cos(T)+this.cos_p12*Math.sin(T)*b),_=n(this.long0+Math.asin(Math.sin(R)*Math.sin(T)/Math.cos(L))),g=Math.atan((1-this.es*k*this.sin_p12/Math.sin(L))*Math.tan(L)/(1-this.es)),t.x=_,t.y=g,t)},i.names=["Azimuthal_Equidistant","aeqd"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/imlfn":12,"../common/mlfn":14}],41:[function(t,e,i){var n=t("../common/mlfn"),o=t("../common/e0fn"),s=t("../common/e1fn"),r=t("../common/e2fn"),a=t("../common/e3fn"),l=t("../common/gN"),c=t("../common/adjust_lon"),h=t("../common/adjust_lat"),u=t("../common/imlfn"),d=Math.PI/2,p=1e-10;i.init=function(){this.sphere||(this.e0=o(this.es),this.e1=s(this.es),this.e2=r(this.es),this.e3=a(this.es),this.ml0=this.a*n(this.e0,this.e1,this.e2,this.e3,this.lat0))},i.forward=function(t){var e,i,o=t.x,s=t.y;if(o=c(o-this.long0),this.sphere)e=this.a*Math.asin(Math.cos(s)*Math.sin(o)),i=this.a*(Math.atan2(Math.tan(s),Math.cos(o))-this.lat0);else{var r=Math.sin(s),a=Math.cos(s),h=l(this.a,this.e,r),u=Math.tan(s)*Math.tan(s),d=o*Math.cos(s),p=d*d,m=this.es*a*a/(1-this.es),f=this.a*n(this.e0,this.e1,this.e2,this.e3,s);e=h*d*(1-p*u*(1/6-(8-u+8*m)*p/120)),i=f-this.ml0+h*r/a*p*(.5+(5-u+6*m)*p/24)}return t.x=e+this.x0,t.y=i+this.y0,t},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e,i,n=t.x/this.a,o=t.y/this.a;if(this.sphere){var s=o+this.lat0;e=Math.asin(Math.sin(s)*Math.cos(n)),i=Math.atan2(Math.tan(n),Math.cos(s))}else{var r=this.ml0/this.a+o,a=u(r,this.e0,this.e1,this.e2,this.e3);if(Math.abs(Math.abs(a)-d)<=p)return t.x=this.long0,t.y=d,0>o&&(t.y*=-1),t;var m=l(this.a,this.e,Math.sin(a)),f=m*m*m/this.a/this.a*(1-this.es),_=Math.pow(Math.tan(a),2),g=n*this.a/m,v=g*g;e=a-m*Math.tan(a)/f*g*g*(.5-(1+3*_)*g*g/24),i=g*(1-v*(_/3+(1+3*_)*_*v/15))/Math.cos(a)}return t.x=c(i+this.long0),t.y=h(e),t},i.names=["Cassini","Cassini_Soldner","cass"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/imlfn":12,"../common/mlfn":14}],42:[function(t,e,i){var n=t("../common/adjust_lon"),o=t("../common/qsfnz"),s=t("../common/msfnz"),r=t("../common/iqsfnz");i.init=function(){this.sphere||(this.k0=s(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},i.forward=function(t){var e,i,s=t.x,r=t.y,a=n(s-this.long0);if(this.sphere)e=this.x0+this.a*a*Math.cos(this.lat_ts),i=this.y0+this.a*Math.sin(r)/Math.cos(this.lat_ts);else{var l=o(this.e,Math.sin(r));e=this.x0+this.a*this.k0*a,i=this.y0+this.a*l*.5/this.k0}return t.x=e,t.y=i,t},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e,i;return this.sphere?(e=n(this.long0+t.x/this.a/Math.cos(this.lat_ts)),i=Math.asin(t.y/this.a*Math.cos(this.lat_ts))):(i=r(this.e,2*t.y*this.k0/this.a),e=n(this.long0+t.x/(this.a*this.k0))),t.x=e,t.y=i,t},i.names=["cea"]},{"../common/adjust_lon":5,"../common/iqsfnz":13,"../common/msfnz":15,"../common/qsfnz":20}],43:[function(t,e,i){var n=t("../common/adjust_lon"),o=t("../common/adjust_lat");i.init=function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},i.forward=function(t){var e=t.x,i=t.y,s=n(e-this.long0),r=o(i-this.lat0);return t.x=this.x0+this.a*s*this.rc,t.y=this.y0+this.a*r,t},i.inverse=function(t){var e=t.x,i=t.y;return t.x=n(this.long0+(e-this.x0)/(this.a*this.rc)),t.y=o(this.lat0+(i-this.y0)/this.a),t},i.names=["Equirectangular","Equidistant_Cylindrical","eqc"]},{"../common/adjust_lat":4,"../common/adjust_lon":5}],44:[function(t,e,i){var n=t("../common/e0fn"),o=t("../common/e1fn"),s=t("../common/e2fn"),r=t("../common/e3fn"),a=t("../common/msfnz"),l=t("../common/mlfn"),c=t("../common/adjust_lon"),h=t("../common/adjust_lat"),u=t("../common/imlfn"),d=1e-10;i.init=function(){Math.abs(this.lat1+this.lat2)<d||(this.lat2=this.lat2||this.lat1,this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=n(this.es),this.e1=o(this.es),this.e2=s(this.es),this.e3=r(this.es),this.sinphi=Math.sin(this.lat1),this.cosphi=Math.cos(this.lat1),this.ms1=a(this.e,this.sinphi,this.cosphi),this.ml1=l(this.e0,this.e1,this.e2,this.e3,this.lat1),Math.abs(this.lat1-this.lat2)<d?this.ns=this.sinphi:(this.sinphi=Math.sin(this.lat2),this.cosphi=Math.cos(this.lat2),this.ms2=a(this.e,this.sinphi,this.cosphi),this.ml2=l(this.e0,this.e1,this.e2,this.e3,this.lat2),this.ns=(this.ms1-this.ms2)/(this.ml2-this.ml1)),this.g=this.ml1+this.ms1/this.ns,this.ml0=l(this.e0,this.e1,this.e2,this.e3,this.lat0),this.rh=this.a*(this.g-this.ml0))},i.forward=function(t){var e,i=t.x,n=t.y;if(this.sphere)e=this.a*(this.g-n);else{var o=l(this.e0,this.e1,this.e2,this.e3,n);e=this.a*(this.g-o)}var s=this.ns*c(i-this.long0),r=this.x0+e*Math.sin(s),a=this.y0+this.rh-e*Math.cos(s);return t.x=r,t.y=a,t},i.inverse=function(t){t.x-=this.x0,t.y=this.rh-t.y+this.y0;var e,i,n,o;this.ns>=0?(i=Math.sqrt(t.x*t.x+t.y*t.y),e=1):(i=-Math.sqrt(t.x*t.x+t.y*t.y),e=-1);var s=0;if(0!==i&&(s=Math.atan2(e*t.x,e*t.y)),this.sphere)return o=c(this.long0+s/this.ns),n=h(this.g-i/this.a),t.x=o,t.y=n,t;var r=this.g-i/this.a;return n=u(r,this.e0,this.e1,this.e2,this.e3),o=c(this.long0+s/this.ns),t.x=o,t.y=n,t},i.names=["Equidistant_Conic","eqdc"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/imlfn":12,"../common/mlfn":14,"../common/msfnz":15}],45:[function(t,e,i){var n=Math.PI/4,o=t("../common/srat"),s=Math.PI/2,r=20;i.init=function(){var t=Math.sin(this.lat0),e=Math.cos(this.lat0);e*=e,this.rc=Math.sqrt(1-this.es)/(1-this.es*t*t),this.C=Math.sqrt(1+this.es*e*e/(1-this.es)),this.phic0=Math.asin(t/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+n)/(Math.pow(Math.tan(.5*this.lat0+n),this.C)*o(this.e*t,this.ratexp))},i.forward=function(t){var e=t.x,i=t.y;return t.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*i+n),this.C)*o(this.e*Math.sin(i),this.ratexp))-s,t.x=this.C*e,t},i.inverse=function(t){for(var e=1e-14,i=t.x/this.C,a=t.y,l=Math.pow(Math.tan(.5*a+n)/this.K,1/this.C),c=r;c>0&&(a=2*Math.atan(l*o(this.e*Math.sin(t.y),-.5*this.e))-s,!(Math.abs(a-t.y)<e));--c)t.y=a;return c?(t.x=i,t.y=a,t):null},i.names=["gauss"]},{"../common/srat":22}],46:[function(t,e,i){var n=t("../common/adjust_lon"),o=1e-10,s=t("../common/asinz");i.init=function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0),this.infinity_dist=1e3*this.a,this.rc=1},i.forward=function(t){var e,i,s,r,a,l,c,h,u=t.x,d=t.y;return s=n(u-this.long0),e=Math.sin(d),i=Math.cos(d),r=Math.cos(s),l=this.sin_p14*e+this.cos_p14*i*r,a=1,l>0||Math.abs(l)<=o?(c=this.x0+this.a*a*i*Math.sin(s)/l,h=this.y0+this.a*a*(this.cos_p14*e-this.sin_p14*i*r)/l):(c=this.x0+this.infinity_dist*i*Math.sin(s),h=this.y0+this.infinity_dist*(this.cos_p14*e-this.sin_p14*i*r)),t.x=c,t.y=h,t},i.inverse=function(t){var e,i,o,r,a,l;return t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,t.x/=this.k0,t.y/=this.k0,(e=Math.sqrt(t.x*t.x+t.y*t.y))?(r=Math.atan2(e,this.rc),i=Math.sin(r),o=Math.cos(r),l=s(o*this.sin_p14+t.y*i*this.cos_p14/e),a=Math.atan2(t.x*i,e*this.cos_p14*o-t.y*this.sin_p14*i),a=n(this.long0+a)):(l=this.phic0,a=0),t.x=a,t.y=l,t},i.names=["gnom"]},{"../common/adjust_lon":5,"../common/asinz":6}],47:[function(t,e,i){var n=t("../common/adjust_lon");i.init=function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},i.forward=function(t){var e,i,o,s,r,a,l,c=t.x,h=t.y,u=n(c-this.long0);return e=Math.pow((1+this.e*Math.sin(h))/(1-this.e*Math.sin(h)),this.alfa*this.e/2),i=2*(Math.atan(this.k*Math.pow(Math.tan(h/2+this.s45),this.alfa)/e)-this.s45),o=-u*this.alfa,s=Math.asin(Math.cos(this.ad)*Math.sin(i)+Math.sin(this.ad)*Math.cos(i)*Math.cos(o)),r=Math.asin(Math.cos(i)*Math.sin(o)/Math.cos(s)),a=this.n*r,l=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(s/2+this.s45),this.n),t.y=l*Math.cos(a)/1,t.x=l*Math.sin(a)/1,this.czech||(t.y*=-1,t.x*=-1),t},i.inverse=function(t){var e,i,n,o,s,r,a,l,c=t.x;t.x=t.y,t.y=c,this.czech||(t.y*=-1,t.x*=-1),r=Math.sqrt(t.x*t.x+t.y*t.y),s=Math.atan2(t.y,t.x),o=s/Math.sin(this.s0),n=2*(Math.atan(Math.pow(this.ro0/r,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),e=Math.asin(Math.cos(this.ad)*Math.sin(n)-Math.sin(this.ad)*Math.cos(n)*Math.cos(o)),i=Math.asin(Math.cos(n)*Math.sin(o)/Math.cos(e)),t.x=this.long0-i/this.alfa,a=e,l=0;var h=0;do t.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(e/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(a))/(1-this.e*Math.sin(a)),this.e/2))-this.s45),Math.abs(a-t.y)<1e-10&&(l=1),a=t.y,h+=1;while(0===l&&15>h);return h>=15?null:t},i.names=["Krovak","krovak"]},{"../common/adjust_lon":5}],48:[function(t,e,i){var n=Math.PI/2,o=Math.PI/4,s=1e-10,r=t("../common/qsfnz"),a=t("../common/adjust_lon");i.S_POLE=1,i.N_POLE=2,i.EQUIT=3,i.OBLIQ=4,i.init=function(){var t=Math.abs(this.lat0);if(this.mode=Math.abs(t-n)<s?this.lat0<0?this.S_POLE:this.N_POLE:Math.abs(t)<s?this.EQUIT:this.OBLIQ,this.es>0){var e;switch(this.qp=r(this.e,1),this.mmf=.5/(1-this.es),this.apa=this.authset(this.es),this.mode){case this.N_POLE:this.dd=1;break;case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),e=Math.sin(this.lat0),this.sinb1=r(this.e,e)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*e*e)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},i.forward=function(t){var e,i,l,c,h,u,d,p,m,f,_=t.x,g=t.y;if(_=a(_-this.long0),this.sphere){if(h=Math.sin(g),f=Math.cos(g),l=Math.cos(_),this.mode===this.OBLIQ||this.mode===this.EQUIT){if(i=this.mode===this.EQUIT?1+f*l:1+this.sinph0*h+this.cosph0*f*l,s>=i)return null;i=Math.sqrt(2/i),e=i*f*Math.sin(_),i*=this.mode===this.EQUIT?h:this.cosph0*h-this.sinph0*f*l}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(l=-l),Math.abs(g+this.phi0)<s)return null;i=o-.5*g,i=2*(this.mode===this.S_POLE?Math.cos(i):Math.sin(i)),e=i*Math.sin(_),i*=l}}else{switch(d=0,p=0,m=0,l=Math.cos(_),c=Math.sin(_),h=Math.sin(g),u=r(this.e,h),(this.mode===this.OBLIQ||this.mode===this.EQUIT)&&(d=u/this.qp,p=Math.sqrt(1-d*d)),this.mode){case this.OBLIQ:m=1+this.sinb1*d+this.cosb1*p*l;break;case this.EQUIT:m=1+p*l;break;case this.N_POLE:m=n+g,u=this.qp-u;break;case this.S_POLE:m=g-n,u=this.qp+u}if(Math.abs(m)<s)return null;
-switch(this.mode){case this.OBLIQ:case this.EQUIT:m=Math.sqrt(2/m),i=this.mode===this.OBLIQ?this.ymf*m*(this.cosb1*d-this.sinb1*p*l):(m=Math.sqrt(2/(1+p*l)))*d*this.ymf,e=this.xmf*m*p*c;break;case this.N_POLE:case this.S_POLE:u>=0?(e=(m=Math.sqrt(u))*c,i=l*(this.mode===this.S_POLE?m:-m)):e=i=0}}return t.x=this.a*e+this.x0,t.y=this.a*i+this.y0,t},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e,i,o,r,l,c,h,u=t.x/this.a,d=t.y/this.a;if(this.sphere){var p,m=0,f=0;if(p=Math.sqrt(u*u+d*d),i=.5*p,i>1)return null;switch(i=2*Math.asin(i),(this.mode===this.OBLIQ||this.mode===this.EQUIT)&&(f=Math.sin(i),m=Math.cos(i)),this.mode){case this.EQUIT:i=Math.abs(p)<=s?0:Math.asin(d*f/p),u*=f,d=m*p;break;case this.OBLIQ:i=Math.abs(p)<=s?this.phi0:Math.asin(m*this.sinph0+d*f*this.cosph0/p),u*=f*this.cosph0,d=(m-Math.sin(i)*this.sinph0)*p;break;case this.N_POLE:d=-d,i=n-i;break;case this.S_POLE:i-=n}e=0!==d||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(u,d):0}else{if(h=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(u/=this.dd,d*=this.dd,c=Math.sqrt(u*u+d*d),s>c)return t.x=0,t.y=this.phi0,t;r=2*Math.asin(.5*c/this.rq),o=Math.cos(r),u*=r=Math.sin(r),this.mode===this.OBLIQ?(h=o*this.sinb1+d*r*this.cosb1/c,l=this.qp*h,d=c*this.cosb1*o-d*this.sinb1*r):(h=d*r/c,l=this.qp*h,d=c*o)}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(d=-d),l=u*u+d*d,!l)return t.x=0,t.y=this.phi0,t;h=1-l/this.qp,this.mode===this.S_POLE&&(h=-h)}e=Math.atan2(u,d),i=this.authlat(Math.asin(h),this.apa)}return t.x=a(this.long0+e),t.y=i,t},i.P00=.3333333333333333,i.P01=.17222222222222222,i.P02=.10257936507936508,i.P10=.06388888888888888,i.P11=.0664021164021164,i.P20=.016415012942191543,i.authset=function(t){var e,i=[];return i[0]=t*this.P00,e=t*t,i[0]+=e*this.P01,i[1]=e*this.P10,e*=t,i[0]+=e*this.P02,i[1]+=e*this.P11,i[2]=e*this.P20,i},i.authlat=function(t,e){var i=t+t;return t+e[0]*Math.sin(i)+e[1]*Math.sin(i+i)+e[2]*Math.sin(i+i+i)},i.names=["Lambert Azimuthal Equal Area","Lambert_Azimuthal_Equal_Area","laea"]},{"../common/adjust_lon":5,"../common/qsfnz":20}],49:[function(t,e,i){var n=1e-10,o=t("../common/msfnz"),s=t("../common/tsfnz"),r=Math.PI/2,a=t("../common/sign"),l=t("../common/adjust_lon"),c=t("../common/phi2z");i.init=function(){if(this.lat2||(this.lat2=this.lat1),this.k0||(this.k0=1),this.x0=this.x0||0,this.y0=this.y0||0,!(Math.abs(this.lat1+this.lat2)<n)){var t=this.b/this.a;this.e=Math.sqrt(1-t*t);var e=Math.sin(this.lat1),i=Math.cos(this.lat1),r=o(this.e,e,i),a=s(this.e,this.lat1,e),l=Math.sin(this.lat2),c=Math.cos(this.lat2),h=o(this.e,l,c),u=s(this.e,this.lat2,l),d=s(this.e,this.lat0,Math.sin(this.lat0));this.ns=Math.abs(this.lat1-this.lat2)>n?Math.log(r/h)/Math.log(a/u):e,isNaN(this.ns)&&(this.ns=e),this.f0=r/(this.ns*Math.pow(a,this.ns)),this.rh=this.a*this.f0*Math.pow(d,this.ns),this.title||(this.title="Lambert Conformal Conic")}},i.forward=function(t){var e=t.x,i=t.y;Math.abs(2*Math.abs(i)-Math.PI)<=n&&(i=a(i)*(r-2*n));var o,c,h=Math.abs(Math.abs(i)-r);if(h>n)o=s(this.e,i,Math.sin(i)),c=this.a*this.f0*Math.pow(o,this.ns);else{if(h=i*this.ns,0>=h)return null;c=0}var u=this.ns*l(e-this.long0);return t.x=this.k0*c*Math.sin(u)+this.x0,t.y=this.k0*(this.rh-c*Math.cos(u))+this.y0,t},i.inverse=function(t){var e,i,n,o,s,a=(t.x-this.x0)/this.k0,h=this.rh-(t.y-this.y0)/this.k0;this.ns>0?(e=Math.sqrt(a*a+h*h),i=1):(e=-Math.sqrt(a*a+h*h),i=-1);var u=0;if(0!==e&&(u=Math.atan2(i*a,i*h)),0!==e||this.ns>0){if(i=1/this.ns,n=Math.pow(e/(this.a*this.f0),i),o=c(this.e,n),-9999===o)return null}else o=-r;return s=l(u/this.ns+this.long0),t.x=s,t.y=o,t},i.names=["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_2SP","lcc"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/sign":21,"../common/tsfnz":24}],50:[function(t,e,i){function n(t){return t}i.init=function(){},i.forward=n,i.inverse=n,i.names=["longlat","identity"]},{}],51:[function(t,e,i){var n=t("../common/msfnz"),o=Math.PI/2,s=1e-10,r=57.29577951308232,a=t("../common/adjust_lon"),l=Math.PI/4,c=t("../common/tsfnz"),h=t("../common/phi2z");i.init=function(){var t=this.b/this.a;this.es=1-t*t,"x0"in this||(this.x0=0),"y0"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.k0=this.sphere?Math.cos(this.lat_ts):n(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k0=this.k?this.k:1)},i.forward=function(t){var e=t.x,i=t.y;if(i*r>90&&-90>i*r&&e*r>180&&-180>e*r)return null;var n,h;if(Math.abs(Math.abs(i)-o)<=s)return null;if(this.sphere)n=this.x0+this.a*this.k0*a(e-this.long0),h=this.y0+this.a*this.k0*Math.log(Math.tan(l+.5*i));else{var u=Math.sin(i),d=c(this.e,i,u);n=this.x0+this.a*this.k0*a(e-this.long0),h=this.y0-this.a*this.k0*Math.log(d)}return t.x=n,t.y=h,t},i.inverse=function(t){var e,i,n=t.x-this.x0,s=t.y-this.y0;if(this.sphere)i=o-2*Math.atan(Math.exp(-s/(this.a*this.k0)));else{var r=Math.exp(-s/(this.a*this.k0));if(i=h(this.e,r),-9999===i)return null}return e=a(this.long0+n/(this.a*this.k0)),t.x=e,t.y=i,t},i.names=["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/tsfnz":24}],52:[function(t,e,i){var n=t("../common/adjust_lon");i.init=function(){},i.forward=function(t){var e=t.x,i=t.y,o=n(e-this.long0),s=this.x0+this.a*o,r=this.y0+this.a*Math.log(Math.tan(Math.PI/4+i/2.5))*1.25;return t.x=s,t.y=r,t},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e=n(this.long0+t.x/this.a),i=2.5*(Math.atan(Math.exp(.8*t.y/this.a))-Math.PI/4);return t.x=e,t.y=i,t},i.names=["Miller_Cylindrical","mill"]},{"../common/adjust_lon":5}],53:[function(t,e,i){var n=t("../common/adjust_lon"),o=1e-10;i.init=function(){},i.forward=function(t){for(var e=t.x,i=t.y,s=n(e-this.long0),r=i,a=Math.PI*Math.sin(i),l=0;!0;l++){var c=-(r+Math.sin(r)-a)/(1+Math.cos(r));if(r+=c,Math.abs(c)<o)break}r/=2,Math.PI/2-Math.abs(i)<o&&(s=0);var h=.900316316158*this.a*s*Math.cos(r)+this.x0,u=1.4142135623731*this.a*Math.sin(r)+this.y0;return t.x=h,t.y=u,t},i.inverse=function(t){var e,i;t.x-=this.x0,t.y-=this.y0,i=t.y/(1.4142135623731*this.a),Math.abs(i)>.999999999999&&(i=.999999999999),e=Math.asin(i);var o=n(this.long0+t.x/(.900316316158*this.a*Math.cos(e)));o<-Math.PI&&(o=-Math.PI),o>Math.PI&&(o=Math.PI),i=(2*e+Math.sin(2*e))/Math.PI,Math.abs(i)>1&&(i=1);var s=Math.asin(i);return t.x=o,t.y=s,t},i.names=["Mollweide","moll"]},{"../common/adjust_lon":5}],54:[function(t,e,i){var n=484813681109536e-20;i.iterations=1,i.init=function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},i.forward=function(t){var e,i=t.x,o=t.y,s=o-this.lat0,r=i-this.long0,a=s/n*1e-5,l=r,c=1,h=0;for(e=1;10>=e;e++)c*=a,h+=this.A[e]*c;var u,d,p=h,m=l,f=1,_=0,g=0,v=0;for(e=1;6>=e;e++)u=f*p-_*m,d=_*p+f*m,f=u,_=d,g=g+this.B_re[e]*f-this.B_im[e]*_,v=v+this.B_im[e]*f+this.B_re[e]*_;return t.x=v*this.a+this.x0,t.y=g*this.a+this.y0,t},i.inverse=function(t){var e,i,o,s=t.x,r=t.y,a=s-this.x0,l=r-this.y0,c=l/this.a,h=a/this.a,u=1,d=0,p=0,m=0;for(e=1;6>=e;e++)i=u*c-d*h,o=d*c+u*h,u=i,d=o,p=p+this.C_re[e]*u-this.C_im[e]*d,m=m+this.C_im[e]*u+this.C_re[e]*d;for(var f=0;f<this.iterations;f++){var _,g,v=p,y=m,E=c,P=h;for(e=2;6>=e;e++)_=v*p-y*m,g=y*p+v*m,v=_,y=g,E+=(e-1)*(this.B_re[e]*v-this.B_im[e]*y),P+=(e-1)*(this.B_im[e]*v+this.B_re[e]*y);v=1,y=0;var C=this.B_re[1],S=this.B_im[1];for(e=2;6>=e;e++)_=v*p-y*m,g=y*p+v*m,v=_,y=g,C+=e*(this.B_re[e]*v-this.B_im[e]*y),S+=e*(this.B_im[e]*v+this.B_re[e]*y);var M=C*C+S*S;p=(E*C+P*S)/M,m=(P*C-E*S)/M}var w=p,L=m,R=1,b=0;for(e=1;9>=e;e++)R*=w,b+=this.D[e]*R;var x=this.lat0+b*n*1e5,G=this.long0+L;return t.x=G,t.y=x,t},i.names=["New_Zealand_Map_Grid","nzmg"]},{}],55:[function(t,e,i){var n=t("../common/tsfnz"),o=t("../common/adjust_lon"),s=t("../common/phi2z"),r=Math.PI/2,a=Math.PI/4,l=1e-10;i.init=function(){this.no_off=this.no_off||!1,this.no_rot=this.no_rot||!1,isNaN(this.k0)&&(this.k0=1);var t=Math.sin(this.lat0),e=Math.cos(this.lat0),i=this.e*t;this.bl=Math.sqrt(1+this.es/(1-this.es)*Math.pow(e,4)),this.al=this.a*this.bl*this.k0*Math.sqrt(1-this.es)/(1-i*i);var s=n(this.e,this.lat0,t),r=this.bl/e*Math.sqrt((1-this.es)/(1-i*i));1>r*r&&(r=1);var a,l;if(isNaN(this.longc)){var c=n(this.e,this.lat1,Math.sin(this.lat1)),h=n(this.e,this.lat2,Math.sin(this.lat2));this.el=this.lat0>=0?(r+Math.sqrt(r*r-1))*Math.pow(s,this.bl):(r-Math.sqrt(r*r-1))*Math.pow(s,this.bl);var u=Math.pow(c,this.bl),d=Math.pow(h,this.bl);a=this.el/u,l=.5*(a-1/a);var p=(this.el*this.el-d*u)/(this.el*this.el+d*u),m=(d-u)/(d+u),f=o(this.long1-this.long2);this.long0=.5*(this.long1+this.long2)-Math.atan(p*Math.tan(.5*this.bl*f)/m)/this.bl,this.long0=o(this.long0);var _=o(this.long1-this.long0);this.gamma0=Math.atan(Math.sin(this.bl*_)/l),this.alpha=Math.asin(r*Math.sin(this.gamma0))}else a=this.lat0>=0?r+Math.sqrt(r*r-1):r-Math.sqrt(r*r-1),this.el=a*Math.pow(s,this.bl),l=.5*(a-1/a),this.gamma0=Math.asin(Math.sin(this.alpha)/r),this.long0=this.longc-Math.asin(l*Math.tan(this.gamma0))/this.bl;this.uc=this.no_off?0:this.lat0>=0?this.al/this.bl*Math.atan2(Math.sqrt(r*r-1),Math.cos(this.alpha)):-1*this.al/this.bl*Math.atan2(Math.sqrt(r*r-1),Math.cos(this.alpha))},i.forward=function(t){var e,i,s,c=t.x,h=t.y,u=o(c-this.long0);if(Math.abs(Math.abs(h)-r)<=l)s=h>0?-1:1,i=this.al/this.bl*Math.log(Math.tan(a+s*this.gamma0*.5)),e=-1*s*r*this.al/this.bl;else{var d=n(this.e,h,Math.sin(h)),p=this.el/Math.pow(d,this.bl),m=.5*(p-1/p),f=.5*(p+1/p),_=Math.sin(this.bl*u),g=(m*Math.sin(this.gamma0)-_*Math.cos(this.gamma0))/f;i=Math.abs(Math.abs(g)-1)<=l?Number.POSITIVE_INFINITY:.5*this.al*Math.log((1-g)/(1+g))/this.bl,e=Math.abs(Math.cos(this.bl*u))<=l?this.al*this.bl*u:this.al*Math.atan2(m*Math.cos(this.gamma0)+_*Math.sin(this.gamma0),Math.cos(this.bl*u))/this.bl}return this.no_rot?(t.x=this.x0+e,t.y=this.y0+i):(e-=this.uc,t.x=this.x0+i*Math.cos(this.alpha)+e*Math.sin(this.alpha),t.y=this.y0+e*Math.cos(this.alpha)-i*Math.sin(this.alpha)),t},i.inverse=function(t){var e,i;this.no_rot?(i=t.y-this.y0,e=t.x-this.x0):(i=(t.x-this.x0)*Math.cos(this.alpha)-(t.y-this.y0)*Math.sin(this.alpha),e=(t.y-this.y0)*Math.cos(this.alpha)+(t.x-this.x0)*Math.sin(this.alpha),e+=this.uc);var n=Math.exp(-1*this.bl*i/this.al),a=.5*(n-1/n),c=.5*(n+1/n),h=Math.sin(this.bl*e/this.al),u=(h*Math.cos(this.gamma0)+a*Math.sin(this.gamma0))/c,d=Math.pow(this.el/Math.sqrt((1+u)/(1-u)),1/this.bl);return Math.abs(u-1)<l?(t.x=this.long0,t.y=r):Math.abs(u+1)<l?(t.x=this.long0,t.y=-1*r):(t.y=s(this.e,d),t.x=o(this.long0-Math.atan2(a*Math.cos(this.gamma0)-h*Math.sin(this.gamma0),Math.cos(this.bl*e/this.al))/this.bl)),t},i.names=["Hotine_Oblique_Mercator","Hotine Oblique Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin","Hotine_Oblique_Mercator_Azimuth_Center","omerc"]},{"../common/adjust_lon":5,"../common/phi2z":16,"../common/tsfnz":24}],56:[function(t,e,i){var n=t("../common/e0fn"),o=t("../common/e1fn"),s=t("../common/e2fn"),r=t("../common/e3fn"),a=t("../common/adjust_lon"),l=t("../common/adjust_lat"),c=t("../common/mlfn"),h=1e-10,u=t("../common/gN"),d=20;i.init=function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=n(this.es),this.e1=o(this.es),this.e2=s(this.es),this.e3=r(this.es),this.ml0=this.a*c(this.e0,this.e1,this.e2,this.e3,this.lat0)},i.forward=function(t){var e,i,n,o=t.x,s=t.y,r=a(o-this.long0);if(n=r*Math.sin(s),this.sphere)Math.abs(s)<=h?(e=this.a*r,i=-1*this.a*this.lat0):(e=this.a*Math.sin(n)/Math.tan(s),i=this.a*(l(s-this.lat0)+(1-Math.cos(n))/Math.tan(s)));else if(Math.abs(s)<=h)e=this.a*r,i=-1*this.ml0;else{var d=u(this.a,this.e,Math.sin(s))/Math.tan(s);e=d*Math.sin(n),i=this.a*c(this.e0,this.e1,this.e2,this.e3,s)-this.ml0+d*(1-Math.cos(n))}return t.x=e+this.x0,t.y=i+this.y0,t},i.inverse=function(t){var e,i,n,o,s,r,l,u,p;if(n=t.x-this.x0,o=t.y-this.y0,this.sphere)if(Math.abs(o+this.a*this.lat0)<=h)e=a(n/this.a+this.long0),i=0;else{r=this.lat0+o/this.a,l=n*n/this.a/this.a+r*r,u=r;var m;for(s=d;s;--s)if(m=Math.tan(u),p=-1*(r*(u*m+1)-u-.5*(u*u+l)*m)/((u-r)/m-1),u+=p,Math.abs(p)<=h){i=u;break}e=a(this.long0+Math.asin(n*Math.tan(u)/this.a)/Math.sin(i))}else if(Math.abs(o+this.ml0)<=h)i=0,e=a(this.long0+n/this.a);else{r=(this.ml0+o)/this.a,l=n*n/this.a/this.a+r*r,u=r;var f,_,g,v,y;for(s=d;s;--s)if(y=this.e*Math.sin(u),f=Math.sqrt(1-y*y)*Math.tan(u),_=this.a*c(this.e0,this.e1,this.e2,this.e3,u),g=this.e0-2*this.e1*Math.cos(2*u)+4*this.e2*Math.cos(4*u)-6*this.e3*Math.cos(6*u),v=_/this.a,p=(r*(f*v+1)-v-.5*f*(v*v+l))/(this.es*Math.sin(2*u)*(v*v+l-2*r*v)/(4*f)+(r-v)*(f*g-2/Math.sin(2*u))-g),u-=p,Math.abs(p)<=h){i=u;break}f=Math.sqrt(1-this.es*Math.pow(Math.sin(i),2))*Math.tan(i),e=a(this.long0+Math.asin(n*f/this.a)/Math.sin(i))}return t.x=e,t.y=i,t},i.names=["Polyconic","poly"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/mlfn":14}],57:[function(t,e,i){var n=t("../common/adjust_lon"),o=t("../common/adjust_lat"),s=t("../common/pj_enfn"),r=20,a=t("../common/pj_mlfn"),l=t("../common/pj_inv_mlfn"),c=Math.PI/2,h=1e-10,u=t("../common/asinz");i.init=function(){this.sphere?(this.n=1,this.m=0,this.es=0,this.C_y=Math.sqrt((this.m+1)/this.n),this.C_x=this.C_y/(this.m+1)):this.en=s(this.es)},i.forward=function(t){var e,i,o=t.x,s=t.y;if(o=n(o-this.long0),this.sphere){if(this.m)for(var l=this.n*Math.sin(s),c=r;c;--c){var u=(this.m*s+Math.sin(s)-l)/(this.m+Math.cos(s));if(s-=u,Math.abs(u)<h)break}else s=1!==this.n?Math.asin(this.n*Math.sin(s)):s;e=this.a*this.C_x*o*(this.m+Math.cos(s)),i=this.a*this.C_y*s}else{var d=Math.sin(s),p=Math.cos(s);i=this.a*a(s,d,p,this.en),e=this.a*o*p/Math.sqrt(1-this.es*d*d)}return t.x=e,t.y=i,t},i.inverse=function(t){var e,i,s,r;return t.x-=this.x0,s=t.x/this.a,t.y-=this.y0,e=t.y/this.a,this.sphere?(e/=this.C_y,s/=this.C_x*(this.m+Math.cos(e)),this.m?e=u((this.m*e+Math.sin(e))/this.n):1!==this.n&&(e=u(Math.sin(e)/this.n)),s=n(s+this.long0),e=o(e)):(e=l(t.y/this.a,this.es,this.en),r=Math.abs(e),c>r?(r=Math.sin(e),i=this.long0+t.x*Math.sqrt(1-this.es*r*r)/(this.a*Math.cos(e)),s=n(i)):c>r-h&&(s=this.long0)),t.x=s,t.y=e,t},i.names=["Sinusoidal","sinu"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/asinz":6,"../common/pj_enfn":17,"../common/pj_inv_mlfn":18,"../common/pj_mlfn":19}],58:[function(t,e,i){i.init=function(){var t=this.lat0;this.lambda0=this.long0;var e=Math.sin(t),i=this.a,n=this.rf,o=1/n,s=2*o-Math.pow(o,2),r=this.e=Math.sqrt(s);this.R=this.k0*i*Math.sqrt(1-s)/(1-s*Math.pow(e,2)),this.alpha=Math.sqrt(1+s/(1-s)*Math.pow(Math.cos(t),4)),this.b0=Math.asin(e/this.alpha);var a=Math.log(Math.tan(Math.PI/4+this.b0/2)),l=Math.log(Math.tan(Math.PI/4+t/2)),c=Math.log((1+r*e)/(1-r*e));this.K=a-this.alpha*l+this.alpha*r/2*c},i.forward=function(t){var e=Math.log(Math.tan(Math.PI/4-t.y/2)),i=this.e/2*Math.log((1+this.e*Math.sin(t.y))/(1-this.e*Math.sin(t.y))),n=-this.alpha*(e+i)+this.K,o=2*(Math.atan(Math.exp(n))-Math.PI/4),s=this.alpha*(t.x-this.lambda0),r=Math.atan(Math.sin(s)/(Math.sin(this.b0)*Math.tan(o)+Math.cos(this.b0)*Math.cos(s))),a=Math.asin(Math.cos(this.b0)*Math.sin(o)-Math.sin(this.b0)*Math.cos(o)*Math.cos(s));return t.y=this.R/2*Math.log((1+Math.sin(a))/(1-Math.sin(a)))+this.y0,t.x=this.R*r+this.x0,t},i.inverse=function(t){for(var e=t.x-this.x0,i=t.y-this.y0,n=e/this.R,o=2*(Math.atan(Math.exp(i/this.R))-Math.PI/4),s=Math.asin(Math.cos(this.b0)*Math.sin(o)+Math.sin(this.b0)*Math.cos(o)*Math.cos(n)),r=Math.atan(Math.sin(n)/(Math.cos(this.b0)*Math.cos(n)-Math.sin(this.b0)*Math.tan(o))),a=this.lambda0+r/this.alpha,l=0,c=s,h=-1e3,u=0;Math.abs(c-h)>1e-7;){if(++u>20)return;l=1/this.alpha*(Math.log(Math.tan(Math.PI/4+s/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(c))/2)),h=c,c=2*Math.atan(Math.exp(l))-Math.PI/2}return t.x=a,t.y=c,t},i.names=["somerc"]},{}],59:[function(t,e,i){var n=Math.PI/2,o=1e-10,s=t("../common/sign"),r=t("../common/msfnz"),a=t("../common/tsfnz"),l=t("../common/phi2z"),c=t("../common/adjust_lon");i.ssfn_=function(t,e,i){return e*=i,Math.tan(.5*(n+t))*Math.pow((1-e)/(1+e),.5*i)},i.init=function(){this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=o&&(this.k0=.5*(1+s(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=o&&(this.con=this.lat0>0?1:-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=o&&(this.k0=.5*this.cons*r(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/a(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=r(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-n,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},i.forward=function(t){var e,i,s,r,l,h,u=t.x,d=t.y,p=Math.sin(d),m=Math.cos(d),f=c(u-this.long0);return Math.abs(Math.abs(u-this.long0)-Math.PI)<=o&&Math.abs(d+this.lat0)<=o?(t.x=NaN,t.y=NaN,t):this.sphere?(e=2*this.k0/(1+this.sinlat0*p+this.coslat0*m*Math.cos(f)),t.x=this.a*e*m*Math.sin(f)+this.x0,t.y=this.a*e*(this.coslat0*p-this.sinlat0*m*Math.cos(f))+this.y0,t):(i=2*Math.atan(this.ssfn_(d,p,this.e))-n,r=Math.cos(i),s=Math.sin(i),Math.abs(this.coslat0)<=o?(l=a(this.e,d*this.con,this.con*p),h=2*this.a*this.k0*l/this.cons,t.x=this.x0+h*Math.sin(u-this.long0),t.y=this.y0-this.con*h*Math.cos(u-this.long0),t):(Math.abs(this.sinlat0)<o?(e=2*this.a*this.k0/(1+r*Math.cos(f)),t.y=e*s):(e=2*this.a*this.k0*this.ms1/(this.cosX0*(1+this.sinX0*s+this.cosX0*r*Math.cos(f))),t.y=e*(this.cosX0*s-this.sinX0*r*Math.cos(f))+this.y0),t.x=e*r*Math.sin(f)+this.x0,t))},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e,i,s,r,a,h=Math.sqrt(t.x*t.x+t.y*t.y);if(this.sphere){var u=2*Math.atan(h/(.5*this.a*this.k0));return e=this.long0,i=this.lat0,o>=h?(t.x=e,t.y=i,t):(i=Math.asin(Math.cos(u)*this.sinlat0+t.y*Math.sin(u)*this.coslat0/h),e=c(Math.abs(this.coslat0)<o?this.lat0>0?this.long0+Math.atan2(t.x,-1*t.y):this.long0+Math.atan2(t.x,t.y):this.long0+Math.atan2(t.x*Math.sin(u),h*this.coslat0*Math.cos(u)-t.y*this.sinlat0*Math.sin(u))),t.x=e,t.y=i,t)}if(Math.abs(this.coslat0)<=o){if(o>=h)return i=this.lat0,e=this.long0,t.x=e,t.y=i,t;t.x*=this.con,t.y*=this.con,s=h*this.cons/(2*this.a*this.k0),i=this.con*l(this.e,s),e=this.con*c(this.con*this.long0+Math.atan2(t.x,-1*t.y))}else r=2*Math.atan(h*this.cosX0/(2*this.a*this.k0*this.ms1)),e=this.long0,o>=h?a=this.X0:(a=Math.asin(Math.cos(r)*this.sinX0+t.y*Math.sin(r)*this.cosX0/h),e=c(this.long0+Math.atan2(t.x*Math.sin(r),h*this.cosX0*Math.cos(r)-t.y*this.sinX0*Math.sin(r)))),i=-1*l(this.e,Math.tan(.5*(n+a)));return t.x=e,t.y=i,t},i.names=["stere"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/sign":21,"../common/tsfnz":24}],60:[function(t,e,i){var n=t("./gauss"),o=t("../common/adjust_lon");i.init=function(){n.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},i.forward=function(t){var e,i,s,r;return t.x=o(t.x-this.long0),n.forward.apply(this,[t]),e=Math.sin(t.y),i=Math.cos(t.y),s=Math.cos(t.x),r=this.k0*this.R2/(1+this.sinc0*e+this.cosc0*i*s),t.x=r*i*Math.sin(t.x),t.y=r*(this.cosc0*e-this.sinc0*i*s),t.x=this.a*t.x+this.x0,t.y=this.a*t.y+this.y0,t},i.inverse=function(t){var e,i,s,r,a;if(t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,t.x/=this.k0,t.y/=this.k0,a=Math.sqrt(t.x*t.x+t.y*t.y)){var l=2*Math.atan2(a,this.R2);e=Math.sin(l),i=Math.cos(l),r=Math.asin(i*this.sinc0+t.y*e*this.cosc0/a),s=Math.atan2(t.x*e,a*this.cosc0*i-t.y*this.sinc0*e)}else r=this.phic0,s=0;return t.x=s,t.y=r,n.inverse.apply(this,[t]),t.x=o(t.x+this.long0),t},i.names=["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative"]},{"../common/adjust_lon":5,"./gauss":45}],61:[function(t,e,i){var n=t("../common/e0fn"),o=t("../common/e1fn"),s=t("../common/e2fn"),r=t("../common/e3fn"),a=t("../common/mlfn"),l=t("../common/adjust_lon"),c=Math.PI/2,h=1e-10,u=t("../common/sign"),d=t("../common/asinz");i.init=function(){this.e0=n(this.es),this.e1=o(this.es),this.e2=s(this.es),this.e3=r(this.es),this.ml0=this.a*a(this.e0,this.e1,this.e2,this.e3,this.lat0)},i.forward=function(t){var e,i,n,o=t.x,s=t.y,r=l(o-this.long0),c=Math.sin(s),h=Math.cos(s);if(this.sphere){var u=h*Math.sin(r);if(Math.abs(Math.abs(u)-1)<1e-10)return 93;i=.5*this.a*this.k0*Math.log((1+u)/(1-u)),e=Math.acos(h*Math.cos(r)/Math.sqrt(1-u*u)),0>s&&(e=-e),n=this.a*this.k0*(e-this.lat0)}else{var d=h*r,p=Math.pow(d,2),m=this.ep2*Math.pow(h,2),f=Math.tan(s),_=Math.pow(f,2);e=1-this.es*Math.pow(c,2);var g=this.a/Math.sqrt(e),v=this.a*a(this.e0,this.e1,this.e2,this.e3,s);i=this.k0*g*d*(1+p/6*(1-_+m+p/20*(5-18*_+Math.pow(_,2)+72*m-58*this.ep2)))+this.x0,n=this.k0*(v-this.ml0+g*f*p*(.5+p/24*(5-_+9*m+4*Math.pow(m,2)+p/30*(61-58*_+Math.pow(_,2)+600*m-330*this.ep2))))+this.y0}return t.x=i,t.y=n,t},i.inverse=function(t){var e,i,n,o,s,r,a=6;if(this.sphere){var p=Math.exp(t.x/(this.a*this.k0)),m=.5*(p-1/p),f=this.lat0+t.y/(this.a*this.k0),_=Math.cos(f);e=Math.sqrt((1-_*_)/(1+m*m)),s=d(e),0>f&&(s=-s),r=0===m&&0===_?this.long0:l(Math.atan2(m,_)+this.long0)}else{var g=t.x-this.x0,v=t.y-this.y0;for(e=(this.ml0+v/this.k0)/this.a,i=e,o=0;n=(e+this.e1*Math.sin(2*i)-this.e2*Math.sin(4*i)+this.e3*Math.sin(6*i))/this.e0-i,i+=n,!(Math.abs(n)<=h);o++)if(o>=a)return 95;if(Math.abs(i)<c){var y=Math.sin(i),E=Math.cos(i),P=Math.tan(i),C=this.ep2*Math.pow(E,2),S=Math.pow(C,2),M=Math.pow(P,2),w=Math.pow(M,2);e=1-this.es*Math.pow(y,2);var L=this.a/Math.sqrt(e),R=L*(1-this.es)/e,b=g/(L*this.k0),x=Math.pow(b,2);s=i-L*P*x/R*(.5-x/24*(5+3*M+10*C-4*S-9*this.ep2-x/30*(61+90*M+298*C+45*w-252*this.ep2-3*S))),r=l(this.long0+b*(1-x/6*(1+2*M+C-x/20*(5-2*C+28*M-3*S+8*this.ep2+24*w)))/E)}else s=c*u(v),r=this.long0}return t.x=r,t.y=s,t},i.names=["Transverse_Mercator","Transverse Mercator","tmerc"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/mlfn":14,"../common/sign":21}],62:[function(t,e,i){var n=.017453292519943295,o=t("./tmerc");i.dependsOn="tmerc",i.init=function(){this.zone&&(this.lat0=0,this.long0=(6*Math.abs(this.zone)-183)*n,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,o.init.apply(this),this.forward=o.forward,this.inverse=o.inverse)},i.names=["Universal Transverse Mercator System","utm"]},{"./tmerc":61}],63:[function(t,e,i){var n=t("../common/adjust_lon"),o=Math.PI/2,s=1e-10,r=t("../common/asinz");i.init=function(){this.R=this.a},i.forward=function(t){var e,i,a=t.x,l=t.y,c=n(a-this.long0);Math.abs(l)<=s&&(e=this.x0+this.R*c,i=this.y0);var h=r(2*Math.abs(l/Math.PI));(Math.abs(c)<=s||Math.abs(Math.abs(l)-o)<=s)&&(e=this.x0,i=l>=0?this.y0+Math.PI*this.R*Math.tan(.5*h):this.y0+Math.PI*this.R*-Math.tan(.5*h));var u=.5*Math.abs(Math.PI/c-c/Math.PI),d=u*u,p=Math.sin(h),m=Math.cos(h),f=m/(p+m-1),_=f*f,g=f*(2/p-1),v=g*g,y=Math.PI*this.R*(u*(f-v)+Math.sqrt(d*(f-v)*(f-v)-(v+d)*(_-v)))/(v+d);0>c&&(y=-y),e=this.x0+y;var E=d+f;return y=Math.PI*this.R*(g*E-u*Math.sqrt((v+d)*(d+1)-E*E))/(v+d),i=l>=0?this.y0+y:this.y0-y,t.x=e,t.y=i,t},i.inverse=function(t){var e,i,o,r,a,l,c,h,u,d,p,m,f;return t.x-=this.x0,t.y-=this.y0,p=Math.PI*this.R,o=t.x/p,r=t.y/p,a=o*o+r*r,l=-Math.abs(r)*(1+a),c=l-2*r*r+o*o,h=-2*l+1+2*r*r+a*a,f=r*r/h+(2*c*c*c/h/h/h-9*l*c/h/h)/27,u=(l-c*c/3/h)/h,d=2*Math.sqrt(-u/3),p=3*f/u/d,Math.abs(p)>1&&(p=p>=0?1:-1),m=Math.acos(p)/3,i=t.y>=0?(-d*Math.cos(m+Math.PI/3)-c/3/h)*Math.PI:-(-d*Math.cos(m+Math.PI/3)-c/3/h)*Math.PI,e=Math.abs(o)<s?this.long0:n(this.long0+Math.PI*(a-1+Math.sqrt(1+2*(o*o-r*r)+a*a))/2/o),t.x=e,t.y=i,t},i.names=["Van_der_Grinten_I","VanDerGrinten","vandg"]},{"../common/adjust_lon":5,"../common/asinz":6}],64:[function(t,e){var i=.017453292519943295,n=57.29577951308232,o=1,s=2,r=t("./datum_transform"),a=t("./adjust_axis"),l=t("./Proj"),c=t("./common/toPoint");e.exports=function t(e,h,u){function d(t,e){return(t.datum.datum_type===o||t.datum.datum_type===s)&&"WGS84"!==e.datumCode}var p;return Array.isArray(u)&&(u=c(u)),e.datum&&h.datum&&(d(e,h)||d(h,e))&&(p=new l("WGS84"),t(e,p,u),e=p),"enu"!==e.axis&&a(e,!1,u),"longlat"===e.projName?(u.x*=i,u.y*=i):(e.to_meter&&(u.x*=e.to_meter,u.y*=e.to_meter),e.inverse(u)),e.from_greenwich&&(u.x+=e.from_greenwich),u=r(e.datum,h.datum,u),h.from_greenwich&&(u.x-=h.from_greenwich),"longlat"===h.projName?(u.x*=n,u.y*=n):(h.forward(u),h.to_meter&&(u.x/=h.to_meter,u.y/=h.to_meter)),"enu"!==h.axis&&a(h,!0,u),u}},{"./Proj":2,"./adjust_axis":3,"./common/toPoint":23,"./datum_transform":30}],65:[function(t,e){function i(t,e,i){t[e]=i.map(function(t){var e={};return n(t,e),e}).reduce(function(t,e){return l(t,e)},{})}function n(t,e){var o;return Array.isArray(t)?(o=t.shift(),"PARAMETER"===o&&(o=t.shift()),void(1===t.length?Array.isArray(t[0])?(e[o]={},n(t[0],e[o])):e[o]=t[0]:t.length?"TOWGS84"===o?e[o]=t:(e[o]={},["UNIT","PRIMEM","VERT_DATUM"].indexOf(o)>-1?(e[o]={name:t[0].toLowerCase(),convert:t[1]},3===t.length&&(e[o].auth=t[2])):"SPHEROID"===o?(e[o]={name:t[0],a:t[1],rf:t[2]},4===t.length&&(e[o].auth=t[3])):["GEOGCS","GEOCCS","DATUM","VERT_CS","COMPD_CS","LOCAL_CS","FITTED_CS","LOCAL_DATUM"].indexOf(o)>-1?(t[0]=["name",t[0]],i(e,o,t)):t.every(function(t){return Array.isArray(t)})?i(e,o,t):n(t,e[o])):e[o]=!0)):void(e[t]=!0)}function o(t,e){var i=e[0],n=e[1];!(i in t)&&n in t&&(t[i]=t[n],3===e.length&&(t[i]=e[2](t[i])))}function s(t){return t*a}function r(t){function e(e){var i=t.to_meter||1;return parseFloat(e,10)*i}"GEOGCS"===t.type?t.projName="longlat":"LOCAL_CS"===t.type?(t.projName="identity",t.local=!0):t.projName="object"==typeof t.PROJECTION?Object.keys(t.PROJECTION)[0]:t.PROJECTION,t.UNIT&&(t.units=t.UNIT.name.toLowerCase(),"metre"===t.units&&(t.units="meter"),t.UNIT.convert&&(t.to_meter=parseFloat(t.UNIT.convert,10))),t.GEOGCS&&(t.datumCode=t.GEOGCS.DATUM?t.GEOGCS.DATUM.name.toLowerCase():t.GEOGCS.name.toLowerCase(),"d_"===t.datumCode.slice(0,2)&&(t.datumCode=t.datumCode.slice(2)),("new_zealand_geodetic_datum_1949"===t.datumCode||"new_zealand_1949"===t.datumCode)&&(t.datumCode="nzgd49"),"wgs_1984"===t.datumCode&&("Mercator_Auxiliary_Sphere"===t.PROJECTION&&(t.sphere=!0),t.datumCode="wgs84"),"_ferro"===t.datumCode.slice(-6)&&(t.datumCode=t.datumCode.slice(0,-6)),"_jakarta"===t.datumCode.slice(-8)&&(t.datumCode=t.datumCode.slice(0,-8)),~t.datumCode.indexOf("belge")&&(t.datumCode="rnb72"),t.GEOGCS.DATUM&&t.GEOGCS.DATUM.SPHEROID&&(t.ellps=t.GEOGCS.DATUM.SPHEROID.name.replace("_19","").replace(/[Cc]larke\_18/,"clrk"),"international"===t.ellps.toLowerCase().slice(0,13)&&(t.ellps="intl"),t.a=t.GEOGCS.DATUM.SPHEROID.a,t.rf=parseFloat(t.GEOGCS.DATUM.SPHEROID.rf,10)),~t.datumCode.indexOf("osgb_1936")&&(t.datumCode="osgb36")),t.b&&!isFinite(t.b)&&(t.b=t.a);var i=function(e){return o(t,e)},n=[["standard_parallel_1","Standard_Parallel_1"],["standard_parallel_2","Standard_Parallel_2"],["false_easting","False_Easting"],["false_northing","False_Northing"],["central_meridian","Central_Meridian"],["latitude_of_origin","Latitude_Of_Origin"],["scale_factor","Scale_Factor"],["k0","scale_factor"],["latitude_of_center","Latitude_of_center"],["lat0","latitude_of_center",s],["longitude_of_center","Longitude_Of_Center"],["longc","longitude_of_center",s],["x0","false_easting",e],["y0","false_northing",e],["long0","central_meridian",s],["lat0","latitude_of_origin",s],["lat0","standard_parallel_1",s],["lat1","standard_parallel_1",s],["lat2","standard_parallel_2",s],["alpha","azimuth",s],["srsCode","name"]];n.forEach(i),t.long0||!t.longc||"Albers_Conic_Equal_Area"!==t.PROJECTION&&"Lambert_Azimuthal_Equal_Area"!==t.PROJECTION||(t.long0=t.longc)}var a=.017453292519943295,l=t("./extend");e.exports=function(t,e){var i=JSON.parse((","+t).replace(/\s*\,\s*([A-Z_0-9]+?)(\[)/g,',["$1",').slice(1).replace(/\s*\,\s*([A-Z_0-9]+?)\]/g,',"$1"]')),o=i.shift(),s=i.shift();i.unshift(["name",s]),i.unshift(["type",o]),i.unshift("output");var a={};return n(i,a),r(a.output),l(e,a.output)}},{"./extend":33}],66:[function(t,e,i){function n(t){return t*(Math.PI/180)}function o(t){return 180*(t/Math.PI)}function s(t){var e,i,o,s,r,l,c,h,u,d=t.lat,p=t.lon,m=6378137,f=.00669438,_=.9996,g=n(d),v=n(p);u=Math.floor((p+180)/6)+1,180===p&&(u=60),d>=56&&64>d&&p>=3&&12>p&&(u=32),d>=72&&84>d&&(p>=0&&9>p?u=31:p>=9&&21>p?u=33:p>=21&&33>p?u=35:p>=33&&42>p&&(u=37)),e=6*(u-1)-180+3,h=n(e),i=f/(1-f),o=m/Math.sqrt(1-f*Math.sin(g)*Math.sin(g)),s=Math.tan(g)*Math.tan(g),r=i*Math.cos(g)*Math.cos(g),l=Math.cos(g)*(v-h),c=m*((1-f/4-3*f*f/64-5*f*f*f/256)*g-(3*f/8+3*f*f/32+45*f*f*f/1024)*Math.sin(2*g)+(15*f*f/256+45*f*f*f/1024)*Math.sin(4*g)-35*f*f*f/3072*Math.sin(6*g));var y=_*o*(l+(1-s+r)*l*l*l/6+(5-18*s+s*s+72*r-58*i)*l*l*l*l*l/120)+5e5,E=_*(c+o*Math.tan(g)*(l*l/2+(5-s+9*r+4*r*r)*l*l*l*l/24+(61-58*s+s*s+600*r-330*i)*l*l*l*l*l*l/720));return 0>d&&(E+=1e7),{northing:Math.round(E),easting:Math.round(y),zoneNumber:u,zoneLetter:a(d)}}function r(t){var e=t.northing,i=t.easting,n=t.zoneLetter,s=t.zoneNumber;if(0>s||s>60)return null;var a,l,c,h,u,d,p,m,f,_,g=.9996,v=6378137,y=.00669438,E=(1-Math.sqrt(1-y))/(1+Math.sqrt(1-y)),P=i-5e5,C=e;"N">n&&(C-=1e7),m=6*(s-1)-180+3,a=y/(1-y),p=C/g,f=p/(v*(1-y/4-3*y*y/64-5*y*y*y/256)),_=f+(3*E/2-27*E*E*E/32)*Math.sin(2*f)+(21*E*E/16-55*E*E*E*E/32)*Math.sin(4*f)+151*E*E*E/96*Math.sin(6*f),l=v/Math.sqrt(1-y*Math.sin(_)*Math.sin(_)),c=Math.tan(_)*Math.tan(_),h=a*Math.cos(_)*Math.cos(_),u=v*(1-y)/Math.pow(1-y*Math.sin(_)*Math.sin(_),1.5),d=P/(l*g);var S=_-l*Math.tan(_)/u*(d*d/2-(5+3*c+10*h-4*h*h-9*a)*d*d*d*d/24+(61+90*c+298*h+45*c*c-252*a-3*h*h)*d*d*d*d*d*d/720);S=o(S);var M=(d-(1+2*c+h)*d*d*d/6+(5-2*h+28*c-3*h*h+8*a+24*c*c)*d*d*d*d*d/120)/Math.cos(_);M=m+o(M);var w;if(t.accuracy){var L=r({northing:t.northing+t.accuracy,easting:t.easting+t.accuracy,zoneLetter:t.zoneLetter,zoneNumber:t.zoneNumber});w={top:L.lat,right:L.lon,bottom:S,left:M}}else w={lat:S,lon:M};return w}function a(t){var e="Z";return 84>=t&&t>=72?e="X":72>t&&t>=64?e="W":64>t&&t>=56?e="V":56>t&&t>=48?e="U":48>t&&t>=40?e="T":40>t&&t>=32?e="S":32>t&&t>=24?e="R":24>t&&t>=16?e="Q":16>t&&t>=8?e="P":8>t&&t>=0?e="N":0>t&&t>=-8?e="M":-8>t&&t>=-16?e="L":-16>t&&t>=-24?e="K":-24>t&&t>=-32?e="J":-32>t&&t>=-40?e="H":-40>t&&t>=-48?e="G":-48>t&&t>=-56?e="F":-56>t&&t>=-64?e="E":-64>t&&t>=-72?e="D":-72>t&&t>=-80&&(e="C"),e}function l(t,e){var i=""+t.easting,n=""+t.northing;return t.zoneNumber+t.zoneLetter+c(t.easting,t.northing,t.zoneNumber)+i.substr(i.length-5,e)+n.substr(n.length-5,e)}function c(t,e,i){var n=h(i),o=Math.floor(t/1e5),s=Math.floor(e/1e5)%20;return u(o,s,n)}function h(t){var e=t%_;return 0===e&&(e=_),e}function u(t,e,i){var n=i-1,o=g.charCodeAt(n),s=v.charCodeAt(n),r=o+t-1,a=s+e,l=!1;r>S&&(r=r-S+y-1,l=!0),(r===E||E>o&&r>E||(r>E||E>o)&&l)&&r++,(r===P||P>o&&r>P||(r>P||P>o)&&l)&&(r++,r===E&&r++),r>S&&(r=r-S+y-1),a>C?(a=a-C+y-1,
-l=!0):l=!1,(a===E||E>s&&a>E||(a>E||E>s)&&l)&&a++,(a===P||P>s&&a>P||(a>P||P>s)&&l)&&(a++,a===E&&a++),a>C&&(a=a-C+y-1);var c=String.fromCharCode(r)+String.fromCharCode(a);return c}function d(t){if(t&&0===t.length)throw"MGRSPoint coverting from nothing";for(var e,i=t.length,n=null,o="",s=0;!/[A-Z]/.test(e=t.charAt(s));){if(s>=2)throw"MGRSPoint bad conversion from: "+t;o+=e,s++}var r=parseInt(o,10);if(0===s||s+3>i)throw"MGRSPoint bad conversion from: "+t;var a=t.charAt(s++);if("A">=a||"B"===a||"Y"===a||a>="Z"||"I"===a||"O"===a)throw"MGRSPoint zone letter "+a+" not handled: "+t;n=t.substring(s,s+=2);for(var l=h(r),c=p(n.charAt(0),l),u=m(n.charAt(1),l);u<f(a);)u+=2e6;var d=i-s;if(d%2!==0)throw"MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters"+t;var _,g,v,y,E,P=d/2,C=0,S=0;return P>0&&(_=1e5/Math.pow(10,P),g=t.substring(s,s+P),C=parseFloat(g)*_,v=t.substring(s+P),S=parseFloat(v)*_),y=C+c,E=S+u,{easting:y,northing:E,zoneLetter:a,zoneNumber:r,accuracy:_}}function p(t,e){for(var i=g.charCodeAt(e-1),n=1e5,o=!1;i!==t.charCodeAt(0);){if(i++,i===E&&i++,i===P&&i++,i>S){if(o)throw"Bad character: "+t;i=y,o=!0}n+=1e5}return n}function m(t,e){if(t>"V")throw"MGRSPoint given invalid Northing "+t;for(var i=v.charCodeAt(e-1),n=0,o=!1;i!==t.charCodeAt(0);){if(i++,i===E&&i++,i===P&&i++,i>C){if(o)throw"Bad character: "+t;i=y,o=!0}n+=1e5}return n}function f(t){var e;switch(t){case"C":e=11e5;break;case"D":e=2e6;break;case"E":e=28e5;break;case"F":e=37e5;break;case"G":e=46e5;break;case"H":e=55e5;break;case"J":e=64e5;break;case"K":e=73e5;break;case"L":e=82e5;break;case"M":e=91e5;break;case"N":e=0;break;case"P":e=8e5;break;case"Q":e=17e5;break;case"R":e=26e5;break;case"S":e=35e5;break;case"T":e=44e5;break;case"U":e=53e5;break;case"V":e=62e5;break;case"W":e=7e6;break;case"X":e=79e5;break;default:e=-1}if(e>=0)return e;throw"Invalid zone letter: "+t}var _=6,g="AJSAJS",v="AFAFAF",y=65,E=73,P=79,C=86,S=90;i.forward=function(t,e){return e=e||5,l(s({lat:t[1],lon:t[0]}),e)},i.inverse=function(t){var e=r(d(t.toUpperCase()));return[e.left,e.bottom,e.right,e.top]},i.toPoint=function(t){var e=i.inverse(t);return[(e[2]+e[0])/2,(e[3]+e[1])/2]}},{}],67:[function(t,e){e.exports={name:"proj4",version:"2.2.1",description:"Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.",main:"lib/index.js",directories:{test:"test",doc:"docs"},scripts:{test:"./node_modules/istanbul/lib/cli.js test ./node_modules/mocha/bin/_mocha test/test.js"},repository:{type:"git",url:"git://github.com/proj4js/proj4js.git"},author:"",license:"MIT",jam:{main:"dist/proj4.js",include:["dist/proj4.js","README.md","AUTHORS","LICENSE.md"]},devDependencies:{"grunt-cli":"~0.1.13",grunt:"~0.4.2","grunt-contrib-connect":"~0.6.0","grunt-contrib-jshint":"~0.8.0",chai:"~1.8.1",mocha:"~1.17.1","grunt-mocha-phantomjs":"~0.4.0",browserify:"~3.24.5","grunt-browserify":"~1.3.0","grunt-contrib-uglify":"~0.3.2",curl:"git://github.com/cujojs/curl.git",istanbul:"~0.2.4",tin:"~0.4.0"},dependencies:{mgrs:"0.0.0"}}},{}],"./includedProjections":[function(t,e){e.exports=t("gWUPNW")},{}],gWUPNW:[function(t,e){var i=[t("./lib/projections/tmerc"),t("./lib/projections/utm"),t("./lib/projections/sterea"),t("./lib/projections/stere"),t("./lib/projections/somerc"),t("./lib/projections/omerc"),t("./lib/projections/lcc"),t("./lib/projections/krovak"),t("./lib/projections/cass"),t("./lib/projections/laea"),t("./lib/projections/aea"),t("./lib/projections/gnom"),t("./lib/projections/cea"),t("./lib/projections/eqc"),t("./lib/projections/poly"),t("./lib/projections/nzmg"),t("./lib/projections/mill"),t("./lib/projections/sinu"),t("./lib/projections/moll"),t("./lib/projections/eqdc"),t("./lib/projections/vandg"),t("./lib/projections/aeqd")];e.exports=function(t){i.forEach(function(e){t.Proj.projections.add(e)})}},{"./lib/projections/aea":39,"./lib/projections/aeqd":40,"./lib/projections/cass":41,"./lib/projections/cea":42,"./lib/projections/eqc":43,"./lib/projections/eqdc":44,"./lib/projections/gnom":46,"./lib/projections/krovak":47,"./lib/projections/laea":48,"./lib/projections/lcc":49,"./lib/projections/mill":52,"./lib/projections/moll":53,"./lib/projections/nzmg":54,"./lib/projections/omerc":55,"./lib/projections/poly":56,"./lib/projections/sinu":57,"./lib/projections/somerc":58,"./lib/projections/stere":59,"./lib/projections/sterea":60,"./lib/projections/tmerc":61,"./lib/projections/utm":62,"./lib/projections/vandg":63}]},{},[35])(35)}),!function(t,e){proj4leaflet07x=function(t,i){return"function"==typeof e?e(t,i):e}(leaflet,proj4)}(this,function(t,e){return t.Proj={},t.Proj._isProj4Obj=function(t){return"undefined"!=typeof t.inverse&&"undefined"!=typeof t.forward},t.Proj.ScaleDependantTransformation=function(t){this.scaleTransforms=t},t.Proj.ScaleDependantTransformation.prototype.transform=function(t,e){return this.scaleTransforms[e].transform(t,e)},t.Proj.ScaleDependantTransformation.prototype.untransform=function(t,e){return this.scaleTransforms[e].untransform(t,e)},t.Proj.Projection=t.Class.extend({initialize:function(i,n){if(t.Proj._isProj4Obj(i))this._proj=i;else{var o=i;if(n)e.defs(o,n);else if(void 0===e.defs[o]){var s=o.split(":");if(s.length>3&&(o=s[s.length-3]+":"+s[s.length-1]),void 0===e.defs[o])throw"No projection definition for code "+o}this._proj=e(o)}},project:function(e){var i=this._proj.forward([e.lng,e.lat]);return new t.Point(i[0],i[1])},unproject:function(e,i){var n=this._proj.inverse([e.x,e.y]);return new t.LatLng(n[1],n[0],i)}}),t.Proj.CRS=t.Class.extend({includes:t.CRS,options:{transformation:new t.Transformation(1,0,-1,0)},initialize:function(e,i,n){var o,s,r,a;if(t.Proj._isProj4Obj(e)?(s=e,o=s.srsCode,a=i||{},this.projection=new t.Proj.Projection(s)):(o=e,r=i,a=n||{},this.projection=new t.Proj.Projection(o,r)),t.Util.setOptions(this,a),this.code=o,this.transformation=this.options.transformation,this.options.origin&&(this.transformation=new t.Transformation(1,-this.options.origin[0],-1,this.options.origin[1])),this.options.scales)this._scales=this.options.scales;else if(this.options.resolutions){this._scales=[];for(var l=this.options.resolutions.length-1;l>=0;l--)this.options.resolutions[l]&&(this._scales[l]=1/this.options.resolutions[l])}},scale:function(t){var e,i,n,o,s=Math.floor(t);return t===s?this._scales[t]:(e=this._scales[s],i=this._scales[s+1],n=i-e,o=t-s,e+n*o)},getSize:function(e){var i,n,o,s=this.options.bounds;return s?(i=this.scale(e),n=this.transformation.transform(s.min,i),o=this.transformation.transform(s.max,i),t.point(Math.abs(o.x-n.x),Math.abs(o.y-n.y))):(i=256*Math.pow(2,e),t.point(i,i))}}),t.Proj.CRS.TMS=t.Proj.CRS.extend({options:{tileSize:256},initialize:function(e,i,n,o){var s,r,a,l,c;t.Proj._isProj4Obj(e)?(a=e,l=i,c=n||{},c.origin=[l[0],l[3]],t.Proj.CRS.prototype.initialize.call(this,a,c)):(s=e,r=i,l=n,c=o||{},c.origin=[l[0],l[3]],t.Proj.CRS.prototype.initialize.call(this,s,r,c)),this.projectedBounds=l,this._sizes=this._calculateSizes()},_calculateSizes:function(){var e,i,n,o,s=[],r=this.projectedBounds;for(i=this._scales.length-1;i>=0;i--)this._scales[i]&&(e=this.options.tileSize/this._scales[i],n=Math.ceil(parseFloat((r[2]-r[0])/e).toPrecision(3))*e*this._scales[i],o=Math.ceil(parseFloat((r[3]-r[1])/e).toPrecision(3))*e*this._scales[i],s[i]=t.point(n,o));return s},getSize:function(t){return this._sizes[t]}}),t.Proj.TileLayer={},t.Proj.TileLayer.TMS=t.TileLayer.extend({options:{continuousWorld:!0},initialize:function(e,i,n){var o,s,r,a,l=!0;if(!(i instanceof t.Proj.CRS.TMS))throw"CRS is not L.Proj.CRS.TMS.";for(t.TileLayer.prototype.initialize.call(this,e,n),this.options.tms=!1,this.crs=i,r=this.crs.projectedBounds,a=this.options.minZoom;a<this.options.maxZoom&&l;a++){var c=(r[3]-r[1])/this._projectedTileSize(a);l=Math.abs(c-Math.round(c))>.001}if(!l){for(o={},a=this.options.minZoom;a<this.options.maxZoom;a++)s=r[1]+Math.ceil((r[3]-r[1])/this._projectedTileSize(a))*this._projectedTileSize(a),o[this.crs.scale(a)]=new t.Transformation(1,-r[0],-1,s);this.crs=new t.Proj.CRS.TMS(this.crs.projection._proj,r,this.crs.options),this.crs.transformation=new t.Proj.ScaleDependantTransformation(o)}},getTileUrl:function(e){var i=this._map.getZoom(),n=Math.ceil((this.crs.projectedBounds[3]-this.crs.projectedBounds[1])/this._projectedTileSize(i));return t.Util.template(this._url,t.Util.extend({s:this._getSubdomain(e),z:this._getZoomForUrl(),x:e.x,y:n-e.y-1},this.options))},_projectedTileSize:function(t){return this.options.tileSize/this.crs.scale(t)}}),t.Proj.GeoJSON=t.GeoJSON.extend({initialize:function(e,i){this._callLevel=0,t.GeoJSON.prototype.initialize.call(this,null,i),e&&this.addData(e)},addData:function(e){var i;e&&(e.crs&&"name"===e.crs.type?i=new t.Proj.CRS(e.crs.properties.name):e.crs&&e.crs.type&&(i=new t.Proj.CRS(e.crs.type+":"+e.crs.properties.code)),void 0!==i&&(this.options.coordsToLatLng=function(e){var n=t.point(e[0],e[1]);return i.projection.unproject(n)})),this._callLevel++;try{t.GeoJSON.prototype.addData.call(this,e)}finally{this._callLevel--,0===this._callLevel&&delete this.options.coordsToLatLng}}}),t.Proj.geoJson=function(e,i){return new t.Proj.GeoJSON(e,i)},t.Proj.ImageOverlay=t.ImageOverlay.extend({initialize:function(e,i,n){t.ImageOverlay.prototype.initialize.call(this,e,null,n),this._projBounds=i},_animateZoom:function(e){var i=t.point(this._projBounds.min.x,this._projBounds.max.y),n=t.point(this._projBounds.max.x,this._projBounds.min.y),o=this._projectedToNewLayerPoint(i,e.zoom,e.center),s=this._projectedToNewLayerPoint(n,e.zoom,e.center).subtract(o),r=o.add(s._multiplyBy((1-1/e.scale)/2));this._image.style[t.DomUtil.TRANSFORM]=t.DomUtil.getTranslateString(r)+" scale("+this._map.getZoomScale(e.zoom)+") "},_reset:function(){var e=this._map.getZoom(),i=this._map.getPixelOrigin(),n=t.bounds(this._transform(this._projBounds.min,e)._subtract(i),this._transform(this._projBounds.max,e)._subtract(i)),o=n.getSize(),s=this._image;t.DomUtil.setPosition(s,n.min),s.style.width=o.x+"px",s.style.height=o.y+"px"},_projectedToNewLayerPoint:function(t,e,i){var n=this._map._getNewTopLeftPoint(i,e).add(this._map._getMapPanePos());return this._transform(t,e)._subtract(n)},_transform:function(t,e){var i=this._map.options.crs,n=i.transformation,o=i.scale(e);return n.transform(t,o)}}),t.Proj.imageOverlay=function(e,i,n){return new t.Proj.ImageOverlay(e,i,n)},"undefined"!=typeof t.CRS&&(t.CRS.proj4js=function(){return function(e,i,n,o){return o=o||{},n&&(o.transformation=n),new t.Proj.CRS(e,i,o)}}()),t.Proj}),!function(t,e){proj4leaflet10x=function(t,i){return"function"==typeof e?e(t,i):e}(leaflet,proj4)}(this,function(t,e){return t.Proj={},t.Proj._isProj4Obj=function(t){return"undefined"!=typeof t.inverse&&"undefined"!=typeof t.forward},t.Proj.Projection=t.Class.extend({initialize:function(e,i,n){var o=t.Proj._isProj4Obj(e);this._proj=o?e:this._projFromCodeDef(e,i),this.bounds=o?i:n},project:function(e){var i=this._proj.forward([e.lng,e.lat]);return new t.Point(i[0],i[1])},unproject:function(e,i){var n=this._proj.inverse([e.x,e.y]);return new t.LatLng(n[1],n[0],i)},_projFromCodeDef:function(t,i){if(i)e.defs(t,i);else if(void 0===e.defs[t]){var n=t.split(":");if(n.length>3&&(t=n[n.length-3]+":"+n[n.length-1]),void 0===e.defs[t])throw"No projection definition for code "+t}return e(t)}}),t.Proj.CRS=t.Class.extend({includes:t.CRS,options:{transformation:new t.Transformation(1,0,-1,0)},initialize:function(e,i,n){var o,s,r,a;if(t.Proj._isProj4Obj(e)?(s=e,o=s.srsCode,a=i||{},this.projection=new t.Proj.Projection(s,a.bounds)):(o=e,r=i,a=n||{},this.projection=new t.Proj.Projection(o,r,a.bounds)),t.Util.setOptions(this,a),this.code=o,this.transformation=this.options.transformation,this.options.origin&&(this.transformation=new t.Transformation(1,-this.options.origin[0],-1,this.options.origin[1])),this.options.scales)this._scales=this.options.scales;else if(this.options.resolutions){this._scales=[];for(var l=this.options.resolutions.length-1;l>=0;l--)this.options.resolutions[l]&&(this._scales[l]=1/this.options.resolutions[l])}this.infinite=!this.options.bounds},scale:function(t){var e,i,n,o,s=Math.floor(t);return t===s?this._scales[t]:(e=this._scales[s],i=this._scales[s+1],n=i-e,o=t-s,e+n*o)},zoom:function(t){var e,i,n=this._closestElement(this._scales,t),o=this._scales.indexOf(n);return t===n?o:(e=o+1,i=this._scales[e]-n,(t-n)/i+o)},_closestElement:function(t,e){for(var i,n=t.length;n--;)t[n]<=e&&(void 0===i||i<t[n])&&(i=t[n]);return i}}),t.Proj.GeoJSON=t.GeoJSON.extend({initialize:function(e,i){if(e.crs&&"name"===e.crs.type){var n=new t.Proj.CRS(e.crs.properties.name);i=i||{},i.coordsToLatLng=function(e){var i=t.point(e[0],e[1]);return n.projection.unproject(i)}}t.GeoJSON.prototype.initialize.call(this,e,i)}}),t.Proj.geoJson=function(e,i){return new t.Proj.GeoJSON(e,i)},t.Proj}),LeafletCRSProj4Leaflet=function(t,e,i){return{load:function(){console.log("loading lib proj4leaflet ...");var t=null;if(0===e.version.lastIndexOf("0.7",0))t=proj4leaflet07x,console.log("loaded version for leaflet 0.7.7 ...");else{if(0!==e.version.lastIndexOf("1.0",0))return void console.log("version leaflet incompatible !");t=proj4leaflet10x,console.log("loaded version for leaflet 1.0.0 ...")}return e.Proj=t,e.Proj}}}({},leaflet,proj4),CommonUtilsRegister=function(t){var e={isLoaded:!1,get:function(t){if(""!==t&&null!==t&&"undefined"!=typeof t){var e=t.split(":");if(2===e.length){var i=e[0],n=e[1];if(this.hasOwnProperty(i)&&this[i].hasOwnProperty(n))return this[i][n]}}},load:function(){if(!this.isLoaded){for(var e=["IGNF","EPSG","CRS"],i=0;i<e.length;i++){var n=e[i],o=this[n];for(var s in o)if(o.hasOwnProperty(s)){var r=n+":"+s;t.defs(r,this.get(r))}}this.isLoaded=!0}},EPSG:{4149:"+title=CH1903 +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs ",4150:"+title=CH1903plus +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs ",4151:"+title=CHTRF95 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4171:"+title=RGF93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4230:"+title=ED50 +proj=longlat +ellps=intl +no_defs ",4235:"+title=Guyane Francaise +proj=longlat +ellps=intl +no_defs ",4258:"+title=ETRS89 +proj=longlat +ellps=GRS80 +no_defs ",4275:"+title=NTF +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +no_defs ",4322:"+title=WGS 72 +proj=longlat +ellps=WGS72 +no_defs ",4326:"+title=WGS 84 +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ",4467:"+proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",4470:"+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4471:"+proj=utm +zone=38 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",4474:"+proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs ",4558:"+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4559:"+proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",4621:"+title=Fort Marigot +proj=longlat +ellps=intl +towgs84=137,248,-430,0,0,0,0 +no_defs ",4622:"+title=Guadeloupe 1948 +proj=longlat +ellps=intl +no_defs ",4623:"+title=CSG67 +proj=longlat +ellps=intl +towgs84=-186,230,110,0,0,0,0 +no_defs ",4624:"+title=RGFG95 +proj=longlat +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +no_defs ",4625:"+title=Martinique 1938 +proj=longlat +ellps=intl +no_defs ",4626:"+title=Reunion 1947 +proj=longlat +ellps=intl +no_defs ",4627:"+title=RGR92 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4628:"+title=Tahiti 52 +proj=longlat +ellps=intl +towgs84=162,117,154,0,0,0,0 +no_defs ",4629:"+title=Tahaa 54 +proj=longlat +ellps=intl +no_defs ",4630:"+title=IGN72 Nuku Hiva +proj=longlat +ellps=intl +no_defs ",4632:"+title=Combani 1950 +proj=longlat +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +no_defs ",4633:"+title=IGN56 Lifou +proj=longlat +ellps=intl +no_defs ",4634:"+title=IGN72 Grand Terre +proj=longlat +ellps=intl +no_defs ",4637:"+title=Perroud 1950 +proj=longlat +ellps=intl +towgs84=325,154,172,0,0,0,0 +no_defs ",4638:"+title=Saint Pierre et Miquelon 1950 +proj=longlat +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +no_defs ",4640:"+title=RRAF 1991 +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs ",4641:"+title=IGN53 Mare +proj=longlat +ellps=intl +no_defs ",4645:"+title=RGNC 1991 +proj=longlat +ellps=intl +towgs84=0,0,0,0,0,0,0 +no_defs ",4687:"+proj=longlat +ellps=GRS80 +no_defs ",4662:"+title=IGN72 Grande Terre +proj=longlat +ellps=intl +no_defs ",4689:"+title=IGN63 Hiva Oa +proj=longlat +ellps=intl +no_defs ",4690:"+title=Tahiti 79 +proj=longlat +ellps=intl +no_defs ",4691:"+title=Moorea 87 +proj=longlat +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +no_defs ",4692:"+title=Maupiti 83 +proj=longlat +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +no_defs ",4698:"+title=IGN 1962 Kerguelen +proj=longlat +ellps=intl +towgs84=145,-187,103,0,0,0,0 +no_defs ",4749:"+title=RGNC91-93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ",4750:"+title=ST87 Ouvea +proj=longlat +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +no_defs ",4807:"+title=NTF (Paris) +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +no_defs ",2056:"+title=CH1903+ / LV95 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ",2154:"+title=RGF93 / Lambert-93 +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",2213:"+title=ETRS89 / TM 30 NE +proj=tmerc +lat_0=0 +lon_0=30 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs ",2969:"+title=Fort Marigot / UTM zone 20N +proj=utm +zone=20 +ellps=intl +towgs84=137,248,-430,0,0,0,0 +units=m +no_defs ",2970:"+title=Guadeloupe 1948 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs ",2971:"+title=CSG67 / UTM zone 22N +proj=utm +zone=22 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs ",2972:"+title=RGFG95 / UTM zone 22N +proj=utm +zone=22 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs ",2973:"+title=Martinique 1938 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs ",2975:"+title=RGR92 / UTM zone 40S +proj=utm +zone=40 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",2976:"+title=Tahiti 52 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=162,117,154,0,0,0,0 +units=m +no_defs ",2977:"+title=Tahaa 54 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +units=m +no_defs ",2978:"+title=IGN72 Nuku Hiva / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs ",2980:"+title=Combani 1950 / UTM zone 38S +proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs ",2981:"+title=IGN56 Lifou / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",2982:"+title=IGN72 Grand Terre / UTM zone 58S (deprecated) +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",2984:"+title=RGNC 1991 / Lambert New Caledonia (deprecated) +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=intl +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",2986:"+title=Terre Adelie 1950 +proj=stere +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +lat_ts=-67.000000000 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs",2987:"+title=Saint Pierre et Miquelon 1950 / UTM zone 21N +proj=utm +zone=21 +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +units=m +no_defs ",2989:"+title=RRAF 1991 / UTM zone 20N +proj=utm +zone=20 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",2990:"+title=Reunion 1947 / TM Reunion (deprecated) +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=50000 +y_0=160000 +ellps=intl +units=m +no_defs ",2995:"+title=IGN53 Mare / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",3038:"+proj=utm +zone=26 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3039:"+proj=utm +zone=27 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3040:"+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3041:"+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3045:"+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3046:"+proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3047:"+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3048:"+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3049:"+proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3050:"+proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3051:"+proj=utm +zone=39 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3034:"+title=ETRS89 / ETRS-LCC +proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +units=m +no_defs ",3035:"+title=ETRS89 / ETRS-LAEA +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs ",3042:"+title=ETRS89 / ETRS-TM30 +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs ",3043:"+title=ETRS89 / ETRS-TM31 +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs ",3044:"+title=ETRS89 / ETRS-TM32 +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs ",25828:"+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25829:"+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25833:"+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25834:"+proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25835:"+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25836:"+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25837:"+proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",25838:"+proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3060:"+title=IGN72 Grande Terre / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ",3163:"+title=RGNC91-93 / Lambert New Caledonia +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3164:"+title=ST87 Ouvea / UTM zone 58S +proj=utm +zone=58 +south +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +units=m +no_defs ",3165:"+title=NEA74 Noumea / Noumea Lambert +proj=lcc +lat_1=-22.24469175 +lat_2=-22.29469175 +lat_0=-22.26969175 +lon_0=166.44242575 +x_0=0.66 +y_0=1.02 +ellps=intl +units=m +no_defs ",3166:"+title=NEA74 Noumea / Noumea Lambert 2 +proj=lcc +lat_1=-22.24472222222222 +lat_2=-22.29472222222222 +lat_0=-22.26972222222222 +lon_0=166.4425 +x_0=8.313000000000001 +y_0=-2.354 +ellps=intl +units=m +no_defs ",3169:"+title=RGNC91-93 / UTM zone 57S +proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3170:"+title=RGNC91-93 / UTM zone 58S +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3171:"+title=RGNC91-93 / UTM zone 59S +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ",3172:"+title=IGN53 Mare / UTM zone 59S +proj=utm +zone=59 +south +ellps=intl +units=m +no_defs ",3296:"+title=RGPF / UTM zone 5S +proj=utm +zone=5 +south +ellps=GRS80 +units=m +no_defs ",3297:"+title=RGPF / UTM zone 6S +proj=utm +zone=6 +south +ellps=GRS80 +units=m +no_defs ",3298:"+title=RGPF / UTM zone 7S +proj=utm +zone=7 +south +ellps=GRS80 +units=m +no_defs ",3299:"+title=RGPF / UTM zone 8S +proj=utm +zone=8 +south +ellps=GRS80 +units=m +no_defs ",3302:"+title=IGN63 Hiva Oa / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs ",3303:"+title=Fatu Iva 72 / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +towgs84=347.103,1078.12,2623.92,-33.8875,70.6773,-9.3943,186.074 +units=m +no_defs ",3304:"+title=Tahiti 79 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +units=m +no_defs ",3305:"+title=Moorea 87 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +units=m +no_defs ",3306:"+title=Maupiti 83 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +units=m +no_defs ",3312:"+title=CSG67 / UTM zone 21N +proj=utm +zone=21 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs ",3313:"+title=RGFG95 / UTM zone 21N +proj=utm +zone=21 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs ",3336:"+title=IGN 1962 Kerguelen / UTM zone 42S +proj=utm +zone=42 +south +ellps=intl +towgs84=145,-187,103,0,0,0,0 +units=m +no_defs ",3395:"+title=WGS 84 / World Mercator +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",3727:"+title=Reunion 1947 / TM Reunion +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=160000 +y_0=50000 +ellps=intl +units=m +no_defs ",21781:"+title=CH1903 / LV03 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ",25830:"+title=ETRS89 / UTM zone 30N +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs ",25831:"+title=ETRS89 / UTM zone 31N +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs ",25832:"+title=ETRS89 / UTM zone 32N +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs ",27561:"+title=NTF (Paris) / Lambert Nord France +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27562:"+title=NTF (Paris) / Lambert Centre France +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27563:"+title=NTF (Paris) / Lambert Sud France +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27564:"+title=NTF (Paris) / Lambert Corse +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27571:"+title=NTF (Paris) / Lambert zone I +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27572:"+title=NTF (Paris) / Lambert zone II +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27573:"+title=NTF (Paris) / Lambert zone III +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27574:"+title=NTF (Paris) / Lambert zone IV +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27581:"+title=NTF (Paris) / France I (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27582:"+title=NTF (Paris) / France II (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27583:"+title=NTF (Paris) / France III (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27584:"+title=NTF (Paris) / France IV (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27591:"+title=NTF (Paris) / Nord France (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27592:"+title=NTF (Paris) / Centre France (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27593:"+title=NTF (Paris) / Sud France (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",27594:"+title=NTF (Paris) / Corse (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ",32601:"+proj=utm +zone=1 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32602:"+proj=utm +zone=2 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32603:"+proj=utm +zone=3 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32604:"+proj=utm +zone=4 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32605:"+proj=utm +zone=5 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32606:"+proj=utm +zone=6 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32607:"+proj=utm +zone=7 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32608:"+proj=utm +zone=8 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32609:"+proj=utm +zone=9 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32610:"+proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32611:"+proj=utm +zone=11 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32612:"+proj=utm +zone=12 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32613:"+proj=utm +zone=13 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32614:"+proj=utm +zone=14 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32615:"+proj=utm +zone=15 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32616:"+proj=utm +zone=16 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32617:"+proj=utm +zone=17 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32618:"+proj=utm +zone=18 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32619:"+proj=utm +zone=19 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32620:"+proj=utm +zone=20 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32621:"+proj=utm +zone=21 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32622:"+proj=utm +zone=22 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32623:"+proj=utm +zone=23 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32624:"+proj=utm +zone=24 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32625:"+proj=utm +zone=25 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32626:"+proj=utm +zone=26 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32627:"+proj=utm +zone=27 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32628:"+proj=utm +zone=28 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32629:"+proj=utm +zone=29 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32630:"+proj=utm +zone=30 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32631:"+proj=utm +zone=31 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32632:"+proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32633:"+proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32634:"+proj=utm +zone=34 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32635:"+proj=utm +zone=35 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32636:"+proj=utm +zone=36 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
-32637:"+proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32638:"+proj=utm +zone=38 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32639:"+proj=utm +zone=39 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32640:"+proj=utm +zone=40 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32641:"+proj=utm +zone=41 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32642:"+proj=utm +zone=42 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32643:"+proj=utm +zone=43 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32644:"+proj=utm +zone=44 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32645:"+proj=utm +zone=45 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32646:"+proj=utm +zone=46 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32647:"+proj=utm +zone=47 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32648:"+proj=utm +zone=48 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32649:"+proj=utm +zone=49 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32650:"+proj=utm +zone=50 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32651:"+proj=utm +zone=51 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32652:"+proj=utm +zone=52 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32653:"+proj=utm +zone=53 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32654:"+proj=utm +zone=54 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32655:"+proj=utm +zone=55 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32656:"+proj=utm +zone=56 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32657:"+proj=utm +zone=57 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32658:"+proj=utm +zone=58 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32659:"+proj=utm +zone=59 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32660:"+proj=utm +zone=60 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32661:"+proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32662:"+title=WGS 84 / Plate Carree +proj=eqc +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32701:"+proj=utm +zone=1 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32702:"+proj=utm +zone=2 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32703:"+proj=utm +zone=3 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32704:"+proj=utm +zone=4 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32705:"+proj=utm +zone=5 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32706:"+proj=utm +zone=6 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32707:"+proj=utm +zone=7 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32708:"+proj=utm +zone=8 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32709:"+proj=utm +zone=9 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32710:"+proj=utm +zone=10 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32711:"+proj=utm +zone=11 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32712:"+proj=utm +zone=12 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32713:"+proj=utm +zone=13 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32714:"+proj=utm +zone=14 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32715:"+proj=utm +zone=15 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32716:"+proj=utm +zone=16 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32717:"+proj=utm +zone=17 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32718:"+proj=utm +zone=18 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32719:"+proj=utm +zone=19 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32720:"+proj=utm +zone=20 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32721:"+proj=utm +zone=21 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32722:"+proj=utm +zone=22 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32723:"+proj=utm +zone=23 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32724:"+proj=utm +zone=24 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32725:"+proj=utm +zone=25 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32726:"+proj=utm +zone=26 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32727:"+proj=utm +zone=27 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32728:"+proj=utm +zone=28 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32729:"+proj=utm +zone=29 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32730:"+proj=utm +zone=30 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32731:"+proj=utm +zone=31 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32732:"+proj=utm +zone=32 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32733:"+proj=utm +zone=33 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32734:"+proj=utm +zone=34 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32735:"+proj=utm +zone=35 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32736:"+proj=utm +zone=36 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32737:"+proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32738:"+proj=utm +zone=38 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32739:"+proj=utm +zone=39 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32740:"+proj=utm +zone=40 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32741:"+proj=utm +zone=41 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32742:"+proj=utm +zone=42 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32743:"+proj=utm +zone=43 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32744:"+proj=utm +zone=44 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32745:"+proj=utm +zone=45 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32746:"+proj=utm +zone=46 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32747:"+proj=utm +zone=47 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32748:"+proj=utm +zone=48 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32749:"+proj=utm +zone=49 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32750:"+proj=utm +zone=50 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32751:"+proj=utm +zone=51 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32752:"+proj=utm +zone=52 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32753:"+proj=utm +zone=53 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32754:"+proj=utm +zone=54 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32755:"+proj=utm +zone=55 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32756:"+proj=utm +zone=56 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32757:"+proj=utm +zone=57 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32758:"+proj=utm +zone=58 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32759:"+proj=utm +zone=59 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32760:"+proj=utm +zone=60 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",32761:"+proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",310024802:"+title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310915814:"+title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310486805:"+title=Geoportail - Guyane +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310700806:"+title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310702807:"+title=Geoportail - Mayotte +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310706808:"+title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310547809:"+title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642810:"+title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310032811:"+title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642812:"+title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-49.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642801:"+title=Geoportail - Crozet +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642813:"+title=Geoportail - Amsterdam et Saint-Paul +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-38.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",310642901:"+title=Geoportail - Monde +proj=mill +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",5489:"+title=RGAF09 geographiques (dms) +proj=longlat +nadgrids=@null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137 +rf=298.257222101 +units=m +no_defs",5490:"+title=RGAF09 UTM Nord Fuseau 20 +proj=tmerc +nadgrids=@null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137 +rf=298.257222101 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs"},CRS:{84:"+title=WGS 84 longitude-latitude +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs "},IGNF:{AMST63:"+title=Amsterdam 1963 +proj=geocent +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",CROZ63:"+title=Crozet 1963 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",CSG67:"+title=Guyane CSG67 +proj=geocent +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",ED50:"+title=ED50 +proj=geocent +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",ETRS89:"+title=Systeme de reference terrestre Europeen (1989) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",GUAD48:"+title=Guadeloupe Ste Anne +proj=geocent +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",GUADFM49:"+title=Guadeloupe Fort Marigot +proj=geocent +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",IGN63:"+title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=geocent +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",IGN72:"+title=IGN 1972 Grande-Terre / Ile des Pins +proj=geocent +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",KERG62CAR:"+title=Kerguelen - K0 +proj=geocent +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MART38:"+title=Martinique Fort-Desaix +proj=geocent +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MAYO50:"+title=Mayotte Combani +proj=geocent +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MOOREA87:"+title=Moorea 1987 +proj=geocent +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",NTF:"+title=Nouvelle Triangulation Francaise +proj=geocent +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs",NUKU72:"+title=IGN 1972 Nuku Hiva +proj=geocent +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",REUN47:"+title=Reunion 1947 +proj=geocent +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",RGF93:"+title=Reseau geodesique francais 1993 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGFG95:"+title=Reseau geodesique francais de Guyane 1995 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGM04:"+title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGNC:"+title=Reseau Geodesique de Nouvelle-Caledonie +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGPF:"+title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGR92:"+title=Reseau geodesique Reunion 1992 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGSPM06:"+title=Reseau Geodesique Saint-Pierre-et-Miquelon (2006) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGTAAF07:"+title=Reseau Geodesique des TAAF (2007) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RRAF91:"+title=RRAF 1991 (Reseau de Reference des Antilles Francaises) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",STPL69:"+title=Saint-Paul 1969 +proj=geocent +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",STPM50:"+title=St Pierre et Miquelon 1950 +proj=geocent +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs",TAHAA:"+title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=geocent +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",TAHI79:"+title=IGN79 (Tahiti) Iles de la Societe +proj=geocent +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",TERA50:"+title=Pointe Geologie - Perroud 1950 +proj=geocent +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",WALL78:"+title=Wallis-Uvea 1978 (MOP78) +proj=geocent +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",WGS72:"+title=World Geodetic System 1972 +proj=geocent +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs",WGS84:"+title=World Geodetic System 1984 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",AMST63GEO:"+title=Amsterdam 1963 +proj=longlat +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",CROZ63GEO:"+title=Crozet 1963 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",CSG67GEO:"+title=Guyane CSG67 +proj=longlat +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",ED50G:"+title=ED50 +proj=longlat +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",GUAD48GEO:"+title=Guadeloupe Ste Anne +proj=longlat +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",GUADFM49GEO:"+title=Guadeloupe Fort Marigot +proj=longlat +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",IGN63GEO:"+title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=longlat +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",IGN72GEO:"+title=IGN 1972 Grande-Terre / Ile des Pins +proj=longlat +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",KERG62GEO:"+title=Kerguelen - K0 +proj=longlat +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MART38GEO:"+title=Martinique Fort-Desaix +proj=longlat +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MAYO50GEO:"+title=Mayotte Combani +proj=longlat +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",MOOREA87GEO:"+title=Moorea 1987 +proj=longlat +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",NTFG:"+title=Nouvelle Triangulation Francaise Greenwich degres sexagesimaux +proj=longlat +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs",NTFP:"+title=Nouvelle Triangulation Francaise Paris grades +proj=longlat +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +units=m +no_defs",NUKU72GEO:"+title=IGN 1972 Nuku Hiva +proj=longlat +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",REUN47GEO:"+title=Reunion 1947 +proj=longlat +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",RGF93G:"+title=Reseau geodesique francais 1993 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGFG95GEO:"+title=Reseau geodesique francais de Guyane 1995 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGM04GEO:"+title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGNCGEO:"+title=Reseau Geodesique de Nouvelle-Caledonie +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGPFGEO:"+title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGR92GEO:"+title=Reseau geodesique de la Reunion 1992 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGSPM06GEO:"+title=Saint-Pierre-et-Miquelon (2006) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",RGTAAF07G:"+title=Reseau Geodesique des TAAF (2007) (dms) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",STPL69GEO:"+title=Saint-Paul 1969 +proj=longlat +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",STPM50GEO:"+title=St Pierre et Miquelon 1950  +proj=longlat +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs",TAHAAGEO:"+title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=longlat +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",TAHI79GEO:"+title=IGN79 (Tahiti) Iles de la Societe +proj=longlat +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",TERA50G:"+title=Pointe Geologie - Perroud 1950 +proj=longlat +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",WALL78GEO:"+title=Wallis - Uvea 1978 (MOP78) +proj=longlat +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs",WGS72G:"+title=WGS72 +proj=longlat +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs",WGS84G:"+title=World Geodetic System 1984 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",WGS84RRAFGEO:"+title=Reseau de reference des Antilles francaises (1988-1991) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",XGEO:"+title=Systeme CIO-BIH +proj=longlat +towgs84=0.0000,0.0000,0.5000,0.0000,0.0000,0.0140,-0.100000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",AMST63UTM43S:"+title=Amsterdam 1963 UTM fuseau 43 Sud +proj=tmerc +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",CROZ63UTM39S:"+title=Crozet 1963 +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",CSG67UTM21:"+title=Guyane CSG67 UTM fuseau 21 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",CSG67UTM22:"+title=Guyane CSG67 UTM fuseau 22 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",GEOPORTALANF:"+title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALASP:"+title=Geoportail - Amsterdam et Saint-Paul +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-38.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALCRZ:"+title=Geoportail - Crozet +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALFXX:"+title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALGUF:"+title=Geoportail - Guyane +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALKER:"+title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-49.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALMYT:"+title=Geoportail - Mayotte +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALNCL:"+title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALPYF:"+title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALREU:"+title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALSPM:"+title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GEOPORTALWLF:"+title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",GUAD48UTM20:"+title=Guadeloupe Ste Anne +proj=tmerc +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",GUADFM49U20:"+title=Guadeloupe Fort Marigot  +proj=tmerc +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",IGN63UTM7S:"+title=IGN 1963 - Hiva Oa, Tahuata, Mohotani - UTM fuseau 7 Sud +proj=tmerc +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",IGN72UTM58S:"+title=IGN 1972 - UTM fuseau 58 Sud +proj=tmerc +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",KERG62UTM42S:"+title=Kerguelen 1962 +proj=tmerc +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",LAMB1:"+title=Lambert I +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs",LAMB1C:"+title=Lambert I Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=1200000.000 +units=m +no_defs",LAMB2:"+title=Lambert II +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs",LAMB2C:"+title=Lambert II Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs",LAMB3:"+title=Lambert III +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs",LAMB3C:"+title=Lambert III Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=3200000.000 +units=m +no_defs",LAMB4:"+title=Lambert IV +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=185861.369 +units=m +no_defs",LAMB4C:"+title=Lambert IV Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=4185861.369 +units=m +no_defs",LAMB93:"+title=Lambert 93 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.500000000 +lon_0=3.000000000 +lat_1=44.000000000 +lat_2=49.000000000 +x_0=700000.000 +y_0=6600000.000 +units=m +no_defs",RGF93CC42:"+title=Lambert conique conforme Zone 1 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=42.000000000 +lon_0=3.000000000 +lat_1=41.200000000 +lat_2=42.800000000 +x_0=1700000.000 +y_0=1200000.000 +units=m +no_defs",RGF93CC43:"+title=Lambert conique conforme Zone 2 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=43.000000000 +lon_0=3.000000000 +lat_1=42.200000000 +lat_2=43.800000000 +x_0=1700000.000 +y_0=2200000.000 +units=m +no_defs",RGF93CC44:"+title=Lambert conique conforme Zone 3 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=44.000000000 +lon_0=3.000000000 +lat_1=43.200000000 +lat_2=44.800000000 +x_0=1700000.000 +y_0=3200000.000 +units=m +no_defs",RGF93CC45:"+title=Lambert conique conforme Zone 4 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=45.000000000 +lon_0=3.000000000 +lat_1=44.200000000 +lat_2=45.800000000 +x_0=1700000.000 +y_0=4200000.000 +units=m +no_defs",RGF93CC46:"+title=Lambert conique conforme Zone 5 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.000000000 +lon_0=3.000000000 +lat_1=45.200000000 +lat_2=46.800000000 +x_0=1700000.000 +y_0=5200000.000 +units=m +no_defs",RGF93CC47:"+title=Lambert conique conforme Zone 6 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=47.000000000 +lon_0=3.000000000 +lat_1=46.200000000 +lat_2=47.800000000 +x_0=1700000.000 +y_0=6200000.000 +units=m +no_defs",RGF93CC48:"+title=Lambert conique conforme Zone 7 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=48.000000000 +lon_0=3.000000000 +lat_1=47.200000000 +lat_2=48.800000000 +x_0=1700000.000 +y_0=7200000.000 +units=m +no_defs",RGF93CC49:"+title=Lambert conique conforme Zone 8 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=49.000000000 +lon_0=3.000000000 +lat_1=48.200000000 +lat_2=49.800000000 +x_0=1700000.000 +y_0=8200000.000 +units=m +no_defs",
-RGF93CC50:"+title=Lambert conique conforme Zone 9 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=50.000000000 +lon_0=3.000000000 +lat_1=49.200000000 +lat_2=50.800000000 +x_0=1700000.000 +y_0=9200000.000 +units=m +no_defs",LAMBE:"+title=Lambert II etendu +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs",MART38UTM20:"+title=Martinique Fort-Desaix +proj=tmerc +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",MAYO50UTM38S:"+title=Mayotte Combani +proj=tmerc +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",MILLER:"+title=Geoportail - Monde +proj=mill +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs",MOOREA87U6S:"+title=Moorea 1987 - UTM fuseau 6 Sud +proj=tmerc +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",NUKU72U7S:"+title=IGN 1972 Nuku Hiva - UTM fuseau 7 Sud +proj=tmerc +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",REUN47GAUSSL:"+title=Reunion Gauss Laborde +proj=gstmerc +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-21.116666667 +lon_0=55.533333333 +k_0=1.00000000 +x_0=160000.000 +y_0=50000.000 +units=m +no_defs",RGM04UTM38S:"+title=UTM fuseau 38 Sud (Reseau Geodesique de Mayotte 2004) +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGNCUTM57S:"+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 57 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=159.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGNCUTM58S:"+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 58 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGNCUTM59S:"+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 59 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=171.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGPFUTM5S:"+title=RGPF - UTM fuseau 5 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGPFUTM6S:"+title=RGPF - UTM fuseau 6 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGPFUTM7S:"+title=RGPF - UTM fuseau 7 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGR92UTM40S:"+title=RGR92 UTM fuseau 40 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",RGSPM06U21:"+title=Saint-Pierre-et-Miquelon (2006) UTM Fuseau 21 Nord +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",STPL69UTM43S:"+title=Saint-Paul 1969 UTM fuseau 43 Sud +proj=tmerc +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",STPM50UTM21:"+title=St Pierre et Miquelon 1950 +proj=tmerc +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",TAHAAUTM05S:"+title=Tahaa 1951 +proj=tmerc +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",TAHI51UTM06S:"+title=Tahiti-Terme Nord UTM fuseau 6 Sud +proj=tmerc +towgs84=162.0000,117.0000,154.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",TAHI79UTM6S:"+title=Tahiti 1979 +proj=tmerc +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",TERA50STEREO:"+title=Terre Adelie 1950 +proj=stere +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +lat_ts=-67 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs",UTM01SW84:"+title=World Geodetic System 1984 UTM fuseau 01 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",UTM20W84GUAD:"+title=World Geodetic System 1984 UTM fuseau 20 Nord-Guadeloupe +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM20W84MART:"+title=World Geodetic System 1984 UTM fuseau 20 Nord-Martinique +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM22RGFG95:"+title=RGFG95 UTM fuseau 22 Nord-Guyane +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM39SW84:"+title=World Geodetic System 1984 UTM fuseau 39 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",UTM42SW84:"+title=World Geodetic System 1984 UTM fuseau 42 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",UTM43SW84:"+title=World Geodetic System 1984 UTM fuseau 43 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",WALL78UTM1S:"+title=Wallis-Uvea 1978 (MOP78) UTM 1 SUD +proj=tmerc +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs",ETRS89GEO:"+title=ETRS89 geographiques (dms) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs",ETRS89LAEA:"+title=ETRS89 Lambert Azimutal Equal Area +proj=laea +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=52.000000000 +lon_0=10.000000000 +x_0=4321000.000 +y_0=3210000.000 +units=m +no_defs",ETRS89LCC:"+title=ETRS89 Lambert Conformal Conic +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=52.000000000 +lon_0=9.999999995 +lat_1=35.000000000 +lat_2=65.000000000 +x_0=4000000.000 +y_0=2800000.000 +units=m +no_defs",UTM26ETRS89:"+title=Europe - de 30d a 24d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-27.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM27ETRS89:"+title=Europe - de 24d a 18d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-21.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM28ETRS89:"+title=Europe - de 18d a 12d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-15.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM29ETRS89:"+title=Europe - de 12d a 6d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-9.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM30ETRS89:"+title=Europe - de -6d a 0d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-3.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM31ETRS89:"+title=Europe - de 0d a 6d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=3.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM32ETRS89:"+title=Europe - de 6d a 12d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=9.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM33ETRS89:"+title=Europe - de 12d a 18d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=15.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM34ETRS89:"+title=Europe - de 18d a 24d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=21.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM35ETRS89:"+title=Europe - de 24d a 30d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=27.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM36ETRS89:"+title=Europe - de 30d a 36d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=33.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM37ETRS89:"+title=Europe - de 36d a 42d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=39.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs",UTM38ETRS89:"+title=Europe - de 42d a 48d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs"}};return e}(proj4),LeafletCRSEPSG2154=function(t,e,i){var n={instance:null,build:function(){if(!this.instance){var t=new i.Proj.CRS("EPSG:2154",e.get("EPSG:2154"),{resolutions:this._getResolutions(),origin:this._getOrigin()});this.instance=t}return this.instance},_getResolutions:function(){var e=[];if(t.isConfigLoaded()){var i=t.getTileMatrix("LAMB93");e=i.nativeResolutions}return e.length?e:[104579.22454989408,52277.53235379051,26135.487078595408,13066.891381800004,6533.228604113456,3266.5595244626675,1633.2660045974187,816.6295549860224,408.31391467683596,204.15674151090204,102.07831678324082,51.0391448966112,25.519569074269395,12.759783693647506,6.379891635966491,3.18994576530532,1.5949728694977277,.7974864315474559,.398743214900604,.19937160727567999,.099685803696052,.049842901818919996]},_getOrigin:function(){return[0,12e6]}};return n}(CommonUtilsConfig,CommonUtilsRegister,leaflet),LeafletCRSEPSG27572=function(t,e,i){var n={instance:null,build:function(){if(!this.instance){var t=new i.Proj.CRS("EPSG:27572",e.get("EPSG:27572"),{resolutions:this._getResolutions(),origin:this._getOrigin()});this.instance=t}return this.instance},_getResolutions:function(){var e=[];if(t.isConfigLoaded()){var i=t.getTileMatrix("LAMB2E");i&&Object.keys(i)&&(e=i.nativeResolutions)}return e.length?e:[104579.22454989408,52277.53235379051,26135.487078595408,13066.891381800004,6533.228604113456,3266.5595244626675,1633.2660045974187,816.6295549860224,408.31391467683596,204.15674151090204,102.07831678324082,51.0391448966112,25.519569074269395,12.759783693647506,6.379891635966491,3.18994576530532,1.5949728694977277,.7974864315474559,.398743214900604,.19937160727567999,.099685803696052,.049842901818919996]},_getOrigin:function(){return[0,12e6]}};return n}(CommonUtilsConfig,CommonUtilsRegister,leaflet),LeafletCRSEPSG4326=function(t,e,i){var n={instance:null,build:function(){if(!this.instance){var t=new i.Proj.CRS("EPSG:4326",e.get("EPSG:4326"),{resolutions:this._getResolutions(),origin:[-180,90]});this.instance=t}return this.instance},_getResolutions:function(){var e=[];return t.isConfigLoaded()&&(e=t.getResolutions()),e.length?e:[1.40625,.703125,.3515625,.17578125,.087890625,.0439453125,.02197265625,.010986328125,.0054931640625,.00274658203125,.001373291015625,.0006866455078125,.00034332275390625,.000171661376953126,858306884765628e-19,429153442382813e-19,214576721191407e-19,107288360595703e-19,536441802978517e-20,268220901489259e-20,13411045074463e-19,6.70552253723145e-7,3.3527612686157e-7]},_getOrigin:function(){}};return n}(CommonUtilsConfig,CommonUtilsRegister,leaflet),LeafletCRSCRS=function(t,e,i,n,o){!function(){t.load(),e.load()}();var s={EPSG2154:function(){return i.build()},EPSG27572:function(){return n.build()},EPSG4326:function(){return o.build()}};return s}(LeafletCRSProj4Leaflet,CommonUtilsRegister,LeafletCRSEPSG2154,LeafletCRSEPSG27572,LeafletCRSEPSG4326),LeafletControlsMousePosition=function(t,e,i,n,o,s,r,a){var l=t.Control.extend({includes:s,options:{position:"bottomleft",collapsed:!0,units:[],systems:[],displayAltitude:!0,displayCoordinates:!0,altitude:{triggerDelay:200,responseDelay:500,noDataValue:-99999,noDataValueTolerance:9e4,serviceOptions:{}}},initialize:function(e){t.Util.extend(this.options,e),this._uid=o.generate(),this._projectionSystems=[],this._initProjectionSystems(),this._projectionUnits={},this._initProjectionUnits(),this._isDesktop=this._detectSupport(),this.options.altitude.triggerDelay<100&&(this.options.altitude.triggerDelay=100),this._timer=this.options.altitude.triggerDelay,this._currentProjectionSystems=this._projectionSystems[0],this._projectionSystemsContainer=null,this._currentProjectionType=this._projectionSystems[0].type,this._currentProjectionUnits=this._projectionUnits[this._currentProjectionType][0].code,this._projectionUnitsContainer=null,this._showMousePositionContainer=null,this.options.displayAltitude||this.options.displayCoordinates||(this.options.displayCoordinates=!0),this._noRightManagement=!1,this.options.displayAltitude&&this._checkRightsManagement(),t.Util.setOptions(this,this.options)},onAdd:function(e){var i=this._container=this._initLayout();return this.options.collapsed||(this._isDesktop?e.on("mousemove",this.onMouseMove,this):e.on("move",this.onMapMove,this)),t.DomEvent.disableClickPropagation(i).disableScrollPropagation(i),t.DomEvent.addListener(i,"mousemove",t.DomEvent.stopPropagation).addListener(i,"mousemove",t.DomEvent.preventDefault),i},onRemove:function(t){t.off("mousemove",this.onMouseMove)},_initProjectionSystems:function(){for(var e=[{label:"Géographique",crs:t.CRS.Simple,type:"Geographical"},{label:"Web Mercator",crs:t.CRS.EPSG3395,type:"Metric"},{label:"Lambert 93",crs:a.EPSG2154,type:"Metric",geoBBox:{left:-9.86,bottom:41.15,right:10.38,top:51.56}},{label:"Lambert II étendu",crs:a.EPSG27572,type:"Metric",geoBBox:{left:-4.87,bottom:42.33,right:8.23,top:51.14}}],i=this.options.systems,n=0;n<i.length;n++){var o=i[n];if(o.label&&o.crs){o.type||(o.type="Metric"),this._projectionSystems.push(i[n]);for(var s=!1,r=0;r<e.length;r++){var l=e[r];o.crs===l.crs&&(s=!0)}}}0===this._projectionSystems.length&&(this._projectionSystems=e);for(var c=0;c<this._projectionSystems.length;++c)this._projectionSystems[c].code=c},_initProjectionUnits:function(){var t={Geographical:[{code:"DEC",label:"degrés décimaux",convert:this._displayDEC},{code:"DMS",label:"degrés sexagésimaux",convert:this._displayDMS},{code:"RAD",label:"radians",convert:this._displayRAD},{code:"GON",label:"grades",convert:this._displayGON}],Metric:[{code:"M",label:"mètres",convert:this._displayMeter},{code:"KM",label:"kilomètres",convert:this._displayKMeter}]},e=this.options.units;for(var i in t)if(t.hasOwnProperty(i)){for(var n=!1,o=0;o<t[i].length;o++)for(var s=t[i][o],r=0;r<e.length;r++){var a=e[r];s.code===a&&(n=!0,this._projectionUnits[i]||(this._projectionUnits[i]=[]),this._projectionUnits[i].push(s))}n||(this._projectionUnits[i]=t[i])}0===Object.keys(this._projectionUnits).length&&(this._projectionUnits=t)},_checkRightsManagement:function(){var t=n.check({key:this.options.apiKey,resources:["SERVICE_CALCUL_ALTIMETRIQUE_RSC"],services:["Elevation"]});t||(this._noRightManagement=!0),this.options.apiKey||(this.options.apiKey=t.key)},_detectSupport:function(){var t=!0,e=window.navigator.userAgent.toLowerCase();return e.indexOf("iphone")===-1&&e.indexOf("ipod")===-1&&e.indexOf("ipad")===-1&&e.indexOf("android")===-1&&e.indexOf("mobile")===-1&&e.indexOf("blackberry")===-1&&e.indexOf("tablet")===-1&&e.indexOf("phone")===-1&&e.indexOf("touch")===-1||(t=!1),e.indexOf("msie")===-1&&e.indexOf("trident")===-1||(t=!0),t},_initLayout:function(){var t=this._createMainContainerElement(),e=this._showMousePositionContainer=this._createShowMousePositionElement();t.appendChild(e),this.options.collapsed||(e.checked=!0);var i=this._createShowMousePositionPictoElement(this._isDesktop);t.appendChild(i);var n=this._createMousePositionPanelElement(this.options.displayAltitude,this.options.displayCoordinates),o=this._createMousePositionSettingsElement(),s=this._projectionSystemsContainer=this._createMousePositionSettingsSystemsElement(this._projectionSystems),r=this._projectionUnitsContainer=this._createMousePositionSettingsUnitsElement(this._projectionUnits[this._currentProjectionType]);o.appendChild(s),o.appendChild(r),n.appendChild(o),t.appendChild(n);var a=this._createMapCenter(),l=this._map;return l.getContainer().appendChild(a),t},_setElevationPanel:function(e){var i=null;e||(i=t.DomUtil.get(this._addUID("GPmousePositionAltitude")),i.style.display="none"),e&&this._noRightManagement&&(i=t.DomUtil.get(this._addUID("GPmousePositionAlt")),i.innerHTML="no right !")},_setCoordinatePanel:function(e){if(!e){var i=t.DomUtil.get(this._addUID("GPmousePositionCoordinate"));i.style.display="none"}},_setSettingsPanel:function(e){if(!e){var i=t.DomUtil.get("GPshowMousePositionSettingsPicto"),n=t.DomUtil.get(this._addUID("GPmousePositionSettings"));i.style.display="none",n.style.display="none"}},_setTypeUnitsPanel:function(t){for(var e=this._projectionUnitsContainer;e.firstChild;)e.removeChild(e.firstChild);for(var i=this._projectionUnits[t],n=0;n<i.length;n++){var o=i[n],s=document.createElement("option");s.value=o.code?o.code:n,s.text=o.label||n,e.appendChild(s)}this._currentProjectionType=t,this._currentProjectionUnits=this._projectionUnits[t][0].code},_displayDEC:function(t){var e={};return e.lat=r.roundToDecimal(t.lat,6),e.lng=r.roundToDecimal(t.lng,6),e},_displayDMS:function(t){var e={};return e.lat=r.decimalLatToDMS(t.lat),e.lng=r.decimalLongToDMS(t.lng),e},_displayRAD:function(t){var e={};return e.lat=r.decimalToRadian(t.lat),e.lng=r.decimalToRadian(t.lng),e},_displayGON:function(t){var e={};return e.lat=r.decimalToGrade(t.lat),e.lng=r.decimalToGrade(t.lng),e},_displayMeter:function(e){var i={};return i.x=t.Util.formatNum(e.x,2),i.y=t.Util.formatNum(e.y,2),i.unit="m",i},_displayKMeter:function(e){var i={};return i.x=t.Util.formatNum(e.x/1e3,2),i.y=t.Util.formatNum(e.y/1e3,2),i.unit="km",i},_project:function(e,i){if("function"==typeof i&&(i=i()),"object"==typeof i){if(i===t.CRS.Simple)return e;if(i.projection&&"object"==typeof i.projection){var n=i.projection.project(e);return"Geographical"===this._currentProjectionType&&(n.lat=n.y,n.lng=n.x),!n||0===Object.keys(n).length,n}}},_setCoordinate:function(t){for(var e=this._currentProjectionSystems.type,i=null,n=this._projectionUnits[e],o=0;o<n.length;o++)if(n[o].code===this._currentProjectionUnits){i=n[o].convert;break}var s={},r=this._currentProjectionSystems.crs;r&&(s=i(this._project(t,r)),s&&0!==Object.keys(s).lenght&&this.GPdisplayCoords(s))},_setElevation:function(t){var e=this.options.altitude.responseDelay,i=this.options.altitude.noDataValue,n=this.options.altitude.noDataValueTolerance;this.GPdisplayElevation(t,e,i,n)},onMoveStopped:function(t){this._noRightManagement||this._setElevation(t)},onMouseMove:function(t){var e=this,i=t.latlng;this._setCoordinate(i),clearTimeout(this._timer),this._timer=setTimeout(function(){e.onMoveStopped(i)},this.options.altitude.triggerDelay)},onMapMove:function(){var t=this,e=this._map,i=e.getCenter();this._setCoordinate(i),clearTimeout(this._timer),this._timer=setTimeout(function(){t.onMoveStopped(i)},this.options.altitude.triggerDelay)},onRequestAltitude:function(e,n){if(e&&0!==Object.keys(e).length&&this.options.displayAltitude&&!this._noRightManagement){var o={};t.Util.extend(o,this.options.altitude.serviceOptions),t.Util.extend(o,{zonly:!0,positions:[{lon:e.lon||e.lng,lat:e.lat}]}),t.Util.extend(o,{scope:this,onSuccess:function(t){t&&Object.keys(t)&&n.call(this,t.elevations[0].z)},onFailure:function(t){}}),t.Util.extend(o,{apiKey:o.apiKey||this.options.apiKey}),i.Services.getAltitude(o)}},onShowMousePositionClick:function(t){var e=this._map;this._showMousePositionContainer.checked?this._isDesktop?e.off("mousemove",this.onMouseMove,this):e.off("move",this.onMapMove,this):this._isDesktop?e.on("mousemove",this.onMouseMove,this):e.on("move",this.onMapMove,this),this._setElevationPanel(this.options.displayAltitude),this._setCoordinatePanel(this.options.displayCoordinates),this.options.displayCoordinates||this._setSettingsPanel(!1)},onMousePositionProjectionSystemChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;t.target.options[e].label;this._setCurrentSystem(i)},_setCurrentSystem:function(t){for(var e=null,i=0;i<this._projectionSystems.length;++i)if(this._projectionSystems[i].code==t){e=this._projectionSystems[i].type;break}e&&(e!==this._currentProjectionType&&this._setTypeUnitsPanel(e),this._currentProjectionSystems=this._projectionSystems[Number(t)],this._isDesktop||this.onMapMove())},onMousePositionProjectionSystemMouseOver:function(t){var e=this._map;if(e){var i=document.getElementById(this._addUID("GPmousePositionProjectionSystem"));i.innerHTML="";for(var n=0;n<this._projectionSystems.length;n++){var o=this._projectionSystems[n];if(o.geoBBox&&(e.getBounds()._southWest.lng>o.geoBBox.right||e.getBounds()._southWest.lat>o.geoBBox.top||e.getBounds()._northEast.lng<o.geoBBox.left||e.getBounds()._northEast.lat<o.geoBBox.bottom)){if(o===this._currentProjectionSystems){var s=document.createElement("option");s.value=o.code,s.text=o.label||n,s.setAttribute("selected","selected"),s.setAttribute("disabled","disabled"),i.appendChild(s)}}else{var s=document.createElement("option");s.value=o.code,s.text=o.label||n,o===this._currentProjectionSystems&&s.setAttribute("selected","selected"),i.appendChild(s)}}}},onMousePositionProjectionUnitsChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;t.target.options[e].label;this._currentProjectionUnits=i,this._isDesktop||this.onMapMove()}});return l}(leaflet,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,CommonControlsMousePositionDOM,LeafletControlsUtilsPositionFormater,LeafletCRSCRS),CommonControlsReverseGeocodingDOM=function(){var t={_addUID:function(t){return t+"-"+this._uid},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPreverseGeocoding"),t.className="GPwidget",t},_createShowReverseGeocodingElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowReverseGeocoding"),t.type="checkbox",t},_createShowReverseGeocodingPictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowReverseGeocodingPicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowReverseGeocoding"),e.title="Ouvrir la recherche inverse",e.addEventListener?e.addEventListener("click",function(){t.onShowReverseGeocodingClick()}):e.attachEvent&&e.attachEvent("onclick",function(){t.onShowReverseGeocodingClick()});var i=document.createElement("span");return i.id=this._addUID("GPshowReverseGeocodingOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createReverseGeocodingWaitingElement:function(){var t=document.createElement("div");t.id=this._addUID("GPreverseGeocodingCalcWaitingContainer"),t.className="GPreverseGeocodingCalcWaitingContainerHidden";var e=document.createElement("p");return e.className="GPreverseGeocodingCalcWaiting",e.innerHTML="Recherche en cours...",t.appendChild(e),t},_createReverseGeocodingResultsPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPreverseGeocodingResultsPanel"),t.className="GPpanel GPreverseGeocodingComponentHidden",t},_createReverseGeocodingResultsListElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPreverseGeocodingResultsList"),t},_createReverseGeocodingResultElement:function(t,e){var i=this,n=document.getElementById(this._addUID("GPreverseGeocodingResultsList")),o=document.createElement("div");o.id=this._addUID("ReverseGeocodedLocation_"+e),o.className="GPautoCompleteProposal",o.innerHTML=t,o.title=t,o.addEventListener?(o.addEventListener("mouseover",function(t){i.onReverseGeocodingResultMouseOver(t)}),o.addEventListener("mouseout",function(t){i.onReverseGeocodingResultMouseOut(t)}),o.addEventListener("click",function(t){"function"==typeof i.onReverseGeocodingResultClick&&i.onReverseGeocodingResultClick(t)})):o.attachEvent&&(o.attachEvent("onmouseover",function(t){i.onReverseGeocodingResultMouseOver(t)}),o.attachEvent("onmouseout",function(t){i.onReverseGeocodingResultMouseOut(t)}),o.attachEvent("onclick",function(t){"function"==typeof i.onReverseGeocodingResultClick&&i.onReverseGeocodingResultClick(t)})),n.appendChild(o)},_createReverseGeocodingPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPreverseGeocodingPanel"),t.className="GPpanel",t},_createReverseGeocodingPanelHeaderElement:function(){var t=document.createElement("div");return t.className="GPpanelHeader",t},_createReverseGeocodingPanelReturnPictoElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPreverseGeocodingReturnPicto"),e.title="Nouvelle recherche",e.className="GPreverseGeocodingReturnPictoHidden",e.addEventListener?e.addEventListener("click",function(e){document.getElementById(t._addUID("GPreverseGeocodingResultsPanel")).className="GProuteComponentHidden",document.getElementById(t._addUID("GPreverseGeocodingForm")).className="",document.getElementById(t._addUID("GPreverseGeocodingHeaderTitle")).innerHTML="Recherche inverse",document.getElementById(t._addUID("GPreverseGeocodingReturnPicto")).className="GPreverseGeocodingReturnPictoHidden",t.onGPreverseGeocodingReturnPictoClick(e)}):e.attachEvent&&e.attachEvent("onclick",function(e){document.getElementById(t._addUID("GPreverseGeocodingResultsPanel")).className="GProuteComponentHidden",document.getElementById(t._addUID("GPreverseGeocodingForm")).className="",document.getElementById(t._addUID("GPreverseGeocodingHeaderTitle")).innerHTML="Recherche inverse",document.getElementById(t._addUID("GPreverseGeocodingReturnPicto")).className="GPreverseGeocodingReturnPictoHidden",t.onGPreverseGeocodingReturnPictoClick(e)}),e},_createReverseGeocodingPanelTitleElement:function(){var t=document.createElement("div");return t.className="GPpanelTitle",t.id=this._addUID("GPreverseGeocodingHeaderTitle"),t.innerHTML="Recherche inverse",t},_createReverseGeocodingPanelCloseElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPreverseGeocodingPanelClose"),e.className="GPpanelClose",e.title="Fermer le panneau",e.addEventListener?e.addEventListener("click",function(){document.getElementById(t._addUID("GPshowReverseGeocodingPicto")).click()},!1):e.attachEvent&&e.attachEvent("onclick",function(){document.getElementById(t._addUID("GPshowReverseGeocodingPicto")).click()}),e},_createReverseGeocodingPanelFormElement:function(){var t=this,e=document.createElement("form");return e.id=this._addUID("GPreverseGeocodingForm"),e.addEventListener?e.addEventListener("submit",function(e){e.preventDefault(),t.onReverseGeocodingSubmit()}):e.attachEvent&&e.attachEvent("onsubmit",function(e){e.preventDefault(),t.onReverseGeocodingSubmit()}),e},_createReverseGeocodingFormModeChoiceGeocodingTypeElement:function(t){var e=this,i=document.createElement("div");i.className="GPflexInput";var n=document.createElement("label");n.className="GPreverseGeocodingCodeLabel",n.innerHTML="Recherche par",n.title="Recherche par",i.appendChild(n);var o=document.createElement("select");o.className="GPreverseGeocodingCode",o.addEventListener?o.addEventListener("change",function(t){e.onReverseGeocodingTypeChange(t)}):o.attachEvent&&o.attachEvent("onchange",function(t){e.onReverseGeocodingTypeChange(t)}),t&&Array.isArray(t)||(t=["StreetAddress","PositionOfInterest","CadastralParcel"]);for(var s=0;s<t.length;s++)switch(t[s]){case"PositionOfInterest":var r=document.createElement("option");r.value="PositionOfInterest",r.text="Lieux/toponymes",o.appendChild(r);break;case"StreetAddress":var a=document.createElement("option");a.value="StreetAddress",a.text="Adresses",o.appendChild(a);break;case"CadastralParcel":var l=document.createElement("option");l.value="CadastralParcel",l.text="Parcelles cadastrales",o.appendChild(l);break;case"Administratif":var c=document.createElement("option");c.value="Administratif",c.text="Unités administratives",o.appendChild(c)}return i.appendChild(o),i},_createReverseGeocodingFormModeChoiceGeocodingDelimitationElement:function(t){var e=this,i=document.createElement("div");i.className="GPflexInput";var n=document.createElement("label");n.className="GPreverseGeocodingCodeLabel",n.innerHTML="Délimitation",n.title="Délimitation",i.appendChild(n);var o=document.createElement("select");o.className="GPreverseGeocodingCode",o.addEventListener?o.addEventListener("change",function(t){e.onReverseGeocodingDelimitationChange(t);
-}):o.attachEvent&&o.attachEvent("onchange",function(t){e.onReverseGeocodingDelimitationChange(t)}),t&&Array.isArray(t)||(t=["Point","Circle","Extent"]);for(var s=0;s<t.length;s++)switch(t[s].toLowerCase()){case"point":var r=document.createElement("option");r.value="point",r.text="Pointer un lieu",o.appendChild(r);break;case"circle":var a=document.createElement("option");a.value="circle",a.text="Dessiner un cercle",o.appendChild(a);break;case"extent":var l=document.createElement("option");l.value="extent",l.text="Dessiner une emprise",o.appendChild(l)}return i.appendChild(o),i},_createReverseGeocodingSubmitFormElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPreverseGeocodingSubmit"),t.className="GPinputSubmit",t.type="submit",t.value="Rechercher",t}};return t}(),LeafletControlsReverseGeocoding=function(t,e,i,n,o,s,r,a){var l=t.Control.extend({includes:a,options:{position:"bottomleft",collapsed:!0,resources:["StreetAddress","PositionOfInterest"],delimitations:["Point","Circle","Extent"],reverseGeocodeOptions:{}},initialize:function(e){t.Util.extend(this.options,e),this._noRightManagement=!1,this._servicesRightManagement={},this._checkRightsManagement(),this._checkInputOptions(),this._uid=s.generate(),this._currentGeocodingType=null,this._initGeocodingType(),this._currentGeocodingDelimitation=null,this._initGeocodingDelimitation(),this._showReverseGeocodingContainer=null,this._panelHeaderContainer=null,this._panelTitleContainer=null,this._returnPictoContainer=null,this._formContainer=null,this._resultsContainer=null,this._resultsListContainer=null,this._waitingContainer=null,this._inputFeaturesLayer=null,this._inputResultsLayer=null,this._lastIdLayer=0,this._currentIdLayer=0,this._currentFeature=null,this._requestPosition=null,this._requestCircleFilter=null,this._requestBboxFilter=null,this._waiting=!1,this._timer=null,this._reverseGeocodingLocations=[]},onAdd:function(e){var i=this._container=this._initLayout();return t.DomEvent.disableClickPropagation(i).disableScrollPropagation(i),e&&(this.options.collapsed||this._activateMapInteraction(e)),i},onRemove:function(){},_checkRightsManagement:function(){var t,e=[],i=null;t=this.options.reverseGeocodeOptions.apiKey,i=this.options.reverseGeocodeOptions.filterOptions,e=i?i.type:[],e&&0!==e.length||(e=this.options.resources),e&&0!==e.length||(e=["StreetAddress","PositionOfInterest"]);var n=o.check({key:t||this.options.apiKey,resources:e,services:["Geocode"]});return n?(this.options.apiKey||(this.options.apiKey=n.key),void(n&&(this._servicesRightManagement.Geocode=n.Geocode))):void(this._noRightManagement=!0)},_checkInputOptions:function(){var t;if(this.options.resources){var e=this.options.resources;Array.isArray(e)||(console.log("[ReverseGeocoding] 'options.resources' parameter should be an array"),e=null);var i=["StreetAddress","PositionOfInterest","CadastralParcel","Administratif"];for(t=0;t<e.length;t++)i.indexOf(e[t])===-1&&console.log("[ReverseGeocoding] options.resources : "+e[t]+" is not a resource for reverse geocode")}if(this.options.delimitations){var n=this.options.delimitations;Array.isArray(n)||(console.log("[ReverseGeocoding] 'options.delimitations' parameter should be an array"),n=null);var o=["Circle","Point","Extent"];for(t=0;t<n.length;t++)o.indexOf(n[t])===-1&&console.log("[ReverseGeocoding] options.delimitations : "+n[t]+" is not a delimitation for reverse geocode")}},_initGeocodingType:function(){this._currentGeocodingType="StreetAddress";var t=this.options.resources;if(t&&0!==t.length||(this.options.resources=["StreetAddress","PositionOfInterest","CadastralParcel"]),Array.isArray(t)&&t.length){for(var e=[],i=0;i<t.length;i++)this._servicesRightManagement.Geocode.indexOf(t[i])<0&&(e.push(i),console.log("[ReverseGeocode] no rights for options.resources : "+t[i]));if(0!==e.length)for(var n=0;n<e.length;n++)t.splice(e[n],1);"StreetAddress"!==t[0]&&"PositionOfInterest"!==t[0]&&"CadastralParcel"!==t[0]&&"Administratif"!==t[0]||(this._currentGeocodingType=t[0])}var o=this.options.reverseGeocodeOptions;o.filterOptions&&Array.isArray(o.filterOptions.type)&&0!==o.filterOptions.type.length&&(this._currentGeocodingType=o.filterOptions.type[0])},_initGeocodingDelimitation:function(){this._currentGeocodingDelimitation="Point";var t=this.options.delimitations;if(t&&0!==t.length||(this.options.delimitations=["Point","Circle","Extent"]),Array.isArray(t)&&t.length){var e=t[0].toLowerCase();"point"!==e&&"circle"!==e&&"extent"!==e||(this._currentGeocodingDelimitation=t[0])}},_initLayout:function(){var t=this._createMainContainerElement(),e=this._showReverseGeocodingContainer=this._createShowReverseGeocodingElement();t.appendChild(e),this.options.collapsed||(e.checked=!0);var i=this._createShowReverseGeocodingPictoElement();t.appendChild(i);var n=this._createReverseGeocodingPanelElement(),o=this._panelHeaderContainer=this._createReverseGeocodingPanelHeaderElement(),s=this._returnPictoContainer=this._createReverseGeocodingPanelReturnPictoElement();o.appendChild(s);var r=this._panelTitleContainer=this._createReverseGeocodingPanelTitleElement();o.appendChild(r);var a=this._createReverseGeocodingPanelCloseElement();o.appendChild(a),n.appendChild(o);var l=this._formContainer=this._createReverseGeocodingPanelFormElement();l.appendChild(this._createReverseGeocodingFormModeChoiceGeocodingTypeElement(this.options.resources)),l.appendChild(this._createReverseGeocodingFormModeChoiceGeocodingDelimitationElement(this.options.delimitations));var c=this._createReverseGeocodingSubmitFormElement();l.appendChild(c),n.appendChild(l);var h=this._waitingContainer=this._createReverseGeocodingWaitingElement();n.appendChild(h);var u=this._resultsContainer=this._createReverseGeocodingResultsPanelElement(),d=this._resultsListContainer=this._createReverseGeocodingResultsListElement();return u.appendChild(d),n.appendChild(u),t.appendChild(n),t},_activateMapInteraction:function(e){if(null===this._inputFeaturesLayer){this._inputFeaturesLayer=new t.FeatureGroup,e.addLayer(this._inputFeaturesLayer);var i=this;e.on("draw:created",function(e){var n=e.layer,o=e.layerType;i._setFeaturePosition(n,o),i._currentIdLayer=t.Util.stamp(n),i._setFeatureLayer(n)}),e.on("draw:drawstart",function(){i._removeFeatureLayer(i._lastIdLayer),i._lastIdLayer=i._currentIdLayer}),e.on("draw:drawstop",function(){})}var n=this._currentGeocodingDelimitation.toLowerCase();switch(n){case"point":this._activatePointInteraction(e);break;case"circle":this._activateCircleInteraction(e);break;case"extent":this._activateBoxInteraction(e)}},_removeMapInteraction:function(t){t&&(null!==this._inputFeaturesLayer&&(t.off("draw:created"),t.off("draw:drawstart"),t.off("draw:drawstop"),t.removeLayer(this._inputFeaturesLayer),this._inputFeaturesLayer=null),this._lastIdLayer=this._currentIdLayer=0,this._currentFeature&&this._currentFeature.disable())},_activatePointInteraction:function(e){this._currentFeature&&this._currentFeature.disable(),t.drawLocal.draw.handlers.marker.tooltip.start="click map to place search point";var i={repeatMode:!0};this._currentFeature=new t.Draw.Marker(e,i),this._currentFeature.enable()},_activateCircleInteraction:function(e){this._currentFeature&&this._currentFeature.disable();var i={repeatMode:!0};this._currentFeature=new t.Draw.Circle(e,i),this._currentFeature.enable()},_activateBoxInteraction:function(e){this._currentFeature&&this._currentFeature.disable();var i={repeatMode:!0};this._currentFeature=new t.Draw.Rectangle(e,i),this._currentFeature.enable()},_setFeaturePosition:function(t,e){var i=null;if("marker"===e)i=t.getLatLng(),this._requestPosition={x:i.lat,y:i.lng};else if("circle"===e)i=t.getLatLng(),this._requestPosition={x:i.lat,y:i.lng},this._requestCircleFilter={x:i.lat,y:i.lng,radius:t.getRadius()};else if("rectangle"===e){i=t.getBounds();var n={lng:(i.getSouthWest().lng+i.getNorthEast().lng)/2,lat:(i.getSouthWest().lat+i.getNorthEast().lat)/2};this._requestPosition={x:n.lat,y:n.lng},this._requestBboxFilter={left:i.getSouthWest().lat,right:i.getNorthEast().lat,bottom:i.getSouthWest().lng,top:i.getNorthEast().lng}}},_setFeatureLayer:function(t){this._inputFeaturesLayer&&this._inputFeaturesLayer.addLayer(t)},_removeFeatureLayer:function(t){this._inputFeaturesLayer&&0!==t&&(t?this._inputFeaturesLayer.removeLayer(t):this._inputFeaturesLayer.clearLayers())},_reverseGeocodingRequest:function(e){var i=this._map;this._removeMapInteraction(i);var o={};t.Util.extend(o,this.options.reverseGeocodeOptions),t.Util.extend(o,e),t.Util.extend(o,{apiKey:this.options.apiKey,srs:"EPSG:4326",returnFreeForm:!1,timeOut:3e4,protocol:"XHR"});var s=o.filterOptions.type;"circle"===this._currentGeocodingDelimitation.toLowerCase()&&this._requestCircleFilter&&(this._requestCircleFilter.radius>1e3&&(this._requestCircleFilter.radius=1e3),t.Util.extend(o,{filterOptions:{type:s,circle:this._requestCircleFilter}})),"extent"===this._currentGeocodingDelimitation.toLowerCase()&&this._requestBboxFilter&&t.Util.extend(o,{filterOptions:{type:s,bbox:this._requestBboxFilter}}),this._displayWaitingContainer(),n.Services.reverseGeocode(o)},_displayGeocodedLocations:function(t){if(this._clearLocations(),this._clearLocationsFeature(),this._reverseGeocodingLocations=t,!t||0===t.length)return void this._clearInputRequest();this._formContainer.className="GPreverseGeocodingComponentHidden",this._hideWaitingContainer(),this._panelTitleContainer.innerHTML="Résultats de la recherche",this._returnPictoContainer.className="",this._resultsContainer.className="GPpanel",this._fillGeocodedLocationListContainer(t),this._displayGeocodedLocationsOnMap(t);var e=this._map;e.fitBounds(this._inputResultsLayer.getBounds())},_fillGeocodedLocationListContainer:function(t){for(var e=0;e<t.length;e++){var i=t[e],n=this._fillGeocodedLocationDescription(i);0!==n.length&&this._createReverseGeocodingResultElement(n,e)}},_fillGeocodedLocationDescription:function(t){if(t&&t.placeAttributes){var e=t.placeAttributes,i="";switch(t.type){case"StreetAddress":e.street&&(i+=e.number?e.number+" ":"",i+=e.street+", "),i+=e.postalCode+" "+e.commune;break;case"PositionOfInterest":"City"===t.matchType&&e.commune?(i+=e.commune,i+=e.postalCode?", "+e.postalCode:""):"Département"===t.matchType&&e.municipality?(i+=e.municipality,i+=e.postalCode?", "+e.postalCode:""):"Toponym"===t.matchType&&e.municipality?(i+=e.municipality,i+=e.postalCode?", "+e.postalCode:"",i+=e.commune?" "+e.commune:""):i+=e.municipality?e.municipality:"",i+=e.nature?" ("+e.nature+") ":"";break;case"CadastralParcel":i+=e.cadastralParcel?e.cadastralParcel:"",i+=e.municipality?" ("+e.municipality+")":"";break;case"Administratif":i+=e.municipality?e.municipality:"",e.inseeDepartment?i+="(Département)":e.inseeRegion&&(i+="(Région)");break;default:i+=e.municipality?e.municipality:""}return i}},_displayGeocodedLocationsOnMap:function(e){function i(e){var i=e.target;i.setIcon(new r("red"));var n=t.DomUtil.get("ReverseGeocodedLocation_"+i.options.id+"-"+s._uid);t.DomUtil.addClass(n,"GPreverseGeocodedLocationHighlight"),n.scrollIntoView(!1)}function n(e){var i=e.target;i.setIcon(new r("green"));var n=t.DomUtil.get("ReverseGeocodedLocation_"+i.options.id+"-"+s._uid);t.DomUtil.removeClass(n,"GPreverseGeocodedLocationHighlight")}var o=this._map,s=this;this._inputResultsLayer=new t.FeatureGroup,o.addLayer(this._inputResultsLayer);for(var a=0;a<e.length;a++){var l=e[a];if(l){var c={id:a,icon:new r("green"),riseOnHover:!0,draggable:!1,clickable:!0,zIndexOffset:1e3},h=t.marker(t.latLng(l.position.x,l.position.y),c),u="<ul>",d=l.placeAttributes;for(var p in d)d.hasOwnProperty(p)&&"bbox"!==p&&(u+="<li>",u+='<span class="gp-attname-others-span">'+p.toUpperCase()+" : </span>",u+=d[p],u+=" </li>");u+=" </ul>",h.bindPopup(u),h.on("mouseover",i),h.on("mouseout",n),this._inputResultsLayer.addLayer(h)}}},onShowReverseGeocodingClick:function(){var t=this._map;this._showReverseGeocodingContainer.checked?this._removeMapInteraction(t):this._waiting||this._reverseGeocodingLocations.length||this._activateMapInteraction(t)},onReverseGeocodingTypeChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;i&&(this._currentGeocodingType=i)},onReverseGeocodingDelimitationChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;if(i){this._currentGeocodingDelimitation=i,this._clearInputRequest();var n=this._map;this._removeMapInteraction(n),this._activateMapInteraction(n)}},onGPreverseGeocodingReturnPictoClick:function(){this._clearLocations(),this._clearLocationsFeature(),this._clearInputRequest(),this._activateMapInteraction(this._map)},onReverseGeocodingSubmit:function(){if(this._requestPosition&&!this._noRightManagement){var t=this;this._reverseGeocodingRequest({position:t._requestPosition,filterOptions:{type:[t._currentGeocodingType]},onSuccess:function(e){if(e){var i=e.locations;t._displayGeocodedLocations(i),t._hideWaitingContainer()}},onFailure:function(e){t._hideWaitingContainer(),t._clearLocations(),t._clearLocationsFeature(),t._clearInputRequest()}})}},onReverseGeocodingResultClick:function(t){},onReverseGeocodingResultMouseOver:function(t){var e=s.index(t.target.id);t.target.classList&&t.target.classList.add("GPreverseGeocodedLocationHighlight"),this._inputResultsLayer&&this._inputResultsLayer.eachLayer(function(t){t.options.id===parseInt(e,10)&&t.fire("mouseover")})},onReverseGeocodingResultMouseOut:function(t){var e=s.index(t.target.id);t.target.classList&&t.target.classList.remove("GPreverseGeocodedLocationHighlight"),this._inputResultsLayer&&this._inputResultsLayer.eachLayer(function(t){t.options.id===parseInt(e,10)&&t.fire("mouseout")})},_clearLocations:function(){if(this._reverseGeocodingLocations=[],this._resultsListContainer)for(;this._resultsListContainer.firstChild;)this._resultsListContainer.removeChild(this._resultsListContainer.firstChild)},_clearLocationsFeature:function(){var t=this._map;null!==this._inputResultsLayer&&(t.removeLayer(this._inputResultsLayer),this._inputResultsLayer=null)},_clearInputRequest:function(){this._requestPosition=null,this._requestCircleFilter=null,this._requestBboxFilter=null},_displayWaitingContainer:function(){this._waitingContainer.className="GPreverseGeocodingCalcWaitingContainerVisible",this._waiting=!0,this._timer&&(clearTimeout(this._timer),this._timer=null);var t=this;this._timer=setTimeout(function(){t._waiting===!0?t._hideWaitingContainer():t._timer&&clearTimeout(t._timer)},16e3)},_hideWaitingContainer:function(){this._waiting&&(this._waitingContainer.className="GPreverseGeocodingCalcWaitingContainerHidden",this._waiting=!1,clearTimeout(this._timer),this._timer=null)}});return l}(leaflet,leafletDraw,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,LeafletControlsUtilsIconDefault,CommonControlsReverseGeocodingDOM),CommonControlsRouteDOM=function(t){var e={_addUID:function(t){return t+"-"+this._uid},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProute"),t.className="GPwidget",t},_createShowRouteElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowRoute"),t.type="checkbox",t},_createShowRoutePictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowRoutePicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowRoute"),e.title="Ouvrir le calcul d'itinéraire",e.addEventListener?e.addEventListener("click",function(e){t.onShowRoutePanelClick(e)}):e.attachEvent&&e.attachEvent("onclick",function(e){t.onShowRoutePanelClick(e)});var i=document.createElement("span");return i.id=this._addUID("GPshowRouteOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createRoutePanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProutePanel"),t.className="GPpanel",t},_createRoutePanelHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Calcul d'itinéraire",e.appendChild(i);var n=document.createElement("div");return n.id=this._addUID("GProutePanelClose"),n.className="GPpanelClose",n.title="Masquer le panneau",n.addEventListener?n.addEventListener("click",function(){document.getElementById(t._addUID("GPshowRoutePicto")).click()},!1):n.attachEvent&&n.attachEvent("onclick",function(){document.getElementById(t._addUID("GPshowRoutePicto")).click()}),e.appendChild(n),e},_createRoutePanelFormElement:function(){var e=this,i=document.createElement("form");return i.id=this._addUID("GProuteForm"),i.setAttribute("onkeypress","return event.keyCode != 13;"),i.addEventListener("submit",function(i){console.log(i),i.preventDefault();var n=document.getElementsByClassName(e._addUID("GPlocationPoint")),o=n[0].childNodes[0].id,s=n[n.length-1].childNodes[0].id,r=t.index(o),a=t.index(s);if(""==document.getElementById(e._addUID("GPlocationOrigin_"+r)).value&&""==document.getElementById(e._addUID("GPlocationOriginCoords_"+r)).value||""==document.getElementById(e._addUID("GPlocationOrigin_"+a)).value&&""==document.getElementById(e._addUID("GPlocationOriginCoords_"+a)).value)return!1;var l;document.getElementById(e._addUID("GProuteResultsStages")).innerHTML="";for(var c=0;c<n.length;c++){var h=n[c].childNodes[0].id;if(l=t.index(h),"GPflexInput GPlocationStageFlexInput"==document.getElementById(e._addUID("GPlocationPoint_"+l)).className){var u=document.createElement("div");u.className="GProuteResultsStages";var d=document.createElement("div");d.className="GProuteResultStageLabel",d.innerHTML=document.getElementById(e._addUID("GPlocationOriginLabel_"+l)).innerHTML+" :",u.appendChild(d);var p=document.createElement("div");p.className="GProuteResultStageValue";var m=document.getElementById(e._addUID("GPlocationOriginCoords_"+l)),f=m.value,_="GPlocationOriginVisible"===m.className;null!=f&&""!=f&&_?p.innerHTML=f:p.innerHTML=document.getElementById(e._addUID("GPlocationOrigin_"+l)).value,u.appendChild(p),""!=p.innerHTML&&document.getElementById(e._addUID("GProuteResultsStages")).appendChild(u)}}var g=null;if(document.getElementById(e._addUID("GProuteComputationSelect"))){var v=document.getElementById(e._addUID("GProuteResultsComputationSelect"));v.selectedIndex=document.getElementById(e._addUID("GProuteComputationSelect")).selectedIndex,g=v.options[v.selectedIndex].value}var y=null;document.getElementById(e._addUID("GProuteTransportCar"))&&document.getElementById(e._addUID("GProuteTransportCar")).checked&&(y=document.getElementById(e._addUID("GProuteTransportCar")).value),document.getElementById(e._addUID("GProuteTransportPedestrian"))&&document.getElementById(e._addUID("GProuteTransportPedestrian")).checked&&(y=document.getElementById(e._addUID("GProuteTransportPedestrian")).value);for(var E=[],P=document.getElementsByClassName("GProuteExclusionsOption"),C=0;C<P.length;C++){l=P[C].htmlFor;var S=document.getElementById(l);S.checked||E.push(S.value)}return e.onRouteComputationSubmit({computation:g,transport:y,exclusions:E}),!1}),i},_createRoutePanelResultsElement:function(){var t=document.createElement("div");t.id=this._addUID("GProuteResultsPanel"),t.className="GProuteComponentHidden",t.appendChild(this._createRouteResultsStagesElement()),t.appendChild(this._createRouteResultsElement());var e=document.createElement("div");e.className="GPfakeBorder GPfakeBorderLeft",t.appendChild(e),t.appendChild(this._createRouteShowResultsDetailsElement());var i=document.createElement("label");i.htmlFor=this._addUID("GProuteResultsShowDetails"),i.innerHTML="Afficher le détail",t.appendChild(i);var n=document.createElement("label");n.htmlFor=this._addUID("GProuteResultsShowDetails"),n.innerHTML="Masquer le détail",t.appendChild(n);var o=document.createElement("div");return o.className="GPfakeBorder",t.appendChild(o),t.appendChild(this._createRouteResultsDetailsElement()),t},_createRouteWaitingElement:function(){var t=document.createElement("div");t.id=this._addUID("GProuteCalcWaitingContainer"),t.className="GProuteCalcWaitingContainerHidden";var e=document.createElement("p");return e.className="GProuteCalcWaiting",e.innerHTML="Calcul en cours...",t.appendChild(e),t},_createRouteResultsStagesElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProuteResultsStages"),t},_createRouteResultsElement:function(){var t=this,e=document.createElement("div");e.id=this._addUID("GProuteResults");var i=document.createElement("div");i.id=this._addUID("GProuteResultsValues"),e.appendChild(i);var n=document.createElement("div");n.id=this._addUID("GProuteResultsMode");var o=document.createElement("select");o.id=this._addUID("GProuteResultsComputationSelect"),o.className="GPinputSelect",o.addEventListener("change",function(e){t.onRouteModeComputationChangeAndRun(e)});for(var s=[{code:"fastest",label:"Plus rapide"},{code:"shortest",label:"Plus court"}],r=0;r<s.length;r++){var a=document.createElement("option");a.value=s[r].code,a.text=s[r].label,o.appendChild(a)}n.appendChild(o),e.appendChild(n);var l=document.createElement("div");return l.id=this._addUID("GProuteResultsNew"),l.title="Modifier le calcul",l.addEventListener("click",function(e){document.getElementById(t._addUID("GProuteResultsPanel")).className="GProuteComponentHidden",document.getElementById(t._addUID("GProuteForm")).className="",t.onShowRouteResultsNewClick(e)}),e.appendChild(l),e},_addRouteResultsValuesElement:function(t,e,i){var n=document.getElementById(this._addUID("GProuteResultsValues"));if(n.childElementCount)for(;n.firstChild;)n.removeChild(n.firstChild);var o=document.createElement("div");o.className="GProuteResultsValue";var s=document.createElement("label");s.className="GProuteResultsValueLabel",s.innerHTML="Distance :",o.appendChild(s);var r=0,a=parseInt(t/1e3,10);if(a){var l=Math.round(t);l/=1e3,r=l+" km"}else r=Math.round(t)+" m";var c=document.createElement("div");c.id=this._addUID("GProuteResultsValueDist"),c.innerHTML=r,o.appendChild(c),n.appendChild(o);var h=document.createElement("div");h.className="GProuteResultsValue";var u=document.createElement("label");u.className="GProuteResultsValueLabel",u.innerHTML="Durée :",h.appendChild(u);var d=document.createElement("div");return d.id=this._addUID("GProuteResultsValueDist"),d.innerHTML=i(e),h.appendChild(d),n.appendChild(h),n},_createRouteShowResultsDetailsElement:function(){var t=document.createElement("input");return t.id=this._addUID("GProuteResultsShowDetails"),t.type="checkbox",t},_createRouteResultsDetailsElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProuteResultsDetails"),t},_addRouteResultsDetailsElement:function(t,e){var i=this,n=document.getElementById(this._addUID("GProuteResultsDetails"));if(n.childElementCount)for(;n.firstChild;)n.removeChild(n.firstChild);for(var o=0,s=0,r=0;r<t.length;r++){var a=r+1,l=t[r],c=document.createElement("div");c.className="GProuteResultsDetailsNumber",c.innerHTML=a+".",n.appendChild(c),s+=parseFloat(l.duration),o+=parseFloat(l.distance);var h=0,u=parseInt(o/1e3,10);if(u){var d=Math.round(o);d/=1e3,h=d+" km"}else h=Math.round(o)+" m";var p=document.createElement("div");p.className="GProuteResultsDetailsInstruction",p.id=this._addUID("GProuteResultsDetailsInstruction_"+a),p.title="distance : "+h+" / temps : "+e(s),p.innerHTML=l.instruction,p.addEventListener("mouseover",function(t){i.onRouteResultsDetailsMouseOver(t)}),p.addEventListener("mouseout",function(t){i.onRouteResultsDetailsMouseOut(t)}),p.addEventListener("click",function(t){"function"==typeof i.onRouteResultsDetailsClick&&i.onRouteResultsDetailsClick(t)}),n.appendChild(p)}return n},_createRoutePanelFormPointElement:function(t,e,i){var n=this,o=document.createElement("div");o.id="GProutePoint"+t,o.className=i?"GPflexInput GProuteStageFlexInput":"GPflexInput GProuteStageFlexInputHidden";var s=document.createElement("label");s.id="GProuteOriginLabel"+t,s.htmlFor="GProuteOrigin"+t,s.innerHTML=e,s.addEventListener("click",function(){var t=this.id.charAt(this.id.length-1);document.getElementById("GProuteOriginCoords"+t).value="";for(var e=1;e<8;e++)document.getElementById("GProutePoint"+e).style.display="flex";document.getElementById("GProuteForm").className="",document.getElementById("GProuteOriginPointer"+t).checked=!1,document.getElementById("GProuteOrigin"+t).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+t).className="GProuteOriginHidden"}),o.appendChild(s);var r=document.createElement("input");r.id="GProuteOrigin"+t,r.className="GProuteOriginVisible",r.type="text",r.placeholder="Saisir une adresse",r.addEventListener("keyup",function(t){var e=t.which||t.keyCode;if(13!==e&&10!==e){var i=this.id.charAt(this.id.length-1);document.getElementById("GProuteOrigin"+i).value.length>2?document.getElementById("GProuteAutoCompleteList"+i).style.display="block":document.getElementById("GProuteAutoCompleteList"+i).style.display="none",n.onAutoCompleteSearchText(t)}}),r.addEventListener("blur",function(){var t=this.id.charAt(this.id.length-1);document.getElementById("GProuteAutoCompleteList"+t).style.display="none"}),o.appendChild(r);var a=document.createElement("input");a.id="GProuteOriginCoords"+t,a.className="GProuteOriginHidden",a.type="text",a.disabled=!0,o.appendChild(a);var l=document.createElement("input");l.id="GProuteOriginPointer"+t,l.type="checkbox",o.appendChild(l);var c=document.createElement("label");return c.id="GProuteOriginPointerImg"+t,c.htmlFor="GProuteOriginPointer"+t,c.className="GProuteOriginPointerImg",c.title="Pointer un lieu sur la carte",c.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation();var e,i=this.id.charAt(this.id.length-1);for(e=1;e<8;e++)i!=e&&(document.getElementById("GProuteOriginPointer"+e).checked=!1,"Pointer un lieu sur la carte"==document.getElementById("GProuteOriginCoords"+e).value&&(document.getElementById("GProuteOriginCoords"+e).value="",document.getElementById("GProuteOrigin"+e).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+e).className="GProuteOriginHidden"));if(document.getElementById("GProuteOriginPointer"+i).checked){for(document.getElementById("GProuteOriginCoords"+i).value="",e=1;e<8;e++)document.getElementById("GProutePoint"+e).style.display="flex";document.getElementById("GProuteForm").className="",document.getElementById("GProuteOriginPointer"+i).checked=!1,document.getElementById("GProuteOrigin"+i).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+i).className="GProuteOriginHidden"}else{for(document.getElementById("GProuteOriginCoords"+i).value="Pointer un lieu sur la carte",e=1;e<8;e++)i==e?document.getElementById("GProutePoint"+e).style.display="flex":document.getElementById("GProutePoint"+e).style.display="none";document.getElementById("GProuteForm").className="GProuteFormMini",document.getElementById("GProuteOriginPointer"+i).checked=!0,document.getElementById("GProuteOrigin"+i).className="GProuteOriginHidden",document.getElementById("GProuteOriginCoords"+i).className="GProuteOriginVisible"}n.onRouteMapPointClick(t)}),o.appendChild(c),o},_createRoutePanelFormRemoveStageElement:function(t){var e=this,i=document.createElement("div");return i.id="GProuteStageRemove"+t,i.className="GProuteStageRemove",i.title="Supprimer l'étape",1!=t&&7!=t&&i.addEventListener("click",function(t){var i=this.id.charAt(this.id.length-1);document.getElementById("GProutePoint"+i).className="GPflexInput GProuteStageFlexInputHidden",document.getElementById("GProuteOrigin"+i).value="",document.getElementById("GProuteOrigin"+i).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+i).value="",document.getElementById("GProuteOriginCoords"+i).className="GProuteOriginHidden",document.getElementById("GProuteStageAdd").style.display="";var n=document.getElementById("GPshowRouteExclusionsPicto").style.top;document.getElementById("GPshowRouteExclusionsPicto").style.top=(parseInt(n,10)-33).toString()+"px",e.onRouteRemovePointClick(t)}),i},_createRoutePanelFormAddStageElement:function(){var t=this,e=document.createElement("div");return e.id="GProuteStageAdd",e.title="Ajouter une étape",e.addEventListener("click",function(e){for(var i=1,n=0,o=2;o<7;o++)"GPflexInput GProuteStageFlexInputHidden"==document.getElementById("GProutePoint"+o).className?1==i&&(i=o):n++;if(i<7){document.getElementById("GProutePoint"+i).className="GPflexInput GProuteStageFlexInput";var s=document.getElementById("GPshowRouteExclusionsPicto").style.top;document.getElementById("GPshowRouteExclusionsPicto").style.top=(parseInt(s,10)+33).toString()+"px"}4==n&&(document.getElementById("GProuteStageAdd").style.display="none"),t.onRouteAddPointClick(e)}),e},_createRoutePanelFormAutoCompleteListElement:function(t){var e=this,i=document.createElement("div");return i.id="GProuteAutoCompleteList"+t,i.className="GPadvancedAutoCompleteList",i.addEventListener?i.addEventListener("click",function(i){e.onAutoCompletedResultsItemClick(i),document.getElementById("GProuteAutoCompleteList"+t).style.display="none"},!1):i.attachEvent&&i.attachEvent("onclick",function(i){e.onAutoCompletedResultsItemClick(i),document.getElementById("GProuteAutoCompleteList"+t).style.display="none"}),i},_createRouteAutoCompletedLocationElement:function(t,e,i){var n=document.getElementById("GProuteAutoCompleteList"+e),o=document.createElement("div");o.id="AutoCompletedLocation"+i,o.className="GPautoCompleteProposal",o.innerHTML=t.fullText,n.appendChild(o)},_createRoutePanelFormModeChoiceElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProuteModeChoice"),t},_createRoutePanelFormModeChoiceTransportElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GProuteTransportChoice");var n=document.createElement("span");n.className="GProuteModeLabel",n.innerHTML="Mode de transport",i.appendChild(n);for(var o=0;o<t.length;o++){var s=t[o];if("Voiture"===s){var r=document.createElement("input");r.id=this._addUID("GProuteTransportCar"),r.type="radio",r.name="GProuteTransport",r.value="Voiture",0===o&&(r.checked=!0),r.addEventListener?r.addEventListener("change",function(t){e.onRouteModeTransportChange(t)}):r.attachEvent&&r.attachEvent("onchange",function(t){e.onRouteModeTransportChange(t)}),i.appendChild(r);var a=document.createElement("label");a.className="GProuteTransportImg",a.htmlFor=this._addUID("GProuteTransportCar"),a.title="Voiture",i.appendChild(a)}if("Pieton"===s){var l=document.createElement("input");l.id=this._addUID("GProuteTransportPedestrian"),l.type="radio",l.name="GProuteTransport",l.value="Pieton",0===o&&(l.checked=!0),l.addEventListener?l.addEventListener("change",function(t){e.onRouteModeTransportChange(t)}):l.attachEvent&&l.attachEvent("onchange",function(t){e.onRouteModeTransportChange(t)}),i.appendChild(l);var c=document.createElement("label");c.className="GProuteTransportImg",c.htmlFor=this._addUID("GProuteTransportPedestrian"),c.title="Piéton",i.appendChild(c)}}return i},_createRoutePanelFormModeChoiceComputeElement:function(){var t=this,e=document.createElement("div");e.id=this._addUID("GProuteComputationChoice");var i=document.createElement("span");i.className="GProuteModeLabel",i.innerHTML="Mode de calcul",e.appendChild(i);var n=document.createElement("select");n.id=this._addUID("GProuteComputationSelect"),n.className="GPinputSelect",n.addEventListener("change",function(e){t.onRouteModeComputationChange(e)});for(var o=[{code:"fastest",label:"Plus rapide"},{code:"shortest",label:"Plus court"}],s=0;s<o.length;s++){var r=document.createElement("option");r.value=o[s].code,r.text=o[s].label,n.appendChild(r)}return e.appendChild(n),e},_createShowRouteExclusionsElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowRouteExclusions"),t.type="checkbox",t},_createShowRouteExclusionsPictoElement:function(){var t=this,e=document.createElement("label");return e.id=this._addUID("GPshowRouteExclusionsPicto"),
-e.className="GPshowMoreOptions GPshowRouteExclusionsPicto",e.htmlFor=this._addUID("GPshowRouteExclusions"),e.title="Exclusions",e.style.top="185px",e.addEventListener?e.addEventListener("click",function(e){t.onShowRouteExclusionsClick(e)}):e.attachEvent&&e.attachEvent("onclick",function(e){t.onShowRouteExclusionsClick(e)}),e},_createRoutePanelFormExclusionsElement:function(){var t=document.createElement("div");t.id=this._addUID("GProuteExclusions");var e=document.createElement("span");return e.className="GProuteExclusionsLabel",e.innerHTML="Passages autorisés",t.appendChild(e),t},_createRoutePanelFormExclusionOptionsElement:function(t){var e=this,i=document.createElement("div");i.className="GProuteExclusionsOptions";for(var n in t)if(t.hasOwnProperty(n)){var o=t[n];switch(n){case"toll":var s=document.createElement("input");s.id=this._addUID("GProuteExclusionsToll"),s.type="checkbox",s.value="Toll",s.checked=!o,s.addEventListener?s.addEventListener("change",function(t){e.onRouteExclusionsChange(t)}):s.attachEvent&&s.attachEvent("onchange",function(t){e.onRouteExclusionsChange(t)}),i.appendChild(s);var r=document.createElement("label");r.className="GProuteExclusionsOption",r.htmlFor=this._addUID("GProuteExclusionsToll"),r.innerHTML="Péages",i.appendChild(r);break;case"tunnel":var a=document.createElement("input");a.id=this._addUID("GProuteExclusionsTunnel"),a.type="checkbox",a.value="Tunnel",a.checked=!o,a.addEventListener?a.addEventListener("change",function(t){e.onRouteExclusionsChange(t)}):a.attachEvent&&a.attachEvent("onchange",function(t){e.onRouteExclusionsChange(t)}),i.appendChild(a);var l=document.createElement("label");l.className="GProuteExclusionsOption",l.htmlFor=this._addUID("GProuteExclusionsTunnel"),l.innerHTML="Tunnels",i.appendChild(l);break;case"bridge":var c=document.createElement("input");c.id=this._addUID("GProuteExclusionsBridge"),c.type="checkbox",c.value="Bridge",c.checked=!o,c.addEventListener?c.addEventListener("change",function(t){e.onRouteExclusionsChange(t)}):c.attachEvent&&c.attachEvent("onchange",function(t){e.onRouteExclusionsChange(t)}),i.appendChild(c);var h=document.createElement("label");h.className="GProuteExclusionsOption",h.htmlFor=this._addUID("GProuteExclusionsBridge"),h.innerHTML="Ponts",i.appendChild(h)}}return i},_createRouteSubmitFormElement:function(){var t=document.createElement("input");return t.id=this._addUID("GProuteSubmit"),t.className="GPinputSubmit",t.type="submit",t.value="Calculer",t},_createRouteFormResetElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GProuteReset"),e.title="Réinitialiser les paramètres",e.addEventListener("click",function(e){t.onRouteResetClick(e)}),e}};return e}(CommonUtilsSelectorID),LeafletControlsRoute=function(t,e,i,n,o,s,r){var a=t.Control.extend({includes:r,options:{position:"topleft",collapsed:!0,graphs:["Voiture","Pieton"],exclusions:{toll:!1,tunnel:!1,bridge:!1},disableReverse:!1,routeOptions:{},autocompleteOptions:{}},initialize:function(e){t.Util.setOptions(this,e),this._uid=o.generate(),this._initTransport(),this._initExclusions(),this._initComputation(),this._waitingContainer=null,this._formRouteContainer=null,this._resultsRouteContainer=null,this._isDesktop=this._detectSupport(),this._currentPoints=[],this._currentTransport=null,this._currentComputation=null,this._currentExclusions=[],this._geojsonRoute=null,this._geojsonSections=null,this._waiting=!1,this._timer=null,this._currentRouteInformations=null,this._resources={},this._noRightManagement=!1,this._checkRightsManagement()},onAdd:function(e){var i=this._container=this._initLayout(e);return t.DomEvent.disableClickPropagation(i).disableScrollPropagation(i),i},onRemove:function(){},_initTransport:function(){this._currentTransport="Voiture";var e=this.options.graphs;e&&0!==e.length||(this.options.graphs=["Voiture","Pieton"]),t.Util.isArray(e)&&e.length&&("Voiture"!==e[0]&&"Pieton"!==e[0]||(this._currentTransport=e[0]));var i=this.options.routeOptions;i.graph&&(this._currentTransport=i.graph)},_initComputation:function(){this._currentComputation="fastest";var t=this.options.routeOptions;t.routePreference&&(this._currentComputation=t.routePreference)},_initExclusions:function(){this._currentExclusions=[];var e=this.options.exclusions;if(e&&0!==Object.keys(e).length||(this.options.exclusions={toll:!1,tunnel:!1,bridge:!1}),e&&Object.keys(e).length)for(var i in e)e.hasOwnProperty(i)&&e.k&&this._currentExclusions.push(i);var n=this.options.routeOptions;t.Util.isArray(n.exclusions)&&(this._currentExclusions=n.exclusions)},_checkRightsManagement:function(){var t=null,e=[],i=null;i=this.options.routeOptions.apiKey,t=this.options.routeOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=["Voiture","Pieton"]);var o=n.check({key:i||this.options.apiKey,resources:e,services:["Itineraire"]});i=this.options.autocompleteOptions.apiKey,t=this.options.autocompleteOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=["StreetAddress","PositionOfInterest"]);var s=n.check({key:i||this.options.apiKey,resources:e,services:["AutoCompletion"]});o||s||(this._noRightManagement=!0),s&&(this._resources.AutoCompletion={},this._resources.AutoCompletion.resources=s.AutoCompletion,this._resources.AutoCompletion.key=s.key),o&&(this._resources.Itineraire={},this._resources.Itineraire.resources=o.Itineraire,this._resources.Itineraire.key=o.key)},_detectSupport:function(){var t=!0,e=window.navigator.userAgent.toLowerCase();return e.indexOf("iphone")===-1&&e.indexOf("ipod")===-1&&e.indexOf("ipad")===-1&&e.indexOf("android")===-1&&e.indexOf("mobile")===-1&&e.indexOf("blackberry")===-1&&e.indexOf("tablet")===-1&&e.indexOf("phone")===-1&&e.indexOf("touch")===-1||(t=!1),e.indexOf("msie")===-1&&e.indexOf("trident")===-1||(t=!0),t},_initLayout:function(t){var e=this._createMainContainerElement(),i=this._showRouteContainer=this._createShowRouteElement();e.appendChild(i),this.options.collapsed||(i.checked=!0);var n=this._createShowRoutePictoElement();e.appendChild(n);var o=this._createRoutePanelElement(),s=this._createRoutePanelHeaderElement();o.appendChild(s);for(var r=this._formRouteContainer=this._createRoutePanelFormElement(),a=this._createRoutePanelFormPointsElement(t),l=0;l<a.length;l++)r.appendChild(a[l]);var c=this._createRoutePanelFormModeChoiceElement();c.appendChild(this._createRoutePanelFormModeChoiceTransportElement(this.options.graphs)),c.appendChild(this._createRoutePanelFormModeChoiceComputeElement()),r.appendChild(c),r.appendChild(this._createShowRouteExclusionsElement()),r.appendChild(this._createShowRouteExclusionsPictoElement());var h=this._createRoutePanelFormExclusionsElement();h.appendChild(this._createRoutePanelFormExclusionOptionsElement(this.options.exclusions)),r.appendChild(h);var u=this._createRouteSubmitFormElement();r.appendChild(u),o.appendChild(r);var d=this._resultsRouteContainer=this._createRoutePanelResultsElement();o.appendChild(d);var p=this._waitingContainer=this._createRouteWaitingElement();return o.appendChild(p),e.appendChild(o),e},_createRoutePanelFormPointsElement:function(t){var e=[],i=1,n=new s({apiKey:this.options.apiKey||null,tag:{id:i,unique:this._uid,label:"Départ",color:"blue",display:!0},disableReverse:this.options.disableReverse,autocompleteOptions:this.options.autocompleteOptions||null});for(n.setMap(t),e.push(n.getContainer()),this._currentPoints.push(n),i=2;i<7;i++){var o=new s({apiKey:this.options.apiKey||null,tag:{id:i,unique:this._uid,label:"Etape",color:"green",display:!1,removeOption:!0},disableReverse:this.options.disableReverse,autocompleteOptions:this.options.autocompleteOptions||null});o.setMap(t),e.push(o.getContainer()),this._currentPoints.push(o)}var r=new s({apiKey:this.options.apiKey||null,tag:{id:i,unique:this._uid,label:"Arrivée",color:"red",display:!0,addOption:!0,removeOption:!1},disableReverse:this.options.disableReverse,autocompleteOptions:this.options.autocompleteOptions||null});return r.setMap(t),e.push(r.getContainer()),this._currentPoints.push(r),e},onShowRoutePanelClick:function(t){this._geojsonSections||this._clear()},onRouteModeComputationChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;i&&(this._currentComputation=i)},onRouteModeComputationChangeAndRun:function(t){this.onRouteModeComputationChange(t),this._clearRouteResultsDetails(),this._clearRouteResultsGeometry(),this._clearRouteResultsFeatureGeometry(),this.onRouteComputationSubmit({computation:this._currentComputation,transport:this._currentTransport,exclusions:this._currentExclusions})},onRouteModeTransportChange:function(t){var e=t.target.value;e&&(this._currentTransport=e)},onShowRouteExclusionsClick:function(t){},onRouteExclusionsChange:function(t){var e=t.target.value,i=t.target.checked;if(e){for(var n=!1,o=null,s=0;s<this._currentExclusions.length;s++)this._currentExclusions[s]===e&&(o=s,n=!0);!n&&i&&this._currentExclusions.push(e),n&&!i&&(this._currentExclusions[o]=null)}},onRouteComputationSubmit:function(t){var e=this._currentPoints,i=e[0].getCoordinate();e[0].dragging(!1);var n=e[e.length-1].getCoordinate();e[e.length-1].dragging(!1);for(var o=[],s=1;s<e.length-1;s++){var r=e[s].getCoordinate();e[s].dragging(!1),r&&o.push(r)}if(!this._noRightManagement){this._currentTransport=t.transport,this._currentComputation=t.computation,this._currentExclusions=t.exclusions,this._displayWaitingContainer();var a=this;this._requestRouting({startPoint:i,endPoint:n,viaPoints:o,graph:this._currentTransport,routePreference:this._currentComputation,exclusions:this._currentExclusions,geometryInInstructions:!0,distanceUnit:"m",onSuccess:function(t){t&&a._fillRouteResultsDetails(t)},onFailure:function(t){a._hideWaitingContainer(),a._clearRouteResultsDetails()}})}},onShowRouteResultsNewClick:function(t){for(var e=this._currentPoints,i=0;i<e.length;i++)e[i].dragging(!0);this._clearRouteResultsDetails(),this._clearRouteResultsGeometry(),this._clearRouteResultsFeatureGeometry()},onRouteResultsDetailsMouseOver:function(t){var e=o.index(t.target.id);this._isDesktop&&this._geojsonSections&&this._geojsonSections.eachLayer(function(t){t.feature.id===parseInt(e,10)&&t.setStyle({weight:10,color:"#0F9DE8",opacity:.5})})},onRouteResultsDetailsMouseOut:function(t){var e=o.index(t.target.id);this._isDesktop&&this._geojsonSections&&this._geojsonSections.eachLayer(function(t){t.feature.id===parseInt(e,10)&&t.setStyle({color:"#ED7F10",weight:5,opacity:.75})})},onRouteResultsDetailsClick:function(t){var e=o.index(t.target.id),i=this;if(!this._isDesktop&&this._geojsonSections){var n=t.target.title,s=t.target.innerHTML;this._geojsonSections.eachLayer(function(i){i.feature.id===parseInt(e,10)&&(t.target.innerHTML=n,i.setStyle({weight:10,color:"#0F9DE8",opacity:.5}))}),clearTimeout(1e3),setTimeout(function(){i._geojsonSections.eachLayer(function(i){i.feature.id===parseInt(e,10)&&(t.target.innerHTML=s,i.setStyle({color:"#ED7F10",weight:5,opacity:.75}))})},1e3)}},_requestRouting:function(e){if(e&&0!==Object.keys(e).length&&e.startPoint&&e.endPoint){if(this._noRightManagement)return void console.log("no rights for all service !?");if(!this._resources.Itineraire)return void console.log("no rights for this service !?");var n=this._resources.Itineraire.resources;if(n&&0!==Object.keys(n).length){var o=this._resources.Itineraire.key,s={};t.Util.extend(s,this.options.routeOptions),t.Util.extend(s,e);for(var r=!1,a=0;a<n.length;a++)n[a]===s.graph&&(r=!0);if(!r)return void console.log("no rights for this service !?");t.Util.extend(s,{apiKey:this.options.routeOptions.apiKey||this.options.apiKey||o}),i.Services.route(s)}}},_fillRouteResultsDetails:function(e){var i=e.totalDistance,n=e.totalTime,o=this._simplifiedInstructions(e.routeInstructions);o&&this._fillRouteResultsDetailsContainer(i,n,o);var s=e.routeGeometry;s&&this._fillRouteResultsDetailsGeometry(s);var r=0!==o[0].geometry.length;o&&r&&this._fillRouteResultsDetailsFeatureGeometry(o);var a=e.bbox;if(a){var l=this._map,c=t.latLngBounds([a.bottom,a.left],[a.top,a.right]);l.fitBounds(c,{padding:[1,1]})}this._currentRouteInformations=e,this._formRouteContainer.className="GProuteComponentHidden",this._hideWaitingContainer(),this._resultsRouteContainer.className=""},_fillRouteResultsDetailsContainer:function(t,e,i){this._resultsRouteValuesContainer=this._addRouteResultsValuesElement(t,e,this._convertSecondsToTime),this._resultsRouteDetailsContainer=this._addRouteResultsDetailsElement(i,this._convertSecondsToTime)},_fillRouteResultsDetailsGeometry:function(e){this._clearRouteResultsGeometry();var i=this._map,n={color:"#ff7800",weight:5,opacity:.65};this._geojsonRoute=t.geoJson(e,{style:n}).addTo(i)},_fillRouteResultsDetailsFeatureGeometry:function(e){function i(e){var i=e.target;h._geojsonSections.resetStyle(i);var n=t.DomUtil.get("GProuteResultsDetailsInstruction_"+i.feature.id+"-"+h._uid);t.DomUtil.removeClass(n,"GProuteResultsDetailsHighlight")}function n(e){var i=e.target;i.setStyle({weight:10,color:"#0F9DE8",opacity:.5});var n=t.DomUtil.get("GProuteResultsDetailsInstruction_"+i.feature.id+"-"+h._uid);t.DomUtil.addClass(n,"GProuteResultsDetailsHighlight")}this._clearRouteResultsFeatureGeometry();for(var o=this._map,s={color:"#ED7F10",weight:5,opacity:.75},r={type:"FeatureCollection",features:[]},a=0;a<e.length;a++){var l=e[a],c=a+1;r.features.push({id:c,type:"Feature",geometry:l.geometry,properties:{popupContent:"("+c+") distance : "+this._convertDistance(l.distance)+" / temps : "+this._convertSecondsToTime(l.duration)}})}var h=this;this._geojsonSections=t.geoJson(r,{style:s,onEachFeature:function(t,e){e.on({mouseover:n,mouseout:i}),e.bindPopup(t.properties.popupContent)}}).addTo(o)},_clear:function(){this._currentTransport=null,this._currentExclusions=[],this._currentComputation=null,this._clearRouteResultsDetails(),this._clearRouteResultsGeometry(),this._clearRouteResultsFeatureGeometry();for(var t=0;t<this._currentPoints.length;t++)this._currentPoints[t].clear()},_clearRouteResultsDetails:function(){if(this._currentRouteInformations=null,this._resultsRouteDetailsContainer){var t=this._resultsRouteDetailsContainer;if(t.childElementCount)for(;t.firstChild;)t.removeChild(t.firstChild)}if(this._resultsRouteValuesContainer){var e=this._resultsRouteValuesContainer;if(e.childElementCount)for(;e.firstChild;)e.removeChild(e.firstChild)}},_clearRouteResultsGeometry:function(){var t=this._map;null!=this._geojsonRoute&&(t.removeLayer(this._geojsonRoute),this._geojsonRoute=null)},_clearRouteResultsFeatureGeometry:function(){var t=this._map;null!=this._geojsonSections&&(t.removeLayer(this._geojsonSections),this._geojsonSections=null)},_displayWaitingContainer:function(){this._waitingContainer.className="GProuteCalcWaitingContainerVisible",this._waiting=!0,this._timer&&(clearTimeout(this._timer),this._timer=null);var t=this;this._timer=setTimeout(function(){t._waiting===!0?t._hideWaitingContainer():t._timer&&clearTimeout(t._timer)},16e3)},_hideWaitingContainer:function(){this._waiting&&(this._waitingContainer.className="GProuteCalcWaitingContainerHidden",this._waiting=!1,clearTimeout(this._timer),this._timer=null)},_simplifiedInstructions:function(t){var e=[],i=t[0];1===t.length&&e.push(i);for(var n=1;n<t.length;n++){var o=t[n];if(o.instruction===i.instruction){i.distance=(parseFloat(o.distance)+parseFloat(i.distance)).toString(),i.duration=(parseFloat(o.duration)+parseFloat(i.duration)).toString();for(var s=1;s<o.geometry.coordinates.length;s++)i.geometry.coordinates.push(o.geometry.coordinates[s]);n===t.length-1&&(e.push(i),i=null)}else e.push(i),i=o,n===t.length-1&&(e.push(o),i=null)}return e},_convertSecondsToTime:function(t){var e="";t=Math.round(t);var i=Math.floor(t/3600);i||(i="00");var n=t%3600,o=Math.floor(n/60);o||(o="00");var s=n%60,r=Math.ceil(s);return r||(r="00"),e=i+"h "+o+"m "+r+"s"},_convertDistance:function(t){var e="",i=parseInt(t/1e3,10);return e=i?i+" km":parseInt(t,10)+" m"}});return a}(leaflet,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,LeafletControlsLocationSelector,CommonControlsRouteDOM),CommonControlsSearchEngineDOM=function(t){var e={_addUID:function(t){return t+"-"+this._uid},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPsearchEngine"),t.className="GPwidget",t},_createShowSearchEngineElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowSearchEngine"),t.type="checkbox",t},_createShowSearchEnginePictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowSearchEnginePicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowSearchEngine"),e.title="Afficher/masquer la recherche par lieux",e.addEventListener("click",function(){document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none";var e=document.getElementById(t._addUID("GPshowAdvancedSearch"));e&&(e.style.display=null,document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="none");var i="#GPsearchInput-"+t._uid;document.querySelector(i+" input").disabled=!1,t.onShowSearchEngineClick()});var i=document.createElement("span");return i.id=this._addUID("GPshowSearchEngineOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createSearchInputElement:function(){var t=this,e=document.createElement("form");e.id=this._addUID("GPsearchInput"),e.addEventListener("submit",function(e){return e.preventDefault(),document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="block",document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",t.onGeocodingSearchSubmit(e),!1});var i=document.createElement("input");i.id=this._addUID("GPsearchInputText"),i.type="text",i.placeholder="Rechercher un lieu, une adresse",i.autocomplete="off",i.addEventListener("keyup",function(e){var n=e.which||e.keyCode;13!==n&&10!==n&&38!==n&&40!==n&&(document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",i.value.length>2?document.getElementById(t._addUID("GPautoCompleteList")).style.display="block":document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",t.onAutoCompleteSearchText(e))}),i.addEventListener("keydown",function(t){return}),e.appendChild(i);var n=document.createElement("div");return n.id=this._addUID("GPsearchInputReset"),n.addEventListener("click",function(){document.getElementById(t._addUID("GPsearchInputText")).value="",document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",t.onSearchResetClick()}),e.appendChild(n),e},_createShowAdvancedSearchElement:function(){var t=this,e=document.createElement("div");e.id=this._addUID("GPshowAdvancedSearch"),e.className="GPshowAdvancedToolPicto",e.title="Ouvrir la recherche avancée",e.addEventListener("click",function(){var e="#GPsearchInput-"+t._uid;document.querySelector(e+" input").disabled=!0,document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",document.getElementById(t._addUID("GPshowAdvancedSearch")).style.display="none",document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="inline-block"});var i=document.createElement("span");return i.id=this._addUID("GPshowAdvancedSearchOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createAdvancedSearchPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPadvancedSearchPanel"),t.className="GPpanel",t.style.display="none",t},_createGeocodeResultsElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPgeocodeResultsList"),t.className="GPpanel",t.style.display="none",t.appendChild(this._createGeocodeResultsHeaderElement()),t},_createAutoCompleteElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPautoCompleteList"),t.className="GPautoCompleteList",t.style.display="none",t},_createAutoCompleteListElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPautocompleteResults"),e.addEventListener?e.addEventListener("click",function(e){t.onAutoCompletedResultsItemClick(e),document.getElementById(t._addUID("GPautoCompleteList")).style.display="none"},!1):e.attachEvent&&e.attachEvent("onclick",function(e){t.onAutoCompletedResultsItemClick(e),document.getElementById(t._addUID("GPautoCompleteList")).style.display="none"}),e},_createAutoCompletedLocationElement:function(t,e){var i=document.getElementById(this._addUID("GPautocompleteResults")),n=document.createElement("div");n.id=this._addUID("AutoCompletedLocation_"+e),n.className="GPautoCompleteProposal",n.innerHTML=t.fullText,n.addEventListener?n.addEventListener("click",function(t){i.click(t)},!1):n.attachEvent&&n.attachEvent("onclick",function(t){i.click(t)}),i.appendChild(n)},_createAdvancedSearchPanelHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Recherche avancée",e.appendChild(i);var n=document.createElement("div");return n.id=this._addUID("GPadvancedSearchClose"),n.className="GPpanelClose",n.title="Fermer la recherche avancée",n.addEventListener?n.addEventListener("click",function(){var e="#GPsearchInput-"+t._uid;document.querySelector(e+" input").disabled=!1,document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",document.getElementById(t._addUID("GPshowAdvancedSearch")).style.display="inline-block",document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="none"},!1):n.attachEvent&&n.attachEvent("onclick",function(){var e="#GPsearchInput-"+t._uid;document.querySelector(e+" input").disabled=!1,document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",document.getElementById(t._addUID("GPshowAdvancedSearch")).style.display="inline-block",document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="none"}),e.appendChild(n),e},_createAdvancedSearchPanelFormElement:function(t){var e=this,i=document.createElement("form");i.id=this._addUID("GPadvancedSearchForm"),i.addEventListener("submit",function(t){t.preventDefault();for(var i=[],n="#GPadvancedSearchFilters-"+e._uid,o=document.querySelectorAll(n+" > div > div > input"),s=0;s<o.length;s++){var r=o[s];i.push({key:r.name,value:r.value})}return e.onGeocodingAdvancedSearchSubmit(t,i),document.getElementById(e._addUID("GPgeocodeResultsList")).style.display="block",!1});var n=document.createElement("div");n.className="GPflexInput";var o=document.createElement("label");o.className="GPadvancedSearchCodeLabel",o.innerHTML="Recherche par",n.appendChild(o);var s=this._createAdvancedSearchFormCodeElement(t);return n.appendChild(s),i.appendChild(n),i},_createAdvancedSearchFormCodeElement:function(t){var e=this,i=document.createElement("select");i.id=this._addUID("GPadvancedSearchCode"),i.className="GPadvancedSearchCode",i.addEventListener("change",function(t){e.onGeocodingAdvancedSearchCodeChange(t)},!1),t||(t=[{id:"PositionOfInterest",title:"Lieux/toponymes"},{id:"StreetAddress",title:"Adresses"},{id:"CadastralParcel",title:"Parcelles cadastrales"},{id:"Administratif",title:"Administratif"}]);for(var n=0;n<t.length;n++){var o=document.createElement("option");o.value=t[n].id,o.text=t[n].title,i.appendChild(o)}return i},_createAdvancedSearchFormInputElement:function(){var t=document.createElement("input");return t.type="submit",t.id=this._addUID("GPadvancedSearchSubmit"),t.className="GPinputSubmit",t.value="Chercher",t},_createAdvancedSearchFormFiltersElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPadvancedSearchFilters"),t},_createAdvancedSearchFiltersTableElement:function(t,e){var i=document.createElement("div");return i.id=this._addUID(t),e||(i.style.display="none"),i},_createAdvancedSearchFiltersAttributElement:function(t){var e=null,i=t.name,n=t.title,o=t.description,s=t.code,r=t.value,a=document.createElement("div");a.className="GPflexInput";var l=document.createElement("label");l.className="GPadvancedSearchFilterLabel",l.htmlFor=i,l.title=o||n,l.innerHTML=n,a.appendChild(l);var c=document.createElement("input");return c.id=i,c.className="GPadvancedSearchFilterInput",c.type="text",c.name=i,r&&(c.value=r),a.appendChild(c),e=document.getElementById(this._addUID(s)),e?e.appendChild(a):e=a,e},_createGeocodeResultsHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Résultats de la recherche",e.appendChild(i);var n=document.createElement("div");return n.id=this._addUID("GPgeocodeResultsClose"),n.className="GPpanelClose",n.title="Fermer la fenêtre de résultats",n.addEventListener?n.addEventListener("click",function(){document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none"},!1):n.attachEvent&&n.attachEvent("onclick",function(){document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none"}),e.appendChild(n),e},_createGeocodeResultsListElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPgeocodeResults"),e.addEventListener?e.addEventListener("click",function(e){e.ctrlKey||(document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none"),t.onGeocodedResultsItemClick(e)},!1):e.attachEvent&&e.attachEvent("onclick",function(e){e.ctrlKey||(document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none"),t.onGeocodedResultsItemClick(e)}),e},_createGeocodedLocationElement:function(t,e){var i=document.getElementById(this._addUID("GPgeocodeResults")),n=document.createElement("div");if(n.id=this._addUID("GeocodedLocation_"+e),n.className="GPautoCompleteProposal","string"==typeof t)n.innerHTML=t;else{var o=t.placeAttributes;o.freeform?n.innerHTML=o.freeform:o.postalCode?n.innerHTML=o.postalCode+" "+o.commune:o.cadastralParcel?n.innerHTML=o.cadastralParcel:n.innerHTML="..."}i.appendChild(n)}};return e}(CommonUtilsSelectorID),CommonControlsSearchEngineUtils=function(){var t={advancedSearchFiltersByDefault:{PositionOfInterest:[{name:"importance",title:"Importance"},{name:"nature",title:"Nature"},{name:"territory",title:"Territoire"},{name:"insee",title:"Code INSEE"},{name:"municipality",title:"Ville"},{name:"department",title:"Département"}],StreetAddress:[{name:"territory",title:"Territoire"},{name:"insee",title:"Code INSEE"},{name:"municipality",title:"Ville"},{name:"department",title:"Département"}],CadastralParcel:[{name:"department",title:"Département",description:"Numéro du département (ex: 01, 94)"},{name:"commune",title:"Code commune (INSEE)",description:"Code commune (INSEE) : 3 chiffres (ex: 067)"},{name:"absorbedCity",title:"Commune absorbée",description:"Commune absorbée : 3 chiffres (ex: 000, 001)"},{name:"section",title:"Section",description:"Section : 2 caractères (ex: AA, 0D)"},{name:"number",title:"Numéro",description:"Numéro de la parcelle : 4 chiffres (ex: 0041, 0250)"}],Administratif:[{name:"prefecture",title:"Préfecture"},{name:"inseeRegion",title:"Code région (INSEE)"},{name:"inseeDepartment",title:"Code département (INSEE)"},{name:"municipality",title:"Ville"}]},zoomToResultsByDefault:function(t){var e=15,i=t.service,n=t.fields,o=t.type,s={1:11,2:12,3:13,4:14,5:15,6:16,7:17,8:17};return"SuggestedLocation"===i&&"PositionOfInterest"===o&&(e=s[n.classification]),"DirectGeocodedLocation"===i&&"PositionOfInterest"===o&&(e=s[n.importance]||14),"StreetAddress"===o&&(e=17),"CadastralParcel"===o&&(e=17),"Administratif"===o&&(e=12),e}};return t}(),LeafletControlsSearchEngine=function(t,e,i,n,o,s,r){var a=t.Control.extend({includes:s,options:{position:"topleft",collapsed:!0,displayInfo:!0,zoomTo:"",resources:[],displayAdvancedSearch:!0,advancedSearch:{},geocodeOptions:{},autocompleteOptions:{}},initialize:function(e){t.Util.setOptions(this,e),this._uid=o.generate(),this._inputContainer=null,this._suggestedContainer=null,this._suggestedLocations=[],this._geocodedContainer=null,this._geocodedLocations=[],this._filterContainer=null,this._currentGeocodingCode=null,this._currentGeocodingLocation=null,this._advancedSearchFilters={},this._advancedSearchCodes=[],this._marker=null,this._servicesRightManagement={},this._noRightManagement=!1,this._checkRightsManagement()},onAdd:function(){this._initAdvancedSearchCodes(),this._initAdvancedSearchFilters();var e=this._initLayout();return t.DomEvent.disableClickPropagation(e).disableScrollPropagation(e),e},onRemove:function(){},_checkRightsManagement:function(){this.options.resources&&0!==this.options.resources.length||(this.options.resources=["StreetAddress","PositionOfInterest"]);var t=null,e=[],i=null;i=this.options.geocodeOptions.apiKey,t=this.options.geocodeOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=this.options.resources||["StreetAddress","PositionOfInterest"]);var o=n.check({key:i||this.options.apiKey,resources:e,services:["Geocode"]});i=this.options.autocompleteOptions.apiKey,t=this.options.autocompleteOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=this.options.resources||["StreetAddress","PositionOfInterest"]);var s=n.check({key:i||this.options.apiKey,resources:e,services:["AutoCompletion"]});if(o||s||(this._noRightManagement=!0),s&&(this._servicesRightManagement.AutoCompletion={},this._servicesRightManagement.AutoCompletion.resources=s.AutoCompletion,this._servicesRightManagement.AutoCompletion.key=s.key),o&&(this._servicesRightManagement.Geocode={},this._servicesRightManagement.Geocode.resources=o.Geocode,this._servicesRightManagement.Geocode.key=o.key),!this.options.advancedSearch||0===Object.keys(this.options.advancedSearch).length)for(var r=this._servicesRightManagement.Geocode.resources,a=0;a<r.length;a++){var l=r[a];this.options.advancedSearch[l]=[]}},_initLayout:function(){var t=this._createMainContainerElement(),e=this._createShowSearchEngineElement();t.appendChild(e),this.options.collapsed||(e.checked="true");var i=this._createShowSearchEnginePictoElement();t.appendChild(i);var n=this._createSearchInputElement();if(t.appendChild(n),this.options.displayAdvancedSearch){var o=this._createShowAdvancedSearchElement();t.appendChild(o);var s=this._createAdvancedSearchPanelElement(),r=this._createAdvancedSearchPanelHeaderElement(),a=this._createAdvancedSearchPanelFormElement(this._advancedSearchCodes),l=this._filterContainer=this._createAdvancedSearchFormFiltersElement();this._setFilter(this._advancedSearchCodes[0].id);var c=this._createAdvancedSearchFormInputElement();a.appendChild(l),a.appendChild(c),s.appendChild(r),s.appendChild(a),t.appendChild(s)}var h=this._createAutoCompleteElement(),u=this._suggestedContainer=this._createAutoCompleteListElement();h.appendChild(u),t.appendChild(h);var d=this._createGeocodeResultsElement(),p=this._geocodedContainer=this._createGeocodeResultsListElement();return d.appendChild(p),t.appendChild(d),t},_initAdvancedSearchCodes:function(){for(var t=[{id:"PositionOfInterest",title:"Lieux/toponymes"},{id:"StreetAddress",title:"Adresses"},{id:"CadastralParcel",title:"Parcelles cadastrales"},{id:"Administratif",title:"Administratif"}],e=Object.keys(this.options.advancedSearch),i=0;i<e.length;i++)for(var n=e[i],o=0;o<t.length;o++)t[o].id===n&&this._advancedSearchCodes.push(t[o]);0===this._advancedSearchCodes.length&&(this._advancedSearchCodes=t)},_initAdvancedSearchFilters:function(){var e={PositionOfInterest:[{name:"city",title:"Ville",filter:!1,sep:!0},{name:"importance",title:"Importance",filter:!0},{name:"nature",title:"Nature",filter:!0},{name:"territory",title:"Territoire",filter:!0},{name:"insee",title:"Code commune (INSEE)",filter:!0},{name:"department",title:"Département",filter:!0}],StreetAddress:[{name:"number",title:"Numéro",filter:!1,sep:!0},{name:"street",title:"Rue",filter:!1,sep:!0},{name:"postalCode",
-title:"Code Postal",filter:!1,sep:!0},{name:"city",title:"Ville",filter:!1,sep:!0},{name:"territory",title:"Territoire",filter:!0},{name:"insee",title:"Code commune (INSEE)",filter:!0},{name:"department",title:"Département",filter:!0}],CadastralParcel:[{name:"department",title:"Département",filter:!1,sep:!1,value:"__"},{name:"commune",title:"Commune",filter:!1,sep:!1,value:"___"},{name:"absorbedCity",title:"Commune absorbée",filter:!1,sep:!1,value:"___"},{name:"section",title:"Section",filter:!1,sep:!1,value:"__"},{name:"number",title:"Numéro",filter:!1,sep:!1,value:"____"}],Administratif:[{name:"prefecture",title:"Préfecture",filter:!0},{name:"inseeRegion",title:"Code région (INSEE)",filter:!0},{name:"inseeDepartment",title:"Code département (INSEE)",filter:!0},{name:"city",title:"Ville",filter:!1,sep:!0}]},i=this.options.advancedSearch;for(var n in i)if(i.hasOwnProperty(n)){if(!i[n]||0===i[n].length){i[n]=e[n];continue}for(var o=i[n],s=0;s<o.length;s++){var r=o[s];r.hasOwnProperty("filter")||(r.filter="municipality"!==r.name)}}t.Util.extend(this._advancedSearchFilters,e,i)},_setFilter:function(t){for(var e=this._filterContainer,i=!1,n=0;n<this._advancedSearchCodes.length;n++)if(this._advancedSearchCodes[n].id===t){i=!0;break}if(i){for(this._currentGeocodingCode=t;e.firstChild;)e.removeChild(e.firstChild);var o=this._advancedSearchFilters[t];if(o&&0!==o.length){for(var s=this._createAdvancedSearchFiltersTableElement(t,!0),r=0;r<o.length;r++){var a=this._createAdvancedSearchFiltersAttributElement(o[r]);s.appendChild(a)}return e.appendChild(s),e}}else for(;e.firstChild;)e.removeChild(e.firstChild)},_requestAutoComplete:function(e){if(e&&0!==Object.keys(e).length&&e.text){if(this._noRightManagement)return void console.log("no rights for all service !?");if(!this._servicesRightManagement.AutoCompletion)return void console.log("no rights for this service !?");var n={};t.Util.extend(n,this.options.autocompleteOptions),t.Util.extend(n,e);var o=this._servicesRightManagement.AutoCompletion.resources;if(o&&0!==Object.keys(o).length){o&&t.Util.isArray(o)&&!n.filterOptions&&(n.filterOptions||(n.filterOptions={}),n.filterOptions.type=o);var s=this._servicesRightManagement.AutoCompletion.key;t.Util.extend(n,{apiKey:n.apiKey||this.options.apiKey||s}),i.Services.autoComplete(n)}}},_fillAutoCompletedLocationListContainer:function(t){if(t&&0!==t.length){var e=this._suggestedContainer;if(e.childElementCount)for(;e.firstChild;)e.removeChild(e.firstChild);for(var i=0;i<t.length;i++)this._createAutoCompletedLocationElement(t[i],i);this._suggestedLocations=t}},_requestGeocoding:function(e){if(e&&0!==Object.keys(e).length&&e.location){if(this._noRightManagement)return void console.log("no rights for all service !?");if(!this._servicesRightManagement.Geocode)return void console.log("no rights for this service !?");var n={};t.Util.extend(n,this.options.geocodeOptions),t.Util.extend(n,e),n.hasOwnProperty("returnFreeForm")||t.Util.extend(n,{returnFreeForm:!1});var o=this._servicesRightManagement.Geocode.resources;if(o&&0!==Object.keys(o).length){o&&t.Util.isArray(o)&&!n.filterOptions&&(n.filterOptions||(n.filterOptions={}),n.filterOptions.type=o);var s=this._servicesRightManagement.Geocode.key;t.Util.extend(n,{apiKey:n.apiKey||this.options.apiKey||s}),i.Services.geocode(n)}}},_fillGeocodedLocationListContainer:function(t){if(!t||0===t.length)return void this._clearGeocodedLocation();var e=this._geocodedContainer;if(e.childElementCount)for(;e.firstChild;)e.removeChild(e.firstChild);for(var i=0;i<t.length;i++)this._createGeocodedLocationElement(t[i],i);this._geocodedLocations=t},_setLabel:function(e){var i=t.DomUtil.get("GPsearchInputText-"+this._uid);i.value=e||""},_setPosition:function(e,i){var n=this._map;n.setZoomAround(t.latLng(e.x,e.y),i,!0),n.panTo(t.latLng(e.x,e.y))},_getZoom:function(t){var e=this._map,i=this.options.zoomTo,n=null;if("function"==typeof i&&(n=i.call(this,t)),"number"==typeof i&&(n=i),"string"==typeof i)if("auto"===i)n=r.zoomToResultsByDefault(t);else{var o=parseInt(i,10);isNaN(o)||(n=o)}Number.isInteger=Number.isInteger||function(t){return"number"==typeof t&&isFinite(t)&&Math.floor(t)===t},n&&""!==n&&Number.isInteger(n)||(n=e.getZoom());var s=e.getMinZoom(),a=e.getMaxZoom();return n<s&&(n=s),n>a&&(n=a),n},_setMarker:function(e,i,n){var o=this._map;if(null!=this._marker&&(o.removeLayer(this._marker),this._marker=null),e){var s={clickable:!0,zIndexOffset:1e3};if(this._marker=t.marker(t.latLng(e.x,e.y),s),this._marker.addTo(o),n){var r=null;if("string"!=typeof i){var a=[];if("DirectGeocodedLocation"===i.service)if(i.fields.freeform)r=i.fields.freeform;else{for(var l=this._advancedSearchFilters[i.type],c=0;c<l.length;c++){var h=l[c].name,u=i.fields[h];"string"!=typeof u&&"number"!=typeof u||a.push(u)}r=a.join(" - ")}else"SuggestedLocation"===i.service?i.fields.fullText?r=i.fields.fullText:(a.push(i.fields.street||""),a.push(i.fields.postalCode||""),a.push(i.fields.commune||""),"PositionOfInterest"===i.type&&(a.push(i.fields.poi||""),a.push(i.fields.kind||"")),r=a.join(" - ")):r="sans informations."}else r=i;this._marker.bindPopup(r)}}},_clearResults:function(){this._currentGeocodingLocation=null,this._clearSuggestedLocation(),this._clearGeocodedLocation(),this._setMarker()},_clearSuggestedLocation:function(){if(this._suggestedLocations=[],this._suggestedContainer)for(;this._suggestedContainer.firstChild;)this._suggestedContainer.removeChild(this._suggestedContainer.firstChild)},_clearGeocodedLocation:function(){if(this._geocodedLocations=[],this._geocodedContainer)for(;this._geocodedContainer.firstChild;)this._geocodedContainer.removeChild(this._geocodedContainer.firstChild)},onShowSearchEngineClick:function(){},onSearchResetClick:function(){this._clearResults()},onAutoCompleteSearchText:function(t){var e=t.target.value;if(e&&!(this._noRightManagement||(this._currentGeocodingLocation=e,e.length<3))){var i=this;this._requestAutoComplete({text:e,onSuccess:function(t){if(t){var e=t.suggestedLocations;i._fillAutoCompletedLocationListContainer(e)}},onFailure:function(t){i._clearSuggestedLocation()}})}},onAutoCompletedResultsItemClick:function(t){var e=o.index(t.target.id),i=t.target.innerHTML;if(e){var n={x:this._suggestedLocations[e].position.y,y:this._suggestedLocations[e].position.x},s={service:"SuggestedLocation",type:this._suggestedLocations[e].type,fields:this._suggestedLocations[e]},r=this._getZoom(s);this._setLabel(i),this._setPosition(n,r),this._setMarker(n,s,this.options.displayInfo)}},onGeocodingSearchSubmit:function(t){var e=t.target[0].value;if(e&&!this._noRightManagement){this._currentGeocodingLocation=e;var i=this;this._requestGeocoding({location:e,onSuccess:function(t){if(t){var e=t.locations;i._fillGeocodedLocationListContainer(e)}},onFailure:function(t){i._clearGeocodedLocation()}})}},onGeocodedResultsItemClick:function(t){var e=o.index(t.target.id),i=t.target.innerHTML;if(e){var n=this._geocodedLocations[e].position,s={service:"DirectGeocodedLocation",type:this._geocodedLocations[e].type,fields:this._geocodedLocations[e].placeAttributes},r=this._getZoom(s);this._setLabel(i),this._setPosition(n,r),this._setMarker(n,s,this.options.displayInfo)}},onGeocodingAdvancedSearchCodeChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;i&&this._setFilter(i)},onGeocodingAdvancedSearchSubmit:function(t,e){if(e&&0!==e.length){var i={};i.type=[this._currentGeocodingCode];var n=this._currentGeocodingLocation||"";"CadastralParcel"===this._currentGeocodingCode&&(n="");for(var o=0;o<e.length;o++){var s=e[o];if(s.value)for(var r=this._advancedSearchFilters[this._currentGeocodingCode],a=0;a<r.length;a++){var l=r[a];if(l.name===s.key)if(l.filter)i[s.key]=s.value;else if(l.value){var c=s.value.length,h=l.value.length;if(h!==c){for(var u=h-c,d=l.value.charAt(0);d.length<u;)d+=d;var p=d.slice(0,u);s.value=s.value+p}n+=s.value}else"string"==typeof n&&(n={}),n[s.key]=s.value}}var m=this;this._requestGeocoding({location:n,filterOptions:i,onSuccess:function(t){if(t){var e=t.locations;m._fillGeocodedLocationListContainer(e)}},onFailure:function(t){m._clearGeocodedLocation()}})}}});return a}(leaflet,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,CommonControlsSearchEngineDOM,CommonControlsSearchEngineUtils),CommonControlsElevationPathDOM=function(){var t={_addUID:function(t){return t+"-"+this._uid},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPelevationPath"),t.className="GPwidget",t},_createShowElevationPathElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowElevationPath"),t.type="checkbox",t},_createShowElevationPathPictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowElevationPathPicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowElevationPath"),e.title="Calculer un profil",e.addEventListener?e.addEventListener("click",function(e){t.onShowElevationPathClick(e)}):e.attachEvent&&e.attachEvent("onclick",function(e){t.onShowElevationPathClick(e)});var i=document.createElement("span");return i.id=this._addUID("GPshowElevationPathOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createElevationPathPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPelevationPathPanel"),t.className="GPpanel",t},_createElevationPathPanelHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Profil Altimétrique",e.appendChild(i);var n=document.createElement("div");n.id=this._addUID("GPelevationPathPanelReduce"),n.className="GPpanelReduce",n.title="Masquer le panneau",n.addEventListener?n.addEventListener("click",function(){"function"==typeof t.onReduceElevationPathPanelClick&&(document.getElementById(t._addUID("GPshowElevationPath")).checked=!1,t.onReduceElevationPathPanelClick())},!1):n.attachEvent&&n.attachEvent("onclick",function(){"function"==typeof t.onReduceElevationPathPanelClick&&(document.getElementById(t._addUID("GPshowElevationPath")).checked=!1,t.onReduceElevationPathPanelClick())}),e.appendChild(n);var o=document.createElement("div");return o.id=this._addUID("GPelevationPathPanelClose"),o.className="GPpanelClose",o.title="Fermer le panneau",o.addEventListener?o.addEventListener("click",function(){document.getElementById(t._addUID("GPshowElevationPathPicto")).click()},!1):o.attachEvent&&o.attachEvent("onclick",function(){document.getElementById(t._addUID("GPshowElevationPathPicto")).click()}),e.appendChild(o),e},_createElevationPathPanelProfilElement:function(){var t=document.createElement("div");return t.id="GPelevationPathProfil",t},_createElevationPathWaitingElement:function(){var t=document.createElement("div");t.id=this._addUID("GPelevationPathCalcWaitingContainer"),t.className="GPelevationPathCalcWaitingContainerHidden";var e=document.createElement("p");return e.className="GPelevationPathCalcWaiting",e.innerHTML="Calcul en cours...",t.appendChild(e),t}};return t}(),LeafletControlsElevationPath=function(t,e,i,n,o,s,r,a,l,c){var h=t.Control.extend({includes:c,options:{position:"topleft",active:!1,elevationPathOptions:{},stylesOptions:{},displayProfileOptions:{apply:null,target:null}},initialize:function(e){t.Util.setOptions(this,e),this._uid=s.generate(),this._initDisplayProfileOptions(),this._showContainer=null,this._pictoContainer=null,this._panelContainer=null,this._profilContainer=null,this._waitingContainer=null,this._reducePanel=!1,this._featuresLayer=null,this._lastIdLayer=0,this._currentIdLayer=0,this._currentFeature=null,this._profile=null,this._marker=null,this._geometry=null,this._noRightManagement=!1,this._checkRightsManagement()},onAdd:function(e){var i=this._container=this._initLayout();return e&&this.options.active&&(null===this._profile&&(this._panelContainer.style.display="none"),this._activateMapInteraction(e)),t.DomEvent.disableClickPropagation(i).disableScrollPropagation(i),i},onRemove:function(){},_checkRightsManagement:function(){var t=o.check({key:this.options.apiKey,resources:["SERVICE_CALCUL_ALTIMETRIQUE_RSC"],services:["ElevationLine"]});t||(this._noRightManagement=!0),this.options.apiKey||(this.options.apiKey=t.key)},_initDisplayProfileOptions:function(){var t=this.options.displayProfileOptions||{};"undefined"==typeof t||0===Object.keys(t).length?this.options.displayProfileOptions={apply:h.DISPLAY_PROFILE_BY_DEFAULT,target:null}:this.options.displayProfileOptions={};var e=t.apply||this.options.displayProfileOptions.apply;this.options.displayProfileOptions.apply="function"==typeof e?e:h.DISPLAY_PROFILE_BY_DEFAULT;var i=t.target||this.options.displayProfileOptions.target;this.options.displayProfileOptions.target="undefined"==typeof i?null:i},_initLayout:function(){var t=this._createMainContainerElement(),e=this._showContainer=this._createShowElevationPathElement();t.appendChild(e),this.options.active&&(this._showContainer.checked=!0);var i=this._pictoContainer=this._createShowElevationPathPictoElement();t.appendChild(i);var n=this._panelContainer=this._createElevationPathPanelElement(),o=this._createElevationPathPanelHeaderElement();n.appendChild(o);var s=this._profilContainer=this._createElevationPathPanelProfilElement();n.appendChild(s);var r=this._waitingContainer=this._createElevationPathWaitingElement();return n.appendChild(r),t.appendChild(n),t},onShowElevationPathClick:function(t){var e=this._map;this._reducePanel?null!==this._profile&&(null===this.options.displayProfileOptions.target&&(this._pictoContainer.style.display="none"),this._panelContainer.style.display="block"):this._showContainer.checked?(this._pictoContainer.style.display="block",this._panelContainer.style.display="none",this._removeMapInteraction(e),this._clear()):(null===this._profile&&(this._panelContainer.style.display="none"),this._activateMapInteraction(e)),this._reducePanel=!1},onReduceElevationPathPanelClick:function(){this._reducePanel=!0,this._pictoContainer.style.display="block",this._panelContainer.style.display="none"},_activateMapInteraction:function(e){if(null===this._featuresLayer){this._featuresLayer=new t.FeatureGroup,e.addLayer(this._featuresLayer);var i=this;e.on("draw:created",function(e){i._currentIdLayer=t.Util.stamp(e.layer),i._getFeatureGeometry(e.layer),i._addFeatureLayer(e.layer)}),e.on("draw:drawstart",function(){i._removeFeatureLayer(i._lastIdLayer),i._lastIdLayer=i._currentIdLayer}),e.on("draw:drawstop",function(){"undefined"==typeof i.options.elevationPathOptions.onSuccess&&null===i.options.displayProfileOptions.target&&(i._pictoContainer.style.display="none",i._panelContainer.style.display="block"),i._altiRequest()})}this._activatePolyLineInteraction(e)},_removeMapInteraction:function(t){t&&(null!==this._featuresLayer&&(t.off("draw:created"),t.off("draw:drawstart"),t.off("draw:drawstop"),t.removeLayer(this._featuresLayer),this._featuresLayer=null),this._lastIdLayer=this._currentIdLayer=0,this._currentFeature&&this._currentFeature.disable())},_activatePolyLineInteraction:function(e){this._currentFeature&&this._currentFeature.disable();var i=this.options.stylesOptions||{},n=0!==Object.keys(i).length?i:{stroke:!0,color:"#C77A04",weight:4,opacity:.5,fill:!1};this._currentFeature=new t.Draw.Polyline(e,{shapeOptions:n}),this._currentFeature.enable()},_getFeatureGeometry:function(t){null!==this._geometry&&(this._geometry=null),this._geometry=[];for(var e=t.getLatLngs(),i=0;i<e.length;i++){var n=e[i];this._geometry.push({lon:n.lng,lat:n.lat})}},_addFeatureLayer:function(t){this._featuresLayer&&this._featuresLayer.addLayer(t)},_removeFeatureLayer:function(t){this._featuresLayer&&0!==t&&(t?this._featuresLayer.removeLayer(t):this._featuresLayer.clearLayers())},_altiRequest:function(){if(this._geometry&&!this._noRightManagement){var e={};t.Util.extend(e,this.options.elevationPathOptions),t.Util.extend(e,{apiKey:e.apiKey||this.options.apiKey});var i=this;t.Util.extend(e,{sampling:e.sampling||200,onSuccess:this.options.elevationPathOptions.onSuccess||function(t){t&&(null!==i.options.displayProfileOptions.target&&(i._pictoContainer.style.display="block",i._panelContainer.style.display="block"),i._displayProfil(t.elevations),i._waitingContainer.className="GPelevationPathCalcWaitingContainerHidden",i._waiting=!1)},onFailure:this.options.elevationPathOptions.onFailure||function(t){i._pictoContainer.style.display="block",i._panelContainer.style.display="none",i._waitingContainer.className="GPelevationPathCalcWaitingContainerHidden",i._waiting=!1,i._clear()}});var o=this._geometry;t.Util.extend(e,{positions:o}),this._waitingContainer.className="GPelevationPathCalcWaitingContainerVisible",n.Services.getAltitude(e)}},_computeElevationMeasure:function(t){var e=function(t,e){var i=a.decimalToRadian(t[1]),n=a.decimalToRadian(e[1]),o=(n-i)/2,s=a.decimalToRadian(e[0]-t[0])/2,r=Math.sin(o)*Math.sin(o)+Math.sin(s)*Math.sin(s)*Math.cos(i)*Math.cos(n);return 12756274*Math.atan2(Math.sqrt(r),Math.sqrt(1-r))};t[0].dist=0;for(var i=0,n=1;n<t.length;n++)i+=e([t[n].lon,t[n].lat],[t[n-1].lon,t[n-1].lat])/1e3,t[n].dist=i,t[n].lat=Math.round(1e4*t[n].lat)/1e4,t[n].lon=Math.round(1e4*t[n].lon)/1e4;var o=100;i>100?o=1:i>10&&(o=10);for(var s=0;s<t.length;s++){var r=t[s];r.z<0&&(r.z=0),r.dist=Math.round(r.dist*o)/o}return t},_displayProfil:function(t){var e=this._computeElevationMeasure(t),i=this.options.displayProfileOptions.target;i&&i.appendChild(this._panelContainer),i=this._profilContainer;var n=this,o=this.options.displayProfileOptions.apply;"undefined"!=typeof AmCharts&&"undefined"!=typeof d3,o.call(this,e,i,n)},_activateProfilEvent:function(e){if(null!==this._profile){var i=this._map,n=this;n._marker&&(i.removeLayer(n._marker),n._marker=null),n._marker=t.marker(t.latLng(e.lat,e.lon),{icon:new l("orange"),draggable:!1,clickable:!1,zIndexOffset:1e3}),n._marker.addTo(i);var o=function(e){var i=e.chart.dataProvider[e.index];n._marker.setLatLng(t.latLng(i.lat,i.lon)),n._marker.update()};n._profile.removeListener("changed",o),n._profile.addListener("changed",o)}},_clear:function(){if(this._geometry=null,this._profile=null,this._profilContainer)for(;this._profilContainer.firstChild;)this._profilContainer.removeChild(this._profilContainer.firstChild);var t=this._map;this._marker&&(t.removeLayer(this._marker),this._marker=null)}});return h.DISPLAY_PROFILE_BY_DEFAULT=function(e,i,n){if(i)for(;i.firstChild;)i.removeChild(i.firstChild);if(e){var o=JSON.parse(JSON.stringify(e));o.sort(function(t,e){return t.z-e.z});var s=o[0].z,r=o[o.length-1].z,a=r-s,c=e[e.length-1].dist,h=100/e.length,u=this,d=n._map,p=document.createElement("div");p.id="profileElevationByDefault",p.addEventListener("mouseover",function(e){var i=parseFloat(e.target.dataset.lon),n=parseFloat(e.target.dataset.lat);i&&n&&(u._marker=t.marker(t.latLng(n,i),{icon:new l("orange"),draggable:!1,clickable:!1,zIndexOffset:1e3}),u._marker.addTo(d))}),p.addEventListener("mousemove",function(){}),p.addEventListener("mouseout",function(){u._marker&&(d.removeLayer(u._marker),u._marker=null)}),i.appendChild(p);var m=document.createElement("div");m.className="z-title-vertical",m.innerHTML=s+" / "+r+" m",p.appendChild(m);var f=document.createElement("ul");f.id="data-default",f.className="z-axis x-axis",p.appendChild(f);for(var _=0;_<e.length;_++){var g=e[_],v=document.createElement("li");v.setAttribute("data-z",g.z),v.setAttribute("data-lon",g.lon),v.setAttribute("data-lat",g.lat),v.setAttribute("data-dist",g.dist);var y=Math.floor(100*(g.z-s)/a);v.setAttribute("class","percent v"+y),v.title="altitude : "+g.z+"m",v.setAttribute("style","width: "+h+"%"),f.appendChild(v)}var E=document.createElement("div");E.className="x-title-horizontal",E.innerHTML=c+" km",p.appendChild(E),n._profile=i}},h.DISPLAY_PROFILE_RAW=function(t,e,i){if(e)for(;e.firstChild;)e.removeChild(e.firstChild);var n=document.createElement("textarea");n.id="profilElevationResults",n.rows=10,n.cols=50,n.style.width="100%",n.innerHTML=JSON.stringify(t,void 0,4),e.appendChild(n),i._profile=e},h.DISPLAY_PROFILE_LIB_D3=function(e,i,n){if("undefined"==typeof d3)return void console.log("Lib. D3 is not loaded !");if(i)for(;i.firstChild;)i.removeChild(i.firstChild);var o={top:20,right:20,bottom:30,left:40},s=i.clientWidth-o.left-o.right,r=i.clientHeight-o.top-o.bottom,a=d3.scale.linear().range([0,s]),c=d3.scale.linear().range([r,0]),h=d3.svg.axis().scale(a).orient("bottom").ticks(5),u=d3.svg.axis().scale(c).orient("left").ticks(5),d=d3.svg.line().interpolate("basis").x(function(t){return a(t.dist)}).y(function(t){return c(t.z)}),p=d3.svg.area().interpolate("basis").x(function(t){return a(t.dist)}).y0(r).y1(function(t){return c(t.z)}),m=d3.select(i).append("svg").attr("width",s+o.left+o.right).attr("height",r+o.top+o.bottom).append("g").attr("transform","translate("+o.left+","+o.top+")"),f=d3.extent(e,function(t){return t.dist});a.domain(f);var _=[0,d3.max(e,function(t){return t.z})];c.domain(_),m.append("path").datum(e).attr("class","area-d3").attr("d",p),m.append("g").attr("class","x axis-d3").attr("transform","translate(0,"+r+")").call(h).append("text").attr("y",-15).attr("dy",".71em").attr("x",s).text("Distance (km)"),m.append("g").attr("class","y axis-d3").call(u).append("text").attr("transform","rotate(-90)").attr("y",6).attr("dy",".71em").text("Altitude (m)"),m.append("g").attr("class","grid-d3 vertical").attr("transform","translate(0,"+r+")").call(h.orient("bottom").tickSize(-r,0,0).tickFormat("")),m.append("g").attr("class","grid-d3 horizontal").call(u.orient("left").tickSize(-s,0,0).tickFormat("")),m.append("path").datum(e).attr("class","line-d3").attr("d",d),m.selectAll("circle").data(e).enter().append("circle").attr("cx",function(t){return a(t.dist)}).attr("cy",function(t){return c(t.z)}).attr("r",0).attr("class","circle-d3");var g=m.append("g").style("display","none");g.append("line").attr("id","focusLineX").attr("class","focusLine-d3"),g.append("line").attr("id","focusLineY").attr("class","focusLine-d3"),g.append("circle").attr("id","focusCircle").attr("r",4).attr("class","circle-d3 focusCircle-d3");var v=d3.select(i).append("div").attr("class","tooltip-d3").style("opacity",0),y=d3.bisector(function(t){return t.dist}).left,E=this,P=n._map;m.append("rect").attr("class","overlay-d3").attr("width",s).attr("height",r).on("mouseover",function(){g.style("display",null),E._marker=t.marker(t.latLng(e[0].lat,e[0].lon),{icon:new l("orange"),draggable:!1,clickable:!1,zIndexOffset:1e3}),E._marker.addTo(P)}).on("mouseout",function(){g.style("display","none"),E._marker&&(P.removeLayer(E._marker),E._marker=null),v.transition().duration(500).style("opacity",0)}).on("mousemove",function(){var i=d3.mouse(this),n=a.invert(i[0]),o=y(e,n),s=e[o-1],r=e[o],l=n-s[0]>r[0]-n?r:s,h=a(l.dist),u=c(l.z);g.select("#focusCircle").attr("cx",h).attr("cy",u),g.select("#focusLineX").attr("x1",h).attr("y1",c(_[0])).attr("x2",h).attr("y2",c(_[1])),g.select("#focusLineY").attr("x1",a(f[0])).attr("y1",u).attr("x2",a(f[1])).attr("y2",u),E._marker.setLatLng(t.latLng(l.lat,l.lon)),E._marker.update(),v.transition().duration(200).style("opacity",.9),v.html("Alt : "+l.z+" m <br/>Lon : "+l.lon+" <br/>Lat : "+l.lat).style("left",d3.event.pageX+"px").style("top",d3.event.pageY-28+"px")}),n._profile=d3.selectAll("rect.overlay")[0][0]},h.DISPLAY_PROFILE_LIB_AMCHARTS=function(t,e,i){if("undefined"==typeof AmCharts)return void console.log("Lib. AmCharts is not loaded !");AmCharts.addInitHandler(function(){}),i._profile=AmCharts.makeChart(e,{type:"serial",pathToImages:"http://cdn.amcharts.com/lib/3/images/",categoryField:"dist",autoMarginOffset:0,marginRight:10,marginTop:10,startDuration:0,color:"#5E5E5E",fontSize:10,theme:"light",thousandsSeparator:"",categoryAxis:{color:"#5E5E5E",gridPosition:"start",minHorizontalGap:40,tickPosition:"start",title:"Distance (km)",titleColor:"#5E5E5E",startOnAxis:!0},chartCursor:{animationDuration:0,bulletsEnabled:!0,bulletSize:10,categoryBalloonEnabled:!1,cursorColor:"#F90",graphBulletAlpha:1,graphBulletSize:1,zoomable:!1},trendLines:[],graphs:[{balloonColor:"#CCCCCC",balloonText:"<span class='altiPathValue'>[[title]] : [[value]]m</span><br/><span class='altiPathCoords'>(lat: [[lat]] / lon:[[lon]])</span>",bullet:"round",bulletAlpha:0,bulletBorderColor:"#FFF",bulletBorderThickness:2,bulletColor:"#F90",bulletSize:6,hidden:!1,id:"AmGraph-1",fillAlphas:.4,fillColors:"#C77A04",lineAlpha:1,lineColor:"#C77A04",lineThickness:1,title:"Altitude",valueField:"z"}],guides:[],valueAxes:[{id:"ValueAxis-1",minVerticalGap:20,title:"Altitude (m)"}],allLabel:[],balloon:{borderColor:"#CCCCCC",borderThickness:1,fillColor:"#FFFFFF",showBullet:!0},titles:[],dataProvider:t});var n=t[0];i._activateProfilEvent(n)},h}(leaflet,leafletDraw,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,LeafletControlsLocationSelector,LeafletControlsUtilsPositionFormater,LeafletControlsUtilsIconDefault,CommonControlsElevationPathDOM),LeafletControlsLogo=function(t){var e=t.Control.extend({options:{position:"topright",picto:null,url:null,text:null,size:"30px"},initialize:function(e){t.setOptions(this,e)},onAdd:function(){var e=t.DomUtil.create("div","gp-control-logo",e),i=!(!this.options.url&&!this.options.text),n=null;i&&(n=t.DomUtil.create("a","",e),n.target="_blank",this.options.url&&(n.href=this.options.url,this.options.text?n.title=this.options.text:null)),i&&this.options.text&&(n.text=this.options.text);var o=!!this.options.picto,s=null;return o&&(s=i?t.DomUtil.create("img","",n):t.DomUtil.create("img","",e),s.src=this.options.picto,"string"==typeof this.options.size?s.style.height=s.style.width=this.options.size:(s.style.height=this.options.size.height,s.style.width=this.options.size.width)),e}});return e}(leaflet),LeafletControlsControls=function(t,e,i,n,o,s,r,a){var l={LayerSwitcher:function(e){return new t(e)},Isocurve:function(t){return new e(t)},MousePosition:function(t){return new i(t)},ReverseGeocode:function(t){return new n(t)},Route:function(t){return new o(t)},SearchEngine:function(t){return new s(t)},ElevationPath:function(t){return new r(t)},Logo:function(t){return new a(t)}};return l}(LeafletControlsLayerSwitcher,LeafletControlsIsocurve,LeafletControlsMousePosition,LeafletControlsReverseGeocoding,LeafletControlsRoute,LeafletControlsSearchEngine,LeafletControlsElevationPath,LeafletControlsLogo),CommonUtilsLayerUtils=function(){var t={getZoomLevelFromScaleDenominator:function(t,e){var i={};switch(e){case"EPSG:2154":i={0:104579.224549894,1:52277.5323537905,2:26135.4870785954,3:13066.8913818,4:6533.2286041135,5:3266.5595244627,6:1633.2660045974,7:816.629554986,8:408.3139146768,9:204.1567415109,10:102.0783167832,11:51.0391448966,12:25.5195690743,13:12.7597836936,14:6.379891636,15:3.1899457653,16:1.5949728695,17:.7974864315,18:.3987432149,19:.1993716073,20:.0996858037,21:.0498429018};break;default:i={0:156543.033928041,1:78271.51696402048,2:39135.758482010235,3:19567.87924100512,4:9783.93962050256,5:4891.96981025128,6:2445.98490512564,7:1222.99245256282,8:611.49622628141,9:305.7481131407048,10:152.8740565703525,11:76.43702828517624,12:38.21851414258813,13:19.10925707129406,14:9.554628535647032,15:4.777314267823516,16:2.388657133911758,17:1.194328566955879,18:.5971642834779395,19:.2985821417389697,20:.1492910708694849,21:.0746455354347424}}var n=28e-5*t;for(var o in i)if(i.hasOwnProperty(o)&&i[o]<=n)return o;return 0},getAttributions:function(t){var e=t.zoom,i=[];if(null!=t.originators&&t.visibility)for(var n,o=0,s=t.originators.length;o<s;o++){n=!0;for(var r=t.originators[o],a=t.originators[o].constraints||[],l=0,c=a.length;l<c;l++){var h=a[l];n=!0;var u=this.getZoomLevelFromScaleDenominator(h.maxScaleDenominator,t.crs),d=this.getZoomLevelFromScaleDenominator(h.minScaleDenominator,t.crs);u&&u>e&&(n=!1),n&&d&&d<e&&(n=!1);var p=h.bbox;if(n&&p){n=!1;var m=t.extent;if(m){var f=[p.top,p.left,p.bottom,p.right];if(this.intersects(m,f)){n=!0;break}}}}if(n){var _=r.logo,g=r.url,v=r.name?r.name:"",y=r.attribution,E=document.createElement("div");E.className="gp-control-attribution";var P=null;P=document.createElement("a"),P.className="gp-control-attribution-link",P.target="_blank",E.appendChild(P),g&&(P.href=g);var C=!!_,S=null;C?(S=document.createElement("img"),P?(S.className="gp-control-attribution-image",P.appendChild(S)):(S.className="",E.appendChild(S)),S.src=_,S.title=y||v,S.style.height="30px",S.style.width="30px"):v?P.textContent=v:y?P.textContent=y:g?P.textContent=g:P.textContent="",i.push(E.innerHTML+" ")}}return i},intersects:function(t,e){var i=t[1]<=e[3]&&e[1]<=t[3],n=t[2]<=e[0]&&e[2]<=t[0];return i&&n}};return t}(),LeafletLayersLayerConfig=function(t,e,i){var n={get:function(t){var n={};if(e.isConfigLoaded()&&(n=e.getLayerParams(t.layer,t.service,t.key)))return n.minZoom=i.getZoomLevelFromScaleDenominator(n.maxScale)||1,n.maxZoom=i.getZoomLevelFromScaleDenominator(n.minScale)||21,n}};return n}({},CommonUtilsConfig,CommonUtilsLayerUtils),LeafletLayersLayerEvent=function(t,e){var i={_id:null,_attributions:[],_visibility:!0,_originators:[],isEnable:function(t){return!!t.attributionControl},setVisible:function(t){this._visibility=t},getVisible:function(){return this._visibility},_onRemoveLayer:function(t){t.layer._geoportal_id==this._geoportal_id&&this.setVisible(!1)},_onAddLayer:function(t){t.layer._geoportal_id==this._geoportal_id&&this.setVisible(!0)},_onMoveEndLayer:function(t){this.updateAttributions(this._map,this)},updateAttributions:function(t){this.isEnable(t)&&(this.removeAttributions(t),this.addAttributions(t))},removeAttributions:function(t){if(this.isEnable(t)){for(var e=0;e<this._attributions.length;e++)t.attributionControl.removeAttribution(this._attributions[e]);this._attributions&&(this._attributions=[])}},addAttributions:function(t){if(this.isEnable(t)){var i=t.getBounds().getNorthWest(),n=t.getBounds().getSouthEast(),o=[i.lat,i.lng,n.lat,n.lng],s={extent:o,zoom:t.getZoom(),originators:this._originators,visibility:this._visibility},r=e.getAttributions(s);if(r&&0!==r.length)for(var a=0;a<r.length;a++)this._attributions.push(r[a]),t.attributionControl.addAttribution(r[a])}}};return i}({},CommonUtilsLayerUtils),LeafletLayersWMS=function(t,e,i,n){var o=t.TileLayer.WMS.extend({includes:n,initialize:function(i,n){var o={};t.Util.extend(o,n.paramsWms,n.paramsNative),t.TileLayer.WMS.prototype.initialize.call(this,e.Helper.normalyzeUrl(i,{"gp-leaflet-ext":"0.9.0"},!1),o),this._originators=n.originators,this._legends=n.legends,this._metadata=n.metadata,this._title=n.title,this._description=n.description,this._quicklookUrl=n.quicklookUrl,this._geoportal_id=0},onAdd:function(e){this._map=e,this._geoportal_id=t.stamp(this),t.TileLayer.WMS.prototype.onAdd.call(this,e),this.setVisible(!0),this.updateAttributions(e),e.on({overlayremove:this._onRemoveLayer,overlayadd:this._onAddLayer,layerremove:this._onRemoveLayer,layeradd:this._onAddLayer,moveend:this._onMoveEndLayer},this)},onRemove:function(e){this._map=e,t.TileLayer.prototype.onRemove.call(this,e),this.setVisible(!1),this.removeAttributions(e),e.off({overlayremove:this._onRemoveLayer,overlayadd:this._onAddLayer,layerremove:this._onRemoveLayer,layeradd:this._onAddLayer,moveend:this._onMoveEndLayer},this)},getTileUrl:function(e){var i=["EPSG:4326"],n=this._map,o=this.options.tileSize,s=e.multiplyBy(o),r=s.add([o,o]),a=this._crs.project(n.unproject(s,e.z)),l=this._crs.project(n.unproject(r,e.z)),c=this._wmsVersion>=1.3&&i.indexOf(this._crs.code)!==-1?[l.y,a.x,a.y,l.x].join(","):[a.x,l.y,l.x,a.y].join(","),h=t.Util.template(this._url,{s:this._getSubdomain(e)});return h+t.Util.getParamString(this.wmsParams,h,!0)+"&BBOX="+c}});return o}(leaflet,gp,{},LeafletLayersLayerEvent),LeafletLayersWMTS=function(t,e,i,n){var o=t.TileLayer.extend({includes:n,defaultWmtsParams:{service:"WMTS",request:"GetTile",version:"1.0.0",layer:"",style:"",tilematrixset:"PM",format:"image/jpeg"},initialize:function(i,n){this._wmtsParams={},t.Util.extend(this._wmtsParams,this.defaultWmtsParams,n.paramsWmts),
-t.TileLayer.prototype.initialize.call(this,e.Helper.normalyzeUrl(i,{"gp-leaflet-ext":"0.9.0"},!1),n.paramsNative),this._originators=n.originators,this._legends=n.legends,this._metadata=n.metadata,this._title=n.title,this._description=n.description,this._quicklookUrl=n.quicklookUrl,this._geoportal_id=0},onAdd:function(e){this._map=e,this._geoportal_id=t.stamp(this),t.TileLayer.prototype.onAdd.call(this,e),this.setVisible(!0),this.updateAttributions(e),e.on({overlayremove:this._onRemoveLayer,overlayadd:this._onAddLayer,layerremove:this._onRemoveLayer,layeradd:this._onAddLayer,moveend:this._onMoveEndLayer},this)},onRemove:function(e){this._map=e,t.TileLayer.prototype.onRemove.call(this,e),this.setVisible(!1),this.removeAttributions(e),e.off({overlayremove:this._onRemoveLayer,overlayadd:this._onAddLayer,layerremove:this._onRemoveLayer,layeradd:this._onAddLayer,moveend:this._onMoveEndLayer},this)},getTileUrl:function(e){var i=this._getZoomForUrl(),n=t.Util.template(this._url,{s:this._getSubdomain(e)});return n+t.Util.getParamString(this._wmtsParams,n)+"&tilematrix="+i+"&tilerow="+e.y+"&tilecol="+e.x},setParams:function(e,i){return t.extend(this._wmtsParams,e),i||this.redraw(),this}});return o}(leaflet,gp,{},LeafletLayersLayerEvent),LeafletLayersLayers=function(t,e,i,n,o){var s={options:{},params:{},serviceUrl:"http://localhost?no-rights-found-for=[{layer}]",_initLogger:function(){},_initOptions:function(){if(!this.options||0===Object.keys(this.options))throw new Error("PARAM_MISSING : options !");if(!this.options.layer)throw new Error("PARAM_MISSING : layer !");this.options.apiKey||console.log("PARAM_MISSING : apiKey !")},_initParams:function(t){t||(t="WMTS"),this.params=i.get({key:this.options.apiKey,layer:this.options.layer,service:t}),this.params&&0!==Object.keys(this.params)||(this.params={},this.options.apiKey||console.log("WARNING PARAM_MISSING : parameter 'apiKey' is mandatory if the contract key configuration has not been loaded !"))},WMS:function(e,i){this._initLogger(),this.options=e||{},this._initOptions(),this.settings=i||{},this._initParams("WMS");var o=null;o=this.params.key||this.options.apiKey?this.params.url||t.Util.template("http://wxs.ign.fr/{key}/geoportail/r/wms",{key:this.params.key||this.options.apiKey}):t.Util.template(this.serviceUrl,{layer:this.options.layer});var s={layers:this.options.layer,styles:this.params.styles||"normal",format:this.params.format||"image/jpeg",version:this.params.version||"1.3.0"},r={minZoom:this.params.minZoom||1,maxZoom:this.params.maxZoom||21};return t.Util.extend(r,this.settings),new n(o,{paramsNative:r,paramsWms:s,originators:this.params.originators||[],legends:this.params.legends||[],metadata:this.params.metadata||[],title:this.params.title||null,description:this.params.description||null,quicklookUrl:this.params.quicklookUrl||null})},WMTS:function(e,i){this._initLogger(),this.options=e||{},this._initOptions(),this.settings=i||{},this._initParams("WMTS");var n=null;n=this.params.key||this.options.apiKey?this.params.url||t.Util.template("http://wxs.ign.fr/{key}/geoportail/wmts",{key:this.params.key||this.options.apiKey}):t.Util.template(this.serviceUrl,{layer:this.options.layer});var s={layer:this.options.layer,style:this.params.styles||"normal",format:this.params.format||"image/jpeg",version:this.params.version||"1.0.0",tilematrixset:this.params.TMSLink||"PM"},r={minZoom:this.params.minZoom||1,maxZoom:this.params.maxZoom||21};return t.Util.extend(r,this.settings),new o(n,{paramsNative:r,paramsWmts:s,originators:this.params.originators||[],legends:this.params.legends||[],metadata:this.params.metadata||[],title:this.params.title||"",description:this.params.description||"",quicklookUrl:this.params.quicklookUrl||""})}};return s}(leaflet,{},LeafletLayersLayerConfig,LeafletLayersWMS,LeafletLayersWMTS),LeafletGpPluginLeaflet=function(t,e,i,n,o,s,r,a){return i.leafletExtVersion="0.9.0",i.leafletExtDate="2016-12-04",i.Register=a,t.geoportalLayer=s,t.geoportalControl=n,t.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_D3=o.DISPLAY_PROFILE_LIB_D3,t.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS=o.DISPLAY_PROFILE_LIB_AMCHARTS,t.geoportalControl.ElevationPath.DISPLAY_PROFILE_RAW=o.DISPLAY_PROFILE_RAW,t.geoportalControl.ElevationPath.DISPLAY_PROFILE_BY_DEFAULT=o.DISPLAY_PROFILE_BY_DEFAULT,t.geoportalCRS=r,t.geoportalCRS.EPSG2154=r.EPSG2154(),t.geoportalCRS.EPSG27572=r.EPSG27572(),t.geoportalCRS.EPSG4326=r.EPSG4326(),i}(leaflet,leafletDraw,gp,LeafletControlsControls,LeafletControlsElevationPath,LeafletLayersLayers,LeafletCRSCRS,CommonUtilsRegister),window.proj4=proj4;
-return Gp;
-}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-markercluster-1.4.1.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,3 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e.Leaflet=e.Leaflet||{},e.Leaflet.markercluster=e.Leaflet.markercluster||{}))}(this,function(e){"use strict";var t=L.MarkerClusterGroup=L.FeatureGroup.extend({options:{maxClusterRadius:80,iconCreateFunction:null,clusterPane:L.Marker.prototype.options.pane,spiderfyOnMaxZoom:!0,showCoverageOnHover:!0,zoomToBoundsOnClick:!0,singleMarkerMode:!1,disableClusteringAtZoom:null,removeOutsideVisibleBounds:!0,animate:!0,animateAddingMarkers:!1,spiderfyDistanceMultiplier:1,spiderLegPolylineOptions:{weight:1.5,color:"#222",opacity:.5},chunkedLoading:!1,chunkInterval:200,chunkDelay:50,chunkProgress:null,polygonOptions:{}},initialize:function(e){L.Util.setOptions(this,e),this.options.iconCreateFunction||(this.options.iconCreateFunction=this._defaultIconCreateFunction),this._featureGroup=L.featureGroup(),this._featureGroup.addEventParent(this),this._nonPointGroup=L.featureGroup(),this._nonPointGroup.addEventParent(this),this._inZoomAnimation=0,this._needsClustering=[],this._needsRemoving=[],this._currentShownBounds=null,this._queue=[],this._childMarkerEventHandlers={dragstart:this._childMarkerDragStart,move:this._childMarkerMoved,dragend:this._childMarkerDragEnd};var t=L.DomUtil.TRANSITION&&this.options.animate;L.extend(this,t?this._withAnimation:this._noAnimation),this._markerCluster=t?L.MarkerCluster:L.MarkerClusterNonAnimated},addLayer:function(e){if(e instanceof L.LayerGroup)return this.addLayers([e]);if(!e.getLatLng)return this._nonPointGroup.addLayer(e),this.fire("layeradd",{layer:e}),this;if(!this._map)return this._needsClustering.push(e),this.fire("layeradd",{layer:e}),this;if(this.hasLayer(e))return this;this._unspiderfy&&this._unspiderfy(),this._addLayer(e,this._maxZoom),this.fire("layeradd",{layer:e}),this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons();var t=e,i=this._zoom;if(e.__parent)for(;t.__parent._zoom>=i;)t=t.__parent;return this._currentShownBounds.contains(t.getLatLng())&&(this.options.animateAddingMarkers?this._animationAddLayer(e,t):this._animationAddLayerNonAnimated(e,t)),this},removeLayer:function(e){return e instanceof L.LayerGroup?this.removeLayers([e]):e.getLatLng?this._map?e.__parent?(this._unspiderfy&&(this._unspiderfy(),this._unspiderfyLayer(e)),this._removeLayer(e,!0),this.fire("layerremove",{layer:e}),this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),e.off(this._childMarkerEventHandlers,this),this._featureGroup.hasLayer(e)&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow()),this):this:(!this._arraySplice(this._needsClustering,e)&&this.hasLayer(e)&&this._needsRemoving.push({layer:e,latlng:e._latlng}),this.fire("layerremove",{layer:e}),this):(this._nonPointGroup.removeLayer(e),this.fire("layerremove",{layer:e}),this)},addLayers:function(e,t){if(!L.Util.isArray(e))return this.addLayer(e);var i,n=this._featureGroup,r=this._nonPointGroup,s=this.options.chunkedLoading,o=this.options.chunkInterval,a=this.options.chunkProgress,h=e.length,l=0,u=!0;if(this._map){var _=(new Date).getTime(),d=L.bind(function(){for(var c=(new Date).getTime();h>l;l++){if(s&&0===l%200){var p=(new Date).getTime()-c;if(p>o)break}if(i=e[l],i instanceof L.LayerGroup)u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(i,e),h=e.length;else if(i.getLatLng){if(!this.hasLayer(i)&&(this._addLayer(i,this._maxZoom),t||this.fire("layeradd",{layer:i}),i.__parent&&2===i.__parent.getChildCount())){var f=i.__parent.getAllChildMarkers(),m=f[0]===i?f[1]:f[0];n.removeLayer(m)}}else r.addLayer(i),t||this.fire("layeradd",{layer:i})}a&&a(l,h,(new Date).getTime()-_),l===h?(this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds)):setTimeout(d,this.options.chunkDelay)},this);d()}else for(var c=this._needsClustering;h>l;l++)i=e[l],i instanceof L.LayerGroup?(u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(i,e),h=e.length):i.getLatLng?this.hasLayer(i)||c.push(i):r.addLayer(i);return this},removeLayers:function(e){var t,i,n=e.length,r=this._featureGroup,s=this._nonPointGroup,o=!0;if(!this._map){for(t=0;n>t;t++)i=e[t],i instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):(this._arraySplice(this._needsClustering,i),s.removeLayer(i),this.hasLayer(i)&&this._needsRemoving.push({layer:i,latlng:i._latlng}),this.fire("layerremove",{layer:i}));return this}if(this._unspiderfy){this._unspiderfy();var a=e.slice(),h=n;for(t=0;h>t;t++)i=a[t],i instanceof L.LayerGroup?(this._extractNonGroupLayers(i,a),h=a.length):this._unspiderfyLayer(i)}for(t=0;n>t;t++)i=e[t],i instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):i.__parent?(this._removeLayer(i,!0,!0),this.fire("layerremove",{layer:i}),r.hasLayer(i)&&(r.removeLayer(i),i.clusterShow&&i.clusterShow())):(s.removeLayer(i),this.fire("layerremove",{layer:i}));return this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds),this},clearLayers:function(){return this._map||(this._needsClustering=[],this._needsRemoving=[],delete this._gridClusters,delete this._gridUnclustered),this._noanimationUnspiderfy&&this._noanimationUnspiderfy(),this._featureGroup.clearLayers(),this._nonPointGroup.clearLayers(),this.eachLayer(function(e){e.off(this._childMarkerEventHandlers,this),delete e.__parent},this),this._map&&this._generateInitialClusters(),this},getBounds:function(){var e=new L.LatLngBounds;this._topClusterLevel&&e.extend(this._topClusterLevel._bounds);for(var t=this._needsClustering.length-1;t>=0;t--)e.extend(this._needsClustering[t].getLatLng());return e.extend(this._nonPointGroup.getBounds()),e},eachLayer:function(e,t){var i,n,r,s=this._needsClustering.slice(),o=this._needsRemoving;for(this._topClusterLevel&&this._topClusterLevel.getAllChildMarkers(s),n=s.length-1;n>=0;n--){for(i=!0,r=o.length-1;r>=0;r--)if(o[r].layer===s[n]){i=!1;break}i&&e.call(t,s[n])}this._nonPointGroup.eachLayer(e,t)},getLayers:function(){var e=[];return this.eachLayer(function(t){e.push(t)}),e},getLayer:function(e){var t=null;return e=parseInt(e,10),this.eachLayer(function(i){L.stamp(i)===e&&(t=i)}),t},hasLayer:function(e){if(!e)return!1;var t,i=this._needsClustering;for(t=i.length-1;t>=0;t--)if(i[t]===e)return!0;for(i=this._needsRemoving,t=i.length-1;t>=0;t--)if(i[t].layer===e)return!1;return!(!e.__parent||e.__parent._group!==this)||this._nonPointGroup.hasLayer(e)},zoomToShowLayer:function(e,t){"function"!=typeof t&&(t=function(){});var i=function(){!e._icon&&!e.__parent._icon||this._inZoomAnimation||(this._map.off("moveend",i,this),this.off("animationend",i,this),e._icon?t():e.__parent._icon&&(this.once("spiderfied",t,this),e.__parent.spiderfy()))};e._icon&&this._map.getBounds().contains(e.getLatLng())?t():e.__parent._zoom<Math.round(this._map._zoom)?(this._map.on("moveend",i,this),this._map.panTo(e.getLatLng())):(this._map.on("moveend",i,this),this.on("animationend",i,this),e.__parent.zoomToBounds())},onAdd:function(e){this._map=e;var t,i,n;if(!isFinite(this._map.getMaxZoom()))throw"Map has no maxZoom specified";for(this._featureGroup.addTo(e),this._nonPointGroup.addTo(e),this._gridClusters||this._generateInitialClusters(),this._maxLat=e.options.crs.projection.MAX_LATITUDE,t=0,i=this._needsRemoving.length;i>t;t++)n=this._needsRemoving[t],n.newlatlng=n.layer._latlng,n.layer._latlng=n.latlng;for(t=0,i=this._needsRemoving.length;i>t;t++)n=this._needsRemoving[t],this._removeLayer(n.layer,!0),n.layer._latlng=n.newlatlng;this._needsRemoving=[],this._zoom=Math.round(this._map._zoom),this._currentShownBounds=this._getExpandedVisibleBounds(),this._map.on("zoomend",this._zoomEnd,this),this._map.on("moveend",this._moveEnd,this),this._spiderfierOnAdd&&this._spiderfierOnAdd(),this._bindEvents(),i=this._needsClustering,this._needsClustering=[],this.addLayers(i,!0)},onRemove:function(e){e.off("zoomend",this._zoomEnd,this),e.off("moveend",this._moveEnd,this),this._unbindEvents(),this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim",""),this._spiderfierOnRemove&&this._spiderfierOnRemove(),delete this._maxLat,this._hideCoverage(),this._featureGroup.remove(),this._nonPointGroup.remove(),this._featureGroup.clearLayers(),this._map=null},getVisibleParent:function(e){for(var t=e;t&&!t._icon;)t=t.__parent;return t||null},_arraySplice:function(e,t){for(var i=e.length-1;i>=0;i--)if(e[i]===t)return e.splice(i,1),!0},_removeFromGridUnclustered:function(e,t){for(var i=this._map,n=this._gridUnclustered,r=Math.floor(this._map.getMinZoom());t>=r&&n[t].removeObject(e,i.project(e.getLatLng(),t));t--);},_childMarkerDragStart:function(e){e.target.__dragStart=e.target._latlng},_childMarkerMoved:function(e){if(!this._ignoreMove&&!e.target.__dragStart){var t=e.target._popup&&e.target._popup.isOpen();this._moveChild(e.target,e.oldLatLng,e.latlng),t&&e.target.openPopup()}},_moveChild:function(e,t,i){e._latlng=t,this.removeLayer(e),e._latlng=i,this.addLayer(e)},_childMarkerDragEnd:function(e){var t=e.target.__dragStart;delete e.target.__dragStart,t&&this._moveChild(e.target,t,e.target._latlng)},_removeLayer:function(e,t,i){var n=this._gridClusters,r=this._gridUnclustered,s=this._featureGroup,o=this._map,a=Math.floor(this._map.getMinZoom());t&&this._removeFromGridUnclustered(e,this._maxZoom);var h,l=e.__parent,u=l._markers;for(this._arraySplice(u,e);l&&(l._childCount--,l._boundsNeedUpdate=!0,!(l._zoom<a));)t&&l._childCount<=1?(h=l._markers[0]===e?l._markers[1]:l._markers[0],n[l._zoom].removeObject(l,o.project(l._cLatLng,l._zoom)),r[l._zoom].addObject(h,o.project(h.getLatLng(),l._zoom)),this._arraySplice(l.__parent._childClusters,l),l.__parent._markers.push(h),h.__parent=l.__parent,l._icon&&(s.removeLayer(l),i||s.addLayer(h))):l._iconNeedsUpdate=!0,l=l.__parent;delete e.__parent},_isOrIsParent:function(e,t){for(;t;){if(e===t)return!0;t=t.parentNode}return!1},fire:function(e,t,i){if(t&&t.layer instanceof L.MarkerCluster){if(t.originalEvent&&this._isOrIsParent(t.layer._icon,t.originalEvent.relatedTarget))return;e="cluster"+e}L.FeatureGroup.prototype.fire.call(this,e,t,i)},listens:function(e,t){return L.FeatureGroup.prototype.listens.call(this,e,t)||L.FeatureGroup.prototype.listens.call(this,"cluster"+e,t)},_defaultIconCreateFunction:function(e){var t=e.getChildCount(),i=" marker-cluster-";return i+=10>t?"small":100>t?"medium":"large",new L.DivIcon({html:"<div><span>"+t+"</span></div>",className:"marker-cluster"+i,iconSize:new L.Point(40,40)})},_bindEvents:function(){var e=this._map,t=this.options.spiderfyOnMaxZoom,i=this.options.showCoverageOnHover,n=this.options.zoomToBoundsOnClick;(t||n)&&this.on("clusterclick",this._zoomOrSpiderfy,this),i&&(this.on("clustermouseover",this._showCoverage,this),this.on("clustermouseout",this._hideCoverage,this),e.on("zoomend",this._hideCoverage,this))},_zoomOrSpiderfy:function(e){for(var t=e.layer,i=t;1===i._childClusters.length;)i=i._childClusters[0];i._zoom===this._maxZoom&&i._childCount===t._childCount&&this.options.spiderfyOnMaxZoom?t.spiderfy():this.options.zoomToBoundsOnClick&&t.zoomToBounds(),e.originalEvent&&13===e.originalEvent.keyCode&&this._map._container.focus()},_showCoverage:function(e){var t=this._map;this._inZoomAnimation||(this._shownPolygon&&t.removeLayer(this._shownPolygon),e.layer.getChildCount()>2&&e.layer!==this._spiderfied&&(this._shownPolygon=new L.Polygon(e.layer.getConvexHull(),this.options.polygonOptions),t.addLayer(this._shownPolygon)))},_hideCoverage:function(){this._shownPolygon&&(this._map.removeLayer(this._shownPolygon),this._shownPolygon=null)},_unbindEvents:function(){var e=this.options.spiderfyOnMaxZoom,t=this.options.showCoverageOnHover,i=this.options.zoomToBoundsOnClick,n=this._map;(e||i)&&this.off("clusterclick",this._zoomOrSpiderfy,this),t&&(this.off("clustermouseover",this._showCoverage,this),this.off("clustermouseout",this._hideCoverage,this),n.off("zoomend",this._hideCoverage,this))},_zoomEnd:function(){this._map&&(this._mergeSplitClusters(),this._zoom=Math.round(this._map._zoom),this._currentShownBounds=this._getExpandedVisibleBounds())},_moveEnd:function(){if(!this._inZoomAnimation){var e=this._getExpandedVisibleBounds();this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),this._zoom,e),this._topClusterLevel._recursivelyAddChildrenToMap(null,Math.round(this._map._zoom),e),this._currentShownBounds=e}},_generateInitialClusters:function(){var e=Math.ceil(this._map.getMaxZoom()),t=Math.floor(this._map.getMinZoom()),i=this.options.maxClusterRadius,n=i;"function"!=typeof i&&(n=function(){return i}),null!==this.options.disableClusteringAtZoom&&(e=this.options.disableClusteringAtZoom-1),this._maxZoom=e,this._gridClusters={},this._gridUnclustered={};for(var r=e;r>=t;r--)this._gridClusters[r]=new L.DistanceGrid(n(r)),this._gridUnclustered[r]=new L.DistanceGrid(n(r));this._topClusterLevel=new this._markerCluster(this,t-1)},_addLayer:function(e,t){var i,n,r=this._gridClusters,s=this._gridUnclustered,o=Math.floor(this._map.getMinZoom());for(this.options.singleMarkerMode&&this._overrideMarkerIcon(e),e.on(this._childMarkerEventHandlers,this);t>=o;t--){i=this._map.project(e.getLatLng(),t);var a=r[t].getNearObject(i);if(a)return a._addChild(e),e.__parent=a,void 0;if(a=s[t].getNearObject(i)){var h=a.__parent;h&&this._removeLayer(a,!1);var l=new this._markerCluster(this,t,a,e);r[t].addObject(l,this._map.project(l._cLatLng,t)),a.__parent=l,e.__parent=l;var u=l;for(n=t-1;n>h._zoom;n--)u=new this._markerCluster(this,n,u),r[n].addObject(u,this._map.project(a.getLatLng(),n));return h._addChild(u),this._removeFromGridUnclustered(a,t),void 0}s[t].addObject(e,i)}this._topClusterLevel._addChild(e),e.__parent=this._topClusterLevel},_refreshClustersIcons:function(){this._featureGroup.eachLayer(function(e){e instanceof L.MarkerCluster&&e._iconNeedsUpdate&&e._updateIcon()})},_enqueue:function(e){this._queue.push(e),this._queueTimeout||(this._queueTimeout=setTimeout(L.bind(this._processQueue,this),300))},_processQueue:function(){for(var e=0;e<this._queue.length;e++)this._queue[e].call(this);this._queue.length=0,clearTimeout(this._queueTimeout),this._queueTimeout=null},_mergeSplitClusters:function(){var e=Math.round(this._map._zoom);this._processQueue(),this._zoom<e&&this._currentShownBounds.intersects(this._getExpandedVisibleBounds())?(this._animationStart(),this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),this._zoom,this._getExpandedVisibleBounds()),this._animationZoomIn(this._zoom,e)):this._zoom>e?(this._animationStart(),this._animationZoomOut(this._zoom,e)):this._moveEnd()},_getExpandedVisibleBounds:function(){return this.options.removeOutsideVisibleBounds?L.Browser.mobile?this._checkBoundsMaxLat(this._map.getBounds()):this._checkBoundsMaxLat(this._map.getBounds().pad(1)):this._mapBoundsInfinite},_checkBoundsMaxLat:function(e){var t=this._maxLat;return void 0!==t&&(e.getNorth()>=t&&(e._northEast.lat=1/0),e.getSouth()<=-t&&(e._southWest.lat=-1/0)),e},_animationAddLayerNonAnimated:function(e,t){if(t===e)this._featureGroup.addLayer(e);else if(2===t._childCount){t._addToMap();var i=t.getAllChildMarkers();this._featureGroup.removeLayer(i[0]),this._featureGroup.removeLayer(i[1])}else t._updateIcon()},_extractNonGroupLayers:function(e,t){var i,n=e.getLayers(),r=0;for(t=t||[];r<n.length;r++)i=n[r],i instanceof L.LayerGroup?this._extractNonGroupLayers(i,t):t.push(i);return t},_overrideMarkerIcon:function(e){var t=e.options.icon=this.options.iconCreateFunction({getChildCount:function(){return 1},getAllChildMarkers:function(){return[e]}});return t}});L.MarkerClusterGroup.include({_mapBoundsInfinite:new L.LatLngBounds(new L.LatLng(-1/0,-1/0),new L.LatLng(1/0,1/0))}),L.MarkerClusterGroup.include({_noAnimation:{_animationStart:function(){},_animationZoomIn:function(e,t){this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),e),this._topClusterLevel._recursivelyAddChildrenToMap(null,t,this._getExpandedVisibleBounds()),this.fire("animationend")},_animationZoomOut:function(e,t){this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),e),this._topClusterLevel._recursivelyAddChildrenToMap(null,t,this._getExpandedVisibleBounds()),this.fire("animationend")},_animationAddLayer:function(e,t){this._animationAddLayerNonAnimated(e,t)}},_withAnimation:{_animationStart:function(){this._map._mapPane.className+=" leaflet-cluster-anim",this._inZoomAnimation++},_animationZoomIn:function(e,t){var i,n=this._getExpandedVisibleBounds(),r=this._featureGroup,s=Math.floor(this._map.getMinZoom());this._ignoreMove=!0,this._topClusterLevel._recursively(n,e,s,function(s){var o,a=s._latlng,h=s._markers;for(n.contains(a)||(a=null),s._isSingleParent()&&e+1===t?(r.removeLayer(s),s._recursivelyAddChildrenToMap(null,t,n)):(s.clusterHide(),s._recursivelyAddChildrenToMap(a,t,n)),i=h.length-1;i>=0;i--)o=h[i],n.contains(o._latlng)||r.removeLayer(o)}),this._forceLayout(),this._topClusterLevel._recursivelyBecomeVisible(n,t),r.eachLayer(function(e){e instanceof L.MarkerCluster||!e._icon||e.clusterShow()}),this._topClusterLevel._recursively(n,e,t,function(e){e._recursivelyRestoreChildPositions(t)}),this._ignoreMove=!1,this._enqueue(function(){this._topClusterLevel._recursively(n,e,s,function(e){r.removeLayer(e),e.clusterShow()}),this._animationEnd()})},_animationZoomOut:function(e,t){this._animationZoomOutSingle(this._topClusterLevel,e-1,t),this._topClusterLevel._recursivelyAddChildrenToMap(null,t,this._getExpandedVisibleBounds()),this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),e,this._getExpandedVisibleBounds())},_animationAddLayer:function(e,t){var i=this,n=this._featureGroup;n.addLayer(e),t!==e&&(t._childCount>2?(t._updateIcon(),this._forceLayout(),this._animationStart(),e._setPos(this._map.latLngToLayerPoint(t.getLatLng())),e.clusterHide(),this._enqueue(function(){n.removeLayer(e),e.clusterShow(),i._animationEnd()})):(this._forceLayout(),i._animationStart(),i._animationZoomOutSingle(t,this._map.getMaxZoom(),this._zoom)))}},_animationZoomOutSingle:function(e,t,i){var n=this._getExpandedVisibleBounds(),r=Math.floor(this._map.getMinZoom());e._recursivelyAnimateChildrenInAndAddSelfToMap(n,r,t+1,i);var s=this;this._forceLayout(),e._recursivelyBecomeVisible(n,i),this._enqueue(function(){if(1===e._childCount){var o=e._markers[0];this._ignoreMove=!0,o.setLatLng(o.getLatLng()),this._ignoreMove=!1,o.clusterShow&&o.clusterShow()}else e._recursively(n,i,r,function(e){e._recursivelyRemoveChildrenFromMap(n,r,t+1)});s._animationEnd()})},_animationEnd:function(){this._map&&(this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim","")),this._inZoomAnimation--,this.fire("animationend")},_forceLayout:function(){L.Util.falseFn(document.body.offsetWidth)}}),L.markerClusterGroup=function(e){return new L.MarkerClusterGroup(e)};var i=L.MarkerCluster=L.Marker.extend({options:L.Icon.prototype.options,initialize:function(e,t,i,n){L.Marker.prototype.initialize.call(this,i?i._cLatLng||i.getLatLng():new L.LatLng(0,0),{icon:this,pane:e.options.clusterPane}),this._group=e,this._zoom=t,this._markers=[],this._childClusters=[],this._childCount=0,this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._bounds=new L.LatLngBounds,i&&this._addChild(i),n&&this._addChild(n)},getAllChildMarkers:function(e,t){e=e||[];for(var i=this._childClusters.length-1;i>=0;i--)this._childClusters[i].getAllChildMarkers(e);for(var n=this._markers.length-1;n>=0;n--)t&&this._markers[n].__dragStart||e.push(this._markers[n]);return e},getChildCount:function(){return this._childCount},zoomToBounds:function(e){for(var t,i=this._childClusters.slice(),n=this._group._map,r=n.getBoundsZoom(this._bounds),s=this._zoom+1,o=n.getZoom();i.length>0&&r>s;){s++;var a=[];for(t=0;t<i.length;t++)a=a.concat(i[t]._childClusters);i=a}r>s?this._group._map.setView(this._latlng,s):o>=r?this._group._map.setView(this._latlng,o+1):this._group._map.fitBounds(this._bounds,e)},getBounds:function(){var e=new L.LatLngBounds;return e.extend(this._bounds),e},_updateIcon:function(){this._iconNeedsUpdate=!0,this._icon&&this.setIcon(this)},createIcon:function(){return this._iconNeedsUpdate&&(this._iconObj=this._group.options.iconCreateFunction(this),this._iconNeedsUpdate=!1),this._iconObj.createIcon()},createShadow:function(){return this._iconObj.createShadow()},_addChild:function(e,t){this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._setClusterCenter(e),e instanceof L.MarkerCluster?(t||(this._childClusters.push(e),e.__parent=this),this._childCount+=e._childCount):(t||this._markers.push(e),this._childCount++),this.__parent&&this.__parent._addChild(e,!0)},_setClusterCenter:function(e){this._cLatLng||(this._cLatLng=e._cLatLng||e._latlng)},_resetBounds:function(){var e=this._bounds;e._southWest&&(e._southWest.lat=1/0,e._southWest.lng=1/0),e._northEast&&(e._northEast.lat=-1/0,e._northEast.lng=-1/0)},_recalculateBounds:function(){var e,t,i,n,r=this._markers,s=this._childClusters,o=0,a=0,h=this._childCount;if(0!==h){for(this._resetBounds(),e=0;e<r.length;e++)i=r[e]._latlng,this._bounds.extend(i),o+=i.lat,a+=i.lng;for(e=0;e<s.length;e++)t=s[e],t._boundsNeedUpdate&&t._recalculateBounds(),this._bounds.extend(t._bounds),i=t._wLatLng,n=t._childCount,o+=i.lat*n,a+=i.lng*n;this._latlng=this._wLatLng=new L.LatLng(o/h,a/h),this._boundsNeedUpdate=!1}},_addToMap:function(e){e&&(this._backupLatlng=this._latlng,this.setLatLng(e)),this._group._featureGroup.addLayer(this)},_recursivelyAnimateChildrenIn:function(e,t,i){this._recursively(e,this._group._map.getMinZoom(),i-1,function(e){var i,n,r=e._markers;for(i=r.length-1;i>=0;i--)n=r[i],n._icon&&(n._setPos(t),n.clusterHide())},function(e){var i,n,r=e._childClusters;for(i=r.length-1;i>=0;i--)n=r[i],n._icon&&(n._setPos(t),n.clusterHide())})},_recursivelyAnimateChildrenInAndAddSelfToMap:function(e,t,i,n){this._recursively(e,n,t,function(r){r._recursivelyAnimateChildrenIn(e,r._group._map.latLngToLayerPoint(r.getLatLng()).round(),i),r._isSingleParent()&&i-1===n?(r.clusterShow(),r._recursivelyRemoveChildrenFromMap(e,t,i)):r.clusterHide(),r._addToMap()})},_recursivelyBecomeVisible:function(e,t){this._recursively(e,this._group._map.getMinZoom(),t,null,function(e){e.clusterShow()})},_recursivelyAddChildrenToMap:function(e,t,i){this._recursively(i,this._group._map.getMinZoom()-1,t,function(n){if(t!==n._zoom)for(var r=n._markers.length-1;r>=0;r--){var s=n._markers[r];i.contains(s._latlng)&&(e&&(s._backupLatlng=s.getLatLng(),s.setLatLng(e),s.clusterHide&&s.clusterHide()),n._group._featureGroup.addLayer(s))}},function(t){t._addToMap(e)})},_recursivelyRestoreChildPositions:function(e){for(var t=this._markers.length-1;t>=0;t--){var i=this._markers[t];i._backupLatlng&&(i.setLatLng(i._backupLatlng),delete i._backupLatlng)}if(e-1===this._zoom)for(var n=this._childClusters.length-1;n>=0;n--)this._childClusters[n]._restorePosition();else for(var r=this._childClusters.length-1;r>=0;r--)this._childClusters[r]._recursivelyRestoreChildPositions(e)},_restorePosition:function(){this._backupLatlng&&(this.setLatLng(this._backupLatlng),delete this._backupLatlng)},_recursivelyRemoveChildrenFromMap:function(e,t,i,n){var r,s;this._recursively(e,t-1,i-1,function(e){for(s=e._markers.length-1;s>=0;s--)r=e._markers[s],n&&n.contains(r._latlng)||(e._group._featureGroup.removeLayer(r),r.clusterShow&&r.clusterShow())},function(e){for(s=e._childClusters.length-1;s>=0;s--)r=e._childClusters[s],n&&n.contains(r._latlng)||(e._group._featureGroup.removeLayer(r),r.clusterShow&&r.clusterShow())})},_recursively:function(e,t,i,n,r){var s,o,a=this._childClusters,h=this._zoom;if(h>=t&&(n&&n(this),r&&h===i&&r(this)),t>h||i>h)for(s=a.length-1;s>=0;s--)o=a[s],o._boundsNeedUpdate&&o._recalculateBounds(),e.intersects(o._bounds)&&o._recursively(e,t,i,n,r)},_isSingleParent:function(){return this._childClusters.length>0&&this._childClusters[0]._childCount===this._childCount}});L.Marker.include({clusterHide:function(){var e=this.options.opacity;return this.setOpacity(0),this.options.opacity=e,this},clusterShow:function(){return this.setOpacity(this.options.opacity)}}),L.DistanceGrid=function(e){this._cellSize=e,this._sqCellSize=e*e,this._grid={},this._objectPoint={}},L.DistanceGrid.prototype={addObject:function(e,t){var i=this._getCoord(t.x),n=this._getCoord(t.y),r=this._grid,s=r[n]=r[n]||{},o=s[i]=s[i]||[],a=L.Util.stamp(e);this._objectPoint[a]=t,o.push(e)},updateObject:function(e,t){this.removeObject(e),this.addObject(e,t)},removeObject:function(e,t){var i,n,r=this._getCoord(t.x),s=this._getCoord(t.y),o=this._grid,a=o[s]=o[s]||{},h=a[r]=a[r]||[];for(delete this._objectPoint[L.Util.stamp(e)],i=0,n=h.length;n>i;i++)if(h[i]===e)return h.splice(i,1),1===n&&delete a[r],!0},eachObject:function(e,t){var i,n,r,s,o,a,h,l=this._grid;for(i in l){o=l[i];for(n in o)for(a=o[n],r=0,s=a.length;s>r;r++)h=e.call(t,a[r]),h&&(r--,s--)}},getNearObject:function(e){var t,i,n,r,s,o,a,h,l=this._getCoord(e.x),u=this._getCoord(e.y),_=this._objectPoint,d=this._sqCellSize,c=null;for(t=u-1;u+1>=t;t++)if(r=this._grid[t])for(i=l-1;l+1>=i;i++)if(s=r[i])for(n=0,o=s.length;o>n;n++)a=s[n],h=this._sqDist(_[L.Util.stamp(a)],e),(d>h||d>=h&&null===c)&&(d=h,c=a);return c},_getCoord:function(e){var t=Math.floor(e/this._cellSize);return isFinite(t)?t:e},_sqDist:function(e,t){var i=t.x-e.x,n=t.y-e.y;return i*i+n*n}},function(){L.QuickHull={getDistant:function(e,t){var i=t[1].lat-t[0].lat,n=t[0].lng-t[1].lng;return n*(e.lat-t[0].lat)+i*(e.lng-t[0].lng)},findMostDistantPointFromBaseLine:function(e,t){var i,n,r,s=0,o=null,a=[];for(i=t.length-1;i>=0;i--)n=t[i],r=this.getDistant(n,e),r>0&&(a.push(n),r>s&&(s=r,o=n));return{maxPoint:o,newPoints:a}},buildConvexHull:function(e,t){var i=[],n=this.findMostDistantPointFromBaseLine(e,t);return n.maxPoint?(i=i.concat(this.buildConvexHull([e[0],n.maxPoint],n.newPoints)),i=i.concat(this.buildConvexHull([n.maxPoint,e[1]],n.newPoints))):[e[0]]},getConvexHull:function(e){var t,i=!1,n=!1,r=!1,s=!1,o=null,a=null,h=null,l=null,u=null,_=null;for(t=e.length-1;t>=0;t--){var d=e[t];(i===!1||d.lat>i)&&(o=d,i=d.lat),(n===!1||d.lat<n)&&(a=d,n=d.lat),(r===!1||d.lng>r)&&(h=d,r=d.lng),(s===!1||d.lng<s)&&(l=d,s=d.lng)}n!==i?(_=a,u=o):(_=l,u=h);var c=[].concat(this.buildConvexHull([_,u],e),this.buildConvexHull([u,_],e));return c}}}(),L.MarkerCluster.include({getConvexHull:function(){var e,t,i=this.getAllChildMarkers(),n=[];for(t=i.length-1;t>=0;t--)e=i[t].getLatLng(),n.push(e);return L.QuickHull.getConvexHull(n)}}),L.MarkerCluster.include({_2PI:2*Math.PI,_circleFootSeparation:25,_circleStartAngle:0,_spiralFootSeparation:28,_spiralLengthStart:11,_spiralLengthFactor:5,_circleSpiralSwitchover:9,spiderfy:function(){if(this._group._spiderfied!==this&&!this._group._inZoomAnimation){var e,t=this.getAllChildMarkers(null,!0),i=this._group,n=i._map,r=n.latLngToLayerPoint(this._latlng);this._group._unspiderfy(),this._group._spiderfied=this,t.length>=this._circleSpiralSwitchover?e=this._generatePointsSpiral(t.length,r):(r.y+=10,e=this._generatePointsCircle(t.length,r)),this._animationSpiderfy(t,e)}},unspiderfy:function(e){this._group._inZoomAnimation||(this._animationUnspiderfy(e),this._group._spiderfied=null)},_generatePointsCircle:function(e,t){var i,n,r=this._group.options.spiderfyDistanceMultiplier*this._circleFootSeparation*(2+e),s=r/this._2PI,o=this._2PI/e,a=[];for(s=Math.max(s,35),a.length=e,i=0;e>i;i++)n=this._circleStartAngle+i*o,a[i]=new L.Point(t.x+s*Math.cos(n),t.y+s*Math.sin(n))._round();return a},_generatePointsSpiral:function(e,t){var i,n=this._group.options.spiderfyDistanceMultiplier,r=n*this._spiralLengthStart,s=n*this._spiralFootSeparation,o=n*this._spiralLengthFactor*this._2PI,a=0,h=[];for(h.length=e,i=e;i>=0;i--)e>i&&(h[i]=new L.Point(t.x+r*Math.cos(a),t.y+r*Math.sin(a))._round()),a+=s/r+5e-4*i,r+=o/a;return h},_noanimationUnspiderfy:function(){var e,t,i=this._group,n=i._map,r=i._featureGroup,s=this.getAllChildMarkers(null,!0);for(i._ignoreMove=!0,this.setOpacity(1),t=s.length-1;t>=0;t--)e=s[t],r.removeLayer(e),e._preSpiderfyLatlng&&(e.setLatLng(e._preSpiderfyLatlng),delete e._preSpiderfyLatlng),e.setZIndexOffset&&e.setZIndexOffset(0),e._spiderLeg&&(n.removeLayer(e._spiderLeg),delete e._spiderLeg);i.fire("unspiderfied",{cluster:this,markers:s}),i._ignoreMove=!1,i._spiderfied=null}}),L.MarkerClusterNonAnimated=L.MarkerCluster.extend({_animationSpiderfy:function(e,t){var i,n,r,s,o=this._group,a=o._map,h=o._featureGroup,l=this._group.options.spiderLegPolylineOptions;for(o._ignoreMove=!0,i=0;i<e.length;i++)s=a.layerPointToLatLng(t[i]),n=e[i],r=new L.Polyline([this._latlng,s],l),a.addLayer(r),n._spiderLeg=r,n._preSpiderfyLatlng=n._latlng,n.setLatLng(s),n.setZIndexOffset&&n.setZIndexOffset(1e6),h.addLayer(n);this.setOpacity(.3),o._ignoreMove=!1,o.fire("spiderfied",{cluster:this,markers:e})},_animationUnspiderfy:function(){this._noanimationUnspiderfy()}}),L.MarkerCluster.include({_animationSpiderfy:function(e,t){var i,n,r,s,o,a,h=this,l=this._group,u=l._map,_=l._featureGroup,d=this._latlng,c=u.latLngToLayerPoint(d),p=L.Path.SVG,f=L.extend({},this._group.options.spiderLegPolylineOptions),m=f.opacity;for(void 0===m&&(m=L.MarkerClusterGroup.prototype.options.spiderLegPolylineOptions.opacity),p?(f.opacity=0,f.className=(f.className||"")+" leaflet-cluster-spider-leg"):f.opacity=m,l._ignoreMove=!0,i=0;i<e.length;i++)n=e[i],a=u.layerPointToLatLng(t[i]),r=new L.Polyline([d,a],f),u.addLayer(r),n._spiderLeg=r,p&&(s=r._path,o=s.getTotalLength()+.1,s.style.strokeDasharray=o,s.style.strokeDashoffset=o),n.setZIndexOffset&&n.setZIndexOffset(1e6),n.clusterHide&&n.clusterHide(),_.addLayer(n),n._setPos&&n._setPos(c);for(l._forceLayout(),l._animationStart(),i=e.length-1;i>=0;i--)a=u.layerPointToLatLng(t[i]),n=e[i],n._preSpiderfyLatlng=n._latlng,n.setLatLng(a),n.clusterShow&&n.clusterShow(),p&&(r=n._spiderLeg,s=r._path,s.style.strokeDashoffset=0,r.setStyle({opacity:m}));this.setOpacity(.3),l._ignoreMove=!1,setTimeout(function(){l._animationEnd(),l.fire("spiderfied",{cluster:h,markers:e})},200)},_animationUnspiderfy:function(e){var t,i,n,r,s,o,a=this,h=this._group,l=h._map,u=h._featureGroup,_=e?l._latLngToNewLayerPoint(this._latlng,e.zoom,e.center):l.latLngToLayerPoint(this._latlng),d=this.getAllChildMarkers(null,!0),c=L.Path.SVG;for(h._ignoreMove=!0,h._animationStart(),this.setOpacity(1),i=d.length-1;i>=0;i--)t=d[i],t._preSpiderfyLatlng&&(t.closePopup(),t.setLatLng(t._preSpiderfyLatlng),delete t._preSpiderfyLatlng,o=!0,t._setPos&&(t._setPos(_),o=!1),t.clusterHide&&(t.clusterHide(),o=!1),o&&u.removeLayer(t),c&&(n=t._spiderLeg,r=n._path,s=r.getTotalLength()+.1,r.style.strokeDashoffset=s,n.setStyle({opacity:0})));h._ignoreMove=!1,setTimeout(function(){var e=0;for(i=d.length-1;i>=0;i--)t=d[i],t._spiderLeg&&e++;for(i=d.length-1;i>=0;i--)t=d[i],t._spiderLeg&&(t.clusterShow&&t.clusterShow(),t.setZIndexOffset&&t.setZIndexOffset(0),e>1&&u.removeLayer(t),l.removeLayer(t._spiderLeg),delete t._spiderLeg);h._animationEnd(),h.fire("unspiderfied",{cluster:a,markers:d})},200)}}),L.MarkerClusterGroup.include({_spiderfied:null,unspiderfy:function(){this._unspiderfy.apply(this,arguments)},_spiderfierOnAdd:function(){this._map.on("click",this._unspiderfyWrapper,this),this._map.options.zoomAnimation&&this._map.on("zoomstart",this._unspiderfyZoomStart,this),this._map.on("zoomend",this._noanimationUnspiderfy,this),L.Browser.touch||this._map.getRenderer(this)},_spiderfierOnRemove:function(){this._map.off("click",this._unspiderfyWrapper,this),this._map.off("zoomstart",this._unspiderfyZoomStart,this),this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._map.off("zoomend",this._noanimationUnspiderfy,this),this._noanimationUnspiderfy()
+},_unspiderfyZoomStart:function(){this._map&&this._map.on("zoomanim",this._unspiderfyZoomAnim,this)},_unspiderfyZoomAnim:function(e){L.DomUtil.hasClass(this._map._mapPane,"leaflet-touching")||(this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._unspiderfy(e))},_unspiderfyWrapper:function(){this._unspiderfy()},_unspiderfy:function(e){this._spiderfied&&this._spiderfied.unspiderfy(e)},_noanimationUnspiderfy:function(){this._spiderfied&&this._spiderfied._noanimationUnspiderfy()},_unspiderfyLayer:function(e){e._spiderLeg&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow(),e.setZIndexOffset&&e.setZIndexOffset(0),this._map.removeLayer(e._spiderLeg),delete e._spiderLeg)}}),L.MarkerClusterGroup.include({refreshClusters:function(e){return e?e instanceof L.MarkerClusterGroup?e=e._topClusterLevel.getAllChildMarkers():e instanceof L.LayerGroup?e=e._layers:e instanceof L.MarkerCluster?e=e.getAllChildMarkers():e instanceof L.Marker&&(e=[e]):e=this._topClusterLevel.getAllChildMarkers(),this._flagParentsIconsNeedUpdate(e),this._refreshClustersIcons(),this.options.singleMarkerMode&&this._refreshSingleMarkerModeMarkers(e),this},_flagParentsIconsNeedUpdate:function(e){var t,i;for(t in e)for(i=e[t].__parent;i;)i._iconNeedsUpdate=!0,i=i.__parent},_refreshSingleMarkerModeMarkers:function(e){var t,i;for(t in e)i=e[t],this.hasLayer(i)&&i.setIcon(this._overrideMarkerIcon(i))}}),L.Marker.include({refreshIconOptions:function(e,t){var i=this.options.icon;return L.setOptions(i,e),this.setIcon(i),t&&this.__parent&&this.__parent._group.refreshClusters(this),this}}),e.MarkerClusterGroup=t,e.MarkerCluster=i});
+//# sourceMappingURL=leaflet.markercluster.js.map
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_gis/resources/js/leaflet-markercluster-1.4.1.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -0,0 +1,1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e.Leaflet=e.Leaflet||{},e.Leaflet.markercluster=e.Leaflet.markercluster||{}))}(this,(function(e){"use strict";var t=L.MarkerClusterGroup=L.FeatureGroup.extend({options:{maxClusterRadius:80,iconCreateFunction:null,clusterPane:L.Marker.prototype.options.pane,spiderfyOnMaxZoom:!0,showCoverageOnHover:!0,zoomToBoundsOnClick:!0,singleMarkerMode:!1,disableClusteringAtZoom:null,removeOutsideVisibleBounds:!0,animate:!0,animateAddingMarkers:!1,spiderfyDistanceMultiplier:1,spiderLegPolylineOptions:{weight:1.5,color:"#222",opacity:.5},chunkedLoading:!1,chunkInterval:200,chunkDelay:50,chunkProgress:null,polygonOptions:{}},initialize:function(e){L.Util.setOptions(this,e),this.options.iconCreateFunction||(this.options.iconCreateFunction=this._defaultIconCreateFunction),this._featureGroup=L.featureGroup(),this._featureGroup.addEventParent(this),this._nonPointGroup=L.featureGroup(),this._nonPointGroup.addEventParent(this),this._inZoomAnimation=0,this._needsClustering=[],this._needsRemoving=[],this._currentShownBounds=null,this._queue=[],this._childMarkerEventHandlers={dragstart:this._childMarkerDragStart,move:this._childMarkerMoved,dragend:this._childMarkerDragEnd};var t=L.DomUtil.TRANSITION&&this.options.animate;L.extend(this,t?this._withAnimation:this._noAnimation),this._markerCluster=t?L.MarkerCluster:L.MarkerClusterNonAnimated},addLayer:function(e){if(e instanceof L.LayerGroup)return this.addLayers([e]);if(!e.getLatLng)return this._nonPointGroup.addLayer(e),this.fire("layeradd",{layer:e}),this;if(!this._map)return this._needsClustering.push(e),this.fire("layeradd",{layer:e}),this;if(this.hasLayer(e))return this;this._unspiderfy&&this._unspiderfy(),this._addLayer(e,this._maxZoom),this.fire("layeradd",{layer:e}),this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons();var t=e,i=this._zoom;if(e.__parent)for(;t.__parent._zoom>=i;)t=t.__parent;return this._currentShownBounds.contains(t.getLatLng())&&(this.options.animateAddingMarkers?this._animationAddLayer(e,t):this._animationAddLayerNonAnimated(e,t)),this},removeLayer:function(e){return e instanceof L.LayerGroup?this.removeLayers([e]):e.getLatLng?this._map?e.__parent?(this._unspiderfy&&(this._unspiderfy(),this._unspiderfyLayer(e)),this._removeLayer(e,!0),this.fire("layerremove",{layer:e}),this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),e.off(this._childMarkerEventHandlers,this),this._featureGroup.hasLayer(e)&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow()),this):this:(!this._arraySplice(this._needsClustering,e)&&this.hasLayer(e)&&this._needsRemoving.push({layer:e,latlng:e._latlng}),this.fire("layerremove",{layer:e}),this):(this._nonPointGroup.removeLayer(e),this.fire("layerremove",{layer:e}),this)},addLayers:function(e,t){if(!L.Util.isArray(e))return this.addLayer(e);var i,n=this._featureGroup,r=this._nonPointGroup,s=this.options.chunkedLoading,o=this.options.chunkInterval,a=this.options.chunkProgress,h=e.length,l=0,u=!0;if(this._map){var _=(new Date).getTime(),d=L.bind((function(){for(var c=(new Date).getTime();h>l;l++){if(s&&0==l%200)if((new Date).getTime()-c>o)break;if((i=e[l])instanceof L.LayerGroup)u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(i,e),h=e.length;else if(i.getLatLng){if(!this.hasLayer(i)&&(this._addLayer(i,this._maxZoom),t||this.fire("layeradd",{layer:i}),i.__parent&&2===i.__parent.getChildCount())){var p=i.__parent.getAllChildMarkers(),f=p[0]===i?p[1]:p[0];n.removeLayer(f)}}else r.addLayer(i),t||this.fire("layeradd",{layer:i})}a&&a(l,h,(new Date).getTime()-_),l===h?(this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds)):setTimeout(d,this.options.chunkDelay)}),this);d()}else for(var c=this._needsClustering;h>l;l++)(i=e[l])instanceof L.LayerGroup?(u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(i,e),h=e.length):i.getLatLng?this.hasLayer(i)||c.push(i):r.addLayer(i);return this},removeLayers:function(e){var t,i,n=e.length,r=this._featureGroup,s=this._nonPointGroup,o=!0;if(!this._map){for(t=0;n>t;t++)(i=e[t])instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):(this._arraySplice(this._needsClustering,i),s.removeLayer(i),this.hasLayer(i)&&this._needsRemoving.push({layer:i,latlng:i._latlng}),this.fire("layerremove",{layer:i}));return this}if(this._unspiderfy){this._unspiderfy();var a=e.slice(),h=n;for(t=0;h>t;t++)(i=a[t])instanceof L.LayerGroup?(this._extractNonGroupLayers(i,a),h=a.length):this._unspiderfyLayer(i)}for(t=0;n>t;t++)(i=e[t])instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):i.__parent?(this._removeLayer(i,!0,!0),this.fire("layerremove",{layer:i}),r.hasLayer(i)&&(r.removeLayer(i),i.clusterShow&&i.clusterShow())):(s.removeLayer(i),this.fire("layerremove",{layer:i}));return this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds),this},clearLayers:function(){return this._map||(this._needsClustering=[],this._needsRemoving=[],delete this._gridClusters,delete this._gridUnclustered),this._noanimationUnspiderfy&&this._noanimationUnspiderfy(),this._featureGroup.clearLayers(),this._nonPointGroup.clearLayers(),this.eachLayer((function(e){e.off(this._childMarkerEventHandlers,this),delete e.__parent}),this),this._map&&this._generateInitialClusters(),this},getBounds:function(){var e=new L.LatLngBounds;this._topClusterLevel&&e.extend(this._topClusterLevel._bounds);for(var t=this._needsClustering.length-1;t>=0;t--)e.extend(this._needsClustering[t].getLatLng());return e.extend(this._nonPointGroup.getBounds()),e},eachLayer:function(e,t){var i,n,r,s=this._needsClustering.slice(),o=this._needsRemoving;for(this._topClusterLevel&&this._topClusterLevel.getAllChildMarkers(s),n=s.length-1;n>=0;n--){for(i=!0,r=o.length-1;r>=0;r--)if(o[r].layer===s[n]){i=!1;break}i&&e.call(t,s[n])}this._nonPointGroup.eachLayer(e,t)},getLayers:function(){var e=[];return this.eachLayer((function(t){e.push(t)})),e},getLayer:function(e){var t=null;return e=parseInt(e,10),this.eachLayer((function(i){L.stamp(i)===e&&(t=i)})),t},hasLayer:function(e){if(!e)return!1;var t,i=this._needsClustering;for(t=i.length-1;t>=0;t--)if(i[t]===e)return!0;for(t=(i=this._needsRemoving).length-1;t>=0;t--)if(i[t].layer===e)return!1;return!(!e.__parent||e.__parent._group!==this)||this._nonPointGroup.hasLayer(e)},zoomToShowLayer:function(e,t){"function"!=typeof t&&(t=function(){});var i=function(){!e._icon&&!e.__parent._icon||this._inZoomAnimation||(this._map.off("moveend",i,this),this.off("animationend",i,this),e._icon?t():e.__parent._icon&&(this.once("spiderfied",t,this),e.__parent.spiderfy()))};e._icon&&this._map.getBounds().contains(e.getLatLng())?t():e.__parent._zoom<Math.round(this._map._zoom)?(this._map.on("moveend",i,this),this._map.panTo(e.getLatLng())):(this._map.on("moveend",i,this),this.on("animationend",i,this),e.__parent.zoomToBounds())},onAdd:function(e){var t,i,n;if(this._map=e,!isFinite(this._map.getMaxZoom()))throw"Map has no maxZoom specified";for(this._featureGroup.addTo(e),this._nonPointGroup.addTo(e),this._gridClusters||this._generateInitialClusters(),this._maxLat=e.options.crs.projection.MAX_LATITUDE,t=0,i=this._needsRemoving.length;i>t;t++)(n=this._needsRemoving[t]).newlatlng=n.layer._latlng,n.layer._latlng=n.latlng;for(t=0,i=this._needsRemoving.length;i>t;t++)n=this._needsRemoving[t],this._removeLayer(n.layer,!0),n.layer._latlng=n.newlatlng;this._needsRemoving=[],this._zoom=Math.round(this._map._zoom),this._currentShownBounds=this._getExpandedVisibleBounds(),this._map.on("zoomend",this._zoomEnd,this),this._map.on("moveend",this._moveEnd,this),this._spiderfierOnAdd&&this._spiderfierOnAdd(),this._bindEvents(),i=this._needsClustering,this._needsClustering=[],this.addLayers(i,!0)},onRemove:function(e){e.off("zoomend",this._zoomEnd,this),e.off("moveend",this._moveEnd,this),this._unbindEvents(),this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim",""),this._spiderfierOnRemove&&this._spiderfierOnRemove(),delete this._maxLat,this._hideCoverage(),this._featureGroup.remove(),this._nonPointGroup.remove(),this._featureGroup.clearLayers(),this._map=null},getVisibleParent:function(e){for(var t=e;t&&!t._icon;)t=t.__parent;return t||null},_arraySplice:function(e,t){for(var i=e.length-1;i>=0;i--)if(e[i]===t)return e.splice(i,1),!0},_removeFromGridUnclustered:function(e,t){for(var i=this._map,n=this._gridUnclustered,r=Math.floor(this._map.getMinZoom());t>=r&&n[t].removeObject(e,i.project(e.getLatLng(),t));t--);},_childMarkerDragStart:function(e){e.target.__dragStart=e.target._latlng},_childMarkerMoved:function(e){if(!this._ignoreMove&&!e.target.__dragStart){var t=e.target._popup&&e.target._popup.isOpen();this._moveChild(e.target,e.oldLatLng,e.latlng),t&&e.target.openPopup()}},_moveChild:function(e,t,i){e._latlng=t,this.removeLayer(e),e._latlng=i,this.addLayer(e)},_childMarkerDragEnd:function(e){var t=e.target.__dragStart;delete e.target.__dragStart,t&&this._moveChild(e.target,t,e.target._latlng)},_removeLayer:function(e,t,i){var n=this._gridClusters,r=this._gridUnclustered,s=this._featureGroup,o=this._map,a=Math.floor(this._map.getMinZoom());t&&this._removeFromGridUnclustered(e,this._maxZoom);var h,l=e.__parent,u=l._markers;for(this._arraySplice(u,e);l&&(l._childCount--,l._boundsNeedUpdate=!0,!(l._zoom<a));)t&&l._childCount<=1?(h=l._markers[0]===e?l._markers[1]:l._markers[0],n[l._zoom].removeObject(l,o.project(l._cLatLng,l._zoom)),r[l._zoom].addObject(h,o.project(h.getLatLng(),l._zoom)),this._arraySplice(l.__parent._childClusters,l),l.__parent._markers.push(h),h.__parent=l.__parent,l._icon&&(s.removeLayer(l),i||s.addLayer(h))):l._iconNeedsUpdate=!0,l=l.__parent;delete e.__parent},_isOrIsParent:function(e,t){for(;t;){if(e===t)return!0;t=t.parentNode}return!1},fire:function(e,t,i){if(t&&t.layer instanceof L.MarkerCluster){if(t.originalEvent&&this._isOrIsParent(t.layer._icon,t.originalEvent.relatedTarget))return;e="cluster"+e}L.FeatureGroup.prototype.fire.call(this,e,t,i)},listens:function(e,t){return L.FeatureGroup.prototype.listens.call(this,e,t)||L.FeatureGroup.prototype.listens.call(this,"cluster"+e,t)},_defaultIconCreateFunction:function(e){var t=e.getChildCount(),i=" marker-cluster-";return i+=10>t?"small":100>t?"medium":"large",new L.DivIcon({html:"<div><span>"+t+"</span></div>",className:"marker-cluster"+i,iconSize:new L.Point(40,40)})},_bindEvents:function(){var e=this._map,t=this.options.spiderfyOnMaxZoom,i=this.options.showCoverageOnHover,n=this.options.zoomToBoundsOnClick;(t||n)&&this.on("clusterclick",this._zoomOrSpiderfy,this),i&&(this.on("clustermouseover",this._showCoverage,this),this.on("clustermouseout",this._hideCoverage,this),e.on("zoomend",this._hideCoverage,this))},_zoomOrSpiderfy:function(e){for(var t=e.layer,i=t;1===i._childClusters.length;)i=i._childClusters[0];i._zoom===this._maxZoom&&i._childCount===t._childCount&&this.options.spiderfyOnMaxZoom?t.spiderfy():this.options.zoomToBoundsOnClick&&t.zoomToBounds(),e.originalEvent&&13===e.originalEvent.keyCode&&this._map._container.focus()},_showCoverage:function(e){var t=this._map;this._inZoomAnimation||(this._shownPolygon&&t.removeLayer(this._shownPolygon),e.layer.getChildCount()>2&&e.layer!==this._spiderfied&&(this._shownPolygon=new L.Polygon(e.layer.getConvexHull(),this.options.polygonOptions),t.addLayer(this._shownPolygon)))},_hideCoverage:function(){this._shownPolygon&&(this._map.removeLayer(this._shownPolygon),this._shownPolygon=null)},_unbindEvents:function(){var e=this.options.spiderfyOnMaxZoom,t=this.options.showCoverageOnHover,i=this.options.zoomToBoundsOnClick,n=this._map;(e||i)&&this.off("clusterclick",this._zoomOrSpiderfy,this),t&&(this.off("clustermouseover",this._showCoverage,this),this.off("clustermouseout",this._hideCoverage,this),n.off("zoomend",this._hideCoverage,this))},_zoomEnd:function(){this._map&&(this._mergeSplitClusters(),this._zoom=Math.round(this._map._zoom),this._currentShownBounds=this._getExpandedVisibleBounds())},_moveEnd:function(){if(!this._inZoomAnimation){var e=this._getExpandedVisibleBounds();this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),this._zoom,e),this._topClusterLevel._recursivelyAddChildrenToMap(null,Math.round(this._map._zoom),e),this._currentShownBounds=e}},_generateInitialClusters:function(){var e=Math.ceil(this._map.getMaxZoom()),t=Math.floor(this._map.getMinZoom()),i=this.options.maxClusterRadius,n=i;"function"!=typeof i&&(n=function(){return i}),null!==this.options.disableClusteringAtZoom&&(e=this.options.disableClusteringAtZoom-1),this._maxZoom=e,this._gridClusters={},this._gridUnclustered={};for(var r=e;r>=t;r--)this._gridClusters[r]=new L.DistanceGrid(n(r)),this._gridUnclustered[r]=new L.DistanceGrid(n(r));this._topClusterLevel=new this._markerCluster(this,t-1)},_addLayer:function(e,t){var i,n,r=this._gridClusters,s=this._gridUnclustered,o=Math.floor(this._map.getMinZoom());for(this.options.singleMarkerMode&&this._overrideMarkerIcon(e),e.on(this._childMarkerEventHandlers,this);t>=o;t--){i=this._map.project(e.getLatLng(),t);var a=r[t].getNearObject(i);if(a)return a._addChild(e),void(e.__parent=a);if(a=s[t].getNearObject(i)){var h=a.__parent;h&&this._removeLayer(a,!1);var l=new this._markerCluster(this,t,a,e);r[t].addObject(l,this._map.project(l._cLatLng,t)),a.__parent=l,e.__parent=l;var u=l;for(n=t-1;n>h._zoom;n--)u=new this._markerCluster(this,n,u),r[n].addObject(u,this._map.project(a.getLatLng(),n));return h._addChild(u),void this._removeFromGridUnclustered(a,t)}s[t].addObject(e,i)}this._topClusterLevel._addChild(e),e.__parent=this._topClusterLevel},_refreshClustersIcons:function(){this._featureGroup.eachLayer((function(e){e instanceof L.MarkerCluster&&e._iconNeedsUpdate&&e._updateIcon()}))},_enqueue:function(e){this._queue.push(e),this._queueTimeout||(this._queueTimeout=setTimeout(L.bind(this._processQueue,this),300))},_processQueue:function(){for(var e=0;e<this._queue.length;e++)this._queue[e].call(this);this._queue.length=0,clearTimeout(this._queueTimeout),this._queueTimeout=null},_mergeSplitClusters:function(){var e=Math.round(this._map._zoom);this._processQueue(),this._zoom<e&&this._currentShownBounds.intersects(this._getExpandedVisibleBounds())?(this._animationStart(),this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),this._zoom,this._getExpandedVisibleBounds()),this._animationZoomIn(this._zoom,e)):this._zoom>e?(this._animationStart(),this._animationZoomOut(this._zoom,e)):this._moveEnd()},_getExpandedVisibleBounds:function(){return this.options.removeOutsideVisibleBounds?L.Browser.mobile?this._checkBoundsMaxLat(this._map.getBounds()):this._checkBoundsMaxLat(this._map.getBounds().pad(1)):this._mapBoundsInfinite},_checkBoundsMaxLat:function(e){var t=this._maxLat;return void 0!==t&&(e.getNorth()>=t&&(e._northEast.lat=1/0),e.getSouth()<=-t&&(e._southWest.lat=-1/0)),e},_animationAddLayerNonAnimated:function(e,t){if(t===e)this._featureGroup.addLayer(e);else if(2===t._childCount){t._addToMap();var i=t.getAllChildMarkers();this._featureGroup.removeLayer(i[0]),this._featureGroup.removeLayer(i[1])}else t._updateIcon()},_extractNonGroupLayers:function(e,t){var i,n=e.getLayers(),r=0;for(t=t||[];r<n.length;r++)(i=n[r])instanceof L.LayerGroup?this._extractNonGroupLayers(i,t):t.push(i);return t},_overrideMarkerIcon:function(e){return e.options.icon=this.options.iconCreateFunction({getChildCount:function(){return 1},getAllChildMarkers:function(){return[e]}})}});L.MarkerClusterGroup.include({_mapBoundsInfinite:new L.LatLngBounds(new L.LatLng(-1/0,-1/0),new L.LatLng(1/0,1/0))}),L.MarkerClusterGroup.include({_noAnimation:{_animationStart:function(){},_animationZoomIn:function(e,t){this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),e),this._topClusterLevel._recursivelyAddChildrenToMap(null,t,this._getExpandedVisibleBounds()),this.fire("animationend")},_animationZoomOut:function(e,t){this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),e),this._topClusterLevel._recursivelyAddChildrenToMap(null,t,this._getExpandedVisibleBounds()),this.fire("animationend")},_animationAddLayer:function(e,t){this._animationAddLayerNonAnimated(e,t)}},_withAnimation:{_animationStart:function(){this._map._mapPane.className+=" leaflet-cluster-anim",this._inZoomAnimation++},_animationZoomIn:function(e,t){var i,n=this._getExpandedVisibleBounds(),r=this._featureGroup,s=Math.floor(this._map.getMinZoom());this._ignoreMove=!0,this._topClusterLevel._recursively(n,e,s,(function(s){var o,a=s._latlng,h=s._markers;for(n.contains(a)||(a=null),s._isSingleParent()&&e+1===t?(r.removeLayer(s),s._recursivelyAddChildrenToMap(null,t,n)):(s.clusterHide(),s._recursivelyAddChildrenToMap(a,t,n)),i=h.length-1;i>=0;i--)o=h[i],n.contains(o._latlng)||r.removeLayer(o)})),this._forceLayout(),this._topClusterLevel._recursivelyBecomeVisible(n,t),r.eachLayer((function(e){e instanceof L.MarkerCluster||!e._icon||e.clusterShow()})),this._topClusterLevel._recursively(n,e,t,(function(e){e._recursivelyRestoreChildPositions(t)})),this._ignoreMove=!1,this._enqueue((function(){this._topClusterLevel._recursively(n,e,s,(function(e){r.removeLayer(e),e.clusterShow()})),this._animationEnd()}))},_animationZoomOut:function(e,t){this._animationZoomOutSingle(this._topClusterLevel,e-1,t),this._topClusterLevel._recursivelyAddChildrenToMap(null,t,this._getExpandedVisibleBounds()),this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),e,this._getExpandedVisibleBounds())},_animationAddLayer:function(e,t){var i=this,n=this._featureGroup;n.addLayer(e),t!==e&&(t._childCount>2?(t._updateIcon(),this._forceLayout(),this._animationStart(),e._setPos(this._map.latLngToLayerPoint(t.getLatLng())),e.clusterHide(),this._enqueue((function(){n.removeLayer(e),e.clusterShow(),i._animationEnd()}))):(this._forceLayout(),i._animationStart(),i._animationZoomOutSingle(t,this._map.getMaxZoom(),this._zoom)))}},_animationZoomOutSingle:function(e,t,i){var n=this._getExpandedVisibleBounds(),r=Math.floor(this._map.getMinZoom());e._recursivelyAnimateChildrenInAndAddSelfToMap(n,r,t+1,i);var s=this;this._forceLayout(),e._recursivelyBecomeVisible(n,i),this._enqueue((function(){if(1===e._childCount){var o=e._markers[0];this._ignoreMove=!0,o.setLatLng(o.getLatLng()),this._ignoreMove=!1,o.clusterShow&&o.clusterShow()}else e._recursively(n,i,r,(function(e){e._recursivelyRemoveChildrenFromMap(n,r,t+1)}));s._animationEnd()}))},_animationEnd:function(){this._map&&(this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim","")),this._inZoomAnimation--,this.fire("animationend")},_forceLayout:function(){L.Util.falseFn(document.body.offsetWidth)}}),L.markerClusterGroup=function(e){return new L.MarkerClusterGroup(e)};var i=L.MarkerCluster=L.Marker.extend({options:L.Icon.prototype.options,initialize:function(e,t,i,n){L.Marker.prototype.initialize.call(this,i?i._cLatLng||i.getLatLng():new L.LatLng(0,0),{icon:this,pane:e.options.clusterPane}),this._group=e,this._zoom=t,this._markers=[],this._childClusters=[],this._childCount=0,this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._bounds=new L.LatLngBounds,i&&this._addChild(i),n&&this._addChild(n)},getAllChildMarkers:function(e,t){e=e||[];for(var i=this._childClusters.length-1;i>=0;i--)this._childClusters[i].getAllChildMarkers(e);for(var n=this._markers.length-1;n>=0;n--)t&&this._markers[n].__dragStart||e.push(this._markers[n]);return e},getChildCount:function(){return this._childCount},zoomToBounds:function(e){for(var t,i=this._childClusters.slice(),n=this._group._map,r=n.getBoundsZoom(this._bounds),s=this._zoom+1,o=n.getZoom();i.length>0&&r>s;){s++;var a=[];for(t=0;t<i.length;t++)a=a.concat(i[t]._childClusters);i=a}r>s?this._group._map.setView(this._latlng,s):o>=r?this._group._map.setView(this._latlng,o+1):this._group._map.fitBounds(this._bounds,e)},getBounds:function(){var e=new L.LatLngBounds;return e.extend(this._bounds),e},_updateIcon:function(){this._iconNeedsUpdate=!0,this._icon&&this.setIcon(this)},createIcon:function(){return this._iconNeedsUpdate&&(this._iconObj=this._group.options.iconCreateFunction(this),this._iconNeedsUpdate=!1),this._iconObj.createIcon()},createShadow:function(){return this._iconObj.createShadow()},_addChild:function(e,t){this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._setClusterCenter(e),e instanceof L.MarkerCluster?(t||(this._childClusters.push(e),e.__parent=this),this._childCount+=e._childCount):(t||this._markers.push(e),this._childCount++),this.__parent&&this.__parent._addChild(e,!0)},_setClusterCenter:function(e){this._cLatLng||(this._cLatLng=e._cLatLng||e._latlng)},_resetBounds:function(){var e=this._bounds;e._southWest&&(e._southWest.lat=1/0,e._southWest.lng=1/0),e._northEast&&(e._northEast.lat=-1/0,e._northEast.lng=-1/0)},_recalculateBounds:function(){var e,t,i,n,r=this._markers,s=this._childClusters,o=0,a=0,h=this._childCount;if(0!==h){for(this._resetBounds(),e=0;e<r.length;e++)i=r[e]._latlng,this._bounds.extend(i),o+=i.lat,a+=i.lng;for(e=0;e<s.length;e++)(t=s[e])._boundsNeedUpdate&&t._recalculateBounds(),this._bounds.extend(t._bounds),i=t._wLatLng,n=t._childCount,o+=i.lat*n,a+=i.lng*n;this._latlng=this._wLatLng=new L.LatLng(o/h,a/h),this._boundsNeedUpdate=!1}},_addToMap:function(e){e&&(this._backupLatlng=this._latlng,this.setLatLng(e)),this._group._featureGroup.addLayer(this)},_recursivelyAnimateChildrenIn:function(e,t,i){this._recursively(e,this._group._map.getMinZoom(),i-1,(function(e){var i,n,r=e._markers;for(i=r.length-1;i>=0;i--)(n=r[i])._icon&&(n._setPos(t),n.clusterHide())}),(function(e){var i,n,r=e._childClusters;for(i=r.length-1;i>=0;i--)(n=r[i])._icon&&(n._setPos(t),n.clusterHide())}))},_recursivelyAnimateChildrenInAndAddSelfToMap:function(e,t,i,n){this._recursively(e,n,t,(function(r){r._recursivelyAnimateChildrenIn(e,r._group._map.latLngToLayerPoint(r.getLatLng()).round(),i),r._isSingleParent()&&i-1===n?(r.clusterShow(),r._recursivelyRemoveChildrenFromMap(e,t,i)):r.clusterHide(),r._addToMap()}))},_recursivelyBecomeVisible:function(e,t){this._recursively(e,this._group._map.getMinZoom(),t,null,(function(e){e.clusterShow()}))},_recursivelyAddChildrenToMap:function(e,t,i){this._recursively(i,this._group._map.getMinZoom()-1,t,(function(n){if(t!==n._zoom)for(var r=n._markers.length-1;r>=0;r--){var s=n._markers[r];i.contains(s._latlng)&&(e&&(s._backupLatlng=s.getLatLng(),s.setLatLng(e),s.clusterHide&&s.clusterHide()),n._group._featureGroup.addLayer(s))}}),(function(t){t._addToMap(e)}))},_recursivelyRestoreChildPositions:function(e){for(var t=this._markers.length-1;t>=0;t--){var i=this._markers[t];i._backupLatlng&&(i.setLatLng(i._backupLatlng),delete i._backupLatlng)}if(e-1===this._zoom)for(var n=this._childClusters.length-1;n>=0;n--)this._childClusters[n]._restorePosition();else for(var r=this._childClusters.length-1;r>=0;r--)this._childClusters[r]._recursivelyRestoreChildPositions(e)},_restorePosition:function(){this._backupLatlng&&(this.setLatLng(this._backupLatlng),delete this._backupLatlng)},_recursivelyRemoveChildrenFromMap:function(e,t,i,n){var r,s;this._recursively(e,t-1,i-1,(function(e){for(s=e._markers.length-1;s>=0;s--)r=e._markers[s],n&&n.contains(r._latlng)||(e._group._featureGroup.removeLayer(r),r.clusterShow&&r.clusterShow())}),(function(e){for(s=e._childClusters.length-1;s>=0;s--)r=e._childClusters[s],n&&n.contains(r._latlng)||(e._group._featureGroup.removeLayer(r),r.clusterShow&&r.clusterShow())}))},_recursively:function(e,t,i,n,r){var s,o,a=this._childClusters,h=this._zoom;if(h>=t&&(n&&n(this),r&&h===i&&r(this)),t>h||i>h)for(s=a.length-1;s>=0;s--)(o=a[s])._boundsNeedUpdate&&o._recalculateBounds(),e.intersects(o._bounds)&&o._recursively(e,t,i,n,r)},_isSingleParent:function(){return this._childClusters.length>0&&this._childClusters[0]._childCount===this._childCount}});L.Marker.include({clusterHide:function(){var e=this.options.opacity;return this.setOpacity(0),this.options.opacity=e,this},clusterShow:function(){return this.setOpacity(this.options.opacity)}}),L.DistanceGrid=function(e){this._cellSize=e,this._sqCellSize=e*e,this._grid={},this._objectPoint={}},L.DistanceGrid.prototype={addObject:function(e,t){var i=this._getCoord(t.x),n=this._getCoord(t.y),r=this._grid,s=r[n]=r[n]||{},o=s[i]=s[i]||[],a=L.Util.stamp(e);this._objectPoint[a]=t,o.push(e)},updateObject:function(e,t){this.removeObject(e),this.addObject(e,t)},removeObject:function(e,t){var i,n,r=this._getCoord(t.x),s=this._getCoord(t.y),o=this._grid,a=o[s]=o[s]||{},h=a[r]=a[r]||[];for(delete this._objectPoint[L.Util.stamp(e)],i=0,n=h.length;n>i;i++)if(h[i]===e)return h.splice(i,1),1===n&&delete a[r],!0},eachObject:function(e,t){var i,n,r,s,o,a,h=this._grid;for(i in h)for(n in o=h[i])for(r=0,s=(a=o[n]).length;s>r;r++)e.call(t,a[r])&&(r--,s--)},getNearObject:function(e){var t,i,n,r,s,o,a,h,l=this._getCoord(e.x),u=this._getCoord(e.y),_=this._objectPoint,d=this._sqCellSize,c=null;for(t=u-1;u+1>=t;t++)if(r=this._grid[t])for(i=l-1;l+1>=i;i++)if(s=r[i])for(n=0,o=s.length;o>n;n++)a=s[n],(d>(h=this._sqDist(_[L.Util.stamp(a)],e))||d>=h&&null===c)&&(d=h,c=a);return c},_getCoord:function(e){var t=Math.floor(e/this._cellSize);return isFinite(t)?t:e},_sqDist:function(e,t){var i=t.x-e.x,n=t.y-e.y;return i*i+n*n}},L.QuickHull={getDistant:function(e,t){var i=t[1].lat-t[0].lat;return(t[0].lng-t[1].lng)*(e.lat-t[0].lat)+i*(e.lng-t[0].lng)},findMostDistantPointFromBaseLine:function(e,t){var i,n,r,s=0,o=null,a=[];for(i=t.length-1;i>=0;i--)n=t[i],(r=this.getDistant(n,e))>0&&(a.push(n),r>s&&(s=r,o=n));return{maxPoint:o,newPoints:a}},buildConvexHull:function(e,t){var i=[],n=this.findMostDistantPointFromBaseLine(e,t);return n.maxPoint?i=(i=i.concat(this.buildConvexHull([e[0],n.maxPoint],n.newPoints))).concat(this.buildConvexHull([n.maxPoint,e[1]],n.newPoints)):[e[0]]},getConvexHull:function(e){var t,i=!1,n=!1,r=!1,s=!1,o=null,a=null,h=null,l=null,u=null,_=null;for(t=e.length-1;t>=0;t--){var d=e[t];(!1===i||d.lat>i)&&(o=d,i=d.lat),(!1===n||d.lat<n)&&(a=d,n=d.lat),(!1===r||d.lng>r)&&(h=d,r=d.lng),(!1===s||d.lng<s)&&(l=d,s=d.lng)}return n!==i?(_=a,u=o):(_=l,u=h),[].concat(this.buildConvexHull([_,u],e),this.buildConvexHull([u,_],e))}},L.MarkerCluster.include({getConvexHull:function(){var e,t,i=this.getAllChildMarkers(),n=[];for(t=i.length-1;t>=0;t--)e=i[t].getLatLng(),n.push(e);return L.QuickHull.getConvexHull(n)}}),L.MarkerCluster.include({_2PI:2*Math.PI,_circleFootSeparation:25,_circleStartAngle:0,_spiralFootSeparation:28,_spiralLengthStart:11,_spiralLengthFactor:5,_circleSpiralSwitchover:9,spiderfy:function(){if(this._group._spiderfied!==this&&!this._group._inZoomAnimation){var e,t=this.getAllChildMarkers(null,!0),i=this._group._map.latLngToLayerPoint(this._latlng);this._group._unspiderfy(),this._group._spiderfied=this,t.length>=this._circleSpiralSwitchover?e=this._generatePointsSpiral(t.length,i):(i.y+=10,e=this._generatePointsCircle(t.length,i)),this._animationSpiderfy(t,e)}},unspiderfy:function(e){this._group._inZoomAnimation||(this._animationUnspiderfy(e),this._group._spiderfied=null)},_generatePointsCircle:function(e,t){var i,n,r=this._group.options.spiderfyDistanceMultiplier*this._circleFootSeparation*(2+e)/this._2PI,s=this._2PI/e,o=[];for(r=Math.max(r,35),o.length=e,i=0;e>i;i++)n=this._circleStartAngle+i*s,o[i]=new L.Point(t.x+r*Math.cos(n),t.y+r*Math.sin(n))._round();return o},_generatePointsSpiral:function(e,t){var i,n=this._group.options.spiderfyDistanceMultiplier,r=n*this._spiralLengthStart,s=n*this._spiralFootSeparation,o=n*this._spiralLengthFactor*this._2PI,a=0,h=[];for(h.length=e,i=e;i>=0;i--)e>i&&(h[i]=new L.Point(t.x+r*Math.cos(a),t.y+r*Math.sin(a))._round()),r+=o/(a+=s/r+5e-4*i);return h},_noanimationUnspiderfy:function(){var e,t,i=this._group,n=i._map,r=i._featureGroup,s=this.getAllChildMarkers(null,!0);for(i._ignoreMove=!0,this.setOpacity(1),t=s.length-1;t>=0;t--)e=s[t],r.removeLayer(e),e._preSpiderfyLatlng&&(e.setLatLng(e._preSpiderfyLatlng),delete e._preSpiderfyLatlng),e.setZIndexOffset&&e.setZIndexOffset(0),e._spiderLeg&&(n.removeLayer(e._spiderLeg),delete e._spiderLeg);i.fire("unspiderfied",{cluster:this,markers:s}),i._ignoreMove=!1,i._spiderfied=null}}),L.MarkerClusterNonAnimated=L.MarkerCluster.extend({_animationSpiderfy:function(e,t){var i,n,r,s,o=this._group,a=o._map,h=o._featureGroup,l=this._group.options.spiderLegPolylineOptions;for(o._ignoreMove=!0,i=0;i<e.length;i++)s=a.layerPointToLatLng(t[i]),n=e[i],r=new L.Polyline([this._latlng,s],l),a.addLayer(r),n._spiderLeg=r,n._preSpiderfyLatlng=n._latlng,n.setLatLng(s),n.setZIndexOffset&&n.setZIndexOffset(1e6),h.addLayer(n);this.setOpacity(.3),o._ignoreMove=!1,o.fire("spiderfied",{cluster:this,markers:e})},_animationUnspiderfy:function(){this._noanimationUnspiderfy()}}),L.MarkerCluster.include({_animationSpiderfy:function(e,t){var i,n,r,s,o,a,h=this,l=this._group,u=l._map,_=l._featureGroup,d=this._latlng,c=u.latLngToLayerPoint(d),p=L.Path.SVG,f=L.extend({},this._group.options.spiderLegPolylineOptions),m=f.opacity;for(void 0===m&&(m=L.MarkerClusterGroup.prototype.options.spiderLegPolylineOptions.opacity),p?(f.opacity=0,f.className=(f.className||"")+" leaflet-cluster-spider-leg"):f.opacity=m,l._ignoreMove=!0,i=0;i<e.length;i++)n=e[i],a=u.layerPointToLatLng(t[i]),r=new L.Polyline([d,a],f),u.addLayer(r),n._spiderLeg=r,p&&(o=(s=r._path).getTotalLength()+.1,s.style.strokeDasharray=o,s.style.strokeDashoffset=o),n.setZIndexOffset&&n.setZIndexOffset(1e6),n.clusterHide&&n.clusterHide(),_.addLayer(n),n._setPos&&n._setPos(c);for(l._forceLayout(),l._animationStart(),i=e.length-1;i>=0;i--)a=u.layerPointToLatLng(t[i]),(n=e[i])._preSpiderfyLatlng=n._latlng,n.setLatLng(a),n.clusterShow&&n.clusterShow(),p&&((s=(r=n._spiderLeg)._path).style.strokeDashoffset=0,r.setStyle({opacity:m}));this.setOpacity(.3),l._ignoreMove=!1,setTimeout((function(){l._animationEnd(),l.fire("spiderfied",{cluster:h,markers:e})}),200)},_animationUnspiderfy:function(e){var t,i,n,r,s,o,a=this,h=this._group,l=h._map,u=h._featureGroup,_=e?l._latLngToNewLayerPoint(this._latlng,e.zoom,e.center):l.latLngToLayerPoint(this._latlng),d=this.getAllChildMarkers(null,!0),c=L.Path.SVG;for(h._ignoreMove=!0,h._animationStart(),this.setOpacity(1),i=d.length-1;i>=0;i--)(t=d[i])._preSpiderfyLatlng&&(t.closePopup(),t.setLatLng(t._preSpiderfyLatlng),delete t._preSpiderfyLatlng,o=!0,t._setPos&&(t._setPos(_),o=!1),t.clusterHide&&(t.clusterHide(),o=!1),o&&u.removeLayer(t),c&&(s=(r=(n=t._spiderLeg)._path).getTotalLength()+.1,r.style.strokeDashoffset=s,n.setStyle({opacity:0})));h._ignoreMove=!1,setTimeout((function(){var e=0;for(i=d.length-1;i>=0;i--)(t=d[i])._spiderLeg&&e++;for(i=d.length-1;i>=0;i--)(t=d[i])._spiderLeg&&(t.clusterShow&&t.clusterShow(),t.setZIndexOffset&&t.setZIndexOffset(0),e>1&&u.removeLayer(t),l.removeLayer(t._spiderLeg),delete t._spiderLeg);h._animationEnd(),h.fire("unspiderfied",{cluster:a,markers:d})}),200)}}),L.MarkerClusterGroup.include({_spiderfied:null,unspiderfy:function(){this._unspiderfy.apply(this,arguments)},_spiderfierOnAdd:function(){this._map.on("click",this._unspiderfyWrapper,this),this._map.options.zoomAnimation&&this._map.on("zoomstart",this._unspiderfyZoomStart,this),this._map.on("zoomend",this._noanimationUnspiderfy,this),L.Browser.touch||this._map.getRenderer(this)},_spiderfierOnRemove:function(){this._map.off("click",this._unspiderfyWrapper,this),this._map.off("zoomstart",this._unspiderfyZoomStart,this),this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._map.off("zoomend",this._noanimationUnspiderfy,this),this._noanimationUnspiderfy()},_unspiderfyZoomStart:function(){this._map&&this._map.on("zoomanim",this._unspiderfyZoomAnim,this)},_unspiderfyZoomAnim:function(e){L.DomUtil.hasClass(this._map._mapPane,"leaflet-touching")||(this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._unspiderfy(e))},_unspiderfyWrapper:function(){this._unspiderfy()},_unspiderfy:function(e){this._spiderfied&&this._spiderfied.unspiderfy(e)},_noanimationUnspiderfy:function(){this._spiderfied&&this._spiderfied._noanimationUnspiderfy()},_unspiderfyLayer:function(e){e._spiderLeg&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow(),e.setZIndexOffset&&e.setZIndexOffset(0),this._map.removeLayer(e._spiderLeg),delete e._spiderLeg)}}),L.MarkerClusterGroup.include({refreshClusters:function(e){return e?e instanceof L.MarkerClusterGroup?e=e._topClusterLevel.getAllChildMarkers():e instanceof L.LayerGroup?e=e._layers:e instanceof L.MarkerCluster?e=e.getAllChildMarkers():e instanceof L.Marker&&(e=[e]):e=this._topClusterLevel.getAllChildMarkers(),this._flagParentsIconsNeedUpdate(e),this._refreshClustersIcons(),this.options.singleMarkerMode&&this._refreshSingleMarkerModeMarkers(e),this},_flagParentsIconsNeedUpdate:function(e){var t,i;for(t in e)for(i=e[t].__parent;i;)i._iconNeedsUpdate=!0,i=i.__parent},_refreshSingleMarkerModeMarkers:function(e){var t,i;for(t in e)i=e[t],this.hasLayer(i)&&i.setIcon(this._overrideMarkerIcon(i))}}),L.Marker.include({refreshIconOptions:function(e,t){var i=this.options.icon;return L.setOptions(i,e),this.setIcon(i),t&&this.__parent&&this.__parent._group.refreshClusters(this),this}}),e.MarkerClusterGroup=t,e.MarkerCluster=i}));
--- a/src/pyams_gis/resources/js/leaflet.Control.Draw.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,118 +0,0 @@
-/**
- * @class L.Control.Draw
- * @aka L.Draw
- */
-L.Control.Draw = L.Control.extend({
-
-	// Options
-	options: {
-		position: 'topleft',
-		draw: {},
-		edit: false
-	},
-
-	// @method initialize(): void
-	// Initializes draw control, toolbars from the options
-	initialize: function (options) {
-		if (L.version < '0.7') {
-			throw new Error('Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/');
-		}
-
-		L.Control.prototype.initialize.call(this, options);
-
-		var toolbar;
-
-		this._toolbars = {};
-
-		// Initialize toolbars
-		if (L.DrawToolbar && this.options.draw) {
-			toolbar = new L.DrawToolbar(this.options.draw);
-
-			this._toolbars[L.DrawToolbar.TYPE] = toolbar;
-
-			// Listen for when toolbar is enabled
-			this._toolbars[L.DrawToolbar.TYPE].on('enable', this._toolbarEnabled, this);
-		}
-
-		if (L.EditToolbar && this.options.edit) {
-			toolbar = new L.EditToolbar(this.options.edit);
-
-			this._toolbars[L.EditToolbar.TYPE] = toolbar;
-
-			// Listen for when toolbar is enabled
-			this._toolbars[L.EditToolbar.TYPE].on('enable', this._toolbarEnabled, this);
-		}
-		L.toolbar = this; //set global var for editing the toolbar
-	},
-
-	// @method onAdd(): container
-	// Adds the toolbar container to the map
-	onAdd: function (map) {
-		var container = L.DomUtil.create('div', 'leaflet-draw'),
-			addedTopClass = false,
-			topClassName = 'leaflet-draw-toolbar-top',
-			toolbarContainer;
-
-		for (var toolbarId in this._toolbars) {
-			if (this._toolbars.hasOwnProperty(toolbarId)) {
-				toolbarContainer = this._toolbars[toolbarId].addToolbar(map);
-
-				if (toolbarContainer) {
-					// Add class to the first toolbar to remove the margin
-					if (!addedTopClass) {
-						if (!L.DomUtil.hasClass(toolbarContainer, topClassName)) {
-							L.DomUtil.addClass(toolbarContainer.childNodes[0], topClassName);
-						}
-						addedTopClass = true;
-					}
-
-					container.appendChild(toolbarContainer);
-				}
-			}
-		}
-
-		return container;
-	},
-
-	// @method onRemove(): void
-	// Removes the toolbars from the map toolbar container
-	onRemove: function () {
-		for (var toolbarId in this._toolbars) {
-			if (this._toolbars.hasOwnProperty(toolbarId)) {
-				this._toolbars[toolbarId].removeToolbar();
-			}
-		}
-	},
-
-	// @method setDrawingOptions(options): void
-	// Sets options to all toolbar instances
-	setDrawingOptions: function (options) {
-		for (var toolbarId in this._toolbars) {
-			if (this._toolbars[toolbarId] instanceof L.DrawToolbar) {
-				this._toolbars[toolbarId].setOptions(options);
-			}
-		}
-	},
-
-	_toolbarEnabled: function (e) {
-		var enabledToolbar = e.target;
-
-		for (var toolbarId in this._toolbars) {
-			if (this._toolbars[toolbarId] !== enabledToolbar) {
-				this._toolbars[toolbarId].disable();
-			}
-		}
-	}
-});
-
-L.Map.mergeOptions({
-	drawControlTooltips: true,
-	drawControl: false
-});
-
-L.Map.addInitHook(function () {
-	if (this.options.drawControl) {
-		this.drawControl = new L.Control.Draw();
-		this.addControl(this.drawControl);
-	}
-});
--- a/src/pyams_gis/resources/js/leaflet.Control.Draw.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-L.Control.Draw=L.Control.extend({options:{position:"topleft",draw:{},edit:false},initialize:function(a){if(L.version<"0.7"){throw new Error("Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/")}L.Control.prototype.initialize.call(this,a);var b;this._toolbars={};if(L.DrawToolbar&&this.options.draw){b=new L.DrawToolbar(this.options.draw);this._toolbars[L.DrawToolbar.TYPE]=b;this._toolbars[L.DrawToolbar.TYPE].on("enable",this._toolbarEnabled,this)}if(L.EditToolbar&&this.options.edit){b=new L.EditToolbar(this.options.edit);this._toolbars[L.EditToolbar.TYPE]=b;this._toolbars[L.EditToolbar.TYPE].on("enable",this._toolbarEnabled,this)}L.toolbar=this},onAdd:function(e){var b=L.DomUtil.create("div","leaflet-draw"),c=false,f="leaflet-draw-toolbar-top",a;for(var d in this._toolbars){if(this._toolbars.hasOwnProperty(d)){a=this._toolbars[d].addToolbar(e);if(a){if(!c){if(!L.DomUtil.hasClass(a,f)){L.DomUtil.addClass(a.childNodes[0],f)}c=true}b.appendChild(a)}}}return b},onRemove:function(){for(var a in this._toolbars){if(this._toolbars.hasOwnProperty(a)){this._toolbars[a].removeToolbar()}}},setDrawingOptions:function(a){for(var b in this._toolbars){if(this._toolbars[b] instanceof L.DrawToolbar){this._toolbars[b].setOptions(a)}}},_toolbarEnabled:function(c){var b=c.target;for(var a in this._toolbars){if(this._toolbars[a]!==b){this._toolbars[a].disable()}}}});L.Map.mergeOptions({drawControlTooltips:true,drawControl:false});L.Map.addInitHook(function(){if(this.options.drawControl){this.drawControl=new L.Control.Draw();this.addControl(this.drawControl)}});
\ No newline at end of file
--- a/src/pyams_gis/resources/js/leaflet.Draw.Event.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,156 +0,0 @@
-/**
- * ### Events
- * Once you have successfully added the Leaflet.draw plugin to your map you will want to respond to the different
- * actions users can initiate. The following events will be triggered on the map:
- *
- * @class L.Draw.Event
- * @aka Draw.Event
- *
- * Use `L.Draw.Event.EVENTNAME` constants to ensure events are correct.
- *
- * @example
- * ```js
- * map.on(L.Draw.Event.CREATED; function (e) {
- *    var type = e.layerType;
- *        layer = e.layer;
- *
- *    if (type === 'marker') {
- *        // Do marker specific actions
- *    }
- *
- *    // Do whatever else you need to. (save to db; add to map etc)
- *    map.addLayer(layer);
- *});
- * ```
- */
-L.Draw.Event = {};
-/**
- * @event draw:created: PolyLine; Polygon; Rectangle; Circle; Marker | String
- *
- * Layer that was just created.
- * The type of layer this is. One of: `polyline`; `polygon`; `rectangle`; `circle`; `marker`
- * Triggered when a new vector or marker has been created.
- *
- */
-L.Draw.Event.CREATED = 'draw:created';
-
-/**
- * @event draw:edited: LayerGroup
- *
- * List of all layers just edited on the map.
- *
- *
- * Triggered when layers in the FeatureGroup; initialised with the plugin; have been edited and saved.
- *
- * @example
- * ```js
- *      map.on('draw:edited'; function (e) {
-     *          var layers = e.layers;
-     *          layers.eachLayer(function (layer) {
-     *              //do whatever you want; most likely save back to db
-     *          });
-     *      });
- * ```
- */
-L.Draw.Event.EDITED = 'draw:edited';
-
-/**
- * @event draw:deleted: LayerGroup
- *
- * List of all layers just removed from the map.
- *
- * Triggered when layers have been removed (and saved) from the FeatureGroup.
- */
-L.Draw.Event.DELETED = 'draw:deleted';
-
-/**
- * @event draw:drawstart: String
- *
- * The type of layer this is. One of:`polyline`; `polygon`; `rectangle`; `circle`; `marker`
- *
- * Triggered when the user has chosen to draw a particular vector or marker.
- */
-L.Draw.Event.DRAWSTART = 'draw:drawstart';
-
-/**
- * @event draw:drawstop: String
- *
- * The type of layer this is. One of: `polyline`; `polygon`; `rectangle`; `circle`; `marker`
- *
- * Triggered when the user has finished a particular vector or marker.
- */
-
-L.Draw.Event.DRAWSTOP = 'draw:drawstop';
-
-/**
- * @event draw:drawvertex: LayerGroup
- *
- * List of all layers just being added from the map.
- *
- * Triggered when a vertex is created on a polyline or polygon.
- */
-L.Draw.Event.DRAWVERTEX = 'draw:drawvertex';
-
-/**
- * @event draw:editstart: String
- *
- * The type of edit this is. One of: `edit`
- *
- * Triggered when the user starts edit mode by clicking the edit tool button.
- */
-
-L.Draw.Event.EDITSTART = 'draw:editstart';
-
-/**
- * @event draw:editmove: ILayer
- *
- *  Layer that was just moved.
- *
- * Triggered as the user moves a rectangle; circle or marker.
- */
-L.Draw.Event.EDITMOVE = 'draw:editmove';
-
-/**
- * @event draw:editresize: ILayer
- *
- * Layer that was just moved.
- *
- * Triggered as the user resizes a rectangle or circle.
- */
-L.Draw.Event.EDITRESIZE = 'draw:editresize';
-
-/**
- * @event draw:editvertex: LayerGroup
- *
- * List of all layers just being edited from the map.
- *
- * Triggered when a vertex is edited on a polyline or polygon.
- */
-L.Draw.Event.EDITVERTEX = 'draw:editvertex';
-
-/**
- * @event draw:editstop: String
- *
- * The type of edit this is. One of: `edit`
- *
- * Triggered when the user has finshed editing (edit mode) and saves edits.
- */
-L.Draw.Event.EDITSTOP = 'draw:editstop';
-
-/**
- * @event draw:deletestart: String
- *
- * The type of edit this is. One of: `remove`
- *
- * Triggered when the user starts remove mode by clicking the remove tool button.
- */
-L.Draw.Event.DELETESTART = 'draw:deletestart';
-
-/**
- * @event draw:deletestop: String
- *
- * The type of edit this is. One of: `remove`
- *
- * Triggered when the user has finished removing shapes (remove mode) and saves.
- */
-L.Draw.Event.DELETESTOP = 'draw:deletestop';
\ No newline at end of file
--- a/src/pyams_gis/resources/js/leaflet.Draw.Event.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-L.Draw.Event={};L.Draw.Event.CREATED="draw:created";L.Draw.Event.EDITED="draw:edited";L.Draw.Event.DELETED="draw:deleted";L.Draw.Event.DRAWSTART="draw:drawstart";L.Draw.Event.DRAWSTOP="draw:drawstop";L.Draw.Event.DRAWVERTEX="draw:drawvertex";L.Draw.Event.EDITSTART="draw:editstart";L.Draw.Event.EDITMOVE="draw:editmove";L.Draw.Event.EDITRESIZE="draw:editresize";L.Draw.Event.EDITVERTEX="draw:editvertex";L.Draw.Event.EDITSTOP="draw:editstop";L.Draw.Event.DELETESTART="draw:deletestart";L.Draw.Event.DELETESTOP="draw:deletestop";
\ No newline at end of file
--- a/src/pyams_gis/resources/js/leaflet.Draw.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,183 +0,0 @@
-/**
- * Leaflet.draw assumes that you have already included the Leaflet library.
- */
-L.drawVersion = '0.4.2';
-/**
- * @class L.Draw
- * @aka Draw
- *
- *
- * To add the draw toolbar set the option drawControl: true in the map options.
- *
- * @example
- * ```js
- *      var map = L.map('map', {drawControl: true}).setView([51.505, -0.09], 13);
- *
- *      L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
- *          attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
- *      }).addTo(map);
- * ```
- *
- * ### Adding the edit toolbar
- * To use the edit toolbar you must initialise the Leaflet.draw control and manually add it to the map.
- *
- * ```js
- *      var map = L.map('map').setView([51.505, -0.09], 13);
- *
- *      L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
- *          attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
- *      }).addTo(map);
- *
- *      // FeatureGroup is to store editable layers
- *      var drawnItems = new L.FeatureGroup();
- *      map.addLayer(drawnItems);
- *
- *      var drawControl = new L.Control.Draw({
- *          edit: {
- *              featureGroup: drawnItems
- *          }
- *      });
- *      map.addControl(drawControl);
- * ```
- *
- * The key here is the featureGroup option. This tells the plugin which FeatureGroup contains the layers that
- * should be editable. The featureGroup can contain 0 or more features with geometry types Point, LineString, and Polygon.
- * Leaflet.draw does not work with multigeometry features such as MultiPoint, MultiLineString, MultiPolygon,
- * or GeometryCollection. If you need to add multigeometry features to the draw plugin, convert them to a
- * FeatureCollection of non-multigeometries (Points, LineStrings, or Polygons).
- */
-L.Draw = {};
-
-/**
- * @class L.drawLocal
- * @aka L.drawLocal
- *
- * The core toolbar class of the API — it is used to create the toolbar ui
- *
- * @example
- * ```js
- *      var modifiedDraw = L.drawLocal.extend({
- *          draw: {
- *              toolbar: {
- *                  buttons: {
- *                      polygon: 'Draw an awesome polygon'
- *                  }
- *              }
- *          }
- *      });
- * ```
- *
- * The default state for the control is the draw toolbar just below the zoom control.
- *  This will allow map users to draw vectors and markers.
- *  **Please note the edit toolbar is not enabled by default.**
- */
-L.drawLocal = {
-	// format: {
-	// 	numeric: {
-	// 		delimiters: {
-	// 			thousands: ',',
-	// 			decimal: '.'
-	// 		}
-	// 	}
-	// },
-	draw: {
-		toolbar: {
-			// #TODO: this should be reorganized where actions are nested in actions
-			// ex: actions.undo  or actions.cancel
-			actions: {
-				title: 'Cancel drawing',
-				text: 'Cancel'
-			},
-			finish: {
-				title: 'Finish drawing',
-				text: 'Finish'
-			},
-			undo: {
-				title: 'Delete last point drawn',
-				text: 'Delete last point'
-			},
-			buttons: {
-				polyline: 'Draw a polyline',
-				polygon: 'Draw a polygon',
-				rectangle: 'Draw a rectangle',
-				circle: 'Draw a circle',
-				marker: 'Draw a marker'
-			}
-		},
-		handlers: {
-			circle: {
-				tooltip: {
-					start: 'Click and drag to draw circle.'
-				},
-				radius: 'Radius'
-			},
-			marker: {
-				tooltip: {
-					start: 'Click map to place marker.'
-				}
-			},
-			polygon: {
-				tooltip: {
-					start: 'Click to start drawing shape.',
-					cont: 'Click to continue drawing shape.',
-					end: 'Click first point to close this shape.'
-				}
-			},
-			polyline: {
-				error: '<strong>Error:</strong> shape edges cannot cross!',
-				tooltip: {
-					start: 'Click to start drawing line.',
-					cont: 'Click to continue drawing line.',
-					end: 'Click last point to finish line.'
-				}
-			},
-			rectangle: {
-				tooltip: {
-					start: 'Click and drag to draw rectangle.'
-				}
-			},
-			simpleshape: {
-				tooltip: {
-					end: 'Release mouse to finish drawing.'
-				}
-			}
-		}
-	},
-	edit: {
-		toolbar: {
-			actions: {
-				save: {
-					title: 'Save changes.',
-					text: 'Save'
-				},
-				cancel: {
-					title: 'Cancel editing, discards all changes.',
-					text: 'Cancel'
-				},
-				clearAll:{
-					title: 'clear all layers.',
-					text: 'Clear All'
-				}
-			},
-			buttons: {
-				edit: 'Edit layers.',
-				editDisabled: 'No layers to edit.',
-				remove: 'Delete layers.',
-				removeDisabled: 'No layers to delete.'
-			}
-		},
-		handlers: {
-			edit: {
-				tooltip: {
-					text: 'Drag handles, or marker to edit feature.',
-					subtext: 'Click cancel to undo changes.'
-				}
-			},
-			remove: {
-				tooltip: {
-					text: 'Click on a feature to remove'
-				}
-			}
-		}
-	}
-};
--- a/src/pyams_gis/resources/js/leaflet.Draw.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-L.drawVersion="0.4.2";L.Draw={};L.drawLocal={draw:{toolbar:{actions:{title:"Cancel drawing",text:"Cancel"},finish:{title:"Finish drawing",text:"Finish"},undo:{title:"Delete last point drawn",text:"Delete last point"},buttons:{polyline:"Draw a polyline",polygon:"Draw a polygon",rectangle:"Draw a rectangle",circle:"Draw a circle",marker:"Draw a marker"}},handlers:{circle:{tooltip:{start:"Click and drag to draw circle."},radius:"Radius"},marker:{tooltip:{start:"Click map to place marker."}},polygon:{tooltip:{start:"Click to start drawing shape.",cont:"Click to continue drawing shape.",end:"Click first point to close this shape."}},polyline:{error:"<strong>Error:</strong> shape edges cannot cross!",tooltip:{start:"Click to start drawing line.",cont:"Click to continue drawing line.",end:"Click last point to finish line."}},rectangle:{tooltip:{start:"Click and drag to draw rectangle."}},simpleshape:{tooltip:{end:"Release mouse to finish drawing."}}}},edit:{toolbar:{actions:{save:{title:"Save changes.",text:"Save"},cancel:{title:"Cancel editing, discards all changes.",text:"Cancel"},clearAll:{title:"clear all layers.",text:"Clear All"}},buttons:{edit:"Edit layers.",editDisabled:"No layers to edit.",remove:"Delete layers.",removeDisabled:"No layers to delete."}},handlers:{edit:{tooltip:{text:"Drag handles, or marker to edit feature.",subtext:"Click cancel to undo changes."}},remove:{tooltip:{text:"Click on a feature to remove"}}}}};
\ No newline at end of file
--- a/src/pyams_gis/resources/js/leaflet.DrawToolbar.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-/**
- * @class L.DrawToolbar
- * @aka Toolbar
- */
-L.DrawToolbar = L.Toolbar.extend({
-
-	statics: {
-		TYPE: 'draw'
-	},
-
-	options: {
-		polyline: {},
-		polygon: {},
-		rectangle: {},
-		circle: {},
-		marker: {}
-	},
-
-	// @method initialize(): void
-	initialize: function (options) {
-		// Ensure that the options are merged correctly since L.extend is only shallow
-		for (var type in this.options) {
-			if (this.options.hasOwnProperty(type)) {
-				if (options[type]) {
-					options[type] = L.extend({}, this.options[type], options[type]);
-				}
-			}
-		}
-
-		this._toolbarClass = 'leaflet-draw-draw';
-		L.Toolbar.prototype.initialize.call(this, options);
-	},
-
-	// @method getModeHandlers(): object
-	// Get mode handlers information
-	getModeHandlers: function (map) {
-		return [
-			{
-				enabled: this.options.polyline,
-				handler: new L.Draw.Polyline(map, this.options.polyline),
-				title: L.drawLocal.draw.toolbar.buttons.polyline
-			},
-			{
-				enabled: this.options.polygon,
-				handler: new L.Draw.Polygon(map, this.options.polygon),
-				title: L.drawLocal.draw.toolbar.buttons.polygon
-			},
-			{
-				enabled: this.options.rectangle,
-				handler: new L.Draw.Rectangle(map, this.options.rectangle),
-				title: L.drawLocal.draw.toolbar.buttons.rectangle
-			},
-			{
-				enabled: this.options.circle,
-				handler: new L.Draw.Circle(map, this.options.circle),
-				title: L.drawLocal.draw.toolbar.buttons.circle
-			},
-			{
-				enabled: this.options.marker,
-				handler: new L.Draw.Marker(map, this.options.marker),
-				title: L.drawLocal.draw.toolbar.buttons.marker
-			}
-		];
-	},
-
-	// @method getActions(): object
-	// Get action information
-	getActions: function (handler) {
-		return [
-			{
-				enabled: handler.completeShape,
-				title: L.drawLocal.draw.toolbar.finish.title,
-				text: L.drawLocal.draw.toolbar.finish.text,
-				callback: handler.completeShape,
-				context: handler
-			},
-			{
-				enabled: handler.deleteLastVertex,
-				title: L.drawLocal.draw.toolbar.undo.title,
-				text: L.drawLocal.draw.toolbar.undo.text,
-				callback: handler.deleteLastVertex,
-				context: handler
-			},
-			{
-				title: L.drawLocal.draw.toolbar.actions.title,
-				text: L.drawLocal.draw.toolbar.actions.text,
-				callback: this.disable,
-				context: this
-			}
-		];
-	},
-
-	// @method setOptions(): void
-	// Sets the options to the toolbar
-	setOptions: function (options) {
-		L.setOptions(this, options);
-
-		for (var type in this._modes) {
-			if (this._modes.hasOwnProperty(type) && options.hasOwnProperty(type)) {
-				this._modes[type].handler.setOptions(options[type]);
-			}
-		}
-	}
-});
--- a/src/pyams_gis/resources/js/leaflet.DrawToolbar.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-L.DrawToolbar=L.Toolbar.extend({statics:{TYPE:"draw"},options:{polyline:{},polygon:{},rectangle:{},circle:{},marker:{}},initialize:function(a){for(var b in this.options){if(this.options.hasOwnProperty(b)){if(a[b]){a[b]=L.extend({},this.options[b],a[b])}}}this._toolbarClass="leaflet-draw-draw";L.Toolbar.prototype.initialize.call(this,a)},getModeHandlers:function(a){return[{enabled:this.options.polyline,handler:new L.Draw.Polyline(a,this.options.polyline),title:L.drawLocal.draw.toolbar.buttons.polyline},{enabled:this.options.polygon,handler:new L.Draw.Polygon(a,this.options.polygon),title:L.drawLocal.draw.toolbar.buttons.polygon},{enabled:this.options.rectangle,handler:new L.Draw.Rectangle(a,this.options.rectangle),title:L.drawLocal.draw.toolbar.buttons.rectangle},{enabled:this.options.circle,handler:new L.Draw.Circle(a,this.options.circle),title:L.drawLocal.draw.toolbar.buttons.circle},{enabled:this.options.marker,handler:new L.Draw.Marker(a,this.options.marker),title:L.drawLocal.draw.toolbar.buttons.marker}]},getActions:function(a){return[{enabled:a.completeShape,title:L.drawLocal.draw.toolbar.finish.title,text:L.drawLocal.draw.toolbar.finish.text,callback:a.completeShape,context:a},{enabled:a.deleteLastVertex,title:L.drawLocal.draw.toolbar.undo.title,text:L.drawLocal.draw.toolbar.undo.text,callback:a.deleteLastVertex,context:a},{title:L.drawLocal.draw.toolbar.actions.title,text:L.drawLocal.draw.toolbar.actions.text,callback:this.disable,context:this}]},setOptions:function(a){L.setOptions(this,a);for(var b in this._modes){if(this._modes.hasOwnProperty(b)&&a.hasOwnProperty(b)){this._modes[b].handler.setOptions(a[b])}}}});
\ No newline at end of file
--- a/src/pyams_gis/resources/js/pyams_gis.js	Wed Jan 27 15:38:26 2021 +0100
+++ b/src/pyams_gis/resources/js/pyams_gis.js	Wed Jan 27 15:39:14 2021 +0100
@@ -44,64 +44,91 @@
 
 		init: function(context, options, callback) {
 			var map = context;
-			MyAMS.ajax.check(globals.L,
-							 '/--static--/pyams_gis/js/leaflet-1.0.3' + MyAMS.devext + '.js',
-							 function(first_load) {
-								if (first_load) {
-									L = globals.L;
-									L.Control.Layers.prototype._addItem = PyAMS_GIS._layersControlAddItem;
+			MyAMS.ajax.check([
+					globals.L
+				], [
+					'/--static--/pyams_gis/js/leaflet-1.7.1' + MyAMS.devext + '.js'
+				], function(first_load) {
+					var required = [];
+					if (first_load) {
+						L = globals.L;
+						L.Control.Layers.prototype._addItem = PyAMS_GIS._layersControlAddItem;
+						required.push(MyAMS.getScript('/--static--/pyams_gis/js/leaflet-gesture-handling-1.2.1' + MyAMS.devext + '.js'));
+						MyAMS.getCSS('/--static--/pyams_gis/css/leaflet-1.7.1' + MyAMS.devext + '.css', 'leaflet');
+						MyAMS.getCSS('/--static--/pyams_gis/css/leaflet-gesture-handling-1.2.1' + MyAMS.devext + '.css',
+							'leaflet-gesture-handling');
+					}
+					$.when.apply($, required).then(function() {
+
+						function createMap(config) {
+							var settings = {
+								preferCanvas: data.mapLeafletPreferCanvas || false,
+								attributionControl: data.mapLeafletAttributionControl === undefined ?
+									config.attributionControl :
+									data.mapLeafletAttributionControl,
+								zoomControl: data.mapLeafletZoomControl === undefined ?
+									config.zoomControl :
+									data.mapLeafletZoomControl,
+								crs: data.mapLeafletCrs || MyAMS.getObject(config.crs) || globals.L.CRS.EPSG3857,
+								center: data.mapLeafletCenter || config.center,
+								zoom: data.mapLeafletZoom || config.zoom,
+								gestureHandling: true
+							};
+							settings = $.extend({}, settings, options);
+							map.trigger('map.init', [map, settings, config]);
+							var leafmap = L.map(map.attr('id'), settings);
+							var layersConfig = [];
+							if (config.layers) {
+								for (var idx = 0; idx < config.layers.length; idx++) {
+									var layerConfig = config.layers[idx];
+									map.trigger('map.layer.init', [map, layerConfig]);
+									layersConfig.push(PyAMS_GIS.getLayer(map, leafmap, layerConfig));
 								}
-								MyAMS.getCSS('/--static--/pyams_gis/css/leaflet-1.0.3' + MyAMS.devext + '.css',
-											 'leaflet', function() {
-									MyAMS.ajax.post('get-map-configuration.json', {}, function(config) {
-										var data = map.data();
-										var settings = {
-											preferCanvas: data.mapLeafletPreferCanvas || false,
-											attributionControl: data.mapLeafletAttributionControl === undefined ?
-												config.attributionControl :
-												data.mapLeafletAttributionControl,
-											zoomControl: data.mapLeafletZoomControl === undefined ?
-												config.zoomControl :
-												data.mapLeafletZoomControl,
-											crs: data.mapLeafletCrs || MyAMS.getObject(config.crs) || globals.L.CRS.EPSG3857,
-											center: data.mapLeafletCenter || config.center,
-											zoom: data.mapLeafletZoom || config.zoom
-										};
-										settings = $.extend({}, settings, options);
-										map.trigger('map.init', [map, settings, config]);
-										var leafmap = L.map(map.attr('id'), settings);
-										if (config.layers) {
-											for (var index = 0; index < config.layers.length; index++) {
-												var layerConfig = config.layers[index];
-												map.trigger('map.layer.init', [map, layerConfig]);
-												PyAMS_GIS.getLayer(layerConfig).addTo(leafmap);
-											}
-										} else {
-											L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
-												maxZoom: 19,
-												id: 'osm',
-												attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
-											}).addTo(leafmap);
-										}
-										if (config.zoomControl && (data.mapLeafletHideZoomControl !== true)) {
-											L.control.scale().addTo(leafmap);
-										}
-										if (config.bounds) {
-											leafmap.fitBounds(config.bounds);
-										}
-										map.data('leafmap', leafmap);
-										map.data('leafmap.config', config);
-										map.trigger('map.finishing', [map, leafmap]);
-										if (callback) {
-											callback(leafmap, config);
-										}
-										map.trigger('map.finished', [map, leafmap]);
-									});
-								});
-							 });
+							} else {
+								layersConfig.push(L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
+									maxZoom: 19,
+									id: 'osm',
+									attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
+								}));
+							}
+							$.when.apply($, layersConfig).then(function(...layers) {
+								for (var idx=0; idx < layers.length; idx++) {
+									layers[idx].addTo(leafmap);
+								}
+								if (config.zoomControl && (data.mapLeafletHideZoomControl !== true)) {
+									L.control.scale().addTo(leafmap);
+								}
+								if (config.center) {
+									leafmap.setView(new L.LatLng(config.center.lat, config.center.lon),
+													config.zoom || 13);
+								} else if (config.bounds) {
+									leafmap.fitBounds(config.bounds);
+								}
+								map.data('leafmap', leafmap);
+								map.data('leafmap.config', config);
+								map.trigger('map.finishing', [map, leafmap, config]);
+								if (callback) {
+									callback(leafmap, config);
+								}
+								map.trigger('map.finished', [map, leafmap, config]);
+							});
+						}
+
+						var data = map.data(),
+							config = data.mapConfiguration;
+						if (config) {
+							createMap(config);
+						} else {
+							MyAMS.ajax.post(data.mapConfigurationUrl || 'get-map-configuration.json', {}, function(config) {
+								createMap(config);
+							});
+						}
+					});
+				}
+			);
 		},
 
-		getLayer: function(layer) {
+		getLayer: function(map, leafmap, layer) {
 			var factory = MyAMS.getObject(layer.factory);
 			if (factory !== undefined) {
 				delete layer.factory;
@@ -120,33 +147,49 @@
 				if (deferred.length > 0) {
 					$.when.apply($, deferred);
 				}
-				return factory(layer);
+				return factory(map, leafmap, layer);
 			}
 		},
 
 		factory: {
-			TileLayer: function(layer) {
+			GeoJSON: function(map, leafmap, layer) {
+				var url = layer.url;
+				delete layer.url;
+				var result = L.geoJSON(null, layer);
+				map.on('map.finished', function(evt, map, leafmap, config) {
+					$.get(url, function(data) {
+						result.addData(data.geometry, {
+							style: layer.style
+						});
+						if (config.fitLayer === layer.name) {
+							leafmap.fitBounds(result.getBounds());
+						}
+					});
+				});
+				return result;
+			},
+			TileLayer: function(map, leafmap, layer) {
 				var url = layer.url;
 				delete layer.url;
 				return L.tileLayer(url, layer);
 			},
-			WMS: function(layer) {
+			WMS: function(map, leafmap, layer) {
 				var url = layer.url;
 				delete layer.url;
 				return L.tileLayer.wms(url, layer);
 			},
 			Geoportal: {
-				WMS: function(layer) {
+				WMS: function(map, leafmap, layer) {
 					MyAMS.getCSS('/--static--/pyams_gis/css/leaflet-gp-3.0.2' + MyAMS.devext + '.css', 'geoportal');
 					return L.geoportalLayer.WMS(layer);
 				}
 			},
 			ESRI: {
-				Feature: function(layer) {
+				Feature: function(map, leafmap, layer) {
 					return L.esri.featureLayer(layer);
 				}
 			},
-			Google: function(layer) {
+			Google: function(map, leafmap, layer) {
 				var apiKey = layer.apiKey;
 				delete layer.apiKey;
 				if (MyAMS.getObject('window.google.maps') === undefined) {
@@ -176,6 +219,113 @@
 		},
 
 		/**
+		 * Init markers layer
+		 */
+		markers: {
+
+			init: function(leafmap, markers, config) {
+
+				MyAMS.ajax.check([
+					L.MarkerClusterGroup
+				], [
+					'/--static--/pyams_gis/js/leaflet-markercluster-1.4.1' + MyAMS.devext + '.js'
+				], function(firstLoad) {
+
+					if (firstLoad) {
+						MyAMS.getCSS('/--static--/pyams_gis/css/leaflet-markercluster-1.4.1' + MyAMS.devext + '.css',
+							'leaflet-markercluster');
+						MyAMS.getCSS('/--static--/pyams_gis/css/leaflet-markercluster-default-1.4.1' + MyAMS.devext + '.css',
+							'leaflet-markercluster-default');
+					}
+
+					// click marker
+					var clickMarker = function(e) {
+						window.location.href = this.options.clickURL;
+					}
+					// show tooltip
+					var hoverMarker = function(e) {
+						this.openTooltip();
+					}
+					// hide tooltip
+					var leaveMarker = function(e) {
+						this.closeTooltip();
+					}
+
+					// create custom icon
+					var markerIcon = L.icon({
+						iconUrl: markers.icon.url,
+						iconSize: markers.icon.size,
+						iconAnchor: markers.icon.anchor
+					});
+					// customize cluster icon
+					var markersClusterCustom = new L.MarkerClusterGroup({
+						iconCreateFunction: function(cluster) {
+							return L.divIcon({
+								html: cluster.getChildCount(),
+								className: markers.clusterClass || 'map-cluster',
+								iconSize: null
+							});
+						}
+					});
+
+					// object to save markers
+					var icons = {};
+
+					// create markers
+					for (var i = 0; i < markers.markers.length; i++) {
+						var markerConfig = markers.markers[i];
+						var latLng = new L.LatLng(markerConfig.point.y, markerConfig.point.x);
+						var marker = new L.Marker(latLng, {
+							icon: markerIcon,
+							clickURL: markerConfig.href,
+							markerId: markerConfig.id,
+							alt: markerConfig.id
+						});
+						if (markerConfig.href) {
+							marker.addEventListener('click', clickMarker);
+						}
+						icons[markerConfig.id] = marker;
+						// bind tooltip with title content
+						var label;
+						if (markerConfig.img) {
+							label = '<div>' +
+								'<div class="marker__label p-2"> ' + markerConfig.label + '</div>' +
+								'<div class="text-center">' +
+									'<img src="' + markerConfig.img.src + '" width="' + markerConfig.img.w + '" height="' + markerConfig.img.h + '" alt="" />' +
+								'</div>' +
+							'</div>';
+						} else {
+							label = markerConfig.label;
+						}
+						if (label) {
+							var className = markers.tooltipClass || 'map-tooltip';
+							if (markerConfig.img) {
+								className += ' p-0';
+							}
+							icons[markerConfig.id].bindTooltip(label, {
+								direction: 'top',
+								offset: [0, -markerIcon.options.iconSize[1]],
+								opacity: 1,
+								className: className
+							});
+							icons[markerConfig.id].addEventListener('mouseover', hoverMarker);
+							icons[markerConfig.id].addEventListener('mouseout', leaveMarker);
+						}
+						markersClusterCustom.addLayer(icons[markerConfig.id]);
+					}
+					leafmap.addLayer(markersClusterCustom);
+					if (config.adjust === 'auto') {
+						leafmap.fitBounds(markersClusterCustom.getBounds());
+						if (markers.markers.length === 1) {
+							debugger
+							leafmap.setZoom(config.zoom);
+						}
+					}
+				});
+			}
+		},
+
+		/**
 		 * Single position marker management
 		 */
 		position: {
@@ -190,7 +340,7 @@
 						var icon = L.icon({
 							iconUrl: '/--static--/pyams_gis/img/marker-icon.png',
 							iconSize: [25, 41],
-							iconAnchor: [13, 40]
+							iconAnchor: [12, 39]
 						});
 						var marker = L.marker();
 						marker.setIcon(icon);
@@ -383,13 +533,15 @@
 						L.Draw = L.Draw || {};
 						L.Edit = L.Edit || {};
 						MyAMS.ajax.check([L.Draw, L.Draw.Event, L.Map.TouchExtend, L.Edit.SimpleShape],
-										 ['/--static--/pyams_gis/js/leaflet.Draw' + MyAMS.devext + '.js',
-										  '/--static--/pyams_gis/js/leaflet.Draw.Event' + MyAMS.devext + '.js',
-										  '/--static--/pyams_gis/js/TouchEvents' + MyAMS.devext + '.js',
-										  '/--static--/pyams_gis/js/Edit.SimpleShape' + MyAMS.devext + '.js'],
-										 function() {
+										[
+											'/--static--/pyams_gis/js/Draw/Leaflet.draw' + MyAMS.devext + '.js',
+											'/--static--/pyams_gis/js/Draw/Leaflet.Draw.Event' + MyAMS.devext + '.js',
+											'/--static--/pyams_gis/js/Draw/ext/TouchEvents' + MyAMS.devext + '.js',
+											'/--static--/pyams_gis/js/Draw/edit/handler/Edit.SimpleShape' + MyAMS.devext + '.js'
+										],
+										function() {
 											MyAMS.ajax.check(L.Edit.Rectangle,
-															 '/--static--/pyams_gis/js/Edit.Rectangle' + MyAMS.devext + '.js',
+															 '/--static--/pyams_gis/js/Draw/edit/handler/Edit.Rectangle' + MyAMS.devext + '.js',
 															 function () {
 
 																function initRectangle(p1, p2) {
--- a/src/pyams_gis/resources/js/pyams_gis.min.js	Wed Jan 27 15:38:26 2021 +0100
+++ b/src/pyams_gis/resources/js/pyams_gis.min.js	Wed Jan 27 15:39:14 2021 +0100
@@ -1,1 +1,1 @@
-!function(a,e){"use strict";var t,n=e.MyAMS,i={RPC_ENDPOINT:"/api/gis/json",WGS_SRID:4326,_layersControlAddItem:function(e){var n,i,r=a("<div></div>").addClass("inline-group"),l=a("<label></label>").addClass(e.overlay?"checkbox":"radio"),o=a("<i></i>"),s=this._map.hasLayer(e.layer);e.overlay?((n=document.createElement("input")).type="checkbox",n.className="leaflet-control-layers-selector",n.defaultChecked=s):n=this._createRadioElement("leaflet-base-layers",s),n.layerId=t.stamp(e.layer),a(n).addClass(e.overlay?"checkbox":"radio"),t.DomEvent.on(n,"click",this._onInputClick,this),i=a("<span></span>").text(" "+e.name),l.append(n),l.append(o),l.append(i),r.append(l);var d=e.overlay?this._overlaysList:this._baseLayersList;return a(d).append(r),r},init:function(r,l,o){var s=r;n.ajax.check(e.L,"/--static--/pyams_gis/js/leaflet-1.0.3"+n.devext+".js",function(r){r&&((t=e.L).Control.Layers.prototype._addItem=i._layersControlAddItem),n.getCSS("/--static--/pyams_gis/css/leaflet-1.0.3"+n.devext+".css","leaflet",function(){n.ajax.post("get-map-configuration.json",{},function(r){var d=s.data(),p={preferCanvas:d.mapLeafletPreferCanvas||!1,attributionControl:void 0===d.mapLeafletAttributionControl?r.attributionControl:d.mapLeafletAttributionControl,zoomControl:void 0===d.mapLeafletZoomControl?r.zoomControl:d.mapLeafletZoomControl,crs:d.mapLeafletCrs||n.getObject(r.crs)||e.L.CRS.EPSG3857,center:d.mapLeafletCenter||r.center,zoom:d.mapLeafletZoom||r.zoom};p=a.extend({},p,l),s.trigger("map.init",[s,p,r]);var c=t.map(s.attr("id"),p);if(r.layers)for(var m=0;m<r.layers.length;m++){var u=r.layers[m];s.trigger("map.layer.init",[s,u]),i.getLayer(u).addTo(c)}else t.tileLayer("http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{maxZoom:19,id:"osm",attribution:'&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'}).addTo(c);r.zoomControl&&!0!==d.mapLeafletHideZoomControl&&t.control.scale().addTo(c),r.bounds&&c.fitBounds(r.bounds),s.data("leafmap",c),s.data("leafmap.config",r),s.trigger("map.finishing",[s,c]),o&&o(c,r),s.trigger("map.finished",[s,c])})})})},getLayer:function(e){var t=n.getObject(e.factory);if(void 0!==t){delete e.factory;var i=[];if(e.dependsOn){for(var r in e.dependsOn)e.dependsOn.hasOwnProperty(r)&&void 0===n.getObject(r)&&i.push(n.getScript(e.dependsOn[r]));delete e.dependsOn}return i.length>0&&a.when.apply(a,i),t(e)}},factory:{TileLayer:function(a){var e=a.url;return delete a.url,t.tileLayer(e,a)},WMS:function(a){var e=a.url;return delete a.url,t.tileLayer.wms(e,a)},Geoportal:{WMS:function(a){return n.getCSS("/--static--/pyams_gis/css/leaflet-gp-3.0.2"+n.devext+".css","geoportal"),t.geoportalLayer.WMS(a)}},ESRI:{Feature:function(a){return t.esri.featureLayer(a)}},Google:function(e){var i=e.apiKey;if(delete e.apiKey,void 0===n.getObject("window.google.maps")){var r=n.getScript("https://maps.googleapis.com/maps/api/js?key="+i);a.when.apply(a,[r])}return t.gridLayer.googleMutant(e)}},callJSON:function(e,t,r){n.ajax.check(a.jsonRPC,n.baseURL+"ext/jquery-jsonrpc"+n.devext+".js",function(){a.jsonRPC.withOptions({endPoint:i.RPC_ENDPOINT,cache:!1},function(){a.jsonRPC.request(e,{id:(new Date).getTime(),params:t,success:r,error:n.error.show})})})},position:{init:function(){var e=a(".map",a(this));void 0===e.data("leafmap")&&(e.css("height",a(window).height()-200),i.init(e,{},function(n,r){var l=e.data(),o=t.icon({iconUrl:"/--static--/pyams_gis/img/marker-icon.png",iconSize:[25,41],iconAnchor:[13,40]}),s=t.marker();s.setIcon(o);var d=l.mapLeafletFieldname,p=a('input[name="'+d+'.widgets.longitude"]'),c=a('input[name="'+d+'.widgets.latitude"]');if(p.val()&&c.val()){var m=a('select[name="'+d+'.widgets.projection:list"]'),u={point:{longitude:parseFloat(p.val()),latitude:parseFloat(c.val())},from_srid:m.val()||i.WGS_SRID,to_srid:i.WGS_SRID};i.callJSON("transformPoint",u,function(a){if(!a.error){var e=a.result.point;s.setLatLng({lon:e.longitude,lat:e.latitude}),s.addTo(n),n.setView(s.getLatLng(),r.zoom||13)}})}else s.setLatLng([-90,0]),s.addTo(n);e.data("marker",s),n.on("click",i.position.onClick)}))},onClick:function(e){var t=e.target.getContainer(),n=a(t).data(),r=n.marker,l=e.latlng;r.setLatLng(l);var o=n.mapLeafletFieldname,s=a('select[name="'+o+'.widgets.projection:list"]'),d={point:{longitude:l.lng,latitude:l.lat},from_srid:i.WGS_SRID,to_srid:s.val()};i.callJSON("transformPoint",d,function(e){if(!e.error){var n=e.result.point;a('input[name="'+o+'.widgets.longitude"]').val(n.longitude),a('input[name="'+o+'.widgets.latitude"]').val(n.latitude),a(t).trigger("marker.changed",[t,n])}})},changedCoordinate:function(){var e=a(this),t=a(".map",e.parents("fieldset:first"));if(t.data("marker")){var n=t.data("map-leaflet-fieldname"),r=a('input[name="'+n+'.widgets.longitude"]'),l=a('input[name="'+n+'.widgets.latitude"]');if(r.val()&&l.val()){var o=a('select[name="'+n+'.widgets.projection:list"]'),s={point:{longitude:parseFloat(r.val()),latitude:parseFloat(l.val())},from_srid:o.val(),to_srid:i.WGS_SRID};i.callJSON("transformPoint",s,function(a){if(!a.error){var e=a.result.point;t.data("marker").setLatLng({lon:e.longitude,lat:e.latitude})}})}}},changedProjection:function(e){var t=a(this),n=a(".map",t.parents("fieldset:first")).data("map-leaflet-fieldname"),r=a('input[name="'+n+'.widgets.longitude"]'),l=a('input[name="'+n+'.widgets.latitude"]');if(e.removed){var o=e.removed.id,s=e.added.id;if(o!==s&&r.val()&&l.val()){var d={point:{longitude:parseFloat(r.val()),latitude:parseFloat(l.val())},from_srid:o,to_srid:s};i.callJSON("transformPoint",d,function(a){if(!a.error){var e=a.result.point;r.val(e.longitude),l.val(e.latitude)}})}}else i.position.changedCoordinate.apply(r)},clear:function(e){var t=a(this).parents("fieldset:first");a("input",t).val(null);var n=a(".map",t),i=n.data("marker");if(i){i.setLatLng([-90,0]);var r=n.data("leafmap"),l=n.data("leafmap.config");if(l.bounds)r.fitBounds(l.bounds);else{var o=n.data();r.setView(o.mapLeafletCenter||l.center,l.zoom||13)}}n.trigger("marker.cleared.position",[n])},moveMarkerTo:function(e,t,n){var r=e.data("map-leaflet-fieldname");a('input[name="'+r+'.widgets.longitude"]').val(t.lon),a('input[name="'+r+'.widgets.latitude"]').val(t.lat);var l={point:{longitude:t.lon,latitude:t.lat},from_srid:n,to_srid:4326};i.callJSON("transformPoint",l,function(a){if(!a.error){var n=a.result.point;e.data("marker").setLatLng({lon:n.longitude,lat:n.latitude}),e.data("leafmap").setView(t)}})}},area:{init:function(){var e=a(".map",a(this));void 0===e.data("leafmap")&&(e.css("height",a(window).height()-200),i.init(e,{},function(r){t.Draw=t.Draw||{},t.Edit=t.Edit||{},n.ajax.check([t.Draw,t.Draw.Event,t.Map.TouchExtend,t.Edit.SimpleShape],["/--static--/pyams_gis/js/leaflet.Draw"+n.devext+".js","/--static--/pyams_gis/js/leaflet.Draw.Event"+n.devext+".js","/--static--/pyams_gis/js/TouchEvents"+n.devext+".js","/--static--/pyams_gis/js/Edit.SimpleShape"+n.devext+".js"],function(){n.ajax.check(t.Edit.Rectangle,"/--static--/pyams_gis/js/Edit.Rectangle"+n.devext+".js",function(){function n(a,n){var l=new t.FeatureGroup;s=t.rectangle([a,n]),l.addLayer(s),r.addLayer(l),r.fitBounds(s.getBounds()),s.editing.enable(),e.data("area",s),r.on(t.Draw.Event.EDITMOVE,i.area.changedArea),r.on(t.Draw.Event.EDITRESIZE,i.area.changedArea),r.on(t.Draw.Event.EDITVERTEX,i.area.changedArea)}var l,o,s,d=e.data().mapLeafletFieldname,p=a('input[name="'+d+'.widgets.x1"]'),c=a('input[name="'+d+'.widgets.y1"]'),m=a('input[name="'+d+'.widgets.x2"]'),u=a('input[name="'+d+'.widgets.y2"]');if(p.val()&&c.val()&&m.val()&&u.val()){var g=a('select[name="'+d+'.widgets.projection:list"]'),f={area:{x1:parseFloat(p.val()),y1:parseFloat(c.val()),x2:parseFloat(m.val()),y2:parseFloat(u.val())},from_srid:g.val(),to_srid:i.WGS_SRID};i.callJSON("transformArea",f,function(a){if(!a.error){var e=a.result.area;l=t.latLng({lon:e.x1,lat:e.y1}),o=t.latLng({lon:e.x2,lat:e.y2}),n(l,o)}})}else{var v=e.data("leafmap.config");v.bounds?(l=t.latLng(v.bounds[0]),o=t.latLng(v.bounds[1])):(l=t.latLng({lon:-168,lat:-56.37}),o=t.latLng({lon:191.25,lat:83.72})),n(l,o)}})})}))},last_event:null,changedArea:function(e){i.area.last_event=e,setTimeout(function(){if(e===i.area.last_event){var t=e.target.getContainer(),n=a(t).data(),r=n.area.getBounds(),l=n.mapLeafletFieldname,o=a('select[name="'+l+'.widgets.projection:list"]').val(),s={area:{x1:r.getWest(),y1:r.getSouth(),x2:r.getEast(),y2:r.getNorth()},from_srid:i.WGS_SRID,to_srid:o};i.callJSON("transformArea",s,function(e){if(!e.error){var t=e.result.area;a('input[name="'+l+'.widgets.x1"]').val(t.x1),a('input[name="'+l+'.widgets.y1"]').val(t.y1),a('input[name="'+l+'.widgets.x2"]').val(t.x2),a('input[name="'+l+'.widgets.y2"]').val(t.y2)}})}},100)},changedCoordinate:function(){var e=a(this),n=a(".map",e.parents("fieldset:first"));if(n.data("area")){var r=n.data("map-leaflet-fieldname"),l=a('input[name="'+r+'.widgets.x1"]'),o=a('input[name="'+r+'.widgets.y1"]'),s=a('input[name="'+r+'.widgets.x2"]'),d=a('input[name="'+r+'.widgets.y2"]');if(l.val()&&o.val()&&s.val()&&d.val()){var p=a('select[name="'+r+'.widgets.projection:list"]'),c={area:{x1:parseFloat(l.val()),y1:parseFloat(o.val()),x2:parseFloat(s.val()),y2:parseFloat(d.val())},from_srid:p.val(),to_srid:4326};i.callJSON("transformArea",c,function(a){if(!a.error){var e=a.result.area,i=n.data("area");i.editing.disable(),i.setBounds([t.latLng({lon:e.x1,lat:e.y1}),t.latLng({lon:e.x2,lat:e.y2})]),i.editing.enable()}})}}},changedProjection:function(e){var t=a(this),n=a(".map",t.parents("fieldset:first")).data("map-leaflet-fieldname"),r=a('input[name="'+n+'.widgets.x1"]'),l=a('input[name="'+n+'.widgets.y1"]'),o=a('input[name="'+n+'.widgets.x2"]'),s=a('input[name="'+n+'.widgets.y2"]');if(e.removed){var d=e.removed.id,p=e.added.id;if(d!==p&&r.val()&&l.val()&&o.val()&&s.val()){var c={area:{x1:parseFloat(r.val()),y1:parseFloat(l.val()),x2:parseFloat(o.val()),y2:parseFloat(s.val())},from_srid:d,to_srid:p};i.callJSON("transformArea",c,function(a){if(!a.error){var e=a.result.area;r.val(e.x1),l.val(e.y1),o.val(e.x2),s.val(e.y2)}})}}else i.area.changedCoordinate.apply(r)},clear:function(e){var t=a(this).parents("fieldset:first");a("input",t).val(null);var n=a(".map",t);n.trigger("marker.cleared.area",[n])}}};e.PyAMS_GIS=i}(jQuery,this);
+!function(e,a){"use strict";var t,i=a.MyAMS,n={RPC_ENDPOINT:"/api/gis/json",WGS_SRID:4326,_layersControlAddItem:function(a){var i,n,r=e("<div></div>").addClass("inline-group"),o=e("<label></label>").addClass(a.overlay?"checkbox":"radio"),l=e("<i></i>"),s=this._map.hasLayer(a.layer);a.overlay?((i=document.createElement("input")).type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=s):i=this._createRadioElement("leaflet-base-layers",s),i.layerId=t.stamp(a.layer),e(i).addClass(a.overlay?"checkbox":"radio"),t.DomEvent.on(i,"click",this._onInputClick,this),n=e("<span></span>").text(" "+a.name),o.append(i),o.append(l),o.append(n),r.append(o);var d=a.overlay?this._overlaysList:this._baseLayersList;return e(d).append(r),r},init:function(r,o,l){var s=r;i.ajax.check([a.L],["/--static--/pyams_gis/js/leaflet-1.7.1"+i.devext+".js"],(function(r){var d=[];r&&((t=a.L).Control.Layers.prototype._addItem=n._layersControlAddItem,d.push(i.getScript("/--static--/pyams_gis/js/leaflet-gesture-handling-1.2.1"+i.devext+".js")),i.getCSS("/--static--/pyams_gis/css/leaflet-1.7.1"+i.devext+".css","leaflet"),i.getCSS("/--static--/pyams_gis/css/leaflet-gesture-handling-1.2.1"+i.devext+".css","leaflet-gesture-handling")),e.when.apply(e,d).then((function(){function r(r){var c={preferCanvas:d.mapLeafletPreferCanvas||!1,attributionControl:void 0===d.mapLeafletAttributionControl?r.attributionControl:d.mapLeafletAttributionControl,zoomControl:void 0===d.mapLeafletZoomControl?r.zoomControl:d.mapLeafletZoomControl,crs:d.mapLeafletCrs||i.getObject(r.crs)||a.L.CRS.EPSG3857,center:d.mapLeafletCenter||r.center,zoom:d.mapLeafletZoom||r.zoom,gestureHandling:!0};c=e.extend({},c,o),s.trigger("map.init",[s,c,r]);var p=t.map(s.attr("id"),c),u=[];if(r.layers)for(var m=0;m<r.layers.length;m++){var g=r.layers[m];s.trigger("map.layer.init",[s,g]),u.push(n.getLayer(s,p,g))}else u.push(t.tileLayer("http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{maxZoom:19,id:"osm",attribution:'&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'}));e.when.apply(e,u).then((function(...e){for(var a=0;a<e.length;a++)e[a].addTo(p);r.zoomControl&&!0!==d.mapLeafletHideZoomControl&&t.control.scale().addTo(p),r.center?p.setView(new t.LatLng(r.center.lat,r.center.lon),r.zoom||13):r.bounds&&p.fitBounds(r.bounds),s.data("leafmap",p),s.data("leafmap.config",r),s.trigger("map.finishing",[s,p,r]),l&&l(p,r),s.trigger("map.finished",[s,p,r])}))}var d=s.data(),c=d.mapConfiguration;c?r(c):i.ajax.post(d.mapConfigurationUrl||"get-map-configuration.json",{},(function(e){r(e)}))}))}))},getLayer:function(a,t,n){var r=i.getObject(n.factory);if(void 0!==r){delete n.factory;var o=[];if(n.dependsOn){for(var l in n.dependsOn)n.dependsOn.hasOwnProperty(l)&&void 0===i.getObject(l)&&o.push(i.getScript(n.dependsOn[l]));delete n.dependsOn}return o.length>0&&e.when.apply(e,o),r(a,t,n)}},factory:{GeoJSON:function(a,i,n){var r=n.url;delete n.url;var o=t.geoJSON(null,n);return a.on("map.finished",(function(a,t,i,l){e.get(r,(function(e){o.addData(e.geometry,{style:n.style}),l.fitLayer===n.name&&i.fitBounds(o.getBounds())}))})),o},TileLayer:function(e,a,i){var n=i.url;return delete i.url,t.tileLayer(n,i)},WMS:function(e,a,i){var n=i.url;return delete i.url,t.tileLayer.wms(n,i)},Geoportal:{WMS:function(e,a,n){return i.getCSS("/--static--/pyams_gis/css/leaflet-gp-3.0.2"+i.devext+".css","geoportal"),t.geoportalLayer.WMS(n)}},ESRI:{Feature:function(e,a,i){return t.esri.featureLayer(i)}},Google:function(a,n,r){var o=r.apiKey;if(delete r.apiKey,void 0===i.getObject("window.google.maps")){var l=i.getScript("https://maps.googleapis.com/maps/api/js?key="+o);e.when.apply(e,[l])}return t.gridLayer.googleMutant(r)}},callJSON:function(a,t,r){i.ajax.check(e.jsonRPC,i.baseURL+"ext/jquery-jsonrpc"+i.devext+".js",(function(){e.jsonRPC.withOptions({endPoint:n.RPC_ENDPOINT,cache:!1},(function(){e.jsonRPC.request(a,{id:(new Date).getTime(),params:t,success:r,error:i.error.show})}))}))},markers:{init:function(e,a,n){i.ajax.check([t.MarkerClusterGroup],["/--static--/pyams_gis/js/leaflet-markercluster-1.4.1"+i.devext+".js"],(function(r){r&&(i.getCSS("/--static--/pyams_gis/css/leaflet-markercluster-1.4.1"+i.devext+".css","leaflet-markercluster"),i.getCSS("/--static--/pyams_gis/css/leaflet-markercluster-default-1.4.1"+i.devext+".css","leaflet-markercluster-default"));for(var o=function(e){window.location.href=this.options.clickURL},l=function(e){this.openTooltip()},s=function(e){this.closeTooltip()},d=t.icon({iconUrl:a.icon.url,iconSize:a.icon.size,iconAnchor:a.icon.anchor}),c=new t.MarkerClusterGroup({iconCreateFunction:function(e){return t.divIcon({html:e.getChildCount(),className:a.clusterClass||"map-cluster",iconSize:null})}}),p={},u=0;u<a.markers.length;u++){var m,g=a.markers[u],f=new t.LatLng(g.point.y,g.point.x),v=new t.Marker(f,{icon:d,clickURL:g.href,markerId:g.id,alt:g.id});if(g.href&&v.addEventListener("click",o),p[g.id]=v,m=g.img?'<div><div class="marker__label p-2"> '+g.label+'</div><div class="text-center"><img src="'+g.img.src+'" width="'+g.img.w+'" height="'+g.img.h+'" alt="" /></div></div>':g.label){var y=a.tooltipClass||"map-tooltip";g.img&&(y+=" p-0"),p[g.id].bindTooltip(m,{direction:"top",offset:[0,-d.options.iconSize[1]],opacity:1,className:y}),p[g.id].addEventListener("mouseover",l),p[g.id].addEventListener("mouseout",s)}c.addLayer(p[g.id])}e.addLayer(c),"auto"===n.adjust&&(e.fitBounds(c.getBounds()),1===a.markers.length&&e.setZoom(n.zoom))}))}},position:{init:function(){var a=e(".map",e(this));void 0===a.data("leafmap")&&(a.css("height",e(window).height()-200),n.init(a,{},(function(i,r){var o=a.data(),l=t.icon({iconUrl:"/--static--/pyams_gis/img/marker-icon.png",iconSize:[25,41],iconAnchor:[12,39]}),s=t.marker();s.setIcon(l);var d=o.mapLeafletFieldname,c=e('input[name="'+d+'.widgets.longitude"]'),p=e('input[name="'+d+'.widgets.latitude"]');if(c.val()&&p.val()){var u=e('select[name="'+d+'.widgets.projection:list"]'),m={point:{longitude:parseFloat(c.val()),latitude:parseFloat(p.val())},from_srid:u.val()||n.WGS_SRID,to_srid:n.WGS_SRID};n.callJSON("transformPoint",m,(function(e){if(!e.error){var a=e.result.point;s.setLatLng({lon:a.longitude,lat:a.latitude}),s.addTo(i),i.setView(s.getLatLng(),r.zoom||13)}}))}else s.setLatLng([-90,0]),s.addTo(i);a.data("marker",s),i.on("click",n.position.onClick)})))},onClick:function(a){var t=a.target.getContainer(),i=e(t).data(),r=i.marker,o=a.latlng;r.setLatLng(o);var l=i.mapLeafletFieldname,s=e('select[name="'+l+'.widgets.projection:list"]'),d={point:{longitude:o.lng,latitude:o.lat},from_srid:n.WGS_SRID,to_srid:s.val()};n.callJSON("transformPoint",d,(function(a){if(!a.error){var i=a.result.point;e('input[name="'+l+'.widgets.longitude"]').val(i.longitude),e('input[name="'+l+'.widgets.latitude"]').val(i.latitude),e(t).trigger("marker.changed",[t,i])}}))},changedCoordinate:function(){var a=e(this),t=e(".map",a.parents("fieldset:first"));if(t.data("marker")){var i=t.data("map-leaflet-fieldname"),r=e('input[name="'+i+'.widgets.longitude"]'),o=e('input[name="'+i+'.widgets.latitude"]');if(r.val()&&o.val()){var l=e('select[name="'+i+'.widgets.projection:list"]'),s={point:{longitude:parseFloat(r.val()),latitude:parseFloat(o.val())},from_srid:l.val(),to_srid:n.WGS_SRID};n.callJSON("transformPoint",s,(function(e){if(!e.error){var a=e.result.point;t.data("marker").setLatLng({lon:a.longitude,lat:a.latitude})}}))}}},changedProjection:function(a){var t=e(this),i=e(".map",t.parents("fieldset:first")).data("map-leaflet-fieldname"),r=e('input[name="'+i+'.widgets.longitude"]'),o=e('input[name="'+i+'.widgets.latitude"]');if(a.removed){var l=a.removed.id,s=a.added.id;if(l!==s&&r.val()&&o.val()){var d={point:{longitude:parseFloat(r.val()),latitude:parseFloat(o.val())},from_srid:l,to_srid:s};n.callJSON("transformPoint",d,(function(e){if(!e.error){var a=e.result.point;r.val(a.longitude),o.val(a.latitude)}}))}}else n.position.changedCoordinate.apply(r)},clear:function(a){var t=e(this).parents("fieldset:first");e("input",t).val(null);var i=e(".map",t),n=i.data("marker");if(n){n.setLatLng([-90,0]);var r=i.data("leafmap"),o=i.data("leafmap.config");if(o.bounds)r.fitBounds(o.bounds);else{var l=i.data();r.setView(l.mapLeafletCenter||o.center,o.zoom||13)}}i.trigger("marker.cleared.position",[i])},moveMarkerTo:function(a,t,i){var r=a.data("map-leaflet-fieldname");e('input[name="'+r+'.widgets.longitude"]').val(t.lon),e('input[name="'+r+'.widgets.latitude"]').val(t.lat);var o={point:{longitude:t.lon,latitude:t.lat},from_srid:i,to_srid:4326};n.callJSON("transformPoint",o,(function(e){if(!e.error){var i=e.result.point;a.data("marker").setLatLng({lon:i.longitude,lat:i.latitude}),a.data("leafmap").setView(t)}}))}},area:{init:function(){var a=e(".map",e(this));void 0===a.data("leafmap")&&(a.css("height",e(window).height()-200),n.init(a,{},(function(r){t.Draw=t.Draw||{},t.Edit=t.Edit||{},i.ajax.check([t.Draw,t.Draw.Event,t.Map.TouchExtend,t.Edit.SimpleShape],["/--static--/pyams_gis/js/Draw/Leaflet.draw"+i.devext+".js","/--static--/pyams_gis/js/Draw/Leaflet.Draw.Event"+i.devext+".js","/--static--/pyams_gis/js/Draw/ext/TouchEvents"+i.devext+".js","/--static--/pyams_gis/js/Draw/edit/handler/Edit.SimpleShape"+i.devext+".js"],(function(){i.ajax.check(t.Edit.Rectangle,"/--static--/pyams_gis/js/Draw/edit/handler/Edit.Rectangle"+i.devext+".js",(function(){function i(e,i){var o=new t.FeatureGroup;s=t.rectangle([e,i]),o.addLayer(s),r.addLayer(o),r.fitBounds(s.getBounds()),s.editing.enable(),a.data("area",s),r.on(t.Draw.Event.EDITMOVE,n.area.changedArea),r.on(t.Draw.Event.EDITRESIZE,n.area.changedArea),r.on(t.Draw.Event.EDITVERTEX,n.area.changedArea)}var o,l,s,d=a.data().mapLeafletFieldname,c=e('input[name="'+d+'.widgets.x1"]'),p=e('input[name="'+d+'.widgets.y1"]'),u=e('input[name="'+d+'.widgets.x2"]'),m=e('input[name="'+d+'.widgets.y2"]');if(c.val()&&p.val()&&u.val()&&m.val()){var g=e('select[name="'+d+'.widgets.projection:list"]'),f={area:{x1:parseFloat(c.val()),y1:parseFloat(p.val()),x2:parseFloat(u.val()),y2:parseFloat(m.val())},from_srid:g.val(),to_srid:n.WGS_SRID};n.callJSON("transformArea",f,(function(e){if(!e.error){var a=e.result.area;o=t.latLng({lon:a.x1,lat:a.y1}),l=t.latLng({lon:a.x2,lat:a.y2}),i(o,l)}}))}else{var v=a.data("leafmap.config");v.bounds?(o=t.latLng(v.bounds[0]),l=t.latLng(v.bounds[1])):(o=t.latLng({lon:-168,lat:-56.37}),l=t.latLng({lon:191.25,lat:83.72})),i(o,l)}}))}))})))},last_event:null,changedArea:function(a){n.area.last_event=a,setTimeout((function(){if(a===n.area.last_event){var t=a.target.getContainer(),i=e(t).data(),r=i.area.getBounds(),o=i.mapLeafletFieldname,l=e('select[name="'+o+'.widgets.projection:list"]').val(),s={area:{x1:r.getWest(),y1:r.getSouth(),x2:r.getEast(),y2:r.getNorth()},from_srid:n.WGS_SRID,to_srid:l};n.callJSON("transformArea",s,(function(a){if(!a.error){var t=a.result.area;e('input[name="'+o+'.widgets.x1"]').val(t.x1),e('input[name="'+o+'.widgets.y1"]').val(t.y1),e('input[name="'+o+'.widgets.x2"]').val(t.x2),e('input[name="'+o+'.widgets.y2"]').val(t.y2)}}))}}),100)},changedCoordinate:function(){var a=e(this),i=e(".map",a.parents("fieldset:first"));if(i.data("area")){var r=i.data("map-leaflet-fieldname"),o=e('input[name="'+r+'.widgets.x1"]'),l=e('input[name="'+r+'.widgets.y1"]'),s=e('input[name="'+r+'.widgets.x2"]'),d=e('input[name="'+r+'.widgets.y2"]');if(o.val()&&l.val()&&s.val()&&d.val()){var c=e('select[name="'+r+'.widgets.projection:list"]'),p={area:{x1:parseFloat(o.val()),y1:parseFloat(l.val()),x2:parseFloat(s.val()),y2:parseFloat(d.val())},from_srid:c.val(),to_srid:4326};n.callJSON("transformArea",p,(function(e){if(!e.error){var a=e.result.area,n=i.data("area");n.editing.disable(),n.setBounds([t.latLng({lon:a.x1,lat:a.y1}),t.latLng({lon:a.x2,lat:a.y2})]),n.editing.enable()}}))}}},changedProjection:function(a){var t=e(this),i=e(".map",t.parents("fieldset:first")).data("map-leaflet-fieldname"),r=e('input[name="'+i+'.widgets.x1"]'),o=e('input[name="'+i+'.widgets.y1"]'),l=e('input[name="'+i+'.widgets.x2"]'),s=e('input[name="'+i+'.widgets.y2"]');if(a.removed){var d=a.removed.id,c=a.added.id;if(d!==c&&r.val()&&o.val()&&l.val()&&s.val()){var p={area:{x1:parseFloat(r.val()),y1:parseFloat(o.val()),x2:parseFloat(l.val()),y2:parseFloat(s.val())},from_srid:d,to_srid:c};n.callJSON("transformArea",p,(function(e){if(!e.error){var a=e.result.area;r.val(a.x1),o.val(a.y1),l.val(a.x2),s.val(a.y2)}}))}}else n.area.changedCoordinate.apply(r)},clear:function(a){var t=e(this).parents("fieldset:first");e("input",t).val(null);var i=e(".map",t);i.trigger("marker.cleared.area",[i])}}};a.PyAMS_GIS=n}(jQuery,this);